@fluid-experimental/property-changeset 1.2.7 → 2.0.0-dev.1.3.0.96595

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/changeset.d.ts +39 -45
  2. package/dist/changeset.d.ts.map +1 -1
  3. package/dist/changeset.js +42 -51
  4. package/dist/changeset.js.map +1 -1
  5. package/dist/changeset_operations/array.d.ts +34 -3
  6. package/dist/changeset_operations/array.d.ts.map +1 -1
  7. package/dist/changeset_operations/array.js +97 -94
  8. package/dist/changeset_operations/array.js.map +1 -1
  9. package/dist/changeset_operations/indexedCollection.d.ts +13 -15
  10. package/dist/changeset_operations/indexedCollection.d.ts.map +1 -1
  11. package/dist/changeset_operations/indexedCollection.js +14 -15
  12. package/dist/changeset_operations/indexedCollection.js.map +1 -1
  13. package/dist/helpers/typeidHelper.d.ts +14 -14
  14. package/dist/helpers/typeidHelper.d.ts.map +1 -1
  15. package/dist/helpers/typeidHelper.js +24 -34
  16. package/dist/helpers/typeidHelper.js.map +1 -1
  17. package/dist/pathHelper.d.ts +5 -5
  18. package/dist/pathHelper.d.ts.map +1 -1
  19. package/dist/pathHelper.js +54 -56
  20. package/dist/pathHelper.js.map +1 -1
  21. package/dist/templateValidator.d.ts +62 -30
  22. package/dist/templateValidator.d.ts.map +1 -1
  23. package/dist/templateValidator.js +128 -94
  24. package/dist/templateValidator.js.map +1 -1
  25. package/dist/test/array.spec.js +3 -6
  26. package/dist/test/array.spec.js.map +1 -1
  27. package/dist/test/pathHelper.spec.js +2 -4
  28. package/dist/test/pathHelper.spec.js.map +1 -1
  29. package/dist/test/reversibleCs.spec.js +2 -4
  30. package/dist/test/reversibleCs.spec.js.map +1 -1
  31. package/dist/test/tsconfig.tsbuildinfo +1 -1
  32. package/dist/test/validator/templateValidator.spec.js +5 -10
  33. package/dist/test/validator/templateValidator.spec.js.map +1 -1
  34. package/dist/utils.d.ts +137 -109
  35. package/dist/utils.d.ts.map +1 -1
  36. package/dist/utils.js +167 -174
  37. package/dist/utils.js.map +1 -1
  38. package/dist/validationResultBuilder.d.ts +6 -8
  39. package/dist/validationResultBuilder.d.ts.map +1 -1
  40. package/dist/validationResultBuilder.js +5 -11
  41. package/dist/validationResultBuilder.js.map +1 -1
  42. package/lib/changeset.js +42 -51
  43. package/lib/changeset.js.map +1 -1
  44. package/lib/changeset_operations/array.js +97 -94
  45. package/lib/changeset_operations/array.js.map +1 -1
  46. package/lib/changeset_operations/indexedCollection.js +14 -15
  47. package/lib/changeset_operations/indexedCollection.js.map +1 -1
  48. package/lib/helpers/typeidHelper.js +24 -34
  49. package/lib/helpers/typeidHelper.js.map +1 -1
  50. package/lib/pathHelper.js +54 -56
  51. package/lib/pathHelper.js.map +1 -1
  52. package/lib/templateValidator.js +128 -94
  53. package/lib/templateValidator.js.map +1 -1
  54. package/lib/utils.js +167 -174
  55. package/lib/utils.js.map +1 -1
  56. package/lib/validationResultBuilder.js +5 -11
  57. package/lib/validationResultBuilder.js.map +1 -1
  58. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/changeset_operations/array.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/**\n * @fileoverview Helper functions and classes to work with array ChangeSets\n */\n import { copy as cloneDeep } from \"fastest-json-copy\";\n import isNumber from \"lodash/isNumber\";\n import isString from \"lodash/isString\";\n import isEqual from \"lodash/isEqual\";\n\n// @ts-ignore\nimport { ConsoleUtils, constants } from \"@fluid-experimental/property-common\";\nimport { ApplyChangeSetOptions, ConflictInfo, SerializedChangeSet } from \"../changeset\";\nimport { TypeIdHelper } from \"../helpers/typeidHelper\";\nimport { ArrayChangeSetIterator, arrayInsertList, arrayModifyList, arrayRemoveList, GenericOperation, InsertOperation, ModifyOperation, NoneNOPOperation, NOPOperation, RemoveOperation } from \"./arrayChangesetIterator\";\nimport { ConflictType } from \"./changesetConflictTypes\";\n\nconst { MSG } = constants;\nconst { isPrimitiveType } = TypeIdHelper;\n\n/**\n * The range combinations of two change sets (A and B)\n * This can either be complete operations, parts of complete operations or overlapping segments\n * @enum number\n */\nenum ArrayChangeSetRangeType {\n completeA, // a complete operation of change set A\n completeB, // a complete operation of change set B\n partOfA, // a partial operation of change set A\n partOfB, // a partial operation of change set B\n completeApartOfB, // a complete operation of change set A overlapping with a partial operation of change set B\n completeBpartOfA, // a complete operation of change set B overlapping with a partial operation of change set A\n completeAcompleteB, // a complete operation of change set A overlapping a complete operation of change set B\n partOfApartOfB, // a partial operation of change set A, a partial operation of change set B\n}\n\ninterface SegmentType<T = GenericOperation, K = GenericOperation, L = GenericOperation> {\n begin?: number;\n op?: T;\n flag?: ArrayChangeSetRangeType;\n opA?: K;\n opB?: L;\n removeInsertOperationA?: arrayRemoveList | arrayInsertList;\n\n}\n\n/**\n * A range of an array operation\n */\n// TODO: Cleaning up these types using discriminated union\nexport interface OperationRangeDescription<T = GenericOperation> {\n opA?: any;\n opB?: any;\n insertAlreadyProcessed?: boolean;\n removeInsertOperationB?: arrayRemoveList | arrayInsertList;\n removeInsertOperation?: arrayRemoveList | arrayInsertList;\n removeInsertOperationA?: arrayRemoveList | arrayInsertList;\n op?: T;\n begin?: number;\n end?: number;\n flag?: ArrayChangeSetRangeType;\n\n}\n\n/**\n * A range of an insert array operation\n */\nexport interface OperationRangeInsert extends OperationRangeDescription<InsertOperation> {\n removeInsertOperationB?: arrayInsertList;\n removeInsertOperation?: arrayInsertList;\n removeInsertOperationA?: arrayInsertList;\n}\n\n/**\n * A range of a remove array operation\n */\nexport interface OperationRangeRemove extends OperationRangeDescription<RemoveOperation> {\n removeInsertOperationB?: arrayRemoveList;\n removeInsertOperation?: arrayRemoveList;\n removeInsertOperationA?: arrayRemoveList;\n}\n\n/**\n* A range of a modify array operation\n*/\nexport interface OperationRangeModify extends Omit<OperationRangeDescription<ModifyOperation>,\n 'removeInsertOperationB' | 'removeInsertOperation' | 'removeInsertOperationA'> { }\n\n/**\n* A range of a NOP array operation\n*/\nexport interface OperationRangeNOP extends Omit<OperationRangeDescription<NOPOperation>,\n 'removeInsertOperationB' | 'removeInsertOperation' | 'removeInsertOperationA'> { }\n\n/**\n * A range of a none NOP array operation\n */\nexport type OperationRangeNoneNOP = OperationRangeInsert | OperationRangeRemove | OperationRangeModify;\n\nexport type OperationRange = OperationRangeNoneNOP | OperationRangeNOP;\n\n/**\n * compute a range for an operation of the current change set\n * @param io_operation input\n * @param in_aOffset the offset that needs to be added to transform the operation\n * @param io_resultingRange\n * the computed range\n */\nconst getRangeForCurrentStateOperation = function(io_operation: GenericOperation, in_aOffset: number, io_resultingRange: OperationRange) {\n if (!io_operation) {\n return;\n }\n if (io_operation.type === ArrayChangeSetIterator.types.NOP) {\n const dummyOp: NOPOperation = {\n type: ArrayChangeSetIterator.types.NOP,\n offset: in_aOffset,\n };\n io_resultingRange.begin = undefined;\n io_resultingRange.end = undefined;\n io_resultingRange.op = dummyOp;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n }\n\n io_operation.operation[0] += in_aOffset;\n switch (io_operation.type) {\n case ArrayChangeSetIterator.types.INSERT:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n case ArrayChangeSetIterator.types.REMOVE:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0];\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n (io_resultingRange as OperationRangeRemove).removeInsertOperation = io_operation.removeInsertOperation;\n return;\n case ArrayChangeSetIterator.types.MODIFY:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n default:\n throw new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n }\n};\n\nconst getOpLength = (op: arrayRemoveList) => isNumber(op[1]) ? op[1] : op[1].length;\n\n/**\n * computes the impact range for a given operation of the applied change set\n * @param in_operation the op\n * @param io_resultingRange the computed range\n * @param in_flag the flag for the resulting range, default is 'complete B'\n * @param in_options - Optional additional parameters\n */\nconst getRangeForAppliedOperation = function(\n in_operation: GenericOperation,\n io_resultingRange: OperationRangeDescription,\n in_flag?: ArrayChangeSetRangeType,\n in_options?: ApplyChangeSetOptions,\n) {\n if (!in_operation || in_operation.type === ArrayChangeSetIterator.types.NOP) {\n io_resultingRange.begin = undefined;\n io_resultingRange.end = undefined;\n io_resultingRange.op = undefined;\n io_resultingRange.flag = undefined;\n return;\n }\n if (!io_resultingRange.op) {\n io_resultingRange.op = {} as any;\n }\n io_resultingRange.op.type = in_operation.type;\n io_resultingRange.op.offset = in_operation.offset;\n if (!io_resultingRange.op.operation) {\n io_resultingRange.op.operation = [];\n }\n io_resultingRange.op.operation[0] = in_operation.operation[0];\n\n io_resultingRange.begin = in_operation.operation[0];\n io_resultingRange.op._absoluteBegin = in_operation.operation[0];\n if (in_flag !== undefined) {\n io_resultingRange.flag = in_flag;\n } else {\n io_resultingRange.flag = ArrayChangeSetRangeType.completeB;\n }\n\n switch (in_operation.type) {\n case ArrayChangeSetIterator.types.INSERT:\n io_resultingRange.end = in_operation.operation[0];\n io_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n if (in_options && in_options.applyAfterMetaInformation) {\n const metaInformation = in_options.applyAfterMetaInformation.get(in_operation.operation[1]);\n if (metaInformation) {\n in_options.applyAfterMetaInformation.set(io_resultingRange.op.operation[1], metaInformation);\n }\n }\n return;\n case ArrayChangeSetIterator.types.REMOVE:\n let numberOfRemovedElements = getOpLength(in_operation.operation);\n\n io_resultingRange.end = in_operation.operation[0] + numberOfRemovedElements;\n if (Array.isArray(in_operation.operation[1])) {\n io_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n } else {\n io_resultingRange.op.operation[1] = in_operation.operation[1];\n }\n io_resultingRange.removeInsertOperation = in_operation.removeInsertOperation;\n return;\n case ArrayChangeSetIterator.types.MODIFY:\n io_resultingRange.end = in_operation.operation[0] + in_operation.operation[1].length;\n io_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n if (in_operation.operation[2] !== undefined) {\n io_resultingRange.op.operation[2] = in_operation.operation[2].slice();\n }\n return;\n default:\n throw new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n }\n};\n\n/**\n * Splits the second and third parameter in an array remove or modify operation into two segments.\n * This treats the three possible cases array, string and length that are allowed in a remove operation\n *\n * @param in_firstResult - Place where the first half is stored\n * @param in_secondResult - Place where the second half is stored\n * @param in_data - The original operation\n * @param in_start - Index at which the operation is split\n * @private\n */\nconst _splitArrayParameter = function(\n in_firstResult: arrayModifyList | arrayRemoveList,\n in_secondResult: arrayModifyList | arrayRemoveList,\n in_data: arrayModifyList | arrayRemoveList,\n in_start: number,\n) {\n let firstTmp: any;\n if (isString(in_data[1])) {\n firstTmp = in_data[1].substr(0, in_start);\n in_secondResult[1] = in_data[1].substr(in_start);\n if (in_firstResult) {\n in_firstResult[1] = firstTmp;\n }\n if (in_data[2] !== undefined && isString(in_data[2])) {\n firstTmp = in_data[2].substr(0, in_start);\n in_secondResult[2] = in_data[2].substr(in_start);\n if (in_firstResult) {\n in_firstResult[2] = firstTmp;\n }\n }\n } else if (Array.isArray(in_data[1])) {\n firstTmp = in_data[1].splice(0, in_start);\n in_secondResult[1] = in_data[1];\n if (in_firstResult) {\n in_firstResult[1] = firstTmp;\n }\n if (in_data[2] !== undefined && Array.isArray(in_data[2])) {\n firstTmp = in_data[2].splice(0, in_start);\n in_secondResult[2] = in_data[2];\n if (in_firstResult) {\n in_firstResult[2] = firstTmp;\n }\n }\n } else {\n if (in_firstResult) {\n in_firstResult[1] = in_start;\n }\n in_secondResult[1] = in_data[1] - in_start;\n }\n};\n\n/**\n * Splits an operation for the splitOverlapping function\n *\n * @param in_targetRange - The range to split\n * @param in_targetOperation - The target operation into which the split range is written\n * @param lengthUsedInResultSegment - The length of the range to split\n * @param in_updateOffset - Should the offset in the target range be updated?\n */\nconst _splitOperation = function(\n in_targetRange: OperationRangeDescription<NoneNOPOperation>,\n in_targetOperation: NoneNOPOperation,\n lengthUsedInResultSegment: number,\n in_updateOffset: boolean,\n) {\n _splitArrayParameter(in_targetOperation.operation, in_targetRange.op.operation,\n in_targetRange.op.operation, lengthUsedInResultSegment);\n\n if (in_updateOffset) {\n if (in_targetRange.op.type === ArrayChangeSetIterator.types.INSERT) {\n in_targetRange.op.offset += lengthUsedInResultSegment;\n }\n if (in_targetRange.op.type === ArrayChangeSetIterator.types.REMOVE) {\n in_targetRange.op.offset -= lengthUsedInResultSegment;\n }\n }\n};\n\n/**\n * Copies an array operation\n * @param in_sourceOperation - The source operation\n * @param in_targetOperation - The target operation which will be overwritten\n */\nconst _copyOperation = function(in_sourceOperation: NoneNOPOperation, in_targetOperation: NoneNOPOperation) {\n if (in_sourceOperation.type === ArrayChangeSetIterator.types.REMOVE) {\n in_targetOperation.operation[1] = in_sourceOperation.operation[1];\n } else {\n in_targetOperation.operation[1] = in_sourceOperation.operation[1].slice();\n if (in_sourceOperation.operation[2] !== undefined) {\n in_targetOperation.operation[2] = in_sourceOperation.operation[2].slice();\n }\n }\n};\n\n/**\n * cut overlapping ranges in non-overlapping and completely overlapping segments\n * ranges of length 0 just cut lengthy ranges\n * @param io_rangeA input A\n * @param io_rangeB input B\n * @param io_resultingSegment the resulting overlapping segment\n * @param in_rebasing is this function called for rebasing - we have to implement two different\n * behaviors of this function: one for squashing and one for rebasing, because an insert-insert\n * operation in squashing should be separte segments, while for rebasing, we need one segment\n * for both inserts to be able to report a conflict.\n * overlapping range or\n * (partial) A or B\n */\n// eslint-disable-next-line complexity\nconst splitOverlapping = function(\n io_rangeA: OperationRangeInsert | OperationRangeRemove,\n io_rangeB: OperationRangeInsert | OperationRangeRemove,\n io_resultingSegment: OperationRangeInsert | OperationRangeRemove,\n in_rebasing: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (io_rangeA.removeInsertOperation) {\n io_resultingSegment.removeInsertOperationA = io_rangeA.removeInsertOperation;\n } else {\n delete io_resultingSegment.removeInsertOperationA;\n }\n if (io_rangeB.removeInsertOperation) {\n io_resultingSegment.removeInsertOperationB = io_rangeB.removeInsertOperation;\n } else {\n delete io_resultingSegment.removeInsertOperationB;\n }\n\n if (io_rangeB.begin === undefined) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = io_rangeA.op;\n io_resultingSegment.flag = io_rangeA.flag;\n return;\n }\n\n if (io_rangeB.removeInsertOperation &&\n io_rangeB.op.type === ArrayChangeSetIterator.types.REMOVE &&\n (io_rangeA.begin === undefined || io_rangeB.removeInsertOperation[0] < io_rangeA.begin - io_rangeA.op.offset) &&\n io_rangeB.removeInsertOperation[0] < io_rangeB.begin &&\n !io_rangeB.insertAlreadyProcessed) {\n io_resultingSegment.begin = io_rangeB.removeInsertOperation[0];\n io_resultingSegment.end = io_rangeB.removeInsertOperation[0];\n (io_resultingSegment as OperationRangeInsert).op = {\n type: ArrayChangeSetIterator.types.INSERT,\n operation: io_rangeB.removeInsertOperation as arrayInsertList,\n offset: io_rangeB.op.offset,\n };\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeB;\n io_rangeB.insertAlreadyProcessed = true;\n return;\n }\n\n if (io_rangeA.begin === undefined) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.op = io_rangeB.op;\n io_resultingSegment.flag = io_rangeB.flag;\n return;\n }\n io_resultingSegment.opA = undefined;\n io_resultingSegment.opB = undefined;\n io_resultingSegment.op = undefined;\n\n // We have an overlapping remove and insert operation at the same position\n // in a squash operation. In that case, we try to create a more efficient\n // ChangeSet by detecting cases, in which the remove and insert cancel out\n // (which we can detect for a reversible ChangeSet).\n // TODO: In the most general case, we should convert the overlapping remove\n // insert operations into the most optimal modify operation, but this\n // would require the computation of the edit distance between the two\n // operations, which could only be done efficiently for named properties.\n let nextInsertOffset = 0;\n if (io_rangeA.removeInsertOperation) {\n nextInsertOffset = getOpLength(io_rangeA.removeInsertOperation);\n }\n if (!in_rebasing &&\n (io_rangeA.begin <= io_rangeB.begin) &&\n (io_rangeA.begin + nextInsertOffset >= io_rangeB.begin) &&\n (io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n Array.isArray(io_rangeA.op.operation[1]) && // This is a reversible remove operation\n (io_rangeB.op.type === ArrayChangeSetIterator.types.INSERT)) {\n // Are the two operations canceling out?\n let startOffset = 0;\n let rangeStart = 0;\n let matchFound = false;\n let rangeLength = io_rangeB.op.operation[1].length;\n const operationMetaInfo = in_options && in_options.applyAfterMetaInformation &&\n in_options.applyAfterMetaInformation.get(io_rangeB.op.operation[1]);\n if (operationMetaInfo && operationMetaInfo.rebasedRemoveInsertRanges) {\n if (operationMetaInfo.currentInsertOffset === undefined) {\n operationMetaInfo.currentInsertOffset = 0;\n operationMetaInfo.currentRemoveOffset = 0;\n }\n let i = 0;\n for (; i < operationMetaInfo.rebasedRemoveInsertRanges.length; i++) {\n if (operationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart >= operationMetaInfo.currentInsertOffset) {\n startOffset = operationMetaInfo.rebasedRemoveInsertRanges[i].originalStartPosition -\n io_rangeA.op.operation[0] +\n io_rangeA.op.offset +\n io_rangeB.op.offset;\n rangeStart = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart -\n operationMetaInfo.currentInsertOffset;\n rangeLength = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeLength;\n\n if (io_rangeA.op.operation[1].length - startOffset >= rangeLength &&\n isEqual(io_rangeA.op.operation[1].slice(startOffset, startOffset + rangeLength),\n io_rangeB.op.operation[1].slice(rangeStart, rangeStart + rangeLength))) {\n matchFound = true;\n\n // If we have an remove / insert operation in the range A we have to make sure,\n // the insert happens at the correct position within the remove range after canceling\n // out the insert/remove combination.\n // We decide this, based on the position of the insert in iterator B relative to the insert\n // in iterator A. If the insert in iterator B is behind the insert in iteraator A, we have\n // to move the insert from A to the beginning of the remove range, since it has to placed\n // before the canceled range.\n if (nextInsertOffset > 0 &&\n io_rangeB.begin >= io_rangeA.begin + nextInsertOffset) {\n const newStartOffset = io_rangeA.op.operation[0] + startOffset - io_rangeA.op.offset;\n\n // We don't want to shift the insertion backwards, if it already is before the position of the\n // canceled entry\n io_rangeA.removeInsertOperation[0] = Math.min(io_rangeA.removeInsertOperation[0], newStartOffset);\n }\n break;\n }\n }\n }\n } else {\n if (io_rangeA.op.operation[1].length === rangeLength &&\n isEqual(io_rangeA.op.operation[1],\n io_rangeB.op.operation[1])) {\n matchFound = true;\n }\n }\n if (matchFound) {\n if (startOffset > 0) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.begin;\n\n io_resultingSegment.op = {\n type: io_rangeA.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n // cut the remaining segment entry\n _splitArrayParameter(io_resultingSegment.op.operation, io_rangeA.op.operation,\n io_rangeA.op.operation, startOffset);\n io_rangeA.op.operation[0] += startOffset;\n operationMetaInfo.currentRemoveOffset += startOffset;\n return;\n } else if (rangeStart > 0) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = rangeStart;\n\n io_resultingSegment.op = {\n type: io_rangeB.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n // cut the remaining segment entry\n _splitArrayParameter(io_resultingSegment.op.operation, io_rangeB.op.operation,\n io_rangeB.op.operation, rangeStart);\n operationMetaInfo.currentInsertOffset += rangeStart;\n return;\n } else {\n if (operationMetaInfo) {\n operationMetaInfo.currentRemoveOffset += rangeLength;\n operationMetaInfo.currentInsertOffset += rangeLength;\n }\n\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = undefined; // This is used to indicate that we don't need any operation\n\n if (io_rangeB.op.operation[1].length === rangeLength) {\n if (io_rangeA.op.operation[1].length === rangeLength) {\n // We consume both A and B\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeAcompleteB;\n } else {\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeBpartOfA;\n }\n } else {\n if (io_rangeA.op.operation[1].length === rangeLength) {\n // We consume A and leave a part of B\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeApartOfB;\n } else {\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfApartOfB;\n }\n }\n // cut the remaining segment entry\n if (io_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n io_resultingSegment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n _splitArrayParameter(undefined, io_rangeA.op.operation,\n io_rangeA.op.operation, rangeLength);\n io_rangeA.op.operation[0] += rangeLength;\n }\n\n // cut the remaining segment entry\n if (io_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n io_resultingSegment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n _splitArrayParameter(undefined, io_rangeB.op.operation,\n io_rangeB.op.operation, rangeLength);\n }\n\n return;\n }\n }\n }\n\n if ((io_rangeA.end < io_rangeB.begin) || // please see in_rebasing comments in the function description\n ((!in_rebasing || io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n (io_rangeA.end === io_rangeB.begin))) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = io_rangeA.op;\n io_resultingSegment.flag = io_rangeA.flag;\n\n // We need to store the length of the adjacent remove operation for later squashes\n if (in_rebasing &&\n io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n io_rangeA.end === io_rangeB.begin) {\n if (in_options && in_options.applyAfterMetaInformation) {\n let length = io_rangeB.op.operation[1];\n if (!isNumber(length)) {\n length = length.length;\n }\n\n in_options.applyAfterMetaInformation.set(io_rangeB.op.operation[1], {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: length,\n originalStartPosition: io_rangeA.end + io_rangeB.op.offset,\n }],\n });\n }\n }\n return;\n }\n if ((io_rangeB.end < io_rangeA.begin) || // please see in_rebasing comments in the function description\n (!in_rebasing && (io_rangeB.end === io_rangeA.begin))) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.op = io_rangeB.op;\n io_resultingSegment.flag = io_rangeB.flag;\n return;\n }\n // handle real overlaps:\n if (io_rangeA.begin < io_rangeB.begin) {\n // take A up to the begin of B\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeB.begin;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.op = {\n type: io_rangeA.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n // cut the remaining segment entry\n _splitOperation(io_rangeA, io_resultingSegment.op, io_rangeB.begin - io_rangeA.begin, true);\n\n io_rangeA.begin = io_rangeB.begin;\n io_rangeA.op.operation[0] = io_rangeB.begin;\n } else if (io_rangeA.begin === io_rangeB.begin) {\n // find the largest common range:\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = undefined;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.opA = {\n type: io_rangeA.op.type,\n operation: [],\n _absoluteBegin: io_rangeA.op._absoluteBegin,\n };\n io_resultingSegment.opA.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.opB = {\n type: io_rangeB.op.type,\n operation: [],\n offset: io_rangeB.op.offset,\n };\n io_resultingSegment.opB.operation[0] = io_rangeB.op.operation[0];\n\n // who ends first, A or B?\n if (io_rangeA.end < io_rangeB.end) {\n // segment A ends first, it is consumed by the resulting merged segment!\n // a part of segment B remains and needs updates\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeApartOfB;\n\n // cut the remaining segment B entries (segment A needs no update!)\n _splitOperation(io_rangeB, io_resultingSegment.opB, io_rangeA.end - io_rangeA.begin, false);\n\n // just copy opA\n _copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\n io_rangeB.begin = io_rangeA.end;\n io_rangeB.op.operation[0] = io_rangeA.end;\n } else if (io_rangeA.end > io_rangeB.end) {\n // segment B ends first, it is consumed by the resulting merged segment!\n // a part of segment A remains and needs updates\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeBpartOfA;\n\n // cut the remaining segment A entry\n _splitOperation(io_rangeA, io_resultingSegment.opA, io_rangeB.end - io_rangeB.begin, true);\n\n // just copy opB\n _copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\n io_rangeA.begin = io_rangeB.end;\n io_rangeA.op.operation[0] = io_rangeB.end;\n }\n if (io_rangeA.end === io_rangeB.end) {\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeAcompleteB;\n // both are fully used, no cut needed!\n\n // copy ops\n _copyOperation(io_rangeA.op, io_resultingSegment.opA);\n _copyOperation(io_rangeB.op, io_resultingSegment.opB);\n }\n } else if (io_rangeB.begin < io_rangeA.begin) {\n // take B up to the begin of A\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeA.begin;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.op = {\n type: io_rangeB.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n // cut the remaining segment entry\n _splitOperation(io_rangeB, io_resultingSegment.op, io_rangeA.begin - io_rangeB.begin, false);\n\n io_rangeB.begin = io_rangeA.begin;\n io_rangeB.op.operation[0] = io_rangeA.begin;\n io_rangeB.op.offset = 0;\n }\n};\n\n/**\n * merge in_op with the last op of that category in io_changeset (if possible)\n * e.g. merge an delete [1,3] with delete [3,2] to delete [1,5]\n * @param in_op - the op to merge\n * @param io_changeset - the changeset to merge the op to\n * @param in_targetIndex the transformed target index offset\n * @returns true if the merge was possible and executed\n */\nconst mergeWithLastIfPossible = function(\n in_op: GenericOperation,\n io_changeset: SerializedChangeSet,\n in_targetIndex: number,\n in_options?: ApplyChangeSetOptions): boolean {\n let lastOp;\n switch (in_op.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (io_changeset.insert.length === 0) {\n return false;\n }\n lastOp = io_changeset.insert[io_changeset.insert.length - 1];\n if (lastOp[0] === in_targetIndex) {\n // If we merge two segments, we also have to merge the attached meta information and store mappings for the\n // sub-ranges of the merged segment\n let mergedRangeMetaInformation;\n if (in_options && in_options.applyAfterMetaInformation) {\n const previousMetaInfo = in_options.applyAfterMetaInformation.get(lastOp[1]);\n const currentMetaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n if (previousMetaInfo || currentMetaInfo) {\n // Get the range information attached to the segments that get merged\n const previousRange = (previousMetaInfo && previousMetaInfo.rebasedRemoveInsertRanges) || [];\n const nextRange = (currentMetaInfo && currentMetaInfo.rebasedRemoveInsertRanges) || [];\n\n // Update the start index\n for (let i = 0; i < nextRange.length; i++) {\n nextRange[i].rangeStart += lastOp[1].length;\n }\n\n for (let i = 0; i < nextRange.length; i++) {\n previousRange.push(nextRange[i]);\n }\n\n mergedRangeMetaInformation = previousRange;\n\n // Remove the old entries from the meta information\n in_options.applyAfterMetaInformation.delete(lastOp[1]);\n in_options.applyAfterMetaInformation.delete(in_op.operation[1]);\n }\n }\n\n // merge with last insert\n if (isString(in_op.operation[1])) {\n for (let i = 0; i < in_op.operation[1].length; i++) {\n lastOp[1] += in_op.operation[1][i];\n }\n } else {\n for (let i = 0; i < in_op.operation[1].length; i++) {\n lastOp[1].push(in_op.operation[1][i]);\n }\n }\n // Store the updated meta-information\n if (mergedRangeMetaInformation) {\n in_options.applyAfterMetaInformation.set(lastOp[1], {\n rebasedRemoveInsertRanges: mergedRangeMetaInformation,\n });\n }\n } else {\n return false;\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // We cannot perform merges for removes here, as those\n // also depend on the insert positions, which might not\n // yet have been processed when the remove is processed.\n // We handle these in a post processing step instead\n throw new Error(\"Should never happen\");\n }\n case ArrayChangeSetIterator.types.MODIFY:\n if (io_changeset.modify.length === 0) {\n return false;\n }\n lastOp = io_changeset.modify[io_changeset.modify.length - 1];\n if (lastOp[0] + lastOp[1].length === in_targetIndex) {\n // merge with last modify\n lastOp[1] = lastOp[1].concat(in_op.operation[1]);\n if (lastOp[2] !== undefined) {\n lastOp[2] = lastOp[2].concat(in_op.operation[2]);\n }\n } else {\n return false;\n }\n break;\n default:\n throw new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${in_op.type}`);\n }\n return true;\n};\n\ninterface RemoveOpInfo {\n position: number;\n offsetIncremented: boolean;\n length: number;\n}\n\n/**\n * push an operation to a changeset, will try to merge the op if possible\n * @param in_op the operation we want to push\n * @param io_changeset target\n * @param the current offset\n * @param in_options - Optional additional parameters\n * @param in_lastIteratorARemove - Information about the last remove operation in iterator A\n * @param in_segment - Segment this operation is part of\n */\nconst pushOp = function(\n in_op: GenericOperation,\n io_changeset: SerializedChangeSet,\n in_indexOffset: number,\n in_options?: ApplyChangeSetOptions,\n in_lastIteratorARemove?: RemoveOpInfo,\n in_segment?: SegmentType) {\n let writeTargetIndex;\n if (ArrayChangeSetIterator.types.NOP !== in_op.type) {\n writeTargetIndex = in_op.operation[0] - in_indexOffset;\n\n // We have to update the write target index, if we have an insert at the\n // position of a remove. In that case, we have to move the insert to the beginning\n // of the remove range, to make sure, it will give consistent results with individually\n // rebasing the two changsets (first rebasing an insert at the beginning of the remove the\n // wouldn't have an effect on rebased changeset and then rebasing it with respect to the\n // insert would move it befind the insert. If we do this rebase with respect to the combined\n // CS, we must have the insert before the remove to make sure it is taken into account)\n if (ArrayChangeSetIterator.types.INSERT === in_op.type &&\n in_lastIteratorARemove !== undefined &&\n in_segment.flag === ArrayChangeSetRangeType.completeB) {\n if (in_lastIteratorARemove.position == in_op.operation[0] &&\n in_lastIteratorARemove.offsetIncremented) {\n writeTargetIndex -= in_lastIteratorARemove.length;\n }\n }\n if (writeTargetIndex < 0) {\n writeTargetIndex = 0; // TODO: investigate negative index!\n }\n }\n switch (in_op.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (in_options && in_options.applyAfterMetaInformation && !isNumber(in_op.operation[1])) {\n // If we don't have any meta information yet, we add an entry with the correct offset applied\n const metaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n if (!metaInfo) {\n in_options.applyAfterMetaInformation.set(in_op.operation[1], {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: in_op.operation[1].length,\n originalStartPosition: in_op.operation[0],\n }],\n });\n }\n }\n\n if (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n io_changeset.insert.push([writeTargetIndex, in_op.operation[1]]);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Note: we don't merge removes here, since those depend on not yet processed inserts.\n // This is done in a post processing step instead\n\n // our segmentation method currently can produce length zero remove segments\n // this is by by design and those filtered out here\n const length = getOpLength(in_op.operation);\n if (length > 0) {\n io_changeset.remove.push([writeTargetIndex, in_op.operation[1]]);\n }\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n if (in_op.operation[2] !== undefined) {\n io_changeset.modify.push([writeTargetIndex, in_op.operation[1], in_op.operation[2]]);\n } else {\n io_changeset.modify.push([writeTargetIndex, in_op.operation[1]]);\n }\n }\n break;\n }\n case ArrayChangeSetIterator.types.NOP: {\n // nothing to do\n break;\n }\n default:\n throw new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${(in_op as any).type}`);\n }\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n * @param in_segment the two ops to be combined\n * @param in_isPrimitiveType is it an array of primitive types\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n */\nconst handleCombinations = function(in_segment: SegmentType, in_isPrimitiveType: boolean) {\n const opA = in_segment.opA;\n const opB = in_segment.opB;\n switch (opA.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n // this combination is not reachable since this case has already been handled before\n console.error(\"this combination should not occur in handleCombinations - this is a bug\");\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Attention: B removes A completely, kill A to avoid zero inserts\n let opBLen;\n if (isNumber(opB.operation[1])) {\n opBLen = opB.operation[1];\n } else {\n opBLen = opB.operation[1].length;\n }\n if (opBLen !== opA.operation[1].length) {\n throw new Error(\"handleCombinations: insert-remove: unequal number of affected entries\");\n }\n\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // we have to apply modify of B to As insert\n if (in_isPrimitiveType) {\n // since the length of A and B is equal in here\n // we can just insert the modified values instead\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n } else {\n // the array element is a complex types\n // we have to recursively call the modify\n for (let i = 0; i < opB.operation[1].length; ++i) {\n // TypeIds MUST be stored in the entries\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.performApplyAfterOnPropertyWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n false);\n }\n opB.operation = opA.operation;\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n }\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // this combination is not reachable since this case has already been handled before\n console.error(\"this combination should not occur in handleCombinations - this is a bug\");\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (in_isPrimitiveType) {\n // If we have a reversible changeset, we\n // have to keep the previous state from before the\n // apply after\n if (opA.operation[2] !== undefined) {\n (opB as ModifyOperation).operation[2] = opA.operation[2];\n }\n break;\n } else {\n // we have to deal with complex types here!\n if (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n for (let i = 0; i < opB.operation[1].length; ++i) {\n // TypeIds MUST be stored in the entries\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.performApplyAfterOnPropertyWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n false);\n }\n opB.operation = opA.operation;\n }\n break;\n }\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n }\n};\n\n/**\n * Tests if 2 arrays of the same length, containing primitive values, contain the same values.\n *\n * @param in_arr1 - First array to compare\n * @param in_arr2 - Second array to compare\n * @returns True if arrays contain the same values, false otherwise\n */\nconst arraysHaveSameValues = function(in_arr1: arrayModifyList[1], in_arr2: arrayModifyList[1]): boolean {\n // We assume arrays are of same length\n const len = in_arr1.length;\n if (len !== in_arr2.length) {\n return false;\n }\n\n let i;\n // For (u)int64, values are arrays of 2 elements\n if (len > 0 && in_arr1[0].length === 2) {\n for (i = 0; i < len; i++) {\n if (in_arr1[i][0] !== in_arr2[i][0] || in_arr1[i][1] !== in_arr2[i][1]) {\n break;\n }\n }\n } else {\n for (i = 0; i < len; i++) {\n if (in_arr1[i] !== in_arr2[i]) {\n break;\n }\n }\n }\n return i === len;\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n *\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n *\n * gets rebased to:\n *\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n *\n * conflict default behavior in ()\n *\n * -------|-----------------+------------------+------------------|\n * \\Own| insert | modify | remove |\n * \\ | | | |\n * other\\ | | | |\n * ------\\|-----------------+------------------+------------------|\n * | conflicting | non-conflicting | non-conflicting |\n * insert | inserts | change | change |\n * | (i. other after)| | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | merge recursively| conflict |\n * modify | change | (note the user) | (delete modify |\n * | | | in other) |\n * | | | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | non-conflicting | non-conflicting |\n * remove | change | change | change |\n * | [rem orig. data]| (note the user) | [rem dupl. rem] |\n * -------|-----------------+------------------+------------------|\n *\n * @param {{opA:{}, opB:{}}} in_segment the two ops to be combined\n * @param {Array.<property-changeset.ChangeSet.ConflictInfo>} out_conflicts -\n * A list of paths that resulted in conflicts together with the type of the conflict\n * @param {string} in_basePath -\n * Base path to get to the property processed by this function\n * @param {boolean} in_isPrimitiveType is it an array of primitive types\n * @param {Object} [in_options] - Optional additional parameters\n * @param {Map} [in_options.applyAfterMetaInformation] - Additional meta information which help later to obtain\n * more compact changeset during the apply operation\n */\nconst handleRebaseCombinations = function(\n in_segment: SegmentType,\n out_conflicts: ConflictInfo[],\n in_basePath: string,\n in_isPrimitiveType: string,\n in_options: ApplyChangeSetOptions) {\n const opA = in_segment.opA;\n const opB = in_segment.opB;\n if (opB.type === ArrayChangeSetIterator.types.INSERT) {\n const originalStartPosition = opB.operation[0] + opB.offset;\n if (in_options && in_options.applyAfterMetaInformation) {\n let length: number;\n const insertEntries = opB.operation[1];\n if (!isNumber(insertEntries)) {\n length = insertEntries.length;\n\n in_options.applyAfterMetaInformation.set(insertEntries, {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: length,\n originalStartPosition,\n }],\n });\n }\n }\n }\n\n const handleInsert = (insertOp: Omit<InsertOperation, 'type'>, baseOp: InsertOperation) => {\n // conflicting inserts - report conflict, insert both\n delete insertOp._absoluteBegin;\n delete baseOp.offset;\n const conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.INSERTED_ENTRY_WITH_SAME_KEY, // todo\n conflictingChange: cloneDeep(baseOp),\n };\n out_conflicts.push(conflict);\n\n // move to the right side of the insert\n baseOp.operation[0] += insertOp.operation[1].length;\n };\n switch (opA.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n handleInsert(opA, opB);\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // non-conflicting insert - just keep B\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // non-conflicting insert - just keep B\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (opA._absoluteBegin !== opA.operation[0]) {\n // Move the insert operation to the beginning of the removed range\n opB.operation[0] -= opA.operation[0] - opA._absoluteBegin;\n }\n\n // If we have a range with a remove / insert operation, we have\n // to take the insert operation within the base changeset\n // into account during rebasing, moving the rebased operation\n // behind this insert\n if (in_segment.removeInsertOperationA &&\n in_segment.removeInsertOperationA[0] === opB.operation[0]) {\n handleInsert({\n operation: in_segment.removeInsertOperationA as arrayInsertList,\n }, opB);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Remove already in A, no need to add the same again -> write nop\n\n let opBLen; let opALen;\n if (isNumber(opB.operation[1])) {\n opBLen = opB.operation[1];\n } else {\n opBLen = opB.operation[1].length;\n }\n if (isNumber(opA.operation[1])) {\n opALen = opA.operation[1];\n } else {\n opALen = opA.operation[1].length;\n }\n\n if (opBLen !== opALen) {\n throw new Error(\"handleRebaseCombinations: remove-remove: unequal number of affected entries, \" +\n \"this should never happen! Probably a bug in splitRange.\");\n }\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // trying to modify something that was removed ->\n // replace the modify with a NOP and report a conflict\n\n if (opB.operation[1].length > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.ENTRY_MODIFIED_AFTER_REMOVE,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n }\n\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (in_isPrimitiveType) {\n // just use opB and notify accordingly\n if (opB.type === ArrayChangeSetIterator.types.MODIFY && opB.operation[1].length > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n // If opB new value is same as opA new value, replace the modify with a NOP\n // TODO: The real operation that we should do here is not to only test if both arrays are\n // completely identical, but if any value is identical and if so split the range\n // into multiple ones.\n // Ex. [[0, [30, 20, 10]]] over [[0, [10, 20, 30]]] should become [[0, [30]], [2, [10]]].\n // This does not seem easily doable in the current code.\n if (arraysHaveSameValues(opA.operation[1], opB.operation[1])) {\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n // If any, change the opB old value by the opA new value\n } else if (opB.operation[2]) {\n opB.operation[2] = opA.operation[1].slice();\n }\n }\n if (opB.type === ArrayChangeSetIterator.types.REMOVE && opB.operation[1] > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.REMOVE_AFTER_MODIFY,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n }\n break;\n } else {\n // we have to deal with complex types here!\n if (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n for (let i = 0; i < opB.operation[1].length; ++i) {\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.rebaseChangeSetForPropertyEntryWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n `${in_basePath}[${i}]`,\n false,\n out_conflicts,\n in_options);\n }\n }\n break;\n }\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n }\n};\n\n/**\n * apply a range's operation to the changeset\n * @param in_segment to be applied\n * @param io_changeset target\n * @param in_currentIndexOffset current offset\n * @param in_isPrimitiveType is it an array of primitive types\n */\nconst applySegment = function(\n in_segment: SegmentType,\n io_changeset: SerializedChangeSet,\n in_currentIndexOffset: number,\n lastIteratorARemove: RemoveOpInfo,\n in_isPrimitiveType: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (!in_segment) {\n throw Error(\"applySegment: in_segment is undefined!\");\n }\n\n // No operation needs to be performed\n if (in_segment.op === undefined && in_segment.opA === undefined && in_segment.opB === undefined) {\n return;\n }\n if (in_segment.flag === ArrayChangeSetRangeType.completeA ||\n in_segment.flag === ArrayChangeSetRangeType.completeB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfA ||\n in_segment.flag === ArrayChangeSetRangeType.partOfB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfApartOfB) {\n // just push it\n pushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options, lastIteratorARemove, in_segment);\n } else {\n // combinations: pAB, AB or ApB\n handleCombinations.call(this, in_segment, in_isPrimitiveType); // modifies in_segment.opB to save garbage\n pushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n }\n};\n\n/**\n * apply a range's operation to the rebased changeset\n * @param in_segment to be applied\n * @param io_changeset target\n * @param in_currentIndexOffset current offset\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_basePath - Base path to get to the property processed by this function\n * @param in_isPrimitiveType is it an array of primitive types\n */\nconst applyRebaseSegment = function(\n in_segment: SegmentType,\n io_changeset: SerializedChangeSet,\n in_currentIndexOffset: number,\n out_conflicts: ConflictInfo[],\n in_basePath: string,\n in_isPrimitiveType: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (!in_segment) {\n throw Error(\"applySegment: in_segment is undefined!\");\n }\n if (in_segment.flag === ArrayChangeSetRangeType.completeB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfB) {\n // not touching anything of A, just push it\n pushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options);\n } else if (in_segment.flag === ArrayChangeSetRangeType.completeA ||\n in_segment.flag === ArrayChangeSetRangeType.partOfA) {\n // do nothing (we are rebasing B, not A)\n } else {\n // combinations: pAB, AB or ApB\n handleRebaseCombinations.call(this, in_segment, out_conflicts,\n in_basePath, in_isPrimitiveType, in_options); // modifies in_segment.opB to save garbage\n pushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n }\n};\n\nexport namespace ChangeSetArrayFunctions {\n\n /**\n * Applies a changeset to a given array property. The ChangeSet is assumed to be relative to the same\n * property root and it will be applied behind the base ChangeSet (assuming that the changes are relative to the\n * state after the base ChangeSet has been applied. It will change the base ChangeSet.)\n *\n * @param io_basePropertyChanges - The ChangeSet describing the initial state\n * @param in_appliedPropertyChanges - The ChangeSet to apply to this state\n * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n */\n export function _performApplyAfterOnPropertyArray(\n io_basePropertyChanges: SerializedChangeSet,\n in_appliedPropertyChanges: SerializedChangeSet,\n in_typeid: string,\n in_options?: ApplyChangeSetOptions) {\n ConsoleUtils.assert(in_typeid, \"_performApplyAfterOnPropertyArray: typeid missing\");\n ConsoleUtils.assert(!isString(io_basePropertyChanges), io_basePropertyChanges);\n ConsoleUtils.assert(!isString(in_appliedPropertyChanges), in_appliedPropertyChanges);\n\n const isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n // Iterator to process the changes in the ChangeSet in the correct order\n const iteratorA = new ArrayChangeSetIterator((io_basePropertyChanges));\n const iteratorB = new ArrayChangeSetIterator((in_appliedPropertyChanges));\n\n const rangeA: OperationRangeRemove | OperationRangeInsert = {};\n const rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\n const opA = iteratorA.opDescription;\n const opB = iteratorB.opDescription;\n\n getRangeForCurrentStateOperation(opA, opA.offset ? opA.offset : 0, rangeA);\n getRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\n const resultPropertyChanges: SerializedChangeSet = {};\n resultPropertyChanges.insert = [];\n resultPropertyChanges.modify = [];\n resultPropertyChanges.remove = [];\n resultPropertyChanges.writeOffset = 0;\n\n let currentIndexOffset = 0;\n let lastIteratorARemove;\n const segment: OperationRangeRemove | OperationRangeInsert = {};\n let skipIteratorBOperation;\n\n const advanceIteratorB = () => {\n if ((opB as any).removeInsertOperation &&\n segment.op !== undefined &&\n skipIteratorBOperation === undefined &&\n segment.op.operation === (opB as any).removeInsertOperation) {\n skipIteratorBOperation = segment.op.operation;\n } else {\n iteratorB.next();\n if (skipIteratorBOperation &&\n opB.operation === skipIteratorBOperation) {\n iteratorB.next();\n }\n skipIteratorBOperation = undefined;\n getRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n }\n };\n\n // create ranges for A and B: A is the current state and B is the change set to be applied\n let lastIndexOffset = 0;\n let canceledSegmentBegin;\n let lastOpWasNop = false;\n\n while (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n // produce first segment:\n splitOverlapping(rangeA, rangeB, segment, false, in_options);\n\n let indexOffset = currentIndexOffset;\n\n if (lastOpWasNop &&\n (rangeA.begin === undefined || rangeA.begin >= segment.begin) &&\n (segment.flag === ArrayChangeSetRangeType.completeB &&\n segment.op.type === ArrayChangeSetIterator.types.INSERT &&\n segment.op.operation[0] === canceledSegmentBegin)) {\n indexOffset = lastIndexOffset;\n }\n\n applySegment.call(this, segment, resultPropertyChanges, indexOffset, lastIteratorARemove, isPrimitiveTypeid);\n lastOpWasNop = segment.opB !== undefined && segment.opB.type === ArrayChangeSetIterator.types.NOP;\n if (lastOpWasNop) {\n canceledSegmentBegin = segment.begin;\n }\n\n // increase pointers if necessary\n if (segment.flag === ArrayChangeSetRangeType.completeA ||\n segment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n // We keep track of the last remove operation, because this information is needed\n // in pushOp to move inserts to the beginning of a remove range. The problem is\n // that the insert is processed after the remove and in that case the iterator\n // offset has already been incremented by the remove. Therefore, the insert would\n // be placed behind the remove. We detect this case and correct the offset accordingly\n // in pushOp\n if (opA.type === ArrayChangeSetIterator.types.REMOVE) {\n if (!lastIteratorARemove ||\n lastIteratorARemove.position !== opA.operation[0]) {\n lastIteratorARemove = {\n position: opA.operation[0],\n length: getOpLength(opA.operation),\n offsetIncremented: false,\n currentIndex: opA.operation[0],\n };\n\n // If there is already an insert operation at the beginning of the remove range\n // we have to adjust the position to the end of this operation (an insert that is\n // applied at the position of the remove would be shifted behind this insert)\n if (opA.removeInsertOperation) {\n if (opA.removeInsertOperation[0] + opA.offset === lastIteratorARemove.position) {\n lastIteratorARemove.position += getOpLength(opA.removeInsertOperation);\n }\n }\n }\n }\n\n let moreAs = iteratorA.next();\n\n // The offset will only be incremented as soon as the iterator reaches an operation at a different index.\n // We detect this case and keep track, whether the remove has already been added to the offset or not.\n if (lastIteratorARemove &&\n ((opA as any).operation === undefined || (opA as any).operation[0] !== lastIteratorARemove.currentIndex)) {\n lastIteratorARemove.offsetIncremented = true;\n }\n getRangeForCurrentStateOperation(iteratorA.opDescription, moreAs ? opA.offset : 0, rangeA);\n }\n\n if (segment.flag === ArrayChangeSetRangeType.completeB ||\n segment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n advanceIteratorB();\n }\n if (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n let moreAs = iteratorA.next();\n getRangeForCurrentStateOperation(opA, moreAs ? opA.offset : 0, rangeA);\n advanceIteratorB();\n }\n\n if (opA.offset !== undefined) {\n // the correct index offset for the next operation is given by A's offset\n lastIndexOffset = currentIndexOffset;\n currentIndexOffset = opA.offset;\n }\n }\n\n // write back:\n if (resultPropertyChanges.insert.length > 0) {\n io_basePropertyChanges.insert = resultPropertyChanges.insert;\n } else {\n delete io_basePropertyChanges.insert;\n }\n if (resultPropertyChanges.modify.length > 0) {\n io_basePropertyChanges.modify = resultPropertyChanges.modify;\n } else {\n delete io_basePropertyChanges.modify;\n }\n\n if (resultPropertyChanges.remove.length > 0) {\n // Merge remove operations (but only, if there is no\n // insert inbetween the two removes)\n const insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n const mergedRemoves = [];\n for (const remove of resultPropertyChanges.remove) {\n const lastRemove = mergedRemoves[mergedRemoves.length - 1];\n if (lastRemove &&\n lastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n !insertPosition.has(remove[0])) {\n if (Array.isArray(remove[1])) {\n lastRemove[1] = lastRemove[1].concat(remove[1]);\n } else {\n lastRemove[1] += remove[1];\n }\n } else {\n mergedRemoves.push(remove);\n }\n }\n io_basePropertyChanges.remove = mergedRemoves;\n } else {\n delete io_basePropertyChanges.remove;\n }\n }\n\n /**\n * Performs the rebase operation for array changes\n *\n * @param in_ownPropertyChangeSet -The ChangeSet for the property stored in this object\n * @param io_rebasePropertyChangeSet - The ChangeSet for the property to be rebased\n * @param in_basePath - Base path to get to the property processed by this function\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n */\n export function _rebaseArrayChangeSetForProperty(\n in_ownPropertyChangeSet: SerializedChangeSet,\n io_rebasePropertyChangeSet: SerializedChangeSet,\n in_basePath: string,\n out_conflicts: ConflictInfo[],\n in_typeid: string,\n in_options?: ApplyChangeSetOptions) {\n const isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n // Iterator to process the changes in the ChangeSet in the correct order\n const iteratorA = new ArrayChangeSetIterator((in_ownPropertyChangeSet));\n const iteratorB = new ArrayChangeSetIterator((io_rebasePropertyChangeSet));\n\n const opA = iteratorA.opDescription;\n\n const rangeA: OperationRangeRemove | OperationRangeInsert = {};\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n const rangeB: OperationRangeRemove | OperationRangeInsert = {};\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\n const resultPropertyChanges: SerializedChangeSet = {};\n resultPropertyChanges.insert = [];\n resultPropertyChanges.modify = [];\n resultPropertyChanges.remove = [];\n resultPropertyChanges.writeOffset = 0;\n\n let currentIndexOffset = 0;\n const segment: OperationRangeRemove | OperationRangeInsert = {};\n\n // create ranges for A and B: A is the current state and B is the change set to be applied\n while (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n splitOverlapping(rangeA, rangeB, segment, true, in_options);\n\n applyRebaseSegment.call(this, segment, resultPropertyChanges,\n currentIndexOffset, out_conflicts, in_basePath, isPrimitiveTypeid, in_options);\n\n // increase pointers if necessary\n if (segment.flag === ArrayChangeSetRangeType.completeA ||\n segment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n iteratorA.next();\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n }\n\n if (segment.flag === ArrayChangeSetRangeType.completeB ||\n segment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n iteratorB.next();\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n }\n if (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n iteratorA.next();\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n iteratorB.next();\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n }\n\n if (opA.offset !== undefined) {\n // the correct index offset for the next operation is given by A's offset\n currentIndexOffset = -opA.offset;\n }\n }\n\n // write back:\n if (resultPropertyChanges.insert.length > 0) {\n io_rebasePropertyChangeSet.insert = resultPropertyChanges.insert;\n } else {\n delete io_rebasePropertyChangeSet.insert;\n }\n if (resultPropertyChanges.modify.length > 0) {\n io_rebasePropertyChangeSet.modify = resultPropertyChanges.modify;\n } else {\n delete io_rebasePropertyChangeSet.modify;\n }\n if (resultPropertyChanges.remove.length > 0) {\n // Merge remove operations (but only, if there is no\n // insert in between the two removes)\n const insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n const mergedRemoves = [];\n for (const remove of resultPropertyChanges.remove) {\n const lastRemove = mergedRemoves[mergedRemoves.length - 1];\n if (lastRemove &&\n lastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n !insertPosition.has(remove[0])) {\n if (Array.isArray(remove[1])) {\n lastRemove[1] = lastRemove[1].concat(remove[1]);\n } else {\n lastRemove[1] += remove[1];\n }\n } else {\n mergedRemoves.push(remove);\n }\n }\n\n io_rebasePropertyChangeSet.remove = mergedRemoves;\n } else {\n delete io_rebasePropertyChangeSet.remove;\n }\n }\n\n /**\n * Performs the rebase operation for string changes\n *\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n *\n * gets rebased to:\n *\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n *\n * conflict default behavior in ()\n *\n * -------|-----------------+------------------+------------------|----------------|\n * \\Own| insert | modify | remove | String set |\n * \\ | | | | |\n * other\\ | | | | |\n * ------\\|-----------------+------------------+------------------|----------------|\n * | conflicting | non-conflicting | non-conflicting | conflict |\n * insert | inserts | change | change |(ignore insert) |\n * | (i. other after)| | | |\n * -------|-----------------+------------------+------------------|----------------|\n * | non-conflicting | conflict | conflict | conflict |\n * modify | change |(notify the user) | (delete modify |(ignore modify) |\n * | | | in other) | |\n * -------|-----------------+------------------+------------------|----------------|\n * | non-conflicting | non-conflicting | non-conflicting | conflict |\n * remove | change | change | change |(ignore remove) |\n * -------|-----------------+------------------+------------------+----------------|\n * Str. | | conflict | |\n * set | 'other's set overwrites whatever happend before |\n * | | | | |\n * --------------------------------------------------------------------------------|\n *\n * @param in_ownPropertyChangeSet - The ChangeSet for the property stored in this object\n * @param io_rebasePropertyChangeSetParent - The Array containing the ChangeSet for the property to be rebased\n * @param in_key the key to the ChangeSet in io_rebasePropertyChangeSetParent we are rebasing on\n * @param in_basePath - Base path to get to the property processed by this function\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n */\n\n export function _rebaseChangeSetForString(\n in_ownPropertyChangeSet: SerializedChangeSet,\n io_rebasePropertyChangeSetParent: SerializedChangeSet,\n in_key: string,\n in_basePath: string,\n out_conflicts: ConflictInfo[],\n in_options?: ApplyChangeSetOptions) {\n if (isString(io_rebasePropertyChangeSetParent[in_key]) || (io_rebasePropertyChangeSetParent[in_key] &&\n io_rebasePropertyChangeSetParent[in_key].hasOwnProperty(\"value\"))) {\n // other overwrites any old changes, we ignore them and report the conflict\n let conflict = {\n path: in_basePath,\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(in_ownPropertyChangeSet),\n };\n out_conflicts.push(conflict);\n // If value is the same, delete the entry\n let ownValue = in_ownPropertyChangeSet;\n if (typeof ownValue === \"object\") {\n ownValue = ownValue.value;\n }\n let rebaseValue = io_rebasePropertyChangeSetParent[in_key];\n if (typeof rebaseValue === \"object\") {\n rebaseValue = rebaseValue.value;\n }\n if (ownValue === rebaseValue) {\n delete io_rebasePropertyChangeSetParent[in_key];\n }\n } else if (isString(in_ownPropertyChangeSet) || (in_ownPropertyChangeSet &&\n in_ownPropertyChangeSet.hasOwnProperty(\"value\"))) {\n // we have a conflict since we cannot allow insert/remove/modify on an unknown state\n // we just ignore other's modifications and take own's set\n let conflict = {\n path: in_basePath,\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(io_rebasePropertyChangeSetParent[in_key]),\n };\n out_conflicts.push(conflict);\n io_rebasePropertyChangeSetParent[in_key] = in_ownPropertyChangeSet;\n } else {\n // both have no 'set' just array ops -> use array rebase!\n this._rebaseArrayChangeSetForProperty(in_ownPropertyChangeSet,\n io_rebasePropertyChangeSetParent[in_key],\n in_basePath,\n out_conflicts,\n \"String\",\n in_options);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/changeset_operations/array.ts"],"names":[],"mappings":";;;;;;AAAA;;;GAGG;AACH;;GAEG;AACF,yDAAsD;AACtD,+DAAuC;AACvC,+DAAuC;AACvC,6DAAqC;AAEtC,aAAa;AACb,yEAA8E;AAE9E,0DAAuD;AACvD,qEAA0N;AAC1N,qEAAwD;AAExD,MAAM,EAAE,GAAG,EAAE,GAAG,2BAAS,CAAC;AAC1B,MAAM,EAAE,eAAe,EAAE,GAAG,2BAAY,CAAC;AAEzC;;;;GAIG;AACH,IAAK,uBAwCJ;AAxCD,WAAK,uBAAuB;IACxB;;OAEG;IACH,+EAAS,CAAA;IAET;;OAEG;IACH,+EAAS,CAAA;IAET;;OAEG;IACH,2EAAO,CAAA;IAEP;;OAEG;IACH,2EAAO,CAAA;IAEP;;OAEG;IACH,6FAAgB,CAAA;IAEhB;;OAEG;IACH,6FAAgB,CAAA;IAEhB;;OAEG;IACH,iGAAkB,CAAA;IAElB;;OAEG;IACH,yFAAc,CAAA;AAClB,CAAC,EAxCI,uBAAuB,KAAvB,uBAAuB,QAwC3B;AAmED;;;;;GAKG;AACH,MAAM,gCAAgC,GAAG,UAAS,YAA8B,EAAE,UAAkB,EAAE,iBAAiC;IACnI,IAAI,CAAC,YAAY,EAAE;QACf,OAAO;KACV;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,GAAG,EAAE;QACxD,MAAM,OAAO,GAAiB;YAC1B,IAAI,EAAE,+CAAsB,CAAC,KAAK,CAAC,GAAG;YACtC,MAAM,EAAE,UAAU;SACrB,CAAC;QACF,iBAAiB,CAAC,KAAK,GAAG,SAAS,CAAC;QACpC,iBAAiB,CAAC,GAAG,GAAG,SAAS,CAAC;QAClC,iBAAiB,CAAC,EAAE,GAAG,OAAO,CAAC;QAC/B,iBAAiB,CAAC,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC;QAC3D,OAAO;KACV;IAED,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;IACxC,QAAQ,YAAY,CAAC,IAAI,EAAE;QACvB,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,iBAAiB,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpD,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACrF,iBAAiB,CAAC,EAAE,GAAG,YAAY,CAAC;YACpC,iBAAiB,CAAC,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC3D,OAAO;QACX,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,iBAAiB,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpD,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClD,iBAAiB,CAAC,EAAE,GAAG,YAAY,CAAC;YACpC,iBAAiB,CAAC,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC1D,iBAA0C,CAAC,qBAAqB,GAAG,YAAY,CAAC,qBAAqB,CAAC;YACvG,OAAO;QACX,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,iBAAiB,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACpD,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACrF,iBAAiB,CAAC,EAAE,GAAG,YAAY,CAAC;YACpC,iBAAiB,CAAC,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC3D,OAAO;QACX;YACI,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;KACrF;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,EAAmB,EAAE,EAAE,CAAC,IAAA,kBAAQ,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAEpF;;;;;;GAMG;AACH,MAAM,2BAA2B,GAAG,UAChC,YAA8B,EAC9B,iBAA4C,EAC5C,OAAiC,EACjC,UAAkC;IAElC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,GAAG,EAAE;QACzE,iBAAiB,CAAC,KAAK,GAAG,SAAS,CAAC;QACpC,iBAAiB,CAAC,GAAG,GAAG,SAAS,CAAC;QAClC,iBAAiB,CAAC,EAAE,GAAG,SAAS,CAAC;QACjC,iBAAiB,CAAC,IAAI,GAAG,SAAS,CAAC;QACnC,OAAO;KACV;IACD,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE;QACvB,iBAAiB,CAAC,EAAE,GAAG,EAAS,CAAC;KACpC;IACD,iBAAiB,CAAC,EAAE,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAC9C,iBAAiB,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAClD,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE;QACjC,iBAAiB,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC;KACvC;IACD,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAE9D,iBAAiB,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpD,iBAAiB,CAAC,EAAE,CAAC,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,iBAAiB,CAAC,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,SAAS,CAAC;IAE7F,QAAQ,YAAY,CAAC,IAAI,EAAE;QACvB,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClD,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACtE,IAAI,UAAU,IAAI,UAAU,CAAC,yBAAyB,EAAE;gBACpD,MAAM,eAAe,GAAG,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5F,IAAI,eAAe,EAAE;oBACjB,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;iBAChG;aACJ;YACD,OAAO;QACX,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,IAAI,uBAAuB,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAElE,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC;YAC5E,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;gBACnC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAChC,iBAAiB,CAAC,qBAAqB,GAAG,YAAY,CAAC,qBAAqB,CAAC;YAC7E,OAAO;QACX,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,iBAAiB,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACrF,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACtE,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBACzC,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;aACzE;YACD,OAAO;QACX;YACI,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;KACrF;AACL,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,oBAAoB,GAAG,UACzB,cAAiD,EACjD,eAAkD,EAClD,OAA0C,EAC1C,QAAgB;IAEhB,IAAI,QAAa,CAAC;IAClB,IAAI,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACtB,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1C,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE;YAChB,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;SAChC;QACD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YAClD,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1C,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,cAAc,EAAE;gBAChB,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;aAChC;SACJ;KACJ;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QAClC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1C,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,cAAc,EAAE;YAChB,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;SAChC;QACD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC1C,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,cAAc,EAAE;gBAChB,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;aAChC;SACJ;KACJ;SAAM;QACH,IAAI,cAAc,EAAE;YAChB,cAAc,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;SAChC;QACD,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;KAC9C;AACL,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,UACpB,cAA2D,EAC3D,kBAAoC,EACpC,yBAAiC,EACjC,eAAwB;IAExB,oBAAoB,CAAC,kBAAkB,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,SAAS,EAC1E,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAE5D,IAAI,eAAe,EAAE;QACjB,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;YAChE,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,yBAAyB,CAAC;SACzD;QACD,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;YAChE,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,yBAAyB,CAAC;SACzD;KACJ;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,cAAc,GAAG,UAAS,kBAAoC,EAAE,kBAAoC;IACtG,IAAI,kBAAkB,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;QACjE,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;KACrE;SAAM;QACH,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1E,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAC/C,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;SAC7E;KACJ;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,sCAAsC;AACtC,MAAM,gBAAgB,GAAG,UACrB,SAAsD,EACtD,SAAsD,EACtD,mBAAgE,EAChE,WAAoB,EACpB,UAAkC;IAClC,IAAI,SAAS,CAAC,qBAAqB,EAAE;QACjC,mBAAmB,CAAC,sBAAsB,GAAG,SAAS,CAAC,qBAAqB,CAAC;KAChF;SAAM;QACH,OAAO,mBAAmB,CAAC,sBAAsB,CAAC;KACrD;IACD,IAAI,SAAS,CAAC,qBAAqB,EAAE;QACjC,mBAAmB,CAAC,sBAAsB,GAAG,SAAS,CAAC,qBAAqB,CAAC;KAChF;SAAM;QACH,OAAO,mBAAmB,CAAC,sBAAsB,CAAC;KACrD;IAED,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE;QAC/B,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC1C,OAAO;KACV;IAED,IAAI,SAAS,CAAC,qBAAqB;QAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;QACzD,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;QAC7G,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK;QACpD,CAAC,SAAS,CAAC,sBAAsB,EAAE;QACnC,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/D,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5D,mBAA4C,CAAC,EAAE,GAAG;YAC/C,IAAI,EAAE,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACzC,SAAS,EAAE,SAAS,CAAC,qBAAwC;YAC7D,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM;SAC9B,CAAC;QACF,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC;QAC7D,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACxC,OAAO;KACV;IAED,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE;QAC/B,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC1C,OAAO;KACV;IACD,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC;IACpC,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC;IACpC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC;IAEnC,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,oDAAoD;IACpD,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,+EAA+E;IAC/E,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,CAAC,qBAAqB,EAAE;QACjC,gBAAgB,GAAG,WAAW,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;KACnE;IACD,IAAI,CAAC,WAAW;QACZ,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC;QACpC,CAAC,SAAS,CAAC,KAAK,GAAG,gBAAgB,IAAI,SAAS,CAAC,KAAK,CAAC;QACvD,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,wCAAwC;QACpF,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC7D,wCAAwC;QACxC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,iBAAiB,GAAG,UAAU,IAAI,UAAU,CAAC,yBAAyB;YACxE,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,yBAAyB,EAAE;YAClE,IAAI,iBAAiB,CAAC,mBAAmB,KAAK,SAAS,EAAE;gBACrD,iBAAiB,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAC1C,iBAAiB,CAAC,mBAAmB,GAAG,CAAC,CAAC;aAC7C;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChE,IAAI,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,iBAAiB,CAAC,mBAAmB,EAAE;oBACpG,WAAW,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,qBAAqB;wBAC9E,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;wBACzB,SAAS,CAAC,EAAE,CAAC,MAAM;wBACnB,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;oBACxB,UAAU,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,UAAU;wBAClE,iBAAiB,CAAC,mBAAmB,CAAC;oBAC1C,WAAW,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;oBAEzE,IAAI,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,WAAW,IAAI,WAAW;wBAC7D,IAAA,iBAAO,EAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3E,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC,EAAE;wBAC5E,UAAU,GAAG,IAAI,CAAC;wBAElB,+EAA+E;wBAC/E,qFAAqF;wBACrF,qCAAqC;wBACrC,2FAA2F;wBAC3F,0FAA0F;wBAC1F,yFAAyF;wBACzF,6BAA6B;wBAC7B,IAAI,gBAAgB,GAAG,CAAC;4BACpB,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,GAAG,gBAAgB,EAAE;4BACvD,MAAM,cAAc,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;4BAErF,8FAA8F;4BAC9F,iBAAiB;4BACjB,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;yBACrG;wBACD,MAAM;qBACT;iBACJ;aACJ;SACJ;aAAM;YACH,IAAI,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW;gBAChD,IAAA,iBAAO,EAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7B,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;gBAChC,UAAU,GAAG,IAAI,CAAC;aACrB;SACJ;QACD,IAAI,UAAU,EAAE;YACZ,IAAI,WAAW,GAAG,CAAC,EAAE;gBACjB,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;gBAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;gBAE1C,mBAAmB,CAAC,EAAE,GAAG;oBACrB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;oBACvB,SAAS,EAAE,EAAS;iBACvB,CAAC;gBACF,mBAAmB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChE,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC;gBAE3D,kCAAkC;gBAClC,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EACzE,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACzC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;gBACzC,iBAAiB,CAAC,mBAAmB,IAAI,WAAW,CAAC;gBACrD,OAAO;aACV;iBAAM,IAAI,UAAU,GAAG,CAAC,EAAE;gBACvB,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;gBAC5C,mBAAmB,CAAC,GAAG,GAAG,UAAU,CAAC;gBAErC,mBAAmB,CAAC,EAAE,GAAG;oBACrB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;oBACvB,SAAS,EAAE,EAAS;iBACvB,CAAC;gBACF,mBAAmB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAEhE,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC;gBAE3D,kCAAkC;gBAClC,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EACzE,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACxC,iBAAiB,CAAC,mBAAmB,IAAI,UAAU,CAAC;gBACpD,OAAO;aACV;iBAAM;gBACH,IAAI,iBAAiB,EAAE;oBACnB,iBAAiB,CAAC,mBAAmB,IAAI,WAAW,CAAC;oBACrD,iBAAiB,CAAC,mBAAmB,IAAI,WAAW,CAAC;iBACxD;gBAED,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;gBAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;gBACxC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,4DAA4D;gBAEhG,IAAI,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE;oBAClD,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW;wBACvE,CAAC,CAAC,uBAAuB,CAAC,kBAAkB;wBAC5C,CAAC,CAAC,uBAAuB,CAAC,gBAAgB,CAAC;iBAClD;qBAAM;oBACH,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW;wBACvE,CAAC,CAAC,uBAAuB,CAAC,gBAAgB;wBAC1C,CAAC,CAAC,uBAAuB,CAAC,cAAc,CAAC;iBAChD;gBACD,kCAAkC;gBAClC,IAAI,mBAAmB,CAAC,IAAI,KAAK,uBAAuB,CAAC,cAAc;oBACnE,mBAAmB,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;oBACvE,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EAClD,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBACzC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;iBAC5C;gBAED,kCAAkC;gBAClC,IAAI,mBAAmB,CAAC,IAAI,KAAK,uBAAuB,CAAC,cAAc;oBACnE,mBAAmB,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;oBACvE,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,SAAS,EAClD,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;iBAC5C;gBAED,OAAO;aACV;SACJ;KACJ;IAED,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,8DAA8D;QACnG,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC;YACxE,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;QAC1C,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAE1C,kFAAkF;QAClF,IAAI,WAAW;YACX,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACzD,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,EAAE;YACnC,IAAI,UAAU,IAAI,UAAU,CAAC,yBAAyB,EAAE;gBACpD,IAAI,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAA,kBAAQ,EAAC,MAAM,CAAC,EAAE;oBACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;iBAC1B;gBAED,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;oBAChE,yBAAyB,EAAE,CAAC;4BACxB,UAAU,EAAE,CAAC;4BACb,WAAW,EAAE,MAAM;4BACnB,qBAAqB,EAAE,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,MAAM;yBAC7D,CAAC;iBACL,CAAC,CAAC;aACN;SACJ;QACD,OAAO;KACV;IACD,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,8DAA8D;QACnG,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;QACvD,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACxC,mBAAmB,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACtC,mBAAmB,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC1C,OAAO;KACV;IACD,wBAAwB;IACxB,IAAI,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;QACnC,8BAA8B;QAC9B,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;QAE1C,iEAAiE;QACjE,mBAAmB,CAAC,EAAE,GAAG;YACrB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;YACvB,SAAS,EAAE,EAAS;SACvB,CAAC;QACF,mBAAmB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChE,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAE3D,kCAAkC;QAClC,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE5F,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAClC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;KAC/C;SAAM,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,EAAE;QAC5C,iCAAiC;QACjC,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC;QAEpC,iEAAiE;QACjE,mBAAmB,CAAC,GAAG,GAAG;YACtB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;YACvB,SAAS,EAAE,EAAE;YACb,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC,cAAc;SAC9C,CAAC;QACF,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjE,mBAAmB,CAAC,GAAG,GAAG;YACtB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;YACvB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM;SAC9B,CAAC;QACF,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEjE,0BAA0B;QAC1B,IAAI,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE;YAC/B,wEAAwE;YACxE,gDAAgD;YAChD,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YACxC,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,gBAAgB,CAAC;YAEpE,mEAAmE;YACnE,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAE5F,gBAAgB;YAChB,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAEtD,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;YAChC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC;SAC7C;aAAM,IAAI,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE;YACtC,wEAAwE;YACxE,gDAAgD;YAChD,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YACxC,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,gBAAgB,CAAC;YAEpE,oCAAoC;YACpC,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE3F,gBAAgB;YAChB,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAEtD,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;YAChC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC;SAC7C;QACD,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,EAAE;YACjC,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YACxC,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,kBAAkB,CAAC;YACtE,sCAAsC;YAEtC,WAAW;YACX,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACtD,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;SACzD;KACJ;SAAM,IAAI,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE;QAC1C,8BAA8B;QAC9B,mBAAmB,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,mBAAmB,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;QAE1C,iEAAiE;QACjE,mBAAmB,CAAC,EAAE,GAAG;YACrB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI;YACvB,SAAS,EAAE,EAAS;SACvB,CAAC;QACF,mBAAmB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChE,mBAAmB,CAAC,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC;QAE3D,kCAAkC;QAClC,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE7F,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAClC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5C,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;KAC3B;AACL,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,uBAAuB,GAAG,UAC5B,KAAuB,EACvB,YAAiC,EACjC,cAAsB,EACtB,UAAkC;IAClC,IAAI,MAAM,CAAC;IACX,QAAQ,KAAK,CAAC,IAAI,EAAE;QAChB,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBAClC,OAAO,KAAK,CAAC;aAChB;YACD,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE;gBAC9B,2GAA2G;gBAC3G,mCAAmC;gBACnC,IAAI,0BAA0B,CAAC;gBAC/B,IAAI,UAAU,IAAI,UAAU,CAAC,yBAAyB,EAAE;oBACpD,MAAM,gBAAgB,GAAG,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7E,MAAM,eAAe,GAAG,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrF,IAAI,gBAAgB,IAAI,eAAe,EAAE;wBACrC,qEAAqE;wBACrE,MAAM,aAAa,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;wBAC7F,MAAM,SAAS,GAAG,CAAC,eAAe,IAAI,eAAe,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;wBAEvF,yBAAyB;wBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACvC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;yBAC/C;wBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACvC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;yBACpC;wBAED,0BAA0B,GAAG,aAAa,CAAC;wBAE3C,mDAAmD;wBACnD,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;wBACvD,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;qBACnE;iBACJ;gBAED,yBAAyB;gBACzB,IAAI,IAAA,kBAAQ,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAChD,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBACtC;iBACJ;qBAAM;oBACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAChD,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBACzC;iBACJ;gBACD,qCAAqC;gBACrC,IAAI,0BAA0B,EAAE;oBAC5B,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;wBAChD,yBAAyB,EAAE,0BAA0B;qBACxD,CAAC,CAAC;iBACN;aACJ;iBAAM;gBACH,OAAO,KAAK,CAAC;aAChB;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,sDAAsD;YACtD,uDAAuD;YACvD,wDAAwD;YACxD,oDAAoD;YACpD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;SAC1C;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;YACpC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBAClC,OAAO,KAAK,CAAC;aAChB;YACD,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,EAAE;gBACjD,yBAAyB;gBACzB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;oBACzB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;iBACpD;aACJ;iBAAM;gBACH,OAAO,KAAK,CAAC;aAChB;YACD,MAAM;QACV;YACI,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;KACxE;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAQF;;;;;;;;GAQG;AACH,MAAM,MAAM,GAAG,UACX,KAAuB,EACvB,YAAiC,EACjC,cAAsB,EACtB,UAAkC,EAClC,sBAAqC,EACrC,UAAwB;IACxB,IAAI,gBAAgB,CAAC;IACrB,IAAI,+CAAsB,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,EAAE;QACjD,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC;QAEvD,wEAAwE;QACxE,kFAAkF;QAClF,uFAAuF;QACvF,0FAA0F;QAC1F,wFAAwF;QACxF,4FAA4F;QAC5F,uFAAuF;QACvF,IAAI,+CAAsB,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI;YAClD,sBAAsB,KAAK,SAAS;YACpC,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS,EAAE;YACvD,IAAI,sBAAsB,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrD,sBAAsB,CAAC,iBAAiB,EAAE;gBAC1C,gBAAgB,IAAI,sBAAsB,CAAC,MAAM,CAAC;aACrD;SACJ;QACD,IAAI,gBAAgB,GAAG,CAAC,EAAE;YACtB,gBAAgB,GAAG,CAAC,CAAC,CAAC,oCAAoC;SAC7D;KACJ;IACD,QAAQ,KAAK,CAAC,IAAI,EAAE;QAChB,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,UAAU,IAAI,UAAU,CAAC,yBAAyB,IAAI,CAAC,IAAA,kBAAQ,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;gBACrF,6FAA6F;gBAC7F,MAAM,QAAQ,GAAG,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,IAAI,CAAC,QAAQ,EAAE;oBACX,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;wBACzD,yBAAyB,EAAE,CAAC;gCACxB,UAAU,EAAE,CAAC;gCACb,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM;gCACtC,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;6BAC5C,CAAC;qBACL,CAAC,CAAC;iBACN;aACJ;YAED,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE;gBAC7E,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACpE;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,sFAAsF;YACtF,iDAAiD;YAEjD,4EAA4E;YAC5E,mDAAmD;YACnD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,MAAM,GAAG,CAAC,EAAE;gBACZ,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACpE;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE;gBAC7E,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;oBAClC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACxF;qBAAM;oBACH,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACpE;aACJ;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnC,gBAAgB;YAChB,MAAM;SACT;QACD;YACI,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,iBAAiB,GAAI,KAAa,CAAC,IAAI,EAAE,CAAC,CAAC;KACjF;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,UAAS,UAAuB,EAAE,kBAA2B;IACpF,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IAC3B,QAAQ,GAAG,CAAC,IAAI,EAAE;QACd,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,QAAQ,GAAG,CAAC,IAAI,EAAE;gBACd,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,oFAAoF;oBACpF,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;oBACzF,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,kEAAkE;oBAClE,MAAM,MAAM,GAAG,IAAA,kBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBACvF,IAAI,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;wBACpC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;qBAC5F;oBAEA,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;oBACrB,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,4CAA4C;oBAC5C,IAAI,kBAAkB,EAAE;wBACpB,+CAA+C;wBAC/C,iDAAiD;wBAChD,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC;qBACxE;yBAAM;wBACH,uCAAuC;wBACvC,yCAAyC;wBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;4BAC9C,wCAAwC;4BACxC,8BAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAC;4BAEvF,IAAI,CAAC,qCAAqC,CAAC,CAAC,EACxC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAC1B,KAAK,CAAC,CAAC;yBACd;wBACD,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;wBAC7B,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC;qBACxE;oBACD,MAAM;iBACT;gBACD;oBACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;aAClF;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,oFAAoF;YACpF,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;YACzF,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,kBAAkB,EAAE;gBACpB,wCAAwC;gBACxC,kDAAkD;gBAClD,cAAc;gBACd,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;oBAC/B,GAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;iBAC5D;gBACD,MAAM;aACT;iBAAM;gBACH,2CAA2C;gBAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;oBAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;wBAC9C,wCAAwC;wBACxC,8BAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAC;wBAEvF,IAAI,CAAC,qCAAqC,CAAC,CAAC,EACxC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAC1B,KAAK,CAAC,CAAC;qBACd;oBACD,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;iBACjC;gBACD,MAAM;aACT;SACJ;QACD;YACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;KAClF;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,UAAS,OAA2B,EAAE,OAA2B;IAC1F,sCAAsC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,IAAI,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE;QACxB,OAAO,KAAK,CAAC;KAChB;IAED,IAAI,CAAC,CAAC;IACN,gDAAgD;IAChD,IAAI,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QACpC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACtB,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpE,MAAM;aACT;SACJ;KACJ;SAAM;QACH,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACtB,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC3B,MAAM;aACT;SACJ;KACJ;IACD,OAAO,CAAC,KAAK,GAAG,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,wBAAwB,GAAG,UAC7B,UAAuB,EACvB,aAA6B,EAC7B,WAAmB,EACnB,kBAA0B,EAC1B,UAAiC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;QAClD,MAAM,qBAAqB,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5D,IAAI,UAAU,IAAI,UAAU,CAAC,yBAAyB,EAAE;YACpD,IAAI,MAAc,CAAC;YACnB,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,IAAA,kBAAQ,EAAC,aAAa,CAAC,EAAE;gBAC1B,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;gBAE9B,UAAU,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,EAAE;oBACpD,yBAAyB,EAAE,CAAC;4BACxB,UAAU,EAAE,CAAC;4BACb,WAAW,EAAE,MAAM;4BACnB,qBAAqB;yBACxB,CAAC;iBACL,CAAC,CAAC;aACN;SACJ;KACJ;IAED,MAAM,YAAY,GAAG,CAAC,QAAuC,EAAE,MAAuB,EAAE,EAAE;QACtF,qDAAqD;QACrD,OAAO,QAAQ,CAAC,cAAc,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;QACrB,MAAM,QAAQ,GAAG;YACb,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,qCAAY,CAAC,4BAA4B;YAC/C,iBAAiB,EAAE,IAAA,wBAAS,EAAC,MAAM,CAAC;SACvC,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE7B,uCAAuC;QACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,CAAC,CAAC;IACF,QAAQ,GAAG,CAAC,IAAI,EAAE;QACd,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,QAAQ,GAAG,CAAC,IAAI,EAAE;gBACd,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACvB,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,uCAAuC;oBACvC,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,uCAAuC;oBACvC,MAAM;iBACT;gBACD;oBACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;aAClF;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,QAAQ,GAAG,CAAC,IAAI,EAAE;gBACd,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,IAAI,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;wBACzC,kEAAkE;wBAClE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC;qBAC7D;oBAED,+DAA+D;oBAC/D,yDAAyD;oBACzD,6DAA6D;oBAC7D,qBAAqB;oBACrB,IAAI,UAAU,CAAC,sBAAsB;wBACjC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;wBAC3D,YAAY,CAAC;4BACT,SAAS,EAAE,UAAU,CAAC,sBAAyC;yBAClE,EAAE,GAAG,CAAC,CAAC;qBACX;oBACD,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,kEAAkE;oBAElE,MAAM,MAAM,GAAG,IAAA,kBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBACvF,MAAM,MAAM,GAAG,IAAA,kBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAEvF,IAAI,MAAM,KAAK,MAAM,EAAE;wBACnB,MAAM,IAAI,KAAK,CAAC,+EAA+E;4BAC3F,yDAAyD,CAAC,CAAC;qBAClE;oBACA,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;oBACrB,MAAM;iBACT;gBACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,iDAAiD;oBACjD,sDAAsD;oBAEtD,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC7B,OAAO,GAAG,CAAC,cAAc,CAAC;wBAC1B,OAAO,GAAG,CAAC,MAAM,CAAC;wBAClB,IAAI,QAAQ,GAAG;4BACX,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,qCAAY,CAAC,2BAA2B;4BAC9C,iBAAiB,EAAE,IAAA,wBAAS,EAAC,GAAG,CAAC;yBACpC,CAAC;wBACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qBAChC;oBAEA,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;oBAErB,MAAM;iBACT;gBACD;oBACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;aAClF;YACD,MAAM;SACT;QACD,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,kBAAkB,EAAE;gBACpB,sCAAsC;gBACtC,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjF,OAAO,GAAG,CAAC,cAAc,CAAC;oBAC1B,OAAO,GAAG,CAAC,MAAM,CAAC;oBAClB,IAAI,QAAQ,GAAG;wBACX,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,qCAAY,CAAC,aAAa;wBAChC,iBAAiB,EAAE,IAAA,wBAAS,EAAC,GAAG,CAAC;qBACpC,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7B,2EAA2E;oBAC3E,yFAAyF;oBACzF,sFAAsF;oBACtF,4BAA4B;oBAC5B,+FAA+F;oBAC/F,8DAA8D;oBAC9D,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;wBACzD,GAAwB,CAAC,IAAI,GAAG,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC;wBAClE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;wBACrB,wDAAwD;qBAC3D;yBAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;wBACzB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;qBAC/C;iBACJ;gBACD,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBAC1E,OAAO,GAAG,CAAC,cAAc,CAAC;oBAC1B,OAAO,GAAG,CAAC,MAAM,CAAC;oBAClB,IAAI,QAAQ,GAAG;wBACX,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,qCAAY,CAAC,mBAAmB;wBACtC,iBAAiB,EAAE,IAAA,wBAAS,EAAC,GAAG,CAAC;qBACpC,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAChC;gBACD,MAAM;aACT;iBAAM;gBACH,2CAA2C;gBAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;oBAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;wBAC9C,8BAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAC;wBAEvF,IAAI,CAAC,yCAAyC,CAAC,CAAC,EAC5C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAC1B,GAAG,WAAW,IAAI,CAAC,GAAG,EACtB,KAAK,EACL,aAAa,EACb,UAAU,CAAC,CAAC;qBACnB;iBACJ;gBACD,MAAM;aACT;SACJ;QACD;YACI,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;KAClF;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,UACjB,UAAuB,EACvB,YAAiC,EACjC,qBAA6B,EAC7B,mBAAiC,EACjC,kBAA2B,EAC3B,UAAkC;IAClC,IAAI,CAAC,UAAU,EAAE;QACb,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC;KACzD;IAED,qCAAqC;IACrC,IAAI,UAAU,CAAC,EAAE,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE;QAC7F,OAAO;KACV;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;QACrD,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;QACrD,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,OAAO;QACnD,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,OAAO;QACnD,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,cAAc,EAAE;QAC5D,eAAe;QACf,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;KAC3G;SAAM;QACH,+BAA+B;QAC/B,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,0CAA0C;QACzG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;KAC3E;AACL,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAAG,UACvB,UAAuB,EACvB,YAAiC,EACjC,qBAA6B,EAC7B,aAA6B,EAC7B,WAAmB,EACnB,kBAA2B,EAC3B,UAAkC;IAClC,IAAI,CAAC,UAAU,EAAE;QACb,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC;KACzD;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;QACrD,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,OAAO,EAAE;QACrD,2CAA2C;QAC3C,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;KAC1E;SAAM,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;QAC5D,UAAU,CAAC,IAAI,KAAK,uBAAuB,CAAC,OAAO,EAAE;QACrD,wCAAwC;KAC3C;SAAM;QACH,+BAA+B;QAC/B,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EACzD,WAAW,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC,0CAA0C;QAC5F,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;KAC3E;AACL,CAAC,CAAC;AAEF,2DAA2D;AAC3D,IAAiB,uBAAuB,CAyYvC;AAzYD,WAAiB,uBAAuB;IACpC;;;;;;;;OAQG;IACH,SAAgB,iCAAiC,CAC7C,sBAA2C,EAC3C,yBAA8C,EAC9C,SAAiB,EACjB,UAAkC;QAClC,8BAAY,CAAC,MAAM,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;QACpF,8BAAY,CAAC,MAAM,CAAC,CAAC,IAAA,kBAAQ,EAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC/E,8BAAY,CAAC,MAAM,CAAC,CAAC,IAAA,kBAAQ,EAAC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAErF,MAAM,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAErD,wEAAwE;QACxE,MAAM,SAAS,GAAG,IAAI,+CAAsB,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,+CAAsB,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAgD,EAAE,CAAC;QAE/D,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC;QAEpC,gCAAgC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3E,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAEhE,MAAM,qBAAqB,GAAwB,EAAE,CAAC;QACtD,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,WAAW,GAAG,CAAC,CAAC;QAEtC,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,mBAAmB,CAAC;QACxB,MAAM,OAAO,GAAgD,EAAE,CAAC;QAChE,IAAI,sBAAsB,CAAC;QAE3B,MAAM,gBAAgB,GAAG,GAAG,EAAE;YAC1B,IAAK,GAAW,CAAC,qBAAqB;gBAClC,OAAO,CAAC,EAAE,KAAK,SAAS;gBACxB,sBAAsB,KAAK,SAAS;gBACpC,OAAO,CAAC,EAAE,CAAC,SAAS,KAAM,GAAW,CAAC,qBAAqB,EAAE;gBAC7D,sBAAsB,GAAG,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC;aACjD;iBAAM;gBACH,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,sBAAsB;oBACtB,GAAG,CAAC,SAAS,KAAK,sBAAsB,EAAE;oBAC1C,SAAS,CAAC,IAAI,EAAE,CAAC;iBACpB;gBACD,sBAAsB,GAAG,SAAS,CAAC;gBACnC,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;aACnE;QACL,CAAC,CAAC;QAEF,0FAA0F;QAC1F,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,oBAAoB,CAAC;QACzB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE;YAC7C,yBAAyB;YACzB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAE7D,IAAI,WAAW,GAAG,kBAAkB,CAAC;YAErC,IAAI,YAAY;gBACZ,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;gBAC7D,CAAC,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;oBAC/C,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM;oBACvD,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,oBAAoB,CAAC,EAAE;gBACvD,WAAW,GAAG,eAAe,CAAC;aACjC;YAED,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;YAC7G,YAAY,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,GAAG,CAAC;YAClG,IAAI,YAAY,EAAE;gBACd,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC;aACxC;YAED,iCAAiC;YACjC,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;gBAClD,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;gBAC3D,iFAAiF;gBACjF,+EAA+E;gBAC/E,8EAA8E;gBAC9E,iFAAiF;gBACjF,sFAAsF;gBACtF,YAAY;gBACZ,IAAI,GAAG,CAAC,IAAI,KAAK,+CAAsB,CAAC,KAAK,CAAC,MAAM,EAAE;oBAClD,IAAI,CAAC,mBAAmB;wBACpB,mBAAmB,CAAC,QAAQ,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;wBACnD,mBAAmB,GAAG;4BAClB,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;4BAC1B,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;4BAClC,iBAAiB,EAAE,KAAK;4BACxB,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;yBACjC,CAAC;wBAEF,+EAA+E;wBAC/E,iFAAiF;wBACjF,6EAA6E;wBAC7E,IAAI,GAAG,CAAC,qBAAqB,EAAE;4BAC3B,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,mBAAmB,CAAC,QAAQ,EAAE;gCAC5E,mBAAmB,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;6BAC1E;yBACJ;qBACJ;iBACJ;gBAED,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;gBAE9B,yGAAyG;gBACzG,sGAAsG;gBACtG,IAAI,mBAAmB;oBACnB,CAAE,GAAW,CAAC,SAAS,KAAK,SAAS,IAAK,GAAW,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,mBAAmB,CAAC,YAAY,CAAC,EAAE;oBAC1G,mBAAmB,CAAC,iBAAiB,GAAG,IAAI,CAAC;iBAChD;gBACD,gCAAgC,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aAC9F;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;gBAClD,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;gBAC3D,gBAAgB,EAAE,CAAC;aACtB;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,kBAAkB,EAAE;gBAC7D,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9B,gCAAgC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvE,gBAAgB,EAAE,CAAC;aACtB;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;gBAC1B,yEAAyE;gBACzE,eAAe,GAAG,kBAAkB,CAAC;gBACrC,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC;aACnC;SACJ;QAED,cAAc;QACd,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,sBAAsB,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;SAChE;aAAM;YACH,OAAO,sBAAsB,CAAC,MAAM,CAAC;SACxC;QACD,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,sBAAsB,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;SAChE;aAAM;YACH,OAAO,sBAAsB,CAAC,MAAM,CAAC;SACxC;QAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,oDAAoD;YACpD,oCAAoC;YACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,aAAa,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE;gBAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC3D,IAAI,UAAU;oBACV,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;oBACrD,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC1B,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;qBACnD;yBAAM;wBACH,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;qBAC9B;iBACJ;qBAAM;oBACH,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC9B;aACJ;YACD,sBAAsB,CAAC,MAAM,GAAG,aAAa,CAAC;SACjD;aAAM;YACH,OAAO,sBAAsB,CAAC,MAAM,CAAC;SACxC;IACL,CAAC;IA1Ke,yDAAiC,oCA0KhD,CAAA;IAED;;;;;;;;OAQG;IACH,SAAgB,gCAAgC,CAC5C,uBAA4C,EAC5C,0BAA+C,EAC/C,WAAmB,EACnB,aAA6B,EAC7B,SAAiB,EACjB,UAAkC;QAClC,MAAM,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAErD,wEAAwE;QACxE,MAAM,SAAS,GAAG,IAAI,+CAAsB,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,+CAAsB,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAE3E,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC;QAEpC,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxF,MAAM,MAAM,GAAgD,EAAE,CAAC;QAC/D,2BAA2B,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAEpF,MAAM,qBAAqB,GAAwB,EAAE,CAAC;QACtD,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,WAAW,GAAG,CAAC,CAAC;QAEtC,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAgD,EAAE,CAAC;QAEhE,0FAA0F;QAC1F,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE;YAC7C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAE5D,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB,EACxD,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;YAEnF,iCAAiC;YACjC,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;gBAClD,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;gBAC3D,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;aAC3F;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,SAAS;gBAClD,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,gBAAgB,EAAE;gBAC3D,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,2BAA2B,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;aACvF;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,uBAAuB,CAAC,kBAAkB,EAAE;gBAC7D,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACxF,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,2BAA2B,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;aACvF;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;gBAC1B,yEAAyE;gBACzE,kBAAkB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;aACpC;SACJ;QAED,cAAc;QACd,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,0BAA0B,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;SACpE;aAAM;YACH,OAAO,0BAA0B,CAAC,MAAM,CAAC;SAC5C;QACD,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,0BAA0B,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;SACpE;aAAM;YACH,OAAO,0BAA0B,CAAC,MAAM,CAAC;SAC5C;QACD,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,oDAAoD;YACpD,qCAAqC;YACrC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,aAAa,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE;gBAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC3D,IAAI,UAAU;oBACV,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;oBACrD,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC1B,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;qBACnD;yBAAM;wBACH,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;qBAC9B;iBACJ;qBAAM;oBACH,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC9B;aACJ;YAED,0BAA0B,CAAC,MAAM,GAAG,aAAa,CAAC;SACrD;aAAM;YACH,OAAO,0BAA0B,CAAC,MAAM,CAAC;SAC5C;IACL,CAAC;IAhGe,wDAAgC,mCAgG/C,CAAA;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsDG;IACH,SAAgB,yBAAyB,CACrC,uBAA4C,EAC5C,gCAAqD,EACrD,MAAc,EACd,WAAmB,EACnB,aAA6B,EAC7B,UAAkC;QAClC,IAAI,IAAA,kBAAQ,EAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC;YAC/F,gCAAgC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE;YACnE,2EAA2E;YAC3E,IAAI,QAAQ,GAAG;gBACX,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,qCAAY,CAAC,aAAa;gBAChC,iBAAiB,EAAE,IAAA,wBAAS,EAAC,uBAAuB,CAAC;aACxD,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,yCAAyC;YACzC,IAAI,QAAQ,GAAG,uBAAuB,CAAC;YACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;gBAC9B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;aAC7B;YACD,IAAI,WAAW,GAAG,gCAAgC,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACjC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;aACnC;YACD,IAAI,QAAQ,KAAK,WAAW,EAAE;gBAC1B,OAAO,gCAAgC,CAAC,MAAM,CAAC,CAAC;aACnD;SACJ;aAAM,IAAI,IAAA,kBAAQ,EAAC,uBAAuB,CAAC,IAAI,CAAC,uBAAuB;YACpE,uBAAuB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE;YAClD,oFAAoF;YACpF,0DAA0D;YAC1D,IAAI,QAAQ,GAAG;gBACX,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,qCAAY,CAAC,aAAa;gBAChC,iBAAiB,EAAE,IAAA,wBAAS,EAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC;aACzE,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,gCAAgC,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC;SACtE;aAAM;YACH,yDAAyD;YACzD,IAAI,CAAC,gCAAgC,CAAC,uBAAuB,EACzD,gCAAgC,CAAC,MAAM,CAAC,EACxC,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,CAAC,CAAC;SACnB;IACL,CAAC;IAhDe,iDAAyB,4BAgDxC,CAAA;AACL,CAAC,EAzYgB,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAyYvC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/**\n * @fileoverview Helper functions and classes to work with array ChangeSets\n */\n import { copy as cloneDeep } from \"fastest-json-copy\";\n import isNumber from \"lodash/isNumber\";\n import isString from \"lodash/isString\";\n import isEqual from \"lodash/isEqual\";\n\n// @ts-ignore\nimport { ConsoleUtils, constants } from \"@fluid-experimental/property-common\";\nimport { ApplyChangeSetOptions, ConflictInfo, SerializedChangeSet } from \"../changeset\";\nimport { TypeIdHelper } from \"../helpers/typeidHelper\";\nimport { ArrayChangeSetIterator, arrayInsertList, arrayModifyList, arrayRemoveList, GenericOperation, InsertOperation, ModifyOperation, NoneNOPOperation, NOPOperation, RemoveOperation } from \"./arrayChangesetIterator\";\nimport { ConflictType } from \"./changesetConflictTypes\";\n\nconst { MSG } = constants;\nconst { isPrimitiveType } = TypeIdHelper;\n\n/**\n * The range combinations of two change sets (A and B)\n * This can either be complete operations, parts of complete operations or overlapping segments\n * @enum number\n */\nenum ArrayChangeSetRangeType {\n /**\n * A complete operation of change set A.\n */\n completeA,\n\n /**\n * A complete operation of change set B.\n */\n completeB,\n\n /**\n * A partial operation of change set A.\n */\n partOfA,\n\n /**\n * A partial operation of change set B.\n */\n partOfB,\n\n /**\n * A complete operation of change set A overlapping with a partial operation of change set B.\n */\n completeApartOfB,\n\n /**\n * A complete operation of change set B overlapping with a partial operation of change set A.\n */\n completeBpartOfA,\n\n /**\n * A complete operation of change set A overlapping a complete operation of change set B.\n */\n completeAcompleteB,\n\n /**\n * A partial operation of change set A, a partial operation of change set B.\n */\n partOfApartOfB,\n}\n\ninterface SegmentType<T = GenericOperation, K = GenericOperation, L = GenericOperation> {\n begin?: number;\n op?: T;\n flag?: ArrayChangeSetRangeType;\n opA?: K;\n opB?: L;\n removeInsertOperationA?: arrayRemoveList | arrayInsertList;\n\n}\n\n/**\n * A range of an array operation\n */\n// TODO: Cleaning up these types using discriminated union\nexport interface OperationRangeDescription<T = GenericOperation> {\n opA?: any;\n opB?: any;\n insertAlreadyProcessed?: boolean;\n removeInsertOperationB?: arrayRemoveList | arrayInsertList;\n removeInsertOperation?: arrayRemoveList | arrayInsertList;\n removeInsertOperationA?: arrayRemoveList | arrayInsertList;\n op?: T;\n begin?: number;\n end?: number;\n flag?: ArrayChangeSetRangeType;\n\n}\n\n/**\n * A range of an insert array operation\n */\nexport interface OperationRangeInsert extends OperationRangeDescription<InsertOperation> {\n removeInsertOperationB?: arrayInsertList;\n removeInsertOperation?: arrayInsertList;\n removeInsertOperationA?: arrayInsertList;\n}\n\n/**\n * A range of a remove array operation\n */\nexport interface OperationRangeRemove extends OperationRangeDescription<RemoveOperation> {\n removeInsertOperationB?: arrayRemoveList;\n removeInsertOperation?: arrayRemoveList;\n removeInsertOperationA?: arrayRemoveList;\n}\n\n/**\n* A range of a modify array operation\n*/\nexport interface OperationRangeModify extends Omit<OperationRangeDescription<ModifyOperation>,\n 'removeInsertOperationB' | 'removeInsertOperation' | 'removeInsertOperationA'> { }\n\n/**\n* A range of a NOP array operation\n*/\nexport interface OperationRangeNOP extends Omit<OperationRangeDescription<NOPOperation>,\n 'removeInsertOperationB' | 'removeInsertOperation' | 'removeInsertOperationA'> { }\n\n/**\n * A range of a none NOP array operation\n */\nexport type OperationRangeNoneNOP = OperationRangeInsert | OperationRangeRemove | OperationRangeModify;\n\nexport type OperationRange = OperationRangeNoneNOP | OperationRangeNOP;\n\n/**\n * Computes a range for an operation of the current change set\n * @param io_operation - Input\n * @param in_aOffset - The offset that needs to be added to transform the operation\n * @param io_resultingRange - The computed range\n */\nconst getRangeForCurrentStateOperation = function(io_operation: GenericOperation, in_aOffset: number, io_resultingRange: OperationRange) {\n if (!io_operation) {\n return;\n }\n if (io_operation.type === ArrayChangeSetIterator.types.NOP) {\n const dummyOp: NOPOperation = {\n type: ArrayChangeSetIterator.types.NOP,\n offset: in_aOffset,\n };\n io_resultingRange.begin = undefined;\n io_resultingRange.end = undefined;\n io_resultingRange.op = dummyOp;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n }\n\n io_operation.operation[0] += in_aOffset;\n switch (io_operation.type) {\n case ArrayChangeSetIterator.types.INSERT:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n case ArrayChangeSetIterator.types.REMOVE:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0];\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n (io_resultingRange as OperationRangeRemove).removeInsertOperation = io_operation.removeInsertOperation;\n return;\n case ArrayChangeSetIterator.types.MODIFY:\n io_resultingRange.begin = io_operation.operation[0];\n io_resultingRange.end = io_operation.operation[0] + io_operation.operation[1].length;\n io_resultingRange.op = io_operation;\n io_resultingRange.flag = ArrayChangeSetRangeType.completeA;\n return;\n default:\n throw new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n }\n};\n\nconst getOpLength = (op: arrayRemoveList) => isNumber(op[1]) ? op[1] : op[1].length;\n\n/**\n * Computes the impact range for a given operation of the applied change set\n * @param in_operation - The op\n * @param io_resultingRange - The computed range\n * @param in_flag - The flag for the resulting range, default is 'complete B'\n * @param in_options - Optional additional parameters\n */\nconst getRangeForAppliedOperation = function(\n in_operation: GenericOperation,\n io_resultingRange: OperationRangeDescription,\n in_flag?: ArrayChangeSetRangeType,\n in_options?: ApplyChangeSetOptions,\n) {\n if (!in_operation || in_operation.type === ArrayChangeSetIterator.types.NOP) {\n io_resultingRange.begin = undefined;\n io_resultingRange.end = undefined;\n io_resultingRange.op = undefined;\n io_resultingRange.flag = undefined;\n return;\n }\n if (!io_resultingRange.op) {\n io_resultingRange.op = {} as any;\n }\n io_resultingRange.op.type = in_operation.type;\n io_resultingRange.op.offset = in_operation.offset;\n if (!io_resultingRange.op.operation) {\n io_resultingRange.op.operation = [];\n }\n io_resultingRange.op.operation[0] = in_operation.operation[0];\n\n io_resultingRange.begin = in_operation.operation[0];\n io_resultingRange.op._absoluteBegin = in_operation.operation[0];\n io_resultingRange.flag = in_flag !== undefined ? in_flag : ArrayChangeSetRangeType.completeB;\n\n switch (in_operation.type) {\n case ArrayChangeSetIterator.types.INSERT:\n io_resultingRange.end = in_operation.operation[0];\n io_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n if (in_options && in_options.applyAfterMetaInformation) {\n const metaInformation = in_options.applyAfterMetaInformation.get(in_operation.operation[1]);\n if (metaInformation) {\n in_options.applyAfterMetaInformation.set(io_resultingRange.op.operation[1], metaInformation);\n }\n }\n return;\n case ArrayChangeSetIterator.types.REMOVE:\n let numberOfRemovedElements = getOpLength(in_operation.operation);\n\n io_resultingRange.end = in_operation.operation[0] + numberOfRemovedElements;\n io_resultingRange.op.operation[1] = Array.isArray(in_operation.operation[1])\n ? in_operation.operation[1].slice()\n : in_operation.operation[1];\n io_resultingRange.removeInsertOperation = in_operation.removeInsertOperation;\n return;\n case ArrayChangeSetIterator.types.MODIFY:\n io_resultingRange.end = in_operation.operation[0] + in_operation.operation[1].length;\n io_resultingRange.op.operation[1] = in_operation.operation[1].slice();\n if (in_operation.operation[2] !== undefined) {\n io_resultingRange.op.operation[2] = in_operation.operation[2].slice();\n }\n return;\n default:\n throw new Error(`getRangeForCurrentStateOperation: ${MSG.UNKNOWN_OPERATION}`);\n }\n};\n\n/**\n * Splits the second and third parameter in an array remove or modify operation into two segments.\n * This treats the three possible cases array, string and length that are allowed in a remove operation\n *\n * @param in_firstResult - Place where the first half is stored\n * @param in_secondResult - Place where the second half is stored\n * @param in_data - The original operation\n * @param in_start - Index at which the operation is split\n * @private\n */\nconst _splitArrayParameter = function(\n in_firstResult: arrayModifyList | arrayRemoveList,\n in_secondResult: arrayModifyList | arrayRemoveList,\n in_data: arrayModifyList | arrayRemoveList,\n in_start: number,\n) {\n let firstTmp: any;\n if (isString(in_data[1])) {\n firstTmp = in_data[1].substr(0, in_start);\n in_secondResult[1] = in_data[1].substr(in_start);\n if (in_firstResult) {\n in_firstResult[1] = firstTmp;\n }\n if (in_data[2] !== undefined && isString(in_data[2])) {\n firstTmp = in_data[2].substr(0, in_start);\n in_secondResult[2] = in_data[2].substr(in_start);\n if (in_firstResult) {\n in_firstResult[2] = firstTmp;\n }\n }\n } else if (Array.isArray(in_data[1])) {\n firstTmp = in_data[1].splice(0, in_start);\n in_secondResult[1] = in_data[1];\n if (in_firstResult) {\n in_firstResult[1] = firstTmp;\n }\n if (in_data[2] !== undefined && Array.isArray(in_data[2])) {\n firstTmp = in_data[2].splice(0, in_start);\n in_secondResult[2] = in_data[2];\n if (in_firstResult) {\n in_firstResult[2] = firstTmp;\n }\n }\n } else {\n if (in_firstResult) {\n in_firstResult[1] = in_start;\n }\n in_secondResult[1] = in_data[1] - in_start;\n }\n};\n\n/**\n * Splits an operation for the splitOverlapping function\n *\n * @param in_targetRange - The range to split\n * @param in_targetOperation - The target operation into which the split range is written\n * @param lengthUsedInResultSegment - The length of the range to split\n * @param in_updateOffset - Should the offset in the target range be updated?\n */\nconst _splitOperation = function(\n in_targetRange: OperationRangeDescription<NoneNOPOperation>,\n in_targetOperation: NoneNOPOperation,\n lengthUsedInResultSegment: number,\n in_updateOffset: boolean,\n) {\n _splitArrayParameter(in_targetOperation.operation, in_targetRange.op.operation,\n in_targetRange.op.operation, lengthUsedInResultSegment);\n\n if (in_updateOffset) {\n if (in_targetRange.op.type === ArrayChangeSetIterator.types.INSERT) {\n in_targetRange.op.offset += lengthUsedInResultSegment;\n }\n if (in_targetRange.op.type === ArrayChangeSetIterator.types.REMOVE) {\n in_targetRange.op.offset -= lengthUsedInResultSegment;\n }\n }\n};\n\n/**\n * Copies an array operation\n * @param in_sourceOperation - The source operation\n * @param in_targetOperation - The target operation which will be overwritten\n */\nconst _copyOperation = function(in_sourceOperation: NoneNOPOperation, in_targetOperation: NoneNOPOperation) {\n if (in_sourceOperation.type === ArrayChangeSetIterator.types.REMOVE) {\n in_targetOperation.operation[1] = in_sourceOperation.operation[1];\n } else {\n in_targetOperation.operation[1] = in_sourceOperation.operation[1].slice();\n if (in_sourceOperation.operation[2] !== undefined) {\n in_targetOperation.operation[2] = in_sourceOperation.operation[2].slice();\n }\n }\n};\n\n/**\n * cut overlapping ranges in non-overlapping and completely overlapping segments\n * ranges of length 0 just cut lengthy ranges\n * @param io_rangeA - Input A\n * @param io_rangeB - Input B\n * @param io_resultingSegment - The resulting overlapping segment\n * @param in_rebasing - Is this function called for rebasing - we have to implement two different\n * behaviors of this function: one for squashing and one for rebasing, because an insert-insert\n * operation in squashing should be separte segments, while for rebasing, we need one segment\n * for both inserts to be able to report a conflict.\n * overlapping range or\n * (partial) A or B\n */\n// eslint-disable-next-line complexity\nconst splitOverlapping = function(\n io_rangeA: OperationRangeInsert | OperationRangeRemove,\n io_rangeB: OperationRangeInsert | OperationRangeRemove,\n io_resultingSegment: OperationRangeInsert | OperationRangeRemove,\n in_rebasing: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (io_rangeA.removeInsertOperation) {\n io_resultingSegment.removeInsertOperationA = io_rangeA.removeInsertOperation;\n } else {\n delete io_resultingSegment.removeInsertOperationA;\n }\n if (io_rangeB.removeInsertOperation) {\n io_resultingSegment.removeInsertOperationB = io_rangeB.removeInsertOperation;\n } else {\n delete io_resultingSegment.removeInsertOperationB;\n }\n\n if (io_rangeB.begin === undefined) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = io_rangeA.op;\n io_resultingSegment.flag = io_rangeA.flag;\n return;\n }\n\n if (io_rangeB.removeInsertOperation &&\n io_rangeB.op.type === ArrayChangeSetIterator.types.REMOVE &&\n (io_rangeA.begin === undefined || io_rangeB.removeInsertOperation[0] < io_rangeA.begin - io_rangeA.op.offset) &&\n io_rangeB.removeInsertOperation[0] < io_rangeB.begin &&\n !io_rangeB.insertAlreadyProcessed) {\n io_resultingSegment.begin = io_rangeB.removeInsertOperation[0];\n io_resultingSegment.end = io_rangeB.removeInsertOperation[0];\n (io_resultingSegment as OperationRangeInsert).op = {\n type: ArrayChangeSetIterator.types.INSERT,\n operation: io_rangeB.removeInsertOperation as arrayInsertList,\n offset: io_rangeB.op.offset,\n };\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeB;\n io_rangeB.insertAlreadyProcessed = true;\n return;\n }\n\n if (io_rangeA.begin === undefined) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.op = io_rangeB.op;\n io_resultingSegment.flag = io_rangeB.flag;\n return;\n }\n io_resultingSegment.opA = undefined;\n io_resultingSegment.opB = undefined;\n io_resultingSegment.op = undefined;\n\n // We have an overlapping remove and insert operation at the same position\n // in a squash operation. In that case, we try to create a more efficient\n // ChangeSet by detecting cases, in which the remove and insert cancel out\n // (which we can detect for a reversible ChangeSet).\n // TODO: In the most general case, we should convert the overlapping remove\n // insert operations into the most optimal modify operation, but this\n // would require the computation of the edit distance between the two\n // operations, which could only be done efficiently for named properties.\n let nextInsertOffset = 0;\n if (io_rangeA.removeInsertOperation) {\n nextInsertOffset = getOpLength(io_rangeA.removeInsertOperation);\n }\n if (!in_rebasing &&\n (io_rangeA.begin <= io_rangeB.begin) &&\n (io_rangeA.begin + nextInsertOffset >= io_rangeB.begin) &&\n (io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n Array.isArray(io_rangeA.op.operation[1]) && // This is a reversible remove operation\n (io_rangeB.op.type === ArrayChangeSetIterator.types.INSERT)) {\n // Are the two operations canceling out?\n let startOffset = 0;\n let rangeStart = 0;\n let matchFound = false;\n let rangeLength = io_rangeB.op.operation[1].length;\n const operationMetaInfo = in_options && in_options.applyAfterMetaInformation &&\n in_options.applyAfterMetaInformation.get(io_rangeB.op.operation[1]);\n if (operationMetaInfo && operationMetaInfo.rebasedRemoveInsertRanges) {\n if (operationMetaInfo.currentInsertOffset === undefined) {\n operationMetaInfo.currentInsertOffset = 0;\n operationMetaInfo.currentRemoveOffset = 0;\n }\n let i = 0;\n for (; i < operationMetaInfo.rebasedRemoveInsertRanges.length; i++) {\n if (operationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart >= operationMetaInfo.currentInsertOffset) {\n startOffset = operationMetaInfo.rebasedRemoveInsertRanges[i].originalStartPosition -\n io_rangeA.op.operation[0] +\n io_rangeA.op.offset +\n io_rangeB.op.offset;\n rangeStart = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeStart -\n operationMetaInfo.currentInsertOffset;\n rangeLength = operationMetaInfo.rebasedRemoveInsertRanges[i].rangeLength;\n\n if (io_rangeA.op.operation[1].length - startOffset >= rangeLength &&\n isEqual(io_rangeA.op.operation[1].slice(startOffset, startOffset + rangeLength),\n io_rangeB.op.operation[1].slice(rangeStart, rangeStart + rangeLength))) {\n matchFound = true;\n\n // If we have an remove / insert operation in the range A we have to make sure,\n // the insert happens at the correct position within the remove range after canceling\n // out the insert/remove combination.\n // We decide this, based on the position of the insert in iterator B relative to the insert\n // in iterator A. If the insert in iterator B is behind the insert in iteraator A, we have\n // to move the insert from A to the beginning of the remove range, since it has to placed\n // before the canceled range.\n if (nextInsertOffset > 0 &&\n io_rangeB.begin >= io_rangeA.begin + nextInsertOffset) {\n const newStartOffset = io_rangeA.op.operation[0] + startOffset - io_rangeA.op.offset;\n\n // We don't want to shift the insertion backwards, if it already is before the position of the\n // canceled entry\n io_rangeA.removeInsertOperation[0] = Math.min(io_rangeA.removeInsertOperation[0], newStartOffset);\n }\n break;\n }\n }\n }\n } else {\n if (io_rangeA.op.operation[1].length === rangeLength &&\n isEqual(io_rangeA.op.operation[1],\n io_rangeB.op.operation[1])) {\n matchFound = true;\n }\n }\n if (matchFound) {\n if (startOffset > 0) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.begin;\n\n io_resultingSegment.op = {\n type: io_rangeA.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n // cut the remaining segment entry\n _splitArrayParameter(io_resultingSegment.op.operation, io_rangeA.op.operation,\n io_rangeA.op.operation, startOffset);\n io_rangeA.op.operation[0] += startOffset;\n operationMetaInfo.currentRemoveOffset += startOffset;\n return;\n } else if (rangeStart > 0) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = rangeStart;\n\n io_resultingSegment.op = {\n type: io_rangeB.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n // cut the remaining segment entry\n _splitArrayParameter(io_resultingSegment.op.operation, io_rangeB.op.operation,\n io_rangeB.op.operation, rangeStart);\n operationMetaInfo.currentInsertOffset += rangeStart;\n return;\n } else {\n if (operationMetaInfo) {\n operationMetaInfo.currentRemoveOffset += rangeLength;\n operationMetaInfo.currentInsertOffset += rangeLength;\n }\n\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = undefined; // This is used to indicate that we don't need any operation\n\n if (io_rangeB.op.operation[1].length === rangeLength) {\n io_resultingSegment.flag = io_rangeA.op.operation[1].length === rangeLength\n ? ArrayChangeSetRangeType.completeAcompleteB\n : ArrayChangeSetRangeType.completeBpartOfA;\n } else {\n io_resultingSegment.flag = io_rangeA.op.operation[1].length === rangeLength\n ? ArrayChangeSetRangeType.completeApartOfB\n : ArrayChangeSetRangeType.partOfApartOfB;\n }\n // cut the remaining segment entry\n if (io_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n io_resultingSegment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n _splitArrayParameter(undefined, io_rangeA.op.operation,\n io_rangeA.op.operation, rangeLength);\n io_rangeA.op.operation[0] += rangeLength;\n }\n\n // cut the remaining segment entry\n if (io_resultingSegment.flag === ArrayChangeSetRangeType.partOfApartOfB ||\n io_resultingSegment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n _splitArrayParameter(undefined, io_rangeB.op.operation,\n io_rangeB.op.operation, rangeLength);\n }\n\n return;\n }\n }\n }\n\n if ((io_rangeA.end < io_rangeB.begin) || // please see in_rebasing comments in the function description\n ((!in_rebasing || io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE) &&\n (io_rangeA.end === io_rangeB.begin))) {\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.op = io_rangeA.op;\n io_resultingSegment.flag = io_rangeA.flag;\n\n // We need to store the length of the adjacent remove operation for later squashes\n if (in_rebasing &&\n io_rangeA.op.type === ArrayChangeSetIterator.types.REMOVE &&\n io_rangeA.end === io_rangeB.begin) {\n if (in_options && in_options.applyAfterMetaInformation) {\n let length = io_rangeB.op.operation[1];\n if (!isNumber(length)) {\n length = length.length;\n }\n\n in_options.applyAfterMetaInformation.set(io_rangeB.op.operation[1], {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: length,\n originalStartPosition: io_rangeA.end + io_rangeB.op.offset,\n }],\n });\n }\n }\n return;\n }\n if ((io_rangeB.end < io_rangeA.begin) || // please see in_rebasing comments in the function description\n (!in_rebasing && (io_rangeB.end === io_rangeA.begin))) {\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.op = io_rangeB.op;\n io_resultingSegment.flag = io_rangeB.flag;\n return;\n }\n // handle real overlaps:\n if (io_rangeA.begin < io_rangeB.begin) {\n // take A up to the begin of B\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = io_rangeB.begin;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.op = {\n type: io_rangeA.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfA;\n\n // cut the remaining segment entry\n _splitOperation(io_rangeA, io_resultingSegment.op, io_rangeB.begin - io_rangeA.begin, true);\n\n io_rangeA.begin = io_rangeB.begin;\n io_rangeA.op.operation[0] = io_rangeB.begin;\n } else if (io_rangeA.begin === io_rangeB.begin) {\n // find the largest common range:\n io_resultingSegment.begin = io_rangeA.begin;\n io_resultingSegment.end = undefined;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.opA = {\n type: io_rangeA.op.type,\n operation: [],\n _absoluteBegin: io_rangeA.op._absoluteBegin,\n };\n io_resultingSegment.opA.operation[0] = io_rangeA.op.operation[0];\n io_resultingSegment.opB = {\n type: io_rangeB.op.type,\n operation: [],\n offset: io_rangeB.op.offset,\n };\n io_resultingSegment.opB.operation[0] = io_rangeB.op.operation[0];\n\n // who ends first, A or B?\n if (io_rangeA.end < io_rangeB.end) {\n // segment A ends first, it is consumed by the resulting merged segment!\n // a part of segment B remains and needs updates\n io_resultingSegment.end = io_rangeA.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeApartOfB;\n\n // cut the remaining segment B entries (segment A needs no update!)\n _splitOperation(io_rangeB, io_resultingSegment.opB, io_rangeA.end - io_rangeA.begin, false);\n\n // just copy opA\n _copyOperation(io_rangeA.op, io_resultingSegment.opA);\n\n io_rangeB.begin = io_rangeA.end;\n io_rangeB.op.operation[0] = io_rangeA.end;\n } else if (io_rangeA.end > io_rangeB.end) {\n // segment B ends first, it is consumed by the resulting merged segment!\n // a part of segment A remains and needs updates\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeBpartOfA;\n\n // cut the remaining segment A entry\n _splitOperation(io_rangeA, io_resultingSegment.opA, io_rangeB.end - io_rangeB.begin, true);\n\n // just copy opB\n _copyOperation(io_rangeB.op, io_resultingSegment.opB);\n\n io_rangeA.begin = io_rangeB.end;\n io_rangeA.op.operation[0] = io_rangeB.end;\n }\n if (io_rangeA.end === io_rangeB.end) {\n io_resultingSegment.end = io_rangeB.end;\n io_resultingSegment.flag = ArrayChangeSetRangeType.completeAcompleteB;\n // both are fully used, no cut needed!\n\n // copy ops\n _copyOperation(io_rangeA.op, io_resultingSegment.opA);\n _copyOperation(io_rangeB.op, io_resultingSegment.opB);\n }\n } else if (io_rangeB.begin < io_rangeA.begin) {\n // take B up to the begin of A\n io_resultingSegment.begin = io_rangeB.begin;\n io_resultingSegment.end = io_rangeA.begin;\n\n // to avoid deepCopy, we just copy the necessary parts of the op:\n io_resultingSegment.op = {\n type: io_rangeB.op.type,\n operation: [] as any,\n };\n io_resultingSegment.op.operation[0] = io_rangeB.op.operation[0];\n io_resultingSegment.flag = ArrayChangeSetRangeType.partOfB;\n\n // cut the remaining segment entry\n _splitOperation(io_rangeB, io_resultingSegment.op, io_rangeA.begin - io_rangeB.begin, false);\n\n io_rangeB.begin = io_rangeA.begin;\n io_rangeB.op.operation[0] = io_rangeA.begin;\n io_rangeB.op.offset = 0;\n }\n};\n\n/**\n * merge in_op with the last op of that category in io_changeset (if possible)\n * e.g. merge an delete [1,3] with delete [3,2] to delete [1,5]\n * @param in_op - The op to merge\n * @param io_changeset - The changeset to merge the op to\n * @param in_targetIndex - The transformed target index offset\n * @returns true if the merge was possible and executed\n */\nconst mergeWithLastIfPossible = function(\n in_op: GenericOperation,\n io_changeset: SerializedChangeSet,\n in_targetIndex: number,\n in_options?: ApplyChangeSetOptions): boolean {\n let lastOp;\n switch (in_op.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (io_changeset.insert.length === 0) {\n return false;\n }\n lastOp = io_changeset.insert[io_changeset.insert.length - 1];\n if (lastOp[0] === in_targetIndex) {\n // If we merge two segments, we also have to merge the attached meta information and store mappings for the\n // sub-ranges of the merged segment\n let mergedRangeMetaInformation;\n if (in_options && in_options.applyAfterMetaInformation) {\n const previousMetaInfo = in_options.applyAfterMetaInformation.get(lastOp[1]);\n const currentMetaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n if (previousMetaInfo || currentMetaInfo) {\n // Get the range information attached to the segments that get merged\n const previousRange = (previousMetaInfo && previousMetaInfo.rebasedRemoveInsertRanges) || [];\n const nextRange = (currentMetaInfo && currentMetaInfo.rebasedRemoveInsertRanges) || [];\n\n // Update the start index\n for (let i = 0; i < nextRange.length; i++) {\n nextRange[i].rangeStart += lastOp[1].length;\n }\n\n for (let i = 0; i < nextRange.length; i++) {\n previousRange.push(nextRange[i]);\n }\n\n mergedRangeMetaInformation = previousRange;\n\n // Remove the old entries from the meta information\n in_options.applyAfterMetaInformation.delete(lastOp[1]);\n in_options.applyAfterMetaInformation.delete(in_op.operation[1]);\n }\n }\n\n // merge with last insert\n if (isString(in_op.operation[1])) {\n for (let i = 0; i < in_op.operation[1].length; i++) {\n lastOp[1] += in_op.operation[1][i];\n }\n } else {\n for (let i = 0; i < in_op.operation[1].length; i++) {\n lastOp[1].push(in_op.operation[1][i]);\n }\n }\n // Store the updated meta-information\n if (mergedRangeMetaInformation) {\n in_options.applyAfterMetaInformation.set(lastOp[1], {\n rebasedRemoveInsertRanges: mergedRangeMetaInformation,\n });\n }\n } else {\n return false;\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // We cannot perform merges for removes here, as those\n // also depend on the insert positions, which might not\n // yet have been processed when the remove is processed.\n // We handle these in a post processing step instead\n throw new Error(\"Should never happen\");\n }\n case ArrayChangeSetIterator.types.MODIFY:\n if (io_changeset.modify.length === 0) {\n return false;\n }\n lastOp = io_changeset.modify[io_changeset.modify.length - 1];\n if (lastOp[0] + lastOp[1].length === in_targetIndex) {\n // merge with last modify\n lastOp[1] = lastOp[1].concat(in_op.operation[1]);\n if (lastOp[2] !== undefined) {\n lastOp[2] = lastOp[2].concat(in_op.operation[2]);\n }\n } else {\n return false;\n }\n break;\n default:\n throw new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${in_op.type}`);\n }\n return true;\n};\n\ninterface RemoveOpInfo {\n position: number;\n offsetIncremented: boolean;\n length: number;\n}\n\n/**\n * push an operation to a changeset, will try to merge the op if possible\n * @param in_op - The operation we want to push\n * @param io_changeset - The target\n * @param the - The current offset\n * @param in_options - Optional additional parameters\n * @param in_lastIteratorARemove - The information about the last remove operation in iterator A\n * @param in_segment - The segment this operation is part of\n */\nconst pushOp = function(\n in_op: GenericOperation,\n io_changeset: SerializedChangeSet,\n in_indexOffset: number,\n in_options?: ApplyChangeSetOptions,\n in_lastIteratorARemove?: RemoveOpInfo,\n in_segment?: SegmentType) {\n let writeTargetIndex;\n if (ArrayChangeSetIterator.types.NOP !== in_op.type) {\n writeTargetIndex = in_op.operation[0] - in_indexOffset;\n\n // We have to update the write target index, if we have an insert at the\n // position of a remove. In that case, we have to move the insert to the beginning\n // of the remove range, to make sure, it will give consistent results with individually\n // rebasing the two changsets (first rebasing an insert at the beginning of the remove the\n // wouldn't have an effect on rebased changeset and then rebasing it with respect to the\n // insert would move it befind the insert. If we do this rebase with respect to the combined\n // CS, we must have the insert before the remove to make sure it is taken into account)\n if (ArrayChangeSetIterator.types.INSERT === in_op.type &&\n in_lastIteratorARemove !== undefined &&\n in_segment.flag === ArrayChangeSetRangeType.completeB) {\n if (in_lastIteratorARemove.position == in_op.operation[0] &&\n in_lastIteratorARemove.offsetIncremented) {\n writeTargetIndex -= in_lastIteratorARemove.length;\n }\n }\n if (writeTargetIndex < 0) {\n writeTargetIndex = 0; // TODO: investigate negative index!\n }\n }\n switch (in_op.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (in_options && in_options.applyAfterMetaInformation && !isNumber(in_op.operation[1])) {\n // If we don't have any meta information yet, we add an entry with the correct offset applied\n const metaInfo = in_options.applyAfterMetaInformation.get(in_op.operation[1]);\n if (!metaInfo) {\n in_options.applyAfterMetaInformation.set(in_op.operation[1], {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: in_op.operation[1].length,\n originalStartPosition: in_op.operation[0],\n }],\n });\n }\n }\n\n if (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n io_changeset.insert.push([writeTargetIndex, in_op.operation[1]]);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Note: we don't merge removes here, since those depend on not yet processed inserts.\n // This is done in a post processing step instead\n\n // our segmentation method currently can produce length zero remove segments\n // this is by by design and those filtered out here\n const length = getOpLength(in_op.operation);\n if (length > 0) {\n io_changeset.remove.push([writeTargetIndex, in_op.operation[1]]);\n }\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (!mergeWithLastIfPossible(in_op, io_changeset, writeTargetIndex, in_options)) {\n if (in_op.operation[2] !== undefined) {\n io_changeset.modify.push([writeTargetIndex, in_op.operation[1], in_op.operation[2]]);\n } else {\n io_changeset.modify.push([writeTargetIndex, in_op.operation[1]]);\n }\n }\n break;\n }\n case ArrayChangeSetIterator.types.NOP: {\n // nothing to do\n break;\n }\n default:\n throw new Error(`pushOp: ${MSG.UNKNOWN_OPERATION}${(in_op as any).type}`);\n }\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n * @param in_segment - The two ops to be combined\n * @param in_isPrimitiveType - Is it an array of primitive types\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n */\nconst handleCombinations = function(in_segment: SegmentType, in_isPrimitiveType: boolean) {\n const opA = in_segment.opA;\n const opB = in_segment.opB;\n switch (opA.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n // this combination is not reachable since this case has already been handled before\n console.error(\"this combination should not occur in handleCombinations - this is a bug\");\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Attention: B removes A completely, kill A to avoid zero inserts\n const opBLen = isNumber(opB.operation[1]) ? opB.operation[1] : opB.operation[1].length;\n if (opBLen !== opA.operation[1].length) {\n throw new Error(\"handleCombinations: insert-remove: unequal number of affected entries\");\n }\n\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // we have to apply modify of B to As insert\n if (in_isPrimitiveType) {\n // since the length of A and B is equal in here\n // we can just insert the modified values instead\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n } else {\n // the array element is a complex types\n // we have to recursively call the modify\n for (let i = 0; i < opB.operation[1].length; ++i) {\n // TypeIds MUST be stored in the entries\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.performApplyAfterOnPropertyWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n false);\n }\n opB.operation = opA.operation;\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.INSERT;\n }\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // this combination is not reachable since this case has already been handled before\n console.error(\"this combination should not occur in handleCombinations - this is a bug\");\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (in_isPrimitiveType) {\n // If we have a reversible changeset, we\n // have to keep the previous state from before the\n // apply after\n if (opA.operation[2] !== undefined) {\n (opB as ModifyOperation).operation[2] = opA.operation[2];\n }\n break;\n } else {\n // we have to deal with complex types here!\n if (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n for (let i = 0; i < opB.operation[1].length; ++i) {\n // TypeIds MUST be stored in the entries\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.performApplyAfterOnPropertyWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n false);\n }\n opB.operation = opA.operation;\n }\n break;\n }\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n }\n};\n\n/**\n * Tests if 2 arrays of the same length, containing primitive values, contain the same values.\n *\n * @param in_arr1 - First array to compare\n * @param in_arr2 - Second array to compare\n * @returns True if arrays contain the same values, false otherwise\n */\nconst arraysHaveSameValues = function(in_arr1: arrayModifyList[1], in_arr2: arrayModifyList[1]): boolean {\n // We assume arrays are of same length\n const len = in_arr1.length;\n if (len !== in_arr2.length) {\n return false;\n }\n\n let i;\n // For (u)int64, values are arrays of 2 elements\n if (len > 0 && in_arr1[0].length === 2) {\n for (i = 0; i < len; i++) {\n if (in_arr1[i][0] !== in_arr2[i][0] || in_arr1[i][1] !== in_arr2[i][1]) {\n break;\n }\n }\n } else {\n for (i = 0; i < len; i++) {\n if (in_arr1[i] !== in_arr2[i]) {\n break;\n }\n }\n }\n return i === len;\n};\n\n/**\n * handle combinations of range operations\n * e.g. an insert and delete at the same place and same length nullify each other\n *\n * ATTENTION: We overwrite opB to save garbage (instead of creating a result OP)\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n *\n * ```\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n * ```\n *\n * gets rebased to:\n *\n * ```\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n * ```\n *\n * conflict default behavior in ()\n *\n * ```\n * -------|-----------------+------------------+------------------|\n * \\Own| insert | modify | remove |\n * \\ | | | |\n * other\\ | | | |\n * ------\\|-----------------+------------------+------------------|\n * | conflicting | non-conflicting | non-conflicting |\n * insert | inserts | change | change |\n * | (i. other after)| | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | merge recursively| conflict |\n * modify | change | (note the user) | (delete modify |\n * | | | in other) |\n * | | | |\n * -------|-----------------+------------------+------------------|\n * | non-conflicting | non-conflicting | non-conflicting |\n * remove | change | change | change |\n * | [rem orig. data]| (note the user) | [rem dupl. rem] |\n * -------|-----------------+------------------+------------------|\n * ```\n *\n * @param {{opA:{}, opB:{}}} in_segment - The two ops to be combined\n * @param {Array.<property-changeset.ChangeSet.ConflictInfo>} out_conflicts - A list of paths that resulted in\n * conflicts together with the type of the conflict\n * @param {string} in_basePath - Base path to get to the property processed by this function\n * @param {boolean} in_isPrimitiveType - is it an array of primitive types\n * @param {Object} [in_options] - Optional additional parameters\n * @param {Map} [in_options.applyAfterMetaInformation] - Additional meta information which help later to obtain\n * more compact changeset during the apply operation\n */\nconst handleRebaseCombinations = function(\n in_segment: SegmentType,\n out_conflicts: ConflictInfo[],\n in_basePath: string,\n in_isPrimitiveType: string,\n in_options: ApplyChangeSetOptions) {\n const opA = in_segment.opA;\n const opB = in_segment.opB;\n if (opB.type === ArrayChangeSetIterator.types.INSERT) {\n const originalStartPosition = opB.operation[0] + opB.offset;\n if (in_options && in_options.applyAfterMetaInformation) {\n let length: number;\n const insertEntries = opB.operation[1];\n if (!isNumber(insertEntries)) {\n length = insertEntries.length;\n\n in_options.applyAfterMetaInformation.set(insertEntries, {\n rebasedRemoveInsertRanges: [{\n rangeStart: 0,\n rangeLength: length,\n originalStartPosition,\n }],\n });\n }\n }\n }\n\n const handleInsert = (insertOp: Omit<InsertOperation, 'type'>, baseOp: InsertOperation) => {\n // conflicting inserts - report conflict, insert both\n delete insertOp._absoluteBegin;\n delete baseOp.offset;\n const conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.INSERTED_ENTRY_WITH_SAME_KEY, // todo\n conflictingChange: cloneDeep(baseOp),\n };\n out_conflicts.push(conflict);\n\n // move to the right side of the insert\n baseOp.operation[0] += insertOp.operation[1].length;\n };\n switch (opA.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n handleInsert(opA, opB);\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // non-conflicting insert - just keep B\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // non-conflicting insert - just keep B\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n switch (opB.type) {\n case ArrayChangeSetIterator.types.INSERT: {\n if (opA._absoluteBegin !== opA.operation[0]) {\n // Move the insert operation to the beginning of the removed range\n opB.operation[0] -= opA.operation[0] - opA._absoluteBegin;\n }\n\n // If we have a range with a remove / insert operation, we have\n // to take the insert operation within the base changeset\n // into account during rebasing, moving the rebased operation\n // behind this insert\n if (in_segment.removeInsertOperationA &&\n in_segment.removeInsertOperationA[0] === opB.operation[0]) {\n handleInsert({\n operation: in_segment.removeInsertOperationA as arrayInsertList,\n }, opB);\n }\n break;\n }\n case ArrayChangeSetIterator.types.REMOVE: {\n // Remove already in A, no need to add the same again -> write nop\n\n const opBLen = isNumber(opB.operation[1]) ? opB.operation[1] : opB.operation[1].length;\n const opALen = isNumber(opA.operation[1]) ? opA.operation[1] : opA.operation[1].length;\n\n if (opBLen !== opALen) {\n throw new Error(\"handleRebaseCombinations: remove-remove: unequal number of affected entries, \" +\n \"this should never happen! Probably a bug in splitRange.\");\n }\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n // trying to modify something that was removed ->\n // replace the modify with a NOP and report a conflict\n\n if (opB.operation[1].length > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.ENTRY_MODIFIED_AFTER_REMOVE,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n }\n\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n\n break;\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opB.type}`);\n }\n break;\n }\n case ArrayChangeSetIterator.types.MODIFY: {\n if (in_isPrimitiveType) {\n // just use opB and notify accordingly\n if (opB.type === ArrayChangeSetIterator.types.MODIFY && opB.operation[1].length > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n // If opB new value is same as opA new value, replace the modify with a NOP\n // TODO: The real operation that we should do here is not to only test if both arrays are\n // completely identical, but if any value is identical and if so split the range\n // into multiple ones.\n // Ex. [[0, [30, 20, 10]]] over [[0, [10, 20, 30]]] should become [[0, [30]], [2, [10]]].\n // This does not seem easily doable in the current code.\n if (arraysHaveSameValues(opA.operation[1], opB.operation[1])) {\n (opB as GenericOperation).type = ArrayChangeSetIterator.types.NOP;\n opB.operation = null;\n // If any, change the opB old value by the opA new value\n } else if (opB.operation[2]) {\n opB.operation[2] = opA.operation[1].slice();\n }\n }\n if (opB.type === ArrayChangeSetIterator.types.REMOVE && opB.operation[1] > 0) {\n delete opA._absoluteBegin;\n delete opB.offset;\n let conflict = {\n path: in_basePath, // TODO: We have to report the range or per element\n type: ConflictType.REMOVE_AFTER_MODIFY,\n conflictingChange: cloneDeep(opB),\n };\n out_conflicts.push(conflict);\n }\n break;\n } else {\n // we have to deal with complex types here!\n if (opB.type === ArrayChangeSetIterator.types.MODIFY) {\n for (let i = 0; i < opB.operation[1].length; ++i) {\n ConsoleUtils.assert(opA.operation[1][i].typeid, \"Malformed Operation. Missing typeid\");\n\n this.rebaseChangeSetForPropertyEntryWithTypeid(i,\n opA.operation[1],\n opB.operation[1],\n opA.operation[1][i].typeid,\n `${in_basePath}[${i}]`,\n false,\n out_conflicts,\n in_options);\n }\n }\n break;\n }\n }\n default:\n throw new Error(`handleCombinations: ${MSG.UNKNOWN_OPERATION}${opA.type}`);\n }\n};\n\n/**\n * apply a range's operation to the changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applySegment = function(\n in_segment: SegmentType,\n io_changeset: SerializedChangeSet,\n in_currentIndexOffset: number,\n lastIteratorARemove: RemoveOpInfo,\n in_isPrimitiveType: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (!in_segment) {\n throw Error(\"applySegment: in_segment is undefined!\");\n }\n\n // No operation needs to be performed\n if (in_segment.op === undefined && in_segment.opA === undefined && in_segment.opB === undefined) {\n return;\n }\n if (in_segment.flag === ArrayChangeSetRangeType.completeA ||\n in_segment.flag === ArrayChangeSetRangeType.completeB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfA ||\n in_segment.flag === ArrayChangeSetRangeType.partOfB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfApartOfB) {\n // just push it\n pushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options, lastIteratorARemove, in_segment);\n } else {\n // combinations: pAB, AB or ApB\n handleCombinations.call(this, in_segment, in_isPrimitiveType); // modifies in_segment.opB to save garbage\n pushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n }\n};\n\n/**\n * apply a range's operation to the rebased changeset\n * @param in_segment - to be applied\n * @param io_changeset - target\n * @param in_currentIndexOffset - current offset\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_basePath - Base path to get to the property processed by this function\n * @param in_isPrimitiveType - is it an array of primitive types\n */\nconst applyRebaseSegment = function(\n in_segment: SegmentType,\n io_changeset: SerializedChangeSet,\n in_currentIndexOffset: number,\n out_conflicts: ConflictInfo[],\n in_basePath: string,\n in_isPrimitiveType: boolean,\n in_options?: ApplyChangeSetOptions) {\n if (!in_segment) {\n throw Error(\"applySegment: in_segment is undefined!\");\n }\n if (in_segment.flag === ArrayChangeSetRangeType.completeB ||\n in_segment.flag === ArrayChangeSetRangeType.partOfB) {\n // not touching anything of A, just push it\n pushOp(in_segment.op, io_changeset, in_currentIndexOffset, in_options);\n } else if (in_segment.flag === ArrayChangeSetRangeType.completeA ||\n in_segment.flag === ArrayChangeSetRangeType.partOfA) {\n // do nothing (we are rebasing B, not A)\n } else {\n // combinations: pAB, AB or ApB\n handleRebaseCombinations.call(this, in_segment, out_conflicts,\n in_basePath, in_isPrimitiveType, in_options); // modifies in_segment.opB to save garbage\n pushOp(in_segment.opB, io_changeset, in_currentIndexOffset, in_options);\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace ChangeSetArrayFunctions {\n /**\n * Applies a changeset to a given array property. The ChangeSet is assumed to be relative to the same\n * property root and it will be applied behind the base ChangeSet (assuming that the changes are relative to the\n * state after the base ChangeSet has been applied. It will change the base ChangeSet.)\n *\n * @param io_basePropertyChanges - The ChangeSet describing the initial state\n * @param in_appliedPropertyChanges - The ChangeSet to apply to this state\n * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n */\n export function _performApplyAfterOnPropertyArray(\n io_basePropertyChanges: SerializedChangeSet,\n in_appliedPropertyChanges: SerializedChangeSet,\n in_typeid: string,\n in_options?: ApplyChangeSetOptions) {\n ConsoleUtils.assert(in_typeid, \"_performApplyAfterOnPropertyArray: typeid missing\");\n ConsoleUtils.assert(!isString(io_basePropertyChanges), io_basePropertyChanges);\n ConsoleUtils.assert(!isString(in_appliedPropertyChanges), in_appliedPropertyChanges);\n\n const isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n // Iterator to process the changes in the ChangeSet in the correct order\n const iteratorA = new ArrayChangeSetIterator((io_basePropertyChanges));\n const iteratorB = new ArrayChangeSetIterator((in_appliedPropertyChanges));\n\n const rangeA: OperationRangeRemove | OperationRangeInsert = {};\n const rangeB: OperationRangeRemove | OperationRangeInsert = {};\n\n const opA = iteratorA.opDescription;\n const opB = iteratorB.opDescription;\n\n getRangeForCurrentStateOperation(opA, opA.offset ? opA.offset : 0, rangeA);\n getRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n\n const resultPropertyChanges: SerializedChangeSet = {};\n resultPropertyChanges.insert = [];\n resultPropertyChanges.modify = [];\n resultPropertyChanges.remove = [];\n resultPropertyChanges.writeOffset = 0;\n\n let currentIndexOffset = 0;\n let lastIteratorARemove;\n const segment: OperationRangeRemove | OperationRangeInsert = {};\n let skipIteratorBOperation;\n\n const advanceIteratorB = () => {\n if ((opB as any).removeInsertOperation &&\n segment.op !== undefined &&\n skipIteratorBOperation === undefined &&\n segment.op.operation === (opB as any).removeInsertOperation) {\n skipIteratorBOperation = segment.op.operation;\n } else {\n iteratorB.next();\n if (skipIteratorBOperation &&\n opB.operation === skipIteratorBOperation) {\n iteratorB.next();\n }\n skipIteratorBOperation = undefined;\n getRangeForAppliedOperation(opB, rangeB, undefined, in_options);\n }\n };\n\n // create ranges for A and B: A is the current state and B is the change set to be applied\n let lastIndexOffset = 0;\n let canceledSegmentBegin;\n let lastOpWasNop = false;\n\n while (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n // produce first segment:\n splitOverlapping(rangeA, rangeB, segment, false, in_options);\n\n let indexOffset = currentIndexOffset;\n\n if (lastOpWasNop &&\n (rangeA.begin === undefined || rangeA.begin >= segment.begin) &&\n (segment.flag === ArrayChangeSetRangeType.completeB &&\n segment.op.type === ArrayChangeSetIterator.types.INSERT &&\n segment.op.operation[0] === canceledSegmentBegin)) {\n indexOffset = lastIndexOffset;\n }\n\n applySegment.call(this, segment, resultPropertyChanges, indexOffset, lastIteratorARemove, isPrimitiveTypeid);\n lastOpWasNop = segment.opB !== undefined && segment.opB.type === ArrayChangeSetIterator.types.NOP;\n if (lastOpWasNop) {\n canceledSegmentBegin = segment.begin;\n }\n\n // increase pointers if necessary\n if (segment.flag === ArrayChangeSetRangeType.completeA ||\n segment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n // We keep track of the last remove operation, because this information is needed\n // in pushOp to move inserts to the beginning of a remove range. The problem is\n // that the insert is processed after the remove and in that case the iterator\n // offset has already been incremented by the remove. Therefore, the insert would\n // be placed behind the remove. We detect this case and correct the offset accordingly\n // in pushOp\n if (opA.type === ArrayChangeSetIterator.types.REMOVE) {\n if (!lastIteratorARemove ||\n lastIteratorARemove.position !== opA.operation[0]) {\n lastIteratorARemove = {\n position: opA.operation[0],\n length: getOpLength(opA.operation),\n offsetIncremented: false,\n currentIndex: opA.operation[0],\n };\n\n // If there is already an insert operation at the beginning of the remove range\n // we have to adjust the position to the end of this operation (an insert that is\n // applied at the position of the remove would be shifted behind this insert)\n if (opA.removeInsertOperation) {\n if (opA.removeInsertOperation[0] + opA.offset === lastIteratorARemove.position) {\n lastIteratorARemove.position += getOpLength(opA.removeInsertOperation);\n }\n }\n }\n }\n\n let moreAs = iteratorA.next();\n\n // The offset will only be incremented as soon as the iterator reaches an operation at a different index.\n // We detect this case and keep track, whether the remove has already been added to the offset or not.\n if (lastIteratorARemove &&\n ((opA as any).operation === undefined || (opA as any).operation[0] !== lastIteratorARemove.currentIndex)) {\n lastIteratorARemove.offsetIncremented = true;\n }\n getRangeForCurrentStateOperation(iteratorA.opDescription, moreAs ? opA.offset : 0, rangeA);\n }\n\n if (segment.flag === ArrayChangeSetRangeType.completeB ||\n segment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n advanceIteratorB();\n }\n if (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n let moreAs = iteratorA.next();\n getRangeForCurrentStateOperation(opA, moreAs ? opA.offset : 0, rangeA);\n advanceIteratorB();\n }\n\n if (opA.offset !== undefined) {\n // the correct index offset for the next operation is given by A's offset\n lastIndexOffset = currentIndexOffset;\n currentIndexOffset = opA.offset;\n }\n }\n\n // write back:\n if (resultPropertyChanges.insert.length > 0) {\n io_basePropertyChanges.insert = resultPropertyChanges.insert;\n } else {\n delete io_basePropertyChanges.insert;\n }\n if (resultPropertyChanges.modify.length > 0) {\n io_basePropertyChanges.modify = resultPropertyChanges.modify;\n } else {\n delete io_basePropertyChanges.modify;\n }\n\n if (resultPropertyChanges.remove.length > 0) {\n // Merge remove operations (but only, if there is no\n // insert inbetween the two removes)\n const insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n const mergedRemoves = [];\n for (const remove of resultPropertyChanges.remove) {\n const lastRemove = mergedRemoves[mergedRemoves.length - 1];\n if (lastRemove &&\n lastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n !insertPosition.has(remove[0])) {\n if (Array.isArray(remove[1])) {\n lastRemove[1] = lastRemove[1].concat(remove[1]);\n } else {\n lastRemove[1] += remove[1];\n }\n } else {\n mergedRemoves.push(remove);\n }\n }\n io_basePropertyChanges.remove = mergedRemoves;\n } else {\n delete io_basePropertyChanges.remove;\n }\n }\n\n /**\n * Performs the rebase operation for array changes\n *\n * @param in_ownPropertyChangeSet -The ChangeSet for the property stored in this object\n * @param io_rebasePropertyChangeSet - The ChangeSet for the property to be rebased\n * @param in_basePath - Base path to get to the property processed by this function\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n * @param in_typeid - The typeid of the contents of the collection (without the collection type)\n */\n export function _rebaseArrayChangeSetForProperty(\n in_ownPropertyChangeSet: SerializedChangeSet,\n io_rebasePropertyChangeSet: SerializedChangeSet,\n in_basePath: string,\n out_conflicts: ConflictInfo[],\n in_typeid: string,\n in_options?: ApplyChangeSetOptions) {\n const isPrimitiveTypeid = isPrimitiveType(in_typeid);\n\n // Iterator to process the changes in the ChangeSet in the correct order\n const iteratorA = new ArrayChangeSetIterator((in_ownPropertyChangeSet));\n const iteratorB = new ArrayChangeSetIterator((io_rebasePropertyChangeSet));\n\n const opA = iteratorA.opDescription;\n\n const rangeA: OperationRangeRemove | OperationRangeInsert = {};\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n const rangeB: OperationRangeRemove | OperationRangeInsert = {};\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n\n const resultPropertyChanges: SerializedChangeSet = {};\n resultPropertyChanges.insert = [];\n resultPropertyChanges.modify = [];\n resultPropertyChanges.remove = [];\n resultPropertyChanges.writeOffset = 0;\n\n let currentIndexOffset = 0;\n const segment: OperationRangeRemove | OperationRangeInsert = {};\n\n // create ranges for A and B: A is the current state and B is the change set to be applied\n while (!iteratorA.atEnd() || !iteratorB.atEnd()) {\n splitOverlapping(rangeA, rangeB, segment, true, in_options);\n\n applyRebaseSegment.call(this, segment, resultPropertyChanges,\n currentIndexOffset, out_conflicts, in_basePath, isPrimitiveTypeid, in_options);\n\n // increase pointers if necessary\n if (segment.flag === ArrayChangeSetRangeType.completeA ||\n segment.flag === ArrayChangeSetRangeType.completeApartOfB) {\n iteratorA.next();\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n }\n\n if (segment.flag === ArrayChangeSetRangeType.completeB ||\n segment.flag === ArrayChangeSetRangeType.completeBpartOfA) {\n iteratorB.next();\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n }\n if (segment.flag === ArrayChangeSetRangeType.completeAcompleteB) {\n iteratorA.next();\n getRangeForAppliedOperation(opA, rangeA, ArrayChangeSetRangeType.completeA, in_options);\n iteratorB.next();\n getRangeForAppliedOperation(iteratorB.opDescription, rangeB, undefined, in_options);\n }\n\n if (opA.offset !== undefined) {\n // the correct index offset for the next operation is given by A's offset\n currentIndexOffset = -opA.offset;\n }\n }\n\n // write back:\n if (resultPropertyChanges.insert.length > 0) {\n io_rebasePropertyChangeSet.insert = resultPropertyChanges.insert;\n } else {\n delete io_rebasePropertyChangeSet.insert;\n }\n if (resultPropertyChanges.modify.length > 0) {\n io_rebasePropertyChangeSet.modify = resultPropertyChanges.modify;\n } else {\n delete io_rebasePropertyChangeSet.modify;\n }\n if (resultPropertyChanges.remove.length > 0) {\n // Merge remove operations (but only, if there is no\n // insert in between the two removes)\n const insertPosition = new Set(resultPropertyChanges.insert.map((x) => x[0]));\n const mergedRemoves = [];\n for (const remove of resultPropertyChanges.remove) {\n const lastRemove = mergedRemoves[mergedRemoves.length - 1];\n if (lastRemove &&\n lastRemove[0] + getOpLength(lastRemove) === remove[0] &&\n !insertPosition.has(remove[0])) {\n if (Array.isArray(remove[1])) {\n lastRemove[1] = lastRemove[1].concat(remove[1]);\n } else {\n lastRemove[1] += remove[1];\n }\n } else {\n mergedRemoves.push(remove);\n }\n }\n\n io_rebasePropertyChangeSet.remove = mergedRemoves;\n } else {\n delete io_rebasePropertyChangeSet.remove;\n }\n }\n\n /**\n * Performs the rebase operation for string changes\n *\n *\n * We have to handle the conflicting rebase changes. The changes we do, are summarized in this table.\n * Other is the modified, rebased (on own) changeset.\n *\n * ```\n * BASE\n * / \\\n * / \\\n * OWN OTHER\n * ```\n *\n * gets rebased to:\n *\n * ```\n * BASE\n * /\n * OWN\n * \\\n * OTHER\n * ```\n *\n * conflict default behavior in ()\n *\n * ```\n * -------|-----------------+------------------+------------------|----------------|\n * \\Own| insert | modify | remove | String set |\n * \\ | | | | |\n * other\\ | | | | |\n * ------\\|-----------------+------------------+------------------|----------------|\n * | conflicting | non-conflicting | non-conflicting | conflict |\n * insert | inserts | change | change |(ignore insert) |\n * | (i. other after)| | | |\n * -------|-----------------+------------------+------------------|----------------|\n * | non-conflicting | conflict | conflict | conflict |\n * modify | change |(notify the user) | (delete modify |(ignore modify) |\n * | | | in other) | |\n * -------|-----------------+------------------+------------------|----------------|\n * | non-conflicting | non-conflicting | non-conflicting | conflict |\n * remove | change | change | change |(ignore remove) |\n * -------|-----------------+------------------+------------------+----------------|\n * Str. | | conflict | |\n * set | 'other's set overwrites whatever happend before |\n * | | | | |\n * --------------------------------------------------------------------------------|\n * ```\n *\n * @param in_ownPropertyChangeSet - The ChangeSet for the property stored in this object\n * @param io_rebasePropertyChangeSetParent - The Array containing the ChangeSet for the property to be rebased\n * @param in_key - The key to the ChangeSet in io_rebasePropertyChangeSetParent we are rebasing on\n * @param in_basePath - Base path to get to the property processed by this function\n * @param out_conflicts - A list of paths that resulted in conflicts together with the type of the conflict\n */\n export function _rebaseChangeSetForString(\n in_ownPropertyChangeSet: SerializedChangeSet,\n io_rebasePropertyChangeSetParent: SerializedChangeSet,\n in_key: string,\n in_basePath: string,\n out_conflicts: ConflictInfo[],\n in_options?: ApplyChangeSetOptions) {\n if (isString(io_rebasePropertyChangeSetParent[in_key]) || (io_rebasePropertyChangeSetParent[in_key] &&\n io_rebasePropertyChangeSetParent[in_key].hasOwnProperty(\"value\"))) {\n // other overwrites any old changes, we ignore them and report the conflict\n let conflict = {\n path: in_basePath,\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(in_ownPropertyChangeSet),\n };\n out_conflicts.push(conflict);\n // If value is the same, delete the entry\n let ownValue = in_ownPropertyChangeSet;\n if (typeof ownValue === \"object\") {\n ownValue = ownValue.value;\n }\n let rebaseValue = io_rebasePropertyChangeSetParent[in_key];\n if (typeof rebaseValue === \"object\") {\n rebaseValue = rebaseValue.value;\n }\n if (ownValue === rebaseValue) {\n delete io_rebasePropertyChangeSetParent[in_key];\n }\n } else if (isString(in_ownPropertyChangeSet) || (in_ownPropertyChangeSet &&\n in_ownPropertyChangeSet.hasOwnProperty(\"value\"))) {\n // we have a conflict since we cannot allow insert/remove/modify on an unknown state\n // we just ignore other's modifications and take own's set\n let conflict = {\n path: in_basePath,\n type: ConflictType.COLLIDING_SET,\n conflictingChange: cloneDeep(io_rebasePropertyChangeSetParent[in_key]),\n };\n out_conflicts.push(conflict);\n io_rebasePropertyChangeSetParent[in_key] = in_ownPropertyChangeSet;\n } else {\n // both have no 'set' just array ops -> use array rebase!\n this._rebaseArrayChangeSetForProperty(in_ownPropertyChangeSet,\n io_rebasePropertyChangeSetParent[in_key],\n in_basePath,\n out_conflicts,\n \"String\",\n in_options);\n }\n }\n}\n"]}