@yorkie-js/react 0.7.12-rc → 0.7.13

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.
@@ -5792,7 +5792,7 @@
5792
5792
  }
5793
5793
  };
5794
5794
  }
5795
- const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLZGgoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2QMKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5795
+ const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLpGwoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa6QQKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkSLQoNcmVzdG9yZV9zcGFucxgIIAMoCzIWLnlvcmtpZS52MS5SZXN0b3JlU3BhbhIsCgxyZXN0b3JlX21vZGUYCSABKA4yFi55b3JraWUudjEuUmVzdG9yZU1vZGUSMQoRcmV0b21ic3RvbmVfc3BhbnMYCiADKAsyFi55b3JraWUudjEuUmVzdG9yZVNwYW4aUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUi1AEKC1Jlc3RvcmVTcGFuEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBINCgVzdGFydBgCIAEoBRILCgNlbmQYAyABKAUSDwoHY29udGVudBgEIAEoCRI6CgphdHRyaWJ1dGVzGAUgAygLMiYueW9ya2llLnYxLlJlc3RvcmVTcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqYwoLUmVzdG9yZU1vZGUSHAoYUkVTVE9SRV9NT0RFX1VOU1BFQ0lGSUVEEAASGAoUUkVTVE9SRV9NT0RFX1JFU1RPUkUQARIcChhSRVNUT1JFX01PREVfUkVUT01CU1RPTkUQAir8AgoJVmFsdWVUeXBlEhMKD1ZBTFVFX1RZUEVfTlVMTBAAEhYKElZBTFVFX1RZUEVfQk9PTEVBThABEhYKElZBTFVFX1RZUEVfSU5URUdFUhACEhMKD1ZBTFVFX1RZUEVfTE9ORxADEhUKEVZBTFVFX1RZUEVfRE9VQkxFEAQSFQoRVkFMVUVfVFlQRV9TVFJJTkcQBRIUChBWQUxVRV9UWVBFX0JZVEVTEAYSEwoPVkFMVUVfVFlQRV9EQVRFEAcSGgoWVkFMVUVfVFlQRV9KU09OX09CSkVDVBAIEhkKFVZBTFVFX1RZUEVfSlNPTl9BUlJBWRAJEhMKD1ZBTFVFX1RZUEVfVEVYVBAKEhoKFlZBTFVFX1RZUEVfSU5URUdFUl9DTlQQCxIXChNWQUxVRV9UWVBFX0xPTkdfQ05UEAwSEwoPVkFMVUVfVFlQRV9UUkVFEA0SIAocVkFMVUVfVFlQRV9JTlRFR0VSX0RFRFVQX0NOVBAOIgQIDxAPKqYBCgxEb2NFdmVudFR5cGUSIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQ0hBTkdFRBAAEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1dBVENIRUQQARIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9VTldBVENIRUQQAhIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9CUk9BRENBU1QQA0JFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5796
5796
  const SnapshotSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 0);
5797
5797
  const ChangePackSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 1);
5798
5798
  const ChangeSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 2);
@@ -5837,13 +5837,20 @@
5837
5837
  const PresenceSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 24);
5838
5838
  const CheckpointSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 26);
5839
5839
  const TextNodePosSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 27);
