@fluidframework/merge-tree 1.0.1 → 1.0.2
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.
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +2 -2
- package/dist/mergeTree.js.map +1 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +2 -2
- package/lib/mergeTree.js.map +1 -1
- package/package.json +11 -11
- package/src/mergeTree.ts +3 -2
package/dist/mergeTree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6DAA6D;AAC7D,kEAAkE;AAElE,yEAAyE;AAEzE,+DAAsD;AACtD,qEAA6D;AAC7D,+CAMuB;AACvB,2CAMqB;AACrB,qDAA4E;AAC5E,qEAMkC;AAClC,2DAA8D;AAC9D,+BAOe;AACf,qDAA0D;AAC1D,6CAQsB;AACtB,6DAU+B;AAC/B,qEAAkE;AAClE,yEAA+D;AAuC/D,SAAgB,aAAa,CAAC,KAAwC;IAClE,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,gBAAgB,MAAK,SAAS,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,MAAK,SAAS,EAAE;QAC1E,OAAO,KAAqB,CAAC;KAChC;IACD,IAAA,qBAAM,EAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,gBAAgB,MAAK,SAAS,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,MAAK,SAAS,EAC3E,KAAK,CAAC,qEAAqE,CAAC,CAAC;AACrF,CAAC;AAND,sCAMC;AAED,SAAS,SAAS,CAAC,OAAiB;IAChC,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB;IACxC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,UAAU,KAAK,oCAAwB,CAAC;AAC5F,CAAC;AA4ID,MAAa,SAAS;IAAtB;QACI,UAAK,GAAW,CAAC,CAAC;QAClB,YAAO,GAAW,EAAE,CAAC;QAErB,iBAAY,GAAW,CAAC,CAAC;IAK7B,CAAC;IAHG,MAAM;QACF,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AATD,8BASC;AAED,SAAS,OAAO,CAAC,IAAuB,EAAE,KAAa;IACnD,MAAM,UAAU,GAAG,IAAA,qCAAgB,EAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,EAAE;QACZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAChC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;SAC3B;KACJ;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAuB,EAAE,KAAa;IAC/D,MAAM,UAAU,GAAG,IAAA,qCAAgB,EAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,EAAE;QACZ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAChC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;gBAChC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;aAC3B;SACJ;KACJ;AACL,CAAC;AAED,SAAS,eAAe,CAAC,eAA8B,EAAE,aAA4B;IACjF,8DAA8D;IAC9D,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;QAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,YAAY,KAAK,SAAS,EAAE;gBAC5B,YAAY,GAAG,IAAI,mBAAK,EAAqB,CAAC;gBAC9C,eAAe,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;aACzC;YACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE;gBAClC,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;aAC5C;SACJ;KACJ;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+B,EAAE,KAAwB;IAClF,IAAI,IAAA,wCAAmB,EAAC,KAAK,EAAE,mBAAa,CAAC,SAAS,CAAC,EAAE;QACrD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;KACf;SAAM;QACH,gCAAgC;QAChC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,6BAA6B;QAC7B,IAAI,GAAG,IAAI,CAAC,IAAA,wCAAmB,EAAC,GAAG,EAAE,mBAAa,CAAC,SAAS,CAAC,CAAC,EAAE;YAC5D,KAAK,CAAC,GAAG,EAAE,CAAC;SACf;aAAM;YACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrB;QACD,OAAO,KAAK,CAAC;KAChB;AACL,CAAC;AAED,SAAS,iBAAiB,CACtB,SAAoB,EAAE,IAAgB,EACtC,cAA0C,EAC1C,aAAyC,EAAE,WAA0B;;IACrE,SAAS,eAAe,CAAC,KAAa,EAAE,MAAyB;QAC7D,IAAI,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,KAAK,GAAG,IAAI,mBAAK,EAAqB,CAAC;YACvC,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SAC9B;QACD,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAA,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,EAAE;YAC9C,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,qDAAqD;gBACrD,gDAAgD;gBAChD,IAAI,QAAQ,EAAE;oBACV,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;iBAC/C;gBACD,IAAI,IAAA,wCAAmB,EAAC,OAAO,EAAE,mBAAa,CAAC,IAAI,CAAC,EAAE;oBAClD,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;oBACjC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;iBAC/C;gBACD,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,mBAAa,CAAC,SAAS,GAAG,mBAAa,CAAC,OAAO,CAAC,EAAE;oBACrE,MAAM,WAAW,GAAG,IAAA,sCAAiB,EAAC,OAAO,CAAC,CAAC;oBAC/C,IAAI,WAAW,EAAE;wBACb,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;4BAC7B,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;yBACnC;qBACJ;iBACJ;aACJ;iBAAM;gBACH,MAAM,WAAW,GAAG,IAAmB,CAAC;gBACxC,IAAI,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,KAAK,SAAS,CAAC;oBAC3E,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE;oBAC1C,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,SAAS,EAAE;wBACtC,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,IAAI,CAAC,EAAE;4BAC/C,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;4BAC9B,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;yBAC5C;wBACD,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,mBAAa,CAAC,SAAS,GAAG,mBAAa,CAAC,OAAO,CAAC,EAAE;4BAClE,KAAK,MAAM,KAAK,IAAI,IAAA,sCAAiB,EAAC,IAAI,CAAE,EAAE;gCAC1C,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;6BAChC;yBACJ;qBACJ;iBACJ;aACJ;SACJ;KACJ;SAAM;QACH,MAAM,KAAK,GAAe,IAAI,CAAC;QAC/B,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAA,mBAAM,EAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAA,8BAAiB,EAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;KACzD;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,GAAW;IACtC,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,IAAI,GAAG,EAAE;QACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7B;KACJ;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AARD,wCAQC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,8FAA8F;AAC9F,sBAAsB;AACT,QAAA,eAAe,GAAG,CAAC,CAAC;AAEjC,MAAa,UAAW,SAAQ,SAAS;IAErC,YAA0B,UAAkB;QACxC,KAAK,EAAE,CAAC;QADc,eAAU,GAAV,UAAU,CAAQ;QAExC,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAa,uBAAe,CAAC,CAAC;IAC3D,CAAC;IAEM,SAAS;QACZ,OAAO,SAAS,CAAC;IACrB,CAAC;IAEM,UAAU,CAAC,KAAiB,EAAE,KAAa;QAC9C,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,UAAU,KAAK,CAAC,EAAE;YAClB,UAAU,GAAG,CAAC,CAAC;SAClB;QACD,IAAA,qBAAM,EAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACrG,IAAI,YAAoB,CAAC;QACzB,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,uBAAe,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,KAAK,KAAK,CAAC,EAAE;YACb,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;SACnC;aAAM;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACjD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;SAC7C;QACD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACjE,IAAA,qBAAM,EAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC3G,IAAI,KAAK,GAAG,CAAC,EAAE;YACX,IAAA,qBAAM,EACF,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAChD,KAAK,CACR,CAAC;SACL;IACL,CAAC;IAEM,WAAW,CAAC,KAAiB,EAAE,KAAa,EAAE,aAAa,GAAG,IAAI;QACrE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACjC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACjC,CAAC;CACJ;AA5CD,gCA4CC;AAED,MAAM,cAAe,SAAQ,UAAU;IAKnC,YAAY,UAAkB;QAC1B,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,cAAc,GAAG,IAAA,sBAAS,GAAqB,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,IAAA,sBAAS,GAAqB,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,IAAA,sBAAS,GAA4B,CAAC;IAC7D,CAAC;IAEM,iBAAiB,CAAC,SAAoB,EAAE,IAAgB;QAC3D,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EACtE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAEM,SAAS;QACZ,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,YAAY,CAAC,WAAmB;QACnC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,8DAA8D;QAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;aACnC;YACD,MAAM,IAAI,IAAI,CAAC;SAClB;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AAED,SAAS,eAAe,CAAC,SAAoB,EAAE,IAAgB;IAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;KAC5B;IACD,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAsB,WAAY,SAAQ,SAAS;IAAnD;;QACW,aAAQ,GAAW,yBAAa,CAAC;QACjC,QAAG,GAAW,mCAAuB,CAAC;QAG7B,kBAAa,GAA2B,IAAI,+CAAsB,CAAC,IAAI,CAAC,CAAC;QACzE,uBAAkB,GAA4B,IAAI,2CAAuB,CAAC,IAAI,CAAC,CAAC;IAgIpG,CAAC;IAxHU,aAAa,CAAC,QAAqB,EAAE,EAAiB,EAAE,GAAY,EAAE,YAAkC;QAC3G,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,4CAAiB,EAAE,CAAC;SAClD;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,IAAI,CAAC,UAAU,GAAG,IAAA,sBAAS,GAAO,CAAC;SACtC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CACrC,IAAI,CAAC,UAAU,EACf,QAAQ,EACR,EAAE,EACF,GAAG,EACH,YAAY,IAAI,YAAY,CAAC,aAAa,CAC7C,CAAC;IACN,CAAC;IAEM,WAAW,CAAC,GAAW;QAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IACrE,CAAC;IAEM,MAAM;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IAES,SAAS,CAAC,CAAW;;QAC3B,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,8BAA8B;QAC9B,CAAC,CAAC,UAAU,GAAG,IAAA,kBAAK,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,gBAAgB,GAAG,MAAA,IAAI,CAAC,gBAAgB,0CAAE,KAAK,EAAE,CAAC;QACpD,4DAA4D;QAC5D,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,OAAiB;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,kBAAkB,CAAC,IAAkB;QAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;SAChC;IACL,CAAC;IAIM,GAAG,CAAC,YAA0B,EAAE,MAA6B,EAAE,SAAoB;QACtF,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACzD,IAAA,qBAAM,EAAC,mBAAmB,KAAK,YAAY,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC7F,QAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;YACpB,KAAK,wBAAkB,CAAC,QAAQ;gBAC5B,IAAA,qBAAM,EAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBACjG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC;YAEhB,KAAK,wBAAkB,CAAC,MAAM;gBAC1B,IAAA,qBAAM,EAAC,IAAI,CAAC,GAAG,KAAK,oCAAwB,EAAE,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACrG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC;gBACnD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,OAAO,IAAI,CAAC;YAEhB,KAAK,wBAAkB,CAAC,MAAM;gBAC1B,MAAM,WAAW,GAA6B,aAAa,CAAC,IAAI,CAAC,CAAC;gBAClE,IAAA,qBAAM,EAAC,WAAW,KAAK,SAAS,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBACtF,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;gBACjC,IAAI,WAAW,CAAC,UAAU,KAAK,oCAAwB,EAAE;oBACrD,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC;oBACjE,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,KAAK,CAAC;YAEjB;gBACI,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,oCAAoC,CAAC,CAAC;SAC9E;IACL,CAAC;IAEM,OAAO,CAAC,GAAW;;QACtB,IAAI,GAAG,GAAG,CAAC,EAAE;YACT,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,WAAW,EAAE;gBACb,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACnC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAEjC,+CAA+C;gBAC/C,uEAAuE;gBACvE,+DAA+D;gBAC/D,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE5D,WAAW,CAAC,gBAAgB,GAAG,MAAA,IAAI,CAAC,gBAAgB,0CAAE,KAAK,EAAE,CAAC;gBAC9D,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;gBACzC,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;gBACnD,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;gBAC3B,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACrC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACvC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,SAAS,EAAE;oBAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;iBAC1C;aACJ;YACD,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAe;QACpC,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,KAAK,CAAC,eAAe,GAAG,IAAI,4CAAiB,EAAE,CAAC;gBAChD,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAC1C,IAAI,CAAC,UAAU,EACf,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,eAAe,CACxB,CAAC;aACL;SACJ;IACL,CAAC;CAKJ;AAtID,kCAsIC;AAEY,QAAA,mBAAmB,GAAG,UAAU,CAAC;AACjC,QAAA,2BAA2B,GAAG,kBAAkB,CAAC;AAM9D,MAAa,MAAO,SAAQ,WAAW;IAgBnC,YAAmB,OAAsB;QACrC,KAAK,EAAE,CAAC;QADO,YAAO,GAAP,OAAO,CAAe;QAXzB,SAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAa/B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;IAjBM,MAAM,CAAC,EAAE,CAAC,OAAiB;QAC9B,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;IACxC,CAAC;IAGM,MAAM,CAAC,IAAI,CACd,OAAsB,EAAE,KAAmB;QAC3C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE;YACP,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC/B;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAOD,YAAY;QACR,MAAM,GAAG,GAAuB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC;IACf,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,IAAS;QAC3B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,EAAE;YACtD,OAAO,MAAM,CAAC,IAAI,CACd,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,IAAI,CAAC,KAAoB,CAAC,CAAC;SAClC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACb,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS;QACL,OAAO,CAAC,CAAC;IACb,CAAC;IAED,aAAa,CAAC,cAAsB;QAChC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU;YACpB,IAAI,CAAC,UAAU,CAAC,mCAA2B,CAAC,KAAK,cAAc,CAAC;IACxE,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,2BAAmB,CAAC,EAAE;YACzD,OAAO,IAAI,CAAC,UAAU,CAAC,2BAAmB,CAAW,CAAC;SACzD;IACL,CAAC;IAED;;OAEG;IACH,aAAa;QACT,OAAO,IAAA,qCAAgB,EAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD;;OAEG;IACH,cAAc;QACV,OAAO,IAAA,sCAAiB,EAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD;;OAEG;IACH,YAAY,CAAC,KAAa;QACtB,OAAO,IAAA,oCAAe,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD;;OAEG;IACH,aAAa,CAAC,KAAa;QACvB,OAAO,IAAA,qCAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IACD;;OAEG;IACH,aAAa;QACT,OAAO,IAAA,qCAAgB,EAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD;;OAEG;IACH,cAAc;QACV,OAAO,IAAA,sCAAiB,EAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ;QACJ,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,IAAI,MAAM,CAAC;SAClB;QACD,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,SAAS,CAAC,EAAE;YACpD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjB,IAAI,IAAI,IAAI,CAAC;aAChB;YACD,IAAI,IAAI,YAAY,CAAC;SACxB;QACD,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,OAAO,CAAC,EAAE;YAClD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjB,IAAI,IAAI,IAAI,CAAC;aAChB;YACD,IAAI,IAAI,UAAU,CAAC;SACtB;QACD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,EAAE,EAAE;YACJ,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC;SACvB;QACD,MAAM,UAAU,GAAG,IAAA,qCAAgB,EAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,UAAU,EAAE;YACZ,IAAI,IAAI,UAAU,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;gBACnD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,IAAI,IAAI,IAAI,CAAC;iBAChB;gBACD,IAAI,IAAI,SAAS,CAAC;aACrB;SACJ;QACD,MAAM,WAAW,GAAG,IAAA,sCAAiB,EAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,WAAW,EAAE;YACb,IAAI,SAAS,GAAG,OAAO,CAAC;YACxB,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,OAAO,CAAC,EAAE;gBAClD,SAAS,GAAG,KAAK,CAAC;aACrB;YACD,IAAI,UAAU,EAAE;gBACZ,IAAI,IAAI,GAAG,CAAC;aACf;YACD,IAAI,IAAI,SAAS,SAAS,MAAM,CAAC;YACjC,MAAM,MAAM,GAAG,WAAW,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,IAAI,IAAI,IAAI,CAAC;iBAChB;gBACD,IAAI,IAAI,UAAU,CAAC;aACtB;SACJ;QACD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACnD,wEAAwE;gBACxE,uCAAuC;gBACvC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;gBAE7C,+DAA+D;gBAC/D,OAAO,MAAM;oBACT,CAAC,CAAC,WAAW,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG;oBACvD,CAAC,CAAC,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;SACN;QACD,OAAO,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC;IACxC,CAAC;IAES,oBAAoB,CAAC,GAAW;QACtC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,OAAiB;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;;AAlL7D,wBAmLC;AAlL0B,WAAI,GAAG,QAAQ,CAAC;AAoL3C,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,qDAAE,CAAA;IACF,yDAAI,CAAA;IACJ,2DAAK,CAAA;AACT,CAAC,EAJW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAI5B;AAED,MAAa,mBAAmB;IAE5B,YACW,KAAkB,EAClB,OAA4C,EAC5C,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,OAAiB,EACjB,KAAa,EACb,GAAW,EACX,aAAa,CAAC;QARd,UAAK,GAAL,KAAK,CAAa;QAClB,YAAO,GAAP,OAAO,CAAqC;QAC5C,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAU;QACjB,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,eAAU,GAAV,UAAU,CAAI;QAVzB,OAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;IAY1B,CAAC;CACJ;AAdD,kDAcC;AAED,MAAa,mBAAmB;IAAhC;QACI,aAAQ,GAAG,yBAAa,CAAC;QACzB,kBAAa,GAAG,KAAK,CAAC;QACtB,qFAAqF;QACrF,WAAM,GAAG,CAAC,CAAC;QACX,iDAAiD;QACjD,oCAAoC;QACpC,eAAU,GAAG,CAAC,CAAC;QAEf,aAAQ,GAAG,CAAC,CAAC;IAQjB,CAAC;IANG,QAAQ,CAAC,CAAsB;QAC3B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACnC,CAAC;CACJ;AAjBD,kDAiBC;AAEM,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAAjD,QAAA,cAAc,kBAAmC;AAEvD,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAA9D,QAAA,cAAc,kBAAgD;AAE3E,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACtC,SAAgB,cAAc,CAAC,CAAS;IACpC,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;QAChC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;SAC3B;KACJ;IACD,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AARD,wCAQC;AAYY,QAAA,iBAAiB,GAAwB;IAClD,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACjC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;CACzC,CAAC;AAOF,MAAM,kBAAkB,GAAyB;IAC7C,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;CACzC,CAAC;AAmBF,SAAS,oBAAoB,CAAC,MAAc,EAAE,UAAkC;IAC5E,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE;QAC7C,IAAI,IAAA,qCAAgB,EAAC,MAAM,EAAE,UAAU,CAAC,EAAE;YACtC,IAAI,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,YAAY,KAAK,SAAS,EAAE;gBAC5B,YAAY,GAAG,IAAI,mBAAK,EAAU,CAAC;gBACnC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;aAChD;YACD,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;SAC7C;KACJ;AACL,CAAC;AACD,SAAS,eAAe,CACpB,OAAiB,EAAE,MAAc,EACjC,MAAc,EAAE,QAAgB,EAAE,KAAyB,EAAE,GAAuB,EACpF,UAAkC;IAClC,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QACpB,IAAI,OAAO,CAAC,OAAO;YACf,CAAC,mBAAa,CAAC,SAAS,GAAG,mBAAa,CAAC,OAAO,CAAC,EAAE;YACnD,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;SAC7C;KACJ;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CACf,IAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,QAAgB,EAClE,MAA0B,EAAE,GAAuB,EAAE,UAAkC;;IACvF,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,CAAC,MAAA,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;YACzE,IAAI,GAAG,CAAC,OAAO;gBACX,CAAC,mBAAa,CAAC,SAAS,GAAG,mBAAa,CAAC,OAAO,CAAC,EAAE;gBACnD,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;aACzC;SACJ;KACJ;SAAM;QACH,MAAM,KAAK,GAAe,IAAI,CAAC;QAC/B,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;KACzD;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACpB,OAAiB,EACjB,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,KAAa,EACb,GAAW,EACX,UAAgC;IAChC,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QACpB,IAAI,IAAA,oCAAe,EAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;YAChD,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;SAC7B;KACJ;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CACd,IAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,QAAgB,EAClE,MAA0B,EAAE,GAAuB,EAAE,UAAgC;IACrF,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;YAClE,IAAI,IAAA,oCAAe,EAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;gBAC5C,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;aACzB;SACJ;KACJ;SAAM;QACH,MAAM,KAAK,GAAe,IAAI,CAAC;QAC/B,IAAI,MAAc,CAAC;QACnB,IAAI,UAAU,CAAC,eAAe,EAAE;YAC5B,MAAM,GAAW,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC/D;aAAM;YACH,MAAM,GAAW,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC9D;QACD,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;SAC5B;KACJ;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAOD,MAAM,mBAAmB,GAA0B;IAC/C,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAA,qBAAM,EAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE;IAClG,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;CACnD,CAAC;AAIF,yCAAyC;AACzC,MAAa,SAAS;IAwBlB,kDAAkD;IAClD,YAA0B,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;QAb9B,uBAAkB,GAAuB,SAAS,CAAC,sBAAsB,CAAC;QAC3E,iBAAY,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAGzD,qCAAqC;QACrC,4EAA4E;QAC5E,mFAAmF;QAClE,gBAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;QAumC1C,qBAAgB,GAAG,CAAC,OAA6B,EAAE,GAAW,EAAmB,EAAE;YAChG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;YACnC,IAAI,IAAI,CAAC,4BAA4B,EAAE;gBACnC,IAAI,CAAC,4BAA4B,CAAC;oBAC9B,SAAS,EAAE,iDAAwB,CAAC,KAAK;oBACzC,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iBAClD,EACG,SAAS,CAAC,CAAC;aAClB;YAED,OAAO,EAAE,IAAI,EAAE,CAAC;QACpB,CAAC,CAAC;QA/mCE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAEO,SAAS,CAAC,UAAkB;QAChC,MAAM,KAAK,GAAe,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;QACzD,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,KAAK;QACR,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,6CAA6C;QAC7C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEM,UAAU,CAAC,KAAkB,EAAE,QAAqB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;gBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC/B,IAAI,QAAQ,EAAE;oBACV,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC1B;aACJ;iBAAM;gBACH,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D;SACJ;QACD,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,YAAY,CAAC,OAAiB;QAClC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC;IACb,CAAC;IAEM,cAAc,CAAC,OAAiB;QACnC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,WAAW,KAAK,SAAS,EAAE;YAC3B,OAAO,CAAC,CAAC;SACZ;aAAM;YACH,OAAO,OAAO,CAAC,YAAY,CAAC;SAC/B;IACL,CAAC;IAED,uCAAuC;IAChC,cAAc,CAAC,EAAU,EAAE,OAAiB;QAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAEO,OAAO,CAAC,KAAkB,EAAE,IAAgB;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,4BAA4B;IACrB,kBAAkB,CAAC,QAAoB;QAC1C,iGAAiG;QACjG,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAE5G,MAAM,WAAW,GAAG,uBAAe,GAAG,CAAC,CAAC;QAExC,oGAAoG;QACpG,MAAM,eAAe,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAG,oDAAoD;YAChH,MAAM,MAAM,GAAkB,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAQ,mCAAmC;YAE/F,gDAAgD;YAChD,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAM,4CAA4C;aACpF,UAAU,GAAG,UAAU,EAAiB,4DAA4D;aACpG,UAAU,EAAE,CAA4B,uCAAuC;cACjF;gBACE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAErD,gFAAgF;gBAChF,+BAA+B;gBAC/B,KAAK,IAAI,UAAU,GAAG,CAAC,EACnB,UAAU,GAAG,WAAW,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAI,4CAA4C;iBACpG,UAAU,EAAE,EAAE,SAAS,EAAE,CAA+B,+BAA+B;kBACzF;oBACE,8CAA8C;oBAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;iBACzC;gBAED,yGAAyG;gBACzG,qGAAqG;gBACrG,oGAAoG;gBACpG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aAC3B;YAED,+DAA+D;YAC/D,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAU,8CAA8C;gBAC9E,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAqB,wCAAwC;gBACxE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAM,8DAA8D;QACtG,CAAC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACtC;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACjC;IACL,CAAC;IACD,2BAA2B;IAE3B,oCAAoC;IAC7B,kBAAkB,CAAC,aAAqB,EAAE,MAAc,EAAE,UAAkB;QAC/E,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,aAAa,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,kBAAI,CAAa,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,GAAG,IAAA,0BAAY,GAAgB,CAAC;QACpD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,OAAiB,EAAE,GAAW;QAC9C,qGAAqG;QACrG,kDAAkD;QAElD,oFAAoF;QACpF,oEAAoE;QACpE,IAAI,OAAO,CAAC,MAAO,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC3E,OAAO,CAAC,MAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAClC,IAAI,CAAC,eAAgB,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;SACvD;IACL,CAAC;IAEO,SAAS,CAAC,IAAiB;QAC/B,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,uBAAe,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,IAAiB,EAAE,SAAuB;QACxD,IAAI,WAAiC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE;gBACpB,MAAM,OAAO,GAAG,SAAS,CAAC;gBAC1B,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE;oBAC7B,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE;wBAClC,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;4BAC/C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;yBAC3B;6BAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE;4BAC1C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;yBAC3B;6BAAM;4BACH,2FAA2F;4BAC3F,IAAI,IAAI,CAAC,4BAA4B,EAAE;gCACnC,IAAI,CAAC,4BAA4B,CAC7B;oCACI,SAAS,EAAE,iDAAwB,CAAC,MAAM;oCAC1C,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;iCAC/B,EACD,SAAS,CACZ,CAAC;6BACL;4BAED,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;yBAC9B;wBACD,WAAW,GAAG,SAAS,CAAC;qBAC3B;yBAAM;wBACH,IAAI,OAAO,CAAC,GAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;4BAC1C,MAAM,SAAS,GAAG,WAAW;mCACtB,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;mCAC9B,IAAA,4BAAe,EAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;mCAC3D,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;mCAClE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;4BAExC,IAAI,SAAS,EAAE;gCACX,WAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gCAC7B,IAAI,IAAI,CAAC,4BAA4B,EAAE;oCACnC,IAAI,CAAC,4BAA4B,CAC7B;wCACI,SAAS,EAAE,iDAAwB,CAAC,MAAM;wCAC1C,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,WAAY,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;qCAC1D,EACD,SAAS,CACZ,CAAC;iCACL;gCACD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gCAC3B,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;6BACjF;iCAAM;gCACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gCACxB,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oCAClC,WAAW,GAAG,OAAO,CAAC;iCACzB;qCAAM;oCACH,WAAW,GAAG,SAAS,CAAC;iCAC3B;6BACJ;yBACJ;6BAAM;4BACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BACxB,WAAW,GAAG,SAAS,CAAC;yBAC3B;qBACJ;iBACJ;qBAAM;oBACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxB,WAAW,GAAG,SAAS,CAAC;iBAC3B;aACJ;iBAAM;gBACH,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1B,WAAW,GAAG,SAAS,CAAC;aAC3B;SACJ;IACL,CAAC;IAED,uCAAuC;IAC/B,UAAU,CAAC,MAAmB;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,UAAkB,CAAC;QACvB,IAAI,UAAuB,CAAC;QAC5B,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,KAAK,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YAC/D,4BAA4B;YAC5B,UAAU,GAAgB,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACtC,8CAA8C;YAC9C,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;SACjC;QACD,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;QACxC,MAAM,SAAS,GAAG,uBAAe,GAAG,CAAC,CAAC;QACtC,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAe,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC;QACvF,IAAI,UAAU,GAAG,CAAC,EAAE;YAChB,UAAU,GAAG,CAAC,CAAC;SAClB;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC;QAC1D,IAAI,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,KAAK,CAAc,uBAAe,CAAC,CAAC;QAC7D,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,SAAS,EAAE,EAAE;YACzD,IAAI,SAAS,GAAG,SAAS,CAAC;YAC1B,IAAI,UAAU,GAAG,CAAC,EAAE;gBAChB,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;aAChB;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9C,KAAK,IAAI,eAAe,GAAG,CAAC,EAAE,eAAe,GAAG,SAAS,EAAE,eAAe,EAAE,EAAE;gBAC1E,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC1C,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;aAC/D;YACD,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC5B,YAAY,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;YACtC,IAAI,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC;SAClD;QACD,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;SACjD;QACD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAClC;aAAM;YACH,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,oCAAwB,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;SAC3E;IACL,CAAC;IAEO,eAAe,CAAC,uBAAuB,GAAG,SAAS,CAAC,uBAAuB;QAC/E,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClC,OAAO;SACV;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAuB,EAAE,CAAC,EAAE,EAAE;YAC9C,IAAI,cAAc,GAAG,IAAI,CAAC,eAAgB,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;gBACrE,MAAM;aACT;YACD,cAAc,GAAG,IAAI,CAAC,eAAgB,CAAC,GAAG,EAAE,CAAC;YAC7C,+EAA+E;YAC/E,IAAI,cAAc,CAAC,OAAQ,CAAC,MAAM,IAAI,cAAc,CAAC,OAAQ,CAAC,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE;gBACvF,MAAM,KAAK,GAAG,cAAc,CAAC,OAAQ,CAAC,MAAM,CAAC;gBAC7C,MAAM,YAAY,GAAiB,EAAE,CAAC;gBACtC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACpC,gDAAgD;gBAChD,kCAAkC;gBAClC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;gBAEzB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC;gBAE1C,IAAI,aAAa,GAAG,KAAK,CAAC,UAAU,EAAE;oBAClC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;oBACjC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC;oBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;wBACpC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;qBAChD;oBAED,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE;wBACvC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;qBACjC;yBAAM;wBACH,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;wBAC/B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,oCAAwB,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;qBAC1E;iBACJ;aACJ;SACJ;IACL,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACX,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAkB,EAAE;YACxD,MAAM,KAAK,GAAmB;gBAC1B,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;gBACZ,gBAAgB,EAAE,CAAC;gBACnB,SAAS,EAAE,CAAC;gBACZ,KAAK,EAAE,EAAE;aACZ,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAe,EAAE,CAAC,EAAE,EAAE;gBACtC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACtB;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;oBACvC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;oBAClC,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;oBACxC,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;oBACxC,KAAK,CAAC,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC;oBACtD,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;oBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,uBAAe,EAAE,CAAC,EAAE,EAAE;wBACtC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBACzC;iBACJ;qBAAM;oBACH,KAAK,CAAC,SAAS,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,KAAK,CAAC;oBACtB,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE;wBAClC,KAAK,CAAC,gBAAgB,EAAE,CAAC;qBAC5B;iBACJ;gBACD,IAAI,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE;oBAC1B,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;iBAC5B;aACJ;YACD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC;YACpC,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,MAAc,EAAE,QAAgB;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAE/C,WAAW,CAAC,IAAe,EAAE,MAAc,EAAE,QAAgB;;QAChE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,UAAmC,CAAC;QACxC,OAAO,MAAM,EAAE;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;gBACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE;oBAC5D,MAAM;iBACT;gBACD,WAAW,IAAI,MAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,mCAAI,CAAC,CAAC;aAChE;YACD,UAAU,GAAG,MAAM,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;SAC1B;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAEM,oBAAoB,CAAqB,GAAW,EAAE,MAAc,EAAE,QAAgB;QACzF,IAAI,OAAsB,CAAC;QAC3B,IAAI,MAA0B,CAAC;QAE/B,MAAM,IAAI,GAAG,CAAC,OAAiB,EAAE,MAAc,EAAE,OAAe,EAAE,SAAiB,EAAE,KAAa,EAAE,EAAE;YAClG,OAAO,GAAG,OAAY,CAAC;YACvB,MAAM,GAAG,KAAK,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,MAAsE;QAC5F,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACvD,OAAO,MAAM,CAAC;SACjB;QACD,oFAAoF;QACpF,mCAAmC;QACnC,oFAAoF;QACpF,kCAAkC;QAClC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,IAAI,cAAoC,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,GAAG,CAAC,GAAG,KAAK,oCAAwB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE;gBACjE,cAAc,GAAG,GAAG,CAAC;gBACrB,IAAI,UAAU,EAAE;oBACZ,qBAAqB,GAAG,IAAI,CAAC;oBAC7B,OAAO,KAAK,CAAC;iBAChB;aACJ;YACD,IAAI,CAAC,UAAU,IAAI,GAAG,KAAK,MAAM,CAAC,OAAO,EAAE;gBACvC,UAAU,GAAG,IAAI,CAAC;aACrB;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,cAAc,IAAI,CAAC,qBAAqB,EAAE;YAC1C,iEAAiE;YACjE,MAAM,GAAG,cAAc,CAAC,YAAY,GAAG,CAAC,CAAC;SAC5C;QACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACK,eAAe,CAAC,OAAiB,EAAE,WAA6B;;QACpE,IAAA,qBAAM,EACF,iBAAiB,CAAC,OAAO,CAAC,EAC1B,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACrF,IAAA,qBAAM,EAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC;QACrC,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;YACrC,UAAU,CAAC,SAAS,GAAG,IAAI,yCAAwB,CAAC,UAAU,CAAC,CAAC;SACnE;QACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACzD,IAAA,qBAAM,EAAC,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACzE,IAAI,CAAC,UAAU,EAAE;gBACb,2DAA2D;gBAC3D,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;gBACxB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;aAClB;iBAAM;gBACH,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC;gBACzB,GAAG,CAAC,MAAM,GAAG,MAAA,SAAS,CAAC,MAAM,mCAAI,CAAC,CAAC;gBACnC,IAAA,qBAAM,EAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACxE,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aACzC;SACJ;QACD,kDAAkD;QAClD,IAAI,UAAU,EAAE;YACZ,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,MAAM,EAAE,yCAA6B,EACxE,yBAAa,CAAC,CAAC;SACtB;IACL,CAAC;IAEO,iCAAiC,CAAC,OAAiB,EAAE,OAAgB;QACzE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE;YAC/C,OAAO;SACV;QACD,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE;YAClC,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,YAAY,CAAC,EAAE;gBACvD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACzB;iBAAM,IAAI,IAAA,wCAAmB,EAAC,IAAI,EAAE,mBAAa,CAAC,aAAa,CAAC,EAAE;gBAC/D,IAAI,OAAO,EAAE;oBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACzB;qBAAM;oBACH,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC1B;aACJ;SACJ;QACD,0EAA0E;QAC1E,qEAAqE;QACrE,IAAI,CAAC,OAAO,EAAE;YACV,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;SAC9C;QACD,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACvC;IACL,CAAC;IAEO,WAAW,CAAC,IAAiB,EAAE,MAAc,EAAE,QAAgB;QACnE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;YAChF,OAAO,IAAI,CAAC,cAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAClE;aAAM;YACH,OAAO,IAAI,CAAC,YAAY,CAAC;SAC5B;IACL,CAAC;IAEO,UAAU,CAAC,IAAgB,EAAE,MAAc,EAAE,QAAgB;QACjE,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;YACjF,0DAA0D;YAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;gBAChB,OAAO,IAAI,CAAC,YAAY,CAAC;aAC5B;iBAAM;gBACH,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aACpC;SACJ;aAAM;YACH,gCAAgC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;gBAChB,OAAO,IAAI,CAAC,cAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aAClE;iBAAM;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC;gBACrB,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBAE3C,IAAI,WAAW,KAAK,SAAS;uBACtB,WAAW,CAAC,UAAU,KAAK,oCAAwB;uBACnD,WAAW,CAAC,UAAU,IAAI,MAAM,EAAE;oBACrC,mDAAmD;oBACnD,qDAAqD;oBACrD,mBAAmB;oBACnB,OAAO,SAAS,CAAC;iBACpB;gBACD,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;oBAChC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,oCAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAI,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;oBAC3E,kFAAkF;oBAClF,IAAI,WAAW,KAAK,SAAS,EAAE;wBAC3B,IAAI,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;4BACjD,OAAO,CAAC,CAAC;yBACZ;6BAAM;4BACH,OAAO,OAAO,CAAC,YAAY,CAAC;yBAC/B;qBACJ;yBAAM;wBACH,OAAO,OAAO,CAAC,YAAY,CAAC;qBAC/B;iBACJ;qBAAM;oBACH,kDAAkD;oBAClD,gDAAgD;oBAChD,UAAU;oBACV,IAAI,WAAW,KAAK,SAAS;2BACtB,WAAW,CAAC,UAAU,KAAK,oCAAwB,EAAE;wBACxD,OAAO,SAAS,CAAC;qBACpB;oBACD,qFAAqF;oBACrF,OAAO,CAAC,CAAC;iBACZ;aACJ;SACJ;IACL,CAAC;IAEM,iBAAiB,CAAC,WAAmB,EAAE,OAAiC;QAC3E,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,kBAAI,CAAc,EAAE,EAC3C,mBAAmB,CAAC,CAAC;SAC5B;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IAEO,qBAAqB;QACzB,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACrC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;gBACvE,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAG,CAAC;gBAChD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;aACjD;SACJ;IACL,CAAC;IAEM,SAAS,CAAC,MAAc;QAC3B,IAAA,qBAAM,EACF,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EACtC,KAAK,CACR,CAAC;QAEF,oBAAoB;QACpB,IAAA,qBAAM,EAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,EAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAEnG,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACnC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;YAClC,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;gBACnC,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;YACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;SAChC;IACL,CAAC;IAEM,gCAAgC,CACnC,MAAyB,EACzB,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EACrC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE;YACnB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,OAAO,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC3D;QACD,OAAO,+BAAc,CAAC,gBAAgB,CAAC;IAC3C,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAAqB;QAC5E,MAAM,UAAU,GAA2B;YACvC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAA,sBAAS,GAAiB;YAClC,WAAW;SACd,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,mCAAuB,EAAE,QAAQ,EACnD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC,CAAC;QAC9D,OAAO,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,wBAAwB;IACjB,QAAQ,CAAC,QAAgB,EAAE,QAAgB,EAAE,SAAiB,EAAE,eAAe,GAAG,IAAI;QACzF,MAAM,UAAU,GAAyB;YACrC,SAAS,EAAE,IAAI;YACf,eAAe;YACf,SAAS;SACZ,CAAC;QAEF,IAAI,eAAe,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,mCAAuB,EAAE,QAAQ,EACnD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;SAChE;aAAM;YACH,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,mCAAuB,EAAE,QAAQ,EAC3D,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;SAChE;QAED,IAAI,UAAU,CAAC,IAAI,EAAE;YACjB,IAAI,GAAW,CAAC;YAChB,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAW,UAAU,CAAC,IAAI,CAAC;gBACvC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,mCAAuB,EAAE,QAAQ,CAAC,CAAC;aACrE;iBAAM;gBACH,MAAM,QAAQ,GAAmB,UAAU,CAAC,IAAI,CAAC;gBACjD,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;aAC/B;YACD,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;SACzC;IACL,CAAC;IAEO,MAAM,CACV,GAAW,EAAE,MAAc,EAAE,QAAgB,EAC7C,OAAgD,EAAE,UAAuB;QACzE,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtF,CAAC;IAEO,WAAW,CACf,KAAkB,EAAE,GAAW,EAAE,MAAc,EAAE,MAAc,EAAE,QAAgB,EACjF,OAAgD,EAAE,UAAuB;;QACzE,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,OAAO,GAAG,MAAM,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SACnF;QACD,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,mCAAI,CAAC,CAAC;YAC1D,IACI,CAAC,CAAC,QAAQ,IAAI,IAAI,GAAG,GAAG,CAAC;mBACtB,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAC5F;gBACE,6BAA6B;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;iBACxF;qBAAM;oBACH,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;wBACzB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;qBACxE;oBACD,OAAO,KAAK,CAAC;iBAChB;aACJ;iBAAM;gBACH,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;iBAChF;gBACD,IAAI,IAAI,GAAG,CAAC;gBACZ,OAAO,IAAI,GAAG,CAAC;aAClB;SACJ;QACD,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SACpF;IACL,CAAC;IAEO,cAAc,CAClB,GAAW,EAAE,MAAc,EAAE,QAAgB,EAC7C,OAAgD,EAAE,UAAuB;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,OAAO,SAAS,CAAC;SACpB;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAChG,CAAC;IAEO,mBAAmB,CACvB,KAAkB,EAAE,GAAW,EAAE,MAAc,EAAE,MAAc,EAAE,QAAgB,EACjF,OAAgD,EAAE,UAAuB;;QACzE,IAAI,OAAO,GAAG,MAAM,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SACnF;QACD,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7C,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,mCAAI,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;gBAChC,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE;gBACxF,6BAA6B;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;iBAC/F;qBAAM;oBACH,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;wBACzB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;qBACtE;oBACD,OAAO,KAAK,CAAC;iBAChB;aACJ;iBAAM;gBACH,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;iBAC9E;gBACD,OAAO,GAAG,MAAM,CAAC;aACpB;SACJ;QACD,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SACpF;IACL,CAAC;IAEO,UAAU,CAAC,SAAkC;QACjD,IAAI,SAAS,KAAK,SAAS,EAAE;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChD;IACL,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,MAA6B;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC;QACpD,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAgB,CAAC,OAAO,EAAE,CAAC;QAC5D,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,mBAAmB,KAAK,SAAS,EAAE;YACnC,MAAM,aAAa,GAA6B,EAAE,CAAC;YACnD,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;gBAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBACvE,8FAA8F;gBAC9F,SAAS,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;gBAEnC,IAAI,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,wBAAkB,CAAC,MAAM,EAAE;oBAC1D,IAAI,CAAC,iCAAiC,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;iBACjE;gBACD,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;oBACnC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;iBACzC;gBACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAO,CAAC,EAAE;oBACjD,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAO,CAAC,CAAC;iBAC9C;gBACD,aAAa,CAAC,IAAI,CAAC;oBACf,OAAO,EAAE,cAAc;iBAC1B,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,4BAA4B,EAAE;gBACnC,IAAI,CAAC,4BAA4B,CAC7B;oBACI,aAAa;oBACb,SAAS,EAAE,iDAAwB,CAAC,YAAY;iBACnD,EACD,MAAM,CACT,CAAC;aACL;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;gBAC9B,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC5D,oDAAoD;aACvD;SACJ;QACD,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;IACL,CAAC;IAEO,gBAAgB,CAAC,OAAiB,EAAE,YAA2B,EAAE,QAAiB;QACtF,IAAI,aAAa,GAAG,YAAY,CAAC;QACjC,IAAI,aAAa,KAAK,SAAS,EAAE;YAC7B,wBAAwB;YACxB,aAAa,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAkB,CAAC;YAC3D,IAAI,CAAC,eAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;SAChD;QACD,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,uBAAuB;IAChB,eAAe,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CACrB,WAA8B,EAC9B,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EACrC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;QACrC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACb,IAAI,MAA0B,CAAC;QAC/B,IAAI,WAAW,CAAC,EAAE,EAAE;YAChB,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAW,CAAC;SAC3D;QACD,IAAI,MAAM,EAAE;YACR,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACrB,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC;gBAC3B,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE;oBAClC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;iBAC7B;aACJ;iBAAM;gBACH,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE;oBAClC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;iBAC7B;aACJ;SACJ;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAEM,cAAc,CACjB,GAAW,EACX,QAAoB,EACpB,MAAc,EACd,QAAgB,EAChB,GAAW,EACX,MAAyC;QAEzC,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,GAAG,KAAK,oCAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEjE,uDAAuD;QACvD,IAAI,IAAI,CAAC,sBAAsB,IAAI,MAAM,KAAK,SAAS,EAAE;YACrD,IAAI,CAAC,sBAAsB,CACvB,MAAM,EACN;gBACI,SAAS,EAAE,wBAAkB,CAAC,MAAM;gBACpC,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;aAC1D,CAAC,CAAC;SACV;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe;YACpE,CAAC,GAAG,KAAK,oCAAwB,CAAC,EAAE;YACpC,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;IACL,CAAC;IAEM,yBAAyB,CAC5B,iBAAoC,EACpC,aAAuB,EACvB,MAA6B;QAE7B,IAAI,aAAa,CAAC,YAAY,KAAK,CAAC,EAAE;YAClC,OAAO;SACV;QACD,IAAI,aAAa,CAAC,MAAM;eACjB,aAAa,CAAC,UAAU;eACxB,aAAa,CAAC,GAAG,KAAK,mCAAuB,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;SAC5E;QAED,MAAM,aAAa,GAAG,CAAC,OAAiB,EAAE,EAAE;YACxC,mCAAmC;YACnC,sCAAsC;YACtC,+CAA+C;YAC/C,kDAAkD;YAClD,OAAO;YACP,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;YAC3B,IAAI,iBAAiB,GAA4B,KAAK,CAAC;YACvD,OAAO,KAAK,KAAK,SAAS,EAAE;gBACxB,IAAI,KAAK,CAAC,UAAU,IAAI,uBAAe,EAAE;oBACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACpC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE;wBACrB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;wBAC3B,yDAAyD;wBACzD,iBAAiB,GAAG,SAAS,CAAC;qBACjC;yBAAM;wBACH,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAO,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;wBAChE,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC;wBACrC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAO,EAAE,oCAAwB,EAAE,QAAQ,CAAC,CAAC;qBAC7E;iBACJ;qBAAM;oBACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,oCAAwB,EAAE,QAAQ,CAAC,CAAC;iBACrE;gBACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;aACxB;YACD,+CAA+C;YAC/C,cAAc;YACd,IAAI,iBAAiB,EAAE;gBACnB,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;aAC9C;QACL,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC5C,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,EAAG,CAAC;QACnD,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtF,IAAI,QAAQ,GAAG,UAAU,CAAC;QAC1B,kEAAkE;QAClE,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,EAAE;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC9D,IAAA,qBAAM,EAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3E,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9E,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7B,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;SAC5B;QACD,0EAA0E;QAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;gBACnB,OAAO,IAAI,CAAC;aACf;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACjF,0BAA0B;YAC1B,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,IAAI,CAAC;aACf;YACD,yEAAyE;YACzE,iBAAiB;YACjB,IAAI,OAAO,KAAK,CAAC,EAAE;gBACf,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,oCAAwB,CAAC,EAAE;oBACrD,QAAQ,GAAG,OAAO,CAAC;iBACtB;gBACD,OAAO,IAAI,CAAC;aACf;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YACjC,aAAa,CAAC,QAAQ,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YACtD,aAAa,CAAC,GAAG,GAAG,oCAAwB,CAAC;SAChD;aAAM;YACH,aAAa,CAAC,GAAG,GAAG,mCAAuB,CAAC;SAC/C;QAED,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAElC,IAAI,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE;YAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,QAAQ,EAAE;gBACV,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;aAChD;SACJ;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEtE,aAAa,CAAC,aAAa,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,sBAAsB,CACvB,MAAM,EACN;gBACI,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;gBAC3C,SAAS,EAAE,wBAAkB,CAAC,MAAM;aACvC,CAAC,CAAC;SACV;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YACjC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;SAC3E;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,2BAA2B,CAC9B,oBAA4B,EAC5B,kBAA0B,EAC1B,cAAsB;QACtB,IAAI,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC/C,OAAO,SAAS,CAAC;SACpB;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CACzC,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,CAAC,CAAC;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzC,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE;YACpC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;YAExG,OAAO,eAAe,GAAG,WAAW,CAAC,MAAO,CAAC;SAChD;aAAM;YACH,IAAI,oBAAoB,KAAK,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE;gBAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;aACnE;SACJ;IACL,CAAC;IAEO,eAAe,CAAC,KAAkB,EAAE,KAAiB,EAAE,UAAkB;QAC7E,IAAA,qBAAM,EAAC,KAAK,CAAC,UAAU,GAAG,uBAAe,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAE5F,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YAChD,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SAC/B;QAED,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAEO,WAAW,CACf,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,GAAW,EACX,QAA4B,EAC5B,WAAgB;QAEhB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,mBAAmB,GAAG,CAAC,OAAiB,EAAE,EAAE;YAC9C,IAAI,OAAO,CAAC,GAAG,KAAK,oCAAwB,EAAE;gBAC1C,UAAU,GAAG,IAAI,CAAC;aACrB;YACD,gEAAgE;YAChE,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,IAAiB,EAAE,EAAE;YACvC,UAAU,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;YAC/C,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,YAA0B,CAAC;QAC/B,MAAM,WAAW,GAAG,CAAC,UAAoB,EAAE,EAAE;YACzC,kEAAkE;YAClE,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;gBACjC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,oCAAwB,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;oBAC5F,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;oBACzE,0DAA0D;iBAC7D;gBACD,yEAAyE;gBACzE,mEAAmE;gBACnE,gDAAgD;qBAC3C,IAAI,CAAC,UAAU,CAAC,GAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;oBACjD,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;oBACnC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,GAAI,CAAC,CAAC;iBACjD;aACJ;QACL,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,OAA6B,EAAE,IAAY,EAAE,OAAsB,EAAE,EAAE;YACnF,MAAM,cAAc,GAAoB,EAAE,CAAC;YAC3C,IAAI,OAAO,EAAE;gBACT,wBAAwB;gBACxB,cAAc,CAAC,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBACzD,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC;aACjC;iBAAM;gBACH,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;aAClD;YACD,OAAO,cAAc,CAAC;QAC1B,CAAC,CAAC;QAEF,oDAAoD;QACpD,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YAClC,UAAU,GAAG,KAAK,CAAC;YACnB,IAAI,UAAU,CAAC,YAAY,GAAG,CAAC,EAAE;gBAC7B,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;gBACrB,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC/B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC/B,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;oBACvB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;oBACpC,IAAI,QAAQ,EAAE;wBACV,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;qBAC7C;iBACJ;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC;gBAErF,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE;oBACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC;wBACvD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU;wBACxC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;wBAChC,MAAM,EAAE,UAAU,CAAC,GAAG;qBACzB,CAAC,EAAE,CAAC,CAAC;iBACT;gBAED,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3B,WAAW,CAAC,UAAU,CAAC,CAAC;gBAExB,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC;aACxC;SACJ;IACL,CAAC;IAkBO,sBAAsB,CAAC,GAAW,EAAE,MAAc,EAAE,QAAgB;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,yCAA6B,EAChG,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,qCAAqC;IAC7B,QAAQ,CAAC,GAAW,EAAE,IAAgB,EAAE,GAAW;;QACvD,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,GAAG,KAAK,CAAC,EAAE;gBACX,4BAA4B;gBAC5B,kFAAkF;gBAClF,oFAAoF;gBACpF,oFAAoF;gBACpF,6DAA6D;gBAC7D,MAAM,MAAM,GAAG,GAAG,KAAK,oCAAwB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,oCAAwB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,GAAG,mCAAI,CAAC,CAAC;gBACnG,OAAO,MAAM,GAAG,MAAM,CAAC;aAC1B;YACD,OAAO,KAAK,CAAC;SAChB;aAAM;YACH,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAED,8EAA8E;IACtE,aAAa,CAAC,IAAgB,EAAE,UAAqC;QACzE,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC9B,OAAO,MAAM,EAAE;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,UAAkB,CAAC;YACvB,IAAI,KAAiB,CAAC;YACtB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,KAAK,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE;gBACpE,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC7B,IAAI,YAAY,EAAE;oBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;wBACjB,MAAM,UAAU,GAAG,KAAK,CAAC;wBACzB,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,mCAAuB,EACvE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;qBACnC;yBAAM;wBACH,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,mCAAuB,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;qBACnG;oBACD,IAAI,CAAC,EAAE,EAAE;wBACL,OAAO;qBACV;iBACJ;qBAAM;oBACH,YAAY,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;iBACxC;aACJ;YACD,SAAS,GAAG,MAAM,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;SAC1B;IACL,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,IAAgB,EAAE,UAAsC;QAC3E,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC9B,OAAO,MAAM,EAAE;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,UAAkB,CAAC;YACvB,IAAI,KAAiB,CAAC;YACtB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,KAAK,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;gBAC/D,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC7B,IAAI,YAAY,EAAE;oBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;wBACjB,MAAM,UAAU,GAAG,KAAK,CAAC;wBACzB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;qBACrD;yBAAM;wBACH,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC1B;oBACD,IAAI,CAAC,EAAE,EAAE;wBACL,OAAO;qBACV;iBACJ;qBAAM;oBACH,YAAY,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;iBACxC;aACJ;YACD,SAAS,GAAG,MAAM,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;SAC1B;IACL,CAAC;IAEO,aAAa,CACjB,KAAkB,EAAE,GAAW,EAAE,MAAc,EAAE,QAAgB,EAAE,GAAW,EAC9E,OAAsB;QACtB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,UAAkB,CAAC;QACvB,IAAI,KAAiB,CAAC;QACtB,IAAI,OAA+B,CAAC;QACpC,IAAI,SAAkC,CAAC;QACvC,KAAK,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YAC9D,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrD,IAAI,GAAG,KAAK,SAAS,EAAE;gBACnB,2CAA2C;gBAC3C,qDAAqD;gBACrD,SAAS;aACZ;YAED,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE;gBACrE,6BAA6B;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,MAAM,UAAU,GAAG,KAAK,CAAC;oBACzB,gBAAgB;oBAChB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EACnE,GAAG,EAAE,OAAO,CAAC,CAAC;oBAClB,IAAI,SAAS,KAAK,SAAS,EAAE;wBACzB,IAAI,OAAO,CAAC,eAAe,EAAE;4BACzB,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;yBAC5C;6BAAM;4BACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;yBAChD;wBACD,OAAO,SAAS,CAAC;qBACpB;yBAAM,IAAI,SAAS,KAAK,SAAS,CAAC,iBAAiB,EAAE;wBAClD,IAAI,IAAI,GAAG,CAAC,CAAC,4BAA4B;wBACzC,SAAS;qBACZ;yBAAM;wBACH,OAAO,GAAG,SAAS,CAAC;wBACpB,SAAS,GAAG,SAAS,CAAC;wBACtB,UAAU,EAAE,CAAC,CAAC,eAAe;qBAChC;iBACJ;qBAAM;oBACH,MAAM,OAAO,GAAG,KAAK,CAAC;oBACtB,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC5D,IAAI,cAAc,CAAC,cAAc,EAAE;wBAC/B,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;wBACpE,cAAc,CAAC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;qBACzD;oBACD,IAAI,cAAc,CAAC,IAAI,EAAE;wBACrB,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC;wBAC9B,UAAU,EAAE,CAAC,CAAC,eAAe;qBAChC;yBAAM;wBACH,YAAY;wBACZ,IAAI,OAAO,CAAC,eAAe,EAAE;4BACzB,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;yBAC5C;wBACD,OAAO,SAAS,CAAC;qBACpB;iBACJ;gBACD,MAAM;aACT;iBAAM;gBACH,IAAI,IAAI,GAAG,CAAC;aACf;SACJ;QACD,IAAI,CAAC,OAAO,EAAE;YACV,IAAI,IAAI,KAAK,CAAC,EAAE;gBACZ,IAAI,CAAC,GAAG,KAAK,oCAAwB,CAAC,IAAI,OAAO,CAAC,iBAAiB;oBAC/D,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;oBAClC,OAAO,SAAS,CAAC,iBAAiB,CAAC;iBACtC;qBAAM;oBACH,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC9D,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC;oBAC9B,qDAAqD;iBACxD;aACJ;SACJ;QACD,IAAI,OAAO,EAAE;YACT,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;gBAChD,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;aAC/B;YACD,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,UAAU,GAAG,uBAAe,EAAE;gBACpC,IAAI,SAAS,EAAE;oBACX,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;iBACtC;gBACD,IAAI,OAAO,CAAC,eAAe,EAAE;oBACzB,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;iBAC5C;qBAAM;oBACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;iBAChD;gBACD,OAAO,SAAS,CAAC;aACpB;iBAAM;gBACH,wDAAwD;gBACxD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aAC5B;SACJ;aAAM;YACH,OAAO,SAAS,CAAC;SACpB;IACL,CAAC;IAEO,KAAK,CAAC,IAAiB;QAC3B,MAAM,SAAS,GAAG,uBAAe,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,iDAAiD;QACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAChC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,SAAU,CAAC;SAC7C;QACD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,KAAkB;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;aAClC;SACJ;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACI,aAAa,CAChB,KAAa,EAAE,GAAW,EAAE,KAAkB,EAAE,WAAqC,EAAE,MAAc,EACrG,QAAgB,EAAE,GAAW,EAAE,MAA6B;QAC5D,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,aAAa,GAA6B,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,KAAK,oCAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,YAAsC,CAAC;QAE3C,MAAM,eAAe,GAAG,CAAC,OAAiB,EAAE,EAAE;YAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACzF,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;gBACjC,IAAI,GAAG,KAAK,oCAAwB,EAAE;oBAClC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;iBACzE;qBAAM;oBACH,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;wBACnC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;qBAClC;iBACJ;aACJ;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAElF,mCAAmC;QACnC,IAAI,IAAI,CAAC,sBAAsB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACzD,IAAI,CAAC,sBAAsB,CACvB,MAAM,EACN;gBACI,SAAS,EAAE,wBAAkB,CAAC,QAAQ;gBACtC,aAAa;aAChB,CAAC,CAAC;SACV;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,CAAC,GAAG,KAAK,oCAAwB,CAAC,EAAE;YACvE,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;gBACnC,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC;IAEM,gBAAgB,CACnB,KAAa,EACb,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,GAAW,EACX,SAAS,GAAG,KAAK,EACjB,MAA6B;QAE7B,IAAI,UAAU,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,YAA0B,CAAC;QAC/B,MAAM,eAAe,GAA6B,EAAE,CAAC;QACrD,MAAM,gBAAgB,GAAe,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,KAAK,oCAAwB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,MAAM,WAAW,GAAG,CAAC,OAAiB,EAAE,GAAW,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;YACjF,MAAM,mBAAmB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,mBAAmB,KAAK,SAAS,EAAE;gBACnC,UAAU,GAAG,IAAI,CAAC;gBAClB,IAAI,mBAAmB,CAAC,UAAU,KAAK,oCAAwB,EAAE;oBAC7D,6DAA6D;oBAC7D,sCAAsC;oBACtC,iCAAiC;oBACjC,kCAAkC;oBAClC,mBAAmB,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACvD,mBAAmB,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;iBACvC;qBAAM;oBACH,oDAAoD;oBACpD,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACvD;aACJ;iBAAM;gBACH,OAAO,CAAC,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtC,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC;gBACzB,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC;gBAEnC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;aACrC;YACD,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE;gBAC/C,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAClC;YAED,0EAA0E;YAC1E,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;gBACjC,IAAI,OAAO,CAAC,UAAU,KAAK,oCAAwB,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;oBAC5F,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;iBACzE;qBAAM;oBACH,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;wBACnC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;qBAClC;iBACJ;aACJ;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,gBAAgB,GAAG,CAAC,IAAiB,EAAE,GAAW,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;YACtF,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;aAC3C;iBAAM;gBACH,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;aAC/C;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACtG,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC3F,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE;YACpC,IAAI,CAAC,iCAAiC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SAC5D;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,sBAAsB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3D,IAAI,CAAC,sBAAsB,CACvB,MAAM,EACN;gBACI,SAAS,EAAE,wBAAkB,CAAC,MAAM;gBACpC,aAAa,EAAE,eAAe;aACjC,CAAC,CAAC;SACV;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,CAAC,GAAG,KAAK,oCAAwB,CAAC,EAAE;YACvE,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE;gBACnC,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC;IAEO,4BAA4B,CAAC,IAAiB,EAAE,KAAK,GAAG,KAAK;QACjE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YACjC,IAAI,CAAC,cAAc,GAAG,uCAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;SAC9F;IACL,CAAC;IAEM,4BAA4B,CAAC,IAAuB;;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,OAAO,EAAE;YACT,MAAM,WAAW,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,cAAc,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,yCAA6B,EACrE,yBAAa,CAAC,CAAC;aACtB;YACD,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IACM,4BAA4B,CAC/B,OAAiB,EAAE,MAAc,EAAE,OAAsB,EAAE,UAAmC,EAC9F,MAAc;;QAEd,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE;YACpB,IAAI,CAAC,IAAA,wCAAmB,EAAC,OAAO,EAAE,mBAAa,CAAC,aAAa,CAAC,EAAE;gBAC5D,MAAM,IAAI,4BAAU,CAAC,6EAA6E,CAAC,CAAC;aACvG;SACJ;QACD,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI,yCAAwB,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAE9B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAE7E,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,yCAA6B,EACrE,yBAAa,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,OAAiB,EAAE,IAAoB;QAC/D,IAAI,OAAO,CAAC,SAAS,EAAE;YACnB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,yCAA6B,EACrE,yBAAa,CAAC,CAAC;aACtB;SACJ;IACL,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,IAAoB;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAQ,CAAC;QAC9B,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE;YACZ,SAAS,GAAG,IAAI,yCAAwB,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QACD,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,yCAA6B,EACrE,yBAAa,CAAC,CAAC;IACvB,CAAC;IAEO,WAAW,CAAC,KAAkB;;QAClC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,cAAc,GAAG,IAAA,sBAAS,GAAU,CAAC;YAC/C,SAAS,CAAC,aAAa,GAAG,IAAA,sBAAS,GAAU,CAAC;YAC9C,SAAS,CAAC,WAAW,GAAG,EAAE,CAAC;SAC9B;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,GAAG,IAAI,MAAA,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,mCAAI,CAAC,CAAC;YACzC,IAAI,SAAS,EAAE;gBACX,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aAC5C;YACD,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC3C;SACJ;QACD,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;IAC7B,CAAC;IAEO,sBAAsB,CAC1B,UAAmC,EACnC,GAAW,EACX,QAAgB,EAChB,YAAY,GAAG,KAAK;QAEpB,IAAI,KAAK,GAA4B,UAAU,CAAC;QAChD,OAAO,KAAK,KAAK,SAAS,EAAE;YACxB,IAAI,YAAY,EAAE;gBACd,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;aAC5C;iBAAM;gBACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;aAChD;YACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;SACxB;IACL,CAAC;IAEO,iBAAiB,CAAC,IAAiB,EAAE,GAAW,EAAE,QAAgB;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IACI,IAAI,CAAC,YAAY,CAAC,aAAa;eAC5B,GAAG,KAAK,oCAAwB;eAChC,GAAG,KAAK,yCAA6B,EAC1C;YACE,IACI,IAAI,CAAC,cAAc,KAAK,SAAS;mBAC9B,SAAS,CAAC,OAAO,CAAC,iBAAiB;mBACnC,QAAQ,KAAK,2BAAe,EACjC;gBACE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aAC5E;iBAAM;gBACH,IAAI,CAAC,cAAc,GAAG,uCAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aACvF;SACJ;IACL,CAAC;IAEM,GAAG,CACN,OAAoC,EACpC,MAAc,EACd,QAAgB,EAChB,KAAkB;QAElB,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,QAAQ,CACX,OAAoC,EACpC,MAAc,EACd,QAAgB,EAChB,KAAkB,EAClB,KAAc,EACd,GAAY,EACZ,aAAsB,KAAK;QAE3B,IAAI,UAAU,EAAE;YACZ,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;aACxD;YACD,IAAI,GAAG,EAAE;gBACL,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;aACtD;SACJ;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC;IAEM,mBAAmB,CAAW,UAAgD;;QACjF,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;YACxB,0CAA0C;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAG,CAAC;YAChC,IAAI,KAAK,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,EAAE;gBACnC,OAAO;aACV;YACD,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE;gBACxB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE;oBAC3B,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;iBACnB;gBACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;oBACzB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;iBAC3E;gBAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;oBACnB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBAC5B;aACJ;YACD,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBACpF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,mCAAI,CAAC,CAAC;gBACtE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;oBACrD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;wBACjB,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EACtE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC5E,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;qBAC/B;yBAAM;wBACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;qBACpC;iBACJ;gBACD,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC;gBACjB,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;gBACnB,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC;gBACjB,KAAK,CAAC,UAAU,EAAE,CAAC;aACtB;iBAAM;gBACH,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE;oBAC7C,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;wBAC3D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;qBAC7B;oBACD,UAAU,CAAC,GAAG,EAAE,CAAC;iBACpB;aACJ;SACJ;IACL,CAAC;IAEO,OAAO,CACX,IAAiB,EAAE,OAAoC,EAAE,GAAW,EAAE,MAAc,EACpF,QAAgB,EAAE,KAAkB,EAAE,KAAc,EAAE,GAAY;;QAClE,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,MAAM,GAAG,CAAC,CAAC;SACd;QACD,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;SACnD;QACD,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,OAAO,CAAC,GAAG,EAAE;YACb,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,EAAE,EAAE;gBACL,4CAA4C;gBAC5C,OAAO,IAAI,CAAC;aACf;SACJ;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,mCAAI,CAAC,CAAC;YAC1D,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;gBACjD,6BAA6B;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,IAAI,EAAE,EAAE;wBACJ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;qBAClF;iBACJ;qBAAM;oBACH,IAAI,OAAO,CAAC,IAAI,EAAE;wBACd,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;qBACzE;iBACJ;aACJ;YACD,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM;aACT;YACD,IAAI,OAAO,CAAC,KAAK,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;aACrE;YACD,IAAI,IAAI,GAAG,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC;YACd,IAAI,IAAI,GAAG,CAAC;SACf;QACD,IAAI,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE;YACpB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SACxE;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAED,kFAAkF;IAClF,iFAAiF;IAC1E,eAAe,CAClB,KAAkB,EAClB,MAA2D,EAC3D,KAAmB;QAEnB,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;gBACf,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;gBACtB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;SACpD;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,oEAAoE;IAC5D,cAAc,CAClB,KAAkB,EAAE,UAAqC,EAAE,GAAW,EAAE,MAAc,EACtF,QAAgB;QAChB,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,IAAI,EAAE,EAAE;gBACJ,6BAA6B;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;oBACjB,IAAI,EAAE,EAAE;wBACJ,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;qBACtE;iBACJ;qBAAM;oBACH,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;iBAClE;aACJ;YACD,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM;aACT;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;;AAnxDL,8BAoxDC;AAnxD2B,iCAAuB,GAAG,CAAC,CAAC;AAC7B,iBAAO,GAAG;IAC7B,iBAAiB,EAAE,IAAI;IACvB,sBAAsB,EAAE,IAAI;IAC5B,eAAe,EAAE,IAAI;CACxB,CAAC;AAGsB,2BAAiB,GAAgB,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC","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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/* eslint-disable @typescript-eslint/prefer-optional-chain, no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport {\n Comparer,\n Heap,\n List,\n ListMakeHead,\n Stack,\n} from \"./collections\";\nimport {\n LocalClientId,\n NonCollabClient,\n TreeMaintenanceSequenceNumber,\n UnassignedSequenceNumber,\n UniversalSequenceNumber,\n} from \"./constants\";\nimport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nimport {\n IMergeTreeDeltaOpArgs,\n IMergeTreeSegmentDelta,\n MergeTreeDeltaCallback,\n MergeTreeMaintenanceCallback,\n MergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback\";\nimport { TrackingGroupCollection } from \"./mergeTreeTracking\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMarkerDef,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PartialSequenceLengths } from \"./partialLengths\";\nimport {\n clone,\n createMap,\n extend,\n extendIfUndefined,\n MapLike,\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n refTypeIncludesFlag,\n RangeStackMap,\n ReferencePosition,\n refGetRangeLabels,\n refGetTileLabels,\n refHasRangeLabel,\n refHasRangeLabels,\n refHasTileLabel,\n refHasTileLabels,\n } from \"./referencePositions\";\nimport { SegmentGroupCollection } from \"./segmentGroupCollection\";\nimport { PropertiesManager } from \"./segmentPropertiesManager\";\nimport { Client } from \"./client\";\n\nexport interface IMergeNodeCommon {\n parent?: IMergeBlock;\n /**\n * The length of the contents of the node.\n */\n cachedLength: number;\n index: number;\n ordinal: string;\n isLeaf(): this is ISegment;\n}\n\nexport type IMergeNode = IMergeBlock | ISegment;\n\n// Node with segments as children\nexport interface IMergeBlock extends IMergeNodeCommon {\n needsScour?: boolean;\n childCount: number;\n children: IMergeNode[];\n partialLengths?: PartialSequenceLengths;\n hierBlock(): IHierBlock | undefined;\n assignChild(child: IMergeNode, index: number, updateOrdinal?: boolean): void;\n setOrdinal(child: IMergeNode, index: number): void;\n}\n\nexport interface IHierBlock extends IMergeBlock {\n hierToString(indentCount: number): string;\n addNodeReferences(mergeTree: MergeTree, node: IMergeNode): void;\n rightmostTiles: MapLike<ReferencePosition>;\n leftmostTiles: MapLike<ReferencePosition>;\n rangeStacks: RangeStackMap;\n}\n\nexport interface IRemovalInfo {\n removedSeq: number;\n removedClientIds: number[];\n}\nexport function toRemovalInfo(maybe: Partial<IRemovalInfo> | undefined): IRemovalInfo | undefined {\n if (maybe?.removedClientIds !== undefined && maybe?.removedSeq !== undefined) {\n return maybe as IRemovalInfo;\n }\n assert(maybe?.removedClientIds === undefined && maybe?.removedSeq === undefined,\n 0x2bf /* \"both removedClientIds and removedSeq should be set or not set\" */);\n}\n\nfunction isRemoved(segment: ISegment): boolean {\n return toRemovalInfo(segment) !== undefined;\n}\n\nfunction isRemovedAndAcked(segment: ISegment): boolean {\n const removalInfo = toRemovalInfo(segment);\n return removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;\n}\n\n/**\n * A segment representing a portion of the merge tree.\n */\nexport interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo> {\n readonly type: string;\n readonly segmentGroups: SegmentGroupCollection;\n readonly trackingCollection: TrackingGroupCollection;\n propertyManager?: PropertiesManager;\n localSeq?: number;\n localRemovedSeq?: number;\n seq?: number; // If not present assumed to be previous to window min\n clientId: number;\n localRefs?: LocalReferenceCollection;\n properties?: PropertySet;\n addProperties(\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collabWindow?: CollaborationWindow,\n ): PropertySet | undefined;\n clone(): ISegment;\n canAppend(segment: ISegment): boolean;\n append(segment: ISegment): void;\n splitAt(pos: number): ISegment | undefined;\n toJSONObject(): any;\n /**\n * Acks the current segment against the segment group, op, and merge tree.\n *\n * Throws error if the segment state doesn't match segment group or op.\n * E.g. Segment group not first is pending queue.\n * Inserted segment does not have unassigned sequence number.\n *\n * Returns true if the op modifies the segment, otherwise false.\n * The only current false case is overlapping remove, where a segment is removed\n * by a previously sequenced operation before the current operation is acked.\n */\n ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean;\n}\n\nexport interface IMarkerModifiedAction {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (marker: Marker): void;\n}\n\nexport interface ISegmentAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accum: TClientData): boolean;\n}\n\nexport interface ISegmentChanges {\n next?: ISegment;\n replaceCurrent?: ISegment;\n}\n\nexport interface BlockAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n block: IMergeBlock,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n accum: TClientData,\n ): boolean;\n}\n\nexport interface NodeAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n node: IMergeNode,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n clientData: TClientData,\n ): boolean;\n}\n\nexport interface IncrementalSegmentAction<TContext> {\n (segment: ISegment, state: IncrementalMapState<TContext>);\n}\n\nexport interface IncrementalBlockAction<TContext> {\n (state: IncrementalMapState<TContext>);\n}\n\nexport interface BlockUpdateActions {\n child: (block: IMergeBlock, index: number) => void;\n}\n\nexport interface InsertContext {\n candidateSegment?: ISegment;\n prepareEvents?: boolean;\n structureChange?: boolean;\n leaf: (segment: ISegment | undefined, pos: number, ic: InsertContext) => ISegmentChanges;\n continuePredicate?: (continueFromBlock: IMergeBlock) => boolean;\n}\n\nexport interface SegmentActions<TClientData> {\n leaf?: ISegmentAction<TClientData>;\n shift?: NodeAction<TClientData>;\n contains?: NodeAction<TClientData>;\n pre?: BlockAction<TClientData>;\n post?: BlockAction<TClientData>;\n}\n\nexport interface IncrementalSegmentActions<TContext> {\n leaf: IncrementalSegmentAction<TContext>;\n pre?: IncrementalBlockAction<TContext>;\n post?: IncrementalBlockAction<TContext>;\n}\n\nexport interface SearchResult {\n text: string;\n pos: number;\n}\n\nexport interface MergeTreeStats {\n maxHeight: number;\n nodeCount: number;\n leafCount: number;\n removedLeafCount: number;\n liveCount: number;\n histo: number[];\n windowTime?: number;\n packTime?: number;\n ordTime?: number;\n maxOrdTime?: number;\n}\n\nexport interface SegmentGroup {\n segments: ISegment[];\n localSeq: number;\n}\n\nexport class MergeNode implements IMergeNodeCommon {\n index: number = 0;\n ordinal: string = \"\";\n parent?: IMergeBlock;\n cachedLength: number = 0;\n\n isLeaf() {\n return false;\n }\n}\n\nfunction addTile(tile: ReferencePosition, tiles: object) {\n const tileLabels = refGetTileLabels(tile);\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n tiles[tileLabel] = tile;\n }\n }\n}\n\nfunction addTileIfNotPresent(tile: ReferencePosition, tiles: object) {\n const tileLabels = refGetTileLabels(tile);\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n if (tiles[tileLabel] === undefined) {\n tiles[tileLabel] = tile;\n }\n }\n }\n}\n\nfunction applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeStackMap) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const label in deltaStackMap) {\n const deltaStack = deltaStackMap[label];\n if (!deltaStack.empty()) {\n let currentStack = currentStackMap[label];\n if (currentStack === undefined) {\n currentStack = new Stack<ReferencePosition>();\n currentStackMap[label] = currentStack;\n }\n for (const delta of deltaStack.items) {\n applyRangeReference(currentStack, delta);\n }\n }\n }\n}\n\nfunction applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {\n if (refTypeIncludesFlag(delta, ReferenceType.NestBegin)) {\n stack.push(delta);\n return true;\n } else {\n // Assume delta is end reference\n const top = stack.top();\n // TODO: match end with begin\n if (top && (refTypeIncludesFlag(top, ReferenceType.NestBegin))) {\n stack.pop();\n } else {\n stack.push(delta);\n }\n return false;\n }\n}\n\nfunction addNodeReferences(\n mergeTree: MergeTree, node: IMergeNode,\n rightmostTiles: MapLike<ReferencePosition>,\n leftmostTiles: MapLike<ReferencePosition>, rangeStacks: RangeStackMap) {\n function updateRangeInfo(label: string, refPos: ReferencePosition) {\n let stack = rangeStacks[label];\n if (stack === undefined) {\n stack = new Stack<ReferencePosition>();\n rangeStacks[label] = stack;\n }\n applyRangeReference(stack, refPos);\n }\n if (node.isLeaf()) {\n const segment = node;\n if ((mergeTree.localNetLength(segment) ?? 0) > 0) {\n if (Marker.is(segment)) {\n const markerId = segment.getId();\n // Also in insertMarker but need for reload segs case\n // can add option for this only from reload segs\n if (markerId) {\n mergeTree.mapIdToSegment(markerId, segment);\n }\n if (refTypeIncludesFlag(segment, ReferenceType.Tile)) {\n addTile(segment, rightmostTiles);\n addTileIfNotPresent(segment, leftmostTiles);\n }\n if (segment.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n const rangeLabels = refGetRangeLabels(segment);\n if (rangeLabels) {\n for (const label of rangeLabels) {\n updateRangeInfo(label, segment);\n }\n }\n }\n } else {\n const baseSegment = node as BaseSegment;\n if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&\n (baseSegment.localRefs.hierRefCount > 0)) {\n for (const lref of baseSegment.localRefs) {\n if (refTypeIncludesFlag(lref, ReferenceType.Tile)) {\n addTile(lref, rightmostTiles);\n addTileIfNotPresent(lref, leftmostTiles);\n }\n if (lref.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n for (const label of refGetRangeLabels(lref)!) {\n updateRangeInfo(label, lref);\n }\n }\n }\n }\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(rangeStacks, block.rangeStacks);\n extend(rightmostTiles, block.rightmostTiles);\n extendIfUndefined(leftmostTiles, block.leftmostTiles);\n }\n}\n\nexport function ordinalToArray(ord: string) {\n const a: number[] = [];\n if (ord) {\n for (let i = 0, len = ord.length; i < len; i++) {\n a.push(ord.charCodeAt(i));\n }\n }\n return a;\n}\n\n// Note that the actual branching factor of the MergeTree is `MaxNodesInBlock - 1`. This is because\n// the MergeTree always inserts first, then checks for overflow and splits if the child count equals\n// `MaxNodesInBlock`. (i.e., `MaxNodesInBlock` contains 1 extra slot for temporary storage to\n// facilitate splits.)\nexport const MaxNodesInBlock = 8;\n\nexport class MergeBlock extends MergeNode implements IMergeBlock {\n public children: IMergeNode[];\n public constructor(public childCount: number) {\n super();\n this.children = new Array<IMergeNode>(MaxNodesInBlock);\n }\n\n public hierBlock(): HierMergeBlock | undefined {\n return undefined;\n }\n\n public setOrdinal(child: IMergeNode, index: number) {\n let childCount = this.childCount;\n if (childCount === 8) {\n childCount = 7;\n }\n assert((childCount >= 1) && (childCount <= 7), 0x040 /* \"Child count is not within [1,7] range!\" */);\n let localOrdinal: number;\n const ordinalWidth = 1 << (MaxNodesInBlock - (childCount + 1));\n if (index === 0) {\n localOrdinal = ordinalWidth - 1;\n } else {\n const prevOrd = this.children[index - 1].ordinal;\n const prevOrdCode = prevOrd.charCodeAt(prevOrd.length - 1);\n localOrdinal = prevOrdCode + ordinalWidth;\n }\n child.ordinal = this.ordinal + String.fromCharCode(localOrdinal);\n assert(child.ordinal.length === (this.ordinal.length + 1), 0x041 /* \"Unexpected child ordinal length!\" */);\n if (index > 0) {\n assert(\n child.ordinal > this.children[index - 1].ordinal,\n 0x042, /* \"Child ordinal <= previous sibling ordinal!\" */\n );\n }\n }\n\n public assignChild(child: IMergeNode, index: number, updateOrdinal = true) {\n child.parent = this;\n child.index = index;\n if (updateOrdinal) {\n this.setOrdinal(child, index);\n }\n this.children[index] = child;\n }\n}\n\nclass HierMergeBlock extends MergeBlock implements IMergeBlock {\n public rightmostTiles: MapLike<ReferencePosition>;\n public leftmostTiles: MapLike<ReferencePosition>;\n public rangeStacks: MapLike<Stack<ReferencePosition>>;\n\n constructor(childCount: number) {\n super(childCount);\n this.rightmostTiles = createMap<ReferencePosition>();\n this.leftmostTiles = createMap<ReferencePosition>();\n this.rangeStacks = createMap<Stack<ReferencePosition>>();\n }\n\n public addNodeReferences(mergeTree: MergeTree, node: IMergeNode) {\n addNodeReferences(mergeTree, node, this.rightmostTiles, this.leftmostTiles,\n this.rangeStacks);\n }\n\n public hierBlock() {\n return this;\n }\n\n public hierToString(indentCount: number) {\n let strbuf = \"\";\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in this.rangeStacks) {\n const stack = this.rangeStacks[key];\n strbuf += internedSpaces(indentCount);\n strbuf += `${key}: `;\n for (const item of stack.items) {\n strbuf += `${item.toString()} `;\n }\n strbuf += \"\\n\";\n }\n return strbuf;\n }\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode) {\n if (!node.isLeaf()) {\n return node.cachedLength;\n }\n return mergeTree.localNetLength(node);\n}\n\nexport abstract class BaseSegment extends MergeNode implements ISegment {\n public clientId: number = LocalClientId;\n public seq: number = UniversalSequenceNumber;\n public removedSeq?: number;\n public removedClientIds?: number[];\n public readonly segmentGroups: SegmentGroupCollection = new SegmentGroupCollection(this);\n public readonly trackingCollection: TrackingGroupCollection = new TrackingGroupCollection(this);\n public propertyManager?: PropertiesManager;\n public properties?: PropertySet;\n public localRefs?: LocalReferenceCollection;\n public abstract readonly type: string;\n public localSeq?: number;\n public localRemovedSeq?: number;\n\n public addProperties(newProps: PropertySet, op?: ICombiningOp, seq?: number, collabWindow?: CollaborationWindow) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(\n this.properties,\n newProps,\n op,\n seq,\n collabWindow && collabWindow.collaborating,\n );\n }\n\n public hasProperty(key: string): boolean {\n return !!this.properties && (this.properties[key] !== undefined);\n }\n\n public isLeaf() {\n return true;\n }\n\n protected cloneInto(b: ISegment) {\n b.clientId = this.clientId;\n // TODO: deep clone properties\n b.properties = clone(this.properties);\n b.removedClientIds = this.removedClientIds?.slice();\n // TODO: copy removed client overlap and branch removal info\n b.removedSeq = this.removedSeq;\n b.seq = this.seq;\n }\n\n public canAppend(segment: ISegment): boolean {\n return false;\n }\n\n protected addSerializedProps(jseg: IJSONSegment) {\n if (this.properties) {\n jseg.props = this.properties;\n }\n }\n\n public abstract toJSONObject(): any;\n\n public ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean {\n const currentSegmentGroup = this.segmentGroups.dequeue();\n assert(currentSegmentGroup === segmentGroup, 0x043 /* \"On ack, unexpected segmentGroup!\" */);\n switch (opArgs.op.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(!!this.propertyManager, 0x044 /* \"On annotate ack, missing segment property manager!\" */);\n this.propertyManager.ackPendingProperties(opArgs.op);\n return true;\n\n case MergeTreeDeltaType.INSERT:\n assert(this.seq === UnassignedSequenceNumber, 0x045 /* \"On insert, seq number already assigned!\" */);\n this.seq = opArgs.sequencedMessage!.sequenceNumber;\n this.localSeq = undefined;\n return true;\n\n case MergeTreeDeltaType.REMOVE:\n const removalInfo: IRemovalInfo | undefined = toRemovalInfo(this);\n assert(removalInfo !== undefined, 0x046 /* \"On remove ack, missing removal info!\" */);\n this.localRemovedSeq = undefined;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n removalInfo.removedSeq = opArgs.sequencedMessage!.sequenceNumber;\n return true;\n }\n return false;\n\n default:\n throw new Error(`${opArgs.op.type} is in unrecognized operation type`);\n }\n }\n\n public splitAt(pos: number): ISegment | undefined {\n if (pos > 0) {\n const leafSegment = this.createSplitSegmentAt(pos);\n if (leafSegment) {\n this.copyPropertiesTo(leafSegment);\n leafSegment.parent = this.parent;\n\n // Give the leaf a temporary yet valid ordinal.\n // when this segment is put in the tree, it will get it's real ordinal,\n // but this ordinal meets all the necessary invariants for now.\n leafSegment.ordinal = this.ordinal + String.fromCharCode(0);\n\n leafSegment.removedClientIds = this.removedClientIds?.slice();\n leafSegment.removedSeq = this.removedSeq;\n leafSegment.localRemovedSeq = this.localRemovedSeq;\n leafSegment.seq = this.seq;\n leafSegment.localSeq = this.localSeq;\n leafSegment.clientId = this.clientId;\n this.segmentGroups.copyTo(leafSegment);\n this.trackingCollection.copyTo(leafSegment);\n if (this.localRefs) {\n this.localRefs.split(pos, leafSegment);\n }\n }\n return leafSegment;\n }\n }\n\n private copyPropertiesTo(other: ISegment) {\n if (this.propertyManager) {\n if (this.properties) {\n other.propertyManager = new PropertiesManager();\n other.properties = this.propertyManager.copyTo(\n this.properties,\n other.properties,\n other.propertyManager,\n );\n }\n }\n }\n\n public abstract clone(): ISegment;\n public abstract append(segment: ISegment): void;\n protected abstract createSplitSegmentAt(pos: number): BaseSegment | undefined;\n}\n\nexport const reservedMarkerIdKey = \"markerId\";\nexport const reservedMarkerSimpleTypeKey = \"markerSimpleType\";\n\nexport interface IJSONMarkerSegment extends IJSONSegment {\n marker: IMarkerDef;\n}\n\nexport class Marker extends BaseSegment implements ReferencePosition {\n public static readonly type = \"Marker\";\n public static is(segment: ISegment): segment is Marker {\n return segment.type === Marker.type;\n }\n public readonly type = Marker.type;\n\n public static make(\n refType: ReferenceType, props?: PropertySet) {\n const marker = new Marker(refType);\n if (props) {\n marker.addProperties(props);\n }\n return marker;\n }\n\n constructor(public refType: ReferenceType) {\n super();\n this.cachedLength = 1;\n }\n\n toJSONObject() {\n const obj: IJSONMarkerSegment = { marker: { refType: this.refType } };\n super.addSerializedProps(obj);\n return obj;\n }\n\n static fromJSONObject(spec: any) {\n if (spec && typeof spec === \"object\" && \"marker\" in spec) {\n return Marker.make(\n spec.marker.refType,\n spec.props as PropertySet);\n }\n return undefined;\n }\n\n clone() {\n const b = Marker.make(this.refType, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n getSegment() {\n return this;\n }\n\n getOffset() {\n return 0;\n }\n\n hasSimpleType(simpleTypeName: string) {\n return !!this.properties &&\n this.properties[reservedMarkerSimpleTypeKey] === simpleTypeName;\n }\n\n getProperties() {\n return this.properties;\n }\n\n getId(): string | undefined {\n if (this.properties && this.properties[reservedMarkerIdKey]) {\n return this.properties[reservedMarkerIdKey] as string;\n }\n }\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels() {\n return refHasTileLabels(this);\n }\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels() {\n return refHasRangeLabels(this);\n }\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean {\n return refHasTileLabel(this, label);\n }\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean {\n return refHasRangeLabel(this, label);\n }\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined {\n return refGetTileLabels(this);\n }\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined {\n return refGetRangeLabels(this);\n }\n\n toString() {\n let bbuf = \"\";\n if (refTypeIncludesFlag(this, ReferenceType.Tile)) {\n bbuf += \"Tile\";\n }\n if (refTypeIncludesFlag(this, ReferenceType.NestBegin)) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeBegin\";\n }\n if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeEnd\";\n }\n let lbuf = \"\";\n const id = this.getId();\n if (id) {\n bbuf += ` (${id}) `;\n }\n const tileLabels = refGetTileLabels(this);\n if (tileLabels) {\n lbuf += \"tile -- \";\n for (let i = 0, len = tileLabels.length; i < len; i++) {\n const tileLabel = tileLabels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += tileLabel;\n }\n }\n const rangeLabels = refGetRangeLabels(this);\n if (rangeLabels) {\n let rangeKind = \"begin\";\n if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {\n rangeKind = \"end\";\n }\n if (tileLabels) {\n lbuf += \" \";\n }\n lbuf += `range ${rangeKind} -- `;\n const labels = rangeLabels;\n for (let i = 0, len = labels.length; i < len; i++) {\n const rangeLabel = labels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += rangeLabel;\n }\n }\n let pbuf = \"\";\n if (this.properties) {\n pbuf += JSON.stringify(this.properties, (key, value) => {\n // Avoid circular reference when stringifying makers containing handles.\n // (Substitute a debug string instead.)\n const handle = !!value && value.IFluidHandle;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return handle\n ? `#Handle(${handle.routeContext.path}/${handle.path})`\n : value;\n });\n }\n return `M ${bbuf}: ${lbuf} ${pbuf}`;\n }\n\n protected createSplitSegmentAt(pos: number) {\n return undefined;\n }\n\n canAppend(segment: ISegment): boolean {\n return false;\n }\n\n append() { throw new Error(\"Can not append to marker\"); }\n}\n\nexport enum IncrementalExecOp {\n Go,\n Stop,\n Yield,\n}\n\nexport class IncrementalMapState<TContext> {\n op = IncrementalExecOp.Go;\n constructor(\n public block: IMergeBlock,\n public actions: IncrementalSegmentActions<TContext>,\n public pos: number,\n public refSeq: number,\n public clientId: number,\n public context: TContext,\n public start: number,\n public end: number,\n public childIndex = 0,\n ) {\n }\n}\n\nexport class CollaborationWindow {\n clientId = LocalClientId;\n collaborating = false;\n // Lowest-numbered segment in window; no client can reference a state before this one\n minSeq = 0;\n // Highest-numbered segment in window and current\n // reference segment for this client\n currentSeq = 0;\n\n localSeq = 0;\n\n loadFrom(a: CollaborationWindow) {\n this.clientId = a.clientId;\n this.collaborating = a.collaborating;\n this.minSeq = a.minSeq;\n this.currentSeq = a.currentSeq;\n }\n}\n\nexport const compareNumbers = (a: number, b: number) => a - b;\n\nexport const compareStrings = (a: string, b: string) => a.localeCompare(b);\n\nconst indentStrings = [\"\", \" \", \" \"];\nexport function internedSpaces(n: number) {\n if (indentStrings[n] === undefined) {\n indentStrings[n] = \"\";\n for (let i = 0; i < n; i++) {\n indentStrings[n] += \" \";\n }\n }\n return indentStrings[n];\n}\n\nexport interface IConsensusInfo {\n marker: Marker;\n callback: (m: Marker) => void;\n}\n\nexport interface ClientSeq {\n refSeq: number;\n clientId: string;\n}\n\nexport const clientSeqComparer: Comparer<ClientSeq> = {\n min: { refSeq: -1, clientId: \"\" },\n compare: (a, b) => a.refSeq - b.refSeq,\n};\n\nexport interface LRUSegment {\n segment?: ISegment;\n maxSeq: number;\n}\n\nconst LRUSegmentComparer: Comparer<LRUSegment> = {\n min: { maxSeq: -2 },\n compare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\nexport interface SegmentAccumulator {\n segments: ISegment[];\n}\n\ninterface IReferenceSearchInfo {\n mergeTree: MergeTree;\n tileLabel: string;\n posPrecedesTile?: boolean;\n tile?: ReferencePosition;\n}\n\ninterface IMarkerSearchRangeInfo {\n mergeTree: MergeTree;\n rangeLabels: string[];\n stacks: RangeStackMap;\n}\n\nfunction applyLeafRangeMarker(marker: Marker, searchInfo: IMarkerSearchRangeInfo) {\n for (const rangeLabel of searchInfo.rangeLabels) {\n if (refHasRangeLabel(marker, rangeLabel)) {\n let currentStack = searchInfo.stacks[rangeLabel];\n if (currentStack === undefined) {\n currentStack = new Stack<Marker>();\n searchInfo.stacks[rangeLabel] = currentStack;\n }\n applyRangeReference(currentStack, marker);\n }\n }\n}\nfunction recordRangeLeaf(\n segment: ISegment, segpos: number,\n refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n searchInfo: IMarkerSearchRangeInfo) {\n if (Marker.is(segment)) {\n if (segment.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(segment, searchInfo);\n }\n }\n return false;\n}\n\nfunction rangeShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IMarkerSearchRangeInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if (((searchInfo.mergeTree.localNetLength(seg) ?? 0) > 0) && Marker.is(seg)) {\n if (seg.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(seg, searchInfo);\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(searchInfo.stacks, block.rangeStacks);\n }\n return true;\n}\n\nfunction recordTileStart(\n segment: ISegment,\n segpos: number,\n refSeq: number,\n clientId: number,\n start: number,\n end: number,\n searchInfo: IReferenceSearchInfo) {\n if (Marker.is(segment)) {\n if (refHasTileLabel(segment, searchInfo.tileLabel)) {\n searchInfo.tile = segment;\n }\n }\n return false;\n}\n\nfunction tileShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IReferenceSearchInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) > 0) && Marker.is(seg)) {\n if (refHasTileLabel(seg, searchInfo.tileLabel)) {\n searchInfo.tile = seg;\n }\n }\n } else {\n const block = <IHierBlock>node;\n let marker: Marker;\n if (searchInfo.posPrecedesTile) {\n marker = <Marker>block.rightmostTiles[searchInfo.tileLabel];\n } else {\n marker = <Marker>block.leftmostTiles[searchInfo.tileLabel];\n }\n if (marker !== undefined) {\n searchInfo.tile = marker;\n }\n }\n return true;\n}\n\nexport interface MinListener {\n minRequired: number;\n onMinGE(minSeq: number): void;\n}\n\nconst minListenerComparer: Comparer<MinListener> = {\n min: { minRequired: Number.MIN_VALUE, onMinGE: () => { assert(false, 0x048 /* \"onMinGE()\" */); } },\n compare: (a, b) => a.minRequired - b.minRequired,\n};\n\nexport type LocalReferenceMapper = (id: string) => LocalReference;\n\n// Represents a sequence of text segments\nexport class MergeTree {\n private static readonly zamboniSegmentsMaxCount = 2;\n public static readonly options = {\n incrementalUpdate: true,\n insertAfterRemovedSegs: true,\n zamboniSegments: true,\n };\n\n private static readonly initBlockUpdateActions: BlockUpdateActions;\n private static readonly theUnfinishedNode = <IMergeBlock>{ childCount: -1 };\n\n root: IMergeBlock;\n private readonly blockUpdateActions: BlockUpdateActions = MergeTree.initBlockUpdateActions;\n public readonly collabWindow = new CollaborationWindow();\n public pendingSegments: List<SegmentGroup> | undefined;\n private segmentsToScour: Heap<LRUSegment> | undefined;\n // TODO: add remove on segment remove\n // for now assume only markers have ids and so point directly at the Segment\n // if we need to have pointers to non-markers, we can change to point at local refs\n private readonly idToSegment = new Map<string, ISegment>();\n private minSeqListeners: Heap<MinListener> | undefined;\n public mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n public mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n // TODO: make and use interface describing options\n public constructor(public options?: PropertySet) {\n this.root = this.makeBlock(0);\n }\n\n private makeBlock(childCount: number) {\n const block: MergeBlock = new HierMergeBlock(childCount);\n block.ordinal = \"\";\n return block;\n }\n\n public clone() {\n const b = new MergeTree(this.options);\n // For now assume that b will not collaborate\n b.root = b.blockClone(this.root);\n }\n\n public blockClone(block: IMergeBlock, segments?: ISegment[]) {\n const bBlock = this.makeBlock(block.childCount);\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n const segment = this.segmentClone(child);\n bBlock.assignChild(segment, i);\n if (segments) {\n segments.push(segment);\n }\n } else {\n bBlock.assignChild(this.blockClone(child, segments), i);\n }\n }\n this.nodeUpdateLengthNewStructure(bBlock);\n this.nodeUpdateOrdinals(bBlock);\n return bBlock;\n }\n\n private segmentClone(segment: ISegment) {\n const b = segment.clone();\n return b;\n }\n\n public localNetLength(segment: ISegment) {\n const removalInfo = toRemovalInfo(segment);\n if (removalInfo !== undefined) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n }\n\n // TODO: remove id when segment removed\n public mapIdToSegment(id: string, segment: ISegment) {\n this.idToSegment.set(id, segment);\n }\n\n private addNode(block: IMergeBlock, node: IMergeNode) {\n const index = block.childCount++;\n block.assignChild(node, index, false);\n return index;\n }\n\n /* eslint-disable max-len */\n public reloadFromSegments(segments: ISegment[]) {\n // This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n assert(!this.collabWindow.collaborating, 0x049 /* \"Trying to reload from segments while collaborating!\" */);\n\n const maxChildren = MaxNodesInBlock - 1;\n\n // Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n const buildMergeBlock = (nodes: IMergeNode[]) => {\n const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n const blocks: IMergeBlock[] = new Array(blockCount); // Pre-alloc array to collect nodes\n\n // For each block in this level of the B-Tree...\n for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n blockIndex++ // Advance to next block in this layer.\n ) {\n const block = blocks[blockIndex] = this.makeBlock(0);\n\n // For each child of the current block, insert a node (while we have nodes left)\n // and update the block's info.\n for (let childIndex = 0;\n childIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n childIndex++, nodeIndex++ // Advance to next child & node\n ) {\n // Insert the next node into the current block\n this.addNode(block, nodes[nodeIndex]);\n }\n\n // Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n // but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n // snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n this.blockUpdate(block);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return blocks.length === 1 // If there is only one block at this layer...\n ? blocks[0] // ...then we're done. Return the root.\n : buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n };\n if (segments.length > 0) {\n this.root = buildMergeBlock(segments);\n this.nodeUpdateOrdinals(this.root);\n } else {\n this.root = this.makeBlock(0);\n }\n }\n /* eslint-enable max-len */\n\n // For now assume min starts at zero\n public startCollaboration(localClientId: number, minSeq: number, currentSeq: number) {\n this.collabWindow.clientId = localClientId;\n this.collabWindow.minSeq = minSeq;\n this.collabWindow.collaborating = true;\n this.collabWindow.currentSeq = currentSeq;\n this.segmentsToScour = new Heap<LRUSegment>([], LRUSegmentComparer);\n this.pendingSegments = ListMakeHead<SegmentGroup>();\n this.nodeUpdateLengthNewStructure(this.root, true);\n }\n\n private addToLRUSet(segment: ISegment, seq: number) {\n // If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n // add the segment and mark the mark the node now.\n\n // TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n // segments from a snapshot. We currently skip these for now.\n if (segment.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n segment.parent!.needsScour = true;\n this.segmentsToScour!.add({ segment, maxSeq: seq });\n }\n }\n\n private underflow(node: IMergeBlock) {\n return node.childCount < (MaxNodesInBlock / 2);\n }\n\n private scourNode(node: IMergeBlock, holdNodes: IMergeNode[]) {\n let prevSegment: ISegment | undefined;\n for (let k = 0; k < node.childCount; k++) {\n const childNode = node.children[k];\n if (childNode.isLeaf()) {\n const segment = childNode;\n if (segment.segmentGroups.empty) {\n if (segment.removedSeq !== undefined) {\n if (segment.removedSeq > this.collabWindow.minSeq) {\n holdNodes.push(segment);\n } else if (!segment.trackingCollection.empty) {\n holdNodes.push(segment);\n } else {\n // Notify maintenance event observers that the segment is being unlinked from the MergeTree\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n operation: MergeTreeMaintenanceType.UNLINK,\n deltaSegments: [{ segment }],\n },\n undefined,\n );\n }\n\n segment.parent = undefined;\n }\n prevSegment = undefined;\n } else {\n if (segment.seq! <= this.collabWindow.minSeq) {\n const canAppend = prevSegment\n && prevSegment.canAppend(segment)\n && matchProperties(prevSegment.properties, segment.properties)\n && prevSegment.trackingCollection.matches(segment.trackingCollection)\n && this.localNetLength(segment) > 0;\n\n if (canAppend) {\n prevSegment!.append(segment);\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n operation: MergeTreeMaintenanceType.APPEND,\n deltaSegments: [{ segment: prevSegment! }, { segment }],\n },\n undefined,\n );\n }\n segment.parent = undefined;\n segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));\n } else {\n holdNodes.push(segment);\n if (this.localNetLength(segment) > 0) {\n prevSegment = segment;\n } else {\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n } else {\n holdNodes.push(childNode);\n prevSegment = undefined;\n }\n }\n }\n\n // Interior node with all node children\n private packParent(parent: IMergeBlock) {\n const children = parent.children;\n let childIndex: number;\n let childBlock: IMergeBlock;\n const holdNodes: IMergeNode[] = [];\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n // Debug assert not isLeaf()\n childBlock = <IMergeBlock>children[childIndex];\n this.scourNode(childBlock, holdNodes);\n // Will replace this block with a packed block\n childBlock.parent = undefined;\n }\n const totalNodeCount = holdNodes.length;\n const halfCount = MaxNodesInBlock / 2;\n let childCount = Math.min(MaxNodesInBlock - 1, Math.floor(totalNodeCount / halfCount));\n if (childCount < 1) {\n childCount = 1;\n }\n const baseCount = Math.floor(totalNodeCount / childCount);\n let extraCount = totalNodeCount % childCount;\n const packedBlocks = new Array<IMergeBlock>(MaxNodesInBlock);\n let readCount = 0;\n for (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n let nodeCount = baseCount;\n if (extraCount > 0) {\n nodeCount++;\n extraCount--;\n }\n const packedBlock = this.makeBlock(nodeCount);\n for (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n const nodeToPack = holdNodes[readCount++];\n packedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n }\n packedBlock.parent = parent;\n packedBlocks[nodeIndex] = packedBlock;\n this.nodeUpdateLengthNewStructure(packedBlock);\n }\n parent.children = packedBlocks;\n for (let j = 0; j < childCount; j++) {\n parent.assignChild(packedBlocks[j], j, false);\n }\n parent.childCount = childCount;\n if (this.underflow(parent) && (parent.parent)) {\n this.packParent(parent.parent);\n } else {\n this.nodeUpdateOrdinals(parent);\n this.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n }\n }\n\n private zamboniSegments(zamboniSegmentsMaxCount = MergeTree.zamboniSegmentsMaxCount) {\n if (!this.collabWindow.collaborating) {\n return;\n }\n\n for (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n let segmentToScour = this.segmentsToScour!.peek();\n if (!segmentToScour || segmentToScour.maxSeq > this.collabWindow.minSeq) {\n break;\n }\n segmentToScour = this.segmentsToScour!.get();\n // Only skip scouring if needs scour is explicitly false, not true or undefined\n if (segmentToScour.segment!.parent && segmentToScour.segment!.parent.needsScour !== false) {\n const block = segmentToScour.segment!.parent;\n const childrenCopy: IMergeNode[] = [];\n this.scourNode(block, childrenCopy);\n // This will avoid the cost of re-scouring nodes\n // that have recently been scoured\n block.needsScour = false;\n\n const newChildCount = childrenCopy.length;\n\n if (newChildCount < block.childCount) {\n block.childCount = newChildCount;\n block.children = childrenCopy;\n for (let j = 0; j < newChildCount; j++) {\n block.assignChild(childrenCopy[j], j, false);\n }\n\n if (this.underflow(block) && block.parent) {\n this.packParent(block.parent);\n } else {\n this.nodeUpdateOrdinals(block);\n this.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n }\n }\n }\n }\n }\n\n public getCollabWindow() {\n return this.collabWindow;\n }\n\n public getStats() {\n const nodeGetStats = (block: IMergeBlock): MergeTreeStats => {\n const stats: MergeTreeStats = {\n maxHeight: 0,\n nodeCount: 0,\n leafCount: 0,\n removedLeafCount: 0,\n liveCount: 0,\n histo: [],\n };\n for (let k = 0; k < MaxNodesInBlock; k++) {\n stats.histo[k] = 0;\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n let height = 1;\n if (!child.isLeaf()) {\n const childStats = nodeGetStats(child);\n height = 1 + childStats.maxHeight;\n stats.nodeCount += childStats.nodeCount;\n stats.leafCount += childStats.leafCount;\n stats.removedLeafCount += childStats.removedLeafCount;\n stats.liveCount += childStats.liveCount;\n for (let j = 0; j < MaxNodesInBlock; j++) {\n stats.histo[j] += childStats.histo[j];\n }\n } else {\n stats.leafCount++;\n const segment = child;\n if (segment.removedSeq !== undefined) {\n stats.removedLeafCount++;\n }\n }\n if (height > stats.maxHeight) {\n stats.maxHeight = height;\n }\n }\n stats.histo[block.childCount]++;\n stats.nodeCount++;\n stats.liveCount += block.childCount;\n return stats;\n };\n const rootStats = nodeGetStats(this.root);\n return rootStats;\n }\n\n public getLength(refSeq: number, clientId: number) {\n return this.blockLength(this.root, refSeq, clientId);\n }\n\n /**\n * Returns the current length of the MergeTree for the local client.\n */\n public get length() { return this.root.cachedLength; }\n\n public getPosition(node: MergeNode, refSeq: number, clientId: number) {\n let totalOffset = 0;\n let parent = node.parent;\n let prevParent: IMergeBlock | undefined;\n while (parent) {\n const children = parent.children;\n for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n const child = children[childIndex];\n if ((prevParent && (child === prevParent)) || (child === node)) {\n break;\n }\n totalOffset += this.nodeLength(child, refSeq, clientId) ?? 0;\n }\n prevParent = parent;\n parent = parent.parent;\n }\n return totalOffset;\n }\n\n public getContainingSegment<T extends ISegment>(pos: number, refSeq: number, clientId: number) {\n let segment: T | undefined;\n let offset: number | undefined;\n\n const leaf = (leafSeg: ISegment, segpos: number, _refSeq: number, _clientId: number, start: number) => {\n segment = leafSeg as T;\n offset = start;\n return false;\n };\n this.searchBlock(this.root, pos, 0, refSeq, clientId, { leaf }, undefined);\n return { segment, offset };\n }\n\n /**\n * @internal must only be used by client\n * @param segoff - The segment and offset to slide from\n * @returns The segment and offset to slide to\n */\n public _getSlideToSegment(segoff: { segment: ISegment | undefined; offset: number | undefined; }) {\n if (!segoff.segment || !isRemovedAndAcked(segoff.segment)) {\n return segoff;\n }\n // Slide to the next farthest valid segment in the tree. If no such segment is found\n // slide to the last valid segment.\n // TODO this walks the whole tree to find the segment - could write a more efficient\n // walk that starts at the segment\n let foundStart = false;\n let foundSegmentPastStart = false;\n let slideToSegment: ISegment | undefined;\n this.walkAllSegments(this.root, (seg) => {\n if (seg.seq !== UnassignedSequenceNumber && !isRemovedAndAcked(seg)) {\n slideToSegment = seg;\n if (foundStart) {\n foundSegmentPastStart = true;\n return false;\n }\n }\n if (!foundStart && seg === segoff.segment) {\n foundStart = true;\n }\n return true;\n });\n let offset = 0;\n if (slideToSegment && !foundSegmentPastStart) {\n // If slid nearer then offset should be at the end of the segment\n offset = slideToSegment.cachedLength - 1;\n }\n return { segment: slideToSegment, offset };\n }\n\n /**\n * This method should only be called when the current client sequence number is\n * max(remove segment sequence number, add reference sequence number).\n * Otherwise eventual consistency is not guaranteed.\n * See `packages\\dds\\merge-tree\\REFERENCEPOSITIONS.md`\n */\n private slideReferences(segment: ISegment, refsToSlide: LocalReference[]) {\n assert(\n isRemovedAndAcked(segment),\n 0x2f1 /* slideReferences from a segment which has not been removed and acked */);\n assert(!!segment.localRefs, 0x2f2 /* Ref not in the segment localRefs */);\n const newSegoff = this._getSlideToSegment({ segment, offset: 0 });\n const newSegment = newSegoff.segment;\n if (newSegment && !newSegment.localRefs) {\n newSegment.localRefs = new LocalReferenceCollection(newSegment);\n }\n for (const ref of refsToSlide) {\n const removedRef = segment.localRefs.removeLocalRef(ref);\n assert(ref === removedRef, 0x2f3 /* Ref not in the segment localRefs */);\n if (!newSegment) {\n // No valid segments (all nodes removed or not yet created)\n ref.segment = undefined;\n ref.offset = 0;\n } else {\n ref.segment = newSegment;\n ref.offset = newSegoff.offset ?? 0;\n assert(!!newSegment.localRefs, 0x2f4 /* localRefs must be allocated */);\n newSegment.localRefs.addLocalRef(ref);\n }\n }\n // TODO is it required to update the path lengths?\n if (newSegment) {\n this.blockUpdatePathLengths(newSegment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n\n private updateSegmentRefsAfterMarkRemoved(segment: ISegment, pending: boolean) {\n if (!segment.localRefs || segment.localRefs.empty) {\n return;\n }\n const refsToSlide: LocalReference[] = [];\n const refsToStay: LocalReference[] = [];\n for (const lref of segment.localRefs) {\n if (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n refsToStay.push(lref);\n } else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n if (pending) {\n refsToStay.push(lref);\n } else {\n refsToSlide.push(lref);\n }\n }\n }\n // Rethink implementation of keeping and sliding refs once other reference\n // changes are complete. This works but is fragile and possibly slow.\n if (!pending) {\n this.slideReferences(segment, refsToSlide);\n }\n segment.localRefs.clear();\n for (const lref of refsToStay) {\n lref.segment = segment;\n segment.localRefs.addLocalRef(lref);\n }\n }\n\n private blockLength(node: IMergeBlock, refSeq: number, clientId: number) {\n if ((this.collabWindow.collaborating) && (clientId !== this.collabWindow.clientId)) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n return node.cachedLength;\n }\n }\n\n private nodeLength(node: IMergeNode, refSeq: number, clientId: number) {\n if ((!this.collabWindow.collaborating) || (this.collabWindow.clientId === clientId)) {\n // Local client sees all segments, even when collaborating\n if (!node.isLeaf()) {\n return node.cachedLength;\n } else {\n return this.localNetLength(node);\n }\n } else {\n // Sequence number within window\n if (!node.isLeaf()) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n const segment = node;\n const removalInfo = toRemovalInfo(segment);\n\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber\n && removalInfo.removedSeq <= refSeq) {\n // this segment is a tombstone eligible for zamboni\n // so should never be considered, as it may not exist\n // on other clients\n return undefined;\n }\n if (((segment.clientId === clientId) ||\n ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= refSeq)))) {\n // Segment happened by reference sequence number or segment from requesting client\n if (removalInfo !== undefined) {\n if (removalInfo.removedClientIds.includes(clientId)) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n } else {\n return segment.cachedLength;\n }\n } else {\n // the segment was inserted and removed before the\n // this context, so it will never exist for this\n // context\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n return undefined;\n }\n // Segment invisible to client at reference sequence number/branch id/client id of op\n return 0;\n }\n }\n }\n }\n\n public addMinSeqListener(minRequired: number, onMinGE: (minSeq: number) => void) {\n if (!this.minSeqListeners) {\n this.minSeqListeners = new Heap<MinListener>([],\n minListenerComparer);\n }\n this.minSeqListeners.add({ minRequired, onMinGE });\n }\n\n private notifyMinSeqListeners() {\n if (this.minSeqListeners) {\n while ((this.minSeqListeners.count() > 0) &&\n (this.minSeqListeners.peek().minRequired <= this.collabWindow.minSeq)) {\n const minListener = this.minSeqListeners.get()!;\n minListener.onMinGE(this.collabWindow.minSeq);\n }\n }\n }\n\n public setMinSeq(minSeq: number) {\n assert(\n minSeq <= this.collabWindow.currentSeq,\n 0x04e, /* \"Trying to set minSeq above currentSeq of collab window!\" */\n );\n\n // Only move forward\n assert(this.collabWindow.minSeq <= minSeq, 0x04f /* \"minSeq of collab window > target minSeq!\" */);\n\n if (minSeq > this.collabWindow.minSeq) {\n this.collabWindow.minSeq = minSeq;\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n this.notifyMinSeqListeners();\n }\n }\n\n public referencePositionToLocalPosition(\n refPos: ReferencePosition,\n refSeq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n const seg = refPos.getSegment();\n if (seg && seg.parent) {\n const offset = !seg.removedSeq ? refPos.getOffset() : 0;\n return offset + this.getPosition(seg, refSeq, clientId);\n }\n return LocalReference.DetachedPosition;\n }\n\n public getStackContext(startPos: number, clientId: number, rangeLabels: string[]) {\n const searchInfo: IMarkerSearchRangeInfo = {\n mergeTree: this,\n stacks: createMap<Stack<Marker>>(),\n rangeLabels,\n };\n\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordRangeLeaf, shift: rangeShift }, searchInfo);\n return searchInfo.stacks;\n }\n\n // TODO: filter function\n public findTile(startPos: number, clientId: number, tileLabel: string, posPrecedesTile = true) {\n const searchInfo: IReferenceSearchInfo = {\n mergeTree: this,\n posPrecedesTile,\n tileLabel,\n };\n\n if (posPrecedesTile) {\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n } else {\n this.backwardSearch(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n }\n\n if (searchInfo.tile) {\n let pos: number;\n if (searchInfo.tile.isLeaf()) {\n const marker = <Marker>searchInfo.tile;\n pos = this.getPosition(marker, UniversalSequenceNumber, clientId);\n } else {\n const localRef = <LocalReference>searchInfo.tile;\n pos = localRef.toPosition();\n }\n return { tile: searchInfo.tile, pos };\n }\n }\n\n private search<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n return this.searchBlock(this.root, pos, 0, refSeq, clientId, actions, clientData);\n }\n\n private searchBlock<TClientData>(\n block: IMergeBlock, pos: number, segpos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _pos = pos;\n let _segpos = segpos;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (\n (!contains && _pos < len)\n || (contains && contains(child, _pos, refSeq, clientId, undefined, undefined, clientData))\n ) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.searchBlock(child, _pos, _segpos, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, _segpos, refSeq, clientId, _pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, _segpos, refSeq, clientId, _pos, undefined, clientData);\n }\n _pos -= len;\n _segpos += len;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private backwardSearch<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n const len = this.getLength(refSeq, clientId);\n if (pos > len) {\n return undefined;\n }\n return this.backwardSearchBlock(this.root, pos, len, refSeq, clientId, actions, clientData);\n }\n\n private backwardSearchBlock<TClientData>(\n block: IMergeBlock, pos: number, segEnd: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _segEnd = segEnd;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n const segpos = _segEnd - len;\n if (((!contains) && (pos >= segpos)) ||\n (contains && contains(child, pos, refSeq, clientId, undefined, undefined, clientData))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.backwardSearchBlock(child, pos, _segEnd, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, segpos, refSeq, clientId, pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, segpos, refSeq, clientId, pos, undefined, clientData);\n }\n _segEnd = segpos;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private updateRoot(splitNode: IMergeBlock | undefined) {\n if (splitNode !== undefined) {\n const newRoot = this.makeBlock(2);\n newRoot.assignChild(this.root, 0, false);\n newRoot.assignChild(splitNode, 1, false);\n this.root = newRoot;\n this.nodeUpdateOrdinals(this.root);\n this.nodeUpdateLengthNewStructure(this.root);\n }\n }\n\n /**\n * Assign sequence number to existing segment; update partial lengths to reflect the change\n * @param seq - sequence number given by server to pending segment\n */\n public ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const seq = opArgs.sequencedMessage!.sequenceNumber;\n const pendingSegmentGroup = this.pendingSegments!.dequeue();\n const nodesToUpdate: IMergeBlock[] = [];\n let overwrite = false;\n if (pendingSegmentGroup !== undefined) {\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n pendingSegmentGroup.segments.map((pendingSegment) => {\n const modified = pendingSegment.ack(pendingSegmentGroup, opArgs, this);\n // This computation of overwrite appears incorrect. Leaving as is to avoid breaking something.\n overwrite = !modified || overwrite;\n\n if (modified && opArgs.op.type === MergeTreeDeltaType.REMOVE) {\n this.updateSegmentRefsAfterMarkRemoved(pendingSegment, false);\n }\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(pendingSegment, seq);\n }\n if (!nodesToUpdate.includes(pendingSegment.parent!)) {\n nodesToUpdate.push(pendingSegment.parent!);\n }\n deltaSegments.push({\n segment: pendingSegment,\n });\n });\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n deltaSegments,\n operation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n },\n opArgs,\n );\n }\n const clientId = this.collabWindow.clientId;\n for (const node of nodesToUpdate) {\n this.blockUpdatePathLengths(node, seq, clientId, overwrite);\n // NodeUpdatePathLengths(node, seq, clientId, true);\n }\n }\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n\n private addToPendingList(segment: ISegment, segmentGroup?: SegmentGroup, localSeq?: number) {\n let _segmentGroup = segmentGroup;\n if (_segmentGroup === undefined) {\n // TODO: review the cast\n _segmentGroup = { segments: [], localSeq } as SegmentGroup;\n this.pendingSegments!.enqueue(_segmentGroup);\n }\n segment.segmentGroups.enqueue(_segmentGroup);\n return _segmentGroup;\n }\n\n // TODO: error checking\n public getMarkerFromId(id: string) {\n return this.idToSegment.get(id);\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 * @param refseq - The reference sequence number at which to compute the position.\n * @param clientId - The client id with which to compute the position.\n */\n public posFromRelativePos(\n relativePos: IRelativePosition,\n refseq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n let pos = -1;\n let marker: Marker | undefined;\n if (relativePos.id) {\n marker = this.getMarkerFromId(relativePos.id) as Marker;\n }\n if (marker) {\n pos = this.getPosition(marker, refseq, clientId);\n if (!relativePos.before) {\n pos += marker.cachedLength;\n if (relativePos.offset !== undefined) {\n pos += relativePos.offset;\n }\n } else {\n if (relativePos.offset !== undefined) {\n pos -= relativePos.offset;\n }\n }\n }\n return pos;\n }\n\n public insertSegments(\n pos: number,\n segments: ISegment[],\n refSeq: number,\n clientId: number,\n seq: number,\n opArgs: IMergeTreeDeltaOpArgs | undefined,\n ) {\n this.ensureIntervalBoundary(pos, refSeq, clientId);\n\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n this.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n // opArgs == undefined => loading snapshot or test code\n if (this.mergeTreeDeltaCallback && opArgs !== undefined) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.INSERT,\n deltaSegments: segments.map((segment) => ({ segment })),\n });\n }\n\n if (this.collabWindow.collaborating && MergeTree.options.zamboniSegments &&\n (seq !== UnassignedSequenceNumber)) {\n this.zamboniSegments();\n }\n }\n\n public insertAtReferencePosition(\n referencePosition: ReferencePosition,\n insertSegment: ISegment,\n opArgs: IMergeTreeDeltaOpArgs,\n ): void {\n if (insertSegment.cachedLength === 0) {\n return;\n }\n if (insertSegment.parent\n || insertSegment.removedSeq\n || insertSegment.seq !== UniversalSequenceNumber) {\n throw new Error(\"Cannot insert segment that has already been inserted.\");\n }\n\n const rebalanceTree = (segment: ISegment) => {\n // Blocks should never be left full\n // if the inserts makes the block full\n // then we need to walk up the chain of parents\n // and split the blocks until we find a block with\n // room\n let block = segment.parent;\n let ordinalUpdateNode: IMergeBlock | undefined = block;\n while (block !== undefined) {\n if (block.childCount >= MaxNodesInBlock) {\n const splitNode = this.split(block);\n if (block === this.root) {\n this.updateRoot(splitNode);\n // Update root already updates all it's children ordinals\n ordinalUpdateNode = undefined;\n } else {\n this.insertChildNode(block.parent!, splitNode, block.index + 1);\n ordinalUpdateNode = splitNode.parent;\n this.blockUpdateLength(block.parent!, UnassignedSequenceNumber, clientId);\n }\n } else {\n this.blockUpdateLength(block, UnassignedSequenceNumber, clientId);\n }\n block = block.parent;\n }\n // Only update ordinals once, for all children,\n // on the path\n if (ordinalUpdateNode) {\n this.nodeUpdateOrdinals(ordinalUpdateNode);\n }\n };\n\n const clientId = this.collabWindow.clientId;\n const refSegment = referencePosition.getSegment()!;\n const refOffset = referencePosition.getOffset();\n const refSegLen = this.nodeLength(refSegment, this.collabWindow.currentSeq, clientId);\n let startSeg = refSegment;\n // if the change isn't at a boundary, we need to split the segment\n if (refOffset !== 0 && refSegLen !== undefined && refSegLen !== 0) {\n const splitSeg = this.splitLeafSegment(refSegment, refOffset);\n assert(!!splitSeg.next, 0x050 /* \"Next segment changes are undefined!\" */);\n this.insertChildNode(refSegment.parent!, splitSeg.next, refSegment.index + 1);\n rebalanceTree(splitSeg.next);\n startSeg = splitSeg.next;\n }\n // walk back from the segment, to see if there is a previous tie break seg\n this.leftExcursion(startSeg, (backSeg) => {\n if (!backSeg.isLeaf()) {\n return true;\n }\n const backLen = this.nodeLength(backSeg, this.collabWindow.currentSeq, clientId);\n // ignore removed segments\n if (backLen === undefined) {\n return true;\n }\n // Find the nearest 0 length seg we can insert over, as all other inserts\n // go near to far\n if (backLen === 0) {\n if (this.breakTie(0, backSeg, UnassignedSequenceNumber)) {\n startSeg = backSeg;\n }\n return true;\n }\n return false;\n });\n\n if (this.collabWindow.collaborating) {\n insertSegment.localSeq = ++this.collabWindow.localSeq;\n insertSegment.seq = UnassignedSequenceNumber;\n } else {\n insertSegment.seq = UniversalSequenceNumber;\n }\n\n insertSegment.clientId = clientId;\n\n if (Marker.is(insertSegment)) {\n const markerId = insertSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, insertSegment);\n }\n }\n\n this.insertChildNode(startSeg.parent!, insertSegment, startSeg.index);\n\n rebalanceTree(insertSegment);\n\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n deltaSegments: [{ segment: insertSegment }],\n operation: MergeTreeDeltaType.INSERT,\n });\n }\n\n if (this.collabWindow.collaborating) {\n this.addToPendingList(insertSegment, undefined, insertSegment.localSeq);\n }\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. The client ref seq must be above the minimum sequence number\n * or the return value will be undefined.\n * Generally this method is used in conjunction with signals which provide\n * point in time values for the below parameters, and is useful for things\n * like displaying user position. It should not be used with persisted values\n * as persisted values will quickly become invalid as the remoteClientRefSeq\n * moves below the minimum sequence number\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: number): number | undefined {\n if (remoteClientRefSeq < this.collabWindow.minSeq) {\n return undefined;\n }\n\n const segmentInfo = this.getContainingSegment(\n remoteClientPosition,\n remoteClientRefSeq,\n remoteClientId);\n\n const segwindow = this.getCollabWindow();\n\n if (segmentInfo && segmentInfo.segment) {\n const segmentPosition = this.getPosition(segmentInfo.segment, segwindow.currentSeq, segwindow.clientId);\n\n return segmentPosition + segmentInfo.offset!;\n } else {\n if (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n return this.getLength(segwindow.currentSeq, segwindow.clientId);\n }\n }\n }\n\n private insertChildNode(block: IMergeBlock, child: IMergeNode, childIndex: number) {\n assert(block.childCount < MaxNodesInBlock, 0x051 /* \"Too many children on merge block!\" */);\n\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n\n block.childCount++;\n block.assignChild(child, childIndex, false);\n }\n\n private blockInsert<T extends ISegment>(\n pos: number,\n refSeq: number,\n clientId: number,\n seq: number,\n localSeq: number | undefined,\n newSegments: T[],\n ) {\n let segIsLocal = false;\n const checkSegmentIsLocal = (segment: ISegment) => {\n if (segment.seq === UnassignedSequenceNumber) {\n segIsLocal = true;\n }\n // Only need to look at first segment that follows finished node\n return false;\n };\n\n const continueFrom = (node: IMergeBlock) => {\n segIsLocal = false;\n this.rightExcursion(node, checkSegmentIsLocal);\n return segIsLocal;\n };\n\n let segmentGroup: SegmentGroup;\n const saveIfLocal = (locSegment: ISegment) => {\n // Save segment so can assign sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if ((locSegment.seq === UnassignedSequenceNumber) && (clientId === this.collabWindow.clientId)) {\n segmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n // eslint-disable-next-line @typescript-eslint/brace-style\n }\n // LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n // In all other cases this has to be true (checked by addToLRUSet):\n // locSegment.seq > this.collabWindow.currentSeq\n else if ((locSegment.seq! > this.collabWindow.minSeq) &&\n MergeTree.options.zamboniSegments) {\n this.addToLRUSet(locSegment, locSegment.seq!);\n }\n }\n };\n const onLeaf = (segment: ISegment | undefined, _pos: number, context: InsertContext) => {\n const segmentChanges: ISegmentChanges = {};\n if (segment) {\n // Insert before segment\n segmentChanges.replaceCurrent = context.candidateSegment;\n segmentChanges.next = segment;\n } else {\n segmentChanges.next = context.candidateSegment;\n }\n return segmentChanges;\n };\n\n // TODO: build tree from segs and insert all at once\n let insertPos = pos;\n for (const newSegment of newSegments) {\n segIsLocal = false;\n if (newSegment.cachedLength > 0) {\n newSegment.seq = seq;\n newSegment.localSeq = localSeq;\n newSegment.clientId = clientId;\n if (Marker.is(newSegment)) {\n const markerId = newSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, newSegment);\n }\n }\n\n const splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq,\n { leaf: onLeaf, candidateSegment: newSegment, continuePredicate: continueFrom });\n\n if (newSegment.parent === undefined) {\n throw new Error(`MergeTree insert failed: ${JSON.stringify({\n currentSeq: this.collabWindow.currentSeq,\n minSeq: this.collabWindow.minSeq,\n segSeq: newSegment.seq,\n })}`);\n }\n\n this.updateRoot(splitNode);\n saveIfLocal(newSegment);\n\n insertPos += newSegment.cachedLength;\n }\n }\n }\n private readonly splitLeafSegment = (segment: ISegment | undefined, pos: number): ISegmentChanges => {\n if (!(pos > 0 && segment)) {\n return {};\n }\n\n const next = segment.splitAt(pos)!;\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.SPLIT,\n deltaSegments: [{ segment }, { segment: next }],\n },\n undefined);\n }\n\n return { next };\n };\n\n private ensureIntervalBoundary(pos: number, refSeq: number, clientId: number) {\n const splitNode = this.insertingWalk(this.root, pos, refSeq, clientId, TreeMaintenanceSequenceNumber,\n { leaf: this.splitLeafSegment });\n this.updateRoot(splitNode);\n }\n\n // Assume called only when pos == len\n private breakTie(pos: number, node: IMergeNode, seq: number) {\n if (node.isLeaf()) {\n if (pos === 0) {\n // normalize the seq numbers\n // if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n // seq for comparison, as it will get a seq higher than any other seq once sequences\n // if the current seg is local (UnassignedSequenceNumber) give it the second highest\n // possible seq, as the highest is reserved for the previous.\n const newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n const segSeq = node.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n return newSeq > segSeq;\n }\n return false;\n } else {\n return true;\n }\n }\n\n // Visit segments starting from node's left siblings, then up to node's parent\n private leftExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let _node: IMergeNode;\n let matchedStart = false;\n for (childIndex = parent.childCount - 1; childIndex >= 0; childIndex--) {\n _node = children[childIndex];\n if (matchedStart) {\n if (!_node.isLeaf()) {\n const childBlock = _node;\n go = this.nodeMapReverse(childBlock, leafAction, 0, UniversalSequenceNumber,\n this.collabWindow.clientId);\n } else {\n go = leafAction(_node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === _node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n /**\n * Visit segments starting from node's right siblings, then up to node's parent.\n * All segments past `node` are visited, regardless of their visibility.\n */\n private rightExcursion(node: IMergeNode, leafAction: (seg: ISegment) => boolean) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let _node: IMergeNode;\n let matchedStart = false;\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n _node = children[childIndex];\n if (matchedStart) {\n if (!_node.isLeaf()) {\n const childBlock = _node;\n go = this.walkAllSegments(childBlock, leafAction);\n } else {\n go = leafAction(_node);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === _node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n private insertingWalk(\n block: IMergeBlock, pos: number, refSeq: number, clientId: number, seq: number,\n context: InsertContext) {\n let _pos = pos;\n const children = block.children;\n let childIndex: number;\n let child: IMergeNode;\n let newNode: IMergeNode | undefined;\n let fromSplit: IMergeBlock | undefined;\n for (childIndex = 0; childIndex < block.childCount; childIndex++) {\n child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId);\n if (len === undefined) {\n // if the seg len in undefined, the segment\n // will be removed, so should just be skipped for now\n continue;\n }\n\n if ((_pos < len) || ((_pos === len) && this.breakTie(_pos, child, seq))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n const childBlock = child;\n // Internal node\n const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId,\n seq, context);\n if (splitNode === undefined) {\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else if (splitNode === MergeTree.theUnfinishedNode) {\n _pos -= len; // Act as if shifted segment\n continue;\n } else {\n newNode = splitNode;\n fromSplit = splitNode;\n childIndex++; // Insert after\n }\n } else {\n const segment = child;\n const segmentChanges = context.leaf(segment, _pos, context);\n if (segmentChanges.replaceCurrent) {\n block.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n segmentChanges.replaceCurrent.ordinal = child.ordinal;\n }\n if (segmentChanges.next) {\n newNode = segmentChanges.next;\n childIndex++; // Insert after\n } else {\n // No change\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n }\n return undefined;\n }\n }\n break;\n } else {\n _pos -= len;\n }\n }\n if (!newNode) {\n if (_pos === 0) {\n if ((seq !== UnassignedSequenceNumber) && context.continuePredicate &&\n context.continuePredicate(block)) {\n return MergeTree.theUnfinishedNode;\n } else {\n const segmentChanges = context.leaf(undefined, _pos, context);\n newNode = segmentChanges.next;\n // Assert segmentChanges.replaceCurrent === undefined\n }\n }\n }\n if (newNode) {\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n block.assignChild(newNode, childIndex, false);\n block.childCount++;\n block.setOrdinal(newNode, childIndex);\n if (block.childCount < MaxNodesInBlock) {\n if (fromSplit) {\n this.nodeUpdateOrdinals(fromSplit);\n }\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else {\n // Don't update ordinals because higher block will do it\n return this.split(block);\n }\n } else {\n return undefined;\n }\n }\n\n private split(node: IMergeBlock) {\n const halfCount = MaxNodesInBlock / 2;\n const newNode = this.makeBlock(halfCount);\n node.childCount = halfCount;\n // Update ordinals to reflect lowered child count\n this.nodeUpdateOrdinals(node);\n for (let i = 0; i < halfCount; i++) {\n newNode.assignChild(node.children[halfCount + i], i, false);\n node.children[halfCount + i] = undefined!;\n }\n this.nodeUpdateLengthNewStructure(node);\n this.nodeUpdateLengthNewStructure(newNode);\n return newNode;\n }\n\n private nodeUpdateOrdinals(block: IMergeBlock) {\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n block.setOrdinal(child, i);\n if (!child.isLeaf()) {\n this.nodeUpdateOrdinals(child);\n }\n }\n }\n\n /**\n * Annotate a range with 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 - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @param refSeq - The reference sequence number to use to apply the annotate\n * @param clientId - The id of the client making the annotate\n * @param seq - The sequence number of the annotate operation\n * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n */\n public annotateRange(\n start: number, end: number, props: PropertySet, combiningOp: ICombiningOp | undefined, refSeq: number,\n clientId: number, seq: number, opArgs: IMergeTreeDeltaOpArgs) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n let segmentGroup: SegmentGroup | undefined;\n\n const annotateSegment = (segment: ISegment) => {\n const propertyDeltas = segment.addProperties(props, combiningOp, seq, this.collabWindow);\n deltaSegments.push({ segment, propertyDeltas });\n if (this.collabWindow.collaborating) {\n if (seq === UnassignedSequenceNumber) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n\n this.mapRange({ leaf: annotateSegment }, refSeq, clientId, undefined, start, end);\n\n // OpArgs == undefined => test code\n if (this.mergeTreeDeltaCallback && deltaSegments.length > 0) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.ANNOTATE,\n deltaSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n public markRangeRemoved(\n start: number,\n end: number,\n refSeq: number,\n clientId: number,\n seq: number,\n overwrite = false,\n opArgs: IMergeTreeDeltaOpArgs,\n ) {\n let _overwrite = overwrite;\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n let segmentGroup: SegmentGroup;\n const removedSegments: IMergeTreeSegmentDelta[] = [];\n const segmentsWithRefs: ISegment[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n const markRemoved = (segment: ISegment, pos: number, _start: number, _end: number) => {\n const existingRemovalInfo = toRemovalInfo(segment);\n if (existingRemovalInfo !== undefined) {\n _overwrite = true;\n if (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {\n // we removed this locally, but someone else removed it first\n // so put them at the head of the list\n // the list isn't ordered, but we\n // keep first removal at the head.\n existingRemovalInfo.removedClientIds.unshift(clientId);\n existingRemovalInfo.removedSeq = seq;\n segment.localRemovedSeq = undefined;\n } else {\n // Do not replace earlier sequence number for remove\n existingRemovalInfo.removedClientIds.push(clientId);\n }\n } else {\n segment.removedClientIds = [clientId];\n segment.removedSeq = seq;\n segment.localRemovedSeq = localSeq;\n\n removedSegments.push({ segment });\n }\n if (segment.localRefs && !segment.localRefs.empty) {\n segmentsWithRefs.push(segment);\n }\n\n // Save segment so can assign removed sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if (segment.removedSeq === UnassignedSequenceNumber && clientId === this.collabWindow.clientId) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n const afterMarkRemoved = (node: IMergeBlock, pos: number, _start: number, _end: number) => {\n if (_overwrite) {\n this.nodeUpdateLengthNewStructure(node);\n } else {\n this.blockUpdateLength(node, seq, clientId);\n }\n return true;\n };\n this.mapRange({ leaf: markRemoved, post: afterMarkRemoved }, refSeq, clientId, undefined, start, end);\n const pending = this.collabWindow.collaborating && clientId === this.collabWindow.clientId;\n for (const segment of segmentsWithRefs) {\n this.updateSegmentRefsAfterMarkRemoved(segment, pending);\n }\n\n // opArgs == undefined => test code\n if (this.mergeTreeDeltaCallback && removedSegments.length > 0) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.REMOVE,\n deltaSegments: removedSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n private nodeUpdateLengthNewStructure(node: IMergeBlock, recur = false) {\n this.blockUpdate(node);\n if (this.collabWindow.collaborating) {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow, recur);\n }\n }\n\n public removeLocalReferencePosition(lref: ReferencePosition): ReferencePosition | undefined {\n const segment = lref.getSegment();\n if (segment) {\n const removedRefs = segment?.localRefs?.removeLocalRef(lref);\n if (removedRefs !== undefined) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n return removedRefs;\n }\n }\n public createLocalReferencePosition(\n segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,\n client: Client,\n ): ReferencePosition {\n if (isRemoved(segment)) {\n if (!refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove)) {\n throw new UsageError(\"Can only create SlideOnRemove local reference position on a removed segment\");\n }\n }\n const localRefs = segment.localRefs ?? new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n\n const segRef = localRefs.createLocalRef(offset, refType, properties, client);\n\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n return segRef;\n }\n\n /**\n * @deprecated - use removeLocalReferencePosition\n */\n public removeLocalReference(segment: ISegment, lref: LocalReference) {\n if (segment.localRefs) {\n const removedRef = segment.localRefs.removeLocalRef(lref);\n if (removedRef) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n }\n\n /**\n * @deprecated - use createLocalReference\n */\n public addLocalReference(lref: LocalReference) {\n const segment = lref.segment!;\n let localRefs = segment.localRefs;\n if (!localRefs) {\n localRefs = new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n }\n localRefs.addLocalRef(lref);\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n\n private blockUpdate(block: IMergeBlock) {\n let len = 0;\n const hierBlock = block.hierBlock();\n if (hierBlock) {\n hierBlock.rightmostTiles = createMap<Marker>();\n hierBlock.leftmostTiles = createMap<Marker>();\n hierBlock.rangeStacks = {};\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n len += nodeTotalLength(this, child) ?? 0;\n if (hierBlock) {\n hierBlock.addNodeReferences(this, child);\n }\n if (this.blockUpdateActions) {\n this.blockUpdateActions.child(block, i);\n }\n }\n block.cachedLength = len;\n }\n\n private blockUpdatePathLengths(\n startBlock: IMergeBlock | undefined,\n seq: number,\n clientId: number,\n newStructure = false,\n ) {\n let block: IMergeBlock | undefined = startBlock;\n while (block !== undefined) {\n if (newStructure) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n block = block.parent;\n }\n }\n\n private blockUpdateLength(node: IMergeBlock, seq: number, clientId: number) {\n this.blockUpdate(node);\n if (\n this.collabWindow.collaborating\n && seq !== UnassignedSequenceNumber\n && seq !== TreeMaintenanceSequenceNumber\n ) {\n if (\n node.partialLengths !== undefined\n && MergeTree.options.incrementalUpdate\n && clientId !== NonCollabClient\n ) {\n node.partialLengths.update(this, node, seq, clientId, this.collabWindow);\n } else {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow);\n }\n }\n }\n\n public map<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n ) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum);\n }\n\n public mapRange<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n start?: number,\n end?: number,\n splitRange: boolean = false,\n ) {\n if (splitRange) {\n if (start) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n }\n if (end) {\n this.ensureIntervalBoundary(end, refSeq, clientId);\n }\n }\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum, start, end);\n }\n\n public incrementalBlockMap<TContext>(stateStack: Stack<IncrementalMapState<TContext>>) {\n while (!stateStack.empty()) {\n // We already check the stack is not empty\n const state = stateStack.top()!;\n if (state.op !== IncrementalExecOp.Go) {\n return;\n }\n if (state.childIndex === 0) {\n if (state.start === undefined) {\n state.start = 0;\n }\n if (state.end === undefined) {\n state.end = this.blockLength(state.block, state.refSeq, state.clientId);\n }\n\n if (state.actions.pre) {\n state.actions.pre(state);\n }\n }\n if ((state.op === IncrementalExecOp.Go) && (state.childIndex < state.block.childCount)) {\n const child = state.block.children[state.childIndex];\n const len = this.nodeLength(child, state.refSeq, state.clientId) ?? 0;\n if ((len > 0) && (state.start < len) && (state.end > 0)) {\n if (!child.isLeaf()) {\n const childState = new IncrementalMapState(child, state.actions, state.pos,\n state.refSeq, state.clientId, state.context, state.start, state.end, 0);\n stateStack.push(childState);\n } else {\n state.actions.leaf(child, state);\n }\n }\n state.pos += len;\n state.start -= len;\n state.end -= len;\n state.childIndex++;\n } else {\n if (state.childIndex === state.block.childCount) {\n if ((state.op === IncrementalExecOp.Go) && state.actions.post) {\n state.actions.post(state);\n }\n stateStack.pop();\n }\n }\n }\n }\n\n private nodeMap<TClientData>(\n node: IMergeBlock, actions: SegmentActions<TClientData>, pos: number, refSeq: number,\n clientId: number, accum: TClientData, start?: number, end?: number) {\n let _start = start;\n let _end = end;\n let _pos = pos;\n if (_start === undefined) {\n _start = 0;\n }\n if (_end === undefined) {\n _end = this.blockLength(node, refSeq, clientId);\n }\n let go = true;\n if (actions.pre) {\n go = actions.pre(node, _pos, refSeq, clientId, _start, _end, accum);\n if (!go) {\n // Cancel this node but not entire traversal\n return true;\n }\n }\n const children = node.children;\n for (let childIndex = 0; childIndex < node.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (go && (_end > 0) && (len > 0) && (_start < len)) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMap(child, actions, _pos, refSeq, clientId, accum, _start, _end);\n }\n } else {\n if (actions.leaf) {\n go = actions.leaf(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n }\n }\n if (!go) {\n break;\n }\n if (actions.shift) {\n actions.shift(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n _pos += len;\n _start -= len;\n _end -= len;\n }\n if (go && actions.post) {\n go = actions.post(node, _pos, refSeq, clientId, _start, _end, accum);\n }\n\n return go;\n }\n\n // Invokes the leaf action for all segments. Note that *all* segments are visited\n // regardless of if they would be visible to the current `clientId` and `refSeq`.\n public walkAllSegments<TClientData>(\n block: IMergeBlock,\n action: (segment: ISegment, accum?: TClientData) => boolean,\n accum?: TClientData,\n ): boolean {\n let go = true;\n const children = block.children;\n for (let childIndex = 0; go && childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n go = child.isLeaf()\n ? action(child, accum)\n : this.walkAllSegments(child, action, accum);\n }\n return go;\n }\n\n // Straight call every segment; goes until leaf action returns false\n private nodeMapReverse(\n block: IMergeBlock, leafAction: ISegmentAction<undefined>, pos: number, refSeq: number,\n clientId: number) {\n let go = true;\n const children = block.children;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n if (go) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMapReverse(child, leafAction, pos, refSeq, clientId);\n }\n } else {\n go = leafAction(child, pos, refSeq, clientId, 0, 0, undefined);\n }\n }\n if (!go) {\n break;\n }\n }\n return go;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTree.js","sourceRoot":"","sources":["../src/mergeTree.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/* eslint-disable @typescript-eslint/prefer-optional-chain, no-bitwise */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport {\n Comparer,\n Heap,\n List,\n ListMakeHead,\n Stack,\n} from \"./collections\";\nimport {\n LocalClientId,\n NonCollabClient,\n TreeMaintenanceSequenceNumber,\n UnassignedSequenceNumber,\n UniversalSequenceNumber,\n} from \"./constants\";\nimport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nimport {\n IMergeTreeDeltaOpArgs,\n IMergeTreeSegmentDelta,\n MergeTreeDeltaCallback,\n MergeTreeMaintenanceCallback,\n MergeTreeMaintenanceType,\n} from \"./mergeTreeDeltaCallback\";\nimport { TrackingGroupCollection } from \"./mergeTreeTracking\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMarkerDef,\n IRelativePosition,\n MergeTreeDeltaType,\n ReferenceType,\n} from \"./ops\";\nimport { PartialSequenceLengths } from \"./partialLengths\";\nimport {\n clone,\n createMap,\n extend,\n extendIfUndefined,\n MapLike,\n matchProperties,\n PropertySet,\n} from \"./properties\";\nimport {\n refTypeIncludesFlag,\n RangeStackMap,\n ReferencePosition,\n refGetRangeLabels,\n refGetTileLabels,\n refHasRangeLabel,\n refHasRangeLabels,\n refHasTileLabel,\n refHasTileLabels,\n } from \"./referencePositions\";\nimport { SegmentGroupCollection } from \"./segmentGroupCollection\";\nimport { PropertiesManager } from \"./segmentPropertiesManager\";\nimport { Client } from \"./client\";\n\nexport interface IMergeNodeCommon {\n parent?: IMergeBlock;\n /**\n * The length of the contents of the node.\n */\n cachedLength: number;\n index: number;\n ordinal: string;\n isLeaf(): this is ISegment;\n}\n\nexport type IMergeNode = IMergeBlock | ISegment;\n\n// Node with segments as children\nexport interface IMergeBlock extends IMergeNodeCommon {\n needsScour?: boolean;\n childCount: number;\n children: IMergeNode[];\n partialLengths?: PartialSequenceLengths;\n hierBlock(): IHierBlock | undefined;\n assignChild(child: IMergeNode, index: number, updateOrdinal?: boolean): void;\n setOrdinal(child: IMergeNode, index: number): void;\n}\n\nexport interface IHierBlock extends IMergeBlock {\n hierToString(indentCount: number): string;\n addNodeReferences(mergeTree: MergeTree, node: IMergeNode): void;\n rightmostTiles: MapLike<ReferencePosition>;\n leftmostTiles: MapLike<ReferencePosition>;\n rangeStacks: RangeStackMap;\n}\n\nexport interface IRemovalInfo {\n removedSeq: number;\n removedClientIds: number[];\n}\nexport function toRemovalInfo(maybe: Partial<IRemovalInfo> | undefined): IRemovalInfo | undefined {\n if (maybe?.removedClientIds !== undefined && maybe?.removedSeq !== undefined) {\n return maybe as IRemovalInfo;\n }\n assert(maybe?.removedClientIds === undefined && maybe?.removedSeq === undefined,\n 0x2bf /* \"both removedClientIds and removedSeq should be set or not set\" */);\n}\n\nfunction isRemoved(segment: ISegment): boolean {\n return toRemovalInfo(segment) !== undefined;\n}\n\nfunction isRemovedAndAcked(segment: ISegment): boolean {\n const removalInfo = toRemovalInfo(segment);\n return removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;\n}\n\n/**\n * A segment representing a portion of the merge tree.\n */\nexport interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo> {\n readonly type: string;\n readonly segmentGroups: SegmentGroupCollection;\n readonly trackingCollection: TrackingGroupCollection;\n propertyManager?: PropertiesManager;\n localSeq?: number;\n localRemovedSeq?: number;\n seq?: number; // If not present assumed to be previous to window min\n clientId: number;\n localRefs?: LocalReferenceCollection;\n properties?: PropertySet;\n addProperties(\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n collabWindow?: CollaborationWindow,\n ): PropertySet | undefined;\n clone(): ISegment;\n canAppend(segment: ISegment): boolean;\n append(segment: ISegment): void;\n splitAt(pos: number): ISegment | undefined;\n toJSONObject(): any;\n /**\n * Acks the current segment against the segment group, op, and merge tree.\n *\n * Throws error if the segment state doesn't match segment group or op.\n * E.g. Segment group not first is pending queue.\n * Inserted segment does not have unassigned sequence number.\n *\n * Returns true if the op modifies the segment, otherwise false.\n * The only current false case is overlapping remove, where a segment is removed\n * by a previously sequenced operation before the current operation is acked.\n */\n ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean;\n}\n\nexport interface IMarkerModifiedAction {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (marker: Marker): void;\n}\n\nexport interface ISegmentAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accum: TClientData): boolean;\n}\n\nexport interface ISegmentChanges {\n next?: ISegment;\n replaceCurrent?: ISegment;\n}\n\nexport interface BlockAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n block: IMergeBlock,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n accum: TClientData,\n ): boolean;\n}\n\nexport interface NodeAction<TClientData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (\n node: IMergeNode,\n pos: number,\n refSeq: number,\n clientId: number,\n start: number | undefined,\n end: number | undefined,\n clientData: TClientData,\n ): boolean;\n}\n\nexport interface IncrementalSegmentAction<TContext> {\n (segment: ISegment, state: IncrementalMapState<TContext>);\n}\n\nexport interface IncrementalBlockAction<TContext> {\n (state: IncrementalMapState<TContext>);\n}\n\nexport interface BlockUpdateActions {\n child: (block: IMergeBlock, index: number) => void;\n}\n\nexport interface InsertContext {\n candidateSegment?: ISegment;\n prepareEvents?: boolean;\n structureChange?: boolean;\n leaf: (segment: ISegment | undefined, pos: number, ic: InsertContext) => ISegmentChanges;\n continuePredicate?: (continueFromBlock: IMergeBlock) => boolean;\n}\n\nexport interface SegmentActions<TClientData> {\n leaf?: ISegmentAction<TClientData>;\n shift?: NodeAction<TClientData>;\n contains?: NodeAction<TClientData>;\n pre?: BlockAction<TClientData>;\n post?: BlockAction<TClientData>;\n}\n\nexport interface IncrementalSegmentActions<TContext> {\n leaf: IncrementalSegmentAction<TContext>;\n pre?: IncrementalBlockAction<TContext>;\n post?: IncrementalBlockAction<TContext>;\n}\n\nexport interface SearchResult {\n text: string;\n pos: number;\n}\n\nexport interface MergeTreeStats {\n maxHeight: number;\n nodeCount: number;\n leafCount: number;\n removedLeafCount: number;\n liveCount: number;\n histo: number[];\n windowTime?: number;\n packTime?: number;\n ordTime?: number;\n maxOrdTime?: number;\n}\n\nexport interface SegmentGroup {\n segments: ISegment[];\n localSeq: number;\n}\n\nexport class MergeNode implements IMergeNodeCommon {\n index: number = 0;\n ordinal: string = \"\";\n parent?: IMergeBlock;\n cachedLength: number = 0;\n\n isLeaf() {\n return false;\n }\n}\n\nfunction addTile(tile: ReferencePosition, tiles: object) {\n const tileLabels = refGetTileLabels(tile);\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n tiles[tileLabel] = tile;\n }\n }\n}\n\nfunction addTileIfNotPresent(tile: ReferencePosition, tiles: object) {\n const tileLabels = refGetTileLabels(tile);\n if (tileLabels) {\n for (const tileLabel of tileLabels) {\n if (tiles[tileLabel] === undefined) {\n tiles[tileLabel] = tile;\n }\n }\n }\n}\n\nfunction applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeStackMap) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const label in deltaStackMap) {\n const deltaStack = deltaStackMap[label];\n if (!deltaStack.empty()) {\n let currentStack = currentStackMap[label];\n if (currentStack === undefined) {\n currentStack = new Stack<ReferencePosition>();\n currentStackMap[label] = currentStack;\n }\n for (const delta of deltaStack.items) {\n applyRangeReference(currentStack, delta);\n }\n }\n }\n}\n\nfunction applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {\n if (refTypeIncludesFlag(delta, ReferenceType.NestBegin)) {\n stack.push(delta);\n return true;\n } else {\n // Assume delta is end reference\n const top = stack.top();\n // TODO: match end with begin\n if (top && (refTypeIncludesFlag(top, ReferenceType.NestBegin))) {\n stack.pop();\n } else {\n stack.push(delta);\n }\n return false;\n }\n}\n\nfunction addNodeReferences(\n mergeTree: MergeTree, node: IMergeNode,\n rightmostTiles: MapLike<ReferencePosition>,\n leftmostTiles: MapLike<ReferencePosition>, rangeStacks: RangeStackMap) {\n function updateRangeInfo(label: string, refPos: ReferencePosition) {\n let stack = rangeStacks[label];\n if (stack === undefined) {\n stack = new Stack<ReferencePosition>();\n rangeStacks[label] = stack;\n }\n applyRangeReference(stack, refPos);\n }\n if (node.isLeaf()) {\n const segment = node;\n if ((mergeTree.localNetLength(segment) ?? 0) > 0) {\n if (Marker.is(segment)) {\n const markerId = segment.getId();\n // Also in insertMarker but need for reload segs case\n // can add option for this only from reload segs\n if (markerId) {\n mergeTree.mapIdToSegment(markerId, segment);\n }\n if (refTypeIncludesFlag(segment, ReferenceType.Tile)) {\n addTile(segment, rightmostTiles);\n addTileIfNotPresent(segment, leftmostTiles);\n }\n if (segment.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n const rangeLabels = refGetRangeLabels(segment);\n if (rangeLabels) {\n for (const label of rangeLabels) {\n updateRangeInfo(label, segment);\n }\n }\n }\n } else {\n const baseSegment = node as BaseSegment;\n if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&\n (baseSegment.localRefs.hierRefCount > 0)) {\n for (const lref of baseSegment.localRefs) {\n if (refTypeIncludesFlag(lref, ReferenceType.Tile)) {\n addTile(lref, rightmostTiles);\n addTileIfNotPresent(lref, leftmostTiles);\n }\n if (lref.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n for (const label of refGetRangeLabels(lref)!) {\n updateRangeInfo(label, lref);\n }\n }\n }\n }\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(rangeStacks, block.rangeStacks);\n extend(rightmostTiles, block.rightmostTiles);\n extendIfUndefined(leftmostTiles, block.leftmostTiles);\n }\n}\n\nexport function ordinalToArray(ord: string) {\n const a: number[] = [];\n if (ord) {\n for (let i = 0, len = ord.length; i < len; i++) {\n a.push(ord.charCodeAt(i));\n }\n }\n return a;\n}\n\n// Note that the actual branching factor of the MergeTree is `MaxNodesInBlock - 1`. This is because\n// the MergeTree always inserts first, then checks for overflow and splits if the child count equals\n// `MaxNodesInBlock`. (i.e., `MaxNodesInBlock` contains 1 extra slot for temporary storage to\n// facilitate splits.)\nexport const MaxNodesInBlock = 8;\n\nexport class MergeBlock extends MergeNode implements IMergeBlock {\n public children: IMergeNode[];\n public constructor(public childCount: number) {\n super();\n this.children = new Array<IMergeNode>(MaxNodesInBlock);\n }\n\n public hierBlock(): HierMergeBlock | undefined {\n return undefined;\n }\n\n public setOrdinal(child: IMergeNode, index: number) {\n let childCount = this.childCount;\n if (childCount === 8) {\n childCount = 7;\n }\n assert((childCount >= 1) && (childCount <= 7), 0x040 /* \"Child count is not within [1,7] range!\" */);\n let localOrdinal: number;\n const ordinalWidth = 1 << (MaxNodesInBlock - (childCount + 1));\n if (index === 0) {\n localOrdinal = ordinalWidth - 1;\n } else {\n const prevOrd = this.children[index - 1].ordinal;\n const prevOrdCode = prevOrd.charCodeAt(prevOrd.length - 1);\n localOrdinal = prevOrdCode + ordinalWidth;\n }\n child.ordinal = this.ordinal + String.fromCharCode(localOrdinal);\n assert(child.ordinal.length === (this.ordinal.length + 1), 0x041 /* \"Unexpected child ordinal length!\" */);\n if (index > 0) {\n assert(\n child.ordinal > this.children[index - 1].ordinal,\n 0x042, /* \"Child ordinal <= previous sibling ordinal!\" */\n );\n }\n }\n\n public assignChild(child: IMergeNode, index: number, updateOrdinal = true) {\n child.parent = this;\n child.index = index;\n if (updateOrdinal) {\n this.setOrdinal(child, index);\n }\n this.children[index] = child;\n }\n}\n\nclass HierMergeBlock extends MergeBlock implements IMergeBlock {\n public rightmostTiles: MapLike<ReferencePosition>;\n public leftmostTiles: MapLike<ReferencePosition>;\n public rangeStacks: MapLike<Stack<ReferencePosition>>;\n\n constructor(childCount: number) {\n super(childCount);\n this.rightmostTiles = createMap<ReferencePosition>();\n this.leftmostTiles = createMap<ReferencePosition>();\n this.rangeStacks = createMap<Stack<ReferencePosition>>();\n }\n\n public addNodeReferences(mergeTree: MergeTree, node: IMergeNode) {\n addNodeReferences(mergeTree, node, this.rightmostTiles, this.leftmostTiles,\n this.rangeStacks);\n }\n\n public hierBlock() {\n return this;\n }\n\n public hierToString(indentCount: number) {\n let strbuf = \"\";\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in this.rangeStacks) {\n const stack = this.rangeStacks[key];\n strbuf += internedSpaces(indentCount);\n strbuf += `${key}: `;\n for (const item of stack.items) {\n strbuf += `${item.toString()} `;\n }\n strbuf += \"\\n\";\n }\n return strbuf;\n }\n}\n\nfunction nodeTotalLength(mergeTree: MergeTree, node: IMergeNode) {\n if (!node.isLeaf()) {\n return node.cachedLength;\n }\n return mergeTree.localNetLength(node);\n}\n\nexport abstract class BaseSegment extends MergeNode implements ISegment {\n public clientId: number = LocalClientId;\n public seq: number = UniversalSequenceNumber;\n public removedSeq?: number;\n public removedClientIds?: number[];\n public readonly segmentGroups: SegmentGroupCollection = new SegmentGroupCollection(this);\n public readonly trackingCollection: TrackingGroupCollection = new TrackingGroupCollection(this);\n public propertyManager?: PropertiesManager;\n public properties?: PropertySet;\n public localRefs?: LocalReferenceCollection;\n public abstract readonly type: string;\n public localSeq?: number;\n public localRemovedSeq?: number;\n\n public addProperties(newProps: PropertySet, op?: ICombiningOp, seq?: number, collabWindow?: CollaborationWindow) {\n if (!this.propertyManager) {\n this.propertyManager = new PropertiesManager();\n }\n if (!this.properties) {\n this.properties = createMap<any>();\n }\n return this.propertyManager.addProperties(\n this.properties,\n newProps,\n op,\n seq,\n collabWindow && collabWindow.collaborating,\n );\n }\n\n public hasProperty(key: string): boolean {\n return !!this.properties && (this.properties[key] !== undefined);\n }\n\n public isLeaf() {\n return true;\n }\n\n protected cloneInto(b: ISegment) {\n b.clientId = this.clientId;\n // TODO: deep clone properties\n b.properties = clone(this.properties);\n b.removedClientIds = this.removedClientIds?.slice();\n // TODO: copy removed client overlap and branch removal info\n b.removedSeq = this.removedSeq;\n b.seq = this.seq;\n }\n\n public canAppend(segment: ISegment): boolean {\n return false;\n }\n\n protected addSerializedProps(jseg: IJSONSegment) {\n if (this.properties) {\n jseg.props = this.properties;\n }\n }\n\n public abstract toJSONObject(): any;\n\n public ack(segmentGroup: SegmentGroup, opArgs: IMergeTreeDeltaOpArgs, mergeTree: MergeTree): boolean {\n const currentSegmentGroup = this.segmentGroups.dequeue();\n assert(currentSegmentGroup === segmentGroup, 0x043 /* \"On ack, unexpected segmentGroup!\" */);\n switch (opArgs.op.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(!!this.propertyManager, 0x044 /* \"On annotate ack, missing segment property manager!\" */);\n this.propertyManager.ackPendingProperties(opArgs.op);\n return true;\n\n case MergeTreeDeltaType.INSERT:\n assert(this.seq === UnassignedSequenceNumber, 0x045 /* \"On insert, seq number already assigned!\" */);\n this.seq = opArgs.sequencedMessage!.sequenceNumber;\n this.localSeq = undefined;\n return true;\n\n case MergeTreeDeltaType.REMOVE:\n const removalInfo: IRemovalInfo | undefined = toRemovalInfo(this);\n assert(removalInfo !== undefined, 0x046 /* \"On remove ack, missing removal info!\" */);\n this.localRemovedSeq = undefined;\n if (removalInfo.removedSeq === UnassignedSequenceNumber) {\n removalInfo.removedSeq = opArgs.sequencedMessage!.sequenceNumber;\n return true;\n }\n return false;\n\n default:\n throw new Error(`${opArgs.op.type} is in unrecognized operation type`);\n }\n }\n\n public splitAt(pos: number): ISegment | undefined {\n if (pos > 0) {\n const leafSegment = this.createSplitSegmentAt(pos);\n if (leafSegment) {\n this.copyPropertiesTo(leafSegment);\n leafSegment.parent = this.parent;\n\n // Give the leaf a temporary yet valid ordinal.\n // when this segment is put in the tree, it will get it's real ordinal,\n // but this ordinal meets all the necessary invariants for now.\n leafSegment.ordinal = this.ordinal + String.fromCharCode(0);\n\n leafSegment.removedClientIds = this.removedClientIds?.slice();\n leafSegment.removedSeq = this.removedSeq;\n leafSegment.localRemovedSeq = this.localRemovedSeq;\n leafSegment.seq = this.seq;\n leafSegment.localSeq = this.localSeq;\n leafSegment.clientId = this.clientId;\n this.segmentGroups.copyTo(leafSegment);\n this.trackingCollection.copyTo(leafSegment);\n if (this.localRefs) {\n this.localRefs.split(pos, leafSegment);\n }\n }\n return leafSegment;\n }\n }\n\n private copyPropertiesTo(other: ISegment) {\n if (this.propertyManager) {\n if (this.properties) {\n other.propertyManager = new PropertiesManager();\n other.properties = this.propertyManager.copyTo(\n this.properties,\n other.properties,\n other.propertyManager,\n );\n }\n }\n }\n\n public abstract clone(): ISegment;\n public abstract append(segment: ISegment): void;\n protected abstract createSplitSegmentAt(pos: number): BaseSegment | undefined;\n}\n\nexport const reservedMarkerIdKey = \"markerId\";\nexport const reservedMarkerSimpleTypeKey = \"markerSimpleType\";\n\nexport interface IJSONMarkerSegment extends IJSONSegment {\n marker: IMarkerDef;\n}\n\nexport class Marker extends BaseSegment implements ReferencePosition {\n public static readonly type = \"Marker\";\n public static is(segment: ISegment): segment is Marker {\n return segment.type === Marker.type;\n }\n public readonly type = Marker.type;\n\n public static make(\n refType: ReferenceType, props?: PropertySet) {\n const marker = new Marker(refType);\n if (props) {\n marker.addProperties(props);\n }\n return marker;\n }\n\n constructor(public refType: ReferenceType) {\n super();\n this.cachedLength = 1;\n }\n\n toJSONObject() {\n const obj: IJSONMarkerSegment = { marker: { refType: this.refType } };\n super.addSerializedProps(obj);\n return obj;\n }\n\n static fromJSONObject(spec: any) {\n if (spec && typeof spec === \"object\" && \"marker\" in spec) {\n return Marker.make(\n spec.marker.refType,\n spec.props as PropertySet);\n }\n return undefined;\n }\n\n clone() {\n const b = Marker.make(this.refType, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n getSegment() {\n return this;\n }\n\n getOffset() {\n return 0;\n }\n\n hasSimpleType(simpleTypeName: string) {\n return !!this.properties &&\n this.properties[reservedMarkerSimpleTypeKey] === simpleTypeName;\n }\n\n getProperties() {\n return this.properties;\n }\n\n getId(): string | undefined {\n if (this.properties && this.properties[reservedMarkerIdKey]) {\n return this.properties[reservedMarkerIdKey] as string;\n }\n }\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels() {\n return refHasTileLabels(this);\n }\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels() {\n return refHasRangeLabels(this);\n }\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean {\n return refHasTileLabel(this, label);\n }\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean {\n return refHasRangeLabel(this, label);\n }\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined {\n return refGetTileLabels(this);\n }\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined {\n return refGetRangeLabels(this);\n }\n\n toString() {\n let bbuf = \"\";\n if (refTypeIncludesFlag(this, ReferenceType.Tile)) {\n bbuf += \"Tile\";\n }\n if (refTypeIncludesFlag(this, ReferenceType.NestBegin)) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeBegin\";\n }\n if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {\n if (bbuf.length > 0) {\n bbuf += \"; \";\n }\n bbuf += \"RangeEnd\";\n }\n let lbuf = \"\";\n const id = this.getId();\n if (id) {\n bbuf += ` (${id}) `;\n }\n const tileLabels = refGetTileLabels(this);\n if (tileLabels) {\n lbuf += \"tile -- \";\n for (let i = 0, len = tileLabels.length; i < len; i++) {\n const tileLabel = tileLabels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += tileLabel;\n }\n }\n const rangeLabels = refGetRangeLabels(this);\n if (rangeLabels) {\n let rangeKind = \"begin\";\n if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {\n rangeKind = \"end\";\n }\n if (tileLabels) {\n lbuf += \" \";\n }\n lbuf += `range ${rangeKind} -- `;\n const labels = rangeLabels;\n for (let i = 0, len = labels.length; i < len; i++) {\n const rangeLabel = labels[i];\n if (i > 0) {\n lbuf += \"; \";\n }\n lbuf += rangeLabel;\n }\n }\n let pbuf = \"\";\n if (this.properties) {\n pbuf += JSON.stringify(this.properties, (key, value) => {\n // Avoid circular reference when stringifying makers containing handles.\n // (Substitute a debug string instead.)\n const handle = !!value && value.IFluidHandle;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return handle\n ? `#Handle(${handle.routeContext.path}/${handle.path})`\n : value;\n });\n }\n return `M ${bbuf}: ${lbuf} ${pbuf}`;\n }\n\n protected createSplitSegmentAt(pos: number) {\n return undefined;\n }\n\n canAppend(segment: ISegment): boolean {\n return false;\n }\n\n append() { throw new Error(\"Can not append to marker\"); }\n}\n\nexport enum IncrementalExecOp {\n Go,\n Stop,\n Yield,\n}\n\nexport class IncrementalMapState<TContext> {\n op = IncrementalExecOp.Go;\n constructor(\n public block: IMergeBlock,\n public actions: IncrementalSegmentActions<TContext>,\n public pos: number,\n public refSeq: number,\n public clientId: number,\n public context: TContext,\n public start: number,\n public end: number,\n public childIndex = 0,\n ) {\n }\n}\n\nexport class CollaborationWindow {\n clientId = LocalClientId;\n collaborating = false;\n // Lowest-numbered segment in window; no client can reference a state before this one\n minSeq = 0;\n // Highest-numbered segment in window and current\n // reference segment for this client\n currentSeq = 0;\n\n localSeq = 0;\n\n loadFrom(a: CollaborationWindow) {\n this.clientId = a.clientId;\n this.collaborating = a.collaborating;\n this.minSeq = a.minSeq;\n this.currentSeq = a.currentSeq;\n }\n}\n\nexport const compareNumbers = (a: number, b: number) => a - b;\n\nexport const compareStrings = (a: string, b: string) => a.localeCompare(b);\n\nconst indentStrings = [\"\", \" \", \" \"];\nexport function internedSpaces(n: number) {\n if (indentStrings[n] === undefined) {\n indentStrings[n] = \"\";\n for (let i = 0; i < n; i++) {\n indentStrings[n] += \" \";\n }\n }\n return indentStrings[n];\n}\n\nexport interface IConsensusInfo {\n marker: Marker;\n callback: (m: Marker) => void;\n}\n\nexport interface ClientSeq {\n refSeq: number;\n clientId: string;\n}\n\nexport const clientSeqComparer: Comparer<ClientSeq> = {\n min: { refSeq: -1, clientId: \"\" },\n compare: (a, b) => a.refSeq - b.refSeq,\n};\n\nexport interface LRUSegment {\n segment?: ISegment;\n maxSeq: number;\n}\n\nconst LRUSegmentComparer: Comparer<LRUSegment> = {\n min: { maxSeq: -2 },\n compare: (a, b) => a.maxSeq - b.maxSeq,\n};\n\nexport interface SegmentAccumulator {\n segments: ISegment[];\n}\n\ninterface IReferenceSearchInfo {\n mergeTree: MergeTree;\n tileLabel: string;\n posPrecedesTile?: boolean;\n tile?: ReferencePosition;\n}\n\ninterface IMarkerSearchRangeInfo {\n mergeTree: MergeTree;\n rangeLabels: string[];\n stacks: RangeStackMap;\n}\n\nfunction applyLeafRangeMarker(marker: Marker, searchInfo: IMarkerSearchRangeInfo) {\n for (const rangeLabel of searchInfo.rangeLabels) {\n if (refHasRangeLabel(marker, rangeLabel)) {\n let currentStack = searchInfo.stacks[rangeLabel];\n if (currentStack === undefined) {\n currentStack = new Stack<Marker>();\n searchInfo.stacks[rangeLabel] = currentStack;\n }\n applyRangeReference(currentStack, marker);\n }\n }\n}\nfunction recordRangeLeaf(\n segment: ISegment, segpos: number,\n refSeq: number, clientId: number, start: number | undefined, end: number | undefined,\n searchInfo: IMarkerSearchRangeInfo) {\n if (Marker.is(segment)) {\n if (segment.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(segment, searchInfo);\n }\n }\n return false;\n}\n\nfunction rangeShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IMarkerSearchRangeInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if (((searchInfo.mergeTree.localNetLength(seg) ?? 0) > 0) && Marker.is(seg)) {\n if (seg.refType &\n (ReferenceType.NestBegin | ReferenceType.NestEnd)) {\n applyLeafRangeMarker(seg, searchInfo);\n }\n }\n } else {\n const block = <IHierBlock>node;\n applyStackDelta(searchInfo.stacks, block.rangeStacks);\n }\n return true;\n}\n\nfunction recordTileStart(\n segment: ISegment,\n segpos: number,\n refSeq: number,\n clientId: number,\n start: number,\n end: number,\n searchInfo: IReferenceSearchInfo) {\n if (Marker.is(segment)) {\n if (refHasTileLabel(segment, searchInfo.tileLabel)) {\n searchInfo.tile = segment;\n }\n }\n return false;\n}\n\nfunction tileShift(\n node: IMergeNode, segpos: number, refSeq: number, clientId: number,\n offset: number | undefined, end: number | undefined, searchInfo: IReferenceSearchInfo) {\n if (node.isLeaf()) {\n const seg = node;\n if ((searchInfo.mergeTree.localNetLength(seg) > 0) && Marker.is(seg)) {\n if (refHasTileLabel(seg, searchInfo.tileLabel)) {\n searchInfo.tile = seg;\n }\n }\n } else {\n const block = <IHierBlock>node;\n let marker: Marker;\n if (searchInfo.posPrecedesTile) {\n marker = <Marker>block.rightmostTiles[searchInfo.tileLabel];\n } else {\n marker = <Marker>block.leftmostTiles[searchInfo.tileLabel];\n }\n if (marker !== undefined) {\n searchInfo.tile = marker;\n }\n }\n return true;\n}\n\nexport interface MinListener {\n minRequired: number;\n onMinGE(minSeq: number): void;\n}\n\nconst minListenerComparer: Comparer<MinListener> = {\n min: { minRequired: Number.MIN_VALUE, onMinGE: () => { assert(false, 0x048 /* \"onMinGE()\" */); } },\n compare: (a, b) => a.minRequired - b.minRequired,\n};\n\nexport type LocalReferenceMapper = (id: string) => LocalReference;\n\n// Represents a sequence of text segments\nexport class MergeTree {\n private static readonly zamboniSegmentsMaxCount = 2;\n public static readonly options = {\n incrementalUpdate: true,\n insertAfterRemovedSegs: true,\n zamboniSegments: true,\n };\n\n private static readonly initBlockUpdateActions: BlockUpdateActions;\n private static readonly theUnfinishedNode = <IMergeBlock>{ childCount: -1 };\n\n root: IMergeBlock;\n private readonly blockUpdateActions: BlockUpdateActions = MergeTree.initBlockUpdateActions;\n public readonly collabWindow = new CollaborationWindow();\n public pendingSegments: List<SegmentGroup> | undefined;\n private segmentsToScour: Heap<LRUSegment> | undefined;\n // TODO: add remove on segment remove\n // for now assume only markers have ids and so point directly at the Segment\n // if we need to have pointers to non-markers, we can change to point at local refs\n private readonly idToSegment = new Map<string, ISegment>();\n private minSeqListeners: Heap<MinListener> | undefined;\n public mergeTreeDeltaCallback?: MergeTreeDeltaCallback;\n public mergeTreeMaintenanceCallback?: MergeTreeMaintenanceCallback;\n\n // TODO: make and use interface describing options\n public constructor(public options?: PropertySet) {\n this.root = this.makeBlock(0);\n }\n\n private makeBlock(childCount: number) {\n const block: MergeBlock = new HierMergeBlock(childCount);\n block.ordinal = \"\";\n return block;\n }\n\n public clone() {\n const b = new MergeTree(this.options);\n // For now assume that b will not collaborate\n b.root = b.blockClone(this.root);\n }\n\n public blockClone(block: IMergeBlock, segments?: ISegment[]) {\n const bBlock = this.makeBlock(block.childCount);\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n const segment = this.segmentClone(child);\n bBlock.assignChild(segment, i);\n if (segments) {\n segments.push(segment);\n }\n } else {\n bBlock.assignChild(this.blockClone(child, segments), i);\n }\n }\n this.nodeUpdateLengthNewStructure(bBlock);\n this.nodeUpdateOrdinals(bBlock);\n return bBlock;\n }\n\n private segmentClone(segment: ISegment) {\n const b = segment.clone();\n return b;\n }\n\n public localNetLength(segment: ISegment) {\n const removalInfo = toRemovalInfo(segment);\n if (removalInfo !== undefined) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n }\n\n // TODO: remove id when segment removed\n public mapIdToSegment(id: string, segment: ISegment) {\n this.idToSegment.set(id, segment);\n }\n\n private addNode(block: IMergeBlock, node: IMergeNode) {\n const index = block.childCount++;\n block.assignChild(node, index, false);\n return index;\n }\n\n /* eslint-disable max-len */\n public reloadFromSegments(segments: ISegment[]) {\n // This code assumes that a later call to `startCollaboration()` will initialize partial lengths.\n assert(!this.collabWindow.collaborating, 0x049 /* \"Trying to reload from segments while collaborating!\" */);\n\n const maxChildren = MaxNodesInBlock - 1;\n\n // Starting with the leaf segments, recursively builds the B-Tree layer by layer from the bottom up.\n const buildMergeBlock = (nodes: IMergeNode[]) => {\n const blockCount = Math.ceil(nodes.length / maxChildren); // Compute # blocks require for this level of B-Tree\n const blocks: IMergeBlock[] = new Array(blockCount); // Pre-alloc array to collect nodes\n\n // For each block in this level of the B-Tree...\n for (let nodeIndex = 0, blockIndex = 0; // Start with the first block and first node\n blockIndex < blockCount; // If we have more blocks, we also have more nodes to insert\n blockIndex++ // Advance to next block in this layer.\n ) {\n const block = blocks[blockIndex] = this.makeBlock(0);\n\n // For each child of the current block, insert a node (while we have nodes left)\n // and update the block's info.\n for (let childIndex = 0;\n childIndex < maxChildren && nodeIndex < nodes.length; // While we still have children & nodes left\n childIndex++, nodeIndex++ // Advance to next child & node\n ) {\n // Insert the next node into the current block\n this.addNode(block, nodes[nodeIndex]);\n }\n\n // Calculate this block's info. Previously this was inlined into the above loop as a micro-optimization,\n // but it turns out to be negligible in practice since `reloadFromSegments()` is only invoked for the\n // snapshot header. The bulk of the segments in long documents are inserted via `insertSegments()`.\n this.blockUpdate(block);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return blocks.length === 1 // If there is only one block at this layer...\n ? blocks[0] // ...then we're done. Return the root.\n : buildMergeBlock(blocks); // ...otherwise recursively build the next layer above blocks.\n };\n if (segments.length > 0) {\n this.root = buildMergeBlock(segments);\n this.nodeUpdateOrdinals(this.root);\n } else {\n this.root = this.makeBlock(0);\n }\n }\n /* eslint-enable max-len */\n\n // For now assume min starts at zero\n public startCollaboration(localClientId: number, minSeq: number, currentSeq: number) {\n this.collabWindow.clientId = localClientId;\n this.collabWindow.minSeq = minSeq;\n this.collabWindow.collaborating = true;\n this.collabWindow.currentSeq = currentSeq;\n this.segmentsToScour = new Heap<LRUSegment>([], LRUSegmentComparer);\n this.pendingSegments = ListMakeHead<SegmentGroup>();\n this.nodeUpdateLengthNewStructure(this.root, true);\n }\n\n private addToLRUSet(segment: ISegment, seq: number) {\n // If the parent node has not yet been marked for scour (i.e., needsScour is not false or undefined),\n // add the segment and mark the mark the node now.\n\n // TODO: 'seq' may be less than the current sequence number when inserting pre-ACKed\n // segments from a snapshot. We currently skip these for now.\n if (segment.parent!.needsScour !== true && seq > this.collabWindow.currentSeq) {\n segment.parent!.needsScour = true;\n this.segmentsToScour!.add({ segment, maxSeq: seq });\n }\n }\n\n private underflow(node: IMergeBlock) {\n return node.childCount < (MaxNodesInBlock / 2);\n }\n\n private scourNode(node: IMergeBlock, holdNodes: IMergeNode[]) {\n let prevSegment: ISegment | undefined;\n for (let k = 0; k < node.childCount; k++) {\n const childNode = node.children[k];\n if (childNode.isLeaf()) {\n const segment = childNode;\n if (segment.segmentGroups.empty) {\n if (segment.removedSeq !== undefined) {\n if (segment.removedSeq > this.collabWindow.minSeq) {\n holdNodes.push(segment);\n } else if (!segment.trackingCollection.empty) {\n holdNodes.push(segment);\n } else {\n // Notify maintenance event observers that the segment is being unlinked from the MergeTree\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n operation: MergeTreeMaintenanceType.UNLINK,\n deltaSegments: [{ segment }],\n },\n undefined,\n );\n }\n\n segment.parent = undefined;\n }\n prevSegment = undefined;\n } else {\n if (segment.seq! <= this.collabWindow.minSeq) {\n const canAppend = prevSegment\n && prevSegment.canAppend(segment)\n && matchProperties(prevSegment.properties, segment.properties)\n && prevSegment.trackingCollection.matches(segment.trackingCollection)\n && this.localNetLength(segment) > 0;\n\n if (canAppend) {\n prevSegment!.append(segment);\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n operation: MergeTreeMaintenanceType.APPEND,\n deltaSegments: [{ segment: prevSegment! }, { segment }],\n },\n undefined,\n );\n }\n segment.parent = undefined;\n segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));\n } else {\n holdNodes.push(segment);\n if (this.localNetLength(segment) > 0) {\n prevSegment = segment;\n } else {\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n }\n } else {\n holdNodes.push(segment);\n prevSegment = undefined;\n }\n } else {\n holdNodes.push(childNode);\n prevSegment = undefined;\n }\n }\n }\n\n // Interior node with all node children\n private packParent(parent: IMergeBlock) {\n const children = parent.children;\n let childIndex: number;\n let childBlock: IMergeBlock;\n const holdNodes: IMergeNode[] = [];\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n // Debug assert not isLeaf()\n childBlock = <IMergeBlock>children[childIndex];\n this.scourNode(childBlock, holdNodes);\n // Will replace this block with a packed block\n childBlock.parent = undefined;\n }\n const totalNodeCount = holdNodes.length;\n const halfCount = MaxNodesInBlock / 2;\n let childCount = Math.min(MaxNodesInBlock - 1, Math.floor(totalNodeCount / halfCount));\n if (childCount < 1) {\n childCount = 1;\n }\n const baseCount = Math.floor(totalNodeCount / childCount);\n let extraCount = totalNodeCount % childCount;\n const packedBlocks = new Array<IMergeBlock>(MaxNodesInBlock);\n let readCount = 0;\n for (let nodeIndex = 0; nodeIndex < childCount; nodeIndex++) {\n let nodeCount = baseCount;\n if (extraCount > 0) {\n nodeCount++;\n extraCount--;\n }\n const packedBlock = this.makeBlock(nodeCount);\n for (let packedNodeIndex = 0; packedNodeIndex < nodeCount; packedNodeIndex++) {\n const nodeToPack = holdNodes[readCount++];\n packedBlock.assignChild(nodeToPack, packedNodeIndex, false);\n }\n packedBlock.parent = parent;\n packedBlocks[nodeIndex] = packedBlock;\n this.nodeUpdateLengthNewStructure(packedBlock);\n }\n parent.children = packedBlocks;\n for (let j = 0; j < childCount; j++) {\n parent.assignChild(packedBlocks[j], j, false);\n }\n parent.childCount = childCount;\n if (this.underflow(parent) && (parent.parent)) {\n this.packParent(parent.parent);\n } else {\n this.nodeUpdateOrdinals(parent);\n this.blockUpdatePathLengths(parent, UnassignedSequenceNumber, -1, true);\n }\n }\n\n private zamboniSegments(zamboniSegmentsMaxCount = MergeTree.zamboniSegmentsMaxCount) {\n if (!this.collabWindow.collaborating) {\n return;\n }\n\n for (let i = 0; i < zamboniSegmentsMaxCount; i++) {\n let segmentToScour = this.segmentsToScour!.peek();\n if (!segmentToScour || segmentToScour.maxSeq > this.collabWindow.minSeq) {\n break;\n }\n segmentToScour = this.segmentsToScour!.get();\n // Only skip scouring if needs scour is explicitly false, not true or undefined\n if (segmentToScour.segment!.parent && segmentToScour.segment!.parent.needsScour !== false) {\n const block = segmentToScour.segment!.parent;\n const childrenCopy: IMergeNode[] = [];\n this.scourNode(block, childrenCopy);\n // This will avoid the cost of re-scouring nodes\n // that have recently been scoured\n block.needsScour = false;\n\n const newChildCount = childrenCopy.length;\n\n if (newChildCount < block.childCount) {\n block.childCount = newChildCount;\n block.children = childrenCopy;\n for (let j = 0; j < newChildCount; j++) {\n block.assignChild(childrenCopy[j], j, false);\n }\n\n if (this.underflow(block) && block.parent) {\n this.packParent(block.parent);\n } else {\n this.nodeUpdateOrdinals(block);\n this.blockUpdatePathLengths(block, UnassignedSequenceNumber, -1, true);\n }\n }\n }\n }\n }\n\n public getCollabWindow() {\n return this.collabWindow;\n }\n\n public getStats() {\n const nodeGetStats = (block: IMergeBlock): MergeTreeStats => {\n const stats: MergeTreeStats = {\n maxHeight: 0,\n nodeCount: 0,\n leafCount: 0,\n removedLeafCount: 0,\n liveCount: 0,\n histo: [],\n };\n for (let k = 0; k < MaxNodesInBlock; k++) {\n stats.histo[k] = 0;\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n let height = 1;\n if (!child.isLeaf()) {\n const childStats = nodeGetStats(child);\n height = 1 + childStats.maxHeight;\n stats.nodeCount += childStats.nodeCount;\n stats.leafCount += childStats.leafCount;\n stats.removedLeafCount += childStats.removedLeafCount;\n stats.liveCount += childStats.liveCount;\n for (let j = 0; j < MaxNodesInBlock; j++) {\n stats.histo[j] += childStats.histo[j];\n }\n } else {\n stats.leafCount++;\n const segment = child;\n if (segment.removedSeq !== undefined) {\n stats.removedLeafCount++;\n }\n }\n if (height > stats.maxHeight) {\n stats.maxHeight = height;\n }\n }\n stats.histo[block.childCount]++;\n stats.nodeCount++;\n stats.liveCount += block.childCount;\n return stats;\n };\n const rootStats = nodeGetStats(this.root);\n return rootStats;\n }\n\n public getLength(refSeq: number, clientId: number) {\n return this.blockLength(this.root, refSeq, clientId);\n }\n\n /**\n * Returns the current length of the MergeTree for the local client.\n */\n public get length() { return this.root.cachedLength; }\n\n public getPosition(node: MergeNode, refSeq: number, clientId: number) {\n let totalOffset = 0;\n let parent = node.parent;\n let prevParent: IMergeBlock | undefined;\n while (parent) {\n const children = parent.children;\n for (let childIndex = 0; childIndex < parent.childCount; childIndex++) {\n const child = children[childIndex];\n if ((prevParent && (child === prevParent)) || (child === node)) {\n break;\n }\n totalOffset += this.nodeLength(child, refSeq, clientId) ?? 0;\n }\n prevParent = parent;\n parent = parent.parent;\n }\n return totalOffset;\n }\n\n public getContainingSegment<T extends ISegment>(pos: number, refSeq: number, clientId: number) {\n let segment: T | undefined;\n let offset: number | undefined;\n\n const leaf = (leafSeg: ISegment, segpos: number, _refSeq: number, _clientId: number, start: number) => {\n segment = leafSeg as T;\n offset = start;\n return false;\n };\n this.searchBlock(this.root, pos, 0, refSeq, clientId, { leaf }, undefined);\n return { segment, offset };\n }\n\n /**\n * @internal must only be used by client\n * @param segoff - The segment and offset to slide from\n * @returns The segment and offset to slide to\n */\n public _getSlideToSegment(segoff: { segment: ISegment | undefined; offset: number | undefined; }) {\n if (!segoff.segment || !isRemovedAndAcked(segoff.segment)) {\n return segoff;\n }\n // Slide to the next farthest valid segment in the tree. If no such segment is found\n // slide to the last valid segment.\n // TODO this walks the whole tree to find the segment - could write a more efficient\n // walk that starts at the segment\n let foundStart = false;\n let foundSegmentPastStart = false;\n let slideToSegment: ISegment | undefined;\n this.walkAllSegments(this.root, (seg) => {\n if (seg.seq !== UnassignedSequenceNumber && !isRemovedAndAcked(seg)) {\n slideToSegment = seg;\n if (foundStart) {\n foundSegmentPastStart = true;\n return false;\n }\n }\n if (!foundStart && seg === segoff.segment) {\n foundStart = true;\n }\n return true;\n });\n let offset = 0;\n if (slideToSegment && !foundSegmentPastStart) {\n // If slid nearer then offset should be at the end of the segment\n offset = slideToSegment.cachedLength - 1;\n }\n return { segment: slideToSegment, offset };\n }\n\n /**\n * This method should only be called when the current client sequence number is\n * max(remove segment sequence number, add reference sequence number).\n * Otherwise eventual consistency is not guaranteed.\n * See `packages\\dds\\merge-tree\\REFERENCEPOSITIONS.md`\n */\n private slideReferences(segment: ISegment, refsToSlide: LocalReference[]) {\n assert(\n isRemovedAndAcked(segment),\n 0x2f1 /* slideReferences from a segment which has not been removed and acked */);\n assert(!!segment.localRefs, 0x2f2 /* Ref not in the segment localRefs */);\n const newSegoff = this._getSlideToSegment({ segment, offset: 0 });\n const newSegment = newSegoff.segment;\n if (newSegment && !newSegment.localRefs) {\n newSegment.localRefs = new LocalReferenceCollection(newSegment);\n }\n for (const ref of refsToSlide) {\n const removedRef = segment.localRefs.removeLocalRef(ref);\n assert(ref === removedRef, 0x2f3 /* Ref not in the segment localRefs */);\n if (!newSegment) {\n // No valid segments (all nodes removed or not yet created)\n ref.segment = undefined;\n ref.offset = 0;\n } else {\n ref.segment = newSegment;\n ref.offset = newSegoff.offset ?? 0;\n assert(!!newSegment.localRefs, 0x2f4 /* localRefs must be allocated */);\n newSegment.localRefs.addLocalRef(ref);\n }\n }\n // TODO is it required to update the path lengths?\n if (newSegment) {\n this.blockUpdatePathLengths(newSegment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n\n private updateSegmentRefsAfterMarkRemoved(segment: ISegment, pending: boolean) {\n if (!segment.localRefs || segment.localRefs.empty) {\n return;\n }\n const refsToSlide: LocalReference[] = [];\n const refsToStay: LocalReference[] = [];\n for (const lref of segment.localRefs) {\n if (refTypeIncludesFlag(lref, ReferenceType.StayOnRemove)) {\n refsToStay.push(lref);\n } else if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {\n if (pending) {\n refsToStay.push(lref);\n } else {\n refsToSlide.push(lref);\n }\n }\n }\n // Rethink implementation of keeping and sliding refs once other reference\n // changes are complete. This works but is fragile and possibly slow.\n if (!pending) {\n this.slideReferences(segment, refsToSlide);\n }\n segment.localRefs.clear();\n for (const lref of refsToStay) {\n lref.segment = segment;\n segment.localRefs.addLocalRef(lref);\n }\n }\n\n private blockLength(node: IMergeBlock, refSeq: number, clientId: number) {\n if ((this.collabWindow.collaborating) && (clientId !== this.collabWindow.clientId)) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n return node.cachedLength;\n }\n }\n\n private nodeLength(node: IMergeNode, refSeq: number, clientId: number) {\n if ((!this.collabWindow.collaborating) || (this.collabWindow.clientId === clientId)) {\n // Local client sees all segments, even when collaborating\n if (!node.isLeaf()) {\n return node.cachedLength;\n } else {\n return this.localNetLength(node);\n }\n } else {\n // Sequence number within window\n if (!node.isLeaf()) {\n return node.partialLengths!.getPartialLength(refSeq, clientId);\n } else {\n const segment = node;\n const removalInfo = toRemovalInfo(segment);\n\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber\n && removalInfo.removedSeq <= refSeq) {\n // this segment is a tombstone eligible for zamboni\n // so should never be considered, as it may not exist\n // on other clients\n return undefined;\n }\n if (((segment.clientId === clientId) ||\n ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= refSeq)))) {\n // Segment happened by reference sequence number or segment from requesting client\n if (removalInfo !== undefined) {\n if (removalInfo.removedClientIds.includes(clientId)) {\n return 0;\n } else {\n return segment.cachedLength;\n }\n } else {\n return segment.cachedLength;\n }\n } else {\n // the segment was inserted and removed before the\n // this context, so it will never exist for this\n // context\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n return undefined;\n }\n // Segment invisible to client at reference sequence number/branch id/client id of op\n return 0;\n }\n }\n }\n }\n\n public addMinSeqListener(minRequired: number, onMinGE: (minSeq: number) => void) {\n if (!this.minSeqListeners) {\n this.minSeqListeners = new Heap<MinListener>([],\n minListenerComparer);\n }\n this.minSeqListeners.add({ minRequired, onMinGE });\n }\n\n private notifyMinSeqListeners() {\n if (this.minSeqListeners) {\n while ((this.minSeqListeners.count() > 0) &&\n (this.minSeqListeners.peek().minRequired <= this.collabWindow.minSeq)) {\n const minListener = this.minSeqListeners.get()!;\n minListener.onMinGE(this.collabWindow.minSeq);\n }\n }\n }\n\n public setMinSeq(minSeq: number) {\n assert(\n minSeq <= this.collabWindow.currentSeq,\n 0x04e, /* \"Trying to set minSeq above currentSeq of collab window!\" */\n );\n\n // Only move forward\n assert(this.collabWindow.minSeq <= minSeq, 0x04f /* \"minSeq of collab window > target minSeq!\" */);\n\n if (minSeq > this.collabWindow.minSeq) {\n this.collabWindow.minSeq = minSeq;\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n this.notifyMinSeqListeners();\n }\n }\n\n public referencePositionToLocalPosition(\n refPos: ReferencePosition,\n refSeq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n const seg = refPos.getSegment();\n if (seg && seg.parent) {\n const offset = !seg.removedSeq ? refPos.getOffset() : 0;\n return offset + this.getPosition(seg, refSeq, clientId);\n }\n return LocalReference.DetachedPosition;\n }\n\n public getStackContext(startPos: number, clientId: number, rangeLabels: string[]) {\n const searchInfo: IMarkerSearchRangeInfo = {\n mergeTree: this,\n stacks: createMap<Stack<Marker>>(),\n rangeLabels,\n };\n\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordRangeLeaf, shift: rangeShift }, searchInfo);\n return searchInfo.stacks;\n }\n\n // TODO: filter function\n public findTile(startPos: number, clientId: number, tileLabel: string, posPrecedesTile = true) {\n const searchInfo: IReferenceSearchInfo = {\n mergeTree: this,\n posPrecedesTile,\n tileLabel,\n };\n\n if (posPrecedesTile) {\n this.search(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n } else {\n this.backwardSearch(startPos, UniversalSequenceNumber, clientId,\n { leaf: recordTileStart, shift: tileShift }, searchInfo);\n }\n\n if (searchInfo.tile) {\n let pos: number;\n if (searchInfo.tile.isLeaf()) {\n const marker = <Marker>searchInfo.tile;\n pos = this.getPosition(marker, UniversalSequenceNumber, clientId);\n } else {\n const localRef = <LocalReference>searchInfo.tile;\n pos = localRef.toPosition();\n }\n return { tile: searchInfo.tile, pos };\n }\n }\n\n private search<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n return this.searchBlock(this.root, pos, 0, refSeq, clientId, actions, clientData);\n }\n\n private searchBlock<TClientData>(\n block: IMergeBlock, pos: number, segpos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _pos = pos;\n let _segpos = segpos;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = 0; childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (\n (!contains && _pos < len)\n || (contains && contains(child, _pos, refSeq, clientId, undefined, undefined, clientData))\n ) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.searchBlock(child, _pos, _segpos, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, _segpos, refSeq, clientId, _pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, _segpos, refSeq, clientId, _pos, undefined, clientData);\n }\n _pos -= len;\n _segpos += len;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segpos, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private backwardSearch<TClientData>(\n pos: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n const len = this.getLength(refSeq, clientId);\n if (pos > len) {\n return undefined;\n }\n return this.backwardSearchBlock(this.root, pos, len, refSeq, clientId, actions, clientData);\n }\n\n private backwardSearchBlock<TClientData>(\n block: IMergeBlock, pos: number, segEnd: number, refSeq: number, clientId: number,\n actions: SegmentActions<TClientData> | undefined, clientData: TClientData): ISegment | undefined {\n let _segEnd = segEnd;\n const children = block.children;\n if (actions && actions.pre) {\n actions.pre(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n const contains = actions && actions.contains;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n const segpos = _segEnd - len;\n if (((!contains) && (pos >= segpos)) ||\n (contains && contains(child, pos, refSeq, clientId, undefined, undefined, clientData))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n return this.backwardSearchBlock(child, pos, _segEnd, refSeq, clientId, actions, clientData);\n } else {\n if (actions && actions.leaf) {\n actions.leaf(child, segpos, refSeq, clientId, pos, -1, clientData);\n }\n return child;\n }\n } else {\n if (actions && actions.shift) {\n actions.shift(child, segpos, refSeq, clientId, pos, undefined, clientData);\n }\n _segEnd = segpos;\n }\n }\n if (actions && actions.post) {\n actions.post(block, _segEnd, refSeq, clientId, undefined, undefined, clientData);\n }\n }\n\n private updateRoot(splitNode: IMergeBlock | undefined) {\n if (splitNode !== undefined) {\n const newRoot = this.makeBlock(2);\n newRoot.assignChild(this.root, 0, false);\n newRoot.assignChild(splitNode, 1, false);\n this.root = newRoot;\n this.nodeUpdateOrdinals(this.root);\n this.nodeUpdateLengthNewStructure(this.root);\n }\n }\n\n /**\n * Assign sequence number to existing segment; update partial lengths to reflect the change\n * @param seq - sequence number given by server to pending segment\n */\n public ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const seq = opArgs.sequencedMessage!.sequenceNumber;\n const pendingSegmentGroup = this.pendingSegments!.dequeue();\n const nodesToUpdate: IMergeBlock[] = [];\n let overwrite = false;\n if (pendingSegmentGroup !== undefined) {\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n pendingSegmentGroup.segments.map((pendingSegment) => {\n const modified = pendingSegment.ack(pendingSegmentGroup, opArgs, this);\n // This computation of overwrite appears incorrect. Leaving as is to avoid breaking something.\n overwrite = !modified || overwrite;\n\n if (modified && opArgs.op.type === MergeTreeDeltaType.REMOVE) {\n this.updateSegmentRefsAfterMarkRemoved(pendingSegment, false);\n }\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(pendingSegment, seq);\n }\n if (!nodesToUpdate.includes(pendingSegment.parent!)) {\n nodesToUpdate.push(pendingSegment.parent!);\n }\n deltaSegments.push({\n segment: pendingSegment,\n });\n });\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback(\n {\n deltaSegments,\n operation: MergeTreeMaintenanceType.ACKNOWLEDGED,\n },\n opArgs,\n );\n }\n const clientId = this.collabWindow.clientId;\n for (const node of nodesToUpdate) {\n this.blockUpdatePathLengths(node, seq, clientId, overwrite);\n // NodeUpdatePathLengths(node, seq, clientId, true);\n }\n }\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n\n private addToPendingList(segment: ISegment, segmentGroup?: SegmentGroup, localSeq?: number) {\n let _segmentGroup = segmentGroup;\n if (_segmentGroup === undefined) {\n // TODO: review the cast\n _segmentGroup = { segments: [], localSeq } as SegmentGroup;\n this.pendingSegments!.enqueue(_segmentGroup);\n }\n segment.segmentGroups.enqueue(_segmentGroup);\n return _segmentGroup;\n }\n\n // TODO: error checking\n public getMarkerFromId(id: string) {\n return this.idToSegment.get(id);\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 * @param refseq - The reference sequence number at which to compute the position.\n * @param clientId - The client id with which to compute the position.\n */\n public posFromRelativePos(\n relativePos: IRelativePosition,\n refseq = this.collabWindow.currentSeq,\n clientId = this.collabWindow.clientId) {\n let pos = -1;\n let marker: Marker | undefined;\n if (relativePos.id) {\n marker = this.getMarkerFromId(relativePos.id) as Marker;\n }\n if (marker) {\n pos = this.getPosition(marker, refseq, clientId);\n if (!relativePos.before) {\n pos += marker.cachedLength;\n if (relativePos.offset !== undefined) {\n pos += relativePos.offset;\n }\n } else {\n if (relativePos.offset !== undefined) {\n pos -= relativePos.offset;\n }\n }\n }\n return pos;\n }\n\n public insertSegments(\n pos: number,\n segments: ISegment[],\n refSeq: number,\n clientId: number,\n seq: number,\n opArgs: IMergeTreeDeltaOpArgs | undefined,\n ) {\n this.ensureIntervalBoundary(pos, refSeq, clientId);\n\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n\n this.blockInsert(pos, refSeq, clientId, seq, localSeq, segments);\n\n // opArgs == undefined => loading snapshot or test code\n if (this.mergeTreeDeltaCallback && opArgs !== undefined) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.INSERT,\n deltaSegments: segments.map((segment) => ({ segment })),\n });\n }\n\n if (this.collabWindow.collaborating && MergeTree.options.zamboniSegments &&\n (seq !== UnassignedSequenceNumber)) {\n this.zamboniSegments();\n }\n }\n\n public insertAtReferencePosition(\n referencePosition: ReferencePosition,\n insertSegment: ISegment,\n opArgs: IMergeTreeDeltaOpArgs,\n ): void {\n if (insertSegment.cachedLength === 0) {\n return;\n }\n if (insertSegment.parent\n || insertSegment.removedSeq\n || insertSegment.seq !== UniversalSequenceNumber) {\n throw new Error(\"Cannot insert segment that has already been inserted.\");\n }\n\n const rebalanceTree = (segment: ISegment) => {\n // Blocks should never be left full\n // if the inserts makes the block full\n // then we need to walk up the chain of parents\n // and split the blocks until we find a block with\n // room\n let block = segment.parent;\n let ordinalUpdateNode: IMergeBlock | undefined = block;\n while (block !== undefined) {\n if (block.childCount >= MaxNodesInBlock) {\n const splitNode = this.split(block);\n if (block === this.root) {\n this.updateRoot(splitNode);\n // Update root already updates all it's children ordinals\n ordinalUpdateNode = undefined;\n } else {\n this.insertChildNode(block.parent!, splitNode, block.index + 1);\n ordinalUpdateNode = splitNode.parent;\n this.blockUpdateLength(block.parent!, UnassignedSequenceNumber, clientId);\n }\n } else {\n this.blockUpdateLength(block, UnassignedSequenceNumber, clientId);\n }\n block = block.parent;\n }\n // Only update ordinals once, for all children,\n // on the path\n if (ordinalUpdateNode) {\n this.nodeUpdateOrdinals(ordinalUpdateNode);\n }\n };\n\n const clientId = this.collabWindow.clientId;\n const refSegment = referencePosition.getSegment()!;\n const refOffset = referencePosition.getOffset();\n const refSegLen = this.nodeLength(refSegment, this.collabWindow.currentSeq, clientId);\n let startSeg = refSegment;\n // if the change isn't at a boundary, we need to split the segment\n if (refOffset !== 0 && refSegLen !== undefined && refSegLen !== 0) {\n const splitSeg = this.splitLeafSegment(refSegment, refOffset);\n assert(!!splitSeg.next, 0x050 /* \"Next segment changes are undefined!\" */);\n this.insertChildNode(refSegment.parent!, splitSeg.next, refSegment.index + 1);\n rebalanceTree(splitSeg.next);\n startSeg = splitSeg.next;\n }\n // walk back from the segment, to see if there is a previous tie break seg\n this.leftExcursion(startSeg, (backSeg) => {\n if (!backSeg.isLeaf()) {\n return true;\n }\n const backLen = this.nodeLength(backSeg, this.collabWindow.currentSeq, clientId);\n // ignore removed segments\n if (backLen === undefined) {\n return true;\n }\n // Find the nearest 0 length seg we can insert over, as all other inserts\n // go near to far\n if (backLen === 0) {\n if (this.breakTie(0, backSeg, UnassignedSequenceNumber)) {\n startSeg = backSeg;\n }\n return true;\n }\n return false;\n });\n\n if (this.collabWindow.collaborating) {\n insertSegment.localSeq = ++this.collabWindow.localSeq;\n insertSegment.seq = UnassignedSequenceNumber;\n } else {\n insertSegment.seq = UniversalSequenceNumber;\n }\n\n insertSegment.clientId = clientId;\n\n if (Marker.is(insertSegment)) {\n const markerId = insertSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, insertSegment);\n }\n }\n\n this.insertChildNode(startSeg.parent!, insertSegment, startSeg.index);\n\n rebalanceTree(insertSegment);\n\n if (this.mergeTreeDeltaCallback) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n deltaSegments: [{ segment: insertSegment }],\n operation: MergeTreeDeltaType.INSERT,\n });\n }\n\n if (this.collabWindow.collaborating) {\n this.addToPendingList(insertSegment, undefined, insertSegment.localSeq);\n }\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. The client ref seq must be above the minimum sequence number\n * or the return value will be undefined.\n * Generally this method is used in conjunction with signals which provide\n * point in time values for the below parameters, and is useful for things\n * like displaying user position. It should not be used with persisted values\n * as persisted values will quickly become invalid as the remoteClientRefSeq\n * moves below the minimum sequence number\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: number): number | undefined {\n if (remoteClientRefSeq < this.collabWindow.minSeq) {\n return undefined;\n }\n\n const segmentInfo = this.getContainingSegment(\n remoteClientPosition,\n remoteClientRefSeq,\n remoteClientId);\n\n const segwindow = this.getCollabWindow();\n\n if (segmentInfo && segmentInfo.segment) {\n const segmentPosition = this.getPosition(segmentInfo.segment, segwindow.currentSeq, segwindow.clientId);\n\n return segmentPosition + segmentInfo.offset!;\n } else {\n if (remoteClientPosition === this.getLength(remoteClientRefSeq, remoteClientId)) {\n return this.getLength(segwindow.currentSeq, segwindow.clientId);\n }\n }\n }\n\n private insertChildNode(block: IMergeBlock, child: IMergeNode, childIndex: number) {\n assert(block.childCount < MaxNodesInBlock, 0x051 /* \"Too many children on merge block!\" */);\n\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n\n block.childCount++;\n block.assignChild(child, childIndex, false);\n }\n\n private blockInsert<T extends ISegment>(\n pos: number,\n refSeq: number,\n clientId: number,\n seq: number,\n localSeq: number | undefined,\n newSegments: T[],\n ) {\n let segIsLocal = false;\n const checkSegmentIsLocal = (segment: ISegment) => {\n if (segment.seq === UnassignedSequenceNumber) {\n segIsLocal = true;\n }\n // Only need to look at first segment that follows finished node\n return false;\n };\n\n const continueFrom = (node: IMergeBlock) => {\n segIsLocal = false;\n this.rightExcursion(node, checkSegmentIsLocal);\n return segIsLocal;\n };\n\n let segmentGroup: SegmentGroup;\n const saveIfLocal = (locSegment: ISegment) => {\n // Save segment so can assign sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if ((locSegment.seq === UnassignedSequenceNumber) && (clientId === this.collabWindow.clientId)) {\n segmentGroup = this.addToPendingList(locSegment, segmentGroup, localSeq);\n // eslint-disable-next-line @typescript-eslint/brace-style\n }\n // LocSegment.seq === 0 when coming from SharedSegmentSequence.loadBody()\n // In all other cases this has to be true (checked by addToLRUSet):\n // locSegment.seq > this.collabWindow.currentSeq\n else if ((locSegment.seq! > this.collabWindow.minSeq) &&\n MergeTree.options.zamboniSegments) {\n this.addToLRUSet(locSegment, locSegment.seq!);\n }\n }\n };\n const onLeaf = (segment: ISegment | undefined, _pos: number, context: InsertContext) => {\n const segmentChanges: ISegmentChanges = {};\n if (segment) {\n // Insert before segment\n segmentChanges.replaceCurrent = context.candidateSegment;\n segmentChanges.next = segment;\n } else {\n segmentChanges.next = context.candidateSegment;\n }\n return segmentChanges;\n };\n\n // TODO: build tree from segs and insert all at once\n let insertPos = pos;\n for (const newSegment of newSegments) {\n segIsLocal = false;\n if (newSegment.cachedLength > 0) {\n newSegment.seq = seq;\n newSegment.localSeq = localSeq;\n newSegment.clientId = clientId;\n if (Marker.is(newSegment)) {\n const markerId = newSegment.getId();\n if (markerId) {\n this.mapIdToSegment(markerId, newSegment);\n }\n }\n\n const splitNode = this.insertingWalk(this.root, insertPos, refSeq, clientId, seq,\n { leaf: onLeaf, candidateSegment: newSegment, continuePredicate: continueFrom });\n\n if (newSegment.parent === undefined) {\n throw new Error(`MergeTree insert failed: ${JSON.stringify({\n currentSeq: this.collabWindow.currentSeq,\n minSeq: this.collabWindow.minSeq,\n segSeq: newSegment.seq,\n })}`);\n }\n\n this.updateRoot(splitNode);\n saveIfLocal(newSegment);\n\n insertPos += newSegment.cachedLength;\n }\n }\n }\n private readonly splitLeafSegment = (segment: ISegment | undefined, pos: number): ISegmentChanges => {\n if (!(pos > 0 && segment)) {\n return {};\n }\n\n const next = segment.splitAt(pos)!;\n if (this.mergeTreeMaintenanceCallback) {\n this.mergeTreeMaintenanceCallback({\n operation: MergeTreeMaintenanceType.SPLIT,\n deltaSegments: [{ segment }, { segment: next }],\n },\n undefined);\n }\n\n return { next };\n };\n\n private ensureIntervalBoundary(pos: number, refSeq: number, clientId: number) {\n const splitNode = this.insertingWalk(this.root, pos, refSeq, clientId, TreeMaintenanceSequenceNumber,\n { leaf: this.splitLeafSegment });\n this.updateRoot(splitNode);\n }\n\n // Assume called only when pos == len\n private breakTie(pos: number, node: IMergeNode, seq: number) {\n if (node.isLeaf()) {\n if (pos === 0) {\n // normalize the seq numbers\n // if the new seg is local (UnassignedSequenceNumber) give it the highest possible\n // seq for comparison, as it will get a seq higher than any other seq once sequences\n // if the current seg is local (UnassignedSequenceNumber) give it the second highest\n // possible seq, as the highest is reserved for the previous.\n const newSeq = seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER : seq;\n const segSeq = node.seq === UnassignedSequenceNumber ? Number.MAX_SAFE_INTEGER - 1 : node.seq ?? 0;\n return newSeq > segSeq;\n }\n return false;\n } else {\n return true;\n }\n }\n\n // Visit segments starting from node's left siblings, then up to node's parent\n private leftExcursion(node: IMergeNode, leafAction: ISegmentAction<undefined>) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let _node: IMergeNode;\n let matchedStart = false;\n for (childIndex = parent.childCount - 1; childIndex >= 0; childIndex--) {\n _node = children[childIndex];\n if (matchedStart) {\n if (!_node.isLeaf()) {\n const childBlock = _node;\n go = this.nodeMapReverse(childBlock, leafAction, 0, UniversalSequenceNumber,\n this.collabWindow.clientId);\n } else {\n go = leafAction(_node, 0, UniversalSequenceNumber, this.collabWindow.clientId, 0, 0, undefined);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === _node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n /**\n * Visit segments starting from node's right siblings, then up to node's parent.\n * All segments past `node` are visited, regardless of their visibility.\n */\n private rightExcursion(node: IMergeNode, leafAction: (seg: ISegment) => boolean) {\n let go = true;\n let startNode = node;\n let parent = startNode.parent;\n while (parent) {\n const children = parent.children;\n let childIndex: number;\n let _node: IMergeNode;\n let matchedStart = false;\n for (childIndex = 0; childIndex < parent.childCount; childIndex++) {\n _node = children[childIndex];\n if (matchedStart) {\n if (!_node.isLeaf()) {\n const childBlock = _node;\n go = this.walkAllSegments(childBlock, leafAction);\n } else {\n go = leafAction(_node);\n }\n if (!go) {\n return;\n }\n } else {\n matchedStart = (startNode === _node);\n }\n }\n startNode = parent;\n parent = parent.parent;\n }\n }\n\n private insertingWalk(\n block: IMergeBlock, pos: number, refSeq: number, clientId: number, seq: number,\n context: InsertContext) {\n let _pos = pos;\n const children = block.children;\n let childIndex: number;\n let child: IMergeNode;\n let newNode: IMergeNode | undefined;\n let fromSplit: IMergeBlock | undefined;\n for (childIndex = 0; childIndex < block.childCount; childIndex++) {\n child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId);\n if (len === undefined) {\n // if the seg len in undefined, the segment\n // will be removed, so should just be skipped for now\n continue;\n }\n\n if ((_pos < len) || ((_pos === len) && this.breakTie(_pos, child, seq))) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n const childBlock = child;\n // Internal node\n const splitNode = this.insertingWalk(childBlock, _pos, refSeq, clientId,\n seq, context);\n if (splitNode === undefined) {\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else if (splitNode === MergeTree.theUnfinishedNode) {\n _pos -= len; // Act as if shifted segment\n continue;\n } else {\n newNode = splitNode;\n fromSplit = splitNode;\n childIndex++; // Insert after\n }\n } else {\n const segment = child;\n const segmentChanges = context.leaf(segment, _pos, context);\n if (segmentChanges.replaceCurrent) {\n block.assignChild(segmentChanges.replaceCurrent, childIndex, false);\n segmentChanges.replaceCurrent.ordinal = child.ordinal;\n }\n if (segmentChanges.next) {\n newNode = segmentChanges.next;\n childIndex++; // Insert after\n } else {\n // No change\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n }\n return undefined;\n }\n }\n break;\n } else {\n _pos -= len;\n }\n }\n if (!newNode) {\n if (_pos === 0) {\n if ((seq !== UnassignedSequenceNumber) && context.continuePredicate &&\n context.continuePredicate(block)) {\n return MergeTree.theUnfinishedNode;\n } else {\n const segmentChanges = context.leaf(undefined, _pos, context);\n newNode = segmentChanges.next;\n // Assert segmentChanges.replaceCurrent === undefined\n }\n }\n }\n if (newNode) {\n for (let i = block.childCount; i > childIndex; i--) {\n block.children[i] = block.children[i - 1];\n block.children[i].index = i;\n }\n block.assignChild(newNode, childIndex, false);\n block.childCount++;\n block.setOrdinal(newNode, childIndex);\n if (block.childCount < MaxNodesInBlock) {\n if (fromSplit) {\n this.nodeUpdateOrdinals(fromSplit);\n }\n if (context.structureChange) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n return undefined;\n } else {\n // Don't update ordinals because higher block will do it\n return this.split(block);\n }\n } else {\n return undefined;\n }\n }\n\n private split(node: IMergeBlock) {\n const halfCount = MaxNodesInBlock / 2;\n const newNode = this.makeBlock(halfCount);\n node.childCount = halfCount;\n // Update ordinals to reflect lowered child count\n this.nodeUpdateOrdinals(node);\n for (let i = 0; i < halfCount; i++) {\n newNode.assignChild(node.children[halfCount + i], i, false);\n node.children[halfCount + i] = undefined!;\n }\n this.nodeUpdateLengthNewStructure(node);\n this.nodeUpdateLengthNewStructure(newNode);\n return newNode;\n }\n\n private nodeUpdateOrdinals(block: IMergeBlock) {\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n block.setOrdinal(child, i);\n if (!child.isLeaf()) {\n this.nodeUpdateOrdinals(child);\n }\n }\n }\n\n /**\n * Annotate a range with 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 - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @param refSeq - The reference sequence number to use to apply the annotate\n * @param clientId - The id of the client making the annotate\n * @param seq - The sequence number of the annotate operation\n * @param opArgs - The op args for the annotate op. this is passed to the merge tree callback if there is one\n */\n public annotateRange(\n start: number, end: number, props: PropertySet, combiningOp: ICombiningOp | undefined, refSeq: number,\n clientId: number, seq: number, opArgs: IMergeTreeDeltaOpArgs) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n const deltaSegments: IMergeTreeSegmentDelta[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n let segmentGroup: SegmentGroup | undefined;\n\n const annotateSegment = (segment: ISegment) => {\n const propertyDeltas = segment.addProperties(props, combiningOp, seq, this.collabWindow);\n deltaSegments.push({ segment, propertyDeltas });\n if (this.collabWindow.collaborating) {\n if (seq === UnassignedSequenceNumber) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n\n this.mapRange({ leaf: annotateSegment }, refSeq, clientId, undefined, start, end);\n\n // OpArgs == undefined => test code\n if (this.mergeTreeDeltaCallback && deltaSegments.length > 0) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.ANNOTATE,\n deltaSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n public markRangeRemoved(\n start: number,\n end: number,\n refSeq: number,\n clientId: number,\n seq: number,\n overwrite = false,\n opArgs: IMergeTreeDeltaOpArgs,\n ) {\n let _overwrite = overwrite;\n this.ensureIntervalBoundary(start, refSeq, clientId);\n this.ensureIntervalBoundary(end, refSeq, clientId);\n let segmentGroup: SegmentGroup;\n const removedSegments: IMergeTreeSegmentDelta[] = [];\n const segmentsWithRefs: ISegment[] = [];\n const localSeq = seq === UnassignedSequenceNumber ? ++this.collabWindow.localSeq : undefined;\n const markRemoved = (segment: ISegment, pos: number, _start: number, _end: number) => {\n const existingRemovalInfo = toRemovalInfo(segment);\n if (existingRemovalInfo !== undefined) {\n _overwrite = true;\n if (existingRemovalInfo.removedSeq === UnassignedSequenceNumber) {\n // we removed this locally, but someone else removed it first\n // so put them at the head of the list\n // the list isn't ordered, but we\n // keep first removal at the head.\n existingRemovalInfo.removedClientIds.unshift(clientId);\n existingRemovalInfo.removedSeq = seq;\n segment.localRemovedSeq = undefined;\n } else {\n // Do not replace earlier sequence number for remove\n existingRemovalInfo.removedClientIds.push(clientId);\n }\n } else {\n segment.removedClientIds = [clientId];\n segment.removedSeq = seq;\n segment.localRemovedSeq = localSeq;\n\n removedSegments.push({ segment });\n }\n if (segment.localRefs && !segment.localRefs.empty) {\n segmentsWithRefs.push(segment);\n }\n\n // Save segment so can assign removed sequence number when acked by server\n if (this.collabWindow.collaborating) {\n if (segment.removedSeq === UnassignedSequenceNumber && clientId === this.collabWindow.clientId) {\n segmentGroup = this.addToPendingList(segment, segmentGroup, localSeq);\n } else {\n if (MergeTree.options.zamboniSegments) {\n this.addToLRUSet(segment, seq);\n }\n }\n }\n return true;\n };\n const afterMarkRemoved = (node: IMergeBlock, pos: number, _start: number, _end: number) => {\n if (_overwrite) {\n this.nodeUpdateLengthNewStructure(node);\n } else {\n this.blockUpdateLength(node, seq, clientId);\n }\n return true;\n };\n this.mapRange({ leaf: markRemoved, post: afterMarkRemoved }, refSeq, clientId, undefined, start, end);\n const pending = this.collabWindow.collaborating && clientId === this.collabWindow.clientId;\n for (const segment of segmentsWithRefs) {\n this.updateSegmentRefsAfterMarkRemoved(segment, pending);\n }\n\n // opArgs == undefined => test code\n if (this.mergeTreeDeltaCallback && removedSegments.length > 0) {\n this.mergeTreeDeltaCallback(\n opArgs,\n {\n operation: MergeTreeDeltaType.REMOVE,\n deltaSegments: removedSegments,\n });\n }\n if (this.collabWindow.collaborating && (seq !== UnassignedSequenceNumber)) {\n if (MergeTree.options.zamboniSegments) {\n this.zamboniSegments();\n }\n }\n }\n\n private nodeUpdateLengthNewStructure(node: IMergeBlock, recur = false) {\n this.blockUpdate(node);\n if (this.collabWindow.collaborating) {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow, recur);\n }\n }\n\n public removeLocalReferencePosition(lref: ReferencePosition): ReferencePosition | undefined {\n const segment = lref.getSegment();\n if (segment) {\n const removedRefs = segment?.localRefs?.removeLocalRef(lref);\n if (removedRefs !== undefined) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n return removedRefs;\n }\n }\n public createLocalReferencePosition(\n segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,\n client: Client,\n ): ReferencePosition {\n if (isRemoved(segment)) {\n if (!refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove | ReferenceType.Transient)) {\n throw new UsageError(\n \"Can only create SlideOnRemove or Transient local reference position on a removed segment\");\n }\n }\n const localRefs = segment.localRefs ?? new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n\n const segRef = localRefs.createLocalRef(offset, refType, properties, client);\n\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n return segRef;\n }\n\n /**\n * @deprecated - use removeLocalReferencePosition\n */\n public removeLocalReference(segment: ISegment, lref: LocalReference) {\n if (segment.localRefs) {\n const removedRef = segment.localRefs.removeLocalRef(lref);\n if (removedRef) {\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n }\n }\n\n /**\n * @deprecated - use createLocalReference\n */\n public addLocalReference(lref: LocalReference) {\n const segment = lref.segment!;\n let localRefs = segment.localRefs;\n if (!localRefs) {\n localRefs = new LocalReferenceCollection(segment);\n segment.localRefs = localRefs;\n }\n localRefs.addLocalRef(lref);\n this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,\n LocalClientId);\n }\n\n private blockUpdate(block: IMergeBlock) {\n let len = 0;\n const hierBlock = block.hierBlock();\n if (hierBlock) {\n hierBlock.rightmostTiles = createMap<Marker>();\n hierBlock.leftmostTiles = createMap<Marker>();\n hierBlock.rangeStacks = {};\n }\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n len += nodeTotalLength(this, child) ?? 0;\n if (hierBlock) {\n hierBlock.addNodeReferences(this, child);\n }\n if (this.blockUpdateActions) {\n this.blockUpdateActions.child(block, i);\n }\n }\n block.cachedLength = len;\n }\n\n private blockUpdatePathLengths(\n startBlock: IMergeBlock | undefined,\n seq: number,\n clientId: number,\n newStructure = false,\n ) {\n let block: IMergeBlock | undefined = startBlock;\n while (block !== undefined) {\n if (newStructure) {\n this.nodeUpdateLengthNewStructure(block);\n } else {\n this.blockUpdateLength(block, seq, clientId);\n }\n block = block.parent;\n }\n }\n\n private blockUpdateLength(node: IMergeBlock, seq: number, clientId: number) {\n this.blockUpdate(node);\n if (\n this.collabWindow.collaborating\n && seq !== UnassignedSequenceNumber\n && seq !== TreeMaintenanceSequenceNumber\n ) {\n if (\n node.partialLengths !== undefined\n && MergeTree.options.incrementalUpdate\n && clientId !== NonCollabClient\n ) {\n node.partialLengths.update(this, node, seq, clientId, this.collabWindow);\n } else {\n node.partialLengths = PartialSequenceLengths.combine(this, node, this.collabWindow);\n }\n }\n }\n\n public map<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n ) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum);\n }\n\n public mapRange<TClientData>(\n actions: SegmentActions<TClientData>,\n refSeq: number,\n clientId: number,\n accum: TClientData,\n start?: number,\n end?: number,\n splitRange: boolean = false,\n ) {\n if (splitRange) {\n if (start) {\n this.ensureIntervalBoundary(start, refSeq, clientId);\n }\n if (end) {\n this.ensureIntervalBoundary(end, refSeq, clientId);\n }\n }\n this.nodeMap(this.root, actions, 0, refSeq, clientId, accum, start, end);\n }\n\n public incrementalBlockMap<TContext>(stateStack: Stack<IncrementalMapState<TContext>>) {\n while (!stateStack.empty()) {\n // We already check the stack is not empty\n const state = stateStack.top()!;\n if (state.op !== IncrementalExecOp.Go) {\n return;\n }\n if (state.childIndex === 0) {\n if (state.start === undefined) {\n state.start = 0;\n }\n if (state.end === undefined) {\n state.end = this.blockLength(state.block, state.refSeq, state.clientId);\n }\n\n if (state.actions.pre) {\n state.actions.pre(state);\n }\n }\n if ((state.op === IncrementalExecOp.Go) && (state.childIndex < state.block.childCount)) {\n const child = state.block.children[state.childIndex];\n const len = this.nodeLength(child, state.refSeq, state.clientId) ?? 0;\n if ((len > 0) && (state.start < len) && (state.end > 0)) {\n if (!child.isLeaf()) {\n const childState = new IncrementalMapState(child, state.actions, state.pos,\n state.refSeq, state.clientId, state.context, state.start, state.end, 0);\n stateStack.push(childState);\n } else {\n state.actions.leaf(child, state);\n }\n }\n state.pos += len;\n state.start -= len;\n state.end -= len;\n state.childIndex++;\n } else {\n if (state.childIndex === state.block.childCount) {\n if ((state.op === IncrementalExecOp.Go) && state.actions.post) {\n state.actions.post(state);\n }\n stateStack.pop();\n }\n }\n }\n }\n\n private nodeMap<TClientData>(\n node: IMergeBlock, actions: SegmentActions<TClientData>, pos: number, refSeq: number,\n clientId: number, accum: TClientData, start?: number, end?: number) {\n let _start = start;\n let _end = end;\n let _pos = pos;\n if (_start === undefined) {\n _start = 0;\n }\n if (_end === undefined) {\n _end = this.blockLength(node, refSeq, clientId);\n }\n let go = true;\n if (actions.pre) {\n go = actions.pre(node, _pos, refSeq, clientId, _start, _end, accum);\n if (!go) {\n // Cancel this node but not entire traversal\n return true;\n }\n }\n const children = node.children;\n for (let childIndex = 0; childIndex < node.childCount; childIndex++) {\n const child = children[childIndex];\n const len = this.nodeLength(child, refSeq, clientId) ?? 0;\n if (go && (_end > 0) && (len > 0) && (_start < len)) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMap(child, actions, _pos, refSeq, clientId, accum, _start, _end);\n }\n } else {\n if (actions.leaf) {\n go = actions.leaf(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n }\n }\n if (!go) {\n break;\n }\n if (actions.shift) {\n actions.shift(child, _pos, refSeq, clientId, _start, _end, accum);\n }\n _pos += len;\n _start -= len;\n _end -= len;\n }\n if (go && actions.post) {\n go = actions.post(node, _pos, refSeq, clientId, _start, _end, accum);\n }\n\n return go;\n }\n\n // Invokes the leaf action for all segments. Note that *all* segments are visited\n // regardless of if they would be visible to the current `clientId` and `refSeq`.\n public walkAllSegments<TClientData>(\n block: IMergeBlock,\n action: (segment: ISegment, accum?: TClientData) => boolean,\n accum?: TClientData,\n ): boolean {\n let go = true;\n const children = block.children;\n for (let childIndex = 0; go && childIndex < block.childCount; childIndex++) {\n const child = children[childIndex];\n go = child.isLeaf()\n ? action(child, accum)\n : this.walkAllSegments(child, action, accum);\n }\n return go;\n }\n\n // Straight call every segment; goes until leaf action returns false\n private nodeMapReverse(\n block: IMergeBlock, leafAction: ISegmentAction<undefined>, pos: number, refSeq: number,\n clientId: number) {\n let go = true;\n const children = block.children;\n for (let childIndex = block.childCount - 1; childIndex >= 0; childIndex--) {\n const child = children[childIndex];\n if (go) {\n // Found entry containing pos\n if (!child.isLeaf()) {\n if (go) {\n go = this.nodeMapReverse(child, leafAction, pos, refSeq, clientId);\n }\n } else {\n go = leafAction(child, pos, refSeq, clientId, 0, 0, undefined);\n }\n }\n if (!go) {\n break;\n }\n }\n return go;\n }\n}\n"]}
|