UNPKG

@vendasta/store

Version:

Components and data for Store

264 lines 41.5 kB
import { ProductWithParent } from '../shared/product'; export var ActivationStatus; (function (ActivationStatus) { ActivationStatus[ActivationStatus["SUCCESS"] = 0] = "SUCCESS"; ActivationStatus[ActivationStatus["WARNING"] = 1] = "WARNING"; ActivationStatus[ActivationStatus["ERROR"] = 2] = "ERROR"; })(ActivationStatus || (ActivationStatus = {})); export function buildSalesPackages(packages, products, addons) { if (!packages || packages.length < 1) { return []; } return packages.map((pkg) => buildSalesPackageFromPackage(pkg, products, addons)); } function buildSalesPackageFromPackage(pkg, products, addons) { if (!pkg) { return null; } const 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 const addonsWithNoParent = buildSalesAddonsWithNoParent(pkg, products, addons); return createSalesPackage(pkg, salesProducts, addonsWithNoParent); } export function buildSalesProducts(pkg, products, addons) { if (!(products && products.length && pkg.products && pkg.products.length)) { return []; } const productMap = new Map(); products.forEach((product) => productMap.set(product.productId, product)); return pkg.products .map((productId) => { const productMatch = productMap.get(productId); const addonsInPackage = coerceAddonsForAddonKeys(addons, pkg.addon_keys); return productMatch ? buildSalesProductFromProduct(productMatch, addonsInPackage) : null; }) .filter((productItem) => productItem); } export function coerceAddonsForAddonKeys(addons, addonKeys) { if (!addons || addons.length === 0 || !addonKeys || addonKeys.length === 0) { return []; } return addons.reduce((addonsArray, addon) => { const key = addonKeys.find((k) => k.addonId === addon.addonId); if (key) { const quantity = key.quantity || 1; for (let i = 0; i < quantity; i++) { addonsArray.push(addon); } } return addonsArray; }, []); } export function buildSalesAddonsWithNoParent(pkg, products, addons) { if (!addons || addons.length < 1 || !pkg.addon_keys) { return []; } const productMap = new Map(); products.forEach((product) => productMap.set(product.productId, product)); const addonsMap = new Map(); addons.forEach((addon) => addonsMap.set(addon.addonId, addon)); const addonsWithNoParent = pkg.addon_keys.reduce((addonArray, addonKey) => { if (pkg.products && pkg.products.some((productId) => productId === addonKey.appId)) { return addonArray || []; } const parentProduct = productMap.get(addonKey.appId); const parentName = parentProduct ? parentProduct.name : null; const parentIcon = parentProduct ? parentProduct.iconUrl : null; const quantity = addonKey.quantity || 1; const addon = addonsMap.get(addonKey.addonId); // could be undefined for (let i = 0; i < quantity; i++) { addonArray.push(createSalesAddon(addon, parentName, parentIcon)); } return addonArray; }, []); return addonsWithNoParent; } export function buildSalesProductFromProduct(product, addons) { if (!product) { return null; } if (!addons || addons.length < 1) { return createSalesProduct(product, null); } const productAddons = addons.filter((addon) => addon.appId === product.productId); const salesAddons = createSalesAddons(productAddons); return createSalesProduct(product, salesAddons); } function createSalesPackage(pkg, salesProducts, addonsWithNoParent) { let totalAddons = 0; for (const key of pkg.addon_keys || []) { totalAddons += key.quantity || 1; } return { formattedPrices: pkg.priceStrings.join(', '), packageId: pkg.solution_id, name: pkg.name, icon: pkg.icon, productIds: pkg.products, products: salesProducts || [], addonsWithNoParent: addonsWithNoParent || [], totalAddons: totalAddons, }; } function createSalesProduct(product, salesAddons) { let parentInfo; if (product instanceof ProductWithParent) { parentInfo = { parentId: product.parentId, parentName: product.parentName, parentIconUrl: product.parentIconUrl, multipleActivations: product.multipleActivations || false, }; } return { formattedPrices: product.priceStrings.join(', '), productId: product.productId, name: product.name, tagline: product.tagline || '', icon: product.iconUrl, addons: salesAddons || [], editionId: product.editionId, editionName: product.editionName, parentInfo: parentInfo, }; } function createSalesAddons(addons) { return addons.map((addon) => createSalesAddon(addon)); } function createSalesAddon(addon, parentName, parentIcon) { return { parentId: addon.appId, addonId: addon.addonId, name: addon.title, tagline: addon.tagline || '', icon: addon.icon || '', multipleActivations: addon.multipleActivations || false, parentIcon: parentIcon || '', parentName: parentName || '', }; } 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, }; } 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, parentInfo: product.parentInfo || null, }; } 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 || false, activationStatus: activationStatus || null, }; } export function addStatusesToSalesPackages(salesPackages, statuses) { if (!statuses || statuses.length === 0) { return salesPackages; } return salesPackages.map((salesPackage) => { const newProducts = salesPackage.products.map((product) => addStatusesToSalesProduct(product, statuses)); const newAddonsWithNoParent = salesPackage.addonsWithNoParent.map((addon) => { const status = findStatus(statuses, addon.addonId); return addStatusesToSalesAddon(addon, status); }); const productStatuses = newProducts.map((product) => product.activationStatus.status); const addonStatuses = newProducts .map((product) => (product.addons ? product.addons.map((addon) => addon.activationStatus.status) : [])) .reduce((statusList, reducedList) => reducedList.concat(statusList), []); const addonsWithNoParentStatuses = newAddonsWithNoParent.map((addon) => addon.activationStatus ? addon.activationStatus.status : null); const allStatuses = [...productStatuses, ...addonStatuses, ...addonsWithNoParentStatuses]; const packageStatus = convertNumberToActivationStatus(Math.max(...allStatuses)); const statusNotification = createStatusNotificationItemForPackage(packageStatus); return createSalesPackageWithStatus(salesPackage, newProducts, newAddonsWithNoParent, statusNotification); }); } export function addStatusesToSalesProduct(product, statuses) { if (!statuses || statuses.length === 0) { return product; } const productStatus = findStatus(statuses, product.productId); const statusNotification = createStatusNotificationItemForPackageItem(productStatus); if (!product.addons) { return createSalesProductWithStatus(product, null, statusNotification); } const newSalesAddons = product.addons.map((addon) => { const addonStatus = findStatus(statuses, addon.addonId); return addStatusesToSalesAddon(addon, addonStatus); }); return createSalesProductWithStatus(product, newSalesAddons, statusNotification); } function addStatusesToSalesAddon(addon, status) { const addonStatusNotification = createStatusNotificationItemForPackageItem(status); return createSalesAddonWithStatus(addon, addonStatusNotification); } function findStatus(statuses, id) { if (!statuses || statuses.length <= 0) { return null; } const statusIndex = statuses.findIndex((s) => { return s.packageItemId === id; }); if (statusIndex < 0) { return null; } const status = statuses[statusIndex].status; statuses.splice(statusIndex, 1); return status; } function createStatusNotificationItemForPackageItem(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ACTIVATED' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ALREADY_ACTIVATED' }; default: return { icon: 'error', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ACTIVATION_ERRORS' }; } } function createStatusNotificationItemForPackage(status) { switch (status) { case ActivationStatus.SUCCESS: return { icon: 'check_circle', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ACTIVATED' }; case ActivationStatus.WARNING: return { icon: 'warning', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ACTIVATION_WARNINGS' }; default: return { icon: 'error', status: status, text: 'FRONTEND.STORE.ACTIVATION_STATUS.ACTIVATION_ERRORS_OCCURRED' }; } } function convertNumberToActivationStatus(number) { switch (number) { case 0: return ActivationStatus.SUCCESS; case 1: return ActivationStatus.WARNING; default: return ActivationStatus.ERROR; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FsZXMtcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9wYWNrYWdlLWRyb3Bkb3duL3NhbGVzLXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFXLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFtRC9ELE1BQU0sQ0FBTixJQUFZLGdCQUlYO0FBSkQsV0FBWSxnQkFBZ0I7SUFDMUIsNkRBQVcsQ0FBQTtJQUNYLDZEQUFXLENBQUE7SUFDWCx5REFBUyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFJM0I7QUFRRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBbUIsRUFBRSxRQUFtQixFQUFFLE1BQWU7SUFDMUYsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDcEYsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsR0FBWSxFQUFFLFFBQW1CLEVBQUUsTUFBZTtJQUN0RixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1IsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEUsNEdBQTRHO0lBQzVHLE1BQU0sa0JBQWtCLEdBQWlCLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFN0YsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFD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RUFBRSxDQUFDO1FBQzNHO1lBQ0UsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsNkRBQTZELEVBQUUsQ0FBQztLQUNqSDtBQUNILENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLE1BQWM7SUFDckQsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLENBQUM7WUFDSixPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUNsQyxLQUFLLENBQUM7WUFDSixPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUNsQztZQUNFLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0tBQ2pDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZG9uLCBBZGRvbktleSB9IGZyb20gJ0B2ZW5kYXN0YS9tYXJrZXRwbGFjZS1wYWNrYWdlcyc7XG5pbXBvcnQgeyBQYWNrYWdlIH0gZnJvbSAnLi4vcGFja2FnZS1kZXRhaWxzL3BhY2thZ2UnO1xuaW1wb3J0IHsgUHJvZHVjdCwgUHJvZHVjdFdpdGhQYXJlbnQgfSBmcm9tICcuLi9zaGFyZWQvcHJvZHVjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FsZXNQYWNrYWdlIHtcbiAgZm9ybWF0dGVkUHJpY2VzOiBzdHJpbmc7XG4gIHBhY2thZ2VJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgcHJvZHVjdElkczogc3RyaW5nW107XG4gIHByb2R1Y3RzOiBTYWxlc1Byb2R1Y3RbXTtcbiAgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW107XG4gIHRvdGFsQWRkb25zOiBudW1iZXI7XG4gIGFjdGl2YXRpb25TdGF0dXM/OiBTdGF0dXNOb3RpZmljYXRpb25JdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhbGVzUHJvZHVjdCB7XG4gIGZvcm1hdHRlZFByaWNlczogc3RyaW5nO1xuICBwcm9kdWN0SWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG4gIGVkaXRpb25JZD86IHN0cmluZztcbiAgZWRpdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGFkZG9uczogU2FsZXNBZGRvbltdO1xuICBwYXJlbnRJbmZvPzogUHJvZHVjdFBhcmVudEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBhcmVudEluZm8ge1xuICBwYXJlbnRJZDogc3RyaW5nO1xuICBwYXJlbnROYW1lOiBzdHJpbmc7XG4gIHBhcmVudEljb25Vcmw6IHN0cmluZztcbiAgbXVsdGlwbGVBY3RpdmF0aW9uczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWxlc0FkZG9uIHtcbiAgcGFyZW50SWQ6IHN0cmluZztcbiAgYWRkb25JZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgdGFnbGluZTogc3RyaW5nO1xuICBwYXJlbnROYW1lOiBzdHJpbmc7XG4gIHBhcmVudEljb246IHN0cmluZztcbiAgbXVsdGlwbGVBY3RpdmF0aW9uczogYm9vbGVhbjtcbiAgYWN0aXZhdGlvblN0YXR1cz86IFN0YXR1c05vdGlmaWNhdGlvbkl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzIHtcbiAgcGFja2FnZUl0ZW1JZDogc3RyaW5nO1xuICBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXM7XG59XG5cbmV4cG9ydCBlbnVtIEFjdGl2YXRpb25TdGF0dXMge1xuICBTVUNDRVNTID0gMCxcbiAgV0FSTklORyA9IDEsXG4gIEVSUk9SID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgaWNvbjogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogQWN0aXZhdGlvblN0YXR1cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlcyhwYWNrYWdlczogUGFja2FnZVtdLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2VbXSB7XG4gIGlmICghcGFja2FnZXMgfHwgcGFja2FnZXMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGFja2FnZXMubWFwKChwa2cpID0+IGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnLCBwcm9kdWN0cywgYWRkb25zKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2FsZXNQYWNrYWdlRnJvbVBhY2thZ2UocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1BhY2thZ2Uge1xuICBpZiAoIXBrZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2FsZXNQcm9kdWN0cyA9IGJ1aWxkU2FsZXNQcm9kdWN0cyhwa2csIHByb2R1Y3RzLCBhZGRvbnMpO1xuICAvLyBBZGRvbnMgY2FuIGJlIGluIGEgcGFja2FnZSBldmVuIGlmIHRoZSBwYXJlbnQgcHJvZHVjdCBpcyBub3QsIHRoaXMgd2lsbCBjcmVhdGUgc2FsZXNBZGRvbnMgd2l0aCBubyBwYXJlbnRcbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50OiBTYWxlc0FkZG9uW10gPSBidWlsZFNhbGVzQWRkb25zV2l0aE5vUGFyZW50KHBrZywgcHJvZHVjdHMsIGFkZG9ucyk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZShwa2csIHNhbGVzUHJvZHVjdHMsIGFkZG9uc1dpdGhOb1BhcmVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdHMocGtnOiBQYWNrYWdlLCBwcm9kdWN0czogUHJvZHVjdFtdLCBhZGRvbnM6IEFkZG9uW10pOiBTYWxlc1Byb2R1Y3RbXSB7XG4gIGlmICghKHByb2R1Y3RzICYmIHByb2R1Y3RzLmxlbmd0aCAmJiBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcHJvZHVjdE1hcDogTWFwPHN0cmluZywgUHJvZHVjdD4gPSBuZXcgTWFwPHN0cmluZywgUHJvZHVjdD4oKTtcbiAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4gcHJvZHVjdE1hcC5zZXQocHJvZHVjdC5wcm9kdWN0SWQsIHByb2R1Y3QpKTtcbiAgcmV0dXJuIHBrZy5wcm9kdWN0c1xuICAgIC5tYXAoKHByb2R1Y3RJZCkgPT4ge1xuICAgICAgY29uc3QgcHJvZHVjdE1hdGNoOiBQcm9kdWN0ID0gcHJvZHVjdE1hcC5nZXQocHJvZHVjdElkKTtcbiAgICAgIGNvbnN0IGFkZG9uc0luUGFja2FnZSA9IGNvZXJjZUFkZG9uc0ZvckFkZG9uS2V5cyhhZGRvbnMsIHBrZy5hZGRvbl9rZXlzKTtcbiAgICAgIHJldHVybiBwcm9kdWN0TWF0Y2ggPyBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3RNYXRjaCwgYWRkb25zSW5QYWNrYWdlKSA6IG51bGw7XG4gICAgfSlcbiAgICAuZmlsdGVyKChwcm9kdWN0SXRlbSkgPT4gcHJvZHVjdEl0ZW0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlQWRkb25zRm9yQWRkb25LZXlzKGFkZG9uczogQWRkb25bXSwgYWRkb25LZXlzOiBBZGRvbktleVtdKTogQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPT09IDAgfHwgIWFkZG9uS2V5cyB8fCBhZGRvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFkZG9ucy5yZWR1Y2UoKGFkZG9uc0FycmF5LCBhZGRvbikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGFkZG9uS2V5cy5maW5kKChrKSA9PiBrLmFkZG9uSWQgPT09IGFkZG9uLmFkZG9uSWQpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGNvbnN0IHF1YW50aXR5ID0ga2V5LnF1YW50aXR5IHx8IDE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspIHtcbiAgICAgICAgYWRkb25zQXJyYXkucHVzaChhZGRvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRvbnNBcnJheTtcbiAgfSwgW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTYWxlc0FkZG9uc1dpdGhOb1BhcmVudChwa2c6IFBhY2thZ2UsIHByb2R1Y3RzOiBQcm9kdWN0W10sIGFkZG9uczogQWRkb25bXSk6IFNhbGVzQWRkb25bXSB7XG4gIGlmICghYWRkb25zIHx8IGFkZG9ucy5sZW5ndGggPCAxIHx8ICFwa2cuYWRkb25fa2V5cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9kdWN0TWFwOiBNYXA8c3RyaW5nLCBQcm9kdWN0PiA9IG5ldyBNYXA8c3RyaW5nLCBQcm9kdWN0PigpO1xuICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0KSA9PiBwcm9kdWN0TWFwLnNldChwcm9kdWN0LnByb2R1Y3RJZCwgcHJvZHVjdCkpO1xuICBjb25zdCBhZGRvbnNNYXA6IE1hcDxzdHJpbmcsIEFkZG9uPiA9IG5ldyBNYXA8c3RyaW5nLCBBZGRvbj4oKTtcbiAgYWRkb25zLmZvckVhY2goKGFkZG9uKSA9PiBhZGRvbnNNYXAuc2V0KGFkZG9uLmFkZG9uSWQsIGFkZG9uKSk7XG5cbiAgY29uc3QgYWRkb25zV2l0aE5vUGFyZW50ID0gcGtnLmFkZG9uX2tleXMucmVkdWNlPFNhbGVzQWRkb25bXT4oXG4gICAgKGFkZG9uQXJyYXk6IFNhbGVzQWRkb25bXSwgYWRkb25LZXk6IEFkZG9uS2V5KTogU2FsZXNBZGRvbltdID0+IHtcbiAgICAgIGlmIChwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLnNvbWUoKHByb2R1Y3RJZCkgPT4gcHJvZHVjdElkID09PSBhZGRvbktleS5hcHBJZCkpIHtcbiAgICAgICAgcmV0dXJuIGFkZG9uQXJyYXkgfHwgW107XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQcm9kdWN0ID0gcHJvZHVjdE1hcC5nZXQoYWRkb25LZXkuYXBwSWQpO1xuICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lm5hbWUgOiBudWxsO1xuICAgICAgY29uc3QgcGFyZW50SWNvbiA9IHBhcmVudFByb2R1Y3QgPyBwYXJlbnRQcm9kdWN0Lmljb25VcmwgOiBudWxsO1xuICAgICAgY29uc3QgcXVhbnRpdHkgPSBhZGRvbktleS5xdWFudGl0eSB8fCAxO1xuICAgICAgY29uc3QgYWRkb246IEFkZG9uID0gYWRkb25zTWFwLmdldChhZGRvbktleS5hZGRvbklkKTsgLy8gY291bGQgYmUgdW5kZWZpbmVkXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspIHtcbiAgICAgICAgYWRkb25BcnJheS5wdXNoKGNyZWF0ZVNhbGVzQWRkb24oYWRkb24sIHBhcmVudE5hbWUsIHBhcmVudEljb24pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZGRvbkFycmF5O1xuICAgIH0sXG4gICAgW10sXG4gICk7XG4gIHJldHVybiBhZGRvbnNXaXRoTm9QYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNhbGVzUHJvZHVjdEZyb21Qcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QgfCBQcm9kdWN0V2l0aFBhcmVudCwgYWRkb25zOiBBZGRvbltdKTogU2FsZXNQcm9kdWN0IHtcbiAgaWYgKCFwcm9kdWN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFhZGRvbnMgfHwgYWRkb25zLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3QsIG51bGwpO1xuICB9XG5cbiAgY29uc3QgcHJvZHVjdEFkZG9ucyA9IGFkZG9ucy5maWx0ZXIoKGFkZG9uKSA9PiBhZGRvbi5hcHBJZCA9PT0gcHJvZHVjdC5wcm9kdWN0SWQpO1xuICBjb25zdCBzYWxlc0FkZG9ucyA9IGNyZWF0ZVNhbGVzQWRkb25zKHByb2R1Y3RBZGRvbnMpO1xuICByZXR1cm4gY3JlYXRlU2FsZXNQcm9kdWN0KHByb2R1Y3QsIHNhbGVzQWRkb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQYWNrYWdlKFxuICBwa2c6IFBhY2thZ2UsXG4gIHNhbGVzUHJvZHVjdHM6IFNhbGVzUHJvZHVjdFtdLFxuICBhZGRvbnNXaXRoTm9QYXJlbnQ6IFNhbGVzQWRkb25bXSxcbik6IFNhbGVzUGFja2FnZSB7XG4gIGxldCB0b3RhbEFkZG9ucyA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIHBrZy5hZGRvbl9rZXlzIHx8IFtdKSB7XG4gICAgdG90YWxBZGRvbnMgKz0ga2V5LnF1YW50aXR5IHx8IDE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcGtnLnByaWNlU3RyaW5ncy5qb2luKCcsICcpLFxuICAgIHBhY2thZ2VJZDogcGtnLnNvbHV0aW9uX2lkLFxuICAgIG5hbWU6IHBrZy5uYW1lLFxuICAgIGljb246IHBrZy5pY29uLFxuICAgIHByb2R1Y3RJZHM6IHBrZy5wcm9kdWN0cyxcbiAgICBwcm9kdWN0czogc2FsZXNQcm9kdWN0cyB8fCBbXSxcbiAgICBhZGRvbnNXaXRoTm9QYXJlbnQ6IGFkZG9uc1dpdGhOb1BhcmVudCB8fCBbXSxcbiAgICB0b3RhbEFkZG9uczogdG90YWxBZGRvbnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzUHJvZHVjdChwcm9kdWN0OiBQcm9kdWN0IHwgUHJvZHVjdFdpdGhQYXJlbnQsIHNhbGVzQWRkb25zOiBTYWxlc0FkZG9uW10pOiBTYWxlc1Byb2R1Y3Qge1xuICBsZXQgcGFyZW50SW5mbzogUHJvZHVjdFBhcmVudEluZm87XG4gIGlmIChwcm9kdWN0IGluc3RhbmNlb2YgUHJvZHVjdFdpdGhQYXJlbnQpIHtcbiAgICBwYXJlbnRJbmZvID0ge1xuICAgICAgcGFyZW50SWQ6IHByb2R1Y3QucGFyZW50SWQsXG4gICAgICBwYXJlbnROYW1lOiBwcm9kdWN0LnBhcmVudE5hbWUsXG4gICAgICBwYXJlbnRJY29uVXJsOiBwcm9kdWN0LnBhcmVudEljb25VcmwsXG4gICAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBwcm9kdWN0Lm11bHRpcGxlQWN0aXZhdGlvbnMgfHwgZmFsc2UsXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlZFByaWNlczogcHJvZHVjdC5wcmljZVN0cmluZ3Muam9pbignLCAnKSxcbiAgICBwcm9kdWN0SWQ6IHByb2R1Y3QucHJvZHVjdElkLFxuICAgIG5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICB0YWdsaW5lOiBwcm9kdWN0LnRhZ2xpbmUgfHwgJycsXG4gICAgaWNvbjogcHJvZHVjdC5pY29uVXJsLFxuICAgIGFkZG9uczogc2FsZXNBZGRvbnMgfHwgW10sXG4gICAgZWRpdGlvbklkOiBwcm9kdWN0LmVkaXRpb25JZCxcbiAgICBlZGl0aW9uTmFtZTogcHJvZHVjdC5lZGl0aW9uTmFtZSxcbiAgICBwYXJlbnRJbmZvOiBwYXJlbnRJbmZvLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9ucyhhZGRvbnM6IEFkZG9uW10pOiBTYWxlc0FkZG9uW10ge1xuICByZXR1cm4gYWRkb25zLm1hcCgoYWRkb24pID0+IGNyZWF0ZVNhbGVzQWRkb24oYWRkb24pKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNBZGRvbihhZGRvbjogQWRkb24sIHBhcmVudE5hbWU/OiBzdHJpbmcsIHBhcmVudEljb24/OiBzdHJpbmcpOiBTYWxlc0FkZG9uIHtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnRJZDogYWRkb24uYXBwSWQsXG4gICAgYWRkb25JZDogYWRkb24uYWRkb25JZCxcbiAgICBuYW1lOiBhZGRvbi50aXRsZSxcbiAgICB0YWdsaW5lOiBhZGRvbi50YWdsaW5lIHx8ICcnLFxuICAgIGljb246IGFkZG9uLmljb24gfHwgJycsXG4gICAgbXVsdGlwbGVBY3RpdmF0aW9uczogYWRkb24ubXVsdGlwbGVBY3RpdmF0aW9ucyB8fCBmYWxzZSxcbiAgICBwYXJlbnRJY29uOiBwYXJlbnRJY29uIHx8ICcnLFxuICAgIHBhcmVudE5hbWU6IHBhcmVudE5hbWUgfHwgJycsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMoXG4gIHBrZzogU2FsZXNQYWNrYWdlLFxuICBwcm9kdWN0czogU2FsZXNQcm9kdWN0W10sXG4gIGFkZG9uczogU2FsZXNBZGRvbltdLFxuICBhY3RpdmF0aW9uU3RhdHVzOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtLFxuKTogU2FsZXNQYWNrYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXR0ZWRQcmljZXM6IHBrZy5mb3JtYXR0ZWRQcmljZXMsXG4gICAgcGFja2FnZUlkOiBwa2cucGFja2FnZUlkLFxuICAgIG5hbWU6IHBrZy5uYW1lLFxuICAgIGljb246IHBrZy5pY29uLFxuICAgIHByb2R1Y3RJZHM6IHBrZy5wcm9kdWN0SWRzLFxuICAgIHByb2R1Y3RzOiBwcm9kdWN0cyB8fCBbXSxcbiAgICBhZGRvbnNXaXRoTm9QYXJlbnQ6IGFkZG9ucyB8fCBbXSxcbiAgICBhY3RpdmF0aW9uU3RhdHVzOiBhY3RpdmF0aW9uU3RhdHVzIHx8IG51bGwsXG4gICAgdG90YWxBZGRvbnM6IHBrZy50b3RhbEFkZG9ucyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FsZXNQcm9kdWN0V2l0aFN0YXR1cyhcbiAgcHJvZHVjdDogU2FsZXNQcm9kdWN0LFxuICBhZGRvbnM6IFNhbGVzQWRkb25bXSxcbiAgYWN0aXZhdGlvblN0YXR1czogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSxcbik6IFNhbGVzUHJvZHVjdCB7XG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVkUHJpY2VzOiBwcm9kdWN0LmZvcm1hdHRlZFByaWNlcyxcbiAgICBwcm9kdWN0SWQ6IHByb2R1Y3QucHJvZHVjdElkLFxuICAgIG5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICBlZGl0aW9uSWQ6IHByb2R1Y3QuZWRpdGlvbklkLFxuICAgIGVkaXRpb25OYW1lOiBwcm9kdWN0LmVkaXRpb25OYW1lLFxuICAgIHRhZ2xpbmU6IHByb2R1Y3QudGFnbGluZSxcbiAgICBpY29uOiBwcm9kdWN0Lmljb24sXG4gICAgYWRkb25zOiBhZGRvbnMgfHwgW10sXG4gICAgYWN0aXZhdGlvblN0YXR1czogYWN0aXZhdGlvblN0YXR1cyB8fCBudWxsLFxuICAgIHBhcmVudEluZm86IHByb2R1Y3QucGFyZW50SW5mbyB8fCBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTYWxlc0FkZG9uV2l0aFN0YXR1cyhhZGRvbjogU2FsZXNBZGRvbiwgYWN0aXZhdGlvblN0YXR1czogU3RhdHVzTm90aWZpY2F0aW9uSXRlbSk6IFNhbGVzQWRkb24ge1xuICByZXR1cm4ge1xuICAgIHBhcmVudElkOiBhZGRvbi5wYXJlbnRJZCxcbiAgICBhZGRvbklkOiBhZGRvbi5hZGRvbklkLFxuICAgIG5hbWU6IGFkZG9uLm5hbWUsXG4gICAgdGFnbGluZTogYWRkb24udGFnbGluZSxcbiAgICBpY29uOiBhZGRvbi5pY29uLFxuICAgIHBhcmVudEljb246IGFkZG9uLnBhcmVudEljb24sXG4gICAgcGFyZW50TmFtZTogYWRkb24ucGFyZW50TmFtZSxcbiAgICBtdWx0aXBsZUFjdGl2YXRpb25zOiBhZGRvbi5tdWx0aXBsZUFjdGl2YXRpb25zIHx8IGZhbHNlLFxuICAgIGFjdGl2YXRpb25TdGF0dXM6IGFjdGl2YXRpb25TdGF0dXMgfHwgbnVsbCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc1BhY2thZ2VzKFxuICBzYWxlc1BhY2thZ2VzOiBTYWxlc1BhY2thZ2VbXSxcbiAgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdLFxuKTogU2FsZXNQYWNrYWdlW10ge1xuICBpZiAoIXN0YXR1c2VzIHx8IHN0YXR1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzYWxlc1BhY2thZ2VzO1xuICB9XG5cbiAgcmV0dXJuIHNhbGVzUGFja2FnZXMubWFwKChzYWxlc1BhY2thZ2UpID0+IHtcbiAgICBjb25zdCBuZXdQcm9kdWN0cyA9IHNhbGVzUGFja2FnZS5wcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+IGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QocHJvZHVjdCwgc3RhdHVzZXMpKTtcblxuICAgIGNvbnN0IG5ld0FkZG9uc1dpdGhOb1BhcmVudCA9IHNhbGVzUGFja2FnZS5hZGRvbnNXaXRoTm9QYXJlbnQubWFwKChhZGRvbikgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgYWRkb24uYWRkb25JZCk7XG4gICAgICByZXR1cm4gYWRkU3RhdHVzZXNUb1NhbGVzQWRkb24oYWRkb24sIHN0YXR1cyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9kdWN0U3RhdHVzZXMgPSBuZXdQcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+IHByb2R1Y3QuYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpO1xuICAgIGNvbnN0IGFkZG9uU3RhdHVzZXMgPSBuZXdQcm9kdWN0c1xuICAgICAgLm1hcCgocHJvZHVjdCkgPT4gKHByb2R1Y3QuYWRkb25zID8gcHJvZHVjdC5hZGRvbnMubWFwKChhZGRvbikgPT4gYWRkb24uYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMpIDogW10pKVxuICAgICAgLnJlZHVjZSgoc3RhdHVzTGlzdCwgcmVkdWNlZExpc3QpID0+IHJlZHVjZWRMaXN0LmNvbmNhdChzdGF0dXNMaXN0KSwgW10pO1xuICAgIGNvbnN0IGFkZG9uc1dpdGhOb1BhcmVudFN0YXR1c2VzID0gbmV3QWRkb25zV2l0aE5vUGFyZW50Lm1hcCgoYWRkb24pID0+XG4gICAgICBhZGRvbi5hY3RpdmF0aW9uU3RhdHVzID8gYWRkb24uYWN0aXZhdGlvblN0YXR1cy5zdGF0dXMgOiBudWxsLFxuICAgICk7XG4gICAgY29uc3QgYWxsU3RhdHVzZXMgPSBbLi4ucHJvZHVjdFN0YXR1c2VzLCAuLi5hZGRvblN0YXR1c2VzLCAuLi5hZGRvbnNXaXRoTm9QYXJlbnRTdGF0dXNlc107XG5cbiAgICBjb25zdCBwYWNrYWdlU3RhdHVzID0gY29udmVydE51bWJlclRvQWN0aXZhdGlvblN0YXR1cyhNYXRoLm1heCguLi5hbGxTdGF0dXNlcykpO1xuICAgIGNvbnN0IHN0YXR1c05vdGlmaWNhdGlvbiA9IGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlKHBhY2thZ2VTdGF0dXMpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZVNhbGVzUGFja2FnZVdpdGhTdGF0dXMoc2FsZXNQYWNrYWdlLCBuZXdQcm9kdWN0cywgbmV3QWRkb25zV2l0aE5vUGFyZW50LCBzdGF0dXNOb3RpZmljYXRpb24pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QoXG4gIHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCxcbiAgc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdLFxuKTogU2FsZXNQcm9kdWN0IHtcbiAgaWYgKCFzdGF0dXNlcyB8fCBzdGF0dXNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxuICBjb25zdCBwcm9kdWN0U3RhdHVzID0gZmluZFN0YXR1cyhzdGF0dXNlcywgcHJvZHVjdC5wcm9kdWN0SWQpO1xuICBjb25zdCBzdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0ocHJvZHVjdFN0YXR1cyk7XG4gIGlmICghcHJvZHVjdC5hZGRvbnMpIHtcbiAgICByZXR1cm4gY3JlYXRlU2FsZXNQcm9kdWN0V2l0aFN0YXR1cyhwcm9kdWN0LCBudWxsLCBzdGF0dXNOb3RpZmljYXRpb24pO1xuICB9XG5cbiAgY29uc3QgbmV3U2FsZXNBZGRvbnMgPSBwcm9kdWN0LmFkZG9ucy5tYXAoKGFkZG9uKSA9PiB7XG4gICAgY29uc3QgYWRkb25TdGF0dXMgPSBmaW5kU3RhdHVzKHN0YXR1c2VzLCBhZGRvbi5hZGRvbklkKTtcbiAgICByZXR1cm4gYWRkU3RhdHVzZXNUb1NhbGVzQWRkb24oYWRkb24sIGFkZG9uU3RhdHVzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNhbGVzUHJvZHVjdFdpdGhTdGF0dXMocHJvZHVjdCwgbmV3U2FsZXNBZGRvbnMsIHN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGFkZFN0YXR1c2VzVG9TYWxlc0FkZG9uKGFkZG9uOiBTYWxlc0FkZG9uLCBzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTYWxlc0FkZG9uIHtcbiAgY29uc3QgYWRkb25TdGF0dXNOb3RpZmljYXRpb24gPSBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZUl0ZW0oc3RhdHVzKTtcbiAgcmV0dXJuIGNyZWF0ZVNhbGVzQWRkb25XaXRoU3RhdHVzKGFkZG9uLCBhZGRvblN0YXR1c05vdGlmaWNhdGlvbik7XG59XG5cbmZ1bmN0aW9uIGZpbmRTdGF0dXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdLCBpZDogc3RyaW5nKTogQWN0aXZhdGlvblN0YXR1cyB7XG4gIGlmICghc3RhdHVzZXMgfHwgc3RhdHVzZXMubGVuZ3RoIDw9IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGF0dXNJbmRleCA9IHN0YXR1c2VzLmZpbmRJbmRleCgocykgPT4ge1xuICAgIHJldHVybiBzLnBhY2thZ2VJdGVtSWQgPT09IGlkO1xuICB9KTtcbiAgaWYgKHN0YXR1c0luZGV4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0YXR1cyA9IHN0YXR1c2VzW3N0YXR1c0luZGV4XS5zdGF0dXM7XG4gIHN0YXR1c2VzLnNwbGljZShzdGF0dXNJbmRleCwgMSk7XG4gIHJldHVybiBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c05vdGlmaWNhdGlvbkl0ZW1Gb3JQYWNrYWdlSXRlbShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7IGljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0ZST05URU5ELlNUT1JFLkFDVElWQVRJT05fU1RBVFVTLkFDVElWQVRFRCcgfTtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuV0FSTklORzpcbiAgICAgIHJldHVybiB7IGljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdGUk9OVEVORC5TVE9SRS5BQ1RJVkFUSU9OX1NUQVRVUy5BTFJFQURZX0FDVElWQVRFRCcgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgaWNvbjogJ2Vycm9yJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdGUk9OVEVORC5TVE9SRS5BQ1RJVkFUSU9OX1NUQVRVUy5BQ1RJVkFUSU9OX0VSUk9SUycgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0dXNOb3RpZmljYXRpb25JdGVtRm9yUGFja2FnZShzdGF0dXM6IEFjdGl2YXRpb25TdGF0dXMpOiBTdGF0dXNOb3RpZmljYXRpb25JdGVtIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuU1VDQ0VTUzpcbiAgICAgIHJldHVybiB7IGljb246ICdjaGVja19jaXJjbGUnLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0ZST05URU5ELlNUT1JFLkFDVElWQVRJT05fU1RBVFVTLkFDVElWQVRFRCcgfTtcbiAgICBjYXNlIEFjdGl2YXRpb25TdGF0dXMuV0FSTklORzpcbiAgICAgIHJldHVybiB7IGljb246ICd3YXJuaW5nJywgc3RhdHVzOiBzdGF0dXMsIHRleHQ6ICdGUk9OVEVORC5TVE9SRS5BQ1RJVkFUSU9OX1NUQVRVUy5BQ1RJVkFUSU9OX1dBUk5JTkdTJyB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBpY29uOiAnZXJyb3InLCBzdGF0dXM6IHN0YXR1cywgdGV4dDogJ0ZST05URU5ELlNUT1JFLkFDVElWQVRJT05fU1RBVFVTLkFDVElWQVRJT05fRVJST1JTX09DQ1VSUkVEJyB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROdW1iZXJUb0FjdGl2YXRpb25TdGF0dXMobnVtYmVyOiBOdW1iZXIpOiBBY3RpdmF0aW9uU3RhdHVzIHtcbiAgc3dpdGNoIChudW1iZXIpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gQWN0aXZhdGlvblN0YXR1cy5TVUNDRVNTO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLldBUk5JTkc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBBY3RpdmF0aW9uU3RhdHVzLkVSUk9SO1xuICB9XG59XG4iXX0=