5840
- const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5840
+ const RestoreSpanSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5841
+ const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 29);
5841
5842
  var ChannelEvent_Type = /* @__PURE__ */ ((ChannelEvent_Type2) => {
5842
5843
  ChannelEvent_Type2[ChannelEvent_Type2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5843
5844
  ChannelEvent_Type2[ChannelEvent_Type2["PRESENCE"] = 1] = "PRESENCE";
5844
5845
  ChannelEvent_Type2[ChannelEvent_Type2["BROADCAST"] = 2] = "BROADCAST";
5845
5846
  return ChannelEvent_Type2;
5846
5847
  })(ChannelEvent_Type || {});
5848
+ var RestoreMode = /* @__PURE__ */ ((RestoreMode2) => {
5849
+ RestoreMode2[RestoreMode2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5850
+ RestoreMode2[RestoreMode2["RESTORE"] = 1] = "RESTORE";
5851
+ RestoreMode2[RestoreMode2["RETOMBSTONE"] = 2] = "RETOMBSTONE";
5852
+ return RestoreMode2;
5853
+ })(RestoreMode || {});
5847
5854
  var ValueType = /* @__PURE__ */ ((ValueType2) => {
5848
5855
  ValueType2[ValueType2["NULL"] = 0] = "NULL";
5849
5856
  ValueType2[ValueType2["BOOLEAN"] = 1] = "BOOLEAN";
@@ -5869,7 +5876,7 @@
5869
5876
  DocEventType2[DocEventType2["DOCUMENT_BROADCAST"] = 3] = "DOCUMENT_BROADCAST";
5870
5877
  return DocEventType2;
5871
5878
  })(DocEventType$1 || {});
5872
- const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIn4KFUF0dGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxISCgpzY2hlbWFfa2V5GAMgASgJEhIKCmRpc2FibGVfZ2MYBCABKAginwEKFkF0dGFjaERvY3VtZW50UmVzcG9uc2USEwoLZG9jdW1lbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYAyABKAUSJQoMc2NoZW1hX3J1bGVzGAQgAygLMg8ueW9ya2llLnYxLlJ1bGUiiwEKFURldGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIeChZyZW1vdmVfaWZfbm90X2F0dGFjaGVkGAQgASgIIkQKFkRldGFjaERvY3VtZW50UmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJTCgxXYXRjaFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEjAKCXJlc291cmNlcxgCIAMoCzIdLnlvcmtpZS52MS5SZXNvdXJjZURlc2NyaXB0b3IihAEKElJlc291cmNlRGVzY3JpcHRvchIxCghkb2N1bWVudBgBIAEoCzIdLnlvcmtpZS52MS5Eb2N1bWVudERlc2NyaXB0b3JIABIvCgdjaGFubmVsGAIgASgLMhwueW9ya2llLnYxLkNoYW5uZWxEZXNjcmlwdG9ySABCCgoIcmVzb3VyY2UiKQoSRG9jdW1lbnREZXNjcmlwdG9yEhMKC2RvY3VtZW50X2lkGAEgASgJIigKEUNoYW5uZWxEZXNjcmlwdG9yEhMKC2NoYW5uZWxfa2V5GAEgASgJInkKDVdhdGNoUmVzcG9uc2USOAoOaW5pdGlhbGl6YXRpb24YASABKAsyHi55b3JraWUudjEuV2F0Y2hJbml0aWFsaXphdGlvbkgAEiYKBWV2ZW50GAIgASgLMhUueW9ya2llLnYxLldhdGNoRXZlbnRIAEIGCgRib2R5IkYKE1dhdGNoSW5pdGlhbGl6YXRpb24SLwoOcmVzb3VyY2VfaW5pdHMYASADKAsyFy55b3JraWUudjEuUmVzb3VyY2VJbml0IngKDFJlc291cmNlSW5pdBIwCg1kb2N1bWVudF9pbml0GAEgASgLMhcueW9ya2llLnYxLkRvY3VtZW50SW5pdEgAEi4KDGNoYW5uZWxfaW5pdBgCIAEoCzIWLnlvcmtpZS52MS5DaGFubmVsSW5pdEgAQgYKBGluaXQiNwoMRG9jdW1lbnRJbml0EhMKC2RvY3VtZW50X2lkGAEgASgJEhIKCmNsaWVudF9pZHMYAiADKAkiRgoLQ2hhbm5lbEluaXQSEwoLY2hhbm5lbF9rZXkYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoAxILCgNzZXEYAyABKAMiewoKV2F0Y2hFdmVudBItCglkb2NfZXZlbnQYASABKAsyGC55b3JraWUudjEuRG9jV2F0Y2hFdmVudEgAEjUKDWNoYW5uZWxfZXZlbnQYAiABKAsyHC55b3JraWUudjEuQ2hhbm5lbFdhdGNoRXZlbnRIAEIHCgVldmVudCJICg1Eb2NXYXRjaEV2ZW50EhMKC2RvY3VtZW50X2lkGAEgASgJEiIKBWV2ZW50GAIgASgLMhMueW9ya2llLnYxLkRvY0V2ZW50IlAKEUNoYW5uZWxXYXRjaEV2ZW50EhMKC2NoYW5uZWxfa2V5GAEgASgJEiYKBWV2ZW50GAIgASgLMhcueW9ya2llLnYxLkNoYW5uZWxFdmVudCI+ChRXYXRjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkitgEKFVdhdGNoRG9jdW1lbnRSZXNwb25zZRJJCg5pbml0aWFsaXphdGlvbhgBIAEoCzIvLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVzcG9uc2UuSW5pdGlhbGl6YXRpb25IABIkCgVldmVudBgCIAEoCzITLnlvcmtpZS52MS5Eb2NFdmVudEgAGiQKDkluaXRpYWxpemF0aW9uEhIKCmNsaWVudF9pZHMYASADKAlCBgoEYm9keSI9ChNXYXRjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCSKDAQoUV2F0Y2hDaGFubmVsUmVzcG9uc2USOQoLaW5pdGlhbGl6ZWQYASABKAsyIi55b3JraWUudjEuV2F0Y2hDaGFubmVsSW5pdGlhbGl6ZWRIABIoCgVldmVudBgCIAEoCzIXLnlvcmtpZS52MS5DaGFubmVsRXZlbnRIAEIGCgRib2R5Ij0KF1dhdGNoQ2hhbm5lbEluaXRpYWxpemVkEhUKDXNlc3Npb25fY291bnQYASABKAMSCwoDc2VxGAIgASgDImsKFVJlbW92ZURvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJEChZSZW1vdmVEb2N1bWVudFJlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAEgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sikwEKFlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEQoJcHVzaF9vbmx5GAQgASgIEhIKCmRpc2FibGVfZ2MYBSABKAgiRQoXUHVzaFB1bGxDaGFuZ2VzUmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYASABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJjChVDcmVhdGVSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEg0KBWxhYmVsGAMgASgJEhMKC2Rlc2NyaXB0aW9uGAQgASgJIkYKFkNyZWF0ZVJldmlzaW9uUmVzcG9uc2USLAoIcmV2aXNpb24YASABKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5IlEKEkdldFJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEwoLcmV2aXNpb25faWQYAyABKAkiQwoTR2V0UmV2aXNpb25SZXNwb25zZRIsCghyZXZpc2lvbhgBIAEoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkidQoUTGlzdFJldmlzaW9uc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRIOCgZvZmZzZXQYBCABKAUSEgoKaXNfZm9yd2FyZBgFIAEoCCJGChVMaXN0UmV2aXNpb25zUmVzcG9uc2USLQoJcmV2aXNpb25zGAEgAygLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJVChZSZXN0b3JlUmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRITCgtyZXZpc2lvbl9pZBgEIAEoCSIZChdSZXN0b3JlUmV2aXNpb25SZXNwb25zZSI+ChRBdHRhY2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkiQgoVQXR0YWNoQ2hhbm5lbFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoAyJSChREZXRhY2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCSIuChVEZXRhY2hDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAyLaAQoVUmVmcmVzaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJEhIKCmNsaWVudF9rZXkYBCABKAkSQAoIbWV0YWRhdGEYBSADKAsyLi55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXF1ZXN0Lk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIlYKFlJlZnJlc2hDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAxIRCgljbGllbnRfaWQYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCSIpChJQZWVrQ2hhbm5lbFJlcXVlc3QSEwoLY2hhbm5lbF9rZXkYASABKAkiLAoTUGVla0NoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDIloKEEJyb2FkY2FzdFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEg0KBXRvcGljGAMgASgJEg8KB3BheWxvYWQYBCABKAwiEwoRQnJvYWRjYXN0UmVzcG9uc2UylQwKDVlvcmtpZVNlcnZpY2USVwoOQWN0aXZhdGVDbGllbnQSIC55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXF1ZXN0GiEueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVzcG9uc2UiABJdChBEZWFjdGl2YXRlQ2xpZW50EiIueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXF1ZXN0GiMueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXNwb25zZSIAElcKDkF0dGFjaERvY3VtZW50EiAueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5BdHRhY2hEb2N1bWVudFJlc3BvbnNlIgASVwoORGV0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkRldGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5SZW1vdmVEb2N1bWVudBIgLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuUmVtb3ZlRG9jdW1lbnRSZXNwb25zZSIAEloKD1B1c2hQdWxsQ2hhbmdlcxIhLnlvcmtpZS52MS5QdXNoUHVsbENoYW5nZXNSZXF1ZXN0GiIueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlIgASPgoFV2F0Y2gSFy55b3JraWUudjEuV2F0Y2hSZXF1ZXN0GhgueW9ya2llLnYxLldhdGNoUmVzcG9uc2UiADABElYKDVdhdGNoRG9jdW1lbnQSHy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlcXVlc3QaIC55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlIgAwARJTCgxXYXRjaENoYW5uZWwSHi55b3JraWUudjEuV2F0Y2hDaGFubmVsUmVxdWVzdBofLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXNwb25zZSIAMAESVwoOQ3JlYXRlUmV2aXNpb24SIC55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXF1ZXN0GiEueW9ya2llLnYxLkNyZWF0ZVJldmlzaW9uUmVzcG9uc2UiABJOCgtHZXRSZXZpc2lvbhIdLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlcXVlc3QaHi55b3JraWUudjEuR2V0UmV2aXNpb25SZXNwb25zZSIAElQKDUxpc3RSZXZpc2lvbnMSHy55b3JraWUudjEuTGlzdFJldmlzaW9uc1JlcXVlc3QaIC55b3JraWUudjEuTGlzdFJldmlzaW9uc1Jlc3BvbnNlIgASWgoPUmVzdG9yZVJldmlzaW9uEiEueW9ya2llLnYxLlJlc3RvcmVSZXZpc2lvblJlcXVlc3QaIi55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiABJUCg1BdHRhY2hDaGFubmVsEh8ueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXF1ZXN0GiAueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXNwb25zZSIAElQKDURldGFjaENoYW5uZWwSHy55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVwoOUmVmcmVzaENoYW5uZWwSIC55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXF1ZXN0GiEueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVzcG9uc2UiABJOCgtQZWVrQ2hhbm5lbBIdLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlcXVlc3QaHi55b3JraWUudjEuUGVla0NoYW5uZWxSZXNwb25zZSIAEkgKCUJyb2FkY2FzdBIbLnlvcmtpZS52MS5Ccm9hZGNhc3RSZXF1ZXN0GhwueW9ya2llLnYxLkJyb2FkY2FzdFJlc3BvbnNlIgBCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_yorkie_v1_resources]);
5879
+ const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIpgBChVBdHRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEgoKc2NoZW1hX2tleRgDIAEoCRISCgpkaXNhYmxlX2djGAQgASgIEhgKEGRpc2FibGVfcHJlc2VuY2UYBSABKAgiuQEKFkF0dGFjaERvY3VtZW50UmVzcG9uc2USEwoLZG9jdW1lbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYAyABKAUSJQoMc2NoZW1hX3J1bGVzGAQgAygLMg8ueW9ya2llLnYxLlJ1bGUSGAoQZGlzYWJsZV9wcmVzZW5jZRgFIAEoCCKLAQoVRGV0YWNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrEh4KFnJlbW92ZV9pZl9ub3RfYXR0YWNoZWQYBCABKAgiRAoWRGV0YWNoRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgCIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIlMKDFdhdGNoUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSMAoJcmVzb3VyY2VzGAIgAygLMh0ueW9ya2llLnYxLlJlc291cmNlRGVzY3JpcHRvciKEAQoSUmVzb3VyY2VEZXNjcmlwdG9yEjEKCGRvY3VtZW50GAEgASgLMh0ueW9ya2llLnYxLkRvY3VtZW50RGVzY3JpcHRvckgAEi8KB2NoYW5uZWwYAiABKAsyHC55b3JraWUudjEuQ2hhbm5lbERlc2NyaXB0b3JIAEIKCghyZXNvdXJjZSIpChJEb2N1bWVudERlc2NyaXB0b3ISEwoLZG9jdW1lbnRfaWQYASABKAkiKAoRQ2hhbm5lbERlc2NyaXB0b3ISEwoLY2hhbm5lbF9rZXkYASABKAkieQoNV2F0Y2hSZXNwb25zZRI4Cg5pbml0aWFsaXphdGlvbhgBIAEoCzIeLnlvcmtpZS52MS5XYXRjaEluaXRpYWxpemF0aW9uSAASJgoFZXZlbnQYAiABKAsyFS55b3JraWUudjEuV2F0Y2hFdmVudEgAQgYKBGJvZHkiRgoTV2F0Y2hJbml0aWFsaXphdGlvbhIvCg5yZXNvdXJjZV9pbml0cxgBIAMoCzIXLnlvcmtpZS52MS5SZXNvdXJjZUluaXQieAoMUmVzb3VyY2VJbml0EjAKDWRvY3VtZW50X2luaXQYASABKAsyFy55b3JraWUudjEuRG9jdW1lbnRJbml0SAASLgoMY2hhbm5lbF9pbml0GAIgASgLMhYueW9ya2llLnYxLkNoYW5uZWxJbml0SABCBgoEaW5pdCI3CgxEb2N1bWVudEluaXQSEwoLZG9jdW1lbnRfaWQYASABKAkSEgoKY2xpZW50X2lkcxgCIAMoCSJGCgtDaGFubmVsSW5pdBITCgtjaGFubmVsX2tleRgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDEgsKA3NlcRgDIAEoAyJ7CgpXYXRjaEV2ZW50Ei0KCWRvY19ldmVudBgBIAEoCzIYLnlvcmtpZS52MS5Eb2NXYXRjaEV2ZW50SAASNQoNY2hhbm5lbF9ldmVudBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsV2F0Y2hFdmVudEgAQgcKBWV2ZW50IkgKDURvY1dhdGNoRXZlbnQSEwoLZG9jdW1lbnRfaWQYASABKAkSIgoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnQiUAoRQ2hhbm5lbFdhdGNoRXZlbnQSEwoLY2hhbm5lbF9rZXkYASABKAkSJgoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50Ij4KFFdhdGNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCSK2AQoVV2F0Y2hEb2N1bWVudFJlc3BvbnNlEkkKDmluaXRpYWxpemF0aW9uGAEgASgLMi8ueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXNwb25zZS5Jbml0aWFsaXphdGlvbkgAEiQKBWV2ZW50GAIgASgLMhMueW9ya2llLnYxLkRvY0V2ZW50SAAaJAoOSW5pdGlhbGl6YXRpb24SEgoKY2xpZW50X2lkcxgBIAMoCUIGCgRib2R5Ij0KE1dhdGNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIoMBChRXYXRjaENoYW5uZWxSZXNwb25zZRI5Cgtpbml0aWFsaXplZBgBIAEoCzIiLnlvcmtpZS52MS5XYXRjaENoYW5uZWxJbml0aWFsaXplZEgAEigKBWV2ZW50GAIgASgLMhcueW9ya2llLnYxLkNoYW5uZWxFdmVudEgAQgYKBGJvZHkiPQoXV2F0Y2hDaGFubmVsSW5pdGlhbGl6ZWQSFQoNc2Vzc2lvbl9jb3VudBgBIAEoAxILCgNzZXEYAiABKAMiawoVUmVtb3ZlRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIkQKFlJlbW92ZURvY3VtZW50UmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYASABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayKTAQoWUHVzaFB1bGxDaGFuZ2VzUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIRCglwdXNoX29ubHkYBCABKAgSEgoKZGlzYWJsZV9nYxgFIAEoCCJFChdQdXNoUHVsbENoYW5nZXNSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrImMKFUNyZWF0ZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSDQoFbGFiZWwYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiRgoWQ3JlYXRlUmV2aXNpb25SZXNwb25zZRIsCghyZXZpc2lvbhgBIAEoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiUQoSR2V0UmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRITCgtyZXZpc2lvbl9pZBgDIAEoCSJDChNHZXRSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJ1ChRMaXN0UmV2aXNpb25zUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEQoJcGFnZV9zaXplGAMgASgFEg4KBm9mZnNldBgEIAEoBRISCgppc19mb3J3YXJkGAUgASgIIkYKFUxpc3RSZXZpc2lvbnNSZXNwb25zZRItCglyZXZpc2lvbnMYASADKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5IlUKFlJlc3RvcmVSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAQgASgJIhkKF1Jlc3RvcmVSZXZpc2lvblJlc3BvbnNlIj4KFEF0dGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCSJCChVBdHRhY2hDaGFubmVsUmVzcG9uc2USEgoKc2Vzc2lvbl9pZBgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDIlIKFERldGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIi4KFURldGFjaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDItoBChVSZWZyZXNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkSEgoKY2xpZW50X2tleRgEIAEoCRJACghtZXRhZGF0YRgFIAMoCzIuLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiVgoWUmVmcmVzaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDEhEKCWNsaWVudF9pZBgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIikKElBlZWtDaGFubmVsUmVxdWVzdBITCgtjaGFubmVsX2tleRgBIAEoCSIsChNQZWVrQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMiWgoQQnJvYWRjYXN0UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSDQoFdG9waWMYAyABKAkSDwoHcGF5bG9hZBgEIAEoDCITChFCcm9hZGNhc3RSZXNwb25zZTKVDAoNWW9ya2llU2VydmljZRJXCg5BY3RpdmF0ZUNsaWVudBIgLnlvcmtpZS52MS5BY3RpdmF0ZUNsaWVudFJlcXVlc3QaIS55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXNwb25zZSIAEl0KEERlYWN0aXZhdGVDbGllbnQSIi55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlcXVlc3QaIy55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIgASVwoOQXR0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuQXR0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5EZXRhY2hEb2N1bWVudBIgLnlvcmtpZS52MS5EZXRhY2hEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXNwb25zZSIAElcKDlJlbW92ZURvY3VtZW50EiAueW9ya2llLnYxLlJlbW92ZURvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlc3BvbnNlIgASWgoPUHVzaFB1bGxDaGFuZ2VzEiEueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QaIi55b3JraWUudjEuUHVzaFB1bGxDaGFuZ2VzUmVzcG9uc2UiABI+CgVXYXRjaBIXLnlvcmtpZS52MS5XYXRjaFJlcXVlc3QaGC55b3JraWUudjEuV2F0Y2hSZXNwb25zZSIAMAESVgoNV2F0Y2hEb2N1bWVudBIfLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVxdWVzdBogLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVzcG9uc2UiADABElMKDFdhdGNoQ2hhbm5lbBIeLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXF1ZXN0Gh8ueW9ya2llLnYxLldhdGNoQ2hhbm5lbFJlc3BvbnNlIgAwARJXCg5DcmVhdGVSZXZpc2lvbhIgLnlvcmtpZS52MS5DcmVhdGVSZXZpc2lvblJlcXVlc3QaIS55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXNwb25zZSIAEk4KC0dldFJldmlzaW9uEh0ueW9ya2llLnYxLkdldFJldmlzaW9uUmVxdWVzdBoeLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlc3BvbnNlIgASVAoNTGlzdFJldmlzaW9ucxIfLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVxdWVzdBogLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVzcG9uc2UiABJaCg9SZXN0b3JlUmV2aXNpb24SIS55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVxdWVzdBoiLnlvcmtpZS52MS5SZXN0b3JlUmV2aXNpb25SZXNwb25zZSIAElQKDUF0dGFjaENoYW5uZWwSHy55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVAoNRGV0YWNoQ2hhbm5lbBIfLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVxdWVzdBogLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVzcG9uc2UiABJXCg5SZWZyZXNoQ2hhbm5lbBIgLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QaIS55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXNwb25zZSIAEk4KC1BlZWtDaGFubmVsEh0ueW9ya2llLnYxLlBlZWtDaGFubmVsUmVxdWVzdBoeLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlc3BvbnNlIgASSAoJQnJvYWRjYXN0EhsueW9ya2llLnYxLkJyb2FkY2FzdFJlcXVlc3QaHC55b3JraWUudjEuQnJvYWRjYXN0UmVzcG9uc2UiAEJFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_yorkie_v1_resources]);
5873
5880
  const YorkieService = /* @__PURE__ */ serviceDesc(file_yorkie_v1_yorkie, 0);
