UNPKG

kwikid-forms

Version:

KwikID's JSON Configuration based Forms Renderer and Builder

364 lines 45.5 kB
import { TuiDay, TuiTime } from "@taiga-ui/cdk"; import { checkObjectKeyExists, isEmptyValue, isNotEmptyValue, isObject, setMissingKeyValue } from "kwikid-toolkit"; import { EFieldType } from "../definitions/form-view.fields.definition"; export const getFormFieldByKey = (fields, key) => { return fields.find((field) => field.key === key); }; export const getFormFieldIndexByKey = (fields, key) => { const fieldIndex = fields.findIndex((_) => { return key === _.key; }); return fieldIndex; }; export const highlightFormFieldError = (field, error) => { field.invalid = error; field.focus = error; return field; }; export const appendHtmlMessage = (field, message) => { if (checkObjectKeyExists(field, "html")) { if (isNotEmptyValue(field.html)) { const html = field.html.replace("{{message}}", message.message); field.html = html; } } return field; }; export const appendFormFieldMessage = (field, message) => { const hasDuplicateMessage = (messages, message) => { return messages.some((fieldMessage) => { return (fieldMessage.type === message.type && fieldMessage.message === message.message); }); }; field.messages = []; if (checkObjectKeyExists(field, "messages")) { if (!hasDuplicateMessage(field.messages, message)) { field.messages.push({ type: message.type, message: message.message }); } } else { field.messages = [{ type: message.type, message: message.message }]; } return field; }; export const filterDuplicatesMediaFiles = (array) => { const uniqueFiles = new Set(); return array.filter((mediaFile) => { if (!uniqueFiles.has(mediaFile)) { uniqueFiles.add(mediaFile); return true; } return false; }); }; export const filterDuplicatesFiles = (array) => { const uniqueFiles = new Set(); return array.filter((file) => { const fileKey = `${file.name}-${file.size}`; if (!uniqueFiles.has(fileKey)) { uniqueFiles.add(fileKey); return true; } return false; }); }; export const removeFormFieldMessage = (field, message) => { if (isNotEmptyValue(field === null || field === void 0 ? void 0 : field.messages)) { field.messages = field.messages.filter((fieldMessage) => { return fieldMessage.type !== message.type; }); } else { field.messages = []; } return field; }; export const setApiTimerMessage = (field, timer = {}) => { if (checkObjectKeyExists(field, "api")) { field.api.timer = timer; } else { setMissingKeyValue(field, "api", { timer }); } return field; }; export function showFormFieldError(fields, errors, key, error) { const fieldIndex = fields.findIndex((field) => { return field.key === key; }); const setErrorMessages = (field, errors) => { const getErrorMessage = (fieldLabel, errorType) => { let errorMessage = ""; switch (errorType) { case "required": errorMessage = `${fieldLabel} is required!`; break; case "email": errorMessage = `${fieldLabel} has wrong email format!`; break; case "min": errorMessage = `${fieldLabel} has wrong value! Minimum value: ${field.validators.min}`; break; case "minlength": errorMessage = `${fieldLabel} has wrong length! Required minimum length: ${field.validators.minLength}`; break; case "max": errorMessage = `${fieldLabel} has wrong value! Maximum value: ${field.validators.maxLength}`; break; case "maxlength": errorMessage = `${fieldLabel} has wrong length! Required maximum length: ${field.validators.maxLength}`; break; case "areEqual": errorMessage = `${fieldLabel} must be equal!`; break; case "pattern": errorMessage = `${fieldLabel} is in incorrect format!`; break; case "onlyWhitespaces": errorMessage = `${fieldLabel} can't contain only empty spaces!`; break; default: errorMessage = `${fieldLabel}: ${errorType}`; break; } return errorMessage; }; Object.keys(errors).forEach((error) => { field = appendFormFieldMessage(field, { type: "error", message: getErrorMessage(field.label, error) }); }); return field; }; if (error) { fields[fieldIndex] = setErrorMessages(fields[fieldIndex], errors); } else { fields[fieldIndex].messages = []; } fields[fieldIndex] = highlightFormFieldError(fields[fieldIndex], error); return fields; } export const convertFormFieldTypeDateToKwikUIFormat = (date) => { const splitDate = date.split("-"); const tuiDay = new TuiDay(Number(splitDate[2]), // Year Number(splitDate[1]) - 1, // Month, Why '-1' => Because Taiga-UI Required It, So... Number(splitDate[0]) // Day ); return tuiDay; }; export const convertFormFieldTypeTimeToKwikUIFormat = (time) => { const timeParts = time.split(/[.:]/); let hours = 0; let minutes = 0; let seconds = 0; let milliseconds = 0; if (timeParts.length >= 2) { hours = parseInt(timeParts[0], 10); minutes = parseInt(timeParts[1], 10); if (timeParts.length >= 3) { seconds = parseInt(timeParts[2], 10); if (timeParts.length === 4) { milliseconds = parseInt(timeParts[3], 10); } } } const tuiTime = new TuiTime(hours, minutes, seconds, milliseconds); return tuiTime; }; export const convertFormFieldTypeDateToStandardFormat = (date) => { const { day, month, year } = date; const formattedDate = `${day.toString().padStart(2, "0")}-${(month + 1) .toString() .padStart(2, "0")}-${year}`; return formattedDate; }; export const convertFormFieldTypeTimeToStandardFormat = (time) => { const hour = time.hours; const { seconds, minutes } = time; const milliseconds = time.ms; const formattedDate = `${hour.toString().padStart(2, "0")}:${minutes .toString() .padStart(2, "0")}${seconds > 0 ? `:${seconds.toString().padStart(2, "0")}` : ""}${seconds > 0 && milliseconds > 0 ? `:${milliseconds.toString().padStart(2, "0")}` : ""}`; return formattedDate; }; export const convertFormFieldValueToStandardFormat = (field, value) => { let convertedValue = value; if (isNotEmptyValue(value)) { switch (field.type) { case EFieldType.DATE: if (typeof value !== "string") { convertedValue = convertFormFieldTypeDateToStandardFormat(value); } break; case EFieldType.TIME: if (typeof value !== "string") { convertedValue = convertFormFieldTypeTimeToStandardFormat(value); } break; case EFieldType.RADIO: convertedValue = value.label; break; case EFieldType.SELECT: if (Array.isArray(field.options)) { const foundItem = field.options.find((item) => { return isObject(item) && item.title === value; }); if (foundItem) { convertedValue = foundItem.value; } } break; case EFieldType.PHONE: { const phoneField = field; if (phoneField.properties.removeCountryCodeFromValue) { convertedValue = value .toString() .replace(phoneField.properties.countryCode, ""); } break; } case EFieldType.CAPTURE: if (Array.isArray(value) && isNotEmptyValue(value[0])) { convertedValue = value[0]; } else if (typeof value !== "string" || (typeof value === "string" && isEmptyValue(value))) { convertedValue = ""; } break; case EFieldType.RECORD: if (Array.isArray(value) && isNotEmptyValue(value[0])) { convertedValue = value[0]; } else if (typeof value !== "string" || (typeof value === "string" && isEmptyValue(value))) { convertedValue = ""; } break; default: break; } } else { convertedValue = ""; } return convertedValue; }; export const convertFormFieldEmptyValueToKwikUIFormat = (field) => { const fieldType = field.type; let value; switch (fieldType) { case EFieldType.CHECKBOX: value = false; break; case EFieldType.NUMBER: value = null; break; case EFieldType.DATE: value = null; break; case EFieldType.FILE: value = []; break; case EFieldType.CAPTURE: value = []; break; case EFieldType.RECORD: value = []; break; case EFieldType.SELECT: value = null; break; case EFieldType.DROPDOWN_WITH_SEARCH: value = null; break; default: value = ""; break; } return value; }; export const convertFormFieldValueToKwikUIFormat = (field, value) => { let convertedValue = value; if (isNotEmptyValue(value)) { switch (field.type) { case EFieldType.RADIO: if (!checkObjectKeyExists(value, "label")) { const radioField = field; const convertedLabelValue = radioField.options.find((item) => { return item.label === value; }); convertedValue = convertedLabelValue; } break; case EFieldType.SELECT: if (Array.isArray(field.options)) { const foundItem = field.options.find((item) => { return isObject(item) && item.value === value; }); if (foundItem) { convertedValue = foundItem.title; } } break; case EFieldType.DATE: convertedValue = convertFormFieldTypeDateToKwikUIFormat(value); break; case EFieldType.TIME: convertedValue = convertFormFieldTypeTimeToKwikUIFormat(value); break; case EFieldType.FILE: convertedValue = value; break; case EFieldType.CAPTURE: if (Array.isArray(value)) { convertedValue = value.filter((item) => { return (typeof item === "string" || (isObject(item) && checkObjectKeyExists(item, "image"))); }); } else if (typeof value === "string") { convertedValue = [value]; } else if (isObject(value) && checkObjectKeyExists(value, "image")) { convertedValue = [value]; } else { convertedValue = []; } break; case EFieldType.RECORD: if (Array.isArray(value)) { convertedValue = value.filter((item) => { return (typeof item === "string" || (isObject(item) && checkObjectKeyExists(item, "video"))); }); } else if (typeof value === "string") { convertedValue = [value]; } else if (isObject(value) && checkObjectKeyExists(value, "video")) { convertedValue = [value]; } else { convertedValue = []; } break; default: break; } } else { convertedValue = convertFormFieldEmptyValueToKwikUIFormat(field); } return convertedValue; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmZpZWxkcy5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9mb3JtLXZpZXcvaGVscGVycy9mb3JtLXZpZXcuZmllbGRzLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixlQUFlLEVBQ2YsUUFBUSxFQUNSLGtCQUFrQixFQUNuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxVQUFVLEVBSVgsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQWEsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUM5RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxNQUFhLEVBQUUsR0FBVyxFQUFFLEVBQUU7SUFDbkUsTUFBTSxVQUFVLEdBQVcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1FBQ3JELE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxLQUFVLEVBQU8sRUFBRTtJQUNyRSxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN0QixLQUFLLENBQUMsS0FBSyxH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QUMsS0FBSyxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUdWlEYXksIFR1aVRpbWUgfSBmcm9tIFwiQHRhaWdhLXVpL2Nka1wiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RLZXlFeGlzdHMsXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlLFxuICBpc09iamVjdCxcbiAgc2V0TWlzc2luZ0tleVZhbHVlXG59IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0IHtcbiAgRUZpZWxkVHlwZSxcbiAgVEZpZWxkLFxuICBURmllbGRQaG9uZSxcbiAgVEZpZWxkVHlwZVxufSBmcm9tIFwiLi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmZpZWxkcy5kZWZpbml0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRGb3JtRmllbGRCeUtleSA9IChmaWVsZHM6IGFueVtdLCBrZXk6IHN0cmluZykgPT4ge1xuICByZXR1cm4gZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IGtleSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9ybUZpZWxkSW5kZXhCeUtleSA9IChmaWVsZHM6IGFueVtdLCBrZXk6IHN0cmluZykgPT4ge1xuICBjb25zdCBmaWVsZEluZGV4OiBudW1iZXIgPSBmaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICByZXR1cm4ga2V5ID09PSBfLmtleTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZpZWxkSW5kZXg7XG59O1xuXG5leHBvcnQgY29uc3QgaGlnaGxpZ2h0Rm9ybUZpZWxkRXJyb3IgPSAoZmllbGQ6IGFueSwgZXJyb3I6IGFueSk6IGFueSA9PiB7XG4gIGZpZWxkLmludmFsaWQgPSBlcnJvcjtcbiAgZmllbGQuZm9jdXMgPSBlcnJvcjtcblxuICByZXR1cm4gZmllbGQ7XG59O1xuXG5leHBvcnQgY29uc3QgYXBwZW5kSHRtbE1lc3NhZ2UgPSAoXG4gIGZpZWxkOiBhbnksXG4gIG1lc3NhZ2U6IHsgbWVzc2FnZTogc3RyaW5nIH1cbik6IGFueSA9PiB7XG4gIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJodG1sXCIpKSB7XG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZShmaWVsZC5odG1sKSkge1xuICAgICAgY29uc3QgaHRtbCA9IGZpZWxkLmh0bWwucmVwbGFjZShcInt7bWVzc2FnZX19XCIsIG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICBmaWVsZC5odG1sID0gaHRtbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmllbGQ7XG59O1xuXG5leHBvcnQgY29uc3QgYXBwZW5kRm9ybUZpZWxkTWVzc2FnZSA9IChcbiAgZmllbGQ6IGFueSxcbiAgbWVzc2FnZTogeyB0eXBlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9XG4pOiBhbnkgPT4ge1xuICBjb25zdCBoYXNEdXBsaWNhdGVNZXNzYWdlID0gKFxuICAgIG1lc3NhZ2VzOiB7IHR5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1bXSxcbiAgICBtZXNzYWdlOiB7IHR5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1cbiAgKSA9PiB7XG4gICAgcmV0dXJuIG1lc3NhZ2VzLnNvbWUoKGZpZWxkTWVzc2FnZTogeyB0eXBlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBmaWVsZE1lc3NhZ2UudHlwZSA9PT0gbWVzc2FnZS50eXBlICYmXG4gICAgICAgIGZpZWxkTWVzc2FnZS5tZXNzYWdlID09PSBtZXNzYWdlLm1lc3NhZ2VcbiAgICAgICk7XG4gICAgfSk7XG4gIH07XG5cbiAgZmllbGQubWVzc2FnZXMgPSBbXTtcblxuICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWVzc2FnZXNcIikpIHtcbiAgICBpZiAoIWhhc0R1cGxpY2F0ZU1lc3NhZ2UoZmllbGQubWVzc2FnZXMsIG1lc3NhZ2UpKSB7XG4gICAgICBmaWVsZC5tZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgdHlwZTogbWVzc2FnZS50eXBlLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWVsZC5tZXNzYWdlcyA9IFt7IHR5cGU6IG1lc3NhZ2UudHlwZSwgbWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlIH1dO1xuICB9XG5cbiAgcmV0dXJuIGZpZWxkO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlckR1cGxpY2F0ZXNNZWRpYUZpbGVzID0gKGFycmF5OiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgdW5pcXVlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICByZXR1cm4gYXJyYXkuZmlsdGVyKChtZWRpYUZpbGUpID0+IHtcbiAgICBpZiAoIXVuaXF1ZUZpbGVzLmhhcyhtZWRpYUZpbGUpKSB7XG4gICAgICB1bmlxdWVGaWxlcy5hZGQobWVkaWFGaWxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlckR1cGxpY2F0ZXNGaWxlcyA9IChhcnJheTogYW55W10pOiBhbnlbXSA9PiB7XG4gIGNvbnN0IHVuaXF1ZUZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlS2V5ID0gYCR7ZmlsZS5uYW1lfS0ke2ZpbGUuc2l6ZX1gO1xuICAgIGlmICghdW5pcXVlRmlsZXMuaGFzKGZpbGVLZXkpKSB7XG4gICAgICB1bmlxdWVGaWxlcy5hZGQoZmlsZUtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVGb3JtRmllbGRNZXNzYWdlID0gKFxuICBmaWVsZDogYW55LFxuICBtZXNzYWdlOiB7IHR5cGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1cbik6IGFueSA9PiB7XG4gIGlmIChpc05vdEVtcHR5VmFsdWUoZmllbGQ/Lm1lc3NhZ2VzKSkge1xuICAgIGZpZWxkLm1lc3NhZ2VzID0gZmllbGQubWVzc2FnZXMuZmlsdGVyKChmaWVsZE1lc3NhZ2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE1lc3NhZ2UudHlwZSAhPT0gbWVzc2FnZS50eXBlO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpZWxkLm1lc3NhZ2VzID0gW107XG4gIH1cblxuICByZXR1cm4gZmllbGQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0QXBpVGltZXJNZXNzYWdlID0gKGZpZWxkLCB0aW1lciA9IHt9KSA9PiB7XG4gIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJhcGlcIikpIHtcbiAgICBmaWVsZC5hcGkudGltZXIgPSB0aW1lcjtcbiAgfSBlbHNlIHtcbiAgICBzZXRNaXNzaW5nS2V5VmFsdWUoZmllbGQsIFwiYXBpXCIsIHsgdGltZXIgfSk7XG4gIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dGb3JtRmllbGRFcnJvcihcbiAgZmllbGRzOiBhbnksXG4gIGVycm9yczogYW55LFxuICBrZXk6IHN0cmluZyxcbiAgZXJyb3I6IGJvb2xlYW5cbikge1xuICBjb25zdCBmaWVsZEluZGV4ID0gZmllbGRzLmZpbmRJbmRleCgoZmllbGQ6IGFueSkgPT4ge1xuICAgIHJldHVybiBmaWVsZC5rZXkgPT09IGtleTtcbiAgfSk7XG5cbiAgY29uc3Qgc2V0RXJyb3JNZXNzYWdlcyA9IChmaWVsZDogYW55LCBlcnJvcnM6IGFueSkgPT4ge1xuICAgIGNvbnN0IGdldEVycm9yTWVzc2FnZSA9IChmaWVsZExhYmVsOiBzdHJpbmcsIGVycm9yVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gaXMgcmVxdWlyZWQhYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gaGFzIHdyb25nIGVtYWlsIGZvcm1hdCFgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gaGFzIHdyb25nIHZhbHVlISBNaW5pbXVtIHZhbHVlOiAke2ZpZWxkLnZhbGlkYXRvcnMubWlufWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtaW5sZW5ndGhcIjpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtmaWVsZExhYmVsfSBoYXMgd3JvbmcgbGVuZ3RoISBSZXF1aXJlZCBtaW5pbXVtIGxlbmd0aDogJHtmaWVsZC52YWxpZGF0b3JzLm1pbkxlbmd0aH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gaGFzIHdyb25nIHZhbHVlISBNYXhpbXVtIHZhbHVlOiAke2ZpZWxkLnZhbGlkYXRvcnMubWF4TGVuZ3RofWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtYXhsZW5ndGhcIjpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtmaWVsZExhYmVsfSBoYXMgd3JvbmcgbGVuZ3RoISBSZXF1aXJlZCBtYXhpbXVtIGxlbmd0aDogJHtmaWVsZC52YWxpZGF0b3JzLm1heExlbmd0aH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXJlRXF1YWxcIjpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtmaWVsZExhYmVsfSBtdXN0IGJlIGVxdWFsIWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gaXMgaW4gaW5jb3JyZWN0IGZvcm1hdCFgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwib25seVdoaXRlc3BhY2VzXCI6XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZmllbGRMYWJlbH0gY2FuJ3QgY29udGFpbiBvbmx5IGVtcHR5IHNwYWNlcyFgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGAke2ZpZWxkTGFiZWx9OiAke2Vycm9yVHlwZX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JNZXNzYWdlO1xuICAgIH07XG5cbiAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICBmaWVsZCA9IGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIHtcbiAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICBtZXNzYWdlOiBnZXRFcnJvck1lc3NhZ2UoZmllbGQubGFiZWwsIGVycm9yKVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgZmllbGRzW2ZpZWxkSW5kZXhdID0gc2V0RXJyb3JNZXNzYWdlcyhmaWVsZHNbZmllbGRJbmRleF0sIGVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgZmllbGRzW2ZpZWxkSW5kZXhdLm1lc3NhZ2VzID0gW107XG4gIH1cblxuICBmaWVsZHNbZmllbGRJbmRleF0gPSBoaWdobGlnaHRGb3JtRmllbGRFcnJvcihmaWVsZHNbZmllbGRJbmRleF0sIGVycm9yKTtcblxuICByZXR1cm4gZmllbGRzO1xufVxuXG5leHBvcnQgY29uc3QgY29udmVydEZvcm1GaWVsZFR5cGVEYXRlVG9Ld2lrVUlGb3JtYXQgPSAoXG4gIGRhdGU6IHN0cmluZ1xuKTogVHVpRGF5ID0+IHtcbiAgY29uc3Qgc3BsaXREYXRlID0gZGF0ZS5zcGxpdChcIi1cIik7XG4gIGNvbnN0IHR1aURheSA9IG5ldyBUdWlEYXkoXG4gICAgTnVtYmVyKHNwbGl0RGF0ZVsyXSksIC8vIFllYXJcbiAgICBOdW1iZXIoc3BsaXREYXRlWzFdKSAtIDEsIC8vIE1vbnRoLCBXaHkgJy0xJyA9PiBCZWNhdXNlIFRhaWdhLVVJIFJlcXVpcmVkIEl0LCBTby4uLlxuICAgIE51bWJlcihzcGxpdERhdGVbMF0pIC8vIERheVxuICApO1xuXG4gIHJldHVybiB0dWlEYXk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEZvcm1GaWVsZFR5cGVUaW1lVG9Ld2lrVUlGb3JtYXQgPSAoXG4gIHRpbWU6IHN0cmluZ1xuKTogVHVpVGltZSA9PiB7XG4gIGNvbnN0IHRpbWVQYXJ0cyA9IHRpbWUuc3BsaXQoL1suOl0vKTtcbiAgbGV0IGhvdXJzID0gMDtcbiAgbGV0IG1pbnV0ZXMgPSAwO1xuICBsZXQgc2Vjb25kcyA9IDA7XG4gIGxldCBtaWxsaXNlY29uZHMgPSAwO1xuXG4gIGlmICh0aW1lUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICBob3VycyA9IHBhcnNlSW50KHRpbWVQYXJ0c1swXSwgMTApO1xuICAgIG1pbnV0ZXMgPSBwYXJzZUludCh0aW1lUGFydHNbMV0sIDEwKTtcblxuICAgIGlmICh0aW1lUGFydHMubGVuZ3RoID49IDMpIHtcbiAgICAgIHNlY29uZHMgPSBwYXJzZUludCh0aW1lUGFydHNbMl0sIDEwKTtcbiAgICAgIGlmICh0aW1lUGFydHMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIG1pbGxpc2Vjb25kcyA9IHBhcnNlSW50KHRpbWVQYXJ0c1szXSwgMTApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHR1aVRpbWUgPSBuZXcgVHVpVGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKTtcbiAgcmV0dXJuIHR1aVRpbWU7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEZvcm1GaWVsZFR5cGVEYXRlVG9TdGFuZGFyZEZvcm1hdCA9IChcbiAgZGF0ZTogVHVpRGF5XG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGRheSwgbW9udGgsIHllYXIgfSA9IGRhdGU7XG5cbiAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IGAke2RheS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHsobW9udGggKyAxKVxuICAgIC50b1N0cmluZygpXG4gICAgLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHt5ZWFyfWA7XG5cbiAgcmV0dXJuIGZvcm1hdHRlZERhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEZvcm1GaWVsZFR5cGVUaW1lVG9TdGFuZGFyZEZvcm1hdCA9IChcbiAgdGltZTogVHVpVGltZVxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaG91ciA9IHRpbWUuaG91cnM7XG4gIGNvbnN0IHsgc2Vjb25kcywgbWludXRlcyB9ID0gdGltZTtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gdGltZS5tcztcblxuICBjb25zdCBmb3JtYXR0ZWREYXRlID0gYCR7aG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX06JHttaW51dGVzXG4gICAgLnRvU3RyaW5nKClcbiAgICAucGFkU3RhcnQoMiwgXCIwXCIpfSR7XG4gICAgc2Vjb25kcyA+IDAgPyBgOiR7c2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1gIDogXCJcIlxuICB9JHtcbiAgICBzZWNvbmRzID4gMCAmJiBtaWxsaXNlY29uZHMgPiAwXG4gICAgICA/IGA6JHttaWxsaXNlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9YFxuICAgICAgOiBcIlwiXG4gIH1gO1xuXG4gIHJldHVybiBmb3JtYXR0ZWREYXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQgPSAoXG4gIGZpZWxkOiBURmllbGQsXG4gIHZhbHVlOiBhbnlcbikgPT4ge1xuICBsZXQgY29udmVydGVkVmFsdWU6IGFueSA9IHZhbHVlO1xuXG4gIGlmIChpc05vdEVtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuREFURTpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gY29udmVydEZvcm1GaWVsZFR5cGVEYXRlVG9TdGFuZGFyZEZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuVElNRTpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gY29udmVydEZvcm1GaWVsZFR5cGVUaW1lVG9TdGFuZGFyZEZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuUkFESU86XG4gICAgICAgIGNvbnZlcnRlZFZhbHVlID0gdmFsdWUubGFiZWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLlNFTEVDVDpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQub3B0aW9ucykpIHtcbiAgICAgICAgICBjb25zdCBmb3VuZEl0ZW0gPSBmaWVsZC5vcHRpb25zLmZpbmQoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzT2JqZWN0KGl0ZW0pICYmIGl0ZW0udGl0bGUgPT09IHZhbHVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGZvdW5kSXRlbSkge1xuICAgICAgICAgICAgY29udmVydGVkVmFsdWUgPSBmb3VuZEl0ZW0udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLlBIT05FOiB7XG4gICAgICAgIGNvbnN0IHBob25lRmllbGQgPSBmaWVsZCBhcyBURmllbGRQaG9uZTtcbiAgICAgICAgaWYgKHBob25lRmllbGQucHJvcGVydGllcy5yZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZSkge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShwaG9uZUZpZWxkLnByb3BlcnRpZXMuY291bnRyeUNvZGUsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFRmllbGRUeXBlLkNBUFRVUkU6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBpc05vdEVtcHR5VmFsdWUodmFsdWVbMF0pKSB7XG4gICAgICAgICAgY29udmVydGVkVmFsdWUgPSB2YWx1ZVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlzRW1wdHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5SRUNPUkQ6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBpc05vdEVtcHR5VmFsdWUodmFsdWVbMF0pKSB7XG4gICAgICAgICAgY29udmVydGVkVmFsdWUgPSB2YWx1ZVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlzRW1wdHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb252ZXJ0ZWRWYWx1ZSA9IFwiXCI7XG4gIH1cblxuICByZXR1cm4gY29udmVydGVkVmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEZvcm1GaWVsZEVtcHR5VmFsdWVUb0t3aWtVSUZvcm1hdCA9IChcbiAgZmllbGQ6IFRGaWVsZFxuKTogYW55ID0+IHtcbiAgY29uc3QgZmllbGRUeXBlOiBURmllbGRUeXBlID0gZmllbGQudHlwZTtcbiAgbGV0IHZhbHVlOiBhbnk7XG5cbiAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICBjYXNlIEVGaWVsZFR5cGUuQ0hFQ0tCT1g6XG4gICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFRmllbGRUeXBlLk5VTUJFUjpcbiAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRUZpZWxkVHlwZS5EQVRFOlxuICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFRmllbGRUeXBlLkZJTEU6XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFRmllbGRUeXBlLkNBUFRVUkU6XG4gICAgICB2YWx1ZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFRmllbGRUeXBlLlJFQ09SRDpcbiAgICAgIHZhbHVlID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlIEVGaWVsZFR5cGUuU0VMRUNUOlxuICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBFRmllbGRUeXBlLkRST1BET1dOX1dJVEhfU0VBUkNIOlxuICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvS3dpa1VJRm9ybWF0ID0gKFxuICBmaWVsZDogVEZpZWxkLFxuICB2YWx1ZTogYW55XG4pID0+IHtcbiAgbGV0IGNvbnZlcnRlZFZhbHVlOiBhbnkgPSB2YWx1ZTtcblxuICBpZiAoaXNOb3RFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBFRmllbGRUeXBlLlJBRElPOlxuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbHVlLCBcImxhYmVsXCIpKSB7XG4gICAgICAgICAgY29uc3QgcmFkaW9GaWVsZCA9IGZpZWxkIGFzIGFueTtcbiAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMYWJlbFZhbHVlID0gcmFkaW9GaWVsZC5vcHRpb25zLmZpbmQoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwgPT09IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVkTGFiZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5TRUxFQ1Q6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLm9wdGlvbnMpKSB7XG4gICAgICAgICAgY29uc3QgZm91bmRJdGVtID0gZmllbGQub3B0aW9ucy5maW5kKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpc09iamVjdChpdGVtKSAmJiBpdGVtLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChmb3VuZEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gZm91bmRJdGVtLnRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5EQVRFOlxuICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRGb3JtRmllbGRUeXBlRGF0ZVRvS3dpa1VJRm9ybWF0KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuVElNRTpcbiAgICAgICAgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0Rm9ybUZpZWxkVHlwZVRpbWVUb0t3aWtVSUZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkZJTEU6XG4gICAgICAgIGNvbnZlcnRlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkNBUFRVUkU6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgICAoaXNPYmplY3QoaXRlbSkgJiYgY2hlY2tPYmplY3RLZXlFeGlzdHMoaXRlbSwgXCJpbWFnZVwiKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29udmVydGVkVmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiBjaGVja09iamVjdEtleUV4aXN0cyh2YWx1ZSwgXCJpbWFnZVwiKSkge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gW3ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLlJFQ09SRDpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgY29udmVydGVkVmFsdWUgPSB2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICAgIChpc09iamVjdChpdGVtKSAmJiBjaGVja09iamVjdEtleUV4aXN0cyhpdGVtLCBcInZpZGVvXCIpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA9IFt2YWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpICYmIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbHVlLCBcInZpZGVvXCIpKSB7XG4gICAgICAgICAgY29udmVydGVkVmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0Rm9ybUZpZWxkRW1wdHlWYWx1ZVRvS3dpa1VJRm9ybWF0KGZpZWxkKTtcbiAgfVxuXG4gIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTtcbn07XG4iXX0=