@colyseus/schema 3.0.76 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +781 -434
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.mjs +779 -435
- package/build/esm/index.mjs.map +1 -1
- package/build/umd/index.js +781 -434
- package/lib/Metadata.js +1 -5
- package/lib/Metadata.js.map +1 -1
- package/lib/Reflection.d.ts +50 -17
- package/lib/Reflection.js +151 -202
- package/lib/Reflection.js.map +1 -1
- package/lib/Schema.d.ts +13 -1
- package/lib/Schema.js +73 -9
- package/lib/Schema.js.map +1 -1
- package/lib/annotations.d.ts +6 -1
- package/lib/annotations.js +8 -34
- package/lib/annotations.js.map +1 -1
- package/lib/bench_encode.js +34 -1
- package/lib/bench_encode.js.map +1 -1
- package/lib/codegen/api.js +35 -2
- package/lib/codegen/api.js.map +1 -1
- package/lib/codegen/cli.js +4 -1
- package/lib/codegen/cli.js.map +1 -1
- package/lib/codegen/parser.js +35 -2
- package/lib/codegen/parser.js.map +1 -1
- package/lib/codegen/types.js +34 -1
- package/lib/codegen/types.js.map +1 -1
- package/lib/decoder/DecodeOperation.d.ts +2 -2
- package/lib/decoder/DecodeOperation.js +3 -3
- package/lib/decoder/DecodeOperation.js.map +1 -1
- package/lib/decoder/Decoder.d.ts +3 -3
- package/lib/decoder/Decoder.js +2 -2
- package/lib/decoder/Decoder.js.map +1 -1
- package/lib/decoder/ReferenceTracker.d.ts +0 -1
- package/lib/decoder/ReferenceTracker.js +9 -7
- package/lib/decoder/ReferenceTracker.js.map +1 -1
- package/lib/decoder/strategy/Callbacks.d.ts +154 -0
- package/lib/decoder/strategy/Callbacks.js +340 -0
- package/lib/decoder/strategy/Callbacks.js.map +1 -0
- package/lib/decoder/strategy/{StateCallbacks.d.ts → getDecoderStateCallbacks.d.ts} +6 -0
- package/lib/decoder/strategy/{StateCallbacks.js → getDecoderStateCallbacks.js} +17 -10
- package/lib/decoder/strategy/getDecoderStateCallbacks.js.map +1 -0
- package/lib/encoder/ChangeTree.d.ts +2 -2
- package/lib/encoder/ChangeTree.js.map +1 -1
- package/lib/encoder/EncodeOperation.d.ts +2 -2
- package/lib/encoder/EncodeOperation.js +3 -3
- package/lib/encoder/EncodeOperation.js.map +1 -1
- package/lib/encoder/Encoder.d.ts +6 -6
- package/lib/encoder/Encoder.js +19 -18
- package/lib/encoder/Encoder.js.map +1 -1
- package/lib/encoder/Root.js +17 -14
- package/lib/encoder/Root.js.map +1 -1
- package/lib/encoder/StateView.js +13 -12
- package/lib/encoder/StateView.js.map +1 -1
- package/lib/encoding/decode.d.ts +2 -2
- package/lib/encoding/encode.d.ts +3 -1
- package/lib/encoding/encode.js.map +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.js +7 -3
- package/lib/index.js.map +1 -1
- package/lib/types/HelperTypes.d.ts +7 -14
- package/lib/types/HelperTypes.js.map +1 -1
- package/lib/types/custom/ArraySchema.d.ts +2 -1
- package/lib/types/custom/ArraySchema.js.map +1 -1
- package/lib/types/custom/CollectionSchema.d.ts +2 -1
- package/lib/types/custom/CollectionSchema.js.map +1 -1
- package/lib/types/custom/MapSchema.d.ts +3 -2
- package/lib/types/custom/MapSchema.js.map +1 -1
- package/lib/types/custom/SetSchema.d.ts +2 -1
- package/lib/types/custom/SetSchema.js.map +1 -1
- package/lib/types/symbols.d.ts +1 -0
- package/lib/types/symbols.js +2 -1
- package/lib/types/symbols.js.map +1 -1
- package/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +12 -16
- package/src/Metadata.ts +1 -5
- package/src/Reflection.ts +185 -174
- package/src/Schema.ts +81 -13
- package/src/annotations.ts +14 -40
- package/src/codegen/parser.ts +1 -1
- package/src/decoder/DecodeOperation.ts +9 -9
- package/src/decoder/Decoder.ts +6 -6
- package/src/decoder/ReferenceTracker.ts +10 -8
- package/src/decoder/strategy/Callbacks.ts +547 -0
- package/src/decoder/strategy/{StateCallbacks.ts → getDecoderStateCallbacks.ts} +17 -11
- package/src/encoder/ChangeTree.ts +4 -7
- package/src/encoder/EncodeOperation.ts +9 -9
- package/src/encoder/Encoder.ts +47 -22
- package/src/encoder/Root.ts +20 -15
- package/src/encoder/StateView.ts +15 -13
- package/src/encoding/encode.ts +1 -1
- package/src/index.ts +3 -2
- package/src/types/HelperTypes.ts +13 -11
- package/src/types/custom/ArraySchema.ts +2 -1
- package/src/types/custom/CollectionSchema.ts +4 -2
- package/src/types/custom/MapSchema.ts +4 -2
- package/src/types/custom/SetSchema.ts +3 -1
- package/src/types/symbols.ts +1 -0
- package/src/utils.ts +2 -2
- package/lib/Decoder.d.ts +0 -16
- package/lib/Decoder.js +0 -182
- package/lib/Decoder.js.map +0 -1
- package/lib/Encoder.d.ts +0 -13
- package/lib/Encoder.js +0 -79
- package/lib/Encoder.js.map +0 -1
- package/lib/changes/ChangeSet.d.ts +0 -12
- package/lib/changes/ChangeSet.js +0 -35
- package/lib/changes/ChangeSet.js.map +0 -1
- package/lib/changes/ChangeTree.d.ts +0 -53
- package/lib/changes/ChangeTree.js +0 -202
- package/lib/changes/ChangeTree.js.map +0 -1
- package/lib/changes/DecodeOperation.d.ts +0 -15
- package/lib/changes/DecodeOperation.js +0 -186
- package/lib/changes/DecodeOperation.js.map +0 -1
- package/lib/changes/EncodeOperation.d.ts +0 -18
- package/lib/changes/EncodeOperation.js +0 -130
- package/lib/changes/EncodeOperation.js.map +0 -1
- package/lib/changes/ReferenceTracker.d.ts +0 -14
- package/lib/changes/ReferenceTracker.js +0 -83
- package/lib/changes/ReferenceTracker.js.map +0 -1
- package/lib/changes/consts.d.ts +0 -14
- package/lib/changes/consts.js +0 -18
- package/lib/changes/consts.js.map +0 -1
- package/lib/decoder/strategy/StateCallbacks.js.map +0 -1
- package/lib/decoding/decode.d.ts +0 -48
- package/lib/decoding/decode.js +0 -267
- package/lib/decoding/decode.js.map +0 -1
- package/lib/ecs.d.ts +0 -11
- package/lib/ecs.js +0 -160
- package/lib/ecs.js.map +0 -1
- package/lib/filters/index.d.ts +0 -8
- package/lib/filters/index.js +0 -24
- package/lib/filters/index.js.map +0 -1
- package/lib/spec.d.ts +0 -13
- package/lib/spec.js +0 -42
- package/lib/spec.js.map +0 -1
- package/lib/types/ArraySchema.d.ts +0 -238
- package/lib/types/ArraySchema.js +0 -555
- package/lib/types/ArraySchema.js.map +0 -1
- package/lib/types/CollectionSchema.d.ts +0 -35
- package/lib/types/CollectionSchema.js +0 -150
- package/lib/types/CollectionSchema.js.map +0 -1
- package/lib/types/MapSchema.d.ts +0 -38
- package/lib/types/MapSchema.js +0 -215
- package/lib/types/MapSchema.js.map +0 -1
- package/lib/types/SetSchema.d.ts +0 -32
- package/lib/types/SetSchema.js +0 -162
- package/lib/types/SetSchema.js.map +0 -1
- package/lib/types/typeRegistry.d.ts +0 -5
- package/lib/types/typeRegistry.js +0 -13
- package/lib/types/typeRegistry.js.map +0 -1
- package/lib/usage.d.ts +0 -1
- package/lib/usage.js +0 -22
- package/lib/usage.js.map +0 -1
- package/lib/v3.d.ts +0 -1
- package/lib/v3.js +0 -427
- package/lib/v3.js.map +0 -1
- package/lib/v3_experiment.d.ts +0 -1
- package/lib/v3_experiment.js +0 -407
- package/lib/v3_experiment.js.map +0 -1
package/build/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/encoding/spec.ts","../../src/symbol.shim.ts","../../src/types/symbols.ts","../../src/encoding/encode.ts","../../src/encoding/decode.ts","../../src/types/registry.ts","../../src/types/TypeContext.ts","../../src/Metadata.ts","../../src/encoder/ChangeTree.ts","../../src/encoder/EncodeOperation.ts","../../src/decoder/DecodeOperation.ts","../../src/encoding/assert.ts","../../src/types/custom/ArraySchema.ts","../../src/types/custom/MapSchema.ts","../../src/types/custom/CollectionSchema.ts","../../src/types/custom/SetSchema.ts","../../src/annotations.ts","../../src/utils.ts","../../src/Schema.ts","../../node_modules/tslib/tslib.es6.js","../../src/encoder/Root.ts","../../src/encoder/Encoder.ts","../../src/types/utils.ts","../../src/decoder/ReferenceTracker.ts","../../src/decoder/Decoder.ts","../../src/Reflection.ts","../../src/decoder/strategy/StateCallbacks.ts","../../src/decoder/strategy/RawChanges.ts","../../src/encoder/StateView.ts","../../src/index.ts"],"sourcesContent":["export const SWITCH_TO_STRUCTURE = 255; // (decoding collides with DELETE_AND_ADD + fieldIndex = 63)\nexport const TYPE_ID = 213;\n\n/**\n * Encoding Schema field operations.\n */\nexport enum OPERATION {\n ADD = 128, // (10000000) add new structure/primitive\n REPLACE = 0, // (00000001) replace structure/primitive\n DELETE = 64, // (01000000) delete field\n DELETE_AND_MOVE = 96, // () ArraySchema only\n MOVE_AND_ADD = 160, // () ArraySchema only\n DELETE_AND_ADD = 192, // (11000000) DELETE field, followed by an ADD\n\n /**\n * Collection operations\n */\n CLEAR = 10,\n\n /**\n * ArraySchema operations\n */\n REVERSE = 15,\n MOVE = 32,\n DELETE_BY_REFID = 33, // This operation is only used at ENCODING time. During DECODING, DELETE_BY_REFID is converted to DELETE\n ADD_BY_REFID = 129,\n}\n","\n//\n// Must have Symbol.metadata defined for metadata support on decorators:\n// https://github.com/microsoft/TypeScript/issues/55453#issuecomment-1687496648\n//\nexport {};\ndeclare global {\n interface SymbolConstructor {\n readonly metadata: unique symbol;\n }\n}\n(Symbol as any).metadata ??= Symbol.for(\"Symbol.metadata\");","export const $track = \"~track\";\nexport const $encoder = \"~encoder\";\nexport const $decoder = \"~decoder\";\n\nexport const $filter = \"~filter\";\n\nexport const $getByIndex = \"~getByIndex\";\nexport const $deleteByIndex = \"~deleteByIndex\";\n\n/**\n * Used to hold ChangeTree instances whitin the structures\n */\nexport const $changes = '~changes';\n\n/**\n * Used to keep track of the type of the child elements of a collection\n * (MapSchema, ArraySchema, etc.)\n */\nexport const $childType = '~childType';\n\n/**\n * Optional \"discard\" method for custom types (ArraySchema)\n * (Discards changes for next serialization)\n */\nexport const $onEncodeEnd = '~onEncodeEnd';\n\n/**\n * When decoding, this method is called after the instance is fully decoded\n */\nexport const $onDecodeEnd = \"~onDecodeEnd\";\n\n/**\n * Metadata\n */\nexport const $descriptors = \"~descriptors\";\nexport const $numFields = \"~__numFields\";\nexport const $refTypeFieldIndexes = \"~__refTypeFieldIndexes\";\nexport const $viewFieldIndexes = \"~__viewFieldIndexes\";\nexport const $fieldIndexesByViewTag = \"$__fieldIndexesByViewTag\";","// @ts-nocheck\n\n/**\n * Copyright (c) 2018 Endel Dreyer\n * Copyright (c) 2014 Ion Drive Software Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE\n */\n\nimport type { TextEncoder } from \"util\";\nimport type { Iterator } from \"./decode\";\n\nexport type BufferLike = number[] | ArrayBufferLike | Buffer;\n\n/**\n * msgpack implementation highly based on notepack.io\n * https://github.com/darrachequesne/notepack\n */\n\nlet textEncoder: TextEncoder;\n// @ts-ignore\ntry { textEncoder = new TextEncoder(); } catch (e) { }\n\n// force little endian to facilitate decoding on multiple implementations\nconst _isLittleEndian = true; // new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\nconst _convoBuffer = new ArrayBuffer(8);\nconst _int32 = new Int32Array(_convoBuffer);\nconst _float32 = new Float32Array(_convoBuffer);\nconst _float64 = new Float64Array(_convoBuffer);\nconst _int64 = new BigInt64Array(_convoBuffer);\n\nconst hasBufferByteLength = (typeof Buffer !== 'undefined' && Buffer.byteLength);\n\nconst utf8Length: (str: string, _?: any) => number = (hasBufferByteLength)\n ? Buffer.byteLength // node\n : function (str: string, _?: any) {\n var c = 0, length = 0;\n for (var i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n }\n\nfunction utf8Write(view: BufferLike, str: string, it: Iterator) {\n var c = 0;\n for (var i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n view[it.offset++] = c;\n }\n else if (c < 0x800) {\n view[it.offset] = 0xc0 | (c >> 6);\n view[it.offset + 1] = 0x80 | (c & 0x3f);\n it.offset += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n view[it.offset] = 0xe0 | (c >> 12);\n view[it.offset+1] = 0x80 | (c >> 6 & 0x3f);\n view[it.offset+2] = 0x80 | (c & 0x3f);\n it.offset += 3;\n }\n else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n view[it.offset] = 0xf0 | (c >> 18);\n view[it.offset+1] = 0x80 | (c >> 12 & 0x3f);\n view[it.offset+2] = 0x80 | (c >> 6 & 0x3f);\n view[it.offset+3] = 0x80 | (c & 0x3f);\n it.offset += 4;\n }\n }\n}\n\nfunction int8(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n};\n\nfunction uint8(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n};\n\nfunction int16(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n};\n\nfunction uint16(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n};\n\nfunction int32(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n bytes[it.offset++] = (value >> 16) & 255;\n bytes[it.offset++] = (value >> 24) & 255;\n};\n\nfunction uint32(bytes: BufferLike, value: number, it: Iterator) {\n const b4 = value >> 24;\n const b3 = value >> 16;\n const b2 = value >> 8;\n const b1 = value;\n bytes[it.offset++] = b1 & 255;\n bytes[it.offset++] = b2 & 255;\n bytes[it.offset++] = b3 & 255;\n bytes[it.offset++] = b4 & 255;\n};\n\nfunction int64(bytes: BufferLike, value: number, it: Iterator) {\n const high = Math.floor(value / Math.pow(2, 32));\n const low = value >>> 0;\n uint32(bytes, low, it);\n uint32(bytes, high, it);\n};\n\nfunction uint64(bytes: BufferLike, value: number, it: Iterator) {\n const high = (value / Math.pow(2, 32)) >> 0;\n const low = value >>> 0;\n uint32(bytes, low, it);\n uint32(bytes, high, it);\n};\n\nfunction bigint64(bytes: BufferLike, value: bigint, it: Iterator) {\n _int64[0] = BigInt.asIntN(64, value);\n int32(bytes, _int32[0], it);\n int32(bytes, _int32[1], it);\n}\n\nfunction biguint64(bytes: BufferLike, value: bigint, it: Iterator) {\n _int64[0] = BigInt.asIntN(64, value);\n int32(bytes, _int32[0], it);\n int32(bytes, _int32[1], it);\n}\n\nfunction float32(bytes: BufferLike, value: number, it: Iterator) {\n _float32[0] = value;\n int32(bytes, _int32[0], it);\n}\n\nfunction float64(bytes: BufferLike, value: number, it: Iterator) {\n _float64[0] = value;\n int32(bytes, _int32[_isLittleEndian ? 0 : 1], it);\n int32(bytes, _int32[_isLittleEndian ? 1 : 0], it);\n}\n\nfunction boolean(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value ? 1 : 0; // uint8\n};\n\nfunction string(bytes: BufferLike, value: string, it: Iterator) {\n // encode `null` strings as empty.\n if (!value) { value = \"\"; }\n\n let length = utf8Length(value, \"utf8\");\n let size = 0;\n\n // fixstr\n if (length < 0x20) {\n bytes[it.offset++] = length | 0xa0;\n size = 1;\n }\n // str 8\n else if (length < 0x100) {\n bytes[it.offset++] = 0xd9;\n bytes[it.offset++] = length % 255;\n size = 2;\n }\n // str 16\n else if (length < 0x10000) {\n bytes[it.offset++] = 0xda;\n uint16(bytes, length, it);\n size = 3;\n }\n // str 32\n else if (length < 0x100000000) {\n bytes[it.offset++] = 0xdb;\n uint32(bytes, length, it);\n size = 5;\n } else {\n throw new Error('String too long');\n }\n\n utf8Write(bytes, value, it);\n\n return size + length;\n}\n\nfunction number(bytes: BufferLike, value: number, it: Iterator) {\n if (isNaN(value)) {\n return number(bytes, 0, it);\n\n } else if (!isFinite(value)) {\n return number(bytes, (value > 0) ? Number.MAX_SAFE_INTEGER : -Number.MAX_SAFE_INTEGER, it);\n\n } else if (value !== (value|0)) {\n if (Math.abs(value) <= 3.4028235e+38) { // range check\n _float32[0] = value;\n if (Math.abs(Math.abs(_float32[0]) - Math.abs(value)) < 1e-4) { // precision check; adjust 1e-n (n = precision) to in-/decrease acceptable precision loss\n // now we know value is in range for f32 and has acceptable precision for f32\n bytes[it.offset++] = 0xca;\n float32(bytes, value, it);\n return 5;\n }\n }\n\n bytes[it.offset++] = 0xcb;\n float64(bytes, value, it);\n return 9;\n }\n\n if (value >= 0) {\n // positive fixnum\n if (value < 0x80) {\n bytes[it.offset++] = value & 255; // uint8\n return 1;\n }\n\n // uint 8\n if (value < 0x100) {\n bytes[it.offset++] = 0xcc;\n bytes[it.offset++] = value & 255; // uint8\n return 2;\n }\n\n // uint 16\n if (value < 0x10000) {\n bytes[it.offset++] = 0xcd;\n uint16(bytes, value, it);\n return 3;\n }\n\n // uint 32\n if (value < 0x100000000) {\n bytes[it.offset++] = 0xce;\n uint32(bytes, value, it);\n return 5;\n }\n\n // uint 64\n bytes[it.offset++] = 0xcf;\n uint64(bytes, value, it);\n return 9;\n\n } else {\n\n // negative fixnum\n if (value >= -0x20) {\n bytes[it.offset++] = 0xe0 | (value + 0x20);\n return 1;\n }\n\n // int 8\n if (value >= -0x80) {\n bytes[it.offset++] = 0xd0;\n int8(bytes, value, it);\n return 2;\n }\n\n // int 16\n if (value >= -0x8000) {\n bytes[it.offset++] = 0xd1;\n int16(bytes, value, it);\n return 3;\n }\n\n // int 32\n if (value >= -0x80000000) {\n bytes[it.offset++] = 0xd2;\n int32(bytes, value, it);\n return 5;\n }\n\n // int 64\n bytes[it.offset++] = 0xd3;\n int64(bytes, value, it);\n return 9;\n }\n}\n\nexport const encode = {\n int8,\n uint8,\n int16,\n uint16,\n int32,\n uint32,\n int64,\n uint64,\n bigint64,\n biguint64,\n float32,\n float64,\n boolean,\n string,\n number,\n utf8Write,\n utf8Length,\n}","// @ts-nocheck\n\n/**\n * Copyright (c) 2018 Endel Dreyer\n * Copyright (c) 2014 Ion Drive Software Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE\n */\n\nimport type { BufferLike } from \"./encode\";\n\n/**\n * msgpack implementation highly based on notepack.io\n * https://github.com/darrachequesne/notepack\n */\n\nexport interface Iterator { offset: number; }\n\n// force little endian to facilitate decoding on multiple implementations\nconst _isLittleEndian = true; // new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\nconst _convoBuffer = new ArrayBuffer(8);\n\nconst _int32 = new Int32Array(_convoBuffer);\nconst _float32 = new Float32Array(_convoBuffer);\nconst _float64 = new Float64Array(_convoBuffer);\nconst _uint64 = new BigUint64Array(_convoBuffer);\nconst _int64 = new BigInt64Array(_convoBuffer);\n\nfunction utf8Read(bytes: BufferLike, it: Iterator, length: number) {\n // boundary check\n if (length > bytes.length - it.offset) { length = bytes.length - it.offset; }\n\n var string = '', chr = 0;\n for (var i = it.offset, end = it.offset + length; i < end; i++) {\n var byte = bytes[i];\n if ((byte & 0x80) === 0x00) {\n string += String.fromCharCode(byte);\n continue;\n }\n if ((byte & 0xe0) === 0xc0) {\n string += String.fromCharCode(\n ((byte & 0x1f) << 6) |\n (bytes[++i] & 0x3f)\n );\n continue;\n }\n if ((byte & 0xf0) === 0xe0) {\n string += String.fromCharCode(\n ((byte & 0x0f) << 12) |\n ((bytes[++i] & 0x3f) << 6) |\n ((bytes[++i] & 0x3f) << 0)\n );\n continue;\n }\n if ((byte & 0xf8) === 0xf0) {\n chr = ((byte & 0x07) << 18) |\n ((bytes[++i] & 0x3f) << 12) |\n ((bytes[++i] & 0x3f) << 6) |\n ((bytes[++i] & 0x3f) << 0);\n if (chr >= 0x010000) { // surrogate pair\n chr -= 0x010000;\n string += String.fromCharCode((chr >>> 10) + 0xD800, (chr & 0x3FF) + 0xDC00);\n } else {\n string += String.fromCharCode(chr);\n }\n continue;\n }\n\n // (do not throw error to avoid server/client from crashing due to hack attemps)\n // throw new Error('Invalid byte ' + byte.toString(16));\n\n console.error('decode.utf8Read(): Invalid byte ' + byte + ' at offset ' + i + '. Skip to end of string: ' + (it.offset + length));\n break;\n }\n it.offset += length;\n return string;\n}\n\nfunction int8 (bytes: BufferLike, it: Iterator) {\n return uint8(bytes, it) << 24 >> 24;\n};\n\nfunction uint8 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++];\n};\n\nfunction int16 (bytes: BufferLike, it: Iterator) {\n return uint16(bytes, it) << 16 >> 16;\n};\n\nfunction uint16 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++] | bytes[it.offset++] << 8;\n};\n\nfunction int32 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++] | bytes[it.offset++] << 8 | bytes[it.offset++] << 16 | bytes[it.offset++] << 24;\n};\n\nfunction uint32 (bytes: BufferLike, it: Iterator) {\n return int32(bytes, it) >>> 0;\n};\n\nfunction float32 (bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n return _float32[0];\n};\n\nfunction float64 (bytes: BufferLike, it: Iterator) {\n _int32[_isLittleEndian ? 0 : 1] = int32(bytes, it);\n _int32[_isLittleEndian ? 1 : 0] = int32(bytes, it);\n return _float64[0];\n};\n\nfunction int64(bytes: BufferLike, it: Iterator) {\n const low = uint32(bytes, it);\n const high = int32(bytes, it) * Math.pow(2, 32);\n return high + low;\n};\n\nfunction uint64(bytes: BufferLike, it: Iterator) {\n const low = uint32(bytes, it);\n const high = uint32(bytes, it) * Math.pow(2, 32);\n return high + low;\n};\n\nfunction bigint64(bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n _int32[1] = int32(bytes, it);\n return _int64[0];\n}\n\nfunction biguint64(bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n _int32[1] = int32(bytes, it);\n return _uint64[0];\n}\n\nfunction boolean (bytes: BufferLike, it: Iterator) {\n return uint8(bytes, it) > 0;\n};\n\nfunction string (bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset++];\n let length: number;\n\n if (prefix < 0xc0) {\n // fixstr\n length = prefix & 0x1f;\n\n } else if (prefix === 0xd9) {\n length = uint8(bytes, it);\n\n } else if (prefix === 0xda) {\n length = uint16(bytes, it);\n\n } else if (prefix === 0xdb) {\n length = uint32(bytes, it);\n }\n\n return utf8Read(bytes, it, length);\n}\n\nfunction number (bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset++];\n\n if (prefix < 0x80) {\n // positive fixint\n return prefix;\n\n } else if (prefix === 0xca) {\n // float 32\n return float32(bytes, it);\n\n } else if (prefix === 0xcb) {\n // float 64\n return float64(bytes, it);\n\n } else if (prefix === 0xcc) {\n // uint 8\n return uint8(bytes, it);\n\n } else if (prefix === 0xcd) {\n // uint 16\n return uint16(bytes, it);\n\n } else if (prefix === 0xce) {\n // uint 32\n return uint32(bytes, it);\n\n } else if (prefix === 0xcf) {\n // uint 64\n return uint64(bytes, it);\n\n } else if (prefix === 0xd0) {\n // int 8\n return int8(bytes, it);\n\n } else if (prefix === 0xd1) {\n // int 16\n return int16(bytes, it);\n\n } else if (prefix === 0xd2) {\n // int 32\n return int32(bytes, it);\n\n } else if (prefix === 0xd3) {\n // int 64\n return int64(bytes, it);\n\n } else if (prefix > 0xdf) {\n // negative fixint\n return (0xff - prefix + 1) * -1\n }\n};\n\nexport function stringCheck(bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset];\n return (\n // fixstr\n (prefix < 0xc0 && prefix > 0xa0) ||\n // str 8\n prefix === 0xd9 ||\n // str 16\n prefix === 0xda ||\n // str 32\n prefix === 0xdb\n );\n}\n\nexport const decode = {\n utf8Read,\n int8,\n uint8,\n int16,\n uint16,\n int32,\n uint32,\n float32,\n float64,\n int64,\n uint64,\n bigint64,\n biguint64,\n boolean,\n string,\n number,\n stringCheck,\n};","import { DefinitionType, type } from \"../annotations\";\nimport { BufferLike, encode } from \"../encoding/encode\";\nimport { decode, Iterator } from \"../encoding/decode\";\n\nexport interface TypeDefinition {\n constructor?: any,\n encode?: (bytes: BufferLike, value: any, it: Iterator) => any;\n decode?: (bytes: BufferLike, it: Iterator) => any;\n}\n\nexport const registeredTypes: {[identifier: string] : TypeDefinition} = {};\n\nconst identifiers = new Map<any, string>();\n\nexport function registerType(identifier: string, definition: TypeDefinition) {\n if (definition.constructor) {\n identifiers.set(definition.constructor, identifier);\n registeredTypes[identifier] = definition;\n }\n\n if (definition.encode) { (encode as any)[identifier] = definition.encode; }\n if (definition.decode) { (decode as any)[identifier] = definition.decode; }\n}\n\nexport function getIdentifier(klass: any): string {\n return identifiers.get(klass);\n}\n\nexport function getType(identifier: string): TypeDefinition {\n return registeredTypes[identifier];\n}\n\nexport function defineCustomTypes<T extends {[key: string]: TypeDefinition}>(types: T) {\n for (const identifier in types) {\n registerType(identifier, types[identifier]);\n }\n\n return (t: keyof T) => type(t as DefinitionType);\n}","import { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport { $viewFieldIndexes } from \"./symbols\";\n\nexport class TypeContext {\n types: { [id: number]: typeof Schema; } = {};\n schemas = new Map<typeof Schema, number>();\n\n hasFilters: boolean = false;\n parentFiltered: {[typeIdAndParentIndex: string]: boolean} = {};\n\n /**\n * For inheritance support\n * Keeps track of which classes extends which. (parent -> children)\n */\n static inheritedTypes = new Map<typeof Schema, Set<typeof Schema>>();\n static cachedContexts = new Map<typeof Schema, TypeContext>();\n\n static register(target: typeof Schema) {\n const parent = Object.getPrototypeOf(target);\n if (parent !== Schema) {\n let inherits = TypeContext.inheritedTypes.get(parent);\n if (!inherits) {\n inherits = new Set<typeof Schema>();\n TypeContext.inheritedTypes.set(parent, inherits);\n }\n inherits.add(target);\n }\n }\n\n static cache (rootClass: typeof Schema) {\n let context = TypeContext.cachedContexts.get(rootClass);\n if (!context) {\n context = new TypeContext(rootClass);\n TypeContext.cachedContexts.set(rootClass, context);\n }\n return context;\n }\n\n constructor(rootClass?: typeof Schema) {\n if (rootClass) {\n this.discoverTypes(rootClass);\n }\n }\n\n has(schema: typeof Schema) {\n return this.schemas.has(schema);\n }\n\n get(typeid: number) {\n return this.types[typeid];\n }\n\n add(schema: typeof Schema, typeid = this.schemas.size) {\n // skip if already registered\n if (this.schemas.has(schema)) {\n return false;\n }\n\n this.types[typeid] = schema;\n\n //\n // Workaround to allow using an empty Schema (with no `@type()` fields)\n //\n if (schema[Symbol.metadata] === undefined) {\n Metadata.initialize(schema);\n }\n\n this.schemas.set(schema, typeid);\n return true;\n }\n\n getTypeId(klass: typeof Schema) {\n return this.schemas.get(klass);\n }\n\n private discoverTypes(klass: typeof Schema, parentType?: typeof Schema, parentIndex?: number, parentHasViewTag?: boolean) {\n if (parentHasViewTag) {\n this.registerFilteredByParent(klass, parentType, parentIndex);\n }\n\n // skip if already registered\n if (!this.add(klass)) { return; }\n\n // add classes inherited from this base class\n TypeContext.inheritedTypes.get(klass)?.forEach((child) => {\n this.discoverTypes(child, parentType, parentIndex, parentHasViewTag);\n });\n\n // add parent classes\n let parent: any = klass;\n while (\n (parent = Object.getPrototypeOf(parent)) &&\n parent !== Schema && // stop at root (Schema)\n parent !== Function.prototype // stop at root (non-Schema)\n ) {\n this.discoverTypes(parent);\n }\n\n const metadata: Metadata = (klass[Symbol.metadata] ??= {} as Metadata);\n\n // if any schema/field has filters, mark \"context\" as having filters.\n if (metadata[$viewFieldIndexes]) {\n this.hasFilters = true;\n }\n\n for (const fieldIndex in metadata) {\n const index = fieldIndex as any as number;\n\n const fieldType = metadata[index].type;\n const fieldHasViewTag = (metadata[index].tag !== undefined);\n\n if (typeof (fieldType) === \"string\") {\n continue;\n }\n\n if (typeof (fieldType) === \"function\") {\n this.discoverTypes(fieldType as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n\n } else {\n const type = Object.values(fieldType)[0];\n\n // skip primitive types\n if (typeof (type) === \"string\") {\n continue;\n }\n\n this.discoverTypes(type as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n }\n }\n }\n\n /**\n * Keep track of which classes have filters applied.\n * Format: `${typeid}-${parentTypeid}-${parentIndex}`\n */\n private registerFilteredByParent(schema: typeof Schema, parentType?: typeof Schema, parentIndex?: number) {\n const typeid = this.schemas.get(schema) ?? this.schemas.size;\n\n let key = `${typeid}`;\n if (parentType) { key += `-${this.schemas.get(parentType)}`; }\n\n key += `-${parentIndex}`;\n this.parentFiltered[key] = true;\n }\n\n debug() {\n let parentFiltered = \"\";\n\n for (const key in this.parentFiltered) {\n const keys: number[] = key.split(\"-\").map(Number);\n const fieldIndex = keys.pop();\n\n parentFiltered += `\\n\\t\\t`;\n parentFiltered += `${key}: ${keys.reverse().map((id, i) => {\n const klass = this.types[id];\n const metadata: Metadata = klass[Symbol.metadata];\n let txt = klass.name;\n if (i === 0) { txt += `[${metadata[fieldIndex].name}]`; }\n return `${txt}`;\n }).join(\" -> \")}`;\n }\n\n return `TypeContext ->\\n` +\n `\\tSchema types: ${this.schemas.size}\\n` +\n `\\thasFilters: ${this.hasFilters}\\n` +\n `\\tparentFiltered:${parentFiltered}`;\n }\n\n}\n","import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType, registeredTypes } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: any): DefinitionType {\n if (Array.isArray(type)) {\n return { array: getNormalizedType(type[0]) };\n\n } else if (typeof (type['type']) !== \"undefined\") {\n return type['type'];\n\n } else if (isTSEnum(type)) {\n // Detect TS Enum type (either string or number)\n return Object.keys(type).every(key => typeof type[key] === \"string\")\n ? \"string\"\n : \"number\";\n\n } else if (typeof type === \"object\" && type !== null) {\n // Handle collection types\n const collectionType = Object.keys(type).find(k => registeredTypes[k] !== undefined);\n if (collectionType) {\n type[collectionType] = getNormalizedType(type[collectionType]);\n return type;\n }\n }\n return type;\n}\n\nfunction isTSEnum(_enum: any) {\n if (typeof _enum === 'function' && _enum[Symbol.metadata]) {\n return false;\n }\n\n const keys = Object.keys(_enum);\n const numericFields = keys.filter(k => /\\d+/.test(k));\n\n // Check for number enum (has numeric keys and reverse mapping)\n if (numericFields.length > 0 && numericFields.length === (keys.length / 2) && _enum[_enum[numericFields[0]]] == numericFields[0]) {\n return true;\n }\n\n // Check for string enum (all values are strings and keys match values)\n if (keys.length > 0 && keys.every(key => typeof _enum[key] === 'string' && _enum[key] === key)) {\n return true;\n }\n\n return false;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields<T extends { new (...args: any[]): InstanceType<T> } = any>(target: T, fields: { [field in keyof InstanceType<T>]?: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = getNormalizedType(fields[field]);\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = typeof(Object.keys(type)[0]) === \"string\" && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n Object.defineProperty(constructor, Symbol.metadata, {\n value: metadata,\n writable: false,\n configurable: true\n });\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields: any = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n },\n\n hasViewTagAtIndex(metadata: Metadata, index: number) {\n return metadata?.[$viewFieldIndexes]?.includes(index);\n }\n}","import { OPERATION } from \"../encoding/spec\";\nimport { Schema } from \"../Schema\";\nimport { $changes, $childType, $decoder, $onEncodeEnd, $encoder, $getByIndex, $refTypeFieldIndexes, $viewFieldIndexes, type $deleteByIndex } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\nimport type { SetSchema } from \"../types/custom/SetSchema\";\n\nimport { Root } from \"./Root\";\nimport { Metadata } from \"../Metadata\";\nimport type { EncodeOperation } from \"./EncodeOperation\";\nimport type { DecodeOperation } from \"../decoder/DecodeOperation\";\n\ndeclare global {\n interface Object {\n // FIXME: not a good practice to extend globals here\n [$changes]?: ChangeTree;\n [$encoder]?: EncodeOperation,\n [$decoder]?: DecodeOperation,\n }\n}\n\nexport interface IRef {\n [$changes]?: ChangeTree;\n [$getByIndex]?: (index: number, isEncodeAll?: boolean) => any;\n [$deleteByIndex]?: (index: number) => void;\n}\n\nexport type Ref = Schema\n | ArraySchema\n | MapSchema\n | CollectionSchema\n | SetSchema;\n\nexport type ChangeSetName = \"changes\"\n | \"allChanges\"\n | \"filteredChanges\"\n | \"allFilteredChanges\";\n\nexport interface IndexedOperations {\n [index: number]: OPERATION;\n}\n\n// Linked list node for change trees\nexport interface ChangeTreeNode {\n changeTree: ChangeTree;\n next?: ChangeTreeNode;\n prev?: ChangeTreeNode;\n position: number; // Cached position in the linked list for O(1) lookup\n}\n\n// Linked list for change trees\nexport interface ChangeTreeList {\n next?: ChangeTreeNode;\n tail?: ChangeTreeNode;\n}\n\nexport interface ChangeSet {\n // field index -> operation index\n indexes: { [index: number]: number };\n operations: number[];\n queueRootNode?: ChangeTreeNode; // direct reference to ChangeTreeNode in the linked list\n}\n\nfunction createChangeSet(queueRootNode?: ChangeTreeNode): ChangeSet {\n return { indexes: {}, operations: [], queueRootNode };\n}\n\n// Linked list helper functions\nexport function createChangeTreeList(): ChangeTreeList {\n return { next: undefined, tail: undefined };\n}\n\nexport function setOperationAtIndex(changeSet: ChangeSet, index: number) {\n const operationsIndex = changeSet.indexes[index];\n if (operationsIndex === undefined) {\n changeSet.indexes[index] = changeSet.operations.push(index) - 1;\n } else {\n changeSet.operations[operationsIndex] = index;\n }\n}\n\nexport function deleteOperationAtIndex(changeSet: ChangeSet, index: number | string) {\n let operationsIndex = changeSet.indexes[index as any as number];\n if (operationsIndex === undefined) {\n //\n // if index is not found, we need to find the last operation\n // FIXME: this is not very efficient\n //\n // > See \"should allow consecutive splices (same place)\" tests\n //\n operationsIndex = Object.values(changeSet.indexes).at(-1);\n index = Object.entries(changeSet.indexes).find(([_, value]) => value === operationsIndex)?.[0];\n }\n changeSet.operations[operationsIndex] = undefined;\n delete changeSet.indexes[index as any as number];\n}\n\nexport function debugChangeSet(label: string, changeSet: ChangeSet) {\n let indexes: string[] = [];\n let operations: string[] = [];\n\n for (const index in changeSet.indexes) {\n indexes.push(`\\t${index} => [${changeSet.indexes[index]}]`);\n }\n\n for (let i = 0; i < changeSet.operations.length; i++) {\n const index = changeSet.operations[i];\n if (index !== undefined) {\n operations.push(`\\t[${i}] => ${index}`);\n }\n }\n\n console.log(`${label} =>\\nindexes (${Object.keys(changeSet.indexes).length}) {`);\n console.log(indexes.join(\"\\n\"), \"\\n}\");\n console.log(`operations (${changeSet.operations.filter(op => op !== undefined).length}) {`);\n console.log(operations.join(\"\\n\"), \"\\n}\");\n}\n\nexport interface ParentChain {\n ref: Ref;\n index: number;\n next?: ParentChain;\n}\n\nexport class ChangeTree<T extends Ref = any> {\n ref: T;\n refId: number;\n metadata: Metadata;\n\n root?: Root;\n parentChain?: ParentChain; // Linked list for tracking parents\n\n /**\n * Whether this structure is parent of a filtered structure.\n */\n isFiltered: boolean = false;\n isVisibilitySharedWithParent?: boolean; // See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'\n\n indexedOperations: IndexedOperations = {};\n\n //\n // TODO:\n // try storing the index + operation per item.\n // example: 1024 & 1025 => ADD, 1026 => DELETE\n //\n // => https://chatgpt.com/share/67107d0c-bc20-8004-8583-83b17dd7c196\n //\n changes: ChangeSet = { indexes: {}, operations: [] };\n allChanges: ChangeSet = { indexes: {}, operations: [] };\n filteredChanges: ChangeSet;\n allFilteredChanges: ChangeSet;\n\n indexes: { [index: string]: any }; // TODO: remove this, only used by MapSchema/SetSchema/CollectionSchema (`encodeKeyValueOperation`)\n\n /**\n * Is this a new instance? Used on ArraySchema to determine OPERATION.MOVE_AND_ADD operation.\n */\n isNew = true;\n\n constructor(ref: T) {\n this.ref = ref;\n this.metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // Does this structure have \"filters\" declared?\n //\n if (this.metadata?.[$viewFieldIndexes]) {\n this.allFilteredChanges = { indexes: {}, operations: [] };\n this.filteredChanges = { indexes: {}, operations: [] };\n }\n }\n\n setRoot(root: Root) {\n this.root = root;\n\n const isNewChangeTree = this.root.add(this);\n\n this.checkIsFiltered(this.parent, this.parentIndex, isNewChangeTree);\n\n // Recursively set root on child structures\n if (isNewChangeTree) {\n this.forEachChild((child, _) => {\n if (child.root !== root) {\n child.setRoot(root);\n } else {\n root.add(child); // increment refCount\n }\n });\n }\n }\n\n setParent(\n parent: Ref,\n root?: Root,\n parentIndex?: number,\n ) {\n this.addParent(parent, parentIndex);\n\n // avoid setting parents with empty `root`\n if (!root) { return; }\n\n const isNewChangeTree = root.add(this);\n\n // skip if parent is already set\n if (root !== this.root) {\n this.root = root;\n this.checkIsFiltered(parent, parentIndex, isNewChangeTree);\n }\n\n // assign same parent on child structures\n if (isNewChangeTree) {\n //\n // assign same parent on child structures\n //\n this.forEachChild((child, index) => {\n if (child.root === root) {\n //\n // re-assigning a child of the same root, move it next to parent\n // so encoding order is preserved\n //\n root.add(child);\n root.moveNextToParent(child);\n return;\n }\n child.setParent(this.ref, root, index);\n });\n }\n }\n\n forEachChild(callback: (change: ChangeTree, at: any) => void) {\n //\n // assign same parent on child structures\n //\n if ((this.ref as any)[$childType]) {\n if (typeof ((this.ref as any)[$childType]) !== \"string\") {\n // MapSchema / ArraySchema, etc.\n for (const [key, value] of (this.ref as MapSchema).entries()) {\n if (!value) { continue; } // sparse arrays can have undefined values\n callback(value[$changes], this.indexes?.[key] ?? key);\n };\n }\n\n } else {\n for (const index of this.metadata?.[$refTypeFieldIndexes] ?? []) {\n const field = this.metadata[index as any as number];\n const value = this.ref[field.name as keyof Ref];\n if (!value) { continue; }\n callback(value[$changes], index);\n }\n }\n }\n\n operation(op: OPERATION) {\n // operations without index use negative values to represent them\n // this is checked during .encode() time.\n if (this.filteredChanges !== undefined) {\n this.filteredChanges.operations.push(-op);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n this.changes.operations.push(-op);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n change(index: number, operation: OPERATION = OPERATION.ADD) {\n const isFiltered = this.isFiltered || (this.metadata?.[index]?.tag !== undefined);\n const changeSet = (isFiltered)\n ? this.filteredChanges\n : this.changes;\n\n const previousOperation = this.indexedOperations[index];\n if (!previousOperation || previousOperation === OPERATION.DELETE) {\n const op = (!previousOperation)\n ? operation\n : (previousOperation === OPERATION.DELETE)\n ? OPERATION.DELETE_AND_ADD\n : operation\n //\n // TODO: are DELETE operations being encoded as ADD here ??\n //\n this.indexedOperations[index] = op;\n }\n\n setOperationAtIndex(changeSet, index);\n\n if (isFiltered) {\n setOperationAtIndex(this.allFilteredChanges, index);\n\n if (this.root) {\n this.root.enqueueChangeTree(this, 'filteredChanges');\n this.root.enqueueChangeTree(this, 'allFilteredChanges');\n }\n\n } else {\n setOperationAtIndex(this.allChanges, index);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n shiftChangeIndexes(shiftIndex: number) {\n //\n // Used only during:\n //\n // - ArraySchema#unshift()\n //\n const changeSet = (this.isFiltered)\n ? this.filteredChanges\n : this.changes;\n\n const newIndexedOperations: any = {};\n const newIndexes: { [index: number]: number } = {};\n for (const index in this.indexedOperations) {\n newIndexedOperations[Number(index) + shiftIndex] = this.indexedOperations[index];\n newIndexes[Number(index) + shiftIndex] = changeSet.indexes[index];\n }\n this.indexedOperations = newIndexedOperations;\n changeSet.indexes = newIndexes;\n\n changeSet.operations = changeSet.operations.map((index) => index + shiftIndex);\n }\n\n shiftAllChangeIndexes(shiftIndex: number, startIndex: number = 0) {\n //\n // Used only during:\n //\n // - ArraySchema#splice()\n //\n if (this.filteredChanges !== undefined) {\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allFilteredChanges);\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allChanges);\n\n } else {\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allChanges);\n }\n }\n\n private _shiftAllChangeIndexes(shiftIndex: number, startIndex: number = 0, changeSet: ChangeSet) {\n const newIndexes: { [index: number]: number } = {};\n let newKey = 0;\n for (const key in changeSet.indexes) {\n newIndexes[newKey++] = changeSet.indexes[key];\n }\n changeSet.indexes = newIndexes;\n\n for (let i = 0; i < changeSet.operations.length; i++) {\n const index = changeSet.operations[i];\n if (index > startIndex) {\n changeSet.operations[i] = index + shiftIndex;\n }\n }\n }\n\n indexedOperation(index: number, operation: OPERATION, allChangesIndex: number = index) {\n this.indexedOperations[index] = operation;\n\n if (this.filteredChanges !== undefined) {\n setOperationAtIndex(this.allFilteredChanges, allChangesIndex);\n setOperationAtIndex(this.filteredChanges, index);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n setOperationAtIndex(this.allChanges, allChangesIndex);\n setOperationAtIndex(this.changes, index);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n getType(index?: number) {\n return (\n //\n // Get the child type from parent structure.\n // - [\"string\"] => \"string\"\n // - { map: \"string\" } => \"string\"\n // - { set: \"string\" } => \"string\"\n //\n (this.ref as any)[$childType] || // ArraySchema | MapSchema | SetSchema | CollectionSchema\n this.metadata[index].type // Schema\n );\n }\n\n getChange(index: number) {\n return this.indexedOperations[index];\n }\n\n //\n // used during `.encode()`\n //\n getValue(index: number, isEncodeAll: boolean = false) {\n //\n // `isEncodeAll` param is only used by ArraySchema\n //\n return (this.ref as any)[$getByIndex](index, isEncodeAll);\n }\n\n delete(index: number, operation?: OPERATION, allChangesIndex = index) {\n if (index === undefined) {\n try {\n throw new Error(`@colyseus/schema ${this.ref.constructor.name}: trying to delete non-existing index '${index}'`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n const changeSet = (this.filteredChanges !== undefined)\n ? this.filteredChanges\n : this.changes;\n\n this.indexedOperations[index] = operation ?? OPERATION.DELETE;\n setOperationAtIndex(changeSet, index);\n deleteOperationAtIndex(this.allChanges, allChangesIndex);\n\n const previousValue = this.getValue(index);\n\n // remove `root` reference\n if (previousValue && previousValue[$changes]) {\n //\n // FIXME: this.root is \"undefined\"\n //\n // This method is being called at decoding time when a DELETE operation is found.\n //\n // - This is due to using the concrete Schema class at decoding time.\n // - \"Reflected\" structures do not have this problem.\n //\n // (The property descriptors should NOT be used at decoding time. only at encoding time.)\n //\n this.root?.remove(previousValue[$changes]);\n }\n\n //\n // FIXME: this is looking a ugly and repeated\n //\n if (this.filteredChanges !== undefined) {\n deleteOperationAtIndex(this.allFilteredChanges, allChangesIndex);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n this.root?.enqueueChangeTree(this, 'changes');\n }\n\n return previousValue;\n }\n\n endEncode(changeSetName: ChangeSetName) {\n this.indexedOperations = {};\n\n // clear changeset\n this[changeSetName] = createChangeSet();\n\n // ArraySchema and MapSchema have a custom \"encode end\" method\n (this.ref as any)[$onEncodeEnd]?.();\n\n // Not a new instance anymore\n this.isNew = false;\n }\n\n discard(discardAll: boolean = false) {\n //\n // > MapSchema:\n // Remove cached key to ensure ADD operations is unsed instead of\n // REPLACE in case same key is used on next patches.\n //\n (this.ref as any)[$onEncodeEnd]?.();\n\n this.indexedOperations = {};\n this.changes = createChangeSet(this.changes.queueRootNode);\n\n if (this.filteredChanges !== undefined) {\n this.filteredChanges = createChangeSet(this.filteredChanges.queueRootNode);\n }\n\n if (discardAll) {\n // preserve queueRootNode references\n this.allChanges = createChangeSet(this.allChanges.queueRootNode);\n\n if (this.allFilteredChanges !== undefined) {\n this.allFilteredChanges = createChangeSet(this.allFilteredChanges.queueRootNode);\n }\n }\n }\n\n /**\n * Recursively discard all changes from this, and child structures.\n * (Used in tests only)\n */\n discardAll() {\n const keys = Object.keys(this.indexedOperations);\n for (let i = 0, len = keys.length; i < len; i++) {\n const value = this.getValue(Number(keys[i]));\n\n if (value && value[$changes]) {\n value[$changes].discardAll();\n }\n }\n\n this.discard();\n }\n\n get changed() {\n return (Object.entries(this.indexedOperations).length > 0);\n }\n\n protected checkIsFiltered(parent: Ref, parentIndex: number, isNewChangeTree: boolean) {\n if (this.root.types.hasFilters) {\n //\n // At Schema initialization, the \"root\" structure might not be available\n // yet, as it only does once the \"Encoder\" has been set up.\n //\n // So the \"parent\" may be already set without a \"root\".\n //\n this._checkFilteredByParent(parent, parentIndex);\n\n if (this.filteredChanges !== undefined) {\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n if (isNewChangeTree) {\n this.root?.enqueueChangeTree(this, 'allFilteredChanges');\n }\n }\n }\n\n if (!this.isFiltered) {\n this.root?.enqueueChangeTree(this, 'changes');\n\n if (isNewChangeTree) {\n this.root?.enqueueChangeTree(this, 'allChanges');\n }\n }\n }\n\n protected _checkFilteredByParent(parent: Ref, parentIndex: number) {\n // skip if parent is not set\n if (!parent) { return; }\n\n //\n // ArraySchema | MapSchema - get the child type\n // (if refType is typeof string, the parentFiltered[key] below will always be invalid)\n //\n const refType = Metadata.isValidInstance(this.ref)\n ? this.ref.constructor\n : (this.ref as any)[$childType];\n\n let parentChangeTree: ChangeTree;\n\n let parentIsCollection = !Metadata.isValidInstance(parent);\n if (parentIsCollection) {\n parentChangeTree = parent[$changes];\n parent = parentChangeTree.parent;\n parentIndex = parentChangeTree.parentIndex;\n\n } else {\n parentChangeTree = parent[$changes]\n }\n\n const parentConstructor = parent.constructor as typeof Schema;\n\n let key = `${this.root.types.getTypeId(refType as typeof Schema)}`;\n if (parentConstructor) {\n key += `-${this.root.types.schemas.get(parentConstructor)}`;\n }\n key += `-${parentIndex}`;\n\n const fieldHasViewTag = Metadata.hasViewTagAtIndex(parentConstructor?.[Symbol.metadata], parentIndex);\n\n this.isFiltered = parent[$changes].isFiltered // in case parent is already filtered\n || this.root.types.parentFiltered[key]\n || fieldHasViewTag;\n\n //\n // \"isFiltered\" may not be imedialely available during `change()` due to the instance not being attached to the root yet.\n // when it's available, we need to enqueue the \"changes\" changeset into the \"filteredChanges\" changeset.\n //\n if (this.isFiltered) {\n\n this.isVisibilitySharedWithParent = (\n parentChangeTree.isFiltered &&\n typeof (refType) !== \"string\" &&\n !fieldHasViewTag &&\n parentIsCollection\n );\n\n if (!this.filteredChanges) {\n this.filteredChanges = createChangeSet();\n this.allFilteredChanges = createChangeSet();\n }\n\n if (this.changes.operations.length > 0) {\n this.changes.operations.forEach((index) =>\n setOperationAtIndex(this.filteredChanges, index));\n\n this.allChanges.operations.forEach((index) =>\n setOperationAtIndex(this.allFilteredChanges, index));\n\n this.changes = createChangeSet();\n this.allChanges = createChangeSet();\n }\n }\n }\n\n /**\n * Get the immediate parent\n */\n get parent(): Ref | undefined {\n return this.parentChain?.ref;\n }\n\n /**\n * Get the immediate parent index\n */\n get parentIndex(): number | undefined {\n return this.parentChain?.index;\n }\n\n /**\n * Add a parent to the chain\n */\n addParent(parent: Ref, index: number) {\n // Check if this parent already exists in the chain\n if (this.hasParent((p, _) => p[$changes] === parent[$changes])) {\n // if (this.hasParent((p, i) => p[$changes] === parent[$changes] && i === index)) {\n this.parentChain.index = index;\n return;\n }\n\n this.parentChain = {\n ref: parent,\n index,\n next: this.parentChain\n };\n }\n\n /**\n * Remove a parent from the chain\n * @param parent - The parent to remove\n * @returns true if parent was removed\n */\n removeParent(parent: Ref = this.parent): boolean {\n let current = this.parentChain;\n let previous = null;\n while (current) {\n //\n // FIXME: it is required to check against `$changes` here because\n // ArraySchema is instance of Proxy\n //\n if (current.ref[$changes] === parent[$changes]) {\n if (previous) {\n previous.next = current.next;\n } else {\n this.parentChain = current.next;\n }\n return true;\n }\n previous = current;\n current = current.next;\n }\n return this.parentChain === undefined;\n }\n\n /**\n * Find a specific parent in the chain\n */\n findParent(predicate: (parent: Ref, index: number) => boolean): ParentChain | undefined {\n let current = this.parentChain;\n while (current) {\n if (predicate(current.ref, current.index)) {\n return current;\n }\n current = current.next;\n }\n return undefined;\n }\n\n /**\n * Check if this ChangeTree has a specific parent\n */\n hasParent(predicate: (parent: Ref, index: number) => boolean): boolean {\n return this.findParent(predicate) !== undefined;\n }\n\n /**\n * Get all parents as an array (for debugging/testing)\n */\n getAllParents(): Array<{ ref: Ref, index: number }> {\n const parents: Array<{ ref: Ref, index: number }> = [];\n let current = this.parentChain;\n while (current) {\n parents.push({ ref: current.ref, index: current.index });\n current = current.next;\n }\n return parents;\n }\n\n}\n","import { OPERATION } from \"../encoding/spec\";\nimport { $changes, $childType, $getByIndex } from \"../types/symbols\";\n\nimport { encode } from \"../encoding/encode\";\n\nimport type { ChangeTree, Ref } from \"./ChangeTree\";\nimport type { Encoder } from \"./Encoder\";\nimport type { Schema } from \"../Schema\";\n\nimport type { Iterator } from \"../encoding/decode\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { Metadata } from \"../Metadata\";\n\nexport type EncodeOperation<T extends Ref = any> = (\n encoder: Encoder,\n bytes: Buffer,\n changeTree: ChangeTree<T>,\n index: number,\n operation: OPERATION,\n it: Iterator,\n isEncodeAll: boolean,\n hasView: boolean,\n metadata?: Metadata,\n) => void;\n\nexport function encodeValue(\n encoder: Encoder,\n bytes: Buffer,\n type: any,\n value: any,\n operation: OPERATION,\n it: Iterator,\n) {\n if (typeof (type) === \"string\") {\n (encode as any)[type]?.(bytes, value, it);\n\n } else if (type[Symbol.metadata] !== undefined) {\n //\n // Encode refId for this instance.\n // The actual instance is going to be encoded on next `changeTree` iteration.\n //\n encode.number(bytes, value[$changes].refId, it);\n\n // Try to encode inherited TYPE_ID if it's an ADD operation.\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n encoder.tryEncodeTypeId(bytes, type as typeof Schema, value.constructor as typeof Schema, it);\n }\n\n } else {\n //\n // Encode refId for this instance.\n // The actual instance is going to be encoded on next `changeTree` iteration.\n //\n encode.number(bytes, value[$changes].refId, it);\n }\n}\n\n/**\n * Used for Schema instances.\n * @private\n */\nexport const encodeSchemaOperation: EncodeOperation = function <T extends Schema> (\n encoder: Encoder,\n bytes: Buffer,\n changeTree: ChangeTree<T>,\n index: number,\n operation: OPERATION,\n it: Iterator,\n _: any,\n __: any,\n metadata: Metadata,\n) {\n // \"compress\" field index + operation\n bytes[it.offset++] = (index | operation) & 255;\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE) {\n return;\n }\n\n const ref = changeTree.ref;\n const field = metadata[index];\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n metadata[index].type,\n ref[field.name as keyof T],\n operation,\n it\n );\n}\n\n/**\n * Used for collections (MapSchema, CollectionSchema, SetSchema)\n * @private\n */\nexport const encodeKeyValueOperation: EncodeOperation = function (\n encoder: Encoder,\n bytes: Buffer,\n changeTree: ChangeTree,\n index: number,\n operation: OPERATION,\n it: Iterator,\n) {\n // encode operation\n bytes[it.offset++] = operation & 255;\n\n // encode index\n encode.number(bytes, index, it);\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE) {\n return;\n }\n\n const ref = changeTree.ref;\n\n //\n // encode \"alias\" for dynamic fields (maps)\n //\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof(ref['set']) === \"function\") {\n //\n // MapSchema dynamic key\n //\n const dynamicIndex = changeTree.ref['$indexes'].get(index);\n encode.string(bytes, dynamicIndex, it);\n }\n }\n\n const type = ref[$childType];\n const value = ref[$getByIndex](index);\n\n // try { throw new Error(); } catch (e) {\n // // only print if not coming from Reflection.ts\n // if (!e.stack.includes(\"src/Reflection.ts\")) {\n // console.log(\"encodeKeyValueOperation -> \", {\n // ref: changeTree.ref.constructor.name,\n // field,\n // operation: OPERATION[operation],\n // value: value?.toJSON(),\n // items: ref.toJSON(),\n // });\n // }\n // }\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n type,\n value,\n operation,\n it\n );\n}\n\n/**\n * Used for collections (MapSchema, ArraySchema, etc.)\n * @private\n */\nexport const encodeArray: EncodeOperation = function (\n encoder: Encoder,\n bytes: Buffer,\n changeTree: ChangeTree<ArraySchema>,\n field: number,\n operation: OPERATION,\n it: Iterator,\n isEncodeAll: boolean,\n hasView: boolean,\n) {\n const ref = changeTree.ref;\n const useOperationByRefId = hasView && changeTree.isFiltered && (typeof (changeTree.getType(field)) !== \"string\");\n\n let refOrIndex: number;\n\n if (useOperationByRefId) {\n const item = ref['tmpItems'][field];\n\n // Skip encoding if item is undefined (e.g. when clear() is called)\n if (!item) { return; }\n\n refOrIndex = item[$changes].refId;\n\n if (operation === OPERATION.DELETE) {\n operation = OPERATION.DELETE_BY_REFID;\n\n } else if (operation === OPERATION.ADD) {\n operation = OPERATION.ADD_BY_REFID;\n }\n\n } else {\n refOrIndex = field;\n }\n\n // encode operation\n bytes[it.offset++] = operation & 255;\n\n // encode index\n encode.number(bytes, refOrIndex, it);\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE || operation === OPERATION.DELETE_BY_REFID) {\n return;\n }\n\n const type = changeTree.getType(field);\n const value = changeTree.getValue(field, isEncodeAll);\n\n // console.log({ type, field, value });\n\n // console.log(\"encodeArray -> \", {\n // ref: changeTree.ref.constructor.name,\n // field,\n // operation: OPERATION[operation],\n // value: value?.toJSON(),\n // items: ref.toJSON(),\n // });\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n type,\n value,\n operation,\n it\n );\n}","import { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Decoder } from \"./Decoder\";\nimport { Iterator, decode } from \"../encoding/decode\";\nimport { $childType, $deleteByIndex, $getByIndex } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\n\nimport { getType } from \"../types/registry\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport interface DataChange<T = any, F = string> {\n ref: Ref,\n refId: number,\n op: OPERATION,\n field: F;\n dynamicIndex?: number | string;\n value: T;\n previousValue: T;\n}\n\nexport const DEFINITION_MISMATCH = -1;\n\nexport type DecodeOperation<T extends Schema = any> = (\n decoder: Decoder<T>,\n bytes: Buffer,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) => number | void;\n\nexport function decodeValue<T extends Ref>(\n decoder: Decoder,\n operation: OPERATION,\n ref: T,\n index: number,\n type: any,\n bytes: Buffer,\n it: Iterator,\n allChanges: DataChange[],\n) {\n const $root = decoder.root;\n const previousValue = (ref as any)[$getByIndex](index) as T;\n\n let value: any;\n\n if ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n {\n // Flag `refId` for garbage collection.\n const previousRefId = $root.refIds.get(previousValue);\n if (previousRefId !== undefined) { $root.removeRef(previousRefId); }\n\n //\n // Delete operations\n //\n if (operation !== OPERATION.DELETE_AND_ADD) {\n (ref as any)[$deleteByIndex](index);\n }\n\n value = undefined;\n }\n\n if (operation === OPERATION.DELETE) {\n //\n // Don't do anything\n //\n\n } else if (Schema.is(type)) {\n const refId = decode.number(bytes, it);\n value = $root.refs.get(refId);\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n const childType = decoder.getInstanceType(bytes, it, type);\n if (!value) {\n value = decoder.createInstanceOfType(childType);\n }\n\n $root.addRef(\n refId,\n value,\n (\n value !== previousValue || // increment ref count if value has changed\n (operation === OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again\n )\n );\n }\n\n } else if (typeof(type) === \"string\") {\n //\n // primitive value (number, string, boolean, etc)\n //\n value = (decode as any)[type](bytes, it);\n\n } else {\n const typeDef = getType(Object.keys(type)[0]);\n const refId = decode.number(bytes, it);\n\n const valueRef: Ref = ($root.refs.has(refId))\n ? previousValue || $root.refs.get(refId)\n : new typeDef.constructor();\n\n value = valueRef.clone(true);\n value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema\n\n if (previousValue) {\n let previousRefId = $root.refIds.get(previousValue);\n\n if (previousRefId !== undefined && refId !== previousRefId) {\n //\n // enqueue onRemove if structure has been replaced.\n //\n const entries: IterableIterator<[any, any]> = (previousValue as any).entries();\n let iter: IteratorResult<[any, any]>;\n while ((iter = entries.next()) && !iter.done) {\n const [key, value] = iter.value;\n\n // if value is a schema, remove its reference\n if (typeof(value) === \"object\") {\n previousRefId = $root.refIds.get(value);\n $root.removeRef(previousRefId);\n }\n\n allChanges.push({\n ref: previousValue,\n refId: previousRefId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value,\n });\n }\n\n }\n }\n\n $root.addRef(refId, value, (\n valueRef !== previousValue ||\n (operation === OPERATION.DELETE_AND_ADD && valueRef === previousValue)\n ));\n }\n\n return { value, previousValue };\n}\n\nexport const decodeSchemaOperation: DecodeOperation = function <T extends Schema>(\n decoder: Decoder<any>,\n bytes: Buffer,\n it: Iterator,\n ref: T,\n allChanges: DataChange[],\n) {\n const first_byte = bytes[it.offset++];\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n\n // \"compressed\" index + operation\n const operation = (first_byte >> 6) << 6\n const index = first_byte % (operation || 255);\n\n // skip early if field is not defined\n const field = metadata[index];\n if (field === undefined) {\n console.warn(\"@colyseus/schema: field not defined at\", { index, ref: ref.constructor.name, metadata });\n return DEFINITION_MISMATCH;\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n field.type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n ref[field.name as keyof T] = value;\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: field.name,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeKeyValueOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n const operation = bytes[it.offset++];\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n\n (ref as any).clear();\n return;\n }\n\n const index = decode.number(bytes, it);\n const type = (ref as any)[$childType];\n\n let dynamicIndex: number | string;\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof((ref as any)['set']) === \"function\") {\n dynamicIndex = decode.string(bytes, it); // MapSchema\n (ref as any)['setIndex'](index, dynamicIndex);\n } else {\n dynamicIndex = index; // ArraySchema\n }\n } else {\n // get dynamic index from \"ref\"\n dynamicIndex = (ref as any)['getIndex'](index);\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n if (typeof((ref as any)['set']) === \"function\") {\n // MapSchema\n (ref as any)['$items'].set(dynamicIndex as string, value);\n\n } else if (typeof((ref as any)['$setAt']) === \"function\") {\n // ArraySchema\n (ref as any)['$setAt'](index, value, operation);\n\n } else if (typeof((ref as any)['add']) === \"function\") {\n // CollectionSchema && SetSchema\n const index = (ref as any).add(value);\n\n if (typeof(index) === \"number\") {\n (ref as any)['setIndex'](index, index);\n }\n }\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeArray: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Buffer,\n it: Iterator,\n ref: ArraySchema,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n let operation = bytes[it.offset++];\n let index: number;\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n (ref as ArraySchema).clear();\n return;\n\n } else if (operation === OPERATION.REVERSE) {\n (ref as ArraySchema).reverse();\n return;\n\n } else if (operation === OPERATION.DELETE_BY_REFID) {\n // TODO: refactor here, try to follow same flow as below\n const refId = decode.number(bytes, it);\n const previousValue = decoder.root.refs.get(refId);\n index = ref.findIndex((value) => value === previousValue);\n ref[$deleteByIndex](index);\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: OPERATION.DELETE,\n field: \"\", // FIXME: remove this\n dynamicIndex: index,\n value: undefined,\n previousValue,\n });\n\n return;\n\n } else if (operation === OPERATION.ADD_BY_REFID) {\n const refId = decode.number(bytes, it);\n const itemByRefId = decoder.root.refs.get(refId);\n\n // if item already exists, use existing index\n if (itemByRefId) {\n index = ref.findIndex((value) => value === itemByRefId);\n }\n\n // fallback to use last index\n if (index === -1 || index === undefined) {\n index = ref.length;\n }\n\n } else {\n index = decode.number(bytes, it);\n }\n\n const type = ref[$childType];\n\n let dynamicIndex: number | string = index;\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (\n value !== null && value !== undefined &&\n value !== previousValue // avoid setting same value twice (if index === 0 it will result in a \"unshift\" for ArraySchema)\n ) {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}","import type { Schema } from \"../Schema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { SetSchema } from \"../types/custom/SetSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\n\nexport class EncodeSchemaError extends Error {}\n\nexport function assertType(value: any, type: string, klass: Schema, field: string | number) {\n let typeofTarget: string;\n let allowNull: boolean = false;\n\n switch (type) {\n case \"number\":\n case \"int8\":\n case \"uint8\":\n case \"int16\":\n case \"uint16\":\n case \"int32\":\n case \"uint32\":\n case \"int64\":\n case \"uint64\":\n case \"float32\":\n case \"float64\":\n typeofTarget = \"number\";\n if (isNaN(value)) {\n console.log(`trying to encode \"NaN\" in ${klass.constructor.name}#${field}`);\n }\n break;\n case \"bigint64\":\n case \"biguint64\":\n typeofTarget = \"bigint\";\n break;\n case \"string\":\n typeofTarget = \"string\";\n allowNull = true;\n break;\n case \"boolean\":\n // boolean is always encoded as true/false based on truthiness\n return;\n default:\n // skip assertion for custom types\n // TODO: allow custom types to define their own assertions\n return;\n }\n\n if (typeof (value) !== typeofTarget && (!allowNull || (allowNull && value !== null))) {\n let foundValue = `'${JSON.stringify(value)}'${(value && value.constructor && ` (${value.constructor.name})`) || ''}`;\n throw new EncodeSchemaError(`a '${typeofTarget}' was expected, but ${foundValue} was provided in ${klass.constructor.name}#${field}`);\n }\n}\n\nexport function assertInstanceType(\n value: Ref,\n type: typeof Schema\n | typeof ArraySchema\n | typeof MapSchema\n | typeof CollectionSchema\n | typeof SetSchema,\n instance: Ref,\n field: string | number,\n) {\n if (!(value instanceof type)) {\n throw new EncodeSchemaError(`a '${type.name}' was expected, but '${value && (value as any).constructor.name}' was provided in ${instance.constructor.name}#${field}`);\n }\n}","import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $onDecodeEnd } from \"../symbols\";\nimport type { Schema } from \"../../Schema\";\nimport { type IRef, ChangeTree, setOperationAtIndex } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\n\nimport { encodeArray } from \"../../encoder/EncodeOperation\";\nimport { decodeArray } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nconst DEFAULT_SORT = (a: any, b: any) => {\n const A = a.toString();\n const B = b.toString();\n if (A < B) return -1;\n else if (A > B) return 1;\n else return 0\n}\n\nexport class ArraySchema<V = any> implements Array<V>, Collection<number, V>, IRef {\n [n: number]: V;\n [$changes]: ChangeTree;\n\n protected [$childType]: string | typeof Schema;\n\n protected items: V[] = [];\n protected tmpItems: V[] = [];\n protected deletedIndexes: {[index: number]: boolean} = {};\n protected isMovingItems = false;\n\n static [$encoder] = encodeArray;\n static [$decoder] = decodeArray;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: ArraySchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible(ref['tmpItems'][index]?.[$changes])\n );\n }\n\n static is(type: any) {\n return (\n // type format: [\"string\"]\n Array.isArray(type) ||\n\n // type format: { array: \"string\" }\n (type['array'] !== undefined)\n );\n }\n\n static from<T>(iterable: Iterable<T> | ArrayLike<T>) {\n return new ArraySchema<T>(...Array.from(iterable));\n }\n\n constructor (...items: V[]) {\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n\n const proxy = new Proxy(this, {\n get: (obj, prop) => {\n if (\n typeof (prop) !== \"symbol\" &&\n // FIXME: d8 accuses this as low performance\n !isNaN(prop as any) // https://stackoverflow.com/a/175787/892698\n ) {\n return this.items[prop as unknown as number];\n\n } else {\n return Reflect.get(obj, prop);\n }\n },\n\n set: (obj, key, setValue) => {\n if (typeof (key) !== \"symbol\" && !isNaN(key as any)) {\n if (setValue === undefined || setValue === null) {\n obj.$deleteAt(key as unknown as number);\n\n } else {\n if (setValue[$changes]) {\n assertInstanceType(setValue, obj[$childType] as typeof Schema, obj, key);\n\n const previousValue = obj.items[key as unknown as number];\n\n if (!obj.isMovingItems) {\n obj.$changeAt(Number(key), setValue);\n\n } else {\n if (previousValue !== undefined) {\n if (setValue[$changes].isNew) {\n obj[$changes].indexedOperation(Number(key), OPERATION.MOVE_AND_ADD);\n\n } else {\n if ((obj[$changes].getChange(Number(key)) & OPERATION.DELETE) === OPERATION.DELETE) {\n obj[$changes].indexedOperation(Number(key), OPERATION.DELETE_AND_MOVE);\n\n } else {\n obj[$changes].indexedOperation(Number(key), OPERATION.MOVE);\n }\n }\n\n } else if (setValue[$changes].isNew) {\n obj[$changes].indexedOperation(Number(key), OPERATION.ADD);\n }\n\n setValue[$changes].setParent(this, obj[$changes].root, key);\n }\n\n if (previousValue !== undefined) {\n // remove root reference from previous value\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n\n } else {\n obj.$changeAt(Number(key), setValue);\n }\n\n obj.items[key as unknown as number] = setValue;\n obj.tmpItems[key as unknown as number] = setValue;\n }\n\n return true;\n } else {\n return Reflect.set(obj, key, setValue);\n }\n },\n\n deleteProperty: (obj, prop) => {\n if (typeof (prop) === \"number\") {\n obj.$deleteAt(prop);\n\n } else {\n delete obj[prop as unknown as number];\n }\n\n return true;\n },\n\n has: (obj, key) => {\n if (typeof (key) !== \"symbol\" && !isNaN(Number(key))) {\n return Reflect.has(this.items, key);\n }\n return Reflect.has(obj, key)\n }\n });\n\n Object.defineProperty(this, $changes, {\n value: new ChangeTree(proxy),\n enumerable: false,\n writable: true,\n });\n\n if (items.length > 0) {\n this.push(...items);\n }\n\n return proxy;\n }\n\n set length (newLength: number) {\n if (newLength === 0) {\n this.clear();\n } else if (newLength < this.items.length) {\n this.splice(newLength, this.length - newLength);\n } else {\n console.warn(\"ArraySchema: can't set .length to a higher value than its length.\");\n }\n }\n\n get length() {\n return this.items.length;\n }\n\n push(...values: V[]) {\n let length = this.tmpItems.length;\n\n const changeTree = this[$changes];\n\n for (let i = 0, l = values.length; i < l; i++, length++) {\n const value = values[i];\n\n if (value === undefined || value === null) {\n // skip null values\n return;\n\n } else if (typeof (value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, i);\n // TODO: move value[$changes]?.setParent() to this block.\n }\n\n changeTree.indexedOperation(length, OPERATION.ADD, this.items.length);\n\n this.items.push(value);\n this.tmpItems.push(value);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n value[$changes]?.setParent(this, changeTree.root, length);\n }\n\n return length;\n }\n\n /**\n * Removes the last element from an array and returns it.\n */\n pop(): V | undefined {\n let index: number = -1;\n\n // find last non-undefined index\n for (let i = this.tmpItems.length - 1; i >= 0; i--) {\n // if (this.tmpItems[i] !== undefined) {\n if (this.deletedIndexes[i] !== true) {\n index = i;\n break;\n }\n }\n\n if (index < 0) {\n return undefined;\n }\n\n this[$changes].delete(index, undefined, this.items.length - 1);\n\n this.deletedIndexes[index] = true;\n\n return this.items.pop();\n }\n\n at(index: number) {\n // Allow negative indexing from the end\n if (index < 0) index += this.length;\n return this.items[index];\n }\n\n // encoding only\n protected $changeAt(index: number, value: V) {\n if (value === undefined || value === null) {\n console.error(\"ArraySchema items cannot be null nor undefined; Use `deleteAt(index)` instead.\");\n return;\n }\n\n // skip if the value is the same as cached.\n if (this.items[index] === value) {\n return;\n }\n\n const operation = (this.items[index] !== undefined)\n ? typeof(value) === \"object\"\n ? OPERATION.DELETE_AND_ADD // schema child\n : OPERATION.REPLACE // primitive\n : OPERATION.ADD;\n\n const changeTree = this[$changes];\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n value[$changes]?.setParent(this, changeTree.root, index);\n }\n\n // encoding only\n protected $deleteAt(index: number, operation?: OPERATION) {\n this[$changes].delete(index, operation);\n }\n\n // decoding only\n protected $setAt(index: number, value: V, operation: OPERATION) {\n if (\n index === 0 &&\n operation === OPERATION.ADD &&\n this.items[index] !== undefined\n ) {\n // handle decoding unshift\n this.items.unshift(value);\n\n } else if (operation === OPERATION.DELETE_AND_MOVE) {\n this.items.splice(index, 1);\n this.items[index] = value;\n\n } else {\n this.items[index] = value;\n }\n }\n\n clear() {\n // skip if already clear\n if (this.items.length === 0) {\n return;\n }\n\n // discard previous operations.\n const changeTree = this[$changes];\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n changeTree.discard(true);\n changeTree.operation(OPERATION.CLEAR);\n\n this.items.length = 0;\n this.tmpItems.length = 0;\n }\n\n /**\n * Combines two or more arrays.\n * @param items Additional items to add to the end of array1.\n */\n // @ts-ignore\n concat(...items: (V | ConcatArray<V>)[]): ArraySchema<V> {\n return new ArraySchema(...this.items.concat(...items));\n }\n\n /**\n * Adds all the elements of an array separated by the specified separator string.\n * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n */\n join(separator?: string): string {\n return this.items.join(separator);\n }\n\n /**\n * Reverses the elements in an Array.\n */\n // @ts-ignore\n reverse(): ArraySchema<V> {\n this[$changes].operation(OPERATION.REVERSE);\n this.items.reverse();\n this.tmpItems.reverse();\n return this;\n }\n\n /**\n * Removes the first element from an array and returns it.\n */\n shift(): V | undefined {\n if (this.items.length === 0) { return undefined; }\n\n const changeTree = this[$changes];\n\n const index = this.tmpItems.findIndex(item => item === this.items[0]);\n const allChangesIndex = this.items.findIndex(item => item === this.items[0]);\n\n changeTree.delete(index, OPERATION.DELETE, allChangesIndex);\n changeTree.shiftAllChangeIndexes(-1, allChangesIndex);\n\n this.deletedIndexes[index] = true;\n\n return this.items.shift();\n }\n\n /**\n * Returns a section of an array.\n * @param start The beginning of the specified portion of the array.\n * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n */\n slice(start?: number, end?: number): V[] {\n const sliced = new ArraySchema<V>();\n sliced.push(...this.items.slice(start, end));\n return sliced as unknown as V[];\n }\n\n /**\n * Sorts an array.\n * @param compareFn Function used to determine the order of the elements. It is expected to return\n * a negative value if first argument is less than second argument, zero if they're equal and a positive\n * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.\n * ```ts\n * [11,2,22,1].sort((a, b) => a - b)\n * ```\n */\n sort(compareFn: (a: V, b: V) => number = DEFAULT_SORT): this {\n this.isMovingItems = true;\n\n const changeTree = this[$changes];\n const sortedItems = this.items.sort(compareFn);\n\n // wouldn't OPERATION.MOVE make more sense here?\n sortedItems.forEach((_, i) => changeTree.change(i, OPERATION.REPLACE));\n\n this.tmpItems.sort(compareFn);\n\n this.isMovingItems = false;\n return this;\n }\n\n /**\n * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @param insertItems Elements to insert into the array in place of the deleted elements.\n */\n splice(\n start: number,\n deleteCount?: number,\n ...insertItems: V[]\n ): V[] {\n const changeTree = this[$changes];\n\n const itemsLength = this.items.length;\n const tmpItemsLength = this.tmpItems.length;\n const insertCount = insertItems.length;\n\n // build up-to-date list of indexes, excluding removed values.\n const indexes: number[] = [];\n for (let i = 0; i < tmpItemsLength; i++) {\n if (this.deletedIndexes[i] !== true) {\n indexes.push(i);\n }\n }\n\n if (itemsLength > start) {\n // if deleteCount is not provided, delete all items from start to end\n if (deleteCount === undefined) {\n deleteCount = itemsLength - start;\n }\n\n //\n // delete operations at correct index\n //\n for (let i = start; i < start + deleteCount; i++) {\n const index = indexes[i];\n changeTree.delete(index, OPERATION.DELETE);\n this.deletedIndexes[index] = true;\n }\n\n } else {\n // not enough items to delete\n deleteCount = 0;\n }\n\n // insert operations\n if (insertCount > 0) {\n if (insertCount > deleteCount) {\n console.error(\"Inserting more elements than deleting during ArraySchema#splice()\");\n throw new Error(\"ArraySchema#splice(): insertCount must be equal or lower than deleteCount.\");\n }\n\n for (let i = 0; i < insertCount; i++) {\n const addIndex = (indexes[start] ?? itemsLength) + i;\n\n changeTree.indexedOperation(\n addIndex,\n (this.deletedIndexes[addIndex])\n ? OPERATION.DELETE_AND_ADD\n : OPERATION.ADD\n );\n\n // set value's parent/root\n insertItems[i][$changes]?.setParent(this, changeTree.root, addIndex);\n }\n }\n\n //\n // delete exceeding indexes from \"allChanges\"\n // (prevent .encodeAll() from encoding non-existing items)\n //\n if (deleteCount > insertCount) {\n changeTree.shiftAllChangeIndexes(-(deleteCount - insertCount), indexes[start + insertCount]);\n // debugChangeSet(\"AFTER SHIFT indexes\", changeTree.allChanges);\n }\n\n //\n // FIXME: this code block is duplicated on ChangeTree\n //\n if (changeTree.filteredChanges !== undefined) {\n changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');\n\n } else {\n changeTree.root?.enqueueChangeTree(changeTree, 'changes');\n }\n\n return this.items.splice(start, deleteCount, ...insertItems);\n }\n\n /**\n * Inserts new elements at the start of an array.\n * @param items Elements to insert at the start of the Array.\n */\n unshift(...items: V[]): number {\n const changeTree = this[$changes];\n\n // shift indexes\n changeTree.shiftChangeIndexes(items.length);\n\n // new index\n if (changeTree.isFiltered) {\n setOperationAtIndex(changeTree.filteredChanges, this.items.length);\n // changeTree.filteredChanges[this.items.length] = OPERATION.ADD;\n } else {\n setOperationAtIndex(changeTree.allChanges, this.items.length);\n // changeTree.allChanges[this.items.length] = OPERATION.ADD;\n }\n\n // FIXME: should we use OPERATION.MOVE here instead?\n items.forEach((_, index) => {\n changeTree.change(index, OPERATION.ADD)\n });\n\n this.tmpItems.unshift(...items);\n\n return this.items.unshift(...items);\n }\n\n /**\n * Returns the index of the first occurrence of a value in an array.\n * @param searchElement The value to locate in the array.\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n */\n indexOf(searchElement: V, fromIndex?: number): number {\n return this.items.indexOf(searchElement, fromIndex);\n }\n\n /**\n * Returns the index of the last occurrence of a specified value in an array.\n * @param searchElement The value to locate in the array.\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n */\n lastIndexOf(searchElement: V, fromIndex: number = this.length - 1): number {\n return this.items.lastIndexOf(searchElement, fromIndex);\n }\n\n /**\n * Determines whether all the members of an array satisfy the specified test.\n * @param callbackfn A function that accepts up to three arguments. The every method calls\n * the callbackfn function for each element in the array until the callbackfn returns a value\n * which is coercible to the Boolean value false, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n * If thisArg is omitted, undefined is used as the this value.\n */\n every<S extends V>(predicate: (value: V, index: number, array: V[]) => value is S, thisArg?: any): this is S[];\n every(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean;\n every(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean {\n return this.items.every(callbackfn, thisArg);\n }\n\n /**\n * Determines whether the specified callback function returns true for any element of an array.\n * @param callbackfn A function that accepts up to three arguments. The some method calls\n * the callbackfn function for each element in the array until the callbackfn returns a value\n * which is coercible to the Boolean value true, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n * If thisArg is omitted, undefined is used as the this value.\n */\n some(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean {\n return this.items.some(callbackfn, thisArg);\n }\n\n /**\n * Performs the specified action for each element in an array.\n * @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n forEach(callbackfn: (value: V, index: number, array: V[]) => void, thisArg?: any): void {\n return this.items.forEach(callbackfn, thisArg);\n }\n\n /**\n * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n map<U>(callbackfn: (value: V, index: number, array: V[]) => U, thisArg?: any): U[] {\n return this.items.map(callbackfn, thisArg);\n }\n\n /**\n * Returns the elements of an array that meet the condition specified in a callback function.\n * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n filter(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): V[]\n filter<S extends V>(callbackfn: (value: V, index: number, array: V[]) => value is S, thisArg?: any): V[] {\n return this.items.filter(callbackfn, thisArg);\n }\n\n /**\n * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n */\n reduce<U=V>(callbackfn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue?: U): U {\n return this.items.reduce(callbackfn, initialValue);\n }\n\n /**\n * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n */\n reduceRight<U=V>(callbackfn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue?: U): U {\n return this.items.reduceRight(callbackfn, initialValue);\n }\n\n /**\n * Returns the value of the first element in the array where predicate is true, and undefined\n * otherwise.\n * @param predicate find calls predicate once for each element of the array, in ascending\n * order, until it finds one where predicate returns true. If such an element is found, find\n * immediately returns that element value. Otherwise, find returns undefined.\n * @param thisArg If provided, it will be used as the this value for each invocation of\n * predicate. If it is not provided, undefined is used instead.\n */\n find(predicate: (value: V, index: number, obj: V[]) => boolean, thisArg?: any): V | undefined {\n return this.items.find(predicate, thisArg);\n }\n\n /**\n * Returns the index of the first element in the array where predicate is true, and -1\n * otherwise.\n * @param predicate find calls predicate once for each element of the array, in ascending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n * @param thisArg If provided, it will be used as the this value for each invocation of\n * predicate. If it is not provided, undefined is used instead.\n */\n findIndex(predicate: (value: V, index: number, obj: V[]) => unknown, thisArg?: any): number {\n return this.items.findIndex(predicate, thisArg);\n }\n\n /**\n * Returns the this object after filling the section identified by start and end with value\n * @param value value to fill array section with\n * @param start index to start filling the array at. If start is negative, it is treated as\n * length+start where length is the length of the array.\n * @param end index to stop filling the array at. If end is negative, it is treated as\n * length+end.\n */\n fill(value: V, start?: number, end?: number): this {\n //\n // TODO\n //\n throw new Error(\"ArraySchema#fill() not implemented\");\n // this.$items.fill(value, start, end);\n\n return this;\n }\n\n /**\n * Returns the this object after copying a section of the array identified by start and end\n * to the same array starting at position target\n * @param target If target is negative, it is treated as length+target where length is the\n * length of the array.\n * @param start If start is negative, it is treated as length+start. If end is negative, it\n * is treated as length+end.\n * @param end If not specified, length of the this object is used as its default value.\n */\n copyWithin(target: number, start: number, end?: number): this {\n //\n // TODO\n //\n throw new Error(\"ArraySchema#copyWithin() not implemented\");\n return this;\n }\n\n /**\n * Returns a string representation of an array.\n */\n toString(): string {\n return this.items.toString();\n }\n\n /**\n * Returns a string representation of an array. The elements are converted to string using their toLocalString methods.\n */\n toLocaleString(): string {\n return this.items.toLocaleString()\n };\n\n /** Iterator */\n [Symbol.iterator](): ArrayIterator<V> {\n return this.items[Symbol.iterator]();\n }\n\n static get [Symbol.species]() {\n return ArraySchema;\n }\n\n // WORKAROUND for compatibility\n // - TypeScript 4 defines @@unscopables as a function\n // - TypeScript 5 defines @@unscopables as an object\n [Symbol.unscopables]: any;\n\n /**\n * Returns an iterable of key, value pairs for every entry in the array\n */\n entries(): ArrayIterator<[number, V]> { return this.items.entries(); }\n\n /**\n * Returns an iterable of keys in the array\n */\n keys(): ArrayIterator<number> { return this.items.keys(); }\n\n /**\n * Returns an iterable of values in the array\n */\n values(): ArrayIterator<V> { return this.items.values(); }\n\n /**\n * Determines whether an array includes a certain element, returning true or false as appropriate.\n * @param searchElement The element to search for.\n * @param fromIndex The position in this array at which to begin searching for searchElement.\n */\n includes(searchElement: V, fromIndex?: number): boolean {\n return this.items.includes(searchElement, fromIndex);\n }\n\n //\n // ES2022\n //\n\n /**\n * Calls a defined callback function on each element of an array. Then, flattens the result into\n * a new array.\n * This is identical to a map followed by flat with depth 1.\n *\n * @param callback A function that accepts up to three arguments. The flatMap method calls the\n * callback function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callback function. If\n * thisArg is omitted, undefined is used as the this value.\n */\n // @ts-ignore\n flatMap<U, This = undefined>(callback: (this: This, value: V, index: number, array: V[]) => U | ReadonlyArray<U>, thisArg?: This): U[] {\n // @ts-ignore\n throw new Error(\"ArraySchema#flatMap() is not supported.\");\n }\n\n /**\n * Returns a new array with all sub-array elements concatenated into it recursively up to the\n * specified depth.\n *\n * @param depth The maximum recursion depth\n */\n // @ts-ignore\n flat<A, D extends number = 1>(this: A, depth?: D): any {\n throw new Error(\"ArraySchema#flat() is not supported.\");\n }\n\n findLast() {\n // @ts-ignore\n return this.items.findLast.apply(this.items, arguments);\n }\n\n findLastIndex(...args: any[]) {\n // @ts-ignore\n return this.items.findLastIndex.apply(this.items, arguments);\n }\n\n //\n // ES2023\n //\n with(index: number, value: V): ArraySchema<V> {\n const copy = this.items.slice();\n // Allow negative indexing from the end\n if (index < 0) index += this.length;\n copy[index] = value;\n return new ArraySchema(...copy);\n }\n toReversed(): V[] {\n return this.items.slice().reverse();\n }\n toSorted(compareFn?: (a: V, b: V) => number): V[] {\n return this.items.slice().sort(compareFn);\n }\n toSpliced(start: number, deleteCount: number, ...items: V[]): V[];\n toSpliced(start: number, deleteCount?: number): V[];\n // @ts-ignore\n toSpliced(start: unknown, deleteCount?: unknown, ...items?: unknown[]): V[] {\n // @ts-ignore\n return this.items.toSpliced.apply(copy, arguments);\n }\n\n shuffle() {\n return this.move((_) => {\n let currentIndex = this.items.length;\n while (currentIndex != 0) {\n let randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [this[currentIndex], this[randomIndex]] = [this[randomIndex], this[currentIndex]];\n }\n });\n }\n\n /**\n * Allows to move items around in the array.\n *\n * Example:\n * state.cards.move((cards) => {\n * [cards[4], cards[3]] = [cards[3], cards[4]];\n * [cards[3], cards[2]] = [cards[2], cards[3]];\n * [cards[2], cards[0]] = [cards[0], cards[2]];\n * [cards[1], cards[1]] = [cards[1], cards[1]];\n * [cards[0], cards[0]] = [cards[0], cards[0]];\n * })\n *\n * @param cb\n * @returns\n */\n move(cb: (arr: this) => void) {\n this.isMovingItems = true;\n cb(this);\n this.isMovingItems = false;\n return this;\n }\n\n [$getByIndex](index: number, isEncodeAll: boolean = false): any {\n //\n // TODO: avoid unecessary `this.tmpItems` check during decoding.\n //\n // ENCODING uses `this.tmpItems` (or `this.items` if `isEncodeAll` is true)\n // DECODING uses `this.items`\n //\n\n return (isEncodeAll)\n ? this.items[index]\n : this.deletedIndexes[index]\n ? this.items[index]\n : this.tmpItems[index] || this.items[index];\n }\n\n [$deleteByIndex](index: number): void {\n this.items[index] = undefined;\n this.tmpItems[index] = undefined; // TODO: do not try to get \"tmpItems\" at decoding time.\n }\n\n protected [$onEncodeEnd]() {\n this.tmpItems = this.items.slice();\n this.deletedIndexes = {};\n }\n\n protected [$onDecodeEnd]() {\n this.items = this.items.filter((item) => item !== undefined);\n this.tmpItems = this.items.slice(); // TODO: do no use \"tmpItems\" at decoding time.\n }\n\n toArray() {\n return this.items.slice(0);\n }\n\n toJSON() {\n return this.toArray().map((value: any) => {\n return (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): ArraySchema<V> {\n let cloned: ArraySchema;\n\n if (isDecoding) {\n cloned = new ArraySchema();\n cloned.push(...this.items);\n\n } else {\n cloned = new ArraySchema(...this.map(item => (\n (item[$changes])\n ? (item as any as Schema).clone()\n : item\n )));\n }\n\n return cloned;\n };\n\n}\n\nregisterType(\"array\", { constructor: ArraySchema });\n","import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $numFields } from \"../symbols\";\nimport { ChangeTree, IRef } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nexport class MapSchema<V=any, K extends string = string> implements Map<K, V>, Collection<K, V, [K, V]>, IRef {\n protected childType: new () => V;\n [$changes]: ChangeTree;\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<K, V> = new Map<K, V>();\n protected $indexes: Map<number, K> = new Map<number, K>();\n protected deletedItems: { [index: string]: V } = {};\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: MapSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<K, V> | Record<K, V>) {\n const changeTree = new ChangeTree(this);\n changeTree.indexes = {};\n\n Object.defineProperty(this, $changes, {\n value: changeTree,\n enumerable: false,\n writable: true,\n });\n\n if (initialValues) {\n if (\n initialValues instanceof Map ||\n initialValues instanceof MapSchema\n ) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[K, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n static get [Symbol.species]() { return MapSchema; }\n\n set(key: K, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n\n } else if (typeof(value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, key);\n }\n\n // Force \"key\" as string\n // See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468\n key = key.toString() as K;\n\n const changeTree = this[$changes];\n const isRef = (value[$changes]) !== undefined;\n\n let index: number;\n let operation: OPERATION;\n\n // IS REPLACE?\n if (typeof(changeTree.indexes[key]) !== \"undefined\") {\n index = changeTree.indexes[key];\n operation = OPERATION.REPLACE;\n\n const previousValue = this.$items.get(key);\n if (previousValue === value) {\n // if value is the same, avoid re-encoding it.\n return;\n\n } else if (isRef) {\n // if is schema, force ADD operation if value differ from previous one.\n operation = OPERATION.DELETE_AND_ADD;\n\n // remove reference from previous value\n if (previousValue !== undefined) {\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n }\n\n if (this.deletedItems[index]) {\n delete this.deletedItems[index];\n }\n\n } else {\n index = changeTree.indexes[$numFields] ?? 0;\n operation = OPERATION.ADD;\n\n this.$indexes.set(index, key);\n changeTree.indexes[key] = index;\n changeTree.indexes[$numFields] = index + 1;\n }\n\n this.$items.set(key, value);\n\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n if (isRef) {\n value[$changes].setParent(this, changeTree.root, index);\n }\n\n return this;\n }\n\n get(key: K): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: K) {\n if (!this.$items.has(key)) {\n return false;\n }\n\n const index = this[$changes].indexes[key];\n\n this.deletedItems[index] = this[$changes].delete(index);\n\n return this.$items.delete(key);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (key: K) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: K) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): V | undefined {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n const changeTree = this[$changes];\n\n // - cleanup changeTree.indexes\n // - cleanup $indexes\n for (const indexStr in this.deletedItems) {\n const index = parseInt(indexStr);\n const key = this.$indexes.get(index);\n // TODO: refactor this.\n // it shouldn't be necessary to keep track of indexes both on changeTree and on $indexes\n delete changeTree.indexes[key];\n this.$indexes.delete(index);\n }\n\n this.deletedItems = {};\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value: any, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n // @ts-ignore\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema<V>;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n\n this.forEach((value: any, key) => {\n if (value[$changes]) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"map\", { constructor: MapSchema });\n","import { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd } from \"../symbols\";\nimport { ChangeTree, type IRef } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\n\ntype K = number; // TODO: allow to specify K generic on MapSchema.\n\nexport class CollectionSchema<V=any> implements Collection<K, V>, IRef {\n public [$changes]: ChangeTree;\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: CollectionSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['collection'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // set \"index\" for reference.\n const index = this.$refId++;\n\n const isRef = (value[$changes]) !== undefined;\n if (isRef) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index);\n\n return index;\n }\n\n at(index: number): V | undefined {\n const key = Array.from(this.$items.keys())[index];\n return this.$items.get(key);\n }\n\n entries() {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: K;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (value: V): boolean {\n return Array.from(this.$items.values()).some((v) => v === value);\n }\n\n forEach(callbackfn: (value: V, key: K, collection: CollectionSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): any {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value: any, key: K) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): CollectionSchema<V> {\n let cloned: CollectionSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new CollectionSchema(), this);\n\n } else {\n // server-side\n cloned = new CollectionSchema();\n this.forEach((value: any) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"collection\", { constructor: CollectionSchema, });\n","import { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd } from \"../symbols\";\nimport { Collection } from \"../HelperTypes\";\nimport { ChangeTree, type IRef } from \"../../encoder/ChangeTree\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\n\nexport class SetSchema<V=any> implements Collection<number, V>, IRef {\n [$changes]: ChangeTree;\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: SetSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.visible.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value[$changes]) !== undefined) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n const operation = this[$changes].indexes[index]?.op ?? OPERATION.ADD;\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): any {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value: any, key: number) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value: any) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"set\", { constructor: SetSchema });","import \"./symbol.shim\";\nimport { Schema } from './Schema';\nimport { ArraySchema } from './types/custom/ArraySchema';\nimport { MapSchema } from './types/custom/MapSchema';\nimport { getNormalizedType, Metadata } from \"./Metadata\";\nimport { $changes, $childType, $descriptors, $numFields, $track } from \"./types/symbols\";\nimport { TypeDefinition, getType } from \"./types/registry\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { assertInstanceType, assertType } from \"./encoding/assert\";\nimport type { InferValueType, InferSchemaInstanceType, AssignableProps, IsNever } from \"./types/HelperTypes\";\nimport { CollectionSchema } from \"./types/custom/CollectionSchema\";\nimport { SetSchema } from \"./types/custom/SetSchema\";\n\nexport type RawPrimitiveType = \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n \"bigint64\" |\n \"biguint64\";\n\nexport type PrimitiveType = RawPrimitiveType | typeof Schema | object;\n\n// TODO: infer \"default\" value type correctly.\nexport type DefinitionType<T extends PrimitiveType = PrimitiveType> = T\n | T[]\n | { type: T, default?: InferValueType<T>, view?: boolean | number }\n | { array: T, default?: ArraySchema<InferValueType<T>>, view?: boolean | number }\n | { map: T, default?: MapSchema<InferValueType<T>>, view?: boolean | number }\n | { collection: T, default?: CollectionSchema<InferValueType<T>>, view?: boolean | number }\n | { set: T, default?: SetSchema<InferValueType<T>>, view?: boolean | number };\n\nexport type Definition = { [field: string]: DefinitionType };\n\nexport interface TypeOptions {\n manual?: boolean,\n}\n\nexport const DEFAULT_VIEW_TAG = -1;\n\nexport function entity(constructor: any): any {\n TypeContext.register(constructor as typeof Schema);\n return constructor;\n}\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\n// export function type(type: DefinitionType, options?: TypeOptions) {\n// return function ({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<Schema, any> {\n// if (context.kind !== \"accessor\") {\n// throw new Error(\"@type() is only supported for class accessor properties\");\n// }\n\n// const field = context.name.toString();\n\n// //\n// // detect index for this field, considering inheritance\n// //\n// const parent = Object.getPrototypeOf(context.metadata);\n// let fieldIndex: number = context.metadata[$numFields] // current structure already has fields defined\n// ?? (parent && parent[$numFields]) // parent structure has fields defined\n// ?? -1; // no fields defined\n// fieldIndex++;\n\n// if (\n// !parent && // the parent already initializes the `$changes` property\n// !Metadata.hasFields(context.metadata)\n// ) {\n// context.addInitializer(function (this: Ref) {\n// Object.defineProperty(this, $changes, {\n// value: new ChangeTree(this),\n// enumerable: false,\n// writable: true\n// });\n// });\n// }\n\n// Metadata.addField(context.metadata, fieldIndex, field, type);\n\n// const isArray = ArraySchema.is(type);\n// const isMap = !isArray && MapSchema.is(type);\n\n// // if (options && options.manual) {\n// // // do not declare getter/setter descriptor\n// // definition.descriptors[field] = {\n// // enumerable: true,\n// // configurable: true,\n// // writable: true,\n// // };\n// // return;\n// // }\n\n// return {\n// init(value) {\n// // TODO: may need to convert ArraySchema/MapSchema here\n\n// // do not flag change if value is undefined.\n// if (value !== undefined) {\n// this[$changes].change(fieldIndex);\n\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// }\n\n// return value;\n// },\n\n// get() {\n// return get.call(this);\n// },\n\n// set(value: any) {\n// /**\n// * Create Proxy for array or map items\n// */\n\n// // skip if value is the same as cached.\n// if (value === get.call(this)) {\n// return;\n// }\n\n// if (\n// value !== undefined &&\n// value !== null\n// ) {\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// // flag the change for encoding.\n// this[$changes].change(fieldIndex);\n\n// //\n// // call setParent() recursively for this and its child\n// // structures.\n// //\n// if (value[$changes]) {\n// value[$changes].setParent(\n// this,\n// this[$changes].root,\n// Metadata.getIndex(context.metadata, field),\n// );\n// }\n\n// } else if (get.call(this)) {\n// //\n// // Setting a field to `null` or `undefined` will delete it.\n// //\n// this[$changes].delete(field);\n// }\n\n// set.call(this, value);\n// },\n// };\n// }\n// }\n\nexport function view<T> (tag: number = DEFAULT_VIEW_TAG) {\n return function(target: T, fieldName: string) {\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n // const fieldIndex = metadata[fieldName];\n\n // if (!metadata[fieldIndex]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[fieldIndex] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n Metadata.setTag(metadata, fieldName, tag);\n }\n}\n\nexport function unreliable<T> (target: T, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n // add owned flag to the field\n metadata[metadata[field]].unreliable = true;\n}\n\nexport function type (\n type: DefinitionType,\n options?: TypeOptions\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n // Normalize type (enum/collection/etc)\n type = getNormalizedType(type);\n\n // for inheritance support\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n let fieldIndex: number = metadata[field];\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (metadata[fieldIndex] !== undefined) {\n if (metadata[fieldIndex].deprecated) {\n // do not create accessors for deprecated properties.\n return;\n\n } else if (metadata[fieldIndex].type !== undefined) {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n }\n\n } else {\n //\n // detect index for this field, considering inheritance\n //\n fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n fieldIndex++;\n }\n\n if (options && options.manual) {\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n {\n // do not declare getter/setter descriptor\n enumerable: true,\n configurable: true,\n writable: true,\n }\n );\n\n } else {\n const complexTypeKlass = typeof(Object.keys(type)[0]) === \"string\" && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n }\n }\n}\n\nexport function getPropertyDescriptor(\n fieldCached: string,\n fieldIndex: number,\n type: DefinitionType,\n complexTypeKlass: TypeDefinition,\n) {\n return {\n get: function (this: Schema) { return this[fieldCached as keyof Schema]; },\n set: function (this: Schema, value: any) {\n const previousValue = this[fieldCached as keyof Schema] ?? undefined;\n\n // skip if value is the same as cached.\n if (value === previousValue) { return; }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n if (complexTypeKlass) {\n // automaticallty transform Array into ArraySchema\n if (complexTypeKlass.constructor === ArraySchema && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (complexTypeKlass.constructor === MapSchema && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n // // automaticallty transform Array into SetSchema\n // if (complexTypeKlass.constructor === SetSchema && !(value instanceof SetSchema)) {\n // value = new SetSchema(value);\n // }\n\n value[$childType] = type;\n\n } else if (typeof (type) !== \"string\") {\n assertInstanceType(value, type as typeof Schema, this, fieldCached.substring(1));\n\n } else {\n assertType(value, type, this, fieldCached.substring(1));\n }\n\n const changeTree = this[$changes];\n\n //\n // Replacing existing \"ref\", remove it from root.\n //\n if (previousValue !== undefined && previousValue[$changes]) {\n changeTree.root?.remove(previousValue[$changes]);\n (this.constructor as typeof Schema)[$track](changeTree, fieldIndex, OPERATION.DELETE_AND_ADD);\n\n } else {\n (this.constructor as typeof Schema)[$track](changeTree, fieldIndex, OPERATION.ADD);\n }\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n value[$changes]?.setParent(this, changeTree.root, fieldIndex);\n\n } else if (previousValue !== undefined) {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this[$changes].delete(fieldIndex);\n }\n\n this[fieldCached as keyof Schema] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n}\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (klass: typeof Schema, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = klass.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n const fieldIndex = metadata[field];\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n metadata[fieldIndex].deprecated = true;\n\n if (throws) {\n metadata[$descriptors] ??= {};\n metadata[$descriptors][field] = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n\n // flag metadata[field] as non-enumerable\n Object.defineProperty(metadata, fieldIndex, {\n value: metadata[fieldIndex],\n enumerable: false,\n configurable: true\n });\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: Definition,\n options?: TypeOptions\n) {\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n\n// Helper type to extract InitProps from initialize method\n// Supports both single object parameter and multiple parameters\n// If no initialize method is specified, use AssignableProps for field initialization\ntype ExtractInitProps<T> = T extends { initialize: (...args: infer P) => void }\n ? P extends readonly []\n ? never\n : P extends readonly [infer First]\n ? First extends object\n ? First\n : P\n : P\n : T extends Definition\n ? AssignableProps<InferSchemaInstanceType<T>>\n : never;\n\n// Helper type to determine if InitProps should be required\ntype IsInitPropsRequired<T> = T extends { initialize: (props: any) => void }\n ? true\n : T extends { initialize: (...args: infer P) => void }\n ? P extends readonly []\n ? false\n : true\n : false;\n\nexport interface SchemaWithExtends<T extends Definition, P extends typeof Schema, > {\n extends: <T2 extends Definition = Definition>(\n fields: T2 & ThisType<InferSchemaInstanceType<T & T2>>,\n name?: string\n ) => SchemaWithExtendsConstructor<T & T2, ExtractInitProps<T2>, P>;\n}\n\n/**\n * Get the type of the schema defined via `schema({...})` method.\n *\n * @example\n * const Entity = schema({\n * x: \"number\",\n * y: \"number\",\n * });\n * type Entity = SchemaType<typeof Entity>;\n */\nexport type SchemaType<T extends {'~type': any}> = T['~type'];\n\nexport interface SchemaWithExtendsConstructor<\n T extends Definition,\n InitProps,\n P extends typeof Schema\n> extends SchemaWithExtends<T, P> {\n '~type': InferSchemaInstanceType<T>;\n new (...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : IsInitPropsRequired<T> extends true ? [InitProps] : [InitProps?]): InferSchemaInstanceType<T> & InstanceType<P>;\n prototype: InferSchemaInstanceType<T> & InstanceType<P> & {\n initialize(...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : [InitProps]): void;\n };\n}\n\nexport function schema<\n T extends Record<string, DefinitionType>,\n P extends typeof Schema = typeof Schema\n>(\n fieldsAndMethods: T & ThisType<InferSchemaInstanceType<T>>,\n name?: string,\n inherits: P = Schema as P\n): SchemaWithExtendsConstructor<T, ExtractInitProps<T>, P> {\n const fields: any = {};\n const methods: any = {};\n\n const defaultValues: any = {};\n const viewTagFields: any = {};\n\n for (let fieldName in fieldsAndMethods) {\n const value: any = fieldsAndMethods[fieldName] as DefinitionType;\n if (typeof (value) === \"object\") {\n if (value['view'] !== undefined) {\n viewTagFields[fieldName] = (typeof (value['view']) === \"boolean\")\n ? DEFAULT_VIEW_TAG\n : value['view'];\n }\n\n fields[fieldName] = getNormalizedType(value);\n\n // If no explicit default provided, handle automatic instantiation for collection types\n if (!Object.prototype.hasOwnProperty.call(value, 'default')) {\n // TODO: remove Array.isArray() check. Use ['array'] !== undefined only.\n if (Array.isArray(value) || value['array'] !== undefined) {\n // Collection: Array → new ArraySchema()\n defaultValues[fieldName] = new ArraySchema();\n\n } else if (value['map'] !== undefined) {\n // Collection: Map → new MapSchema()\n defaultValues[fieldName] = new MapSchema();\n\n } else if (value['collection'] !== undefined) {\n // Collection: Collection → new CollectionSchema()\n defaultValues[fieldName] = new CollectionSchema();\n\n } else if (value['set'] !== undefined) {\n // Collection: Set → new SetSchema()\n defaultValues[fieldName] = new SetSchema();\n\n } else if (value['type'] !== undefined && Schema.is(value['type'])) {\n // Direct Schema type: Type → new Type()\n if (!value['type'].prototype.initialize || value['type'].prototype.initialize.length === 0) {\n // only auto-initialize Schema instances if:\n // - they don't have an initialize method\n // - or initialize method doesn't accept any parameters\n defaultValues[fieldName] = new value['type']();\n }\n }\n } else {\n defaultValues[fieldName] = value['default'];\n }\n\n\n } else if (typeof (value) === \"function\") {\n if (Schema.is(value)) {\n // Direct Schema type: Type → new Type()\n if (!value.prototype.initialize || value.prototype.initialize.length === 0) {\n // only auto-initialize Schema instances if:\n // - they don't have an initialize method\n // - or initialize method doesn't accept any parameters\n defaultValues[fieldName] = new value();\n }\n fields[fieldName] = getNormalizedType(value);\n } else {\n methods[fieldName] = value;\n }\n\n } else {\n fields[fieldName] = getNormalizedType(value);\n }\n }\n\n const getDefaultValues = () => {\n const defaults: any = {};\n\n // use current class default values\n for (const fieldName in defaultValues) {\n const defaultValue = defaultValues[fieldName];\n if (defaultValue && typeof defaultValue.clone === 'function') {\n // complex, cloneable values, e.g. Schema, ArraySchema, MapSchema, CollectionSchema, SetSchema\n defaults[fieldName] = defaultValue.clone();\n } else {\n // primitives and non-cloneable values\n defaults[fieldName] = defaultValue;\n }\n }\n return defaults;\n };\n\n const getParentProps = (props: any) => {\n const fieldNames = Object.keys(fields);\n const parentProps: any = {};\n for (const key in props) {\n if (!fieldNames.includes(key)) {\n parentProps[key] = props[key];\n }\n }\n return parentProps;\n }\n\n /** @codegen-ignore */\n const klass = Metadata.setFields<any>(class extends (inherits as any) {\n constructor(...args: any[]) {\n // call initialize method\n if (methods.initialize && typeof methods.initialize === 'function') {\n super(Object.assign({}, getDefaultValues(), getParentProps(args[0] || {})));\n /**\n * only call initialize() in the current class, not the parent ones.\n * see \"should not call initialize automatically when creating an instance of inherited Schema\"\n */\n if (new.target === klass) {\n methods.initialize.apply(this, args);\n }\n\n } else {\n super(Object.assign({}, getDefaultValues(), args[0] || {}));\n }\n }\n }, fields) as SchemaWithExtendsConstructor<T, ExtractInitProps<T>, P>;\n\n // Store the getDefaultValues function on the class for inheritance\n (klass as any)._getDefaultValues = getDefaultValues;\n\n // Add methods to the prototype\n Object.assign(klass.prototype, methods);\n\n for (let fieldName in viewTagFields) {\n view(viewTagFields[fieldName])(klass.prototype, fieldName);\n }\n\n if (name) {\n Object.defineProperty(klass, \"name\", { value: name });\n }\n\n klass.extends = <T2 extends Definition = Definition>(fields: T2, name?: string) =>\n schema<T2>(fields, name, klass as any) as SchemaWithExtendsConstructor<T & T2, ExtractInitProps<T2>, P>;\n\n return klass;\n}\n","import type { Schema } from \"./Schema\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { $changes } from \"./types/symbols\";\n\ninterface ChangeDump {\n ops: {\n ADD?: number;\n REMOVE?: number;\n REPLACE?: number;\n },\n refs: string[],\n}\n\nexport function getIndent(level: number) {\n return (new Array(level).fill(0)).map((_, i) =>\n (i === level - 1) ? `└─ ` : ` `\n ).join(\"\");\n}\n\nexport function dumpChanges(schema: Schema) {\n const $root = schema[$changes].root;\n\n const dump: ChangeDump = {\n ops: {},\n refs: []\n };\n\n // for (const refId in $root.changes) {\n let current = $root.changes.next;\n while (current) {\n const changeTree = current.changeTree;\n // skip if ChangeTree is undefined\n if (changeTree === undefined) {\n current = current.next;\n continue;\n }\n\n const changes = changeTree.indexedOperations;\n\n dump.refs.push(`refId#${changeTree.refId}`);\n for (const index in changes) {\n const op = changes[index];\n const opName = OPERATION[op];\n if (!dump.ops[opName as keyof ChangeDump['ops']]) { dump.ops[opName as keyof ChangeDump['ops']] = 0; }\n dump.ops[OPERATION[op] as keyof ChangeDump['ops']]++;\n }\n current = current.next;\n }\n\n return dump;\n}\n\nexport function getNextPowerOf2(number: number) {\n // If number is already a power of 2, return it\n if ((number & (number - 1)) === 0) {\n return number;\n }\n\n // Find the position of the most significant bit\n let msbPosition = 0;\n while (number > 0) {\n number >>= 1;\n msbPosition++;\n }\n\n // Return the next power of 2\n return 1 << msbPosition;\n}","import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\n\nimport type { Decoder } from './decoder/Decoder';\nimport type { Metadata, MetadataField } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema<C = any> implements IRef {\n static [Symbol.metadata]: Metadata;\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n /**\n * Assign the property descriptors required to track changes on this instance.\n * @param instance\n */\n static initialize(instance: any) {\n Object.defineProperty(instance, $changes, {\n value: new ChangeTree(instance),\n enumerable: false,\n writable: true\n });\n\n Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[$descriptors] || {});\n }\n\n static is(type: DefinitionType) {\n return typeof((type as typeof Schema)[Symbol.metadata]) === \"object\";\n }\n\n /**\n * Track property changes\n */\n static [$track] (changeTree: ChangeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n changeTree.change(index, operation);\n }\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: Schema, index: number, view: StateView) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n const tag = metadata[index]?.tag;\n\n if (view === undefined) {\n // shared pass/encode: encode if doesn't have a tag\n return tag === undefined;\n\n } else if (tag === undefined) {\n // view pass: no tag\n return true;\n\n } else if (tag === DEFAULT_VIEW_TAG) {\n // view pass: default tag\n return view.isChangeTreeVisible(ref[$changes]);\n\n } else {\n // view pass: custom tag\n const tags = view.tags?.get(ref[$changes]);\n return tags && tags.has(tag);\n }\n }\n\n // allow inherited classes to have a constructor\n constructor(arg?: C) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (arg) {\n Object.assign(this, arg);\n }\n }\n\n public assign<T extends Partial<this>>(\n props: AssignableProps<T>,\n ): this {\n Object.assign(this, props);\n return this;\n }\n\n /**\n * (Server-side): Flag a property to be encoded for the next patch.\n * @param instance Schema instance\n * @param property string representing the property name, or number representing the index of the property.\n * @param operation OPERATION to perform (detected automatically)\n */\n public setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION) {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n // Create instance without calling custom constructor\n const cloned = Object.create(this.constructor.prototype);\n Schema.initialize(cloned);\n\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // TODO: clone all properties, not only annotated ones\n //\n // for (const field in this) {\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number].name as keyof this;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof ((this[field] as any)?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = (this[field] as any).clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON (this: any): ToJSON<this> {\n const obj: any = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index] as MetadataField;\n const fieldName = field.name;\n if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== \"undefined\") {\n obj[fieldName] = (typeof (this[fieldName]['toJSON']) === \"function\")\n ? this[fieldName]['toJSON']()\n : this[fieldName];\n }\n }\n return obj;\n }\n\n /**\n * Used in tests only\n * @internal\n */\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n [$getByIndex](index: number): any {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n return this[metadata[index].name as keyof this];\n }\n\n [$deleteByIndex](index: number): void {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[metadata[index].name as keyof this] = undefined;\n }\n\n /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param ref Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds<T extends Schema>(ref: T, showContents: boolean = false, level: number = 0, decoder?: Decoder, keyPrefix: string = \"\") {\n const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n const changeTree: ChangeTree = ref[$changes];\n\n const refId = (decoder) ? decoder.root.refIds.get(ref) : changeTree.refId;\n const root = (decoder) ? decoder.root : changeTree.root;\n\n // log reference count if > 1\n const refCount = (root?.refCount?.[refId] > 1)\n ? ` [×${root.refCount[refId]}]`\n : '';\n\n let output = `${getIndent(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree, indexOrKey) => {\n let key = indexOrKey;\n if (typeof indexOrKey === 'number' && (ref as any)['$indexes']) {\n // MapSchema\n key = (ref as any)['$indexes'].get(indexOrKey) ?? indexOrKey;\n }\n const keyPrefix = ((ref as any)['forEach'] !== undefined && key !== undefined) ? `[\"${key}\"]: ` : \"\";\n output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);\n });\n\n return output;\n }\n\n static debugRefIdEncodingOrder<T extends Ref>(ref: T, changeSet: ChangeSetName = 'allChanges') {\n let encodeOrder: number[] = [];\n let current = ref[$changes].root[changeSet].next;\n while (current) {\n if (current.changeTree) {\n encodeOrder.push(current.changeTree.refId);\n }\n current = current.next;\n }\n return encodeOrder;\n }\n\n static debugRefIdsFromDecoder(decoder: Decoder) {\n return this.debugRefIds(decoder.state, false, 0, decoder);\n }\n\n /**\n * Return a string representation of the changes on a Schema instance.\n * The list of changes is cleared after each encode.\n *\n * @param instance Schema instance\n * @param isEncodeAll Return \"full encode\" instead of current change set.\n * @returns\n */\n static debugChanges<T extends Ref>(instance: T, isEncodeAll: boolean = false) {\n const changeTree: ChangeTree = instance[$changes];\n\n const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;\n const changeSetName = (isEncodeAll) ? \"allChanges\" : \"changes\";\n\n let output = `${instance.constructor.name} (${changeTree.refId}) -> .${changeSetName}:\\n`;\n\n function dumpChangeSet(changeSet: ChangeSet) {\n changeSet.operations\n .filter(op => op)\n .forEach((index) => {\n const operation = changeTree.indexedOperations[index];\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\\n`\n });\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (\n !isEncodeAll &&\n changeTree.filteredChanges &&\n (changeTree.filteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${changeTree.refId}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (\n isEncodeAll &&\n changeTree.allFilteredChanges &&\n (changeTree.allFilteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${changeTree.refId}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep<T extends Schema>(ref: T, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree: ChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n const instanceRefIds = [];\n let totalOperations = 0;\n\n // TODO: FIXME: this method is not working as expected\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId as any as number];\n if (!changeTree) { continue; }\n\n let includeChangeTree = false;\n let parentChangeTrees: ChangeTree[] = [];\n let parentChangeTree = changeTree.parent?.[$changes];\n\n if (changeTree === rootChangeTree) {\n includeChangeTree = true;\n\n } else {\n while (parentChangeTree !== undefined) {\n parentChangeTrees.push(parentChangeTree);\n if (parentChangeTree.ref === ref) {\n includeChangeTree = true;\n break;\n }\n parentChangeTree = parentChangeTree.parent?.[$changes];\n }\n }\n\n if (includeChangeTree) {\n instanceRefIds.push(changeTree.refId);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.refId}\\n`;\n output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(\", \")})\\n`;\n output += `Total changes: ${totalOperations}\\n`;\n output += \"---\\n\"\n\n // based on root.changes, display a tree of changes that has the \"ref\" instance as parent\n const visitedParents = new WeakSet<ChangeTree>();\n for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {\n parentChangeTrees.forEach((parentChangeTree, level) => {\n if (!visitedParents.has(parentChangeTree)) {\n output += `${getIndent(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.refId})\\n`;\n visitedParents.add(parentChangeTree);\n }\n });\n\n const changes = changeTree.indexedOperations;\n const level = parentChangeTrees.length;\n const indent = getIndent(level);\n\n const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : \"\";\n output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.refId}) - changes: ${Object.keys(changes).length}\\n`;\n\n for (const index in changes) {\n const operation = changes[index];\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\n }\n }\n\n return `${output}`;\n }\n\n\n}\n\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { OPERATION } from \"../encoding/spec\";\nimport { TypeContext } from \"../types/TypeContext\";\nimport { ChangeTree, setOperationAtIndex, ChangeTreeList, createChangeTreeList, ChangeSetName, type ChangeTreeNode } from \"./ChangeTree\";\nimport { $changes } from \"../types/symbols\";\n\nexport class Root {\n protected nextUniqueId: number = 0;\n\n refCount: {[id: number]: number} = {};\n changeTrees: {[refId: number]: ChangeTree} = {};\n\n // all changes\n allChanges: ChangeTreeList = createChangeTreeList();\n allFilteredChanges: ChangeTreeList = createChangeTreeList();// TODO: do not initialize it if filters are not used\n\n // pending changes to be encoded\n changes: ChangeTreeList = createChangeTreeList();\n filteredChanges: ChangeTreeList = createChangeTreeList();// TODO: do not initialize it if filters are not used\n\n constructor(public types: TypeContext) { }\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n add(changeTree: ChangeTree) {\n // Assign unique `refId` to changeTree if it doesn't have one yet.\n if (changeTree.refId === undefined) {\n changeTree.refId = this.getNextUniqueId();\n }\n\n const isNewChangeTree = (this.changeTrees[changeTree.refId] === undefined);\n if (isNewChangeTree) { this.changeTrees[changeTree.refId] = changeTree; }\n\n const previousRefCount = this.refCount[changeTree.refId];\n if (previousRefCount === 0) {\n //\n // When a ChangeTree is re-added, it means that it was previously removed.\n // We need to re-add all changes to the `changes` map.\n //\n const ops = changeTree.allChanges.operations;\n let len = ops.length;\n while (len--) {\n changeTree.indexedOperations[ops[len]] = OPERATION.ADD;\n setOperationAtIndex(changeTree.changes, len);\n }\n }\n\n this.refCount[changeTree.refId] = (previousRefCount || 0) + 1;\n\n // console.log(\"ADD\", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount: this.refCount[changeTree.refId], isNewChangeTree });\n\n return isNewChangeTree;\n }\n\n remove(changeTree: ChangeTree) {\n const refCount = (this.refCount[changeTree.refId]) - 1;\n\n // console.log(\"REMOVE\", { refId: changeTree.refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });\n\n if (refCount <= 0) {\n //\n // Only remove \"root\" reference if it's the last reference\n //\n changeTree.root = undefined;\n delete this.changeTrees[changeTree.refId];\n\n this.removeChangeFromChangeSet(\"allChanges\", changeTree);\n this.removeChangeFromChangeSet(\"changes\", changeTree);\n\n if (changeTree.filteredChanges) {\n this.removeChangeFromChangeSet(\"allFilteredChanges\", changeTree);\n this.removeChangeFromChangeSet(\"filteredChanges\", changeTree);\n }\n\n this.refCount[changeTree.refId] = 0;\n\n changeTree.forEachChild((child, _) => {\n if (child.removeParent(changeTree.ref)) {\n if ((\n child.parentChain === undefined || // no parent, remove it\n (child.parentChain && this.refCount[child.refId] > 0) // parent is still in use, but has more than one reference, remove it\n )) {\n this.remove(child);\n\n } else if (child.parentChain) {\n // re-assigning a child of the same root, move it next to parent\n this.moveNextToParent(child);\n }\n }\n });\n\n } else {\n this.refCount[changeTree.refId] = refCount;\n\n //\n // When losing a reference to an instance, it is best to move the\n // ChangeTree next to its parent in the encoding queue.\n //\n // This way, at decoding time, the instance that contains the\n // ChangeTree will be available before the ChangeTree itself. If the\n // containing instance is not available, the Decoder will throw\n // \"refId not found\" error.\n //\n this.recursivelyMoveNextToParent(changeTree);\n }\n\n return refCount;\n }\n\n recursivelyMoveNextToParent(changeTree: ChangeTree) {\n this.moveNextToParent(changeTree);\n changeTree.forEachChild((child, _) => this.recursivelyMoveNextToParent(child));\n }\n\n moveNextToParent(changeTree: ChangeTree) {\n if (changeTree.filteredChanges) {\n this.moveNextToParentInChangeTreeList(\"filteredChanges\", changeTree);\n this.moveNextToParentInChangeTreeList(\"allFilteredChanges\", changeTree);\n } else {\n this.moveNextToParentInChangeTreeList(\"changes\", changeTree);\n this.moveNextToParentInChangeTreeList(\"allChanges\", changeTree);\n }\n }\n\n moveNextToParentInChangeTreeList(changeSetName: ChangeSetName, changeTree: ChangeTree): void {\n const changeSet = this[changeSetName];\n const node = changeTree[changeSetName].queueRootNode;\n if (!node) return;\n\n // Find the parent in the linked list\n const parent = changeTree.parent;\n if (!parent || !parent[$changes]) return;\n\n const parentNode = parent[$changes][changeSetName]?.queueRootNode;\n if (!parentNode || parentNode === node) return;\n\n // Use cached positions - no iteration needed!\n const parentPosition = parentNode.position;\n const childPosition = node.position;\n\n // If child is already after parent, no need to move\n if (childPosition > parentPosition) return;\n\n // Child is before parent, so we need to move it after parent\n // This maintains decoding order (parent before child)\n\n // Remove node from current position\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n changeSet.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n changeSet.tail = node.prev;\n }\n\n // Insert node right after parent\n node.prev = parentNode;\n node.next = parentNode.next;\n\n if (parentNode.next) {\n parentNode.next.prev = node;\n } else {\n changeSet.tail = node;\n }\n\n parentNode.next = node;\n\n // Update positions after the move\n this.updatePositionsAfterMove(changeSet, node, parentPosition + 1);\n }\n\n public enqueueChangeTree(\n changeTree: ChangeTree,\n changeSet: 'changes' | 'filteredChanges' | 'allFilteredChanges' | 'allChanges',\n queueRootNode = changeTree[changeSet].queueRootNode\n ) {\n // skip\n if (queueRootNode) { return; }\n\n // Add to linked list if not already present\n changeTree[changeSet].queueRootNode = this.addToChangeTreeList(this[changeSet], changeTree);\n }\n\n protected addToChangeTreeList(list: ChangeTreeList, changeTree: ChangeTree): ChangeTreeNode {\n const node: ChangeTreeNode = {\n changeTree,\n next: undefined,\n prev: undefined,\n position: list.tail ? list.tail.position + 1 : 0\n };\n\n if (!list.next) {\n list.next = node;\n list.tail = node;\n } else {\n node.prev = list.tail;\n list.tail!.next = node;\n list.tail = node;\n }\n\n return node;\n }\n\n protected updatePositionsAfterRemoval(list: ChangeTreeList, removedPosition: number) {\n // Update positions for all nodes after the removed position\n let current = list.next;\n let position = 0;\n\n while (current) {\n if (position >= removedPosition) {\n current.position = position;\n }\n current = current.next;\n position++;\n }\n }\n\n protected updatePositionsAfterMove(list: ChangeTreeList, node: ChangeTreeNode, newPosition: number) {\n // Recalculate all positions - this is more reliable than trying to be clever\n let current = list.next;\n let position = 0;\n\n while (current) {\n current.position = position;\n current = current.next;\n position++;\n }\n }\n\n public removeChangeFromChangeSet(changeSetName: ChangeSetName, changeTree: ChangeTree) {\n const changeSet = this[changeSetName];\n const node = changeTree[changeSetName].queueRootNode;\n\n if (node && node.changeTree === changeTree) {\n const removedPosition = node.position;\n\n // Remove the node from the linked list\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n changeSet.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n changeSet.tail = node.prev;\n }\n\n // Update positions for nodes that came after the removed node\n this.updatePositionsAfterRemoval(changeSet, removedPosition);\n\n // Clear ChangeTree reference\n changeTree[changeSetName].queueRootNode = undefined;\n return true;\n }\n\n return false;\n }\n}\n","import type { Schema } from \"../Schema\";\nimport { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $encoder, $filter, $getByIndex } from \"../types/symbols\";\n\nimport { encode } from \"../encoding/encode\";\nimport type { Iterator } from \"../encoding/decode\";\n\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport { Root } from \"./Root\";\n\nimport type { StateView } from \"./StateView\";\nimport type { Metadata } from \"../Metadata\";\nimport type { ChangeSetName, ChangeTree, ChangeTreeList, ChangeTreeNode } from \"./ChangeTree\";\nimport { createChangeTreeList } from \"./ChangeTree\";\n\nexport class Encoder<T extends Schema = any> {\n static BUFFER_SIZE = (typeof(Buffer) !== \"undefined\") && Buffer.poolSize || 8 * 1024; // 8KB\n sharedBuffer = Buffer.allocUnsafe(Encoder.BUFFER_SIZE);\n\n context: TypeContext;\n state: T;\n\n root: Root;\n\n constructor(state: T) {\n //\n // Use .cache() here to avoid re-creating a new context for every new room instance.\n //\n // We may need to make this optional in case of dynamically created\n // schemas - which would lead to memory leaks\n //\n this.context = TypeContext.cache(state.constructor as typeof Schema);\n this.root = new Root(this.context);\n\n this.setState(state);\n\n // console.log(\">>>>>>>>>>>>>>>> Encoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(state: T) {\n this.state = state;\n this.state[$changes].setRoot(this.root);\n }\n\n encode(\n it: Iterator = { offset: 0 },\n view?: StateView,\n buffer = this.sharedBuffer,\n changeSetName: ChangeSetName = \"changes\",\n isEncodeAll = changeSetName === \"allChanges\",\n initialOffset = it.offset // cache current offset in case we need to resize the buffer\n ): Buffer {\n const hasView = (view !== undefined);\n const rootChangeTree = this.state[$changes];\n\n let current: ChangeTreeList | ChangeTreeNode = this.root[changeSetName];\n\n while (current = current.next) {\n const changeTree = (current as ChangeTreeNode).changeTree;\n\n if (hasView) {\n if (!view.isChangeTreeVisible(changeTree)) {\n // console.log(\"MARK AS INVISIBLE:\", { ref: changeTree.ref.constructor.name, refId: changeTree.refId, raw: changeTree.ref.toJSON() });\n view.invisible.add(changeTree);\n continue; // skip this change tree\n }\n view.invisible.delete(changeTree); // remove from invisible list\n }\n\n const changeSet = changeTree[changeSetName];\n const ref = changeTree.ref;\n\n // TODO: avoid iterating over change tree if no changes were made\n const numChanges = changeSet.operations.length;\n if (numChanges === 0) { continue; }\n\n const ctor = ref.constructor;\n const encoder = ctor[$encoder];\n const filter = ctor[$filter];\n const metadata = ctor[Symbol.metadata];\n\n // skip root `refId` if it's the first change tree\n // (unless it \"hasView\", which will need to revisit the root)\n if (hasView || it.offset > initialOffset || changeTree !== rootChangeTree) {\n buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;\n encode.number(buffer, changeTree.refId, it);\n }\n\n for (let j = 0; j < numChanges; j++) {\n const fieldIndex = changeSet.operations[j];\n\n if (fieldIndex < 0) {\n // \"pure\" operation without fieldIndex (e.g. CLEAR, REVERSE, etc.)\n // encode and continue early - no need to reach $filter check\n buffer[it.offset++] = Math.abs(fieldIndex) & 255;\n continue;\n }\n\n const operation = (isEncodeAll)\n ? OPERATION.ADD\n : changeTree.indexedOperations[fieldIndex];\n\n //\n // first pass (encodeAll), identify \"filtered\" operations without encoding them\n // they will be encoded per client, based on their view.\n //\n // TODO: how can we optimize filtering out \"encode all\" operations?\n // TODO: avoid checking if no view tags were defined\n //\n if (fieldIndex === undefined || operation === undefined || (filter && !filter(ref, fieldIndex, view))) {\n // console.log(\"ADD AS INVISIBLE:\", fieldIndex, changeTree.ref.constructor.name)\n // view?.invisible.add(changeTree);\n continue;\n }\n\n encoder(this, buffer, changeTree, fieldIndex, operation, it, isEncodeAll, hasView, metadata);\n }\n }\n\n if (it.offset > buffer.byteLength) {\n // we can assume that n + 1 poolSize will suffice given that we are likely done with encoding at this point\n // multiples of poolSize are faster to allocate than arbitrary sizes\n // if we are on an older platform that doesn't implement pooling use 8kb as poolSize (that's the default for node)\n const newSize = Math.ceil(it.offset / (Buffer.poolSize ?? 8 * 1024)) * (Buffer.poolSize ?? 8 * 1024);\n\n console.warn(`@colyseus/schema buffer overflow. Encoded state is higher than default BUFFER_SIZE. Use the following to increase default BUFFER_SIZE:\n\n import { Encoder } from \"@colyseus/schema\";\n Encoder.BUFFER_SIZE = ${Math.round(newSize / 1024)} * 1024; // ${Math.round(newSize / 1024)} KB\n`);\n\n //\n // resize buffer and re-encode (TODO: can we avoid re-encoding here?)\n // -> No we probably can't unless we catch the need for resize before encoding which is likely more computationally expensive than resizing on demand\n //\n buffer = Buffer.alloc(newSize, buffer); // fill with buffer here to memcpy previous encoding steps beyond the initialOffset\n\n // assign resized buffer to local sharedBuffer\n if (buffer === this.sharedBuffer) {\n this.sharedBuffer = buffer;\n }\n\n return this.encode({ offset: initialOffset }, view, buffer, changeSetName, isEncodeAll);\n\n } else {\n\n return buffer.subarray(0, it.offset);\n }\n }\n\n encodeAll(it: Iterator = { offset: 0 }, buffer: Buffer = this.sharedBuffer) {\n return this.encode(it, undefined, buffer, \"allChanges\", true);\n }\n\n encodeAllView(view: StateView, sharedOffset: number, it: Iterator, bytes = this.sharedBuffer) {\n const viewOffset = it.offset;\n\n // try to encode \"filtered\" changes\n this.encode(it, view, bytes, \"allFilteredChanges\", true, viewOffset);\n\n return Buffer.concat([\n bytes.subarray(0, sharedOffset),\n bytes.subarray(viewOffset, it.offset)\n ]);\n }\n\n encodeView(view: StateView, sharedOffset: number, it: Iterator, bytes = this.sharedBuffer) {\n const viewOffset = it.offset;\n\n // encode visibility changes (add/remove for this view)\n for (const [refId, changes] of view.changes) {\n const changeTree: ChangeTree = this.root.changeTrees[refId];\n\n if (changeTree === undefined) {\n // detached instance, remove from view and skip.\n // console.log(\"detached instance, remove from view and skip.\", refId);\n view.changes.delete(refId);\n continue;\n }\n\n const keys = Object.keys(changes);\n if (keys.length === 0) {\n // FIXME: avoid having empty changes if no changes were made\n // console.log(\"changes.size === 0, skip\", refId, changeTree.ref.constructor.name);\n continue;\n }\n\n const ref = changeTree.ref;\n\n const ctor = ref.constructor;\n const encoder = ctor[$encoder];\n const metadata = ctor[Symbol.metadata];\n\n bytes[it.offset++] = SWITCH_TO_STRUCTURE & 255;\n encode.number(bytes, changeTree.refId, it);\n\n for (let i = 0, numChanges = keys.length; i < numChanges; i++) {\n const index = Number(keys[i]);\n // workaround when using view.add() on item that has been deleted from state (see test \"adding to view item that has been removed from state\")\n const value = changeTree.ref[$getByIndex](index);\n const operation = (value !== undefined && changes[index]) || OPERATION.DELETE;\n\n // isEncodeAll = false\n // hasView = true\n encoder(this, bytes, changeTree, index, operation, it, false, true, metadata);\n }\n }\n\n //\n // TODO: only clear view changes after all views are encoded\n // (to allow re-using StateView's for multiple clients)\n //\n // clear \"view\" changes after encoding\n view.changes.clear();\n\n // try to encode \"filtered\" changes\n this.encode(it, view, bytes, \"filteredChanges\", false, viewOffset);\n\n return Buffer.concat([\n bytes.subarray(0, sharedOffset),\n bytes.subarray(viewOffset, it.offset)\n ]);\n }\n\n discardChanges() {\n // discard shared changes\n let current = this.root.changes.next;\n while (current) {\n current.changeTree.endEncode('changes');\n current = current.next;\n }\n this.root.changes = createChangeTreeList();\n\n // discard filtered changes\n current = this.root.filteredChanges.next;\n while (current) {\n current.changeTree.endEncode('filteredChanges');\n current = current.next;\n }\n this.root.filteredChanges = createChangeTreeList();\n }\n\n tryEncodeTypeId (bytes: Buffer, baseType: typeof Schema, targetType: typeof Schema, it: Iterator) {\n const baseTypeId = this.context.getTypeId(baseType);\n const targetTypeId = this.context.getTypeId(targetType);\n\n if (targetTypeId === undefined) {\n console.warn(`@colyseus/schema WARNING: Class \"${targetType.name}\" is not registered on TypeRegistry - Please either tag the class with @entity or define a @type() field.`);\n return;\n }\n\n if (baseTypeId !== targetTypeId) {\n bytes[it.offset++] = TYPE_ID & 255;\n encode.number(bytes, targetTypeId, it);\n }\n }\n\n get hasChanges() {\n return (\n this.root.changes.next !== undefined ||\n this.root.filteredChanges.next !== undefined\n );\n }\n}\n","export function spliceOne(arr: any[], index: number): boolean {\n // manually splice an array\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n\n return true;\n}","import { Metadata } from \"../Metadata\";\nimport { $childType } from \"../types/symbols\";\nimport { Ref } from \"../encoder/ChangeTree\";\nimport { spliceOne } from \"../types/utils\";\nimport { OPERATION } from \"../encoding/spec\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { Schema } from \"../Schema\";\n\nclass DecodingWarning extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DecodingWarning\";\n }\n}\n\n/**\n * Used for decoding only.\n */\n\nexport type SchemaCallbacks = { [field: string | number]: Function[] };\n\nexport class ReferenceTracker {\n //\n // Relation of refId => Schema structure\n // For direct access of structures during decoding time.\n //\n public refs = new Map<number, Ref>();\n public refIds = new WeakMap<Ref, number>();\n\n public refCount: { [refId: number]: number; } = {};\n public deletedRefs = new Set<number>();\n\n public callbacks: { [refId: number]: SchemaCallbacks } = {};\n protected nextUniqueId: number = 0;\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n // for decoding\n addRef(refId: number, ref: Ref, incrementCount: boolean = true) {\n this.refs.set(refId, ref);\n this.refIds.set(ref, refId);\n\n if (incrementCount) {\n this.refCount[refId] = (this.refCount[refId] || 0) + 1;\n }\n\n if (this.deletedRefs.has(refId)) {\n this.deletedRefs.delete(refId);\n }\n }\n\n // for decoding\n removeRef(refId: number) {\n const refCount = this.refCount[refId];\n\n if (refCount === undefined) {\n try {\n throw new DecodingWarning(\"trying to remove refId that doesn't exist: \" + refId);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if (refCount === 0) {\n try {\n const ref = this.refs.get(refId);\n throw new DecodingWarning(`trying to remove refId '${refId}' with 0 refCount (${ref.constructor.name}: ${JSON.stringify(ref)})`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if ((this.refCount[refId] = refCount - 1) <= 0) {\n this.deletedRefs.add(refId);\n }\n }\n\n clearRefs() {\n this.refs.clear();\n this.deletedRefs.clear();\n this.callbacks = {};\n this.refCount = {};\n }\n\n // for decoding\n garbageCollectDeletedRefs() {\n this.deletedRefs.forEach((refId) => {\n //\n // Skip active references.\n //\n if (this.refCount[refId] > 0) { return; }\n\n const ref = this.refs.get(refId);\n\n //\n // Ensure child schema instances have their references removed as well.\n //\n if ((ref.constructor as typeof Schema)[Symbol.metadata] !== undefined) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index as any as number].name;\n const childRefId = typeof(ref[field as keyof Ref]) === \"object\" && this.refIds.get((ref as any)[field]);\n if (childRefId && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n }\n\n } else {\n if (typeof ((ref as any)[$childType]) === \"function\") {\n Array.from((ref as MapSchema).values())\n .forEach((child) => {\n const childRefId = this.refIds.get(child);\n if (!this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n });\n }\n }\n\n this.refs.delete(refId); // remove ref\n delete this.refCount[refId]; // remove ref count\n delete this.callbacks[refId]; // remove callbacks\n });\n\n // clear deleted refs.\n this.deletedRefs.clear();\n }\n\n addCallback(refId: number, fieldOrOperation: string | number, callback: Function) {\n if (refId === undefined) {\n const name = (typeof(fieldOrOperation) === \"number\")\n ? OPERATION[fieldOrOperation]\n : fieldOrOperation\n throw new Error(\n `Can't addCallback on '${name}' (refId is undefined)`\n );\n }\n if (!this.callbacks[refId]) {\n this.callbacks[refId] = {};\n }\n if (!this.callbacks[refId][fieldOrOperation]) {\n this.callbacks[refId][fieldOrOperation] = [];\n }\n this.callbacks[refId][fieldOrOperation].push(callback);\n return () => this.removeCallback(refId, fieldOrOperation, callback);\n }\n\n removeCallback(refId: number, field: string | number, callback: Function) {\n const index: number | undefined = this.callbacks?.[refId]?.[field]?.indexOf(callback);\n if (index !== undefined && index !== -1) {\n spliceOne(this.callbacks[refId][field], index);\n }\n }\n\n}\n","import { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $childType, $decoder, $onDecodeEnd } from \"../types/symbols\";\nimport { Schema } from \"../Schema\";\n\nimport { decode } from \"../encoding/decode\";\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Iterator } from \"../encoding/decode\";\nimport { ReferenceTracker } from \"./ReferenceTracker\";\nimport { DEFINITION_MISMATCH, type DataChange, type DecodeOperation } from \"./DecodeOperation\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport class Decoder<T extends Schema = any> {\n context: TypeContext;\n\n state: T;\n root: ReferenceTracker;\n\n currentRefId: number = 0;\n\n triggerChanges?: (allChanges: DataChange[]) => void;\n\n constructor(root: T, context?: TypeContext) {\n this.setState(root);\n\n this.context = context || new TypeContext(root.constructor as typeof Schema);\n\n // console.log(\">>>>>>>>>>>>>>>> Decoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(root: T) {\n this.state = root;\n this.root = new ReferenceTracker();\n this.root.addRef(0, root);\n }\n\n decode(\n bytes: Buffer,\n it: Iterator = { offset: 0 },\n ref: Ref = this.state,\n ) {\n const allChanges: DataChange[] = [];\n\n const $root = this.root;\n const totalBytes = bytes.byteLength;\n\n let decoder: DecodeOperation = ref['constructor'][$decoder];\n\n this.currentRefId = 0;\n\n while (it.offset < totalBytes) {\n //\n // Peek ahead, check if it's a switch to a different structure\n //\n if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {\n it.offset++;\n\n (ref as any)[$onDecodeEnd]?.()\n\n const nextRefId = decode.number(bytes, it);\n const nextRef = $root.refs.get(nextRefId);\n\n //\n // Trying to access a reference that haven't been decoded yet.\n //\n if (!nextRef) {\n // throw new Error(`\"refId\" not found: ${nextRefId}`);\n console.error(`\"refId\" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });\n console.warn(\"Please report this issue to the developers.\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n\n } else {\n ref = nextRef;\n decoder = ref.constructor[$decoder];\n this.currentRefId = nextRefId;\n }\n\n continue;\n }\n\n const result = decoder(this, bytes, it, ref, allChanges);\n\n if (result === DEFINITION_MISMATCH) {\n console.warn(\"@colyseus/schema: definition mismatch\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n continue;\n }\n }\n\n // FIXME: DRY with SWITCH_TO_STRUCTURE block.\n (ref as any)[$onDecodeEnd]?.()\n\n // trigger changes\n this.triggerChanges?.(allChanges);\n\n // drop references of unused schemas\n $root.garbageCollectDeletedRefs();\n\n return allChanges;\n }\n\n skipCurrentStructure(bytes: Buffer, it: Iterator, totalBytes: number) {\n //\n // keep skipping next bytes until reaches a known structure\n // by local decoder.\n //\n const nextIterator: Iterator = { offset: it.offset };\n while (it.offset < totalBytes) {\n if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {\n nextIterator.offset = it.offset + 1;\n if (this.root.refs.has(decode.number(bytes, nextIterator))) {\n break;\n }\n }\n it.offset++;\n }\n }\n\n getInstanceType(bytes: Buffer, it: Iterator, defaultType: typeof Schema): typeof Schema {\n let type: typeof Schema;\n\n if (bytes[it.offset] === TYPE_ID) {\n it.offset++;\n const type_id = decode.number(bytes, it);\n type = this.context.get(type_id);\n }\n\n return type || defaultType;\n }\n\n createInstanceOfType (type: typeof Schema): Schema {\n return new (type as any)();\n }\n\n removeChildRefs(ref: Collection, allChanges: DataChange[]) {\n const needRemoveRef = typeof ((ref as any)[$childType]) !== \"string\";\n const refId = this.root.refIds.get(ref as Ref);\n\n ref.forEach((value: any, key: any) => {\n allChanges.push({\n ref: ref as Ref,\n refId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value\n });\n\n if (needRemoveRef) {\n this.root.removeRef(this.root.refIds.get(value));\n }\n });\n }\n\n}\n","import { type, PrimitiveType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { Metadata } from \"./Metadata\";\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Reflection\n */\nexport class ReflectionField extends Schema {\n @type(\"string\") name: string;\n @type(\"string\") type: string;\n @type(\"number\") referencedType: number;\n}\n\nexport class ReflectionType extends Schema {\n @type(\"number\") id: number;\n @type(\"number\") extendsId: number;\n @type([ ReflectionField ]) fields = new ArraySchema<ReflectionField>();\n}\n\nexport class Reflection extends Schema {\n @type([ReflectionType]) types: ArraySchema<ReflectionType> = new ArraySchema<ReflectionType>();\n @type(\"number\") rootType: number;\n\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n static encode(encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset)\n // return Buffer.from(buf, 0, it.offset);\n }\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n static decode<T extends Schema = Schema>(bytes: Buffer, it?: Iterator): Decoder<T> {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const typeContext = new TypeContext();\n\n // 1st pass, initialize metadata + inheritance\n reflection.types.forEach((reflectionType) => {\n const parentClass: typeof Schema = typeContext.get(reflectionType.extendsId) ?? Schema;\n const schema: typeof Schema = class _ extends parentClass {};\n\n // register for inheritance support\n TypeContext.register(schema);\n\n // // for inheritance support\n // Metadata.initialize(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType: PrimitiveType = typeContext.get(field.referencedType);\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1] as PrimitiveType; // string\n }\n\n if (fieldType === \"ref\") {\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n }\n}\n","import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionNonPrimitivePropNames, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport type { DefinitionType } from \"../../annotations\";\nimport type { CollectionSchema } from \"../../types/custom/CollectionSchema\";\n\n//\n// Discussion: https://github.com/colyseus/schema/issues/155\n//\n// Main points:\n// - Decouple structures from their callbacks.\n// - Registering deep callbacks can be confusing.\n// - Avoid closures by allowing to pass a context. (https://github.com/colyseus/schema/issues/155#issuecomment-1804694081)\n//\n\n/**\n * TODO: define a schema interface, which even having duplicate definitions, it could be used to get the callback proxy.\n *\n * ```ts\n * export type SchemaCallbackProxy<RoomState> = (<T extends Schema>(instance: T) => CallbackProxy<T>);\n * ```\n */\nexport type SchemaCallbackProxy<RoomState> = (<T>(instance: T) => CallbackProxy<T>);\nexport type GetCallbackProxy = SchemaCallbackProxy<any>; // workaround for compatibility for < colyseus.js0.16.6. Remove me on next major release.\n\nexport type CallbackProxy<T> = unknown extends T // is \"any\"?\n ? SchemaCallback<T> & CollectionCallback<any, any>\n : T extends Collection<infer K, infer V, infer _>\n ? CollectionCallback<K, V>\n : SchemaCallback<T>;\n\nexport type SchemaCallback<T> = {\n /**\n * Trigger callback when value of a property changes.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n listen<K extends NonFunctionPropNames<T>>(\n prop: K,\n callback: (value: T[K], previousValue: T[K]) => void,\n immediate?: boolean,\n ): () => void;\n\n /**\n * Trigger callback whenever any property changed within this instance.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n onChange(callback: () => void): () => void;\n\n /**\n * Bind properties to another object. Changes on the properties will be reflected on the target object.\n *\n * @param targetObject object to bind properties to\n * @param properties list of properties to bind. If not provided, all properties will be bound.\n */\n bindTo(targetObject: any, properties?: Array<NonFunctionPropNames<T>>): void;\n} & {\n [K in NonFunctionNonPrimitivePropNames<T>]: CallbackProxy<T[K]>;\n}\n\nexport type CollectionCallback<K, V> = {\n /**\n * Trigger callback when an item has been added to the collection.\n *\n * @param callback\n * @param immediate\n * @return callback to detach the onAdd listener\n */\n onAdd(callback: (item: V, index: K) => void, immediate?: boolean): () => void;\n\n /**\n * Trigger callback when an item has been removed to the collection.\n *\n * @param callback\n * @return callback to detach the onRemove listener\n */\n onRemove(callback: (item: V, index: K) => void): () => void;\n\n /**\n * Trigger callback when the value on a key has changed.\n *\n * THIS METHOD IS NOT RECURSIVE!\n * If you want to listen to changes on individual items, you need to attach callbacks to the them directly inside the `onAdd` callback.\n *\n * @param callback\n * @return callback to detach the onChange listener\n */\n onChange(callback: (item: V, index: K) => void): () => void;\n};\n\ntype OnInstanceAvailableCallback = (callback: (ref: Ref, existing: boolean) => void) => void;\n\ntype CallContext = {\n instance?: any,\n parentInstance?: any,\n onInstanceAvailable?: OnInstanceAvailableCallback,\n}\n\n\nexport function getDecoderStateCallbacks<T extends Schema>(decoder: Decoder<T>): SchemaCallbackProxy<T> {\n const $root = decoder.root;\n const callbacks = $root.callbacks;\n\n const onAddCalls: WeakMap<Function, boolean> = new WeakMap();\n let currentOnAddCallback: Function | undefined;\n\n decoder.triggerChanges = function (allChanges: DataChange[]) {\n const uniqueRefIds = new Set<number>();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n const $callbacks = callbacks[refId];\n\n if (!$callbacks) { continue; }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const deleteCallbacks = callbacks[$root.refIds.get(change.previousValue)]?.[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i]();\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle schema instance\n //\n\n if (!uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i]();\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n if ($callbacks.hasOwnProperty(change.field)) {\n const fieldCallbacks = $callbacks[change.field];\n for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {\n fieldCallbacks[i](change.value, change.previousValue);\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n\n } else {\n //\n // Handle collection of items\n //\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // triger onRemove\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);\n }\n }\n\n // Handle DELETE_AND_ADD operations\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // triger onAdd\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n // trigger onChange\n if (\n change.value !== change.previousValue &&\n // FIXME: see \"should not encode item if added and removed at the same patch\" test case.\n // some \"ADD\" + \"DELETE\" operations on same patch are being encoded as \"DELETE\"\n (change.value !== undefined || change.previousValue !== undefined)\n ) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n }\n\n uniqueRefIds.add(refId);\n }\n };\n\n function getProxy(\n metadataOrType: Metadata | DefinitionType,\n context: CallContext\n ) {\n let metadata: Metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;\n let isCollection = (\n (context.instance && typeof (context.instance['forEach']) === \"function\") ||\n (metadataOrType && typeof ((metadataOrType as typeof Schema)[Symbol.metadata]) === \"undefined\")\n );\n\n if (metadata && !isCollection) {\n\n const onAddListen = function (\n ref: Ref,\n prop: string,\n callback: (value: any, previousValue: any) => void, immediate: boolean\n ) {\n // immediate trigger\n if (\n immediate &&\n context.instance[prop] !== undefined &&\n !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147\n ) {\n callback(context.instance[prop], undefined);\n }\n return $root.addCallback($root.refIds.get(ref), prop, callback);\n }\n\n /**\n * Schema instances\n */\n return new Proxy({\n listen: function listen(prop: string, callback: (value: any, previousValue: any) => void, immediate: boolean = true) {\n if (context.instance) {\n return onAddListen(context.instance, prop, callback, immediate);\n\n } else {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback))\n });\n\n return () => detachCallback();\n }\n },\n\n onChange: function onChange(callback: () => void) {\n return $root.addCallback(\n $root.refIds.get(context.instance),\n OPERATION.REPLACE,\n callback\n );\n },\n\n //\n // TODO: refactor `bindTo()` implementation.\n // There is room for improvement.\n //\n bindTo: function bindTo(targetObject: any, properties?: string[]) {\n if (!properties) {\n properties = Object.keys(metadata).map((index) => metadata[index as any as number].name);\n }\n return $root.addCallback(\n $root.refIds.get(context.instance),\n OPERATION.REPLACE,\n () => {\n properties.forEach((prop) =>\n targetObject[prop] = context.instance[prop])\n }\n );\n }\n }, {\n get(target, prop: string) {\n const metadataField = metadata[metadata[prop]];\n if (metadataField) {\n const instance = context.instance?.[prop];\n const onInstanceAvailable: OnInstanceAvailableCallback = (\n (callback: (ref: Ref, existing: boolean) => void) => {\n const unbind = $(context.instance).listen(prop, (value, _) => {\n callback(value, false);\n\n // FIXME: by \"unbinding\" the callback here,\n // it will not support when the server\n // re-instantiates the instance.\n //\n unbind?.();\n }, false);\n\n // has existing value\n if ($root.refIds.get(instance) !== undefined) {\n callback(instance, true);\n }\n }\n );\n\n return getProxy(metadataField.type, {\n // make sure refId is available, otherwise need to wait for the instance to be available.\n instance: ($root.refIds.get(instance) && instance),\n parentInstance: context.instance,\n onInstanceAvailable,\n });\n\n } else {\n // accessing the function\n return target[prop as keyof typeof target];\n }\n },\n has(target, prop: string) { return metadata[prop] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n\n } else {\n /**\n * Collection instances\n */\n\n const onAdd = function (ref: Ref, callback: (value: any, key: any) => void, immediate: boolean) {\n // Trigger callback on existing items\n if (immediate) {\n (ref as CollectionSchema).forEach((v, k) => callback(v, k));\n }\n\n return $root.addCallback($root.refIds.get(ref), OPERATION.ADD, (value: any, key: any) => {\n onAddCalls.set(callback, true);\n currentOnAddCallback = callback;\n callback(value, key);\n onAddCalls.delete(callback)\n currentOnAddCallback = undefined;\n });\n };\n\n const onRemove = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback($root.refIds.get(ref), OPERATION.DELETE, callback);\n };\n\n const onChange = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback($root.refIds.get(ref), OPERATION.REPLACE, callback);\n };\n\n return new Proxy({\n onAdd: function(callback: (value: any, key: any) => void, immediate: boolean = true) {\n //\n // https://github.com/colyseus/schema/issues/147\n // If parent instance has \"onAdd\" registered, avoid triggering immediate callback.\n //\n\n if (context.instance) {\n return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));\n });\n\n return () => detachCallback();\n }\n },\n onRemove: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onRemove(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onRemove(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n onChange: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onChange(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onChange(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n }, {\n get(target, prop: string) {\n if (!target[prop as keyof typeof target]) {\n throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);\n }\n return target[prop as keyof typeof target];\n },\n has(target, prop) { return target[prop as keyof typeof target] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n }\n }\n\n function $<T>(instance: T): CallbackProxy<T> {\n return getProxy(undefined, { instance }) as unknown as CallbackProxy<T>;\n }\n\n return $;\n}\n","import { DataChange } from \"../DecodeOperation\";\nimport { Decoder } from \"../Decoder\";\n\nexport function getRawChangesCallback(\n decoder: Decoder,\n callback: (changes: DataChange[]) => void\n) {\n decoder.triggerChanges = callback;\n}","import { ChangeTree, IndexedOperations, Ref } from \"./ChangeTree\";\nimport { $changes, $fieldIndexesByViewTag, $viewFieldIndexes } from \"../types/symbols\";\nimport { DEFAULT_VIEW_TAG } from \"../annotations\";\nimport { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { spliceOne } from \"../types/utils\";\nimport type { Schema } from \"../Schema\";\n\nexport function createView(iterable: boolean = false) {\n return new StateView(iterable);\n}\n\nexport class StateView {\n /**\n * Iterable list of items that are visible to this view\n * (Available only if constructed with `iterable: true`)\n */\n items: Ref[];\n\n /**\n * List of ChangeTree's that are visible to this view\n */\n visible: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();\n\n /**\n * List of ChangeTree's that are invisible to this view\n */\n invisible: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();\n\n tags?: WeakMap<ChangeTree, Set<number>>; // TODO: use bit manipulation instead of Set<number> ()\n\n /**\n * Manual \"ADD\" operations for changes per ChangeTree, specific to this view.\n * (This is used to force encoding a property, even if it was not changed)\n */\n changes = new Map<number, IndexedOperations>();\n\n constructor(public iterable: boolean = false) {\n if (iterable) {\n this.items = [];\n }\n }\n\n // TODO: allow to set multiple tags at once\n add(obj: Ref, tag: number = DEFAULT_VIEW_TAG, checkIncludeParent: boolean = true) {\n const changeTree: ChangeTree = obj?.[$changes];\n const parentChangeTree = changeTree.parent;\n\n if (!changeTree) {\n console.warn(\"StateView#add(), invalid object:\", obj);\n return false;\n\n } else if (\n !parentChangeTree &&\n changeTree.refId !== 0 // allow root object\n ) {\n /**\n * TODO: can we avoid this?\n *\n * When the \"parent\" structure has the @view() tag, it is currently\n * not possible to identify it has to be added to the view as well\n * (this.addParentOf() is not called).\n */\n throw new Error(\n `Cannot add a detached instance to the StateView. Make sure to assign the \"${changeTree.ref.constructor.name}\" instance to the state before calling view.add()`\n );\n }\n\n // FIXME: ArraySchema/MapSchema do not have metadata\n const metadata: Metadata = (obj.constructor as typeof Schema)[Symbol.metadata];\n this.visible.add(changeTree);\n\n // add to iterable list (only the explicitly added items)\n if (this.iterable && checkIncludeParent) {\n this.items.push(obj);\n }\n\n // add parent ChangeTree's\n // - if it was invisible to this view\n // - if it were previously filtered out\n if (checkIncludeParent && parentChangeTree) {\n this.addParentOf(changeTree, tag);\n }\n\n let changes = this.changes.get(changeTree.refId);\n if (changes === undefined) {\n changes = {};\n // FIXME / OPTIMIZE: do not add if no changes are needed\n this.changes.set(changeTree.refId, changes);\n }\n\n let isChildAdded = false;\n\n //\n // Add children of this ChangeTree first.\n // If successful, we must link the current ChangeTree to the child.\n //\n changeTree.forEachChild((change, index) => {\n // Do not ADD children that don't have the same tag\n if (\n metadata &&\n metadata[index].tag !== undefined &&\n metadata[index].tag !== tag\n ) {\n return;\n }\n\n if (this.add(change.ref, tag, false)) {\n isChildAdded = true;\n }\n });\n\n // set tag\n if (tag !== DEFAULT_VIEW_TAG) {\n if (!this.tags) {\n this.tags = new WeakMap<ChangeTree, Set<number>>();\n }\n let tags: Set<number>;\n if (!this.tags.has(changeTree)) {\n tags = new Set<number>();\n this.tags.set(changeTree, tags);\n } else {\n tags = this.tags.get(changeTree);\n }\n tags.add(tag);\n\n // Ref: add tagged properties\n metadata?.[$fieldIndexesByViewTag]?.[tag]?.forEach((index) => {\n if (changeTree.getChange(index) !== OPERATION.DELETE) {\n changes[index] = OPERATION.ADD;\n }\n });\n\n } else if (!changeTree.isNew || isChildAdded) {\n // new structures will be added as part of .encode() call, no need to force it to .encodeView()\n const changeSet = (changeTree.filteredChanges !== undefined)\n ? changeTree.allFilteredChanges\n : changeTree.allChanges;\n\n const isInvisible = this.invisible.has(changeTree);\n\n for (let i = 0, len = changeSet.operations.length; i < len; i++) {\n const index = changeSet.operations[i];\n if (index === undefined) { continue; } // skip \"undefined\" indexes\n\n const op = changeTree.indexedOperations[index] ?? OPERATION.ADD;\n const tagAtIndex = metadata?.[index].tag;\n if (\n op !== OPERATION.DELETE &&\n (\n isInvisible || // if \"invisible\", include all\n tagAtIndex === undefined || // \"all change\" with no tag\n tagAtIndex === tag // tagged property\n )\n ) {\n changes[index] = op;\n isChildAdded = true; // FIXME: assign only once\n }\n }\n }\n\n return isChildAdded;\n }\n\n protected addParentOf(childChangeTree: ChangeTree, tag: number) {\n const changeTree = childChangeTree.parent[$changes];\n const parentIndex = childChangeTree.parentIndex;\n\n if (!this.visible.has(changeTree)) {\n // view must have all \"changeTree\" parent tree\n this.visible.add(changeTree);\n\n // add parent's parent\n const parentChangeTree: ChangeTree = changeTree.parent?.[$changes];\n if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {\n this.addParentOf(changeTree, tag);\n }\n\n // // parent is already available, no need to add it!\n // if (!this.invisible.has(changeTree)) { return; }\n }\n\n // add parent's tag properties\n if (changeTree.getChange(parentIndex) !== OPERATION.DELETE) {\n let changes = this.changes.get(changeTree.refId);\n if (changes === undefined) {\n changes = {};\n this.changes.set(changeTree.refId, changes);\n }\n\n if (!this.tags) {\n this.tags = new WeakMap<ChangeTree, Set<number>>();\n }\n\n let tags: Set<number>;\n if (!this.tags.has(changeTree)) {\n tags = new Set<number>();\n this.tags.set(changeTree, tags);\n } else {\n tags = this.tags.get(changeTree);\n }\n tags.add(tag);\n\n changes[parentIndex] = OPERATION.ADD;\n }\n }\n\n remove(obj: Ref, tag?: number): this; // hide _isClear parameter from public API\n remove(obj: Ref, tag?: number, _isClear?: boolean): this;\n remove(obj: Ref, tag: number = DEFAULT_VIEW_TAG, _isClear: boolean = false): this {\n const changeTree: ChangeTree = obj[$changes];\n if (!changeTree) {\n console.warn(\"StateView#remove(), invalid object:\", obj);\n return this;\n }\n\n this.visible.delete(changeTree);\n\n // remove from iterable list\n if (\n this.iterable &&\n !_isClear // no need to remove during clear(), as it will be cleared entirely\n ) {\n spliceOne(this.items, this.items.indexOf(obj));\n }\n\n const ref = changeTree.ref;\n const metadata: Metadata = ref.constructor[Symbol.metadata]; // ArraySchema/MapSchema do not have metadata\n\n let changes = this.changes.get(changeTree.refId);\n if (changes === undefined) {\n changes = {};\n this.changes.set(changeTree.refId, changes);\n }\n\n if (tag === DEFAULT_VIEW_TAG) {\n // parent is collection (Map/Array)\n const parent = changeTree.parent;\n if (parent && !Metadata.isValidInstance(parent) && changeTree.isFiltered) {\n const parentChangeTree = parent[$changes];\n let changes = this.changes.get(parentChangeTree.refId);\n if (changes === undefined) {\n changes = {};\n this.changes.set(parentChangeTree.refId, changes);\n\n } else if (changes[changeTree.parentIndex] === OPERATION.ADD) {\n //\n // SAME PATCH ADD + REMOVE:\n // The 'changes' of deleted structure should be ignored.\n //\n this.changes.delete(changeTree.refId);\n }\n\n // DELETE / DELETE BY REF ID\n changes[changeTree.parentIndex] = OPERATION.DELETE;\n\n // Remove child schema from visible set\n this._recursiveDeleteVisibleChangeTree(changeTree);\n\n } else {\n // delete all \"tagged\" properties.\n metadata?.[$viewFieldIndexes]?.forEach((index) =>\n changes[index] = OPERATION.DELETE);\n }\n\n } else {\n // delete only tagged properties\n metadata?.[$fieldIndexesByViewTag][tag].forEach((index) =>\n changes[index] = OPERATION.DELETE);\n }\n\n // remove tag\n if (this.tags && this.tags.has(changeTree)) {\n const tags = this.tags.get(changeTree);\n if (tag === undefined) {\n // delete all tags\n this.tags.delete(changeTree);\n } else {\n // delete specific tag\n tags.delete(tag);\n\n // if tag set is empty, delete it entirely\n if (tags.size === 0) {\n this.tags.delete(changeTree);\n }\n }\n }\n\n return this;\n }\n\n has(obj: Ref) {\n return this.visible.has(obj[$changes]);\n }\n\n hasTag(ob: Ref, tag: number = DEFAULT_VIEW_TAG) {\n const tags = this.tags?.get(ob[$changes]);\n return tags?.has(tag) ?? false;\n }\n\n clear() {\n if (!this.iterable) {\n throw new Error(\"StateView#clear() is only available for iterable StateView's. Use StateView(iterable: true) constructor.\");\n }\n\n for (let i = 0, l = this.items.length; i < l; i++) {\n this.remove(this.items[i], DEFAULT_VIEW_TAG, true);\n }\n\n // clear items array\n this.items.length = 0;\n }\n\n isChangeTreeVisible(changeTree: ChangeTree) {\n let isVisible = this.visible.has(changeTree);\n\n //\n // TODO: avoid checking for parent visibility, most of the time it's not needed\n // See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'\n //\n if (!isVisible && changeTree.isVisibilitySharedWithParent){\n\n // console.log(\"CHECK AGAINST PARENT...\", {\n // ref: changeTree.ref.constructor.name,\n // refId: changeTree.refId,\n // parent: changeTree.parent.constructor.name,\n // });\n\n if (this.visible.has(changeTree.parent[$changes])) {\n this.visible.add(changeTree);\n isVisible = true;\n }\n }\n\n return isVisible;\n }\n\n protected _recursiveDeleteVisibleChangeTree(changeTree: ChangeTree) {\n changeTree.forEachChild((childChangeTree) => {\n this.visible.delete(childChangeTree);\n this._recursiveDeleteVisibleChangeTree(childChangeTree);\n });\n }\n}\n","export { Schema } from \"./Schema\";\nexport type { DataChange } from \"./decoder/DecodeOperation\";\nexport type { ToJSON } from \"./types/HelperTypes\";\n\nimport { MapSchema } from \"./types/custom/MapSchema\"\nexport { MapSchema };\n\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nexport { ArraySchema };\n\nimport { CollectionSchema } from \"./types/custom/CollectionSchema\";\nexport { CollectionSchema };\n\nimport { SetSchema } from \"./types/custom/SetSchema\";\nexport { SetSchema };\n\nimport { registerType, defineCustomTypes } from \"./types/registry\";\nexport { registerType, defineCustomTypes };\n\nregisterType(\"map\", { constructor: MapSchema });\nregisterType(\"array\", { constructor: ArraySchema });\nregisterType(\"set\", { constructor: SetSchema });\nregisterType(\"collection\", { constructor: CollectionSchema, });\n\n// Utils\nexport { dumpChanges } from \"./utils\";\n\n// Encoder / Decoder\nexport { $track, $encoder, $decoder, $filter, $getByIndex, $deleteByIndex, $changes, $childType } from \"./types/symbols\";\nexport { encode } from \"./encoding/encode\";\nexport { decode, type Iterator } from \"./encoding/decode\";\n\n// Reflection\nexport {\n Reflection,\n ReflectionType,\n ReflectionField,\n} from \"./Reflection\";\n\n// Annotations, Metadata and TypeContext\nexport { Metadata } from \"./Metadata\";\n\n// Schema definition types\nexport {\n type,\n deprecated,\n defineTypes,\n view,\n schema,\n entity,\n type DefinitionType,\n type PrimitiveType,\n type Definition,\n // Raw schema() return types\n type SchemaWithExtendsConstructor,\n type SchemaWithExtends,\n type SchemaType,\n} from \"./annotations\";\n\nexport { TypeContext } from \"./types/TypeContext\";\n\n// Helper types for type inference\nexport type { InferValueType, InferSchemaInstanceType, AssignableProps } from \"./types/HelperTypes\";\n\nexport { getDecoderStateCallbacks, CallbackProxy, SchemaCallback, CollectionCallback, SchemaCallbackProxy } from \"./decoder/strategy/StateCallbacks\";\nexport { getRawChangesCallback } from \"./decoder/strategy/RawChanges\";\n\nexport { Encoder } from \"./encoder/Encoder\";\nexport { encodeSchemaOperation, encodeArray, encodeKeyValueOperation } from \"./encoder/EncodeOperation\";\nexport { ChangeTree, Ref, IRef, type ChangeSetName, type ChangeSet} from \"./encoder/ChangeTree\";\nexport { StateView } from \"./encoder/StateView\";\n\nexport { Decoder } from \"./decoder/Decoder\";\nexport { decodeSchemaOperation, decodeKeyValueOperation } from \"./decoder/DecodeOperation\";\n\nexport { OPERATION } from \"./encoding/spec\";"],"names":["_convoBuffer","_int32","_float32","_float64","_int64","int8","uint8","int16","uint16","int32","uint32","int64","uint64","bigint64","biguint64","float32","float64","boolean","string","number","_a","_b"],"mappings":"AAAO,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,OAAO,GAAG,GAAG;AAE1B;;AAEG;IACS;AAAZ,CAAA,UAAY,SAAS,EAAA;AACjB,IAAA,SAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,GAAA,CAAA,GAAA,KAAS;AACT,IAAA,SAAA,CAAA,SAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACX,IAAA,SAAA,CAAA,SAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAW;AACX,IAAA,SAAA,CAAA,SAAA,CAAA,iBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,iBAAoB;AACpB,IAAA,SAAA,CAAA,SAAA,CAAA,cAAA,CAAA,GAAA,GAAA,CAAA,GAAA,cAAkB;AAClB,IAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,GAAA,CAAA,GAAA,gBAAoB;AAEpB;;AAEG;AACH,IAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,GAAA,EAAA,CAAA,GAAA,OAAU;AAEV;;AAEG;AACH,IAAA,SAAA,CAAA,SAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAAA,GAAA,SAAY;AACZ,IAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,GAAA,EAAA,CAAA,GAAA,MAAS;AACT,IAAA,SAAA,CAAA,SAAA,CAAA,iBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,iBAAoB;AACpB,IAAA,SAAA,CAAA,SAAA,CAAA,cAAA,CAAA,GAAA,GAAA,CAAA,GAAA,cAAkB;AACtB,CAAC,EApBW,SAAS,KAAT,SAAS,GAoBpB,EAAA,CAAA,CAAA;;ACfA,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;;ACXnD,MAAM,MAAM,GAAG;AACf,MAAM,QAAQ,GAAG;AACjB,MAAM,QAAQ,GAAG;AAEjB,MAAM,OAAO,GAAG;AAEhB,MAAM,WAAW,GAAG;AACpB,MAAM,cAAc,GAAG;AAE9B;;AAEG;AACI,MAAM,QAAQ,GAAG;AAExB;;;AAGG;AACI,MAAM,UAAU,GAAG;AAE1B;;;AAGG;AACI,MAAM,YAAY,GAAG,cAAc;AAE1C;;AAEG;AACI,MAAM,YAAY,GAAG,cAAc;AAE1C;;AAEG;AACI,MAAM,YAAY,GAAG,cAAc;AACnC,MAAM,UAAU,GAAG,cAAc;AACjC,MAAM,oBAAoB,GAAG,wBAAwB;AACrD,MAAM,iBAAiB,GAAG,qBAAqB;AAC/C,MAAM,sBAAsB,GAAG,0BAA0B;;ACtChE;AA8BA;;;AAGG;AAEH,IAAI,WAAwB;AAC5B;AACA,IAAI;AAAE,IAAA,WAAW,GAAG,IAAI,WAAW,EAAE;AAAE;AAAE,OAAO,CAAC,EAAE;AAInD,MAAMA,cAAY,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC;AACvC,MAAMC,QAAM,GAAG,IAAI,UAAU,CAACD,cAAY,CAAC;AAC3C,MAAME,UAAQ,GAAG,IAAI,YAAY,CAACF,cAAY,CAAC;AAC/C,MAAMG,UAAQ,GAAG,IAAI,YAAY,CAACH,cAAY,CAAC;AAC/C,MAAMI,QAAM,GAAG,IAAI,aAAa,CAACJ,cAAY,CAAC;AAE9C,MAAM,mBAAmB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC;AAEhF,MAAM,UAAU,GAAqC,CAAC,mBAAmB;AACrE,MAAE,MAAM,CAAC,UAAU;AACnB,MAAE,UAAU,GAAW,EAAE,CAAO,EAAA;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC;AACrB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,GAAG,IAAI,EAAE;gBACV,MAAM,IAAI,CAAC;;AAEV,iBAAA,IAAI,CAAC,GAAG,KAAK,EAAE;gBAChB,MAAM,IAAI,CAAC;;iBAEV,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,MAAM,EAAE;gBAChC,MAAM,IAAI,CAAC;;iBAEV;AACD,gBAAA,CAAC,EAAE;gBACH,MAAM,IAAI,CAAC;;;AAGnB,QAAA,OAAO,MAAM;AACjB,KAAC;AAEL,SAAS,SAAS,CAAC,IAAgB,EAAE,GAAW,EAAE,EAAY,EAAA;IAC5D,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1C,QAAA,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,GAAG,IAAI,EAAE;YACZ,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;;AAElB,aAAA,IAAI,CAAC,GAAG,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AACvC,YAAA,EAAE,CAAC,MAAM,IAAI,CAAC;;aAEX,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAClC,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AACrC,YAAA,EAAE,CAAC,MAAM,IAAI,CAAC;;aAEX;AACH,YAAA,CAAC,EAAE;YACH,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAClC,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC1C,YAAA,IAAI,CAAC,EAAE,CAAC,MAAM,GAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AACrC,YAAA,EAAE,CAAC,MAAM,IAAI,CAAC;;;AAGpB;AAEA,SAASK,MAAI,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;IACxD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;AACpC;AAEA,SAASC,OAAK,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;IACzD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;AACpC;AAEA,SAASC,OAAK,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;IACzD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;AAChC,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG;AAC3C;AAEA,SAASC,QAAM,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;IAC1D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;AAChC,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG;AAC3C;AAEA,SAASC,OAAK,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;IAC3D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;AAChC,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG;AACvC,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG;AACxC,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG;AAC1C;AAEA,SAASC,QAAM,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC5D,IAAA,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE;AACtB,IAAA,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE;AACtB,IAAA,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrB,MAAM,EAAE,GAAG,KAAK;IAChB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG;IAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG;IAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG;IAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG;AAC/B;AAEA,SAASC,OAAK,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC3D,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChD,IAAA,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC;AACvB,IAAAD,QAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AACtB,IAAAA,QAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;AACzB;AAEA,SAASE,QAAM,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC5D,IAAA,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;AAC3C,IAAA,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC;AACvB,IAAAF,QAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AACtB,IAAAA,QAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;AACzB;AAEA,SAASG,UAAQ,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC5D,IAAAT,QAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;IACpCK,OAAK,CAAC,KAAK,EAAER,QAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3BQ,OAAK,CAAC,KAAK,EAAER,QAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC/B;AAEA,SAASa,WAAS,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC7D,IAAAV,QAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;IACpCK,OAAK,CAAC,KAAK,EAAER,QAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3BQ,OAAK,CAAC,KAAK,EAAER,QAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC/B;AAEA,SAASc,SAAO,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC7D,IAAAb,UAAQ,CAAC,CAAC,CAAC,GAAG,KAAK;IACnBO,OAAK,CAAC,KAAK,EAAER,QAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7B;AAEA,SAASe,SAAO,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC7D,IAAAb,UAAQ,CAAC,CAAC,CAAC,GAAG,KAAK;AACnB,IAAAM,OAAK,CAAC,KAAK,EAAER,QAAM,CAAmB,CAAC,CAAI,CAAC,EAAE,EAAE,CAAC;AACjD,IAAAQ,OAAK,CAAC,KAAK,EAAER,QAAM,CAAmB,CAAC,CAAI,CAAC,EAAE,EAAE,CAAC;AACnD;AAEA,SAASgB,SAAO,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC7D,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AACrC;AAEA,SAASC,QAAM,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;;IAE5D,IAAI,CAAC,KAAK,EAAE;QAAE,KAAK,GAAG,EAAE;;IAExB,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;IACtC,IAAI,IAAI,GAAG,CAAC;;AAGZ,IAAA,IAAI,MAAM,GAAG,IAAI,EAAE;QACjB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI;QAClC,IAAI,GAAG,CAAC;;;AAGL,SAAA,IAAI,MAAM,GAAG,KAAK,EAAE;QACvB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;QACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG;QACjC,IAAI,GAAG,CAAC;;;AAGL,SAAA,IAAI,MAAM,GAAG,OAAO,EAAE;QACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,QAAAV,QAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC;;;AAGL,SAAA,IAAI,MAAM,GAAG,WAAW,EAAE;QAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,QAAAE,QAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC;;SACH;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;;AAGpC,IAAA,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;IAE3B,OAAO,IAAI,GAAG,MAAM;AACtB;AAEA,SAASS,QAAM,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAY,EAAA;AAC5D,IAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;QAChB,OAAOA,QAAM,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;;AAEtB,SAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC3B,OAAOA,QAAM,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;;SAErF,IAAI,KAAK,MAAM,KAAK,GAAC,CAAC,CAAC,EAAE;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,aAAa,EAAE;AAClC,YAAAjB,UAAQ,CAAC,CAAC,CAAC,GAAG,KAAK;YACnB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAACA,UAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE;;gBAE1D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,gBAAAa,SAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACzB,gBAAA,OAAO,CAAC;;;QAIhB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,QAAAC,SAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACzB,QAAA,OAAO,CAAC;;AAGV,IAAA,IAAI,KAAK,IAAI,CAAC,EAAE;;AAEd,QAAA,IAAI,KAAK,GAAG,IAAI,EAAE;AAChB,YAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;AACjC,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,GAAG,KAAK,EAAE;YACjB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;AACjC,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,GAAG,OAAO,EAAE;YACnB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAAR,QAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACxB,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,GAAG,WAAW,EAAE;YACvB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAAE,QAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACxB,YAAA,OAAO,CAAC;;;QAIV,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,QAAAE,QAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACxB,QAAA,OAAO,CAAC;;SAEH;;AAGL,QAAA,IAAI,KAAK,IAAI,GAAK,EAAE;AAClB,YAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC;AAC1C,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,IAAI,IAAK,EAAE;YAClB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAAP,MAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACtB,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,IAAI,MAAO,EAAE;YACpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAAE,OAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACvB,YAAA,OAAO,CAAC;;;AAIV,QAAA,IAAI,KAAK,IAAI,WAAW,EAAE;YACxB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,YAAAE,OAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACvB,YAAA,OAAO,CAAC;;;QAIV,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;AACzB,QAAAE,OAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AACvB,QAAA,OAAO,CAAC;;AAEZ;AAEa,MAAA,MAAM,GAAG;UAClBN,MAAI;WACJC,OAAK;WACLC,OAAK;YACLC,QAAM;WACNC,OAAK;YACLC,QAAM;WACNC,OAAK;YACLC,QAAM;cACNC,UAAQ;eACRC,WAAS;aACTC,SAAO;aACPC,SAAO;aACPC,SAAO;YACPC,QAAM;YACNC,QAAM;IACN,SAAS;IACT,UAAU;;;ACtUd;AAkCA;AAEA,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC;AAEvC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC;AAC/C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC;AAC/C,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,YAAY,CAAC;AAChD,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC;AAE9C,SAAS,QAAQ,CAAC,KAAiB,EAAE,EAAY,EAAE,MAAc,EAAA;;IAE/D,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;;AAE1E,IAAA,IAAI,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC9D,QAAA,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE;AAC1B,YAAA,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;YACnC;;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE;AAC1B,YAAA,MAAM,IAAI,MAAM,CAAC,YAAY,CAC3B,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC;iBAClB,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CACpB;YACD;;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE;AAC1B,YAAA,MAAM,IAAI,MAAM,CAAC,YAAY,CAC3B,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE;iBACnB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;AAC1B,iBAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAC3B;YACD;;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE;YAC1B,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE;iBACvB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;iBAC1B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;AAC1B,iBAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;AAC5B,YAAA,IAAI,GAAG,IAAI,QAAQ,EAAE;gBACnB,GAAG,IAAI,QAAQ;gBACf,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC;;iBACvE;AACL,gBAAA,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;;YAEpC;;;;QAMF,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,IAAI,GAAG,aAAa,GAAG,CAAC,GAAG,2BAA2B,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACjI;;AAEF,IAAA,EAAE,CAAC,MAAM,IAAI,MAAM;AACnB,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,IAAI,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC1C,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;AACvC;AAEA,SAAS,KAAK,CAAE,KAAiB,EAAE,EAAY,EAAA;AAC3C,IAAA,OAAO,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AAC7B;AAEA,SAAS,KAAK,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC3C,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE;AACxC;AAEA,SAAS,MAAM,CAAE,KAAiB,EAAE,EAAY,EAAA;AAC5C,IAAA,OAAO,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;AACvD;AAEA,SAAS,KAAK,CAAE,KAAiB,EAAE,EAAY,EAAA;AAC3C,IAAA,OAAO,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;AAC7G;AAEA,SAAS,MAAM,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC5C,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;AACjC;AAEA,SAAS,OAAO,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC7C,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAC5B,IAAA,OAAO,QAAQ,CAAC,CAAC,CAAC;AACtB;AAEA,SAAS,OAAO,CAAE,KAAiB,EAAE,EAAY,EAAA;AAC7C,IAAA,MAAM,CAAmB,CAAC,CAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,MAAM,CAAmB,CAAC,CAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,OAAO,QAAQ,CAAC,CAAC,CAAC;AACtB;AAEA,SAAS,KAAK,CAAC,KAAiB,EAAE,EAAY,EAAA;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AAC7B,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/C,OAAO,IAAI,GAAG,GAAG;AACnB;AAEA,SAAS,MAAM,CAAC,KAAiB,EAAE,EAAY,EAAA;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AAC7B,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IAChD,OAAO,IAAI,GAAG,GAAG;AACrB;AAEA,SAAS,QAAQ,CAAC,KAAiB,EAAE,EAAY,EAAA;IAC7C,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAC5B,IAAA,OAAO,MAAM,CAAC,CAAC,CAAC;AACpB;AAEA,SAAS,SAAS,CAAC,KAAiB,EAAE,EAAY,EAAA;IAC9C,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAC5B,IAAA,OAAO,OAAO,CAAC,CAAC,CAAC;AACrB;AAEA,SAAS,OAAO,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC7C,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC;AAC/B;AAEA,SAAS,MAAM,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AACjC,IAAA,IAAI,MAAc;AAElB,IAAA,IAAI,MAAM,GAAG,IAAI,EAAE;;AAEjB,QAAA,MAAM,GAAG,MAAM,GAAG,IAAI;;AAEjB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;AAC1B,QAAA,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEpB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;AAC1B,QAAA,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAErB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;AAC1B,QAAA,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;IAG5B,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC;AACpC;AAEA,SAAS,MAAM,CAAE,KAAiB,EAAE,EAAY,EAAA;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AAEjC,IAAA,IAAI,MAAM,GAAG,IAAI,EAAE;;AAEjB,QAAA,OAAO,MAAM;;AAER,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEpB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEpB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;AAElB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEnB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEnB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEnB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEjB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;AAElB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;AAElB,SAAA,IAAI,MAAM,KAAK,IAAI,EAAE;;AAE1B,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;;AAElB,SAAA,IAAI,MAAM,GAAG,IAAI,EAAE;;QAExB,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;;AAEnC;AAEgB,SAAA,WAAW,CAAC,KAAiB,EAAE,EAAY,EAAA;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;IAC/B;;AAEE,IAAA,CAAC,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI;;AAE/B,QAAA,MAAM,KAAK,IAAI;;AAEf,QAAA,MAAM,KAAK,IAAI;;QAEf,MAAM,KAAK,IAAI;AAEnB;AAEa,MAAA,MAAM,GAAG;IAClB,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,WAAW;;;AC5PR,MAAM,eAAe,GAA4C,EAAE;AAE1E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe;AAE1B,SAAA,YAAY,CAAC,UAAkB,EAAE,UAA0B,EAAA;AACvE,IAAA,IAAI,UAAU,CAAC,WAAW,EAAE;QACxB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC;AACnD,QAAA,eAAe,CAAC,UAAU,CAAC,GAAG,UAAU;;AAG5C,IAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AAAG,QAAA,MAAc,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM;;AACxE,IAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AAAG,QAAA,MAAc,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM;;AAC5E;AAMM,SAAU,OAAO,CAAC,UAAkB,EAAA;AACtC,IAAA,OAAO,eAAe,CAAC,UAAU,CAAC;AACtC;AAEM,SAAU,iBAAiB,CAA4C,KAAQ,EAAA;AACjF,IAAA,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE;QAC5B,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;;IAG/C,OAAO,CAAC,CAAU,KAAK,IAAI,CAAC,CAAmB,CAAC;AACpD;;MClCa,WAAW,CAAA;AAOpB;;;AAGG;AACI,IAAA,SAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAAqC,CAAC;AAC9D,IAAA,SAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE9D,OAAO,QAAQ,CAAC,MAAqB,EAAA;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;AAC5C,QAAA,IAAI,MAAM,KAAK,MAAM,EAAE;YACnB,IAAI,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YACrD,IAAI,CAAC,QAAQ,EAAE;AACX,gBAAA,QAAQ,GAAG,IAAI,GAAG,EAAiB;gBACnC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;;AAEpD,YAAA,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;;;IAI5B,OAAO,KAAK,CAAE,SAAwB,EAAA;QAClC,IAAI,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QACvD,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC;YACpC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;;AAEtD,QAAA,OAAO,OAAO;;AAGlB,IAAA,WAAA,CAAY,SAAyB,EAAA;QAlCrC,IAAK,CAAA,KAAA,GAAqC,EAAE;AAC5C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,GAAG,EAAyB;QAE1C,IAAU,CAAA,UAAA,GAAY,KAAK;QAC3B,IAAc,CAAA,cAAA,GAA8C,EAAE;QA+B1D,IAAI,SAAS,EAAE;AACX,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;;;AAIrC,IAAA,GAAG,CAAC,MAAqB,EAAA;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;;AAGnC,IAAA,GAAG,CAAC,MAAc,EAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;IAG7B,GAAG,CAAC,MAAqB,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAA;;QAEjD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC1B,YAAA,OAAO,KAAK;;AAGhB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM;;;;QAK3B,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;AACvC,YAAA,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;;QAG/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;AAChC,QAAA,OAAO,IAAI;;AAGf,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG1B,IAAA,aAAa,CAAC,KAAoB,EAAE,UAA0B,EAAE,WAAoB,EAAE,gBAA0B,EAAA;QACpH,IAAI,gBAAgB,EAAE;YAClB,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC;;;QAIjE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAAE;;;AAGxB,QAAA,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,KAAI;YACrD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,CAAC;AACxE,SAAC,CAAC;;QAGF,IAAI,MAAM,GAAQ,KAAK;QACvB,OACI,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;YACvC,MAAM,KAAK,MAAM;AACjB,YAAA,MAAM,KAAK,QAAQ,CAAC,SAAS;UAC/B;AACE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;;AAG9B,QAAA,MAAM,QAAQ,IAAc,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAc,CAAC;;AAGtE,QAAA,IAAI,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;AAG1B,QAAA,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE;YAC/B,MAAM,KAAK,GAAG,UAA2B;YAEzC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI;AACtC,YAAA,MAAM,eAAe,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC;AAE3D,YAAA,IAAI,QAAQ,SAAS,CAAC,KAAK,QAAQ,EAAE;gBACjC;;AAGJ,YAAA,IAAI,QAAQ,SAAS,CAAC,KAAK,UAAU,EAAE;AACnC,gBAAA,IAAI,CAAC,aAAa,CAAC,SAA0B,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,eAAe,CAAC;;iBAE9F;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAGxC,gBAAA,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE;oBAC5B;;AAGJ,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,eAAe,CAAC;;;;AAKxG;;;AAGG;AACK,IAAA,wBAAwB,CAAC,MAAqB,EAAE,UAA0B,EAAE,WAAoB,EAAA;AACpG,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI;AAE5D,QAAA,IAAI,GAAG,GAAG,CAAG,EAAA,MAAM,EAAE;QACrB,IAAI,UAAU,EAAE;YAAE,GAAG,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA,CAAE;;AAE3D,QAAA,GAAG,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI;;IAGnC,KAAK,GAAA;QACD,IAAI,cAAc,GAAG,EAAE;AAEvB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,MAAM,IAAI,GAAa,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACjD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;YAE7B,cAAc,IAAI,QAAQ;AAC1B,YAAA,cAAc,IAAI,CAAG,EAAA,GAAG,CAAK,EAAA,EAAA,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAI;gBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAa,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjD,gBAAA,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,GAAG,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAA,CAAA,CAAG;;gBACtD,OAAO,CAAA,EAAG,GAAG,CAAA,CAAE;AACnB,aAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;;AAGrB,QAAA,OAAO,CAAkB,gBAAA,CAAA;AACrB,YAAA,CAAA,gBAAA,EAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAI,EAAA,CAAA;YACxC,CAAiB,cAAA,EAAA,IAAI,CAAC,UAAU,CAAI,EAAA,CAAA;YACpC,CAAoB,iBAAA,EAAA,cAAc,EAAE;;;;AC9I1C,SAAU,iBAAiB,CAAC,IAAS,EAAA;AACvC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACrB,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;;SAEzC,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,WAAW,EAAE;AAC9C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC;;AAEhB,SAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;;QAEvB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC/D,cAAE;cACA,QAAQ;;SAEX,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;;QAElD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QACpF,IAAI,cAAc,EAAE;YAChB,IAAI,CAAC,cAAc,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC9D,YAAA,OAAO,IAAI;;;AAGnB,IAAA,OAAO,IAAI;AACf;AAEA,SAAS,QAAQ,CAAC,KAAU,EAAA;AACxB,IAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AACvD,QAAA,OAAO,KAAK;;IAGhB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/B,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;AAGrD,IAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;AAC9H,QAAA,OAAO,IAAI;;;AAIf,IAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE;AAC5F,QAAA,OAAO,IAAI;;AAGf,IAAA,OAAO,KAAK;AAChB;AAEa,MAAA,QAAQ,GAAG;IAEpB,QAAQ,CAAC,QAAa,EAAE,KAAa,EAAE,IAAY,EAAE,IAAoB,EAAE,UAA+B,EAAA;AACtG,QAAA,IAAI,KAAK,GAAG,EAAE,EAAE;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAA,mDAAA,CAAqD,CAAC;;AAGrG,QAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAC3B,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACrB,QAAA;AACI,YAAA,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;YAC7B,KAAK;YACL,IAAI;AACP,SAAA,CACJ;;AAGD,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE;AAC1C,YAAA,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE;AACnC,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;QAEF,IAAI,UAAU,EAAE;;YAEZ,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU;YACzC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAA,CAAE,CAAC,GAAG;AACjC,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,YAAY,EAAE,IAAI;aACrB;;aACE;;AAEH,YAAA,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG;AAC3B,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,YAAY,EAAE,IAAI;aACrB;;;AAIL,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;AACxC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE;AACjB,SAAA,CAAC;;AAGF,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;AAClC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;;AAGF,QAAA,IAAI,QAAQ,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;AAC5C,YAAA,IAAI,QAAQ,CAAC,oBAAoB,CAAC,KAAK,SAAS,EAAE;AAC9C,gBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE;AAClD,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,YAAY,EAAE,IAAI;AACrB,iBAAA,CAAC;;YAEN,QAAQ,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;KAEjD;AAED,IAAA,MAAM,CAAC,QAAkB,EAAE,SAAiB,EAAE,GAAW,EAAA;AACrD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;AAG7B,QAAA,KAAK,CAAC,GAAG,GAAG,GAAG;AAEf,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;;AAE9B,YAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE;AAC/C,gBAAA,KAAK,EAAE,EAAE;AACT,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,YAAY,EAAE;AACjB,aAAA,CAAC;;AAGF,YAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,sBAAsB,EAAE;AACpD,gBAAA,KAAK,EAAE,EAAE;AACT,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,YAAY,EAAE;AACjB,aAAA,CAAC;;QAGN,QAAQ,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAEvC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,EAAE;YACxC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;;QAG9C,QAAQ,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;KACpD;IAED,SAAS,CAA4D,MAAS,EAAE,MAA6D,EAAA;;AAEzI,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW;AAChD,QAAA,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;QAEjC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QACtD,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClE,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;;AAGjD,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;YAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;;AAChE,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;YAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;;AACtE,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;YAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;;AACtE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE;YAAE,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM;;;;;AAK3F,QAAA,IAAI,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAC7B,cAAc,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;eAC9C,EAAE,CAAC;AAEV,QAAA,UAAU,EAAE;AAEZ,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YACxB,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;AAG7C,YAAA,MAAM,gBAAgB,GAAG,QAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnG,YAAA,MAAM,SAAS,GAAG,CAAC,gBAAgB;kBAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;kBACrB,IAAI;YAEV,QAAQ,CAAC,QAAQ,CACb,QAAQ,EACR,UAAU,EACV,KAAK,EACL,IAAI,EACJ,qBAAqB,CAAC,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAC9E;AAED,YAAA,UAAU,EAAE;;AAGhB,QAAA,OAAO,MAAM;KAChB;IAED,YAAY,CAAC,QAAa,EAAE,KAAa,EAAA;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,IAAI;KAC7C;AAED,IAAA,IAAI,CAAC,KAAU,EAAA;;;;;QAKX,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ;AACjC,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;AACxC,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;KACL;AAED,IAAA,UAAU,CAAC,WAAgB,EAAA;QACvB,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QACtD,MAAM,cAAc,GAAa,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE7D,QAAA,IAAI,QAAQ,GAAa,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;QAG5E,IAAI,WAAW,KAAK,MAAM,IAAI,QAAQ,KAAK,cAAc,EAAE;AACvD,YAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAE9B,IAAI,cAAc,EAAE;;;;AAIhB,gBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC;;AAG/C,gBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;AACxC,oBAAA,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC;AACjC,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,YAAY,EAAE,IAAI;AAClB,oBAAA,QAAQ,EAAE,IAAI;AACjB,iBAAA,CAAC;;AAGF,gBAAA,IAAI,cAAc,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE;AACjD,oBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE;AAC/C,wBAAA,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAC7C,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,QAAQ,EAAE,IAAI;AACjB,qBAAA,CAAC;AACF,oBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,sBAAsB,EAAE;AACpD,wBAAA,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,sBAAsB,CAAC,EAAE;AACpD,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,QAAQ,EAAE,IAAI;AACjB,qBAAA,CAAC;;;AAIN,gBAAA,IAAI,cAAc,CAAC,oBAAoB,CAAC,KAAK,SAAS,EAAE;AACpD,oBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE;AAClD,wBAAA,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAChD,wBAAA,UAAU,EAAE,KAAK;AACjB,wBAAA,YAAY,EAAE,IAAI;AAClB,wBAAA,QAAQ,EAAE,IAAI;AACjB,qBAAA,CAAC;;;AAIN,gBAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE;AAC1C,oBAAA,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE;AAC1C,oBAAA,UAAU,EAAE,KAAK;AACjB,oBAAA,YAAY,EAAE,IAAI;AAClB,oBAAA,QAAQ,EAAE,IAAI;AACjB,iBAAA,CAAC;;;QAIV,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE;AAChD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,YAAY,EAAE;AACjB,SAAA,CAAC;AAEF,QAAA,OAAO,QAAQ;KAClB;AAED,IAAA,eAAe,CAAC,KAAU,EAAA;QACtB,QACI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AAClC,YAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAY;KAEtG;AAED,IAAA,SAAS,CAAC,KAAU,EAAA;QAChB,MAAM,QAAQ,GAAa,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjD,MAAM,MAAM,GAAQ,EAAE;AACtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE;AAC5C,YAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;;AAE/C,QAAA,OAAO,MAAM;KAChB;IAED,iBAAiB,CAAC,QAAkB,EAAE,KAAa,EAAA;QAC/C,OAAO,QAAQ,GAAG,iBAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;;;;ACjQ7D,SAAS,eAAe,CAAC,aAA8B,EAAA;IACnD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE;AACzD;AAEA;SACgB,oBAAoB,GAAA;IAChC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AAC/C;AAEgB,SAAA,mBAAmB,CAAC,SAAoB,EAAE,KAAa,EAAA;IACnE,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AAChD,IAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AAC/B,QAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;;SAC5D;AACH,QAAA,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,KAAK;;AAErD;AAEgB,SAAA,sBAAsB,CAAC,SAAoB,EAAE,KAAsB,EAAA;IAC/E,IAAI,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,KAAsB,CAAC;AAC/D,IAAA,IAAI,eAAe,KAAK,SAAS,EAAE;;;;;;;AAO/B,QAAA,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACzD,QAAA,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,eAAe,CAAC,GAAG,CAAC,CAAC;;AAElG,IAAA,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,SAAS;AACjD,IAAA,OAAO,SAAS,CAAC,OAAO,CAAC,KAAsB,CAAC;AACpD;MA6Ba,UAAU,CAAA;AAmCnB,IAAA,WAAA,CAAY,GAAM,EAAA;AA3BlB;;AAEG;QACH,IAAU,CAAA,UAAA,GAAY,KAAK;QAG3B,IAAiB,CAAA,iBAAA,GAAsB,EAAE;;;;;;;;QASzC,IAAO,CAAA,OAAA,GAAc,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACpD,IAAU,CAAA,UAAA,GAAc,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;AAMvD;;AAEG;QACH,IAAK,CAAA,KAAA,GAAG,IAAI;AAGR,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG;QACd,IAAI,CAAC,QAAQ,GAAI,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;;;;QAKnE,IAAI,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;;;AAI9D,IAAA,OAAO,CAAC,IAAU,EAAA;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAEhB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC;;QAGpE,IAAI,eAAe,EAAE;YACjB,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC3B,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;AACrB,oBAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;;qBAChB;AACH,oBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;AAExB,aAAC,CAAC;;;AAIV,IAAA,SAAS,CACL,MAAW,EACX,IAAW,EACX,WAAoB,EAAA;AAEpB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;;QAGnC,IAAI,CAAC,IAAI,EAAE;YAAE;;QAEb,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGtC,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;YAChB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;;;QAI9D,IAAI,eAAe,EAAE;;;;YAIjB,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC/B,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;;;;;AAKrB,oBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACf,oBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBAC5B;;gBAEJ,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;AAC1C,aAAC,CAAC;;;AAIV,IAAA,YAAY,CAAC,QAA+C,EAAA;;;;AAIxD,QAAA,IAAK,IAAI,CAAC,GAAW,CAAC,UAAU,CAAC,EAAE;AAC/B,YAAA,IAAI,QAAS,IAAI,CAAC,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ,EAAE;;AAErD,gBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAK,IAAI,CAAC,GAAiB,CAAC,OAAO,EAAE,EAAE;oBAC1D,IAAI,CAAC,KAAK,EAAE;wBAAE;AAAU,qBAAC;AACzB,oBAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC;;;;aAI1D;AACH,YAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,IAAI,EAAE,EAAE;gBAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAsB,CAAC;gBACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAiB,CAAC;gBAC/C,IAAI,CAAC,KAAK,EAAE;oBAAE;;gBACd,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;;;;AAK5C,IAAA,SAAS,CAAC,EAAa,EAAA;;;AAGnB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;;aAElD;YACH,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;;;AAIrD,IAAA,MAAM,CAAC,KAAa,EAAE,SAAuB,GAAA,SAAS,CAAC,GAAG,EAAA;AACtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC;AACjF,QAAA,MAAM,SAAS,GAAG,CAAC,UAAU;cACvB,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,OAAO;QAElB,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,KAAK,SAAS,CAAC,MAAM,EAAE;AAC9D,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,iBAAiB;AAC1B,kBAAE;AACF,kBAAE,CAAC,iBAAiB,KAAK,SAAS,CAAC,MAAM;sBACnC,SAAS,CAAC;sBACV,SAAS;;;;AAInB,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE;;AAGtC,QAAA,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC;QAErC,IAAI,UAAU,EAAE;AACZ,YAAA,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC;AAEnD,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,CAAC;;;aAGxD;AACH,YAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;;;AAIrD,IAAA,kBAAkB,CAAC,UAAkB,EAAA;;;;;;AAMjC,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,UAAU;cAC5B,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,OAAO;QAElB,MAAM,oBAAoB,GAAQ,EAAE;QACpC,MAAM,UAAU,GAAgC,EAAE;AAClD,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACxC,YAAA,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAChF,YAAA,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;;AAErE,QAAA,IAAI,CAAC,iBAAiB,GAAG,oBAAoB;AAC7C,QAAA,SAAS,CAAC,OAAO,GAAG,UAAU;AAE9B,QAAA,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,UAAU,CAAC;;AAGlF,IAAA,qBAAqB,CAAC,UAAkB,EAAE,UAAA,GAAqB,CAAC,EAAA;;;;;;AAM5D,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC;YAC5E,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;;aAEjE;YACH,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;;;AAIpE,IAAA,sBAAsB,CAAC,UAAkB,EAAE,UAAqB,GAAA,CAAC,EAAE,SAAoB,EAAA;QAC3F,MAAM,UAAU,GAAgC,EAAE;QAClD,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE;YACjC,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;;AAEjD,QAAA,SAAS,CAAC,OAAO,GAAG,UAAU;AAE9B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACrC,YAAA,IAAI,KAAK,GAAG,UAAU,EAAE;gBACpB,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,UAAU;;;;AAKxD,IAAA,gBAAgB,CAAC,KAAa,EAAE,SAAoB,EAAE,kBAA0B,KAAK,EAAA;AACjF,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,SAAS;AAEzC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;AACpC,YAAA,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC;AAC7D,YAAA,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;YAChD,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;;aAElD;AACH,YAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC;AACrD,YAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;YACxC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;;;AAIrD,IAAA,OAAO,CAAC,KAAc,EAAA;QAClB;;;;;;;AAOK,QAAA,IAAI,CAAC,GAAW,CAAC,UAAU,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI;;;AAIjC,IAAA,SAAS,CAAC,KAAa,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;;;;;AAMxC,IAAA,QAAQ,CAAC,KAAa,EAAE,WAAA,GAAuB,KAAK,EAAA;;;;QAIhD,OAAQ,IAAI,CAAC,GAAW,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC;;AAG7D,IAAA,MAAM,CAAC,KAAa,EAAE,SAAqB,EAAE,eAAe,GAAG,KAAK,EAAA;AAChE,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACrB,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAA,CAAG,CAAC;;YAClH,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;YAEnB;;QAGJ,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;cAC/C,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,OAAO;QAElB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM;AAC7D,QAAA,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC;AACrC,QAAA,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC;QAExD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAG1C,QAAA,IAAI,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE;;;;;;;;;;;YAW1C,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;;;;;AAM9C,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;AACpC,YAAA,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC;YAChE,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;;aAElD;YACH,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;;AAGjD,QAAA,OAAO,aAAa;;AAGxB,IAAA,SAAS,CAAC,aAA4B,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;;AAG3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,eAAe,EAAE;;AAGtC,QAAA,IAAI,CAAC,GAAW,CAAC,YAAY,CAAC,IAAI;;AAGnC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;IAGtB,OAAO,CAAC,aAAsB,KAAK,EAAA;;;;;;AAM9B,QAAA,IAAI,CAAC,GAAW,CAAC,YAAY,CAAC,IAAI;AAEnC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;QAC3B,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AAE1D,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;;QAG9E,IAAI,UAAU,EAAE;;YAEZ,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAEhE,YAAA,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;gBACvC,IAAI,CAAC,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC;;;;AAK5F;;;AAGG;IACH,UAAU,GAAA;QACN,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAChD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC7C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5C,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;AAC1B,gBAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE;;;QAIpC,IAAI,CAAC,OAAO,EAAE;;AAGlB,IAAA,IAAI,OAAO,GAAA;AACP,QAAA,QAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC;;AAGnD,IAAA,eAAe,CAAC,MAAW,EAAE,WAAmB,EAAE,eAAwB,EAAA;QAChF,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;;;;;;;AAO5B,YAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC;AAEhD,YAAA,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAErD,IAAI,eAAe,EAAE;oBACjB,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,CAAC;;;;AAKpE,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;YAE7C,IAAI,eAAe,EAAE;gBACjB,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;;;;IAKlD,sBAAsB,CAAC,MAAW,EAAE,WAAmB,EAAA;;QAE7D,IAAI,CAAC,MAAM,EAAE;YAAE;;;;;;QAMf,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG;AAC7C,cAAE,IAAI,CAAC,GAAG,CAAC;AACX,cAAG,IAAI,CAAC,GAAW,CAAC,UAAU,CAAC;AAEnC,QAAA,IAAI,gBAA4B;QAEhC,IAAI,kBAAkB,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;QAC1D,IAAI,kBAAkB,EAAE;AACpB,YAAA,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;AACnC,YAAA,MAAM,GAAG,gBAAgB,CAAC,MAAM;AAChC,YAAA,WAAW,GAAG,gBAAgB,CAAC,WAAW;;aAEvC;AACH,YAAA,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;;AAGvC,QAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAA4B;AAE7D,QAAA,IAAI,GAAG,GAAG,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAwB,CAAC,EAAE;QAClE,IAAI,iBAAiB,EAAE;AACnB,YAAA,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;;AAE/D,QAAA,GAAG,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE;AAExB,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;QAErG,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU;eACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG;AAClC,eAAA,eAAe;;;;;AAMtB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AAEjB,YAAA,IAAI,CAAC,4BAA4B,IAC7B,gBAAgB,CAAC,UAAU;AAC3B,gBAAA,QAAQ,OAAO,CAAC,KAAK,QAAQ;AAC7B,gBAAA,CAAC,eAAe;AAChB,gBAAA,kBAAkB,CACrB;AAED,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,CAAC,eAAe,GAAG,eAAe,EAAE;AACxC,gBAAA,IAAI,CAAC,kBAAkB,GAAG,eAAe,EAAE;;YAG/C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,KAClC,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;gBAErD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,KACrC,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAExD,gBAAA,IAAI,CAAC,OAAO,GAAG,eAAe,EAAE;AAChC,gBAAA,IAAI,CAAC,UAAU,GAAG,eAAe,EAAE;;;;AAK/C;;AAEG;AACH,IAAA,IAAI,MAAM,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG;;AAGhC;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;;AAGlC;;AAEG;IACH,SAAS,CAAC,MAAW,EAAE,KAAa,EAAA;;QAEhC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;;AAE5D,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK;YAC9B;;QAGJ,IAAI,CAAC,WAAW,GAAG;AACf,YAAA,GAAG,EAAE,MAAM;YACX,KAAK;YACL,IAAI,EAAE,IAAI,CAAC;SACd;;AAGL;;;;AAIG;AACH,IAAA,YAAY,CAAC,MAAA,GAAc,IAAI,CAAC,MAAM,EAAA;AAClC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW;QAC9B,IAAI,QAAQ,GAAG,IAAI;QACnB,OAAO,OAAO,EAAE;;;;;AAKZ,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE;gBAC5C,IAAI,QAAQ,EAAE;AACV,oBAAA,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;;qBACzB;AACH,oBAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI;;AAEnC,gBAAA,OAAO,IAAI;;YAEf,QAAQ,GAAG,OAAO;AAClB,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS;;AAGzC;;AAEG;AACH,IAAA,UAAU,CAAC,SAAkD,EAAA;AACzD,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW;QAC9B,OAAO,OAAO,EAAE;YACZ,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;AACvC,gBAAA,OAAO,OAAO;;AAElB,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,OAAO,SAAS;;AAGpB;;AAEG;AACH,IAAA,SAAS,CAAC,SAAkD,EAAA;QACxD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS;;AAGnD;;AAEG;IACH,aAAa,GAAA;QACT,MAAM,OAAO,GAAuC,EAAE;AACtD,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW;QAC9B,OAAO,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;AACxD,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,OAAO,OAAO;;AAGrB;;AC9pBe,SAAA,WAAW,CACvB,OAAgB,EAChB,KAAa,EACb,IAAS,EACT,KAAU,EACV,SAAoB,EACpB,EAAY,EAAA;AAEZ,IAAA,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE;QAC3B,MAAc,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;;SAEtC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;;;;;AAK5C,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;;AAG/C,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;AAC/C,YAAA,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,IAAqB,EAAE,KAAK,CAAC,WAA4B,EAAE,EAAE,CAAC;;;SAG9F;;;;;AAKH,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;;AAEvD;AAEA;;;AAGG;MACU,qBAAqB,GAAoB,UAClD,OAAgB,EAChB,KAAa,EACb,UAAyB,EACzB,KAAa,EACb,SAAoB,EACpB,EAAY,EACZ,CAAM,EACN,EAAO,EACP,QAAkB,EAAA;;AAGlB,IAAA,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,IAAI,GAAG;;AAG9C,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE;QAChC;;AAGJ,IAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;AAC1B,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;;IAG7B,WAAW,CACP,OAAO,EACP,KAAK,EACL,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EACpB,GAAG,CAAC,KAAK,CAAC,IAAe,CAAC,EAC1B,SAAS,EACT,EAAE,CACL;AACL;AAEA;;;AAGG;AACI,MAAM,uBAAuB,GAAoB,UACpD,OAAgB,EAChB,KAAa,EACb,UAAsB,EACtB,KAAa,EACb,SAAoB,EACpB,EAAY,EAAA;;IAGZ,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,GAAG;;IAGpC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;;AAG/B,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE;QAChC;;AAGJ,IAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;;;;AAK1B,IAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAC/C,IAAI,QAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE;;;;AAInC,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;;;AAI9C,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;;;;;;;;;;;;;;AAgBrC,IAAA,WAAW,CACP,OAAO,EACP,KAAK,EACL,IAAI,EACJ,KAAK,EACL,SAAS,EACT,EAAE,CACL;AACL;AAEA;;;AAGG;AACU,MAAA,WAAW,GAAoB,UACxC,OAAgB,EAChB,KAAa,EACb,UAAmC,EACnC,KAAa,EACb,SAAoB,EACpB,EAAY,EACZ,WAAoB,EACpB,OAAgB,EAAA;AAEhB,IAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;IAC1B,MAAM,mBAAmB,GAAG,OAAO,IAAI,UAAU,CAAC,UAAU,KAAK,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC;AAEjH,IAAA,IAAI,UAAkB;IAEtB,IAAI,mBAAmB,EAAE;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC;;QAGnC,IAAI,CAAC,IAAI,EAAE;YAAE;;AAEb,QAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEjC,QAAA,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE;AAChC,YAAA,SAAS,GAAG,SAAS,CAAC,eAAe;;AAElC,aAAA,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE;AACpC,YAAA,SAAS,GAAG,SAAS,CAAC,YAAY;;;SAGnC;QACH,UAAU,GAAG,KAAK;;;IAItB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,GAAG,GAAG;;IAGpC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;;AAGpC,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,IAAI,SAAS,KAAK,SAAS,CAAC,eAAe,EAAE;QAC3E;;IAGJ,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;;;;;;;;;;AAarD,IAAA,WAAW,CACP,OAAO,EACP,KAAK,EACL,IAAI,EACJ,KAAK,EACL,SAAS,EACT,EAAE,CACL;AACL;;AC7MO,MAAM,mBAAmB,GAAG,EAAE;SAUrB,WAAW,CACvB,OAAgB,EAChB,SAAoB,EACpB,GAAM,EACN,KAAa,EACb,IAAS,EACT,KAAa,EACb,EAAY,EACZ,UAAwB,EAAA;AAExB,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI;IAC1B,MAAM,aAAa,GAAI,GAAW,CAAC,WAAW,CAAC,CAAC,KAAK,CAAM;AAE3D,IAAA,IAAI,KAAU;AAEd,IAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,EACvD;;QAEI,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;AACrD,QAAA,IAAI,aAAa,KAAK,SAAS,EAAE;AAAE,YAAA,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;;;;;AAKjE,QAAA,IAAI,SAAS,KAAK,SAAS,CAAC,cAAc,EAAE;AACvC,YAAA,GAAW,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC;;QAGvC,KAAK,GAAG,SAAS;;AAGrB,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,MAAM,EAAE;AAK7B,SAAA,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;AAC/C,YAAA,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC;YAC1D,IAAI,CAAC,KAAK,EAAE;AACR,gBAAA,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC;;AAGnD,YAAA,KAAK,CAAC,MAAM,CACR,KAAK,EACL,KAAK,GAED,KAAK,KAAK,aAAa;iBACtB,SAAS,KAAK,SAAS,CAAC,cAAc,IAAI,KAAK,KAAK,aAAa,CAAC;AACtE,cACJ;;;AAGF,SAAA,IAAI,QAAO,IAAI,CAAC,KAAK,QAAQ,EAAE;;;;QAIlC,KAAK,GAAI,MAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;;SAErC;AACH,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;cACtC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;AACvC,cAAE,IAAI,OAAO,CAAC,WAAW,EAAE;AAE/B,QAAA,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAC5B,QAAA,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,aAAa,EAAE;YACf,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;YAEnD,IAAI,aAAa,KAAK,SAAS,IAAI,KAAK,KAAK,aAAa,EAAE;;;;AAIxD,gBAAA,MAAM,OAAO,GAAkC,aAAqB,CAAC,OAAO,EAAE;AAC9E,gBAAA,IAAI,IAAgC;AACpC,gBAAA,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;oBAC1C,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK;;AAG/B,oBAAA,IAAI,QAAO,KAAK,CAAC,KAAK,QAAQ,EAAE;wBAC5B,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,wBAAA,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;;oBAGlC,UAAU,CAAC,IAAI,CAAC;AACZ,wBAAA,GAAG,EAAE,aAAa;AAClB,wBAAA,KAAK,EAAE,aAAa;wBACpB,EAAE,EAAE,SAAS,CAAC,MAAM;AACpB,wBAAA,KAAK,EAAE,GAAG;AACV,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,aAAa,EAAE,KAAK;AACvB,qBAAA,CAAC;;;;QAMd,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GACrB,QAAQ,KAAK,aAAa;AAC1B,aAAC,SAAS,KAAK,SAAS,CAAC,cAAc,IAAI,QAAQ,KAAK,aAAa,CAAC,EACxE;;AAGN,IAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE;AACnC;AAEO,MAAM,qBAAqB,GAAoB,UAClD,OAAqB,EACrB,KAAa,EACb,EAAY,EACZ,GAAM,EACN,UAAwB,EAAA;IAExB,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;;IAG9E,MAAM,SAAS,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,UAAU,IAAI,SAAS,IAAI,GAAG,CAAC;;AAG7C,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC7B,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACrB,QAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtG,QAAA,OAAO,mBAAmB;;IAG9B,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,WAAW,CACxC,OAAO,EACP,SAAS,EACT,GAAG,EACH,KAAK,EACL,KAAK,CAAC,IAAI,EACV,KAAK,EACL,EAAE,EACF,UAAU,CACb;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACvC,QAAA,GAAG,CAAC,KAAK,CAAC,IAAe,CAAC,GAAG,KAAK;;;AAItC,IAAA,IAAI,aAAa,KAAK,KAAK,EAAE;QACzB,UAAU,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,YAAY;AAC3B,YAAA,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,KAAK;YACL,aAAa;AAChB,SAAA,CAAC;;AAEV;AAEO,MAAM,uBAAuB,GAAoB,UACpD,OAAqB,EACrB,KAAa,EACb,EAAY,EACZ,GAAQ,EACR,UAAwB,EAAA;;IAGxB,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AAEpC,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,KAAK,EAAE;;;;;;AAM/B,QAAA,OAAO,CAAC,eAAe,CAAC,GAA4B,EAAE,UAAU,CAAC;QAEhE,GAAW,CAAC,KAAK,EAAE;QACpB;;IAGJ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AACtC,IAAA,MAAM,IAAI,GAAI,GAAW,CAAC,UAAU,CAAC;AAErC,IAAA,IAAI,YAA6B;AAEjC,IAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAC/C,IAAI,QAAQ,GAAW,CAAC,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE;YAC5C,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvC,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC;;aAC1C;AACH,YAAA,YAAY,GAAG,KAAK,CAAC;;;SAEtB;;QAEH,YAAY,GAAI,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC;;IAGlD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,WAAW,CACxC,OAAO,EACP,SAAS,EACT,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,EAAE,EACF,UAAU,CACb;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;QACvC,IAAI,QAAQ,GAAW,CAAC,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE;;YAE3C,GAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,YAAsB,EAAE,KAAK,CAAC;;aAEtD,IAAI,QAAQ,GAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU,EAAE;;YAErD,GAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;;aAE5C,IAAI,QAAQ,GAAW,CAAC,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE;;YAEnD,MAAM,KAAK,GAAI,GAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAErC,YAAA,IAAI,QAAO,KAAK,CAAC,KAAK,QAAQ,EAAE;gBAC3B,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;;;;;AAMlD,IAAA,IAAI,aAAa,KAAK,KAAK,EAAE;QACzB,UAAU,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,YAAY;AAC3B,YAAA,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,EAAE;YACT,YAAY;YACZ,KAAK;YACL,aAAa;AAChB,SAAA,CAAC;;AAEV;AAEO,MAAM,WAAW,GAAoB,UACxC,OAAqB,EACrB,KAAa,EACb,EAAY,EACZ,GAAgB,EAChB,UAAwB,EAAA;;IAGxB,IAAI,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;AAClC,IAAA,IAAI,KAAa;AAEjB,IAAA,IAAI,SAAS,KAAK,SAAS,CAAC,KAAK,EAAE;;;;;;AAM/B,QAAA,OAAO,CAAC,eAAe,CAAC,GAA4B,EAAE,UAAU,CAAC;QAChE,GAAmB,CAAC,KAAK,EAAE;QAC5B;;AAEG,SAAA,IAAI,SAAS,KAAK,SAAS,CAAC,OAAO,EAAE;QACvC,GAAmB,CAAC,OAAO,EAAE;QAC9B;;AAEG,SAAA,IAAI,SAAS,KAAK,SAAS,CAAC,eAAe,EAAE;;QAEhD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AACtC,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAClD,QAAA,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,aAAa,CAAC;AACzD,QAAA,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,YAAY;YAC3B,EAAE,EAAE,SAAS,CAAC,MAAM;YACpB,KAAK,EAAE,EAAE;AACT,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,KAAK,EAAE,SAAS;YAChB,aAAa;AAChB,SAAA,CAAC;QAEF;;AAEG,SAAA,IAAI,SAAS,KAAK,SAAS,CAAC,YAAY,EAAE;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AACtC,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;QAGhD,IAAI,WAAW,EAAE;AACb,YAAA,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,CAAC;;;QAI3D,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,SAAS,EAAE;AACrC,YAAA,KAAK,GAAG,GAAG,CAAC,MAAM;;;SAGnB;QACH,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;;AAGpC,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;IAE5B,IAAI,YAAY,GAAoB,KAAK;IAEzC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,WAAW,CACxC,OAAO,EACP,SAAS,EACT,GAAG,EACH,KAAK,EACL,IAAI,EACJ,KAAK,EACL,EAAE,EACF,UAAU,CACb;AAED,IAAA,IACI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QACrC,KAAK,KAAK,aAAa;MACzB;;QAEG,GAAmB,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;;;AAI3D,IAAA,IAAI,aAAa,KAAK,KAAK,EAAE;QACzB,UAAU,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,KAAK,EAAE,OAAO,CAAC,YAAY;AAC3B,YAAA,EAAE,EAAE,SAAS;YACb,KAAK,EAAE,EAAE;YACT,YAAY;YACZ,KAAK;YACL,aAAa;AAChB,SAAA,CAAC;;AAEV,CAAC;;ACjXK,MAAO,iBAAkB,SAAQ,KAAK,CAAA;AAAG;AAEzC,SAAU,UAAU,CAAC,KAAU,EAAE,IAAY,EAAE,KAAa,EAAE,KAAsB,EAAA;AACtF,IAAA,IAAI,YAAoB;IACxB,IAAI,SAAS,GAAY,KAAK;IAE9B,QAAQ,IAAI;AACR,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,MAAM;AACX,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,SAAS;YACV,YAAY,GAAG,QAAQ;AACvB,YAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;AACd,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,0BAAA,EAA6B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC;;YAE/E;AACJ,QAAA,KAAK,UAAU;AACf,QAAA,KAAK,WAAW;YACZ,YAAY,GAAG,QAAQ;YACvB;AACJ,QAAA,KAAK,QAAQ;YACT,YAAY,GAAG,QAAQ;YACvB,SAAS,GAAG,IAAI;YAChB;AACJ,QAAA,KAAK,SAAS;;YAEV;AACJ,QAAA;;;YAGI;;IAGR,IAAI,QAAQ,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE;AAClF,QAAA,IAAI,UAAU,GAAG,CAAI,CAAA,EAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,CAAA,EAAA,EAAK,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA,CAAA,CAAG,KAAK,EAAE,CAAA,CAAE;AACpH,QAAA,MAAM,IAAI,iBAAiB,CAAC,CAAM,GAAA,EAAA,YAAY,uBAAuB,UAAU,CAAA,iBAAA,EAAoB,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,CAAA,CAAE,CAAC;;AAE7I;AAEM,SAAU,kBAAkB,CAC9B,KAAU,EACV,IAIsB,EACtB,QAAa,EACb,KAAsB,EAAA;AAEtB,IAAA,IAAI,EAAE,KAAK,YAAY,IAAI,CAAC,EAAE;QAC1B,MAAM,IAAI,iBAAiB,CAAC,CAAM,GAAA,EAAA,IAAI,CAAC,IAAI,CAAA,qBAAA,EAAwB,KAAK,IAAK,KAAa,CAAC,WAAW,CAAC,IAAI,CAAqB,kBAAA,EAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAC;;AAE7K;;;ACtDA,MAAM,YAAY,GAAG,CAAC,CAAM,EAAE,CAAM,KAAI;AACpC,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;AACtB,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE;SACf,IAAI,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,CAAC;;AACnB,QAAA,OAAO,CAAC;AACjB,CAAC;MAEY,WAAW,CAAA;aAWb,IAAU,CAAAC,IAAA,CAAA,GAAG,WAAH,CAAe;aACzB,IAAU,CAAAC,IAAA,CAAA,GAAG,WAAH,CAAe;AAEhC;;;;;;;;AAQG;AACH,IAAA,SAAOD,IAAA,GAZC,QAAQ,EAAAC,IAAA,GACR,QAAQ,EAWR,OAAO,EAAC,CAAE,GAAgB,EAAE,KAAa,EAAE,IAAe,EAAA;QAC9D,QACI,CAAC,IAAI;AACL,YAAA,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ;AACrC,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;;IAIpE,OAAO,EAAE,CAAC,IAAS,EAAA;QACf;;AAEI,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;;aAGlB,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;;IAIrC,OAAO,IAAI,CAAI,QAAoC,EAAA;QAC/C,OAAO,IAAI,WAAW,CAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;AAGtD,IAAA,WAAA,CAAa,GAAG,KAAU,EAAA;QAvChB,IAAK,CAAA,KAAA,GAAQ,EAAE;QACf,IAAQ,CAAA,QAAA,GAAQ,EAAE;QAClB,IAAc,CAAA,cAAA,GAA+B,EAAE;QAC/C,IAAa,CAAA,aAAA,GAAG,KAAK;AAqC3B,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;AAEF,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;AAC1B,YAAA,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,KAAI;AACf,gBAAA,IACI,QAAQ,IAAI,CAAC,KAAK,QAAQ;;AAE1B,oBAAA,CAAC,KAAK,CAAC,IAAW,CAAC;kBACrB;AACE,oBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAyB,CAAC;;qBAEzC;oBACH,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;;aAEpC;YAED,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,KAAI;AACxB,gBAAA,IAAI,QAAQ,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAU,CAAC,EAAE;oBACjD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE;AAC7C,wBAAA,GAAG,CAAC,SAAS,CAAC,GAAwB,CAAC;;yBAEpC;AACH,wBAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACpB,4BAAA,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAkB,EAAE,GAAG,EAAE,GAAG,CAAC;4BAExE,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,GAAwB,CAAC;AAEzD,4BAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gCACpB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;;iCAEjC;AACH,gCAAA,IAAI,aAAa,KAAK,SAAS,EAAE;AAC7B,oCAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;AAC1B,wCAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,YAAY,CAAC;;yCAEhE;wCACH,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE;AAChF,4CAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC;;6CAEnE;AACH,4CAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;AAIhE,qCAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;AACjC,oCAAA,GAAG,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC;;AAG9D,gCAAA,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;;AAG/D,4BAAA,IAAI,aAAa,KAAK,SAAS,EAAE;;AAE7B,gCAAA,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;;;6BAG9D;4BACH,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;;AAGxC,wBAAA,GAAG,CAAC,KAAK,CAAC,GAAwB,CAAC,GAAG,QAAQ;AAC9C,wBAAA,GAAG,CAAC,QAAQ,CAAC,GAAwB,CAAC,GAAG,QAAQ;;AAGrD,oBAAA,OAAO,IAAI;;qBACR;oBACH,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;;aAE7C;AAED,YAAA,cAAc,EAAE,CAAC,GAAG,EAAE,IAAI,KAAI;AAC1B,gBAAA,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE;AAC5B,oBAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;;qBAEhB;AACH,oBAAA,OAAO,GAAG,CAAC,IAAyB,CAAC;;AAGzC,gBAAA,OAAO,IAAI;aACd;AAED,YAAA,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAI;AACd,gBAAA,IAAI,QAAQ,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;oBAClD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;;gBAEvC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;;AAEnC,SAAA,CAAC;AAEF,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;AAClC,YAAA,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC;AAC5B,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACjB,SAAA,CAAC;AAEF,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;AAGvB,QAAA,OAAO,KAAK;;IAGhB,IAAI,MAAM,CAAE,SAAiB,EAAA;AACzB,QAAA,IAAI,SAAS,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;;aACT,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;;aAC5C;AACH,YAAA,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC;;;AAIzF,IAAA,IAAI,MAAM,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;;IAG5B,IAAI,CAAC,GAAG,MAAW,EAAA;AACf,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;AAEjC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;AACrD,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;YAEvB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;;gBAEvC;;AAEG,iBAAA,IAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE;AACxD,gBAAA,kBAAkB,CAAC,KAAY,EAAE,IAAI,CAAC,UAAU,CAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;;;AAIhF,YAAA,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAErE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;AAMzB,YAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;;AAG7D,QAAA,OAAO,MAAM;;AAGjB;;AAEG;IACH,GAAG,GAAA;AACC,QAAA,IAAI,KAAK,GAAW,EAAE;;AAGtB,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;;YAEhD,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACjC,KAAK,GAAG,CAAC;gBACT;;;AAIR,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACX,YAAA,OAAO,SAAS;;AAGpB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAE9D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI;AAEjC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;;AAG3B,IAAA,EAAE,CAAC,KAAa,EAAA;;QAEZ,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,KAAK,IAAI,IAAI,CAAC,MAAM;AACnC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;;IAIlB,SAAS,CAAC,KAAa,EAAE,KAAQ,EAAA;QACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACvC,YAAA,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC;YAC/F;;;QAIJ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC7B;;QAGJ,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS;AAC9C,cAAE,QAAO,KAAK,CAAC,KAAK;AAChB,kBAAE,SAAS,CAAC,cAAc;AAC1B,kBAAE,SAAS,CAAC,OAAO;AACvB,cAAE,SAAS,CAAC,GAAG;AAEnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;;;;;AAMnC,QAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;;;IAIlD,SAAS,CAAC,KAAa,EAAE,SAAqB,EAAA;QACpD,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;;;AAIjC,IAAA,MAAM,CAAC,KAAa,EAAE,KAAQ,EAAE,SAAoB,EAAA;QAC1D,IACI,KAAK,KAAK,CAAC;YACX,SAAS,KAAK,SAAS,CAAC,GAAG;YAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,EACjC;;AAEE,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;AAEtB,aAAA,IAAI,SAAS,KAAK,SAAS,CAAC,eAAe,EAAE;YAChD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK;;aAEtB;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK;;;IAIjC,KAAK,GAAA;;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB;;;AAIJ,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;QAGjC,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC,KAAI;AAC3C,YAAA,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC;AAC5C,SAAC,CAAC;AAEF,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;AACxB,QAAA,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AAErC,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;;AAG5B;;;AAGG;;IAEH,MAAM,CAAC,GAAG,KAA6B,EAAA;AACnC,QAAA,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;;AAG1D;;;AAGG;AACH,IAAA,IAAI,CAAC,SAAkB,EAAA;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGrC;;AAEG;;IAEH,OAAO,GAAA;QACH,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvB,QAAA,OAAO,IAAI;;AAGf;;AAEG;IACH,KAAK,GAAA;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAAE,YAAA,OAAO,SAAS;;AAE/C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5E,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC;QAC3D,UAAU,CAAC,qBAAqB,CAAC,EAAE,EAAE,eAAe,CAAC;AAErD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI;AAEjC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;AAG7B;;;;AAIG;IACH,KAAK,CAAC,KAAc,EAAE,GAAY,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,WAAW,EAAK;AACnC,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5C,QAAA,OAAO,MAAwB;;AAGnC;;;;;;;;AAQG;IACH,IAAI,CAAC,YAAoC,YAAY,EAAA;AACjD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;;QAG9C,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;AAEtE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAE7B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,OAAO,IAAI;;AAGf;;;;;AAKG;AACH,IAAA,MAAM,CACF,KAAa,EACb,WAAoB,EACpB,GAAG,WAAgB,EAAA;AAEnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;AAEjC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AACrC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;AAC3C,QAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM;;QAGtC,MAAM,OAAO,GAAa,EAAE;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AACjC,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;;AAIvB,QAAA,IAAI,WAAW,GAAG,KAAK,EAAE;;AAErB,YAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC3B,gBAAA,WAAW,GAAG,WAAW,GAAG,KAAK;;;;;AAMrC,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AAC9C,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;gBACxB,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;AAC1C,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI;;;aAGlC;;YAEH,WAAW,GAAG,CAAC;;;AAInB,QAAA,IAAI,WAAW,GAAG,CAAC,EAAE;AACjB,YAAA,IAAI,WAAW,GAAG,WAAW,EAAE;AAC3B,gBAAA,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC;AAClF,gBAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;;AAGjG,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AAClC,gBAAA,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,IAAI,CAAC;AAEpD,gBAAA,UAAU,CAAC,gBAAgB,CACvB,QAAQ,EACR,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;sBACxB,SAAS,CAAC;AACZ,sBAAE,SAAS,CAAC,GAAG,CACtB;;AAGD,gBAAA,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;;;;;;;AAQ5E,QAAA,IAAI,WAAW,GAAG,WAAW,EAAE;AAC3B,YAAA,UAAU,CAAC,qBAAqB,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;;;;;;AAOhG,QAAA,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE;YAC1C,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,CAAC;;aAE9D;YACH,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC;;AAG7D,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;;AAGhE;;;AAGG;IACH,OAAO,CAAC,GAAG,KAAU,EAAA;AACjB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAGjC,QAAA,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC;;AAG3C,QAAA,IAAI,UAAU,CAAC,UAAU,EAAE;YACvB,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;;aAE/D;YACH,mBAAmB,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;;;QAKjE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAI;YACvB,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;AAC3C,SAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAE/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;;AAGvC;;;;AAIG;IACH,OAAO,CAAC,aAAgB,EAAE,SAAkB,EAAA;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;;AAGvD;;;;AAIG;IACH,WAAW,CAAC,aAAgB,EAAE,SAAA,GAAoB,IAAI,CAAC,MAAM,GAAG,CAAC,EAAA;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC;;IAa3D,KAAK,CAAC,UAA4D,EAAE,OAAa,EAAA;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC;;AAGhD;;;;;;;AAOG;IACH,IAAI,CAAC,UAA4D,EAAE,OAAa,EAAA;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;;AAG/C;;;;AAIG;IACH,OAAO,CAAC,UAAyD,EAAE,OAAa,EAAA;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;;AAGlD;;;;AAIG;IACH,GAAG,CAAI,UAAsD,EAAE,OAAa,EAAA;QACxE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;;IAS9C,MAAM,CAAc,UAA+D,EAAE,OAAa,EAAA;QAC9F,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;;AAGjD;;;;AAIG;IACH,MAAM,CAAM,UAAsF,EAAE,YAAgB,EAAA;QAChH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;;AAGtD;;;;AAIG;IACH,WAAW,CAAM,UAAsF,EAAE,YAAgB,EAAA;QACrH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC;;AAG3D;;;;;;;;AAQG;IACH,IAAI,CAAC,SAAyD,EAAE,OAAa,EAAA;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;;AAG9C;;;;;;;;AAQG;IACH,SAAS,CAAC,SAAyD,EAAE,OAAa,EAAA;QAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;;AAGnD;;;;;;;AAOG;AACH,IAAA,IAAI,CAAC,KAAQ,EAAE,KAAc,EAAE,GAAY,EAAA;;;;AAIvC,QAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;;AAMzD;;;;;;;;AAQG;AACH,IAAA,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,GAAY,EAAA;;;;AAIlD,QAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;;AAI/D;;AAEG;IACH,QAAQ,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;;AAGhC;;AAEG;IACH,cAAc,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;;;;IAItC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;;AAGxC,IAAA,YAAY,MAAM,CAAC,OAAO,CAAC,GAAA;AACvB,QAAA,OAAO,WAAW;;AAQtB;;AAEG;IACH,OAAO,GAAA,EAAiC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AAEpE;;AAEG;IACH,IAAI,GAAA,EAA4B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAEzD;;AAEG;IACH,MAAM,GAAA,EAAuB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AAExD;;;;AAIG;IACH,QAAQ,CAAC,aAAgB,EAAE,SAAkB,EAAA;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;;;;;AAOxD;;;;;;;;;AASG;;IAEH,OAAO,CAAsB,QAAmF,EAAE,OAAc,EAAA;;AAE5H,QAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;;AAG9D;;;;;AAKG;;AAEH,IAAA,IAAI,CAAmC,KAAS,EAAA;AAC5C,QAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;;IAG3D,QAAQ,GAAA;;AAEJ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;;IAG3D,aAAa,CAAC,GAAG,IAAW,EAAA;;AAExB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;;;;;IAMhE,IAAI,CAAC,KAAa,EAAE,KAAQ,EAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;QAE/B,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,KAAK,IAAI,IAAI,CAAC,MAAM;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AACnB,QAAA,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC;;IAEnC,UAAU,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE;;AAEvC,IAAA,QAAQ,CAAC,SAAkC,EAAA;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;;;AAK7C,IAAA,SAAS,CAAC,KAAc,EAAE,WAAqB,EAAE,GAAG,KAAiB,EAAA;;AAEjE,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;;IAGtD,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;AACnB,YAAA,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AACpC,YAAA,OAAO,YAAY,IAAI,CAAC,EAAE;AACtB,gBAAA,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC;AAC1D,gBAAA,YAAY,EAAE;gBACd,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;;AAEzF,SAAC,CAAC;;AAGN;;;;;;;;;;;;;;AAcG;AACH,IAAA,IAAI,CAAC,EAAuB,EAAA;AACxB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,EAAE,CAAC,IAAI,CAAC;AACR,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,OAAO,IAAI;;IAGf,EAAC,WAAW,EAAC,CAAC,KAAa,EAAE,WAAA,GAAuB,KAAK,EAAA;;;;;;;QAQrD,OAAO,CAAC,WAAW;AACf,cAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AAClB,cAAE,IAAI,CAAC,cAAc,CAAC,KAAK;AACvB,kBAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AAClB,kBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;IAGvD,CAAC,cAAc,CAAC,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS;QAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;;AAG3B,IAAA,CAAC,YAAY,CAAC,GAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClC,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;;AAGlB,IAAA,CAAC,YAAY,CAAC,GAAA;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,SAAS,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;;IAGvC,OAAO,GAAA;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;IAG9B,MAAM,GAAA;QACF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAU,KAAI;YACrC,OAAO,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;AAC3C,kBAAE,KAAK,CAAC,QAAQ,CAAC;kBACf,KAAK;AACf,SAAC,CAAC;;;;;AAMN,IAAA,KAAK,CAAC,UAAoB,EAAA;AACtB,QAAA,IAAI,MAAmB;QAEvB,IAAI,UAAU,EAAE;AACZ,YAAA,MAAM,GAAG,IAAI,WAAW,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;;aAEvB;AACH,YAAA,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KACrC,CAAC,IAAI,CAAC,QAAQ,CAAC;AACX,kBAAG,IAAsB,CAAC,KAAK;AAC/B,kBAAE,IAAI,CACb,CAAC,CAAC;;AAGP,QAAA,OAAO,MAAM;;;;AAKrB,YAAY,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;;;MC/2BtC,SAAS,CAAA;aASX,IAAU,CAAAD,IAAA,CAAA,GAAG,uBAAH,CAA2B;aACrC,IAAU,CAAAC,IAAA,CAAA,GAAG,uBAAH,CAA2B;AAE5C;;;;;;;;AAQG;AACH,IAAA,SAAOD,IAAA,GAZC,QAAQ,EAAAC,IAAA,GACR,QAAQ,EAWR,OAAO,EAAC,CAAE,GAAc,EAAE,KAAa,EAAE,IAAe,EAAA;QAC5D,QACI,CAAC,IAAI;AACL,YAAA,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ;YACrC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;;IAIhG,OAAO,EAAE,CAAC,IAAS,EAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;;AAGpC,IAAA,WAAA,CAAa,aAAwC,EAAA;AA5B3C,QAAA,IAAA,CAAA,MAAM,GAAc,IAAI,GAAG,EAAQ;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAmB,IAAI,GAAG,EAAa;QAC/C,IAAY,CAAA,YAAA,GAA2B,EAAE;AA2B/C,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;AACvC,QAAA,UAAU,CAAC,OAAO,GAAG,EAAE;AAEvB,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;AAClC,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACjB,SAAA,CAAC;QAEF,IAAI,aAAa,EAAE;YACf,IACI,aAAa,YAAY,GAAG;gBAC5B,aAAa,YAAY,SAAS,EACpC;AACE,gBAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;iBAE5C;AACH,gBAAA,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE;oBAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;;;;AAKzC,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;;;AAIN,IAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA,EAA+B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtF,IAAA,KAAK,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAEnE,YAAY,MAAM,CAAC,OAAO,CAAC,GAAA,EAAK,OAAO,SAAS,CAAC;IAEjD,GAAG,CAAC,GAAM,EAAE,KAAQ,EAAA;QAChB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACvC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,eAAA,EAAkB,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,iBAAA,EAAoB,KAAK,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,CAAI,CAAC;;AAE5F,aAAA,IAAI,QAAO,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE;AACvD,YAAA,kBAAkB,CAAC,KAAY,EAAE,IAAI,CAAC,UAAU,CAAkB,EAAE,IAAI,EAAE,GAAG,CAAC;;;;AAKlF,QAAA,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAO;AAEzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS;AAE7C,QAAA,IAAI,KAAa;AACjB,QAAA,IAAI,SAAoB;;AAGxB,QAAA,IAAI,QAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,EAAE;AACjD,YAAA,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,YAAA,SAAS,GAAG,SAAS,CAAC,OAAO;YAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1C,YAAA,IAAI,aAAa,KAAK,KAAK,EAAE;;gBAEzB;;iBAEG,IAAI,KAAK,EAAE;;AAEd,gBAAA,SAAS,GAAG,SAAS,CAAC,cAAc;;AAGpC,gBAAA,IAAI,aAAa,KAAK,SAAS,EAAE;AAC7B,oBAAA,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;;;AAIrE,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;AAC1B,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;;;aAGhC;YACH,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AAC3C,YAAA,SAAS,GAAG,SAAS,CAAC,GAAG;YAEzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAC7B,YAAA,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;YAC/B,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC;;QAG9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAE3B,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;;;;;QAMnC,IAAI,KAAK,EAAE;AACP,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;;AAG3D,QAAA,OAAO,IAAI;;AAGf,IAAA,GAAG,CAAC,GAAM,EAAA;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;;AAG/B,IAAA,MAAM,CAAC,GAAM,EAAA;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACvB,YAAA,OAAO,KAAK;;QAGhB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;AAEzC,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAEvD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;;IAGlC,KAAK,GAAA;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAGjC,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;AACxB,QAAA,UAAU,CAAC,OAAO,GAAG,EAAE;;QAGvB,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC,KAAI;AAC3C,YAAA,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC;AAC5C,SAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;;AAGrB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAEnB,QAAA,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;;AAGzC,IAAA,GAAG,CAAE,GAAM,EAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;;AAG/B,IAAA,OAAO,CAAC,UAAsD,EAAA;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;;IAGnC,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;IAGhC,IAAI,GAAA;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;IAG7B,MAAM,GAAA;AACF,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAG/B,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;;IAGjB,QAAQ,CAAC,KAAa,EAAE,GAAM,EAAA;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;;AAGvB,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;IAGnC,CAAC,WAAW,CAAC,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;IAGpD,CAAC,cAAc,CAAC,CAAC,KAAa,EAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;;AAGrB,IAAA,CAAC,YAAY,CAAC,GAAA;AACpB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;;AAIjC,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;AACtC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;;AAGpC,YAAA,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;;AAG/B,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;IAG1B,MAAM,GAAA;QACF,MAAM,GAAG,GAAQ,EAAE;QAEnB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,GAAG,KAAI;AAC7B,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;AAC/C,kBAAE,KAAK,CAAC,QAAQ,CAAC;kBACf,KAAK;AACf,SAAC,CAAC;AAEF,QAAA,OAAO,GAAG;;;;;;AAOd,IAAA,KAAK,CAAC,UAAoB,EAAA;AACtB,QAAA,IAAI,MAAoB;QAExB,IAAI,UAAU,EAAE;;YAEZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC;;aAE1C;;AAEH,YAAA,MAAM,GAAG,IAAI,SAAS,EAAE;YAExB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,GAAG,KAAI;AAC7B,gBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;;qBAC9B;AACH,oBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;;AAE9B,aAAC,CAAC;;AAIN,QAAA,OAAO,MAAM;;;AAKrB,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;;;MClRlC,gBAAgB,CAAA;aAUlB,IAAU,CAAAD,IAAA,CAAA,GAAG,uBAAH,CAA2B;aACrC,IAAU,CAAAC,IAAA,CAAA,GAAG,uBAAH,CAA2B;AAE5C;;;;;;;;AAQG;AACH,IAAA,SAAOD,IAAA,GAZC,QAAQ,EAAAC,IAAA,GACR,QAAQ,EAWR,OAAO,EAAC,CAAE,GAAqB,EAAE,KAAa,EAAE,IAAe,EAAA;QACnE,QACI,CAAC,IAAI;AACL,YAAA,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ;YACrC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;;IAIhG,OAAO,EAAE,CAAC,IAAS,EAAA;AACf,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,SAAS;;AAG3C,IAAA,WAAA,CAAa,aAAwB,EAAA;AA9B3B,QAAA,IAAA,CAAA,MAAM,GAAmB,IAAI,GAAG,EAAa;AAC7C,QAAA,IAAA,CAAA,QAAQ,GAAwB,IAAI,GAAG,EAAkB;QACzD,IAAY,CAAA,YAAA,GAA2B,EAAE;QAEzC,IAAM,CAAA,MAAA,GAAW,CAAC;QA2BxB,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,EAAE;QAE3B,IAAI,aAAa,EAAE;AACf,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG7C,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;;AAGN,IAAA,GAAG,CAAC,KAAQ,EAAA;;AAER,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAE3B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS;QAC7C,IAAI,KAAK,EAAE;AACP,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;;QAG/D,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;QAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAE5B,QAAA,OAAO,KAAK;;AAGhB,IAAA,EAAE,CAAC,KAAa,EAAA;AACZ,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;;IAG/B,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;AAGhC,IAAA,MAAM,CAAC,IAAO,EAAA;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AAErC,QAAA,IAAI,KAAQ;AACZ,QAAA,IAAI,KAAkC;AACtC,QAAA,OAAO,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE;AAC3B,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE;;YAElB,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACzB,gBAAA,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtB;;;AAIR,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACrB,YAAA,OAAO,KAAK;;AAGhB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;IAGpC,KAAK,GAAA;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAGjC,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;AACxB,QAAA,UAAU,CAAC,OAAO,GAAG,EAAE;;QAGvB,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC,KAAI;AAC3C,YAAA,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC;AAC5C,SAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;;AAGrB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAEnB,QAAA,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;;AAGzC,IAAA,GAAG,CAAE,KAAQ,EAAA;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;;AAGpE,IAAA,OAAO,CAAC,UAAuE,EAAA;QAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;IAGxE,MAAM,GAAA;AACF,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAG/B,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;;;IAI3B,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;IAGrB,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;;AAGvB,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;IAGnC,CAAC,WAAW,CAAC,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;IAGpD,CAAC,cAAc,CAAC,CAAC,KAAa,EAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;;AAGrB,IAAA,CAAC,YAAY,CAAC,GAAA;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;IAG1B,OAAO,GAAA;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;IAG3C,MAAM,GAAA;QACF,MAAM,MAAM,GAAQ,EAAE;QAEtB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,GAAM,KAAI;AAChC,YAAA,MAAM,CAAC,IAAI,CACP,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;AACpC,kBAAE,KAAK,CAAC,QAAQ,CAAC;kBACf,KAAK,CACd;AACL,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;;;;;AAMjB,IAAA,KAAK,CAAC,UAAoB,EAAA;AACtB,QAAA,IAAI,MAAwB;QAE5B,IAAI,UAAU,EAAE;;YAEZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,gBAAgB,EAAE,EAAE,IAAI,CAAC;;aAEjD;;AAEH,YAAA,MAAM,GAAG,IAAI,gBAAgB,EAAE;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACxB,gBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACjB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;;qBACzB;AACH,oBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEzB,aAAC,CAAC;;AAGN,QAAA,OAAO,MAAM;;;AAKrB,YAAY,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,CAAC;;;MCrNjD,SAAS,CAAA;aAUX,IAAU,CAAAD,IAAA,CAAA,GAAG,uBAAH,CAA2B;aACrC,IAAU,CAAAC,IAAA,CAAA,GAAG,uBAAH,CAA2B;AAE5C;;;;;;;;AAQG;AACH,IAAA,SAAOD,IAAA,GAZC,QAAQ,EAAAC,IAAA,GACR,QAAQ,EAWR,OAAO,EAAC,CAAE,GAAc,EAAE,KAAa,EAAE,IAAe,EAAA;QAC5D,QACI,CAAC,IAAI;AACL,YAAA,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;;IAIxF,OAAO,EAAE,CAAC,IAAS,EAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;;AAGpC,IAAA,WAAA,CAAa,aAAwB,EAAA;AA9B3B,QAAA,IAAA,CAAA,MAAM,GAAmB,IAAI,GAAG,EAAa;AAC7C,QAAA,IAAA,CAAA,QAAQ,GAAwB,IAAI,GAAG,EAAkB;QACzD,IAAY,CAAA,YAAA,GAA2B,EAAE;QAEzC,IAAM,CAAA,MAAA,GAAW,CAAC;QA2BxB,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,EAAE;QAE3B,IAAI,aAAa,EAAE;AACf,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG7C,QAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;AACpC,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;;AAGN,IAAA,GAAG,CAAC,KAAQ,EAAA;;AAER,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAAE,YAAA,OAAO,KAAK;;;AAGnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAE3B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,EAAE;AACjC,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;;AAG/D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,SAAS,CAAC,GAAG;QAEpE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;QAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;AACvC,QAAA,OAAO,KAAK;;IAGhB,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;AAGhC,IAAA,MAAM,CAAC,IAAO,EAAA;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AAErC,QAAA,IAAI,KAAa;AACjB,QAAA,IAAI,KAAkC;AACtC,QAAA,OAAO,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE;AAC3B,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE;;YAElB,IAAI,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AACzB,gBAAA,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtB;;;AAIR,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACrB,YAAA,OAAO,KAAK;;AAGhB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;IAGpC,KAAK,GAAA;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAGjC,QAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;AACxB,QAAA,UAAU,CAAC,OAAO,GAAG,EAAE;;AAGvB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;;AAGrB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAEnB,QAAA,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;;AAGzC,IAAA,GAAG,CAAE,KAAQ,EAAA;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAEnC,IAAI,GAAG,GAAG,KAAK;AACf,QAAA,IAAI,KAAwB;AAE5B,QAAA,OAAO,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE;AAC1B,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE;;AAClB,YAAA,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;gBACvB,GAAG,GAAG,IAAI;gBACV;;;AAIR,QAAA,OAAO,GAAG;;AAGd,IAAA,OAAO,CAAC,UAAqE,EAAA;QACzE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;IAGxE,MAAM,GAAA;AACF,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAG/B,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;;;IAI3B,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;IAGrB,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;;AAGvB,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;IAGnC,CAAC,WAAW,CAAC,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;IAGpD,CAAC,cAAc,CAAC,CAAC,KAAa,EAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;;AAGrB,IAAA,CAAC,YAAY,CAAC,GAAA;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;IAG1B,OAAO,GAAA;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;;IAG3C,MAAM,GAAA;QACF,MAAM,MAAM,GAAQ,EAAE;QAEtB,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,GAAW,KAAI;AACrC,YAAA,MAAM,CAAC,IAAI,CACP,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;AACpC,kBAAE,KAAK,CAAC,QAAQ,CAAC;kBACf,KAAK,CACd;AACL,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;;;;;AAMjB,IAAA,KAAK,CAAC,UAAoB,EAAA;AACtB,QAAA,IAAI,MAAiB;QAErB,IAAI,UAAU,EAAE;;YAEZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC;;aAE1C;;AAEH,YAAA,MAAM,GAAG,IAAI,SAAS,EAAE;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AACxB,gBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACjB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;;qBACzB;AACH,oBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEzB,aAAC,CAAC;;AAGN,QAAA,OAAO,MAAM;;;AAKrB,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;;ACpLxC,MAAM,gBAAgB,GAAG,EAAE;AAE5B,SAAU,MAAM,CAAC,WAAgB,EAAA;AACnC,IAAA,WAAW,CAAC,QAAQ,CAAC,WAA4B,CAAC;AAClD,IAAA,OAAO,WAAW;AACtB;AAEA;;;;;;;;;;;;;;;AAeG;AACH;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEgB,SAAA,IAAI,CAAK,GAAA,GAAc,gBAAgB,EAAA;IACnD,OAAO,UAAS,MAAS,EAAE,SAAiB,EAAA;AACxC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAA4B;QAEvD,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QACtD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAGnD,QAAA,MAAM,QAAQ,IAAc,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;;;;;;;;;;;;;QAepJ,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC;AAC7C,KAAC;AACL;AA8BgB,SAAA,IAAI,CAChB,IAAoB,EACpB,OAAqB,EAAA;IAErB,OAAO,UAAU,MAAqB,EAAE,KAAa,EAAA;AACjD,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAA4B;QAEvD,IAAI,CAAC,IAAI,EAAE;YACP,MAAM,IAAI,KAAK,CAAC,CAAG,EAAA,WAAW,CAAC,IAAI,CAAqC,kCAAA,EAAA,KAAK,CAAqE,mEAAA,CAAA,CAAC;;;AAIvJ,QAAA,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;;AAG9B,QAAA,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;QAEjC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QACtD,MAAM,cAAc,GAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;AAEjD,QAAA,IAAI,UAAU,GAAW,QAAQ,CAAC,KAAK,CAAC;AAExC;;AAEG;AACH,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;AACpC,YAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE;;gBAEjC;;iBAEG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE;;;AAGhD,gBAAA,IAAI;oBACA,MAAM,IAAI,KAAK,CAAC,CAAgC,6BAAA,EAAA,KAAK,CAAoB,iBAAA,EAAA,WAAW,CAAC,IAAI,CAA8B,4BAAA,CAAA,CAAC;;gBAE1H,OAAO,CAAC,EAAE;AACR,oBAAA,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACtD,MAAM,IAAI,KAAK,CAAC,CAAG,EAAA,CAAC,CAAC,OAAO,CAAI,CAAA,EAAA,gBAAgB,CAAE,CAAA,CAAC;;;;aAIxD;;;;AAIH,YAAA,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;oBACzB,cAAc,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;mBAC9C,EAAE,CAAC;AACV,YAAA,UAAU,EAAE;;AAGhB,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;YAC3B,QAAQ,CAAC,QAAQ,CACb,QAAQ,EACR,UAAU,EACV,KAAK,EACL,IAAI,EACJ;;AAEI,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,QAAQ,EAAE,IAAI;AACjB,aAAA,CACJ;;aAEE;AACH,YAAA,MAAM,gBAAgB,GAAG,QAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnG,YAAA,MAAM,SAAS,GAAG,CAAC,gBAAgB;kBAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;kBACrB,IAAI;YAEV,QAAQ,CAAC,QAAQ,CACb,QAAQ,EACR,UAAU,EACV,KAAK,EACL,IAAI,EACJ,qBAAqB,CAAC,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAC9E;;AAET,KAAC;AACL;AAEM,SAAU,qBAAqB,CACjC,WAAmB,EACnB,UAAkB,EAClB,IAAoB,EACpB,gBAAgC,EAAA;IAEhC,OAAO;QACH,GAAG,EAAE,cAA0B,OAAO,IAAI,CAAC,WAA2B,CAAC,CAAC,EAAE;QAC1E,GAAG,EAAE,UAAwB,KAAU,EAAA;YACnC,MAAM,aAAa,GAAG,IAAI,CAAC,WAA2B,CAAC,IAAI,SAAS;;AAGpE,YAAA,IAAI,KAAK,KAAK,aAAa,EAAE;gBAAE;;YAE/B,IACI,KAAK,KAAK,SAAS;gBACnB,KAAK,KAAK,IAAI,EAChB;gBACE,IAAI,gBAAgB,EAAE;;AAElB,oBAAA,IAAI,gBAAgB,CAAC,WAAW,KAAK,WAAW,IAAI,EAAE,KAAK,YAAY,WAAW,CAAC,EAAE;AACjF,wBAAA,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,KAAK,CAAC;;;AAIrC,oBAAA,IAAI,gBAAgB,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,KAAK,YAAY,SAAS,CAAC,EAAE;AAC7E,wBAAA,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC;;;;;;AAQhC,oBAAA,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI;;AAErB,qBAAA,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE;AACnC,oBAAA,kBAAkB,CAAC,KAAK,EAAE,IAAqB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;qBAE7E;AACH,oBAAA,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAG3D,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;;;;gBAKjC,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE;oBACxD,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC/C,oBAAA,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC;;qBAE1F;AACF,oBAAA,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC;;;;;;AAOtF,gBAAA,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC;;AAE1D,iBAAA,IAAI,aAAa,KAAK,SAAS,EAAE;;;;gBAIpC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;;AAGrC,YAAA,IAAI,CAAC,WAA2B,CAAC,GAAG,KAAK;SAC5C;AAED,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,YAAY,EAAE;KACjB;AACL;AAEA;;;AAGG;AAEa,SAAA,UAAU,CAAC,MAAA,GAAkB,IAAI,EAAA;IAC7C,OAAO,UAAU,KAAoB,EAAE,KAAa,EAAA;;;;AAIhD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAA4B;QAEtD,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QACtD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AACnD,QAAA,MAAM,QAAQ,IAAc,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACpJ,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;;AAclC,QAAA,QAAQ,CAAC,UAAU,CAAC,CAAC,UAAU,GAAG,IAAI;QAEtC,IAAI,MAAM,EAAE;AACR,YAAA,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE;AAC7B,YAAA,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG;AAC5B,gBAAA,GAAG,EAAE,YAAA,EAAc,MAAM,IAAI,KAAK,CAAC,CAAG,EAAA,KAAK,CAAiB,eAAA,CAAA,CAAC,CAAC,EAAE;AAChE,gBAAA,GAAG,EAAE,UAAwB,KAAU,EAAA,GAAuD;AAC9F,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,YAAY,EAAE;aACjB;;;AAIL,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;AACxC,YAAA,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;AAC3B,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE;AACjB,SAAA,CAAC;AACN,KAAC;AACL;SAEgB,WAAW,CACvB,MAAqB,EACrB,MAAkB,EAClB,OAAqB,EAAA;AAErB,IAAA,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;;AAEzD,IAAA,OAAO,MAAM;AACjB;AAyDM,SAAU,MAAM,CAIlB,gBAA0D,EAC1D,IAAa,EACb,WAAc,MAAW,EAAA;IAEzB,MAAM,MAAM,GAAQ,EAAE;IACtB,MAAM,OAAO,GAAQ,EAAE;IAEvB,MAAM,aAAa,GAAQ,EAAE;IAC7B,MAAM,aAAa,GAAQ,EAAE;AAE7B,IAAA,KAAK,IAAI,SAAS,IAAI,gBAAgB,EAAE;AACpC,QAAA,MAAM,KAAK,GAAQ,gBAAgB,CAAC,SAAS,CAAmB;AAChE,QAAA,IAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,EAAE;AAC7B,YAAA,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;AAC7B,gBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,SAAS;AAC5D,sBAAE;AACF,sBAAE,KAAK,CAAC,MAAM,CAAC;;YAGvB,MAAM,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC;;AAG5C,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE;;AAEzD,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE;;AAEtD,oBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,WAAW,EAAE;;AAEzC,qBAAA,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;;AAEnC,oBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS,EAAE;;AAEvC,qBAAA,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE;;AAE1C,oBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,gBAAgB,EAAE;;AAE9C,qBAAA,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;;AAEnC,oBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS,EAAE;;AAEvC,qBAAA,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;;oBAEhE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;;;;wBAIxF,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;;;;iBAGnD;gBACH,aAAa,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;;;AAI5C,aAAA,IAAI,QAAQ,KAAK,CAAC,KAAK,UAAU,EAAE;AACtC,YAAA,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;;AAElB,gBAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;;;;AAIxE,oBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,EAAE;;gBAE1C,MAAM,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC;;iBACzC;AACH,gBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,KAAK;;;aAG3B;YACH,MAAM,CAAC,SAAS,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC;;;IAIpD,MAAM,gBAAgB,GAAG,MAAK;QAC1B,MAAM,QAAQ,GAAQ,EAAE;;AAGxB,QAAA,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;AACnC,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC;YAC7C,IAAI,YAAY,IAAI,OAAO,YAAY,CAAC,KAAK,KAAK,UAAU,EAAE;;gBAE1D,QAAQ,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE;;iBACvC;;AAEH,gBAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,YAAY;;;AAG1C,QAAA,OAAO,QAAQ;AACnB,KAAC;AAED,IAAA,MAAM,cAAc,GAAG,CAAC,KAAU,KAAI;QAClC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC,MAAM,WAAW,GAAQ,EAAE;AAC3B,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC3B,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;;;AAGrC,QAAA,OAAO,WAAW;AACtB,KAAC;;IAGD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAM,cAAe,QAAgB,CAAA;AACjE,QAAA,WAAA,CAAY,GAAG,IAAW,EAAA;;YAEtB,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE;gBAChE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3E;;;AAGG;AACH,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE;oBACtB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;;;iBAGrC;AACH,gBAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;;KAGtE,EAAE,MAAM,CAA4D;;AAGpE,IAAA,KAAa,CAAC,iBAAiB,GAAG,gBAAgB;;IAGnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC;AAEvC,IAAA,KAAK,IAAI,SAAS,IAAI,aAAa,EAAE;AACjC,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC;;IAG9D,IAAI,IAAI,EAAE;AACN,QAAA,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;;AAGzD,IAAA,KAAK,CAAC,OAAO,GAAG,CAAqC,MAAU,EAAE,IAAa,KAC1E,MAAM,CAAK,MAAM,EAAE,IAAI,EAAE,KAAY,CAAkE;AAE3G,IAAA,OAAO,KAAK;AAChB;;AC3qBM,SAAU,SAAS,CAAC,KAAa,EAAA;AACnC,IAAA,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KACvC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,CAAA,GAAA,CAAK,GAAG,KAAK,CACpC,CAAC,IAAI,CAAC,EAAE,CAAC;AACd;AAEM,SAAU,WAAW,CAAC,MAAc,EAAA;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI;AAEnC,IAAA,MAAM,IAAI,GAAe;AACrB,QAAA,GAAG,EAAE,EAAE;AACP,QAAA,IAAI,EAAE;KACT;;AAGD,IAAA,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI;IAChC,OAAO,OAAO,EAAE;AACZ,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;;AAErC,QAAA,IAAI,UAAU,KAAK,SAAS,EAAG;AAC3B,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;YACtB;;AAGJ,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB;QAE5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAS,MAAA,EAAA,UAAU,CAAC,KAAK,CAAE,CAAA,CAAC;AAC3C,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AACzB,YAAA,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;AACzB,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAiC,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,MAAiC,CAAC,GAAG,CAAC;;YACnG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAA4B,CAAC,EAAE;;AAExD,QAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAG1B,IAAA,OAAO,IAAI;AACf;;;AClCA;;AAEG;MACU,MAAM,CAAA;aAER,IAAU,CAAA,EAAA,CAAA,GAAG,qBAAqB,CAAC;aACnC,IAAU,CAAA,EAAA,CAAA,GAAG,qBAAqB,CAAC;AAE1C;;;AAGG;IACH,OAAO,UAAU,CAAC,QAAa,EAAA;AAC3B,QAAA,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;AACtC,YAAA,KAAK,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC;AAC/B,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE;AACb,SAAA,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;;IAGlG,OAAO,EAAE,CAAC,IAAoB,EAAA;QAC1B,OAAO,QAAQ,IAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,QAAQ;;AAGxE;;AAEG;IACH,SAxBQ,EAAA,GAAA,QAAQ,OACR,QAAQ,EAuBR,MAAM,EAAC,CAAE,UAAsB,EAAE,KAAa,EAAE,SAAuB,GAAA,SAAS,CAAC,GAAG,EAAA;AACxF,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;;AAGvC;;;;;;;;AAQG;IACH,QAAQ,OAAO,CAAC,CAAE,GAAW,EAAE,KAAa,EAAE,IAAe,EAAA;QACzD,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG;AAEhC,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;;YAEpB,OAAO,GAAG,KAAK,SAAS;;AAErB,aAAA,IAAI,GAAG,KAAK,SAAS,EAAE;;AAE1B,YAAA,OAAO,IAAI;;AAER,aAAA,IAAI,GAAG,KAAK,gBAAgB,EAAE;;YAEjC,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;aAE3C;;AAEH,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;;;;AAKpC,IAAA,WAAA,CAAY,GAAO,EAAA;;;;;AAKf,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;;;QAKvB,IAAI,GAAG,EAAE;AACL,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;;;AAIzB,IAAA,MAAM,CACT,KAAyB,EAAA;AAEzB,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;AAC1B,QAAA,OAAO,IAAI;;AAGf;;;;;AAKG;IACI,QAAQ,CAAuC,QAAoB,EAAE,SAAqB,EAAA;QAC7F,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CACjB,QAAQ,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC,CAAC,KAAK,EAC5C,SAAS,CACZ;;IAGL,KAAK,GAAA;;AAED,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AACxD,QAAA,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAEzB,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;;;;;AAM/E,QAAA,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE;YAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,UAA2B,CAAC,CAAC,IAAkB;YAEtE,IACI,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ;gBACjC,QAAS,IAAI,CAAC,KAAK,CAAS,EAAE,KAAK,CAAC,KAAK,UAAU,EACrD;;gBAEE,MAAM,CAAC,KAAK,CAAC,GAAI,IAAI,CAAC,KAAK,CAAS,CAAC,KAAK,EAAE;;iBAEzC;;gBAEH,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;;;AAInC,QAAA,OAAO,MAAM;;IAGjB,MAAM,GAAA;QACF,MAAM,GAAG,GAAQ,EAAE;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AAClD,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAkB;AAC9C,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI;YAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,WAAW,EAAE;AAC3F,gBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;sBAC7D,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;AAC3B,sBAAE,IAAI,CAAC,SAAS,CAAC;;;AAG7B,QAAA,OAAO,GAAG;;AAGd;;;AAGG;IACH,iBAAiB,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE;;IAG/B,CAAC,WAAW,CAAC,CAAC,KAAa,EAAA;QACvB,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/E,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC;;IAGnD,CAAC,cAAc,CAAC,CAAC,KAAa,EAAA;QAC1B,MAAM,QAAQ,GAAc,IAAI,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAkB,CAAC,GAAG,SAAS;;AAGxD;;;;;;AAMG;AACH,IAAA,OAAO,WAAW,CAAmB,GAAM,EAAE,YAAwB,GAAA,KAAK,EAAE,KAAA,GAAgB,CAAC,EAAE,OAAiB,EAAE,YAAoB,EAAE,EAAA;QACpI,MAAM,QAAQ,GAAG,CAAC,YAAY,IAAI,CAAA,GAAA,EAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;AAC3E,QAAA,MAAM,UAAU,GAAe,GAAG,CAAC,QAAQ,CAAC;QAE5C,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK;AACzE,QAAA,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI;;AAGvD,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;cACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAG,CAAA;cAC7B,EAAE;QAER,IAAI,MAAM,GAAG,CAAG,EAAA,SAAS,CAAC,KAAK,CAAC,CAAG,EAAA,SAAS,CAAG,EAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAY,SAAA,EAAA,KAAK,IAAI,QAAQ,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAI;QAE/G,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,UAAU,KAAI;YACpD,IAAI,GAAG,GAAG,UAAU;YACpB,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAK,GAAW,CAAC,UAAU,CAAC,EAAE;;AAE5D,gBAAA,GAAG,GAAI,GAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU;;YAEhE,MAAM,SAAS,GAAG,CAAE,GAAW,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,CAAK,EAAA,EAAA,GAAG,MAAM,GAAG,EAAE;AACpG,YAAA,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC;AAChG,SAAC,CAAC;AAEF,QAAA,OAAO,MAAM;;AAGjB,IAAA,OAAO,uBAAuB,CAAgB,GAAM,EAAE,YAA2B,YAAY,EAAA;QACzF,IAAI,WAAW,GAAa,EAAE;AAC9B,QAAA,IAAI,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI;QAChD,OAAO,OAAO,EAAE;AACZ,YAAA,IAAI,OAAO,CAAC,UAAU,EAAE;gBACpB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;;AAE9C,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,OAAO,WAAW;;IAGtB,OAAO,sBAAsB,CAAC,OAAgB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC;;AAG7D;;;;;;;AAOG;AACH,IAAA,OAAO,YAAY,CAAgB,QAAW,EAAE,cAAuB,KAAK,EAAA;AACxE,QAAA,MAAM,UAAU,GAAe,QAAQ,CAAC,QAAQ,CAAC;AAEjD,QAAA,MAAM,SAAS,GAAG,CAAC,WAAW,IAAI,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO;AAC5E,QAAA,MAAM,aAAa,GAAG,CAAC,WAAW,IAAI,YAAY,GAAG,SAAS;AAE9D,QAAA,IAAI,MAAM,GAAG,CAAG,EAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA,EAAA,EAAK,UAAU,CAAC,KAAK,CAAS,MAAA,EAAA,aAAa,KAAK;QAEzF,SAAS,aAAa,CAAC,SAAoB,EAAA;AACvC,YAAA,SAAS,CAAC;AACL,iBAAA,MAAM,CAAC,EAAE,IAAI,EAAE;AACf,iBAAA,OAAO,CAAC,CAAC,KAAK,KAAI;gBACf,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBACrD,MAAM,IAAI,CAAM,GAAA,EAAA,KAAK,CAAM,GAAA,EAAA,SAAS,CAAC,SAAS,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAA,GAAA,CAAK;AAC5H,aAAC,CAAC;;QAGV,aAAa,CAAC,SAAS,CAAC;;AAGxB,QAAA,IACI,CAAC,WAAW;AACZ,YAAA,UAAU,CAAC,eAAe;YAC1B,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACrE;AACE,YAAA,MAAM,IAAI,CAAA,EAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA,EAAA,EAAK,UAAU,CAAC,KAAK,CAAA,wBAAA,CAA0B;AACrF,YAAA,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC;;;AAI7C,QAAA,IACI,WAAW;AACX,YAAA,UAAU,CAAC,kBAAkB;YAC7B,CAAC,UAAU,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACxE;AACE,YAAA,MAAM,IAAI,CAAA,EAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA,EAAA,EAAK,UAAU,CAAC,KAAK,CAAA,2BAAA,CAA6B;AACxF,YAAA,aAAa,CAAC,UAAU,CAAC,kBAAkB,CAAC;;AAGhD,QAAA,OAAO,MAAM;;AAGjB,IAAA,OAAO,gBAAgB,CAAmB,GAAM,EAAE,gBAAqF,SAAS,EAAA;QAC5I,IAAI,MAAM,GAAG,EAAE;AAEf,QAAA,MAAM,cAAc,GAAe,GAAG,CAAC,QAAQ,CAAC;AAChD,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI;AAChC,QAAA,MAAM,WAAW,GAAkC,IAAI,GAAG,EAAE;QAE5D,MAAM,cAAc,GAAG,EAAE;QACzB,IAAI,eAAe,GAAG,CAAC;;AAGvB,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE;YAChE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAsB,CAAC;YAC3D,IAAI,CAAC,UAAU,EAAE;gBAAE;;YAEnB,IAAI,iBAAiB,GAAG,KAAK;YAC7B,IAAI,iBAAiB,GAAiB,EAAE;YACxC,IAAI,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC;AAEpD,YAAA,IAAI,UAAU,KAAK,cAAc,EAAE;gBAC/B,iBAAiB,GAAG,IAAI;;iBAErB;AACH,gBAAA,OAAO,gBAAgB,KAAK,SAAS,EAAE;AACnC,oBAAA,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACxC,oBAAA,IAAI,gBAAgB,CAAC,GAAG,KAAK,GAAG,EAAE;wBAC9B,iBAAiB,GAAG,IAAI;wBACxB;;oBAEJ,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,GAAG,QAAQ,CAAC;;;YAI9D,IAAI,iBAAiB,EAAE;AACnB,gBAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBACrC,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;gBAC9C,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;;;QAIhE,MAAM,IAAI,OAAO;AACjB,QAAA,MAAM,IAAI,CAAe,YAAA,EAAA,cAAc,CAAC,KAAK,IAAI;AACjD,QAAA,MAAM,IAAI,CAAA,iBAAA,EAAoB,cAAc,CAAC,MAAM,CAAA,UAAA,EAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;AAC9F,QAAA,MAAM,IAAI,CAAA,eAAA,EAAkB,eAAe,CAAA,EAAA,CAAI;QAC/C,MAAM,IAAI,OAAO;;AAGjB,QAAA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAc;AAChD,QAAA,KAAK,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE;YACjE,iBAAiB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,KAAK,KAAI;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;AACvC,oBAAA,MAAM,IAAI,CAAG,EAAA,SAAS,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAA,SAAA,EAAY,gBAAgB,CAAC,KAAK,KAAK;AAC5G,oBAAA,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;;AAE5C,aAAC,CAAC;AAEF,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB;AAC5C,YAAA,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM;AACtC,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;AAE/B,YAAA,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAI,CAAA,EAAA,UAAU,CAAC,WAAW,CAAA,EAAA,CAAI,GAAG,EAAE;YACrE,MAAM,IAAI,CAAG,EAAA,MAAM,CAAG,EAAA,WAAW,CAAG,EAAA,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAY,SAAA,EAAA,UAAU,CAAC,KAAK,CAAgB,aAAA,EAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA,EAAA,CAAI;AAE9I,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AACzB,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;AAChC,gBAAA,MAAM,IAAI,CAAG,EAAA,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAG,EAAA,SAAS,CAAC,SAAS,CAAC,CAAK,EAAA,EAAA,KAAK,IAAI;;;QAI9E,OAAO,CAAA,EAAG,MAAM,CAAA,CAAE;;;;AC9V1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAsCA;AACO,SAAS,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE;AAC1D,IAAI,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AACjI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACnI,SAAS,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACtJ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC;AA4QD;AACuB,OAAO,eAAe,KAAK,UAAU,GAAG,eAAe,GAAG,UAAU,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE;AACvH,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC;AACrF;;MCtUa,IAAI,CAAA;AAcb,IAAA,WAAA,CAAmB,KAAkB,EAAA;QAAlB,IAAK,CAAA,KAAA,GAAL,KAAK;QAbd,IAAY,CAAA,YAAA,GAAW,CAAC;QAElC,IAAQ,CAAA,QAAA,GAA2B,EAAE;QACrC,IAAW,CAAA,WAAA,GAAkC,EAAE;;QAG/C,IAAU,CAAA,UAAA,GAAmB,oBAAoB,EAAE;AACnD,QAAA,IAAA,CAAA,kBAAkB,GAAmB,oBAAoB,EAAE,CAAC;;QAG5D,IAAO,CAAA,OAAA,GAAmB,oBAAoB,EAAE;AAChD,QAAA,IAAA,CAAA,eAAe,GAAmB,oBAAoB,EAAE,CAAC;;IAIzD,eAAe,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;;AAG9B,IAAA,GAAG,CAAC,UAAsB,EAAA;;AAEtB,QAAA,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE;AAChC,YAAA,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;;AAG7C,QAAA,MAAM,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;QAC1E,IAAI,eAAe,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU;;QAEtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,gBAAgB,KAAK,CAAC,EAAE;;;;;AAKxB,YAAA,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU;AAC5C,YAAA,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM;YACpB,OAAO,GAAG,EAAE,EAAE;AACV,gBAAA,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG;AACtD,gBAAA,mBAAmB,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;;;AAIpD,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC;;AAI7D,QAAA,OAAO,eAAe;;AAG1B,IAAA,MAAM,CAAC,UAAsB,EAAA;AACzB,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;;AAItD,QAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;;;;AAIf,YAAA,UAAU,CAAC,IAAI,GAAG,SAAS;YAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;AAEzC,YAAA,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,UAAU,CAAC;AACxD,YAAA,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,UAAU,CAAC;AAErD,YAAA,IAAI,UAAU,CAAC,eAAe,EAAE;AAC5B,gBAAA,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,UAAU,CAAC;AAChE,gBAAA,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,EAAE,UAAU,CAAC;;YAGjE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;YAEnC,UAAU,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;gBACjC,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACpC,oBAAA,KACI,KAAK,CAAC,WAAW,KAAK,SAAS;AAC/B,yBAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxD,uBAAE;AACC,wBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;AAEf,yBAAA,IAAI,KAAK,CAAC,WAAW,EAAE;;AAE1B,wBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;;AAGxC,aAAC,CAAC;;aAEC;YACH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ;;;;;;;;;;AAW1C,YAAA,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC;;AAGhD,QAAA,OAAO,QAAQ;;AAGnB,IAAA,2BAA2B,CAAC,UAAsB,EAAA;AAC9C,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACjC,QAAA,UAAU,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;;AAGlF,IAAA,gBAAgB,CAAC,UAAsB,EAAA;AACnC,QAAA,IAAI,UAAU,CAAC,eAAe,EAAE;AAC5B,YAAA,IAAI,CAAC,gCAAgC,CAAC,iBAAiB,EAAE,UAAU,CAAC;AACpE,YAAA,IAAI,CAAC,gCAAgC,CAAC,oBAAoB,EAAE,UAAU,CAAC;;aACpE;AACH,YAAA,IAAI,CAAC,gCAAgC,CAAC,SAAS,EAAE,UAAU,CAAC;AAC5D,YAAA,IAAI,CAAC,gCAAgC,CAAC,YAAY,EAAE,UAAU,CAAC;;;IAIvE,gCAAgC,CAAC,aAA4B,EAAE,UAAsB,EAAA;AACjF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,aAAa;AACpD,QAAA,IAAI,CAAC,IAAI;YAAE;;AAGX,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;AAChC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE;QAElC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,aAAa;AACjE,QAAA,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,IAAI;YAAE;;AAGxC,QAAA,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ;AAC1C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;;QAGnC,IAAI,aAAa,GAAG,cAAc;YAAE;;;;AAMpC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;aACvB;AACH,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;AAG9B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;aACvB;AACH,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;;AAI9B,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI;AAE3B,QAAA,IAAI,UAAU,CAAC,IAAI,EAAE;AACjB,YAAA,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI;;aACxB;AACH,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI;;AAGzB,QAAA,UAAU,CAAC,IAAI,GAAG,IAAI;;QAGtB,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,CAAC,CAAC;;AAG/D,IAAA,iBAAiB,CACpB,UAAsB,EACtB,SAA8E,EAC9E,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,EAAA;;QAGnD,IAAI,aAAa,EAAE;YAAE;;;AAGrB,QAAA,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;;IAGrF,mBAAmB,CAAC,IAAoB,EAAE,UAAsB,EAAA;AACtE,QAAA,MAAM,IAAI,GAAmB;YACzB,UAAU;AACV,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG;SAClD;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;aACb;AACH,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;AACrB,YAAA,IAAI,CAAC,IAAK,CAAC,IAAI,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;AAGpB,QAAA,OAAO,IAAI;;IAGL,2BAA2B,CAAC,IAAoB,EAAE,eAAuB,EAAA;;AAE/E,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI;QACvB,IAAI,QAAQ,GAAG,CAAC;QAEhB,OAAO,OAAO,EAAE;AACZ,YAAA,IAAI,QAAQ,IAAI,eAAe,EAAE;AAC7B,gBAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ;;AAE/B,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;AACtB,YAAA,QAAQ,EAAE;;;AAIR,IAAA,wBAAwB,CAAC,IAAoB,EAAE,IAAoB,EAAE,WAAmB,EAAA;;AAE9F,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI;QACvB,IAAI,QAAQ,GAAG,CAAC;QAEhB,OAAO,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ;AAC3B,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;AACtB,YAAA,QAAQ,EAAE;;;IAIX,yBAAyB,CAAC,aAA4B,EAAE,UAAsB,EAAA;AACjF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,aAAa;QAEpD,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE;AACxC,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ;;AAGrC,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;iBACvB;AACH,gBAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;AAG9B,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;iBACvB;AACH,gBAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;;;AAI9B,YAAA,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,eAAe,CAAC;;AAG5D,YAAA,UAAU,CAAC,aAAa,CAAC,CAAC,aAAa,GAAG,SAAS;AACnD,YAAA,OAAO,IAAI;;AAGf,QAAA,OAAO,KAAK;;AAEnB;;MCzPY,OAAO,CAAA;aACT,IAAW,CAAA,WAAA,GAAG,CAAC,QAAO,MAAM,CAAC,KAAK,WAAW,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;AAQrF,IAAA,WAAA,CAAY,KAAQ,EAAA;QAPpB,IAAY,CAAA,YAAA,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC;;;;;;;QAclD,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,WAA4B,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAElC,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;;;;;AAQd,IAAA,QAAQ,CAAC,KAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG3C,IAAA,MAAM,CACF,EAAA,GAAe,EAAE,MAAM,EAAE,CAAC,EAAE,EAC5B,IAAgB,EAChB,MAAM,GAAG,IAAI,CAAC,YAAY,EAC1B,aAAA,GAA+B,SAAS,EACxC,WAAW,GAAG,aAAa,KAAK,YAAY,EAC5C,aAAa,GAAG,EAAE,CAAC,MAAM;;AAEzB,QAAA,MAAM,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAE3C,IAAI,OAAO,GAAoC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAEvE,QAAA,OAAO,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AAC3B,YAAA,MAAM,UAAU,GAAI,OAA0B,CAAC,UAAU;YAEzD,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE;;AAEvC,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAC9B,oBAAA,SAAS;;gBAEb,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;;AAGtC,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC;AAC3C,YAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;;AAG1B,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM;AAC9C,YAAA,IAAI,UAAU,KAAK,CAAC,EAAE;gBAAE;;AAExB,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC9B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;;AAItC,YAAA,IAAI,OAAO,IAAI,EAAE,CAAC,MAAM,GAAG,aAAa,IAAI,UAAU,KAAK,cAAc,EAAE;gBACvE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB,GAAG,GAAG;gBAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;;AAG/C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;gBACjC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AAE1C,gBAAA,IAAI,UAAU,GAAG,CAAC,EAAE;;;AAGhB,oBAAA,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG;oBAChD;;AAGJ,gBAAA,MAAM,SAAS,GAAG,CAAC,WAAW;sBACxB,SAAS,CAAC;AACZ,sBAAE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC;;;;;;;;gBAS9C,IAAI,UAAU,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE;;;oBAGnG;;AAGJ,gBAAA,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;;;QAIpG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE;;;;AAI/B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;YAEpG,OAAO,CAAC,IAAI,CAAC,CAAA;;;AAGG,0BAAA,EAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAe,YAAA,EAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AAC9F,CAAA,CAAC;;;;;YAMU,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;;AAGvC,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE;AAC9B,gBAAA,IAAI,CAAC,YAAY,GAAG,MAAM;;AAG9B,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;;aAEpF;YAEH,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;;;IAI5C,SAAS,CAAC,EAAe,GAAA,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAA,GAAiB,IAAI,CAAC,YAAY,EAAA;AACtE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;;IAGjE,aAAa,CAAC,IAAe,EAAE,YAAoB,EAAE,EAAY,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,EAAA;AACxF,QAAA,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM;;AAG5B,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,CAAC;QAEpE,OAAO,MAAM,CAAC,MAAM,CAAC;AACjB,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC;YAC/B,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM;AACvC,SAAA,CAAC;;IAGN,UAAU,CAAC,IAAe,EAAE,YAAoB,EAAE,EAAY,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,EAAA;AACrF,QAAA,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM;;QAG5B,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YACzC,MAAM,UAAU,GAAe,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAE3D,YAAA,IAAI,UAAU,KAAK,SAAS,EAAE;;;AAG1B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC1B;;YAGJ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AACjC,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;;;gBAGnB;;AAGJ,YAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;AAE1B,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAEtC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB,GAAG,GAAG;YAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;AAE1C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;gBAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBAE7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;AAChD,gBAAA,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,MAAM;;;AAI7E,gBAAA,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;;;;;;;;AASrF,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;;AAGpB,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,CAAC;QAElE,OAAO,MAAM,CAAC,MAAM,CAAC;AACjB,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,CAAC;YAC/B,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM;AACvC,SAAA,CAAC;;IAGN,cAAc,GAAA;;QAEV,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;QACpC,OAAO,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC;AACvC,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,oBAAoB,EAAE;;QAG1C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI;QACxC,OAAO,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC;AAC/C,YAAA,OAAO,GAAG,OAAO,CAAC,IAAI;;AAE1B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,oBAAoB,EAAE;;AAGtD,IAAA,eAAe,CAAE,KAAa,EAAE,QAAuB,EAAE,UAAyB,EAAE,EAAY,EAAA;QAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;AAEvD,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAA,iCAAA,EAAoC,UAAU,CAAC,IAAI,CAA2G,yGAAA,CAAA,CAAC;YAC5K;;AAGJ,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;YAC7B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,GAAG,GAAG;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC;;;AAI9C,IAAA,IAAI,UAAU,GAAA;QACV,QACI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;YACpC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,SAAS;;;;ACvQxC,SAAA,SAAS,CAAC,GAAU,EAAE,KAAa,EAAA;;IAE/C,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE;AACrC,QAAA,OAAO,KAAK;;AAGhB,IAAA,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC;AAE1B,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;AAGvB,IAAA,GAAG,CAAC,MAAM,GAAG,GAAG;AAEhB,IAAA,OAAO,IAAI;AACf;;ACNA,MAAM,eAAgB,SAAQ,KAAK,CAAA;AAC/B,IAAA,WAAA,CAAY,OAAe,EAAA;QACvB,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,iBAAiB;;AAEpC;MAQY,gBAAgB,CAAA;AAA7B,IAAA,WAAA,GAAA;;;;;AAKW,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,GAAG,EAAe;AAC7B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAe;QAEnC,IAAQ,CAAA,QAAA,GAAiC,EAAE;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAU;QAE/B,IAAS,CAAA,SAAA,GAAyC,EAAE;QACjD,IAAY,CAAA,YAAA,GAAW,CAAC;;IAElC,eAAe,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;;;AAI9B,IAAA,MAAM,CAAC,KAAa,EAAE,GAAQ,EAAE,iBAA0B,IAAI,EAAA;QAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAE3B,IAAI,cAAc,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;QAG1D,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;;;;AAKtC,IAAA,SAAS,CAAC,KAAa,EAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAErC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxB,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,eAAe,CAAC,6CAA6C,GAAG,KAAK,CAAC;;YAClF,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;YAEnB;;AAGJ,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAChB,YAAA,IAAI;gBACA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAChC,MAAM,IAAI,eAAe,CAAC,CAAA,wBAAA,EAA2B,KAAK,CAAsB,mBAAA,EAAA,GAAG,CAAC,WAAW,CAAC,IAAI,CAAK,EAAA,EAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC;;YAClI,OAAO,CAAC,EAAE;AACR,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;YAEnB;;AAGJ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;;;IAInC,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACjB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;;IAItB,yBAAyB,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;;;;YAI/B,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAAE;;YAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;;;YAKhC,IAAK,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;gBACnE,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC9E,gBAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;oBAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAsB,CAAC,CAAC,IAAI;oBACnD,MAAM,UAAU,GAAG,QAAO,GAAG,CAAC,KAAkB,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,GAAW,CAAC,KAAK,CAAC,CAAC;AACvG,oBAAA,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACjD,wBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;;iBAI/B;gBACH,IAAI,QAAS,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,UAAU,EAAE;AAClD,oBAAA,KAAK,CAAC,IAAI,CAAE,GAAiB,CAAC,MAAM,EAAE;AACjC,yBAAA,OAAO,CAAC,CAAC,KAAK,KAAI;wBACf,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;wBACzC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACnC,4BAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;AAElC,qBAAC,CAAC;;;YAId,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACjC,SAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;;AAG5B,IAAA,WAAW,CAAC,KAAa,EAAE,gBAAiC,EAAE,QAAkB,EAAA;AAC5E,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,MAAM,IAAI,GAAG,CAAC,QAAO,gBAAgB,CAAC,KAAK,QAAQ;AAC3C,kBAAE,SAAS,CAAC,gBAAgB;kBAC1B,gBAAgB;AAC1B,YAAA,MAAM,IAAI,KAAK,CACX,yBAAyB,IAAI,CAAA,sBAAA,CAAwB,CACxD;;QAEL,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;;QAE9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,EAAE;YAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE;;AAEhD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtD,QAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC;;AAGvE,IAAA,cAAc,CAAC,KAAa,EAAE,KAAsB,EAAE,QAAkB,EAAA;AACpE,QAAA,MAAM,KAAK,GAAuB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;QACrF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;AACrC,YAAA,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;;;AAIzD;;MCnJY,OAAO,CAAA;IAUhB,WAAY,CAAA,IAAO,EAAE,OAAqB,EAAA;QAJ1C,IAAY,CAAA,YAAA,GAAW,CAAC;AAKpB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEnB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,WAA4B,CAAC;;;;;;AAQtE,IAAA,QAAQ,CAAC,IAAO,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,gBAAgB,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC;;AAG7B,IAAA,MAAM,CACF,KAAa,EACb,EAAA,GAAe,EAAE,MAAM,EAAE,CAAC,EAAE,EAC5B,GAAW,GAAA,IAAI,CAAC,KAAK,EAAA;QAErB,MAAM,UAAU,GAAiB,EAAE;AAEnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;AACvB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;QAEnC,IAAI,OAAO,GAAoB,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC;AAE3D,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AAErB,QAAA,OAAO,EAAE,CAAC,MAAM,GAAG,UAAU,EAAE;;;;YAI3B,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,mBAAmB,EAAE;gBACzC,EAAE,CAAC,MAAM,EAAE;AAEV,gBAAA,GAAW,CAAC,YAAY,CAAC,IAAI;gBAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;;;;gBAKzC,IAAI,CAAC,OAAO,EAAE;;AAEV,oBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,SAAS,CAAA,CAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AACxG,oBAAA,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC;oBAC3D,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC;;qBAE7C;oBACH,GAAG,GAAG,OAAO;AACb,oBAAA,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC;AACnC,oBAAA,IAAI,CAAC,YAAY,GAAG,SAAS;;gBAGjC;;AAGJ,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC;AAExD,YAAA,IAAI,MAAM,KAAK,mBAAmB,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC;gBACrD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC;gBAChD;;;;AAKP,QAAA,GAAW,CAAC,YAAY,CAAC,IAAI;;AAG9B,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;;QAGjC,KAAK,CAAC,yBAAyB,EAAE;AAEjC,QAAA,OAAO,UAAU;;AAGrB,IAAA,oBAAoB,CAAC,KAAa,EAAE,EAAY,EAAE,UAAkB,EAAA;;;;;QAKhE,MAAM,YAAY,GAAa,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;AACpD,QAAA,OAAO,EAAE,CAAC,MAAM,GAAG,UAAU,EAAE;YAC3B,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,mBAAmB,EAAE;gBAC1C,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC;AACnC,gBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE;oBACxD;;;YAGR,EAAE,CAAC,MAAM,EAAE;;;AAInB,IAAA,eAAe,CAAC,KAAa,EAAE,EAAY,EAAE,WAA0B,EAAA;AACnE,QAAA,IAAI,IAAmB;QAEvB,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE;YAC9B,EAAE,CAAC,MAAM,EAAE;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;;QAGpC,OAAO,IAAI,IAAI,WAAW;;AAG9B,IAAA,oBAAoB,CAAE,IAAmB,EAAA;QACrC,OAAO,IAAK,IAAY,EAAE;;IAG9B,eAAe,CAAC,GAAe,EAAE,UAAwB,EAAA;QACrD,MAAM,aAAa,GAAG,QAAS,GAAW,CAAC,UAAU,CAAC,CAAC,KAAK,QAAQ;AACpE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAU,CAAC;QAE9C,GAAG,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,GAAQ,KAAI;YACjC,UAAU,CAAC,IAAI,CAAC;AACZ,gBAAA,GAAG,EAAE,GAAU;gBACf,KAAK;gBACL,EAAE,EAAE,SAAS,CAAC,MAAM;AACpB,gBAAA,KAAK,EAAE,GAAG;AACV,gBAAA,KAAK,EAAE,SAAS;AAChB,gBAAA,aAAa,EAAE;AAClB,aAAA,CAAC;YAEF,IAAI,aAAa,EAAE;AACf,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;AAExD,SAAC,CAAC;;AAGT;;ACpJD;;AAEG;AACG,MAAO,eAAgB,SAAQ,MAAM,CAAA;AAI1C;AAHmB,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAe,CAAA,EAAA,eAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA;AACb,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAe,CAAA,EAAA,eAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA;AACb,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAyB,CAAA,EAAA,eAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAGrC,MAAO,cAAe,SAAQ,MAAM,CAAA;AAA1C,IAAA,WAAA,GAAA;;AAG+B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,WAAW,EAAmB;;AACzE;AAHmB,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAa,CAAA,EAAA,cAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA;AACX,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAoB,CAAA,EAAA,cAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AACP,UAAA,CAAA;AAA1B,IAAA,IAAI,CAAC,CAAE,eAAe,CAAE;AAA8C,CAAA,EAAA,cAAA,CAAA,SAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AAGrE,MAAO,UAAW,SAAQ,MAAM,CAAA;AAAtC,IAAA,WAAA,GAAA;;AAC4B,QAAA,IAAA,CAAA,KAAK,GAAgC,IAAI,WAAW,EAAkB;;AAG9F;;;;;;AAMG;IACH,OAAO,MAAM,CAAC,OAAgB,EAAE,KAAe,EAAE,MAAM,EAAE,CAAC,EAAE,EAAA;AACxD,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO;AAE/B,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE;AACnC,QAAA,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;;;AAIjD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;AAC/D,QAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;AAAE,YAAA,UAAU,CAAC,QAAQ,GAAG,QAAQ;;AAElD,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU;QACzC,MAAM,sBAAsB,GAA2C,EAAE;;;AAIzE,QAAA,MAAM,OAAO,GAAG,CAAC,IAAoB,KAAI;AACrC,YAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACrE,gBAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAE5B,gBAAA,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAE3B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5C,gBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACpB,oBAAA,OAAO,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;AACtC,oBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;;;iBAEhD;gBACH,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AACtD,oBAAA,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;;gBAE/C,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEzD,SAAC;QAED,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;AACtC,YAAA,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE;AACjC,YAAA,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;;YAGxB,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,YAAA,IAAI,WAAW,KAAK,MAAM,EAAE;gBACxB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;;YAGrD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;;;;;YAMvC,IAAI,QAAQ,KAAK,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAC3C,gBAAA,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE;AAC/B,oBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;oBAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI;;AAGtC,oBAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;wBAC5D;;AAGJ,oBAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;AAC7C,oBAAA,eAAe,CAAC,IAAI,GAAG,SAAS;AAEhC,oBAAA,IAAI,SAAiB;AAErB,oBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;oBAE7B,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;AAClC,wBAAA,SAAS,GAAG,KAAK,CAAC,IAAI;;yBAEnB;AACH,wBAAA,IAAI,eAA8B;;;;wBAKlC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;4BACvB,SAAS,GAAG,KAAK;AACjB,4BAAA,eAAe,GAAG,KAAK,CAAC,IAAqB;;6BAE1C;AACH,4BAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEtC,4BAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,SAAoC,CAAC,CAAC,KAAK,QAAQ,EAAE;gCACxE,SAAS,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,SAAoC,CAAC,CAAC;;iCAEjE;AACH,gCAAA,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,SAAoC,CAAC;;;AAI1E,wBAAA,eAAe,CAAC,cAAc,GAAG,CAAC,eAAe;AAC7C,8BAAE,OAAO,CAAC,SAAS,CAAC,eAAe;8BACjC,EAAE;;AAGZ,oBAAA,eAAe,CAAC,IAAI,GAAG,SAAS;AAChC,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;;;YAIzC,OAAO,CAAC,IAAI,CAAC;AACjB,SAAC,CAAC;;AAGF,QAAA,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE;YACzC,sBAAsB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KACxC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;QAGpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;;;AAIlC;;;;;;AAMG;AACH,IAAA,OAAO,MAAM,CAA4B,KAAa,EAAE,EAAa,EAAA;AACjE,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE;AAEnC,QAAA,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;AACjD,QAAA,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AAEnC,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE;;QAGrC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,KAAI;AACxC,YAAA,MAAM,WAAW,GAAkB,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,MAAM;AACtF,YAAA,MAAM,MAAM,GAAkB,MAAM,CAAE,SAAQ,WAAW,CAAA;aAAG;;AAG5D,YAAA,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;;;YAK5B,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;SAC7C,EAAE,EAAE,CAAC;;QAGN,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAE,cAA8B,EAAE,gBAAwB,KAAI;YAC/F,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AACvC,gBAAA,MAAM,UAAU,GAAG,gBAAgB,GAAG,CAAC;AAEvC,gBAAA,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE;AACpC,oBAAA,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI;oBAC1B,IAAI,OAAO,GAAkB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC;;oBAGlE,IAAI,CAAC,OAAO,EAAE;wBACV,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,wBAAA,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;AACvB,wBAAA,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAkB,CAAC;;AAG3C,oBAAA,IAAI,SAAS,KAAK,KAAK,EAAE;AACrB,wBAAA,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;;yBAEzD;AACH,wBAAA,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,GAAG,OAAO,EAAE,CAAC;;;qBAG9E;AACH,oBAAA,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAqB,CAAC;;AAExF,aAAC,CAAC;AACN,SAAC;;QAGD,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,KAAI;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;;YAGjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YAE5C,MAAM,cAAc,GAAqB,EAAE;YAE3C,IAAI,UAAU,GAAmB,cAAc;AAC/C,YAAA,GAAG;AACC,gBAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC/B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,CAAC;aAC3E,QAAQ,UAAU;YAEnB,IAAI,gBAAgB,GAAG,CAAC;YAExB,cAAc,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,cAAc,KAAI;;;AAGhD,gBAAA,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC;AACrD,gBAAA,gBAAgB,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM;AACpD,aAAC,CAAC;AACN,SAAC,CAAC;AAEF,QAAA,MAAM,KAAK,GAAM,KAAK,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAoB,GAAE;AAEpF,QAAA,OAAO,IAAI,OAAO,CAAI,KAAK,EAAE,WAAW,CAAC;;AAEhD;AArN2B,UAAA,CAAA;AAAvB,IAAA,IAAI,CAAC,CAAC,cAAc,CAAC;AAAyE,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,OAAA,EAAA,MAAA,CAAA;AAC/E,UAAA,CAAA;IAAf,IAAI,CAAC,QAAQ;AAAmB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,CAAA;;ACoF/B,SAAU,wBAAwB,CAAmB,OAAmB,EAAA;AAC1E,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI;AAC1B,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;AAEjC,IAAA,MAAM,UAAU,GAA+B,IAAI,OAAO,EAAE;AAC5D,IAAA,IAAI,oBAA0C;AAE9C,IAAA,OAAO,CAAC,cAAc,GAAG,UAAU,UAAwB,EAAA;AACvD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU;AAEtC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;AAC1B,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG;AACtB,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;YAEnC,IAAI,CAAC,UAAU,EAAE;gBAAE;;;;;AAKnB,YAAA,IACI,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM;AACnD,gBAAA,MAAM,CAAC,aAAa,YAAY,MAAM,EACxC;gBACE,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7F,gBAAA,KAAK,IAAI,CAAC,GAAG,eAAe,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,oBAAA,eAAe,CAAC,CAAC,CAAC,EAAE;;;AAI5B,YAAA,IAAI,GAAG,YAAY,MAAM,EAAE;;;;gBAKvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;;oBAE1B,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC;AACxD,oBAAA,KAAK,IAAI,CAAC,GAAG,gBAAgB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,wBAAA,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;;;gBAQ7B,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBACzC,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/C,oBAAA,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAClD,wBAAA,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC;;;;;;;;iBAS1D;;;;AAKH,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE;;;;AAIrD,oBAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE;;wBAEpC,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;AACpD,wBAAA,KAAK,IAAI,CAAC,GAAG,eAAe,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACnD,4BAAA,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC;;;;AAKrF,oBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;wBAC/C,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC;AAC9C,wBAAA,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAChD,4BAAA,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC;;;;AAIvE,qBAAA,IACH,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG;AAC7C,oBAAA,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK,EACvC;;oBAEE,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC;AAC9C,oBAAA,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAChD,wBAAA,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC;;;;AAK1E,gBAAA,IACI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,aAAa;;;AAGrC,qBAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,EACpE;oBACE,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;AACtD,oBAAA,KAAK,IAAI,CAAC,GAAG,gBAAgB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,wBAAA,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC;;;;AAKlF,YAAA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;;AAE/B,KAAC;AAED,IAAA,SAAS,QAAQ,CACb,cAAyC,EACzC,OAAoB,EAAA;AAEpB,QAAA,IAAI,QAAQ,GAAa,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc;AACzF,QAAA,IAAI,YAAY,IACZ,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,UAAU;AACxE,aAAC,cAAc,IAAI,QAAS,cAAgC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,WAAW,CAAC,CAClG;AAED,QAAA,IAAI,QAAQ,IAAI,CAAC,YAAY,EAAE;YAE3B,MAAM,WAAW,GAAG,UAChB,GAAQ,EACR,IAAY,EACZ,QAAkD,EAAE,SAAkB,EAAA;;AAGtE,gBAAA,IACI,SAAS;AACT,oBAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS;AACpC,oBAAA,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC;kBACvC;oBACE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;;AAE/C,gBAAA,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC;AACnE,aAAC;AAED;;AAEG;YACH,OAAO,IAAI,KAAK,CAAC;gBACb,MAAM,EAAE,SAAS,MAAM,CAAC,IAAY,EAAE,QAAkD,EAAE,SAAA,GAAqB,IAAI,EAAA;AAC/G,oBAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AAClB,wBAAA,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC;;yBAE5D;;AAEH,wBAAA,IAAI,cAAc,GAAG,MAAK,GAAG;wBAE7B,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAQ,EAAE,QAAiB,KAAI;4BACxD,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACrH,yBAAC,CAAC;AAEF,wBAAA,OAAO,MAAM,cAAc,EAAE;;iBAEpC;AAED,gBAAA,QAAQ,EAAE,SAAS,QAAQ,CAAC,QAAoB,EAAA;oBAC5C,OAAO,KAAK,CAAC,WAAW,CACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAClC,SAAS,CAAC,OAAO,EACjB,QAAQ,CACX;iBACJ;;;;;AAMD,gBAAA,MAAM,EAAE,SAAS,MAAM,CAAC,YAAiB,EAAE,UAAqB,EAAA;oBAC5D,IAAI,CAAC,UAAU,EAAE;wBACb,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAsB,CAAC,CAAC,IAAI,CAAC;;oBAE5F,OAAO,KAAK,CAAC,WAAW,CACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAClC,SAAS,CAAC,OAAO,EACjB,MAAK;wBACD,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KACpB,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpD,qBAAC,CACJ;;aAER,EAAE;gBACC,GAAG,CAAC,MAAM,EAAE,IAAY,EAAA;oBACpB,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9C,IAAI,aAAa,EAAE;wBACf,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AACzC,wBAAA,MAAM,mBAAmB,IACrB,CAAC,QAA+C,KAAI;AAChD,4BAAA,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,KAAI;AACzD,gCAAA,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;;;;;gCAMtB,MAAM,IAAI;6BACb,EAAE,KAAK,CAAC;;4BAGT,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE;AAC1C,gCAAA,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;;AAEhC,yBAAC,CACJ;AAED,wBAAA,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE;;AAEhC,4BAAA,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;4BAClD,cAAc,EAAE,OAAO,CAAC,QAAQ;4BAChC,mBAAmB;AACtB,yBAAA,CAAC;;yBAEC;;AAEH,wBAAA,OAAO,MAAM,CAAC,IAA2B,CAAC;;iBAEjD;AACD,gBAAA,GAAG,CAAC,MAAM,EAAE,IAAY,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE;AAClE,gBAAA,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAA,EAAI,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;AAClD,gBAAA,cAAc,CAAC,CAAC,EAAE,EAAE,EAAI,EAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;AAC5D,aAAA,CAAC;;aAEC;AACH;;AAEG;AAEH,YAAA,MAAM,KAAK,GAAG,UAAU,GAAQ,EAAE,QAAwC,EAAE,SAAkB,EAAA;;gBAE1F,IAAI,SAAS,EAAE;AACV,oBAAA,GAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAG/D,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,KAAU,EAAE,GAAQ,KAAI;AACpF,oBAAA,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;oBAC9B,oBAAoB,GAAG,QAAQ;AAC/B,oBAAA,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;AACpB,oBAAA,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAC3B,oBAAoB,GAAG,SAAS;AACpC,iBAAC,CAAC;AACN,aAAC;AAED,YAAA,MAAM,QAAQ,GAAG,UAAU,GAAQ,EAAE,QAAwC,EAAA;AACzE,gBAAA,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC/E,aAAC;AAED,YAAA,MAAM,QAAQ,GAAG,UAAU,GAAQ,EAAE,QAAwC,EAAA;AACzE,gBAAA,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;AAChF,aAAC;YAED,OAAO,IAAI,KAAK,CAAC;AACb,gBAAA,KAAK,EAAE,UAAS,QAAwC,EAAE,YAAqB,IAAI,EAAA;;;;;AAM/E,oBAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AAClB,wBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;;AAEzF,yBAAA,IAAI,OAAO,CAAC,mBAAmB,EAAE;;AAEpC,wBAAA,IAAI,cAAc,GAAG,MAAK,GAAG;wBAE7B,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAQ,EAAE,QAAiB,KAAI;AACxD,4BAAA,cAAc,GAAG,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACzG,yBAAC,CAAC;AAEF,wBAAA,OAAO,MAAM,cAAc,EAAE;;iBAEpC;gBACD,QAAQ,EAAE,UAAS,QAAwC,EAAA;AACvD,oBAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;wBAClB,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAExC,yBAAA,IAAI,OAAO,CAAC,mBAAmB,EAAE;;AAEpC,wBAAA,IAAI,cAAc,GAAG,MAAK,GAAG;AAE7B,wBAAA,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAQ,KAAI;AACrC,4BAAA,cAAc,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC5C,yBAAC,CAAC;AAEF,wBAAA,OAAO,MAAM,cAAc,EAAE;;iBAEpC;gBACD,QAAQ,EAAE,UAAS,QAAwC,EAAA;AACvD,oBAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;wBAClB,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAExC,yBAAA,IAAI,OAAO,CAAC,mBAAmB,EAAE;;AAEpC,wBAAA,IAAI,cAAc,GAAG,MAAK,GAAG;AAE7B,wBAAA,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAQ,KAAI;AACrC,4BAAA,cAAc,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC5C,yBAAC,CAAC;AAEF,wBAAA,OAAO,MAAM,cAAc,EAAE;;iBAEpC;aACJ,EAAE;gBACC,GAAG,CAAC,MAAM,EAAE,IAAY,EAAA;AACpB,oBAAA,IAAI,CAAC,MAAM,CAAC,IAA2B,CAAC,EAAE;AACtC,wBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAA,uDAAA,CAAyD,CAAC;;AAEnG,oBAAA,OAAO,MAAM,CAAC,IAA2B,CAAC;iBAC7C;AACD,gBAAA,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,OAAO,MAAM,CAAC,IAA2B,CAAC,KAAK,SAAS,CAAC,EAAE;AAC/E,gBAAA,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAA,EAAI,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;AAClD,gBAAA,cAAc,CAAC,CAAC,EAAE,EAAE,EAAI,EAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;AAC5D,aAAA,CAAC;;;IAIV,SAAS,CAAC,CAAI,QAAW,EAAA;QACrB,OAAO,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAgC;;AAG3E,IAAA,OAAO,CAAC;AACZ;;ACjbgB,SAAA,qBAAqB,CACjC,OAAgB,EAChB,QAAyC,EAAA;AAEzC,IAAA,OAAO,CAAC,cAAc,GAAG,QAAQ;AACrC;;MCIa,SAAS,CAAA;AAyBlB,IAAA,WAAA,CAAmB,WAAoB,KAAK,EAAA;QAAzB,IAAQ,CAAA,QAAA,GAAR,QAAQ;AAlB3B;;AAEG;AACH,QAAA,IAAA,CAAA,OAAO,GAAwB,IAAI,OAAO,EAAc;AAExD;;AAEG;AACH,QAAA,IAAA,CAAA,SAAS,GAAwB,IAAI,OAAO,EAAc;AAI1D;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,GAAG,EAA6B;QAG1C,IAAI,QAAQ,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;;;AAKvB,IAAA,GAAG,CAAC,GAAQ,EAAE,MAAc,gBAAgB,EAAE,qBAA8B,IAAI,EAAA;AAC5E,QAAA,MAAM,UAAU,GAAe,GAAG,GAAG,QAAQ,CAAC;AAC9C,QAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM;QAE1C,IAAI,CAAC,UAAU,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC;AACrD,YAAA,OAAO,KAAK;;AAET,aAAA,IACH,CAAC,gBAAgB;AACjB,YAAA,UAAU,CAAC,KAAK,KAAK,CAAC;UACxB;AACE;;;;;;AAMG;AACH,YAAA,MAAM,IAAI,KAAK,CACX,CAAA,0EAAA,EAA6E,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAA,iDAAA,CAAmD,CAClK;;;QAIL,MAAM,QAAQ,GAAc,GAAG,CAAC,WAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC9E,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;;AAG5B,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,kBAAkB,EAAE;AACrC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;AAMxB,QAAA,IAAI,kBAAkB,IAAI,gBAAgB,EAAE;AACxC,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC;;AAGrC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,GAAG,EAAE;;YAEZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;;QAG/C,IAAI,YAAY,GAAG,KAAK;;;;;QAMxB,UAAU,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;;AAEtC,YAAA,IACI,QAAQ;AACR,gBAAA,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,SAAS;gBACjC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,EAC7B;gBACE;;AAGJ,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE;gBAClC,YAAY,GAAG,IAAI;;AAE3B,SAAC,CAAC;;AAGF,QAAA,IAAI,GAAG,KAAK,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,EAA2B;;AAEtD,YAAA,IAAI,IAAiB;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC5B,gBAAA,IAAI,GAAG,IAAI,GAAG,EAAU;gBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;;iBAC5B;gBACH,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;;AAEpC,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGb,YAAA,QAAQ,GAAG,sBAAsB,CAAC,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,KAAI;gBACzD,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE;AAClD,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,GAAG;;AAEtC,aAAC,CAAC;;AAEC,aAAA,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,YAAY,EAAE;;YAE1C,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,eAAe,KAAK,SAAS;kBACrD,UAAU,CAAC;AACb,kBAAE,UAAU,CAAC,UAAU;YAE3B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACrC,gBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;oBAAE;AAAU,iBAAC;AAEtC,gBAAA,MAAM,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG;gBAC/D,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG;AACxC,gBAAA,IACI,EAAE,KAAK,SAAS,CAAC,MAAM;qBAEnB,WAAW;wBACX,UAAU,KAAK,SAAS;wBACxB,UAAU,KAAK,GAAG;AACrB,qBAAA,EACH;AACE,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;AACnB,oBAAA,YAAY,GAAG,IAAI,CAAC;;;;AAKhC,QAAA,OAAO,YAAY;;IAGb,WAAW,CAAC,eAA2B,EAAE,GAAW,EAAA;QAC1D,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;;AAE/B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;;YAG5B,MAAM,gBAAgB,GAAe,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC;YAClE,IAAI,gBAAgB,KAAK,gBAAgB,CAAC,eAAe,KAAK,SAAS,CAAC,EAAE;AACtE,gBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC;;;;;;QAQzC,IAAI,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE;AACxD,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;AAChD,YAAA,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;;AAG/C,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACZ,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,EAA2B;;AAGtD,YAAA,IAAI,IAAiB;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC5B,gBAAA,IAAI,GAAG,IAAI,GAAG,EAAU;gBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;;iBAC5B;gBACH,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;;AAEpC,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAEb,YAAA,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,GAAG;;;AAM5C,IAAA,MAAM,CAAC,GAAQ,EAAE,MAAc,gBAAgB,EAAE,WAAoB,KAAK,EAAA;AACtE,QAAA,MAAM,UAAU,GAAe,GAAG,CAAC,QAAQ,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC;AACxD,YAAA,OAAO,IAAI;;AAGf,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;;QAG/B,IACI,IAAI,CAAC,QAAQ;YACb,CAAC,QAAQ;UACX;AACE,YAAA,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;AAGlD,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;AAC1B,QAAA,MAAM,QAAQ,GAAa,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAE5D,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;;AAG/C,QAAA,IAAI,GAAG,KAAK,gBAAgB,EAAE;;AAE1B,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;AAChC,YAAA,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE;AACtE,gBAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;AACzC,gBAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC;AACtD,gBAAA,IAAI,OAAO,KAAK,SAAS,EAAE;oBACvB,OAAO,GAAG,EAAE;oBACZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;;qBAE9C,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,GAAG,EAAE;;;;;oBAK1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;;;gBAIzC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,MAAM;;AAGlD,gBAAA,IAAI,CAAC,iCAAiC,CAAC,UAAU,CAAC;;iBAE/C;;gBAEH,QAAQ,GAAG,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,KACzC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;;;aAGvC;;YAEH,QAAQ,GAAG,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAClD,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;;;AAI1C,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACtC,YAAA,IAAI,GAAG,KAAK,SAAS,EAAE;;AAEnB,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;;iBACzB;;AAEH,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;AAGhB,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE;AACjB,oBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;;;;AAKxC,QAAA,OAAO,IAAI;;AAGf,IAAA,GAAG,CAAC,GAAQ,EAAA;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;;AAG1C,IAAA,MAAM,CAAC,EAAO,EAAE,GAAA,GAAc,gBAAgB,EAAA;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK;;IAGlC,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,0GAA0G,CAAC;;QAG/H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC;;;AAItD,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;;AAGzB,IAAA,mBAAmB,CAAC,UAAsB,EAAA;QACtC,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;;;;;AAM5C,QAAA,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,4BAA4B,EAAC;;;;;;AAQtD,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;AAC/C,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC5B,SAAS,GAAG,IAAI;;;AAIxB,QAAA,OAAO,SAAS;;AAGV,IAAA,iCAAiC,CAAC,UAAsB,EAAA;AAC9D,QAAA,UAAU,CAAC,YAAY,CAAC,CAAC,eAAe,KAAI;AACxC,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;AACpC,YAAA,IAAI,CAAC,iCAAiC,CAAC,eAAe,CAAC;AAC3D,SAAC,CAAC;;AAET;;ACpUD,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC/C,YAAY,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACnD,YAAY,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC/C,YAAY,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,CAAC;;;;","x_google_ignoreList":[19]}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/encoding/spec.ts","../../src/symbol.shim.ts","../../src/types/symbols.ts","../../src/encoding/encode.ts","../../src/encoding/decode.ts","../../src/types/registry.ts","../../src/types/TypeContext.ts","../../src/Metadata.ts","../../src/encoder/ChangeTree.ts","../../src/encoder/EncodeOperation.ts","../../src/decoder/DecodeOperation.ts","../../src/encoding/assert.ts","../../src/types/custom/ArraySchema.ts","../../src/types/custom/MapSchema.ts","../../src/types/custom/CollectionSchema.ts","../../src/types/custom/SetSchema.ts","../../src/annotations.ts","../../src/utils.ts","../../src/Schema.ts","../../src/encoder/Root.ts","../../src/encoder/Encoder.ts","../../src/types/utils.ts","../../src/decoder/ReferenceTracker.ts","../../src/decoder/Decoder.ts","../../src/Reflection.ts","../../src/decoder/strategy/getDecoderStateCallbacks.ts","../../src/decoder/strategy/RawChanges.ts","../../src/decoder/strategy/Callbacks.ts","../../src/encoder/StateView.ts","../../src/index.ts"],"sourcesContent":["export const SWITCH_TO_STRUCTURE = 255; // (decoding collides with DELETE_AND_ADD + fieldIndex = 63)\nexport const TYPE_ID = 213;\n\n/**\n * Encoding Schema field operations.\n */\nexport enum OPERATION {\n ADD = 128, // (10000000) add new structure/primitive\n REPLACE = 0, // (00000001) replace structure/primitive\n DELETE = 64, // (01000000) delete field\n DELETE_AND_MOVE = 96, // () ArraySchema only\n MOVE_AND_ADD = 160, // () ArraySchema only\n DELETE_AND_ADD = 192, // (11000000) DELETE field, followed by an ADD\n\n /**\n * Collection operations\n */\n CLEAR = 10,\n\n /**\n * ArraySchema operations\n */\n REVERSE = 15,\n MOVE = 32,\n DELETE_BY_REFID = 33, // This operation is only used at ENCODING time. During DECODING, DELETE_BY_REFID is converted to DELETE\n ADD_BY_REFID = 129,\n}\n","\n//\n// Must have Symbol.metadata defined for metadata support on decorators:\n// https://github.com/microsoft/TypeScript/issues/55453#issuecomment-1687496648\n//\nexport {};\ndeclare global {\n interface SymbolConstructor {\n readonly metadata: unique symbol;\n }\n}\n(Symbol as any).metadata ??= Symbol.for(\"Symbol.metadata\");","export const $refId = \"~refId\";\nexport const $track = \"~track\";\nexport const $encoder = \"~encoder\";\nexport const $decoder = \"~decoder\";\n\nexport const $filter = \"~filter\";\n\nexport const $getByIndex = \"~getByIndex\";\nexport const $deleteByIndex = \"~deleteByIndex\";\n\n/**\n * Used to hold ChangeTree instances whitin the structures\n */\nexport const $changes = '~changes';\n\n/**\n * Used to keep track of the type of the child elements of a collection\n * (MapSchema, ArraySchema, etc.)\n */\nexport const $childType = '~childType';\n\n/**\n * Optional \"discard\" method for custom types (ArraySchema)\n * (Discards changes for next serialization)\n */\nexport const $onEncodeEnd = '~onEncodeEnd';\n\n/**\n * When decoding, this method is called after the instance is fully decoded\n */\nexport const $onDecodeEnd = \"~onDecodeEnd\";\n\n/**\n * Metadata\n */\nexport const $descriptors = \"~descriptors\";\nexport const $numFields = \"~__numFields\";\nexport const $refTypeFieldIndexes = \"~__refTypeFieldIndexes\";\nexport const $viewFieldIndexes = \"~__viewFieldIndexes\";\nexport const $fieldIndexesByViewTag = \"$__fieldIndexesByViewTag\";","// @ts-nocheck\n\n/**\n * Copyright (c) 2018 Endel Dreyer\n * Copyright (c) 2014 Ion Drive Software Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE\n */\n\nimport type { TextEncoder } from \"util\";\nimport type { Iterator } from \"./decode\";\n\nexport type BufferLike = ArrayLike<number> & { [index: number]: number };\n\n/**\n * msgpack implementation highly based on notepack.io\n * https://github.com/darrachequesne/notepack\n */\n\nlet textEncoder: TextEncoder;\n// @ts-ignore\ntry { textEncoder = new TextEncoder(); } catch (e) { }\n\n// force little endian to facilitate decoding on multiple implementations\nconst _isLittleEndian = true; // new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\nconst _convoBuffer = new ArrayBuffer(8);\nconst _int32 = new Int32Array(_convoBuffer);\nconst _float32 = new Float32Array(_convoBuffer);\nconst _float64 = new Float64Array(_convoBuffer);\nconst _int64 = new BigInt64Array(_convoBuffer);\n\nconst hasBufferByteLength = (typeof Buffer !== 'undefined' && Buffer.byteLength);\n\nconst utf8Length: (str: string, _?: any) => number = (hasBufferByteLength)\n ? Buffer.byteLength // node\n : function (str: string, _?: any) {\n var c = 0, length = 0;\n for (var i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n }\n\nfunction utf8Write(view: BufferLike, str: string, it: Iterator) {\n var c = 0;\n for (var i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n view[it.offset++] = c;\n }\n else if (c < 0x800) {\n view[it.offset] = 0xc0 | (c >> 6);\n view[it.offset + 1] = 0x80 | (c & 0x3f);\n it.offset += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n view[it.offset] = 0xe0 | (c >> 12);\n view[it.offset+1] = 0x80 | (c >> 6 & 0x3f);\n view[it.offset+2] = 0x80 | (c & 0x3f);\n it.offset += 3;\n }\n else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n view[it.offset] = 0xf0 | (c >> 18);\n view[it.offset+1] = 0x80 | (c >> 12 & 0x3f);\n view[it.offset+2] = 0x80 | (c >> 6 & 0x3f);\n view[it.offset+3] = 0x80 | (c & 0x3f);\n it.offset += 4;\n }\n }\n}\n\nfunction int8(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n};\n\nfunction uint8(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n};\n\nfunction int16(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n};\n\nfunction uint16(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n};\n\nfunction int32(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value & 255;\n bytes[it.offset++] = (value >> 8) & 255;\n bytes[it.offset++] = (value >> 16) & 255;\n bytes[it.offset++] = (value >> 24) & 255;\n};\n\nfunction uint32(bytes: BufferLike, value: number, it: Iterator) {\n const b4 = value >> 24;\n const b3 = value >> 16;\n const b2 = value >> 8;\n const b1 = value;\n bytes[it.offset++] = b1 & 255;\n bytes[it.offset++] = b2 & 255;\n bytes[it.offset++] = b3 & 255;\n bytes[it.offset++] = b4 & 255;\n};\n\nfunction int64(bytes: BufferLike, value: number, it: Iterator) {\n const high = Math.floor(value / Math.pow(2, 32));\n const low = value >>> 0;\n uint32(bytes, low, it);\n uint32(bytes, high, it);\n};\n\nfunction uint64(bytes: BufferLike, value: number, it: Iterator) {\n const high = (value / Math.pow(2, 32)) >> 0;\n const low = value >>> 0;\n uint32(bytes, low, it);\n uint32(bytes, high, it);\n};\n\nfunction bigint64(bytes: BufferLike, value: bigint, it: Iterator) {\n _int64[0] = BigInt.asIntN(64, value);\n int32(bytes, _int32[0], it);\n int32(bytes, _int32[1], it);\n}\n\nfunction biguint64(bytes: BufferLike, value: bigint, it: Iterator) {\n _int64[0] = BigInt.asIntN(64, value);\n int32(bytes, _int32[0], it);\n int32(bytes, _int32[1], it);\n}\n\nfunction float32(bytes: BufferLike, value: number, it: Iterator) {\n _float32[0] = value;\n int32(bytes, _int32[0], it);\n}\n\nfunction float64(bytes: BufferLike, value: number, it: Iterator) {\n _float64[0] = value;\n int32(bytes, _int32[_isLittleEndian ? 0 : 1], it);\n int32(bytes, _int32[_isLittleEndian ? 1 : 0], it);\n}\n\nfunction boolean(bytes: BufferLike, value: number, it: Iterator) {\n bytes[it.offset++] = value ? 1 : 0; // uint8\n};\n\nfunction string(bytes: BufferLike, value: string, it: Iterator) {\n // encode `null` strings as empty.\n if (!value) { value = \"\"; }\n\n let length = utf8Length(value, \"utf8\");\n let size = 0;\n\n // fixstr\n if (length < 0x20) {\n bytes[it.offset++] = length | 0xa0;\n size = 1;\n }\n // str 8\n else if (length < 0x100) {\n bytes[it.offset++] = 0xd9;\n bytes[it.offset++] = length % 255;\n size = 2;\n }\n // str 16\n else if (length < 0x10000) {\n bytes[it.offset++] = 0xda;\n uint16(bytes, length, it);\n size = 3;\n }\n // str 32\n else if (length < 0x100000000) {\n bytes[it.offset++] = 0xdb;\n uint32(bytes, length, it);\n size = 5;\n } else {\n throw new Error('String too long');\n }\n\n utf8Write(bytes, value, it);\n\n return size + length;\n}\n\nfunction number(bytes: BufferLike, value: number, it: Iterator) {\n if (isNaN(value)) {\n return number(bytes, 0, it);\n\n } else if (!isFinite(value)) {\n return number(bytes, (value > 0) ? Number.MAX_SAFE_INTEGER : -Number.MAX_SAFE_INTEGER, it);\n\n } else if (value !== (value|0)) {\n if (Math.abs(value) <= 3.4028235e+38) { // range check\n _float32[0] = value;\n if (Math.abs(Math.abs(_float32[0]) - Math.abs(value)) < 1e-4) { // precision check; adjust 1e-n (n = precision) to in-/decrease acceptable precision loss\n // now we know value is in range for f32 and has acceptable precision for f32\n bytes[it.offset++] = 0xca;\n float32(bytes, value, it);\n return 5;\n }\n }\n\n bytes[it.offset++] = 0xcb;\n float64(bytes, value, it);\n return 9;\n }\n\n if (value >= 0) {\n // positive fixnum\n if (value < 0x80) {\n bytes[it.offset++] = value & 255; // uint8\n return 1;\n }\n\n // uint 8\n if (value < 0x100) {\n bytes[it.offset++] = 0xcc;\n bytes[it.offset++] = value & 255; // uint8\n return 2;\n }\n\n // uint 16\n if (value < 0x10000) {\n bytes[it.offset++] = 0xcd;\n uint16(bytes, value, it);\n return 3;\n }\n\n // uint 32\n if (value < 0x100000000) {\n bytes[it.offset++] = 0xce;\n uint32(bytes, value, it);\n return 5;\n }\n\n // uint 64\n bytes[it.offset++] = 0xcf;\n uint64(bytes, value, it);\n return 9;\n\n } else {\n\n // negative fixnum\n if (value >= -0x20) {\n bytes[it.offset++] = 0xe0 | (value + 0x20);\n return 1;\n }\n\n // int 8\n if (value >= -0x80) {\n bytes[it.offset++] = 0xd0;\n int8(bytes, value, it);\n return 2;\n }\n\n // int 16\n if (value >= -0x8000) {\n bytes[it.offset++] = 0xd1;\n int16(bytes, value, it);\n return 3;\n }\n\n // int 32\n if (value >= -0x80000000) {\n bytes[it.offset++] = 0xd2;\n int32(bytes, value, it);\n return 5;\n }\n\n // int 64\n bytes[it.offset++] = 0xd3;\n int64(bytes, value, it);\n return 9;\n }\n}\n\nexport const encode = {\n int8,\n uint8,\n int16,\n uint16,\n int32,\n uint32,\n int64,\n uint64,\n bigint64,\n biguint64,\n float32,\n float64,\n boolean,\n string,\n number,\n utf8Write,\n utf8Length,\n}","// @ts-nocheck\n\n/**\n * Copyright (c) 2018 Endel Dreyer\n * Copyright (c) 2014 Ion Drive Software Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE\n */\n\nimport type { BufferLike } from \"./encode\";\n\n/**\n * msgpack implementation highly based on notepack.io\n * https://github.com/darrachequesne/notepack\n */\n\nexport interface Iterator { offset: number; }\n\n// force little endian to facilitate decoding on multiple implementations\nconst _isLittleEndian = true; // new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\nconst _convoBuffer = new ArrayBuffer(8);\n\nconst _int32 = new Int32Array(_convoBuffer);\nconst _float32 = new Float32Array(_convoBuffer);\nconst _float64 = new Float64Array(_convoBuffer);\nconst _uint64 = new BigUint64Array(_convoBuffer);\nconst _int64 = new BigInt64Array(_convoBuffer);\n\nfunction utf8Read(bytes: BufferLike, it: Iterator, length: number) {\n // boundary check\n if (length > bytes.length - it.offset) { length = bytes.length - it.offset; }\n\n var string = '', chr = 0;\n for (var i = it.offset, end = it.offset + length; i < end; i++) {\n var byte = bytes[i];\n if ((byte & 0x80) === 0x00) {\n string += String.fromCharCode(byte);\n continue;\n }\n if ((byte & 0xe0) === 0xc0) {\n string += String.fromCharCode(\n ((byte & 0x1f) << 6) |\n (bytes[++i] & 0x3f)\n );\n continue;\n }\n if ((byte & 0xf0) === 0xe0) {\n string += String.fromCharCode(\n ((byte & 0x0f) << 12) |\n ((bytes[++i] & 0x3f) << 6) |\n ((bytes[++i] & 0x3f) << 0)\n );\n continue;\n }\n if ((byte & 0xf8) === 0xf0) {\n chr = ((byte & 0x07) << 18) |\n ((bytes[++i] & 0x3f) << 12) |\n ((bytes[++i] & 0x3f) << 6) |\n ((bytes[++i] & 0x3f) << 0);\n if (chr >= 0x010000) { // surrogate pair\n chr -= 0x010000;\n string += String.fromCharCode((chr >>> 10) + 0xD800, (chr & 0x3FF) + 0xDC00);\n } else {\n string += String.fromCharCode(chr);\n }\n continue;\n }\n\n // (do not throw error to avoid server/client from crashing due to hack attemps)\n // throw new Error('Invalid byte ' + byte.toString(16));\n\n console.error('decode.utf8Read(): Invalid byte ' + byte + ' at offset ' + i + '. Skip to end of string: ' + (it.offset + length));\n break;\n }\n it.offset += length;\n return string;\n}\n\nfunction int8 (bytes: BufferLike, it: Iterator) {\n return uint8(bytes, it) << 24 >> 24;\n};\n\nfunction uint8 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++];\n};\n\nfunction int16 (bytes: BufferLike, it: Iterator) {\n return uint16(bytes, it) << 16 >> 16;\n};\n\nfunction uint16 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++] | bytes[it.offset++] << 8;\n};\n\nfunction int32 (bytes: BufferLike, it: Iterator) {\n return bytes[it.offset++] | bytes[it.offset++] << 8 | bytes[it.offset++] << 16 | bytes[it.offset++] << 24;\n};\n\nfunction uint32 (bytes: BufferLike, it: Iterator) {\n return int32(bytes, it) >>> 0;\n};\n\nfunction float32 (bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n return _float32[0];\n};\n\nfunction float64 (bytes: BufferLike, it: Iterator) {\n _int32[_isLittleEndian ? 0 : 1] = int32(bytes, it);\n _int32[_isLittleEndian ? 1 : 0] = int32(bytes, it);\n return _float64[0];\n};\n\nfunction int64(bytes: BufferLike, it: Iterator) {\n const low = uint32(bytes, it);\n const high = int32(bytes, it) * Math.pow(2, 32);\n return high + low;\n};\n\nfunction uint64(bytes: BufferLike, it: Iterator) {\n const low = uint32(bytes, it);\n const high = uint32(bytes, it) * Math.pow(2, 32);\n return high + low;\n};\n\nfunction bigint64(bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n _int32[1] = int32(bytes, it);\n return _int64[0];\n}\n\nfunction biguint64(bytes: BufferLike, it: Iterator) {\n _int32[0] = int32(bytes, it);\n _int32[1] = int32(bytes, it);\n return _uint64[0];\n}\n\nfunction boolean (bytes: BufferLike, it: Iterator) {\n return uint8(bytes, it) > 0;\n};\n\nfunction string (bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset++];\n let length: number;\n\n if (prefix < 0xc0) {\n // fixstr\n length = prefix & 0x1f;\n\n } else if (prefix === 0xd9) {\n length = uint8(bytes, it);\n\n } else if (prefix === 0xda) {\n length = uint16(bytes, it);\n\n } else if (prefix === 0xdb) {\n length = uint32(bytes, it);\n }\n\n return utf8Read(bytes, it, length);\n}\n\nfunction number (bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset++];\n\n if (prefix < 0x80) {\n // positive fixint\n return prefix;\n\n } else if (prefix === 0xca) {\n // float 32\n return float32(bytes, it);\n\n } else if (prefix === 0xcb) {\n // float 64\n return float64(bytes, it);\n\n } else if (prefix === 0xcc) {\n // uint 8\n return uint8(bytes, it);\n\n } else if (prefix === 0xcd) {\n // uint 16\n return uint16(bytes, it);\n\n } else if (prefix === 0xce) {\n // uint 32\n return uint32(bytes, it);\n\n } else if (prefix === 0xcf) {\n // uint 64\n return uint64(bytes, it);\n\n } else if (prefix === 0xd0) {\n // int 8\n return int8(bytes, it);\n\n } else if (prefix === 0xd1) {\n // int 16\n return int16(bytes, it);\n\n } else if (prefix === 0xd2) {\n // int 32\n return int32(bytes, it);\n\n } else if (prefix === 0xd3) {\n // int 64\n return int64(bytes, it);\n\n } else if (prefix > 0xdf) {\n // negative fixint\n return (0xff - prefix + 1) * -1\n }\n};\n\nexport function stringCheck(bytes: BufferLike, it: Iterator) {\n const prefix = bytes[it.offset];\n return (\n // fixstr\n (prefix < 0xc0 && prefix > 0xa0) ||\n // str 8\n prefix === 0xd9 ||\n // str 16\n prefix === 0xda ||\n // str 32\n prefix === 0xdb\n );\n}\n\nexport const decode = {\n utf8Read,\n int8,\n uint8,\n int16,\n uint16,\n int32,\n uint32,\n float32,\n float64,\n int64,\n uint64,\n bigint64,\n biguint64,\n boolean,\n string,\n number,\n stringCheck,\n};","import { DefinitionType, type } from \"../annotations\";\nimport { BufferLike, encode } from \"../encoding/encode\";\nimport { decode, Iterator } from \"../encoding/decode\";\n\nexport interface TypeDefinition {\n constructor?: any,\n encode?: (bytes: BufferLike, value: any, it: Iterator) => any;\n decode?: (bytes: BufferLike, it: Iterator) => any;\n}\n\nexport const registeredTypes: {[identifier: string] : TypeDefinition} = {};\n\nconst identifiers = new Map<any, string>();\n\nexport function registerType(identifier: string, definition: TypeDefinition) {\n if (definition.constructor) {\n identifiers.set(definition.constructor, identifier);\n registeredTypes[identifier] = definition;\n }\n\n if (definition.encode) { (encode as any)[identifier] = definition.encode; }\n if (definition.decode) { (decode as any)[identifier] = definition.decode; }\n}\n\nexport function getIdentifier(klass: any): string {\n return identifiers.get(klass);\n}\n\nexport function getType(identifier: string): TypeDefinition {\n return registeredTypes[identifier];\n}\n\nexport function defineCustomTypes<T extends {[key: string]: TypeDefinition}>(types: T) {\n for (const identifier in types) {\n registerType(identifier, types[identifier]);\n }\n\n return (t: keyof T) => type(t as DefinitionType);\n}","import { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport { $viewFieldIndexes } from \"./symbols\";\n\nexport class TypeContext {\n types: { [id: number]: typeof Schema; } = {};\n schemas = new Map<typeof Schema, number>();\n\n hasFilters: boolean = false;\n parentFiltered: {[typeIdAndParentIndex: string]: boolean} = {};\n\n /**\n * For inheritance support\n * Keeps track of which classes extends which. (parent -> children)\n */\n static inheritedTypes = new Map<typeof Schema, Set<typeof Schema>>();\n static cachedContexts = new Map<typeof Schema, TypeContext>();\n\n static register(target: typeof Schema) {\n const parent = Object.getPrototypeOf(target);\n if (parent !== Schema) {\n let inherits = TypeContext.inheritedTypes.get(parent);\n if (!inherits) {\n inherits = new Set<typeof Schema>();\n TypeContext.inheritedTypes.set(parent, inherits);\n }\n inherits.add(target);\n }\n }\n\n static cache (rootClass: typeof Schema) {\n let context = TypeContext.cachedContexts.get(rootClass);\n if (!context) {\n context = new TypeContext(rootClass);\n TypeContext.cachedContexts.set(rootClass, context);\n }\n return context;\n }\n\n constructor(rootClass?: typeof Schema) {\n if (rootClass) {\n this.discoverTypes(rootClass);\n }\n }\n\n has(schema: typeof Schema) {\n return this.schemas.has(schema);\n }\n\n get(typeid: number) {\n return this.types[typeid];\n }\n\n add(schema: typeof Schema, typeid = this.schemas.size) {\n // skip if already registered\n if (this.schemas.has(schema)) {\n return false;\n }\n\n this.types[typeid] = schema;\n\n //\n // Workaround to allow using an empty Schema (with no `@type()` fields)\n //\n if (schema[Symbol.metadata] === undefined) {\n Metadata.initialize(schema);\n }\n\n this.schemas.set(schema, typeid);\n return true;\n }\n\n getTypeId(klass: typeof Schema) {\n return this.schemas.get(klass);\n }\n\n private discoverTypes(klass: typeof Schema, parentType?: typeof Schema, parentIndex?: number, parentHasViewTag?: boolean) {\n if (parentHasViewTag) {\n this.registerFilteredByParent(klass, parentType, parentIndex);\n }\n\n // skip if already registered\n if (!this.add(klass)) { return; }\n\n // add classes inherited from this base class\n TypeContext.inheritedTypes.get(klass)?.forEach((child) => {\n this.discoverTypes(child, parentType, parentIndex, parentHasViewTag);\n });\n\n // add parent classes\n let parent: any = klass;\n while (\n (parent = Object.getPrototypeOf(parent)) &&\n parent !== Schema && // stop at root (Schema)\n parent !== Function.prototype // stop at root (non-Schema)\n ) {\n this.discoverTypes(parent);\n }\n\n const metadata: Metadata = (klass[Symbol.metadata] ??= {} as Metadata);\n\n // if any schema/field has filters, mark \"context\" as having filters.\n if (metadata[$viewFieldIndexes]) {\n this.hasFilters = true;\n }\n\n for (const fieldIndex in metadata) {\n const index = fieldIndex as any as number;\n\n const fieldType = metadata[index].type;\n const fieldHasViewTag = (metadata[index].tag !== undefined);\n\n if (typeof (fieldType) === \"string\") {\n continue;\n }\n\n if (typeof (fieldType) === \"function\") {\n this.discoverTypes(fieldType as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n\n } else {\n const type = Object.values(fieldType)[0];\n\n // skip primitive types\n if (typeof (type) === \"string\") {\n continue;\n }\n\n this.discoverTypes(type as typeof Schema, klass, index, parentHasViewTag || fieldHasViewTag);\n }\n }\n }\n\n /**\n * Keep track of which classes have filters applied.\n * Format: `${typeid}-${parentTypeid}-${parentIndex}`\n */\n private registerFilteredByParent(schema: typeof Schema, parentType?: typeof Schema, parentIndex?: number) {\n const typeid = this.schemas.get(schema) ?? this.schemas.size;\n\n let key = `${typeid}`;\n if (parentType) { key += `-${this.schemas.get(parentType)}`; }\n\n key += `-${parentIndex}`;\n this.parentFiltered[key] = true;\n }\n\n debug() {\n let parentFiltered = \"\";\n\n for (const key in this.parentFiltered) {\n const keys: number[] = key.split(\"-\").map(Number);\n const fieldIndex = keys.pop();\n\n parentFiltered += `\\n\\t\\t`;\n parentFiltered += `${key}: ${keys.reverse().map((id, i) => {\n const klass = this.types[id];\n const metadata: Metadata = klass[Symbol.metadata];\n let txt = klass.name;\n if (i === 0) { txt += `[${metadata[fieldIndex].name}]`; }\n return `${txt}`;\n }).join(\" -> \")}`;\n }\n\n return `TypeContext ->\\n` +\n `\\tSchema types: ${this.schemas.size}\\n` +\n `\\thasFilters: ${this.hasFilters}\\n` +\n `\\tparentFiltered:${parentFiltered}`;\n }\n\n}\n","import { DefinitionType, getPropertyDescriptor } from \"./annotations\";\nimport { Schema } from \"./Schema\";\nimport { getType, registeredTypes } from \"./types/registry\";\nimport { $decoder, $descriptors, $encoder, $fieldIndexesByViewTag, $numFields, $refTypeFieldIndexes, $track, $viewFieldIndexes } from \"./types/symbols\";\nimport { TypeContext } from \"./types/TypeContext\";\n\nexport type MetadataField = {\n type: DefinitionType,\n name: string,\n index: number,\n tag?: number,\n unreliable?: boolean,\n deprecated?: boolean,\n};\n\nexport type Metadata =\n { [$numFields]: number; } & // number of fields\n { [$viewFieldIndexes]: number[]; } & // all field indexes with \"view\" tag\n { [$fieldIndexesByViewTag]: {[tag: number]: number[]}; } & // field indexes by \"view\" tag\n { [$refTypeFieldIndexes]: number[]; } & // all field indexes containing Ref types (Schema, ArraySchema, MapSchema, etc)\n { [field: number]: MetadataField; } & // index => field name\n { [field: string]: number; } & // field name => field metadata\n { [$descriptors]: { [field: string]: PropertyDescriptor } } // property descriptors\n\nexport function getNormalizedType(type: any): DefinitionType {\n if (Array.isArray(type)) {\n return { array: getNormalizedType(type[0]) };\n\n } else if (typeof (type['type']) !== \"undefined\") {\n return type['type'];\n\n } else if (isTSEnum(type)) {\n // Detect TS Enum type (either string or number)\n return Object.keys(type).every(key => typeof type[key] === \"string\")\n ? \"string\"\n : \"number\";\n\n } else if (typeof type === \"object\" && type !== null) {\n // Handle collection types\n const collectionType = Object.keys(type).find(k => registeredTypes[k] !== undefined);\n if (collectionType) {\n type[collectionType] = getNormalizedType(type[collectionType]);\n return type;\n }\n }\n return type;\n}\n\nfunction isTSEnum(_enum: any) {\n if (typeof _enum === 'function' && _enum[Symbol.metadata]) {\n return false;\n }\n\n const keys = Object.keys(_enum);\n const numericFields = keys.filter(k => /\\d+/.test(k));\n\n // Check for number enum (has numeric keys and reverse mapping)\n if (numericFields.length > 0 && numericFields.length === (keys.length / 2) && _enum[_enum[numericFields[0]]] == numericFields[0]) {\n return true;\n }\n\n // Check for string enum (all values are strings and keys match values)\n if (keys.length > 0 && keys.every(key => typeof _enum[key] === 'string' && _enum[key] === key)) {\n return true;\n }\n\n return false;\n}\n\nexport const Metadata = {\n\n addField(metadata: any, index: number, name: string, type: DefinitionType, descriptor?: PropertyDescriptor) {\n if (index > 64) {\n throw new Error(`Can't define field '${name}'.\\nSchema instances may only have up to 64 fields.`);\n }\n\n metadata[index] = Object.assign(\n metadata[index] || {}, // avoid overwriting previous field metadata (@owned / @deprecated)\n {\n type: getNormalizedType(type),\n index,\n name,\n }\n );\n\n // create \"descriptors\" map\n Object.defineProperty(metadata, $descriptors, {\n value: metadata[$descriptors] || {},\n enumerable: false,\n configurable: true,\n });\n\n if (descriptor) {\n // for encoder\n metadata[$descriptors][name] = descriptor;\n metadata[$descriptors][`_${name}`] = {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: true,\n };\n } else {\n // for decoder\n metadata[$descriptors][name] = {\n value: undefined,\n writable: true,\n enumerable: true,\n configurable: true,\n };\n }\n\n // map -1 as last field index\n Object.defineProperty(metadata, $numFields, {\n value: index,\n enumerable: false,\n configurable: true\n });\n\n // map field name => index (non enumerable)\n Object.defineProperty(metadata, name, {\n value: index,\n enumerable: false,\n configurable: true,\n });\n\n // if child Ref/complex type, add to -4\n if (typeof (metadata[index].type) !== \"string\") {\n if (metadata[$refTypeFieldIndexes] === undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true,\n });\n }\n metadata[$refTypeFieldIndexes].push(index);\n }\n },\n\n setTag(metadata: Metadata, fieldName: string, tag: number) {\n const index = metadata[fieldName];\n const field = metadata[index];\n\n // add 'tag' to the field\n field.tag = tag;\n\n if (!metadata[$viewFieldIndexes]) {\n // -2: all field indexes with \"view\" tag\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [],\n enumerable: false,\n configurable: true\n });\n\n // -3: field indexes by \"view\" tag\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: {},\n enumerable: false,\n configurable: true\n });\n }\n\n metadata[$viewFieldIndexes].push(index);\n\n if (!metadata[$fieldIndexesByViewTag][tag]) {\n metadata[$fieldIndexesByViewTag][tag] = [];\n }\n\n metadata[$fieldIndexesByViewTag][tag].push(index);\n },\n\n setFields<T extends { new (...args: any[]): InstanceType<T> } = any>(target: T, fields: { [field in keyof InstanceType<T>]?: DefinitionType }) {\n // for inheritance support\n const constructor = target.prototype.constructor;\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass && parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n // Use Schema's methods if not defined in the class\n if (!constructor[$track]) { constructor[$track] = Schema[$track]; }\n if (!constructor[$encoder]) { constructor[$encoder] = Schema[$encoder]; }\n if (!constructor[$decoder]) { constructor[$decoder] = Schema[$decoder]; }\n if (!constructor.prototype.toJSON) { constructor.prototype.toJSON = Schema.prototype.toJSON; }\n\n //\n // detect index for this field, considering inheritance\n //\n let fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n\n fieldIndex++;\n\n for (const field in fields) {\n const type = getNormalizedType(fields[field]);\n\n // FIXME: this code is duplicated from @type() annotation\n const complexTypeKlass = typeof(Object.keys(type)[0]) === \"string\" && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n\n fieldIndex++;\n }\n\n return target;\n },\n\n isDeprecated(metadata: any, field: string) {\n return metadata[field].deprecated === true;\n },\n\n init(klass: any) {\n //\n // Used only to initialize an empty Schema (Encoder#constructor)\n // TODO: remove/refactor this...\n //\n const metadata = {};\n klass[Symbol.metadata] = metadata;\n Object.defineProperty(metadata, $numFields, {\n value: 0,\n enumerable: false,\n configurable: true,\n });\n },\n\n initialize(constructor: any) {\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata: Metadata = parentClass[Symbol.metadata];\n\n let metadata: Metadata = constructor[Symbol.metadata] ?? Object.create(null);\n\n // make sure inherited classes have their own metadata object.\n if (parentClass !== Schema && metadata === parentMetadata) {\n metadata = Object.create(null);\n\n if (parentMetadata) {\n //\n // assign parent metadata to current\n //\n Object.setPrototypeOf(metadata, parentMetadata);\n\n // $numFields\n Object.defineProperty(metadata, $numFields, {\n value: parentMetadata[$numFields],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n\n // $viewFieldIndexes / $fieldIndexesByViewTag\n if (parentMetadata[$viewFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $viewFieldIndexes, {\n value: [...parentMetadata[$viewFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n Object.defineProperty(metadata, $fieldIndexesByViewTag, {\n value: { ...parentMetadata[$fieldIndexesByViewTag] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $refTypeFieldIndexes\n if (parentMetadata[$refTypeFieldIndexes] !== undefined) {\n Object.defineProperty(metadata, $refTypeFieldIndexes, {\n value: [...parentMetadata[$refTypeFieldIndexes]],\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n\n // $descriptors\n Object.defineProperty(metadata, $descriptors, {\n value: { ...parentMetadata[$descriptors] },\n enumerable: false,\n configurable: true,\n writable: true,\n });\n }\n }\n\n constructor[Symbol.metadata] = metadata;\n\n return metadata;\n },\n\n isValidInstance(klass: any) {\n return (\n klass.constructor[Symbol.metadata] &&\n Object.prototype.hasOwnProperty.call(klass.constructor[Symbol.metadata], $numFields) as boolean\n );\n },\n\n getFields(klass: any) {\n const metadata: Metadata = klass[Symbol.metadata];\n const fields: any = {};\n for (let i = 0; i <= metadata[$numFields]; i++) {\n fields[metadata[i].name] = metadata[i].type;\n }\n return fields;\n },\n\n hasViewTagAtIndex(metadata: Metadata, index: number) {\n return metadata?.[$viewFieldIndexes]?.includes(index);\n }\n}","import { OPERATION } from \"../encoding/spec\";\nimport { Schema } from \"../Schema\";\nimport { $changes, $childType, $decoder, $onEncodeEnd, $encoder, $getByIndex, $refId, $refTypeFieldIndexes, $viewFieldIndexes, type $deleteByIndex } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\nimport type { SetSchema } from \"../types/custom/SetSchema\";\n\nimport { Root } from \"./Root\";\nimport { Metadata } from \"../Metadata\";\nimport type { EncodeOperation } from \"./EncodeOperation\";\nimport type { DecodeOperation } from \"../decoder/DecodeOperation\";\n\ndeclare global {\n interface Object {\n // FIXME: not a good practice to extend globals here\n [$changes]?: ChangeTree;\n // [$refId]?: number;\n [$encoder]?: EncodeOperation,\n [$decoder]?: DecodeOperation,\n }\n}\n\nexport interface IRef {\n [$changes]?: ChangeTree;\n [$refId]?: number;\n [$getByIndex]?: (index: number, isEncodeAll?: boolean) => any;\n [$deleteByIndex]?: (index: number) => void;\n}\n\nexport type Ref = Schema | ArraySchema | MapSchema | CollectionSchema | SetSchema;\n\nexport type ChangeSetName = \"changes\"\n | \"allChanges\"\n | \"filteredChanges\"\n | \"allFilteredChanges\";\n\nexport interface IndexedOperations {\n [index: number]: OPERATION;\n}\n\n// Linked list node for change trees\nexport interface ChangeTreeNode {\n changeTree: ChangeTree;\n next?: ChangeTreeNode;\n prev?: ChangeTreeNode;\n position: number; // Cached position in the linked list for O(1) lookup\n}\n\n// Linked list for change trees\nexport interface ChangeTreeList {\n next?: ChangeTreeNode;\n tail?: ChangeTreeNode;\n}\n\nexport interface ChangeSet {\n // field index -> operation index\n indexes: { [index: number]: number };\n operations: number[];\n queueRootNode?: ChangeTreeNode; // direct reference to ChangeTreeNode in the linked list\n}\n\nfunction createChangeSet(queueRootNode?: ChangeTreeNode): ChangeSet {\n return { indexes: {}, operations: [], queueRootNode };\n}\n\n// Linked list helper functions\nexport function createChangeTreeList(): ChangeTreeList {\n return { next: undefined, tail: undefined };\n}\n\nexport function setOperationAtIndex(changeSet: ChangeSet, index: number) {\n const operationsIndex = changeSet.indexes[index];\n if (operationsIndex === undefined) {\n changeSet.indexes[index] = changeSet.operations.push(index) - 1;\n } else {\n changeSet.operations[operationsIndex] = index;\n }\n}\n\nexport function deleteOperationAtIndex(changeSet: ChangeSet, index: number | string) {\n let operationsIndex = changeSet.indexes[index as any as number];\n if (operationsIndex === undefined) {\n //\n // if index is not found, we need to find the last operation\n // FIXME: this is not very efficient\n //\n // > See \"should allow consecutive splices (same place)\" tests\n //\n operationsIndex = Object.values(changeSet.indexes).at(-1);\n index = Object.entries(changeSet.indexes).find(([_, value]) => value === operationsIndex)?.[0];\n }\n changeSet.operations[operationsIndex] = undefined;\n delete changeSet.indexes[index as any as number];\n}\n\nexport function debugChangeSet(label: string, changeSet: ChangeSet) {\n let indexes: string[] = [];\n let operations: string[] = [];\n\n for (const index in changeSet.indexes) {\n indexes.push(`\\t${index} => [${changeSet.indexes[index]}]`);\n }\n\n for (let i = 0; i < changeSet.operations.length; i++) {\n const index = changeSet.operations[i];\n if (index !== undefined) {\n operations.push(`\\t[${i}] => ${index}`);\n }\n }\n\n console.log(`${label} =>\\nindexes (${Object.keys(changeSet.indexes).length}) {`);\n console.log(indexes.join(\"\\n\"), \"\\n}\");\n console.log(`operations (${changeSet.operations.filter(op => op !== undefined).length}) {`);\n console.log(operations.join(\"\\n\"), \"\\n}\");\n}\n\nexport interface ParentChain {\n ref: Ref;\n index: number;\n next?: ParentChain;\n}\n\nexport class ChangeTree<T extends Ref = any> {\n ref: T;\n metadata: Metadata;\n\n root?: Root;\n parentChain?: ParentChain; // Linked list for tracking parents\n\n /**\n * Whether this structure is parent of a filtered structure.\n */\n isFiltered: boolean = false;\n isVisibilitySharedWithParent?: boolean; // See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'\n\n indexedOperations: IndexedOperations = {};\n\n //\n // TODO:\n // try storing the index + operation per item.\n // example: 1024 & 1025 => ADD, 1026 => DELETE\n //\n // => https://chatgpt.com/share/67107d0c-bc20-8004-8583-83b17dd7c196\n //\n changes: ChangeSet = { indexes: {}, operations: [] };\n allChanges: ChangeSet = { indexes: {}, operations: [] };\n filteredChanges: ChangeSet;\n allFilteredChanges: ChangeSet;\n\n indexes: { [index: string]: any }; // TODO: remove this, only used by MapSchema/SetSchema/CollectionSchema (`encodeKeyValueOperation`)\n\n /**\n * Is this a new instance? Used on ArraySchema to determine OPERATION.MOVE_AND_ADD operation.\n */\n isNew = true;\n\n constructor(ref: T) {\n this.ref = ref;\n this.metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // Does this structure have \"filters\" declared?\n //\n if (this.metadata?.[$viewFieldIndexes]) {\n this.allFilteredChanges = { indexes: {}, operations: [] };\n this.filteredChanges = { indexes: {}, operations: [] };\n }\n }\n\n setRoot(root: Root) {\n this.root = root;\n\n const isNewChangeTree = this.root.add(this);\n\n this.checkIsFiltered(this.parent, this.parentIndex, isNewChangeTree);\n\n // Recursively set root on child structures\n if (isNewChangeTree) {\n this.forEachChild((child, _) => {\n if (child.root !== root) {\n child.setRoot(root);\n } else {\n root.add(child); // increment refCount\n }\n });\n }\n }\n\n setParent(\n parent: Ref,\n root?: Root,\n parentIndex?: number,\n ) {\n this.addParent(parent, parentIndex);\n\n // avoid setting parents with empty `root`\n if (!root) { return; }\n\n const isNewChangeTree = root.add(this);\n\n // skip if parent is already set\n if (root !== this.root) {\n this.root = root;\n this.checkIsFiltered(parent, parentIndex, isNewChangeTree);\n }\n\n // assign same parent on child structures\n if (isNewChangeTree) {\n //\n // assign same parent on child structures\n //\n this.forEachChild((child, index) => {\n if (child.root === root) {\n //\n // re-assigning a child of the same root, move it next to parent\n // so encoding order is preserved\n //\n root.add(child);\n root.moveNextToParent(child);\n return;\n }\n child.setParent(this.ref, root, index);\n });\n }\n }\n\n forEachChild(callback: (change: ChangeTree, at: any) => void) {\n //\n // assign same parent on child structures\n //\n if ((this.ref as any)[$childType]) {\n if (typeof ((this.ref as any)[$childType]) !== \"string\") {\n // MapSchema / ArraySchema, etc.\n for (const [key, value] of (this.ref as MapSchema).entries()) {\n if (!value) { continue; } // sparse arrays can have undefined values\n callback(value[$changes], this.indexes?.[key] ?? key);\n };\n }\n\n } else {\n for (const index of this.metadata?.[$refTypeFieldIndexes] ?? []) {\n const field = this.metadata[index as any as number];\n const value = this.ref[field.name as keyof Ref];\n if (!value) { continue; }\n callback(value[$changes], index);\n }\n }\n }\n\n operation(op: OPERATION) {\n // operations without index use negative values to represent them\n // this is checked during .encode() time.\n if (this.filteredChanges !== undefined) {\n this.filteredChanges.operations.push(-op);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n this.changes.operations.push(-op);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n change(index: number, operation: OPERATION = OPERATION.ADD) {\n const isFiltered = this.isFiltered || (this.metadata?.[index]?.tag !== undefined);\n const changeSet = (isFiltered)\n ? this.filteredChanges\n : this.changes;\n\n const previousOperation = this.indexedOperations[index];\n if (!previousOperation || previousOperation === OPERATION.DELETE) {\n const op = (!previousOperation)\n ? operation\n : (previousOperation === OPERATION.DELETE)\n ? OPERATION.DELETE_AND_ADD\n : operation\n //\n // TODO: are DELETE operations being encoded as ADD here ??\n //\n this.indexedOperations[index] = op;\n }\n\n setOperationAtIndex(changeSet, index);\n\n if (isFiltered) {\n setOperationAtIndex(this.allFilteredChanges, index);\n\n if (this.root) {\n this.root.enqueueChangeTree(this, 'filteredChanges');\n this.root.enqueueChangeTree(this, 'allFilteredChanges');\n }\n\n } else {\n setOperationAtIndex(this.allChanges, index);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n shiftChangeIndexes(shiftIndex: number) {\n //\n // Used only during:\n //\n // - ArraySchema#unshift()\n //\n const changeSet = (this.isFiltered)\n ? this.filteredChanges\n : this.changes;\n\n const newIndexedOperations: any = {};\n const newIndexes: { [index: number]: number } = {};\n for (const index in this.indexedOperations) {\n newIndexedOperations[Number(index) + shiftIndex] = this.indexedOperations[index];\n newIndexes[Number(index) + shiftIndex] = changeSet.indexes[index];\n }\n this.indexedOperations = newIndexedOperations;\n changeSet.indexes = newIndexes;\n\n changeSet.operations = changeSet.operations.map((index) => index + shiftIndex);\n }\n\n shiftAllChangeIndexes(shiftIndex: number, startIndex: number = 0) {\n //\n // Used only during:\n //\n // - ArraySchema#splice()\n //\n if (this.filteredChanges !== undefined) {\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allFilteredChanges);\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allChanges);\n\n } else {\n this._shiftAllChangeIndexes(shiftIndex, startIndex, this.allChanges);\n }\n }\n\n private _shiftAllChangeIndexes(shiftIndex: number, startIndex: number = 0, changeSet: ChangeSet) {\n const newIndexes: { [index: number]: number } = {};\n let newKey = 0;\n for (const key in changeSet.indexes) {\n newIndexes[newKey++] = changeSet.indexes[key];\n }\n changeSet.indexes = newIndexes;\n\n for (let i = 0; i < changeSet.operations.length; i++) {\n const index = changeSet.operations[i];\n if (index > startIndex) {\n changeSet.operations[i] = index + shiftIndex;\n }\n }\n }\n\n indexedOperation(index: number, operation: OPERATION, allChangesIndex: number = index) {\n this.indexedOperations[index] = operation;\n\n if (this.filteredChanges !== undefined) {\n setOperationAtIndex(this.allFilteredChanges, allChangesIndex);\n setOperationAtIndex(this.filteredChanges, index);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n setOperationAtIndex(this.allChanges, allChangesIndex);\n setOperationAtIndex(this.changes, index);\n this.root?.enqueueChangeTree(this, 'changes');\n }\n }\n\n getType(index?: number) {\n return (\n //\n // Get the child type from parent structure.\n // - [\"string\"] => \"string\"\n // - { map: \"string\" } => \"string\"\n // - { set: \"string\" } => \"string\"\n //\n (this.ref as any)[$childType] || // ArraySchema | MapSchema | SetSchema | CollectionSchema\n this.metadata[index].type // Schema\n );\n }\n\n getChange(index: number) {\n return this.indexedOperations[index];\n }\n\n //\n // used during `.encode()`\n //\n getValue(index: number, isEncodeAll: boolean = false) {\n //\n // `isEncodeAll` param is only used by ArraySchema\n //\n return (this.ref as any)[$getByIndex](index, isEncodeAll);\n }\n\n delete(index: number, operation?: OPERATION, allChangesIndex = index) {\n if (index === undefined) {\n try {\n throw new Error(`@colyseus/schema ${this.ref.constructor.name}: trying to delete non-existing index '${index}'`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n const changeSet = (this.filteredChanges !== undefined)\n ? this.filteredChanges\n : this.changes;\n\n this.indexedOperations[index] = operation ?? OPERATION.DELETE;\n setOperationAtIndex(changeSet, index);\n deleteOperationAtIndex(this.allChanges, allChangesIndex);\n\n const previousValue = this.getValue(index);\n\n // remove `root` reference\n if (previousValue && previousValue[$changes]) {\n //\n // FIXME: this.root is \"undefined\"\n //\n // This method is being called at decoding time when a DELETE operation is found.\n //\n // - This is due to using the concrete Schema class at decoding time.\n // - \"Reflected\" structures do not have this problem.\n //\n // (The property descriptors should NOT be used at decoding time. only at encoding time.)\n //\n this.root?.remove(previousValue[$changes]);\n }\n\n //\n // FIXME: this is looking a ugly and repeated\n //\n if (this.filteredChanges !== undefined) {\n deleteOperationAtIndex(this.allFilteredChanges, allChangesIndex);\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n } else {\n this.root?.enqueueChangeTree(this, 'changes');\n }\n\n return previousValue;\n }\n\n endEncode(changeSetName: ChangeSetName) {\n this.indexedOperations = {};\n\n // clear changeset\n this[changeSetName] = createChangeSet();\n\n // ArraySchema and MapSchema have a custom \"encode end\" method\n (this.ref as any)[$onEncodeEnd]?.();\n\n // Not a new instance anymore\n this.isNew = false;\n }\n\n discard(discardAll: boolean = false) {\n //\n // > MapSchema:\n // Remove cached key to ensure ADD operations is unsed instead of\n // REPLACE in case same key is used on next patches.\n //\n (this.ref as any)[$onEncodeEnd]?.();\n\n this.indexedOperations = {};\n this.changes = createChangeSet(this.changes.queueRootNode);\n\n if (this.filteredChanges !== undefined) {\n this.filteredChanges = createChangeSet(this.filteredChanges.queueRootNode);\n }\n\n if (discardAll) {\n // preserve queueRootNode references\n this.allChanges = createChangeSet(this.allChanges.queueRootNode);\n\n if (this.allFilteredChanges !== undefined) {\n this.allFilteredChanges = createChangeSet(this.allFilteredChanges.queueRootNode);\n }\n }\n }\n\n /**\n * Recursively discard all changes from this, and child structures.\n * (Used in tests only)\n */\n discardAll() {\n const keys = Object.keys(this.indexedOperations);\n for (let i = 0, len = keys.length; i < len; i++) {\n const value = this.getValue(Number(keys[i]));\n\n if (value && value[$changes]) {\n value[$changes].discardAll();\n }\n }\n\n this.discard();\n }\n\n get changed() {\n return (Object.entries(this.indexedOperations).length > 0);\n }\n\n protected checkIsFiltered(parent: Ref, parentIndex: number, isNewChangeTree: boolean) {\n if (this.root.types.hasFilters) {\n //\n // At Schema initialization, the \"root\" structure might not be available\n // yet, as it only does once the \"Encoder\" has been set up.\n //\n // So the \"parent\" may be already set without a \"root\".\n //\n this._checkFilteredByParent(parent, parentIndex);\n\n if (this.filteredChanges !== undefined) {\n this.root?.enqueueChangeTree(this, 'filteredChanges');\n\n if (isNewChangeTree) {\n this.root?.enqueueChangeTree(this, 'allFilteredChanges');\n }\n }\n }\n\n if (!this.isFiltered) {\n this.root?.enqueueChangeTree(this, 'changes');\n\n if (isNewChangeTree) {\n this.root?.enqueueChangeTree(this, 'allChanges');\n }\n }\n }\n\n protected _checkFilteredByParent(parent: Ref, parentIndex: number) {\n // skip if parent is not set\n if (!parent) { return; }\n\n //\n // ArraySchema | MapSchema - get the child type\n // (if refType is typeof string, the parentFiltered[key] below will always be invalid)\n //\n const refType = Metadata.isValidInstance(this.ref)\n ? this.ref.constructor\n : (this.ref as any)[$childType];\n\n let parentChangeTree: ChangeTree;\n\n let parentIsCollection = !Metadata.isValidInstance(parent);\n if (parentIsCollection) {\n parentChangeTree = parent[$changes];\n parent = parentChangeTree.parent;\n parentIndex = parentChangeTree.parentIndex;\n\n } else {\n parentChangeTree = parent[$changes]\n }\n\n const parentConstructor = parent.constructor as typeof Schema;\n\n let key = `${this.root.types.getTypeId(refType as typeof Schema)}`;\n if (parentConstructor) {\n key += `-${this.root.types.schemas.get(parentConstructor)}`;\n }\n key += `-${parentIndex}`;\n\n const fieldHasViewTag = Metadata.hasViewTagAtIndex(parentConstructor?.[Symbol.metadata], parentIndex);\n\n this.isFiltered = parent[$changes].isFiltered // in case parent is already filtered\n || this.root.types.parentFiltered[key]\n || fieldHasViewTag;\n\n //\n // \"isFiltered\" may not be imedialely available during `change()` due to the instance not being attached to the root yet.\n // when it's available, we need to enqueue the \"changes\" changeset into the \"filteredChanges\" changeset.\n //\n if (this.isFiltered) {\n\n this.isVisibilitySharedWithParent = (\n parentChangeTree.isFiltered &&\n typeof (refType) !== \"string\" &&\n !fieldHasViewTag &&\n parentIsCollection\n );\n\n if (!this.filteredChanges) {\n this.filteredChanges = createChangeSet();\n this.allFilteredChanges = createChangeSet();\n }\n\n if (this.changes.operations.length > 0) {\n this.changes.operations.forEach((index) =>\n setOperationAtIndex(this.filteredChanges, index));\n\n this.allChanges.operations.forEach((index) =>\n setOperationAtIndex(this.allFilteredChanges, index));\n\n this.changes = createChangeSet();\n this.allChanges = createChangeSet();\n }\n }\n }\n\n /**\n * Get the immediate parent\n */\n get parent(): Ref | undefined {\n return this.parentChain?.ref;\n }\n\n /**\n * Get the immediate parent index\n */\n get parentIndex(): number | undefined {\n return this.parentChain?.index;\n }\n\n /**\n * Add a parent to the chain\n */\n addParent(parent: Ref, index: number) {\n // Check if this parent already exists in the chain\n if (this.hasParent((p, _) => p[$changes] === parent[$changes])) {\n // if (this.hasParent((p, i) => p[$changes] === parent[$changes] && i === index)) {\n this.parentChain.index = index;\n return;\n }\n\n this.parentChain = {\n ref: parent,\n index,\n next: this.parentChain\n };\n }\n\n /**\n * Remove a parent from the chain\n * @param parent - The parent to remove\n * @returns true if parent was removed\n */\n removeParent(parent: Ref = this.parent): boolean {\n let current = this.parentChain;\n let previous = null;\n while (current) {\n //\n // FIXME: it is required to check against `$changes` here because\n // ArraySchema is instance of Proxy\n //\n if (current.ref[$changes] === parent[$changes]) {\n if (previous) {\n previous.next = current.next;\n } else {\n this.parentChain = current.next;\n }\n return true;\n }\n previous = current;\n current = current.next;\n }\n return this.parentChain === undefined;\n }\n\n /**\n * Find a specific parent in the chain\n */\n findParent(predicate: (parent: Ref, index: number) => boolean): ParentChain | undefined {\n let current = this.parentChain;\n while (current) {\n if (predicate(current.ref, current.index)) {\n return current;\n }\n current = current.next;\n }\n return undefined;\n }\n\n /**\n * Check if this ChangeTree has a specific parent\n */\n hasParent(predicate: (parent: Ref, index: number) => boolean): boolean {\n return this.findParent(predicate) !== undefined;\n }\n\n /**\n * Get all parents as an array (for debugging/testing)\n */\n getAllParents(): Array<{ ref: Ref, index: number }> {\n const parents: Array<{ ref: Ref, index: number }> = [];\n let current = this.parentChain;\n while (current) {\n parents.push({ ref: current.ref, index: current.index });\n current = current.next;\n }\n return parents;\n }\n\n}\n","import { OPERATION } from \"../encoding/spec\";\nimport { $changes, $childType, $getByIndex, $refId } from \"../types/symbols\";\n\nimport { encode } from \"../encoding/encode\";\n\nimport type { ChangeTree, Ref } from \"./ChangeTree\";\nimport type { Encoder } from \"./Encoder\";\nimport type { Schema } from \"../Schema\";\n\nimport type { Iterator } from \"../encoding/decode\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { Metadata } from \"../Metadata\";\n\nexport type EncodeOperation<T extends Ref = any> = (\n encoder: Encoder,\n bytes: Uint8Array,\n changeTree: ChangeTree<T>,\n index: number,\n operation: OPERATION,\n it: Iterator,\n isEncodeAll: boolean,\n hasView: boolean,\n metadata?: Metadata,\n) => void;\n\nexport function encodeValue(\n encoder: Encoder,\n bytes: Uint8Array,\n type: any,\n value: any,\n operation: OPERATION,\n it: Iterator,\n) {\n if (typeof (type) === \"string\") {\n (encode as any)[type]?.(bytes, value, it);\n\n } else if (type[Symbol.metadata] !== undefined) {\n //\n // Encode refId for this instance.\n // The actual instance is going to be encoded on next `changeTree` iteration.\n //\n encode.number(bytes, value[$refId], it);\n\n // Try to encode inherited TYPE_ID if it's an ADD operation.\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n encoder.tryEncodeTypeId(bytes, type as typeof Schema, value.constructor as typeof Schema, it);\n }\n\n } else {\n //\n // Encode refId for this instance.\n // The actual instance is going to be encoded on next `changeTree` iteration.\n //\n encode.number(bytes, value[$refId], it);\n }\n}\n\n/**\n * Used for Schema instances.\n * @private\n */\nexport const encodeSchemaOperation: EncodeOperation = function <T extends Schema> (\n encoder: Encoder,\n bytes: Uint8Array,\n changeTree: ChangeTree<T>,\n index: number,\n operation: OPERATION,\n it: Iterator,\n _: any,\n __: any,\n metadata: Metadata,\n) {\n // \"compress\" field index + operation\n bytes[it.offset++] = (index | operation) & 255;\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE) {\n return;\n }\n\n const ref = changeTree.ref;\n const field = metadata[index];\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n metadata[index].type,\n ref[field.name as keyof T],\n operation,\n it\n );\n}\n\n/**\n * Used for collections (MapSchema, CollectionSchema, SetSchema)\n * @private\n */\nexport const encodeKeyValueOperation: EncodeOperation = function (\n encoder: Encoder,\n bytes: Uint8Array,\n changeTree: ChangeTree,\n index: number,\n operation: OPERATION,\n it: Iterator,\n) {\n // encode operation\n bytes[it.offset++] = operation & 255;\n\n // encode index\n encode.number(bytes, index, it);\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE) {\n return;\n }\n\n const ref = changeTree.ref;\n\n //\n // encode \"alias\" for dynamic fields (maps)\n //\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof(ref['set']) === \"function\") {\n //\n // MapSchema dynamic key\n //\n const dynamicIndex = changeTree.ref['$indexes'].get(index);\n encode.string(bytes, dynamicIndex, it);\n }\n }\n\n const type = ref[$childType];\n const value = ref[$getByIndex](index);\n\n // try { throw new Error(); } catch (e) {\n // // only print if not coming from Reflection.ts\n // if (!e.stack.includes(\"src/Reflection.ts\")) {\n // console.log(\"encodeKeyValueOperation -> \", {\n // ref: changeTree.ref.constructor.name,\n // field,\n // operation: OPERATION[operation],\n // value: value?.toJSON(),\n // items: ref.toJSON(),\n // });\n // }\n // }\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n type,\n value,\n operation,\n it\n );\n}\n\n/**\n * Used for collections (MapSchema, ArraySchema, etc.)\n * @private\n */\nexport const encodeArray: EncodeOperation = function (\n encoder: Encoder,\n bytes: Uint8Array,\n changeTree: ChangeTree<ArraySchema>,\n field: number,\n operation: OPERATION,\n it: Iterator,\n isEncodeAll: boolean,\n hasView: boolean,\n) {\n const ref = changeTree.ref;\n const useOperationByRefId = hasView && changeTree.isFiltered && (typeof (changeTree.getType(field)) !== \"string\");\n\n let refOrIndex: number;\n\n if (useOperationByRefId) {\n const item = ref['tmpItems'][field];\n\n // Skip encoding if item is undefined (e.g. when clear() is called)\n if (!item) { return; }\n\n refOrIndex = item[$refId];\n\n if (operation === OPERATION.DELETE) {\n operation = OPERATION.DELETE_BY_REFID;\n\n } else if (operation === OPERATION.ADD) {\n operation = OPERATION.ADD_BY_REFID;\n }\n\n } else {\n refOrIndex = field;\n }\n\n // encode operation\n bytes[it.offset++] = operation & 255;\n\n // encode index\n encode.number(bytes, refOrIndex, it);\n\n // Do not encode value for DELETE operations\n if (operation === OPERATION.DELETE || operation === OPERATION.DELETE_BY_REFID) {\n return;\n }\n\n const type = changeTree.getType(field);\n const value = changeTree.getValue(field, isEncodeAll);\n\n // console.log({ type, field, value });\n\n // console.log(\"encodeArray -> \", {\n // ref: changeTree.ref.constructor.name,\n // field,\n // operation: OPERATION[operation],\n // value: value?.toJSON(),\n // items: ref.toJSON(),\n // });\n\n // TODO: inline this function call small performance gain\n encodeValue(\n encoder,\n bytes,\n type,\n value,\n operation,\n it\n );\n}","import { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { Schema } from \"../Schema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Decoder } from \"./Decoder\";\nimport { Iterator, decode } from \"../encoding/decode\";\nimport { $childType, $deleteByIndex, $getByIndex, $refId } from \"../types/symbols\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\n\nimport { getType } from \"../types/registry\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport interface DataChange<T = any, F = string> {\n ref: Ref,\n refId: number,\n op: OPERATION,\n field: F;\n dynamicIndex?: number | string;\n value: T;\n previousValue: T;\n}\n\nexport const DEFINITION_MISMATCH = -1;\n\nexport type DecodeOperation<T extends Schema = any> = (\n decoder: Decoder<T>,\n bytes: Uint8Array,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[],\n) => number | void;\n\nexport function decodeValue<T extends Ref>(\n decoder: Decoder,\n operation: OPERATION,\n ref: T,\n index: number,\n type: any,\n bytes: Uint8Array,\n it: Iterator,\n allChanges: DataChange[],\n) {\n const $root = decoder.root;\n const previousValue = (ref as any)[$getByIndex](index) as T;\n\n let value: any;\n\n if ((operation & OPERATION.DELETE) === OPERATION.DELETE)\n {\n // Flag `refId` for garbage collection.\n const previousRefId = previousValue?.[$refId];\n if (previousRefId !== undefined) { $root.removeRef(previousRefId); }\n\n //\n // Delete operations\n //\n if (operation !== OPERATION.DELETE_AND_ADD) {\n (ref as any)[$deleteByIndex](index);\n }\n\n value = undefined;\n }\n\n if (operation === OPERATION.DELETE) {\n //\n // Don't do anything\n //\n\n } else if (Schema.is(type)) {\n const refId = decode.number(bytes, it);\n value = $root.refs.get(refId);\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) {\n const childType = decoder.getInstanceType(bytes, it, type);\n if (!value) {\n value = decoder.createInstanceOfType(childType);\n }\n\n $root.addRef(\n refId,\n value,\n (\n value !== previousValue || // increment ref count if value has changed\n (operation === OPERATION.DELETE_AND_ADD && value === previousValue) // increment ref count if the same instance is being added again\n )\n );\n }\n\n } else if (typeof(type) === \"string\") {\n //\n // primitive value (number, string, boolean, etc)\n //\n value = (decode as any)[type](bytes, it);\n\n } else {\n const typeDef = getType(Object.keys(type)[0]);\n const refId = decode.number(bytes, it);\n\n const valueRef: Ref = ($root.refs.has(refId))\n ? previousValue || $root.refs.get(refId)\n : new typeDef.constructor();\n\n value = valueRef.clone(true);\n value[$childType] = Object.values(type)[0]; // cache childType for ArraySchema and MapSchema\n\n if (previousValue) {\n let previousRefId = previousValue[$refId];\n\n if (previousRefId !== undefined && refId !== previousRefId) {\n //\n // enqueue onRemove if structure has been replaced.\n //\n const entries: IterableIterator<[any, any]> = (previousValue as any).entries();\n let iter: IteratorResult<[any, any]>;\n while ((iter = entries.next()) && !iter.done) {\n const [key, value] = iter.value;\n\n // if value is a schema, remove its reference\n if (typeof(value) === \"object\") {\n previousRefId = value[$refId];\n $root.removeRef(previousRefId);\n }\n\n allChanges.push({\n ref: previousValue,\n refId: previousRefId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value,\n });\n }\n\n }\n }\n\n $root.addRef(refId, value, (\n valueRef !== previousValue ||\n (operation === OPERATION.DELETE_AND_ADD && valueRef === previousValue)\n ));\n }\n\n return { value, previousValue };\n}\n\nexport const decodeSchemaOperation: DecodeOperation = function <T extends Schema>(\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: T,\n allChanges: DataChange[],\n) {\n const first_byte = bytes[it.offset++];\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n\n // \"compressed\" index + operation\n const operation = (first_byte >> 6) << 6\n const index = first_byte % (operation || 255);\n\n // skip early if field is not defined\n const field = metadata[index];\n if (field === undefined) {\n console.warn(\"@colyseus/schema: field not defined at\", { index, ref: ref.constructor.name, metadata });\n return DEFINITION_MISMATCH;\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n field.type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n ref[field.name as keyof T] = value;\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: field.name,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeKeyValueOperation: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: Ref,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n const operation = bytes[it.offset++];\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n\n (ref as any).clear();\n return;\n }\n\n const index = decode.number(bytes, it);\n const type = (ref as any)[$childType];\n\n let dynamicIndex: number | string;\n\n if ((operation & OPERATION.ADD) === OPERATION.ADD) { // ADD or DELETE_AND_ADD\n if (typeof((ref as any)['set']) === \"function\") {\n dynamicIndex = decode.string(bytes, it); // MapSchema\n (ref as any)['setIndex'](index, dynamicIndex);\n } else {\n dynamicIndex = index; // ArraySchema\n }\n } else {\n // get dynamic index from \"ref\"\n dynamicIndex = (ref as any)['getIndex'](index);\n }\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (value !== null && value !== undefined) {\n if (typeof((ref as any)['set']) === \"function\") {\n // MapSchema\n (ref as any)['$items'].set(dynamicIndex as string, value);\n\n } else if (typeof((ref as any)['$setAt']) === \"function\") {\n // ArraySchema\n (ref as any)['$setAt'](index, value, operation);\n\n } else if (typeof((ref as any)['add']) === \"function\") {\n // CollectionSchema && SetSchema\n const index = (ref as any).add(value);\n\n if (typeof(index) === \"number\") {\n (ref as any)['setIndex'](index, index);\n }\n }\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}\n\nexport const decodeArray: DecodeOperation = function (\n decoder: Decoder<any>,\n bytes: Uint8Array,\n it: Iterator,\n ref: ArraySchema,\n allChanges: DataChange[]\n) {\n // \"uncompressed\" index + operation (array/map items)\n let operation = bytes[it.offset++];\n let index: number;\n\n if (operation === OPERATION.CLEAR) {\n //\n // When decoding:\n // - enqueue items for DELETE callback.\n // - flag child items for garbage collection.\n //\n decoder.removeChildRefs(ref as unknown as Collection, allChanges);\n (ref as ArraySchema).clear();\n return;\n\n } else if (operation === OPERATION.REVERSE) {\n (ref as ArraySchema).reverse();\n return;\n\n } else if (operation === OPERATION.DELETE_BY_REFID) {\n // TODO: refactor here, try to follow same flow as below\n const refId = decode.number(bytes, it);\n const previousValue = decoder.root.refs.get(refId);\n index = ref.findIndex((value) => value === previousValue);\n ref[$deleteByIndex](index);\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: OPERATION.DELETE,\n field: \"\", // FIXME: remove this\n dynamicIndex: index,\n value: undefined,\n previousValue,\n });\n\n return;\n\n } else if (operation === OPERATION.ADD_BY_REFID) {\n const refId = decode.number(bytes, it);\n const itemByRefId = decoder.root.refs.get(refId);\n\n // if item already exists, use existing index\n if (itemByRefId) {\n index = ref.findIndex((value) => value === itemByRefId);\n }\n\n // fallback to use last index\n if (index === -1 || index === undefined) {\n index = ref.length;\n }\n\n } else {\n index = decode.number(bytes, it);\n }\n\n const type = ref[$childType];\n\n let dynamicIndex: number | string = index;\n\n const { value, previousValue } = decodeValue(\n decoder,\n operation,\n ref,\n index,\n type,\n bytes,\n it,\n allChanges,\n );\n\n if (\n value !== null && value !== undefined &&\n value !== previousValue // avoid setting same value twice (if index === 0 it will result in a \"unshift\" for ArraySchema)\n ) {\n // ArraySchema\n (ref as ArraySchema)['$setAt'](index, value, operation);\n }\n\n // add change\n if (previousValue !== value) {\n allChanges.push({\n ref,\n refId: decoder.currentRefId,\n op: operation,\n field: \"\", // FIXME: remove this\n dynamicIndex,\n value,\n previousValue,\n });\n }\n}","import type { Schema } from \"../Schema\";\nimport type { CollectionSchema } from \"../types/custom/CollectionSchema\";\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { SetSchema } from \"../types/custom/SetSchema\";\nimport type { ArraySchema } from \"../types/custom/ArraySchema\";\nimport type { Ref } from \"../encoder/ChangeTree\";\n\nexport class EncodeSchemaError extends Error {}\n\nexport function assertType(value: any, type: string, klass: Schema, field: string | number) {\n let typeofTarget: string;\n let allowNull: boolean = false;\n\n switch (type) {\n case \"number\":\n case \"int8\":\n case \"uint8\":\n case \"int16\":\n case \"uint16\":\n case \"int32\":\n case \"uint32\":\n case \"int64\":\n case \"uint64\":\n case \"float32\":\n case \"float64\":\n typeofTarget = \"number\";\n if (isNaN(value)) {\n console.log(`trying to encode \"NaN\" in ${klass.constructor.name}#${field}`);\n }\n break;\n case \"bigint64\":\n case \"biguint64\":\n typeofTarget = \"bigint\";\n break;\n case \"string\":\n typeofTarget = \"string\";\n allowNull = true;\n break;\n case \"boolean\":\n // boolean is always encoded as true/false based on truthiness\n return;\n default:\n // skip assertion for custom types\n // TODO: allow custom types to define their own assertions\n return;\n }\n\n if (typeof (value) !== typeofTarget && (!allowNull || (allowNull && value !== null))) {\n let foundValue = `'${JSON.stringify(value)}'${(value && value.constructor && ` (${value.constructor.name})`) || ''}`;\n throw new EncodeSchemaError(`a '${typeofTarget}' was expected, but ${foundValue} was provided in ${klass.constructor.name}#${field}`);\n }\n}\n\nexport function assertInstanceType(\n value: Ref,\n type: typeof Schema\n | typeof ArraySchema\n | typeof MapSchema\n | typeof CollectionSchema\n | typeof SetSchema,\n instance: Ref,\n field: string | number,\n) {\n if (!(value instanceof type)) {\n throw new EncodeSchemaError(`a '${type.name}' was expected, but '${value && (value as any).constructor.name}' was provided in ${instance.constructor.name}#${field}`);\n }\n}","import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $onDecodeEnd, $refId } from \"../symbols\";\nimport type { Schema } from \"../../Schema\";\nimport { type IRef, ChangeTree, setOperationAtIndex } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\n\nimport { encodeArray } from \"../../encoder/EncodeOperation\";\nimport { decodeArray } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nconst DEFAULT_SORT = (a: any, b: any) => {\n const A = a.toString();\n const B = b.toString();\n if (A < B) return -1;\n else if (A > B) return 1;\n else return 0\n}\n\nexport class ArraySchema<V = any> implements Array<V>, Collection<number, V>, IRef {\n [n: number]: V;\n [$changes]: ChangeTree;\n [$refId]?: number;\n\n protected [$childType]: string | typeof Schema;\n\n protected items: V[] = [];\n protected tmpItems: V[] = [];\n protected deletedIndexes: {[index: number]: boolean} = {};\n protected isMovingItems = false;\n\n static [$encoder] = encodeArray;\n static [$decoder] = decodeArray;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: ArraySchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible(ref['tmpItems'][index]?.[$changes])\n );\n }\n\n static is(type: any) {\n return (\n // type format: [\"string\"]\n Array.isArray(type) ||\n\n // type format: { array: \"string\" }\n (type['array'] !== undefined)\n );\n }\n\n static from<T>(iterable: Iterable<T> | ArrayLike<T>) {\n return new ArraySchema<T>(...Array.from(iterable));\n }\n\n constructor (...items: V[]) {\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n\n const proxy = new Proxy(this, {\n get: (obj, prop) => {\n if (\n typeof (prop) !== \"symbol\" &&\n // FIXME: d8 accuses this as low performance\n !isNaN(prop as any) // https://stackoverflow.com/a/175787/892698\n ) {\n return this.items[prop as unknown as number];\n\n } else {\n return Reflect.get(obj, prop);\n }\n },\n\n set: (obj, key, setValue) => {\n if (typeof (key) !== \"symbol\" && !isNaN(key as any)) {\n if (setValue === undefined || setValue === null) {\n obj.$deleteAt(key as unknown as number);\n\n } else {\n if (setValue[$changes]) {\n assertInstanceType(setValue, obj[$childType] as typeof Schema, obj, key);\n\n const previousValue = obj.items[key as unknown as number];\n\n if (!obj.isMovingItems) {\n obj.$changeAt(Number(key), setValue);\n\n } else {\n if (previousValue !== undefined) {\n if (setValue[$changes].isNew) {\n obj[$changes].indexedOperation(Number(key), OPERATION.MOVE_AND_ADD);\n\n } else {\n if ((obj[$changes].getChange(Number(key)) & OPERATION.DELETE) === OPERATION.DELETE) {\n obj[$changes].indexedOperation(Number(key), OPERATION.DELETE_AND_MOVE);\n\n } else {\n obj[$changes].indexedOperation(Number(key), OPERATION.MOVE);\n }\n }\n\n } else if (setValue[$changes].isNew) {\n obj[$changes].indexedOperation(Number(key), OPERATION.ADD);\n }\n\n setValue[$changes].setParent(this, obj[$changes].root, key);\n }\n\n if (previousValue !== undefined) {\n // remove root reference from previous value\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n\n } else {\n obj.$changeAt(Number(key), setValue);\n }\n\n obj.items[key as unknown as number] = setValue;\n obj.tmpItems[key as unknown as number] = setValue;\n }\n\n return true;\n } else {\n return Reflect.set(obj, key, setValue);\n }\n },\n\n deleteProperty: (obj, prop) => {\n if (typeof (prop) === \"number\") {\n obj.$deleteAt(prop);\n\n } else {\n delete obj[prop as unknown as number];\n }\n\n return true;\n },\n\n has: (obj, key) => {\n if (typeof (key) !== \"symbol\" && !isNaN(Number(key))) {\n return Reflect.has(this.items, key);\n }\n return Reflect.has(obj, key)\n }\n });\n\n Object.defineProperty(this, $changes, {\n value: new ChangeTree(proxy),\n enumerable: false,\n writable: true,\n });\n\n if (items.length > 0) {\n this.push(...items);\n }\n\n return proxy;\n }\n\n set length (newLength: number) {\n if (newLength === 0) {\n this.clear();\n } else if (newLength < this.items.length) {\n this.splice(newLength, this.length - newLength);\n } else {\n console.warn(\"ArraySchema: can't set .length to a higher value than its length.\");\n }\n }\n\n get length() {\n return this.items.length;\n }\n\n push(...values: V[]) {\n let length = this.tmpItems.length;\n\n const changeTree = this[$changes];\n\n for (let i = 0, l = values.length; i < l; i++, length++) {\n const value = values[i];\n\n if (value === undefined || value === null) {\n // skip null values\n return;\n\n } else if (typeof (value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, i);\n // TODO: move value[$changes]?.setParent() to this block.\n }\n\n changeTree.indexedOperation(length, OPERATION.ADD, this.items.length);\n\n this.items.push(value);\n this.tmpItems.push(value);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n value[$changes]?.setParent(this, changeTree.root, length);\n }\n\n return length;\n }\n\n /**\n * Removes the last element from an array and returns it.\n */\n pop(): V | undefined {\n let index: number = -1;\n\n // find last non-undefined index\n for (let i = this.tmpItems.length - 1; i >= 0; i--) {\n // if (this.tmpItems[i] !== undefined) {\n if (this.deletedIndexes[i] !== true) {\n index = i;\n break;\n }\n }\n\n if (index < 0) {\n return undefined;\n }\n\n this[$changes].delete(index, undefined, this.items.length - 1);\n\n this.deletedIndexes[index] = true;\n\n return this.items.pop();\n }\n\n at(index: number) {\n // Allow negative indexing from the end\n if (index < 0) index += this.length;\n return this.items[index];\n }\n\n // encoding only\n protected $changeAt(index: number, value: V) {\n if (value === undefined || value === null) {\n console.error(\"ArraySchema items cannot be null nor undefined; Use `deleteAt(index)` instead.\");\n return;\n }\n\n // skip if the value is the same as cached.\n if (this.items[index] === value) {\n return;\n }\n\n const operation = (this.items[index] !== undefined)\n ? typeof(value) === \"object\"\n ? OPERATION.DELETE_AND_ADD // schema child\n : OPERATION.REPLACE // primitive\n : OPERATION.ADD;\n\n const changeTree = this[$changes];\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n value[$changes]?.setParent(this, changeTree.root, index);\n }\n\n // encoding only\n protected $deleteAt(index: number, operation?: OPERATION) {\n this[$changes].delete(index, operation);\n }\n\n // decoding only\n protected $setAt(index: number, value: V, operation: OPERATION) {\n if (\n index === 0 &&\n operation === OPERATION.ADD &&\n this.items[index] !== undefined\n ) {\n // handle decoding unshift\n this.items.unshift(value);\n\n } else if (operation === OPERATION.DELETE_AND_MOVE) {\n this.items.splice(index, 1);\n this.items[index] = value;\n\n } else {\n this.items[index] = value;\n }\n }\n\n clear() {\n // skip if already clear\n if (this.items.length === 0) {\n return;\n }\n\n // discard previous operations.\n const changeTree = this[$changes];\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n changeTree.discard(true);\n changeTree.operation(OPERATION.CLEAR);\n\n this.items.length = 0;\n this.tmpItems.length = 0;\n }\n\n /**\n * Combines two or more arrays.\n * @param items Additional items to add to the end of array1.\n */\n // @ts-ignore\n concat(...items: (V | ConcatArray<V>)[]): ArraySchema<V> {\n return new ArraySchema(...this.items.concat(...items));\n }\n\n /**\n * Adds all the elements of an array separated by the specified separator string.\n * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n */\n join(separator?: string): string {\n return this.items.join(separator);\n }\n\n /**\n * Reverses the elements in an Array.\n */\n // @ts-ignore\n reverse(): ArraySchema<V> {\n this[$changes].operation(OPERATION.REVERSE);\n this.items.reverse();\n this.tmpItems.reverse();\n return this;\n }\n\n /**\n * Removes the first element from an array and returns it.\n */\n shift(): V | undefined {\n if (this.items.length === 0) { return undefined; }\n\n const changeTree = this[$changes];\n\n const index = this.tmpItems.findIndex(item => item === this.items[0]);\n const allChangesIndex = this.items.findIndex(item => item === this.items[0]);\n\n changeTree.delete(index, OPERATION.DELETE, allChangesIndex);\n changeTree.shiftAllChangeIndexes(-1, allChangesIndex);\n\n this.deletedIndexes[index] = true;\n\n return this.items.shift();\n }\n\n /**\n * Returns a section of an array.\n * @param start The beginning of the specified portion of the array.\n * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n */\n slice(start?: number, end?: number): V[] {\n const sliced = new ArraySchema<V>();\n sliced.push(...this.items.slice(start, end));\n return sliced as unknown as V[];\n }\n\n /**\n * Sorts an array.\n * @param compareFn Function used to determine the order of the elements. It is expected to return\n * a negative value if first argument is less than second argument, zero if they're equal and a positive\n * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.\n * ```ts\n * [11,2,22,1].sort((a, b) => a - b)\n * ```\n */\n sort(compareFn: (a: V, b: V) => number = DEFAULT_SORT): this {\n this.isMovingItems = true;\n\n const changeTree = this[$changes];\n const sortedItems = this.items.sort(compareFn);\n\n // wouldn't OPERATION.MOVE make more sense here?\n sortedItems.forEach((_, i) => changeTree.change(i, OPERATION.REPLACE));\n\n this.tmpItems.sort(compareFn);\n\n this.isMovingItems = false;\n return this;\n }\n\n /**\n * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @param insertItems Elements to insert into the array in place of the deleted elements.\n */\n splice(\n start: number,\n deleteCount?: number,\n ...insertItems: V[]\n ): V[] {\n const changeTree = this[$changes];\n\n const itemsLength = this.items.length;\n const tmpItemsLength = this.tmpItems.length;\n const insertCount = insertItems.length;\n\n // build up-to-date list of indexes, excluding removed values.\n const indexes: number[] = [];\n for (let i = 0; i < tmpItemsLength; i++) {\n if (this.deletedIndexes[i] !== true) {\n indexes.push(i);\n }\n }\n\n if (itemsLength > start) {\n // if deleteCount is not provided, delete all items from start to end\n if (deleteCount === undefined) {\n deleteCount = itemsLength - start;\n }\n\n //\n // delete operations at correct index\n //\n for (let i = start; i < start + deleteCount; i++) {\n const index = indexes[i];\n changeTree.delete(index, OPERATION.DELETE);\n this.deletedIndexes[index] = true;\n }\n\n } else {\n // not enough items to delete\n deleteCount = 0;\n }\n\n // insert operations\n if (insertCount > 0) {\n if (insertCount > deleteCount) {\n console.error(\"Inserting more elements than deleting during ArraySchema#splice()\");\n throw new Error(\"ArraySchema#splice(): insertCount must be equal or lower than deleteCount.\");\n }\n\n for (let i = 0; i < insertCount; i++) {\n const addIndex = (indexes[start] ?? itemsLength) + i;\n\n changeTree.indexedOperation(\n addIndex,\n (this.deletedIndexes[addIndex])\n ? OPERATION.DELETE_AND_ADD\n : OPERATION.ADD\n );\n\n // set value's parent/root\n insertItems[i][$changes]?.setParent(this, changeTree.root, addIndex);\n }\n }\n\n //\n // delete exceeding indexes from \"allChanges\"\n // (prevent .encodeAll() from encoding non-existing items)\n //\n if (deleteCount > insertCount) {\n changeTree.shiftAllChangeIndexes(-(deleteCount - insertCount), indexes[start + insertCount]);\n // debugChangeSet(\"AFTER SHIFT indexes\", changeTree.allChanges);\n }\n\n //\n // FIXME: this code block is duplicated on ChangeTree\n //\n if (changeTree.filteredChanges !== undefined) {\n changeTree.root?.enqueueChangeTree(changeTree, 'filteredChanges');\n\n } else {\n changeTree.root?.enqueueChangeTree(changeTree, 'changes');\n }\n\n return this.items.splice(start, deleteCount, ...insertItems);\n }\n\n /**\n * Inserts new elements at the start of an array.\n * @param items Elements to insert at the start of the Array.\n */\n unshift(...items: V[]): number {\n const changeTree = this[$changes];\n\n // shift indexes\n changeTree.shiftChangeIndexes(items.length);\n\n // new index\n if (changeTree.isFiltered) {\n setOperationAtIndex(changeTree.filteredChanges, this.items.length);\n // changeTree.filteredChanges[this.items.length] = OPERATION.ADD;\n } else {\n setOperationAtIndex(changeTree.allChanges, this.items.length);\n // changeTree.allChanges[this.items.length] = OPERATION.ADD;\n }\n\n // FIXME: should we use OPERATION.MOVE here instead?\n items.forEach((_, index) => {\n changeTree.change(index, OPERATION.ADD)\n });\n\n this.tmpItems.unshift(...items);\n\n return this.items.unshift(...items);\n }\n\n /**\n * Returns the index of the first occurrence of a value in an array.\n * @param searchElement The value to locate in the array.\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n */\n indexOf(searchElement: V, fromIndex?: number): number {\n return this.items.indexOf(searchElement, fromIndex);\n }\n\n /**\n * Returns the index of the last occurrence of a specified value in an array.\n * @param searchElement The value to locate in the array.\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n */\n lastIndexOf(searchElement: V, fromIndex: number = this.length - 1): number {\n return this.items.lastIndexOf(searchElement, fromIndex);\n }\n\n /**\n * Determines whether all the members of an array satisfy the specified test.\n * @param callbackfn A function that accepts up to three arguments. The every method calls\n * the callbackfn function for each element in the array until the callbackfn returns a value\n * which is coercible to the Boolean value false, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n * If thisArg is omitted, undefined is used as the this value.\n */\n every<S extends V>(predicate: (value: V, index: number, array: V[]) => value is S, thisArg?: any): this is S[];\n every(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean;\n every(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean {\n return this.items.every(callbackfn, thisArg);\n }\n\n /**\n * Determines whether the specified callback function returns true for any element of an array.\n * @param callbackfn A function that accepts up to three arguments. The some method calls\n * the callbackfn function for each element in the array until the callbackfn returns a value\n * which is coercible to the Boolean value true, or until the end of the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n * If thisArg is omitted, undefined is used as the this value.\n */\n some(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): boolean {\n return this.items.some(callbackfn, thisArg);\n }\n\n /**\n * Performs the specified action for each element in an array.\n * @param callbackfn A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n forEach(callbackfn: (value: V, index: number, array: V[]) => void, thisArg?: any): void {\n return this.items.forEach(callbackfn, thisArg);\n }\n\n /**\n * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n map<U>(callbackfn: (value: V, index: number, array: V[]) => U, thisArg?: any): U[] {\n return this.items.map(callbackfn, thisArg);\n }\n\n /**\n * Returns the elements of an array that meet the condition specified in a callback function.\n * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n */\n filter(callbackfn: (value: V, index: number, array: V[]) => unknown, thisArg?: any): V[]\n filter<S extends V>(callbackfn: (value: V, index: number, array: V[]) => value is S, thisArg?: any): V[] {\n return this.items.filter(callbackfn, thisArg);\n }\n\n /**\n * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n */\n reduce<U=V>(callbackfn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue?: U): U {\n return this.items.reduce(callbackfn, initialValue);\n }\n\n /**\n * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n */\n reduceRight<U=V>(callbackfn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue?: U): U {\n return this.items.reduceRight(callbackfn, initialValue);\n }\n\n /**\n * Returns the value of the first element in the array where predicate is true, and undefined\n * otherwise.\n * @param predicate find calls predicate once for each element of the array, in ascending\n * order, until it finds one where predicate returns true. If such an element is found, find\n * immediately returns that element value. Otherwise, find returns undefined.\n * @param thisArg If provided, it will be used as the this value for each invocation of\n * predicate. If it is not provided, undefined is used instead.\n */\n find(predicate: (value: V, index: number, obj: V[]) => boolean, thisArg?: any): V | undefined {\n return this.items.find(predicate, thisArg);\n }\n\n /**\n * Returns the index of the first element in the array where predicate is true, and -1\n * otherwise.\n * @param predicate find calls predicate once for each element of the array, in ascending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n * @param thisArg If provided, it will be used as the this value for each invocation of\n * predicate. If it is not provided, undefined is used instead.\n */\n findIndex(predicate: (value: V, index: number, obj: V[]) => unknown, thisArg?: any): number {\n return this.items.findIndex(predicate, thisArg);\n }\n\n /**\n * Returns the this object after filling the section identified by start and end with value\n * @param value value to fill array section with\n * @param start index to start filling the array at. If start is negative, it is treated as\n * length+start where length is the length of the array.\n * @param end index to stop filling the array at. If end is negative, it is treated as\n * length+end.\n */\n fill(value: V, start?: number, end?: number): this {\n //\n // TODO\n //\n throw new Error(\"ArraySchema#fill() not implemented\");\n // this.$items.fill(value, start, end);\n\n return this;\n }\n\n /**\n * Returns the this object after copying a section of the array identified by start and end\n * to the same array starting at position target\n * @param target If target is negative, it is treated as length+target where length is the\n * length of the array.\n * @param start If start is negative, it is treated as length+start. If end is negative, it\n * is treated as length+end.\n * @param end If not specified, length of the this object is used as its default value.\n */\n copyWithin(target: number, start: number, end?: number): this {\n //\n // TODO\n //\n throw new Error(\"ArraySchema#copyWithin() not implemented\");\n return this;\n }\n\n /**\n * Returns a string representation of an array.\n */\n toString(): string {\n return this.items.toString();\n }\n\n /**\n * Returns a string representation of an array. The elements are converted to string using their toLocalString methods.\n */\n toLocaleString(): string {\n return this.items.toLocaleString()\n };\n\n /** Iterator */\n [Symbol.iterator](): ArrayIterator<V> {\n return this.items[Symbol.iterator]();\n }\n\n static get [Symbol.species]() {\n return ArraySchema;\n }\n\n // WORKAROUND for compatibility\n // - TypeScript 4 defines @@unscopables as a function\n // - TypeScript 5 defines @@unscopables as an object\n [Symbol.unscopables]: any;\n\n /**\n * Returns an iterable of key, value pairs for every entry in the array\n */\n entries(): ArrayIterator<[number, V]> { return this.items.entries(); }\n\n /**\n * Returns an iterable of keys in the array\n */\n keys(): ArrayIterator<number> { return this.items.keys(); }\n\n /**\n * Returns an iterable of values in the array\n */\n values(): ArrayIterator<V> { return this.items.values(); }\n\n /**\n * Determines whether an array includes a certain element, returning true or false as appropriate.\n * @param searchElement The element to search for.\n * @param fromIndex The position in this array at which to begin searching for searchElement.\n */\n includes(searchElement: V, fromIndex?: number): boolean {\n return this.items.includes(searchElement, fromIndex);\n }\n\n //\n // ES2022\n //\n\n /**\n * Calls a defined callback function on each element of an array. Then, flattens the result into\n * a new array.\n * This is identical to a map followed by flat with depth 1.\n *\n * @param callback A function that accepts up to three arguments. The flatMap method calls the\n * callback function one time for each element in the array.\n * @param thisArg An object to which the this keyword can refer in the callback function. If\n * thisArg is omitted, undefined is used as the this value.\n */\n // @ts-ignore\n flatMap<U, This = undefined>(callback: (this: This, value: V, index: number, array: V[]) => U | ReadonlyArray<U>, thisArg?: This): U[] {\n // @ts-ignore\n throw new Error(\"ArraySchema#flatMap() is not supported.\");\n }\n\n /**\n * Returns a new array with all sub-array elements concatenated into it recursively up to the\n * specified depth.\n *\n * @param depth The maximum recursion depth\n */\n // @ts-ignore\n flat<A, D extends number = 1>(this: A, depth?: D): any {\n throw new Error(\"ArraySchema#flat() is not supported.\");\n }\n\n findLast() {\n // @ts-ignore\n return this.items.findLast.apply(this.items, arguments);\n }\n\n findLastIndex(...args: any[]) {\n // @ts-ignore\n return this.items.findLastIndex.apply(this.items, arguments);\n }\n\n //\n // ES2023\n //\n with(index: number, value: V): ArraySchema<V> {\n const copy = this.items.slice();\n // Allow negative indexing from the end\n if (index < 0) index += this.length;\n copy[index] = value;\n return new ArraySchema(...copy);\n }\n toReversed(): V[] {\n return this.items.slice().reverse();\n }\n toSorted(compareFn?: (a: V, b: V) => number): V[] {\n return this.items.slice().sort(compareFn);\n }\n toSpliced(start: number, deleteCount: number, ...items: V[]): V[];\n toSpliced(start: number, deleteCount?: number): V[];\n // @ts-ignore\n toSpliced(start: unknown, deleteCount?: unknown, ...items?: unknown[]): V[] {\n // @ts-ignore\n return this.items.toSpliced.apply(copy, arguments);\n }\n\n shuffle() {\n return this.move((_) => {\n let currentIndex = this.items.length;\n while (currentIndex != 0) {\n let randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [this[currentIndex], this[randomIndex]] = [this[randomIndex], this[currentIndex]];\n }\n });\n }\n\n /**\n * Allows to move items around in the array.\n *\n * Example:\n * state.cards.move((cards) => {\n * [cards[4], cards[3]] = [cards[3], cards[4]];\n * [cards[3], cards[2]] = [cards[2], cards[3]];\n * [cards[2], cards[0]] = [cards[0], cards[2]];\n * [cards[1], cards[1]] = [cards[1], cards[1]];\n * [cards[0], cards[0]] = [cards[0], cards[0]];\n * })\n *\n * @param cb\n * @returns\n */\n move(cb: (arr: this) => void) {\n this.isMovingItems = true;\n cb(this);\n this.isMovingItems = false;\n return this;\n }\n\n [$getByIndex](index: number, isEncodeAll: boolean = false): any {\n //\n // TODO: avoid unecessary `this.tmpItems` check during decoding.\n //\n // ENCODING uses `this.tmpItems` (or `this.items` if `isEncodeAll` is true)\n // DECODING uses `this.items`\n //\n\n return (isEncodeAll)\n ? this.items[index]\n : this.deletedIndexes[index]\n ? this.items[index]\n : this.tmpItems[index] || this.items[index];\n }\n\n [$deleteByIndex](index: number): void {\n this.items[index] = undefined;\n this.tmpItems[index] = undefined; // TODO: do not try to get \"tmpItems\" at decoding time.\n }\n\n protected [$onEncodeEnd]() {\n this.tmpItems = this.items.slice();\n this.deletedIndexes = {};\n }\n\n protected [$onDecodeEnd]() {\n this.items = this.items.filter((item) => item !== undefined);\n this.tmpItems = this.items.slice(); // TODO: do no use \"tmpItems\" at decoding time.\n }\n\n toArray() {\n return this.items.slice(0);\n }\n\n toJSON() {\n return this.toArray().map((value: any) => {\n return (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): ArraySchema<V> {\n let cloned: ArraySchema;\n\n if (isDecoding) {\n cloned = new ArraySchema();\n cloned.push(...this.items);\n\n } else {\n cloned = new ArraySchema(...this.map(item => (\n (item[$changes])\n ? (item as any as Schema).clone()\n : item\n )));\n }\n\n return cloned;\n };\n\n}\n\nregisterType(\"array\", { constructor: ArraySchema });\n","import { $changes, $childType, $decoder, $deleteByIndex, $onEncodeEnd, $encoder, $filter, $getByIndex, $numFields, $refId } from \"../symbols\";\nimport { ChangeTree, IRef } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\nimport { assertInstanceType } from \"../../encoding/assert\";\n\nexport class MapSchema<V=any, K extends string = string> implements Map<K, V>, Collection<K, V, [K, V]>, IRef {\n [$changes]: ChangeTree;\n [$refId]?: number;\n\n protected childType: new () => V;\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<K, V> = new Map<K, V>();\n protected $indexes: Map<number, K> = new Map<number, K>();\n protected deletedItems: { [index: string]: V } = {};\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: MapSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['map'] !== undefined;\n }\n\n constructor (initialValues?: Map<K, V> | Record<K, V>) {\n const changeTree = new ChangeTree(this);\n changeTree.indexes = {};\n\n Object.defineProperty(this, $changes, {\n value: changeTree,\n enumerable: false,\n writable: true,\n });\n\n if (initialValues) {\n if (\n initialValues instanceof Map ||\n initialValues instanceof MapSchema\n ) {\n initialValues.forEach((v, k) => this.set(k, v));\n\n } else {\n for (const k in initialValues) {\n this.set(k, initialValues[k]);\n }\n }\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<[K, V]> { return this.$items[Symbol.iterator](); }\n get [Symbol.toStringTag]() { return this.$items[Symbol.toStringTag] }\n\n static get [Symbol.species]() { return MapSchema; }\n\n set(key: K, value: V) {\n if (value === undefined || value === null) {\n throw new Error(`MapSchema#set('${key}', ${value}): trying to set ${value} value on '${key}'.`);\n\n } else if (typeof(value) === \"object\" && this[$childType]) {\n assertInstanceType(value as any, this[$childType] as typeof Schema, this, key);\n }\n\n // Force \"key\" as string\n // See: https://github.com/colyseus/colyseus/issues/561#issuecomment-1646733468\n key = key.toString() as K;\n\n const changeTree = this[$changes];\n const isRef = (value[$changes]) !== undefined;\n\n let index: number;\n let operation: OPERATION;\n\n // IS REPLACE?\n if (typeof(changeTree.indexes[key]) !== \"undefined\") {\n index = changeTree.indexes[key];\n operation = OPERATION.REPLACE;\n\n const previousValue = this.$items.get(key);\n if (previousValue === value) {\n // if value is the same, avoid re-encoding it.\n return;\n\n } else if (isRef) {\n // if is schema, force ADD operation if value differ from previous one.\n operation = OPERATION.DELETE_AND_ADD;\n\n // remove reference from previous value\n if (previousValue !== undefined) {\n previousValue[$changes].root?.remove(previousValue[$changes]);\n }\n }\n\n if (this.deletedItems[index]) {\n delete this.deletedItems[index];\n }\n\n } else {\n index = changeTree.indexes[$numFields] ?? 0;\n operation = OPERATION.ADD;\n\n this.$indexes.set(index, key);\n changeTree.indexes[key] = index;\n changeTree.indexes[$numFields] = index + 1;\n }\n\n this.$items.set(key, value);\n\n changeTree.change(index, operation);\n\n //\n // set value's parent after the value is set\n // (to avoid encoding \"refId\" operations before parent's \"ADD\" operation)\n //\n if (isRef) {\n value[$changes].setParent(this, changeTree.root, index);\n }\n\n return this;\n }\n\n get(key: K): V | undefined {\n return this.$items.get(key);\n }\n\n delete(key: K) {\n if (!this.$items.has(key)) {\n return false;\n }\n\n const index = this[$changes].indexes[key];\n\n this.deletedItems[index] = this[$changes].delete(index);\n\n return this.$items.delete(key);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (key: K) {\n return this.$items.has(key);\n }\n\n forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void) {\n this.$items.forEach(callbackfn);\n }\n\n entries () {\n return this.$items.entries();\n }\n\n keys () {\n return this.$items.keys();\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n protected setIndex(index: number, key: K) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): V | undefined {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n const changeTree = this[$changes];\n\n // - cleanup changeTree.indexes\n // - cleanup $indexes\n for (const indexStr in this.deletedItems) {\n const index = parseInt(indexStr);\n const key = this.$indexes.get(index);\n // TODO: refactor this.\n // it shouldn't be necessary to keep track of indexes both on changeTree and on $indexes\n delete changeTree.indexes[key];\n this.$indexes.delete(index);\n }\n\n this.deletedItems = {};\n }\n\n toJSON() {\n const map: any = {};\n\n this.forEach((value: any, key) => {\n map[key] = (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value;\n });\n\n return map;\n }\n\n //\n // Decoding utilities\n //\n // @ts-ignore\n clone(isDecoding?: boolean): MapSchema<V> {\n let cloned: MapSchema<V>;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new MapSchema(), this);\n\n } else {\n // server-side\n cloned = new MapSchema();\n\n this.forEach((value: any, key) => {\n if (value[$changes]) {\n cloned.set(key, value['clone']());\n } else {\n cloned.set(key, value);\n }\n })\n\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"map\", { constructor: MapSchema });\n","import { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd, $refId } from \"../symbols\";\nimport { ChangeTree, type IRef } from \"../../encoder/ChangeTree\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { Collection } from \"../HelperTypes\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\n\ntype K = number; // TODO: allow to specify K generic on MapSchema.\n\nexport class CollectionSchema<V=any> implements Collection<K, V>, IRef {\n [$changes]: ChangeTree;\n [$refId]?: number;\n\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: CollectionSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.isChangeTreeVisible((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['collection'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // set \"index\" for reference.\n const index = this.$refId++;\n\n const isRef = (value[$changes]) !== undefined;\n if (isRef) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index);\n\n return index;\n }\n\n at(index: number): V | undefined {\n const key = Array.from(this.$items.keys())[index];\n return this.$items.get(key);\n }\n\n entries() {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: K;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // remove children references\n changeTree.forEachChild((childChangeTree, _) => {\n changeTree.root?.remove(childChangeTree);\n });\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (value: V): boolean {\n return Array.from(this.$items.values()).some((v) => v === value);\n }\n\n forEach(callbackfn: (value: V, key: K, collection: CollectionSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): any {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value: any, key: K) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): CollectionSchema<V> {\n let cloned: CollectionSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new CollectionSchema(), this);\n\n } else {\n // server-side\n cloned = new CollectionSchema();\n this.forEach((value: any) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"collection\", { constructor: CollectionSchema, });\n","import { OPERATION } from \"../../encoding/spec\";\nimport { registerType } from \"../registry\";\nimport { $changes, $childType, $decoder, $deleteByIndex, $encoder, $filter, $getByIndex, $onEncodeEnd, $refId } from \"../symbols\";\nimport { Collection } from \"../HelperTypes\";\nimport { ChangeTree, type IRef } from \"../../encoder/ChangeTree\";\nimport { encodeKeyValueOperation } from \"../../encoder/EncodeOperation\";\nimport { decodeKeyValueOperation } from \"../../decoder/DecodeOperation\";\nimport type { StateView } from \"../../encoder/StateView\";\nimport type { Schema } from \"../../Schema\";\n\nexport class SetSchema<V=any> implements Collection<number, V>, IRef {\n [$changes]: ChangeTree;\n [$refId]?: number;\n\n protected [$childType]: string | typeof Schema;\n\n protected $items: Map<number, V> = new Map<number, V>();\n protected $indexes: Map<number, number> = new Map<number, number>();\n protected deletedItems: { [field: string]: V } = {};\n\n protected $refId: number = 0;\n\n static [$encoder] = encodeKeyValueOperation;\n static [$decoder] = decodeKeyValueOperation;\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: SetSchema, index: number, view: StateView) {\n return (\n !view ||\n typeof (ref[$childType]) === \"string\" ||\n view.visible.has((ref[$getByIndex](index) ?? ref.deletedItems[index])[$changes])\n );\n }\n\n static is(type: any) {\n return type['set'] !== undefined;\n }\n\n constructor (initialValues?: Array<V>) {\n this[$changes] = new ChangeTree(this);\n this[$changes].indexes = {};\n\n if (initialValues) {\n initialValues.forEach((v) => this.add(v));\n }\n\n Object.defineProperty(this, $childType, {\n value: undefined,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n\n add(value: V) {\n // immediatelly return false if value already added.\n if (this.has(value)) { return false; }\n\n // set \"index\" for reference.\n const index = this.$refId++;\n\n if ((value[$changes]) !== undefined) {\n value[$changes].setParent(this, this[$changes].root, index);\n }\n\n const operation = this[$changes].indexes[index]?.op ?? OPERATION.ADD;\n\n this[$changes].indexes[index] = index;\n\n this.$indexes.set(index, index);\n this.$items.set(index, value);\n\n this[$changes].change(index, operation);\n return index;\n }\n\n entries () {\n return this.$items.entries();\n }\n\n delete(item: V) {\n const entries = this.$items.entries();\n\n let index: number;\n let entry: IteratorResult<[number, V]>;\n while (entry = entries.next()) {\n if (entry.done) { break; }\n\n if (item === entry.value[1]) {\n index = entry.value[0];\n break;\n }\n }\n\n if (index === undefined) {\n return false;\n }\n\n this.deletedItems[index] = this[$changes].delete(index);\n this.$indexes.delete(index);\n\n return this.$items.delete(index);\n }\n\n clear() {\n const changeTree = this[$changes];\n\n // discard previous operations.\n changeTree.discard(true);\n changeTree.indexes = {};\n\n // clear previous indexes\n this.$indexes.clear();\n\n // clear items\n this.$items.clear();\n\n changeTree.operation(OPERATION.CLEAR);\n }\n\n has (value: V): boolean {\n const values = this.$items.values();\n\n let has = false;\n let entry: IteratorResult<V>;\n\n while (entry = values.next()) {\n if (entry.done) { break; }\n if (value === entry.value) {\n has = true;\n break;\n }\n }\n\n return has;\n }\n\n forEach(callbackfn: (value: V, key: number, collection: SetSchema<V>) => void) {\n this.$items.forEach((value, key, _) => callbackfn(value, key, this));\n }\n\n values() {\n return this.$items.values();\n }\n\n get size () {\n return this.$items.size;\n }\n\n /** Iterator */\n [Symbol.iterator](): IterableIterator<V> {\n return this.$items.values();\n }\n\n protected setIndex(index: number, key: number) {\n this.$indexes.set(index, key);\n }\n\n protected getIndex(index: number) {\n return this.$indexes.get(index);\n }\n\n [$getByIndex](index: number): any {\n return this.$items.get(this.$indexes.get(index));\n }\n\n [$deleteByIndex](index: number): void {\n const key = this.$indexes.get(index);\n this.$items.delete(key);\n this.$indexes.delete(index);\n }\n\n protected [$onEncodeEnd]() {\n this.deletedItems = {};\n }\n\n toArray() {\n return Array.from(this.$items.values());\n }\n\n toJSON() {\n const values: V[] = [];\n\n this.forEach((value: any, key: number) => {\n values.push(\n (typeof (value['toJSON']) === \"function\")\n ? value['toJSON']()\n : value\n );\n });\n\n return values;\n }\n\n //\n // Decoding utilities\n //\n clone(isDecoding?: boolean): SetSchema<V> {\n let cloned: SetSchema;\n\n if (isDecoding) {\n // client-side\n cloned = Object.assign(new SetSchema(), this);\n\n } else {\n // server-side\n cloned = new SetSchema();\n this.forEach((value: any) => {\n if (value[$changes]) {\n cloned.add(value['clone']());\n } else {\n cloned.add(value);\n }\n })\n }\n\n return cloned;\n }\n\n}\n\nregisterType(\"set\", { constructor: SetSchema });","import \"./symbol.shim\";\nimport { Schema } from './Schema';\nimport { ArraySchema } from './types/custom/ArraySchema';\nimport { MapSchema } from './types/custom/MapSchema';\nimport { getNormalizedType, Metadata } from \"./Metadata\";\nimport { $changes, $childType, $descriptors, $numFields, $track } from \"./types/symbols\";\nimport { TypeDefinition, getType } from \"./types/registry\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { assertInstanceType, assertType } from \"./encoding/assert\";\nimport type { InferValueType, InferSchemaInstanceType, AssignableProps, IsNever } from \"./types/HelperTypes\";\nimport { CollectionSchema } from \"./types/custom/CollectionSchema\";\nimport { SetSchema } from \"./types/custom/SetSchema\";\n\nexport type RawPrimitiveType = \"string\" |\n \"number\" |\n \"boolean\" |\n \"int8\" |\n \"uint8\" |\n \"int16\" |\n \"uint16\" |\n \"int32\" |\n \"uint32\" |\n \"int64\" |\n \"uint64\" |\n \"float32\" |\n \"float64\" |\n \"bigint64\" |\n \"biguint64\";\n\nexport type PrimitiveType = RawPrimitiveType | typeof Schema | object;\n\n// TODO: infer \"default\" value type correctly.\nexport type DefinitionType<T extends PrimitiveType = PrimitiveType> = T\n | T[]\n | { type: T, default?: InferValueType<T>, view?: boolean | number, sync?: boolean }\n | { array: T, default?: ArraySchema<InferValueType<T>>, view?: boolean | number, sync?: boolean }\n | { map: T, default?: MapSchema<InferValueType<T>>, view?: boolean | number, sync?: boolean }\n | { collection: T, default?: CollectionSchema<InferValueType<T>>, view?: boolean | number, sync?: boolean }\n | { set: T, default?: SetSchema<InferValueType<T>>, view?: boolean | number, sync?: boolean };\n\nexport type Definition = { [field: string]: DefinitionType };\n\nexport interface TypeOptions {\n manual?: boolean,\n}\n\nexport const DEFAULT_VIEW_TAG = -1;\n\nexport function entity(constructor: any): any {\n TypeContext.register(constructor as typeof Schema);\n return constructor;\n}\n\n/**\n * [See documentation](https://docs.colyseus.io/state/schema/)\n *\n * Annotate a Schema property to be serializeable.\n * \\@type()'d fields are automatically flagged as \"dirty\" for the next patch.\n *\n * @example Standard usage, with automatic change tracking.\n * ```\n * \\@type(\"string\") propertyName: string;\n * ```\n *\n * @example You can provide the \"manual\" option if you'd like to manually control your patches via .setDirty().\n * ```\n * \\@type(\"string\", { manual: true })\n * ```\n */\n// export function type(type: DefinitionType, options?: TypeOptions) {\n// return function ({ get, set }, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<Schema, any> {\n// if (context.kind !== \"accessor\") {\n// throw new Error(\"@type() is only supported for class accessor properties\");\n// }\n\n// const field = context.name.toString();\n\n// //\n// // detect index for this field, considering inheritance\n// //\n// const parent = Object.getPrototypeOf(context.metadata);\n// let fieldIndex: number = context.metadata[$numFields] // current structure already has fields defined\n// ?? (parent && parent[$numFields]) // parent structure has fields defined\n// ?? -1; // no fields defined\n// fieldIndex++;\n\n// if (\n// !parent && // the parent already initializes the `$changes` property\n// !Metadata.hasFields(context.metadata)\n// ) {\n// context.addInitializer(function (this: Ref) {\n// Object.defineProperty(this, $changes, {\n// value: new ChangeTree(this),\n// enumerable: false,\n// writable: true\n// });\n// });\n// }\n\n// Metadata.addField(context.metadata, fieldIndex, field, type);\n\n// const isArray = ArraySchema.is(type);\n// const isMap = !isArray && MapSchema.is(type);\n\n// // if (options && options.manual) {\n// // // do not declare getter/setter descriptor\n// // definition.descriptors[field] = {\n// // enumerable: true,\n// // configurable: true,\n// // writable: true,\n// // };\n// // return;\n// // }\n\n// return {\n// init(value) {\n// // TODO: may need to convert ArraySchema/MapSchema here\n\n// // do not flag change if value is undefined.\n// if (value !== undefined) {\n// this[$changes].change(fieldIndex);\n\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// }\n\n// return value;\n// },\n\n// get() {\n// return get.call(this);\n// },\n\n// set(value: any) {\n// /**\n// * Create Proxy for array or map items\n// */\n\n// // skip if value is the same as cached.\n// if (value === get.call(this)) {\n// return;\n// }\n\n// if (\n// value !== undefined &&\n// value !== null\n// ) {\n// // automaticallty transform Array into ArraySchema\n// if (isArray) {\n// if (!(value instanceof ArraySchema)) {\n// value = new ArraySchema(...value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // automaticallty transform Map into MapSchema\n// if (isMap) {\n// if (!(value instanceof MapSchema)) {\n// value = new MapSchema(value);\n// }\n// value[$childType] = Object.values(type)[0];\n// }\n\n// // try to turn provided structure into a Proxy\n// if (value['$proxy'] === undefined) {\n// if (isMap) {\n// value = getMapProxy(value);\n// }\n// }\n\n// // flag the change for encoding.\n// this[$changes].change(fieldIndex);\n\n// //\n// // call setParent() recursively for this and its child\n// // structures.\n// //\n// if (value[$changes]) {\n// value[$changes].setParent(\n// this,\n// this[$changes].root,\n// Metadata.getIndex(context.metadata, field),\n// );\n// }\n\n// } else if (get.call(this)) {\n// //\n// // Setting a field to `null` or `undefined` will delete it.\n// //\n// this[$changes].delete(field);\n// }\n\n// set.call(this, value);\n// },\n// };\n// }\n// }\n\nexport function view<T> (tag: number = DEFAULT_VIEW_TAG) {\n return function(target: T, fieldName: string) {\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n // const fieldIndex = metadata[fieldName];\n\n // if (!metadata[fieldIndex]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[fieldIndex] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n Metadata.setTag(metadata, fieldName, tag);\n }\n}\n\nexport function unreliable<T> (target: T, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = target.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n\n // TODO: use Metadata.initialize()\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n // add owned flag to the field\n metadata[metadata[field]].unreliable = true;\n}\n\nexport function type (\n type: DefinitionType,\n options?: TypeOptions\n): PropertyDecorator {\n return function (target: typeof Schema, field: string) {\n const constructor = target.constructor as typeof Schema;\n\n if (!type) {\n throw new Error(`${constructor.name}: @type() reference provided for \"${field}\" is undefined. Make sure you don't have any circular dependencies.`);\n }\n\n // Normalize type (enum/collection/etc)\n type = getNormalizedType(type);\n\n // for inheritance support\n TypeContext.register(constructor);\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata = Metadata.initialize(constructor);\n\n let fieldIndex: number = metadata[field];\n\n /**\n * skip if descriptor already exists for this field (`@deprecated()`)\n */\n if (metadata[fieldIndex] !== undefined) {\n if (metadata[fieldIndex].deprecated) {\n // do not create accessors for deprecated properties.\n return;\n\n } else if (metadata[fieldIndex].type !== undefined) {\n // trying to define same property multiple times across inheritance.\n // https://github.com/colyseus/colyseus-unity3d/issues/131#issuecomment-814308572\n try {\n throw new Error(`@colyseus/schema: Duplicate '${field}' definition on '${constructor.name}'.\\nCheck @type() annotation`);\n\n } catch (e) {\n const definitionAtLine = e.stack.split(\"\\n\")[4].trim();\n throw new Error(`${e.message} ${definitionAtLine}`);\n }\n }\n\n } else {\n //\n // detect index for this field, considering inheritance\n //\n fieldIndex = metadata[$numFields] // current structure already has fields defined\n ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n ?? -1; // no fields defined\n fieldIndex++;\n }\n\n if (options && options.manual) {\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n {\n // do not declare getter/setter descriptor\n enumerable: true,\n configurable: true,\n writable: true,\n }\n );\n\n } else {\n const complexTypeKlass = typeof(Object.keys(type)[0]) === \"string\" && getType(Object.keys(type)[0]);\n\n const childType = (complexTypeKlass)\n ? Object.values(type)[0]\n : type;\n\n Metadata.addField(\n metadata,\n fieldIndex,\n field,\n type,\n getPropertyDescriptor(`_${field}`, fieldIndex, childType, complexTypeKlass)\n );\n }\n }\n}\n\nexport function getPropertyDescriptor(\n fieldCached: string,\n fieldIndex: number,\n type: DefinitionType,\n complexTypeKlass: TypeDefinition,\n) {\n return {\n get: function (this: Schema) { return this[fieldCached as keyof Schema]; },\n set: function (this: Schema, value: any) {\n const previousValue = this[fieldCached as keyof Schema] ?? undefined;\n\n // skip if value is the same as cached.\n if (value === previousValue) { return; }\n\n if (\n value !== undefined &&\n value !== null\n ) {\n if (complexTypeKlass) {\n // automaticallty transform Array into ArraySchema\n if (complexTypeKlass.constructor === ArraySchema && !(value instanceof ArraySchema)) {\n value = new ArraySchema(...value);\n }\n\n // automaticallty transform Map into MapSchema\n if (complexTypeKlass.constructor === MapSchema && !(value instanceof MapSchema)) {\n value = new MapSchema(value);\n }\n\n // // automaticallty transform Array into SetSchema\n // if (complexTypeKlass.constructor === SetSchema && !(value instanceof SetSchema)) {\n // value = new SetSchema(value);\n // }\n\n value[$childType] = type;\n\n } else if (typeof (type) !== \"string\") {\n assertInstanceType(value, type as typeof Schema, this, fieldCached.substring(1));\n\n } else {\n assertType(value, type, this, fieldCached.substring(1));\n }\n\n const changeTree = this[$changes];\n\n //\n // Replacing existing \"ref\", remove it from root.\n //\n if (previousValue !== undefined && previousValue[$changes]) {\n changeTree.root?.remove(previousValue[$changes]);\n (this.constructor as typeof Schema)[$track](changeTree, fieldIndex, OPERATION.DELETE_AND_ADD);\n\n } else {\n (this.constructor as typeof Schema)[$track](changeTree, fieldIndex, OPERATION.ADD);\n }\n\n //\n // call setParent() recursively for this and its child\n // structures.\n //\n value[$changes]?.setParent(this, changeTree.root, fieldIndex);\n\n } else if (previousValue !== undefined) {\n //\n // Setting a field to `null` or `undefined` will delete it.\n //\n this[$changes].delete(fieldIndex);\n }\n\n this[fieldCached as keyof Schema] = value;\n },\n\n enumerable: true,\n configurable: true\n };\n}\n\n/**\n * `@deprecated()` flag a field as deprecated.\n * The previous `@type()` annotation should remain along with this one.\n */\n\nexport function deprecated(throws: boolean = true): PropertyDecorator {\n return function (klass: typeof Schema, field: string) {\n //\n // FIXME: the following block of code is repeated across `@type()`, `@deprecated()` and `@unreliable()` decorators.\n //\n const constructor = klass.constructor as typeof Schema;\n\n const parentClass = Object.getPrototypeOf(constructor);\n const parentMetadata = parentClass[Symbol.metadata];\n const metadata: Metadata = (constructor[Symbol.metadata] ??= Object.assign({}, constructor[Symbol.metadata], parentMetadata ?? Object.create(null)));\n const fieldIndex = metadata[field];\n\n // if (!metadata[field]) {\n // //\n // // detect index for this field, considering inheritance\n // //\n // metadata[field] = {\n // type: undefined,\n // index: (metadata[$numFields] // current structure already has fields defined\n // ?? (parentMetadata && parentMetadata[$numFields]) // parent structure has fields defined\n // ?? -1) + 1 // no fields defined\n // }\n // }\n\n metadata[fieldIndex].deprecated = true;\n\n if (throws) {\n metadata[$descriptors] ??= {};\n metadata[$descriptors][field] = {\n get: function () { throw new Error(`${field} is deprecated.`); },\n set: function (this: Schema, value: any) { /* throw new Error(`${field} is deprecated.`); */ },\n enumerable: false,\n configurable: true\n };\n }\n\n // flag metadata[field] as non-enumerable\n Object.defineProperty(metadata, fieldIndex, {\n value: metadata[fieldIndex],\n enumerable: false,\n configurable: true\n });\n }\n}\n\nexport function defineTypes(\n target: typeof Schema,\n fields: Definition,\n options?: TypeOptions\n) {\n for (let field in fields) {\n type(fields[field], options)(target.prototype, field);\n }\n return target;\n}\n\n// Helper type to extract InitProps from initialize method\n// Supports both single object parameter and multiple parameters\n// If no initialize method is specified, use AssignableProps for field initialization\ntype ExtractInitProps<T> = T extends { initialize: (...args: infer P) => void }\n ? P extends readonly []\n ? never\n : P extends readonly [infer First]\n ? First extends object\n ? First\n : P\n : P\n : T extends Definition\n ? AssignableProps<InferSchemaInstanceType<T>>\n : never;\n\n// Helper type to determine if InitProps should be required\ntype IsInitPropsRequired<T> = T extends { initialize: (props: any) => void }\n ? true\n : T extends { initialize: (...args: infer P) => void }\n ? P extends readonly []\n ? false\n : true\n : false;\n\nexport interface SchemaWithExtends<T extends Definition, P extends typeof Schema, > {\n extends: <T2 extends Definition = Definition>(\n fields: T2 & ThisType<InferSchemaInstanceType<T & T2>>,\n name?: string\n ) => SchemaWithExtendsConstructor<T & T2, ExtractInitProps<T2>, P>;\n}\n\n/**\n * Get the type of the schema defined via `schema({...})` method.\n *\n * @example\n * const Entity = schema({\n * x: \"number\",\n * y: \"number\",\n * });\n * type Entity = SchemaType<typeof Entity>;\n */\nexport type SchemaType<T extends {'~type': any}> = T['~type'];\n\nexport interface SchemaWithExtendsConstructor<\n T extends Definition,\n InitProps,\n P extends typeof Schema\n> extends SchemaWithExtends<T, P> {\n '~type': InferSchemaInstanceType<T>;\n new (...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : IsInitPropsRequired<T> extends true ? [InitProps] : [InitProps?]): InferSchemaInstanceType<T> & InstanceType<P>;\n prototype: InferSchemaInstanceType<T> & InstanceType<P> & {\n initialize(...args: [InitProps] extends [never] ? [] : InitProps extends readonly any[] ? InitProps : [InitProps]): void;\n };\n}\n\nexport function schema<\n T extends Record<string, DefinitionType>,\n P extends typeof Schema = typeof Schema\n>(\n fieldsAndMethods: T & ThisType<InferSchemaInstanceType<T>>,\n name?: string,\n inherits: P = Schema as P\n): SchemaWithExtendsConstructor<T, ExtractInitProps<T>, P> {\n const fields: any = {};\n const methods: any = {};\n\n const defaultValues: any = {};\n const viewTagFields: any = {};\n\n for (let fieldName in fieldsAndMethods) {\n const value: any = fieldsAndMethods[fieldName] as DefinitionType;\n if (typeof (value) === \"object\") {\n if (value['view'] !== undefined) {\n viewTagFields[fieldName] = (typeof (value['view']) === \"boolean\")\n ? DEFAULT_VIEW_TAG\n : value['view'];\n }\n\n // allow to define a field as not synced\n if (value['sync'] !== false) {\n fields[fieldName] = getNormalizedType(value);\n }\n\n // If no explicit default provided, handle automatic instantiation for collection types\n if (!Object.prototype.hasOwnProperty.call(value, 'default')) {\n // TODO: remove Array.isArray() check. Use ['array'] !== undefined only.\n if (Array.isArray(value) || value['array'] !== undefined) {\n // Collection: Array → new ArraySchema()\n defaultValues[fieldName] = new ArraySchema();\n\n } else if (value['map'] !== undefined) {\n // Collection: Map → new MapSchema()\n defaultValues[fieldName] = new MapSchema();\n\n } else if (value['collection'] !== undefined) {\n // Collection: Collection → new CollectionSchema()\n defaultValues[fieldName] = new CollectionSchema();\n\n } else if (value['set'] !== undefined) {\n // Collection: Set → new SetSchema()\n defaultValues[fieldName] = new SetSchema();\n\n } else if (value['type'] !== undefined && Schema.is(value['type'])) {\n // Direct Schema type: Type → new Type()\n defaultValues[fieldName] = new value['type']();\n }\n } else {\n defaultValues[fieldName] = value['default'];\n }\n\n\n } else if (typeof (value) === \"function\") {\n if (Schema.is(value)) {\n // Direct Schema type: Type → new Type()\n defaultValues[fieldName] = new value();\n fields[fieldName] = getNormalizedType(value);\n } else {\n methods[fieldName] = value;\n }\n\n } else {\n fields[fieldName] = getNormalizedType(value);\n }\n }\n\n const getDefaultValues = () => {\n const defaults: any = {};\n\n // use current class default values\n for (const fieldName in defaultValues) {\n const defaultValue = defaultValues[fieldName];\n if (defaultValue && typeof defaultValue.clone === 'function') {\n // complex, cloneable values, e.g. Schema, ArraySchema, MapSchema, CollectionSchema, SetSchema\n defaults[fieldName] = defaultValue.clone();\n } else {\n // primitives and non-cloneable values\n defaults[fieldName] = defaultValue;\n }\n }\n return defaults;\n };\n\n /** @codegen-ignore */\n const klass = Metadata.setFields<any>(class extends (inherits as any) {\n constructor(...args: any[]) {\n super(Object.assign({}, getDefaultValues(), args[0] || {}));\n\n // call initialize method\n if (methods.initialize && typeof methods.initialize === 'function') {\n methods.initialize.apply(this, args);\n }\n }\n }, fields) as SchemaWithExtendsConstructor<T, ExtractInitProps<T>, P>;\n\n // Store the getDefaultValues function on the class for inheritance\n (klass as any)._getDefaultValues = getDefaultValues;\n\n // Add methods to the prototype\n Object.assign(klass.prototype, methods);\n\n for (let fieldName in viewTagFields) {\n view(viewTagFields[fieldName])(klass.prototype, fieldName);\n }\n\n if (name) {\n Object.defineProperty(klass, \"name\", { value: name });\n }\n\n klass.extends = <T2 extends Definition = Definition>(fields: T2, name?: string) =>\n schema<T2>(fields, name, klass as any) as SchemaWithExtendsConstructor<T & T2, ExtractInitProps<T2>, P>;\n\n return klass;\n}\n","import type { Schema } from \"./Schema\";\nimport { OPERATION } from \"./encoding/spec\";\nimport { $changes, $refId } from \"./types/symbols\";\n\ninterface ChangeDump {\n ops: {\n ADD?: number;\n REMOVE?: number;\n REPLACE?: number;\n },\n refs: string[],\n}\n\nexport function getIndent(level: number) {\n return (new Array(level).fill(0)).map((_, i) =>\n (i === level - 1) ? `└─ ` : ` `\n ).join(\"\");\n}\n\nexport function dumpChanges(schema: Schema) {\n const $root = schema[$changes].root;\n\n const dump: ChangeDump = {\n ops: {},\n refs: []\n };\n\n // for (const refId in $root.changes) {\n let current = $root.changes.next;\n while (current) {\n const changeTree = current.changeTree;\n // skip if ChangeTree is undefined\n if (changeTree === undefined) {\n current = current.next;\n continue;\n }\n\n const changes = changeTree.indexedOperations;\n\n dump.refs.push(`refId#${changeTree.ref[$refId]}`);\n for (const index in changes) {\n const op = changes[index];\n const opName = OPERATION[op];\n if (!dump.ops[opName as keyof ChangeDump['ops']]) { dump.ops[opName as keyof ChangeDump['ops']] = 0; }\n dump.ops[OPERATION[op] as keyof ChangeDump['ops']]++;\n }\n current = current.next;\n }\n\n return dump;\n}\n\nexport function getNextPowerOf2(number: number) {\n // If number is already a power of 2, return it\n if ((number & (number - 1)) === 0) {\n return number;\n }\n\n // Find the position of the most significant bit\n let msbPosition = 0;\n while (number > 0) {\n number >>= 1;\n msbPosition++;\n }\n\n // Return the next power of 2\n return 1 << msbPosition;\n}","import { OPERATION } from './encoding/spec';\nimport { DEFAULT_VIEW_TAG, type DefinitionType } from \"./annotations\";\n\nimport { AssignableProps, NonFunctionPropNames, ToJSON } from './types/HelperTypes';\n\nimport { ChangeSet, ChangeSetName, ChangeTree, IRef, Ref } from './encoder/ChangeTree';\nimport { $changes, $decoder, $deleteByIndex, $descriptors, $encoder, $filter, $getByIndex, $refId, $track } from './types/symbols';\nimport { StateView } from './encoder/StateView';\n\nimport { encodeSchemaOperation } from './encoder/EncodeOperation';\nimport { decodeSchemaOperation } from './decoder/DecodeOperation';\n\nimport type { Decoder } from './decoder/Decoder';\nimport type { Metadata, MetadataField } from './Metadata';\nimport { getIndent } from './utils';\n\n/**\n * Schema encoder / decoder\n */\nexport class Schema<C = any> implements IRef {\n static [Symbol.metadata]: Metadata;\n static [$encoder] = encodeSchemaOperation;\n static [$decoder] = decodeSchemaOperation;\n\n [$refId]?: number;\n\n /**\n * Assign the property descriptors required to track changes on this instance.\n * @param instance\n */\n static initialize(instance: any) {\n Object.defineProperty(instance, $changes, {\n value: new ChangeTree(instance),\n enumerable: false,\n writable: true\n });\n\n Object.defineProperties(instance, instance.constructor[Symbol.metadata]?.[$descriptors] || {});\n }\n\n static is(type: DefinitionType) {\n return typeof((type as typeof Schema)[Symbol.metadata]) === \"object\";\n }\n\n /**\n * Track property changes\n */\n static [$track] (changeTree: ChangeTree, index: number, operation: OPERATION = OPERATION.ADD) {\n changeTree.change(index, operation);\n }\n\n /**\n * Determine if a property must be filtered.\n * - If returns false, the property is NOT going to be encoded.\n * - If returns true, the property is going to be encoded.\n *\n * Encoding with \"filters\" happens in two steps:\n * - First, the encoder iterates over all \"not owned\" properties and encodes them.\n * - Then, the encoder iterates over all \"owned\" properties per instance and encodes them.\n */\n static [$filter] (ref: Schema, index: number, view: StateView) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n const tag = metadata[index]?.tag;\n\n if (view === undefined) {\n // shared pass/encode: encode if doesn't have a tag\n return tag === undefined;\n\n } else if (tag === undefined) {\n // view pass: no tag\n return true;\n\n } else if (tag === DEFAULT_VIEW_TAG) {\n // view pass: default tag\n return view.isChangeTreeVisible(ref[$changes]);\n\n } else {\n // view pass: custom tag\n const tags = view.tags?.get(ref[$changes]);\n return tags && tags.has(tag);\n }\n }\n\n // allow inherited classes to have a constructor\n constructor(arg?: C) {\n //\n // inline\n // Schema.initialize(this);\n //\n Schema.initialize(this);\n\n //\n // Assign initial values\n //\n if (arg) {\n Object.assign(this, arg);\n }\n }\n\n /**\n * Assign properties to the instance.\n * @param props Properties to assign to the instance\n * @returns\n */\n public assign<T extends Partial<this>>(props: AssignableProps<T>,): this {\n Object.assign(this, props);\n return this;\n }\n\n /**\n * Restore the instance from JSON data.\n * @param jsonData JSON data to restore the instance from\n * @returns\n */\n public restore(jsonData: ToJSON<this>): this {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number];\n const fieldName = field.name as keyof this;\n const fieldType = field.type;\n const value = (jsonData as any)[fieldName];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (typeof fieldType === \"string\") {\n // Primitive type: assign directly\n this[fieldName] = value;\n\n } else if (Schema.is(fieldType)) {\n // Schema type: create instance and restore\n const instance = new (fieldType as typeof Schema)();\n instance.restore(value);\n this[fieldName] = instance as any;\n\n } else if (typeof fieldType === \"object\") {\n // Collection types: { map: ... }, { array: ... }, etc.\n const collectionType = Object.keys(fieldType)[0] as string;\n const childType = (fieldType as any)[collectionType];\n\n if (collectionType === \"map\") {\n const mapSchema = this[fieldName] as any;\n for (const key in value) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[key]);\n mapSchema.set(key, childInstance);\n } else {\n mapSchema.set(key, value[key]);\n }\n }\n\n } else if (collectionType === \"array\") {\n const arraySchema = this[fieldName] as any;\n for (let i = 0; i < value.length; i++) {\n if (Schema.is(childType)) {\n const childInstance = new (childType as typeof Schema)();\n childInstance.restore(value[i]);\n arraySchema.push(childInstance);\n } else {\n arraySchema.push(value[i]);\n }\n }\n }\n }\n }\n\n return this;\n }\n\n /**\n * (Server-side): Flag a property to be encoded for the next patch.\n * @param instance Schema instance\n * @param property string representing the property name, or number representing the index of the property.\n * @param operation OPERATION to perform (detected automatically)\n */\n public setDirty<K extends NonFunctionPropNames<this>>(property: K | number, operation?: OPERATION) {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[$changes].change(\n metadata[metadata[property as string]].index,\n operation\n );\n }\n\n clone (): this {\n // Create instance without calling custom constructor\n const cloned = Object.create(this.constructor.prototype);\n Schema.initialize(cloned);\n\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n\n //\n // TODO: clone all properties, not only annotated ones\n //\n // for (const field in this) {\n for (const fieldIndex in metadata) {\n const field = metadata[fieldIndex as any as number].name as keyof this;\n\n if (\n typeof (this[field]) === \"object\" &&\n typeof ((this[field] as any)?.clone) === \"function\"\n ) {\n // deep clone\n cloned[field] = (this[field] as any).clone();\n\n } else {\n // primitive values\n cloned[field] = this[field];\n }\n }\n\n return cloned;\n }\n\n toJSON (this: any): ToJSON<this> {\n const obj: any = {};\n const metadata = this.constructor[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index] as MetadataField;\n const fieldName = field.name;\n if (!field.deprecated && this[fieldName] !== null && typeof (this[fieldName]) !== \"undefined\") {\n obj[fieldName] = (typeof (this[fieldName]['toJSON']) === \"function\")\n ? this[fieldName]['toJSON']()\n : this[fieldName];\n }\n }\n return obj;\n }\n\n /**\n * Used in tests only\n * @internal\n */\n discardAllChanges() {\n this[$changes].discardAll();\n }\n\n [$getByIndex](index: number): any {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n return this[metadata[index].name as keyof this];\n }\n\n [$deleteByIndex](index: number): void {\n const metadata: Metadata = (this.constructor as typeof Schema)[Symbol.metadata];\n this[metadata[index].name as keyof this] = undefined;\n }\n\n /**\n * Inspect the `refId` of all Schema instances in the tree. Optionally display the contents of the instance.\n *\n * @param ref Schema instance\n * @param showContents display JSON contents of the instance\n * @returns\n */\n static debugRefIds<T extends Schema>(ref: T, showContents: boolean = false, level: number = 0, decoder?: Decoder, keyPrefix: string = \"\") {\n const contents = (showContents) ? ` - ${JSON.stringify(ref.toJSON())}` : \"\";\n const changeTree: ChangeTree = ref[$changes];\n\n const refId = (ref as IRef)[$refId];\n const root = (decoder) ? decoder.root : changeTree.root;\n\n // log reference count if > 1\n const refCount = (root?.refCount?.[refId] > 1)\n ? ` [×${root.refCount[refId]}]`\n : '';\n\n let output = `${getIndent(level)}${keyPrefix}${ref.constructor.name} (refId: ${refId})${refCount}${contents}\\n`;\n\n changeTree.forEachChild((childChangeTree, indexOrKey) => {\n let key = indexOrKey;\n if (typeof indexOrKey === 'number' && (ref as any)['$indexes']) {\n // MapSchema\n key = (ref as any)['$indexes'].get(indexOrKey) ?? indexOrKey;\n }\n const keyPrefix = ((ref as any)['forEach'] !== undefined && key !== undefined) ? `[\"${key}\"]: ` : \"\";\n output += this.debugRefIds(childChangeTree.ref, showContents, level + 1, decoder, keyPrefix);\n });\n\n return output;\n }\n\n static debugRefIdEncodingOrder<T extends Ref>(ref: T, changeSet: ChangeSetName = 'allChanges') {\n let encodeOrder: number[] = [];\n let current = ref[$changes].root[changeSet].next;\n while (current) {\n if (current.changeTree) {\n encodeOrder.push(current.changeTree.ref[$refId]);\n }\n current = current.next;\n }\n return encodeOrder;\n }\n\n static debugRefIdsFromDecoder(decoder: Decoder) {\n return this.debugRefIds(decoder.state, false, 0, decoder);\n }\n\n /**\n * Return a string representation of the changes on a Schema instance.\n * The list of changes is cleared after each encode.\n *\n * @param instance Schema instance\n * @param isEncodeAll Return \"full encode\" instead of current change set.\n * @returns\n */\n static debugChanges<T extends Ref>(instance: T, isEncodeAll: boolean = false) {\n const changeTree: ChangeTree = instance[$changes];\n\n const changeSet = (isEncodeAll) ? changeTree.allChanges : changeTree.changes;\n const changeSetName = (isEncodeAll) ? \"allChanges\" : \"changes\";\n\n let output = `${instance.constructor.name} (${instance[$refId]}) -> .${changeSetName}:\\n`;\n\n function dumpChangeSet(changeSet: ChangeSet) {\n changeSet.operations\n .filter(op => op)\n .forEach((index) => {\n const operation = changeTree.indexedOperations[index];\n output += `- [${index}]: ${OPERATION[operation]} (${JSON.stringify(changeTree.getValue(Number(index), isEncodeAll))})\\n`\n });\n }\n\n dumpChangeSet(changeSet);\n\n // display filtered changes\n if (\n !isEncodeAll &&\n changeTree.filteredChanges &&\n (changeTree.filteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .filteredChanges:\\n`;\n dumpChangeSet(changeTree.filteredChanges);\n }\n\n // display filtered changes\n if (\n isEncodeAll &&\n changeTree.allFilteredChanges &&\n (changeTree.allFilteredChanges.operations).filter(op => op).length > 0\n ) {\n output += `${instance.constructor.name} (${instance[$refId]}) -> .allFilteredChanges:\\n`;\n dumpChangeSet(changeTree.allFilteredChanges);\n }\n\n return output;\n }\n\n static debugChangesDeep<T extends Schema>(ref: T, changeSetName: \"changes\" | \"allChanges\" | \"allFilteredChanges\" | \"filteredChanges\" = \"changes\") {\n let output = \"\";\n\n const rootChangeTree: ChangeTree = ref[$changes];\n const root = rootChangeTree.root;\n const changeTrees: Map<ChangeTree, ChangeTree[]> = new Map();\n\n const instanceRefIds = [];\n let totalOperations = 0;\n\n // TODO: FIXME: this method is not working as expected\n for (const [refId, changes] of Object.entries(root[changeSetName])) {\n const changeTree = root.changeTrees[refId as any as number];\n if (!changeTree) { continue; }\n\n let includeChangeTree = false;\n let parentChangeTrees: ChangeTree[] = [];\n let parentChangeTree = changeTree.parent?.[$changes];\n\n if (changeTree === rootChangeTree) {\n includeChangeTree = true;\n\n } else {\n while (parentChangeTree !== undefined) {\n parentChangeTrees.push(parentChangeTree);\n if (parentChangeTree.ref === ref) {\n includeChangeTree = true;\n break;\n }\n parentChangeTree = parentChangeTree.parent?.[$changes];\n }\n }\n\n if (includeChangeTree) {\n instanceRefIds.push(changeTree.ref[$refId]);\n totalOperations += Object.keys(changes).length;\n changeTrees.set(changeTree, parentChangeTrees.reverse());\n }\n }\n\n output += \"---\\n\"\n output += `root refId: ${rootChangeTree.ref[$refId]}\\n`;\n output += `Total instances: ${instanceRefIds.length} (refIds: ${instanceRefIds.join(\", \")})\\n`;\n output += `Total changes: ${totalOperations}\\n`;\n output += \"---\\n\"\n\n // based on root.changes, display a tree of changes that has the \"ref\" instance as parent\n const visitedParents = new WeakSet<ChangeTree>();\n for (const [changeTree, parentChangeTrees] of changeTrees.entries()) {\n parentChangeTrees.forEach((parentChangeTree, level) => {\n if (!visitedParents.has(parentChangeTree)) {\n output += `${getIndent(level)}${parentChangeTree.ref.constructor.name} (refId: ${parentChangeTree.ref[$refId]})\\n`;\n visitedParents.add(parentChangeTree);\n }\n });\n\n const changes = changeTree.indexedOperations;\n const level = parentChangeTrees.length;\n const indent = getIndent(level);\n\n const parentIndex = (level > 0) ? `(${changeTree.parentIndex}) ` : \"\";\n output += `${indent}${parentIndex}${changeTree.ref.constructor.name} (refId: ${changeTree.ref[$refId]}) - changes: ${Object.keys(changes).length}\\n`;\n\n for (const index in changes) {\n const operation = changes[index];\n output += `${getIndent(level + 1)}${OPERATION[operation]}: ${index}\\n`;\n }\n }\n\n return `${output}`;\n }\n\n\n}\n\n","import { OPERATION } from \"../encoding/spec\";\nimport { TypeContext } from \"../types/TypeContext\";\nimport { ChangeTree, setOperationAtIndex, ChangeTreeList, createChangeTreeList, ChangeSetName, type ChangeTreeNode } from \"./ChangeTree\";\nimport { $changes, $refId } from \"../types/symbols\";\n\nexport class Root {\n protected nextUniqueId: number = 0;\n\n refCount: {[id: number]: number} = {};\n changeTrees: {[refId: number]: ChangeTree} = {};\n\n // all changes\n allChanges: ChangeTreeList = createChangeTreeList();\n allFilteredChanges: ChangeTreeList = createChangeTreeList();// TODO: do not initialize it if filters are not used\n\n // pending changes to be encoded\n changes: ChangeTreeList = createChangeTreeList();\n filteredChanges: ChangeTreeList = createChangeTreeList();// TODO: do not initialize it if filters are not used\n\n constructor(public types: TypeContext) { }\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n add(changeTree: ChangeTree) {\n const ref = changeTree.ref;\n\n // Assign unique `refId` to ref if it doesn't have one yet.\n if (ref[$refId] === undefined) {\n ref[$refId] = this.getNextUniqueId();\n }\n\n const refId = ref[$refId];\n\n const isNewChangeTree = (this.changeTrees[refId] === undefined);\n if (isNewChangeTree) { this.changeTrees[refId] = changeTree; }\n\n const previousRefCount = this.refCount[refId];\n if (previousRefCount === 0) {\n //\n // When a ChangeTree is re-added, it means that it was previously removed.\n // We need to re-add all changes to the `changes` map.\n //\n const ops = changeTree.allChanges.operations;\n let len = ops.length;\n while (len--) {\n changeTree.indexedOperations[ops[len]] = OPERATION.ADD;\n setOperationAtIndex(changeTree.changes, len);\n }\n }\n\n this.refCount[refId] = (previousRefCount || 0) + 1;\n\n // console.log(\"ADD\", { refId, ref: ref.constructor.name, refCount: this.refCount[refId], isNewChangeTree });\n\n return isNewChangeTree;\n }\n\n remove(changeTree: ChangeTree) {\n const refId = changeTree.ref[$refId];\n const refCount = (this.refCount[refId]) - 1;\n\n // console.log(\"REMOVE\", { refId, ref: changeTree.ref.constructor.name, refCount, needRemove: refCount <= 0 });\n\n if (refCount <= 0) {\n //\n // Only remove \"root\" reference if it's the last reference\n //\n changeTree.root = undefined;\n delete this.changeTrees[refId];\n\n this.removeChangeFromChangeSet(\"allChanges\", changeTree);\n this.removeChangeFromChangeSet(\"changes\", changeTree);\n\n if (changeTree.filteredChanges) {\n this.removeChangeFromChangeSet(\"allFilteredChanges\", changeTree);\n this.removeChangeFromChangeSet(\"filteredChanges\", changeTree);\n }\n\n this.refCount[refId] = 0;\n\n changeTree.forEachChild((child, _) => {\n if (child.removeParent(changeTree.ref)) {\n if ((\n child.parentChain === undefined || // no parent, remove it\n (child.parentChain && this.refCount[child.ref[$refId]] > 0) // parent is still in use, but has more than one reference, remove it\n )) {\n this.remove(child);\n\n } else if (child.parentChain) {\n // re-assigning a child of the same root, move it next to parent\n this.moveNextToParent(child);\n }\n }\n });\n\n } else {\n this.refCount[refId] = refCount;\n\n //\n // When losing a reference to an instance, it is best to move the\n // ChangeTree next to its parent in the encoding queue.\n //\n // This way, at decoding time, the instance that contains the\n // ChangeTree will be available before the ChangeTree itself. If the\n // containing instance is not available, the Decoder will throw\n // \"refId not found\" error.\n //\n this.recursivelyMoveNextToParent(changeTree);\n }\n\n return refCount;\n }\n\n recursivelyMoveNextToParent(changeTree: ChangeTree) {\n this.moveNextToParent(changeTree);\n changeTree.forEachChild((child, _) => this.recursivelyMoveNextToParent(child));\n }\n\n moveNextToParent(changeTree: ChangeTree) {\n if (changeTree.filteredChanges) {\n this.moveNextToParentInChangeTreeList(\"filteredChanges\", changeTree);\n this.moveNextToParentInChangeTreeList(\"allFilteredChanges\", changeTree);\n } else {\n this.moveNextToParentInChangeTreeList(\"changes\", changeTree);\n this.moveNextToParentInChangeTreeList(\"allChanges\", changeTree);\n }\n }\n\n moveNextToParentInChangeTreeList(changeSetName: ChangeSetName, changeTree: ChangeTree): void {\n const changeSet = this[changeSetName];\n const node = changeTree[changeSetName].queueRootNode;\n if (!node) return;\n\n // Find the parent in the linked list\n const parent = changeTree.parent;\n if (!parent || !parent[$changes]) return;\n\n const parentNode = parent[$changes][changeSetName]?.queueRootNode;\n if (!parentNode || parentNode === node) return;\n\n // Use cached positions - no iteration needed!\n const parentPosition = parentNode.position;\n const childPosition = node.position;\n\n // If child is already after parent, no need to move\n if (childPosition > parentPosition) return;\n\n // Child is before parent, so we need to move it after parent\n // This maintains decoding order (parent before child)\n\n // Remove node from current position\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n changeSet.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n changeSet.tail = node.prev;\n }\n\n // Insert node right after parent\n node.prev = parentNode;\n node.next = parentNode.next;\n\n if (parentNode.next) {\n parentNode.next.prev = node;\n } else {\n changeSet.tail = node;\n }\n\n parentNode.next = node;\n\n // Update positions after the move\n this.updatePositionsAfterMove(changeSet, node, parentPosition + 1);\n }\n\n public enqueueChangeTree(\n changeTree: ChangeTree,\n changeSet: 'changes' | 'filteredChanges' | 'allFilteredChanges' | 'allChanges',\n queueRootNode = changeTree[changeSet].queueRootNode\n ) {\n // skip\n if (queueRootNode) { return; }\n\n // Add to linked list if not already present\n changeTree[changeSet].queueRootNode = this.addToChangeTreeList(this[changeSet], changeTree);\n }\n\n protected addToChangeTreeList(list: ChangeTreeList, changeTree: ChangeTree): ChangeTreeNode {\n const node: ChangeTreeNode = {\n changeTree,\n next: undefined,\n prev: undefined,\n position: list.tail ? list.tail.position + 1 : 0\n };\n\n if (!list.next) {\n list.next = node;\n list.tail = node;\n } else {\n node.prev = list.tail;\n list.tail!.next = node;\n list.tail = node;\n }\n\n return node;\n }\n\n protected updatePositionsAfterRemoval(list: ChangeTreeList, removedPosition: number) {\n // Update positions for all nodes after the removed position\n let current = list.next;\n let position = 0;\n\n while (current) {\n if (position >= removedPosition) {\n current.position = position;\n }\n current = current.next;\n position++;\n }\n }\n\n protected updatePositionsAfterMove(list: ChangeTreeList, node: ChangeTreeNode, newPosition: number) {\n // Recalculate all positions - this is more reliable than trying to be clever\n let current = list.next;\n let position = 0;\n\n while (current) {\n current.position = position;\n current = current.next;\n position++;\n }\n }\n\n public removeChangeFromChangeSet(changeSetName: ChangeSetName, changeTree: ChangeTree) {\n const changeSet = this[changeSetName];\n const node = changeTree[changeSetName].queueRootNode;\n\n if (node && node.changeTree === changeTree) {\n const removedPosition = node.position;\n\n // Remove the node from the linked list\n if (node.prev) {\n node.prev.next = node.next;\n } else {\n changeSet.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n } else {\n changeSet.tail = node.prev;\n }\n\n // Update positions for nodes that came after the removed node\n this.updatePositionsAfterRemoval(changeSet, removedPosition);\n\n // Clear ChangeTree reference\n changeTree[changeSetName].queueRootNode = undefined;\n return true;\n }\n\n return false;\n }\n}\n","import type { Schema } from \"../Schema\";\nimport { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $encoder, $filter, $getByIndex, $refId } from \"../types/symbols\";\n\nimport { encode } from \"../encoding/encode\";\nimport type { Iterator } from \"../encoding/decode\";\n\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport { Root } from \"./Root\";\n\nimport type { StateView } from \"./StateView\";\nimport type { ChangeSetName, ChangeTree, ChangeTreeList, ChangeTreeNode } from \"./ChangeTree\";\nimport { createChangeTreeList } from \"./ChangeTree\";\n\nfunction concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const result = new Uint8Array(a.length + b.length);\n result.set(a, 0);\n result.set(b, a.length);\n return result;\n}\n\nexport class Encoder<T extends Schema = any> {\n static BUFFER_SIZE = 8 * 1024; // 8KB\n sharedBuffer: Uint8Array = new Uint8Array(Encoder.BUFFER_SIZE);\n\n context: TypeContext;\n state: T;\n\n root: Root;\n\n constructor(state: T) {\n //\n // Use .cache() here to avoid re-creating a new context for every new room instance.\n //\n // We may need to make this optional in case of dynamically created\n // schemas - which would lead to memory leaks\n //\n this.context = TypeContext.cache(state.constructor as typeof Schema);\n this.root = new Root(this.context);\n\n this.setState(state);\n\n // console.log(\">>>>>>>>>>>>>>>> Encoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(state: T) {\n this.state = state;\n this.state[$changes].setRoot(this.root);\n }\n\n encode(\n it: Iterator = { offset: 0 },\n view?: StateView,\n buffer: Uint8Array = this.sharedBuffer,\n changeSetName: ChangeSetName = \"changes\",\n isEncodeAll = changeSetName === \"allChanges\",\n initialOffset = it.offset // cache current offset in case we need to resize the buffer\n ): Uint8Array {\n const hasView = (view !== undefined);\n const rootChangeTree = this.state[$changes];\n\n let current: ChangeTreeList | ChangeTreeNode = this.root[changeSetName];\n\n while (current = current.next) {\n const changeTree = (current as ChangeTreeNode).changeTree;\n\n if (hasView) {\n if (!view.isChangeTreeVisible(changeTree)) {\n // console.log(\"MARK AS INVISIBLE:\", { ref: changeTree.ref.constructor.name, refId: changeTree.ref[$refId], raw: changeTree.ref.toJSON() });\n view.invisible.add(changeTree);\n continue; // skip this change tree\n }\n view.invisible.delete(changeTree); // remove from invisible list\n }\n\n const changeSet = changeTree[changeSetName];\n const ref = changeTree.ref;\n\n // TODO: avoid iterating over change tree if no changes were made\n const numChanges = changeSet.operations.length;\n if (numChanges === 0) { continue; }\n\n const ctor = ref.constructor;\n const encoder = ctor[$encoder];\n const filter = ctor[$filter];\n const metadata = ctor[Symbol.metadata];\n\n // skip root `refId` if it's the first change tree\n // (unless it \"hasView\", which will need to revisit the root)\n if (hasView || it.offset > initialOffset || changeTree !== rootChangeTree) {\n buffer[it.offset++] = SWITCH_TO_STRUCTURE & 255;\n encode.number(buffer, ref[$refId], it);\n }\n\n for (let j = 0; j < numChanges; j++) {\n const fieldIndex = changeSet.operations[j];\n\n if (fieldIndex < 0) {\n // \"pure\" operation without fieldIndex (e.g. CLEAR, REVERSE, etc.)\n // encode and continue early - no need to reach $filter check\n buffer[it.offset++] = Math.abs(fieldIndex) & 255;\n continue;\n }\n\n const operation = (isEncodeAll)\n ? OPERATION.ADD\n : changeTree.indexedOperations[fieldIndex];\n\n //\n // first pass (encodeAll), identify \"filtered\" operations without encoding them\n // they will be encoded per client, based on their view.\n //\n // TODO: how can we optimize filtering out \"encode all\" operations?\n // TODO: avoid checking if no view tags were defined\n //\n if (fieldIndex === undefined || operation === undefined || (filter && !filter(ref, fieldIndex, view))) {\n // console.log(\"ADD AS INVISIBLE:\", fieldIndex, changeTree.ref.constructor.name)\n // view?.invisible.add(changeTree);\n continue;\n }\n\n encoder(this, buffer, changeTree, fieldIndex, operation, it, isEncodeAll, hasView, metadata);\n }\n }\n\n if (it.offset > buffer.byteLength) {\n // we can assume that n + 1 BUFFER_SIZE will suffice given that we are likely done with encoding at this point\n // multiples of BUFFER_SIZE are faster to allocate than arbitrary sizes\n const newSize = Math.ceil(it.offset / Encoder.BUFFER_SIZE) * Encoder.BUFFER_SIZE;\n\n console.warn(`@colyseus/schema buffer overflow. Encoded state is higher than default BUFFER_SIZE. Use the following to increase default BUFFER_SIZE:\n\n import { Encoder } from \"@colyseus/schema\";\n Encoder.BUFFER_SIZE = ${Math.round(newSize / 1024)} * 1024; // ${Math.round(newSize / 1024)} KB\n`);\n\n //\n // resize buffer and re-encode (TODO: can we avoid re-encoding here?)\n // -> No we probably can't unless we catch the need for resize before encoding which is likely more computationally expensive than resizing on demand\n //\n const newBuffer = new Uint8Array(newSize);\n newBuffer.set(buffer); // copy previous encoding steps beyond the initialOffset\n buffer = newBuffer;\n\n // assign resized buffer to local sharedBuffer\n if (buffer === this.sharedBuffer) {\n this.sharedBuffer = buffer;\n }\n\n return this.encode({ offset: initialOffset }, view, buffer, changeSetName, isEncodeAll);\n\n } else {\n\n return buffer.subarray(0, it.offset);\n }\n }\n\n encodeAll(\n it: Iterator = { offset: 0 },\n buffer: Uint8Array = this.sharedBuffer\n ) {\n return this.encode(it, undefined, buffer, \"allChanges\", true);\n }\n\n encodeAllView(\n view: StateView,\n sharedOffset: number,\n it: Iterator,\n bytes: Uint8Array = this.sharedBuffer\n ) {\n const viewOffset = it.offset;\n\n // try to encode \"filtered\" changes\n this.encode(it, view, bytes, \"allFilteredChanges\", true, viewOffset);\n\n return concatBytes(\n bytes.subarray(0, sharedOffset),\n bytes.subarray(viewOffset, it.offset)\n );\n }\n\n encodeView(\n view: StateView,\n sharedOffset: number,\n it: Iterator,\n bytes: Uint8Array = this.sharedBuffer\n ) {\n const viewOffset = it.offset;\n\n // encode visibility changes (add/remove for this view)\n for (const [refId, changes] of view.changes) {\n const changeTree: ChangeTree = this.root.changeTrees[refId];\n\n if (changeTree === undefined) {\n // detached instance, remove from view and skip.\n // console.log(\"detached instance, remove from view and skip.\", refId);\n view.changes.delete(refId);\n continue;\n }\n\n const keys = Object.keys(changes);\n if (keys.length === 0) {\n // FIXME: avoid having empty changes if no changes were made\n // console.log(\"changes.size === 0, skip\", refId, changeTree.ref.constructor.name);\n continue;\n }\n\n const ref = changeTree.ref;\n\n const ctor = ref.constructor;\n const encoder = ctor[$encoder];\n const metadata = ctor[Symbol.metadata];\n\n bytes[it.offset++] = SWITCH_TO_STRUCTURE & 255;\n encode.number(bytes, ref[$refId], it);\n\n for (let i = 0, numChanges = keys.length; i < numChanges; i++) {\n const index = Number(keys[i]);\n // workaround when using view.add() on item that has been deleted from state (see test \"adding to view item that has been removed from state\")\n const value = changeTree.ref[$getByIndex](index);\n const operation = (value !== undefined && changes[index]) || OPERATION.DELETE;\n\n // isEncodeAll = false\n // hasView = true\n encoder(this, bytes, changeTree, index, operation, it, false, true, metadata);\n }\n }\n\n //\n // TODO: only clear view changes after all views are encoded\n // (to allow re-using StateView's for multiple clients)\n //\n // clear \"view\" changes after encoding\n view.changes.clear();\n\n // try to encode \"filtered\" changes\n this.encode(it, view, bytes, \"filteredChanges\", false, viewOffset);\n\n return concatBytes(\n bytes.subarray(0, sharedOffset),\n bytes.subarray(viewOffset, it.offset)\n );\n }\n\n discardChanges() {\n // discard shared changes\n let current = this.root.changes.next;\n while (current) {\n current.changeTree.endEncode('changes');\n current = current.next;\n }\n this.root.changes = createChangeTreeList();\n\n // discard filtered changes\n current = this.root.filteredChanges.next;\n while (current) {\n current.changeTree.endEncode('filteredChanges');\n current = current.next;\n }\n this.root.filteredChanges = createChangeTreeList();\n }\n\n tryEncodeTypeId(\n bytes: Uint8Array,\n baseType: typeof Schema,\n targetType: typeof Schema,\n it: Iterator\n ) {\n const baseTypeId = this.context.getTypeId(baseType);\n const targetTypeId = this.context.getTypeId(targetType);\n\n if (targetTypeId === undefined) {\n console.warn(`@colyseus/schema WARNING: Class \"${targetType.name}\" is not registered on TypeRegistry - Please either tag the class with @entity or define a @type() field.`);\n return;\n }\n\n if (baseTypeId !== targetTypeId) {\n bytes[it.offset++] = TYPE_ID & 255;\n encode.number(bytes, targetTypeId, it);\n }\n }\n\n get hasChanges() {\n return (\n this.root.changes.next !== undefined ||\n this.root.filteredChanges.next !== undefined\n );\n }\n}\n","export function spliceOne(arr: any[], index: number): boolean {\n // manually splice an array\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n\n return true;\n}","import { Metadata } from \"../Metadata\";\nimport { $childType, $refId } from \"../types/symbols\";\nimport { Ref } from \"../encoder/ChangeTree\";\nimport { spliceOne } from \"../types/utils\";\nimport { OPERATION } from \"../encoding/spec\";\n\nimport type { MapSchema } from \"../types/custom/MapSchema\";\nimport type { Schema } from \"../Schema\";\n\nclass DecodingWarning extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DecodingWarning\";\n }\n}\n\n/**\n * Used for decoding only.\n */\n\nexport type SchemaCallbacks = { [field: string | number]: Function[] };\n\nexport class ReferenceTracker {\n //\n // Relation of refId => Schema structure\n // For direct access of structures during decoding time.\n //\n public refs = new Map<number, Ref>();\n\n public refCount: { [refId: number]: number; } = {};\n public deletedRefs = new Set<number>();\n\n public callbacks: { [refId: number]: SchemaCallbacks } = {};\n protected nextUniqueId: number = 0;\n\n getNextUniqueId() {\n return this.nextUniqueId++;\n }\n\n // for decoding\n addRef(refId: number, ref: Ref, incrementCount: boolean = true) {\n this.refs.set(refId, ref);\n ref[$refId] = refId;\n\n if (incrementCount) {\n this.refCount[refId] = (this.refCount[refId] || 0) + 1;\n }\n\n if (this.deletedRefs.has(refId)) {\n this.deletedRefs.delete(refId);\n }\n }\n\n // for decoding\n removeRef(refId: number) {\n const refCount = this.refCount[refId];\n\n if (refCount === undefined) {\n try {\n throw new DecodingWarning(\"trying to remove refId that doesn't exist: \" + refId);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if (refCount === 0) {\n try {\n const ref = this.refs.get(refId);\n throw new DecodingWarning(`trying to remove refId '${refId}' with 0 refCount (${ref.constructor.name}: ${JSON.stringify(ref)})`);\n } catch (e) {\n console.warn(e);\n }\n return;\n }\n\n if ((this.refCount[refId] = refCount - 1) <= 0) {\n this.deletedRefs.add(refId);\n }\n }\n\n clearRefs() {\n this.refs.clear();\n this.deletedRefs.clear();\n this.callbacks = {};\n this.refCount = {};\n }\n\n // for decoding\n garbageCollectDeletedRefs() {\n this.deletedRefs.forEach((refId) => {\n //\n // Skip active references.\n //\n if (this.refCount[refId] > 0) { return; }\n\n const ref = this.refs.get(refId);\n\n //\n // Ensure child schema instances have their references removed as well.\n //\n if ((ref.constructor as typeof Schema)[Symbol.metadata] !== undefined) {\n const metadata: Metadata = (ref.constructor as typeof Schema)[Symbol.metadata];\n for (const index in metadata) {\n const field = metadata[index as any as number].name;\n const child = ref[field as keyof Ref];\n if (typeof(child) === \"object\" && child) {\n const childRefId = (child as any)[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n }\n }\n\n } else {\n if (typeof ((ref as any)[$childType]) === \"function\") {\n Array.from((ref as MapSchema).values())\n .forEach((child) => {\n const childRefId = child[$refId];\n if (childRefId !== undefined && !this.deletedRefs.has(childRefId)) {\n this.removeRef(childRefId);\n }\n });\n }\n }\n\n this.refs.delete(refId); // remove ref\n delete this.refCount[refId]; // remove ref count\n delete this.callbacks[refId]; // remove callbacks\n });\n\n // clear deleted refs.\n this.deletedRefs.clear();\n }\n\n addCallback(refId: number, fieldOrOperation: string | number, callback: Function) {\n if (refId === undefined) {\n const name = (typeof(fieldOrOperation) === \"number\")\n ? OPERATION[fieldOrOperation]\n : fieldOrOperation\n throw new Error(\n `Can't addCallback on '${name}' (refId is undefined)`\n );\n }\n if (!this.callbacks[refId]) {\n this.callbacks[refId] = {};\n }\n if (!this.callbacks[refId][fieldOrOperation]) {\n this.callbacks[refId][fieldOrOperation] = [];\n }\n this.callbacks[refId][fieldOrOperation].push(callback);\n return () => this.removeCallback(refId, fieldOrOperation, callback);\n }\n\n removeCallback(refId: number, field: string | number, callback: Function) {\n const index: number | undefined = this.callbacks?.[refId]?.[field]?.indexOf(callback);\n if (index !== undefined && index !== -1) {\n spliceOne(this.callbacks[refId][field], index);\n }\n }\n\n}\n","import { TypeContext } from \"../types/TypeContext\";\nimport { $changes, $childType, $decoder, $onDecodeEnd, $refId } from \"../types/symbols\";\nimport { Schema } from \"../Schema\";\n\nimport { decode } from \"../encoding/decode\";\nimport { OPERATION, SWITCH_TO_STRUCTURE, TYPE_ID } from '../encoding/spec';\nimport type { Ref } from \"../encoder/ChangeTree\";\nimport type { Iterator } from \"../encoding/decode\";\nimport { ReferenceTracker } from \"./ReferenceTracker\";\nimport { DEFINITION_MISMATCH, type DataChange, type DecodeOperation } from \"./DecodeOperation\";\nimport { Collection } from \"../types/HelperTypes\";\n\nexport class Decoder<T extends Schema = any> {\n context: TypeContext;\n\n state: T;\n root: ReferenceTracker;\n\n currentRefId: number = 0;\n\n triggerChanges?: (allChanges: DataChange[]) => void;\n\n constructor(root: T, context?: TypeContext) {\n this.setState(root);\n\n this.context = context || new TypeContext(root.constructor as typeof Schema);\n\n // console.log(\">>>>>>>>>>>>>>>> Decoder types\");\n // this.context.schemas.forEach((id, schema) => {\n // console.log(\"type:\", id, schema.name, Object.keys(schema[Symbol.metadata]));\n // });\n }\n\n protected setState(root: T) {\n this.state = root;\n this.root = new ReferenceTracker();\n this.root.addRef(0, root);\n }\n\n decode(\n bytes: Uint8Array,\n it: Iterator = { offset: 0 },\n ref: Ref = this.state,\n ) {\n const allChanges: DataChange[] = [];\n\n const $root = this.root;\n const totalBytes = bytes.byteLength;\n\n let decoder: DecodeOperation = ref['constructor'][$decoder];\n\n this.currentRefId = 0;\n\n while (it.offset < totalBytes) {\n //\n // Peek ahead, check if it's a switch to a different structure\n //\n if (bytes[it.offset] == SWITCH_TO_STRUCTURE) {\n it.offset++;\n\n (ref as any)[$onDecodeEnd]?.()\n\n const nextRefId = decode.number(bytes, it);\n const nextRef = $root.refs.get(nextRefId);\n\n //\n // Trying to access a reference that haven't been decoded yet.\n //\n if (!nextRef) {\n // throw new Error(`\"refId\" not found: ${nextRefId}`);\n console.error(`\"refId\" not found: ${nextRefId}`, { previousRef: ref, previousRefId: this.currentRefId });\n console.warn(\"Please report this issue to the developers.\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n\n } else {\n ref = nextRef;\n decoder = ref.constructor[$decoder];\n this.currentRefId = nextRefId;\n }\n\n continue;\n }\n\n const result = decoder(this, bytes, it, ref, allChanges);\n\n if (result === DEFINITION_MISMATCH) {\n console.warn(\"@colyseus/schema: definition mismatch\");\n this.skipCurrentStructure(bytes, it, totalBytes);\n continue;\n }\n }\n\n // FIXME: DRY with SWITCH_TO_STRUCTURE block.\n (ref as any)[$onDecodeEnd]?.()\n\n // trigger changes\n this.triggerChanges?.(allChanges);\n\n // drop references of unused schemas\n $root.garbageCollectDeletedRefs();\n\n return allChanges;\n }\n\n skipCurrentStructure(bytes: Uint8Array, it: Iterator, totalBytes: number) {\n //\n // keep skipping next bytes until reaches a known structure\n // by local decoder.\n //\n const nextIterator: Iterator = { offset: it.offset };\n while (it.offset < totalBytes) {\n if (bytes[it.offset] === SWITCH_TO_STRUCTURE) {\n nextIterator.offset = it.offset + 1;\n if (this.root.refs.has(decode.number(bytes, nextIterator))) {\n break;\n }\n }\n it.offset++;\n }\n }\n\n getInstanceType(bytes: Uint8Array, it: Iterator, defaultType: typeof Schema): typeof Schema {\n let type: typeof Schema;\n\n if (bytes[it.offset] === TYPE_ID) {\n it.offset++;\n const type_id = decode.number(bytes, it);\n type = this.context.get(type_id);\n }\n\n return type || defaultType;\n }\n\n createInstanceOfType (type: typeof Schema): Schema {\n return new (type as any)();\n }\n\n removeChildRefs(ref: Collection, allChanges: DataChange[]) {\n const needRemoveRef = typeof ((ref as any)[$childType]) !== \"string\";\n const refId = (ref as Ref)[$refId];\n\n ref.forEach((value: any, key: any) => {\n allChanges.push({\n ref: ref as Ref,\n refId,\n op: OPERATION.DELETE,\n field: key,\n value: undefined,\n previousValue: value\n });\n\n if (needRemoveRef) {\n this.root.removeRef(value[$refId]);\n }\n });\n }\n\n}\n","import { PrimitiveType, schema, SchemaType } from \"./annotations\";\nimport { TypeContext } from \"./types/TypeContext\";\nimport { Metadata } from \"./Metadata\";\nimport { Iterator } from \"./encoding/decode\";\nimport { Encoder } from \"./encoder/Encoder\";\nimport { Decoder } from \"./decoder/Decoder\";\nimport { Schema } from \"./Schema\";\n\n/**\n * Static methods available on Reflection\n */\ninterface ReflectionStatic {\n /**\n * Encodes the TypeContext of an Encoder into a buffer.\n *\n * @param encoder Encoder instance\n * @param it\n * @returns\n */\n encode: (encoder: Encoder, it?: Iterator) => Uint8Array;\n\n /**\n * Decodes the TypeContext from a buffer into a Decoder instance.\n *\n * @param bytes Reflection.encode() output\n * @param it\n * @returns Decoder instance\n */\n decode: <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator) => Decoder<T>;\n}\n\n/**\n * Reflection\n */\nexport const ReflectionField = schema({\n name: \"string\",\n type: \"string\",\n referencedType: \"number\",\n})\nexport type ReflectionField = SchemaType<typeof ReflectionField>;\n\nexport const ReflectionType = schema({\n id: \"number\",\n extendsId: \"number\",\n fields: [ ReflectionField ],\n})\nexport type ReflectionType = SchemaType<typeof ReflectionType>;\n\nexport const Reflection = schema({\n types: [ ReflectionType ],\n rootType: \"number\",\n}) as ReturnType<typeof schema<{\n types: [typeof ReflectionType];\n rootType: \"number\";\n}>> & ReflectionStatic;\n\nexport type Reflection = SchemaType<typeof Reflection>;\n\nReflection.encode = function (encoder: Encoder, it: Iterator = { offset: 0 }) {\n const context = encoder.context;\n\n const reflection = new Reflection();\n const reflectionEncoder = new Encoder(reflection);\n\n // rootType is usually the first schema passed to the Encoder\n // (unless it inherits from another schema)\n const rootType = context.schemas.get(encoder.state.constructor);\n if (rootType > 0) { reflection.rootType = rootType; }\n\n const includedTypeIds = new Set<number>();\n const pendingReflectionTypes: { [typeid: number]: ReflectionType[] } = {};\n\n // add type to reflection in a way that respects inheritance\n // (parent types should be added before their children)\n const addType = (type: ReflectionType) => {\n if (type.extendsId === undefined || includedTypeIds.has(type.extendsId)) {\n includedTypeIds.add(type.id);\n\n reflection.types.push(type);\n\n const deps = pendingReflectionTypes[type.id];\n if (deps !== undefined) {\n delete pendingReflectionTypes[type.id];\n deps.forEach((childType) => addType(childType));\n }\n } else {\n if (pendingReflectionTypes[type.extendsId] === undefined) {\n pendingReflectionTypes[type.extendsId] = [];\n }\n pendingReflectionTypes[type.extendsId].push(type);\n }\n };\n\n context.schemas.forEach((typeid, klass) => {\n const type = new ReflectionType();\n type.id = Number(typeid);\n\n // support inheritance\n const inheritFrom = Object.getPrototypeOf(klass);\n if (inheritFrom !== Schema) {\n type.extendsId = context.schemas.get(inheritFrom);\n }\n\n const metadata = klass[Symbol.metadata];\n\n //\n // FIXME: this is a workaround for inherited types without additional fields\n // if metadata is the same reference as the parent class - it means the class has no own metadata\n //\n if (metadata !== inheritFrom[Symbol.metadata]) {\n for (const fieldIndex in metadata) {\n const index = Number(fieldIndex);\n const fieldName = metadata[index].name;\n\n // skip fields from parent classes\n if (!Object.prototype.hasOwnProperty.call(metadata, fieldName)) {\n continue;\n }\n\n const reflectionField = new ReflectionField();\n reflectionField.name = fieldName;\n\n let fieldType: string;\n\n const field = metadata[index];\n\n if (typeof (field.type) === \"string\") {\n fieldType = field.type;\n\n } else {\n let childTypeSchema: typeof Schema;\n\n //\n // TODO: refactor below.\n //\n if (Schema.is(field.type)) {\n fieldType = \"ref\";\n childTypeSchema = field.type as typeof Schema;\n\n } else {\n fieldType = Object.keys(field.type)[0];\n\n if (typeof (field.type[fieldType as keyof typeof field.type]) === \"string\") {\n fieldType += \":\" + field.type[fieldType as keyof typeof field.type]; // array:string\n\n } else {\n childTypeSchema = field.type[fieldType as keyof typeof field.type];\n }\n }\n\n reflectionField.referencedType = (childTypeSchema)\n ? context.getTypeId(childTypeSchema)\n : -1;\n }\n\n reflectionField.type = fieldType;\n type.fields.push(reflectionField);\n }\n }\n\n addType(type);\n });\n\n // in case there are types that were not added due to inheritance\n for (const typeid in pendingReflectionTypes) {\n pendingReflectionTypes[typeid].forEach((type) =>\n reflection.types.push(type))\n }\n\n const buf = reflectionEncoder.encodeAll(it);\n return buf.slice(0, it.offset);\n};\n\nReflection.decode = function <T extends Schema = Schema>(bytes: Uint8Array, it?: Iterator): Decoder<T> {\n const reflection = new Reflection();\n\n const reflectionDecoder = new Decoder(reflection);\n reflectionDecoder.decode(bytes, it);\n\n const typeContext = new TypeContext();\n\n // 1st pass, initialize metadata + inheritance\n reflection.types.forEach((reflectionType) => {\n const parentClass: typeof Schema = typeContext.get(reflectionType.extendsId) ?? Schema;\n const schema: typeof Schema = class _ extends parentClass { };\n\n // register for inheritance support\n TypeContext.register(schema);\n\n typeContext.add(schema, reflectionType.id);\n }, {});\n\n // define fields\n const addFields = (metadata: Metadata, reflectionType: ReflectionType, parentFieldIndex: number) => {\n reflectionType.fields.forEach((field, i) => {\n const fieldIndex = parentFieldIndex + i;\n\n if (field.referencedType !== undefined) {\n let fieldType = field.type;\n let refType: PrimitiveType = typeContext.get(field.referencedType);\n\n // map or array of primitive type (-1)\n if (!refType) {\n const typeInfo = field.type.split(\":\");\n fieldType = typeInfo[0];\n refType = typeInfo[1] as PrimitiveType; // string\n }\n\n if (fieldType === \"ref\") {\n Metadata.addField(metadata, fieldIndex, field.name, refType);\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, { [fieldType]: refType });\n }\n\n } else {\n Metadata.addField(metadata, fieldIndex, field.name, field.type as PrimitiveType);\n }\n });\n };\n\n // 2nd pass, set fields\n reflection.types.forEach((reflectionType) => {\n const schema = typeContext.get(reflectionType.id);\n\n // for inheritance support\n const metadata = Metadata.initialize(schema);\n\n const inheritedTypes: ReflectionType[] = [];\n\n let parentType: ReflectionType = reflectionType;\n do {\n inheritedTypes.push(parentType);\n parentType = reflection.types.find((t) => t.id === parentType.extendsId);\n } while (parentType);\n\n let parentFieldIndex = 0;\n\n inheritedTypes.reverse().forEach((reflectionType) => {\n // add fields from all inherited classes\n // TODO: refactor this to avoid adding fields from parent classes\n addFields(metadata, reflectionType, parentFieldIndex);\n parentFieldIndex += reflectionType.fields.length;\n });\n });\n\n const state: T = new (typeContext.get(reflection.rootType || 0) as unknown as any)();\n\n return new Decoder<T>(state, typeContext);\n}","import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionNonPrimitivePropNames, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { IRef, Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport type { DefinitionType } from \"../../annotations\";\nimport type { CollectionSchema } from \"../../types/custom/CollectionSchema\";\n\n//\n// Discussion: https://github.com/colyseus/schema/issues/155\n//\n// Main points:\n// - Decouple structures from their callbacks.\n// - Registering deep callbacks can be confusing.\n// - Avoid closures by allowing to pass a context. (https://github.com/colyseus/schema/issues/155#issuecomment-1804694081)\n//\n\n/**\n * TODO: define a schema interface, which even having duplicate definitions, it could be used to get the callback proxy.\n *\n * ```ts\n * export type SchemaCallbackProxy<RoomState> = (<T extends Schema>(instance: T) => CallbackProxy<T>);\n * ```\n */\nexport type SchemaCallbackProxy<RoomState> = (<T>(instance: T) => CallbackProxy<T>);\nexport type GetCallbackProxy = SchemaCallbackProxy<any>; // workaround for compatibility for < colyseus.js0.16.6. Remove me on next major release.\n\nexport type CallbackProxy<T> = unknown extends T // is \"any\"?\n ? SchemaCallback<T> & CollectionCallback<any, any>\n : T extends Collection<infer K, infer V, infer _>\n ? CollectionCallback<K, V>\n : SchemaCallback<T>;\n\nexport type SchemaCallback<T> = {\n /**\n * Trigger callback when value of a property changes.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n listen<K extends NonFunctionPropNames<T>>(\n prop: K,\n callback: (value: T[K], previousValue: T[K]) => void,\n immediate?: boolean,\n ): () => void;\n\n /**\n * Trigger callback whenever any property changed within this instance.\n *\n * @param prop name of the property\n * @param callback callback to be triggered on property change\n * @param immediate trigger immediatelly if property has been already set.\n * @return callback to detach the listener\n */\n onChange(callback: () => void): () => void;\n\n /**\n * Bind properties to another object. Changes on the properties will be reflected on the target object.\n *\n * @param targetObject object to bind properties to\n * @param properties list of properties to bind. If not provided, all properties will be bound.\n */\n bindTo(targetObject: any, properties?: Array<NonFunctionPropNames<T>>): void;\n} & {\n [K in NonFunctionNonPrimitivePropNames<T>]: CallbackProxy<T[K]>;\n}\n\nexport type CollectionCallback<K, V> = {\n /**\n * Trigger callback when an item has been added to the collection.\n *\n * @param callback\n * @param immediate\n * @return callback to detach the onAdd listener\n */\n onAdd(callback: (item: V, index: K) => void, immediate?: boolean): () => void;\n\n /**\n * Trigger callback when an item has been removed to the collection.\n *\n * @param callback\n * @return callback to detach the onRemove listener\n */\n onRemove(callback: (item: V, index: K) => void): () => void;\n\n /**\n * Trigger callback when the value on a key has changed.\n *\n * THIS METHOD IS NOT RECURSIVE!\n * If you want to listen to changes on individual items, you need to attach callbacks to the them directly inside the `onAdd` callback.\n *\n * @param callback\n * @return callback to detach the onChange listener\n */\n onChange(callback: (item: V, index: K) => void): () => void;\n};\n\ntype OnInstanceAvailableCallback = (callback: (ref: Ref, existing: boolean) => void) => void;\n\ntype CallContext = {\n instance?: any,\n parentInstance?: any,\n onInstanceAvailable?: OnInstanceAvailableCallback,\n}\n\n/**\n * Legacy callback system\n *\n * @param decoder\n * @returns\n */\nexport function getDecoderStateCallbacks<T extends Schema>(decoder: Decoder<T>): SchemaCallbackProxy<T> {\n const $root = decoder.root;\n const callbacks = $root.callbacks;\n\n const onAddCalls: WeakMap<Function, boolean> = new WeakMap();\n let currentOnAddCallback: Function | undefined;\n\n decoder.triggerChanges = function (allChanges: DataChange[]) {\n const uniqueRefIds = new Set<number>();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n const $callbacks = callbacks[refId];\n\n if (!$callbacks) { continue; }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const deleteCallbacks = callbacks[(change.previousValue as Ref)[$refId]]?.[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i]();\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle schema instance\n //\n\n if (!uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks?.[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i]();\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n if ($callbacks.hasOwnProperty(change.field)) {\n const fieldCallbacks = $callbacks[change.field];\n for (let i = fieldCallbacks?.length - 1; i >= 0; i--) {\n fieldCallbacks[i](change.value, change.previousValue);\n // try {\n // } catch (e) {\n // console.error(e);\n // }\n }\n }\n\n\n } else {\n //\n // Handle collection of items\n //\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // triger onRemove\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n for (let i = deleteCallbacks?.length - 1; i >= 0; i--) {\n deleteCallbacks[i](change.previousValue, change.dynamicIndex ?? change.field);\n }\n }\n\n // Handle DELETE_AND_ADD operations\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // triger onAdd\n const addCallbacks = $callbacks[OPERATION.ADD];\n for (let i = addCallbacks?.length - 1; i >= 0; i--) {\n addCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n\n // trigger onChange\n if (\n change.value !== change.previousValue &&\n // FIXME: see \"should not encode item if added and removed at the same patch\" test case.\n // some \"ADD\" + \"DELETE\" operations on same patch are being encoded as \"DELETE\"\n (change.value !== undefined || change.previousValue !== undefined)\n ) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n for (let i = replaceCallbacks?.length - 1; i >= 0; i--) {\n replaceCallbacks[i](change.value, change.dynamicIndex ?? change.field);\n }\n }\n }\n\n uniqueRefIds.add(refId);\n }\n };\n\n function getProxy(\n metadataOrType: Metadata | DefinitionType,\n context: CallContext\n ) {\n let metadata: Metadata = context.instance?.constructor[Symbol.metadata] || metadataOrType;\n let isCollection = (\n (context.instance && typeof (context.instance['forEach']) === \"function\") ||\n (metadataOrType && typeof ((metadataOrType as typeof Schema)[Symbol.metadata]) === \"undefined\")\n );\n\n if (metadata && !isCollection) {\n\n const onAddListen = function (\n ref: Ref,\n prop: string,\n callback: (value: any, previousValue: any) => void, immediate: boolean\n ) {\n // immediate trigger\n if (\n immediate &&\n context.instance[prop] !== undefined &&\n !onAddCalls.has(currentOnAddCallback) // Workaround for https://github.com/colyseus/schema/issues/147\n ) {\n callback(context.instance[prop], undefined);\n }\n return $root.addCallback(ref[$refId], prop, callback);\n }\n\n /**\n * Schema instances\n */\n return new Proxy({\n listen: function listen(prop: string, callback: (value: any, previousValue: any) => void, immediate: boolean = true) {\n if (context.instance) {\n return onAddListen(context.instance, prop, callback, immediate);\n\n } else {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAddListen(ref, prop, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback))\n });\n\n return () => detachCallback();\n }\n },\n\n onChange: function onChange(callback: () => void) {\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n callback\n );\n },\n\n //\n // TODO: refactor `bindTo()` implementation.\n // There is room for improvement.\n //\n bindTo: function bindTo(targetObject: any, properties?: string[]) {\n if (!properties) {\n properties = Object.keys(metadata).map((index) => metadata[index as any as number].name);\n }\n return $root.addCallback(\n context.instance[$refId],\n OPERATION.REPLACE,\n () => {\n properties.forEach((prop) =>\n targetObject[prop] = context.instance[prop])\n }\n );\n }\n }, {\n get(target, prop: string) {\n const metadataField = metadata[metadata[prop]];\n if (metadataField) {\n const instance = context.instance?.[prop];\n const onInstanceAvailable: OnInstanceAvailableCallback = (\n (callback: (ref: Ref, existing: boolean) => void) => {\n const unbind = $(context.instance).listen(prop, (value, _) => {\n callback(value, false);\n\n // FIXME: by \"unbinding\" the callback here,\n // it will not support when the server\n // re-instantiates the instance.\n //\n unbind?.();\n }, false);\n\n // has existing value\n if (instance?.[$refId] !== undefined) {\n callback(instance, true);\n }\n }\n );\n\n return getProxy(metadataField.type, {\n // make sure refId is available, otherwise need to wait for the instance to be available.\n instance: (instance?.[$refId] !== undefined && instance),\n parentInstance: context.instance,\n onInstanceAvailable,\n });\n\n } else {\n // accessing the function\n return target[prop as keyof typeof target];\n }\n },\n has(target, prop: string) { return metadata[prop] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n\n } else {\n /**\n * Collection instances\n */\n\n const onAdd = function (ref: Ref, callback: (value: any, key: any) => void, immediate: boolean) {\n // Trigger callback on existing items\n if (immediate) {\n (ref as CollectionSchema).forEach((v, k) => callback(v, k));\n }\n\n return $root.addCallback(ref[$refId], OPERATION.ADD, (value: any, key: any) => {\n onAddCalls.set(callback, true);\n currentOnAddCallback = callback;\n callback(value, key);\n onAddCalls.delete(callback)\n currentOnAddCallback = undefined;\n });\n };\n\n const onRemove = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.DELETE, callback);\n };\n\n const onChange = function (ref: Ref, callback: (value: any, key: any) => void) {\n return $root.addCallback(ref[$refId], OPERATION.REPLACE, callback);\n };\n\n return new Proxy({\n onAdd: function(callback: (value: any, key: any) => void, immediate: boolean = true) {\n //\n // https://github.com/colyseus/schema/issues/147\n // If parent instance has \"onAdd\" registered, avoid triggering immediate callback.\n //\n\n if (context.instance) {\n return onAdd(context.instance, callback, immediate && !onAddCalls.has(currentOnAddCallback));\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref, existing: boolean) => {\n detachCallback = onAdd(ref, callback, immediate && existing && !onAddCalls.has(currentOnAddCallback));\n });\n\n return () => detachCallback();\n }\n },\n onRemove: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onRemove(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onRemove(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n onChange: function(callback: (value: any, key: any) => void) {\n if (context.instance) {\n return onChange(context.instance, callback);\n\n } else if (context.onInstanceAvailable) {\n // collection instance not received yet\n let detachCallback = () => {};\n\n context.onInstanceAvailable((ref: Ref) => {\n detachCallback = onChange(ref, callback)\n });\n\n return () => detachCallback();\n }\n },\n }, {\n get(target, prop: string) {\n if (!target[prop as keyof typeof target]) {\n throw new Error(`Can't access '${prop}' through callback proxy. access the instance directly.`);\n }\n return target[prop as keyof typeof target];\n },\n has(target, prop) { return target[prop as keyof typeof target] !== undefined; },\n set(_, _1, _2) { throw new Error(\"not allowed\"); },\n deleteProperty(_, _1) { throw new Error(\"not allowed\"); },\n });\n }\n }\n\n function $<T>(instance: T): CallbackProxy<T> {\n return getProxy(undefined, { instance }) as unknown as CallbackProxy<T>;\n }\n\n return $;\n}\n","import { DataChange } from \"../DecodeOperation\";\nimport { Decoder } from \"../Decoder\";\n\nexport function getRawChangesCallback(\n decoder: Decoder,\n callback: (changes: DataChange[]) => void\n) {\n decoder.triggerChanges = callback;\n}","import { Metadata } from \"../../Metadata\";\nimport { Collection, NonFunctionPropNames } from \"../../types/HelperTypes\";\nimport { Ref } from \"../../encoder/ChangeTree\";\nimport { Decoder } from \"../Decoder\";\nimport { DataChange } from \"../DecodeOperation\";\nimport { OPERATION } from \"../../encoding/spec\";\nimport { Schema } from \"../../Schema\";\nimport { $refId } from \"../../types/symbols\";\nimport { MapSchema } from \"../../types/custom/MapSchema\";\nimport { ArraySchema } from \"../../types/custom/ArraySchema\";\nimport { getDecoderStateCallbacks, type SchemaCallbackProxy } from \"./getDecoderStateCallbacks\";\nimport { getRawChangesCallback } from \"./RawChanges\";\n\n//\n// C#-style Callbacks API\n// Matches the API from: https://docs.colyseus.io/state/callbacks\n//\n// Key features:\n// - Uses string property names with TypeScript auto-completion\n// - Consistent parameter order (key, value) for collection callbacks\n// - Overloaded methods for nested instance callbacks\n//\n\ntype PropertyChangeCallback<K> = (currentValue: K, previousValue: K) => void;\ntype KeyValueCallback<K, V> = (key: K, value: V) => void;\ntype InstanceChangeCallback = () => void;\n\n// Exclude internal properties from valid property names\ntype PublicPropNames<T> = Exclude<NonFunctionPropNames<T>, typeof $refId> & string;\n\n// Extract only properties that extend Collection\ntype CollectionPropNames<T> = Exclude<{\n [K in keyof T]: T[K] extends Collection<any, any> ? K : never\n}[keyof T] & string, typeof $refId>;\n\n// Infer the value type of a collection property\ntype CollectionValueType<T, K extends keyof T> =\n T[K] extends MapSchema<infer V, any> ? V :\n T[K] extends ArraySchema<infer V> ? V :\n T[K] extends Collection<any, infer V, any> ? V : never;\n\n// Infer the key type of a collection property\ntype CollectionKeyType<T, K extends keyof T> =\n T[K] extends MapSchema<any, infer Key> ? Key :\n T[K] extends ArraySchema<any> ? number :\n T[K] extends Collection<infer Key, any, any> ? Key : never;\n\n/**\n * State Callbacks handler\n *\n * Usage:\n * ```ts\n * const $ = Callbacks.get(decoder);\n *\n * // Listen to property changes\n * $.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * $.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * $.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * $.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * $.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * $.bindTo(player, playerVisual);\n * ```\n */\nexport class StateCallbackStrategy<TState extends Schema> {\n protected decoder: Decoder<TState>;\n protected uniqueRefIds: Set<number> = new Set();\n protected isTriggering: boolean = false;\n\n constructor(decoder: Decoder<TState>) {\n this.decoder = decoder;\n this.decoder.triggerChanges = this.triggerChanges.bind(this);\n }\n\n protected get callbacks() {\n return this.decoder.root.callbacks;\n }\n\n protected get state() {\n return this.decoder.state;\n }\n\n protected addCallback(\n refId: number,\n operationOrProperty: OPERATION | string,\n handler: Function\n ): () => void {\n const $root = this.decoder.root;\n return $root.addCallback(refId, operationOrProperty, handler);\n }\n\n protected addCallbackOrWaitCollectionAvailable<TInstance extends Schema, TReturn extends Ref>(\n instance: TInstance,\n propertyName: string,\n operation: OPERATION,\n handler: Function,\n immediate: boolean = true\n ): () => void {\n let removeHandler: () => void = () => {};\n const removeOnAdd = () => removeHandler();\n\n const collection = (instance as any)[propertyName] as TReturn;\n\n // Collection not available yet. Listen for its availability before attaching the handler.\n if (collection === null || collection === undefined) {\n removeHandler = this.addCallback(\n instance[$refId],\n propertyName,\n (value: TReturn, _: TReturn) => {\n if (value !== null && value !== undefined) {\n removeHandler = this.addCallback(value[$refId], operation, handler);\n }\n }\n );\n return removeOnAdd;\n\n } else {\n //\n // Call immediately if collection is already available, if it's an ADD operation.\n //\n immediate = immediate && this.isTriggering === false;\n\n if (operation === OPERATION.ADD && immediate) {\n (collection as Collection<any, any>).forEach((value: any, key: any) => {\n handler(key, value);\n });\n }\n\n return this.addCallback(collection[$refId], operation, handler);\n }\n }\n\n /**\n * Listen to property changes on the root state.\n */\n listen<K extends PublicPropNames<TState>>(\n property: K,\n handler: PropertyChangeCallback<TState[K]>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to property changes on a nested instance.\n */\n listen<TInstance extends Schema, K extends PublicPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: PropertyChangeCallback<TInstance[K]>,\n immediate?: boolean\n ): () => void;\n\n listen(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // listen(property, handler, immediate?)\n return this.listenInstance(this.state, args[0], args[1], args[2]);\n } else {\n // listen(instance, property, handler, immediate?)\n return this.listenInstance(args[0], args[1], args[2], args[3]);\n }\n }\n\n protected listenInstance<TInstance extends Schema>(\n instance: TInstance,\n propertyName: string,\n handler: PropertyChangeCallback<any>,\n immediate: boolean = true\n ): () => void {\n immediate = immediate && this.isTriggering === false;\n\n //\n // Call handler immediately if property is already available.\n //\n const currentValue = (instance as any)[propertyName];\n if (immediate && currentValue !== null && currentValue !== undefined) {\n handler(currentValue, undefined as any);\n }\n\n return this.addCallback(instance[$refId], propertyName, handler);\n }\n\n /**\n * Listen to any property change on an instance.\n */\n onChange<TInstance extends Schema>(\n instance: TInstance,\n handler: InstanceChangeCallback\n ): () => void;\n\n /**\n * Listen to item changes in a collection on root state.\n */\n onChange<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to item changes in a nested collection.\n */\n onChange<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onChange(...args: any[]): () => void {\n if (args.length === 2 && typeof args[0] !== 'string') {\n // onChange(instance, handler) - instance change\n const instance = args[0] as Schema;\n const handler = args[1] as InstanceChangeCallback;\n return this.addCallback(instance[$refId], OPERATION.REPLACE, handler);\n }\n\n if (typeof args[0] === 'string') {\n // onChange(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.REPLACE,\n args[1]\n );\n } else {\n // onChange(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.REPLACE,\n args[2]\n );\n }\n }\n\n /**\n * Listen to items added to a collection on root state.\n */\n onAdd<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>,\n immediate?: boolean\n ): () => void;\n\n /**\n * Listen to items added to a nested collection.\n */\n onAdd<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>,\n immediate?: boolean\n ): () => void;\n\n onAdd(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onAdd(property, handler, immediate?) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.ADD,\n args[1],\n args[2] !== false\n );\n } else {\n // onAdd(instance, property, handler, immediate?) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.ADD,\n args[2],\n args[3] !== false\n );\n }\n }\n\n /**\n * Listen to items removed from a collection on root state.\n */\n onRemove<K extends CollectionPropNames<TState>>(\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TState, K>, CollectionValueType<TState, K>>\n ): () => void;\n\n /**\n * Listen to items removed from a nested collection.\n */\n onRemove<TInstance extends Schema, K extends CollectionPropNames<TInstance>>(\n instance: TInstance,\n property: K,\n handler: KeyValueCallback<CollectionKeyType<TInstance, K>, CollectionValueType<TInstance, K>>\n ): () => void;\n\n onRemove(...args: any[]): () => void {\n if (typeof args[0] === 'string') {\n // onRemove(property, handler) - collection on root state\n return this.addCallbackOrWaitCollectionAvailable(\n this.state,\n args[0],\n OPERATION.DELETE,\n args[1]\n );\n } else {\n // onRemove(instance, property, handler) - nested collection\n return this.addCallbackOrWaitCollectionAvailable(\n args[0],\n args[1],\n OPERATION.DELETE,\n args[2]\n );\n }\n }\n\n /**\n * Bind properties from a Schema instance to a target object.\n * Changes will be automatically reflected on the target object.\n */\n bindTo<TInstance extends Schema, TTarget>(\n from: TInstance,\n to: TTarget,\n properties?: string[],\n immediate: boolean = true\n ): () => void {\n const metadata: Metadata = (from.constructor as typeof Schema)[Symbol.metadata];\n\n // If no properties specified, bind all properties\n if (!properties) {\n properties = Object.keys(metadata)\n .filter(key => !isNaN(Number(key)))\n .map((index) => metadata[index as any as number].name);\n }\n\n const action = () => {\n for (const prop of properties!) {\n const fromValue = (from as any)[prop];\n if (fromValue !== undefined) {\n (to as any)[prop] = fromValue;\n }\n }\n };\n\n if (immediate) {\n action();\n }\n\n return this.addCallback(from[$refId], OPERATION.REPLACE, action);\n }\n\n protected triggerChanges(allChanges: DataChange[]): void {\n this.uniqueRefIds.clear();\n\n for (let i = 0, l = allChanges.length; i < l; i++) {\n const change = allChanges[i];\n const refId = change.refId;\n const ref = change.ref;\n\n const $callbacks = this.callbacks[refId];\n if (!$callbacks) {\n continue;\n }\n\n //\n // trigger onRemove on child structure.\n //\n if (\n (change.op & OPERATION.DELETE) === OPERATION.DELETE &&\n change.previousValue instanceof Schema\n ) {\n const childRefId = (change.previousValue as Ref)[$refId];\n const deleteCallbacks = this.callbacks[childRefId]?.[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j]();\n }\n }\n }\n\n if (ref instanceof Schema) {\n //\n // Handle Schema instance\n //\n\n if (!this.uniqueRefIds.has(refId)) {\n // trigger onChange\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n try {\n replaceCallbacks[j]();\n } catch (e) {\n console.error(e);\n }\n }\n }\n }\n\n // trigger field callbacks\n const fieldCallbacks = $callbacks[change.field];\n if (fieldCallbacks) {\n for (let j = fieldCallbacks.length - 1; j >= 0; j--) {\n try {\n this.isTriggering = true;\n fieldCallbacks[j](change.value, change.previousValue);\n } catch (e) {\n console.error(e);\n } finally {\n this.isTriggering = false;\n }\n }\n }\n\n } else {\n //\n // Handle collection of items\n //\n const dynamicIndex = change.dynamicIndex ?? change.field;\n\n if ((change.op & OPERATION.DELETE) === OPERATION.DELETE) {\n //\n // FIXME: `previousValue` should always be available.\n //\n if (change.previousValue !== undefined) {\n // trigger onRemove (key, value)\n const deleteCallbacks = $callbacks[OPERATION.DELETE];\n if (deleteCallbacks) {\n for (let j = deleteCallbacks.length - 1; j >= 0; j--) {\n deleteCallbacks[j](dynamicIndex, change.previousValue);\n }\n }\n }\n\n // Handle DELETE_AND_ADD operation\n if ((change.op & OPERATION.ADD) === OPERATION.ADD) {\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n } else if (\n (change.op & OPERATION.ADD) === OPERATION.ADD &&\n change.previousValue !== change.value\n ) {\n // trigger onAdd (key, value)\n const addCallbacks = $callbacks[OPERATION.ADD];\n if (addCallbacks) {\n this.isTriggering = true;\n for (let j = addCallbacks.length - 1; j >= 0; j--) {\n addCallbacks[j](dynamicIndex, change.value);\n }\n this.isTriggering = false;\n }\n }\n\n // trigger onChange (key, value)\n if (change.value !== change.previousValue) {\n const replaceCallbacks = $callbacks[OPERATION.REPLACE];\n if (replaceCallbacks) {\n for (let j = replaceCallbacks.length - 1; j >= 0; j--) {\n replaceCallbacks[j](dynamicIndex, change.value);\n }\n }\n }\n }\n\n this.uniqueRefIds.add(refId);\n }\n }\n}\n\n/**\n * Factory class for retrieving the callbacks API.\n */\nexport const Callbacks = {\n /**\n * Get the new callbacks standard API.\n *\n * Usage:\n * ```ts\n * const callbacks = Callbacks.get(roomOrDecoder);\n *\n * // Listen to property changes\n * callbacks.listen(\"currentTurn\", (currentValue, previousValue) => { ... });\n *\n * // Listen to collection additions\n * callbacks.onAdd(\"entities\", (sessionId, entity) => {\n * // Nested property listening\n * callbacks.listen(entity, \"hp\", (currentHp, previousHp) => { ... });\n * });\n *\n * // Listen to collection removals\n * callbacks.onRemove(\"entities\", (sessionId, entity) => { ... });\n *\n * // Listen to any property change on an instance\n * callbacks.onChange(entity, () => { ... });\n *\n * // Bind properties to another object\n * callbacks.bindTo(player, playerVisual);\n * ```\n *\n * @param roomOrDecoder - Room or Decoder instance to get the callbacks for.\n * @returns the new callbacks standard API.\n */\n get<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): StateCallbackStrategy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return new StateCallbackStrategy<T>(roomOrDecoder.serializer.decoder);\n\n } else {\n throw new Error('Invalid room or decoder');\n }\n },\n\n /**\n * Get the legacy callbacks API.\n *\n * We aim to deprecate this API on 1.0, and iterate on improving Callbacks.get() API.\n *\n * @param roomOrDecoder - Room or Decoder instance to get the legacy callbacks for.\n * @returns the legacy callbacks API.\n */\n getLegacy<T extends Schema>(roomOrDecoder: Decoder<T> | { serializer: { decoder: Decoder<T> } }): SchemaCallbackProxy<T> {\n if (roomOrDecoder instanceof Decoder) {\n return getDecoderStateCallbacks(roomOrDecoder);\n\n } else if (roomOrDecoder.serializer.decoder) {\n return getDecoderStateCallbacks(roomOrDecoder.serializer.decoder);\n }\n },\n\n getRawChanges(decoder: Decoder, callback: (changes: DataChange[]) => void) {\n return getRawChangesCallback(decoder, callback);\n }\n};\n\n","import { ChangeTree, IndexedOperations, Ref } from \"./ChangeTree\";\nimport { $changes, $fieldIndexesByViewTag, $refId, $viewFieldIndexes } from \"../types/symbols\";\nimport { DEFAULT_VIEW_TAG } from \"../annotations\";\nimport { OPERATION } from \"../encoding/spec\";\nimport { Metadata } from \"../Metadata\";\nimport { spliceOne } from \"../types/utils\";\nimport type { Schema } from \"../Schema\";\n\nexport function createView(iterable: boolean = false) {\n return new StateView(iterable);\n}\n\nexport class StateView {\n /**\n * Iterable list of items that are visible to this view\n * (Available only if constructed with `iterable: true`)\n */\n items: Ref[];\n\n /**\n * List of ChangeTree's that are visible to this view\n */\n visible: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();\n\n /**\n * List of ChangeTree's that are invisible to this view\n */\n invisible: WeakSet<ChangeTree> = new WeakSet<ChangeTree>();\n\n tags?: WeakMap<ChangeTree, Set<number>>; // TODO: use bit manipulation instead of Set<number> ()\n\n /**\n * Manual \"ADD\" operations for changes per ChangeTree, specific to this view.\n * (This is used to force encoding a property, even if it was not changed)\n */\n changes = new Map<number, IndexedOperations>();\n\n constructor(public iterable: boolean = false) {\n if (iterable) {\n this.items = [];\n }\n }\n\n // TODO: allow to set multiple tags at once\n add(obj: Ref, tag: number = DEFAULT_VIEW_TAG, checkIncludeParent: boolean = true) {\n const changeTree: ChangeTree = obj?.[$changes];\n const parentChangeTree = changeTree.parent;\n\n if (!changeTree) {\n console.warn(\"StateView#add(), invalid object:\", obj);\n return false;\n\n } else if (\n !parentChangeTree &&\n obj[$refId] !== 0 // allow root object\n ) {\n /**\n * TODO: can we avoid this?\n *\n * When the \"parent\" structure has the @view() tag, it is currently\n * not possible to identify it has to be added to the view as well\n * (this.addParentOf() is not called).\n */\n throw new Error(\n `Cannot add a detached instance to the StateView. Make sure to assign the \"${changeTree.ref.constructor.name}\" instance to the state before calling view.add()`\n );\n }\n\n // FIXME: ArraySchema/MapSchema do not have metadata\n const metadata: Metadata = (obj.constructor as typeof Schema)[Symbol.metadata];\n this.visible.add(changeTree);\n\n // add to iterable list (only the explicitly added items)\n if (this.iterable && checkIncludeParent) {\n this.items.push(obj);\n }\n\n // add parent ChangeTree's\n // - if it was invisible to this view\n // - if it were previously filtered out\n if (checkIncludeParent && parentChangeTree) {\n this.addParentOf(changeTree, tag);\n }\n\n let changes = this.changes.get(obj[$refId]);\n if (changes === undefined) {\n changes = {};\n // FIXME / OPTIMIZE: do not add if no changes are needed\n this.changes.set(obj[$refId], changes);\n }\n\n let isChildAdded = false;\n\n //\n // Add children of this ChangeTree first.\n // If successful, we must link the current ChangeTree to the child.\n //\n changeTree.forEachChild((change, index) => {\n // Do not ADD children that don't have the same tag\n if (\n metadata &&\n metadata[index].tag !== undefined &&\n metadata[index].tag !== tag\n ) {\n return;\n }\n\n if (this.add(change.ref, tag, false)) {\n isChildAdded = true;\n }\n });\n\n // set tag\n if (tag !== DEFAULT_VIEW_TAG) {\n if (!this.tags) {\n this.tags = new WeakMap<ChangeTree, Set<number>>();\n }\n let tags: Set<number>;\n if (!this.tags.has(changeTree)) {\n tags = new Set<number>();\n this.tags.set(changeTree, tags);\n } else {\n tags = this.tags.get(changeTree);\n }\n tags.add(tag);\n\n // Ref: add tagged properties\n metadata?.[$fieldIndexesByViewTag]?.[tag]?.forEach((index) => {\n if (changeTree.getChange(index) !== OPERATION.DELETE) {\n changes[index] = OPERATION.ADD;\n }\n });\n\n } else if (!changeTree.isNew || isChildAdded) {\n // new structures will be added as part of .encode() call, no need to force it to .encodeView()\n const changeSet = (changeTree.filteredChanges !== undefined)\n ? changeTree.allFilteredChanges\n : changeTree.allChanges;\n\n const isInvisible = this.invisible.has(changeTree);\n\n for (let i = 0, len = changeSet.operations.length; i < len; i++) {\n const index = changeSet.operations[i];\n if (index === undefined) { continue; } // skip \"undefined\" indexes\n\n const op = changeTree.indexedOperations[index] ?? OPERATION.ADD;\n const tagAtIndex = metadata?.[index].tag;\n if (\n op !== OPERATION.DELETE &&\n (\n isInvisible || // if \"invisible\", include all\n tagAtIndex === undefined || // \"all change\" with no tag\n tagAtIndex === tag // tagged property\n )\n ) {\n changes[index] = op;\n isChildAdded = true; // FIXME: assign only once\n }\n }\n }\n\n return isChildAdded;\n }\n\n protected addParentOf(childChangeTree: ChangeTree, tag: number) {\n const changeTree = childChangeTree.parent[$changes];\n const parentIndex = childChangeTree.parentIndex;\n\n if (!this.visible.has(changeTree)) {\n // view must have all \"changeTree\" parent tree\n this.visible.add(changeTree);\n\n // add parent's parent\n const parentChangeTree: ChangeTree = changeTree.parent?.[$changes];\n if (parentChangeTree && (parentChangeTree.filteredChanges !== undefined)) {\n this.addParentOf(changeTree, tag);\n }\n\n // // parent is already available, no need to add it!\n // if (!this.invisible.has(changeTree)) { return; }\n }\n\n // add parent's tag properties\n if (changeTree.getChange(parentIndex) !== OPERATION.DELETE) {\n let changes = this.changes.get(changeTree.ref[$refId]);\n if (changes === undefined) {\n changes = {};\n this.changes.set(changeTree.ref[$refId], changes);\n }\n\n if (!this.tags) {\n this.tags = new WeakMap<ChangeTree, Set<number>>();\n }\n\n let tags: Set<number>;\n if (!this.tags.has(changeTree)) {\n tags = new Set<number>();\n this.tags.set(changeTree, tags);\n } else {\n tags = this.tags.get(changeTree);\n }\n tags.add(tag);\n\n changes[parentIndex] = OPERATION.ADD;\n }\n }\n\n remove(obj: Ref, tag?: number): this; // hide _isClear parameter from public API\n remove(obj: Ref, tag?: number, _isClear?: boolean): this;\n remove(obj: Ref, tag: number = DEFAULT_VIEW_TAG, _isClear: boolean = false): this {\n const changeTree: ChangeTree = obj[$changes];\n if (!changeTree) {\n console.warn(\"StateView#remove(), invalid object:\", obj);\n return this;\n }\n\n this.visible.delete(changeTree);\n\n // remove from iterable list\n if (\n this.iterable &&\n !_isClear // no need to remove during clear(), as it will be cleared entirely\n ) {\n spliceOne(this.items, this.items.indexOf(obj));\n }\n\n const ref = changeTree.ref;\n const metadata: Metadata = ref.constructor[Symbol.metadata]; // ArraySchema/MapSchema do not have metadata\n\n const refId = ref[$refId];\n\n let changes = this.changes.get(refId);\n if (changes === undefined) {\n changes = {};\n this.changes.set(refId, changes);\n }\n\n if (tag === DEFAULT_VIEW_TAG) {\n // parent is collection (Map/Array)\n const parent = changeTree.parent;\n if (parent && !Metadata.isValidInstance(parent) && changeTree.isFiltered) {\n const parentRefId = parent[$refId];\n let changes = this.changes.get(parentRefId);\n if (changes === undefined) {\n changes = {};\n this.changes.set(parentRefId, changes);\n\n } else if (changes[changeTree.parentIndex] === OPERATION.ADD) {\n //\n // SAME PATCH ADD + REMOVE:\n // The 'changes' of deleted structure should be ignored.\n //\n this.changes.delete(refId);\n }\n\n // DELETE / DELETE BY REF ID\n changes[changeTree.parentIndex] = OPERATION.DELETE;\n\n // Remove child schema from visible set\n this._recursiveDeleteVisibleChangeTree(changeTree);\n\n } else {\n // delete all \"tagged\" properties.\n metadata?.[$viewFieldIndexes]?.forEach((index) =>\n changes[index] = OPERATION.DELETE);\n }\n\n } else {\n // delete only tagged properties\n metadata?.[$fieldIndexesByViewTag][tag].forEach((index) =>\n changes[index] = OPERATION.DELETE);\n }\n\n // remove tag\n if (this.tags && this.tags.has(changeTree)) {\n const tags = this.tags.get(changeTree);\n if (tag === undefined) {\n // delete all tags\n this.tags.delete(changeTree);\n } else {\n // delete specific tag\n tags.delete(tag);\n\n // if tag set is empty, delete it entirely\n if (tags.size === 0) {\n this.tags.delete(changeTree);\n }\n }\n }\n\n return this;\n }\n\n has(obj: Ref) {\n return this.visible.has(obj[$changes]);\n }\n\n hasTag(ob: Ref, tag: number = DEFAULT_VIEW_TAG) {\n const tags = this.tags?.get(ob[$changes]);\n return tags?.has(tag) ?? false;\n }\n\n clear() {\n if (!this.iterable) {\n throw new Error(\"StateView#clear() is only available for iterable StateView's. Use StateView(iterable: true) constructor.\");\n }\n\n for (let i = 0, l = this.items.length; i < l; i++) {\n this.remove(this.items[i], DEFAULT_VIEW_TAG, true);\n }\n\n // clear items array\n this.items.length = 0;\n }\n\n isChangeTreeVisible(changeTree: ChangeTree) {\n let isVisible = this.visible.has(changeTree);\n\n //\n // TODO: avoid checking for parent visibility, most of the time it's not needed\n // See test case: 'should not be required to manually call view.add() items to child arrays without @view() tag'\n //\n if (!isVisible && changeTree.isVisibilitySharedWithParent){\n\n // console.log(\"CHECK AGAINST PARENT...\", {\n // ref: changeTree.ref.constructor.name,\n // refId: changeTree.ref[$refId],\n // parent: changeTree.parent.constructor.name,\n // });\n\n if (this.visible.has(changeTree.parent[$changes])) {\n this.visible.add(changeTree);\n isVisible = true;\n }\n }\n\n return isVisible;\n }\n\n protected _recursiveDeleteVisibleChangeTree(changeTree: ChangeTree) {\n changeTree.forEachChild((childChangeTree) => {\n this.visible.delete(childChangeTree);\n this._recursiveDeleteVisibleChangeTree(childChangeTree);\n });\n }\n}\n","export { Schema } from \"./Schema\";\nexport type { DataChange } from \"./decoder/DecodeOperation\";\nexport type { ToJSON } from \"./types/HelperTypes\";\n\nimport { MapSchema } from \"./types/custom/MapSchema\"\nexport { MapSchema };\n\nimport { ArraySchema } from \"./types/custom/ArraySchema\";\nexport { ArraySchema };\n\nimport { CollectionSchema } from \"./types/custom/CollectionSchema\";\nexport { CollectionSchema };\n\nimport { SetSchema } from \"./types/custom/SetSchema\";\nexport { SetSchema };\n\nimport { registerType, defineCustomTypes } from \"./types/registry\";\nexport { registerType, defineCustomTypes };\n\nregisterType(\"map\", { constructor: MapSchema });\nregisterType(\"array\", { constructor: ArraySchema });\nregisterType(\"set\", { constructor: SetSchema });\nregisterType(\"collection\", { constructor: CollectionSchema, });\n\n// Utils\nexport { dumpChanges } from \"./utils\";\n\n// Encoder / Decoder\nexport { $track, $encoder, $decoder, $filter, $getByIndex, $deleteByIndex, $changes, $childType, $refId } from \"./types/symbols\";\nexport { encode } from \"./encoding/encode\";\nexport { decode, type Iterator } from \"./encoding/decode\";\n\n// Reflection\nexport {\n Reflection,\n ReflectionType,\n ReflectionField,\n} from \"./Reflection\";\n\n// Annotations, Metadata and TypeContext\nexport { Metadata } from \"./Metadata\";\n\n// Schema definition types\nexport {\n type,\n deprecated,\n defineTypes,\n view,\n schema,\n entity,\n type DefinitionType,\n type PrimitiveType,\n type Definition,\n // Raw schema() return types\n type SchemaWithExtendsConstructor,\n type SchemaWithExtends,\n type SchemaType,\n} from \"./annotations\";\n\nexport { TypeContext } from \"./types/TypeContext\";\n\n// Helper types for type inference\nexport type { InferValueType, InferSchemaInstanceType, AssignableProps } from \"./types/HelperTypes\";\n\nexport { getDecoderStateCallbacks, CallbackProxy, SchemaCallback, CollectionCallback, SchemaCallbackProxy } from \"./decoder/strategy/getDecoderStateCallbacks\";\nexport { Callbacks, StateCallbackStrategy } from \"./decoder/strategy/Callbacks\";\nexport { getRawChangesCallback } from \"./decoder/strategy/RawChanges\";\n\nexport { Encoder } from \"./encoder/Encoder\";\nexport { encodeSchemaOperation, encodeArray, encodeKeyValueOperation } from \"./encoder/EncodeOperation\";\nexport { ChangeTree, Ref, IRef, type ChangeSetName, type ChangeSet} from \"./encoder/ChangeTree\";\nexport { StateView } from \"./encoder/StateView\";\n\nexport { Decoder } from \"./decoder/Decoder\";\nexport { decodeSchemaOperation, decodeKeyValueOperation } from \"./decoder/DecodeOperation\";\n\nexport { OPERATION } from \"./encoding/spec\";"],"names":["_convoBuffer","_int32","_float32","_float64","_int64","int8","uint8","int16","uint16","int32","uint32","int64","uint64","bigint64","biguint64","float32","float64","boolean","string","number"],"mappings":"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"}
|