5874
5881
  const file_google_rpc_error_details = /* @__PURE__ */ fileDesc("Ch5nb29nbGUvcnBjL2Vycm9yX2RldGFpbHMucHJvdG8SCmdvb2dsZS5ycGMikwEKCUVycm9ySW5mbxIOCgZyZWFzb24YASABKAkSDgoGZG9tYWluGAIgASgJEjUKCG1ldGFkYXRhGAMgAygLMiMuZ29vZ2xlLnJwYy5FcnJvckluZm8uTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiOwoJUmV0cnlJbmZvEi4KC3JldHJ5X2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIjIKCURlYnVnSW5mbxIVCg1zdGFja19lbnRyaWVzGAEgAygJEg4KBmRldGFpbBgCIAEoCSKPAwoMUXVvdGFGYWlsdXJlEjYKCnZpb2xhdGlvbnMYASADKAsyIi5nb29nbGUucnBjLlF1b3RhRmFpbHVyZS5WaW9sYXRpb24axgIKCVZpb2xhdGlvbhIPCgdzdWJqZWN0GAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2FwaV9zZXJ2aWNlGAMgASgJEhQKDHF1b3RhX21ldHJpYxgEIAEoCRIQCghxdW90YV9pZBgFIAEoCRJRChBxdW90YV9kaW1lbnNpb25zGAYgAygLMjcuZ29vZ2xlLnJwYy5RdW90YUZhaWx1cmUuVmlvbGF0aW9uLlF1b3RhRGltZW5zaW9uc0VudHJ5EhMKC3F1b3RhX3ZhbHVlGAcgASgDEh8KEmZ1dHVyZV9xdW90YV92YWx1ZRgIIAEoA0gAiAEBGjYKFFF1b3RhRGltZW5zaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCFQoTX2Z1dHVyZV9xdW90YV92YWx1ZSKVAQoTUHJlY29uZGl0aW9uRmFpbHVyZRI9Cgp2aW9sYXRpb25zGAEgAygLMikuZ29vZ2xlLnJwYy5QcmVjb25kaXRpb25GYWlsdXJlLlZpb2xhdGlvbho/CglWaW9sYXRpb24SDAoEdHlwZRgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIswBCgpCYWRSZXF1ZXN0Ej8KEGZpZWxkX3Zpb2xhdGlvbnMYASADKAsyJS5nb29nbGUucnBjLkJhZFJlcXVlc3QuRmllbGRWaW9sYXRpb24afQoORmllbGRWaW9sYXRpb24SDQoFZmllbGQYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDgoGcmVhc29uGAMgASgJEjcKEWxvY2FsaXplZF9tZXNzYWdlGAQgASgLMhwuZ29vZ2xlLnJwYy5Mb2NhbGl6ZWRNZXNzYWdlIjcKC1JlcXVlc3RJbmZvEhIKCnJlcXVlc3RfaWQYASABKAkSFAoMc2VydmluZ19kYXRhGAIgASgJImAKDFJlc291cmNlSW5mbxIVCg1yZXNvdXJjZV90eXBlGAEgASgJEhUKDXJlc291cmNlX25hbWUYAiABKAkSDQoFb3duZXIYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiVgoESGVscBIkCgVsaW5rcxgBIAMoCzIVLmdvb2dsZS5ycGMuSGVscC5MaW5rGigKBExpbmsSEwoLZGVzY3JpcHRpb24YASABKAkSCwoDdXJsGAIgASgJIjMKEExvY2FsaXplZE1lc3NhZ2USDgoGbG9jYWxlGAEgASgJEg8KB21lc3NhZ2UYAiABKAlCbAoOY29tLmdvb2dsZS5ycGNCEUVycm9yRGV0YWlsc1Byb3RvUAFaP2dvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvcnBjL2VycmRldGFpbHM7ZXJyZGV0YWlsc6ICA1JQQ2IGcHJvdG8z", [file_google_protobuf_duration]);
5875
5882
  const ErrorInfoSchema = /* @__PURE__ */ messageDesc(file_google_rpc_error_details, 0);
@@ -9688,10 +9695,20 @@
9688
9695
  head;
9689
9696
  treeByIndex;
9690
9697
  treeByID;
9698
+ /**
9699
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
9700
+ * already-tombstoned by splitting a removed node. Such pieces inherit
9701
+ * `removedAt` without ever passing through `remove()`, so they would
9702
+ * otherwise never be registered for GC. Callers that split nodes
9703
+ * (`edit`, `CRDTText.setStyle`, `CRDTText.removeStyle`) drain this
9704
+ * buffer into their returned GC pairs.
9705
+ */
9706
+ pendingGCPairs;
9691
9707
  constructor() {
9692
9708
  this.head = RGATreeSplitNode.create(InitialRGATreeSplitNodeID);
9693
9709
  this.treeByIndex = new SplayTree();
9694
9710
  this.treeByID = new LLRBTree(RGATreeSplitNode.createComparator());
9711
+ this.pendingGCPairs = [];
9695
9712
  this.treeByIndex.insert(this.head);
9696
9713
  this.treeByID.put(this.head.getID(), this.head);
9697
9714
  }
@@ -9724,7 +9741,7 @@
9724
9741
  );
9725
9742
  addDataSizes(diff, diffTo, diffFrom);
9726
9743
  const nodesToDelete = this.findBetween(fromRight, toRight);
