@itwin/core-backend 5.7.0-dev.1 → 5.7.0-dev.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.
@@ -1 +1 @@
1
- {"version":3,"file":"Rebase.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/Rebase.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAyB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAgD,qBAAqB,EAAE,MAAM,EAAqD,WAAW,EAA0C,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACtP,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,SAAS,EAAe,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,qBAAqB,EAAyB,MAAM,oBAAoB,CAAC;AACnN,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC9D,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEzB,MAAM,UAAU;IACP,QAAQ,GAAe,EAAE,CAAC;IAC1B,cAAc,GAAe,EAAE,CAAC;IAChC,iBAAiB,GAAe,EAAE,CAAC;IACnC,UAAU,GAAkB,EAAE,CAAC;IAC9B,KAAK,GAAG,CAAC,CAAC;IAClB,gBAAuB,CAAC;IACjB,KAAK,CAAC,OAAO;QAClB,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5H,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7G,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAChE,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;gBAoBJ,CAAC;QAEb,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAA;QAC9C,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,KAAK,GAAG,cAAc,CAAC;QACjC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,uCAAuC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,IAAI,iBAAiB,GAAG,eAAe,CAAC,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;QAC5G,IAAI,SAAS,KAAK,iBAAiB;YACjC,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,mBAAmB,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAC;QACxH,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE3C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IACM,KAAK,CAAC,aAAa;QACxB,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5G,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAC/D,CAAC,CAAC,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IACM,KAAK,CAAC,cAAc,CAAC,CAAc,EAAE,cAAqB;QAC/D,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG;YAChB,aAAa,EAAE,uBAAuB;YACtC,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;SACzB,CAAC;QAEF,IAAI,EAAE,GAAe,EAAE,CAAC;QACxB,IAAI,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;IACrF,CAAC;IACM,KAAK,CAAC,cAAc,CAAC,CAAc,EAAE,EAAc,EAAE,cAAqB;QAC/E,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACM,KAAK,CAAC,aAAa,CAAC,CAAc,EAAE,cAAqB;QAC9D,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,SAAS,GAAG;YAChB,aAAa,EAAE,eAAe;YAC9B,KAAK,EAAE,IAAI,CAAC,cAAc;YAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;YAChC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,IAAI,EAAE,OAAO,CAAC,cAAc;YAC5B,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;SACsB,CAAC;QAEjD,IAAI,EAAE,GAAe,EAAE,CAAC;QACxB,IAAI,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,SAAS,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IACM,KAAK,CAAC,eAAe,CAAC,CAAc,EAAE,IAA8E;QACzH,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAgD;YACzD,aAAa,EAAE,eAAe;YAC9B,KAAK,EAAE,IAAI,CAAC,cAAc;YAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB;YAChC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,IAAI,EAAE,OAAO,CAAC,cAAc;YAC5B,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;SACxC,CAAC;QAEF,IAAI,EAAE,GAAe,EAAE,CAAC;QACxB,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAY,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAY,CAAC,CAAC;IAChD,CAAC;IACM,KAAK,CAAC,aAAa,CAAC,CAAc,EAAE,EAAc,EAAE,cAAqB,EAAE,UAAoB;QACpG,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAA8C,EAAE,CAAC,CAAC;QAE5F,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;QACxC,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACM,KAAK,CAAC,aAAa,CAAC,CAAc,EAAE,EAAc,EAAE,cAAqB;QAC9E,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC9B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACM,KAAK,CAAC,QAAQ;QACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC;CACF;AAED,QAAQ,CAAC,+BAA+B,EAAE;IACxC,IAAI,UAAsB,CAAC;IAC3B,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC,UAAU,CAAC,OAAO;YACrB,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;QACzB,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QAClC,EAAE,CAAC,WAAW,CAAC;YACb,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,kBAAkB;YAC/B,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACd,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;aACpB;SACF,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,CAAC;QAED,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QAClC,EAAE,CAAC,WAAW,CAAC;YACb,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBACjB,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;aACrB;SACF,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,CAAC;QAED,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QAClC,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,CAAC;QAED,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;QAC9C,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrB,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACnD,IAAI,MAAM,CAAC,SAAS,KAAK,aAAa;oBAAE,SAAS;gBACjD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAe,CAAC;gBACrD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;gBAC7C,CAAC;gBACD,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;oBACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC5C,CAAC;gBACD,UAAU,EAAE,CAAC;YACf,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAGhF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAiB,EAAE;gBACjD,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAExD,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE9C,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElD,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACpD,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACpD,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;wBAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtD,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CACf,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAEjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG;;;;;;;gBAOH,CAAC;QAEb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;QAC7F,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QACD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAExD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,yDAAyD,CAAC,CAAC;QAElF,EAAE,CAAC,cAAc,EAAE,CAAC;QAEpB,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,yDAAyD,CAAC,CAAC;QAElF,EAAE,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvC,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAEnC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,EAAE,CAAC,WAAW,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,uDAAuD,CAAC,CAAC;QAEhF,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YACjD,EAAE,CAAC,WAAW,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC;QAE1E,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,yDAAyD,CAAC,CAAC;QAElF,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,+FAA+F;QAC/F,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;QAEzE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,6DAA6D,CAAC,CAAC;QAEtF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEtG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC5D,EAAE,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,+DAA+D,CAAC,CAAC;QAExF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEtG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YACjD,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;QAEhF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEtG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;YACjD,EAAE,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC;QAElF,EAAE,CAAC,WAAW,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;gBAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;oBAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACpD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;wBAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACpD,MAAM,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;4BAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACtD,CAAC,CAAC,CAAC;wBACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACtD,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE;gBAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,MAAM,CACf,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAE1B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/H,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/H,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/H,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE9D,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzB,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,UAAU;QACV,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE9D,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhD,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAGxD,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,kBAAkB;QAClB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAEtD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,oFAAoF;QACpF,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEpD,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEpD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEzD,sFAAsF;QACtF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,+DAA+D;QAC/D,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;QAE1H,kCAAkC;QAClC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,oEAAoE;QACpE,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;QAE3H,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAE,QAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,yDAAyD;QACzD,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAE,OAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;oBAqBA,CAAC;QACjB,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,uEAAuE,CAAC,CAAC;IAC9K,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,SAAmB,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAmB,EAAE,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC/G,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAK,+BAA+B;QAC7F,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,+CAA+C;QAC7G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,mFAAmF;QAEjJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAChD,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,mEAAmE;QACjI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAE,qEAAqE;QAChI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,2CAA2C;QAEzG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAClH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,wDAAwD,CAAC,CAAC;QACnG,EAAE,CAAC,WAAW,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAE1D,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,SAAmB,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAmB,EAAE,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;gBACjD,MAAM,EAAE,CAAC,cAAc,EAAE,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACjD,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,sDAAsD,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAChD,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7H,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACxH,EAAE,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,mBAAmB,QAAQ,cAAc,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,0EAA0E;QAC1E,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5C,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC/B,uCAAuC;QACvC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAClJ,EAAE,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;QAErD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,iBAAiB,OAAO,EAAE,EAAE,CAAC,CAAC;QAElE,0CAA0C;QAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,iBAAiB,OAAO,4BAA4B,YAAY,EAAE,EAAE,CAAC,CAAC;aACnH,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,sDAAsD,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,uFAAuF,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzJ,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE;gBACrB,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,SAAS,CAAC;QACnB,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3B,IAAI,EAAE,CAAC;YACT,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAAa,EAAE,QAAgB,CAAC,EAAE,EAAE;YAClE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,CAAC,CAAA;QAED,uFAAuF;QACvF,+DAA+D;QAC/D,MAAM,gBAAgB,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAE5D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QACnD,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAC9B,MAAM,gBAAgB,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QACnD,EAAE,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAE9B,MAAM,gBAAgB,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QACnD,EAAE,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAGhF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,GAAa,EAAiB,EAAE;gBAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClG,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAc,CAAC;gBAClC,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU;wBAC5B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,YAA0B,CAAC,CAAC;gBAC3F,CAAC;gBACD,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEhB,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,cAAc,EAAE,CAAC;oBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;oBAClE,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;oBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;oBAClE,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,cAAc,EAAE,CAAC;oBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;oBAClE,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAGhF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAEhC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAG/B,MAAM,MAAM,GAAG;YACb,QAAQ,EAAE;gBACR,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,EAAe;aAC1B;YACD,WAAW,EAAE;gBACX,SAAS,EAAE,EAAgB;gBAC3B,OAAO,EAAE,EAAgB;aAC1B;YACD,aAAa,EAAE;gBACb,eAAe,EAAE,EAAgB;gBACjC,SAAS,EAAE,EAAgB;aAC5B;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,MAAM,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC9B,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;YAClC,MAAM,CAAC,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;YAChC,MAAM,CAAC,aAAa,CAAC,eAAe,GAAG,EAAE,CAAC;YAC1C,MAAM,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;QACtC,CAAC,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,GAAc,EAAE,EAAE;YACnD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,GAAa,EAAE,EAAE;YACrD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAa,EAAE,EAAE;YACnD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAiB,EAAE;gBACjD,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;SACF,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAEnG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAC5H,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAE1H,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QACpI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAE9H,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAE/B,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAElH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3I,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QAEzI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QACnJ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/I,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACnC,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,oBAAoB,EAAE,EAA6C;SACpE,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;YAChD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAsB,OAAO,CAAC,CAAC;YAC5E,OAAO,UAAU,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,oBAAoB,GAAG,EAAE,CAAC;QACnC,CAAC,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,OAA8C,EAAE,EAAE;YAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;QAEd,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAE,EAAE;YACpC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,EAAE,CAAC;QAEzB,WAAW,EAAE,CAAC;QACd,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7C,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACnC,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,oBAAoB,EAAE,EAA6C;YACnE,iBAAiB,EAAE,EAAmC;SACvD,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;YAChD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAsB,OAAO,CAAC,CAAC;YAC5E,OAAO,UAAU,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,oBAAoB,GAAG,EAAE,CAAC;YACjC,MAAM,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,OAA8C,EAAE,EAAE;YAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,OAAoC,EAAE,EAAE;YAC7E,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,CAAC,kBAAkB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAE,EAAE;gBAClC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,EAAE,CAAC;QAEzB,WAAW,EAAE,CAAC;QACd,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACnC,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,oBAAoB,EAAE,EAA6C;SACpE,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;YAChD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAsB,OAAO,CAAC,CAAC;YAC5E,OAAO,UAAU,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,oBAAoB,GAAG,EAAE,CAAC;QACnC,CAAC,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,OAA8C,EAAE,EAAE;YAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;QAEd,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAE,EAAE;YACpC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACpC,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,WAAW,EAAE,CAAC;QACd,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7C,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;YAClC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACpC,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,oBAAoB,EAAE,EAA6C;YACnE,iBAAiB,EAAE,EAAmC;SACvD,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;YAChD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAsB,OAAO,CAAC,CAAC;YAC5E,OAAO,UAAU,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,oBAAoB,GAAG,EAAE,CAAC;YACjC,MAAM,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,OAA8C,EAAE,EAAE;YAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,OAAoC,EAAE,EAAE;YAC7E,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,WAAW,EAAE,CAAC;QAEd,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,IAAc,EAAE,EAAE;gBAClC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,EAAE,CAAC;QAEzB,WAAW,EAAE,CAAC;QACd,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7C,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAClF,IAAI,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChF,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qEAAqE;QAC1H,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qEAAqE;QAC1H,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qEAAqE;QAC1H,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,4BAA4B;QAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAExE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qEAAqE;QAC1H,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,4BAA4B;QAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAExE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qCAAqC;QAC1F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qEAAqE;QAC1H,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mCAAmC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAGxD,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAEhF,MAAM,eAAe,GAAG,EAAmB,CAAC;QAC5C,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,IAAc,EAAE,EAAE;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,GAAa,EAAiB,EAAE;gBAChD,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1C,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,SAAmB,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAmB,EAAE,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC/G,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAK,+BAA+B;QAC7F,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,+CAA+C;QAC7G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,mFAAmF;QAEjJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/G,mBAAmB;QACnB,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAChD,0CAA0C;QAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,mEAAmE;QACjI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAE,qEAAqE;QAChI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,2CAA2C;QAEzG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAClH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAE/D,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC/D,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACnG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACnG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAE1G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACnG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACnG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;IAC5G,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE9C,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEzB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC,CAAC;QAC5E,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAGvB,oGAAoG;QACpG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC;YAChD,EAAE,EAAE,EAAE;YACN,aAAa,EAAE,oBAAoB,CAAC,aAAa;YACjD,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;SACE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAGlE,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC;YAC9B,EAAE,EAAE,EAAE;YACN,aAAa,EAAE,oBAAoB,CAAC,aAAa;YACjD,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;SACE,CAAC,CAAC;QAExB,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC;YAC9B,EAAE,EAAE,EAAE;YACN,aAAa,EAAE,oBAAoB,CAAC,aAAa;YACjD,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;SACQ,CAAC,CAAC;QAExB,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAE9D,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAE9D,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC1G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IACrG,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mHAAmH,EAAE,KAAK,IAAI,EAAE;QACjI,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,SAAS,GAAG,KAAK,EAAE,CAAc,EAAE,EAAE;YACzC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAE/B,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,SAAmB,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,QAAkB,EAAE,EAAE;gBACtC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC/G,IAAI,QAAQ,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;oBAClC,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,wDAAwD,CAAC,CAAC;QAE9G,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/G,mBAAmB;QACnB,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QAEhD,0CAA0C;QAC1C,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAEhE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QAEhH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,eAAe,EAAE,CAAC,SAAmB,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,SAAmB,EAAE,EAAE,GAAG,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAExE,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAErE,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClF,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,SAAS,GAAG,wBAAwB,CAAC;QAC3C,MAAM,oBAAoB,GAAG;YAC3B,WAAW;YACX,WAAW;YACX,YAAY;YACZ,UAAU;YACV,UAAU;YACV,UAAU;YACV,WAAW;YACX,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,4BAA4B;YAC5B,KAAK;YACL,KAAK;SACN,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,iBAAyB,EAAE,EAAE;YACnD,KAAK,IAAI,iBAAiB,CAAC;YAC3B,OAAO;wEAC2D,GAAG,EAAE;;;;;kBAK3D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iCAAiC,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;;oBAEpI,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,CAAc,EAAE,SAAiB,EAAE,EAAE;YAC3D,OAAO,CAAC,CAAC,mBAAmB,CAAC,qBAAqB,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvE,MAAM,WAAW,GAAa,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;oBAC9C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBACjD,CAAC;gBACD,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,EAAoD,EAAE,EAAE;YACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC;gBAC3C,QAAQ;gBACR,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;gBAC5B,SAAS;aACV,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnF,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE7E,+EAA+E;QAC/E,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,+BAA+B,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhF,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAEvG,qCAAqC;QACrC,MAAM,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;YACpG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;YACpG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAGtH,+EAA+E;QAC/E,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,+BAA+B,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhF,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9G,qCAAqC;QACrC,MAAM,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,EAAE,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,cAAc,SAAS,EAAE,CAAC,CAAA;QAEnD,qIAAqI;QACrI,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAE9G,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbResult, Guid, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { Code, GeometricElement2dProps, GeometricModelProps, GeometryStreamBuilder, IModel, ModelGeometryChangesProps, ModelIdAndGeometryGuid, QueryBinder, RelatedElementProps, RelationshipProps, SubCategoryAppearance } from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { _nativeDb, BriefcaseDb, BriefcaseManager, ChangesetECAdaptor, ChannelControl, DrawingCategory, ElementGroupsMembers, IModelHost, SqliteChangesetReader, TxnIdString, TxnProps } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { StashManager } from \"../../StashManager\";\r\nimport { existsSync, unlinkSync, writeFileSync } from \"fs\";\r\nimport * as path from \"path\";\r\nimport { LineSegment3d, Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nclass TestIModel {\r\n public iModelId: Id64String = \"\";\r\n public drawingModelId: Id64String = \"\";\r\n public drawingCategoryId: Id64String = \"\";\r\n public briefcases: BriefcaseDb[] = [];\r\n private _data = 0;\r\n public constructor() { }\r\n public async startup() {\r\n HubMock.startup(\"TestIModel\", KnownTestLocations.outputDir);\r\n this.iModelId = await HubMock.createNewIModel({ iTwinId: HubMock.iTwinId, iModelName: \"Test\", description: \"TestSubject\" });\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n b1.saveChanges();\r\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"a1\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"A1Recipe2d\">\r\n <BaseClass>bis:TemplateRecipe2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\r\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\r\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\r\n <Class class=\"a1\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\r\n <Class class=\"a1\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`;\r\n\r\n await b1.importSchemaStrings([schema1]);\r\n chai.expect(b1.txns.hasPendingTxns).to.be.true\r\n await b1.pushChanges({ description: \"schema1\" });\r\n const codeProps = Code.createEmpty();\r\n codeProps.value = \"DrawingModel\";\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n this.drawingModelId = IModelTestUtils.createAndInsertDrawingPartitionAndModel(b1, codeProps, true)[1];\r\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === drawingCategoryId)\r\n drawingCategoryId = DrawingCategory.insert(b1, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n this.drawingCategoryId = drawingCategoryId;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"drawing category\" });\r\n b1.close();\r\n }\r\n public async openBriefcase(): Promise<BriefcaseDb> {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n b.saveChanges();\r\n this.briefcases.push(b);\r\n return b;\r\n }\r\n public async insertRecipe2d(b: BriefcaseDb, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [IModel.dictionaryId] });\r\n const baseProps = {\r\n classFullName: \"TestDomain:A1Recipe2d\",\r\n model: IModel.dictionaryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n let id: Id64String = \"\";\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\r\n });\r\n return id;\r\n }\r\n return b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\r\n }\r\n public async updateRecipe2d(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [IModel.dictionaryId], exclusive: [id] });\r\n const elProps = b.elements.getElementProps(id);\r\n\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n });\r\n } else {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n }\r\n }\r\n public async insertElement(b: BriefcaseDb, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 5.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n\r\n const baseProps = {\r\n classFullName: \"TestDomain:a1\",\r\n model: this.drawingModelId,\r\n category: this.drawingCategoryId,\r\n code: Code.createEmpty(),\r\n geom: builder.geometryStream,\r\n prop1: `${this._data++}`,\r\n } as GeometricElement2dProps & { prop1: string };\r\n\r\n let id: Id64String = \"\";\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement(baseProps);\r\n });\r\n return id;\r\n }\r\n baseProps.prop1 = `${this._data++}`;\r\n return b.elements.insertElement(baseProps);\r\n }\r\n public async insertElementEx(b: BriefcaseDb, args?: { prop1?: string, markAsIndirect?: true, parent?: RelatedElementProps }) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 5.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n\r\n const props: GeometricElement2dProps & { prop1: string } = {\r\n classFullName: \"TestDomain:a1\",\r\n model: this.drawingModelId,\r\n category: this.drawingCategoryId,\r\n code: Code.createEmpty(),\r\n parent: args?.parent,\r\n geom: builder.geometryStream,\r\n prop1: args?.prop1 ?? `${this._data++}`\r\n };\r\n\r\n let id: Id64String = \"\";\r\n if (args?.markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement(props as any);\r\n });\r\n return id;\r\n }\r\n return b.elements.insertElement(props as any);\r\n }\r\n public async updateElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true, updateGeom?: boolean) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\r\n const elProps = b.elements.getElementProps<GeometricElement2dProps & { prop1: string }>(id);\r\n\r\n if (updateGeom) {\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 10.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n elProps.geom = builder.geometryStream;\r\n }\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n });\r\n } else {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n }\r\n }\r\n public async deleteElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.deleteElement(id);\r\n });\r\n } else {\r\n b.elements.deleteElement(id);\r\n }\r\n }\r\n public async shutdown(): Promise<void> {\r\n this.briefcases.forEach(b => b.close());\r\n HubMock.shutdown();\r\n }\r\n}\r\n\r\ndescribe(\"rebase changes & stashing api\", function (this: Suite) {\r\n let testIModel: TestIModel;\r\n before(async () => {\r\n if (!IModelHost.isValid)\r\n await IModelHost.startup();\r\n });\r\n this.beforeEach(async () => {\r\n testIModel = new TestIModel();\r\n await testIModel.startup();\r\n });\r\n this.afterEach(async () => {\r\n await testIModel.shutdown();\r\n });\r\n it(\"save changes args\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges({\r\n source: \"test\",\r\n description: \"test description\",\r\n appData: {\r\n test: \"test\",\r\n foo: [1, 2, 3],\r\n bar: { baz: \"qux\" }\r\n }\r\n });\r\n\r\n let lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).to.be.equals(\"test\");\r\n chai.expect(lastTxn.props.description).to.be.equals(\"test description\");\r\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\r\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test\");\r\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([1, 2, 3]);\r\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux\" });\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.undefined;\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000000');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges({\r\n source: \"test2\",\r\n description: \"test description 2\",\r\n appData: {\r\n test: \"test 2\",\r\n foo: [11, 12, 13],\r\n bar: { baz: \"qux2\" }\r\n }\r\n });\r\n\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).to.be.equals(\"test2\");\r\n chai.expect(lastTxn.props.description).to.be.equals(\"test description 2\");\r\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\r\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test 2\");\r\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([11, 12, 13]);\r\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux2\" });\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.equal('0x100000000');\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000001');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges(\"new element\");\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).is.undefined;\r\n chai.expect(lastTxn.props.description).to.be.equals(\"new element\");\r\n chai.expect(lastTxn.props.appData).to.be.undefined;\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.equal('0x100000001');\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000002');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await b1.pushChanges({ description: \"new element\" });\r\n chai.expect(b1.txns.isUndoPossible).is.false;\r\n chai.expect(b1.txns.isRedoPossible).is.false;\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isUndefined(lastTxn);\r\n });\r\n\r\n it(\"direct / indirect\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const directElId = await testIModel.insertElement(b1);\r\n const indirectElId = await testIModel.insertElement(b1, true);\r\n chai.expect(directElId).to.not.be.undefined;\r\n chai.expect(indirectElId).to.not.be.undefined;\r\n b1.saveChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n const txn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(txn);\r\n if (txn) {\r\n let checkCount = 0;\r\n const reader = SqliteChangesetReader.openTxn({ txnId: txn?.id, db: b1 });\r\n while (reader.step()) {\r\n if (reader.primaryKeyValues.length === 0) continue;\r\n if (reader.tableName !== \"bis_Element\") continue;\r\n const iid = reader.primaryKeyValues[0] as Id64String;\r\n if (iid === directElId) {\r\n chai.expect(reader.isIndirect).to.be.false;\r\n }\r\n if (iid === indirectElId) {\r\n chai.expect(reader.isIndirect).to.be.true;\r\n }\r\n checkCount++;\r\n }\r\n chai.expect(checkCount).to.be.equals(2);\r\n }\r\n\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n chai.expect(b1.txns.isUndoPossible).is.false;\r\n chai.expect(b1.txns.isRedoPossible).is.false;\r\n const lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isUndefined(lastTxn);\r\n });\r\n\r\n it(\"rebase handler\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps): Promise<void> => {\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n },\r\n });\r\n await b1.pullChanges();\r\n });\r\n it(\"stash & drop\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n const e2 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`first`);\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges(`second`);\r\n await testIModel.deleteElement(b1, e2);\r\n b1.saveChanges(`third`);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`fourth`);\r\n\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\r\n\r\n chai.expect(stash1).to.exist;\r\n chai.assert(Guid.isGuid(stash1.id));\r\n chai.expect(stash1.description).to.equals(\"stash test 1\");\r\n chai.expect(stash1.briefcaseId).equals(b1.briefcaseId);\r\n chai.expect(stash1.iModelId).to.equals(b1.iModelId);\r\n chai.expect(stash1.timestamp).to.exist;\r\n chai.expect(stash1.description).to.exist;\r\n chai.expect(stash1.hash).length(64);\r\n chai.expect(stash1.parentChangeset).to.exist;\r\n chai.expect(stash1.idSequences.element).to.equals(\"0x30000000004\");\r\n chai.expect(stash1.idSequences.instance).to.equals(\"0x30000000000\");\r\n chai.expect(stash1.acquiredLocks).equals(4);\r\n chai.expect(stash1.txns).to.exist;\r\n\r\n chai.expect(stash1.txns).to.have.lengthOf(4);\r\n chai.expect(stash1.txns[0].props.description).to.equal(\"first\");\r\n chai.expect(stash1.txns[1].props.description).to.equal(\"second\");\r\n chai.expect(stash1.txns[2].props.description).to.equal(\"third\");\r\n chai.expect(stash1.txns[3].props.description).to.equal(\"fourth\");\r\n\r\n chai.expect(stash1.txns[0].id).to.equals(\"0x100000000\");\r\n chai.expect(stash1.txns[1].id).to.equals(\"0x100000001\");\r\n chai.expect(stash1.txns[2].id).to.equals(\"0x100000002\");\r\n chai.expect(stash1.txns[3].id).to.equals(\"0x100000003\");\r\n\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`fifth`);\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges(`sixth`);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`seventh`);\r\n\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(stash2.description).to.equals(\"stash test 2\");\r\n chai.expect(stash2.hash).length(64);\r\n chai.expect(stash2.parentChangeset).to.exist;\r\n chai.expect(stash2.idSequences.element).to.equals(\"0x30000000006\");\r\n chai.expect(stash2.idSequences.instance).to.equals(\"0x30000000000\");\r\n chai.expect(stash2.acquiredLocks).equals(4);\r\n chai.expect(stash2.txns).to.exist;\r\n\r\n chai.expect(stash2.txns).to.have.lengthOf(7);\r\n chai.expect(stash2.txns[0].props.description).to.equal(\"first\");\r\n chai.expect(stash2.txns[1].props.description).to.equal(\"second\");\r\n chai.expect(stash2.txns[2].props.description).to.equal(\"third\");\r\n chai.expect(stash2.txns[3].props.description).to.equal(\"fourth\");\r\n chai.expect(stash2.txns[4].props.description).to.equal(\"fifth\");\r\n chai.expect(stash2.txns[5].props.description).to.equal(\"sixth\");\r\n chai.expect(stash2.txns[6].props.description).to.equal(\"seventh\");\r\n\r\n chai.expect(stash2.txns[0].id).to.equals(\"0x100000000\");\r\n chai.expect(stash2.txns[1].id).to.equals(\"0x100000001\");\r\n chai.expect(stash2.txns[2].id).to.equals(\"0x100000002\");\r\n chai.expect(stash2.txns[3].id).to.equals(\"0x100000003\");\r\n chai.expect(stash2.txns[4].id).to.equals(\"0x100000004\");\r\n chai.expect(stash2.txns[5].id).to.equals(\"0x100000005\");\r\n chai.expect(stash2.txns[6].id).to.equals(\"0x100000006\");\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(2);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 1\");\r\n chai.expect(stashes[0]).to.deep.equal(stash2);\r\n chai.expect(stashes[1]).to.deep.equal(stash1);\r\n\r\n StashManager.dropAllStashes(b1);\r\n chai.expect(StashManager.getStashes(b1)).to.have.lengthOf(0);\r\n });\r\n it(\"recursively calling withIndirectTxnMode()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n chai.expect(() =>\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n throw new Error(\"Test error\");\r\n })).to.throw();\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n });\r\n it(\"should fail to importSchemas() & importSchemaStrings() in indirect scope\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"MySchema\" alias=\"ms1\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"my_class\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n\r\n const schemaFile = path.join(KnownTestLocations.outputDir, \"MySchema.01.00.00.ecschema.xml\");\r\n if (existsSync(schemaFile)) {\r\n unlinkSync(schemaFile);\r\n }\r\n writeFileSync(schemaFile, schema, { encoding: \"utf8\" });\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.importSchemas([schema]);\r\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\r\n\r\n b1.abandonChanges();\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.importSchemaStrings([schema]);\r\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\r\n\r\n b1.abandonChanges();\r\n await b1.importSchemaStrings([schema]);\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"import schema\" });\r\n });\r\n\r\n it(\"should fail to saveChanges() & pushChanges() in indirect scope\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n await testIModel.insertElement(b1);\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.saveChanges();\r\n })).to.be.rejectedWith(\"Cannot save changes while in an indirect change scope\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.saveChanges();\r\n })).to.be.throws(\"Cannot save changes while in an indirect change scope\");\r\n\r\n b1.saveChanges();\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.pushChanges({ description: \"test\" });\r\n })).to.be.rejectedWith(\"Cannot push changeset while in an indirect change scope\");\r\n\r\n await b1.pushChanges({ description: \"test\" });\r\n });\r\n\r\n it(\"should fail to saveFileProperty/deleteFileProperty in indirect scope\", async () => {\r\n // pull/push/saveFileProperty/deleteFileProperty should be called inside indirect change scope.\r\n const b1 = await testIModel.openBriefcase();\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"Hello, World\");\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 1\");\r\n })).to.be.rejectedWith(\"Cannot save file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\r\n })).to.be.rejectedWith(\"Cannot delete file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 2\");\r\n })).to.be.throws(\"Cannot save file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\r\n })).to.be.throws(\"Cannot delete file property while in an indirect change scope\");\r\n\r\n b1.saveChanges();\r\n });\r\n\r\n it(\"recursively calling withIndirectTxnModeAsync()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n await chai.expect(\r\n b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n throw new Error(\"Test error\");\r\n })).rejectedWith(Error);\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n });\r\n it(\"should restore mutually exclusive stashes\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n // stash 1\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges(\"first\");\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash1).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 2\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(\"second\");\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 3\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(e3).to.exist;\r\n b1.saveChanges(\"third\");\r\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash3).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n chai.expect(e1).not.equals(e2);\r\n chai.expect(e1).not.equals(e3);\r\n chai.expect(e2).not.equals(e3);\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(3);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\r\n\r\n // restore stash 1\r\n await StashManager.restore({ db: b1, stash: stash1 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 2\r\n await StashManager.restore({ db: b1, stash: stash2 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 3\r\n await StashManager.restore({ db: b1, stash: stash3 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n });\r\n it(\"should restore stash in any order\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n // stash 1\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges(\"first\");\r\n // do not discard local changes\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\r\n chai.expect(stash1).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 2\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(\"second\");\r\n // do not discard local changes\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 3\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(e3).to.exist;\r\n b1.saveChanges(\"third\");\r\n // do not discard local changes\r\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\" });\r\n chai.expect(stash3).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(3);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\r\n\r\n await b1.discardChanges({ retainLocks: true });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // restore stash 1\r\n await StashManager.restore({ db: b1, stash: stash1 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n\r\n // restore stash 2\r\n await StashManager.restore({ db: b1, stash: stash2 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 3\r\n await StashManager.restore({ db: b1, stash: stash3 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n\r\n });\r\n it(\"should restore stash when briefcase has advanced to latest changeset\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n chai.expect(b1.changeset.index).to.equals(2);\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n chai.expect(b1.changeset.index).to.equals(3);\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n b2.saveChanges();\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\r\n chai.expect(b2Stash1.parentChangeset.index).to.equals(2);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\r\n\r\n // stash restore should downgrade briefcase to older changeset as specified in stash\r\n await StashManager.restore({ db: b2, stash: b2Stash1 });\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n chai.expect(b2.changeset.index).to.equals(4);\r\n });\r\n it(\"restore stash that has element changed by another briefcase\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n chai.expect(b1.changeset.index).to.equals(2);\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n chai.expect(b1.changeset.index).to.equals(3);\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n await testIModel.updateElement(b2, e1);\r\n b2.saveChanges();\r\n\r\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.true;\r\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\r\n chai.expect(b2Stash1.parentChangeset.index).to.equals(3);\r\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.false;\r\n\r\n // stash release lock so b2 should have released lock and b1 should be able to update.\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges();\r\n\r\n // restore stash should fail because of lock not obtained on e1\r\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // push b1 changes to release lock\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n // restore stash should fail because pull is required to obtain lock\r\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.changeset.index).to.equals(4);\r\n const elBefore = b2.elements.tryGetElementProps(e1);\r\n chai.expect((elBefore as any).prop1).to.equals(\"3\");\r\n // restore stash should succeed as now it can obtain lock\r\n await StashManager.restore({ db: b2, stash: b2Stash1 });\r\n\r\n const elAfter = b2.elements.tryGetElementProps(e1);\r\n chai.expect((elAfter as any).prop1).to.equals(\"2\");\r\n await b2.pushChanges({ description: `${e1} updated` });\r\n });\r\n it(\"schema change should not be stashed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"a1\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n <ECProperty propertyName=\"prop2\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"A1Recipe2d\">\r\n <BaseClass>bis:TemplateRecipe2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\r\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\r\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\r\n <Class class=\"a1\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\r\n <Class class=\"a1\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`;\r\n await b1.importSchemaStrings([schema1]);\r\n b1.saveChanges();\r\n\r\n await chai.expect(StashManager.stash({ db: b1, description: \"stash test 1\" })).to.not.rejectedWith(\"Bad Arg: Pending schema changeset stashing is not currently supported\");\r\n });\r\n it(\"abort rebase\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n let e3 = \"\";\r\n b2.saveChanges();\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n e3 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n });\r\n it(\"calling discardChanges() from inside indirect scope is not allowed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n const p1 = b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.discardChanges();\r\n });\r\n await chai.expect(p1).to.be.rejectedWith(\"Cannot discard changes when there are indirect changes\");\r\n b1.saveChanges();\r\n });\r\n it(\"calling discardChanges() during rebasing is not allowed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"inserted element\" });\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(b2.txns.rebaser.isAborting).is.false;\r\n await b2.discardChanges();\r\n },\r\n });\r\n\r\n chai.expect(b2.txns.rebaser.isAborting).is.false;\r\n const p1 = b2.pullChanges();\r\n await chai.expect(p1).to.be.rejectedWith(\"Cannot discard changes while a rebase is in progress\");\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n await b2.txns.rebaser.abort();\r\n });\r\n it(\"getStash() should throw exception\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(() => StashManager.getStash({ db: b1, stash: \"invalid_stash\" })).to.throw(\"No stashes exist for this briefcase\");\r\n chai.expect(StashManager.tryGetStash({ db: b1, stash: \"invalid_stash\" })).to.be.undefined;\r\n });\r\n it(\"edge case: a indirect update can cause FK violation\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const parentId = await testIModel.insertElement(b1);\r\n const childId = await testIModel.insertElementEx(b1, { parent: { id: parentId, relClassName: \"TestDomain:A1OwnsA1\" } });\r\n b1.saveChanges(\"insert parent and child\");\r\n await b1.pushChanges({ description: `inserted parent ${parentId} and child ${childId}` });\r\n await b2.pullChanges();\r\n\r\n // b1 delete childId while b1 create a child of childId as indirect change\r\n await testIModel.deleteElement(b1, childId);\r\n b1.saveChanges(\"delete child\");\r\n // no exclusive lock required on child1\r\n const grandChildId = await testIModel.insertElementEx(b2, { parent: { id: childId, relClassName: \"TestDomain:A1OwnsA1\" }, markAsIndirect: true });\r\n b2.saveChanges(\"delete child and insert grandchild\");\r\n\r\n await b1.pushChanges({ description: `deleted child ${childId}` });\r\n\r\n // should fail to pull and rebase changes.\r\n await chai.expect(b2.pushChanges({ description: `deleted child ${childId} and inserted grandchild ${grandChildId}` }))\r\n .to.be.rejectedWith(\"Foreign key conflicts in ChangeSet. Aborting rebase.\");\r\n });\r\n\r\n it(\"ECSqlReader unable to read updates after saveChanges()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const findElement = async (id: Id64String) => {\r\n const reader = b1.createQueryReader(`SELECT ECInstanceId, ec_className(ECClassId), Prop1 FROM ts.A1 WHERE ECInstanceId = ${id}`, QueryBinder.from([id]));\r\n if (await reader.step())\r\n return { id: reader.current[0], className: reader.current[1], prop1: reader.current[2] };\r\n return undefined;\r\n }\r\n\r\n const runQuery = async (query: string) => {\r\n const reader = b1.createQueryReader(query);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n return rows;\r\n }\r\n const runQueryParallel = async (query: string, times: number = 1) => {\r\n return Promise.all(new Array(times).fill(query).map(runQuery));\r\n }\r\n\r\n // Following query have open cached statement against BisCore.Element that will prevent\r\n // updates from being visible until the statement is finalized.\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e1)).to.be.undefined;\r\n b1.saveChanges(\"insert element\");\r\n\r\n const e1Props = await findElement(e1);\r\n chai.expect(e1Props).to.exist;\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e2)).to.be.undefined;\r\n b1.saveChanges(\"insert second element\");\r\n\r\n const e2Props = await findElement(e2);\r\n chai.expect(e2Props).to.exist;\r\n\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e3)).to.be.undefined;\r\n b1.saveChanges(\"insert third element\");\r\n\r\n const e3Props = await findElement(e3);\r\n chai.expect(e3Props).to.exist;\r\n });\r\n it(\"enum txn changes in recompute\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n let txnVerified = 0;\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txn: TxnProps): Promise<void> => {\r\n const reader = SqliteChangesetReader.openTxn({ txnId: txn.id, db: b2, disableSchemaCheck: true });\r\n const adaptor = new ChangesetECAdaptor(reader);\r\n adaptor.acceptClass(\"TestDomain:a1\");\r\n const ids = new Set<Id64String>();\r\n while (adaptor.step()) {\r\n if (!adaptor.reader.isIndirect)\r\n ids.add(adaptor.inserted?.ECInstanceId || adaptor.deleted?.ECInstanceId as Id64String);\r\n }\r\n adaptor.close();\r\n\r\n if (txn.props.description === \"first change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000001\"]);\r\n txnVerified++;\r\n } else if (txn.props.description === \"second change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000003\"]);\r\n txnVerified++;\r\n } else if (txn.props.description === \"third change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000005\"]);\r\n txnVerified++;\r\n } else {\r\n txnVerified++;\r\n }\r\n },\r\n });\r\n await b2.pullChanges();\r\n chai.expect(txnVerified).to.equal(3);\r\n });\r\n it(\"before and after rebase events\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n\r\n const events = {\r\n onRebase: {\r\n beginCount: 0,\r\n endCount: 0,\r\n beginIds: [] as Id64Array,\r\n },\r\n onRebaseTxn: {\r\n beginTxns: [] as TxnProps[],\r\n endTxns: [] as TxnProps[],\r\n },\r\n rebaseHandler: {\r\n shouldReinstate: [] as TxnProps[],\r\n recompute: [] as TxnProps[],\r\n }\r\n };\r\n\r\n const resetEvent = () => {\r\n events.onRebase.beginCount = 0;\r\n events.onRebase.endCount = 0;\r\n events.onRebase.beginIds = [];\r\n events.onRebaseTxn.beginTxns = [];\r\n events.onRebaseTxn.endTxns = [];\r\n events.rebaseHandler.shouldReinstate = [];\r\n events.rebaseHandler.recompute = [];\r\n };\r\n\r\n b2.txns.onRebaseBegin.addListener((ids: Id64Array) => {\r\n events.onRebase.beginCount++;\r\n events.onRebase.beginIds.push(...ids);\r\n });\r\n\r\n b2.txns.onRebaseEnd.addListener(() => {\r\n events.onRebase.endCount++;\r\n });\r\n\r\n b2.txns.onRebaseTxnBegin.addListener((txn: TxnProps) => {\r\n events.onRebaseTxn.beginTxns.push(txn);\r\n });\r\n\r\n b2.txns.onRebaseTxnEnd.addListener((txn: TxnProps) => {\r\n events.onRebaseTxn.endTxns.push(txn);\r\n });\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n events.rebaseHandler.shouldReinstate.push(_txn);\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps): Promise<void> => {\r\n events.rebaseHandler.recompute.push(_txn);\r\n },\r\n });\r\n\r\n resetEvent();\r\n await b2.pullChanges();\r\n\r\n chai.expect(events.onRebase.beginCount).to.equal(1);\r\n chai.expect(events.onRebase.endCount).to.equal(1);\r\n chai.expect(events.onRebase.beginIds).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n chai.expect(events.onRebaseTxn.beginTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n chai.expect(events.onRebaseTxn.endTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n chai.expect(events.rebaseHandler.shouldReinstate.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n chai.expect(events.rebaseHandler.recompute.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"forth change\");\r\n\r\n resetEvent();\r\n await b2.pullChanges();\r\n\r\n chai.expect(events.onRebase.beginCount).to.equal(1);\r\n chai.expect(events.onRebase.endCount).to.equal(1);\r\n chai.expect(events.onRebase.beginIds).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n\r\n chai.expect(events.onRebaseTxn.beginTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n chai.expect(events.onRebaseTxn.endTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n\r\n chai.expect(events.rebaseHandler.shouldReinstate.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n chai.expect(events.rebaseHandler.recompute.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n });\r\n it(\"onModelGeometryChanged() not fired during rebase/pullMerge with no local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).is.undefined;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(0);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n onGeometryChanged: [] as ModelGeometryChangesProps[][],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n events.onGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n b1.txns.onGeometryChanged.addListener((changes: ModelGeometryChangesProps[]) => {\r\n events.onGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(`insert element ${e1} and ${e2}`);\r\n\r\n chai.expect(events.modelGeometryChanged.length).to.equal(1);\r\n chai.expect(events.modelGeometryChanged[0].length).to.equal(1);\r\n chai.expect(events.modelGeometryChanged[0][0].id).to.equal(\"0x20000000001\");\r\n chai.assert(Guid.isGuid(events.modelGeometryChanged[0][0].guid));\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2);\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).to.not.equal(geomGuidAfterPull);\r\n chai.expect(events.modelGeometryChanged.length).to.equal(4);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with non-geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n await testIModel.insertRecipe2d(b1);\r\n b1.saveChanges();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).to.exist;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(1);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertRecipe2d(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n onGeometryChanged: [] as ModelGeometryChangesProps[][],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n events.onGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n b1.txns.onGeometryChanged.addListener((changes: ModelGeometryChangesProps[]) => {\r\n events.onGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n await testIModel.insertElement(b1);\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).is.undefined;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(0);\r\n });\r\n it(\"rebase multi txn\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.txns.beginMultiTxnOperation()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n let elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n chai.expect(b2.txns.endMultiTxnOperation()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n b2.saveChanges();\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n let txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(false);\r\n\r\n // reverse single txn 0x100000003\r\n chai.expect(b2.txns.reverseSingleTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reverse multi txn. should reverse 0x100000000, 0x100000001 & 0x100000002\r\n chai.expect(b2.txns.reverseSingleTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reinstate the transaction\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(true);\r\n chai.expect(b2.txns.reinstateTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reinstate the transaction\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(true);\r\n chai.expect(b2.txns.reinstateTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(false);\r\n\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(false);\r\n\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n const recomputeTxnIds = [] as TxnIdString[];\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txn: TxnProps): Promise<void> => {\r\n recomputeTxnIds.push(txn.id);\r\n },\r\n });\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(recomputeTxnIds).to.deep.equals([\r\n \"0x100000000\",\r\n \"0x100000001\",\r\n \"0x100000002\",\r\n \"0x100000003\",\r\n ]);\r\n });\r\n it(\"abort rebase should discard in-memory changes\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n let e3 = \"\";\r\n b2.saveChanges();\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n e3 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n // make temp change\r\n b2.saveFileProperty({ name: \"test\", namespace: \"testNamespace\" }, \"testValue\");\r\n chai.expect(b2.txns.hasUnsavedChanges).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n // should abort with unsaved local changes\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n });\r\n it(\"two users insert same ElementGroupsMembers instance\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1);\r\n const e3 = await testIModel.insertElement(b1);\r\n const e4 = await testIModel.insertElement(b1);\r\n\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n chai.expect(e3).to.exist;\r\n chai.expect(e4).to.exist;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted elements` });\r\n await b2.pullChanges();\r\n\r\n const r1 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 10).toJSON());\r\n const r2 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e3, e4, 20).toJSON());\r\n chai.expect(r1).to.exist;\r\n chai.expect(r2).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted relationship` });\r\n\r\n const r3 = b2.relationships.insertInstance(ElementGroupsMembers.create(b2, e1, e2, 10).toJSON());\r\n const r4 = b2.relationships.insertInstance(ElementGroupsMembers.create(b2, e3, e4, 20).toJSON());\r\n chai.expect(r3).to.exist;\r\n chai.expect(r4).to.exist;\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: `inserted relationship` });\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.exist;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r3)).to.be.undefined;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r4)).to.be.undefined;\r\n\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.exist;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r3)).to.be.undefined;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r4)).to.be.undefined;\r\n });\r\n it(\"one user update and other delete the link table relationships\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1);\r\n\r\n const r1 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 10).toJSON());\r\n const r2 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 20).toJSON());\r\n\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n chai.expect(r1).to.exist;\r\n chai.expect(r2).to.exist;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted elements and relationship` });\r\n await b2.pullChanges();\r\n\r\n\r\n // intentionally change memberPriority to 10 for which there is another relationship already exists.\r\n chai.expect(() => b2.relationships.updateInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2,\r\n memberPriority: 20\r\n } as RelationshipProps)).to.throws(\"error updating relationship\");\r\n\r\n\r\n b2.relationships.updateInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2,\r\n memberPriority: 60\r\n } as RelationshipProps);\r\n\r\n b1.relationships.deleteInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2\r\n } as RelationshipProps);\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `deleted relationship` });\r\n\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: `updated relationship` });\r\n\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.be.undefined;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n });\r\n it(\"aborting rebaser in middle of rebase session where at least one txn is successfully rebased (used to cause crash)\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const createTxn = async (b: BriefcaseDb) => {\r\n const id = await testIModel.insertElement(b);\r\n chai.expect(id).is.exist;\r\n b.saveChanges(`created element ${id}`);\r\n return id;\r\n };\r\n\r\n const e1 = await createTxn(b1);\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await createTxn(b2);\r\n const e3 = await createTxn(b2);\r\n const e4 = await createTxn(b2);\r\n\r\n let e5 = \"\";\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n if (txnProps.id === \"0x100000001\") {\r\n e5 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n }\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.be.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.be.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n await chai.expect(createTxn(b2)).to.be.rejectedWith(`Could not save changes (created element 0x40000000004)`);\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.exist;\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n // make temp change\r\n b2.saveFileProperty({ name: \"test\", namespace: \"testNamespace\" }, \"testValue\");\r\n chai.expect(b2.txns.hasUnsavedChanges).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n\r\n // should abort with unsaved local changes\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.be.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.be.undefined;\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => { },\r\n });\r\n\r\n const e6 = await createTxn(b2);\r\n b2.saveChanges(`created element ${e6}`);\r\n chai.expect(b2.txns.getCurrentTxnId()).to.equal(\"0x100000004\");\r\n chai.expect(b2.txns.getLastSavedTxnProps()?.id).to.equal(`0x100000003`);\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n const e7 = await createTxn(b2);\r\n b2.saveChanges(`created element ${e7}`);\r\n chai.expect(b2.txns.getCurrentTxnId()).to.equal(\"0x100000005\");\r\n chai.expect(b2.txns.getLastSavedTxnProps()?.id).to.equal(`0x100000004`);\r\n await b2.pushChanges({ description: \"pushed after rebase aborted\" });\r\n\r\n await b1.pullChanges();\r\n chai.expect(b1.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e7)).to.exist;\r\n });\r\n it(\"changeset DDL error are ignored and ec_* tables are used to reconstruct the sqlite tables\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n const iModelId = testIModel.iModelId;\r\n const targetDir = path.join(KnownTestLocations.outputDir, iModelId, \"changesets\");\r\n let ver = 0;\r\n let props = 0;\r\n const tblGeom2d = \"bis_GeometricElement2d\";\r\n const geom2dBaseColumnList = [\r\n \"ElementId\",\r\n \"ECClassId\",\r\n \"CategoryId\",\r\n \"Origin_X\",\r\n \"Origin_Y\",\r\n \"Rotation\",\r\n \"BBoxLow_X\",\r\n \"BBoxLow_Y\",\r\n \"BBoxHigh_X\",\r\n \"BBoxHigh_Y\",\r\n \"GeometryStream\",\r\n \"TypeDefinitionId\",\r\n \"TypeDefinitionRelECClassId\",\r\n \"js1\",\r\n \"js2\",\r\n ];\r\n\r\n const generateSchema = (noOfNewPropsToAdd: number) => {\r\n props += noOfNewPropsToAdd;\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain1\" alias=\"ts1\" version=\"01.00.${ver++}\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"test\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n ${Array.from({ length: props - 1 }, (_, i) => `<ECProperty propertyName=\"prop${i + 2}\" typeName=\"string\" />`).join(\"\\n \")}\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n };\r\n\r\n const getColumnNames = (b: BriefcaseDb, tableName: string) => {\r\n return b.withSqliteStatement(`PRAGMA table_info(${tableName})`, (stmt) => {\r\n const columnNames: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n columnNames.push(stmt.getValue(1).getString());\r\n }\r\n return columnNames;\r\n });\r\n };\r\n\r\n const withLatestChangeset = async (cb: (reader: SqliteChangesetReader) => Promise<void>) => {\r\n const csInfo = await HubMock.getLatestChangeset({ iModelId });\r\n const info = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: { id: csInfo.id },\r\n targetDir,\r\n });\r\n\r\n const reader = SqliteChangesetReader.openFile({ db: b1, fileName: info.pathname });\r\n try {\r\n await cb(reader);\r\n } finally {\r\n reader.close();\r\n }\r\n };\r\n\r\n // Verify initial columns\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals(geom2dBaseColumnList);\r\n chai.expect(getColumnNames(b2, tblGeom2d)).deep.equals(geom2dBaseColumnList);\r\n\r\n // Import schema that add 5 new properties that should add 3 new shared columns\r\n await b1.importSchemaStrings([generateSchema(5)]);\r\n await b1.pushChanges({ description: `imported schema version 1.0.${ver - 1}` });\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\"]);\r\n\r\n //verify changeset has schema changes\r\n await withLatestChangeset(async (reader) => {\r\n const schemaChanges = reader.getDdlChanges()?.split(\";\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js3] BLOB\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js4] BLOB\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js5] BLOB\");\r\n });\r\n\r\n await b2.pullChanges();\r\n chai.expect(getColumnNames(b2, \"bis_GeometricElement2d\")).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\"]);\r\n\r\n\r\n // Import schema that add 5 new properties that should add 3 new shared columns\r\n await b1.importSchemaStrings([generateSchema(1)]);\r\n await b1.pushChanges({ description: `imported schema version 1.0.${ver - 1}` });\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\", \"js6\"]);\r\n //verify changeset has schema changes\r\n await withLatestChangeset(async (reader) => {\r\n const schemaChanges = reader.getDdlChanges()?.split(\";\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js6] BLOB\");\r\n });\r\n\r\n // delete the table so DDL apply should fail\r\n b2[_nativeDb].executeSql(`DROP TABLE ${tblGeom2d}`)\r\n\r\n // this would fail before this PR but should succeed as DDL error are ignored and table reconstruction is attempted using ec_* tables\r\n await b2.pullChanges();\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b2, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\", \"js6\"]);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"Rebase.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/Rebase.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbResult, Guid, Id64String } from \"@itwin/core-bentley\";\r\nimport { ChangesetIdWithIndex, ChangesetProps, Code, GeometricElement2dProps, GeometricModelProps, GeometryStreamBuilder, IModel, ModelGeometryChangesProps, ModelIdAndGeometryGuid, QueryBinder, RelatedElementProps, RelationshipProps, SubCategoryAppearance, TxnProps } from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { Suite } from \"mocha\";\r\nimport { HubWrappers, IModelTestUtils, KnownTestLocations } from \"..\";\r\nimport { _nativeDb, BriefcaseDb, BriefcaseManager, ChangesetECAdaptor, ChannelControl, DrawingCategory, ElementGroupsMembers, IModelHost, SqliteChangesetReader, TxnIdString } from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { StashManager } from \"../../StashManager\";\r\nimport { existsSync, unlinkSync, writeFileSync } from \"fs\";\r\nimport * as path from \"path\";\r\nimport { LineSegment3d, Point3d } from \"@itwin/core-geometry\";\r\nchai.use(chaiAsPromised);\r\n\r\nclass TestIModel {\r\n public iModelId: Id64String = \"\";\r\n public drawingModelId: Id64String = \"\";\r\n public drawingCategoryId: Id64String = \"\";\r\n public briefcases: BriefcaseDb[] = [];\r\n private _data = 0;\r\n public constructor() { }\r\n public async startup() {\r\n HubMock.startup(\"TestIModel\", KnownTestLocations.outputDir);\r\n this.iModelId = await HubMock.createNewIModel({ iTwinId: HubMock.iTwinId, iModelName: \"Test\", description: \"TestSubject\" });\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n b1.saveChanges();\r\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"a1\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"A1Recipe2d\">\r\n <BaseClass>bis:TemplateRecipe2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\r\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\r\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\r\n <Class class=\"a1\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\r\n <Class class=\"a1\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`;\r\n\r\n await b1.importSchemaStrings([schema1]);\r\n chai.expect(b1.txns.hasPendingTxns).to.be.true\r\n await b1.pushChanges({ description: \"schema1\" });\r\n const codeProps = Code.createEmpty();\r\n codeProps.value = \"DrawingModel\";\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n this.drawingModelId = IModelTestUtils.createAndInsertDrawingPartitionAndModel(b1, codeProps, true)[1];\r\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(b1, IModel.dictionaryId, \"MyDrawingCategory\");\r\n if (undefined === drawingCategoryId)\r\n drawingCategoryId = DrawingCategory.insert(b1, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance());\r\n this.drawingCategoryId = drawingCategoryId;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"drawing category\" });\r\n b1.close();\r\n }\r\n public async openBriefcase(): Promise<BriefcaseDb> {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ iTwinId: HubMock.iTwinId, iModelId: this.iModelId });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n b.saveChanges();\r\n this.briefcases.push(b);\r\n return b;\r\n }\r\n public async insertRecipe2d(b: BriefcaseDb, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [IModel.dictionaryId] });\r\n const baseProps = {\r\n classFullName: \"TestDomain:A1Recipe2d\",\r\n model: IModel.dictionaryId,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n let id: Id64String = \"\";\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\r\n });\r\n return id;\r\n }\r\n return b.elements.insertElement({ ...baseProps, prop1: `${this._data++}` } as any);\r\n }\r\n public async updateRecipe2d(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [IModel.dictionaryId], exclusive: [id] });\r\n const elProps = b.elements.getElementProps(id);\r\n\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n });\r\n } else {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n }\r\n }\r\n public async insertElement(b: BriefcaseDb, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 5.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n\r\n const baseProps = {\r\n classFullName: \"TestDomain:a1\",\r\n model: this.drawingModelId,\r\n category: this.drawingCategoryId,\r\n code: Code.createEmpty(),\r\n geom: builder.geometryStream,\r\n prop1: `${this._data++}`,\r\n } as GeometricElement2dProps & { prop1: string };\r\n\r\n let id: Id64String = \"\";\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement(baseProps);\r\n });\r\n return id;\r\n }\r\n baseProps.prop1 = `${this._data++}`;\r\n return b.elements.insertElement(baseProps);\r\n }\r\n public async insertElementEx(b: BriefcaseDb, args?: { prop1?: string, markAsIndirect?: true, parent?: RelatedElementProps }) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId] });\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 5.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n\r\n const props: GeometricElement2dProps & { prop1: string } = {\r\n classFullName: \"TestDomain:a1\",\r\n model: this.drawingModelId,\r\n category: this.drawingCategoryId,\r\n code: Code.createEmpty(),\r\n parent: args?.parent,\r\n geom: builder.geometryStream,\r\n prop1: args?.prop1 ?? `${this._data++}`\r\n };\r\n\r\n let id: Id64String = \"\";\r\n if (args?.markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n id = b.elements.insertElement(props as any);\r\n });\r\n return id;\r\n }\r\n return b.elements.insertElement(props as any);\r\n }\r\n public async updateElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true, updateGeom?: boolean) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\r\n const elProps = b.elements.getElementProps<GeometricElement2dProps & { prop1: string }>(id);\r\n\r\n if (updateGeom) {\r\n const builder = new GeometryStreamBuilder();\r\n const p1 = Point3d.createZero();\r\n const p2 = Point3d.createFrom({ x: Math.random() * 10.0 + 10.0, y: 0.0, z: 0.0 });\r\n const circle = LineSegment3d.create(p1, p2);\r\n builder.appendGeometry(circle);\r\n elProps.geom = builder.geometryStream;\r\n }\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n });\r\n } else {\r\n b.elements.updateElement({ ...elProps, prop1: `${this._data++}` });\r\n }\r\n }\r\n public async deleteElement(b: BriefcaseDb, id: Id64String, markAsIndirect?: true) {\r\n await b.locks.acquireLocks({ shared: [this.drawingModelId], exclusive: [id] });\r\n if (markAsIndirect) {\r\n b.txns.withIndirectTxnMode(() => {\r\n b.elements.deleteElement(id);\r\n });\r\n } else {\r\n b.elements.deleteElement(id);\r\n }\r\n }\r\n public async shutdown(): Promise<void> {\r\n this.briefcases.forEach(b => b.close());\r\n HubMock.shutdown();\r\n }\r\n}\r\n\r\nconst removePropertyRecursive = (obj: any, prop: string) => {\r\n if (obj && typeof obj === \"object\") {\r\n Object.keys(obj).forEach((key) => {\r\n if (key === prop) {\r\n delete obj[key];\r\n } else {\r\n removePropertyRecursive(obj[key], prop);\r\n }\r\n });\r\n }\r\n};\r\n\r\ndescribe(\"rebase changes & stashing api\", function (this: Suite) {\r\n let testIModel: TestIModel;\r\n before(async () => {\r\n if (!IModelHost.isValid)\r\n await IModelHost.startup();\r\n });\r\n this.beforeEach(async () => {\r\n testIModel = new TestIModel();\r\n await testIModel.startup();\r\n });\r\n this.afterEach(async () => {\r\n await testIModel.shutdown();\r\n });\r\n it(\"save changes args\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges({\r\n source: \"test\",\r\n description: \"test description\",\r\n appData: {\r\n test: \"test\",\r\n foo: [1, 2, 3],\r\n bar: { baz: \"qux\" }\r\n }\r\n });\r\n\r\n let lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).to.be.equals(\"test\");\r\n chai.expect(lastTxn.props.description).to.be.equals(\"test description\");\r\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\r\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test\");\r\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([1, 2, 3]);\r\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux\" });\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.undefined;\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000000');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges({\r\n source: \"test2\",\r\n description: \"test description 2\",\r\n appData: {\r\n test: \"test 2\",\r\n foo: [11, 12, 13],\r\n bar: { baz: \"qux2\" }\r\n }\r\n });\r\n\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).to.be.equals(\"test2\");\r\n chai.expect(lastTxn.props.description).to.be.equals(\"test description 2\");\r\n chai.expect(lastTxn.props.appData).to.not.be.undefined;\r\n chai.expect(lastTxn.props.appData?.test).to.be.eq(\"test 2\");\r\n chai.expect(lastTxn.props.appData?.foo).to.be.deep.eq([11, 12, 13]);\r\n chai.expect(lastTxn.props.appData?.bar).to.be.deep.eq({ baz: \"qux2\" });\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.equal('0x100000000');\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000001');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await testIModel.insertElement(b1)\r\n b1.saveChanges(\"new element\");\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(lastTxn);\r\n if (lastTxn) {\r\n chai.expect(lastTxn.props.source).is.undefined;\r\n chai.expect(lastTxn.props.description).to.be.equals(\"new element\");\r\n chai.expect(lastTxn.props.appData).to.be.undefined;\r\n chai.expect(lastTxn.nextId).to.be.undefined;\r\n chai.expect(lastTxn.prevId).to.be.equal('0x100000001');\r\n chai.expect(lastTxn.type).to.be.eq(\"Data\");\r\n chai.expect(lastTxn.id).to.be.eq('0x100000002');\r\n chai.expect(lastTxn.reversed).to.be.false;\r\n chai.expect(lastTxn.grouped).to.be.false;\r\n }\r\n\r\n await b1.pushChanges({ description: \"new element\" });\r\n chai.expect(b1.txns.isUndoPossible).is.false;\r\n chai.expect(b1.txns.isRedoPossible).is.false;\r\n lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isUndefined(lastTxn);\r\n });\r\n\r\n it(\"direct / indirect\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const directElId = await testIModel.insertElement(b1);\r\n const indirectElId = await testIModel.insertElement(b1, true);\r\n chai.expect(directElId).to.not.be.undefined;\r\n chai.expect(indirectElId).to.not.be.undefined;\r\n b1.saveChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n const txn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isDefined(txn);\r\n if (txn) {\r\n let checkCount = 0;\r\n const reader = SqliteChangesetReader.openTxn({ txnId: txn?.id, db: b1 });\r\n while (reader.step()) {\r\n if (reader.primaryKeyValues.length === 0) continue;\r\n if (reader.tableName !== \"bis_Element\") continue;\r\n const iid = reader.primaryKeyValues[0] as Id64String;\r\n if (iid === directElId) {\r\n chai.expect(reader.isIndirect).to.be.false;\r\n }\r\n if (iid === indirectElId) {\r\n chai.expect(reader.isIndirect).to.be.true;\r\n }\r\n checkCount++;\r\n }\r\n chai.expect(checkCount).to.be.equals(2);\r\n }\r\n\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n chai.expect(b1.txns.isUndoPossible).is.false;\r\n chai.expect(b1.txns.isRedoPossible).is.false;\r\n const lastTxn = b1.txns.getLastSavedTxnProps();\r\n chai.assert.isUndefined(lastTxn);\r\n });\r\n\r\n it(\"rebase handler\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps): Promise<void> => {\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n },\r\n });\r\n await b1.pullChanges();\r\n });\r\n it(\"stash & drop\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n const e2 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`first`);\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges(`second`);\r\n await testIModel.deleteElement(b1, e2);\r\n b1.saveChanges(`third`);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`fourth`);\r\n\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\r\n\r\n chai.expect(stash1).to.exist;\r\n chai.assert(Guid.isGuid(stash1.id));\r\n chai.expect(stash1.description).to.equals(\"stash test 1\");\r\n chai.expect(stash1.briefcaseId).equals(b1.briefcaseId);\r\n chai.expect(stash1.iModelId).to.equals(b1.iModelId);\r\n chai.expect(stash1.timestamp).to.exist;\r\n chai.expect(stash1.description).to.exist;\r\n chai.expect(stash1.hash).length(64);\r\n chai.expect(stash1.parentChangeset).to.exist;\r\n chai.expect(stash1.idSequences.element).to.equals(\"0x30000000004\");\r\n chai.expect(stash1.idSequences.instance).to.equals(\"0x30000000000\");\r\n chai.expect(stash1.acquiredLocks).equals(4);\r\n chai.expect(stash1.txns).to.exist;\r\n\r\n chai.expect(stash1.txns).to.have.lengthOf(4);\r\n chai.expect(stash1.txns[0].props.description).to.equal(\"first\");\r\n chai.expect(stash1.txns[1].props.description).to.equal(\"second\");\r\n chai.expect(stash1.txns[2].props.description).to.equal(\"third\");\r\n chai.expect(stash1.txns[3].props.description).to.equal(\"fourth\");\r\n\r\n chai.expect(stash1.txns[0].id).to.equals(\"0x100000000\");\r\n chai.expect(stash1.txns[1].id).to.equals(\"0x100000001\");\r\n chai.expect(stash1.txns[2].id).to.equals(\"0x100000002\");\r\n chai.expect(stash1.txns[3].id).to.equals(\"0x100000003\");\r\n\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`fifth`);\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges(`sixth`);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges(`seventh`);\r\n\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(stash2.description).to.equals(\"stash test 2\");\r\n chai.expect(stash2.hash).length(64);\r\n chai.expect(stash2.parentChangeset).to.exist;\r\n chai.expect(stash2.idSequences.element).to.equals(\"0x30000000006\");\r\n chai.expect(stash2.idSequences.instance).to.equals(\"0x30000000000\");\r\n chai.expect(stash2.acquiredLocks).equals(4);\r\n chai.expect(stash2.txns).to.exist;\r\n\r\n chai.expect(stash2.txns).to.have.lengthOf(7);\r\n chai.expect(stash2.txns[0].props.description).to.equal(\"first\");\r\n chai.expect(stash2.txns[1].props.description).to.equal(\"second\");\r\n chai.expect(stash2.txns[2].props.description).to.equal(\"third\");\r\n chai.expect(stash2.txns[3].props.description).to.equal(\"fourth\");\r\n chai.expect(stash2.txns[4].props.description).to.equal(\"fifth\");\r\n chai.expect(stash2.txns[5].props.description).to.equal(\"sixth\");\r\n chai.expect(stash2.txns[6].props.description).to.equal(\"seventh\");\r\n\r\n chai.expect(stash2.txns[0].id).to.equals(\"0x100000000\");\r\n chai.expect(stash2.txns[1].id).to.equals(\"0x100000001\");\r\n chai.expect(stash2.txns[2].id).to.equals(\"0x100000002\");\r\n chai.expect(stash2.txns[3].id).to.equals(\"0x100000003\");\r\n chai.expect(stash2.txns[4].id).to.equals(\"0x100000004\");\r\n chai.expect(stash2.txns[5].id).to.equals(\"0x100000005\");\r\n chai.expect(stash2.txns[6].id).to.equals(\"0x100000006\");\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(2);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 1\");\r\n chai.expect(stashes[0]).to.deep.equal(stash2);\r\n chai.expect(stashes[1]).to.deep.equal(stash1);\r\n\r\n StashManager.dropAllStashes(b1);\r\n chai.expect(StashManager.getStashes(b1)).to.have.lengthOf(0);\r\n });\r\n it(\"recursively calling withIndirectTxnMode()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n chai.expect(() =>\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n throw new Error(\"Test error\");\r\n })).to.throw();\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n });\r\n it(\"should fail to importSchemas() & importSchemaStrings() in indirect scope\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"MySchema\" alias=\"ms1\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"my_class\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n\r\n const schemaFile = path.join(KnownTestLocations.outputDir, \"MySchema.01.00.00.ecschema.xml\");\r\n if (existsSync(schemaFile)) {\r\n unlinkSync(schemaFile);\r\n }\r\n writeFileSync(schemaFile, schema, { encoding: \"utf8\" });\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.importSchemas([schema]);\r\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\r\n\r\n b1.abandonChanges();\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.importSchemaStrings([schema]);\r\n })).to.be.rejectedWith(\"Cannot import schemas while in an indirect change scope\");\r\n\r\n b1.abandonChanges();\r\n await b1.importSchemaStrings([schema]);\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"import schema\" });\r\n });\r\n\r\n it(\"should fail to saveChanges() & pushChanges() in indirect scope\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n await testIModel.insertElement(b1);\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.saveChanges();\r\n })).to.be.rejectedWith(\"Cannot save changes while in an indirect change scope\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.saveChanges();\r\n })).to.be.throws(\"Cannot save changes while in an indirect change scope\");\r\n\r\n b1.saveChanges();\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.pushChanges({ description: \"test\" });\r\n })).to.be.rejectedWith(\"Cannot pull and apply changeset while in an indirect change scope\");\r\n\r\n await b1.pushChanges({ description: \"test\" });\r\n });\r\n\r\n it(\"should fail to saveFileProperty/deleteFileProperty in indirect scope\", async () => {\r\n // pull/push/saveFileProperty/deleteFileProperty should be called inside indirect change scope.\r\n const b1 = await testIModel.openBriefcase();\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"Hello, World\");\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 1\");\r\n })).to.be.rejectedWith(\"Cannot save file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n await chai.expect(b1.txns.withIndirectTxnModeAsync(async () => {\r\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\r\n })).to.be.rejectedWith(\"Cannot delete file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"This should fail 2\");\r\n })).to.be.throws(\"Cannot save file property while in an indirect change scope\");\r\n\r\n chai.expect(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" })).to.equal(\"Hello, World\");\r\n\r\n chai.expect(() => b1.txns.withIndirectTxnMode(() => {\r\n b1.deleteFileProperty({ namespace: \"test\", name: \"test\" });\r\n })).to.be.throws(\"Cannot delete file property while in an indirect change scope\");\r\n\r\n b1.saveChanges();\r\n });\r\n\r\n it(\"recursively calling withIndirectTxnModeAsync()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n await b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n b1.txns.withIndirectTxnMode(() => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n });\r\n });\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n await chai.expect(\r\n b1.txns.withIndirectTxnModeAsync(async () => {\r\n chai.expect(b1.txns.getMode()).to.equal(\"indirect\");\r\n throw new Error(\"Test error\");\r\n })).rejectedWith(Error);\r\n\r\n chai.expect(b1.txns.getMode()).to.equal(\"direct\");\r\n });\r\n it(\"should restore mutually exclusive stashes\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n // stash 1\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges(\"first\");\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash1).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 2\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(\"second\");\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 3\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(e3).to.exist;\r\n b1.saveChanges(\"third\");\r\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\", discardLocalChanges: true, retainLocks: true });\r\n chai.expect(stash3).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n chai.expect(e1).not.equals(e2);\r\n chai.expect(e1).not.equals(e3);\r\n chai.expect(e2).not.equals(e3);\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(3);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\r\n\r\n // restore stash 1\r\n await StashManager.restore({ db: b1, stash: stash1 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 2\r\n await StashManager.restore({ db: b1, stash: stash2 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 3\r\n await StashManager.restore({ db: b1, stash: stash3 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n });\r\n it(\"should restore stash in any order\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n\r\n // stash 1\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges(\"first\");\r\n // do not discard local changes\r\n const stash1 = await StashManager.stash({ db: b1, description: \"stash test 1\" });\r\n chai.expect(stash1).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 2\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(\"second\");\r\n // do not discard local changes\r\n const stash2 = await StashManager.stash({ db: b1, description: \"stash test 2\" });\r\n chai.expect(stash2).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // stash 3\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(e3).to.exist;\r\n b1.saveChanges(\"third\");\r\n // do not discard local changes\r\n const stash3 = await StashManager.stash({ db: b1, description: \"stash test 3\" });\r\n chai.expect(stash3).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n chai.expect(b1.txns.isUndoPossible).to.be.true;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n const stashes = StashManager.getStashes(b1);\r\n chai.expect(stashes).to.have.lengthOf(3);\r\n chai.expect(stashes[0].description).to.equals(\"stash test 3\");\r\n chai.expect(stashes[1].description).to.equals(\"stash test 2\");\r\n chai.expect(stashes[2].description).to.equals(\"stash test 1\");\r\n\r\n await b1.discardChanges({ retainLocks: true });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n chai.expect(b1.txns.isUndoPossible).to.be.false;\r\n chai.expect(b1.txns.isRedoPossible).to.be.false;\r\n\r\n // restore stash 1\r\n await StashManager.restore({ db: b1, stash: stash1 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.undefined;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n\r\n // restore stash 2\r\n await StashManager.restore({ db: b1, stash: stash2 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.undefined;\r\n\r\n // restore stash 3\r\n await StashManager.restore({ db: b1, stash: stash3 });\r\n chai.expect(b1.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElement(e3)).to.exist;\r\n\r\n });\r\n it(\"should restore stash when briefcase has advanced to latest changeset\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n chai.expect(b1.changeset.index).to.equals(2);\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n chai.expect(b1.changeset.index).to.equals(3);\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n b2.saveChanges();\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\r\n chai.expect(b2Stash1.parentChangeset.index).to.equals(2);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.undefined;\r\n\r\n // stash restore should downgrade briefcase to older changeset as specified in stash\r\n await StashManager.restore({ db: b2, stash: b2Stash1 });\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n chai.expect(b2.elements.tryGetElement(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(b2.elements.tryGetElement(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElement(e2)).to.exist;\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n chai.expect(b2.changeset.index).to.equals(4);\r\n });\r\n it(\"restore stash that has element changed by another briefcase\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n chai.expect(b1.changeset.index).to.equals(2);\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(e1).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n chai.expect(b1.changeset.index).to.equals(3);\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n await testIModel.updateElement(b2, e1);\r\n b2.saveChanges();\r\n\r\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.true;\r\n const b2Stash1 = await StashManager.stash({ db: b2, description: \"stash test 1\", discardLocalChanges: true });\r\n chai.expect(b2Stash1.parentChangeset.index).to.equals(3);\r\n chai.expect(b2.locks.holdsExclusiveLock(e1)).to.be.false;\r\n\r\n // stash release lock so b2 should have released lock and b1 should be able to update.\r\n await testIModel.updateElement(b1, e1);\r\n b1.saveChanges();\r\n\r\n // restore stash should fail because of lock not obtained on e1\r\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // push b1 changes to release lock\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n // restore stash should fail because pull is required to obtain lock\r\n await chai.expect(StashManager.restore({ db: b2, stash: b2Stash1 })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.changeset.index).to.equals(4);\r\n const elBefore = b2.elements.tryGetElementProps(e1);\r\n chai.expect((elBefore as any).prop1).to.equals(\"3\");\r\n // restore stash should succeed as now it can obtain lock\r\n await StashManager.restore({ db: b2, stash: b2Stash1 });\r\n\r\n const elAfter = b2.elements.tryGetElementProps(e1);\r\n chai.expect((elAfter as any).prop1).to.equals(\"2\");\r\n await b2.pushChanges({ description: `${e1} updated` });\r\n });\r\n it(\"schema change should not be stashed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"a1\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n <ECProperty propertyName=\"prop2\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"A1Recipe2d\">\r\n <BaseClass>bis:TemplateRecipe2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\r\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\r\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\r\n <Class class=\"a1\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\r\n <Class class=\"a1\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`;\r\n await b1.importSchemaStrings([schema1]);\r\n b1.saveChanges();\r\n\r\n await chai.expect(StashManager.stash({ db: b1, description: \"stash test 1\" })).to.not.rejectedWith(\"Bad Arg: Pending schema changeset stashing is not currently supported\");\r\n });\r\n it(\"abort rebase\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n let e3 = \"\";\r\n b2.saveChanges();\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n e3 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n });\r\n it(\"calling discardChanges() from inside indirect scope is not allowed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n const p1 = b1.txns.withIndirectTxnModeAsync(async () => {\r\n await b1.discardChanges();\r\n });\r\n await chai.expect(p1).to.be.rejectedWith(\"Cannot discard changes when there are indirect changes\");\r\n b1.saveChanges();\r\n });\r\n it(\"calling discardChanges() during rebasing is not allowed\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n await testIModel.insertElement(b1);\r\n await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"inserted element\" });\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(b2.txns.rebaser.isAborting).is.false;\r\n await b2.discardChanges();\r\n },\r\n });\r\n\r\n chai.expect(b2.txns.rebaser.isAborting).is.false;\r\n const p1 = b2.pullChanges();\r\n await chai.expect(p1).to.be.rejectedWith(\"Cannot discard changes while a rebase is in progress\");\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n await b2.txns.rebaser.abort();\r\n });\r\n it(\"getStash() should throw exception\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n chai.expect(() => StashManager.getStash({ db: b1, stash: \"invalid_stash\" })).to.throw(\"No stashes exist for this briefcase\");\r\n chai.expect(StashManager.tryGetStash({ db: b1, stash: \"invalid_stash\" })).to.be.undefined;\r\n });\r\n it(\"edge case: a indirect update can cause FK violation\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const parentId = await testIModel.insertElement(b1);\r\n const childId = await testIModel.insertElementEx(b1, { parent: { id: parentId, relClassName: \"TestDomain:A1OwnsA1\" } });\r\n b1.saveChanges(\"insert parent and child\");\r\n await b1.pushChanges({ description: `inserted parent ${parentId} and child ${childId}` });\r\n await b2.pullChanges();\r\n\r\n // b1 delete childId while b1 create a child of childId as indirect change\r\n await testIModel.deleteElement(b1, childId);\r\n b1.saveChanges(\"delete child\");\r\n // no exclusive lock required on child1\r\n const grandChildId = await testIModel.insertElementEx(b2, { parent: { id: childId, relClassName: \"TestDomain:A1OwnsA1\" }, markAsIndirect: true });\r\n b2.saveChanges(\"delete child and insert grandchild\");\r\n\r\n await b1.pushChanges({ description: `deleted child ${childId}` });\r\n\r\n // should fail to pull and rebase changes.\r\n await chai.expect(b2.pushChanges({ description: `deleted child ${childId} and inserted grandchild ${grandChildId}` }))\r\n .to.be.rejectedWith(\"Foreign key conflicts in ChangeSet. Aborting rebase.\");\r\n });\r\n\r\n it(\"ECSqlReader unable to read updates after saveChanges()\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const findElement = async (id: Id64String) => {\r\n const reader = b1.createQueryReader(`SELECT ECInstanceId, ec_className(ECClassId), Prop1 FROM ts.A1 WHERE ECInstanceId = ${id}`, QueryBinder.from([id]));\r\n if (await reader.step())\r\n return { id: reader.current[0], className: reader.current[1], prop1: reader.current[2] };\r\n return undefined;\r\n }\r\n\r\n const runQuery = async (query: string) => {\r\n const reader = b1.createQueryReader(query);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n return rows;\r\n }\r\n const runQueryParallel = async (query: string, times: number = 1) => {\r\n return Promise.all(new Array(times).fill(query).map(runQuery));\r\n }\r\n\r\n // Following query have open cached statement against BisCore.Element that will prevent\r\n // updates from being visible until the statement is finalized.\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e1)).to.be.undefined;\r\n b1.saveChanges(\"insert element\");\r\n\r\n const e1Props = await findElement(e1);\r\n chai.expect(e1Props).to.exist;\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n const e2 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e2)).to.be.undefined;\r\n b1.saveChanges(\"insert second element\");\r\n\r\n const e2Props = await findElement(e2);\r\n chai.expect(e2Props).to.exist;\r\n\r\n await runQueryParallel(`SELECT $ FROM BisCore.Element`, 10);\r\n const e3 = await testIModel.insertElement(b1);\r\n chai.expect(await findElement(e3)).to.be.undefined;\r\n b1.saveChanges(\"insert third element\");\r\n\r\n const e3Props = await findElement(e3);\r\n chai.expect(e3Props).to.exist;\r\n });\r\n it(\"enum txn changes in recompute\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n let txnVerified = 0;\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txn: TxnProps): Promise<void> => {\r\n const reader = SqliteChangesetReader.openTxn({ txnId: txn.id, db: b2, disableSchemaCheck: true });\r\n const adaptor = new ChangesetECAdaptor(reader);\r\n adaptor.acceptClass(\"TestDomain:a1\");\r\n const ids = new Set<Id64String>();\r\n while (adaptor.step()) {\r\n if (!adaptor.reader.isIndirect)\r\n ids.add(adaptor.inserted?.ECInstanceId || adaptor.deleted?.ECInstanceId as Id64String);\r\n }\r\n adaptor.close();\r\n\r\n if (txn.props.description === \"first change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000001\"]);\r\n txnVerified++;\r\n } else if (txn.props.description === \"second change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000003\"]);\r\n txnVerified++;\r\n } else if (txn.props.description === \"third change\") {\r\n chai.expect(Array.from(ids.keys())).deep.equal([\"0x40000000005\"]);\r\n txnVerified++;\r\n } else {\r\n txnVerified++;\r\n }\r\n },\r\n });\r\n await b2.pullChanges();\r\n chai.expect(txnVerified).to.equal(3);\r\n });\r\n\r\n it(\"before and after rebase events\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"first change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"second change\");\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"third change\");\r\n\r\n const events = {\r\n onRebase: {\r\n beginCount: 0,\r\n endCount: 0,\r\n beginTxns: [] as TxnProps[],\r\n },\r\n onRebaseTxn: {\r\n beginTxns: [] as TxnProps[],\r\n endTxns: [] as TxnProps[],\r\n },\r\n rebaseHandler: {\r\n shouldReinstate: [] as TxnProps[],\r\n recompute: [] as TxnProps[],\r\n },\r\n pullMerge: {\r\n beginCount: 0,\r\n endCount: 0,\r\n beginChangeset: [] as ChangesetIdWithIndex[],\r\n endChangeset: [] as ChangesetIdWithIndex[],\r\n },\r\n applyIncomingChanges: {\r\n beginCount: 0,\r\n endCount: 0,\r\n beginChangesets: [] as ChangesetProps[],\r\n endChangesets: [] as ChangesetProps[],\r\n },\r\n reverseLocalChanges: {\r\n beginCount: 0,\r\n endCount: 0,\r\n txns: [] as TxnProps[],\r\n },\r\n downloadChangesets: {\r\n beginCount: 0,\r\n endCount: 0,\r\n },\r\n };\r\n\r\n const resetEvent = () => {\r\n events.onRebase.beginCount = 0;\r\n events.onRebase.endCount = 0;\r\n events.onRebase.beginTxns = [];\r\n events.onRebaseTxn.beginTxns = [];\r\n events.onRebaseTxn.endTxns = [];\r\n events.rebaseHandler.shouldReinstate = [];\r\n events.rebaseHandler.recompute = [];\r\n events.pullMerge.beginCount = 0;\r\n events.pullMerge.endCount = 0;\r\n events.pullMerge.beginChangeset = [];\r\n events.pullMerge.endChangeset = [];\r\n events.applyIncomingChanges.beginCount = 0;\r\n events.applyIncomingChanges.endCount = 0;\r\n events.applyIncomingChanges.beginChangesets = [];\r\n events.applyIncomingChanges.endChangesets = [];\r\n events.reverseLocalChanges.beginCount = 0;\r\n events.reverseLocalChanges.endCount = 0;\r\n events.reverseLocalChanges.txns = [];\r\n events.downloadChangesets.beginCount = 0;\r\n events.downloadChangesets.endCount = 0;\r\n };\r\n\r\n // onPullMergeXXXX\r\n b2.txns.rebaser.onPullMergeBegin.addListener((changeset: ChangesetIdWithIndex) => {\r\n events.pullMerge.beginCount++;\r\n events.pullMerge.beginChangeset.push(changeset);\r\n });\r\n\r\n b2.txns.rebaser.onPullMergeEnd.addListener((changeset: ChangesetIdWithIndex) => {\r\n events.pullMerge.endCount++;\r\n events.pullMerge.endChangeset.push(changeset);\r\n });\r\n\r\n // onApplyIncomingChangesXXXX\r\n b2.txns.rebaser.onApplyIncomingChangesBegin.addListener((changesets: ChangesetProps[]) => {\r\n events.applyIncomingChanges.beginCount++;\r\n events.applyIncomingChanges.beginChangesets.push(...changesets);\r\n });\r\n\r\n\r\n b2.txns.rebaser.onApplyIncomingChangesEnd.addListener((changesets: ChangesetProps[]) => {\r\n events.applyIncomingChanges.endCount++;\r\n events.applyIncomingChanges.endChangesets.push(...changesets);\r\n });\r\n\r\n // onReverseLocalChangesXXXX\r\n b2.txns.rebaser.onReverseLocalChangesBegin.addListener(() => {\r\n events.reverseLocalChanges.beginCount++;\r\n });\r\n\r\n b2.txns.rebaser.onReverseLocalChangesEnd.addListener((txns: TxnProps[]) => {\r\n events.reverseLocalChanges.endCount++;\r\n removePropertyRecursive(txns, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.reverseLocalChanges.txns.push(...txns);\r\n });\r\n\r\n // onDownloadChangesetsXXXX\r\n b2.txns.rebaser.onDownloadChangesetsBegin.addListener(() => {\r\n events.downloadChangesets.beginCount++;\r\n });\r\n\r\n b2.txns.rebaser.onDownloadChangesetsEnd.addListener(() => {\r\n events.downloadChangesets.endCount++;\r\n });\r\n\r\n // onRebaseXXXX\r\n b2.txns.rebaser.onRebaseBegin.addListener((txns: TxnProps[]) => {\r\n events.onRebase.beginCount++;\r\n removePropertyRecursive(txns, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.onRebase.beginTxns.push(...txns);\r\n });\r\n\r\n b2.txns.rebaser.onRebaseEnd.addListener(() => {\r\n events.onRebase.endCount++;\r\n });\r\n\r\n // onRebaseTxnXXXX\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((txn: TxnProps) => {\r\n removePropertyRecursive(txn, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.onRebaseTxn.beginTxns.push(txn);\r\n });\r\n\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((txn: TxnProps) => {\r\n removePropertyRecursive(txn, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.onRebaseTxn.endTxns.push(txn);\r\n });\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n // shouldReinstate\r\n removePropertyRecursive(_txn, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.rebaseHandler.shouldReinstate.push(_txn);\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps): Promise<void> => {\r\n // recompute\r\n removePropertyRecursive(_txn, \"timestamp\"); // it changes on each run, so remove it for comparison\r\n events.rebaseHandler.recompute.push(_txn);\r\n },\r\n });\r\n\r\n resetEvent();\r\n await b2.pullChanges();\r\n // pullMerge events\r\n chai.expect(events.pullMerge.beginCount).to.equal(1);\r\n chai.expect(events.pullMerge.endCount).to.equal(1);\r\n chai.expect((events.pullMerge.beginChangeset[0].index)).to.equal(3);\r\n chai.expect((events.pullMerge.endChangeset[0].index)).to.equal(4);\r\n\r\n // applyIncomingChanges events\r\n chai.expect(events.applyIncomingChanges.beginCount).to.equal(1);\r\n chai.expect(events.applyIncomingChanges.endCount).to.equal(1);\r\n chai.expect(events.applyIncomingChanges.beginChangesets.map((cs) => cs.index)).to.deep.equal([4]);\r\n chai.expect(events.applyIncomingChanges.endChangesets.map((cs) => cs.index)).to.deep.equal([4]);\r\n\r\n // downloadChangesets events\r\n chai.expect(events.downloadChangesets.beginCount).to.equal(1);\r\n chai.expect(events.downloadChangesets.endCount).to.equal(1);\r\n\r\n // reverseLocalChanges events\r\n chai.expect(events.reverseLocalChanges.beginCount).to.equal(1);\r\n chai.expect(events.reverseLocalChanges.endCount).to.equal(1);\r\n chai.expect(events.reverseLocalChanges.txns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n // rebase events\r\n chai.expect(events.onRebase.beginCount).to.equal(1);\r\n chai.expect(events.onRebase.endCount).to.equal(1);\r\n chai.expect(events.onRebase.beginTxns).to.deep.equal(\r\n [\r\n {\r\n grouped: false,\r\n id: \"0x100000000\",\r\n nextId: \"0x100000001\",\r\n props: {\r\n description: \"first change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n },\r\n {\r\n grouped: false,\r\n id: \"0x100000001\",\r\n nextId: \"0x100000002\",\r\n prevId: \"0x100000000\",\r\n props: {\r\n description: \"second change\",\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n },\r\n {\r\n grouped: false,\r\n id: \"0x100000002\",\r\n prevId: \"0x100000001\",\r\n props: {\r\n description: \"third change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n }\r\n ]\r\n );\r\n\r\n chai.expect(events.onRebaseTxn.beginTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n chai.expect(events.onRebaseTxn.endTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n chai.expect(events.rebaseHandler.shouldReinstate.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n chai.expect(events.rebaseHandler.recompute.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\"]);\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n await testIModel.insertElement(b2);\r\n await testIModel.insertElement(b2, true);\r\n b2.saveChanges(\"fourth change\");\r\n\r\n resetEvent();\r\n await b2.pullChanges();\r\n\r\n chai.expect(events.onRebase.beginCount).to.equal(1);\r\n chai.expect(events.onRebase.endCount).to.equal(1);\r\n chai.expect(events.onRebase.beginTxns).to.deep.equal([\r\n {\r\n grouped: false,\r\n id: \"0x100000000\",\r\n nextId: \"0x100000001\",\r\n props: {\r\n description: \"first change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n },\r\n {\r\n grouped: false,\r\n id: \"0x100000001\",\r\n nextId: \"0x100000002\",\r\n prevId: \"0x100000000\",\r\n props: {\r\n description: \"second change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n },\r\n {\r\n grouped: false,\r\n id: \"0x100000002\",\r\n nextId: \"0x100000003\",\r\n prevId: \"0x100000001\",\r\n props: {\r\n description: \"third change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n },\r\n {\r\n grouped: false,\r\n id: \"0x100000003\",\r\n prevId: \"0x100000002\",\r\n props: {\r\n description: \"fourth change\"\r\n },\r\n reversed: true,\r\n sessionId: 1,\r\n type: \"Data\"\r\n }\r\n ]);\r\n chai.expect(events.onRebaseTxn.beginTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n chai.expect(events.onRebaseTxn.endTxns.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n\r\n chai.expect(events.rebaseHandler.shouldReinstate.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n chai.expect(events.rebaseHandler.recompute.map((txn) => txn.id)).to.deep.equal([\"0x100000000\", \"0x100000001\", \"0x100000002\", \"0x100000003\"]);\r\n });\r\n it(\"onModelGeometryChanged() not fired during rebase/pullMerge with no local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).is.undefined;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(0);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n onGeometryChanged: [] as ModelGeometryChangesProps[][],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n events.onGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n b1.txns.onGeometryChanged.addListener((changes: ModelGeometryChangesProps[]) => {\r\n events.onGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n b1.saveChanges(`insert element ${e1} and ${e2}`);\r\n\r\n chai.expect(events.modelGeometryChanged.length).to.equal(1);\r\n chai.expect(events.modelGeometryChanged[0].length).to.equal(1);\r\n chai.expect(events.modelGeometryChanged[0][0].id).to.equal(\"0x20000000001\");\r\n chai.assert(Guid.isGuid(events.modelGeometryChanged[0][0].guid));\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2);\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).to.not.equal(geomGuidAfterPull);\r\n chai.expect(events.modelGeometryChanged.length).to.equal(4);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with non-geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertElement(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n await testIModel.insertRecipe2d(b1);\r\n b1.saveChanges();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).to.exist;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(1);\r\n });\r\n it(\"onModelGeometryChanged() fired during rebase with geometric local change\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const pushChangeFromB2 = async () => {\r\n await b2.pullChanges();\r\n await testIModel.insertRecipe2d(b2);\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: \"insert element on b2\" });\r\n };\r\n\r\n const events = {\r\n modelGeometryChanged: [] as ReadonlyArray<ModelIdAndGeometryGuid>[],\r\n onGeometryChanged: [] as ModelGeometryChangesProps[][],\r\n };\r\n\r\n const getGeometryGuidFromB1 = (modelId: string) => {\r\n const modelProps = b1.models.tryGetModelProps<GeometricModelProps>(modelId);\r\n return modelProps?.geometryGuid;\r\n };\r\n\r\n const clearEvents = () => {\r\n events.modelGeometryChanged = [];\r\n events.onGeometryChanged = [];\r\n };\r\n\r\n b1.txns.onModelGeometryChanged.addListener((changes: ReadonlyArray<ModelIdAndGeometryGuid>) => {\r\n events.modelGeometryChanged.push(changes);\r\n });\r\n\r\n b1.txns.onGeometryChanged.addListener((changes: ModelGeometryChangesProps[]) => {\r\n events.onGeometryChanged.push(changes);\r\n });\r\n\r\n clearEvents();\r\n\r\n b1.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txn: TxnProps) => {\r\n await testIModel.insertElement(b1);\r\n },\r\n });\r\n\r\n await pushChangeFromB2();\r\n\r\n clearEvents();\r\n const geomGuidBeforePull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidBeforePull).is.undefined;\r\n await b1.pushChanges({ description: \"push changes on b1\" });\r\n const geomGuidAfterPull = getGeometryGuidFromB1(\"0x20000000001\");\r\n chai.expect(geomGuidAfterPull).is.undefined;\r\n chai.expect(events.modelGeometryChanged.length).to.equal(0);\r\n });\r\n it(\"rebase multi txn\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"insert element 1 direct and 1 indirect\" });\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.txns.beginMultiTxnOperation()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n let elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n chai.expect(b2.txns.endMultiTxnOperation()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n b2.saveChanges();\r\n elId = await testIModel.insertElement(b2);\r\n b2.saveChanges(`insert element ${elId}`);\r\n let txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(false);\r\n\r\n // reverse single txn 0x100000003\r\n chai.expect(b2.txns.reverseSingleTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reverse multi txn. should reverse 0x100000000, 0x100000001 & 0x100000002\r\n chai.expect(b2.txns.reverseSingleTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(true);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reinstate the transaction\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(true);\r\n chai.expect(b2.txns.reinstateTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(true);\r\n\r\n // reinstate the transaction\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(true);\r\n chai.expect(b2.txns.reinstateTxn()).to.be.equals(DbResult.BE_SQLITE_OK);\r\n\r\n txns = Array.from(b2.txns.queryTxns());\r\n\r\n chai.expect(txns[0].id).to.be.equals(\"0x100000000\"); // 1st after beginMultiTxnOperation()\r\n chai.expect(txns[0].props.description).to.be.equals(\"insert element 0x40000000001\");\r\n chai.expect(txns[0].sessionId).to.be.equals(1);\r\n chai.expect(txns[0].grouped).to.be.equals(false);\r\n chai.expect(txns[0].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[1].id).to.be.equals(\"0x100000001\"); // 2nd after beginMultiTxnOperation()\r\n chai.expect(txns[1].props.description).to.be.equals(\"insert element 0x40000000002\");\r\n chai.expect(txns[1].sessionId).to.be.equals(1);\r\n chai.expect(txns[1].grouped).to.be.equals(true);\r\n chai.expect(txns[1].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[2].id).to.be.equals(\"0x100000002\"); // 3rd after beginMultiTxnOperation() & before endMultiTxnOperation()\r\n chai.expect(txns[2].props.description).to.be.equals(\"insert element 0x40000000003\");\r\n chai.expect(txns[2].sessionId).to.be.equals(1);\r\n chai.expect(txns[2].grouped).to.be.equals(true);\r\n chai.expect(txns[2].reversed).to.be.equals(false);\r\n\r\n chai.expect(txns[3].id).to.be.equals(\"0x100000003\"); // 4th after endMultiTxnOperation()\r\n chai.expect(txns[3].props.description).to.be.equals(\"insert element 0x40000000004\");\r\n chai.expect(txns[3].type).to.be.equals(\"Data\");\r\n chai.expect(txns[3].grouped).to.be.equals(false);\r\n chai.expect(txns[3].reversed).to.be.equals(false);\r\n\r\n chai.expect(b2.txns.isRedoPossible).to.be.equals(false);\r\n\r\n\r\n await testIModel.updateElement(b1, e1);\r\n await testIModel.updateElement(b1, e2, true);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: \"update element 1 direct and 1 indirect\" });\r\n\r\n const recomputeTxnIds = [] as TxnIdString[];\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txn: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txn: TxnProps): Promise<void> => {\r\n recomputeTxnIds.push(txn.id);\r\n },\r\n });\r\n\r\n await b2.pullChanges();\r\n\r\n chai.expect(recomputeTxnIds).to.deep.equals([\r\n \"0x100000000\",\r\n \"0x100000001\",\r\n \"0x100000002\",\r\n \"0x100000003\",\r\n ]);\r\n });\r\n it(\"abort rebase should discard in-memory changes\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await testIModel.insertElement(b2);\r\n chai.expect(e2).to.exist;\r\n let e3 = \"\";\r\n b2.saveChanges();\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n e3 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist; // came from incoming changeset\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.undefined; // was local change and reversed during rebase.\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // was insert by reCompute() but due to exception the rebase attempt was abandoned.\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n // make temp change\r\n b2.saveFileProperty({ name: \"test\", namespace: \"testNamespace\" }, \"testValue\");\r\n chai.expect(b2.txns.hasUnsavedChanges).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n // should abort with unsaved local changes\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.undefined; // reset briefcase should move tip back to where it was before pull\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist; // abort should put back e2 which was only change at the time of pull\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined; // add by rebase so should not exist either\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n });\r\n it(\"two users insert same ElementGroupsMembers instance\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1);\r\n const e3 = await testIModel.insertElement(b1);\r\n const e4 = await testIModel.insertElement(b1);\r\n\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n chai.expect(e3).to.exist;\r\n chai.expect(e4).to.exist;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted elements` });\r\n await b2.pullChanges();\r\n\r\n const r1 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 10).toJSON());\r\n const r2 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e3, e4, 20).toJSON());\r\n chai.expect(r1).to.exist;\r\n chai.expect(r2).to.exist;\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted relationship` });\r\n\r\n const r3 = b2.relationships.insertInstance(ElementGroupsMembers.create(b2, e1, e2, 10).toJSON());\r\n const r4 = b2.relationships.insertInstance(ElementGroupsMembers.create(b2, e3, e4, 20).toJSON());\r\n chai.expect(r3).to.exist;\r\n chai.expect(r4).to.exist;\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: `inserted relationship` });\r\n await b2.pullChanges();\r\n\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.exist;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r3)).to.be.undefined;\r\n chai.expect(b2.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r4)).to.be.undefined;\r\n\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.exist;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r3)).to.be.undefined;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r4)).to.be.undefined;\r\n });\r\n it(\"one user update and other delete the link table relationships\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const e1 = await testIModel.insertElement(b1);\r\n const e2 = await testIModel.insertElement(b1);\r\n\r\n const r1 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 10).toJSON());\r\n const r2 = b1.relationships.insertInstance(ElementGroupsMembers.create(b1, e1, e2, 20).toJSON());\r\n\r\n chai.expect(e1).to.exist;\r\n chai.expect(e2).to.exist;\r\n chai.expect(r1).to.exist;\r\n chai.expect(r2).to.exist;\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `inserted elements and relationship` });\r\n await b2.pullChanges();\r\n\r\n\r\n // intentionally change memberPriority to 10 for which there is another relationship already exists.\r\n chai.expect(() => b2.relationships.updateInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2,\r\n memberPriority: 20\r\n } as RelationshipProps)).to.throws(\"error updating relationship\");\r\n\r\n\r\n b2.relationships.updateInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2,\r\n memberPriority: 60\r\n } as RelationshipProps);\r\n\r\n b1.relationships.deleteInstance({\r\n id: r1,\r\n classFullName: ElementGroupsMembers.classFullName,\r\n sourceId: e1,\r\n targetId: e2\r\n } as RelationshipProps);\r\n\r\n b1.saveChanges();\r\n await b1.pushChanges({ description: `deleted relationship` });\r\n\r\n b2.saveChanges();\r\n await b2.pushChanges({ description: `updated relationship` });\r\n\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r1)).to.be.undefined;\r\n chai.expect(b1.relationships.tryGetInstanceProps(ElementGroupsMembers.classFullName, r2)).to.exist;\r\n });\r\n it(\"aborting rebaser in middle of rebase session where at least one txn is successfully rebased (used to cause crash)\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n\r\n const createTxn = async (b: BriefcaseDb) => {\r\n const id = await testIModel.insertElement(b);\r\n chai.expect(id).is.exist;\r\n b.saveChanges(`created element ${id}`);\r\n return id;\r\n };\r\n\r\n const e1 = await createTxn(b1);\r\n await b1.pushChanges({ description: `${e1} inserted` });\r\n\r\n const e2 = await createTxn(b2);\r\n const e3 = await createTxn(b2);\r\n const e4 = await createTxn(b2);\r\n\r\n let e5 = \"\";\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (txnProps: TxnProps) => {\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n if (txnProps.id === \"0x100000001\") {\r\n e5 = await testIModel.insertElement(b2);\r\n throw new Error(\"Rebase failed\");\r\n }\r\n },\r\n });\r\n\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.be.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.be.undefined;\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n await chai.expect(b2.pullChanges()).to.be.rejectedWith(\"Rebase failed\");\r\n await chai.expect(createTxn(b2)).to.be.rejectedWith(`Could not save changes (created element 0x40000000004)`);\r\n\r\n chai.expect(b2.changeset.index).to.equals(3);\r\n chai.expect(e3).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.exist;\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.true;\r\n\r\n // make temp change\r\n b2.saveFileProperty({ name: \"test\", namespace: \"testNamespace\" }, \"testValue\");\r\n chai.expect(b2.txns.hasUnsavedChanges).is.true;\r\n\r\n chai.expect(b2.txns.rebaser.canAbort()).is.true;\r\n\r\n // should abort with unsaved local changes\r\n await b2.txns.rebaser.abort();\r\n\r\n chai.expect(b2.changeset.index).to.equals(2);\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.be.undefined;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e5)).to.be.undefined;\r\n\r\n chai.expect(BriefcaseManager.containsRestorePoint(b2, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)).is.false;\r\n\r\n b2.txns.rebaser.setCustomHandler({\r\n shouldReinstate: (_txnProps: TxnProps) => {\r\n return true;\r\n },\r\n recompute: async (_txnProps: TxnProps) => { },\r\n });\r\n\r\n const e6 = await createTxn(b2);\r\n b2.saveChanges(`created element ${e6}`);\r\n chai.expect(b2.txns.getCurrentTxnId()).to.equal(\"0x100000004\");\r\n chai.expect(b2.txns.getLastSavedTxnProps()?.id).to.equal(`0x100000003`);\r\n\r\n await b2.pullChanges();\r\n chai.expect(b2.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b2.elements.tryGetElementProps(e4)).to.exist;\r\n const e7 = await createTxn(b2);\r\n b2.saveChanges(`created element ${e7}`);\r\n chai.expect(b2.txns.getCurrentTxnId()).to.equal(\"0x100000005\");\r\n chai.expect(b2.txns.getLastSavedTxnProps()?.id).to.equal(`0x100000004`);\r\n await b2.pushChanges({ description: \"pushed after rebase aborted\" });\r\n\r\n await b1.pullChanges();\r\n chai.expect(b1.elements.tryGetElementProps(e1)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e2)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e3)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e4)).to.exist;\r\n chai.expect(b1.elements.tryGetElementProps(e7)).to.exist;\r\n });\r\n it(\"changeset DDL error are ignored and ec_* tables are used to reconstruct the sqlite tables\", async () => {\r\n const b1 = await testIModel.openBriefcase();\r\n const b2 = await testIModel.openBriefcase();\r\n const iModelId = testIModel.iModelId;\r\n const targetDir = path.join(KnownTestLocations.outputDir, iModelId, \"changesets\");\r\n let ver = 0;\r\n let props = 0;\r\n const tblGeom2d = \"bis_GeometricElement2d\";\r\n const geom2dBaseColumnList = [\r\n \"ElementId\",\r\n \"ECClassId\",\r\n \"CategoryId\",\r\n \"Origin_X\",\r\n \"Origin_Y\",\r\n \"Rotation\",\r\n \"BBoxLow_X\",\r\n \"BBoxLow_Y\",\r\n \"BBoxHigh_X\",\r\n \"BBoxHigh_Y\",\r\n \"GeometryStream\",\r\n \"TypeDefinitionId\",\r\n \"TypeDefinitionRelECClassId\",\r\n \"js1\",\r\n \"js2\",\r\n ];\r\n\r\n const generateSchema = (noOfNewPropsToAdd: number) => {\r\n props += noOfNewPropsToAdd;\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain1\" alias=\"ts1\" version=\"01.00.${ver++}\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"test\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n ${Array.from({ length: props - 1 }, (_, i) => `<ECProperty propertyName=\"prop${i + 2}\" typeName=\"string\" />`).join(\"\\n \")}\r\n </ECEntityClass>\r\n </ECSchema>`;\r\n };\r\n\r\n const getColumnNames = (b: BriefcaseDb, tableName: string) => {\r\n return b.withSqliteStatement(`PRAGMA table_info(${tableName})`, (stmt) => {\r\n const columnNames: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n columnNames.push(stmt.getValue(1).getString());\r\n }\r\n return columnNames;\r\n });\r\n };\r\n\r\n const withLatestChangeset = async (cb: (reader: SqliteChangesetReader) => Promise<void>) => {\r\n const csInfo = await HubMock.getLatestChangeset({ iModelId });\r\n const info = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: { id: csInfo.id },\r\n targetDir,\r\n });\r\n\r\n const reader = SqliteChangesetReader.openFile({ db: b1, fileName: info.pathname });\r\n try {\r\n await cb(reader);\r\n } finally {\r\n reader.close();\r\n }\r\n };\r\n\r\n // Verify initial columns\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals(geom2dBaseColumnList);\r\n chai.expect(getColumnNames(b2, tblGeom2d)).deep.equals(geom2dBaseColumnList);\r\n\r\n // Import schema that add 5 new properties that should add 3 new shared columns\r\n await b1.importSchemaStrings([generateSchema(5)]);\r\n await b1.pushChanges({ description: `imported schema version 1.0.${ver - 1}` });\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\"]);\r\n\r\n //verify changeset has schema changes\r\n await withLatestChangeset(async (reader) => {\r\n const schemaChanges = reader.getDdlChanges()?.split(\";\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js3] BLOB\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js4] BLOB\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js5] BLOB\");\r\n });\r\n\r\n await b2.pullChanges();\r\n chai.expect(getColumnNames(b2, \"bis_GeometricElement2d\")).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\"]);\r\n\r\n\r\n // Import schema that add 5 new properties that should add 3 new shared columns\r\n await b1.importSchemaStrings([generateSchema(1)]);\r\n await b1.pushChanges({ description: `imported schema version 1.0.${ver - 1}` });\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b1, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\", \"js6\"]);\r\n //verify changeset has schema changes\r\n await withLatestChangeset(async (reader) => {\r\n const schemaChanges = reader.getDdlChanges()?.split(\";\");\r\n chai.expect(schemaChanges).to.include(\"ALTER TABLE [bis_GeometricElement2d] ADD COLUMN [js6] BLOB\");\r\n });\r\n\r\n // delete the table so DDL apply should fail\r\n b2[_nativeDb].executeSql(`DROP TABLE ${tblGeom2d}`)\r\n\r\n // this would fail before this PR but should succeed as DDL error are ignored and table reconstruction is attempted using ec_* tables\r\n await b2.pullChanges();\r\n\r\n // Verify columns after schema import\r\n chai.expect(getColumnNames(b2, tblGeom2d)).deep.equals([...geom2dBaseColumnList, \"js3\", \"js4\", \"js5\", \"js6\"]);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}