@experteam-mx/ngx-services
Version:
Angular common services for Experteam apps
243 lines • 35.2 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { map } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class ApiDiscountsService {
environments;
http;
constructor(environments, http) {
this.environments = environments;
this.http = http;
}
/**
* Gets the API endpoint URL for discounts from the environments configuration.
*
* @return {string} The URL for the discounts API. Returns an empty string if not defined.
*/
get url() {
return this.environments.apiDiscountsUrl ?? '';
}
/**
* Fetches available discounts based on the provided query parameters.
*
* @param {QueryParams} params - The query parameters used to filter and retrieve discounts.
* @return {Observable<DiscountsOut>} An Observable that emits the retrieved discounts data.
*/
getDiscounts(params) {
return this.http.get(`${this.url}/discounts`, { params })
.pipe(map(({ data }) => data));
}
/**
* Sends a request to create or update discounts on the server.
*
* @param {DiscountIn} body - The discount information to be submitted.
* @return {Observable<DiscountOut>} An Observable emitting the server's response containing the created or updated discount details.
*/
postDiscounts(body) {
return this.http.post(`${this.url}/discounts`, body)
.pipe(map(({ data }) => data));
}
/**
* Updates the discount information for a specific item.
*
* @param {number} id - The unique identifier of the item whose discount is to be updated.
* @param {DiscountIn} body - The payload containing the updated discount details.
* @return {Observable<DiscountOut>} An observable emitting the updated discount details.
*/
putDiscounts(id, body) {
return this.http.put(`${this.url}/discounts/${id}`, body)
.pipe(map(({ data }) => data));
}
/**
* Retrieves the top customers based on the provided query parameters.
*
* @param {QueryParams} params - The query parameters to filter and sort the top customers.
* @return {Observable<TopCustomersOut>} An observable emitting the list of top customers.
*/
getTopCustomers(params) {
return this.http.get(`${this.url}/top-customers`, { params })
.pipe(map(({ data }) => data));
}
/**
* Sends a POST request to load the top customer data in the system, using the provided input.
* Transforms the API response to extract the data field containing the discount information.
*
* @param {OperationsLoadTopCustomerV2In} body - The input payload containing the company country ID and the file.
* @param {number} body.company_country_id - The ID of the company's country.
* @param {File} body.file - The file containing data to be processed.
* @return {Observable<DiscountOut>} An observable containing the discount output information.
*/
postOperationsLoadTopCustomerV2(body) {
const formData = new FormData();
formData.append('company_country_id', String(body.company_country_id));
formData.append('file', body.file);
return this.http.post(`${this.url}/operations/load-top-customer/V2`, formData)
.pipe(map(({ data }) => data));
}
/**
* Fetches the loyalty periods based on the provided query parameters.
*
* @param {QueryParams} params - An object containing query parameters to filter the periods.
* @return {Observable<LoyaltyPeriodsOut>} An observable that emits the fetched loyalty periods.
*/
getLoyaltyPeriods(params) {
return this.http.get(`${this.url}/loyalty-periods`, { params })
.pipe(map(({ data }) => data));
}
/**
* Retrieves the loyalty period details for the given ID.
*
* @param {number} id - The unique identifier of the loyalty period to retrieve.
* @return {Observable<LoyaltyPeriodOut>} An observable emitting the loyalty period details.
*/
getLoyaltyPeriod(id) {
return this.http.get(`${this.url}/loyalty-periods/${id}`)
.pipe(map(({ data }) => data));
}
/**
* Sends a PUT request to update the loyalty period with the provided data.
*
* @param {LoyaltyPeriodIn} body - The data for the loyalty period to be updated.
* @return {Observable<LoyaltyPeriodOut>} An observable that emits the updated loyalty period data.
*/
postLoyaltyPeriod(body) {
return this.http.put(`${this.url}/loyalty-periods`, body)
.pipe(map(({ data }) => data));
}
/**
* Updates the loyalty period for a specified ID with the provided data.
*
* @param {number} id - The unique identifier of the loyalty period to update.
* @param {LoyaltyPeriodIn} body - An object containing the updated details of the loyalty period.
* @return {Observable<LoyaltyPeriodOut>} An observable that emits the updated loyalty period details.
*/
putLoyaltyPeriod(id, body) {
return this.http.put(`${this.url}/loyalty-periods/${id}`, body)
.pipe(map(({ data }) => data));
}
/**
* Retrieves the loyalty rules based on the provided query parameters.
*
* @param {QueryParams} params - The query parameters to filter the loyalty rules.
* @return {Observable<LoyaltyRulesOut>} An observable containing the loyalty rules output.
*/
getLoyaltyRules(params) {
return this.http.get(`${this.url}/loyalty-rules`, { params })
.pipe(map(({ data }) => data));
}
/**
* Retrieves a specific loyalty rule based on the provided ID.
*
* @param {number} id - The unique identifier of the loyalty rule to retrieve.
* @return {Observable<LoyaltyRuleOut>} An observable that emits the details of the specified loyalty rule.
*/
getLoyaltyRule(id) {
return this.http.get(`${this.url}/loyalty-rules/${id}`)
.pipe(map(({ data }) => data));
}
/**
* Sends a request to add or update a loyalty rule.
*
* @param {LoyaltyRuleIn} body - The loyalty rule data to be sent to the server.
* @return {Observable<LoyaltyRuleOut>} An observable that emits the updated loyalty rule details.
*/
postLoyaltyRule(body) {
return this.http.put(`${this.url}/loyalty-rules`, body)
.pipe(map(({ data }) => data));
}
/**
* Updates an existing loyalty rule with the provided data.
*
* @param {number} id - The unique identifier of the loyalty rule to update.
* @param {LoyaltyRuleIn} body - The data to update the loyalty rule with.
* @return {Observable<LoyaltyRuleOut>} An observable that emits the updated loyalty rule.
*/
putLoyaltyRule(id, body) {
return this.http.put(`${this.url}/loyalty-rules/${id}`, body)
.pipe(map(({ data }) => data));
}
/**
* Fetches customer restrictions based on the provided query parameters.
*
* @param {QueryParams} params - The query parameters to filter customer restrictions.
* @return {Observable<CustomerRestrictionsOut>} An observable that emits the customer restrictions data.
*/
getCustomerRestrictions(params) {
return this.http.get(`${this.url}/customer-restrictions`, { params })
.pipe(map(({ data }) => data));
}
/**
* Retrieves customer restriction details for a given customer ID.
*
* @param {number} id - The unique identifier of the customer.
* @return {Observable<CustomerRestrictionOut>} An observable containing the customer restriction details.
*/
getCustomerRestriction(id) {
return this.http.get(`${this.url}/customer-restrictions/${id}`)
.pipe(map(({ data }) => data));
}
/**
* Sends a request to apply a restriction to a customer.
*
* @param {CustomerRestrictionIn} body - The restriction details to be applied to the customer.
* @return {Observable<CustomerRestrictionOut>} An observable containing the response with the applied customer restriction.
*/
postCustomerRestriction(body) {
return this.http.put(`${this.url}/customer-restrictions`, body)
.pipe(map(({ data }) => data));
}
/**
* Updates customer restrictions using the provided ID and data.
*
* @param {number} id - The unique identifier of the customer restriction to be updated.
* @param {LoyaltyRuleIn} body - The data object containing the customer restriction details to be updated.
* @return {Observable<CustomerRestrictionOut>} An observable emitting the updated customer restriction details.
*/
putCustomerRestriction(id, body) {
return this.http.put(`${this.url}/customer-restrictions/${id}`, body)
.pipe(map(({ data }) => data));
}
/**
* Deletes a customer restriction by its ID.
*
* @param {number} id - The unique identifier of the customer restriction to delete.
* @return {Observable<{}>} An Observable that emits the result of the deletion operation.
*/
deleteCustomerRestriction(id) {
return this.http.delete(`${this.url}/customer-restrictions/${id}`)
.pipe(map(({ data }) => data));
}
/**
* Sends a request to apply a restriction to a customer (Version 2).
*
* @param {CustomerRestrictionInV2} body - The restriction details to be applied to the customer.
* @return {Observable<CustomerRestrictionOut>} An observable containing the response with the applied customer restriction.
*/
postCustomerRestrictionV2(body) {
return this.http.post(`${this.url}/customer-restrictions/V2`, body)
.pipe(map(({ data }) => data));
}
/**
* Updates customer restrictions using the provided ID and data (Version 2).
*
* @param {number} id - The unique identifier of the customer restriction to be updated.
* @param {CustomerRestrictionInV2} body - The data object containing the customer restriction details to be updated.
* @return {Observable<CustomerRestrictionOut>} An observable emitting the updated customer restriction details.
*/
putCustomerRestrictionV2(id, body) {
return this.http.put(`${this.url}/customer-restrictions/V2/${id}`, body)
.pipe(map(({ data }) => data));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiDiscountsService, deps: [{ token: 'env' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiDiscountsService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiDiscountsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: ['env']
}] }, { type: i1.HttpClient }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWRpc2NvdW50cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1zZXJ2aWNlcy9zcmMvbGliL2FwaXMvYXBpLWRpc2NvdW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWxELE9BQU8sRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUE7OztBQXVCdEMsTUFBTSxPQUFPLG1CQUFtQjtJQUVMO0lBQ2Y7SUFGVixZQUN5QixZQUF5QixFQUN4QyxJQUFnQjtRQURELGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3hDLFNBQUksR0FBSixJQUFJLENBQVk7SUFDdEIsQ0FBQztJQUVMOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUUsTUFBbUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBMkIsR0FBRyxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzthQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUUsSUFBZ0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBMEIsR0FBRyxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDO2FBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJ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SSxDQUFDLEdBQUcsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO2FBQy9FLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFFLElBQTZCO1FBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLEVBQUUsSUFBSSxDQUFDO2FBQ3BHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCx3QkFBd0IsQ0FBRSxFQUFVLEVBQUUsSUFBNkI7UUFDakUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBcUMsR0FBRyxJQUFJLENBQUMsR0FBRyw2QkFBNkIsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDO2FBQ3pHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7d0dBclBVLG1CQUFtQixrQkFFcEIsS0FBSzs0R0FGSixtQkFBbUIsY0FGbEIsTUFBTTs7NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL25neC1zZXJ2aWNlcy5tb2RlbHMnXHJcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IEFwaVN1Y2Nlc3MsIFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi9tb2RlbHMvYXBpLm1vZGVscydcclxuaW1wb3J0IHtcclxuICBDdXN0b21lclJlc3RyaWN0aW9uSW4sXHJcbiAgQ3VzdG9tZXJSZXN0cmljdGlvbkluVjIsXHJcbiAgQ3VzdG9tZXJSZXN0cmljdGlvbk91dCxcclxuICBDdXN0b21lclJlc3RyaWN0aW9uc091dCxcclxuICBEaXNjb3VudEluLFxyXG4gIERpc2NvdW50T3V0LFxyXG4gIERpc2NvdW50c091dCxcclxuICBMb3lhbHR5UGVyaW9kSW4sXHJcbiAgTG95YWx0eVBlcmlvZE91dCxcclxuICBMb3lhbHR5UGVyaW9kc091dCxcclxuICBMb3lhbHR5UnVsZUluLFxyXG4gIExveWFsdHlSdWxlT3V0LFxyXG4gIExveWFsdHlSdWxlc091dCxcclxuICBPcGVyYXRpb25zTG9hZFRvcEN1c3RvbWVyVjJJbixcclxuICBUb3BDdXN0b21lcnNPdXRcclxufSBmcm9tICcuL21vZGVscy9hcGktZGlzY291bnRzLnR5cGVzJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpRGlzY291bnRzU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50LFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XHJcbiAgKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgQVBJIGVuZHBvaW50IFVSTCBmb3IgZGlzY291bnRzIGZyb20gdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVJMIGZvciB0aGUgZGlzY291bnRzIEFQSS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgbm90IGRlZmluZWQuXHJcbiAgICovXHJcbiAgZ2V0IHVybCAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50cy5hcGlEaXNjb3VudHNVcmwgPz8gJydcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgYXZhaWxhYmxlIGRpc2NvdW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIGFuZCByZXRyaWV2ZSBkaXNjb3VudHMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxEaXNjb3VudHNPdXQ+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJldHJpZXZlZCBkaXNjb3VudHMgZGF0YS5cclxuICAgKi9cclxuICBnZXREaXNjb3VudHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPERpc2NvdW50c091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxEaXNjb3VudHNPdXQ+PihgJHt0aGlzLnVybH0vZGlzY291bnRzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gY3JlYXRlIG9yIHVwZGF0ZSBkaXNjb3VudHMgb24gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RGlzY291bnRJbn0gYm9keSAtIFRoZSBkaXNjb3VudCBpbmZvcm1hdGlvbiB0byBiZSBzdWJtaXR0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxEaXNjb3VudE91dD59IEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGNvbnRhaW5pbmcgdGhlIGNyZWF0ZWQgb3IgdXBkYXRlZCBkaXNjb3VudCBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHBvc3REaXNjb3VudHMgKGJvZHk6IERpc2NvdW50SW4pOiBPYnNlcnZhYmxlPERpc2NvdW50T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxEaXNjb3VudE91dD4+KGAke3RoaXMudXJsfS9kaXNjb3VudHNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGRpc2NvdW50IGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIGl0ZW0uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gd2hvc2UgZGlzY291bnQgaXMgdG8gYmUgdXBkYXRlZC5cclxuICAgKiBAcGFyYW0ge0Rpc2NvdW50SW59IGJvZHkgLSBUaGUgcGF5bG9hZCBjb250YWluaW5nIHRoZSB1cGRhdGVkIGRpc2NvdW50IGRldGFpbHMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxEaXNjb3VudE91dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHVwZGF0ZWQgZGlzY291bnQgZGV0YWlscy5cclxuICAgKi9cclxuICBwdXREaXNjb3VudHMgKGlkOiBudW1iZXIsIGJvZHk6IERpc2NvdW50SW4pOiBPYnNlcnZhYmxlPERpc2NvdW50T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPERpc2NvdW50T3V0Pj4oYCR7dGhpcy51cmx9L2Rpc2NvdW50cy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSB0b3AgY3VzdG9tZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIGFuZCBzb3J0IHRoZSB0b3AgY3VzdG9tZXJzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VG9wQ3VzdG9tZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgbGlzdCBvZiB0b3AgY3VzdG9tZXJzLlxyXG4gICAqL1xyXG4gIGdldFRvcEN1c3RvbWVycyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8VG9wQ3VzdG9tZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFRvcEN1c3RvbWVyc091dD4+KGAke3RoaXMudXJsfS90b3AtY3VzdG9tZXJzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBsb2FkIHRoZSB0b3AgY3VzdG9tZXIgZGF0YSBpbiB0aGUgc3lzdGVtLCB1c2luZyB0aGUgcHJvdmlkZWQgaW5wdXQuXHJcbiAgICogVHJhbnNmb3JtcyB0aGUgQVBJIHJlc3BvbnNlIHRvIGV4dHJhY3QgdGhlIGRhdGEgZmllbGQgY29udGFpbmluZyB0aGUgZGlzY291bnQgaW5mb3JtYXRpb24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbnNMb2FkVG9wQ3VzdG9tZXJWMklufSBib2R5IC0gVGhlIGlucHV0IHBheWxvYWQgY29udGFpbmluZyB0aGUgY29tcGFueSBjb3VudHJ5IElEIGFuZCB0aGUgZmlsZS5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gYm9keS5jb21wYW55X2NvdW50cnlfaWQgLSBUaGUgSUQgb2YgdGhlIGNvbXBhbnkncyBjb3VudHJ5LlxyXG4gICAqIEBwYXJhbSB7RmlsZX0gYm9keS5maWxlIC0gVGhlIGZpbGUgY29udGFpbmluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPERpc2NvdW50T3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBkaXNjb3VudCBvdXRwdXQgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgcG9zdE9wZXJhdGlvbnNMb2FkVG9wQ3VzdG9tZXJWMiAoYm9keTogT3BlcmF0aW9uc0xvYWRUb3BDdXN0b21lclYySW4pOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2NvbXBhbnlfY291bnRyeV9pZCcsIFN0cmluZyhib2R5LmNvbXBhbnlfY291bnRyeV9pZCkpXHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBib2R5LmZpbGUpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8e30+PihgJHt0aGlzLnVybH0vb3BlcmF0aW9ucy9sb2FkLXRvcC1jdXN0b21lci9WMmAsIGZvcm1EYXRhKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxveWFsdHkgcGVyaW9kcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIHRoZSBwZXJpb2RzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG95YWx0eVBlcmlvZHNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGZldGNoZWQgbG95YWx0eSBwZXJpb2RzLlxyXG4gICAqL1xyXG4gIGdldExveWFsdHlQZXJpb2RzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxMb3lhbHR5UGVyaW9kc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxMb3lhbHR5UGVyaW9kc091dD4+KGAke3RoaXMudXJsfS9sb3lhbHR5LXBlcmlvZHNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgbG95YWx0eSBwZXJpb2QgZGV0YWlscyBmb3IgdGhlIGdpdmVuIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsb3lhbHR5IHBlcmlvZCB0byByZXRyaWV2ZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPExveWFsdHlQZXJpb2RPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBsb3lhbHR5IHBlcmlvZCBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIGdldExveWFsdHlQZXJpb2QgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPExveWFsdHlQZXJpb2RPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8TG95YWx0eVBlcmlvZE91dD4+KGAke3RoaXMudXJsfS9sb3lhbHR5LXBlcmlvZHMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgUFVUIHJlcXVlc3QgdG8gdXBkYXRlIHRoZSBsb3lhbHR5IHBlcmlvZCB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtMb3lhbHR5UGVyaW9kSW59IGJvZHkgLSBUaGUgZGF0YSBmb3IgdGhlIGxveWFsdHkgcGVyaW9kIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxMb3lhbHR5UGVyaW9kT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIGxveWFsdHkgcGVyaW9kIGRhdGEuXHJcbiAgICovXHJcbiAgcG9zdExveWFsdHlQZXJpb2QgKGJvZHk6IExveWFsdHlQZXJpb2RJbik6IE9ic2VydmFibGU8TG95YWx0eVBlcmlvZE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxMb3lhbHR5UGVyaW9kT3V0Pj4oYCR7dGhpcy51cmx9L2xveWFsdHktcGVyaW9kc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgbG95YWx0eSBwZXJpb2QgZm9yIGEgc3BlY2lmaWVkIElEIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxveWFsdHkgcGVyaW9kIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0xveWFsdHlQZXJpb2RJbn0gYm9keSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1cGRhdGVkIGRldGFpbHMgb2YgdGhlIGxveWFsdHkgcGVyaW9kLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG95YWx0eVBlcmlvZE91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBsb3lhbHR5IHBlcmlvZCBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHB1dExveWFsdHlQZXJpb2QgKGlkOiBudW1iZXIsIGJvZHk6IExveWFsdHlQZXJpb2RJbik6IE9ic2VydmFibGU8TG95YWx0eVBlcmlvZE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxMb3lhbHR5UGVyaW9kT3V0Pj4oYCR7dGhpcy51cmx9L2xveWFsdHktcGVyaW9kcy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBsb3lhbHR5IHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIHRoZSBsb3lhbHR5IHJ1bGVzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG95YWx0eVJ1bGVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBsb3lhbHR5IHJ1bGVzIG91dHB1dC5cclxuICAgKi9cclxuICBnZXRMb3lhbHR5UnVsZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPExveWFsdHlSdWxlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxMb3lhbHR5UnVsZXNPdXQ+PihgJHt0aGlzLnVybH0vbG95YWx0eS1ydWxlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgc3BlY2lmaWMgbG95YWx0eSBydWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbG95YWx0eSBydWxlIHRvIHJldHJpZXZlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG95YWx0eVJ1bGVPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGRldGFpbHMgb2YgdGhlIHNwZWNpZmllZCBsb3lhbHR5IHJ1bGUuXHJcbiAgICovXHJcbiAgZ2V0TG95YWx0eVJ1bGUgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPExveWFsdHlSdWxlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPExveWFsdHlSdWxlT3V0Pj4oYCR7dGhpcy51cmx9L2xveWFsdHktcnVsZXMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgcmVxdWVzdCB0byBhZGQgb3IgdXBkYXRlIGEgbG95YWx0eSBydWxlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtMb3lhbHR5UnVsZUlufSBib2R5IC0gVGhlIGxveWFsdHkgcnVsZSBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPExveWFsdHlSdWxlT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIGxveWFsdHkgcnVsZSBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHBvc3RMb3lhbHR5UnVsZSAoYm9keTogTG95YWx0eVJ1bGVJbik6IE9ic2VydmFibGU8TG95YWx0eVJ1bGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8TG95YWx0eVJ1bGVPdXQ+PihgJHt0aGlzLnVybH0vbG95YWx0eS1ydWxlc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBhbiBleGlzdGluZyBsb3lhbHR5IHJ1bGUgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbG95YWx0eSBydWxlIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0xveWFsdHlSdWxlSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGxveWFsdHkgcnVsZSB3aXRoLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG95YWx0eVJ1bGVPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgbG95YWx0eSBydWxlLlxyXG4gICAqL1xyXG4gIHB1dExveWFsdHlSdWxlIChpZDogbnVtYmVyLCBib2R5OiBMb3lhbHR5UnVsZUluKTogT2JzZXJ2YWJsZTxMb3lhbHR5UnVsZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxMb3lhbHR5UnVsZU91dD4+KGAke3RoaXMudXJsfS9sb3lhbHR5LXJ1bGVzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGN1c3RvbWVyIHJlc3RyaWN0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBjdXN0b21lciByZXN0cmljdGlvbnMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDdXN0b21lclJlc3RyaWN0aW9uc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY3VzdG9tZXIgcmVzdHJpY3Rpb25zIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0Q3VzdG9tZXJSZXN0cmljdGlvbnMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEN1c3RvbWVyUmVzdHJpY3Rpb25zT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEN1c3RvbWVyUmVzdHJpY3Rpb25zT3V0Pj4oYCR7dGhpcy51cmx9L2N1c3RvbWVyLXJlc3RyaWN0aW9uc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGN1c3RvbWVyIHJlc3RyaWN0aW9uIGRldGFpbHMgZm9yIGEgZ2l2ZW4gY3VzdG9tZXIgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGN1c3RvbWVyLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q3VzdG9tZXJSZXN0cmljdGlvbk91dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY3VzdG9tZXIgcmVzdHJpY3Rpb24gZGV0YWlscy5cclxuICAgKi9cclxuICBnZXRDdXN0b21lclJlc3RyaWN0aW9uIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxDdXN0b21lclJlc3RyaWN0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+PihgJHt0aGlzLnVybH0vY3VzdG9tZXItcmVzdHJpY3Rpb25zLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gYXBwbHkgYSByZXN0cmljdGlvbiB0byBhIGN1c3RvbWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDdXN0b21lclJlc3RyaWN0aW9uSW59IGJvZHkgLSBUaGUgcmVzdHJpY3Rpb24gZGV0YWlscyB0byBiZSBhcHBsaWVkIHRvIHRoZSBjdXN0b21lci5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHJlc3BvbnNlIHdpdGggdGhlIGFwcGxpZWQgY3VzdG9tZXIgcmVzdHJpY3Rpb24uXHJcbiAgICovXHJcbiAgcG9zdEN1c3RvbWVyUmVzdHJpY3Rpb24gKGJvZHk6IEN1c3RvbWVyUmVzdHJpY3Rpb25Jbik6IE9ic2VydmFibGU8Q3VzdG9tZXJSZXN0cmljdGlvbk91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDdXN0b21lclJlc3RyaWN0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2N1c3RvbWVyLXJlc3RyaWN0aW9uc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBjdXN0b21lciByZXN0cmljdGlvbnMgdXNpbmcgdGhlIHByb3ZpZGVkIElEIGFuZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjdXN0b21lciByZXN0cmljdGlvbiB0byBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7TG95YWx0eVJ1bGVJbn0gYm9keSAtIFRoZSBkYXRhIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b21lciByZXN0cmljdGlvbiBkZXRhaWxzIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDdXN0b21lclJlc3RyaWN0aW9uT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgdXBkYXRlZCBjdXN0b21lciByZXN0cmljdGlvbiBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHB1dEN1c3RvbWVyUmVzdHJpY3Rpb24gKGlkOiBudW1iZXIsIGJvZHk6IEN1c3RvbWVyUmVzdHJpY3Rpb25Jbik6IE9ic2VydmFibGU8Q3VzdG9tZXJSZXN0cmljdGlvbk91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDdXN0b21lclJlc3RyaWN0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2N1c3RvbWVyLXJlc3RyaWN0aW9ucy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIGN1c3RvbWVyIHJlc3RyaWN0aW9uIGJ5IGl0cyBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY3VzdG9tZXIgcmVzdHJpY3Rpb24gdG8gZGVsZXRlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8e30+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3VsdCBvZiB0aGUgZGVsZXRpb24gb3BlcmF0aW9uLlxyXG4gICAqL1xyXG4gIGRlbGV0ZUN1c3RvbWVyUmVzdHJpY3Rpb24gKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L2N1c3RvbWVyLXJlc3RyaWN0aW9ucy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGFwcGx5IGEgcmVzdHJpY3Rpb24gdG8gYSBjdXN0b21lciAoVmVyc2lvbiAyKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Q3VzdG9tZXJSZXN0cmljdGlvbkluVjJ9IGJvZHkgLSBUaGUgcmVzdHJpY3Rpb24gZGV0YWlscyB0byBiZSBhcHBsaWVkIHRvIHRoZSBjdXN0b21lci5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHJlc3BvbnNlIHdpdGggdGhlIGFwcGxpZWQgY3VzdG9tZXIgcmVzdHJpY3Rpb24uXHJcbiAgICovXHJcbiAgcG9zdEN1c3RvbWVyUmVzdHJpY3Rpb25WMiAoYm9keTogQ3VzdG9tZXJSZXN0cmljdGlvbkluVjIpOiBPYnNlcnZhYmxlPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+PihgJHt0aGlzLnVybH0vY3VzdG9tZXItcmVzdHJpY3Rpb25zL1YyYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGN1c3RvbWVyIHJlc3RyaWN0aW9ucyB1c2luZyB0aGUgcHJvdmlkZWQgSUQgYW5kIGRhdGEgKFZlcnNpb24gMikuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGN1c3RvbWVyIHJlc3RyaWN0aW9uIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtDdXN0b21lclJlc3RyaWN0aW9uSW5WMn0gYm9keSAtIFRoZSBkYXRhIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b21lciByZXN0cmljdGlvbiBkZXRhaWxzIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDdXN0b21lclJlc3RyaWN0aW9uT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgdXBkYXRlZCBjdXN0b21lciByZXN0cmljdGlvbiBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHB1dEN1c3RvbWVyUmVzdHJpY3Rpb25WMiAoaWQ6IG51bWJlciwgYm9keTogQ3VzdG9tZXJSZXN0cmljdGlvbkluVjIpOiBPYnNlcnZhYmxlPEN1c3RvbWVyUmVzdHJpY3Rpb25PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8Q3VzdG9tZXJSZXN0cmljdGlvbk91dD4+KGAke3RoaXMudXJsfS9jdXN0b21lci1yZXN0cmljdGlvbnMvVjIvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcbn1cclxuIl19