9727
- const [changes, removedNodes] = this.deleteNodes(
9744
+ const [changes, removedNodes, alreadyRemovedIDs] = this.deleteNodes(
9728
9745
  nodesToDelete,
9729
9746
  editedAt,
9730
9747
  versionVector
@@ -9755,11 +9772,285 @@
9755
9772
  }
9756
9773
  const pairs = [];
9757
9774
  const removedValues = [];
9758
- for (const [, removedNode] of removedNodes) {
9759
- pairs.push({ parent: this, child: removedNode });
9775
+ const removedSpans = [];
9776
+ for (const [id, removedNode] of removedNodes) {
9777
+ if (!alreadyRemovedIDs.has(id)) {
9778
+ pairs.push({ parent: this, child: removedNode });
9779
+ }
9760
9780
  removedValues.push(removedNode.getValue());
9781
+ removedSpans.push({
9782
+ createdAt: removedNode.getCreatedAt(),
9783
+ start: removedNode.getID().getOffset(),
9784
+ end: removedNode.getID().getOffset() + removedNode.getContentLength(),
9785
+ value: removedNode.getValue().substring(0)
9786
+ });
9787
+ }
9788
+ pairs.push(...this.drainPendingGCPairs());
9789
+ return [caretPos, pairs, diff, changes, removedValues, removedSpans];
9790
+ }
9791
+ /**
9792
+ * `restore` re-establishes the characters described by `spans` under
9793
+ * their ORIGINAL identities. For each span, per overlapping region:
9794
+ * - live piece exists → skip (idempotent; another undo restored it)
9795
+ * - tombstoned piece exists → clear removedAt (un-tombstone)
9796
+ * - no piece exists (GC'd) → recreate a node with the original ID
9797
+ *
9798
+ * Returns [untombstonedNodes, recreatedNodes, changes, liveDiff,
9799
+ * pendingGCPairs]. `changes` describes the revived content as insertions
9800
+ * (ascending index) so editor bindings and remote sync can be driven
9801
+ * the same way as a normal edit.
9802
+ *
9803
+ * The caller must, in order: (1) register every pair in `pendingGCPairs`
9804
+ * — these are fragments `splitNode` buffered while isolating a target
9805
+ * range out of a larger tombstoned piece (see `drainPendingGCPairs`);
9806
+ * (2) unregister GC pairs for `untombstonedNodes`. Registering first is
9807
+ * required for `untombstonedNodes` entries whose node was itself one of
9808
+ * those split-born fragments (a target isolated from the interior of a
9809
+ * tombstone) — such a node was never registered under its own id, so
9810
+ * step (1) creates the entry that step (2) then correctly walks from gc
9811
+ * back to live; entries that remain tombstoned (siblings of the
9812
+ * restored target) simply stay registered. Finally, `root.acc(liveDiff)`
9813
+ * accounts the size of any nodes recreated from scratch (the GC'd-away
9814
+ * case), which `splitNode`'s buffering does not cover.
9815
+ */
9816
+ restore(spans, executedAt, fallbackAnchor) {
9817
+ const untombstoned = [];
9818
+ const recreated = [];
9819
+ const liveDiff = { data: 0, meta: 0 };
9820
+ for (const span of spans) {
9821
+ const pieces = this.findPiecesOverlapping(
9822
+ span.createdAt,
9823
+ span.start,
9824
+ span.end
9825
+ );
9826
+ let cursor = span.start;
9827
+ let pieceIdx = 0;
9828
+ while (cursor < span.end) {
9829
+ const piece = pieces[pieceIdx];
9830
+ const pieceStart = piece ? piece.getID().getOffset() : Infinity;
9831
+ const pieceEnd = piece ? pieceStart + piece.getContentLength() : Infinity;
9832
+ if (piece && pieceStart <= cursor) {
9833
+ const overlapEnd = Math.min(pieceEnd, span.end);
9834
+ if (piece.isRemoved()) {
9835
+ const [target] = this.isolateRange(piece, cursor, overlapEnd);
9836
+ target.setRemovedAt(void 0);
9837
+ this.treeByIndex.splayNode(target);
9838
+ untombstoned.push(target);
9839
+ }
9840
+ cursor = overlapEnd;
9841
+ if (overlapEnd >= pieceEnd) {
9842
+ pieceIdx++;
9843
+ }
9844
+ } else {
9845
+ const gapEnd = Math.min(pieceStart, span.end);
9846
+ const value = span.value.substring(
9847
+ cursor - span.start,
9848
+ gapEnd - span.start
9849
+ );
9850
+ const newNode = RGATreeSplitNode.create(
9851
+ RGATreeSplitNodeID.of(span.createdAt, cursor),
9852
+ value
9853
+ );
9854
+ addDataSizes(liveDiff, newNode.getDataSize());
9855
+ const prev = this.findRestoreAnchor(
9856
+ span.createdAt,
9857
+ cursor,
9858
+ gapEnd,
9859
+ executedAt,
9860
+ fallbackAnchor
9861
+ );
9862
+ this.insertAfter(prev, newNode);
9863
+ recreated.push(newNode);
9864
+ cursor = gapEnd;
9865
+ }
9866
+ }
9867
+ }
9868
+ const pendingGCPairs = this.drainPendingGCPairs();
9869
+ const changes = [];
9870
+ for (const node of [...untombstoned, ...recreated]) {
9871
+ const [from] = this.findIndexesFromRange(node.createPosRange());
9872
+ changes.push({
9873
+ actor: executedAt.getActorID(),
9874
+ from,
9875
+ to: from,
9876
+ value: node.getValue()
9877
+ });
9878
+ }
9879
+ changes.sort((a, b) => a.from - b.from);
9880
+ return [untombstoned, recreated, changes, liveDiff, pendingGCPairs];
9881
+ }
9882
+ /**
9883
+ * `retombstone` re-deletes the characters described by `spans` (redo of
9884
+ * an identity-preserving undo). Only live pieces are affected; already
9885
+ * removed or purged regions are skipped (idempotent).
9886
+ *
9887
+ * Returns [pairs, changes, diff]: GCPairs for the newly tombstoned
9888
+ * nodes, the removed regions as deletions so editor bindings and remote
9889
+ * sync can be driven the same way as a normal edit, and the
9890
+ * metadata-size overhead from splitting the (live) pieces to isolate the
9891
+ * target range. The caller must `root.acc(diff)` before registering
9892
+ * `pairs`, mirroring how a normal edit's boundary splits are accounted
9893
+ * before its resulting tombstones are registered. Indices are captured
9894
+ * before each removal, so applying them in emission order stays
9895
+ * consistent.
9896
+ */
9897
+ retombstone(spans, executedAt) {
9898
+ const pairs = [];
9899
+ const changes = [];
9900
+ const diff = { data: 0, meta: 0 };
9901
+ for (const span of spans) {
9902
+ const pieces = this.findPiecesOverlapping(
9903
+ span.createdAt,
9904
+ span.start,
9905
+ span.end
9906
+ );
9907
+ for (const piece of pieces) {
9908
+ if (piece.isRemoved()) {
9909
+ continue;
9910
+ }
9911
+ const pieceStart = piece.getID().getOffset();
9912
+ const pieceEnd = pieceStart + piece.getContentLength();
9913
+ const [target, splitDiff] = this.isolateRange(
9914
+ piece,
9915
+ Math.max(pieceStart, span.start),
9916
+ Math.min(pieceEnd, span.end)
9917
+ );
9918
+ addDataSizes(diff, splitDiff);
9919
+ const [from, to] = this.findIndexesFromRange(target.createPosRange());
9920
+ target.remove(executedAt);
9921
+ this.treeByIndex.splayNode(target);
9922
+ pairs.push({ parent: this, child: target });
9923
+ if (from < to) {
9924
+ changes.push({ actor: executedAt.getActorID(), from, to });
9925
+ }
9926
+ }
9927
+ }
9928
+ pairs.push(...this.drainPendingGCPairs());
9929
+ return [pairs, changes, diff];
9930
+ }
9931
+ /**
9932
+ * `findPiecesOverlapping` collects existing nodes (live or tombstoned)
9933
+ * belonging to the insertion `createdAt` that overlap the absolute-offset
9934
+ * interval [start, end), in ascending offset order. Works by descending
9935
+ * floorEntry probes over treeByID.
9936
+ */
9937
+ findPiecesOverlapping(createdAt, start, end) {
9938
+ const pieces = [];
9939
+ let probe = end - 1;
9940
+ while (probe >= 0) {
9941
+ const key = RGATreeSplitNodeID.of(createdAt, probe);
9942
+ const entry = this.treeByID.floorEntry(key);
9943
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9944
+ break;
9945
+ }
9946
+ const node = entry.value;
9947
+ const nodeStart = node.getID().getOffset();
9948
+ const nodeEnd = nodeStart + node.getContentLength();
9949
+ if (nodeEnd <= start) {
9950
+ break;
9951
+ }
9952
+ if (nodeStart < end && nodeEnd > start) {
9953
+ pieces.push(node);
9954
+ }
9955
+ if (nodeStart <= start) {
9956
+ break;
9957
+ }
9958
+ probe = nodeStart - 1;
9959
+ }
9960
+ return pieces.reverse();
9961
+ }
9962
+ /**
9963
+ * `findPieceCovering` returns the node of insertion `createdAt` whose
9964
+ * absolute-offset range covers `offset`, if present.
9965
+ */
9966
+ findPieceCovering(createdAt, offset) {
9967
+ const key = RGATreeSplitNodeID.of(createdAt, offset);
9968
+ const entry = this.treeByID.floorEntry(key);
9969
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9970
+ return;
9971
+ }
9972
+ const node = entry.value;
9973
+ const nodeStart = node.getID().getOffset();
9974
+ const nodeEnd = nodeStart + node.getContentLength();
9975
+ if (nodeStart <= offset && offset < nodeEnd) {
9976
+ return node;
9977
+ }
9978
+ return;
9979
+ }
9980
+ /**
9981
+ * `findRestoreAnchor` returns the physical node to insert a recreated
9982
+ * fragment [gapStart, gapEnd) of insertion `createdAt` AFTER.
9983
+ *
9984
+ * Resolution ladder (all rules key on op-carried data + ID lookups only):
9985
+ * (a) a piece covering gapEnd exists → directly before it
9986
+ * (originally-adjacent successor; exact original slot)
9987
+ * (b) nearest surviving piece of the same insertion left of gapStart
9988
+ * → directly after it
9989
+ * (c) rightmost surviving piece of the same insertion (must be right
9990
+ * of the gap) → directly before it
9991
+ * (d) the operation's fallback anchor (refined) — same exposure as the
9992
+ * current implementation's fromPos; see design-doc caveat
9993
+ * (e) head (deterministic last resort)
9994
+ */
9995
+ findRestoreAnchor(createdAt, gapStart, gapEnd, executedAt, fallbackAnchor) {
9996
+ const succ = this.findPieceCovering(createdAt, gapEnd);
9997
+ if (succ) {
9998
+ return succ.getPrev();
9999
+ }
10000
+ if (gapStart > 0) {
10001
+ const key = RGATreeSplitNodeID.of(createdAt, gapStart - 1);
10002
+ const entry = this.treeByID.floorEntry(key);
10003
+ if (entry && entry.key.hasSameCreatedAt(key)) {
10004
+ return entry.value;
10005
+ }
10006
+ }
10007
+ const rightmostKey = RGATreeSplitNodeID.of(
10008
+ createdAt,
10009
+ Number.MAX_SAFE_INTEGER
10010
+ );
10011
+ const rightmost = this.treeByID.floorEntry(rightmostKey);
10012
+ if (rightmost && rightmost.key.hasSameCreatedAt(rightmostKey) && rightmost.value.getID().getOffset() >= gapEnd) {
10013
+ return rightmost.value.getPrev();
10014
+ }
10015
+ if (fallbackAnchor) {
10016
+ try {
10017
+ const refined = this.refinePos(fallbackAnchor);
10018
+ const [left] = this.findNodeWithSplit(refined, executedAt);
10019
+ return left;
10020
+ } catch {
10021
+ }
9761
10022
  }
9762
- return [caretPos, pairs, diff, changes, removedValues];
10023
+ return this.head;
10024
+ }
10025
+ /**
10026
+ * `isolateRange` splits `piece` so that a node exactly covering the
10027
+ * absolute-offset interval [from, to) exists, and returns it along with
10028
+ * the net metadata-size overhead the split(s) introduced.
10029
+ *
10030
+ * When `piece` is live, this overhead is a normal live-bucket cost (same
10031
+ * as any other boundary split) and the caller should `root.acc` it.
10032
+ * When `piece` is tombstoned, `splitNode` itself buffers the overhead of
10033
+ * any born-removed fragment via `pendingGCPairs` (see `drainPendingGCPairs`),
10034
+ * so the returned diff is zero in that case — the caller must still
10035
+ * drain and register those pairs.
10036
+ *
10037
+ * Requires: pieceStart <= from < to <= pieceEnd.
10038
+ */
10039
+ isolateRange(piece, from, to) {
10040
+ const diff = { data: 0, meta: 0 };
10041
+ let node = piece;
10042
+ const nodeStart = node.getID().getOffset();
10043
+ if (from > nodeStart) {
10044
+ const [right, splitDiff] = this.splitNode(node, from - nodeStart);
10045
+ addDataSizes(diff, splitDiff);
10046
+ node = right;
10047
+ }
10048
+ const newStart = node.getID().getOffset();
10049
+ if (to < newStart + node.getContentLength()) {
10050
+ const [, splitDiff] = this.splitNode(node, to - newStart);
10051
+ addDataSizes(diff, splitDiff);
10052
+ }
10053
+ return [node, diff];
9763
10054
  }
