@vendasta/store
Version:
Components and data for Store
507 lines • 44.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/**
* @record
*/
export function SalesPackage() { }
if (false) {
/** @type {?} */
SalesPackage.prototype.formattedPrices;
/** @type {?} */
SalesPackage.prototype.packageId;
/** @type {?} */
SalesPackage.prototype.name;
/** @type {?} */
SalesPackage.prototype.icon;
/** @type {?} */
SalesPackage.prototype.productIds;
/** @type {?} */
SalesPackage.prototype.products;
/** @type {?} */
SalesPackage.prototype.addonsWithNoParent;
/** @type {?} */
SalesPackage.prototype.totalAddons;
/** @type {?|undefined} */
SalesPackage.prototype.activationStatus;
}
/**
* @record
*/
export function SalesProduct() { }
if (false) {
/** @type {?} */
SalesProduct.prototype.formattedPrices;
/** @type {?} */
SalesProduct.prototype.productId;
/** @type {?} */
SalesProduct.prototype.name;
/** @type {?} */
SalesProduct.prototype.icon;
/** @type {?} */
SalesProduct.prototype.tagline;
/** @type {?|undefined} */
SalesProduct.prototype.activationStatus;
/** @type {?|undefined} */
SalesProduct.prototype.editionId;
/** @type {?|undefined} */
SalesProduct.prototype.editionName;
/** @type {?} */
SalesProduct.prototype.addons;
}
/**
* @record
*/
export function SalesAddon() { }
if (false) {
/** @type {?} */
SalesAddon.prototype.parentId;
/** @type {?} */
SalesAddon.prototype.addonId;
/** @type {?} */
SalesAddon.prototype.name;
/** @type {?} */
SalesAddon.prototype.icon;
/** @type {?} */
SalesAddon.prototype.tagline;
/** @type {?} */
SalesAddon.prototype.parentName;
/** @type {?} */
SalesAddon.prototype.parentIcon;
/** @type {?} */
SalesAddon.prototype.multipleActivations;
/** @type {?|undefined} */
SalesAddon.prototype.activationStatus;
}
/**
* @record
*/
export function PackageItemActivationStatus() { }
if (false) {
/** @type {?} */
PackageItemActivationStatus.prototype.packageItemId;
/** @type {?} */
PackageItemActivationStatus.prototype.status;
}
/** @enum {number} */
var ActivationStatus = {
SUCCESS: 0,
WARNING: 1,
ERROR: 2,
};
export { ActivationStatus };
ActivationStatus[ActivationStatus.SUCCESS] = 'SUCCESS';
ActivationStatus[ActivationStatus.WARNING] = 'WARNING';
ActivationStatus[ActivationStatus.ERROR] = 'ERROR';
/**
* @record
*/
export function StatusNotificationItem() { }
if (false) {
/** @type {?} */
StatusNotificationItem.prototype.icon;
/** @type {?} */
StatusNotificationItem.prototype.text;
/** @type {?} */
StatusNotificationItem.prototype.status;
}
/**
* @param {?} packages
* @param {?} products
* @param {?} addons
* @return {?}
*/
export function buildSalesPackages(packages, products, addons) {
if (!packages || packages.length < 1) {
return [];
}
return packages.map(function (pkg) { return buildSalesPackageFromPackage(pkg, products, addons); });
}
/**
* @param {?} pkg
* @param {?} products
* @param {?} addons
* @return {?}
*/
function buildSalesPackageFromPackage(pkg, products, addons) {
if (!pkg) {
return null;
}
/** @type {?} */
var salesProducts = buildSalesProducts(pkg, products, addons);
// Addons can be in a package even if the parent product is not, this will create salesAddons with no parent
/** @type {?} */
var addonsWithNoParent = buildSalesAddonsWithNoParent(pkg, products, addons);
return createSalesPackage(pkg, salesProducts, addonsWithNoParent);
}
/**
* @param {?} pkg
* @param {?} products
* @param {?} addons
* @return {?}
*/
export function buildSalesProducts(pkg, products, addons) {
if (!(products && products.length && pkg.products && pkg.products.length)) {
return [];
}
/** @type {?} */
var productMap = new Map();
products.forEach(function (product) { return productMap.set(product.productId, product); });
return pkg.products
.map(function (productId) {
/** @type {?} */
var productMatch = productMap.get(productId);
/** @type {?} */
var addonsInPackage = coerceAddonsForAddonKeys(addons, pkg.addon_keys);
return productMatch ? buildSalesProductFromProduct(productMatch, addonsInPackage) : null;
})
.filter(function (productItem) { return productItem; });
}
/**
* @param {?} addons
* @param {?} addonKeys
* @return {?}
*/
export function coerceAddonsForAddonKeys(addons, addonKeys) {
if (!addons || addons.length === 0 || !addonKeys || addonKeys.length === 0) {
return [];
}
return addons.reduce(function (addonsArray, addon) {
/** @type {?} */
var key = addonKeys.find(function (k) { return k.addonId === addon.addonId; });
if (key) {
/** @type {?} */
var quantity = key.quantity || 1;
for (var i = 0; i < quantity; i++) {
addonsArray.push(addon);
}
}
return addonsArray;
}, []);
}
/**
* @param {?} pkg
* @param {?} products
* @param {?} addons
* @return {?}
*/
export function buildSalesAddonsWithNoParent(pkg, products, addons) {
if (!addons || addons.length < 1 || !pkg.addon_keys) {
return [];
}
/** @type {?} */
var productMap = new Map();
products.forEach(function (product) { return productMap.set(product.productId, product); });
/** @type {?} */
var addonsMap = new Map();
addons.forEach(function (addon) { return addonsMap.set(addon.addonId, addon); });
/** @type {?} */
var addonsWithNoParent = pkg.addon_keys.reduce(function (addonArray, addonKey) {
if (pkg.products && pkg.products.some(function (productId) { return productId === addonKey.appId; })) {
return addonArray || [];
}
/** @type {?} */
var parentProduct = productMap.get(addonKey.appId);
/** @type {?} */
var parentName = parentProduct ? parentProduct.name : null;
/** @type {?} */
var parentIcon = parentProduct ? parentProduct.iconUrl : null;
/** @type {?} */
var quantity = addonKey.quantity || 1;
/** @type {?} */
var addon = addonsMap.get(addonKey.addonId);
for (var i = 0; i < quantity; i++) {
addonArray.push(createSalesAddon(addon, parentName, parentIcon));
}
return addonArray;
}, []);
return addonsWithNoParent;
}
/**
* @param {?} product
* @param {?} addons
* @return {?}
*/
export function buildSalesProductFromProduct(product, addons) {
if (!product) {
return null;
}
if (!addons || addons.length < 1) {
return createSalesProduct(product, null);
}
/** @type {?} */
var productAddons = addons.filter(function (addon) { return addon.appId === product.productId; });
/** @type {?} */
var salesAddons = createSalesAddons(productAddons);
return createSalesProduct(product, salesAddons);
}
/**
* @param {?} pkg
* @param {?} salesProducts
* @param {?} addonsWithNoParent
* @return {?}
*/
function createSalesPackage(pkg, salesProducts, addonsWithNoParent) {
var e_1, _a;
/** @type {?} */
var totalAddons = 0;
try {
for (var _b = tslib_1.__values(pkg.addon_keys || []), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
totalAddons += key.quantity || 1;
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return {
formattedPrices: pkg.formattedPricingList.join(', '),
packageId: pkg.solution_id,
name: pkg.name,
icon: pkg.icon,
productIds: pkg.products,
products: salesProducts || [],
addonsWithNoParent: addonsWithNoParent || [],
totalAddons: totalAddons
};
}
/**
* @param {?} product
* @param {?} salesAddons
* @return {?}
*/
function createSalesProduct(product, salesAddons) {
return {
formattedPrices: product.formattedPricingList.join(', '),
productId: product.productId,
name: product.name,
tagline: product.tagline || '',
icon: product.iconUrl,
addons: salesAddons || [],
editionId: product.editionId,
editionName: product.editionName,
};
}
/**
* @param {?} addons
* @return {?}
*/
function createSalesAddons(addons) {
return addons.map(function (addon) { return createSalesAddon(addon); });
}
/**
* @param {?} addon
* @param {?=} parentName
* @param {?=} parentIcon
* @return {?}
*/
function createSalesAddon(addon, parentName, parentIcon) {
return {
parentId: addon.appId,
addonId: addon.addonId,
name: addon.title,
tagline: addon.tagline || '',
icon: addon.icon || '',
multipleActivations: addon.multipleActivations,
parentIcon: parentIcon || '',
parentName: parentName || ''
};
}
/**
* @param {?} pkg
* @param {?} products
* @param {?} addons
* @param {?} activationStatus
* @return {?}
*/
function createSalesPackageWithStatus(pkg, products, addons, activationStatus) {
return {
formattedPrices: pkg.formattedPrices,
packageId: pkg.packageId,
name: pkg.name,
icon: pkg.icon,
productIds: pkg.productIds,
products: products || [],
addonsWithNoParent: addons || [],
activationStatus: activationStatus || null,
totalAddons: pkg.totalAddons
};
}
/**
* @param {?} product
* @param {?} addons
* @param {?} activationStatus
* @return {?}
*/
function createSalesProductWithStatus(product, addons, activationStatus) {
return {
formattedPrices: product.formattedPrices,
productId: product.productId,
name: product.name,
editionId: product.editionId,
editionName: product.editionName,
tagline: product.tagline,
icon: product.icon,
addons: addons || [],
activationStatus: activationStatus || null
};
}
/**
* @param {?} addon
* @param {?} activationStatus
* @return {?}
*/
function createSalesAddonWithStatus(addon, activationStatus) {
return {
parentId: addon.parentId,
addonId: addon.addonId,
name: addon.name,
tagline: addon.tagline,
icon: addon.icon,
parentIcon: addon.parentIcon,
parentName: addon.parentName,
multipleActivations: addon.multipleActivations,
activationStatus: activationStatus || null
};
}
/**
* @param {?} salesPackages
* @param {?} statuses
* @return {?}
*/
export function addStatusesToSalesPackages(salesPackages, statuses) {
if (!statuses || statuses.length === 0) {
return salesPackages;
}
return salesPackages.map(function (salesPackage) {
/** @type {?} */
var newProducts = salesPackage.products.map(function (product) { return addStatusesToSalesProduct(product, statuses); });
/** @type {?} */
var newAddonsWithNoParent = salesPackage.addonsWithNoParent.map(function (addon) {
/** @type {?} */
var status = findStatus(statuses, addon.addonId, addon.multipleActivations);
return addStatusesToSalesAddon(addon, status);
});
/** @type {?} */
var productStatuses = newProducts
.map(function (product) { return product.activationStatus.status; });
/** @type {?} */
var addonStatuses = newProducts
.map(function (product) { return product.addons ? product.addons.map(function (addon) { return addon.activationStatus.status; }) : []; })
.reduce(function (statusList, reducedList) { return reducedList.concat(statusList); }, []);
/** @type {?} */
var addonsWithNoParentStatuses = newAddonsWithNoParent
.map(function (addon) { return addon.activationStatus ? addon.activationStatus.status : null; });
/** @type {?} */
var allStatuses = tslib_1.__spread(productStatuses, addonStatuses, addonsWithNoParentStatuses);
/** @type {?} */
var packageStatus = convertNumberToActivationStatus(Math.max.apply(Math, tslib_1.__spread(allStatuses)));
/** @type {?} */
var statusNotification = createStatusNotificationItemForPackage(packageStatus);
return createSalesPackageWithStatus(salesPackage, newProducts, newAddonsWithNoParent, statusNotification);
});
}
/**
* @param {?} product
* @param {?} statuses
* @return {?}
*/
export function addStatusesToSalesProduct(product, statuses) {
/** @type {?} */
var productStatus = findStatus(statuses, product.productId, false);
/** @type {?} */
var statusNotification = createStatusNotificationItemForPackageItem(productStatus);
if (!product.addons) {
return createSalesProductWithStatus(product, null, statusNotification);
}
/** @type {?} */
var newSalesAddons = product.addons.map(function (addon) {
/** @type {?} */
var addonStatus = findStatus(statuses, addon.addonId, addon.multipleActivations);
return addStatusesToSalesAddon(addon, addonStatus);
});
return createSalesProductWithStatus(product, newSalesAddons, statusNotification);
}
/**
* @param {?} addon
* @param {?} status
* @return {?}
*/
function addStatusesToSalesAddon(addon, status) {
/** @type {?} */
var addonStatusNotification = createStatusNotificationItemForPackageItem(status);
return createSalesAddonWithStatus(addon, addonStatusNotification);
}
/**
* @param {?} statuses
* @param {?} id
* @param {?} removeIndex
* @return {?}
*/
function findStatus(statuses, id, removeIndex) {
if (!statuses || statuses.length <= 0) {
return null;
}
/** @type {?} */
var statusIndex = statuses.findIndex(function (s) {
return s.packageItemId === id;
});
if (statusIndex < 0) {
return null;
}
/** @type {?} */
var status = statuses[statusIndex].status;
if (removeIndex) {
statuses.splice(statusIndex, 1);
}
return status;
}
/**
* @param {?} status
* @return {?}
*/
function createStatusNotificationItemForPackageItem(status) {
switch (status) {
case ActivationStatus.SUCCESS:
return { icon: 'check_circle', status: status, text: 'Activated' };
case ActivationStatus.WARNING:
return { icon: 'warning', status: status, text: 'Already Activated' };
default:
return { icon: 'error', status: status, text: 'Activation Errors' };
}
}
/**
* @param {?} status
* @return {?}
*/
function createStatusNotificationItemForPackage(status) {
switch (status) {
case ActivationStatus.SUCCESS:
return { icon: 'check_circle', status: status, text: 'Activated' };
case ActivationStatus.WARNING:
return { icon: 'warning', status: status, text: 'Activation Warnings' };
default:
return { icon: 'error', status: status, text: 'Activation Errors Occured' };
}
}
/**
* @param {?} number
* @return {?}
*/
function convertNumberToActivationStatus(number) {
switch (number) {
case 0:
return ActivationStatus.SUCCESS;
case 1:
return ActivationStatus.WARNING;
default:
return ActivationStatus.ERROR;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXMtcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B2ZW5kYXN0YS9zdG9yZS8iLCJzb3VyY2VzIjpbImxpYi9wYWNrYWdlLWRyb3Bkb3duL3NhbGVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFHQSxrQ0FVQzs7O0lBVEMsdUNBQXdCOztJQUN4QixpQ0FBa0I7O0lBQ2xCLDRCQUFhOztJQUNiLDRCQUFhOztJQUNiLGtDQUFxQjs7SUFDckIsZ0NBQXlCOztJQUN6QiwwQ0FBaUM7O0lBQ2pDLG1DQUFvQjs7SUFDcEIsd0NBQTBDOzs7OztBQUc1QyxrQ0FVQzs7O0lBVEMsdUNBQXdCOztJQUN4QixpQ0FBa0I7O0lBQ2xCLDRCQUFhOztJQUNiLDRCQUFhOztJQUNiLCtCQUFnQjs7SUFDaEIsd0NBQTBDOztJQUMxQyxpQ0FBbUI7O0lBQ25CLG1DQUFxQjs7SUFDckIsOEJBQXFCOzs7OztBQUd2QixnQ0FVQzs7O0lBVEMsOEJBQWlCOztJQUNqQiw2QkFBZ0I7O0lBQ2hCLDBCQUFhOztJQUNiLDBCQUFhOztJQUNiLDZCQUFnQjs7SUFDaEIsZ0NBQW1COztJQUNuQixnQ0FBbUI7O0lBQ25CLHlDQUE2Qjs7SUFDN0Isc0NBQTBDOzs7OztBQUc1QyxpREFHQzs7O0lBRkMsb0RBQXNCOztJQUN0Qiw2Q0FBeUI7Ozs7SUFJekIsVUFBVztJQUNYLFVBQVc7SUFDWCxRQUFTOzs7Ozs7Ozs7QUFHWCw0Q0FJQzs7O0lBSEMsc0NBQWE7O0lBQ2Isc0NBQWE7O0lBQ2Isd0NBQXdCOzs7Ozs7OztBQUcxQixNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBbUIsRUFBRSxRQUFtQixFQUFFLE1BQWU7SUFDMUYsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsNEJB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QVMsK0JBQStCLENBQUMsTUFBYztJQUNyRCxRQUFRLE1BQU0sRUFBRTtRQUNkLEtBQUssQ0FBQztZQUNKLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ2xDLEtBQUssQ0FBQztZQUNKLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ2xDO1lBQ0UsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7S0FDakM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvZHVjdCwgUGFja2FnZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBBZGRvbiwgQWRkb25LZXkgfSBmcm9tICdAdmVuZGFzdGEvY29yZS9tYXJrZXRwbGFjZS1wYWNrYWdlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNQYWNrYWdlIHtcbiAgZm9ybWF0dGVkUHJpY2VzOiBzdHJpbmc7XG4gIHBhY2thZ2VJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgcHJvZHVjdElkczogc3RyaW5nW107XG4gIHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXTtcbiAgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW107XG4gIHRvdGFsQWRkb25zOiBudW1iZXI7XG4gIGFjdGl2YXRpb25TdGF0dXM/OiBTdGF0dXNOb3RpZmljYXRpb25JdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzUHJvZHVjdCB7XG4gIGZvcm1hdHRlZFByaWNlczogc3RyaW5nO1xuICBwcm9kdWN0SWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG4gIGVkaXRpb25JZD86IHN0cmluZztcbiAgZWRpdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGFkZG9uczogU2FsZXNBZGRvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzQWRkb24ge1xuICBwYXJlbnRJZDogc3RyaW5nO1xuICBhZGRvbklkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICB0YWdsaW5lOiBzdHJpbmc7XG4gIHBhcmVudE5hbWU6IHN0cmluZztcbiAgcGFyZW50SWNvbjogc3RyaW5nO1xuICBtdWx0aXBsZUFjdGl2YXRpb25zOiBib29sZWFuO1xuICBhY3RpdmF0aW9uU3RhdHVzPzogU3RhdHVzTm90aWZpY2F0aW9uSXRlbTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXMge1xuICBwYWNrYWdlSXRlbUlkOiBzdHJpbmc7XG4gIHN0YXR1czogQWN0aXZhdGlvblN0YXR1cztcbn1cblxuZXhwb3J0IGVudW0gQWN0aXZhdGlvblN0YXR1cyB7XG4gIFNVQ0NFU1MgPSAwLFxuICBXQVJOSU5HID0gMSxcbiAgRVJST1IgPSAyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIGljb246IHN0cmluZyxcbiAgdGV4dDogc3RyaW5nLFxuICBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlcyhwYWNrYWdlczogUGFja2FnZVtdLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2VbXSB7XG4gIGlmICghcGFja2FnZXMgfHwgcGFja2FnZXMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGFja2FnZXMubWFwKHBrZyA9PiBidWlsZFNhbGVzUGFja2FnZUZyb21QYWNrYWdlKHBrZywgcHJvZHVjdHMsIGFkZG9ucykpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNhbGVzUGFja2FnZUZyb21QYWNrYWdlKHBrZzogUGFja2FnZSwgcHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKTogU2FsZXNQYWNrYWdlIHtcbiAgaWYgKCFwa2cpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNhbGVzUHJvZHVjdHMgPSBidWlsZFNhbGVzUHJvZHVjdHMocGtnLCBwcm9kdWN0cywgYWRkb25zKTtcbiAgLy8gQWRkb25zIGNhbiBiZSBpbiBhIHBhY2thZ2UgZXZlbiBpZiB0aGUgcGFyZW50IHByb2R1Y3QgaXMgbm90LCB0aGlzIHdpbGwgY3JlYXRlIHNhbGVzQWRkb25zIHdpdGggbm8gcGFyZW50XG4gIGNvbnN0IGFkZG9uc1dpdGhOb1BhcmVudDogU2FsZXNBZGRvbltdID0gYnVpbGRTYWxlc0FkZG9uc1dpdGhOb1BhcmVudChwa2csIHByb2R1Y3RzLCBhZGRvbnMpO1xuXG4gIHJldHVybiBjcmVhdGVTYWxlc1BhY2thZ2UocGtnLCBzYWxlc1Byb2R1Y3RzLCBhZGRvbnNXaXRoTm9QYXJlbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1Byb2R1Y3RzKHBrZzogUGFja2FnZSwgcHJvZHVjdHM6IFByb2R1Y3RbXSwgYWRkb25zOiBBZGRvbltdKTogU2FsZXNQcm9kdWN0W10ge1xuICBpZiAoIShwcm9kdWN0cyAmJiBwcm9kdWN0cy5sZW5ndGggJiYgcGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHByb2R1Y3RNYXA6IE1hcDxzdHJpbmcsIFByb2R1Y3Q+ID0gbmV3IE1hcDxzdHJpbmcsIFByb2R1Y3Q+KCk7XG4gIHByb2R1Y3RzLmZvckVhY2gocHJvZHVjdCA9PiBwcm9kdWN0TWFwLnNldChwcm9kdWN0LnByb2R1Y3RJZCwgcHJvZHVjdCkpO1xuICByZXR1cm4gcGtnLnByb2R1Y3RzXG4gICAgLm1hcChwcm9kdWN0SWQgPT4ge1xuICAgICAgY29uc3QgcHJvZHVjdE1hdGNoOiBQcm9kdWN0ID0gcHJvZHVjdE1hcC5nZXQocHJvZHVjdElkKTtcbiAgICAgIGNvbnN0IGFkZG9uc0luUGFja2FnZSA9IGNvZXJjZUFkZG9uc0ZvckFkZG9uS2V5cyhhZGRvbnMsIHBrZy5hZGRvbl9rZXlzKTtcbiAgICAgIHJldHVybiBwcm9kdWN0TWF0Y2ggPyBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3RNYXRjaCwgYWRkb25zSW5QYWNrYWdlKSA6IG51bGw7XG4gICAgfSlcbiAgICAuZmlsdGVyKHByb2R1Y3RJdGVtID0+IHByb2R1Y3RJdGVtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUFkZG9uc0ZvckFkZG9uS2V5cyhhZGRvbnM6IEFkZG9uW10sIGFkZG9uS2V5czogQWRkb25LZXlbXSk6IEFkZG9uW10ge1xuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoID09PSAwIHx8ICFhZGRvbktleXMgfHwgYWRkb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhZGRvbnMucmVkdWNlKChhZGRvbnNBcnJheSwgYWRkb24pID0+IHtcbiAgICBjb25zdCBrZXkgPSBhZGRvbktleXMuZmluZChrID0+IGsuYWRkb25JZCA9PT0gYWRkb24uYWRkb25JZCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgY29uc3QgcXVhbnRpdHkgPSBrZXkucXVhbnRpdHkgfHwgMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKykge1xuICAgICAgICBhZGRvbnNBcnJheS5wdXNoKGFkZG9uKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWRkb25zQXJyYXk7XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2FsZXNBZGRvbnNXaXRoTm9QYXJlbnQocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc0FkZG9uW10ge1xuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoIDwgMSB8fCAhcGtnLmFkZG9uX2tleXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcHJvZHVjdE1hcDogTWFwPHN0cmluZywgUHJvZHVjdD4gPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdD4oKTtcbiAgcHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHByb2R1Y3RNYXAuc2V0KHByb2R1Y3QucHJvZHVjdElkLCBwcm9kdWN0KSk7XG4gIGNvbnN0IGFkZG9uc01hcDogTWFwPHN0cmluZywgQWRkb24+ID0gbmV3IE1hcDxzdHJpbmcsIEFkZG9uPigpO1xuICBhZGRvbnMuZm9yRWFjaChhZGRvbiA9PiBhZGRvbnNNYXAuc2V0KGFkZG9uLmFkZG9uSWQsIGFkZG9uKSk7XG5cbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50ID0gcGtnLmFkZG9uX2tleXMucmVkdWNlPFNhbGVzQWRkb25bXT4oKGFkZG9uQXJyYXk6IFNhbGVzQWRkb25bXSwgYWRkb25LZXk6IEFkZG9uS2V5KTogU2FsZXNBZGRvbltdID0+IHtcbiAgICBpZiAocGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5zb21lKHByb2R1Y3RJZCA9PiBwcm9kdWN0SWQgPT09IGFkZG9uS2V5LmFwcElkKSkge1xuICAgICAgcmV0dXJuIGFkZG9uQXJyYXkgfHwgW107XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFByb2R1Y3QgPSBwcm9kdWN0TWFwLmdldChhZGRvbktleS5hcHBJZCk7XG4gICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBhcmVudEljb24gPSBwYXJlbnRQcm9kdWN0ID8gcGFyZW50UHJvZHVjdC5pY29uVXJsIDogbnVsbDtcbiAgICBjb25zdCBxdWFudGl0eSA9IGFkZG9uS2V5LnF1YW50aXR5IHx8IDE7XG4gICAgY29uc3QgYWRkb246IEFkZG9uID0gYWRkb25zTWFwLmdldChhZGRvbktleS5hZGRvbklkKTsgLy8gY291bGQgYmUgdW5kZWZpbmVkXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgICBhZGRvbkFycmF5LnB1c2goY3JlYXRlU2FsZXNBZGRvbihhZGRvbiwgcGFyZW50TmFtZSwgcGFyZW50SWNvbikpO1xuICAgIH1cbiAgICByZXR1cm4gYWRkb25BcnJheTtcbiAgfSwgW10pO1xuICByZXR1cm4gYWRkb25zV2l0aE5vUGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdChwcm9kdWN0OiBQcm9kdWN0LCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1Byb2R1Y3Qge1xuICBpZiAoIXByb2R1Y3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIWFkZG9ucyB8fCBhZGRvbnMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3QocHJvZHVjdCwgbnVsbCk7XG4gIH1cblxuICBjb25zdCBwcm9kdWN0QWRkb25zID0gYWRkb25zLmZpbHRlcihhZGRvbiA9PiBhZGRvbi5hcHBJZCA9PT0gcHJvZHVjdC5wcm9kdWN0SWQpO1xuICBjb25zdCBzYWxlc0FkZG9ucyA9IGNyZWF0ZVNhbGVzQWRkb25zKHByb2R1Y3RBZGRvbnMpO1xuICByZXR1cm4gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3QsIHNhbGVzQWRkb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQYWNrYWdlKHBrZzogUGFja2FnZSwgc2FsZXNQcm9kdWN0czogU2FsZXNQcm9kdWN0W10sIGFkZG9uc1dpdGhOb1BhcmVudDogU2FsZXNBZGRvbltdKTogU2FsZXNQYWNrYWdlIHtcbiAgbGV0IHRvdGFsQWRkb25zID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgcGtnLmFkZG9uX2tleXMgfHwgW10pIHtcbiAgICB0b3RhbEFkZG9ucyArPSBrZXkucXVhbnRpdHkgfHwgMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwa2cuZm9ybWF0dGVkUHJpY2luZ0xpc3Quam9pbignLCAnKSxcbiAgICBwYWNrYWdlSWQ6IHBrZy5zb2x1dGlvbl9pZCxcbiAgICBuYW1lOiBwa2cubmFtZSxcbiAgICBpY29uOiBwa2cuaWNvbixcbiAgICBwcm9kdWN0SWRzOiBwa2cucHJvZHVjdHMsXG4gICAgcHJvZHVjdHM6IHNhbGVzUHJvZHVjdHMgfHwgW10sXG4gICAgYWRkb25zV2l0aE5vUGFyZW50OiBhZGRvbnNXaXRoTm9QYXJlbnQgfHwgW10sXG4gICAgdG90YWxBZGRvbnM6IHRvdGFsQWRkb25zXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QsIHNhbGVzQWRkb25zOiBTYWxlc0FkZG9uW10pOiBTYWxlc1Byb2R1Y3Qge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcHJvZHVjdC5mb3JtYXR0ZWRQcmljaW5nTGlzdC5qb2luKCcsICcpLFxuICAgIHByb2R1Y3RJZDogcHJvZHVjdC5wcm9kdWN0SWQsXG4gICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgIHRhZ2xpbmU6IHByb2R1Y3QudGFnbGluZSB8fCAnJyxcbiAgICBpY29uOiBwcm9kdWN0Lmljb25VcmwsXG4gICAgYWRkb25zOiBzYWxlc0FkZG9ucyB8fCBbXSxcbiAgICBlZGl0aW9uSWQ6IHByb2R1Y3QuZWRpdGlvbklkLFxuICAgIGVkaXRpb25OYW1lOiBwcm9kdWN0LmVkaXRpb25OYW1lLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzQWRkb25zKGFkZG9uczogQWRkb25bXSk6IFNhbGVzQWRkb25bXSB7XG4gIHJldHVybiBhZGRvbnMubWFwKGFkZG9uID0+IGNyZWF0ZVNhbGVzQWRkb24oYWRkb24pKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbihhZGRvbjogQWRkb24sIHBhcmVudE5hbWU/OiBzdHJpbmcsIHBhcmVudEljb24/OiBzdHJpbmcpOiBTYWxlc0FkZG9uIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRJZDogYWRkb24uYXBwSWQsXG4gICAgYWRkb25JZDogYWRkb24uYWRkb25JZCxcbiAgICBuYW1lOiBhZGRvbi50aXRsZSxcbiAgICB0YWdsaW5lOiBhZGRvbi50YWdsaW5lIHx8ICcnLFxuICAgIGljb246IGFkZG9uLmljb24gfHwgJycsXG4gICAgbXVsdGlwbGVBY3RpdmF0aW9uczogYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyxcbiAgICBwYXJlbnRJY29uOiBwYXJlbnRJY29uIHx8ICcnLFxuICAgIHBhcmVudE5hbWU6IHBhcmVudE5hbWUgfHwgJydcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc1BhY2thZ2VXaXRoU3RhdHVzKHBrZzogU2FsZXNQYWNrYWdlLCBwcm9kdWN0czogU2FsZXNQcm9kdWN0W10sIGFkZG9uczogU2FsZXNBZGRvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uU3RhdHVzOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtKTogU2FsZXNQYWNrYWdlIHtcblxuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcGtnLmZvcm1hdHRlZFByaWNlcyxcbiAgICBwYWNrYWdlSWQ6IHBrZy5wYWNrYWdlSWQsXG4gICAgbmFtZTogcGtnLm5hbWUsXG4gICAgaWNvbjogcGtnLmljb24sXG4gICAgcHJvZHVjdElkczogcGtnLnByb2R1Y3RJZHMsXG4gICAgcHJvZHVjdHM6IHByb2R1Y3RzIHx8IFtdLFxuICAgIGFkZG9uc1dpdGhOb1BhcmVudDogYWRkb25zIHx8IFtdLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbCxcbiAgICB0b3RhbEFkZG9uczogcGtnLnRvdGFsQWRkb25zXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQcm9kdWN0V2l0aFN0YXR1cyhwcm9kdWN0OiBTYWxlc1Byb2R1Y3QsIGFkZG9uczogU2FsZXNBZGRvbltdLCBhY3RpdmF0aW9uU3RhdHVzOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtKTogU2FsZXNQcm9kdWN0IHtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXR0ZWRQcmljZXM6IHByb2R1Y3QuZm9ybWF0dGVkUHJpY2VzLFxuICAgIHByb2R1Y3RJZDogcHJvZHVjdC5wcm9kdWN0SWQsXG4gICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgIGVkaXRpb25JZDogcHJvZHVjdC5lZGl0aW9uSWQsXG4gICAgZWRpdGlvbk5hbWU6IHByb2R1Y3QuZWRpdGlvbk5hbWUsXG4gICAgdGFnbGluZTogcHJvZHVjdC50YWdsaW5lLFxuICAgIGljb246IHByb2R1Y3QuaWNvbixcbiAgICBhZGRvbnM6IGFkZG9ucyB8fCBbXSxcbiAgICBhY3RpdmF0aW9uU3RhdHVzOiBhY3RpdmF0aW9uU3RhdHVzIHx8IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbldpdGhTdGF0dXMoYWRkb246IFNhbGVzQWRkb24sIGFjdGl2YXRpb25TdGF0dXM6IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW0pOiBTYWxlc0FkZG9uIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRJZDogYWRkb24ucGFyZW50SWQsXG4gICAgYWRkb25JZDogYWRkb24uYWRkb25JZCxcbiAgICBuYW1lOiBhZGRvbi5uYW1lLFxuICAgIHRhZ2xpbmU6IGFkZG9uLnRhZ2xpbmUsXG4gICAgaWNvbjogYWRkb24uaWNvbixcbiAgICBwYXJlbnRJY29uOiBhZGRvbi5wYXJlbnRJY29uLFxuICAgIHBhcmVudE5hbWU6IGFkZG9uLnBhcmVudE5hbWUsXG4gICAgbXVsdGlwbGVBY3RpdmF0aW9uczogYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyxcbiAgICBhY3RpdmF0aW9uU3RhdHVzOiBhY3RpdmF0aW9uU3RhdHVzIHx8IG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RhdHVzZXNUb1NhbGVzUGFja2FnZXMoc2FsZXNQYWNrYWdlczogU2FsZXNQYWNrYWdlW10sIHN0YXR1c2VzOiBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXSk6IFNhbGVzUGFja2FnZVtdIHtcbiAgaWYgKCFzdGF0dXNlcyB8fCBzdGF0dXNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc2FsZXNQYWNrYWdlcztcbiAgfVxuXG4gIHJldHVybiBzYWxlc1BhY2thZ2VzLm1hcChzYWxlc1BhY2thZ2UgPT4ge1xuICAgIGNvbnN0IG5ld1Byb2R1Y3RzID0gc2FsZXNQYWNrYWdlLnByb2R1Y3RzLm1hcChwcm9kdWN0ID0+IGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QocHJvZHVjdCwgc3RhdHVzZXMpKTtcblxuICAgIGNvbnN0IG5ld0FkZG9uc1dpdGhOb1BhcmVudCA9IHNhbGVzUGFja2FnZS5hZGRvbnNXaXRoTm9QYXJlbnQubWFwKGFkZG9uID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIGFkZG9uLmFkZG9uSWQsIGFkZG9uLm11bHRpcGxlQWN0aXZhdGlvbnMpO1xuICAgICAgcmV0dXJuIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uLCBzdGF0dXMpXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9kdWN0U3RhdHVzZXMgPSBuZXdQcm9kdWN0c1xuICAgICAgLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QuYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpO1xuICAgIGNvbnN0IGFkZG9uU3RhdHVzZXMgPSBuZXdQcm9kdWN0c1xuICAgICAgLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QuYWRkb25zID8gcHJvZHVjdC5hZGRvbnMubWFwKGFkZG9uID0+IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMuc3RhdHVzKSA6IFtdKVxuICAgICAgLnJlZHVjZSgoc3RhdHVzTGlzdCwgcmVkdWNlZExpc3QpID0+IHJlZHVjZWRMaXN0LmNvbmNhdChzdGF0dXNMaXN0KSwgW10pO1xuICAgIGNvbnN0IGFkZG9uc1dpdGhOb1BhcmVudFN0YXR1c2VzID0gbmV3QWRkb25zV2l0aE5vUGFyZW50XG4gICAgICAubWFwKGFkZG9uID0+IGFkZG9uLmFjdGl2YXRpb25TdGF0dXMgPyBhZGRvbi5hY3RpdmF0aW9uU3RhdHVzLnN0YXR1cyA6IG51bGwpO1xuICAgIGNvbnN0IGFsbFN0YXR1c2VzID0gWy4uLnByb2R1Y3RTdGF0dXNlcywgLi4uYWRkb25TdGF0dXNlcywgLi4uYWRkb25zV2l0aE5vUGFyZW50U3RhdHVzZXNdO1xuXG4gICAgY29uc3QgcGFja2FnZVN0YXR1cyA9IGNvbnZlcnROdW1iZXJUb0FjdGl2YXRpb25TdGF0dXMoTWF0aC5tYXgoLi4uYWxsU3RhdHVzZXMpKTtcbiAgICBjb25zdCBzdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZShwYWNrYWdlU3RhdHVzKTtcblxuICAgIHJldHVybiBjcmVhdGVTYWxlc1BhY2thZ2VXaXRoU3RhdHVzKHNhbGVzUGFja2FnZSwgbmV3UHJvZHVjdHMsIG5ld0FkZG9uc1dpdGhOb1BhcmVudCwgc3RhdHVzTm90aWZpY2F0aW9uKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0KHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCwgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKTogU2FsZXNQcm9kdWN0IHtcbiAgY29uc3QgcHJvZHVjdFN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIHByb2R1Y3QucHJvZHVjdElkLCBmYWxzZSk7XG4gIGNvbnN0IHN0YXR1c05vdGlmaWNhdGlvbiA9IGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlSXRlbShwcm9kdWN0U3RhdHVzKTtcbiAgaWYgKCFwcm9kdWN0LmFkZG9ucykge1xuICAgIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3QsIG51bGwsIHN0YXR1c05vdGlmaWNhdGlvbilcbiAgfVxuXG4gIGNvbnN0IG5ld1NhbGVzQWRkb25zID0gcHJvZHVjdC5hZGRvbnMubWFwKGFkZG9uID0+IHtcbiAgICBjb25zdCBhZGRvblN0YXR1cyA9IGZpbmRTdGF0dXMoc3RhdHVzZXMsIGFkZG9uLmFkZG9uSWQsIGFkZG9uLm11bHRpcGxlQWN0aXZhdGlvbnMpO1xuICAgIHJldHVybiBhZGRTdGF0dXNlc1RvU2FsZXNBZGRvbihhZGRvbiwgYWRkb25TdGF0dXMpXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTYWxlc1Byb2R1Y3RXaXRoU3RhdHVzKHByb2R1Y3QsIG5ld1NhbGVzQWRkb25zLCBzdGF0dXNOb3RpZmljYXRpb24pO1xufVxuXG5mdW5jdGlvbiBhZGRTdGF0dXNlc1RvU2FsZXNBZGRvbihhZGRvbjogU2FsZXNBZGRvbiwgc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU2FsZXNBZGRvbiB7XG4gIGNvbnN0IGFkZG9uU3RhdHVzTm90aWZpY2F0aW9uID0gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2VJdGVtKHN0YXR1cyk7XG4gIHJldHVybiBjcmVhdGVTYWxlc0FkZG9uV2l0aFN0YXR1cyhhZGRvbiwgYWRkb25TdGF0dXNOb3RpZmljYXRpb24pO1xufVxuXG5mdW5jdGlvbiBmaW5kU3RhdHVzKHN0YXR1c2VzOiBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXSwgaWQ6IHN0cmluZywgcmVtb3ZlSW5kZXg6IGJvb2xlYW4pOiBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgaWYgKCFzdGF0dXNlcyB8fCBzdGF0dXNlcy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3Qgc3RhdHVzSW5kZXggPSBzdGF0dXNlcy5maW5kSW5kZXgocyA9PiB7XG4gICAgcmV0dXJuIHMucGFja2FnZUl0ZW1JZCA9PT0gaWQ7XG4gIH0pO1xuICBpZiAoc3RhdHVzSW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXNbc3RhdHVzSW5kZXhdLnN0YXR1cztcbiAgaWYgKHJlbW92ZUluZGV4KSB7XG4gICAgc3RhdHVzZXMuc3BsaWNlKHN0YXR1c0luZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gc3RhdHVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0oc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M6XG4gICAgICByZXR1cm4ge2ljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRlZCd9O1xuICAgIGNhc2UgQWN0aXZhdGlvblN0YXR1cy5XQVJOSU5HOlxuICAgICAgcmV0dXJuIHtpY29uOiAnd2FybmluZycsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWxyZWFkeSBBY3RpdmF0ZWQnfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtpY29uOiAnZXJyb3InLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRpb24gRXJyb3JzJ307XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RhdHVzTm90aWZpY2F0aW9uSXRlbUZvclBhY2thZ2Uoc3RhdHVzOiBBY3RpdmF0aW9uU3RhdHVzKTogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSB7XG4gIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgY2FzZSBBY3RpdmF0aW9uU3RhdHVzLlNVQ0NFU1M6XG4gICAgICByZXR1cm4ge2ljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0FjdGl2YXRlZCd9O1xuICAgIGNhc2UgQWN0aXZhdGlvblN0YXR1cy5XQVJOSU5HOlxuICAgICAgcmV0dXJuIHtpY29uOiAnd2FybmluZycsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBXYXJuaW5ncyd9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge2ljb246ICdlcnJvcicsIHN0YXR1czogc3RhdHVzLCB0ZXh0OiAnQWN0aXZhdGlvbiBFcnJvcnMgT2NjdXJlZCd9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROdW1iZXJUb0FjdGl2YXRpb25TdGF0dXMobnVtYmVyOiBOdW1iZXIpOiBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgc3dpdGNoIChudW1iZXIpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gQWN0aXZhdGlvblN0YXR1cy5TVUNDRVNTO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLkVSUk9SO1xuICB9XG59XG4iXX0=