@fluidframework/merge-tree 0.57.0 → 0.58.0-55983

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 (123) hide show
  1. package/dist/base.d.ts +0 -1
  2. package/dist/base.d.ts.map +1 -1
  3. package/dist/base.js.map +1 -1
  4. package/dist/client.d.ts +3 -5
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +14 -36
  7. package/dist/client.js.map +1 -1
  8. package/dist/collections.d.ts +1 -4
  9. package/dist/collections.d.ts.map +1 -1
  10. package/dist/collections.js +8 -24
  11. package/dist/collections.js.map +1 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +0 -3
  15. package/dist/index.js.map +1 -1
  16. package/dist/mergeTree.d.ts +8 -30
  17. package/dist/mergeTree.d.ts.map +1 -1
  18. package/dist/mergeTree.js +17 -326
  19. package/dist/mergeTree.js.map +1 -1
  20. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  21. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  22. package/dist/ops.d.ts +0 -6
  23. package/dist/ops.d.ts.map +1 -1
  24. package/dist/ops.js +1 -8
  25. package/dist/ops.js.map +1 -1
  26. package/dist/partialLengths.d.ts.map +1 -1
  27. package/dist/partialLengths.js +14 -26
  28. package/dist/partialLengths.js.map +1 -1
  29. package/dist/properties.d.ts.map +1 -1
  30. package/dist/properties.js +2 -15
  31. package/dist/properties.js.map +1 -1
  32. package/dist/segmentPropertiesManager.js +1 -5
  33. package/dist/segmentPropertiesManager.js.map +1 -1
  34. package/dist/snapshotChunks.js +3 -3
  35. package/dist/snapshotChunks.js.map +1 -1
  36. package/dist/snapshotV1.d.ts +2 -1
  37. package/dist/snapshotV1.d.ts.map +1 -1
  38. package/dist/snapshotV1.js +4 -4
  39. package/dist/snapshotV1.js.map +1 -1
  40. package/dist/snapshotlegacy.d.ts.map +1 -1
  41. package/dist/snapshotlegacy.js +3 -6
  42. package/dist/snapshotlegacy.js.map +1 -1
  43. package/dist/sortedSegmentSet.d.ts +3 -3
  44. package/dist/sortedSegmentSet.d.ts.map +1 -1
  45. package/dist/sortedSegmentSet.js +12 -12
  46. package/dist/sortedSegmentSet.js.map +1 -1
  47. package/dist/textSegment.d.ts.map +1 -1
  48. package/dist/textSegment.js +3 -17
  49. package/dist/textSegment.js.map +1 -1
  50. package/lib/base.d.ts +0 -1
  51. package/lib/base.d.ts.map +1 -1
  52. package/lib/base.js.map +1 -1
  53. package/lib/client.d.ts +3 -5
  54. package/lib/client.d.ts.map +1 -1
  55. package/lib/client.js +11 -33
  56. package/lib/client.js.map +1 -1
  57. package/lib/collections.d.ts +1 -4
  58. package/lib/collections.d.ts.map +1 -1
  59. package/lib/collections.js +8 -24
  60. package/lib/collections.js.map +1 -1
  61. package/lib/index.d.ts +0 -1
  62. package/lib/index.d.ts.map +1 -1
  63. package/lib/index.js +0 -1
  64. package/lib/index.js.map +1 -1
  65. package/lib/mergeTree.d.ts +8 -30
  66. package/lib/mergeTree.d.ts.map +1 -1
  67. package/lib/mergeTree.js +16 -322
  68. package/lib/mergeTree.js.map +1 -1
  69. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  70. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  71. package/lib/ops.d.ts +0 -6
  72. package/lib/ops.d.ts.map +1 -1
  73. package/lib/ops.js +0 -7
  74. package/lib/ops.js.map +1 -1
  75. package/lib/partialLengths.d.ts.map +1 -1
  76. package/lib/partialLengths.js +14 -26
  77. package/lib/partialLengths.js.map +1 -1
  78. package/lib/properties.d.ts.map +1 -1
  79. package/lib/properties.js +2 -15
  80. package/lib/properties.js.map +1 -1
  81. package/lib/segmentPropertiesManager.js +1 -5
  82. package/lib/segmentPropertiesManager.js.map +1 -1
  83. package/lib/snapshotChunks.js +3 -3
  84. package/lib/snapshotChunks.js.map +1 -1
  85. package/lib/snapshotV1.d.ts +2 -1
  86. package/lib/snapshotV1.d.ts.map +1 -1
  87. package/lib/snapshotV1.js +4 -4
  88. package/lib/snapshotV1.js.map +1 -1
  89. package/lib/snapshotlegacy.d.ts.map +1 -1
  90. package/lib/snapshotlegacy.js +3 -6
  91. package/lib/snapshotlegacy.js.map +1 -1
  92. package/lib/sortedSegmentSet.d.ts +3 -3
  93. package/lib/sortedSegmentSet.d.ts.map +1 -1
  94. package/lib/sortedSegmentSet.js +12 -12
  95. package/lib/sortedSegmentSet.js.map +1 -1
  96. package/lib/textSegment.d.ts.map +1 -1
  97. package/lib/textSegment.js +4 -18
  98. package/lib/textSegment.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/base.ts +2 -3
  101. package/src/client.ts +11 -36
  102. package/src/collections.ts +9 -26
  103. package/src/index.ts +0 -1
  104. package/src/mergeTree.ts +32 -357
  105. package/src/mergeTreeDeltaCallback.ts +0 -1
  106. package/src/ops.ts +0 -7
  107. package/src/partialLengths.ts +17 -27
  108. package/src/properties.ts +7 -15
  109. package/src/segmentPropertiesManager.ts +5 -5
  110. package/src/snapshotChunks.ts +3 -3
  111. package/src/snapshotV1.ts +3 -3
  112. package/src/snapshotlegacy.ts +4 -6
  113. package/src/sortedSegmentSet.ts +12 -12
  114. package/src/textSegment.ts +5 -20
  115. package/dist/text.d.ts +0 -8
  116. package/dist/text.d.ts.map +0 -1
  117. package/dist/text.js +0 -78
  118. package/dist/text.js.map +0 -1
  119. package/lib/text.d.ts +0 -8
  120. package/lib/text.d.ts.map +0 -1
  121. package/lib/text.js +0 -73
  122. package/lib/text.js.map +0 -1
  123. package/src/text.ts +0 -83
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAA6B,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAI9F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAEH,cAAc,EACd,mBAAmB,EAKnB,SAAS,GAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,aAAa,CAAC;AAcrB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,OAAO,MAAM;IAgCf;IACI,8FAA8F;IAC9E,aAA+C,EAC/C,MAAwB,EACxC,OAAqB;QAFL,kBAAa,GAAb,aAAa,CAAkC;QAC/C,WAAM,GAAN,MAAM,CAAkB;QAlCrC,eAAU,GAAG,KAAK,CAAC;QACnB,4BAAuB,GAAG,KAAK,CAAC;QAChC,eAAU,GAAG,KAAK,CAAC;QACnB,cAAS,GAAG,CAAC,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QACd,aAAQ,GAAG,CAAC,CAAC;QACb,oBAAe,GAAG,CAAC,CAAC;QACpB,gBAAW,GAAG,CAAC,CAAC;QAChB,aAAQ,GAAG,CAAC,CAAC;QACb,kBAAa,GAAG,CAAC,CAAC;QAkBR,oBAAe,GAAG,IAAI,YAAY,CAAiB,cAAc,CAAC,CAAC;QACnE,qBAAgB,GAAa,EAAE,CAAC;QAChC,qBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;QAQlE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IA3BD,IAAI,sBAAsB,KAAyC,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAClH,IAAI,sBAAsB,CAAC,QAA4C;QACnE,IAAI,CAAC,SAAS,CAAC,sBAAsB,GAAG,QAAQ,CAAC;IACrD,CAAC;IAED,IAAI,4BAA4B;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;IACvD,CAAC;IAED,IAAI,4BAA4B,CAAC,QAAkD;QAC/E,IAAI,CAAC,SAAS,CAAC,4BAA4B,GAAG,QAAQ,CAAC;IAC3D,CAAC;IAkBD;;;;;;OAMG;IACI,wBAAwB,CAAC,QAAgB,CAAC;;QAC7C,IAAI,KAAK,KAAK,CAAC,EAAE;YACb,aAAO,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,IAAI,GAAG;SACjD;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,aAAO,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,IAAI,CAAC,GAAG,EAAE;YAC7C,IAAI,KAAK,GAAG,KAAK,EAAE;gBACf,KAAK,EAAE,CAAC;gBACR,OAAO,IAAI,CAAC;aACf;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,EAAE,IAAI,EAAE;IACb,CAAC;IAED;;;;;;OAMG;IACI,6BAA6B,CAChC,MAAc,EACd,KAAkB,EAClB,iBAAsC;QACtC,MAAM,WAAW,GAAiB;YAC9B,IAAI,EAAE,WAAW;SACpB,CAAC;QAEF,MAAM,UAAU,GACZ,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAEpD,IAAI,UAAU,EAAE;YACZ,MAAM,aAAa,GAAmB;gBAClC,QAAQ,EAAE,iBAAiB;gBAC3B,MAAM;aACT,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAG,EAAE,aAAa,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC;SACrB;aAAM;YACH,OAAO,SAAS,CAAC;SACpB;IACL,CAAC;IACD;;;;;;OAMG;IACI,cAAc,CACjB,MAAc,EACd,KAAkB,EAClB,WAAyB;QACzB,MAAM,UAAU,GACZ,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAE,CAAC;QAExD,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;YAC/C,OAAO,UAAU,CAAC;SACrB;aAAM;YACH,OAAO,SAAS,CAAC;SACpB;IACL,CAAC;IACD;;;;;;;OAOG;IACI,kBAAkB,CACrB,KAAa,EACb,GAAW,EACX,KAAkB,EAClB,WAAqC;QACrC,MAAM,UAAU,GAAG,qBAAqB,CACpC,KAAK,EACL,GAAG,EACH,KAAK,EACL,WAAW,CAAC,CAAC;QAEjB,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;YAC/C,OAAO,UAAU,CAAC;SACrB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,KAAa,EAAE,GAAW;QAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEjD,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC3C,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,GAAW,EAAE,OAAiB;QACpD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE;YAC3B,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACtC,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,8BAA8B,CACjC,MAAyB,EACzB,OAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,gCAAgC,CACvD,MAAM,EACN,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAExB,IAAI,GAAG,KAAK,cAAc,CAAC,gBAAgB,EAAE;YACzC,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,EAAE,GAAG,qBAAqB,CAC5B,GAAG,EACH,OAAO,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC;QACtB,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,yBAAyB,CACpC,MAAM,EACN,OAAO,EACP,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CACjB,MAAM,EACN,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAClC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAClB,UAAU,CAAC,CAAC;QAEhB,OAAO,EAAE,CAAC;IACd,CAAC;IAMM,YAAY,CACf,OAAoC,EACpC,KAAyB,EAAE,GAAuB,EAAE,KAAkB,EAAE,aAAsB,KAAK;QACnG,IAAI,CAAC,SAAS,CAAC,QAAQ,CACnB;YACI,IAAI,EAAE,OAAO;SAChB,EACD,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EACxC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,MAAoB,EAAE,0BAA4C;QACrF,IAAI,CAAC,SAAS,CAAC,eAAe,CAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,EACnB,CAAC,GAAG,EAAE,EAAE;YACJ,sDAAsD;YACtD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE;gBAC9B,0BAA0B,CAAC,SAAS,CAChC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,EAC1B,MAAM,CAAC,CAAC;aACf;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CACJ,CAAC;IACN,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,OAAiB;QAChC,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,MAAK,SAAS,EAAE;YAC/B,OAAO,CAAC,CAAC,CAAC;SACb;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,CAAC;IAEM,iBAAiB,CAAC,IAAoB;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAEM,oBAAoB,CAAC,IAAoB;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,WAA8B;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,eAAe,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,MAA6B;QACpD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mBAA8B,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAC3B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,KAAK,EACL,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAAC,MAA6B;QACtD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,qBAAgC,EAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5G,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,aAAa,CACxB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,EAAE,CAAC,KAAK,EACR,EAAE,CAAC,WAAW,EACd,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,MAA6B;QAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mBAA8B,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,QAAgC,CAAC;QACrC,IAAI,EAAE,CAAC,GAAG,EAAE;YACR,QAAQ,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACpC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,cAAc,CACzB,KAAK,CAAC,KAAK,EACX,QAAQ,EACR,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CACpB,MAA6B,EAC7B,UAAwC,EACxC,KAA6B,EAC7B,UAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC1B,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;aACnB;SACJ;aAAM;YACH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,cAAc,EAC1E,KAAK,CAAC,6EAA6E,CAAC,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,EAC3F,KAAK,CAAC,2EAA2E,CAAC,CAAC;YACvF,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;aAC9E;SACJ;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE;YAChF,OAAO,CAAC,GAAG,CACP,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG;gBAChE,OAAO,UAAU,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,gBAAgB,GAAG;gBACvF,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,GAAG,WAAW,UAAU,CAAC,uBAAuB,GAAG;gBACrF,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SACrC;IACL,CAAC;IAED;;;;OAIG;IACK,eAAe,CACnB,EAAqE,EACrE,UAAwC;QACxC,IAAI,KAAK,GAAuB,EAAE,CAAC,IAAI,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YACxC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACrC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,IAAI,GAAG,GAAuB,EAAE,CAAC,IAAI,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YACtC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACnC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,uBAAuB;QACvB,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAEhC,MAAM,gBAAgB,GAAa,EAAE,CAAC;YAEtC,0BAA0B;YAC1B,EAAE;YACF,IAAI,KAAK,KAAK,SAAS;mBAChB,KAAK,GAAG,CAAC;mBACT,KAAK,GAAG,MAAM;mBACd,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,mBAA8B,EAAE;gBAC9D,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAClC;YACD,gDAAgD;YAChD,EAAE;YACF,IAAI,EAAE,CAAC,IAAI,mBAA8B,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC5D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,KAAM,EAAE;oBACpC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAChC;aACJ;YAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,IAAI,YAAY,CAClB,kBAAkB,EAClB;oBACI,UAAU,EAAE,IAAI;oBAChB,GAAG;oBACH,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,EAAE;oBAC7C,MAAM;oBACN,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,KAAK;iBACR,CACJ,CAAC;aACL;SACJ;QAED,yEAAyE;QACzE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAmB,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAAC,MAA6B;QACvD,2DAA2D;QAC3D,kDAAkD;QAClD,EAAE;QACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,OAAO;gBACH,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,uBAAuB,EAAE,SAAS,CAAC,UAAU;gBAC7C,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE;aAChD,CAAC;SACL;aAAM;YACH,OAAO;gBACH,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBACjE,uBAAuB,EAAE,MAAM,CAAC,gBAAgB,CAAC,uBAAuB;gBACxE,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,cAAc;aACzD,CAAC;SACL;IACL,CAAC;IAEO,iBAAiB,CAAC,MAA6B;QACnD,MAAM,KAAK,GAAG,CAAC,WAAkC,EAAE,EAAE;;YACjD,IAAI,KAAwB,CAAC;YAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;aACzB;YAED,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,qBAAgC,EAAE;gBACrD,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;oBACjF,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,gBAAiB,CAAC,CAAC;iBAC/E;aACJ;YAED,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;aAC9E;YAED,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG;oBACxE,aAAa,MAAA,WAAW,CAAC,gBAAgB,0CAAE,cAAc,EAAE,CAAC,CAAC;aACpE;QACL,CAAC,CAAC;QAEF,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,kBAA6B,EAAE;YAC7C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;gBAClC,KAAK,CAAC;oBACF,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClB,EAAE,EAAE,QAAQ;oBACZ,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;iBAC5C,CAAC,CAAC;aACN;SACJ;aAAM;YACH,KAAK,CAAC,MAAM,CAAC,CAAC;SACjB;IACL,CAAC;IAED,wFAAwF;IAExF,iBAAiB;QACb,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,qBAAqB,CAAC,YAAoB;QACtC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;SACtC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IACD,gBAAgB,CAAC,YAAoB;QACjC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,aAAqB;QACjC,IAAI,aAAa,IAAI,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;SAC/C;aACI;YACD,OAAO,UAAU,CAAC;SACrB;IACL,CAAC;IACD,eAAe,CAAC,YAAoB;QAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;OAQG;IACI,yBAAyB,CAAC,OAAiB,EAAE,QAAgB;QAChE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC5G,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB;;;;;;;UAOE;QACF,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACxD,uFAAuF;YACvF,IAAI,GAAG,KAAK,OAAO,EAAE;gBACjB,OAAO,KAAK,CAAC;aAChB;YAED,sFAAsF;YACtF,wCAAwC;YACxC,EAAE;YACF,qFAAqF;YACrF,6EAA6E;YAC7E,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAgB,cAAc;mBACnF,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,eAAgB,GAAG,QAAQ,CAAC,CAAK,cAAc;cACzF;gBACE,eAAe,IAAI,GAAG,CAAC,YAAY,CAAC;aACvC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IAC3B,CAAC;IAEO,sBAAsB,CAC1B,OAA0B,EAC1B,YAA0B;;QAC1B,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,kBAAkB,SAAG,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,OAAO,EAAE,CAAC;QACrE,MAAM,CAAC,YAAY,KAAK,kBAAkB,EACtC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,gGAAgG;QAChG,gGAAgG;QAChG,4FAA4F;QAC5F,mGAAmG;QACnG,kDAAkD;QAClD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACxF,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,CAAC,YAAY,KAAK,eAAe,EACnC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvF,IAAI,KAAoC,CAAC;YACzC,QAAQ,OAAO,CAAC,IAAI,EAAE;gBAClB;oBACI,MAAM,CAAC,OAAA,OAAO,CAAC,eAAe,0CAAE,oBAAoB,QAAO,IAAI,EAC3D,KAAK,CAAC,yCAAyC,CAAC,CAAC;oBACrD,KAAK,GAAG,qBAAqB,CACzB,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,EACtC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,WAAW,CAAC,CAAC;oBACzB,MAAM;gBAEV;oBACI,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,wBAAwB,EAC3C,KAAK,CAAC,oDAAoD,CAAC,CAAC;oBAChE,KAAK,GAAG,qBAAqB,CACzB,eAAe,EACf,OAAO,CAAC,CAAC;oBACb,MAAM;gBAEV;oBACI,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE;wBACvC,KAAK,GAAG,mBAAmB,CACvB,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC/C;oBACD,MAAM;gBAEV;oBACI,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;aAC1C;YAED,IAAI,KAAK,EAAE;gBACP,MAAM,eAAe,GAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACxF,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC/C,IAAI,CAAC,SAAS,CAAC,eAAgB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtB;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,MAA6B;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,GAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE;YACb;gBACI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACV;gBACI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM;YACV;gBACI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM;YACV,kBAA6B,CAAC,CAAC;gBAC3B,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC,GAAG,EAAE;oBAC3B,IAAI,CAAC,aAAa,CAAC;wBACf,EAAE,EAAE,QAAQ;wBACZ,OAAO,EAAE,EAAE;wBACX,gBAAgB,EAAE,GAAG;qBACxB,CAAC,CAAC;iBACN;gBACD,MAAM;aACT;YACD;gBACI,MAAM;SACb;IACL,CAAC;IAEM,QAAQ,CAAC,GAA8B;;QAC1C,iCAAiC;QACjC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,gCAAgC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,EAAE;YACpC,MAAM,MAAM,GAA0B;gBAClC,EAAE,EAAE,GAAG,CAAC,QAAwB;gBAChC,gBAAgB,EAAE,GAAG;aACxB,CAAC;YACF,IAAI,OAAA,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,MAAK,IAAI,CAAC,YAAY,EAAE;gBACzD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;aAClC;iBACI;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC9B;SACJ;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC;IAEM,gBAAgB,CAAC,GAAW,EAAE,GAAW;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACtD,uGAAuG;QACvG,MAAM,CAAC,YAAY,CAAC,UAAU,IAAI,GAAG,EACjC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACjF,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACI,2BAA2B,CAC9B,oBAA4B,EAC5B,kBAA0B,EAC1B,cAAsB;QACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAC7C,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,mBAAmB,CACtB,OAAqB,EACrB,YAA2C;QAE3C,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,kBAA6B,EAAE;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;gBAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAC7C,KAAK,CAAC,oFAAoF,CAAC,CAAC;gBAEhG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACzC,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACxE;aACJ;iBAAM;gBACH,mFAAmF;gBACnF,8EAA8E;gBAC9E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAC3B,KAAK,CAAC,oFAAoF,CAAC,CAAC;gBAChG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aAC7E;SACJ;aAAM;YACH,MAAM,CAAE,OAAO,CAAC,IAAY,kBAA6B,EACrD,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACpD,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAC/B,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;SAC9D;QACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC;IACtE,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAEM,SAAS,CACZ,OAA+B,EAC/B,MAAoB,EACpB,UAA4B,EAC5B,WAAwC;;QAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC;QAElD,gEAAgE;QAChE,gEAAgE;QAChE,oDAAoD;QAEpD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE/D,yFAAyF;QACzF,yCAAyC;QACzC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,MAAM,EAC3C,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAE5E,kCAAkC;QAClC,oEAAoE;QACpE,IAAI,OAAA,IAAI,CAAC,SAAS,CAAC,OAAO,0CAAE,0BAA0B,MAAK,IAAI,EAAE;YAC7D,MAAM,CACF,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EACrD,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACxC;aAAM;YACH,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;SACrD;IACL,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,OAA+B,EAC/B,OAA+B,EAC/B,UAA4B;QAE5B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE1F,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,QAAgB,EAAE,WAAqB;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClG,CAAC;IAEO,sBAAsB;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,aAAa,EAAE;YACzB,OAAO,wBAAwB,CAAC;SACnC;aACI;YACD,OAAO,uBAAuB,CAAC;SAClC;IACL,CAAC;IACD,gBAAgB,CAAC,OAA2B;QACxC,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE;YAC1B,MAAM,MAAM,GAA0B;gBAClC,EAAE;gBACF,OAAO;aACV,CAAC;YACF,QAAQ,EAAE,CAAC,IAAI,EAAE;gBACb;oBACI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM;gBACV;oBACI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAClC,MAAM;gBACV;oBACI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;gBACV;oBACI,MAAM;aACb;SACJ;IACL,CAAC;IACD,uBAAuB,CAAC,EAAyB,EAAE,GAA8B;QAC7E,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAa,CAAC,EAAG,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE;YACf,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;SACpF;QACD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,aAAc,CAAC,QAAQ,CAAC,aAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,YAAY,CAAC,MAAc;QACvB,IAAI,KAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SACzB;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE;YACP,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;YAChC,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;gBAC9B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;aAChC;SACJ;IACL,CAAC;IAED,oBAAoB,CAAqB,GAAW;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAI,GAAG,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAED,uBAAuB,CAAC,GAAW;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;SAC1H;QAED,IAAI,oBAA6C,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACL,oBAAoB,GAAG,GAAG,CAAC,UAAU,CAAC;SACzC;QACD,OAAO,oBAAoB,CAAC;IAChC,CAAC;IACD,yBAAyB,CAAC,GAAW;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;SAC5H;QAED,IAAI,QAA4B,CAAC;QACjC,IAAI,WAA+B,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACL,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;SAC7C;QACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IACD,aAAa;QACT,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC;IAC7C,CAAC;IACD,WAAW;QACP,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,SAAS,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7C,0BAA0B,CAAC,YAAgC,EAAE,MAAM,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC;QACnF,4DAA4D;QAC5D,kEAAkE;QAClE,yDAAyD;QACzD,uEAAuE;QACvE,YAAY;QACZ,IAAI,YAAY,KAAK,SAAS,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;gBACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;aACrE;iBAAM;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC5D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;aACjD;SACJ;IACL,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAS,GAAG,IAAI;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n elapsedMicroseconds,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n RangeStackMap,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n ReferencePosition,\n} from \"./index\";\n\nexport class Client {\n public verboseOps = false;\n public noVerboseRemoteAnnotate = false;\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n this.mergeTree.getLongClientId = (id) => this.getLongClientId(id);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a maker and call the callback on concensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segements that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n public removeLocalReference(lref: LocalReference) {\n return this.mergeTree.removeLocalReference(lref.segment!, lref);\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n if (this.verboseOps && (!opArgs.sequencedMessage || !this.noVerboseRemoteAnnotate)) {\n console.log(\n `@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +\n `seq ${clientArgs.sequenceNumber} ${opArgs.op.type} local ${!opArgs.sequencedMessage} ` +\n `start ${range.start} end ${range.end} refseq ${clientArgs.referenceSequenceNumber} ` +\n `cli ${clientArgs.clientId}`);\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!opArgs.sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getShortClientId(opArgs.sequencedMessage.clientId),\n referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,\n sequenceNumber: opArgs.sequencedMessage.sequenceNumber,\n };\n }\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs, this.verboseOps);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n\n if (this.verboseOps) {\n console.log(`@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +\n `ack seq # ${deltaOpArgs.sequencedMessage?.sequenceNumber}`);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n }\n else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n public findReconnectionPostition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalulated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPostition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyMsg(msg: ISequencedDocumentMessage) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId) {\n this.ackPendingSegment(opArgs);\n }\n else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n }\n else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number) {\n const segWindow = this.mergeTree.getCollabWindow();\n return this.mergeTree.getContainingSegment<T>(pos, segWindow.currentSeq, segWindow.clientId);\n }\n\n getPropertiesAtPosition(pos: number) {\n const segWindow = this.getCollabWindow();\n if (this.verboseOps) {\n // eslint-disable-next-line max-len\n console.log(`getPropertiesAtPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);\n }\n\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n const segWindow = this.getCollabWindow();\n if (this.verboseOps) {\n // eslint-disable-next-line max-len\n console.log(`getRangeExtentsOfPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);\n }\n\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.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/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n RangeStackMap,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n ReferencePosition,\n} from \"./index\";\n\nfunction elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nexport class Client {\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a marker and call the callback on consensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n public removeLocalReference(lref: LocalReference) {\n return this.mergeTree.removeLocalReference(lref.segment!, lref);\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!opArgs.sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getShortClientId(opArgs.sequencedMessage.clientId),\n referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,\n sequenceNumber: opArgs.sequencedMessage.sequenceNumber,\n };\n }\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n }\n else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n protected findReconnectionPosition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalculated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPosition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyMsg(msg: ISequencedDocumentMessage) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId) {\n this.ackPendingSegment(opArgs);\n }\n else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger, (id)=>this.getLongClientId(id));\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n }\n else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number) {\n const segWindow = this.mergeTree.getCollabWindow();\n return this.mergeTree.getContainingSegment<T>(pos, segWindow.currentSeq, segWindow.clientId);\n }\n\n getPropertiesAtPosition(pos: number) {\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
@@ -42,7 +42,7 @@ export declare class Heap<T> {
42
42
  get(): T;
43
43
  add(x: T): void;
44
44
  private fixup;
45
- private fixdown;
45
+ private fixDown;
46
46
  }