9764
10055
  /**
9765
10056
  * `indexToPos` finds RGATreeSplitPos of given offset.
@@ -10029,11 +10320,28 @@
10029
10320
  splitNode.setInsPrev(node);
10030
10321
  addDataSizes(diff, node.getDataSize(), splitNode.getDataSize());
10031
10322
  subDataSize(diff, prvSize);
10323
+ if (splitNode.isRemoved()) {
10324
+ this.pendingGCPairs.push({
10325
+ parent: this,
10326
+ child: splitNode,
10327
+ gcOnlySize: diff
10328
+ });
10329
+ return [splitNode, { data: 0, meta: 0 }];
10330
+ }
10032
10331
  return [splitNode, diff];
10033
10332
  }
10333
+ /**
10334
+ * `drainPendingGCPairs` returns the GC pairs buffered for born-tombstoned
10335
+ * split pieces and clears the buffer.
10336
+ */
10337
+ drainPendingGCPairs() {
10338
+ const pairs = this.pendingGCPairs;
10339
+ this.pendingGCPairs = [];
10340
+ return pairs;
10341
+ }
10034
10342
  deleteNodes(candidates, editedAt, vector) {
10035
10343
  if (!candidates.length) {
10036
- return [[], /* @__PURE__ */ new Map()];
10344
+ return [[], /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()];
10037
10345
  }
10038
10346
  const isLocal = vector === void 0 || vector.size() === 0;
10039
10347
  const nodesToRemove = [];
@@ -10068,12 +10376,17 @@
10068
10376
  nodesToKeep.push(rightEdge);
10069
10377
  const changes = this.makeChanges(nodesToKeep, editedAt);
10070
10378
  const removedNodes = /* @__PURE__ */ new Map();
10379
+ const alreadyRemovedIDs = /* @__PURE__ */ new Set();
10071
10380
  for (const node of nodesToRemove) {
10072
- removedNodes.set(node.getID().toIDString(), node);
10381
+ const id = node.getID().toIDString();
10382
+ if (node.isRemoved()) {
10383
+ alreadyRemovedIDs.add(id);
10384
+ }
10385
+ removedNodes.set(id, node);
10073
10386
  node.remove(editedAt);
10074
10387
  }
10075
10388
  this.deleteIndexNodes(nodesToKeep);
10076
- return [changes, removedNodes];
10389
+ return [changes, removedNodes, alreadyRemovedIDs];
10077
10390
  }
10078
10391
  /**
10079
10392
  * `findEdgesOfCandidates` finds the edges outside `candidates`,
@@ -10545,7 +10858,7 @@
10545
10858
  crdtTextValue.setAttr(k, v, editedAt);
10546
10859
  }
10547
10860
  }
10548
- const [caretPos, pairs, diff, valueChanges, removedValues] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10861
+ const [caretPos, pairs, diff, valueChanges, removedValues, removedSpans] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10549
10862
  const changes = valueChanges.map((change) => ({
10550
10863
  ...change,
10551
10864
  value: change.value ? {
@@ -10558,7 +10871,56 @@
10558
10871
  type: "content"
10559
10872
  /* Content */
10560
10873
  }));
10561
- return [changes, pairs, diff, [caretPos, caretPos], removedValues];
10874
+ return [
10875
+ changes,
10876
+ pairs,
10877
+ diff,
10878
+ [caretPos, caretPos],
10879
+ removedValues,
10880
+ removedSpans
10881
+ ];
10882
+ }
10883
+ /**
10884
+ * `restore` re-establishes removed characters under their original
10885
+ * identities (identity-preserving undo of a deletion).
10886
+ */
10887
+ restore(spans, executedAt, fallbackAnchor) {
10888
+ const [untombstoned, recreated, valueChanges, liveDiff, pendingGCPairs] = this.rgaTreeSplit.restore(spans, executedAt, fallbackAnchor);
10889
+ return [
10890
+ untombstoned,
10891
+ recreated,
10892
+ this.toTextChanges(valueChanges),
10893
+ liveDiff,
10894
+ pendingGCPairs
10895
+ ];
10896
+ }
10897
+ /**
10898
+ * `retombstone` re-deletes previously restored characters (redo).
10899
+ */
10900
+ retombstone(spans, executedAt) {
10901
+ const [pairs, valueChanges, diff] = this.rgaTreeSplit.retombstone(
10902
+ spans,
10903
+ executedAt
10904
+ );
10905
+ return [pairs, this.toTextChanges(valueChanges), diff];
10906
+ }
10907
+ /**
10908
+ * `toTextChanges` wraps raw RGATreeSplit value changes into `TextChange`s,
10909
+ * mirroring the mapping used by `edit`.
10910
+ */
10911
+ toTextChanges(valueChanges) {
10912
+ return valueChanges.map((change) => ({
10913
+ ...change,
10914
+ value: change.value ? {
10915
+ attributes: parseObjectValues(change.value.getAttributes()),
10916
+ content: change.value.getContent()
10917
+ } : {
10918
+ attributes: void 0,
10919
+ content: ""
10920
+ },
10921
+ type: "content"
10922
+ /* Content */
10923
+ }));
10562
10924
  }
10563
10925
  /**
10564
10926
  * `setStyle` applies the style of the given range.
@@ -10635,6 +10997,7 @@
10635
10997
  }
10636
10998
  }
10637
10999
  }
11000
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10638
11001
  return [pairs, diff, changes, prevAttributes, attributesToRemove];
10639
11002
  }
10640
11003
  /**
@@ -10705,6 +11068,7 @@
10705
11068
  }
10706
11069
  }
10707
11070
  }
11071
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10708
11072
  return [pairs, diff, changes, prevAttributes];
10709
11073
  }
10710
11074
  /**
@@ -10859,10 +11223,16 @@
10859
11223
  const pairs = [];
10860
11224
  for (const node of this.rgaTreeSplit) {
10861
11225
  if (node.getRemovedAt()) {
10862
- pairs.push({ parent: this.rgaTreeSplit, child: node });
11226
+ pairs.push({
11227
+ parent: this.rgaTreeSplit,
11228
+ child: node,
11229
+ gcOnlySize: node.getDataSize()
11230
+ });
10863
11231
  }
10864
11232
  for (const p of node.getValue().getGCPairs()) {
10865
- pairs.push(p);
11233
+ pairs.push(
11234
+ node.getRemovedAt() ? { ...p, gcOnlySize: p.child.getDataSize() } : p
11235
+ );
10866
11236
  }
10867
11237
  }
10868
11238
  return pairs;
@@ -10874,18 +11244,33 @@
10874
11244
  content;
10875
11245
  attributes;
10876
11246
  isUndoOp;
10877
- constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11247
+ restoreSpans;
11248
+ restoreMode;
11249
+ // `retombstoneSpans` is the companion span set for an identity-preserving
11250
+ // reverse op. `restoreSpans` describes content the reversed edit removed;
11251
+ // `retombstoneSpans` describes content the reversed edit inserted (non-empty
11252
+ // only for the reverse of a replace). `restoreMode` picks the direction:
11253
+ // 'restore' revives restoreSpans and re-removes retombstoneSpans; a
11254
+ // 'retombstone' op (the redo) does the opposite. Reversing an edit that both
11255
+ // inserts and deletes as two identity operations — rather than
11256
+ // copy-reinserting the deleted text as a fresh node — keeps a later revived
11257
+ // neighbour in its original relative order.
11258
+ retombstoneSpans;
11259
+ constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10878
11260
  super(parentCreatedAt, executedAt);
10879
11261
  this.fromPos = fromPos;
10880
11262
  this.toPos = toPos;
10881
11263
  this.content = content;
10882
11264
  this.attributes = attributes;
10883
11265
  this.isUndoOp = isUndoOp;
11266
+ this.restoreSpans = restoreSpans;
11267
+ this.restoreMode = restoreMode;
11268
+ this.retombstoneSpans = retombstoneSpans;
10884
11269
  }
10885
11270
  /**
10886
11271
  * `create` creates a new instance of EditOperation.
10887
11272
  */
10888
- static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11273
+ static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10889
11274
  return new EditOperation(
10890
11275
  parentCreatedAt,
10891
11276
  fromPos,
@@ -10893,7 +11278,10 @@
10893
11278
  content,
10894
11279
  attributes,
10895
11280
  executedAt,
10896
- isUndoOp
11281
+ isUndoOp,
11282
+ restoreSpans,
11283
+ restoreMode,
11284
+ retombstoneSpans
10897
11285
  );
10898
11286
  }
10899
11287
  /**
@@ -10914,11 +11302,71 @@
10914
11302
  );
10915
11303
  }
10916
11304
  const text = parentObject;
11305
+ if (this.restoreSpans || this.retombstoneSpans) {
11306
+ const isRetombstone = this.restoreMode === "retombstone";
11307
+ const toRestore = (isRetombstone ? this.retombstoneSpans : this.restoreSpans) ?? [];
11308
+ const toRetombstone = (isRetombstone ? this.restoreSpans : this.retombstoneSpans) ?? [];
11309
+ const opInfos = [];
11310
+ const totalDiff = { data: 0, meta: 0 };
11311
+ const toOpInfo = (c) => ({
11312
+ type: "edit",
11313
+ from: c.from,
11314
+ to: c.to,
11315
+ value: c.value,
11316
+ path: root.createPath(this.getParentCreatedAt())
11317
+ });
11318
+ if (toRetombstone.length) {
11319
+ const [pairs2, changes2, diff2] = text.retombstone(
11320
+ toRetombstone,
11321
+ this.getExecutedAt()
11322
+ );
11323
+ addDataSizes(totalDiff, diff2);
11324
+ for (const pair of pairs2) {
11325
+ root.registerGCPair(pair);
11326
+ }
11327
+ for (const c of changes2) {
11328
+ opInfos.push(toOpInfo(c));
11329
+ }
11330
+ }
11331
+ if (toRestore.length) {
11332
+ const [untombstoned, , changes2, liveDiff, pendingGCPairs] = text.restore(toRestore, this.getExecutedAt(), this.fromPos);
11333
+ for (const pair of pendingGCPairs) {
11334
+ root.registerGCPair(pair);
11335
+ }
11336
+ for (const node of untombstoned) {
11337
+ root.unregisterGCPair({
11338
+ parent: text.getRGATreeSplit(),
11339
+ child: node
11340
+ });
11341
+ }
11342
+ addDataSizes(totalDiff, liveDiff);
11343
+ for (const c of changes2) {
11344
+ opInfos.push(toOpInfo(c));
11345
+ }
11346
+ }
11347
+ root.acc(totalDiff);
11348
+ return {
11349
+ opInfos,
11350
+ // Reverse keeps the same span sets and flips the direction.
11351
+ reverseOp: EditOperation.create(
11352
+ this.getParentCreatedAt(),
11353
+ this.fromPos,
11354
+ this.toPos,
11355
+ "",
11356
+ /* @__PURE__ */ new Map(),
11357
+ void 0,
11358
+ true,
11359
+ this.restoreSpans,
11360
+ isRetombstone ? "restore" : "retombstone",
11361
+ this.retombstoneSpans
11362
+ )
11363
+ };
11364
+ }
10917
11365
  if (this.isUndoOp) {
10918
11366
  this.fromPos = text.refinePos(this.fromPos);
10919
11367
  this.toPos = text.refinePos(this.toPos);
10920
11368
  }
