trimble-connect-sdk
Version:
Trimble Connect SDK for JavaScript
394 lines • 104 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { isBrowser, isWebWorker } from 'browser-or-node';
import { ServiceResponse } from './response';
import { Service } from './service';
export const DefaultOrganizerServiceUri = 'https://org-api.connect.trimble.com/v1/';
const OrgServiceUriMap = new Map([
['us-east-1', 'https://org-api.us-east-1.connect.trimble.com/v1/'],
['ap-southeast-1', 'https://org-api.ap-southeast-1.connect.trimble.com/v1/'],
['eu-west-1', 'https://org-api.eu-west-1.connect.trimble.com/v1/'],
]);
function getDefaultConfiguration() {
return {
region: 'eu-west-1',
serviceUri: DefaultOrganizerServiceUri,
};
}
export class Organizer extends Service {
constructor(config) {
const sanitizedConfig = Object.assign({}, config);
if (sanitizedConfig &&
sanitizedConfig.region &&
sanitizedConfig.serviceUri === undefined) {
if (OrgServiceUriMap.has(sanitizedConfig.region)) {
sanitizedConfig.serviceUri = OrgServiceUriMap.get(sanitizedConfig.region);
}
else {
throw new Error(`Unknown region: ${sanitizedConfig.region}, allowed values ${Array.from(OrgServiceUriMap.keys()).join(', ')}`);
}
}
super(Object.assign(Object.assign({}, getDefaultConfiguration()), sanitizedConfig));
}
getUserInfo() {
return __awaiter(this, void 0, void 0, function* () {
return this.makeRequest('me');
});
}
listTrees(forestId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getTree(forestId, treeId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
createTree(forestId, request, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees`;
if (params === null || params === void 0 ? void 0 : params.fields) {
url += `?fields=${encodeURIComponent(params.fields)}`;
}
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
updateTree(forestId, treeId, request, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}`;
if (params === null || params === void 0 ? void 0 : params.fields) {
url += `?fields=${encodeURIComponent(params.fields)}`;
}
return this.makeRequest(url, 'PATCH', JSON.stringify(request));
});
}
deleteTree(forestId, treeId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}`;
let headers;
if (params && params.v !== undefined) {
headers = new Headers({ 'If-Match': `W/"${params.v}"` });
}
return this.makeRequest(url, 'DELETE', undefined, headers);
});
}
getTreePolicy(forestId, treeId) {
return __awaiter(this, void 0, void 0, function* () {
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/policy`;
return this.makeRequest(url);
});
}
putTreePolicy(forestId, treeId, policy) {
return __awaiter(this, void 0, void 0, function* () {
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/policy`;
return this.makeRequest(url, 'PUT', JSON.stringify(policy));
});
}
searchNodes(forestId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = params.treeId
? `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(params.treeId)}/search`
: `forests/${encodeURIComponent(forestId)}/search`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.link) {
query.push(`link=${encodeURIComponent(params.link)}`);
}
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
listNodes(forestId, treeId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.prefix) {
query.push(`prefix=${encodeURIComponent(params.prefix)}`);
}
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
listNodeVersions(forestId, treeId, nodeId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}/versions`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.top) {
query.push(`top=${encodeURIComponent(params.top.toString())}`);
}
if (params.skiptoken) {
query.push(`skiptoken=${encodeURIComponent(params.skiptoken)}`);
}
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getNode(forestId, treeId, nodeId, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url);
});
}
getNodeLinks(forestId, treeId, nodeId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}/links${params && params.deleted ? '?deleted' : ''}`;
return this.makeRequest(url);
});
}
createNode(forestId, treeId, node, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes`;
if (params === null || params === void 0 ? void 0 : params.fields) {
url += `?fields=${encodeURIComponent(params.fields)}`;
}
return this.makeRequest(url, 'POST', JSON.stringify(node));
});
}
updateNode(forestId, treeId, nodeId, node, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}`;
if (params === null || params === void 0 ? void 0 : params.fields) {
url += `?fields=${encodeURIComponent(params.fields)}`;
}
return this.makeRequest(url, 'PATCH', JSON.stringify(node));
});
}
deleteNode(forestId, treeId, nodeId, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}`;
let headers;
if (params && params.v !== undefined) {
headers = new Headers({ 'If-Match': `W/"${params.v}"` });
}
return this.makeRequest(url, 'DELETE', undefined, headers);
});
}
getNodeGeometry(forestId, treeId, nodeId, params) {
return __awaiter(this, void 0, void 0, function* () {
if (!isBrowser && !isWebWorker) {
throw new Error('Not supported in NodeJS environment.');
}
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}`;
return this.commonGetNodeGeometry(url, !!(params && params.deleted));
});
}
getNodeVersionGeometry(forestId, treeId, nodeId, version) {
return __awaiter(this, void 0, void 0, function* () {
if (!isBrowser && !isWebWorker) {
throw new Error('Not supported in NodeJS environment.');
}
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}/versions/${version}`;
return this.commonGetNodeGeometry(url, false);
});
}
putNodeGeometry(forestId, treeId, nodeId, data, params) {
return __awaiter(this, void 0, void 0, function* () {
if (!isBrowser && !isWebWorker) {
throw new Error('Not supported in NodeJS environment.');
}
const headers = new Headers({ 'Content-Type': data.type });
if (params && params.v !== undefined) {
headers.set('If-Match', `W/"${params.v}"`);
}
const url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/nodes/${encodeURIComponent(nodeId)}/geometry`;
return this.request(url, 'PUT', data, headers);
});
}
batchGetNodes(forestId, treeId, request, params) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
(_a = request.nodes) === null || _a === void 0 ? void 0 : _a.forEach((node) => {
node.forestId = forestId;
node.treeId = treeId;
});
return this.batchGet(request, params);
});
}
batchGet(request, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `batch-get`;
if (params) {
const query = [];
if (params.deleted) {
query.push('deleted');
}
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url, 'POST', JSON.stringify(request));
});
}
changeset(forestId, treeId, changeset, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/changeset`;
if (params) {
const query = [];
if (params.nolinks) {
query.push('nolinks');
}
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url, 'POST', JSON.stringify(changeset));
});
}
changesetAsync(forestId, treeId, changesetConfig, params) {
return __awaiter(this, void 0, void 0, function* () {
let url = `forests/${encodeURIComponent(forestId)}/trees/${encodeURIComponent(treeId)}/changeset-async`;
if (params) {
const query = [];
if (params.fields) {
query.push(`fields=${encodeURIComponent(params.fields)}`);
}
if (query.length > 0) {
url += `?${query.join('&')}`;
}
}
return this.makeRequest(url, 'POST', JSON.stringify(changesetConfig));
});
}
changesetStatus(changesetId) {
return __awaiter(this, void 0, void 0, function* () {
const url = `changeset/${encodeURIComponent(changesetId)}`;
return this.makeRequest(url);
});
}
subscribeWS() {
return __awaiter(this, void 0, void 0, function* () {
const url = 'subscribe';
return this.makeRequest(url, 'GET');
});
}
commonGetNodeGeometry(urlWithoutParams, includeDeleted) {
return __awaiter(this, void 0, void 0, function* () {
const urlParams = `?nolinks${includeDeleted ? '&deleted' : ''}`;
const node = yield this.makeRequest(urlWithoutParams + urlParams);
if (node.data.geometry && node.data.geometry.url) {
const geometry = (yield this.request(node.data.geometry.url, 'GET', undefined, undefined, false));
if (geometry.response.status !== 204) {
const blob = yield geometry.response.blob();
geometry.data = blob;
return geometry;
}
}
return new ServiceResponse(this, new Response(), undefined);
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJvcmdhbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVl6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJcEMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQ3JDLHlDQUF5QyxDQUFDO0FBRTVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQWlCO0lBQy9DLENBQUMsV0FBVyxFQUFFLG1EQUFtRCxDQUFDO0lBQ2xFLENBQUMsZ0JBQWdCLEVBQUUsd0RBQXdELENBQUM7SUFDNUUsQ0FBQyxXQUFXLEVBQUUsbURBQW1ELENBQUM7Q0FDbkUsQ0FBQyxDQUFDO0FBR0gsU0FBUyx1QkFBdUI7SUFDOUIsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFXO1FBQ25CLFVBQVUsRUFBRSwwQkFBMEI7S0FDdkMsQ0FBQztBQUNKLENBQUM7QUFvZ0JELE1BQU0sT0FBTyxTQUFVLFNBQVEsT0FBTztJQU1wQyxZQUFZLE1BQStCO1FBQ3pDLE1BQU0sZUFBZSxxQkFBZ0MsTUFBTSxDQUFFLENBQUM7UUFFOUQsSUFDRSxlQUFlO1lBQ2YsZUFBZSxDQUFDLE1BQU07WUFDdEIsZUFBZSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQ3hDO1lBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNoRCxlQUFlLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FDL0MsZUFBZSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUJBQW1CLGVBQWUsQ0FBQyxNQUNuQyxvQkFBb0Is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J2Jyb3dzZXItb3Itbm9kZSc7XG5pbXBvcnQge1xuICBEZWxldGVPcHRpb25zLFxuICBHZXRPcHRpb25zLFxuICBMaXN0T3B0aW9ucyxcbiAgUGFnZWRJdGVtcyxcbiAgUmVzb3VyY2VJZGVudGl0eVdpdGhFcnJvcixcbiAgVXNlckluZm9SZXNwb25zZSxcbiAgV1NTdWJzY3JpcHRpb25SZXNwb25zZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gJy4vcG9saWN5JztcbmltcG9ydCB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgU2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdE9yZ2FuaXplclNlcnZpY2VVcmkgPVxuICAnaHR0cHM6Ly9vcmctYXBpLmNvbm5lY3QudHJpbWJsZS5jb20vdjEvJztcblxuY29uc3QgT3JnU2VydmljZVVyaU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgWyd1cy1lYXN0LTEnLCAnaHR0cHM6Ly9vcmctYXBpLnVzLWVhc3QtMS5jb25uZWN0LnRyaW1ibGUuY29tL3YxLyddLFxuICBbJ2FwLXNvdXRoZWFzdC0xJywgJ2h0dHBzOi8vb3JnLWFwaS5hcC1zb3V0aGVhc3QtMS5jb25uZWN0LnRyaW1ibGUuY29tL3YxLyddLFxuICBbJ2V1LXdlc3QtMScsICdodHRwczovL29yZy1hcGkuZXUtd2VzdC0xLmNvbm5lY3QudHJpbWJsZS5jb20vdjEvJ10sXG5dKTtcblxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTogQ29uZmlndXJhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgcmVnaW9uOiAnZXUtd2VzdC0xJyxcbiAgICBzZXJ2aWNlVXJpOiBEZWZhdWx0T3JnYW5pemVyU2VydmljZVVyaSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBib2R5IGZvciB0aGUgQHNlZSBPcmdhbmlzZXIjY3JlYXRlVHJlZSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHJlZVJlcXVlc3Qge1xuICAvKiogVGhlIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgdHJlZSwgaWYgbm90IHByb3ZpZGVkIHNlcnZpY2Ugd2lsbCBnZW5lcmF0ZSBhbiB1bmlxdWUgaWRlbnRpZmllci4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgYWNjZXNzIGNvbnJvbCBwb2xpY3kgZG9jdW1lbnQgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHRyZWUuICovXG4gIHBvbGljeT86IFBvbGljeTtcbiAgLyoqIFRoZSBvcHRpb25hbCB0cmVlIG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogVGhlIHR5cGUgb2YgdGhlIHRyZWUgdGhhdCBkZWZpbmVzIHRoZSBzeW1hbnRpYy4gKi9cbiAgdHlwZTogc3RyaW5nO1xuICAvKiogVGhlIG9wdGlvbmFsIG5vZGUgbWV0YWRhdGEuICovXG4gIG1ldGFkYXRhPzogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoZSBAc2VlIE9yZ2FuaXNlciNnZXRUcmVlIG9wZXJhdGlvbi5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBHZXRUcmVlT3B0aW9ucyBleHRlbmRzIEdldE9wdGlvbnMge1xuICAvKiogQ29udHJvbHMgd2hpY2ggb3B0aW9uYWwgbm9kZSBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZCwgY3VycmVudGx5IG9ubHkgbWV0YWRhdGEgaXMgc3VwcG9ydGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgdGhlIEBzZWUgT3JnYW5pc2VyI2dldE5vZGUgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE5vZGVPcHRpb25zIGV4dGVuZHMgR2V0T3B0aW9ucyB7XG4gIC8qKiBDb250cm9scyB3aGV0aGVyIHRvIHNlbmQgbGlzdCBvZiBsaW5rIHRvZ2hldGhlciB3aXRoIHRoZSBub2RlIGRlc2NyaXB0b3IuIEJ5IGRlZmF1bHQgbGlua3MgYXJlIHNlbnQuIEFwcCBjYW4gcmVkdWNlIHRoZSBwYXlsb2FkIHNpemUgYnkgdXNpbmcgdGhpcyBwYXJhbWV0ZXIuICovXG4gIG5vbGlua3M/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgd2hpY2ggb3B0aW9uYWwgbm9kZSBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZCwgY3VycmVudGx5IG9ubHkgbWV0YWRhdGEgaXMgc3VwcG9ydGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgdGhlIEBzZWUgT3JnYW5pc2VyI3B1dE5vZGVHZW9tZXRyeSBvcGVyYXRpb24uXG4gKiBEb2VzIG5vdCBleHRlbmQgR2V0T3B0aW9ucyBiZWNhdXNlIHRoZSBmbGFnIGRlZmluZWQgdGhlcmUgaGFzIG5vIG1lYW5pbmcgaGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdXRHZW9tZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGxhc3Qgc2VlbiB2ZXJzaW9uIG9mIHRoZSBub2RlIGRlc2NyaXB0b3IuXG4gICAqIElmIHByb3ZpZGVkIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbmN1cnJlbmN5IGNvbnRyb2wgYW5kIHdpbGwgcmVmdXNlIHRvIGFwcGx5IGNoYW5nZXMgaWYgY3VycmVudCB2ZXJzaW9uIGlzIG5vdCBlcXVhbCB0byB2ZXJzaW9uIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgdj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgY3JlYXRlIHRyZWUgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRyZWVPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIE9yZ2FuaXNlciN1cGRhdGVUcmVlIG9wZXJhdGlvbi5cbiAqIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgaWYgcHJvcGVydHkgaXMgbm90IHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IHRoZSBwcm9wZXJ0eSB3aWxsIHJldGFpbiBpdCdzIG9sZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVUcmVlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBzZWVuIHZlcnNpb24gb2YgdGhlIHRyZWUgZGVzY3JpcHRvci5cbiAgICogSWYgcHJvdmlkZWQgc2VydmljZSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgY29uY3VyZW5jeSBjb250cm9sIGFuZCB3aWxsIHJlZnVzZSB0byBhcHBseSBjaGFuZ2VzIGlmIGN1cnJlbnQgdmVyc2lvbiBpcyBub3QgZXF1YWwgdG8gdmVyc2lvbiBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHY/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWNjZXNzIGNvbnJvbCBwb2xpY3kgZG9jdW1lbnQgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHRyZWUuXG4gICAqIElmIHByb3BlcnR5IGlzIHNwZWNpZmllZCBjYWxsZXIgbXVzdCBoYXZlIG9yZzpVcGRhdGVUcmVlUG9saWN5IHJpZ2h0IHRvIGV4ZWN1dGUgdGhpcyBvcGVyYXRpb24gaW4gYWRkaXRpb24gdG8gb3JnOlVwZGF0ZVRyZWUuXG4gICAqL1xuICBwb2xpY3k/OiBQb2xpY3k7XG4gIC8qKiBUaGUgbmV3IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgbmV3IGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFRoZSBvcHRpb25hbCBub2RlIG1ldGFkYXRhLiAqL1xuICBtZXRhZGF0YT86IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgdXBkYXRlIHRyZWUgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVRyZWVPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0cmVlIGRlc2NyaXB0b3IgcmV0dXJuZWQgZnJvbSBAc2VlIE9yZ2FuaXNlciNjcmVhdGVUcmVlICwgQHNlZSBPcmdhbmlzZXIjdXBkYXRlVHJlZSAsIEBzZWUgT3JnYW5pc2VyI2RlbGV0ZVRyZWUgYW5kIEBzZWUgT3JnYW5pc2VyI2dldFRyZWUgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmVlUmVzcG9uc2Uge1xuICAvKiogVGhlIHVuaXF1ZSB0cmVlIGlkZW50aWZpZXIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY3JlYXRpb24gdGltZXN0YW1wIGluIElTTyBmb3JtYXQuICovXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaXBhbCB3aG8gY3JlYXRlZCB0aGUgdHJlZS4gKi9cbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wIGluIElTTyBmb3JtYXQuICovXG4gIG1vZGlmaWVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcmluY2lsYXQgd2hvIGxhc3QgbW9kaWZpZWQgdGhlIHRyZWUgZGVzY3JpcHRvci4gKi9cbiAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAvKiogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHJlZSBkZXNjcmlwdG9yLiAqL1xuICB2OiBudW1iZXI7XG4gIC8qKiBUaGUgYWNjZXNzIGNvbnJvbCBwb2xpY3kgZG9jdW1lbnQgYXR0YWNoZWQgdG8gdGhlIHRyZWUuIFRoaXMgcHJvcGVydHkgaXMgcmV0dXJuZWQgb25seSBpZiBjYWxsZXIgaGFzIG9yZzpHZXRUcmVlUG9saWN5IHJpZ2h0LiAqL1xuICBwb2xpY3k/OiBQb2xpY3k7XG4gIC8qKiBUaGUgZGVsZXRpb24gbWFya2VyLiBJZiBub3QgcHJlc2VudCBvciBmYWxzZSB0aGUgdHJlZSBpcyBhY3RpdmUsIG90aGVyd2lzZSB0aGUgdHJlZSBpcyBtYXJrZWQgYXMgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGUgdHJlZSBzaG9ydCBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFRoZSB0cmVlIHR5cGUgdGhhdCBkZWZpbmVzIHRoZSBzeW1hbnRpYy4gKi9cbiAgdHlwZTogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gb2YgYWN0aW9ucyBjdXJyZW50IHVzZXIgaGFzIHJpZ2h0cyB0byBwZXJmb3JtIG9uIHRoaXMgcmVzb3VyY2UgYXQgdGhlIG1vbWVudCB0aGUgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IHNlcnZpY2UuIE5vdCByZXR1cm5lZCB3aGVuIHNwZWNpZmljIHZlcnNpb24gaXMgcmVxdWVzdGVkLiAqL1xuICBfYWN0aW9ucz86IHN0cmluZ1tdO1xuICAvKiogVGhlIG5vZGUgbWV0YWRhdGEuICovXG4gIG1ldGFkYXRhPzogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIE9yZ2FuaXNlciNjcmVhdGVOb2RlIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVOb2RlUmVxdWVzdCB7XG4gIC8qKiBUaGUgb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIG5ldyB0cmVlLCBpZiBub3QgcHJvdmlkZWQgc2VydmljZSB3aWxsIGdlbmVyYXRlIGFuIHVuaXF1ZSBpZGVudGlmaWVyLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFRoZSBub2RlIG5hbWUuIFRvIHBlc2VudCBhIHRyZWUtbGlrZSBzdHJ1Y3R1cmUgdGhpcyBuYW1lIGlzIGludGVycHJldGVkIGFzIGEgZnVsbCBwYXRoIGluIGEgdHJlZSB3aXRoICcvJyBjaGFyYWN0ZXIgYXMgYSBzZXBhcmF0b3IgYmV0d2VlbiBwYXRoIHNlZ21lbnRzLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2YgbGlua3MgdG8gcmVzb3VyY2VzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbm9kZS4gKi9cbiAgbGlua3M/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBvcHRpb25hbCBub2RlIG1ldGFkYXRhLiAqL1xuICBtZXRhZGF0YT86IG9iamVjdDtcbiAgLyoqIFRoZSBvcHRpb25hbCBnZW9tZXRyeSBkYXRhIHRvIGF0dGFjaCB0byB0aGUgbm9kZS4gKi9cbiAgZ2VvbWV0cnk/OiB7XG4gICAgLyoqIFRoZSBiYXNlNjQgZW5jb2RlZCBnZW9tZXRyeSBkYXRhLiAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKiogVGhlIGNvbnRlbnQgdHlwZSAoTUlNRSkgb2YgdGhlIGdlb21ldHJ5IGRhdGEuICovXG4gICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgY3JlYXRlIG5vZGUgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vZGVPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGJvZHkgZm9yIHRoZSBAc2VlIE9yZ2FuaXNlciN1cGRhdGVOb2RlIG9wZXJhdGlvbi4gQWxzbyBrbm93biBhcyBVcHNlcnROb2RlUmVxdWVzdC5cbiAqIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgaWYgcHJvcGVydHkgbm90IHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IHRoZSBwcm9wZXJ0eSB3aWxsIHJldGFpbiBpdCdzIG9sZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb2RlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBzZWVuIHZlcnNpb24gb2YgdGhlIHRyZWUgZGVzY3JpcHRvci5cbiAgICogSWYgcHJvdmlkZWQgc2VydmljZSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgY29uY3VyZW5jeSBjb250cm9sIGFuZCB3aWxsIHJlZnVzZSB0byBhcHBseSBjaGFuZ2VzIGlmIGN1cnJlbnQgdmVyc2lvbiBpcyBub3QgZXF1YWwgdG8gdmVyc2lvbiBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHY/OiBudW1iZXI7XG4gIC8qKiBUaGUgbmV3IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgbmV3IHNldCBvZiBsaW5rcyB0byByZXNvdXJjZXMuIElmIHRoaXMgcHJvcGVydHkgaXMgcHJvdmlkZWQgaXQgd2lsbCBvdmVycmlkZSBhbGwgZXhpc3RpbmcgbGlua3MgYXNzb2NpYXRlZC4gRm9yIGRpZmZlcmVudGlhbCBjaGFuZ2VzIHVzZSBAc2VlIGFkZCBhbmQgQHNlZSByZW1vdmUgcHJvcGVydGllcy4gKi9cbiAgbGlua3M/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBzZXQgb2YgbGlua3MgdG8gYWRkIHRvIHRoZSBhc3NvY2lhdGlvbnMgY29sbGVjdGlvbiAoQHNlZSBOb2RlUmVzcG9uc2UjbGlua3MgKSBhbGwgY3VycmVudGx5IGFzc29jaWF0ZWQgbGlua3MgcmVtYWluIHVuY2hhbmdlZC4gKi9cbiAgYWRkPzogc3RyaW5nW107XG4gIC8qKiBUaGUgc2V0IG9mIGxpbmtzIHRvIGJlIHJlbW92ZWQgZnJvbSB0byB0aGUgYXNzb2NpYXRpb25zIGNvbGxlY3Rpb24gKEBzZWUgTm9kZVJlc3BvbnNlI2xpbmtzICkuIExpbmtzIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIGFscmVhZHksIGFyZSBpZ25vcmVkLiAqL1xuICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBvcHRpb25hbCBub2RlIG1ldGFkYXRhLiAqL1xuICBtZXRhZGF0YT86IG9iamVjdDtcbiAgLyoqIFRoZSBvcHRpb25hbCBnZW9tZXRyeSBkYXRhIHRvIGF0dGFjaCB0byB0aGUgbm9kZSBvciByZXBsYWNlIHRoZSBleGlzdGluZyBvbmUuICovXG4gIGdlb21ldHJ5Pzoge1xuICAgIC8qKiBUaGUgYmFzZTY0IGVuY29kZWQgZ2VvbWV0cnkgZGF0YS4gVG8gcmVtb3ZlIHRoZSBnZW9tZXRyeSBmcm9tIHRoZSBub2RlIHBhc3MgYW4gZW1wdHkgc3RyaW5nLiAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKiogVGhlIGNvbnRlbnQgdHlwZSAoTUlNRSkgb2YgdGhlIGdlb21ldHJ5IGRhdGEuICovXG4gICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdXBkYXRlIG5vZGUgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU5vZGVPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0cmVlIGRlc2NyaXB0b3IgcmV0dXJuZWQgZnJvbSBAc2VlIE9yZ2FuaXNlciNjcmVhdGVOb2RlLCBAc2VlIE9yZ2FuaXNlciN1cGRhdGVOb2RlLCBAc2VlIE9yZ2FuaXNlciNkZWxldGVOb2RlIGFuZCBAc2VlIE9yZ2FuaXNlciNnZXROb2RlIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVJlc3BvbnNlIHtcbiAgLyoqIFRoZSBmb3Jlc3QgaWRlbnRpZmllci4gKi9cbiAgZm9yZXN0SWQ6IHN0cmluZztcbiAgLyoqIFRoZSB0cmVlIGlkZW50aWZpZXIuICovXG4gIHRyZWVJZDogc3RyaW5nO1xuICAvKiogVGhlIHVuaXF1ZSBub2RlIGlkZW50aWZpZXIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY3JlYXRpb24gdGltZXN0YW1wIGluIElTTyBmb3JtYXQuICovXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaXBhbCB3aG8gY3JlYXRlZCB0aGUgbm9kZS4gKi9cbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wIGluIElTTyBmb3JtYXQuICovXG4gIG1vZGlmaWVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcmluY2lsYXQgd2hvIGxhc3QgbW9kaWZpZWQgdGhlIG5vZGUuICovXG4gIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSBub2RlLiAqL1xuICB2OiBudW1iZXI7XG4gIC8qKiBUaGUgZGVsZXRpb24gbWFya2VyLiBJZiBub3QgcHJlc2VudCBvciBmYWxzZSB0aGUgbm9kZSBpcyBhY3RpdmUsIG90aGVyd2lzZSB0aGUgbm9kZSBpcyBtYXJrZWQgYXMgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGUgbmFtZS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbGxlY3Rpb24gb2YgbGlua3MgdG8gcmVzb3VyY2VzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbm9kZS4gTWlnaHQgYmUgYWJzZW50IGlmIGNsaWVudCByZXF1ZXN0ZWQgdG8gc2tpcCB0aGlzIHByb3BlcnR5IGZyb20gdGhlIHJlc3BvbnNlLlxuICAgKiBJZiBwcm9wZXJ0eSBpcyByZXF1ZXN0ZWQgYW5kIHRoZXJlIGFyZSBubyBhc3NvY2lhdGlvbnMgdGhlbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC5cbiAgICogSW4gY2FzZSBvZiBleHRlcm5hbGl6ZWQgbGlua3MgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmV0dXJuZWQuXG4gICAqL1xuICBsaW5rcz86IHN0cmluZ1tdO1xuICAvKiogVGhlIG51bWJlciBvZiBsaW5rcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUuICovXG4gIGNvdW50OiBudW1iZXI7XG4gIC8qKiBVUkwgdG8gZXh0ZXJuYWxpemVkIGxpbmtzLCBpZiB0aGF0J3MgdGhlIGNhc2UuIFRoaXMgaXMgcmV0dXJuZWQgZXZlbiB3aGVuIHRoZSBub2xpbmtzIG9wdGlvbiB3YXMgdXNlZCBpbiB0aGUgcmVxdWVzdC4gKi9cbiAgbGlua3NVcmw/OiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiBhY3Rpb25zIGN1cnJlbnQgdXNlciBoYXMgcmlnaHRzIHRvIHBlcmZvcm0gb24gdGhpcyByZXNvdXJjZSBhdCB0aGUgbW9tZW50IHRoZSByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgc2VydmljZS4gTm90IHJldHVybmVkIHdoZW4gc3BlY2lmaWMgdmVyc2lvbiBpcyByZXF1ZXN0ZWQuICovXG4gIF9hY3Rpb25zPzogc3RyaW5nW107XG4gIC8qKiBUaGUgbm9kZSBtZXRhZGF0YS4gKi9cbiAgbWV0YWRhdGE/OiBvYmplY3Q7XG4gIC8qKiBUaGUgYXNzb2NpYXRlZCBnZW9tZXRyeSBpbmZvcm1hdGlvbiwgaWYgZXhpc3RzIGZvciB0aGlzIG5vZGUuIERvIG5vdCBzdG9yZSB0aGlzIGZvciBhIGxvbmdlciB0aW1lIChzZWUgdXJsIHByb3BlcnR5KS4gKi9cbiAgZ2VvbWV0cnk/OiB7XG4gICAgLyoqIFRoZSBjb250ZW50IHR5cGUgKE1JTUUpIG9mIHRoZSBnZW9tZXRyeSBkYXRhLiAqL1xuICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB1cmwgdG8gZG93bmxvYWQgZ2VvbWV0cnkgZGF0YS4gSXQgaGFzIGFuIGV4cGlyYXRpb24gdGltZSwgbm90IHN1aXRhYmxlIGZvciB2ZXJ5IGRlbGF5ZWQgZG93bmxvYWRzLiBUbyBiZSB1c2VkIGFzIGlzLCBubyBhZGRpdGlvbmFsIGhlYWRlcnMuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIGRlLXNlcmlhbGl6ZWQgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSByZXF1ZXN0IHdpdGggbGlzdCBvZiB0cmVlIGRlc2NyaXB0b3JzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RUcmVlc1Jlc3BvbnNlIGV4dGVuZHMgUGFnZWRJdGVtczxUcmVlUmVzcG9uc2U+IHsgfVxuXG4vKipcbiAqIFRoZSBkZS1zZXJpYWxpemVkIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgcmVxdWVzdCB3aXRoIGxpc3Qgb2Ygbm9kZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE5vZGVzUmVzcG9uc2UgZXh0ZW5kcyBQYWdlZEl0ZW1zPE5vZGVSZXNwb25zZT4geyB9XG5cbi8qKlxuICogVGhlIHNlYXJjaCB0cmVlcyBBUEkgcGFyYW1ldGVycy5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBMaXN0VHJlZXNPcHRpb25zIGV4dGVuZHMgTGlzdE9wdGlvbnMge1xuICAvKiogQ29udHJvbHMgd2hpY2ggb3B0aW9uYWwgbm9kZSBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZCwgY3VycmVudGx5IG9ubHkgbWV0YWRhdGEgaXMgc3VwcG9ydGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGxpc3Qgbm9kZXMgQVBJIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdE5vZGVzT3B0aW9ucyBleHRlbmRzIExpc3RPcHRpb25zIHtcbiAgLyoqIFRoZSBub2RlIG5hbWUgcHJlZml4IHRvIGZpbHRlciBub2Rlcy4gT25seSBub2RlcyB3aG9zIG5hbWUgc3RhcnRzIHdpdGggdGhpcyBwcmVmaXggYXJlIHJldHVybmVkLiBBbGxvd3MgY29udmluaWVudGx5IGZlcmNoIGJyYW5jaGVzIG9mIHRoZSB0cmVlLiAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9scyB3aGV0aGVyIHRvIHNlbmQgbGlzdCBvZiBsaW5rIHRvZ2hldGhlciB3aXRoIHRoZSBub2RlIGRlc2NyaXB0b3JzLiBCeSBkZWZhdWx0IGxpbmtzIGFyZSBzZW50LiBBcHAgY2FuIHJlZHVjZSB0aGUgcGF5bG9hZCBzaXplIHdoZW4gcmVxdWVzdGluZyB0cmVlIHN0cnVjdHVyZSBieSB1c2luZyB0aGlzIHBhcmFtZXRlci4gKi9cbiAgbm9saW5rcz86IGJvb2xlYW47XG4gIC8qKiBDb250cm9scyB3aGljaCBvcHRpb25hbCBub2RlIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLCBjdXJyZW50bHkgb25seSBtZXRhZGF0YSBpcyBzdXBwb3J0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VhcmNoIG5vZGVzIEFQSSBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE5vZGVzT3B0aW9ucyBleHRlbmRzIExpc3RPcHRpb25zIHtcbiAgLyoqIElmIHByb3ZpZGVkIHNlYXJjaCBpcyBsaW1pdGVkIHRvIGEgc2luZ2xlIHRyZWUsIG90aGVyd2lzZSBzZWFyY2ggaW4gd2hvbGUgZm9yZXN0LiAqL1xuICB0cmVlSWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGluay4gT25seSBub2RlcyB0aGF0IGhhdmUgdGhpcyBsaW5rIGFyZSByZXR1cm5lZC4gKi9cbiAgbGluazogc3RyaW5nO1xuICAvKiogQ29udHJvbHMgd2hldGhlciB0byBzZW5kIGxpc3Qgb2YgbGluayB0b2doZXRoZXIgd2l0aCB0aGUgbm9kZSBkZXNjcmlwdG9ycy4gQnkgZGVmYXVsdCBsaW5rcyBhcmUgbm90IHNlbnQuIEFwcCBjYW4gcmVxdWVzdCBsaW5rcyB0byBiZSByZXR1cm5lZCBieSBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGZhbHNlLiAqL1xuICBub2xpbmtzPzogYm9vbGVhbjtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZS1zZXJpYWxpemVkIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgcmVxdWVzdCB3aXRoIGxpc3Qgb2Ygbm9kZSB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0Tm9kZVZlcnNpb25zT3B0aW9ucyBleHRlbmRzIExpc3RPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdG8gc2VuZCBsaXN0IG9mIGxpbmsgdG9naGV0aGVyIHdpdGggdGhlIG5vZGUgZGVzY3JpcHRvcnMuIEJ5IGRlZmF1bHQgbGlua3MgYXJlIHNlbnQuIEFwcCBjYW4gcmVkdWNlIHRoZSBwYXlsb2FkIHNpemUgd2hlbiByZXF1ZXN0aW5nIHRyZWUgc3RydWN0dXJlIGJ5IHVzaW5nIHRoaXMgcGFyYW1ldGVyLiAqL1xuICBub2xpbmtzPzogYm9vbGVhbjtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IG1ldGFkYXRhIGlzIHN1cHBvcnRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0cmVlIGlkZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVJZGVudGl0eSB7XG4gIC8qKiBUaGUgZm9yZXN0IGlkZW50aWZpZXIuICovXG4gIGZvcmVzdElkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdHJlZSBpZGVudGlmaWVyLiAqL1xuICB0cmVlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbm9kZSBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlSWRlbnRpdHkge1xuICAvKiogVGhlIGZvcmVzdCBpZGVudGlmaWVyLiAqL1xuICBmb3Jlc3RJZD86IHN0cmluZztcbiAgLyoqIFRoZSB0cmVlIGlkZW50aWZpZXIuICovXG4gIHRyZWVJZD86IHN0cmluZztcbiAgLyoqIFRoZSBub2RlIGlkZW50aWZpZXIuIFdoZW4gb25seSB0aGUgaWQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHJlcXVlc3RlZC4gKi9cbiAgbm9kZUlkOiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0aW5nIHRoZSBub2RlIHdpdGggdGhpcyB2ZXJzaW9uLiBPcHRpb25hbC4gKi9cbiAgdj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYmF0Y2ggZ2V0IEFQSSByZXF1ZXN0IGJvZHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hHZXRSZXF1ZXN0XG4gIGV4dGVuZHMgT3JnQmF0Y2hHZXRNYXA8VHJlZUlkZW50aXR5LCBOb2RlSWRlbnRpdHk+IHsgfVxuXG4vKipcbiAqIFRoZSBiYXRjaCBnZXQgQVBJIHJlcXVlc3QgYm9keS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXRjaEdldE5vZGVzUmVxdWVzdFxuICBleHRlbmRzIE9yZ0JhdGNoR2V0TWFwPFRyZWVJZGVudGl0eSwgTm9kZUlkZW50aXR5PiB7IH1cblxuLyoqXG4gKiBUaGUgQmF0Y2hHZXQgQVBJIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hHZXRPcHRpb25zIGV4dGVuZHMgR2V0T3B0aW9ucyB7XG4gIC8qKiBDb250cm9scyB3aGV0aGVyIHRvIHNlbmQgbGlzdCBvZiBsaW5rIHRvZ2hldGhlciB3aXRoIHRoZSBub2RlIGRlc2NyaXB0b3JzLiBCeSBkZWZhdWx0IGxpbmtzIGFyZSBzZW50LiBBcHAgY2FuIHJlZHVjZSB0aGUgcGF5bG9hZCBzaXplIHdoZW4gcmVxdWVzdGluZyB0cmVlIHN0cnVjdHVyZSBieSB1c2luZyB0aGlzIHBhcmFtZXRlci4gKi9cbiAgbm9saW5rcz86IGJvb2xlYW47XG4gIC8qKiBDb250cm9scyB3aGljaCBvcHRpb25hbCBub2RlIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLCBjdXJyZW50bHkgb25seSBtZXRhZGF0YSBpcyBzdXBwb3J0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgZnJvbSBiYXRjaCBnZXQgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoR2V0UmVzcG9uc2Uge1xuICAvKiogVGhlIGxpc3Qgb2YgdW5wcm9jZXNzZWQgcmVxdWVzdGVkIHJlc291cmNlcy5cbiAgICogSXQgaXMgaW1wb3J0YW50IHRoYXQgY2xpZW50IGhhcyBhIHJldHJ5IGxvZ2ljIHRvIGZldGNoIHRoZSBpdGVtcyB1bnByb2Nlc3NlZCBpbiB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAgICogQ29sbGVjdGlvbiBvZiB1bnByb2Nlc3NlZCBpdGVtcyBjYW4gYmUgcGFzc2VkIGFzIGlzIHRvIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAqL1xuICB1bnByb2Nlc3NlZDogT3JnQmF0Y2hHZXRNYXA8VHJlZUlkZW50aXR5LCBOb2RlSWRlbnRpdHk+O1xuICAvKiogVGhlIGNvbGxlY3Rpb24gcmVxdWVzdGVkIG5vZGVzLiAqL1xuICByZXNwb25zZXM6IE9yZ0JhdGNoR2V0TWFwPFRyZWVSZXNwb25zZSwgTm9kZVJlc3BvbnNlPjtcbiAgLyoqIFRoZSBsaXN0IG9mIGVycm9ycy4gKi9cbiAgZXJyb3JzOiBPcmdCYXRjaEdldE1hcDxcbiAgICBSZXNvdXJjZUlkZW50aXR5V2l0aEVycm9yPFRyZWVJZGVudGl0eT4sXG4gICAgUmVzb3VyY2VJZGVudGl0eVdpdGhFcnJvcjxOb2RlSWRlbnRpdHk+XG4gID47XG59XG5cbi8qKlxuICogVGhlIGJhdGNoIGdldCBBUEkgcmVxdWVzdCBib2R5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0JhdGNoR2V0TWFwPFQsIE4+IHtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIHRyZWVzLiAqL1xuICB0cmVlcz86IFRbXTtcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIG5vZGVzLiAqL1xuICBub2Rlcz86IE5bXTtcbn1cblxuLyoqXG4gKiBUaGUgY2hhbmdlc2V0IHJlcXVlc3QgcGFyYW1ldGVycyAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlc2V0T3B0aW9ucyB7XG4gIC8qKiBDb250cm9scyB3aGV0aGVyIHRvIHNlbmQgbGlzdCBvZiBsaW5rIHRvZ2hldGhlciB3aXRoIHRoZSBub2RlIGRlc2NyaXB0b3JzLiBCeSBkZWZhdWx0IGxpbmtzIGFyZSBzZW50LiBBcHAgY2FuIHJlZHVjZSB0aGUgcGF5bG9hZCBzaXplIHdoZW4gcmVxdWVzdGluZyB0cmVlIHN0cnVjdHVyZSBieSB1c2luZyB0aGlzIHBhcmFtZXRlci4gKi9cbiAgbm9saW5rcz86IGJvb2xlYW47XG4gIC8qKiBDb250cm9scyB3aGljaCBvcHRpb25hbCBub2RlIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLCBjdXJyZW50bHkgb25seSBtZXRhZGF0YSBpcyBzdXBwb3J0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgY2hhbmdlc2V0IHJlcXVlc3QgcGFyYW1ldGVycyAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlc2V0QXN5bmNPcHRpb25zIHtcbiAgLyoqIENvbnRyb2xzIHdoaWNoIG9wdGlvbmFsIG5vZGUgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIGN1cnJlbnRseSBvbmx5IGxpbmtzIGlzIHN1cHBvcnRlZC5cbiAgICogSWYgbGlua3MgaXMgc3BlY2lmaWVkLCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBhbGwgbm9kZXMnIGxpbmtzIGlubGluZWRcbiAgICovXG4gIGZpZWxkcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgY2hhbmdlIG5vZGUgcmVxdWVzdCBpcyBhbiB1cHNlcnQgdHlwZSBvZiByZXF1ZXN0LlxuICogSXQgY291bGQgYmUgdGhhdCBpdCBjcmVhdGVzIGEgbmV3IG5vZGUgb3IgdXBkYXRlcyBleGlzdGluZyBvciBldmVuIGRlbGV0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5nZU5vZGVSZXF1ZXN0ID1cbiAgfCBDcmVhdGVOb2RlUmVxdWVzdFxuICB8IFVwZGF0ZU5vZGVSZXF1ZXN0XG4gIHwgeyBpZDogc3RyaW5nOyBkZWxldGVkPzogYm9vbGVhbiB9O1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIG1vZGUgb2YgcHJvY2Vzc2luZyBoZSBjaGFuZ2VzZXQuXG4gKiBUaGUgY2hhbmdlc2V0IGNhbiBiZSBhcHBsaWVkIGluIHNuYXBzaG90IG9yIGluY3JlbWVudGFsIG1vZGUuXG4gKiBJbiB0aGUgc25hcHNob3QgbW9kZSBhbGwgbm9kZXMgbm90IG1lbnRpb25lZCBpbnQgaGUgcmVxdWVzdHMgd2lsbCBiZSBtYXJrZWQgYXMgZGVsZXRlZC5cbiAqIEluIHRoZSBpbmNyZW1lbnRhbCBtb2RlIG5vZGVzIG5vdCBtZW50aW9uZWQgaW4gdGhlIHJlcXVlc3QgYXJlIG5vdCB0b3VjaGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0NoYW5nZXNldENvbmZpZ3VyYXRpb24ge1xuICAvKiogVGhlIGNoYW5nZXNldCBtb2RlLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBpbmNyZW1lbnRhbCBtb2RlIGlzIHVzZWQuICovXG4gIHNuYXBzaG90PzogYm9vbGVhbjtcblxuICAvKiogVGhlIG5vZGUgbmFtZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgYXMgYSBzY29wZSBmb3IgdGhlIGNoYW5nZXNldC4gVXNlZCBvbmx5IGluIHRoZSBzbmFwc2hvdCBtb2RlIHRvIGxpbWl0IHRoZSBub2RlcyB0aGF0IHdpbGwgYmUgaW1wbGljaXRseSBkZWxldGVkLiAqL1xuICBzY29wZVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3luY2hyb25vdXMgY2hhbmdlc2V0IHJlcXVlc3QuXG4gKiBBY3R1YWwgbm9kZSBtb2RpZmljYXRpb24gcmVxdWVzdHMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbmZpZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdDaGFuZ2VzZXRSZXF1ZXN0IGV4dGVuZHMgT3JnQ2hhbmdlc2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBvZiBub2RlcyB0byBhZGQsIHVwZGF0ZSBvciBkZWxldGUuICovXG4gIG5vZGVzOiBDaGFuZ2VOb2RlUmVxdWVzdFtdO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBib2R5IGZvciBAc2VlIFBTZXQjY2hhbmdlc2V0IG9wZXJhdGlvbiBpZiBpdCBnb2VzIHRvIGFzeW5jIGV4ZWN1dGlvbiBtb2RlICg+NTAwIGl0ZW1zIGluIHRoZSByZXF1ZXN0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdDaGFuZ2VzZXRSZXNwb25zZUFjY2VwdGVkIHtcbiAgLyoqIFRoZSBjaGFuZ2VzZXQgaWRlbnRpZmllci4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSB1c2VyIGlkZW50aWZpZXIuICovXG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAvKiogVGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0LiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBjaGFuZ2VzZXQgcHJvY2Vzc2luZyBzdGF0dXM6IFdhaXRpbmdVcGxvYWQsIFF1ZXVlZCwgUHJvY2Vzc2luZywgRG9uZSwgRmFpbGVkLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgLyoqIFRoZSBjaGFuZ2VzZXQgbW9kZSB3YXMgdXNlZC4gKi9cbiAgc25hcHNob3Q6IGJvb2xlYW47XG4gIC8qKiBUaGUgbm9kZSBuYW1lIHByZWZpeCB3YXMgdXNlZC4gKi9cbiAgc2NvcGVQcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlIGJvZHkgZm9yIEBzZWUgT3JnYW5pemVyI2NoYW5nZXNldCBvcGVyYXRpb24gaWYgaXQgaXMgZXhlY3V0ZWQgaW4gc3luYyBtb2RlICg8PTUwMCBpdGVtcyBpbiB0aGUgcmVxdWVzdCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnQ2hhbmdlc2V0UmVzcG9uc2VJbmxpbmVcbiAgZXh0ZW5kcyBPcmdDaGFuZ2VzZXRSZXNwb25zZUFjY2VwdGVkIHtcbiAgLyoqIFRoZSB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdCB3aGVuIHByb2Nlc3NpbmcgaGFzIGJlZW4gc3RhcnRlZC4gKi9cbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGltZXN0YW1wIGluIElTTyBmb3JtYXQgd2hlbiBwcm9jZXNzaW5nIGhhcyBiZWVuIGZpbmlzaGVkLiAqL1xuICBwcm9jZXNzZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGVycm9yIG1lc3NhZ2UgaWYgcHJvY2Vzc2luZyBvZiB0aGUgY2hhbmdlc2V0IGZhaWxlZC4gKi9cbiAgbWVzc2FnZT86IHN0cmluZztcbiAgLyoqIE51bWJlciBvZiBpdGVtcyBzdWNjZXNzZnVsbCBwcm9jZXNzZWQuICovXG4gIGl0ZW1Db3VudDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0IGl0ZW1zLiAqL1xuICBlcnJvckNvdW50OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIG5vZGVzIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4gUmV0dXJuZWQgaWYgPD0gNTAwIGl0ZW1zIGVjaG9lZC4gKi9cbiAgbm9kZXM/OiBOb2RlUmVzcG9uc2VbXTtcbiAgLyoqIFVybCBmb3IgZG93bmxvYWRpbmcgZWNob2VkIHByb2Nlc3NlZCBpdGVtcy4gUmV0dXJuZWQgaWYgPiA1MDAgaXRlbXMgZWNob2VkIChmb3IgZXhhbXBsZSBkZWxldGVkIG5vZGVzIGluIHNuYXBzaG90IG1vZGUpLlxuICAgKiBGaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNlcGFyYXRlIE5vZGVSZXNwb25zZSBvYmplY3RzIGluIE5ld2xpbmUgRGVsaW1pdGVkIEpTT04gZm9ybWF0IChzZWUgaHR0cDovL25kanNvbi5vcmcvLCBDb250ZW50LVR5cGU9YXBwbGljYXRpb24veC1uZGpzb24pLlxuICAgKi9cbiAgcmVzdWx0c1VybD86IHN0cmluZztcblxuICAvKiogVGhlIGNvbGxlY3Rpb24gb2Ygbm9kZXMgdGhhdCB3ZXJlIGxlZnQgdW5wcm9jZXNzZWQgYmVjYXVzZSBvZiBlcnJvcnMuICovXG4gIHVucHJvY2Vzc2VkPzogVW5wcm9jZXNzZWROb2RlW107XG4gIC8qKiBVcmwgZm9yIGRvd25sb2FkaW5nIGZhaWxlZCByZXF1ZXN0IGl0ZW1zLiBSZXR1cm5lZCBpZiA+IDUwMCBpdGVtcyBmYWlsZWQgKGZvciBleGFtcGxlIGZhaWxlZCBkZWxldGlvbiBvZiBub2RlcyBpbiBzbmFwc2hvdCBtb2RlKS5cbiAgICogRmlsZSBjb250YWlucyBtdWx0aXBsZSBzZXBhcmF0ZSBVbnByb2Nlc3NlZE5vZGUgb2JqZWN0cyBpbiBOZXdsaW5lIERlbGltaXRlZCBKU09OIGZvcm1hdCAoc2VlIGh0dHA6Ly9uZGpzb24ub3JnLywgQ29udGVudC1UeXBlPWFwcGxpY2F0aW9uL3gtbmRqc29uKS5cbiAgICovXG4gIGVycm9yc1VybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbm9kZSB1bnByb2Nlc3NlZCBkdWUgdG8gc29tZSBlcnJvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnByb2Nlc3NlZE5vZGUge1xuICAvKiogVGhlIG5vZGUgY2hhbmdlIHJlcXVlc3RlZCBpbiB0aGUgY2hhbmdlc2V0IGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSAoZS5nLiBub2RlIG5vdCBtZW50aW9uZWQgaW4gdGhlIHNuYXBob3QgdHlwZSBvZiBjaGFuZ2VzZXQgcmVxdWVzdCkuICovXG4gIGl0ZW06IENoYW5nZU5vZGVSZXF1ZXN0O1xuXG4gIC8qKiBUaGUgZXJyb3IgY29kZS4gKi9cbiAgY29kZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZXJyb3IgbWVzc2FnZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBib2R5IGZvciBpbml0aWFsaXppbmcgYXN5bmNocm9ub3VzIGNoYW5nZXNldCwgIEBzZWUgT3JnYW5pemVyI2NoYW5nZXNldEFzeW5jIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdDaGFuZ2VzZXRSZXNwb25zZUFzeW5jXG4gIGV4dGVuZHMgT3JnQ2hhbmdlc2V0UmVzcG9uc2VBY2NlcHRlZCB7XG4gIC8qKiBVcmwgZm9yIHVwbG9hZGluZyByZXF1ZXN0IGl0ZW1zLiBGaWxlIG11c3QgY29udGFpbiBtdWx0aXBsZSBzZXBhcmF0ZSBDaGFuZ2VOb2RlUmVxdWVzdCBvYmplY3RzIGluIE5ld2xpbmUgRGVsaW1pdGVkIEpTT04gZm9ybWF0IChzZWUgaHR0cDovL25kanNvbi5vcmcvLCBDb250ZW50LVR5cGU9YXBwbGljYXRpb24veC1uZGpzb24pLiAqL1xuICB1cGxvYWRVcmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UgYm9keSBmb3IgQHNlZSBPcmdhbml6ZXIjY2hhbmdlc2V0U3RhdHVzIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdDaGFuZ2VzZXRTdGF0dXNSZXNwb25zZVxuICBleHRlbmRzIE9yZ0NoYW5nZXNldFJlc3BvbnNlQWNjZXB0ZWQge1xuICAvKiogVGhlIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0IHdoZW4gcHJvY2Vzc2luZyBoYXMgYmVlbiBzdGFydGVkLiAqL1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGltZXN0YW1wIGluIElTTyBmb3JtYXQgd2hlbiBwcm9jZXNzaW5nIGhhcyBiZWVuIGZpbmlzaGVkLiAqL1xuICBwcm9jZXNzZWRBdD86IHN0cmluZztcbiAgLyoqIFRoZSBlcnJvciBtZXNzYWdlIGlmIHByb2Nlc3Npbmcgb2YgdGhlIGNoYW5nZXNldCBmYWlsZWQuICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgaXRlbXMgc3VjY2Vzc2Z1bGwgcHJvY2Vzc2VkLiAqL1xuICBub2RlQ291bnQ6IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCBpdGVtcy4gKi9cbiAgdW5wcm9jZXNzZWRDb3VudDogbnVtYmVyO1xuICAvKiogVXJsIGZvciBkb3dubG9hZGluZyBlY2hvZWQgcHJvY2Vzc2VkIGl0ZW1zLiBGaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNlcGFyYXRlIE5vZGVSZXNwb25zZSBvYmplY3RzIGluIE5ld2xpbmUgRGVsaW1pdGVkIEpTT04gZm9ybWF0IChzZWUgaHR0cDovL25kanNvbi5vcmcvLCBDb250ZW50LVR5cGU9YXBwbGljYXRpb24veC1uZGpzb24pLiAqL1xuICByZXN1bHRzVXJsPzogc3RyaW5nO1xuICAvKiogVXJsIGZvciBkb3dubG9hZGluZyBmYWlsZWQgcmVxdWVzdCBpdGVtcy4gRmlsZSBjb250YWlucyBtdWx0aXBsZSBzZXBhcmF0ZSBVbnByb2Nlc3NlZE5vZGUgb2JqZWN0cyBpbiBOZXdsaW5lIERlbGltaXRlZCBKU09OIGZvcm1hdCAoc2VlIGh0dHA6Ly9uZGpzb24ub3JnLywgQ29udGVudC1UeXBlPWFwcGxpY2F0aW9uL3gtbmRqc29uKS4gKi9cbiAgZXJyb3JzVXJsPzogc3RyaW5nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0gc2VydmljZSBjYWxscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUgc2VydmljZSBjbGllbnQgdGhhdCByZXByZXNlbnRzIGNvbm5lY3Rpb24gdG8gdGhlIE9yZ2FuaXplciBTZXJ2aWNlLlxuICogRWFjaCBBUEkgb3BlcmF0aW9uIGlzIGV4cG9zZWQgYXMgYSBmdW5jdGlvbiBvbiBzZXJ2aWNlLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWNsYXNzZXMtcGVyLWZpbGVcbmV4cG9ydCBjbGFzcyBPcmdhbml6ZXIgZXh0ZW5kcyBTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvciBDb25zdHJ1Y3RzIGEgc2VydmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q29uZmlnfSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZS5nLiBzZXJ2aWNlIHVybCkuIElmIG5vdCBwcm92aWRlZCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHdpbGwgYmUgdXNlZC5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHMgVGhlIGNyZWRlbnRpYWxzIHRvIGJlIGF0dGFjaGVkIHRvIHNlcnZpY2UgcmVxdWVzdHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBQYXJ0aWFsPENvbmZpZ3VyYXRpb24+KSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29uZmlnOiBQYXJ0aWFsPENvbmZpZ3VyYXRpb24+ID0geyAuLi5jb25maWcgfTtcblxuICAgIGlmIChcbiAgICAgIHNhbml0aXplZENvbmZpZyAmJlxuICAgICAgc2FuaXRpemVkQ29uZmlnLnJlZ2lvbiAmJlxuICAgICAgc2FuaXRpemVkQ29uZmlnLnNlcnZpY2VVcmkgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgaWYgKE9yZ1NlcnZpY2VVcmlNYXAuaGFzKHNhbml0aXplZENvbmZpZy5yZWdpb24pKSB7XG4gICAgICAgIHNhbml0aXplZENvbmZpZy5zZXJ2aWNlVXJpID0gT3JnU2VydmljZVVyaU1hcC5nZXQoXG4gICAgICAgICAgc2FuaXRpemVkQ29uZmlnLnJlZ2lvblxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbmtub3duIHJlZ2lvbjogJHtzYW5pdGl6ZWRDb25maWcucmVnaW9uXG4gICAgICAgICAgfSwgYWxsb3dlZCB2YWx1ZXMgJHtBcnJheS5mcm9tKE9yZ1NlcnZpY2VVcmlNYXAua2V5cygpKS5qb2luKCcsICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcih7IC4uLmdldERlZmF1bHRDb25maWd1cmF0aW9uKCksIC4uLnNhbml0aXplZENvbmZpZyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIHRoZSBzZXJ2aWNlIGtub3dzIGFib3V0IHRoZSBjdXJyZW50IHVzZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxVc2VySW5mb1Jlc3BvbnNlPj59IHRoZSBpbmZvcm1hdGlvbiBrbm93biBhYm91dCB0aGUgY2FsbGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPFVzZXJJbmZvUmVzcG9uc2U+PiB7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8VXNlckluZm9SZXNwb25zZT4oJ21lJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb21lIG9yIGFsbCAodXAgdG8gNTAwLCBkZWZhdWx0IGlzIDEwMCkgb2YgdGhlIHRyZWVzIGluIGEgZm9yZXN0LlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFzIHNlbGVjdGlvbiBjcml0ZXJpYSB0byByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIHRyZWVzIGluIGEgZm9yZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGZvcmVzdCB0byBsaXN0IHRyZWVzIGZyb20uXG4gICAqIEBwYXJhbSB7TGlzdFRyZWVzT3B0aW9uc30gcGFyYW1zIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0VHJlZXNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdFRyZWVzKFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogTGlzdFRyZWVzT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0VHJlZXNSZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoZm9yZXN0SWQpfS90cmVlc2A7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgaWYgKHBhcmFtcy5kZWxldGVkKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ2RlbGV0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy50b3ApIHtcbiAgICAgICAgcXVlcnkucHVzaChgdG9wPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy50b3AudG9TdHJpbmcoKSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuc2tpcHRva2VuKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHNraXB0b2tlbj0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuc2tpcHRva2VuKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5maWVsZHMpIHtcbiAgICAgICAgcXVlcnkucHVzaChgZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3RUcmVlc1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRyZWUgZGVzY3JpcHRvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcmVzdElkIFRoZSBmb3Jlc3QgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyZWVJZCBUaGUgdHJlZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0dldFRyZWVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFRyZWVSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHRyZWUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFRyZWUoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBHZXRUcmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxUcmVlUmVzcG9uc2U+PiB7XG4gICAgbGV0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZm9yZXN0SWRcbiAgICApfS90cmVlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmVlSWQpfWA7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgaWYgKHBhcmFtcy5kZWxldGVkKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ2RlbGV0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5maWVsZHMpIHtcbiAgICAgICAgcXVlcnkucHVzaChgZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFRyZWVSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRyZWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgZm9yZXN0IHRvIGNyZWF0ZSBhIHRyZWUgaW4uXG4gICAqIEBwYXJhbSB7Q3JlYXRlVHJlZVJlcXVlc3R9IHJlcXVlc3QgVGhlIHRyZWUgY3JlYXRpb24gcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFRyZWVSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIHRyZWUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVRyZWUoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICByZXF1ZXN0OiBDcmVhdGVUcmVlUmVxdWVzdCxcbiAgICBwYXJhbXM/OiBDcmVhdGVUcmVlT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxUcmVlUmVzcG9uc2U+PiB7XG4gICAgbGV0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZvcmVzdElkKX0vdHJlZXNgO1xuICAgIGlmIChwYXJhbXM/LmZpZWxkcykge1xuICAgICAgdXJsICs9IGA/ZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFRyZWVSZXNwb25zZT4odXJsLCAnUE9TVCcsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtVcGRhdGVUcmVlUmVxdWVzdH0gcmVxdWVzdCBUaGUgdHJlZSBkZXNjcmlwdG9yIHVwZGF0ZSByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VHJlZVJlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggdHJlZSBkZXNjcmlwdG9yLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlVHJlZShcbiAgICBmb3Jlc3RJZDogc3RyaW5nLFxuICAgIHRyZWVJZDogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IFVwZGF0ZVRyZWVSZXF1ZXN0LFxuICAgIHBhcmFtcz86IFVwZGF0ZVRyZWVPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPFRyZWVSZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9YDtcbiAgICBpZiAocGFyYW1zPy5maWVsZHMpIHtcbiAgICAgIHVybCArPSBgP2ZpZWxkcz0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZmllbGRzKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxUcmVlUmVzcG9uc2U+KFxuICAgICAgdXJsLFxuICAgICAgJ1BBVENIJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgdHJlZSBhcyBkZWxldGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGZvcmVzdCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJlZUlkIFRoZSB0cmVlIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRyZWVSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggdHJlZSBkZXNjcmlwdG9yLlxuICAgKiBAcGFyYW0ge0RlbGV0ZU9wdGlvbnN9IHBhcmFtcyBUaGUgb3B0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlVHJlZShcbiAgICBmb3Jlc3RJZDogc3RyaW5nLFxuICAgIHRyZWVJZDogc3RyaW5nLFxuICAgIHBhcmFtcz86IERlbGV0ZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8VHJlZVJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZm9yZXN0SWRcbiAgICApfS90cmVlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmVlSWQpfWA7XG5cbiAgICBsZXQgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyYW1zICYmIHBhcmFtcy52ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdJZi1NYXRjaCc6IGBXL1wiJHtwYXJhbXMudn1cImAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8VHJlZVJlc3BvbnNlPih1cmwsICdERUxFVEUnLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJlZSBhY2Nlc3MgY29udHJvbCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFBvbGljeT4+fSB0aGUgYWNjZXNzIGNvbnRyb2wgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFRyZWVQb2xpY3koXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxQb2xpY3k+PiB7XG4gICAgY29uc3QgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L3BvbGljeWA7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8UG9saWN5Pih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dHMgdGhlIHRyZWUgYWNjZXNzIGNvbnRyb2wgcG9saWN5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGZvcmVzdCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJlZUlkIFRoZSB0cmVlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7UG9saWN5fSBwb2xpY3kgVGhlIHBvbGljeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPHZvaWQ+Pn0gdGhlIGVtcHR5IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1dFRyZWVQb2xpY3koXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBwb2xpY3k6IFBvbGljeVxuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTx2b2lkPj4ge1xuICAgIGNvbnN0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZm9yZXN0SWRcbiAgICApfS90cmVlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmVlSWQpfS9wb2xpY3lgO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PHZvaWQ+KHVybCwgJ1BVVCcsIEpTT04uc3RyaW5naWZ5KHBvbGljeSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFnZSBvZiB0aGUgbm9kZXMgKHVwIHRvIDEwMCwgZGVmYXVsdCBpcyAxMDApIGluIGEgdHJlZSB0aGF0IHNhdGlzZnkgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcmVzdElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBmb3Jlc3QuXG4gICAqIEBwYXJhbSB7U2VhcmNoTm9kZXNPcHRpb25zfSBwYXJhbXMgVGhlIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3ROb2Rlc1Jlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2hOb2RlcyhcbiAgICBmb3Jlc3RJZDogc3RyaW5nLFxuICAgIHBhcmFtczogU2VhcmNoTm9kZXNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPExpc3ROb2Rlc1Jlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBwYXJhbXMudHJlZUlkXG4gICAgICA/IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZvcmVzdElkKX0vdHJlZXMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgIHBhcmFtcy50cmVlSWRcbiAgICAgICl9L3NlYXJjaGBcbiAgICAgIDogYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoZm9yZXN0SWQpfS9zZWFyY2hgO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZGVsZXRlZCkge1xuICAgICAgICBxdWVyeS5wdXNoKCdkZWxldGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMudG9wKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHRvcD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudG9wLnRvU3RyaW5nKCkpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNraXB0b2tlbikge1xuICAgICAgICBxdWVyeS5wdXNoKGBza2lwdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNraXB0b2tlbil9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubGluaykge1xuICAgICAgICBxdWVyeS5wdXNoKGBsaW5rPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5saW5rKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5ub2xpbmtzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ25vbGlua3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5maWVsZHMpIHtcbiAgICAgICAgcXVlcnkucHVzaChgZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PExpc3ROb2Rlc1Jlc3BvbnNlPih1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc29tZSBvciBhbGwgKHVwIHRvIDUwMCwgZGVmYXVsdCBpcyAxMDApIG9mIHRoZSBub2RlcyBpbiBhIHRyZWUuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgYXMgc2VsZWN0aW9uIGNyaXRlcmlhIHRvIHJldHVybiBhIHN1YnNldCBvZiB0aGUgbm9kZXMgaW4gYSB0cmVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGZvcmVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyZWVJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJlZSB0byBsaXN0IHRyZWVzIGZyb20uXG4gICAqIEBwYXJhbSB7TGlzdE5vZGVzT3B0aW9uc30gcGFyYW1zIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0Tm9kZXNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdE5vZGVzKFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogTGlzdE5vZGVzT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0Tm9kZXNSZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzYDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnRvcCkge1xuICAgICAgICBxdWVyeS5wdXNoKGB0b3A9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnRvcC50b1N0cmluZygpKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5za2lwdG9rZW4pIHtcbiAgICAgICAgcXVlcnkucHVzaChgc2tpcHRva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5za2lwdG9rZW4pfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnByZWZpeCkge1xuICAgICAgICBxdWVyeS5wdXNoKGBwcmVmaXg9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnByZWZpeCl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubm9saW5rcykge1xuICAgICAgICBxdWVyeS5wdXNoKCdub2xpbmtzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuZmllbGRzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYGZpZWxkcz0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZmllbGRzKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxMaXN0Tm9kZXNSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNvbWUgb3IgYWxsICh1cCB0byA1MDAsIGRlZmF1bHQgaXMgMTAwKSBvZiB0aGUgbm9kZSB2ZXJzaW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcmVzdElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBmb3Jlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRyZWUgdG8gbGlzdCB0cmVlcyBmcm9tLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIFRoZSBub2RlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7TGlzdE5vZGVWZXJzaW9uc09wdGlvbnN9IHBhcmFtcyBUaGUgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8TGlzdE5vZGVzUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3ROb2RlVmVyc2lvbnMoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBMaXN0Tm9kZVZlcnNpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxMaXN0Tm9kZXNSZXNwb25zZT4+IHtcbiAgICBsZXQgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbm9kZUlkXG4gICAgKX0vdmVyc2lvbnNgO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZGVsZXRlZCkge1xuICAgICAgICBxdWVyeS5wdXNoKCdkZWxldGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMudG9wKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYHRvcD0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudG9wLnRvU3RyaW5nKCkpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNraXB0b2tlbikge1xuICAgICAgICBxdWVyeS5wdXNoKGBza2lwdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnNraXB0b2tlbil9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubm9saW5rcykge1xuICAgICAgICBxdWVyeS5wdXNoKCdub2xpbmtzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuZmllbGRzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYGZpZWxkcz0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZmllbGRzKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxMaXN0Tm9kZXNSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBub2RlIGRlc2NyaXB0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCBUaGUgbm9kZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0dldE5vZGVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPE5vZGVSZXNwb25zZT4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIG5vZGUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE5vZGUoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBHZXROb2RlT3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxOb2RlUmVzcG9uc2U+PiB7XG4gICAgbGV0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZm9yZXN0SWRcbiAgICApfS90cmVlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmVlSWQpfS9ub2Rlcy8ke2VuY29kZVVSSUNvbXBvbmVudChub2RlSWQpfWA7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZGVsZXRlZCkge1xuICAgICAgICBxdWVyeS5wdXNoKCdkZWxldGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMubm9saW5rcykge1xuICAgICAgICBxdWVyeS5wdXNoKCdub2xpbmtzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuZmllbGRzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYGZpZWxkcz0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZmllbGRzKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxOb2RlUmVzcG9uc2U+KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9kZSBsaW5rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcmVzdElkIFRoZSBmb3Jlc3QgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyZWVJZCBUaGUgdHJlZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIFRoZSBub2RlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7R2V0Tm9kZU9wdGlvbnN9IHBhcmFtcyBUaGUgb3B0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8c3RyaW5nW10+Pn0gVGhlIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCBhcnJheSBvZiBub2RlIGxpbmtzLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Tm9kZUxpbmtzKFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogR2V0Tm9kZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8c3RyaW5nW10+PiB7XG4gICAgY29uc3QgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbm9kZUlkXG4gICAgKX0vbGlua3Mke3BhcmFtcyAmJiBwYXJhbXMuZGVsZXRlZCA/ICc/ZGVsZXRlZCcgOiAnJ31gO1xuXG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8c3RyaW5nW10+KHVybCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGZvcmVzdCB0byBjcmVhdGUgYSB0cmVlIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJlZUlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBmb3Jlc3QgdG8gY3JlYXRlIGEgdHJlZSBpbi5cbiAgICogQHBhcmFtIHtDcmVhdGVOb2RlUmVxdWVzdH0gcmVxdWVzdCBUaGUgdHJlZSBjcmVhdGlvbiByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Tm9kZVJlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCB0cmVlIGRlc2NyaXB0b3IuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOb2RlKFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgbm9kZTogQ3JlYXRlTm9kZVJlcXVlc3QsXG4gICAgcGFyYW1zPzogQ3JlYXRlTm9kZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Tm9kZVJlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgZm9yZXN0cy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGZvcmVzdElkXG4gICAgKX0vdHJlZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJlZUlkKX0vbm9kZXNgO1xuICAgIGlmIChwYXJhbXM/LmZpZWxkcykge1xuICAgICAgdXJsICs9IGA/ZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PE5vZGVSZXNwb25zZT4odXJsLCAnUE9TVCcsIEpTT04uc3RyaW5naWZ5KG5vZGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGZvcmVzdCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJlZUlkIFRoZSB0cmVlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub2RlSWQgVGhlIG5vZGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtVcGRhdGVOb2RlUmVxdWVzdH0gcmVxdWVzdCBUaGUgdHJlZSBkZXNjcmlwdG9yIHVwZGF0ZSByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Tm9kZVJlc3BvbnNlPj59IFRoZSBkZS1zZXJpYWxpemVkIHNlcnZpY2UgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVOb2RlKFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgbm9kZTogVXBkYXRlTm9kZVJlcXVlc3QsXG4gICAgcGFyYW1zPzogVXBkYXRlTm9kZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Tm9kZVJlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgZm9yZXN0cy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGZvcmVzdElkXG4gICAgKX0vdHJlZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJlZUlkKX0vbm9kZXMvJHtlbmNvZGVVUklDb21wb25lbnQobm9kZUlkKX1gO1xuICAgIGlmIChwYXJhbXM/LmZpZWxkcykge1xuICAgICAgdXJsICs9IGA/ZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PE5vZGVSZXNwb25zZT4odXJsLCAnUEFUQ0gnLCBKU09OLnN0cmluZ2lmeShub2RlKSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIG5vZGUgYXMgZGVsZXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcmVzdElkIFRoZSBmb3Jlc3QgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyZWVJZCBUaGUgdHJlZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIFRoZSBub2RlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7RGVsZXRlT3B0aW9uc30gcGFyYW1zIFRoZSBvcHRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxOb2RlUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZSB3aXRoIG5vZGUgZGVzY3JpcHRvci5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZU5vZGUoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBEZWxldGVPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPE5vZGVSZXNwb25zZT4+IHtcbiAgICBjb25zdCB1cmwgPSBgZm9yZXN0cy8ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGZvcmVzdElkXG4gICAgKX0vdHJlZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJlZUlkKX0vbm9kZXMvJHtlbmNvZGVVUklDb21wb25lbnQobm9kZUlkKX1gO1xuXG4gICAgbGV0IGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnSWYtTWF0Y2gnOiBgVy9cIiR7cGFyYW1zLnZ9XCJgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PE5vZGVSZXNwb25zZT4odXJsLCAnREVMRVRFJywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSBub2RlIG9yIHVuZGVmaW5lZCBpZiBnZW9tZXRyeSBpbmZvIGRvZXNuJ3QgZXhpc3QuXG4gICAqIE5vdGUgdGhhdCBlcnJvciB3aXRoIGNvZGUgNDA0IG1lYW5zIHRoZSBub2RlIGlzIG5vdCBmb3VuZCAobm90IHRoZSBnZW9tZXRyeSkuXG4gICAqIFVzZSB0aGlzIGNhbGwgd2hlbiB5b3UgZG9uJ3QgZG93bmxvYWQgZ2VvbWV0cnkgc29vbiBhZnRlciB0aGUgbm9kZSBkZXNjcmlwdG9yLiBUaGUgb3JpZ2luYWwgVVJMIGluIHRoZSBkZXNjcmlwdG9yIGNhbiBleHBpcmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCBUaGUgbm9kZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0dldE5vZGVPcHRpb25zfSBwYXJhbXMgVGhlIG9wdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy4gT25seSB0aGUgJ2RlbGV0ZWQnIG9wdGlvbiBpcyB1c2VkIGluIHRoaXMgc3BlY2lhbCBjYXNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8QmxvYiB8IHVuZGVmaW5lZD4+fSBUaGUgc2VydmljZSByZXNwb25zZSB3aXRoIGJsb2Igb3IgdW5kZWZpbmVkLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuIE5vdCBoYXZpbmcgZ2VvbWV0cnkgaXMgbm90IGFuIGVycm9yLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gZm9yIGNlcnRhaW4gcnVudGltZSBlbnZpcm9ubWVudHMgKE5vZGVKUykgd2hlcmUgaXQgaXMga25vd24gbm90IHRvIHdvcmsuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Tm9kZUdlb21ldHJ5KFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogR2V0Tm9kZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8QmxvYiB8IHVuZGVmaW5lZD4+IHtcbiAgICAvLyB0aGUgbG93ZXIgbGV2ZWwgY29kZSBkb2VzIG5vdCB3b3JrIGluIE5vZGVKUyBlbnZpcm9ubWVudCB3aXRoIEJsb2JzIGFuZCBmZXRjaCBpbnZvbHZpbmcgYmluYXJ5IGRhdGFcbiAgICBpZiAoIWlzQnJvd3NlciAmJiAhaXNXZWJXb3JrZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBpbiBOb2RlSlMgZW52aXJvbm1lbnQuJyk7XG4gICAgfVxuXG4gICAgLy8gbGltaXRhdGlvbnMgb2YgZmV0Y2gtYmFzZWQgcmVxdWVzdCBpbiBzZXJ2aWNlLnRzIChpbiBicm93c2VyIGVudmlyb25tZW50KTpcbiAgICAvLyAtIHdpdGggcmVkaXJlY3Q9Zm9sbG93IHRoZSBwcmVzZW5jZSBvZiBhdXRob3JpemF0aW9uIGhlYWRlciBjYXVzZXMgdGhlIHJlZGlyZWN0ZWQgY2FsbCB0byBmYWlsXG4gICAgLy8gLSByZWRpcmVjdD1tYW51YWwgZG9lcyBub3Qgd29yayBieSBkZXNpZ24gaW4gYnJvd3NlciBlbnZpcm9ubWVudCAocmV0dXJucyB1bnVzYWJsZSBkYXRhKVxuICAgIC8vIFRoZSByZWFsIHVybCB3b3VsZCBiZSBgZm9yZXN0cy8ke2VuY29kZVVSSUNvbXBvbmVudChmb3Jlc3RJZCl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5vZGVJZCl9L2dlb21ldHJ5YCArIGRlbGV0ZWQgZmxhZy5cblxuICAgIC8vIFVudGlsIHdlIGhhdmUgYSBwcm9wZXIgZmV0Y2ggYWx0ZXJuYXRpdmUgdG8gdXNlIGhlcmUsIHdlIHJldHJpZXZlIHRoZSBub2RlIHRvIGhhdmUgYSBub3QtZXhwaXJlZCBVUkwgdG8gdGhlIGdlb21ldHJ5IGRhdGEuXG4gICAgY29uc3QgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5vZGVJZCl9YDtcbiAgICByZXR1cm4gdGhpcy5jb21tb25HZXROb2RlR2VvbWV0cnkodXJsLCAhIShwYXJhbXMgJiYgcGFyYW1zLmRlbGV0ZWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSBub2RlIG9yIHVuZGVmaW5lZCBpZiBnZW9tZXRyeSBpbmZvIGRvZXNuJ3QgZXhpc3QuXG4gICAqIE5vdGUgdGhhdCBlcnJvciB3aXRoIGNvZGUgNDA0IG1lYW5zIHRoZSBub2RlIGlzIG5vdCBmb3VuZCAobm90IHRoZSBnZW9tZXRyeSkuXG4gICAqIFVzZSB0aGlzIGNhbGwgd2hlbiB5b3UgZG9uJ3QgZG93bmxvYWQgZ2VvbWV0cnkgc29vbiBhZnRlciB0aGUgbm9kZSBkZXNjcmlwdG9yLiBUaGUgb3JpZ2luYWwgVVJMIGluIHRoZSBkZXNjcmlwdG9yIGNhbiBleHBpcmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCBUaGUgbm9kZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiBUaGUgbm9kZSB2ZXJzaW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCbG9iIHwgdW5kZWZpbmVkPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggYmxvYiBvciB1bmRlZmluZWQuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS4gTm90IGhhdmluZyBnZW9tZXRyeSBpcyBub3QgYW4gZXJyb3IuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBmb3IgY2VydGFpbiBydW50aW1lIGVudmlyb25tZW50cyAoTm9kZUpTKSB3aGVyZSBpdCBpcyBrbm93biBub3QgdG8gd29yay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXROb2RlVmVyc2lvbkdlb21ldHJ5KFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogbnVtYmVyXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPEJsb2IgfCB1bmRlZmluZWQ+PiB7XG4gICAgLy8gdGhlIGxvd2VyIGxldmVsIGNvZGUgZG9lcyBub3Qgd29yayBpbiBOb2RlSlMgZW52aXJvbm1lbnQgd2l0aCBCbG9icyBhbmQgZmV0Y2ggaW52b2x2aW5nIGJpbmFyeSBkYXRhXG4gICAgaWYgKCFpc0Jyb3dzZXIgJiYgIWlzV2ViV29ya2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgaW4gTm9kZUpTIGVudmlyb25tZW50LicpO1xuICAgIH1cblxuICAgIC8vIEZvciBleHRlbnNpdmUgY29tbWVudHMgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uIHNlZSBnZXROb2RlR2VvbWV0cnkuXG4gICAgLy8gVGhlIHJlYWwgdXJsIHdvdWxkIGJlIGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZvcmVzdElkKX0vdHJlZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJlZUlkKX0vbm9kZXMvJHtlbmNvZGVVUklDb21wb25lbnQobm9kZUlkKX0vdmVyc2lvbnMvJHt2ZXJzaW9ufS9nZW9tZXRyeWAuXG4gICAgY29uc3QgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbm9kZUlkXG4gICAgKX0vdmVyc2lvbnMvJHt2ZXJzaW9ufWA7XG4gICAgcmV0dXJuIHRoaXMuY29tbW9uR2V0Tm9kZUdlb21ldHJ5KHVybCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvciB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBnZW9tZXRyeSBwcm9wZXJ0eSBvZiB0aGUgbm9kZS5cbiAgICogVmFsdWUgaXMgYSBibG9iIG9mIGFueSBjb250ZW50IHR5cGUgdGhhdCBpcyBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIHNlcnZpY2UsIGJ1dCBzdG9yZWQgYXMgaXMuXG4gICAqIFRoZXJlIGlzIGEgbGltaXRhdGlvbiBmb3IgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZ2VvbWV0cnkgZGF0YS5cbiAgICogT25seSBhcHBsaWNhdGlvbi92bmQudHJpbWJpbSBDb250ZW50LVR5cGUgZm9yIGJpbmFyeSBjb250ZW50IGlzIHN1cHBvcnRlZC4gSWYgYmluYXJ5IGRhdGEgaXMgc2VudCB3aXRoIGRpZmZlcmVudCBDb250ZW50LVR5cGUgaXQgd2lsbCBiZSBVVEY4IGVuY29kZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCBUaGUgbm9kZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge0Jsb2J9IGJsb2IgVGhlIGRhdGEgY29udGFpbmluZyB0aGUgZ2VvbWV0cnkgYW5kIGl0cyBjb250ZW50LXR5cGUgKGluIGRhdGEudHlwZSkuIEl0IGlzIG5vdCBhZHZpc2VkIHRvIHVzZSBhbiBlbXB0eSBjb250ZW50LXR5cGUuXG4gICAqIEBwYXJhbSB7UGFydGlhbDxVcGRhdGVOb2RlUmVxdWVzdD59IHBhcmFtcyBPbmx5IHRoZSB2ZXJzaW9uIGZpZWxkICgndicpIGlzIHVzZWQsIGlmIHByZXNlbnQsIGZvciBjb25jdXJyZW5jeSBjb250cm9sLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8dm9pZD4+fSBUaGUgZW1wdHkgcmVzcG9uc2UuIFRoZSBuZXcgZ2VvbWV0cnkgZGF0YSBpcyBzdWNjZXNmdWxseSBzZXQuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICogQHRocm93cyB7RXJyb3J9IGZvciBjZXJ0YWluIHJ1bnRpbWUgZW52aXJvbm1lbnRzIChOb2RlSlMpIHdoZXJlIGl0IGlzIGtub3duIG5vdCB0byB3b3JrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1dE5vZGVHZW9tZXRyeShcbiAgICBmb3Jlc3RJZDogc3RyaW5nLFxuICAgIHRyZWVJZDogc3RyaW5nLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIGRhdGE6IEJsb2IsXG4gICAgcGFyYW1zPzogUHV0R2VvbWV0cnlPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPHZvaWQ+PiB7XG4gICAgLy8gdGhlIGxvd2VyIGxldmVsIGNvZGUgZG9lcyBub3Qgd29yayBpbiBOb2RlSlMgZW52aXJvbm1lbnQgd2l0aCBCbG9icyBhbmQgZmV0Y2ggaW52b2x2aW5nIGJpbmFyeSBkYXRhXG4gICAgaWYgKCFpc0Jyb3dzZXIgJiYgIWlzV2ViV29ya2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgaW4gTm9kZUpTIGVudmlyb25tZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiBkYXRhLnR5cGUgfSk7IC8vIG11c3QgYWRkIHRoaXMsIG90aGVyd2lzZSB0aGlzLnJlcXVlc3QoKSBhZGRzIGEgZGVmYXVsdFxuICAgIC8vIGNvbnRlbnQtbGVuZ3RoIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgYnJvd3NlcnMgYnV0IGl0IG1pZ2h0IGJlIG5lZWRlZCB3aGVuIGl0IGlzIHJ1bm5pbmcgaW4gTm9kZUpTXG4gICAgLy8gaGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgZGF0YS5zaXplLnRvU3RyaW5nKCkpO1xuICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLnYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVycy5zZXQoJ0lmLU1hdGNoJywgYFcvXCIke3BhcmFtcy52fVwiYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L25vZGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgbm9kZUlkXG4gICAgKX0vZ2VvbWV0cnlgO1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXJsLCAnUFVUJywgZGF0YSwgaGVhZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggZ2V0IG5vZGVzIGluc2lkZSBhIHNpbmdsZSB0cmVlcy5cbiAgICogSXQgc2hvdWxkIG5ldmVyIHJldHVybiBhIHBhZ2VkIHJlc3BvbnNlLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYmF0Y2hHZXQgaW5zdGVhZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9yZXN0SWQgVGhlIGZvcmVzdCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJlZUlkIFRoZSB0cmVlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7QmF0Y2hHZXROb2Rlc1JlcXVlc3R9IHJlcXVlc3QgVGhlIGlkcy92ZXJzaW9ucyBvZiBub2RlcyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7R2V0RGVmaW5pdGlvbk9wdGlvbnN9IHBhcmFtcyBUaGUgb3B0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8QmF0Y2hHZXROb2Rlc1Jlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYmF0Y2hHZXROb2RlcyhcbiAgICBmb3Jlc3RJZDogc3RyaW5nLFxuICAgIHRyZWVJZDogc3RyaW5nLFxuICAgIHJlcXVlc3Q6IEJhdGNoR2V0Tm9kZXNSZXF1ZXN0LFxuICAgIHBhcmFtcz86IEJhdGNoR2V0T3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaEdldFJlc3BvbnNlPj4ge1xuICAgIHJlcXVlc3Qubm9kZXM/LmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIG5vZGUuZm9yZXN0SWQgPSBmb3Jlc3RJZDtcbiAgICAgIG5vZGUudHJlZUlkID0gdHJlZUlkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hHZXQocmVxdWVzdCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBnZXQgbm9kZXMgYWNyb3NzIG11bHRpcGxlIHRyZWVzLlxuICAgKiBJdCBzaG91bGQgbmV2ZXIgcmV0dXJuIGEgcGFnZWQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7QmF0Y2hHZXRSZXF1ZXN0fSByZXF1ZXN0IFRoZSBpZHMvdmVyc2lvbnMgb2Ygbm9kZXMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge0JhdGNoR2V0T3B0aW9uc30gcGFyYW1zIFRoZSBvcHRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaEdldFJlc3BvbnNlPj59IFRoZSBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYmF0Y2hHZXQoXG4gICAgcmVxdWVzdDogQmF0Y2hHZXRSZXF1ZXN0LFxuICAgIHBhcmFtcz86IEJhdGNoR2V0T3B0aW9uc1xuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCYXRjaEdldFJlc3BvbnNlPj4ge1xuICAgIGxldCB1cmwgPSBgYmF0Y2gtZ2V0YDtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICBpZiAocGFyYW1zLmRlbGV0ZWQpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnZGVsZXRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLm5vbGlua3MpIHtcbiAgICAgICAgcXVlcnkucHVzaCgnbm9saW5rcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmZpZWxkcykge1xuICAgICAgICBxdWVyeS5wdXNoKGBmaWVsZHM9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmZpZWxkcyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChxdWVyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBgPyR7cXVlcnkuam9pbignJicpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Q8QmF0Y2hHZXRSZXNwb25zZT4oXG4gICAgICB1cmwsXG4gICAgICAnUE9TVCcsXG4gICAgICBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIGNoYW5nZXNldCB0byBhIHRyZWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtPcmdDaGFuZ2VzZXRSZXF1ZXN0fSBjaGFuZ2VzZXQgVGhlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxPcmdDaGFuZ2VzZXRSZXNwb25zZUlubGluZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlc2V0KFxuICAgIGZvcmVzdElkOiBzdHJpbmcsXG4gICAgdHJlZUlkOiBzdHJpbmcsXG4gICAgY2hhbmdlc2V0OiBPcmdDaGFuZ2VzZXRSZXF1ZXN0LFxuICAgIHBhcmFtcz86IENoYW5nZXNldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxcbiAgICBTZXJ2aWNlUmVzcG9uc2U8T3JnQ2hhbmdlc2V0UmVzcG9uc2VJbmxpbmUgfCBPcmdDaGFuZ2VzZXRSZXNwb25zZUFjY2VwdGVkPlxuICA+IHtcbiAgICBsZXQgdXJsID0gYGZvcmVzdHMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBmb3Jlc3RJZFxuICAgICl9L3RyZWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyZWVJZCl9L2NoYW5nZXNldGA7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgaWYgKHBhcmFtcy5ub2xpbmtzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goJ25vbGlua3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5maWVsZHMpIHtcbiAgICAgICAgcXVlcnkucHVzaChgZmllbGRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5maWVsZHMpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gYD8ke3F1ZXJ5LmpvaW4oJyYnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PE9yZ0NoYW5nZXNldFJlc3BvbnNlSW5saW5lPihcbiAgICAgIHVybCxcbiAgICAgICdQT1NUJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNldClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBjaGFuZ2VzZXQgYW5kIGdldCBhIGxpbmsgZm9yIHVwbG9hZGluZyBjaGFuZ2VzZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3Jlc3RJZCBUaGUgZm9yZXN0IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlSWQgVGhlIHRyZWUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtPcmdDaGFuZ2VzZXRDb25maWd1cmF0aW9ufSBjaGFuZ2VzZXRDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHByb2Nlc3NpbmcgdGhlIGNoYW5nZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxDaGFuZ2VzZXRTdGF0dXNSZXNwb25zZT4+fSBUaGUgZGUtc2VyaWFsaXplZCBzZXJ2aWNlIHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtTZXJ2aWNlRXJyb3J9IGluIGNhc2Ugb2YgdGhlIGVycm9yIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlc2V0QXN5bmMoXG4gICAgZm9yZXN0SWQ6IHN0cmluZyxcbiAgICB0cmVlSWQ6IHN0cmluZyxcbiAgICBjaGFuZ2VzZXRDb25maWc6IE9yZ0NoYW5nZXNldENvbmZpZ3VyYXRpb24sXG4gICAgcGFyYW1zPzogQ2hhbmdlc2V0QXN5bmNPcHRpb25zXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPE9yZ0NoYW5nZXNldFJlc3BvbnNlQXN5bmM+PiB7XG4gICAgbGV0IHVybCA9IGBmb3Jlc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgZm9yZXN0SWRcbiAgICApfS90cmVlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0cmVlSWQpfS9jaGFuZ2VzZXQtYXN5bmNgO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgIGlmIChwYXJhbXMuZmllbGRzKSB7XG4gICAgICAgIHF1ZXJ5LnB1c2goYGZpZWxkcz0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMuZmllbGRzKX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IGA/JHtxdWVyeS5qb2luKCcmJyl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxPcmdDaGFuZ2VzZXRSZXNwb25zZUFzeW5jPihcbiAgICAgIHVybCxcbiAgICAgICdQT1NUJyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNldENvbmZpZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBjaGFuZ2VzZXQgc3RhdHVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbmdlc2V0SWQgVGhlIGNoYW5nZXNldCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2aWNlUmVzcG9uc2U8Q2hhbmdlc2V0U3RhdHVzUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZS5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZXNldFN0YXR1cyhcbiAgICBjaGFuZ2VzZXRJZDogc3RyaW5nXG4gICk6IFByb21pc2U8U2VydmljZVJlc3BvbnNlPE9yZ0NoYW5nZXNldFN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9IGBjaGFuZ2VzZXQvJHtlbmNvZGVVUklDb21wb25lbnQoY2hhbmdlc2V0SWQpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdDxPcmdDaGFuZ2VzZXRTdGF0dXNSZXNwb25zZT4odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBjcmVkZW50aWFsIHRvIHN1YnNjcmliZSB0byBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPFdTU3Vic2NyaXB0aW9uUmVzcG9uc2U+Pn0gVGhlIGRlLXNlcmlhbGl6ZWQgc2VydmljZSByZXNwb25zZSB3aXRoIHRlbXBvcmFyeSBjcmVkZW50aWFscyBhbmQgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqIEB0aHJvd3Mge1NlcnZpY2VFcnJvcn0gaW4gY2FzZSBvZiB0aGUgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJzY3JpYmVXUygpOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxXU1N1YnNjcmlwdGlvblJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHVybCA9ICdzdWJzY3JpYmUnO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0PFdTU3Vic2NyaXB0aW9uUmVzcG9uc2U+KHVybCwgJ0dFVCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21tb24gcGFydCBvZiBnZXROb2RlR2VvbWV0cnkgYW5kIGdldE5vZGVWZXJzaW9uR2VvbWV0cnkuIFNlZSBnZXROb2RlR2VvbWV0cnkgZm9yIHRoZSByZWFzb25zIG9mIHRoaXMgc29sdXRpb24uXG4gICAqIERvZXMgbm90IGNoZWNrIHJ1bnRpbWUgZW52aXJvbm1lbnQsIHRoYXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwdWJsaWMgZnVuY3Rpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsV2l0aG91dFBhcmFtcyB0aGUgcmVsYXRpdmUgcGF0aCB3aXRob3V0IGFueSBxdWVyeSBwYXJhbXMgZm9yIHJldHJpZXZpbmcgdGhlIG5vZGUgZGVzY3JpcHRvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmljZVJlc3BvbnNlPEJsb2IgfCB1bmRlZmluZWQ+Pn0gVGhlIHNlcnZpY2UgcmVzcG9uc2Ugd2l0aCBibG9iIG9yIHVuZGVmaW5lZC5cbiAgICogQHRocm93cyB7U2VydmljZUVycm9yfSBpbiBjYXNlIG9mIHRoZSBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlLiBOb3QgaGF2aW5nIGdlb21ldHJ5IGlzIG5vdCBhbiBlcnJvci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29tbW9uR2V0Tm9kZUdlb21ldHJ5KFxuICAgIHVybFdpdGhvdXRQYXJhbXM6IHN0cmluZyxcbiAgICBpbmNsdWRlRGVsZXRlZDogYm9vbGVhblxuICApOiBQcm9taXNlPFNlcnZpY2VSZXNwb25zZTxCbG9iIHwgdW5kZWZpbmVkPj4ge1xuICAgIC8vIFVudGlsIHdlIGhhdmUgYSBwcm9wZXIgZmV0Y2ggYWx0ZXJuYXRpdmUgdG8gdXNlIGhlcmUgKHJlZGlyZWN0ICdtYW51YWwnIHdvcmtzIG9yIGNhbiAnZm9sbG93JyB3aXRob3V0IGF1dGggaGVhZGVyKSxcbiAgICAvLyB3ZSByZXRyaWV2ZSB0aGUgbm9kZSB0byBoYXZlIGEgbm90LWV4cGlyZWQgVVJMIHRvIHRoZSBnZW9tZXRyeSBkYXRhLlxuXG4gICAgY29uc3QgdXJsUGFyYW1zID0gYD9ub2xpbmtzJHtpbmNsdWRlRGVsZXRlZCA/ICcmZGVsZXRlZCcgOiAnJ31gOyAvLyBhbHdheXMgd2l0aCBub2xpbmtzXG4gICAgLy8gdGhpcyB0aHJvd3MgaWYgbm8gc3VjaCBub2RlIGV4aXN0c1xuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0PE5vZGVSZXNwb25zZT4oXG4gICAgICB1cmxXaXRob3V0UGFyYW1zICsgdXJsUGFyYW1zXG4gICAgKTtcblxuICAgIGlmIChub2RlLmRhdGEuZ2VvbWV0cnkgJiYgbm9kZS5kYXRhLmdlb21ldHJ5LnVybCkge1xuICAgICAgLy8gZ2VvbWV0cnkuY29udGVudFR5cGUgaXMgYXBwbGljYXRpb24gc3BlY2lmaWM7IHdlIHJldHJpZXZlIGFueSBjb250ZW50IHR5cGUgYW5kIHJldHVybiBpdCBhcyBhIEJsb2JcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gKGF3YWl0IHRoaXMucmVxdWVzdChcbiAgICAgICAgbm9kZS5kYXRhLmdlb21ldHJ5LnVybCxcbiAgICAgICAgJ0dFVCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBmYWxzZVxuICAgICAgKSkgYXMgU2VydmljZVJlc3BvbnNlPEJsb2IgfCB1bmRlZmluZWQ+O1xuICAgICAgLy8gU29tZXdoYXQgc2ltaWxhciBsb2dpYyBhcyBpbiBtYWtlUmVxdWVzdDw+IGJ1dCB0aGlzIGlzIGEgQmxvYiByZXNwb25zZSBhbmQgbm90aGluZyBpcyBhc3N1bWVkIGFib3V0IGNvbnRlbnQgdHlwZS5cbiAgICAgIC8vIElmIHNlcnZpY2UgcmVzcG9uZGVkIHdpdGggYW4gZXJyb3IgaXQgd2FzIHRocm93biBhbHJlYWR5LlxuICAgICAgaWYgKGdlb21ldHJ5LnJlc3BvbnNlLnN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgIC8vIHJlY2VpdmVkIGNvbnRlbnQtdHlwZSBpcyBpbiBoZWFkZXJzIGFuZCBpbiBibG9iLnR5cGUgdG9vICh0ZXN0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCBvbmx5KVxuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgZ2VvbWV0cnkucmVzcG9uc2UuYmxvYigpO1xuICAgICAgICBnZW9tZXRyeS5kYXRhID0gYmxvYjtcbiAgICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2VydmljZVJlc3BvbnNlPHVuZGVmaW5lZD4odGhpcywgbmV3IFJlc3BvbnNlKCksIHVuZGVmaW5lZCk7XG4gIH1cbn1cbiJdfQ==