package.dist.src.config.middleware.cache-request-logging.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sdk Show documentation
Show all versions of sdk Show documentation
Client SDK for Momento services
The newest version!
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CacheRequestToLogInterfaceConverter = exports.convertSingleKeyRequest = void 0;
const generated_types_1 = require("@gomomento/generated-types");
const TEXT_DECODER = new TextDecoder();
// TODO: bytes will not always be convertible to string
function convertBytesToString(bytes) {
return TEXT_DECODER.decode(bytes);
}
function convertSingleKeyRequest(requestType, key) {
return {
requestType: requestType,
key: convertBytesToString(key),
};
}
exports.convertSingleKeyRequest = convertSingleKeyRequest;
const convertGetRequest = (request) => {
return convertSingleKeyRequest('get', request.cache_key);
};
const convertGetBatchRequest = (request) => {
return {
requestType: 'getBatch',
keys: request.items.map(item => convertBytesToString(item.cache_key)),
};
};
const convertDeleteRequest = (request) => {
return convertSingleKeyRequest('delete', request.cache_key);
};
const convertSetRequest = (request) => {
return {
requestType: 'set',
key: convertBytesToString(request.cache_key),
value: convertBytesToString(request.cache_body),
ttlMillis: request.ttl_milliseconds,
};
};
const convertSetBatchRequest = (request) => {
return {
requestType: 'setBatch',
items: request.items.map(item => {
return {
key: convertBytesToString(item.cache_key),
value: convertBytesToString(item.cache_body),
ttlMillis: item.ttl_milliseconds,
};
}),
};
};
const convertSetIfRequest = (request) => {
return {
requestType: 'setIf',
key: convertBytesToString(request.cache_key),
value: convertBytesToString(request.cache_body),
ttlMillis: request.ttl_milliseconds,
condition: request.condition,
present: request.present !== undefined,
presentAndNotEqual: request.present_and_not_equal
? convertBytesToString(request.present_and_not_equal.value_to_check)
: undefined,
absent: request.absent !== undefined,
equal: request.equal
? convertBytesToString(request.equal.value_to_check)
: undefined,
absentOrEqual: request.absent_or_equal
? convertBytesToString(request.absent_or_equal.value_to_check)
: undefined,
notEqual: request.not_equal
? convertBytesToString(request.not_equal.value_to_check)
: undefined,
};
};
const convertSetIfNotExistsRequest = (request) => {
return {
requestType: 'setIfNotExists',
key: convertBytesToString(request.cache_key),
value: convertBytesToString(request.cache_body),
ttlMillis: request.ttl_milliseconds,
};
};
const convertKeysExistRequest = (request) => {
return {
requestType: 'keysExist',
keys: request.cache_keys.map(key => convertBytesToString(key)),
};
};
const convertIncrementRequest = (request) => {
return {
requestType: 'increment',
key: convertBytesToString(request.cache_key),
amount: request.amount,
ttlMillis: request.ttl_milliseconds,
};
};
const convertUpdateTtlRequest = (request) => {
return {
requestType: 'updateTtl',
key: convertBytesToString(request.cache_key),
increaseToMillis: request.increase_to_milliseconds,
decreaseToMillis: request.decrease_to_milliseconds,
overwriteToMillis: request.overwrite_to_milliseconds,
};
};
const convertItemGetTtlRequest = (request) => {
return convertSingleKeyRequest('itemGetTtl', request.cache_key);
};
const convertItemGetTypeRequest = (request) => {
return convertSingleKeyRequest('itemGetType', request.cache_key);
};
const convertDictionaryGetRequest = (request) => {
return {
requestType: 'dictionaryGet',
dictionaryName: convertBytesToString(request.dictionary_name),
fields: request.fields.map(field => convertBytesToString(field)),
};
};
const convertDictionaryFetchRequest = (request) => {
return {
requestType: 'dictionaryFetch',
dictionaryName: convertBytesToString(request.dictionary_name),
};
};
const convertDictionarySetRequest = (request) => {
return {
requestType: 'dictionarySet',
dictionaryName: convertBytesToString(request.dictionary_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
items: request.items.map(item => {
return {
field: convertBytesToString(item.field),
value: convertBytesToString(item.value),
};
}),
};
};
const convertDictionaryIncrementRequest = (request) => {
return {
requestType: 'dictionaryIncrement',
dictionaryName: convertBytesToString(request.dictionary_name),
field: convertBytesToString(request.field),
amount: request.amount,
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
};
};
const convertDictionaryDeleteRequest = (request) => {
return {
requestType: 'dictionaryDelete',
dictionaryName: convertBytesToString(request.dictionary_name),
fields: request.some.fields.map(field => convertBytesToString(field)),
};
};
const convertDictionaryLengthRequest = (request) => {
return {
requestType: 'dictionaryLength',
dictionaryName: convertBytesToString(request.dictionary_name),
};
};
const convertSetFetchRequest = (request) => {
return {
requestType: 'setFetch',
setName: convertBytesToString(request.set_name),
};
};
const convertSetSampleRequest = (request) => {
return {
requestType: 'setSample',
setName: convertBytesToString(request.set_name),
limit: request.limit,
};
};
const convertSetUnionRequest = (request) => {
return {
requestType: 'setUnion',
setName: convertBytesToString(request.set_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
elements: request.elements.map(element => convertBytesToString(element)),
};
};
const convertSetDifferenceRequest = (request) => {
return {
requestType: 'setDifference',
setName: convertBytesToString(request.set_name),
action: request.minuend
? 'minuend'
: request.subtrahend.set
? 'subtrahend_set'
: 'subtrahend_identity',
elements: request.minuend
? request.minuend.elements.map(element => convertBytesToString(element))
: request.subtrahend.set
? request.subtrahend.set.elements.map(element => convertBytesToString(element))
: undefined,
};
};
const convertSetContainsRequest = (request) => {
return {
requestType: 'setContains',
setName: convertBytesToString(request.set_name),
elements: request.elements.map(element => convertBytesToString(element)),
};
};
const convertSetLengthRequest = (request) => {
return {
requestType: 'setLength',
setName: convertBytesToString(request.set_name),
};
};
const convertSetPopRequest = (request) => {
return {
requestType: 'setPop',
setName: convertBytesToString(request.set_name),
count: request.count,
};
};
const convertListConcatenateFrontRequest = (request) => {
return {
requestType: 'listConcatenateFront',
listName: convertBytesToString(request.list_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
truncateBackToSize: request.truncate_back_to_size,
values: request.values.map(value => convertBytesToString(value)),
};
};
const convertListConcatenateBackRequest = (request) => {
return {
requestType: 'listConcatenateBack',
listName: convertBytesToString(request.list_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
truncateFrontToSize: request.truncate_front_to_size,
values: request.values.map(value => convertBytesToString(value)),
};
};
const convertListPushFrontRequest = (request) => {
return {
requestType: 'listPushFront',
listName: convertBytesToString(request.list_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
truncateBackToSize: request.truncate_back_to_size,
value: convertBytesToString(request.value),
};
};
const convertListPushBackRequest = (request) => {
return {
requestType: 'listPushBack',
listName: convertBytesToString(request.list_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
truncateFrontToSize: request.truncate_front_to_size,
value: convertBytesToString(request.value),
};
};
const convertListPopFrontRequest = (request) => {
return {
requestType: 'listPopFront',
listName: convertBytesToString(request.list_name),
};
};
const convertListPopBackRequest = (request) => {
return {
requestType: 'listPopBack',
listName: convertBytesToString(request.list_name),
};
};
const convertListRemoveRequest = (request) => {
return {
requestType: 'listRemove',
listName: convertBytesToString(request.list_name),
value: convertBytesToString(request.all_elements_with_value),
};
};
const convertListFetchRequest = (request) => {
return {
requestType: 'listFetch',
listName: convertBytesToString(request.list_name),
inclusiveStart: request.inclusive_start,
exclusiveEnd: request.exclusive_end,
};
};
const convertListEraseRequest = (request) => {
return {
requestType: 'listErase',
listName: convertBytesToString(request.list_name),
all: request.all !== undefined,
some: request.some.ranges.map(range => {
return {
beginIndex: range.begin_index,
count: range.count,
};
}),
};
};
const convertListRetainRequest = (request) => {
return {
requestType: 'listRetain',
listName: convertBytesToString(request.list_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
inclusiveStart: request.inclusive_start,
exclusiveEnd: request.exclusive_end,
};
};
const convertListLengthRequest = (request) => {
return {
requestType: 'listLength',
listName: convertBytesToString(request.list_name),
};
};
const convertSortedSetPutRequest = (request) => {
return {
requestType: 'sortedSetPut',
sortedSetName: convertBytesToString(request.set_name),
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
elements: request.elements.map(item => {
return {
value: convertBytesToString(item.value),
score: item.score,
};
}),
};
};
const convertSortedSetFetchRequest = (request) => {
var _a, _b;
const byScore = request.by_score
? {
minScore: request.by_score.unbounded_min
? 'unbounded'
: request.by_score.min_score.score,
minScoreExclusive: (_a = request.by_score.min_score) === null || _a === void 0 ? void 0 : _a.exclusive,
maxScore: request.by_score.unbounded_max
? 'unbounded'
: request.by_score.max_score.score,
maxScoreExclusive: (_b = request.by_score.max_score) === null || _b === void 0 ? void 0 : _b.exclusive,
offset: request.by_score.offset,
count: request.by_score.count,
}
: undefined;
const byIndex = request.by_index
? {
inclusiveStartIndex: request.by_index.unbounded_start
? 'unbounded'
: request.by_index.inclusive_start_index,
exclusiveEndIndex: request.by_index.unbounded_end
? 'unbounded'
: request.by_index.exclusive_end_index,
}
: undefined;
return {
requestType: 'sortedSetFetch',
sortedSetName: convertBytesToString(request.set_name),
order: request.order ===
generated_types_1.cache.cache_client._SortedSetFetchRequest.Order.DESCENDING
? 'descending'
: 'ascending',
byScore,
byIndex,
};
};
const convertSortedSetGetScoreRequest = (request) => {
return {
requestType: 'sortedSetGetScore',
sortedSetName: convertBytesToString(request.set_name),
values: request.values.map(value => convertBytesToString(value)),
};
};
const convertSortedSetRemoveRequest = (request) => {
return {
requestType: 'sortedSetRemove',
sortedSetName: convertBytesToString(request.set_name),
values: request.all
? 'all'
: request.some.values.map(value => convertBytesToString(value)),
};
};
const convertSortedSetIncrementRequest = (request) => {
return {
requestType: 'sortedSetIncrement',
sortedSetName: convertBytesToString(request.set_name),
value: convertBytesToString(request.value),
amount: request.amount,
ttlMillis: request.ttl_milliseconds,
refreshTtl: request.refresh_ttl,
};
};
const convertSortedSetGetRankRequest = (request) => {
return {
requestType: 'sortedSetGetRank',
sortedSetName: convertBytesToString(request.set_name),
value: convertBytesToString(request.value),
order: request.order ===
generated_types_1.cache.cache_client._SortedSetGetRankRequest.Order.DESCENDING
? 'descending'
: 'ascending',
};
};
const convertSortedSetLengthRequest = (request) => {
return {
requestType: 'sortedSetLength',
sortedSetName: convertBytesToString(request.set_name),
};
};
const convertSortedSetLengthByScoreRequest = (request) => {
var _a, _b;
return {
requestType: 'sortedSetLengthByScore',
sortedSetName: convertBytesToString(request.set_name),
minScore: request.unbounded_min
? 'unbounded'
: (_a = request.inclusive_min) !== null && _a !== void 0 ? _a : request.exclusive_min,
minScoreExclusive: request.unbounded_min
? undefined
: request.has_exclusive_min,
maxScore: request.unbounded_max
? 'unbounded'
: (_b = request.inclusive_max) !== null && _b !== void 0 ? _b : request.exclusive_max,
maxScoreExclusive: request.unbounded_max
? undefined
: request.has_exclusive_max,
};
};
exports.CacheRequestToLogInterfaceConverter = new Map([
['_GetRequest', convertGetRequest],
['_GetBatchRequest', convertGetBatchRequest],
['_DeleteRequest', convertDeleteRequest],
['_SetRequest', convertSetRequest],
['_SetBatchRequest', convertSetBatchRequest],
['_SetIfRequest', convertSetIfRequest],
['_SetIfNotExistsRequest', convertSetIfNotExistsRequest],
['_KeysExistRequest', convertKeysExistRequest],
['_IncrementRequest', convertIncrementRequest],
['_UpdateTtlRequest', convertUpdateTtlRequest],
['_ItemGetTtlRequest', convertItemGetTtlRequest],
['_ItemGetTypeRequest', convertItemGetTypeRequest],
['_DictionaryGetRequest', convertDictionaryGetRequest],
['_DictionaryFetchRequest', convertDictionaryFetchRequest],
['_DictionarySetRequest', convertDictionarySetRequest],
['_DictionaryIncrementRequest', convertDictionaryIncrementRequest],
['_DictionaryDeleteRequest', convertDictionaryDeleteRequest],
['_DictionaryLengthRequest', convertDictionaryLengthRequest],
['_SetFetchRequest', convertSetFetchRequest],
['_SetSampleRequest', convertSetSampleRequest],
['_SetUnionRequest', convertSetUnionRequest],
['_SetDifferenceRequest', convertSetDifferenceRequest],
['_SetContainsRequest', convertSetContainsRequest],
['_SetLengthRequest', convertSetLengthRequest],
['_SetPopRequest', convertSetPopRequest],
['_ListConcatenateFrontRequest', convertListConcatenateFrontRequest],
['_ListConcatenateBackRequest', convertListConcatenateBackRequest],
['_ListPushFrontRequest', convertListPushFrontRequest],
['_ListPushBackRequest', convertListPushBackRequest],
['_ListPopFrontRequest', convertListPopFrontRequest],
['_ListPopBackRequest', convertListPopBackRequest],
['_ListRemoveRequest', convertListRemoveRequest],
['_ListFetchRequest', convertListFetchRequest],
['_ListEraseRequest', convertListEraseRequest],
['_ListRetainRequest', convertListRetainRequest],
['_ListLengthRequest', convertListLengthRequest],
['_SortedSetPutRequest', convertSortedSetPutRequest],
['_SortedSetFetchRequest', convertSortedSetFetchRequest],
['_SortedSetGetScoreRequest', convertSortedSetGetScoreRequest],
['_SortedSetRemoveRequest', convertSortedSetRemoveRequest],
['_SortedSetIncrementRequest', convertSortedSetIncrementRequest],
['_SortedSetGetRankRequest', convertSortedSetGetRankRequest],
['_SortedSetLengthRequest', convertSortedSetLengthRequest],
['_SortedSetLengthByScoreRequest', convertSortedSetLengthByScoreRequest],
]);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtcmVxdWVzdC1sb2dnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbmZpZy9taWRkbGV3YXJlL2NhY2hlLXJlcXVlc3QtbG9nZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBaUQ7QUFHakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV2Qyx1REFBdUQ7QUFDdkQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFpQjtJQUM3QyxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUNyQyxXQUFtQixFQUNuQixHQUFlO0lBRWYsT0FBTztRQUNMLFdBQVcsRUFBRSxXQUFXO1FBQ3hCLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFSRCwwREFRQztBQTRCRCxNQUFNLGlCQUFpQixHQUduQixDQUFDLE9BQXVDLEVBQUUsRUFBRTtJQUM5QyxPQUFPLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FHeEIsQ0FBQyxPQUE0QyxFQUFFLEVBQUU7SUFDbkQsT0FBTztRQUNMLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUN0RSxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FHdEIsQ0FBQyxPQUEwQyxFQUFFLEVBQUU7SUFDakQsT0FBTyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQztBQU9G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OlsiaW1wb3J0IHtjYWNoZX0gZnJvbSAnQGdvbW9tZW50by9nZW5lcmF0ZWQtdHlwZXMnO1xuaW1wb3J0IHtTZXRCYXRjaEl0ZW19IGZyb20gJ0Bnb21vbWVudG8vc2RrLWNvcmUnO1xuXG5jb25zdCBURVhUX0RFQ09ERVIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gVE9ETzogYnl0ZXMgd2lsbCBub3QgYWx3YXlzIGJlIGNvbnZlcnRpYmxlIHRvIHN0cmluZ1xuZnVuY3Rpb24gY29udmVydEJ5dGVzVG9TdHJpbmcoYnl0ZXM6IFVpbnQ4QXJyYXkpIHtcbiAgcmV0dXJuIFRFWFRfREVDT0RFUi5kZWNvZGUoYnl0ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFNpbmdsZUtleVJlcXVlc3QoXG4gIHJlcXVlc3RUeXBlOiBzdHJpbmcsXG4gIGtleTogVWludDhBcnJheVxuKTogUmVxdWVzdFNpbmdsZUtleUxvZyB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6IHJlcXVlc3RUeXBlLFxuICAgIGtleTogY29udmVydEJ5dGVzVG9TdHJpbmcoa2V5KSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0TG9nIHtcbiAgcmVxdWVzdFR5cGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdyaXRlUmVxdWVzdExvZyBleHRlbmRzIFJlcXVlc3RMb2cge1xuICB0dGxNaWxsaXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cgZXh0ZW5kcyBXcml0ZVJlcXVlc3RMb2cge1xuICByZWZyZXNoVHRsOiBib29sZWFuO1xufVxuXG4vLyBDdXJyZW50IHVzZWQgZm9yIEdldEJhdGNoIGFuZCBLZXlzRXhpc3QgcmVxdWVzdHNcbmludGVyZmFjZSBSZXF1ZXN0TXVsdGlwbGVLZXlzTG9nIGV4dGVuZHMgUmVxdWVzdExvZyB7XG4gIGtleXM6IHN0cmluZ1tdO1xufVxuXG4vLyBDdXJyZW50bHkgdXNlZCBmb3IgR2V0LCBEZWxldGUsIEl0ZW1HZXRUdGwsIGFuZCBJdGVtR2V0VHlwZSByZXF1ZXN0c1xuaW50ZXJmYWNlIFJlcXVlc3RTaW5nbGVLZXlMb2cgZXh0ZW5kcyBSZXF1ZXN0TG9nIHtcbiAga2V5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxUUmVxdWVzdCwgVExvZyBleHRlbmRzIFJlcXVlc3RMb2c+IHtcbiAgKHJlcXVlc3Q6IFRSZXF1ZXN0KTogVExvZztcbn1cblxuY29uc3QgY29udmVydEdldFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0dldFJlcXVlc3QsXG4gIFJlcXVlc3RTaW5nbGVLZXlMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9HZXRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBjb252ZXJ0U2luZ2xlS2V5UmVxdWVzdCgnZ2V0JywgcmVxdWVzdC5jYWNoZV9rZXkpO1xufTtcblxuY29uc3QgY29udmVydEdldEJhdGNoUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fR2V0QmF0Y2hSZXF1ZXN0LFxuICBSZXF1ZXN0TXVsdGlwbGVLZXlzTG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fR2V0QmF0Y2hSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdnZXRCYXRjaCcsXG4gICAga2V5czogcmVxdWVzdC5pdGVtcy5tYXAoaXRlbSA9PiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhpdGVtLmNhY2hlX2tleSkpLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydERlbGV0ZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0RlbGV0ZVJlcXVlc3QsXG4gIFJlcXVlc3RTaW5nbGVLZXlMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9EZWxldGVSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBjb252ZXJ0U2luZ2xlS2V5UmVxdWVzdCgnZGVsZXRlJywgcmVxdWVzdC5jYWNoZV9rZXkpO1xufTtcblxuaW50ZXJmYWNlIFNldFJlcXVlc3RMb2cgZXh0ZW5kcyBXcml0ZVJlcXVlc3RMb2cge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuY29uc3QgY29udmVydFNldFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldFJlcXVlc3QsXG4gIFNldFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXQnLFxuICAgIGtleTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5jYWNoZV9rZXkpLFxuICAgIHZhbHVlOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LmNhY2hlX2JvZHkpLFxuICAgIHR0bE1pbGxpczogcmVxdWVzdC50dGxfbWlsbGlzZWNvbmRzLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNldEJhdGNoUmVxdWVzdExvZyBleHRlbmRzIFJlcXVlc3RMb2cge1xuICBpdGVtczogU2V0QmF0Y2hJdGVtW107XG59XG5cbmNvbnN0IGNvbnZlcnRTZXRCYXRjaFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldEJhdGNoUmVxdWVzdCxcbiAgU2V0QmF0Y2hSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0QmF0Y2hSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRCYXRjaCcsXG4gICAgaXRlbXM6IHJlcXVlc3QuaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhpdGVtLmNhY2hlX2tleSksXG4gICAgICAgIHZhbHVlOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhpdGVtLmNhY2hlX2JvZHkpLFxuICAgICAgICB0dGxNaWxsaXM6IGl0ZW0udHRsX21pbGxpc2Vjb25kcyxcbiAgICAgIH07XG4gICAgfSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2V0SWZSZXF1ZXN0TG9nIGV4dGVuZHMgV3JpdGVSZXF1ZXN0TG9nIHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGNvbmRpdGlvbjogc3RyaW5nO1xuICBwcmVzZW50OiBib29sZWFuO1xuICBwcmVzZW50QW5kTm90RXF1YWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYWJzZW50OiBib29sZWFuO1xuICBlcXVhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhYnNlbnRPckVxdWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG5vdEVxdWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGNvbnZlcnRTZXRJZlJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldElmUmVxdWVzdCxcbiAgU2V0SWZSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0SWZSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRJZicsXG4gICAga2V5OiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LmNhY2hlX2tleSksXG4gICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuY2FjaGVfYm9keSksXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gICAgY29uZGl0aW9uOiByZXF1ZXN0LmNvbmRpdGlvbixcbiAgICBwcmVzZW50OiByZXF1ZXN0LnByZXNlbnQgIT09IHVuZGVmaW5lZCxcbiAgICBwcmVzZW50QW5kTm90RXF1YWw6IHJlcXVlc3QucHJlc2VudF9hbmRfbm90X2VxdWFsXG4gICAgICA/IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QucHJlc2VudF9hbmRfbm90X2VxdWFsLnZhbHVlX3RvX2NoZWNrKVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgYWJzZW50OiByZXF1ZXN0LmFic2VudCAhPT0gdW5kZWZpbmVkLFxuICAgIGVxdWFsOiByZXF1ZXN0LmVxdWFsXG4gICAgICA/IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuZXF1YWwudmFsdWVfdG9fY2hlY2spXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBhYnNlbnRPckVxdWFsOiByZXF1ZXN0LmFic2VudF9vcl9lcXVhbFxuICAgICAgPyBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LmFic2VudF9vcl9lcXVhbC52YWx1ZV90b19jaGVjaylcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIG5vdEVxdWFsOiByZXF1ZXN0Lm5vdF9lcXVhbFxuICAgICAgPyBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0Lm5vdF9lcXVhbC52YWx1ZV90b19jaGVjaylcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydFNldElmTm90RXhpc3RzUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0SWZOb3RFeGlzdHNSZXF1ZXN0LFxuICBTZXRSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0SWZOb3RFeGlzdHNSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRJZk5vdEV4aXN0cycsXG4gICAga2V5OiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LmNhY2hlX2tleSksXG4gICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuY2FjaGVfYm9keSksXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0S2V5c0V4aXN0UmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fS2V5c0V4aXN0UmVxdWVzdCxcbiAgUmVxdWVzdE11bHRpcGxlS2V5c0xvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0tleXNFeGlzdFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2tleXNFeGlzdCcsXG4gICAga2V5czogcmVxdWVzdC5jYWNoZV9rZXlzLm1hcChrZXkgPT4gY29udmVydEJ5dGVzVG9TdHJpbmcoa2V5KSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgSW5jcmVtZW50UmVxdWVzdExvZyBleHRlbmRzIFdyaXRlUmVxdWVzdExvZyB7XG4gIGtleTogc3RyaW5nO1xuICBhbW91bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgY29udmVydEluY3JlbWVudFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0luY3JlbWVudFJlcXVlc3QsXG4gIEluY3JlbWVudFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9JbmNyZW1lbnRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdpbmNyZW1lbnQnLFxuICAgIGtleTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5jYWNoZV9rZXkpLFxuICAgIGFtb3VudDogcmVxdWVzdC5hbW91bnQsXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgVXBkYXRlVHRsUmVxdWVzdExvZyBleHRlbmRzIFJlcXVlc3RMb2cge1xuICBrZXk6IHN0cmluZztcbiAgaW5jcmVhc2VUb01pbGxpczogbnVtYmVyO1xuICBkZWNyZWFzZVRvTWlsbGlzOiBudW1iZXI7XG4gIG92ZXJ3cml0ZVRvTWlsbGlzOiBudW1iZXI7XG59XG5cbmNvbnN0IGNvbnZlcnRVcGRhdGVUdGxSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9VcGRhdGVUdGxSZXF1ZXN0LFxuICBVcGRhdGVUdGxSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fVXBkYXRlVHRsUmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAndXBkYXRlVHRsJyxcbiAgICBrZXk6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuY2FjaGVfa2V5KSxcbiAgICBpbmNyZWFzZVRvTWlsbGlzOiByZXF1ZXN0LmluY3JlYXNlX3RvX21pbGxpc2Vjb25kcyxcbiAgICBkZWNyZWFzZVRvTWlsbGlzOiByZXF1ZXN0LmRlY3JlYXNlX3RvX21pbGxpc2Vjb25kcyxcbiAgICBvdmVyd3JpdGVUb01pbGxpczogcmVxdWVzdC5vdmVyd3JpdGVfdG9fbWlsbGlzZWNvbmRzLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydEl0ZW1HZXRUdGxSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9JdGVtR2V0VHRsUmVxdWVzdCxcbiAgUmVxdWVzdFNpbmdsZUtleUxvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0l0ZW1HZXRUdGxSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBjb252ZXJ0U2luZ2xlS2V5UmVxdWVzdCgnaXRlbUdldFR0bCcsIHJlcXVlc3QuY2FjaGVfa2V5KTtcbn07XG5cbmNvbnN0IGNvbnZlcnRJdGVtR2V0VHlwZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0l0ZW1HZXRUeXBlUmVxdWVzdCxcbiAgUmVxdWVzdFNpbmdsZUtleUxvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0l0ZW1HZXRUeXBlUmVxdWVzdCkgPT4ge1xuICByZXR1cm4gY29udmVydFNpbmdsZUtleVJlcXVlc3QoJ2l0ZW1HZXRUeXBlJywgcmVxdWVzdC5jYWNoZV9rZXkpO1xufTtcblxuaW50ZXJmYWNlIERpY3Rpb25hcnlSZXF1ZXN0TG9nIGV4dGVuZHMgUmVxdWVzdExvZyB7XG4gIGRpY3Rpb25hcnlOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBEaWN0aW9uYXJ5R2V0UmVxdWVzdExvZyBleHRlbmRzIERpY3Rpb25hcnlSZXF1ZXN0TG9nIHtcbiAgZmllbGRzOiBzdHJpbmdbXTtcbn1cblxuY29uc3QgY29udmVydERpY3Rpb25hcnlHZXRSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5R2V0UmVxdWVzdCxcbiAgRGljdGlvbmFyeUdldFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5R2V0UmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnZGljdGlvbmFyeUdldCcsXG4gICAgZGljdGlvbmFyeU5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuZGljdGlvbmFyeV9uYW1lKSxcbiAgICBmaWVsZHM6IHJlcXVlc3QuZmllbGRzLm1hcChmaWVsZCA9PiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhmaWVsZCkpLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydERpY3Rpb25hcnlGZXRjaFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0RpY3Rpb25hcnlGZXRjaFJlcXVlc3QsXG4gIERpY3Rpb25hcnlSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fRGljdGlvbmFyeUZldGNoUmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnZGljdGlvbmFyeUZldGNoJyxcbiAgICBkaWN0aW9uYXJ5TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5kaWN0aW9uYXJ5X25hbWUpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIERpY3Rpb25hcnlTZXRSZXF1ZXN0TG9nXG4gIGV4dGVuZHMgRGljdGlvbmFyeVJlcXVlc3RMb2csXG4gICAgQ29sbGVjdGlvbldyaXRlUmVxdWVzdExvZyB7XG4gIGl0ZW1zOiB7ZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZ31bXTtcbn1cblxuY29uc3QgY29udmVydERpY3Rpb25hcnlTZXRSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5U2V0UmVxdWVzdCxcbiAgRGljdGlvbmFyeVNldFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5U2V0UmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnZGljdGlvbmFyeVNldCcsXG4gICAgZGljdGlvbmFyeU5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuZGljdGlvbmFyeV9uYW1lKSxcbiAgICB0dGxNaWxsaXM6IHJlcXVlc3QudHRsX21pbGxpc2Vjb25kcyxcbiAgICByZWZyZXNoVHRsOiByZXF1ZXN0LnJlZnJlc2hfdHRsLFxuICAgIGl0ZW1zOiByZXF1ZXN0Lml0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhpdGVtLmZpZWxkKSxcbiAgICAgICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKGl0ZW0udmFsdWUpLFxuICAgICAgfTtcbiAgICB9KSxcbiAgfTtcbn07XG5cbmludGVyZmFjZSBEaWN0aW9uYXJ5SW5jcmVtZW50UmVxdWVzdExvZ1xuICBleHRlbmRzIERpY3Rpb25hcnlSZXF1ZXN0TG9nLFxuICAgIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cge1xuICBmaWVsZDogc3RyaW5nO1xuICBhbW91bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgY29udmVydERpY3Rpb25hcnlJbmNyZW1lbnRSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5SW5jcmVtZW50UmVxdWVzdCxcbiAgRGljdGlvbmFyeUluY3JlbWVudFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9EaWN0aW9uYXJ5SW5jcmVtZW50UmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnZGljdGlvbmFyeUluY3JlbWVudCcsXG4gICAgZGljdGlvbmFyeU5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuZGljdGlvbmFyeV9uYW1lKSxcbiAgICBmaWVsZDogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5maWVsZCksXG4gICAgYW1vdW50OiByZXF1ZXN0LmFtb3VudCxcbiAgICB0dGxNaWxsaXM6IHJlcXVlc3QudHRsX21pbGxpc2Vjb25kcyxcbiAgICByZWZyZXNoVHRsOiByZXF1ZXN0LnJlZnJlc2hfdHRsLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIERpY3Rpb25hcnlEZWxldGVSZXF1ZXN0TG9nIGV4dGVuZHMgRGljdGlvbmFyeVJlcXVlc3RMb2cge1xuICBmaWVsZHM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBjb252ZXJ0RGljdGlvbmFyeURlbGV0ZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0RpY3Rpb25hcnlEZWxldGVSZXF1ZXN0LFxuICBEaWN0aW9uYXJ5RGVsZXRlUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0RpY3Rpb25hcnlEZWxldGVSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdkaWN0aW9uYXJ5RGVsZXRlJyxcbiAgICBkaWN0aW9uYXJ5TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5kaWN0aW9uYXJ5X25hbWUpLFxuICAgIGZpZWxkczogcmVxdWVzdC5zb21lLmZpZWxkcy5tYXAoZmllbGQgPT4gY29udmVydEJ5dGVzVG9TdHJpbmcoZmllbGQpKSxcbiAgfTtcbn07XG5cbmNvbnN0IGNvbnZlcnREaWN0aW9uYXJ5TGVuZ3RoUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fRGljdGlvbmFyeUxlbmd0aFJlcXVlc3QsXG4gIERpY3Rpb25hcnlSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fRGljdGlvbmFyeUxlbmd0aFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2RpY3Rpb25hcnlMZW5ndGgnLFxuICAgIGRpY3Rpb25hcnlOYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LmRpY3Rpb25hcnlfbmFtZSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2V0Q29sbGVjdGlvblJlcXVlc3RMb2cgZXh0ZW5kcyBSZXF1ZXN0TG9nIHtcbiAgc2V0TmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBjb252ZXJ0U2V0RmV0Y2hSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRGZXRjaFJlcXVlc3QsXG4gIFNldENvbGxlY3Rpb25SZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0RmV0Y2hSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRGZXRjaCcsXG4gICAgc2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2V0U2FtcGxlUmVxdWVzdExvZyBleHRlbmRzIFNldENvbGxlY3Rpb25SZXF1ZXN0TG9nIHtcbiAgbGltaXQ6IG51bWJlcjtcbn1cblxuY29uc3QgY29udmVydFNldFNhbXBsZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldFNhbXBsZVJlcXVlc3QsXG4gIFNldFNhbXBsZVJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRTYW1wbGVSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRTYW1wbGUnLFxuICAgIHNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIGxpbWl0OiByZXF1ZXN0LmxpbWl0LFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNldFVuaW9uUmVxdWVzdExvZ1xuICBleHRlbmRzIFNldENvbGxlY3Rpb25SZXF1ZXN0TG9nLFxuICAgIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cge1xuICBlbGVtZW50czogc3RyaW5nW107XG59XG5cbmNvbnN0IGNvbnZlcnRTZXRVbmlvblJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldFVuaW9uUmVxdWVzdCxcbiAgU2V0VW5pb25SZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fU2V0VW5pb25SZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRVbmlvbicsXG4gICAgc2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gICAgcmVmcmVzaFR0bDogcmVxdWVzdC5yZWZyZXNoX3R0bCxcbiAgICBlbGVtZW50czogcmVxdWVzdC5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhlbGVtZW50KSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2V0RGlmZmVyZW5jZVJlcXVlc3RMb2cgZXh0ZW5kcyBTZXRDb2xsZWN0aW9uUmVxdWVzdExvZyB7XG4gIGFjdGlvbjogJ21pbnVlbmQnIHwgJ3N1YnRyYWhlbmRfc2V0JyB8ICdzdWJ0cmFoZW5kX2lkZW50aXR5JztcbiAgZWxlbWVudHM/OiBzdHJpbmdbXTtcbn1cblxuY29uc3QgY29udmVydFNldERpZmZlcmVuY2VSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXREaWZmZXJlbmNlUmVxdWVzdCxcbiAgU2V0RGlmZmVyZW5jZVJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXREaWZmZXJlbmNlUmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnc2V0RGlmZmVyZW5jZScsXG4gICAgc2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gICAgYWN0aW9uOiByZXF1ZXN0Lm1pbnVlbmRcbiAgICAgID8gJ21pbnVlbmQnXG4gICAgICA6IHJlcXVlc3Quc3VidHJhaGVuZC5zZXRcbiAgICAgID8gJ3N1YnRyYWhlbmRfc2V0J1xuICAgICAgOiAnc3VidHJhaGVuZF9pZGVudGl0eScsXG4gICAgZWxlbWVudHM6IHJlcXVlc3QubWludWVuZFxuICAgICAgPyByZXF1ZXN0Lm1pbnVlbmQuZWxlbWVudHMubWFwKGVsZW1lbnQgPT4gY29udmVydEJ5dGVzVG9TdHJpbmcoZWxlbWVudCkpXG4gICAgICA6IHJlcXVlc3Quc3VidHJhaGVuZC5zZXRcbiAgICAgID8gcmVxdWVzdC5zdWJ0cmFoZW5kLnNldC5lbGVtZW50cy5tYXAoZWxlbWVudCA9PlxuICAgICAgICAgIGNvbnZlcnRCeXRlc1RvU3RyaW5nKGVsZW1lbnQpXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNldENvbnRhaW5zUmVxdWVzdExvZyBleHRlbmRzIFNldENvbGxlY3Rpb25SZXF1ZXN0TG9nIHtcbiAgZWxlbWVudHM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBjb252ZXJ0U2V0Q29udGFpbnNSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRDb250YWluc1JlcXVlc3QsXG4gIFNldENvbnRhaW5zUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX1NldENvbnRhaW5zUmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnc2V0Q29udGFpbnMnLFxuICAgIHNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIGVsZW1lbnRzOiByZXF1ZXN0LmVsZW1lbnRzLm1hcChlbGVtZW50ID0+IGNvbnZlcnRCeXRlc1RvU3RyaW5nKGVsZW1lbnQpKSxcbiAgfTtcbn07XG5cbmNvbnN0IGNvbnZlcnRTZXRMZW5ndGhSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRMZW5ndGhSZXF1ZXN0LFxuICBTZXRDb2xsZWN0aW9uUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX1NldExlbmd0aFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ3NldExlbmd0aCcsXG4gICAgc2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU2V0UG9wUmVxdWVzdExvZyBleHRlbmRzIFNldENvbGxlY3Rpb25SZXF1ZXN0TG9nIHtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgY29udmVydFNldFBvcFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NldFBvcFJlcXVlc3QsXG4gIFNldFBvcFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9TZXRQb3BSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzZXRQb3AnLFxuICAgIHNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIGNvdW50OiByZXF1ZXN0LmNvdW50LFxuICB9O1xufTtcblxuaW50ZXJmYWNlIExpc3RSZXF1ZXN0TG9nIGV4dGVuZHMgUmVxdWVzdExvZyB7XG4gIGxpc3ROYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMaXN0Q29uY2F0ZW5hdGVGcm9udFJlcXVlc3RMb2dcbiAgZXh0ZW5kcyBMaXN0UmVxdWVzdExvZyxcbiAgICBDb2xsZWN0aW9uV3JpdGVSZXF1ZXN0TG9nIHtcbiAgdHJ1bmNhdGVCYWNrVG9TaXplOiBudW1iZXI7XG4gIHZhbHVlczogc3RyaW5nW107XG59XG5cbmNvbnN0IGNvbnZlcnRMaXN0Q29uY2F0ZW5hdGVGcm9udFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RDb25jYXRlbmF0ZUZyb250UmVxdWVzdCxcbiAgTGlzdENvbmNhdGVuYXRlRnJvbnRSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdENvbmNhdGVuYXRlRnJvbnRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdsaXN0Q29uY2F0ZW5hdGVGcm9udCcsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgICB0dGxNaWxsaXM6IHJlcXVlc3QudHRsX21pbGxpc2Vjb25kcyxcbiAgICByZWZyZXNoVHRsOiByZXF1ZXN0LnJlZnJlc2hfdHRsLFxuICAgIHRydW5jYXRlQmFja1RvU2l6ZTogcmVxdWVzdC50cnVuY2F0ZV9iYWNrX3RvX3NpemUsXG4gICAgdmFsdWVzOiByZXF1ZXN0LnZhbHVlcy5tYXAodmFsdWUgPT4gY29udmVydEJ5dGVzVG9TdHJpbmcodmFsdWUpKSxcbiAgfTtcbn07XG5cbmludGVyZmFjZSBMaXN0Q29uY2F0ZW5hdGVCYWNrUmVxdWVzdExvZ1xuICBleHRlbmRzIExpc3RSZXF1ZXN0TG9nLFxuICAgIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cge1xuICB0cnVuY2F0ZUZyb250VG9TaXplOiBudW1iZXI7XG4gIHZhbHVlczogc3RyaW5nW107XG59XG5cbmNvbnN0IGNvbnZlcnRMaXN0Q29uY2F0ZW5hdGVCYWNrUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdENvbmNhdGVuYXRlQmFja1JlcXVlc3QsXG4gIExpc3RDb25jYXRlbmF0ZUJhY2tSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdENvbmNhdGVuYXRlQmFja1JlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RDb25jYXRlbmF0ZUJhY2snLFxuICAgIGxpc3ROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0Lmxpc3RfbmFtZSksXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gICAgcmVmcmVzaFR0bDogcmVxdWVzdC5yZWZyZXNoX3R0bCxcbiAgICB0cnVuY2F0ZUZyb250VG9TaXplOiByZXF1ZXN0LnRydW5jYXRlX2Zyb250X3RvX3NpemUsXG4gICAgdmFsdWVzOiByZXF1ZXN0LnZhbHVlcy5tYXAodmFsdWUgPT4gY29udmVydEJ5dGVzVG9TdHJpbmcodmFsdWUpKSxcbiAgfTtcbn07XG5cbmludGVyZmFjZSBMaXN0UHVzaEZyb250UmVxdWVzdExvZ1xuICBleHRlbmRzIExpc3RSZXF1ZXN0TG9nLFxuICAgIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cge1xuICB0cnVuY2F0ZUJhY2tUb1NpemU6IG51bWJlcjtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuY29uc3QgY29udmVydExpc3RQdXNoRnJvbnRSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9MaXN0UHVzaEZyb250UmVxdWVzdCxcbiAgTGlzdFB1c2hGcm9udFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9MaXN0UHVzaEZyb250UmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnbGlzdFB1c2hGcm9udCcsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgICB0dGxNaWxsaXM6IHJlcXVlc3QudHRsX21pbGxpc2Vjb25kcyxcbiAgICByZWZyZXNoVHRsOiByZXF1ZXN0LnJlZnJlc2hfdHRsLFxuICAgIHRydW5jYXRlQmFja1RvU2l6ZTogcmVxdWVzdC50cnVuY2F0ZV9iYWNrX3RvX3NpemUsXG4gICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QudmFsdWUpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIExpc3RQdXNoQmFja1JlcXVlc3RMb2dcbiAgZXh0ZW5kcyBMaXN0UmVxdWVzdExvZyxcbiAgICBDb2xsZWN0aW9uV3JpdGVSZXF1ZXN0TG9nIHtcbiAgdHJ1bmNhdGVGcm9udFRvU2l6ZTogbnVtYmVyO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5jb25zdCBjb252ZXJ0TGlzdFB1c2hCYWNrUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFB1c2hCYWNrUmVxdWVzdCxcbiAgTGlzdFB1c2hCYWNrUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RQdXNoQmFja1JlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RQdXNoQmFjaycsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgICB0dGxNaWxsaXM6IHJlcXVlc3QudHRsX21pbGxpc2Vjb25kcyxcbiAgICByZWZyZXNoVHRsOiByZXF1ZXN0LnJlZnJlc2hfdHRsLFxuICAgIHRydW5jYXRlRnJvbnRUb1NpemU6IHJlcXVlc3QudHJ1bmNhdGVfZnJvbnRfdG9fc2l6ZSxcbiAgICB2YWx1ZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC52YWx1ZSksXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0TGlzdFBvcEZyb250UmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFBvcEZyb250UmVxdWVzdCxcbiAgTGlzdFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9MaXN0UG9wRnJvbnRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdsaXN0UG9wRnJvbnQnLFxuICAgIGxpc3ROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0Lmxpc3RfbmFtZSksXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0TGlzdFBvcEJhY2tSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9MaXN0UG9wQmFja1JlcXVlc3QsXG4gIExpc3RSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFBvcEJhY2tSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdsaXN0UG9wQmFjaycsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgfTtcbn07XG5cbmludGVyZmFjZSBMaXN0UmVtb3ZlVmFsdWVSZXF1ZXN0TG9nIGV4dGVuZHMgTGlzdFJlcXVlc3RMb2cge1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5jb25zdCBjb252ZXJ0TGlzdFJlbW92ZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RSZW1vdmVSZXF1ZXN0LFxuICBMaXN0UmVtb3ZlVmFsdWVSZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFJlbW92ZVJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RSZW1vdmUnLFxuICAgIGxpc3ROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0Lmxpc3RfbmFtZSksXG4gICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QuYWxsX2VsZW1lbnRzX3dpdGhfdmFsdWUpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIExpc3RGZXRjaFJlcXVlc3RMb2cgZXh0ZW5kcyBMaXN0UmVxdWVzdExvZyB7XG4gIGluY2x1c2l2ZVN0YXJ0OiBudW1iZXI7XG4gIGV4Y2x1c2l2ZUVuZDogbnVtYmVyO1xufVxuXG5jb25zdCBjb252ZXJ0TGlzdEZldGNoUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdEZldGNoUmVxdWVzdCxcbiAgTGlzdEZldGNoUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RGZXRjaFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RGZXRjaCcsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgICBpbmNsdXNpdmVTdGFydDogcmVxdWVzdC5pbmNsdXNpdmVfc3RhcnQsXG4gICAgZXhjbHVzaXZlRW5kOiByZXF1ZXN0LmV4Y2x1c2l2ZV9lbmQsXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgTGlzdEVyYXNlUmVxdWVzdExvZyBleHRlbmRzIExpc3RSZXF1ZXN0TG9nIHtcbiAgYWxsOiBib29sZWFuO1xuICBzb21lOiB7YmVnaW5JbmRleDogbnVtYmVyOyBjb3VudDogbnVtYmVyfVtdO1xufVxuXG5jb25zdCBjb252ZXJ0TGlzdEVyYXNlUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdEVyYXNlUmVxdWVzdCxcbiAgTGlzdEVyYXNlUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RFcmFzZVJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RFcmFzZScsXG4gICAgbGlzdE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QubGlzdF9uYW1lKSxcbiAgICBhbGw6IHJlcXVlc3QuYWxsICE9PSB1bmRlZmluZWQsXG4gICAgc29tZTogcmVxdWVzdC5zb21lLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW5JbmRleDogcmFuZ2UuYmVnaW5faW5kZXgsXG4gICAgICAgIGNvdW50OiByYW5nZS5jb3VudCxcbiAgICAgIH07XG4gICAgfSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgTGlzdFJldGFpblJlcXVlc3RMb2dcbiAgZXh0ZW5kcyBMaXN0UmVxdWVzdExvZyxcbiAgICBDb2xsZWN0aW9uV3JpdGVSZXF1ZXN0TG9nIHtcbiAgaW5jbHVzaXZlU3RhcnQ6IG51bWJlcjtcbiAgZXhjbHVzaXZlRW5kOiBudW1iZXI7XG59XG5cbmNvbnN0IGNvbnZlcnRMaXN0UmV0YWluUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFJldGFpblJlcXVlc3QsXG4gIExpc3RSZXRhaW5SZXF1ZXN0TG9nXG4+ID0gKHJlcXVlc3Q6IGNhY2hlLmNhY2hlX2NsaWVudC5fTGlzdFJldGFpblJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ2xpc3RSZXRhaW4nLFxuICAgIGxpc3ROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0Lmxpc3RfbmFtZSksXG4gICAgdHRsTWlsbGlzOiByZXF1ZXN0LnR0bF9taWxsaXNlY29uZHMsXG4gICAgcmVmcmVzaFR0bDogcmVxdWVzdC5yZWZyZXNoX3R0bCxcbiAgICBpbmNsdXNpdmVTdGFydDogcmVxdWVzdC5pbmNsdXNpdmVfc3RhcnQsXG4gICAgZXhjbHVzaXZlRW5kOiByZXF1ZXN0LmV4Y2x1c2l2ZV9lbmQsXG4gIH07XG59O1xuXG5jb25zdCBjb252ZXJ0TGlzdExlbmd0aFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RMZW5ndGhSZXF1ZXN0LFxuICBMaXN0UmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX0xpc3RMZW5ndGhSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdsaXN0TGVuZ3RoJyxcbiAgICBsaXN0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5saXN0X25hbWUpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNvcnRlZFNldFJlcXVlc3RMb2cgZXh0ZW5kcyBSZXF1ZXN0TG9nIHtcbiAgc29ydGVkU2V0TmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU29ydGVkU2V0UHV0UmVxdWVzdExvZ1xuICBleHRlbmRzIFNvcnRlZFNldFJlcXVlc3RMb2csXG4gICAgQ29sbGVjdGlvbldyaXRlUmVxdWVzdExvZyB7XG4gIGVsZW1lbnRzOiB7dmFsdWU6IHN0cmluZzsgc2NvcmU6IG51bWJlcn1bXTtcbn1cblxuY29uc3QgY29udmVydFNvcnRlZFNldFB1dFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldFB1dFJlcXVlc3QsXG4gIFNvcnRlZFNldFB1dFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRQdXRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzb3J0ZWRTZXRQdXQnLFxuICAgIHNvcnRlZFNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIHR0bE1pbGxpczogcmVxdWVzdC50dGxfbWlsbGlzZWNvbmRzLFxuICAgIHJlZnJlc2hUdGw6IHJlcXVlc3QucmVmcmVzaF90dGwsXG4gICAgZWxlbWVudHM6IHJlcXVlc3QuZWxlbWVudHMubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKGl0ZW0udmFsdWUpLFxuICAgICAgICBzY29yZTogaXRlbS5zY29yZSxcbiAgICAgIH07XG4gICAgfSksXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU29ydGVkU2V0RmV0Y2hSZXF1ZXN0TG9nIGV4dGVuZHMgU29ydGVkU2V0UmVxdWVzdExvZyB7XG4gIG9yZGVyOiAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJzsgLy8gZW51bSB3aXRoIDAgPSBhc2NlbmRpbmcsIDEgPSBkZXNjZW5kaW5nXG4gIGJ5U2NvcmU/OiB7XG4gICAgbWluU2NvcmU6IG51bWJlciB8IHN0cmluZztcbiAgICBtaW5TY29yZUV4Y2x1c2l2ZT86IGJvb2xlYW47XG4gICAgbWF4U2NvcmU6IG51bWJlciB8IHN0cmluZztcbiAgICBtYXhTY29yZUV4Y2x1c2l2ZT86IGJvb2xlYW47XG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgfTtcbiAgYnlJbmRleD86IHtcbiAgICBpbmNsdXNpdmVTdGFydEluZGV4OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgZXhjbHVzaXZlRW5kSW5kZXg6IG51bWJlciB8IHN0cmluZztcbiAgfTtcbn1cblxuY29uc3QgY29udmVydFNvcnRlZFNldEZldGNoUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fU29ydGVkU2V0RmV0Y2hSZXF1ZXN0LFxuICBTb3J0ZWRTZXRGZXRjaFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRGZXRjaFJlcXVlc3QpID0+IHtcbiAgY29uc3QgYnlTY29yZSA9IHJlcXVlc3QuYnlfc2NvcmVcbiAgICA/IHtcbiAgICAgICAgbWluU2NvcmU6IHJlcXVlc3QuYnlfc2NvcmUudW5ib3VuZGVkX21pblxuICAgICAgICAgID8gJ3VuYm91bmRlZCdcbiAgICAgICAgICA6IHJlcXVlc3QuYnlfc2NvcmUubWluX3Njb3JlLnNjb3JlLFxuICAgICAgICBtaW5TY29yZUV4Y2x1c2l2ZTogcmVxdWVzdC5ieV9zY29yZS5taW5fc2NvcmU/LmV4Y2x1c2l2ZSxcbiAgICAgICAgbWF4U2NvcmU6IHJlcXVlc3QuYnlfc2NvcmUudW5ib3VuZGVkX21heFxuICAgICAgICAgID8gJ3VuYm91bmRlZCdcbiAgICAgICAgICA6IHJlcXVlc3QuYnlfc2NvcmUubWF4X3Njb3JlLnNjb3JlLFxuICAgICAgICBtYXhTY29yZUV4Y2x1c2l2ZTogcmVxdWVzdC5ieV9zY29yZS5tYXhfc2NvcmU/LmV4Y2x1c2l2ZSxcbiAgICAgICAgb2Zmc2V0OiByZXF1ZXN0LmJ5X3Njb3JlLm9mZnNldCxcbiAgICAgICAgY291bnQ6IHJlcXVlc3QuYnlfc2NvcmUuY291bnQsXG4gICAgICB9XG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYnlJbmRleCA9IHJlcXVlc3QuYnlfaW5kZXhcbiAgICA/IHtcbiAgICAgICAgaW5jbHVzaXZlU3RhcnRJbmRleDogcmVxdWVzdC5ieV9pbmRleC51bmJvdW5kZWRfc3RhcnRcbiAgICAgICAgICA/ICd1bmJvdW5kZWQnXG4gICAgICAgICAgOiByZXF1ZXN0LmJ5X2luZGV4LmluY2x1c2l2ZV9zdGFydF9pbmRleCxcbiAgICAgICAgZXhjbHVzaXZlRW5kSW5kZXg6IHJlcXVlc3QuYnlfaW5kZXgudW5ib3VuZGVkX2VuZFxuICAgICAgICAgID8gJ3VuYm91bmRlZCdcbiAgICAgICAgICA6IHJlcXVlc3QuYnlfaW5kZXguZXhjbHVzaXZlX2VuZF9pbmRleCxcbiAgICAgIH1cbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnc29ydGVkU2V0RmV0Y2gnLFxuICAgIHNvcnRlZFNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIG9yZGVyOlxuICAgICAgcmVxdWVzdC5vcmRlciA9PT1cbiAgICAgIGNhY2hlLmNhY2hlX2NsaWVudC5fU29ydGVkU2V0RmV0Y2hSZXF1ZXN0Lk9yZGVyLkRFU0NFTkRJTkdcbiAgICAgICAgPyAnZGVzY2VuZGluZydcbiAgICAgICAgOiAnYXNjZW5kaW5nJyxcbiAgICBieVNjb3JlLFxuICAgIGJ5SW5kZXgsXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU29ydGVkU2V0VmFsdWVzUmVxdWVzdExvZyBleHRlbmRzIFNvcnRlZFNldFJlcXVlc3RMb2cge1xuICB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBjb252ZXJ0U29ydGVkU2V0R2V0U2NvcmVSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRHZXRTY29yZVJlcXVlc3QsXG4gIFNvcnRlZFNldFZhbHVlc1JlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRHZXRTY29yZVJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ3NvcnRlZFNldEdldFNjb3JlJyxcbiAgICBzb3J0ZWRTZXROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LnNldF9uYW1lKSxcbiAgICB2YWx1ZXM6IHJlcXVlc3QudmFsdWVzLm1hcCh2YWx1ZSA9PiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyh2YWx1ZSkpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNvcnRlZFNldFJlbW92ZVJlcXVlc3RMb2cgZXh0ZW5kcyBTb3J0ZWRTZXRSZXF1ZXN0TG9nIHtcbiAgdmFsdWVzOiBzdHJpbmdbXSB8ICdhbGwnO1xufVxuXG5jb25zdCBjb252ZXJ0U29ydGVkU2V0UmVtb3ZlUmVxdWVzdDogUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48XG4gIGNhY2hlLmNhY2hlX2NsaWVudC5fU29ydGVkU2V0UmVtb3ZlUmVxdWVzdCxcbiAgU29ydGVkU2V0UmVtb3ZlUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldFJlbW92ZVJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0VHlwZTogJ3NvcnRlZFNldFJlbW92ZScsXG4gICAgc29ydGVkU2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gICAgdmFsdWVzOiByZXF1ZXN0LmFsbFxuICAgICAgPyAnYWxsJ1xuICAgICAgOiByZXF1ZXN0LnNvbWUudmFsdWVzLm1hcCh2YWx1ZSA9PiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyh2YWx1ZSkpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNvcnRlZFNldEluY3JlbWVudFJlcXVlc3RMb2dcbiAgZXh0ZW5kcyBTb3J0ZWRTZXRSZXF1ZXN0TG9nLFxuICAgIENvbGxlY3Rpb25Xcml0ZVJlcXVlc3RMb2cge1xuICB2YWx1ZTogc3RyaW5nO1xuICBhbW91bnQ6IG51bWJlcjtcbn1cblxuY29uc3QgY29udmVydFNvcnRlZFNldEluY3JlbWVudFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldEluY3JlbWVudFJlcXVlc3QsXG4gIFNvcnRlZFNldEluY3JlbWVudFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRJbmNyZW1lbnRSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzb3J0ZWRTZXRJbmNyZW1lbnQnLFxuICAgIHNvcnRlZFNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICAgIHZhbHVlOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LnZhbHVlKSxcbiAgICBhbW91bnQ6IHJlcXVlc3QuYW1vdW50LFxuICAgIHR0bE1pbGxpczogcmVxdWVzdC50dGxfbWlsbGlzZWNvbmRzLFxuICAgIHJlZnJlc2hUdGw6IHJlcXVlc3QucmVmcmVzaF90dGwsXG4gIH07XG59O1xuXG5pbnRlcmZhY2UgU29ydGVkU2V0R2V0UmFua1JlcXVlc3RMb2cgZXh0ZW5kcyBTb3J0ZWRTZXRSZXF1ZXN0TG9nIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgb3JkZXI6ICdhc2NlbmRpbmcnIHwgJ2Rlc2NlbmRpbmcnOyAvLyBlbnVtIHdpdGggMCA9IGFzY2VuZGluZywgMSA9IGRlc2NlbmRpbmdcbn1cblxuY29uc3QgY29udmVydFNvcnRlZFNldEdldFJhbmtSZXF1ZXN0OiBSZXF1ZXN0VG9Mb2dJbnRlcmZhY2VDb252ZXJ0ZXJGbjxcbiAgY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRHZXRSYW5rUmVxdWVzdCxcbiAgU29ydGVkU2V0R2V0UmFua1JlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRHZXRSYW5rUmVxdWVzdCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RUeXBlOiAnc29ydGVkU2V0R2V0UmFuaycsXG4gICAgc29ydGVkU2V0TmFtZTogY29udmVydEJ5dGVzVG9TdHJpbmcocmVxdWVzdC5zZXRfbmFtZSksXG4gICAgdmFsdWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3QudmFsdWUpLFxuICAgIG9yZGVyOlxuICAgICAgcmVxdWVzdC5vcmRlciA9PT1cbiAgICAgIGNhY2hlLmNhY2hlX2NsaWVudC5fU29ydGVkU2V0R2V0UmFua1JlcXVlc3QuT3JkZXIuREVTQ0VORElOR1xuICAgICAgICA/ICdkZXNjZW5kaW5nJ1xuICAgICAgICA6ICdhc2NlbmRpbmcnLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydFNvcnRlZFNldExlbmd0aFJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldExlbmd0aFJlcXVlc3QsXG4gIFNvcnRlZFNldFJlcXVlc3RMb2dcbj4gPSAocmVxdWVzdDogY2FjaGUuY2FjaGVfY2xpZW50Ll9Tb3J0ZWRTZXRMZW5ndGhSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzb3J0ZWRTZXRMZW5ndGgnLFxuICAgIHNvcnRlZFNldE5hbWU6IGNvbnZlcnRCeXRlc1RvU3RyaW5nKHJlcXVlc3Quc2V0X25hbWUpLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNvcnRlZFNldExlbmd0aEJ5U2NvcmVSZXF1ZXN0TG9nIGV4dGVuZHMgU29ydGVkU2V0UmVxdWVzdExvZyB7XG4gIG1pblNjb3JlOiBudW1iZXIgfCBzdHJpbmc7XG4gIG1pblNjb3JlRXhjbHVzaXZlPzogYm9vbGVhbjtcbiAgbWF4U2NvcmU6IG51bWJlciB8IHN0cmluZztcbiAgbWF4U2NvcmVFeGNsdXNpdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBjb252ZXJ0U29ydGVkU2V0TGVuZ3RoQnlTY29yZVJlcXVlc3Q6IFJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlckZuPFxuICBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldExlbmd0aEJ5U2NvcmVSZXF1ZXN0LFxuICBTb3J0ZWRTZXRMZW5ndGhCeVNjb3JlUmVxdWVzdExvZ1xuPiA9IChyZXF1ZXN0OiBjYWNoZS5jYWNoZV9jbGllbnQuX1NvcnRlZFNldExlbmd0aEJ5U2NvcmVSZXF1ZXN0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdFR5cGU6ICdzb3J0ZWRTZXRMZW5ndGhCeVNjb3JlJyxcbiAgICBzb3J0ZWRTZXROYW1lOiBjb252ZXJ0Qnl0ZXNUb1N0cmluZyhyZXF1ZXN0LnNldF9uYW1lKSxcbiAgICBtaW5TY29yZTogcmVxdWVzdC51bmJvdW5kZWRfbWluXG4gICAgICA/ICd1bmJvdW5kZWQnXG4gICAgICA6IHJlcXVlc3QuaW5jbHVzaXZlX21pbiA/PyByZXF1ZXN0LmV4Y2x1c2l2ZV9taW4sXG4gICAgbWluU2NvcmVFeGNsdXNpdmU6IHJlcXVlc3QudW5ib3VuZGVkX21pblxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogcmVxdWVzdC5oYXNfZXhjbHVzaXZlX21pbixcbiAgICBtYXhTY29yZTogcmVxdWVzdC51bmJvdW5kZWRfbWF4XG4gICAgICA/ICd1bmJvdW5kZWQnXG4gICAgICA6IHJlcXVlc3QuaW5jbHVzaXZlX21heCA/PyByZXF1ZXN0LmV4Y2x1c2l2ZV9tYXgsXG4gICAgbWF4U2NvcmVFeGNsdXNpdmU6IHJlcXVlc3QudW5ib3VuZGVkX21heFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogcmVxdWVzdC5oYXNfZXhjbHVzaXZlX21heCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBDYWNoZVJlcXVlc3RUb0xvZ0ludGVyZmFjZUNvbnZlcnRlciA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgUmVxdWVzdFRvTG9nSW50ZXJmYWNlQ29udmVydGVyRm48YW55LCBSZXF1ZXN0TG9nPlxuPihbXG4gIFsnX0dldFJlcXVlc3QnLCBjb252ZXJ0R2V0UmVxdWVzdF0sXG4gIFsnX0dldEJhdGNoUmVxdWVzdCcsIGNvbnZlcnRHZXRCYXRjaFJlcXVlc3RdLFxuICBbJ19EZWxldGVSZXF1ZXN0JywgY29udmVydERlbGV0ZVJlcXVlc3RdLFxuICBbJ19TZXRSZXF1ZXN0JywgY29udmVydFNldFJlcXVlc3RdLFxuICBbJ19TZXRCYXRjaFJlcXVlc3QnLCBjb252ZXJ0U2V0QmF0Y2hSZXF1ZXN0XSxcbiAgWydfU2V0SWZSZXF1ZXN0JywgY29udmVydFNldElmUmVxdWVzdF0sXG4gIFsnX1NldElmTm90RXhpc3RzUmVxdWVzdCcsIGNvbnZlcnRTZXRJZk5vdEV4aXN0c1JlcXVlc3RdLFxuICBbJ19LZXlzRXhpc3RSZXF1ZXN0JywgY29udmVydEtleXNFeGlzdFJlcXVlc3RdLFxuICBbJ19JbmNyZW1lbnRSZXF1ZXN0JywgY29udmVydEluY3JlbWVudFJlcXVlc3RdLFxuICBbJ19VcGRhdGVUdGxSZXF1ZXN0JywgY29udmVydFVwZGF0ZVR0bFJlcXVlc3RdLFxuICBbJ19JdGVtR2V0VHRsUmVxdWVzdCcsIGNvbnZlcnRJdGVtR2V0VHRsUmVxdWVzdF0sXG4gIFsnX0l0ZW1HZXRUeXBlUmVxdWVzdCcsIGNvbnZlcnRJdGVtR2V0VHlwZVJlcXVlc3RdLFxuICBbJ19EaWN0aW9uYXJ5R2V0UmVxdWVzdCcsIGNvbnZlcnREaWN0aW9uYXJ5R2V0UmVxdWVzdF0sXG4gIFsnX0RpY3Rpb25hcnlGZXRjaFJlcXVlc3QnLCBjb252ZXJ0RGljdGlvbmFyeUZldGNoUmVxdWVzdF0sXG4gIFsnX0RpY3Rpb25hcnlTZXRSZXF1ZXN0JywgY29udmVydERpY3Rpb25hcnlTZXRSZXF1ZXN0XSxcbiAgWydfRGljdGlvbmFyeUluY3JlbWVudFJlcXVlc3QnLCBjb252ZXJ0RGljdGlvbmFyeUluY3JlbWVudFJlcXVlc3RdLFxuICBbJ19EaWN0aW9uYXJ5RGVsZXRlUmVxdWVzdCcsIGNvbnZlcnREaWN0aW9uYXJ5RGVsZXRlUmVxdWVzdF0sXG4gIFsnX0RpY3Rpb25hcnlMZW5ndGhSZXF1ZXN0JywgY29udmVydERpY3Rpb25hcnlMZW5ndGhSZXF1ZXN0XSxcbiAgWydfU2V0RmV0Y2hSZXF1ZXN0JywgY29udmVydFNldEZldGNoUmVxdWVzdF0sXG4gIFsnX1NldFNhbXBsZVJlcXVlc3QnLCBjb252ZXJ0U2V0U2FtcGxlUmVxdWVzdF0sXG4gIFsnX1NldFVuaW9uUmVxdWVzdCcsIGNvbnZlcnRTZXRVbmlvblJlcXVlc3RdLFxuICBbJ19TZXREaWZmZXJlbmNlUmVxdWVzdCcsIGNvbnZlcnRTZXREaWZmZXJlbmNlUmVxdWVzdF0sXG4gIFsnX1NldENvbnRhaW5zUmVxdWVzdCcsIGNvbnZlcnRTZXRDb250YWluc1JlcXVlc3RdLFxuICBbJ19TZXRMZW5ndGhSZXF1ZXN0JywgY29udmVydFNldExlbmd0aFJlcXVlc3RdLFxuICBbJ19TZXRQb3BSZXF1ZXN0JywgY29udmVydFNldFBvcFJlcXVlc3RdLFxuICBbJ19MaXN0Q29uY2F0ZW5hdGVGcm9udFJlcXVlc3QnLCBjb252ZXJ0TGlzdENvbmNhdGVuYXRlRnJvbnRSZXF1ZXN0XSxcbiAgWydfTGlzdENvbmNhdGVuYXRlQmFja1JlcXVlc3QnLCBjb252ZXJ0TGlzdENvbmNhdGVuYXRlQmFja1JlcXVlc3RdLFxuICBbJ19MaXN0UHVzaEZyb250UmVxdWVzdCcsIGNvbnZlcnRMaXN0UHVzaEZyb250UmVxdWVzdF0sXG4gIFsnX0xpc3RQdXNoQmFja1JlcXVlc3QnLCBjb252ZXJ0TGlzdFB1c2hCYWNrUmVxdWVzdF0sXG4gIFsnX0xpc3RQb3BGcm9udFJlcXVlc3QnLCBjb252ZXJ0TGlzdFBvcEZyb250UmVxdWVzdF0sXG4gIFsnX0xpc3RQb3BCYWNrUmVxdWVzdCcsIGNvbnZlcnRMaXN0UG9wQmFja1JlcXVlc3RdLFxuICBbJ19MaXN0UmVtb3ZlUmVxdWVzdCcsIGNvbnZlcnRMaXN0UmVtb3ZlUmVxdWVzdF0sXG4gIFsnX0xpc3RGZXRjaFJlcXVlc3QnLCBjb252ZXJ0TGlzdEZldGNoUmVxdWVzdF0sXG4gIFsnX0xpc3RFcmFzZVJlcXVlc3QnLCBjb252ZXJ0TGlzdEVyYXNlUmVxdWVzdF0sXG4gIFsnX0xpc3RSZXRhaW5SZXF1ZXN0JywgY29udmVydExpc3RSZXRhaW5SZXF1ZXN0XSxcbiAgWydfTGlzdExlbmd0aFJlcXVlc3QnLCBjb252ZXJ0TGlzdExlbmd0aFJlcXVlc3RdLFxuICBbJ19Tb3J0ZWRTZXRQdXRSZXF1ZXN0JywgY29udmVydFNvcnRlZFNldFB1dFJlcXVlc3RdLFxuICBbJ19Tb3J0ZWRTZXRGZXRjaFJlcXVlc3QnLCBjb252ZXJ0U29ydGVkU2V0RmV0Y2hSZXF1ZXN0XSxcbiAgWydfU29ydGVkU2V0R2V0U2NvcmVSZXF1ZXN0JywgY29udmVydFNvcnRlZFNldEdldFNjb3JlUmVxdWVzdF0sXG4gIFsnX1NvcnRlZFNldFJlbW92ZVJlcXVlc3QnLCBjb252ZXJ0U29ydGVkU2V0UmVtb3ZlUmVxdWVzdF0sXG4gIFsnX1NvcnRlZFNldEluY3JlbWVudFJlcXVlc3QnLCBjb252ZXJ0U29ydGVkU2V0SW5jcmVtZW50UmVxdWVzdF0sXG4gIFsnX1NvcnRlZFNldEdldFJhbmtSZXF1ZXN0JywgY29udmVydFNvcnRlZFNldEdldFJhbmtSZXF1ZXN0XSxcbiAgWydfU29ydGVkU2V0TGVuZ3RoUmVxdWVzdCcsIGNvbnZlcnRTb3J0ZWRTZXRMZW5ndGhSZXF1ZXN0XSxcbiAgWydfU29ydGVkU2V0TGVuZ3RoQnlTY29yZVJlcXVlc3QnLCBjb252ZXJ0U29ydGVkU2V0TGVuZ3RoQnlTY29yZVJlcXVlc3RdLFxuXSk7XG4iXX0=