10921
- const [changes, pairs, diff, , removedValues] = text.edit(
11369
+ const [changes, pairs, diff, , removedValues, removedSpans] = text.edit(
10922
11370
  [this.fromPos, this.toPos],
10923
11371
  this.content,
10924
11372
  this.getExecutedAt(),
@@ -10927,7 +11375,8 @@
10927
11375
  );
10928
11376
  const reverseOp = this.toReverseOperation(
10929
11377
  removedValues,
10930
- text.normalizePos(this.fromPos)
11378
+ text.normalizePos(this.fromPos),
11379
+ removedSpans
10931
11380
  );
10932
11381
  root.acc(diff);
10933
11382
  for (const pair of pairs) {
@@ -10946,7 +11395,33 @@
10946
11395
  reverseOp
10947
11396
  };
10948
11397
  }
10949
- toReverseOperation(removedValues, fromPos) {
11398
+ toReverseOperation(removedValues, fromPos, removedSpans) {
11399
+ if (removedSpans.length || this.content?.length) {
11400
+ let insertedSpans;
11401
+ if (this.content?.length) {
11402
+ const value = CRDTTextValue.create(this.content);
11403
+ insertedSpans = [
11404
+ {
11405
+ createdAt: this.getExecutedAt(),
11406
+ start: 0,
11407
+ end: value.length,
11408
+ value
11409
+ }
11410
+ ];
11411
+ }
11412
+ return EditOperation.create(
11413
+ this.getParentCreatedAt(),
11414
+ fromPos,
11415
+ fromPos,
11416
+ "",
11417
+ /* @__PURE__ */ new Map(),
11418
+ void 0,
11419
+ true,
11420
+ removedSpans.length ? removedSpans : void 0,
11421
+ "restore",
11422
+ insertedSpans
11423
+ );
11424
+ }
10950
11425
  const content = removedValues?.length ? removedValues.map((v) => v.getContent()).join("") : "";
10951
11426
  let attrs;
10952
11427
  if (removedValues.length === 1) {
@@ -11084,6 +11559,26 @@
11084
11559
  getAttributes() {
11085
11560
  return this.attributes || /* @__PURE__ */ new Map();
11086
11561
  }
11562
+ /**
11563
+ * `getRestoreSpans` returns the identity-preserving restore payload, if
11564
+ * this is a restore/retombstone operation.
11565
+ */
11566
+ getRestoreSpans() {
11567
+ return this.restoreSpans;
11568
+ }
11569
+ /**
11570
+ * `getRestoreMode` returns the identity-preserving mode of this Edit.
11571
+ */
11572
+ getRestoreMode() {
11573
+ return this.restoreMode;
11574
+ }
11575
+ /**
11576
+ * `getRetombstoneSpans` returns the companion span set (content the reversed
11577
+ * edit inserted) for an identity-preserving reverse op, if any.
11578
+ */
11579
+ getRetombstoneSpans() {
11580
+ return this.retombstoneSpans;
11581
+ }
11087
11582
  }
11088
11583
  class StyleOperation extends Operation {
11089
11584
  fromPos;
@@ -12384,6 +12879,10 @@
12384
12879
  }
12385
12880
  this.insNextID = split.id;
12386
12881
  tree.registerNode(split);
12882
+ if (split.removedAt) {
12883
+ tree.registerPendingGCPair(split, diff);
12884
+ return [split, { data: 0, meta: 0 }];
12885
+ }
12387
12886
  }
12388
12887
  return [split, diff];
12389
12888
  }
@@ -12481,7 +12980,11 @@
12481
12980
  }
12482
12981
  for (const node of this.attrs) {
12483
12982
  if (node.getRemovedAt()) {
12484
- pairs.push({ parent: this, child: node });
12983
+ pairs.push({
12984
+ parent: this,
12985
+ child: node,
12986
+ gcOnlySize: node.getDataSize()
12987
+ });
12485
12988
  }
12486
12989
  }
12487
12990
  return pairs;
@@ -12548,10 +13051,19 @@
12548
13051
  class CRDTTree extends CRDTElement {
12549
13052
  indexTree;
12550
13053
  nodeMapByID;
13054
+ /**
13055
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
13056
+ * already-tombstoned by splitting a removed node. Such pieces inherit
13057
+ * `removedAt` without ever passing through `remove()`, so they would
13058
+ * otherwise never be registered for GC. `edit` and `style` drain this
13059
+ * buffer into their returned GC pairs.
13060
+ */
13061
+ pendingGCPairs;
12551
13062
  constructor(root, createdAt) {
12552
13063
  super(createdAt);
12553
13064
  this.indexTree = new IndexTree(root);
12554
13065
  this.nodeMapByID = new LLRBTree(CRDTTreeNodeID.createComparator());
13066
+ this.pendingGCPairs = [];
12555
13067
  this.indexTree.traverseAll((node) => {
12556
13068
  this.nodeMapByID.put(node.id, node);
12557
13069
  });
@@ -12653,6 +13165,25 @@
12653
13165
  registerNode(node) {
12654
13166
  this.nodeMapByID.put(node.id, node);
12655
13167
  }
13168
+ /**
13169
+ * `registerPendingGCPair` buffers a GC pair for a node that was born
13170
+ * tombstoned (split off an already-removed node). The pair is picked up
13171
+ * by the next `edit` or `style` call via `drainPendingGCPairs`. `size`
13172
+ * is the net-new size created by the split; it is accounted to
13173
+ * docSize.gc at registration since the node was never live.
13174
+ */
13175
+ registerPendingGCPair(node, size) {
13176
+ this.pendingGCPairs.push({ parent: this, child: node, gcOnlySize: size });
13177
+ }
13178
+ /**
13179
+ * `drainPendingGCPairs` returns the buffered GC pairs and clears the
13180
+ * buffer.
13181
+ */
13182
+ drainPendingGCPairs() {
13183
+ const pairs = this.pendingGCPairs;
13184
+ this.pendingGCPairs = [];
13185
+ return pairs;
13186
+ }
12656
13187
  /**
12657
13188
  * `findNodesAndSplitText` finds `TreePos` of the given `CRDTTreeNodeID` and
12658
13189
  * splits nodes if the position is in the middle of a text node.
@@ -12839,6 +13370,7 @@
12839
13370
  }
12840
13371
  }
12841
13372
  );
13373
+ pairs.push(...this.drainPendingGCPairs());
12842
13374
  return [pairs, changes, diff, prevAttributes, newAttrKeys];
12843
13375
  }
12844
13376
  /**
@@ -12942,6 +13474,7 @@
12942
13474
  }
12943
13475
  }
12944
13476
  );
13477
+ pairs.push(...this.drainPendingGCPairs());
12945
13478
  return [pairs, changes, diff, prevAttributes];
12946
13479
  }
12947
13480
  /**
@@ -13105,6 +13638,9 @@
13105
13638
  parent = left.parent;
13106
13639
  }
13107
13640
  }
13641
+ if (!parent.parent) {
13642
+ break;
13643
+ }
13108
13644
  parent.split(
13109
13645
  this,
13110
13646
  left !== parent ? parent.findOffset(left, true) + 1 : 0,
@@ -13164,6 +13700,7 @@
13164
13700
  }
13165
13701
  }
13166
13702
  }
13703
+ pairs.push(...this.drainPendingGCPairs());
13167
13704
  return [
13168
13705
  changes,
13169
13706
  pairs,
@@ -13228,9 +13765,13 @@
13228
13765
  */
13229
13766
  getGCPairs() {
13230
13767
  const pairs = [];
13231
- this.indexTree.traverse((node) => {
13768
+ this.indexTree.traverseAll((node) => {
13232
13769
  if (node.getRemovedAt()) {
13233
- pairs.push({ parent: this, child: node });
13770
+ pairs.push({
13771
+ parent: this,
13772
+ child: node,
13773
+ gcOnlySize: node.getDataSize()
13774
+ });
13234
13775
  }
13235
13776
  for (const p of node.getGCPairs()) {
13236
13777
  pairs.push(p);
@@ -15679,6 +16220,25 @@
15679
16220
  pbAttributes[key] = value;
15680
16221
  }
15681
16222
  pbEditOperation.executedAt = toTimeTicket(editOperation.getExecutedAt());
16223
+ const toPbSpan = (span) => {
16224
+ const pbSpan = create(RestoreSpanSchema);
16225
+ pbSpan.createdAt = toTimeTicket(span.createdAt);
16226
+ pbSpan.start = span.start;
16227
+ pbSpan.end = span.end;
16228
+ pbSpan.content = span.value.getContent();
16229
+ const pbSpanAttrs = pbSpan.attributes;
16230
+ for (const [key, value] of Object.entries(span.value.getAttributes())) {
16231
+ pbSpanAttrs[key] = value;
16232
+ }
16233
+ return pbSpan;
16234
+ };
16235
+ const restoreSpans = editOperation.getRestoreSpans();
16236
+ const retombstoneSpans = editOperation.getRetombstoneSpans();
16237
+ if (restoreSpans && restoreSpans.length || retombstoneSpans && retombstoneSpans.length) {
16238
+ pbEditOperation.restoreSpans = (restoreSpans ?? []).map(toPbSpan);
16239
+ pbEditOperation.retombstoneSpans = (retombstoneSpans ?? []).map(toPbSpan);
16240
+ pbEditOperation.restoreMode = editOperation.getRestoreMode() === "retombstone" ? RestoreMode.RETOMBSTONE : RestoreMode.RESTORE;
16241
+ }
15682
16242
  pbOperation.body.case = "edit";
15683
16243
  pbOperation.body.value = pbEditOperation;
15684
16244
  } else if (operation instanceof StyleOperation) {
@@ -16338,13 +16898,38 @@
16338
16898
  Object.entries(pbEditOperation.attributes).forEach(([key, value]) => {
16339
16899
  attributes.set(key, value);
16340
16900
  });
16901
+ const executedAt = fromTimeTicket(pbEditOperation.executedAt);
16902
+ const fromPbSpan = (pbSpan) => {
16903
+ const value = CRDTTextValue.create(pbSpan.content);
16904
+ for (const [key, attr] of Object.entries(pbSpan.attributes)) {
16905
+ value.setAttr(key, attr, executedAt);
16906
+ }
16907
+ return {
16908
+ createdAt: fromTimeTicket(pbSpan.createdAt),
16909
+ start: pbSpan.start,
16910
+ end: pbSpan.end,
16911
+ value
16912
+ };
16913
+ };
16914
+ let restoreSpans;
16915
+ let retombstoneSpans;
16916
+ let restoreMode;
16917
+ if (pbEditOperation.restoreSpans.length || pbEditOperation.retombstoneSpans.length) {
16918
+ restoreSpans = pbEditOperation.restoreSpans.map(fromPbSpan);
16919
+ retombstoneSpans = pbEditOperation.retombstoneSpans.map(fromPbSpan);
16920
+ restoreMode = pbEditOperation.restoreMode === RestoreMode.RETOMBSTONE ? "retombstone" : "restore";
16921
+ }
16341
16922
  return EditOperation.create(
16342
16923
  fromTimeTicket(pbEditOperation.parentCreatedAt),
16343
16924
  fromTextNodePos(pbEditOperation.from),
16344
16925
  fromTextNodePos(pbEditOperation.to),
16345
16926
  pbEditOperation.content,
16346
16927
  attributes,
16347
- fromTimeTicket(pbEditOperation.executedAt)
16928
+ executedAt,
16929
+ restoreMode ? true : void 0,
16930
+ restoreSpans,
16931
+ restoreMode,
16932
+ retombstoneSpans
16348
16933
  );
16349
16934
  } else if (pbOperation.body.case === "style") {
16350
16935
  const pbStyleOperation = pbOperation.body.value;
@@ -17027,6 +17612,25 @@
17027
17612
  setPresenceChange(presenceChange) {
17028
17613
  this.presenceChange = presenceChange;
17029
17614
  }
17615
+ /**
17616
+ * `hasPresenceChange` returns whether a presence change was registered
17617
+ * during this context. Used by `Document.update` to detect a presence
17618
+ * emit when the document was attached with `disablePresence: true`.
17619
+ */
17620
+ hasPresenceChange() {
17621
+ return this.presenceChange !== void 0;
17622
+ }
17623
+ /**
17624
+ * `dropPresenceChange` clears any presence change registered during
17625
+ * this context. Used by `Document.update` to silently drop presence
17626
+ * emits on documents attached with `disablePresence: true`. After
17627
+ * dropping, the change carries only its operations (if any); when
17628
+ * the context was presence-only the resulting `hasChange()` returns
17629
+ * false and no `Change` is enqueued.
17630
+ */
17631
+ dropPresenceChange() {
17632
+ this.presenceChange = void 0;
17633
+ }
17030
17634
  /**
17031
17635
  * `setReversePresence` registers the previous presence to undo presence updates.
17032
17636
  */
@@ -17050,6 +17654,16 @@
17050
17654
  }
17051
17655
  return reversePresence;
17052
17656
  }
17657
+ /**
17658
+ * `clearReversePresence` discards any reverse-presence keys recorded
17659
+ * during this context. Used by `Document.update` alongside
17660
+ * `dropPresenceChange` for documents attached with
17661
+ * `disablePresence: true`, so the dropped presence emit does not push
17662
+ * a no-op undo entry onto the history stack.
17663
+ */
17664
+ clearReversePresence() {
17665
+ this.reversePresenceKeys.clear();
17666
+ }
17053
17667
  /**
17054
17668
  * `issueTimeTicket` creates a time ticket to be used to create a new operation.
17055
17669
  */
@@ -18951,7 +19565,9 @@
18951
19565
  CRDTTreePos.fromStruct(range[0]),
18952
19566
  CRDTTreePos.fromStruct(range[1])
18953
19567
  ];
18954
- return this.tree.posRangeToIndexRange(posRange);
19568
+ const indexRange = this.tree.posRangeToIndexRange(posRange);
19569
+ this.registerPendingGCPairs();
19570
+ return indexRange;
18955
19571
  }
18956
19572
  /**
18957
19573
  * `posRangeToPathRange` converts the position range into the path range.
@@ -18967,7 +19583,23 @@
18967
19583
  CRDTTreePos.fromStruct(range[0]),
18968
19584
  CRDTTreePos.fromStruct(range[1])
18969
19585
  ];
18970
- return this.tree.posRangeToPathRange(posRange);
19586
+ const pathRange = this.tree.posRangeToPathRange(posRange);
19587
+ this.registerPendingGCPairs();
19588
+ return pathRange;
19589
+ }
19590
+ /**
19591
+ * `registerPendingGCPairs` registers with the root any GC pairs the tree
19592
+ * buffered while resolving a position. `posRangeToIndexRange` and
19593
+ * `posRangeToPathRange` split text nodes to locate a position; when the
19594
+ * position lands inside a tombstoned node the split produces a
19595
+ * born-removed piece. Unlike edit/style/removeStyle, these read-path
19596
+ * conversions emit no operation, so the buffered pairs would otherwise
19597
+ * never reach the root and the piece would leak (invisible to GC).
19598
+ */
19599
+ registerPendingGCPairs() {
19600
+ for (const pair of this.tree.drainPendingGCPairs()) {
19601
+ this.context.registerGCPair(pair);
19602
+ }
18971
19603
  }
18972
19604
  }
18973
19605
  function createJSON(context, target) {
@@ -19210,6 +19842,10 @@
19210
19842
  return;
19211
19843
  }
19212
19844
  this.gcPairMap.set(pair.child.toIDString(), pair);
19845
+ if (pair.gcOnlySize) {
19846
+ addDataSizes(this.docSize.gc, pair.gcOnlySize);
19847
+ return;
19848
+ }
19213
19849
  const size = this.gcPairMap.get(pair.child.toIDString()).child.getDataSize();
19214
19850
  addDataSizes(this.docSize.gc, size);
19215
19851
  subDataSize(this.docSize.live, size);
@@ -19217,6 +19853,28 @@
19217
19853
  this.docSize.live.meta += TimeTicketSize;
19218
19854
  }
19219
19855
  }
