kwikid-components
Version:
KwikID's Components Library
330 lines • 49.3 kB
JavaScript
import { checkObjectPathExists, isEmptyValue, isNotEmptyValue, isObject, mergeObjects, setMissingKeyValue } from "kwikid-toolkit";
import { LOGIN_FORM_CONFIG, LOGIN_FORM_FIELDS } from "./login.constants";
// Function to set privacy policy with default display text if not specified.
export const setPrivacyPolicy = (privacyPolicy) => {
var _a;
let policy;
// Checks if the privacyPolicy object contains a non-empty value.
if (isNotEmptyValue(privacyPolicy)) {
policy = privacyPolicy;
// Sets default display text for the policy if none exists.
policy.displayText = (_a = privacyPolicy === null || privacyPolicy === void 0 ? void 0 : privacyPolicy.displayText) !== null && _a !== void 0 ? _a : "Privacy Policy";
}
return policy;
};
// Function to configure the side panel based on provided settings.
export const setSidePanelConfig = (sidePanel) => {
// Check if sidePanel object contains a non-empty value.
if (isNotEmptyValue(sidePanel)) {
if (sidePanel === null || sidePanel === void 0 ? void 0 : sidePanel.html) {
// Return configuration for HTML content if specified.
return {
html: sidePanel.html
};
}
if (sidePanel === null || sidePanel === void 0 ? void 0 : sidePanel.image) {
// Return configuration for image if specified.
return {
image: sidePanel.image
};
}
if (sidePanel === null || sidePanel === void 0 ? void 0 : sidePanel.animation) {
// Return configuration for animation if specified.
return {
animation: sidePanel.animation
};
}
}
};
// Function to configure form types and fields based on the provided configuration and data.
export const setFormTypeAndFormFields = (config, data) => {
var _a, _b, _c, _d;
const formConfig = LOGIN_FORM_CONFIG;
let formTitle;
// Access specific configurations for login form.
const customFormConfig = config === null || config === void 0 ? void 0 : config.loginConfig;
const isOtpFlow = (_a = config === null || config === void 0 ? void 0 : config.utilityFlags) === null || _a === void 0 ? void 0 : _a.isOtpFlow;
const formType = config === null || config === void 0 ? void 0 : config.formType;
const buttonLabels = (_b = config === null || config === void 0 ? void 0 : config.displaySettings) === null || _b === void 0 ? void 0 : _b.buttonLabels;
let specificFormConfig;
// Configure fields and title for Mobile Login.
if (formType.includes("Mobile")) {
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.mobileLogin, "Mobile Login");
const fields = [LOGIN_FORM_FIELDS.MOBILE_FIELD];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.mobileLogin, fields);
// Add Terms and Conditions Field based on Config
if (config === null || config === void 0 ? void 0 : config.tncOnStart) {
const tncField = setTncCheckbox(config);
formConfig.fields.push(tncField);
}
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.mobileLogin;
}
// Configure fields and title for User Login.
else if (formType.includes("User")) {
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.userLogin, "User Login");
const fields = [LOGIN_FORM_FIELDS.USER_ID_FIELD];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.userLogin, fields);
// Add Terms and Conditions Field based on Config
if (config === null || config === void 0 ? void 0 : config.tncOnStart) {
const tncField = setTncCheckbox(config);
formConfig.fields.push(tncField);
}
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.userLogin;
}
// Configure fields and title for OTP Verification.
else if (formType.includes("OTP")) {
const fields = [
LOGIN_FORM_FIELDS.OTP_FIELD,
LOGIN_FORM_FIELDS.RESEND_OTP_FIELD
];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.otpVerification, fields);
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.otpVerification, "OTP Verification");
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.otpVerification;
}
// Configure fields and title for Changing Password
else if (formType.includes("Change Password")) {
const fields = [
LOGIN_FORM_FIELDS.OLD_PASSWORD_FIELD,
LOGIN_FORM_FIELDS.NEW_PASSWORD_FIELD,
LOGIN_FORM_FIELDS.REPEAT_PASSWORD_FIELD
];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.changePassowrdPage, fields);
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.changePassowrdPage, "Change Password");
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.changePassowrdPage;
}
// Configure fields and title for Agent Login.
else if (formType.includes("Agent")) {
const fields = [
LOGIN_FORM_FIELDS.USERNAME_FIELD,
LOGIN_FORM_FIELDS.PASSWORD_FIELD
];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.agentLogin, fields);
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.agentLogin, "Agent Login");
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.agentLogin;
}
// Configure fields and title for ID Password Login.
else if (formType.includes("ID Password Login")) {
const fields = [
LOGIN_FORM_FIELDS.USERNAME_FIELD,
LOGIN_FORM_FIELDS.PASSWORD_FIELD
];
formConfig.fields = setFormFields(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.idPasswordLogin, fields);
formTitle = setFormTitle(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.idPasswordLogin, "Login");
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.idPasswordLogin;
}
// Configure fields and title for Custom Login Form Config.
else if (formType.includes("Custom")) {
formConfig.fields = (_c = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.custom) === null || _c === void 0 ? void 0 : _c.fields;
formTitle = (_d = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.custom) === null || _d === void 0 ? void 0 : _d.title;
specificFormConfig = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.custom;
}
// Configure fields and title for Custom Login.
else {
const fields = [
LOGIN_FORM_FIELDS.USERNAME_FIELD,
LOGIN_FORM_FIELDS.PASSWORD_FIELD
];
formConfig.fields = fields;
formTitle = "Login";
}
// Set Form Fields Default value & Disability
formConfig.fields = setDefaultValueAndDisability(formConfig.fields, data);
// Save Button Label for Login Form
formConfig.properties.footer.saveButton.label = setFormSaveButtons(specificFormConfig, formType, isOtpFlow, buttonLabels);
return {
formTitle,
formConfig
};
};
// Function to set or default a form title based on configuration.
export const setFormTitle = (customFormConfig, title) => {
var _a;
return (_a = customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.title) !== null && _a !== void 0 ? _a : title;
};
// Function to merge custom form fields with default fields.
export const setFormFields = (customFormConfig, fields) => {
let formFields = fields;
if (customFormConfig &&
(customFormConfig === null || customFormConfig === void 0 ? void 0 : customFormConfig.fields) &&
customFormConfig.fields.length > 0) {
formFields = mergeObjects(formFields, customFormConfig.fields);
}
return formFields;
};
// Function to determine and set labels for form save buttons.
export const setFormSaveButtons = (customFormConfig, formType, isOtpFlow, buttonLabels) => {
var _a, _b, _c, _d;
if (isNotEmptyValue(customFormConfig) &&
checkObjectPathExists(customFormConfig, "properties.footer.saveButton.label")) {
return customFormConfig.properties.footer.saveButton.label;
}
if (isOtpFlow == true &&
(formType.includes("Mobile") ||
formType.includes("User") ||
formType.includes("Agent"))) {
return (_a = buttonLabels === null || buttonLabels === void 0 ? void 0 : buttonLabels.GET_OTP) !== null && _a !== void 0 ? _a : "Get OTP";
}
if (!isOtpFlow &&
(formType.includes("Mobile") ||
formType.includes("User") ||
formType.includes("Agent"))) {
return (_b = buttonLabels === null || buttonLabels === void 0 ? void 0 : buttonLabels.SUBMIT) !== null && _b !== void 0 ? _b : "Submit";
}
if (formType.includes("OTP")) {
return (_c = buttonLabels === null || buttonLabels === void 0 ? void 0 : buttonLabels.SUBMIT_OTP) !== null && _c !== void 0 ? _c : "Submit OTP";
}
if (formType.includes("Change Password")) {
return (_d = buttonLabels === null || buttonLabels === void 0 ? void 0 : buttonLabels.CHANGE_PASSWORD) !== null && _d !== void 0 ? _d : "Update Password";
}
};
// Function to configure terms and conditions checkbox based on settings.
export const setTncCheckbox = (config) => {
let tncField = LOGIN_FORM_FIELDS.TNC_FIELD;
if (!config.tncOnStart.newTab && isObject(config.tncOnStart)) {
const data = config === null || config === void 0 ? void 0 : config.tncOnStart;
const title = data === null || data === void 0 ? void 0 : data.title;
const value = data === null || data === void 0 ? void 0 : data.listItem[0];
// Custom validation function for terms and conditions based on title and value.
const validation = (title, value) => {
return {
is_valid: false,
triggers: ["ON_CHANGE"],
rules: [
{
id: "1",
key: "VALUE_CHECK",
props: {
value: {
source: {
key: "OBJECT",
props: {
object: {
key: "FORM_DATA",
path: "$.tnc"
}
}
}
},
pattern: {
key: "IS_TRUE"
}
}
}
],
actions: [
{
key: "PREVIEW_DIALOG_SHOW",
condition: "1",
props: {
html: {
after: `<div style=\"height:100vh; width:100vw; position: relative;\"><div style=\"position: absolute;font-size: 1.4rem;background: white;padding: 1rem;border-radius: 1rem;line-height:2rem;box-shadow: 0px 0px 10px -3px black;height: fit-content;max-height: 90vh;width: 100%; top: 50%; left: 50%; transform: translate(-50%, -50%);\"><div style=\"height:100%; width:100%; overflow:auto; max-height:80vh; padding: 0 1rem;\"><div style=\"font-size: 1.7rem; margin-bottom:2rem; text-align:center; font-weight: 600\">${title}</div>${value}<div></div></div>`
},
type: "popup"
}
}
]
};
};
tncField = setMissingKeyValue(tncField, "validation", validation(title, value));
}
else {
const url = `${window.location.origin}/terms`;
tncField.properties.placeholder = `<span style=\"font-size:14px\">I Agree to all <a href=${url} target="_blank" >Terms and Conditions</a></span>`;
}
return tncField;
};
// Function to set default values and disable input fields based on provided data.
export const setDefaultValueAndDisability = (fields, data) => {
if (isObject(data)) {
// Check and set default value for username field if available.
if (checkObjectPathExists(data, "loginCredentials.username.value")) {
fields[0].default = setDefaultValue(data.loginCredentials.username.value);
}
// Disable username field if specified.
if (checkObjectPathExists(data, "loginCredentials.username.disabled")) {
fields[0].disabled = data.loginCredentials.username.disabled;
}
// Check and set default value for password field if more than one field and data available.
if (fields.length > 1 &&
checkObjectPathExists(data, "loginCredentials.password.value")) {
fields[1].default = setDefaultValue(data.loginCredentials.password.value);
}
// Disable password field if specified and more than one field.
if (fields.length > 1 &&
checkObjectPathExists(data, "loginCredentials.password.disabled")) {
fields[1].disabled = data.loginCredentials.password.disabled;
}
}
return fields;
};
// Helper function to set default values for fields.
export const setDefaultValue = (value) => {
return {
value: {
is_found: false,
value: "",
sources: [
{
value: "",
validation: {
is_valid: false,
triggers: ["ON_INIT"],
rules: [],
actions: [
{
key: "SET_FIELD_DEFAULT_VALUE",
condition: "true",
props: {
value: {
source: {
key: "PREDEFINED",
props: {
predefinedValue: value
}
}
}
}
}
]
}
}
]
}
};
};
// Function to store values in local storage based on form type and provided data.
export const setValuesInLocalStorage = (formType, config, formData) => {
var _a, _b, _c;
if (formType.includes("Mobile")) {
// Set local storage values for mobile form type if conditions are met.
if (!((_a = config === null || config === void 0 ? void 0 : config.loginConfig) === null || _a === void 0 ? void 0 : _a.isLinkBased) ||
isEmptyValue(localStorage.getItem("uid"))) {
localStorage.setItem("uid", formData.mobile);
}
if (!((_b = config === null || config === void 0 ? void 0 : config.loginConfig) === null || _b === void 0 ? void 0 : _b.isLinkBased) ||
isEmptyValue(localStorage.getItem("user_id"))) {
localStorage.setItem("user_id", formData.mobile);
}
localStorage.setItem("mobile", formData.mobile);
}
else if (formType.includes("User")) {
// Set local storage values for user form type if conditions are met.
if (!((_c = config === null || config === void 0 ? void 0 : config.loginConfig) === null || _c === void 0 ? void 0 : _c.isLinkBased) ||
isEmptyValue(localStorage.getItem("mobile"))) {
localStorage.setItem("mobile", formData.user_id);
}
localStorage.setItem("uid", formData.user_id);
localStorage.setItem("user_id", formData.user_id);
}
};
// Function to format time in MM:SS format for display.
export const getFormattedTime = (value) => {
const minutes = Math.floor(value / 60);
const seconds = value % 60;
return `${paddedTime(minutes)}:${paddedTime(seconds)}`;
};
// Helper function to ensure time values are always two digits.
export const paddedTime = (time) => {
return time.toString().padStart(2, "0");
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNvbXBvbmVudHMvc3JjL2xpYi9wYWdlcy9sb2dpbi9sb2dpbi5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osa0JBQWtCLEVBQ25CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekUsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7O0lBQ2hELElBQUksTUFBTSxDQUFDO0lBQ1gsaUVBQWlFO0lBQ2pFLElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sR0FBRyxhQUFhLENBQUM7UUFDdkIsMkRBQTJEO1FBQzNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsV0FBVyxtQ0FBSSxnQkFBZ0IsQ0FBQztLQUNyRTtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFO0lBQzlDLHdEQUF3RDtJQUN4RCxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM5QixJQUFJLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxJQUFJLEVBQUU7WUFDbkIsc0RBQXNEO1lBQ3RELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2FBQ3JCLENBQUM7U0FDSDtRQUNELElBQUksU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FB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QUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQzVDO1lBQ0EsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNuRDtBQUNILENBQUMsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDM0IsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUN6RCxDQUFDLENBQUM7QUFFRiwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjaGVja09iamVjdFBhdGhFeGlzdHMsXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlLFxuICBpc09iamVjdCxcbiAgbWVyZ2VPYmplY3RzLFxuICBzZXRNaXNzaW5nS2V5VmFsdWVcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBMT0dJTl9GT1JNX0NPTkZJRywgTE9HSU5fRk9STV9GSUVMRFMgfSBmcm9tIFwiLi9sb2dpbi5jb25zdGFudHNcIjtcblxuLy8gRnVuY3Rpb24gdG8gc2V0IHByaXZhY3kgcG9saWN5IHdpdGggZGVmYXVsdCBkaXNwbGF5IHRleHQgaWYgbm90IHNwZWNpZmllZC5cbmV4cG9ydCBjb25zdCBzZXRQcml2YWN5UG9saWN5ID0gKHByaXZhY3lQb2xpY3kpID0+IHtcbiAgbGV0IHBvbGljeTtcbiAgLy8gQ2hlY2tzIGlmIHRoZSBwcml2YWN5UG9saWN5IG9iamVjdCBjb250YWlucyBhIG5vbi1lbXB0eSB2YWx1ZS5cbiAgaWYgKGlzTm90RW1wdHlWYWx1ZShwcml2YWN5UG9saWN5KSkge1xuICAgIHBvbGljeSA9IHByaXZhY3lQb2xpY3k7XG4gICAgLy8gU2V0cyBkZWZhdWx0IGRpc3BsYXkgdGV4dCBmb3IgdGhlIHBvbGljeSBpZiBub25lIGV4aXN0cy5cbiAgICBwb2xpY3kuZGlzcGxheVRleHQgPSBwcml2YWN5UG9saWN5Py5kaXNwbGF5VGV4dCA/PyBcIlByaXZhY3kgUG9saWN5XCI7XG4gIH1cbiAgcmV0dXJuIHBvbGljeTtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgc2lkZSBwYW5lbCBiYXNlZCBvbiBwcm92aWRlZCBzZXR0aW5ncy5cbmV4cG9ydCBjb25zdCBzZXRTaWRlUGFuZWxDb25maWcgPSAoc2lkZVBhbmVsKSA9PiB7XG4gIC8vIENoZWNrIGlmIHNpZGVQYW5lbCBvYmplY3QgY29udGFpbnMgYSBub24tZW1wdHkgdmFsdWUuXG4gIGlmIChpc05vdEVtcHR5VmFsdWUoc2lkZVBhbmVsKSkge1xuICAgIGlmIChzaWRlUGFuZWw/Lmh0bWwpIHtcbiAgICAgIC8vIFJldHVybiBjb25maWd1cmF0aW9uIGZvciBIVE1MIGNvbnRlbnQgaWYgc3BlY2lmaWVkLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHRtbDogc2lkZVBhbmVsLmh0bWxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChzaWRlUGFuZWw/LmltYWdlKSB7XG4gICAgICAvLyBSZXR1cm4gY29uZmlndXJhdGlvbiBmb3IgaW1hZ2UgaWYgc3BlY2lmaWVkLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW1hZ2U6IHNpZGVQYW5lbC5pbWFnZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNpZGVQYW5lbD8uYW5pbWF0aW9uKSB7XG4gICAgICAvLyBSZXR1cm4gY29uZmlndXJhdGlvbiBmb3IgYW5pbWF0aW9uIGlmIHNwZWNpZmllZC5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFuaW1hdGlvbjogc2lkZVBhbmVsLmFuaW1hdGlvblxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBmb3JtIHR5cGVzIGFuZCBmaWVsZHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gYW5kIGRhdGEuXG5leHBvcnQgY29uc3Qgc2V0Rm9ybVR5cGVBbmRGb3JtRmllbGRzID0gKGNvbmZpZywgZGF0YSkgPT4ge1xuICBjb25zdCBmb3JtQ29uZmlnID0gTE9HSU5fRk9STV9DT05GSUc7XG4gIGxldCBmb3JtVGl0bGU7XG5cbiAgLy8gQWNjZXNzIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGZvciBsb2dpbiBmb3JtLlxuICBjb25zdCBjdXN0b21Gb3JtQ29uZmlnID0gY29uZmlnPy5sb2dpbkNvbmZpZztcbiAgY29uc3QgaXNPdHBGbG93ID0gY29uZmlnPy51dGlsaXR5RmxhZ3M/LmlzT3RwRmxvdztcbiAgY29uc3QgZm9ybVR5cGUgPSBjb25maWc/LmZvcm1UeXBlO1xuICBjb25zdCBidXR0b25MYWJlbHMgPSBjb25maWc/LmRpc3BsYXlTZXR0aW5ncz8uYnV0dG9uTGFiZWxzO1xuXG4gIGxldCBzcGVjaWZpY0Zvcm1Db25maWc7XG5cbiAgLy8gQ29uZmlndXJlIGZpZWxkcyBhbmQgdGl0bGUgZm9yIE1vYmlsZSBMb2dpbi5cbiAgaWYgKGZvcm1UeXBlLmluY2x1ZGVzKFwiTW9iaWxlXCIpKSB7XG4gICAgZm9ybVRpdGxlID0gc2V0Rm9ybVRpdGxlKGN1c3RvbUZvcm1Db25maWc/Lm1vYmlsZUxvZ2luLCBcIk1vYmlsZSBMb2dpblwiKTtcbiAgICBjb25zdCBmaWVsZHMgPSBbTE9HSU5fRk9STV9GSUVMRFMuTU9CSUxFX0ZJRUxEXTtcbiAgICBmb3JtQ29uZmlnLmZpZWxkcyA9IHNldEZvcm1GaWVsZHMoY3VzdG9tRm9ybUNvbmZpZz8ubW9iaWxlTG9naW4sIGZpZWxkcyk7XG5cbiAgICAvLyBBZGQgVGVybXMgYW5kIENvbmRpdGlvbnMgRmllbGQgYmFzZWQgb24gQ29uZmlnXG4gICAgaWYgKGNvbmZpZz8udG5jT25TdGFydCkge1xuICAgICAgY29uc3QgdG5jRmllbGQgPSBzZXRUbmNDaGVja2JveChjb25maWcpO1xuICAgICAgZm9ybUNvbmZpZy5maWVsZHMucHVzaCh0bmNGaWVsZCk7XG4gICAgfVxuXG4gICAgc3BlY2lmaWNGb3JtQ29uZmlnID0gY3VzdG9tRm9ybUNvbmZpZz8ubW9iaWxlTG9naW47XG4gIH1cblxuICAvLyBDb25maWd1cmUgZmllbGRzIGFuZCB0aXRsZSBmb3IgVXNlciBMb2dpbi5cbiAgZWxzZSBpZiAoZm9ybVR5cGUuaW5jbHVkZXMoXCJVc2VyXCIpKSB7XG4gICAgZm9ybVRpdGxlID0gc2V0Rm9ybVRpdGxlKGN1c3RvbUZvcm1Db25maWc/LnVzZXJMb2dpbiwgXCJVc2VyIExvZ2luXCIpO1xuICAgIGNvbnN0IGZpZWxkcyA9IFtMT0dJTl9GT1JNX0ZJRUxEUy5VU0VSX0lEX0ZJRUxEXTtcbiAgICBmb3JtQ29uZmlnLmZpZWxkcyA9IHNldEZvcm1GaWVsZHMoY3VzdG9tRm9ybUNvbmZpZz8udXNlckxvZ2luLCBmaWVsZHMpO1xuXG4gICAgLy8gQWRkIFRlcm1zIGFuZCBDb25kaXRpb25zIEZpZWxkIGJhc2VkIG9uIENvbmZpZ1xuICAgIGlmIChjb25maWc/LnRuY09uU3RhcnQpIHtcbiAgICAgIGNvbnN0IHRuY0ZpZWxkID0gc2V0VG5jQ2hlY2tib3goY29uZmlnKTtcbiAgICAgIGZvcm1Db25maWcuZmllbGRzLnB1c2godG5jRmllbGQpO1xuICAgIH1cblxuICAgIHNwZWNpZmljRm9ybUNvbmZpZyA9IGN1c3RvbUZvcm1Db25maWc/LnVzZXJMb2dpbjtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBmaWVsZHMgYW5kIHRpdGxlIGZvciBPVFAgVmVyaWZpY2F0aW9uLlxuICBlbHNlIGlmIChmb3JtVHlwZS5pbmNsdWRlcyhcIk9UUFwiKSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgIExPR0lOX0ZPUk1fRklFTERTLk9UUF9GSUVMRCxcbiAgICAgIExPR0lOX0ZPUk1fRklFTERTLlJFU0VORF9PVFBfRklFTERcbiAgICBdO1xuICAgIGZvcm1Db25maWcuZmllbGRzID0gc2V0Rm9ybUZpZWxkcyhcbiAgICAgIGN1c3RvbUZvcm1Db25maWc/Lm90cFZlcmlmaWNhdGlvbixcbiAgICAgIGZpZWxkc1xuICAgICk7XG4gICAgZm9ybVRpdGxlID0gc2V0Rm9ybVRpdGxlKFxuICAgICAgY3VzdG9tRm9ybUNvbmZpZz8ub3RwVmVyaWZpY2F0aW9uLFxuICAgICAgXCJPVFAgVmVyaWZpY2F0aW9uXCJcbiAgICApO1xuXG4gICAgc3BlY2lmaWNGb3JtQ29uZmlnID0gY3VzdG9tRm9ybUNvbmZpZz8ub3RwVmVyaWZpY2F0aW9uO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIGZpZWxkcyBhbmQgdGl0bGUgZm9yIENoYW5naW5nIFBhc3N3b3JkXG4gIGVsc2UgaWYgKGZvcm1UeXBlLmluY2x1ZGVzKFwiQ2hhbmdlIFBhc3N3b3JkXCIpKSB7XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgTE9HSU5fRk9STV9GSUVMRFMuT0xEX1BBU1NXT1JEX0ZJRUxELFxuICAgICAgTE9HSU5fRk9STV9GSUVMRFMuTkVXX1BBU1NXT1JEX0ZJRUxELFxuICAgICAgTE9HSU5fRk9STV9GSUVMRFMuUkVQRUFUX1BBU1NXT1JEX0ZJRUxEXG4gICAgXTtcbiAgICBmb3JtQ29uZmlnLmZpZWxkcyA9IHNldEZvcm1GaWVsZHMoXG4gICAgICBjdXN0b21Gb3JtQ29uZmlnPy5jaGFuZ2VQYXNzb3dyZFBhZ2UsXG4gICAgICBmaWVsZHNcbiAgICApO1xuICAgIGZvcm1UaXRsZSA9IHNldEZvcm1UaXRsZShcbiAgICAgIGN1c3RvbUZvcm1Db25maWc/LmNoYW5nZVBhc3Nvd3JkUGFnZSxcbiAgICAgIFwiQ2hhbmdlIFBhc3N3b3JkXCJcbiAgICApO1xuXG4gICAgc3BlY2lmaWNGb3JtQ29uZmlnID0gY3VzdG9tRm9ybUNvbmZpZz8uY2hhbmdlUGFzc293cmRQYWdlO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIGZpZWxkcyBhbmQgdGl0bGUgZm9yIEFnZW50IExvZ2luLlxuICBlbHNlIGlmIChmb3JtVHlwZS5pbmNsdWRlcyhcIkFnZW50XCIpKSB7XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgTE9HSU5fRk9STV9GSUVMRFMuVVNFUk5BTUVfRklFTEQsXG4gICAgICBMT0dJTl9GT1JNX0ZJRUxEUy5QQVNTV09SRF9GSUVMRFxuICAgIF07XG4gICAgZm9ybUNvbmZpZy5maWVsZHMgPSBzZXRGb3JtRmllbGRzKGN1c3RvbUZvcm1Db25maWc/LmFnZW50TG9naW4sIGZpZWxkcyk7XG4gICAgZm9ybVRpdGxlID0gc2V0Rm9ybVRpdGxlKGN1c3RvbUZvcm1Db25maWc/LmFnZW50TG9naW4sIFwiQWdlbnQgTG9naW5cIik7XG5cbiAgICBzcGVjaWZpY0Zvcm1Db25maWcgPSBjdXN0b21Gb3JtQ29uZmlnPy5hZ2VudExvZ2luO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIGZpZWxkcyBhbmQgdGl0bGUgZm9yIElEIFBhc3N3b3JkIExvZ2luLlxuICBlbHNlIGlmIChmb3JtVHlwZS5pbmNsdWRlcyhcIklEIFBhc3N3b3JkIExvZ2luXCIpKSB7XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgTE9HSU5fRk9STV9GSUVMRFMuVVNFUk5BTUVfRklFTEQsXG4gICAgICBMT0dJTl9GT1JNX0ZJRUxEUy5QQVNTV09SRF9GSUVMRFxuICAgIF07XG4gICAgZm9ybUNvbmZpZy5maWVsZHMgPSBzZXRGb3JtRmllbGRzKFxuICAgICAgY3VzdG9tRm9ybUNvbmZpZz8uaWRQYXNzd29yZExvZ2luLFxuICAgICAgZmllbGRzXG4gICAgKTtcbiAgICBmb3JtVGl0bGUgPSBzZXRGb3JtVGl0bGUoY3VzdG9tRm9ybUNvbmZpZz8uaWRQYXNzd29yZExvZ2luLCBcIkxvZ2luXCIpO1xuXG4gICAgc3BlY2lmaWNGb3JtQ29uZmlnID0gY3VzdG9tRm9ybUNvbmZpZz8uaWRQYXNzd29yZExvZ2luO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIGZpZWxkcyBhbmQgdGl0bGUgZm9yIEN1c3RvbSBMb2dpbiBGb3JtIENvbmZpZy5cbiAgZWxzZSBpZiAoZm9ybVR5cGUuaW5jbHVkZXMoXCJDdXN0b21cIikpIHtcbiAgICBmb3JtQ29uZmlnLmZpZWxkcyA9IGN1c3RvbUZvcm1Db25maWc/LmN1c3RvbT8uZmllbGRzO1xuICAgIGZvcm1UaXRsZSA9IGN1c3RvbUZvcm1Db25maWc/LmN1c3RvbT8udGl0bGU7XG5cbiAgICBzcGVjaWZpY0Zvcm1Db25maWcgPSBjdXN0b21Gb3JtQ29uZmlnPy5jdXN0b207XG4gIH1cblxuICAvLyBDb25maWd1cmUgZmllbGRzIGFuZCB0aXRsZSBmb3IgQ3VzdG9tIExvZ2luLlxuICBlbHNlIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICBMT0dJTl9GT1JNX0ZJRUxEUy5VU0VSTkFNRV9GSUVMRCxcbiAgICAgIExPR0lOX0ZPUk1fRklFTERTLlBBU1NXT1JEX0ZJRUxEXG4gICAgXTtcbiAgICBmb3JtQ29uZmlnLmZpZWxkcyA9IGZpZWxkcztcbiAgICBmb3JtVGl0bGUgPSBcIkxvZ2luXCI7XG4gIH1cblxuICAvLyBTZXQgRm9ybSBGaWVsZHMgRGVmYXVsdCB2YWx1ZSAmIERpc2FiaWxpdHlcbiAgZm9ybUNvbmZpZy5maWVsZHMgPSBzZXREZWZhdWx0VmFsdWVBbmREaXNhYmlsaXR5KGZvcm1Db25maWcuZmllbGRzLCBkYXRhKTtcblxuICAvLyBTYXZlIEJ1dHRvbiBMYWJlbCBmb3IgTG9naW4gRm9ybVxuICBmb3JtQ29uZmlnLnByb3BlcnRpZXMuZm9vdGVyLnNhdmVCdXR0b24ubGFiZWwgPSBzZXRGb3JtU2F2ZUJ1dHRvbnMoXG4gICAgc3BlY2lmaWNGb3JtQ29uZmlnLFxuICAgIGZvcm1UeXBlLFxuICAgIGlzT3RwRmxvdyxcbiAgICBidXR0b25MYWJlbHNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGZvcm1UaXRsZSxcbiAgICBmb3JtQ29uZmlnXG4gIH07XG59O1xuXG4vLyBGdW5jdGlvbiB0byBzZXQgb3IgZGVmYXVsdCBhIGZvcm0gdGl0bGUgYmFzZWQgb24gY29uZmlndXJhdGlvbi5cbmV4cG9ydCBjb25zdCBzZXRGb3JtVGl0bGUgPSAoY3VzdG9tRm9ybUNvbmZpZywgdGl0bGUpID0+IHtcbiAgcmV0dXJuIGN1c3RvbUZvcm1Db25maWc/LnRpdGxlID8/IHRpdGxlO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gbWVyZ2UgY3VzdG9tIGZvcm0gZmllbGRzIHdpdGggZGVmYXVsdCBmaWVsZHMuXG5leHBvcnQgY29uc3Qgc2V0Rm9ybUZpZWxkcyA9IChjdXN0b21Gb3JtQ29uZmlnLCBmaWVsZHMpID0+IHtcbiAgbGV0IGZvcm1GaWVsZHMgPSBmaWVsZHM7XG4gIGlmIChcbiAgICBjdXN0b21Gb3JtQ29uZmlnICYmXG4gICAgY3VzdG9tRm9ybUNvbmZpZz8uZmllbGRzICYmXG4gICAgY3VzdG9tRm9ybUNvbmZpZy5maWVsZHMubGVuZ3RoID4gMFxuICApIHtcbiAgICBmb3JtRmllbGRzID0gbWVyZ2VPYmplY3RzKGZvcm1GaWVsZHMsIGN1c3RvbUZvcm1Db25maWcuZmllbGRzKTtcbiAgfVxuICByZXR1cm4gZm9ybUZpZWxkcztcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGRldGVybWluZSBhbmQgc2V0IGxhYmVscyBmb3IgZm9ybSBzYXZlIGJ1dHRvbnMuXG5leHBvcnQgY29uc3Qgc2V0Rm9ybVNhdmVCdXR0b25zID0gKFxuICBjdXN0b21Gb3JtQ29uZmlnLFxuICBmb3JtVHlwZSxcbiAgaXNPdHBGbG93LFxuICBidXR0b25MYWJlbHNcbikgPT4ge1xuICBpZiAoXG4gICAgaXNOb3RFbXB0eVZhbHVlKGN1c3RvbUZvcm1Db25maWcpICYmXG4gICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKFxuICAgICAgY3VzdG9tRm9ybUNvbmZpZyxcbiAgICAgIFwicHJvcGVydGllcy5mb290ZXIuc2F2ZUJ1dHRvbi5sYWJlbFwiXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gY3VzdG9tRm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci5zYXZlQnV0dG9uLmxhYmVsO1xuICB9XG4gIGlmIChcbiAgICBpc090cEZsb3cgPT0gdHJ1ZSAmJlxuICAgIChmb3JtVHlwZS5pbmNsdWRlcyhcIk1vYmlsZVwiKSB8fFxuICAgICAgZm9ybVR5cGUuaW5jbHVkZXMoXCJVc2VyXCIpIHx8XG4gICAgICBmb3JtVHlwZS5pbmNsdWRlcyhcIkFnZW50XCIpKVxuICApIHtcbiAgICByZXR1cm4gYnV0dG9uTGFiZWxzPy5HRVRfT1RQID8/IFwiR2V0IE9UUFwiO1xuICB9XG4gIGlmIChcbiAgICAhaXNPdHBGbG93ICYmXG4gICAgKGZvcm1UeXBlLmluY2x1ZGVzKFwiTW9iaWxlXCIpIHx8XG4gICAgICBmb3JtVHlwZS5pbmNsdWRlcyhcIlVzZXJcIikgfHxcbiAgICAgIGZvcm1UeXBlLmluY2x1ZGVzKFwiQWdlbnRcIikpXG4gICkge1xuICAgIHJldHVybiBidXR0b25MYWJlbHM/LlNVQk1JVCA/PyBcIlN1Ym1pdFwiO1xuICB9XG4gIGlmIChmb3JtVHlwZS5pbmNsdWRlcyhcIk9UUFwiKSkge1xuICAgIHJldHVybiBidXR0b25MYWJlbHM/LlNVQk1JVF9PVFAgPz8gXCJTdWJtaXQgT1RQXCI7XG4gIH1cbiAgaWYgKGZvcm1UeXBlLmluY2x1ZGVzKFwiQ2hhbmdlIFBhc3N3b3JkXCIpKSB7XG4gICAgcmV0dXJuIGJ1dHRvbkxhYmVscz8uQ0hBTkdFX1BBU1NXT1JEID8/IFwiVXBkYXRlIFBhc3N3b3JkXCI7XG4gIH1cbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBjaGVja2JveCBiYXNlZCBvbiBzZXR0aW5ncy5cbmV4cG9ydCBjb25zdCBzZXRUbmNDaGVja2JveCA9IChjb25maWcpID0+IHtcbiAgbGV0IHRuY0ZpZWxkID0gTE9HSU5fRk9STV9GSUVMRFMuVE5DX0ZJRUxEO1xuXG4gIGlmICghY29uZmlnLnRuY09uU3RhcnQubmV3VGFiICYmIGlzT2JqZWN0KGNvbmZpZy50bmNPblN0YXJ0KSkge1xuICAgIGNvbnN0IGRhdGEgPSBjb25maWc/LnRuY09uU3RhcnQ7XG4gICAgY29uc3QgdGl0bGUgPSBkYXRhPy50aXRsZTtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGE/Lmxpc3RJdGVtWzBdO1xuXG4gICAgLy8gQ3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIGJhc2VkIG9uIHRpdGxlIGFuZCB2YWx1ZS5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gKHRpdGxlLCB2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNfdmFsaWQ6IGZhbHNlLFxuICAgICAgICB0cmlnZ2VyczogW1wiT05fQ0hBTkdFXCJdLFxuICAgICAgICBydWxlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcIjFcIixcbiAgICAgICAgICAgIGtleTogXCJWQUxVRV9DSEVDS1wiLFxuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgIGtleTogXCJPQkpFQ1RcIixcbiAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJGT1JNX0RBVEFcIixcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBcIiQudG5jXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGF0dGVybjoge1xuICAgICAgICAgICAgICAgIGtleTogXCJJU19UUlVFXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJQUkVWSUVXX0RJQUxPR19TSE9XXCIsXG4gICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgaHRtbDoge1xuICAgICAgICAgICAgICAgIGFmdGVyOiBgPGRpdiBzdHlsZT1cXFwiaGVpZ2h0OjEwMHZoOyB3aWR0aDoxMDB2dzsgcG9zaXRpb246IHJlbGF0aXZlO1xcXCI+PGRpdiBzdHlsZT1cXFwicG9zaXRpb246IGFic29sdXRlO2ZvbnQtc2l6ZTogMS40cmVtO2JhY2tncm91bmQ6IHdoaXRlO3BhZGRpbmc6IDFyZW07Ym9yZGVyLXJhZGl1czogMXJlbTtsaW5lLWhlaWdodDoycmVtO2JveC1zaGFkb3c6IDBweCAwcHggMTBweCAtM3B4IGJsYWNrO2hlaWdodDogZml0LWNvbnRlbnQ7bWF4LWhlaWdodDogOTB2aDt3aWR0aDogMTAwJTsgdG9wOiA1MCU7IGxlZnQ6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxcIj48ZGl2ICBzdHlsZT1cXFwiaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7IG92ZXJmbG93OmF1dG87IG1heC1oZWlnaHQ6ODB2aDsgcGFkZGluZzogMCAxcmVtO1xcXCI+PGRpdiBzdHlsZT1cXFwiZm9udC1zaXplOiAxLjdyZW07IG1hcmdpbi1ib3R0b206MnJlbTsgdGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDBcXFwiPiR7dGl0bGV9PC9kaXY+JHt2YWx1ZX08ZGl2PjwvZGl2PjwvZGl2PmBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdHlwZTogXCJwb3B1cFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0bmNGaWVsZCA9IHNldE1pc3NpbmdLZXlWYWx1ZShcbiAgICAgIHRuY0ZpZWxkLFxuICAgICAgXCJ2YWxpZGF0aW9uXCIsXG4gICAgICB2YWxpZGF0aW9uKHRpdGxlLCB2YWx1ZSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L3Rlcm1zYDtcbiAgICB0bmNGaWVsZC5wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyID0gYDxzcGFuIHN0eWxlPVxcXCJmb250LXNpemU6MTRweFxcXCI+SSBBZ3JlZSB0byBhbGwgPGEgaHJlZj0ke3VybH0gdGFyZ2V0PVwiX2JsYW5rXCIgPlRlcm1zIGFuZCBDb25kaXRpb25zPC9hPjwvc3Bhbj5gO1xuICB9XG5cbiAgcmV0dXJuIHRuY0ZpZWxkO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBkaXNhYmxlIGlucHV0IGZpZWxkcyBiYXNlZCBvbiBwcm92aWRlZCBkYXRhLlxuZXhwb3J0IGNvbnN0IHNldERlZmF1bHRWYWx1ZUFuZERpc2FiaWxpdHkgPSAoZmllbGRzLCBkYXRhKSA9PiB7XG4gIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgIC8vIENoZWNrIGFuZCBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgdXNlcm5hbWUgZmllbGQgaWYgYXZhaWxhYmxlLlxuICAgIGlmIChjaGVja09iamVjdFBhdGhFeGlzdHMoZGF0YSwgXCJsb2dpbkNyZWRlbnRpYWxzLnVzZXJuYW1lLnZhbHVlXCIpKSB7XG4gICAgICBmaWVsZHNbMF0uZGVmYXVsdCA9IHNldERlZmF1bHRWYWx1ZShkYXRhLmxvZ2luQ3JlZGVudGlhbHMudXNlcm5hbWUudmFsdWUpO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdXNlcm5hbWUgZmllbGQgaWYgc3BlY2lmaWVkLlxuICAgIGlmIChjaGVja09iamVjdFBhdGhFeGlzdHMoZGF0YSwgXCJsb2dpbkNyZWRlbnRpYWxzLnVzZXJuYW1lLmRpc2FibGVkXCIpKSB7XG4gICAgICBmaWVsZHNbMF0uZGlzYWJsZWQgPSBkYXRhLmxvZ2luQ3JlZGVudGlhbHMudXNlcm5hbWUuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW5kIHNldCBkZWZhdWx0IHZhbHVlIGZvciBwYXNzd29yZCBmaWVsZCBpZiBtb3JlIHRoYW4gb25lIGZpZWxkIGFuZCBkYXRhIGF2YWlsYWJsZS5cbiAgICBpZiAoXG4gICAgICBmaWVsZHMubGVuZ3RoID4gMSAmJlxuICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKGRhdGEsIFwibG9naW5DcmVkZW50aWFscy5wYXNzd29yZC52YWx1ZVwiKVxuICAgICkge1xuICAgICAgZmllbGRzWzFdLmRlZmF1bHQgPSBzZXREZWZhdWx0VmFsdWUoZGF0YS5sb2dpbkNyZWRlbnRpYWxzLnBhc3N3b3JkLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIHBhc3N3b3JkIGZpZWxkIGlmIHNwZWNpZmllZCBhbmQgbW9yZSB0aGFuIG9uZSBmaWVsZC5cbiAgICBpZiAoXG4gICAgICBmaWVsZHMubGVuZ3RoID4gMSAmJlxuICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKGRhdGEsIFwibG9naW5DcmVkZW50aWFscy5wYXNzd29yZC5kaXNhYmxlZFwiKVxuICAgICkge1xuICAgICAgZmllbGRzWzFdLmRpc2FibGVkID0gZGF0YS5sb2dpbkNyZWRlbnRpYWxzLnBhc3N3b3JkLmRpc2FibGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBmaWVsZHMuXG5leHBvcnQgY29uc3Qgc2V0RGVmYXVsdFZhbHVlID0gKHZhbHVlKSA9PiB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgaXNfdmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgdHJpZ2dlcnM6IFtcIk9OX0lOSVRcIl0sXG4gICAgICAgICAgICBydWxlczogW10sXG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiU0VUX0ZJRUxEX0RFRkFVTFRfVkFMVUVcIixcbiAgICAgICAgICAgICAgICBjb25kaXRpb246IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwiUFJFREVGSU5FRFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkVmFsdWU6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9O1xufTtcblxuLy8gRnVuY3Rpb24gdG8gc3RvcmUgdmFsdWVzIGluIGxvY2FsIHN0b3JhZ2UgYmFzZWQgb24gZm9ybSB0eXBlIGFuZCBwcm92aWRlZCBkYXRhLlxuZXhwb3J0IGNvbnN0IHNldFZhbHVlc0luTG9jYWxTdG9yYWdlID0gKGZvcm1UeXBlLCBjb25maWcsIGZvcm1EYXRhKSA9PiB7XG4gIGlmIChmb3JtVHlwZS5pbmNsdWRlcyhcIk1vYmlsZVwiKSkge1xuICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHZhbHVlcyBmb3IgbW9iaWxlIGZvcm0gdHlwZSBpZiBjb25kaXRpb25zIGFyZSBtZXQuXG4gICAgaWYgKFxuICAgICAgIWNvbmZpZz8ubG9naW5Db25maWc/LmlzTGlua0Jhc2VkIHx8XG4gICAgICBpc0VtcHR5VmFsdWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1aWRcIikpXG4gICAgKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVpZFwiLCBmb3JtRGF0YS5tb2JpbGUpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFjb25maWc/LmxvZ2luQ29uZmlnPy5pc0xpbmtCYXNlZCB8fFxuICAgICAgaXNFbXB0eVZhbHVlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlcl9pZFwiKSlcbiAgICApIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlcl9pZFwiLCBmb3JtRGF0YS5tb2JpbGUpO1xuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibW9iaWxlXCIsIGZvcm1EYXRhLm1vYmlsZSk7XG4gIH0gZWxzZSBpZiAoZm9ybVR5cGUuaW5jbHVkZXMoXCJVc2VyXCIpKSB7XG4gICAgLy8gU2V0IGxvY2FsIHN0b3JhZ2UgdmFsdWVzIGZvciB1c2VyIGZvcm0gdHlwZSBpZiBjb25kaXRpb25zIGFyZSBtZXQuXG4gICAgaWYgKFxuICAgICAgIWNvbmZpZz8ubG9naW5Db25maWc/LmlzTGlua0Jhc2VkIHx8XG4gICAgICBpc0VtcHR5VmFsdWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJtb2JpbGVcIikpXG4gICAgKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1vYmlsZVwiLCBmb3JtRGF0YS51c2VyX2lkKTtcbiAgICB9XG5cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVpZFwiLCBmb3JtRGF0YS51c2VyX2lkKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJfaWRcIiwgZm9ybURhdGEudXNlcl9pZCk7XG4gIH1cbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aW1lIGluIE1NOlNTIGZvcm1hdCBmb3IgZGlzcGxheS5cbmV4cG9ydCBjb25zdCBnZXRGb3JtYXR0ZWRUaW1lID0gKHZhbHVlKSA9PiB7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICBjb25zdCBzZWNvbmRzID0gdmFsdWUgJSA2MDtcbiAgcmV0dXJuIGAke3BhZGRlZFRpbWUobWludXRlcyl9OiR7cGFkZGVkVGltZShzZWNvbmRzKX1gO1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aW1lIHZhbHVlcyBhcmUgYWx3YXlzIHR3byBkaWdpdHMuXG5leHBvcnQgY29uc3QgcGFkZGVkVGltZSA9ICh0aW1lOiBudW1iZXIpID0+IHtcbiAgcmV0dXJuIHRpbWUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7XG59O1xuIl19