47
47
  export declare const enum RBColor {
48
48
  RED = 0,
@@ -95,8 +95,6 @@ export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey,
95
95
  remove(key: TKey): void;
96
96
  removeExisting(key: TKey): void;
97
97
  private nodeRemove;
98
- private height;
99
- private nodeHeight;
100
98
  floor(key: TKey): RBNode<TKey, TData> | undefined;
101
99
  private nodeFloor;
102
100
  ceil(key: TKey): RBNode<TKey, TData> | undefined;
@@ -125,7 +123,6 @@ export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey,
125
123
  private nodeWalk;
126
124
  private nodeWalkBackward;
127
125
  private nodeMap;
128
- diag(): void;
129
126
  }
130
127
  export interface AugmentedIntervalNode {
131
128
  minmax: IInterval;
@@ -1 +1 @@
1
- {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,6 @@ export function ListMakeHead() {
39
39
  return new List(true, undefined);
40
40
  }
41
41
  export class List {
42
- // eslint-disable-next-line @typescript-eslint/prefer-readonly
43
42
  constructor(isHead, data) {
44
43
  this.isHead = isHead;
45
44
  this.data = data;
@@ -144,7 +143,7 @@ export class Heap {
144
143
  const x = this.L[1];
145
144
  this.L[1] = this.L[this.count()];
146
145
  this.L.pop();
147
- this.fixdown(1);
146
+ this.fixDown(1);
148
147
  return x;
149
148
  }
150
149
  add(x) {
@@ -160,7 +159,7 @@ export class Heap {
160
159
  _k = _k >> 1;
161
160
  }
162
161
  }
163
- fixdown(k) {
162
+ fixDown(k) {
164
163
  let _k = k;
165
164
  while ((_k << 1) <= (this.count())) {
166
165
  let j = _k << 1;
@@ -191,7 +190,7 @@ export class RedBlackTree {
191
190
  return { key, data, color, size };
192
191
  }
193
192
  isRed(node) {
194
- return !!node && (node.color == 0 /* RED */);
193
+ return !!node && (node.color === 0 /* RED */);
195
194
  }
196
195
  nodeSize(node) {
197
196
  return node ? node.size : 0;
@@ -395,14 +394,14 @@ export class RedBlackTree {
395
394
  if (this.isRed(_node.left)) {
396
395
  _node = this.rotateRight(_node);
397
396
  }
398
- if ((this.compareKeys(key, _node.key) == 0) && (!_node.right)) {
397
+ if ((this.compareKeys(key, _node.key) === 0) && (!_node.right)) {
399
398
  return undefined;
400
399
  }
401
400
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
402
401
  if ((!this.isRed(_node.right)) && (!this.isRed(_node.right.left))) {
403
402
  _node = this.moveRedRight(_node);
404
403
  }
405
- if (this.compareKeys(key, _node.key) == 0) {
404
+ if (this.compareKeys(key, _node.key) === 0) {
406
405
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
407
406
  const subtreeMin = this.nodeMin(_node.right);
408
407
  _node.key = subtreeMin.key;
@@ -417,17 +416,6 @@ export class RedBlackTree {
417
416
  }
418
417
  return this.balance(_node);
419
418
  }
420
- height() {
421
- return this.nodeHeight(this.root);
422
- }
423
- nodeHeight(node) {
424
- if (node === undefined) {
425
- return -1;
426
- }
427
- else {
428
- return 1 + Math.max(this.nodeHeight(node.left), this.nodeHeight(node.right));
429
- }
430
- }
431
419
  floor(key) {
432
420
  if (!this.isEmpty()) {
433
421
  return this.nodeFloor(this.root, key);
@@ -436,7 +424,7 @@ export class RedBlackTree {
436
424
  nodeFloor(node, key) {
437
425
  if (node) {
438
426
  const cmp = this.compareKeys(key, node.key);
439
- if (cmp == 0) {
427
+ if (cmp === 0) {
440
428
  return node;
441
429
  }
442
430
  else if (cmp < 0) {
@@ -461,7 +449,7 @@ export class RedBlackTree {
461
449
  nodeCeil(node, key) {
462
450
  if (node) {
463
451
  const cmp = this.compareKeys(key, node.key);
464
- if (cmp == 0) {
452
+ if (cmp === 0) {
465
453
  return node;
466
454
  }
467
455
  else if (cmp > 0) {
@@ -535,7 +523,7 @@ export class RedBlackTree {
535
523
  return rightChild;
536
524
  }
537
525
  oppositeColor(c) {
538
- return (c == 1 /* BLACK */) ? 0 /* RED */ : 1 /* BLACK */;
526
+ return (c === 1 /* BLACK */) ? 0 /* RED */ : 1 /* BLACK */;
539
527
  }
540
528
  flipColors(node) {
541
529
  node.color = this.oppositeColor(node.color);
@@ -695,9 +683,6 @@ export class RedBlackTree {
695
683
  }
696
684
  return go;
697
685
  }
698
- diag() {
699
- console.log(`Height is ${this.height()}`);
700
- }
701
686
  }
702
687
  export const integerRangeToString = (range) => `[${range.start},${range.end})`;
703
688
  const intervalComparer = (a, b) => a.compare(b);
@@ -819,7 +804,6 @@ export class TST {
819
804
  this.n++;
820
805
  }
821
806
  this.root = this.nodePut(this.root, key, val, 0);
822
- // console.log(`put ${key}`);
823
807
  }
824
808
  nodePut(x, key, val, d) {
825
809
  let _x = x;