19856
+ /**
19857
+ * `unregisterGCPair` removes the given pair from the hash table. Called
19858
+ * when a tombstoned node is revived (un-tombstoned) by an
19859
+ * identity-preserving undo, so that a later re-registration (redo) is
19860
+ * not swallowed by the toggle in `registerGCPair`.
19861
+ *
19862
+ * NOTE: must be called AFTER the node's removedAt has been cleared, so
19863
+ * `getDataSize()` no longer includes the tombstone ticket.
19864
+ */
19865
+ unregisterGCPair(pair) {
19866
+ const registered = this.gcPairMap.get(pair.child.toIDString());
19867
+ if (!registered) {
19868
+ return;
19869
+ }
19870
+ this.gcPairMap.delete(pair.child.toIDString());
19871
+ const size = pair.child.getDataSize();
19872
+ subDataSize(this.docSize.gc, size);
19873
+ addDataSizes(this.docSize.live, size);
19874
+ if (!(pair.child instanceof RHTNode)) {
19875
+ this.docSize.gc.meta -= TimeTicketSize;
19876
+ }
19877
+ }
19220
19878
  /**
19221
19879
  * `getElementMapSize` returns the size of element map.
19222
19880
  */
@@ -19279,6 +19937,10 @@
19279
19937
  }
