UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

315 lines (314 loc) • 36.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "fieldReducer", { enumerable: true, get: function() { return fieldReducer; } }); const _bsonobjectid = /*#__PURE__*/ _interop_require_default(require("bson-objectid")); const _deepequal = /*#__PURE__*/ _interop_require_default(require("deep-equal")); const _deepCopyObject = require("../../../../utilities/deepCopyObject"); const _getSiblingData = /*#__PURE__*/ _interop_require_default(require("./getSiblingData")); const _reduceFieldsToValues = /*#__PURE__*/ _interop_require_default(require("./reduceFieldsToValues")); const _rows = require("./rows"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function fieldReducer(state, action) { switch(action.type){ case 'REPLACE_STATE': { const newState = {}; // Only update fields that have changed // by comparing old value / initialValue to new // .. // This is a performance enhancement for saving // large documents with hundreds of fields Object.entries(action.state).forEach(([path, field])=>{ const oldField = state[path]; const newField = field; if (!(0, _deepequal.default)(oldField, newField)) { newState[path] = newField; } else if (oldField) { newState[path] = oldField; } }); return newState; } case 'REMOVE': { const newState = { ...state }; if (newState[action.path]) delete newState[action.path]; return newState; } case 'MODIFY_CONDITION': { const { path, result, user } = action; return Object.entries(state).reduce((newState, [fieldPath, field])=>{ if (fieldPath === path || fieldPath.indexOf(`${path}.`) === 0) { let passesCondition = result; // If a condition is being set to true, // Set all conditions to true // Besides those who still fail their own conditions if (passesCondition && field.condition) { passesCondition = Boolean(field.condition((0, _reduceFieldsToValues.default)(state, true), (0, _getSiblingData.default)(state, path), { user })); } return { ...newState, [fieldPath]: { ...field, passesCondition } }; } return { ...newState, [fieldPath]: { ...field } }; }, {}); } case 'UPDATE': { const newField = Object.entries(action).reduce((field, [key, value])=>{ if ([ 'condition', 'disableFormData', 'errorMessage', 'initialValue', 'passesCondition', 'rows', 'valid', 'validate', 'value' ].includes(key)) { return { ...field, [key]: value }; } return field; }, state[action.path] || {}); return { ...state, [action.path]: newField }; } case 'REMOVE_ROW': { const { path, rowIndex } = action; const { remainingFields, rows } = (0, _rows.separateRows)(path, state); const rowsMetadata = [ ...state[path]?.rows || [] ]; rows.splice(rowIndex, 1); rowsMetadata.splice(rowIndex, 1); const newState = { ...remainingFields, [path]: { ...state[path], disableFormData: rows.length > 0, rows: rowsMetadata, value: rows.length }, ...(0, _rows.flattenRows)(path, rows) }; return newState; } case 'ADD_ROW': { const { blockType, path, rowIndex: rowIndexFromArgs, subFieldState } = action; const rowIndex = typeof rowIndexFromArgs === 'number' ? rowIndexFromArgs : state[path]?.rows?.length || 0; const rowsMetadata = [ ...state[path]?.rows || [] ]; rowsMetadata.splice(rowIndex, 0, // new row { id: new _bsonobjectid.default().toHexString(), blockType: blockType || undefined, childErrorPaths: new Set(), collapsed: false }); if (blockType) { subFieldState.blockType = { initialValue: blockType, valid: true, value: blockType }; } // add new row to array _field state_ const { remainingFields, rows: siblingRows } = (0, _rows.separateRows)(path, state); siblingRows.splice(rowIndex, 0, subFieldState); const newState = { ...remainingFields, ...(0, _rows.flattenRows)(path, siblingRows), [path]: { ...state[path], disableFormData: true, rows: rowsMetadata, value: siblingRows.length } }; return newState; } case 'REPLACE_ROW': { const { blockType, path, rowIndex: rowIndexArg, subFieldState } = action; const { remainingFields, rows: siblingRows } = (0, _rows.separateRows)(path, state); const rowIndex = Math.max(0, Math.min(rowIndexArg, siblingRows?.length - 1 || 0)); const rowsMetadata = [ ...state[path]?.rows || [] ]; rowsMetadata[rowIndex] = { id: new _bsonobjectid.default().toHexString(), blockType: blockType || undefined, childErrorPaths: new Set(), collapsed: false }; if (blockType) { subFieldState.blockType = { initialValue: blockType, valid: true, value: blockType }; } // replace form _field state_ siblingRows[rowIndex] = subFieldState; const newState = { ...remainingFields, ...(0, _rows.flattenRows)(path, siblingRows), [path]: { ...state[path], disableFormData: true, rows: rowsMetadata, value: siblingRows.length } }; return newState; } case 'DUPLICATE_ROW': { const { path, rowIndex } = action; const { remainingFields, rows } = (0, _rows.separateRows)(path, state); const rowsMetadata = state[path]?.rows || []; const duplicateRowMetadata = (0, _deepCopyObject.deepCopyObject)(rowsMetadata[rowIndex]); if (duplicateRowMetadata.id) duplicateRowMetadata.id = new _bsonobjectid.default().toHexString(); const duplicateRowState = (0, _deepCopyObject.deepCopyObject)(rows[rowIndex]); if (duplicateRowState.id) duplicateRowState.id = new _bsonobjectid.default().toHexString(); // If there are subfields if (Object.keys(duplicateRowState).length > 0) { // Add new object containing subfield names to unflattenedRows array rows.splice(rowIndex + 1, 0, duplicateRowState); rowsMetadata.splice(rowIndex + 1, 0, duplicateRowMetadata); } const newState = { ...remainingFields, [path]: { ...state[path], disableFormData: true, rows: rowsMetadata, value: rows.length }, ...(0, _rows.flattenRows)(path, rows) }; return newState; } case 'MOVE_ROW': { const { moveFromIndex, moveToIndex, path } = action; const { remainingFields, rows } = (0, _rows.separateRows)(path, state); // copy the row to move const copyOfMovingRow = rows[moveFromIndex]; // delete the row by index rows.splice(moveFromIndex, 1); // insert row copyOfMovingRow back in rows.splice(moveToIndex, 0, copyOfMovingRow); // modify array/block internal row state (i.e. collapsed, blockType) const rowStateCopy = [ ...state[path]?.rows || [] ]; const movingRowState = { ...rowStateCopy[moveFromIndex] }; rowStateCopy.splice(moveFromIndex, 1); rowStateCopy.splice(moveToIndex, 0, movingRowState); const newState = { ...remainingFields, ...(0, _rows.flattenRows)(path, rows), [path]: { ...state[path], rows: rowStateCopy } }; return newState; } case 'SET_ROW_COLLAPSED': { const { collapsed, path, rowID, setDocFieldPreferences } = action; const arrayState = state[path]; const { collapsedRowIDs, matchedIndex } = state[path].rows.reduce((acc, row, index)=>{ const isMatchingRow = row.id === rowID; if (isMatchingRow) acc.matchedIndex = index; if (!isMatchingRow && row.collapsed) acc.collapsedRowIDs.push(row.id); else if (isMatchingRow && collapsed) acc.collapsedRowIDs.push(row.id); return acc; }, { collapsedRowIDs: [], matchedIndex: undefined }); if (matchedIndex > -1) { arrayState.rows[matchedIndex].collapsed = collapsed; setDocFieldPreferences(path, { collapsed: collapsedRowIDs }); } const newState = { ...state, [path]: { ...arrayState } }; return newState; } case 'SET_ALL_ROWS_COLLAPSED': { const { collapsed, path, setDocFieldPreferences } = action; const { collapsedRowIDs, rows } = state[path].rows.reduce((acc, row)=>{ if (collapsed) acc.collapsedRowIDs.push(row.id); acc.rows.push({ ...row, collapsed }); return acc; }, { collapsedRowIDs: [], rows: [] }); setDocFieldPreferences(path, { collapsed: collapsedRowIDs }); return { ...state, [path]: { ...state[path], rows } }; } default: { return state; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL0Zvcm0vZmllbGRSZWR1Y2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPYmplY3RJRCBmcm9tICdic29uLW9iamVjdGlkJ1xuaW1wb3J0IGVxdWFsIGZyb20gJ2RlZXAtZXF1YWwnXG5cbmltcG9ydCB0eXBlIHsgRmllbGRBY3Rpb24sIEZpZWxkcywgRm9ybUZpZWxkIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IHsgZGVlcENvcHlPYmplY3QgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZGVlcENvcHlPYmplY3QnXG5pbXBvcnQgZ2V0U2libGluZ0RhdGEgZnJvbSAnLi9nZXRTaWJsaW5nRGF0YSdcbmltcG9ydCByZWR1Y2VGaWVsZHNUb1ZhbHVlcyBmcm9tICcuL3JlZHVjZUZpZWxkc1RvVmFsdWVzJ1xuaW1wb3J0IHsgZmxhdHRlblJvd3MsIHNlcGFyYXRlUm93cyB9IGZyb20gJy4vcm93cydcblxuLyoqXG4gKiBSZWR1Y2VyIHdoaWNoIG1vZGlmaWVzIHRoZSBmb3JtIGZpZWxkIHN0YXRlIChhbGwgdGhlIGN1cnJlbnQgZGF0YSBvZiB0aGUgZmllbGRzIGluIHRoZSBmb3JtKS4gV2hlbiBjYWxsZWQgdXNpbmcgZGlzcGF0Y2gsIGl0IHdpbGwgcmV0dXJuIGEgbmV3IHN0YXRlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkUmVkdWNlcihzdGF0ZTogRmllbGRzLCBhY3Rpb246IEZpZWxkQWN0aW9uKTogRmllbGRzIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ1JFUExBQ0VfU1RBVEUnOiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHt9XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgLy8gYnkgY29tcGFyaW5nIG9sZCB2YWx1ZSAvIGluaXRpYWxWYWx1ZSB0byBuZXdcbiAgICAgIC8vIC4uXG4gICAgICAvLyBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQgZm9yIHNhdmluZ1xuICAgICAgLy8gbGFyZ2UgZG9jdW1lbnRzIHdpdGggaHVuZHJlZHMgb2YgZmllbGRzXG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKGFjdGlvbi5zdGF0ZSkuZm9yRWFjaCgoW3BhdGgsIGZpZWxkXSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRGaWVsZCA9IHN0YXRlW3BhdGhdXG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkID0gZmllbGRcblxuICAgICAgICBpZiAoIWVxdWFsKG9sZEZpZWxkLCBuZXdGaWVsZCkpIHtcbiAgICAgICAgICBuZXdTdGF0ZVtwYXRoXSA9IG5ld0ZpZWxkXG4gICAgICAgIH0gZWxzZSBpZiAob2xkRmllbGQpIHtcbiAgICAgICAgICBuZXdTdGF0ZVtwYXRoXSA9IG9sZEZpZWxkXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBuZXdTdGF0ZVxuICAgIH1cblxuICAgIGNhc2UgJ1JFTU9WRSc6IHtcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0geyAuLi5zdGF0ZSB9XG4gICAgICBpZiAobmV3U3RhdGVbYWN0aW9uLnBhdGhdKSBkZWxldGUgbmV3U3RhdGVbYWN0aW9uLnBhdGhdXG4gICAgICByZXR1cm4gbmV3U3RhdGVcbiAgICB9XG5cbiAgICBjYXNlICdNT0RJRllfQ09ORElUSU9OJzoge1xuICAgICAgY29uc3QgeyBwYXRoLCByZXN1bHQsIHVzZXIgfSA9IGFjdGlvblxuXG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc3RhdGUpLnJlZHVjZSgobmV3U3RhdGUsIFtmaWVsZFBhdGgsIGZpZWxkXSkgPT4ge1xuICAgICAgICBpZiAoZmllbGRQYXRoID09PSBwYXRoIHx8IGZpZWxkUGF0aC5pbmRleE9mKGAke3BhdGh9LmApID09PSAwKSB7XG4gICAgICAgICAgbGV0IHBhc3Nlc0NvbmRpdGlvbiA9IHJlc3VsdFxuXG4gICAgICAgICAgLy8gSWYgYSBjb25kaXRpb24gaXMgYmVpbmcgc2V0IHRvIHRydWUsXG4gICAgICAgICAgLy8gU2V0IGFsbCBjb25kaXRpb25zIHRvIHRydWVcbiAgICAgICAgICAvLyBCZXNpZGVzIHRob3NlIHdobyBzdGlsbCBmYWlsIHRoZWlyIG93biBjb25kaXRpb25zXG5cbiAgICAgICAgICBpZiAocGFzc2VzQ29uZGl0aW9uICYmIGZpZWxkLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgcGFzc2VzQ29uZGl0aW9uID0gQm9vbGVhbihcbiAgICAgICAgICAgICAgZmllbGQuY29uZGl0aW9uKHJlZHVjZUZpZWxkc1RvVmFsdWVzKHN0YXRlLCB0cnVlKSwgZ2V0U2libGluZ0RhdGEoc3RhdGUsIHBhdGgpLCB7XG4gICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICAgICAgW2ZpZWxkUGF0aF06IHtcbiAgICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICAgIHBhc3Nlc0NvbmRpdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICBbZmllbGRQYXRoXToge1xuICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSwge30pXG4gICAgfVxuXG4gICAgY2FzZSAnVVBEQVRFJzoge1xuICAgICAgY29uc3QgbmV3RmllbGQgPSBPYmplY3QuZW50cmllcyhhY3Rpb24pLnJlZHVjZShcbiAgICAgICAgKGZpZWxkLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICdjb25kaXRpb24nLFxuICAgICAgICAgICAgICAnZGlzYWJsZUZvcm1EYXRhJyxcbiAgICAgICAgICAgICAgJ2Vycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAgICdpbml0aWFsVmFsdWUnLFxuICAgICAgICAgICAgICAncGFzc2VzQ29uZGl0aW9uJyxcbiAgICAgICAgICAgICAgJ3Jvd3MnLFxuICAgICAgICAgICAgICAndmFsaWQnLFxuICAgICAgICAgICAgICAndmFsaWRhdGUnLFxuICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgICAgW2tleV06IHZhbHVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmaWVsZFxuICAgICAgICB9LFxuICAgICAgICBzdGF0ZVthY3Rpb24ucGF0aF0gfHwgKHt9IGFzIEZvcm1GaWVsZCksXG4gICAgICApXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBbYWN0aW9uLnBhdGhdOiBuZXdGaWVsZCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdSRU1PVkVfUk9XJzoge1xuICAgICAgY29uc3QgeyBwYXRoLCByb3dJbmRleCB9ID0gYWN0aW9uXG4gICAgICBjb25zdCB7IHJlbWFpbmluZ0ZpZWxkcywgcm93cyB9ID0gc2VwYXJhdGVSb3dzKHBhdGgsIHN0YXRlKVxuICAgICAgY29uc3Qgcm93c01ldGFkYXRhID0gWy4uLihzdGF0ZVtwYXRoXT8ucm93cyB8fCBbXSldXG5cbiAgICAgIHJvd3Muc3BsaWNlKHJvd0luZGV4LCAxKVxuICAgICAgcm93c01ldGFkYXRhLnNwbGljZShyb3dJbmRleCwgMSlcblxuICAgICAgY29uc3QgbmV3U3RhdGU6IEZpZWxkcyA9IHtcbiAgICAgICAgLi4ucmVtYWluaW5nRmllbGRzLFxuICAgICAgICBbcGF0aF06IHtcbiAgICAgICAgICAuLi5zdGF0ZVtwYXRoXSxcbiAgICAgICAgICBkaXNhYmxlRm9ybURhdGE6IHJvd3MubGVuZ3RoID4gMCxcbiAgICAgICAgICByb3dzOiByb3dzTWV0YWRhdGEsXG4gICAgICAgICAgdmFsdWU6IHJvd3MubGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgICAuLi5mbGF0dGVuUm93cyhwYXRoLCByb3dzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgfVxuXG4gICAgY2FzZSAnQUREX1JPVyc6IHtcbiAgICAgIGNvbnN0IHsgYmxvY2tUeXBlLCBwYXRoLCByb3dJbmRleDogcm93SW5kZXhGcm9tQXJncywgc3ViRmllbGRTdGF0ZSB9ID0gYWN0aW9uXG4gICAgICBjb25zdCByb3dJbmRleCA9XG4gICAgICAgIHR5cGVvZiByb3dJbmRleEZyb21BcmdzID09PSAnbnVtYmVyJyA/IHJvd0luZGV4RnJvbUFyZ3MgOiBzdGF0ZVtwYXRoXT8ucm93cz8ubGVuZ3RoIHx8IDBcblxuICAgICAgY29uc3Qgcm93c01ldGFkYXRhID0gWy4uLihzdGF0ZVtwYXRoXT8ucm93cyB8fCBbXSldXG4gICAgICByb3dzTWV0YWRhdGEuc3BsaWNlKFxuICAgICAgICByb3dJbmRleCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gbmV3IHJvd1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IG5ldyBPYmplY3RJRCgpLnRvSGV4U3RyaW5nKCksXG4gICAgICAgICAgYmxvY2tUeXBlOiBibG9ja1R5cGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGNoaWxkRXJyb3JQYXRoczogbmV3IFNldCgpLFxuICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIGlmIChibG9ja1R5cGUpIHtcbiAgICAgICAgc3ViRmllbGRTdGF0ZS5ibG9ja1R5cGUgPSB7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBibG9ja1R5cGUsXG4gICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgbmV3IHJvdyB0byBhcnJheSBfZmllbGQgc3RhdGVfXG4gICAgICBjb25zdCB7IHJlbWFpbmluZ0ZpZWxkcywgcm93czogc2libGluZ1Jvd3MgfSA9IHNlcGFyYXRlUm93cyhwYXRoLCBzdGF0ZSlcbiAgICAgIHNpYmxpbmdSb3dzLnNwbGljZShyb3dJbmRleCwgMCwgc3ViRmllbGRTdGF0ZSlcblxuICAgICAgY29uc3QgbmV3U3RhdGU6IEZpZWxkcyA9IHtcbiAgICAgICAgLi4ucmVtYWluaW5nRmllbGRzLFxuICAgICAgICAuLi5mbGF0dGVuUm93cyhwYXRoLCBzaWJsaW5nUm93cyksXG4gICAgICAgIFtwYXRoXToge1xuICAgICAgICAgIC4uLnN0YXRlW3BhdGhdLFxuICAgICAgICAgIGRpc2FibGVGb3JtRGF0YTogdHJ1ZSxcbiAgICAgICAgICByb3dzOiByb3dzTWV0YWRhdGEsXG4gICAgICAgICAgdmFsdWU6IHNpYmxpbmdSb3dzLmxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgfVxuXG4gICAgY2FzZSAnUkVQTEFDRV9ST1cnOiB7XG4gICAgICBjb25zdCB7IGJsb2NrVHlwZSwgcGF0aCwgcm93SW5kZXg6IHJvd0luZGV4QXJnLCBzdWJGaWVsZFN0YXRlIH0gPSBhY3Rpb25cbiAgICAgIGNvbnN0IHsgcmVtYWluaW5nRmllbGRzLCByb3dzOiBzaWJsaW5nUm93cyB9ID0gc2VwYXJhdGVSb3dzKHBhdGgsIHN0YXRlKVxuICAgICAgY29uc3Qgcm93SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyb3dJbmRleEFyZywgc2libGluZ1Jvd3M/Lmxlbmd0aCAtIDEgfHwgMCkpXG5cbiAgICAgIGNvbnN0IHJvd3NNZXRhZGF0YSA9IFsuLi4oc3RhdGVbcGF0aF0/LnJvd3MgfHwgW10pXVxuICAgICAgcm93c01ldGFkYXRhW3Jvd0luZGV4XSA9IHtcbiAgICAgICAgaWQ6IG5ldyBPYmplY3RJRCgpLnRvSGV4U3RyaW5nKCksXG4gICAgICAgIGJsb2NrVHlwZTogYmxvY2tUeXBlIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgY2hpbGRFcnJvclBhdGhzOiBuZXcgU2V0KCksXG4gICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICB9XG5cbiAgICAgIGlmIChibG9ja1R5cGUpIHtcbiAgICAgICAgc3ViRmllbGRTdGF0ZS5ibG9ja1R5cGUgPSB7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlOiBibG9ja1R5cGUsXG4gICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyByZXBsYWNlIGZvcm0gX2ZpZWxkIHN0YXRlX1xuICAgICAgc2libGluZ1Jvd3Nbcm93SW5kZXhdID0gc3ViRmllbGRTdGF0ZVxuXG4gICAgICBjb25zdCBuZXdTdGF0ZTogRmllbGRzID0ge1xuICAgICAgICAuLi5yZW1haW5pbmdGaWVsZHMsXG4gICAgICAgIC4uLmZsYXR0ZW5Sb3dzKHBhdGgsIHNpYmxpbmdSb3dzKSxcbiAgICAgICAgW3BhdGhdOiB7XG4gICAgICAgICAgLi4uc3RhdGVbcGF0aF0sXG4gICAgICAgICAgZGlzYWJsZUZvcm1EYXRhOiB0cnVlLFxuICAgICAgICAgIHJvd3M6IHJvd3NNZXRhZGF0YSxcbiAgICAgICAgICB2YWx1ZTogc2libGluZ1Jvd3MubGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGVcbiAgICB9XG5cbiAgICBjYXNlICdEVVBMSUNBVEVfUk9XJzoge1xuICAgICAgY29uc3QgeyBwYXRoLCByb3dJbmRleCB9ID0gYWN0aW9uXG4gICAgICBjb25zdCB7IHJlbWFpbmluZ0ZpZWxkcywgcm93cyB9ID0gc2VwYXJhdGVSb3dzKHBhdGgsIHN0YXRlKVxuICAgICAgY29uc3Qgcm93c01ldGFkYXRhID0gc3RhdGVbcGF0aF0/LnJvd3MgfHwgW11cblxuICAgICAgY29uc3QgZHVwbGljYXRlUm93TWV0YWRhdGEgPSBkZWVwQ29weU9iamVjdChyb3dzTWV0YWRhdGFbcm93SW5kZXhdKVxuICAgICAgaWYgKGR1cGxpY2F0ZVJvd01ldGFkYXRhLmlkKSBkdXBsaWNhdGVSb3dNZXRhZGF0YS5pZCA9IG5ldyBPYmplY3RJRCgpLnRvSGV4U3RyaW5nKClcblxuICAgICAgY29uc3QgZHVwbGljYXRlUm93U3RhdGUgPSBkZWVwQ29weU9iamVjdChyb3dzW3Jvd0luZGV4XSlcbiAgICAgIGlmIChkdXBsaWNhdGVSb3dTdGF0ZS5pZCkgZHVwbGljYXRlUm93U3RhdGUuaWQgPSBuZXcgT2JqZWN0SUQoKS50b0hleFN0cmluZygpXG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzdWJmaWVsZHNcbiAgICAgIGlmIChPYmplY3Qua2V5cyhkdXBsaWNhdGVSb3dTdGF0ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBZGQgbmV3IG9iamVjdCBjb250YWluaW5nIHN1YmZpZWxkIG5hbWVzIHRvIHVuZmxhdHRlbmVkUm93cyBhcnJheVxuICAgICAgICByb3dzLnNwbGljZShyb3dJbmRleCArIDEsIDAsIGR1cGxpY2F0ZVJvd1N0YXRlKVxuICAgICAgICByb3dzTWV0YWRhdGEuc3BsaWNlKHJvd0luZGV4ICsgMSwgMCwgZHVwbGljYXRlUm93TWV0YWRhdGEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICAuLi5yZW1haW5pbmdGaWVsZHMsXG4gICAgICAgIFtwYXRoXToge1xuICAgICAgICAgIC4uLnN0YXRlW3BhdGhdLFxuICAgICAgICAgIGRpc2FibGVGb3JtRGF0YTogdHJ1ZSxcbiAgICAgICAgICByb3dzOiByb3dzTWV0YWRhdGEsXG4gICAgICAgICAgdmFsdWU6IHJvd3MubGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgICAuLi5mbGF0dGVuUm93cyhwYXRoLCByb3dzKSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgfVxuXG4gICAgY2FzZSAnTU9WRV9ST1cnOiB7XG4gICAgICBjb25zdCB7IG1vdmVGcm9tSW5kZXgsIG1vdmVUb0luZGV4LCBwYXRoIH0gPSBhY3Rpb25cbiAgICAgIGNvbnN0IHsgcmVtYWluaW5nRmllbGRzLCByb3dzIH0gPSBzZXBhcmF0ZVJvd3MocGF0aCwgc3RhdGUpXG5cbiAgICAgIC8vIGNvcHkgdGhlIHJvdyB0byBtb3ZlXG4gICAgICBjb25zdCBjb3B5T2ZNb3ZpbmdSb3cgPSByb3dzW21vdmVGcm9tSW5kZXhdXG4gICAgICAvLyBkZWxldGUgdGhlIHJvdyBieSBpbmRleFxuICAgICAgcm93cy5zcGxpY2UobW92ZUZyb21JbmRleCwgMSlcbiAgICAgIC8vIGluc2VydCByb3cgY29weU9mTW92aW5nUm93IGJhY2sgaW5cbiAgICAgIHJvd3Muc3BsaWNlKG1vdmVUb0luZGV4LCAwLCBjb3B5T2ZNb3ZpbmdSb3cpXG5cbiAgICAgIC8vIG1vZGlmeSBhcnJheS9ibG9jayBpbnRlcm5hbCByb3cgc3RhdGUgKGkuZS4gY29sbGFwc2VkLCBibG9ja1R5cGUpXG4gICAgICBjb25zdCByb3dTdGF0ZUNvcHkgPSBbLi4uKHN0YXRlW3BhdGhdPy5yb3dzIHx8IFtdKV1cbiAgICAgIGNvbnN0IG1vdmluZ1Jvd1N0YXRlID0geyAuLi5yb3dTdGF0ZUNvcHlbbW92ZUZyb21JbmRleF0gfVxuICAgICAgcm93U3RhdGVDb3B5LnNwbGljZShtb3ZlRnJvbUluZGV4LCAxKVxuICAgICAgcm93U3RhdGVDb3B5LnNwbGljZShtb3ZlVG9JbmRleCwgMCwgbW92aW5nUm93U3RhdGUpXG5cbiAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICAuLi5yZW1haW5pbmdGaWVsZHMsXG4gICAgICAgIC4uLmZsYXR0ZW5Sb3dzKHBhdGgsIHJvd3MpLFxuICAgICAgICBbcGF0aF06IHtcbiAgICAgICAgICAuLi5zdGF0ZVtwYXRoXSxcbiAgICAgICAgICByb3dzOiByb3dTdGF0ZUNvcHksXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdTdGF0ZVxuICAgIH1cblxuICAgIGNhc2UgJ1NFVF9ST1dfQ09MTEFQU0VEJzoge1xuICAgICAgY29uc3QgeyBjb2xsYXBzZWQsIHBhdGgsIHJvd0lELCBzZXREb2NGaWVsZFByZWZlcmVuY2VzIH0gPSBhY3Rpb25cblxuICAgICAgY29uc3QgYXJyYXlTdGF0ZSA9IHN0YXRlW3BhdGhdXG5cbiAgICAgIGNvbnN0IHsgY29sbGFwc2VkUm93SURzLCBtYXRjaGVkSW5kZXggfSA9IHN0YXRlW3BhdGhdLnJvd3MucmVkdWNlKFxuICAgICAgICAoYWNjLCByb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNNYXRjaGluZ1JvdyA9IHJvdy5pZCA9PT0gcm93SURcbiAgICAgICAgICBpZiAoaXNNYXRjaGluZ1JvdykgYWNjLm1hdGNoZWRJbmRleCA9IGluZGV4XG5cbiAgICAgICAgICBpZiAoIWlzTWF0Y2hpbmdSb3cgJiYgcm93LmNvbGxhcHNlZCkgYWNjLmNvbGxhcHNlZFJvd0lEcy5wdXNoKHJvdy5pZClcbiAgICAgICAgICBlbHNlIGlmIChpc01hdGNoaW5nUm93ICYmIGNvbGxhcHNlZCkgYWNjLmNvbGxhcHNlZFJvd0lEcy5wdXNoKHJvdy5pZClcblxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbGxhcHNlZFJvd0lEczogW10sXG4gICAgICAgICAgbWF0Y2hlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIGlmIChtYXRjaGVkSW5kZXggPiAtMSkge1xuICAgICAgICBhcnJheVN0YXRlLnJvd3NbbWF0Y2hlZEluZGV4XS5jb2xsYXBzZWQgPSBjb2xsYXBzZWRcbiAgICAgICAgc2V0RG9jRmllbGRQcmVmZXJlbmNlcyhwYXRoLCB7IGNvbGxhcHNlZDogY29sbGFwc2VkUm93SURzIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgW3BhdGhdOiB7XG4gICAgICAgICAgLi4uYXJyYXlTdGF0ZSxcbiAgICAgICAgfSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgfVxuXG4gICAgY2FzZSAnU0VUX0FMTF9ST1dTX0NPTExBUFNFRCc6IHtcbiAgICAgIGNvbnN0IHsgY29sbGFwc2VkLCBwYXRoLCBzZXREb2NGaWVsZFByZWZlcmVuY2VzIH0gPSBhY3Rpb25cblxuICAgICAgY29uc3QgeyBjb2xsYXBzZWRSb3dJRHMsIHJvd3MgfSA9IHN0YXRlW3BhdGhdLnJvd3MucmVkdWNlKFxuICAgICAgICAoYWNjLCByb3cpID0+IHtcbiAgICAgICAgICBpZiAoY29sbGFwc2VkKSBhY2MuY29sbGFwc2VkUm93SURzLnB1c2gocm93LmlkKVxuXG4gICAgICAgICAgYWNjLnJvd3MucHVzaCh7XG4gICAgICAgICAgICAuLi5yb3csXG4gICAgICAgICAgICBjb2xsYXBzZWQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbGxhcHNlZFJvd0lEczogW10sXG4gICAgICAgICAgcm93czogW10sXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIHNldERvY0ZpZWxkUHJlZmVyZW5jZXMocGF0aCwgeyBjb2xsYXBzZWQ6IGNvbGxhcHNlZFJvd0lEcyB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgW3BhdGhdOiB7XG4gICAgICAgICAgLi4uc3RhdGVbcGF0aF0sXG4gICAgICAgICAgcm93cyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGVcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJmaWVsZFJlZHVjZXIiLCJzdGF0ZSIsImFjdGlvbiIsInR5cGUiLCJuZXdTdGF0ZSIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwicGF0aCIsImZpZWxkIiwib2xkRmllbGQiLCJuZXdGaWVsZCIsImVxdWFsIiwicmVzdWx0IiwidXNlciIsInJlZHVjZSIsImZpZWxkUGF0aCIsImluZGV4T2YiLCJwYXNzZXNDb25kaXRpb24iLCJjb25kaXRpb24iLCJCb29sZWFuIiwicmVkdWNlRmllbGRzVG9WYWx1ZXMiLCJnZXRTaWJsaW5nRGF0YSIsImtleSIsInZhbHVlIiwiaW5jbHVkZXMiLCJyb3dJbmRleCIsInJlbWFpbmluZ0ZpZWxkcyIsInJvd3MiLCJzZXBhcmF0ZVJvd3MiLCJyb3dzTWV0YWRhdGEiLCJzcGxpY2UiLCJkaXNhYmxlRm9ybURhdGEiLCJsZW5ndGgiLCJmbGF0dGVuUm93cyIsImJsb2NrVHlwZSIsInJvd0luZGV4RnJvbUFyZ3MiLCJzdWJGaWVsZFN0YXRlIiwiaWQiLCJPYmplY3RJRCIsInRvSGV4U3RyaW5nIiwidW5kZWZpbmVkIiwiY2hpbGRFcnJvclBhdGhzIiwiU2V0IiwiY29sbGFwc2VkIiwiaW5pdGlhbFZhbHVlIiwidmFsaWQiLCJzaWJsaW5nUm93cyIsInJvd0luZGV4QXJnIiwiTWF0aCIsIm1heCIsIm1pbiIsImR1cGxpY2F0ZVJvd01ldGFkYXRhIiwiZGVlcENvcHlPYmplY3QiLCJkdXBsaWNhdGVSb3dTdGF0ZSIsImtleXMiLCJtb3ZlRnJvbUluZGV4IiwibW92ZVRvSW5kZXgiLCJjb3B5T2ZNb3ZpbmdSb3ciLCJyb3dTdGF0ZUNvcHkiLCJtb3ZpbmdSb3dTdGF0ZSIsInJvd0lEIiwic2V0RG9jRmllbGRQcmVmZXJlbmNlcyIsImFycmF5U3RhdGUiLCJjb2xsYXBzZWRSb3dJRHMiLCJtYXRjaGVkSW5kZXgiLCJhY2MiLCJyb3ciLCJpbmRleCIsImlzTWF0Y2hpbmdSb3ciLCJwdXNoIl0sIm1hcHBpbmdzIjoiOzs7OytCQWFnQkE7OztlQUFB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