19280
19938
  for (const [, pair] of this.gcPairMap) {
19281
19939
  const removedAt = pair.child.getRemovedAt();
19940
+ if (!removedAt) {
19941
+ this.unregisterGCPair(pair);
19942
+ continue;
19943
+ }
19282
19944
  if (removedAt && minSyncedVersionVector?.afterOrEqual(removedAt)) {
19283
19945
  pair.parent.purge(pair.child);
19284
19946
  subDataSize(this.docSize.gc, pair.child.getDataSize());
@@ -20101,6 +20763,17 @@
20101
20763
  // remote actors' version vectors into changeID, keeping each subsequent
20102
20764
  // local Change's VV at O(1) for high-fan-out Counter workloads.
20103
20765
  disableGC;
20766
+ // `disablePresence`, when true, declares that this document does not use
20767
+ // presence. The client sets it from the local option on construction and
20768
+ // overwrites it from the server-fixated value in the attach response. While
20769
+ // true, `Document.update`'s `presence.set` calls are silently dropped on
20770
+ // the way out (server enforcement is authoritative for the wire side).
20771
+ disablePresence;
20772
+ // `presenceDropWarned` ensures the silent-drop warning emitted by
20773
+ // `Document.update` for opt-in documents fires only once per document
20774
+ // lifetime. Otherwise long-lived counter-only documents would spam the
20775
+ // console on every well-meaning `presence.set` call.
20776
+ presenceDropWarned;
20104
20777
  /**
20105
20778
  * `history` is exposed to the user to manage undo/redo operations.
20106
20779
  */
@@ -20115,6 +20788,8 @@
20115
20788
  this.checkpoint = InitialCheckpoint;
20116
20789
  this.localChanges = [];
20117
20790
  this.disableGC = false;
20791
+ this.disablePresence = !!opts?.disablePresence;
20792
+ this.presenceDropWarned = false;
20118
20793
  this.root = CRDTRoot.create();
20119
20794
  this.presences = /* @__PURE__ */ new Map();
20120
20795
  this.onlineClients = /* @__PURE__ */ new Set();
@@ -20162,6 +20837,16 @@
20162
20837
  } finally {
20163
20838
  this.isUpdating = false;
20164
20839
  }
20840
+ if (this.disablePresence && ctx.hasPresenceChange()) {
20841
+ ctx.dropPresenceChange();
20842
+ ctx.clearReversePresence();
20843
+ if (!this.presenceDropWarned) {
20844
+ this.presenceDropWarned = true;
20845
+ logger.warn(
20846
+ `[Document] "${this.key}" was attached with disablePresence=true; presence updates from Document.update are silently dropped.`
20847
+ );
20848
+ }
20849
+ }
20165
20850
  const rules = this.getSchemaRules();
20166
20851
  if (!ctx.isPresenceOnlyChange() && rules.length) {
20167
20852
  const result = validateYorkieRuleset(this.clone?.root.getObject(), rules);
@@ -20531,6 +21216,24 @@
20531
21216
  setDisableGC(disableGC) {
20532
21217
  this.disableGC = disableGC;
20533
21218
  }
21219
+ /**
21220
+ * `setDisablePresence` records the server-fixated presence-disabled state
21221
+ * of this document. The client calls this on attach (before
21222
+ * `applyChangePack`) so any subsequent `Document.update` invocation sees
21223
+ * the gating state already settled. Flipping the flag at runtime is
21224
+ * supported: the next `update` honours the new value.
21225
+ */
21226
+ setDisablePresence(disablePresence) {
21227
+ this.disablePresence = disablePresence;
21228
+ }
21229
+ /**
21230
+ * `isPresenceDisabled` returns the current presence-disabled state of
21231
+ * this document. Reflects the server-fixated value once attached;
21232
+ * before attach it reflects the local construction option.
21233
+ */
21234
+ isPresenceDisabled() {
21235
+ return this.disablePresence;
21236
+ }
20534
21237
  /**
20535
21238
  * `isEnableDevtools` returns whether devtools is enabled or not.
20536
21239
  */
@@ -21268,6 +21971,14 @@
21268
21971
  * omit the response VersionVector. Documents only.
21269
21972
  */
21270
21973
  disableGC;
21974
+ /**
21975
+ * `disablePresence` mirrors the server-fixated value returned by the
21976
+ * attach response. `pushPullChanges` does **not** read this — the
21977
+ * `disable_presence` wire field is request-only (set on the first
21978
+ * attach, ignored thereafter on the server side). Carried here for
21979
+ * devtools / debugging visibility. Documents only.
21980
+ */
21981
+ disablePresence;
21271
21982
  /**
21272
21983
  * `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
21273
21984
  * a Channel's `local-broadcast` events to the RPC client, and consumed
@@ -21283,7 +21994,7 @@
21283
21994
  watchAbortController;
21284
21995
  syncPromise;
21285
21996
  _detaching = false;
21286
- constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false) {
21997
+ constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false, disablePresence = false) {
21287
21998
  this.reconnectStreamDelay = reconnectStreamDelay;
21288
21999
  this.resource = resource;
21289
22000
  this.resourceID = resourceID;
@@ -21293,6 +22004,7 @@
21293
22004
  this.pollInterval = pollInterval;
21294
22005
  this.pollIntervalPinned = pollIntervalPinned;
21295
22006
  this.disableGC = disableGC;
22007
+ this.disablePresence = disablePresence;
21296
22008
  this.cancelled = false;
21297
22009
  }
21298
22010
  /**
@@ -21452,7 +22164,7 @@
21452
22164
  };
21453
22165
  }
21454
22166
  const name$1 = "@yorkie-js/sdk";
21455
- const version$1 = "0.7.12-rc";
22167
+ const version$1 = "0.7.13";
21456
22168
  const pkg$1 = {
21457
22169
  name: name$1,
21458
22170
  version: version$1
@@ -21753,7 +22465,8 @@
21753
22465
  syncLoopDuration: 50,
21754
22466
  retrySyncLoopDelay: 1e3,
21755
22467
  reconnectStreamDelay: 1e3,
21756
- channelHeartbeatInterval: DefaultChannelHeartbeatMs
22468
+ channelHeartbeatInterval: DefaultChannelHeartbeatMs,
22469
+ deactivateOnUnload: true
21757
22470
  };
21758
22471
  const DefaultBroadcastOptions = {
21759
22472
  maxRetries: Infinity,
@@ -21773,6 +22486,7 @@
21773
22486
  reconnectStreamDelay;
21774
22487
  retrySyncLoopDelay;
21775
22488
  channelHeartbeatInterval;
22489
+ deactivateOnUnload;
21776
22490
  rpcClient;
21777
22491
  setAuthToken;
21778
22492
  taskQueue;
@@ -21806,6 +22520,7 @@
21806
22520
  this.reconnectStreamDelay = opts.reconnectStreamDelay ?? DefaultClientOptions.reconnectStreamDelay;
21807
22521
  this.retrySyncLoopDelay = opts.retrySyncLoopDelay ?? DefaultClientOptions.retrySyncLoopDelay;
21808
22522
  this.channelHeartbeatInterval = opts.channelHeartbeatInterval ?? DefaultClientOptions.channelHeartbeatInterval;
22523
+ this.deactivateOnUnload = opts.deactivateOnUnload ?? DefaultClientOptions.deactivateOnUnload;
21809
22524
  const { authInterceptor, setToken } = createAuthInterceptor(this.apiKey);
21810
22525
  this.setAuthToken = setToken;
21811
22526
  const transportOptions = {
@@ -21884,9 +22599,14 @@
21884
22599
  this.deactivating = false;
21885
22600
  this.runSyncLoop();
21886
22601
  logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
21887
- if (typeof window !== "undefined") {
21888
- window.addEventListener("beforeunload", async () => {
21889
- await this.deactivate({ keepalive: true });
22602
+ if (typeof window !== "undefined" && this.deactivateOnUnload) {
22603
+ window.addEventListener("beforeunload", () => {
22604
+ void this.deactivate({ keepalive: true }).catch((err) => {
22605
+ logger.debug(
22606
+ `[DC] c:"${this.getKey()}" beforeunload deactivate failed:`,
22607
+ err
22608
+ );
22609
+ });
21890
22610
  });
21891
22611
  }
21892
22612
  } catch (err) {
@@ -21974,7 +22694,10 @@
21974
22694
  );
21975
22695
  }
21976
22696
  doc.setActor(this.id);
21977
- doc.update((_, p) => p.set(opts.initialPresence || {}));
22697
+ const resolvedDisablePresence = opts.disablePresence ?? doc.isPresenceDisabled() ?? false;
22698
+ if (!resolvedDisablePresence) {
22699
+ doc.update((_, p) => p.set(opts.initialPresence || {}));
22700
+ }
21978
22701
  const syncMode = opts.syncMode ?? "realtime";
21979
22702
  if (opts.documentPollInterval !== void 0 && opts.documentPollInterval <= 0) {
21980
22703
  throw new YorkieError(
@@ -21991,7 +22714,8 @@
21991
22714
  clientId: this.id,
21992
22715
  changePack: converter.toChangePack(doc.createChangePack()),
21993
22716
  schemaKey: opts.schema,
21994
- disableGc: opts.disableGC ?? false
22717
+ disableGc: opts.disableGC ?? false,
22718
+ disablePresence: resolvedDisablePresence
21995
22719
  },
21996
22720
  { headers: { "x-shard-key": `${this.apiKey}/${doc.getKey()}` } }
21997
22721
  );
@@ -22004,6 +22728,7 @@
22004
22728
  }
22005
22729
  const pack = converter.fromChangePack(res.changePack);
22006
22730
  doc.setDisableGC(opts.disableGC ?? false);
22731
+ doc.setDisablePresence(res.disablePresence);
22007
22732
  doc.applyChangePack(pack);
22008
22733
  if (doc.getStatus() === DocStatus.Removed) {
22009
22734
  return doc;
@@ -22018,7 +22743,8 @@
22018
22743
  syncMode,
22019
22744
  pollInterval,
22020
22745
  pollIntervalPinned,
22021
- opts.disableGC ?? false
22746
+ opts.disableGC ?? false,
22747
+ res.disablePresence
22022
22748
  )
22023
22749
  );
22024
22750
  if (syncMode !== "manual" && syncMode !== "polling") {
@@ -23536,7 +24262,7 @@
23536
24262
  };
23537
24263
  }
23538
24264
  const name = "@yorkie-js/react";
23539
- const version = "0.7.12-rc";
24265
+ const version = "0.7.13";
23540
24266
  const pkg = {
23541
24267
  name,
23542
24268
  version
@@ -23577,7 +24303,7 @@
23577
24303
  }
23578
24304
  activateClient();
23579
24305
  return () => {
23580
- if (activate && client?.isActive()) {
24306
+ if (activate && client?.isActive() && opts.deactivateOnUnload !== false) {
23581
24307
  client.deactivate({ keepalive: true });
23582
24308
  }
23583
24309
  };
@@ -23725,7 +24451,7 @@
23725
24451
  valueB
23726
24452
  );
23727
24453
  }
23728
- function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, docStore) {
24454
+ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, disablePresence, docStore) {
23729
24455
  const initialRootRef = react.useRef(initialRoot);
23730
24456
  const initialPresenceRef = react.useRef(initialPresence);
23731
24457
  const [didMount, setDidMount] = react.useState(false);
@@ -23753,7 +24479,10 @@
23753
24479
  loading: true,
23754
24480
  error: void 0
23755
24481
  }));
23756
- const newDoc = new Document(docKey, { enableDevtools });
24482
+ const newDoc = new Document(docKey, {
24483
+ enableDevtools,
24484
+ disablePresence
24485
+ });
23757
24486
  const unsubs = [];
23758
24487
  unsubs.push(
23759
24488
  newDoc.subscribe(() => {
@@ -23786,7 +24515,8 @@
23786
24515
  initialPresence: initialPresenceRef.current,
23787
24516
  syncMode,
23788
24517
  documentPollInterval,
23789
- disableGC
24518
+ disableGC,
24519
+ disablePresence
23790
24520
  });
23791
24521
  const update = (callback) => {
23792
24522
  try {
@@ -23835,7 +24565,8 @@
23835
24565
  didMount,
23836
24566
  syncMode,
23837
24567
  documentPollInterval,
23838
- disableGC
24568
+ disableGC,
24569
+ disablePresence
23839
24570
  ]);
23840
24571
  }
23841
24572
  const DocumentContext = react.createContext(void 0);
@@ -23847,6 +24578,7 @@
23847
24578
  syncMode,
23848
24579
  documentPollInterval,
23849
24580
  disableGC,
24581
+ disablePresence,
23850
24582
  children
23851
24583
  }) => {
23852
24584
  const { client, loading: clientLoading, error: clientError } = useYorkie();
@@ -23875,6 +24607,7 @@
23875
24607
  syncMode,
23876
24608
  documentPollInterval,
23877
24609
  disableGC,
24610
+ disablePresence,
23878
24611
  documentStore
23879
24612
  );
23880
24613
  return /* @__PURE__ */ jsxRuntime.jsx(DocumentContext.Provider, { value: documentStore, children });
@@ -23950,6 +24683,17 @@
23950
24683
  );
23951
24684
  return { createRevision, listRevisions, getRevision, restoreRevision };
23952
24685
  };
24686
+ const useRemoveDocument = () => {
24687
+ const { client } = useYorkie();
24688
+ const documentStore = useDocumentStore("useRemoveDocument");
24689
+ const doc = useSelector(documentStore, (store) => store.doc);
24690
+ return react.useCallback(async () => {
24691
+ if (!client || !doc) {
24692
+ throw new Error("Client or document is not ready");
24693
+ }
24694
+ await client.remove(doc);
24695
+ }, [client, doc]);
24696
+ };
23953
24697
  const useDocumentStore = (hookName) => {
23954
24698
  const documentStore = react.useContext(DocumentContext);
23955
24699
  if (!documentStore) {
@@ -23995,6 +24739,7 @@
23995
24739
  opts?.syncMode,
23996
24740
  opts?.documentPollInterval,
23997
24741
  opts?.disableGC,
24742
+ opts?.disablePresence,
23998
24743
  documentStore
23999
24744
  );
24000
24745
  const documentState = useSelector(documentStore);
@@ -24261,6 +25006,7 @@
24261
25006
  exports2.useDocument = useDocument;
24262
25007
  exports2.usePeekChannel = usePeekChannel;
24263
25008
  exports2.usePresences = usePresences;
25009
+ exports2.useRemoveDocument = useRemoveDocument;
24264
25010
  exports2.useRevisions = useRevisions;
24265
25011
  exports2.useRoot = useRoot;
24266
25012
  exports2.useYorkie = useYorkie;