From 2e7975eabcc4d1f99728d0ac06a2a93568a44041 Mon Sep 17 00:00:00 2001 From: Nick Lefever Date: Sat, 17 May 2025 16:23:45 -0700 Subject: [PATCH] Add technical documentation for RSNRU Summary: Changelog: [Internal] Adding a technical documentation for the Runtime Shadow Node Referece Update (RSNRU) feature. Differential Revision: D74943809 --- __docs__/README.md | 1 + .../core/__docs__/RSNRU.excalidraw.svg | 2 + .../react/renderer/core/__docs__/RSNRU.md | 61 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.excalidraw.svg create mode 100644 packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.md diff --git a/__docs__/README.md b/__docs__/README.md index 411b658b1440..74e531c6d6d6 100644 --- a/__docs__/README.md +++ b/__docs__/README.md @@ -45,6 +45,7 @@ TODO: Explain the different components of React Native at a high level. - UI / Fabric - Events - Shadow Tree Lifecycle + - [Runtime Shadow Node Reference Update](../packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.md) - Layout - Mounting - Native Modules / TurboModules diff --git a/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.excalidraw.svg b/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.excalidraw.svg new file mode 100644 index 000000000000..46f25b0e5e17 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.excalidraw.svg @@ -0,0 +1,2 @@ +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19aVfq2pb29/srXHUwMDFju75cdTAwMTarVt/UN+xRsVx1MDAwMVx1MDAxYvStXHUwMDFhXHUwMDBlpFx1MDAxMVx1MDAxNFx1MDAwMVx1MDAwMdtcdTAwMWH3v79zXHUwMDA1hZCsxIBB4z667z3jXHUwMDFjkOxFMp9n9nP+379WVv6MXvqNP/+98qfxXFyrdtr1QfXpz3/a11x1MDAxZlx1MDAxYoNhu9eFt6j338Pew6Dm/WZrNOpcdTAwMGb/+7/+6+npXHS1u6PGoFvtNK9QrXc3/mSj07hrdEdD+N3/XHUwMDA3/72y8n/eP+Gddt1+nvKD4+LT7fNzf3Q3YI/n5OCqUfE+6v3S5ECdTrs/bEzfeIZXmaHIXHUwMDEwZaRWYvLGiz2kYojIwFx1MDAxYk/t+qhcdTAwMDVvcoJcYiZC0ulbrUb7ujXyrog4Jf5PVbvXXHUwMDFke1x1MDAwMjx5ZThcdTAwMWH0blx1MDAxYmu9Tm9gT/ZcdTAwMWakYf9MT3ZVrd1eXHUwMDBmelx1MDAwZt365HdGg2p32K9cdTAwMGXgRkx/r9nudMqjXHUwMDE37+pwQ+F2/1x0/Fx1MDAxZGdvJ6aB16M+XHUwMDA1f+l1q9tcdTAwMTjam00mr/b61Vp7ZG9cdTAwMGLB029hT9gv1L3n8r/TM1xyqneNgn0w3YdOZ/Jyu1tv2Fx1MDAxYv6nimf+tm797W97f6jTJ0bfXvn39OyNRt07hGZcdTAwMTJrZdjkXHUwMDFkn3RRXHUwMDFjfHW/1/UkTUhcZo+MXHUwMDFiNT3VcFx1MDAxZKRr5F21We1cZlx1MDAxYtNHYI+2MZW8mS/z0K9Xx1x1MDAxZlwiiirKXHJcdTAwMTVYkellO+3ubfAznV7tdvr3/Mv3xf7vQ0n1fTtlor5cdTAwMWRIK1VcdTAwMDJcdTAwMTOmXHUwMDFjN538SfCdx3A6bVxm5Vx1MDAxZT1sP5HLnVx1MDAxNrnd68jnssqKzIWxNEYxR4pxXHUwMDE2wDC8giTVXHUwMDA2+4G6XHUwMDAw9v6j2ayZmpn+zmI88C69QlH4XHUwMDEwMWQxJM1cdTAwMGKaoCT/v8lnpp+ePvzLrZudUv367oFccs531zbvdl/KW5MvPiOl1cGg9/Rn8s6/3/7tfzOBXHUwMDEyXHUwMDFliVx1MDAxMsOM4URr4kBcdE2Oklx1MDAwYjE8vdK3L71Wu985bmh6v/1SzDpKXHUwMDE0XCJ0XHUwMDE2XCKcMKQpZiRLXGJcdTAwMDFml4JQ32eyXHUwMDAzkJvNcuPmXHUwMDEwlzf02fnZ4OL86mTT3P84gHDf31x1MDAxMlx1MDAwNIhcdTAwMTLaSKO0cFx1MDAwMIQlXHUwMDA3SO6ytbefM7RyetfOrVx1MDAxMn34mN9cdTAwMThmXHUwMDBlIFxiYy2VJJhcdTAwMGLBXGbDXGbrXHUwMDE5zHBJkFx1MDAxMDxkXHUwMDFlcsJcdTAwMTGFT3xWtTjNuil4wqCxgFx1MDAxYas0bryfkHohgjOiuPku9GRBvpnvqYRcdTAwMTVcdTAwMDA8bVxuXCLukG+eXFy+XHUwMDBmXHUwMDFmxLYwnYetjStSXHUwMDFj3lx1MDAxZLSvibnOnHzPXGKzoFxm0bCZxIlERmLjfz19UV5AXHUwMDBmgI3EueHynyzJVMtopiZEMcpdloxILsjD7Z5W1ctb0Tm6KVx1MDAxZZdcdTAwMWXMff5+N9uCbC1cdTAwMTmQjFmh8URZYaSoXHUwMDE0mTL4KciMVPrbXGI5zpzZXm2xYu7ldtRtXV4xcXl72zpcdTAwMWH9OHOGkUiQMCPA2ufUZc3I5CDZ2Gh3zstrm/ts83CjUbtqiJ219WyDxLK9YGJWWscgoYjIgFx1MDAxOH87SjTBVFx1MDAxOf1tZFx1MDAxZoeSx4t1fv5Ur3bJzeZ+W1a28ofn3WyhZHxQxbdcdTAwMDdiYzg4rFx1MDAxZJXXXHUwMDFh+41q7fXmPFx1MDAxY1xuhb8jXHUwMDEwXHUwMDA3tfaspjroXHUwMDFlMlx1MDAwZaLCuZjxXHUwMDBm31x1MDAxZjOGp1x1MDAxYzCNp4+ZhUTgN1xmOkM+6s/Csvtu6SuqucFCTE/os1x1MDAxYnBMoJBbXGL6IyDfXHUwMDE1XHUwMDA2nbzc77WDOJz+28pUZrz/mPz7//6n87dzYcn0Xp5cbuX0XG4hfHaqw9Fa7+6uPYKvdmiPXHUwMDE1/Fxuw1F1MFqFJ9nuXlx1MDAwN99rdOtcdTAwMTHveJ/KW3ZoNaohuYDPXHUwMDA134uB+dOObKxcdTAwMTY3XHUwMDBlTa799DA8vHrs1Fx1MDAwZVx1MDAxMsNcXJpZOI9dXHUwMDAwiqJAXHUwMDBlz3SGXHUwMDE3Jlx1MDAxOKdcdTAwMTJxJX8xXHUwMDFljXH9aYxLXHUwMDFiLObEXHRxYlwiIVx1MDAwZV6BgE+qaYLkL4N4SCztT24qkT9cdTAwMWPgJfXaz51vP7JKj5brW1x1MDAwZur1qV5IXHUwMDA2cI2ElFx1MDAxY4eMPmmQkuAyuvKZXHUwMDE4SCHgTU1QTsDVmqWGX5DPgNx8XpGDx8qk0aGYlafHQ0nOiVx1MDAxZWdcdTAwMWFcdTAwMWNcdTAwMWJpWFx1MDAwNvKZS1PkQcH0Xp7I5Fx1MDAwZof5zi6rXHUwMDBmrzrX9GX/kp1cdTAwMGZcdTAwMDebL6Jwklxi5lx1MDAxYyNKXHUwMDAzgVx1MDAwZVx1MDAwZuaMwK1R2KnLKUVSMzFcdTAwMTPom2pzxFQgVfpcdTAwMGL0XHUwMDE5oOc/XHUwMDBmdCGkYkKxUPbFU+eRhVx1MDAwYpwrYYPWviDG31x1MDAwNXSHZHovT2Tyh1x1MDAwM72caz3Jtd1rrFe73dfhXHUwMDAxOTzeO0tcdTAwMDJ0gTniYLWH9TmjSFx1MDAwNWpcdTAwMWV8OFc4wFx1MDAwMVN9jn5hXHUwMDFlXHUwMDBi89VcdTAwMTTqkzClXHUwMDE4XHUwMDA0OmSfe8CLTE1xQ1x1MDAwNKBS+zJTf1x1MDAxZMyDgml/Jlwi+cNRnte3Z43n293HWs7stlx1MDAwNjV2WTnvJ0I5XHUwMDA3lLOAZvZQLlx1MDAwNDJcdTAwMDH0+8JvlGC3Mlx1MDAwN1x1MDAwM0mrwJu/MJ+B+drnYc6UYWCDY5c2j7HbKVx1MDAxNvAxJshf653nwrJpf3xS+cORfj5oSUKrp+3CQeOl+VDYuy7cXHUwMDFlJyw5Vlx1MDAxMlxcdFx1MDAxNVx1MDAwZbVjhngwXHI/yahgxKg7XG7HwUjSUqVfcVx1MDAxY0rv/EiYr6fgnXNO4e67UM5IpM1cdTAwMGXumaZcbstFbPZ/QIkmXHUwMDE3kcFLXG5cbo9yjYWrkHkjec527bUyLKl91uLFp+3WXqFyMrg8yYo4u3O2Slx1MDAwMkVcdTAwMDaD6lx1MDAxZTsoiVgo3ZZq0nY+inlcdTAwMDeHVJiDg6LZYkD9rdX8XHUwMDE4KVRHIVx1MDAwNaiJaPA0sKtcdTAwMDRoMzlSSmpwdvj61D+uvnbad/W9g701Xcs4Ulx1MDAxOFx1MDAwYlx1MDAwN609k5lcdTAwMTPEl1vesFx1MDAxMFK0MGDmS5ZFoPxcdTAwMWRVQDy684fCXHUwMDExtGd5OoCylVx1MDAxYyi8X3/deqjUm3d7662HdrV5dN9sZVx1MDAxYijwtVHIrVx1MDAwNFx1MDAxMTY0XHUwMDE4Pvp+jIDFpDH29zhlXHUwMDA3Iz+mXHUwMDA2qGuGssFcdTAwMWFH6qFxc77Ry109KH5cdTAwMWT2TcJRXGKlXHUwMDE14tTlmnCJMFx1MDAwZVx1MDAxNLv7XG5cdTAwMDSCXHIk0yogirRcZsjBr28yIZ7tT/sm1lI0hDkzh3GBRoBcdTAwMWbBXHUwMDE0/7VcdTAwMTVAYaG0Pz5xnF4gXHUwMDA0zp9cdTAwMTB/qOzeb6xcdTAwMTf1sEhvTs6bXFxtXdL2SzKMU1x1MDAxNLSNxlx1MDAwNUBcdTAwMDLJqHZnisOFpNO8oVx0N8L8YnyC8cKnMU60IFx1MDAxYUtcdTAwMTlu2bKfilx1MDAwZUCAapdcdTAwMDJr/teCPOeQS/vjk8hcdTAwMWZcdTAwMGXz1cFcdTAwMTHhXHUwMDA3jdXH9adh4axQaO9cdTAwMGZqXHUwMDE3iWButLvTXHUwMDA30Fx1MDAxZpVP8NXQ+1x1MDAxNThdxjSDv1x1MDAwM9s7KcRcdTAwMTaNYcJQ6pxkXHUwMDEw3dVgnVx1MDAxOc1cdTAwMDVnf21cbmH63e3PVFx1MDAwZX84ouODt1x1MDAwMVx1MDAwZmJcdTAwMDbSnLNQKa5nnFx1MDAwYoWCNvY7pFx1MDAxOdFIXHUwMDExrrkzScgkXG5cdTAwMTZcdTAwMDRmXHUwMDE23PWefahfiu7dT6Pb5nOxXHUwMDAwa8tcdTAwMDFuKaKjelx1MDAxY1x1MDAwYq20XFxOgb5cdTAwMTbTm/xt4Fx1MDAxNlx1MDAxONGA7Nmf3FQkP7qES7THlyCI4TFO0uRcbt9jf5tHVFx1MDAxOFx1MDAwMzp2WoqVs17tYej5yVgoIeDrXHUwMDE5YjvKyTRBbGW02offXHUwMDAxpa1cdTAwMTRjhmhmXHUwMDE0xlNcdTAwMDHwQPQ8e9KQ1M0wWNR54zOXvvPaXHUwMDFjLpFcdTAwMDZUXGaIsOFcdTAwMTJMUFx1MDAxYTqwRFx1MDAxY1NcdTAwMDEmmGFcdTAwMTTD7/C5XHUwMDBlPFx1MDAxN7FcdTAwMDY5sdG56j0lXG6IxKdcdTAwMDFiOdeTR6OowcJcYp+7PFx1MDAxOZ1cdTAwMDGmueJWhfs78Sf0S1x1MDAwNTJUgz5lUtrCnqm29vfDwSOHa4wv4qv9+eXiKVx1MDAxN+99mou5MFxcYe40tGRMjbXUWmNcdTAwMDNcdTAwMTj4a7lYMVx1MDAwNFx1MDAwNzJUXHUwMDExgzlcYqDyfzxcdTAwMTeSz1x1MDAwZok5Uui961FlXHUwMDFikIAyuJFcdTAwMTKApdRXsHT8tJ5Z1lNCYVx1MDAwMDu1XHUwMDA15oZcdTAwMTDt+60x6SlEQVwiXGbF0mA7oWA+0kvE0vGp61x1MDAxOa3CmdaMKVx1MDAxYlx1MDAwNbRTLVx1MDAxY6dcdTAwMTVcdTAwMDJ74Vx1MDAwM8016FYs5jruXHUwMDE3cXR8dD2Oo4XEyMiAjWtpR2CBeLBcdHVcdTAwMTLSXHUwMDEyXGYxXHUwMDEzaGyZpig0XG600PyS8ZSMi58nY1vSPJNcdTAwMGL1kbGONIyBoVx1MDAxNCFLqpvLXHUwMDA0XHUwMDE3U4NcdTAwMDImMdXIvE20+OjTLpm2PzliJrHdryDb+FlcdLPkpYGyMOOGUyVcZpV+Klx1MDAxZNNcdTAwMTdB9i1qhFx1MDAwMWPUcG38RmhKbFx1MDAxYp/VXHJoXHUwMDA3SYmGP1x1MDAxMsxBMOdF6MBcbvQlSKnVfJRzxTNJt/FcdP/4MFx1MDAwNFx1MDAwNYF0NFx1MDAxZWlcdTAwMTAyN9VqR2uRP1x1MDAxYiy0mWXvX7Kdku1+XG5NR1x1MDAxNJxl7m4vVDzG9MXghlx1MDAxYaGW0l6YXHS6VTzULGt/cj6h/JB0XHUwMDFk0u1dg6n3RNtXcG78XHUwMDEwp1x1MDAxOc6lklx1MDAxMDveT1BKXHUwMDE4kGuIwbhnU1xuZaONXGboblx0UYj4grOAfStcdTAwMTioXGJtK1xyjWJcdTAwMGVcdTAwMGKX2EiFYFx1MDAxY4NlQFx1MDAxODhcdTAwMTdqrlx1MDAwM39cdTAwMTHlXHUwMDFl3OfUyVx1MDAwMPPH12J1SHCdrO2oYphyR43n0SzjMkVcdTAwMTBcdCZtvFx1MDAxMdVg4IZqL95Z14CqXHUwMDAy9DLQrViBSTBcdTAwMDXxhHpFXFzp0D+XcVx1MDAwZtyMO4vKSeM2XHUwMDAxv4swd+d29FxmQlx1MDAxMGNNqc7UfFx1MDAwNk/yLDZcdTAwMWLV2mhlp/w/3c32VWPge5y97qjcflx1MDAxZNfTzby6Wb1rdzyfa+Zq+U772t6JP7WGXHUwMDFk6z5Tszdq16qdyS+Mer4+qVx1MDAxYVxcsdruNlx1MDAwNuGn1Fx1MDAxYrSv290quPBcdTAwMWactfow6pVcdTAwMWHD8WlHg4eG/440tqfNkG/0XHUwMDFjMWdl7XLvtLShntdcdTAwMDer22v4+ql9ojaSYFZhXHUwMDA2nMQkw1hIXHUwMDEwkKl8j4GrwmmZaVx1MDAxYVYgkFx1MDAwZkNcdTAwMTXTisJvOIymX+Q6kXuYXHUwMDFjuVx1MDAwMFx1MDAxNHA9cHiauv1Kilx1MDAwNl+dNmJjjkF7Zmniwlx1MDAwNLf7K+VWtd57Wtnv1Vx1MDAxYv/TPVx1MDAxZTRcdTAwMWHZXHUwMDA2b+yB00Fwk1x1MDAxZe7ccbLRvH9hXHUwMDE3cnhW2F7vO1oyw1xiXHUwMDE2tozcXHUwMDE1VqJcdTAwMTKjXGLkXHUwMDEyUNSRVa+/kHVB9mhcdTAwMGVlKyWmhmPXKCTHq1x1MDAxM11cdTAwMGJmIWYqm5hcdTAwMWS2qoNG/bI/XHUwMDFhrIx6/9NcdTAwMWTDwaLBXHRcXF89yLdcdTAwMDJ35tQr7mPPwHf2yyfDb4KCf1x1MDAxMlMgXHUwMDAzslwiNFPOgv9S8oL/XHUwMDA3evZ411x1MDAxOeZcdTAwMWLn99eHp3cleXxOMlO2XHUwMDE0MVx1MDAxY5cyXHUwMDA0zlx1MDAxMCZcdTAwMWGcXCJcdTAwMDKO6VxmfSliXHUwMDEw0ZQo+Fx1MDAxNSOwr1x1MDAwYi9cdTAwMTMjn8ElJYZcdCWnzy0rM59cdTAwMTVcdTAwMTVglWm/XHUwMDE4L6mRJaZyW1xurjFl1DW8vJxcXKyLj9dcdTAwMGadwVxy8CnZe1x1MDAxNk9cdTAwMDfPN1Utsy7WYFx1MDAxN1x1MDAwYskp2GBcdTAwMGWxtuFHzlxiwebzYp3yvlx1MDAxN4Y5XHUwMDE33HybSE8+4+hq6Z5cdTAwMWWIPbpcdTAwMGLMLobDtatKX4/WblLqalx1MDAxOVx1MDAwM8Z8XHRgXCKroFx1MDAxNZbgpDvVwHFyvFxmd07POjJPnoejk2bv+Wj7frSTyzpeXHUwMDE0XHUwMDEytuTBuPCihUGacUFcdTAwMTRcdTAwMTFcdTAwMTnDi1x1MDAxZFx1MDAxY8GN4ZnsXHUwMDAyu15t5ysnr1x1MDAwZkc7XHUwMDA3nfy66p7v3Sn14/DCSHTU32hcclx1MDAxNoTELlxyc5JcdTAwMWMxJ6WLwfEuvVx1MDAxMXhjb7d/sEsudm5cdTAwMWKZQ8xH61+YITbbpZg0Llx1MDAxMElcdTAwMWJN1+konfQ3wVBAXHUwMDFlaFx1MDAxZPFdOMqCpFNcdTAwMWHpXHUwMDE4Mo9cdTAwMTfdXHUwMDFlwmlyQX/eerpWr31WKm3frlx1MDAxNVx1MDAxOaP7o+1S5lx1MDAwNH1GqrlgNldcdTAwMWJhSmlpM7yCXHUwMDAwO39eNaTvIVx1MDAxMFx1MDAxMFx1MDAxZlx1MDAwMCP7tolcdTAwMTNZXHUwMDEwa/DgXCJcdJxcdTAwMThJsXEvuDtLLteS7pzfdE9N4a6/uXv+uFG76DzuZ1uurcmjXHUwMDE1sZTs8HxccpFIcVxmbJ45k0fC08pq3/vqXHUwMDBioewgt3nRODm62Tp+2aHFau7HWTyURMf0XHUwMDAxTOBRO6dcclWS4+VBnrLXjZ19UbmuXuavh8V7U7zPNl6sXHUwMDFlMHbAvJBOvGhEXHUwMDE0t6Zg9lxcajg1+C4mi4C52znu5avty4tScf9ulM+VXHUwMDBizNe0OSOw31xymNnGUZ96iU5dS2Fnc/lXL0/Rcp5cdTAwMWMtW5e9+lx1MDAxMTHXRbNzcDrM69frs9fTbKNcdTAwMDW8ZURt1V9EXHUwMDAwXG7QXCK0YmLZvsCca3feIVx1MDAwM1x1MDAwN1x1MDAwNthcYv43mE2+e7tIQ2fCqqt5Wj4n7337XCKbhVx1MDAwMG+iS1WMYVx1MDAxYbvxfpFcdTAwMWPv3dNcdTAwMDdeVevbz6WN8tNBrXPOXHUwMDA3Z+Xs490uWJTE6ftcdTAwMGKNXHUwMDA0t3/kkr2k+TbwvMOdXHUwMDEzSo35hftPgvv8S21cdTAwMTZcdTAwMDN75ORNLZmSXFy5sF5NjvXTxjCHT25O5XF71K00ti+2SFx1MDAxZGdcdTAwMWTrXHUwMDFhgcvMRYQlLJCy/Vx0S8+ZzreI531cYpRcdTAwMTDAz8b3mV+oZ1x1MDAxZOpcdTAwMGJstllcYuvR24Pt6iBfd4pcdTAwMGbqV8mhXsL7+zf5mjqpPG3e5m9cdTAwMWXLYv/xKONQV3DrOVdup1creFx1MDAwMIrQ5Zvx8y7jeVx1MDAwNztcdTAwMTgkylZ2/4L9x4B9ge02XHUwMDBigV1FXHUwMDE3wUkmbM+yclx1MDAwNblqyfGev3jZX90u1Cur7YfdVuuV0cung2zjnTNup/5FqHatNFJcdTAwMWGMnqUnO+ZcXMozseO1ppJr+mvH/yi8z7nmZiG4R9vxhFGFMabclcSvJ4e7fL3TL0V6sHNZvlZnJ49nXHUwMDE3R1v5jMNdXHUwMDAx3Fx1MDAwMeucOXNAmNjhXHUwMDE0NJVcdTAwMWPQR1G6ubbzvOfsJVA1M79u+1x1MDAwZoL7XCLbbmJcdTAwMDFcdTAwMWZXuWN48NVJpdt4XHUwMDFjicuibySH/MCUR+d7e2ynf9Yp3l7U9rdcdTAwMDdccpVtyGstXHUwMDEwsF1UYJ5cdTAwMWIkXGKmRqfgvKe9PUNJO2NcdTAwMDa8kW+C++Qz6ZaG/mfcdWvr4rXDy1x1MDAwZrt33dWr3CC/d7NFNlO4br6zn7+6Wr9+KOf1YLBTblx1MDAwZXaxTHbdd1RGk59cdTAwMTS2rGJcdTAwMGXyW1x1MDAxNOBcIrohn4KQXHUwMDFiQpyh+GZyhDd2u0e12kvl9GaztNZq1lq111xcNetcYueISlx1MDAxM+Wzg73FqF2RKsDMz1x1MDAxOMIxnFx1MDAwZVRcdTAwMDDJYqb6XHUwMDEzxayxSNyprVx1MDAxZtS2XrdOZbkzOlx1MDAxY+RGLbC4UrhubjR67LB6e69Vaa/RwpraJyevqSFcdTAwMWNcXHTf81tcIsKjS1FcYmFcdTAwMThzXHUwMDEwXHUwMDE4l1x1MDAxMr9OXHUwMDBl8Z3n/cE9fmxcdTAwMGVyd6tcdTAwMTdk44x0Xu9fMlx1MDAwZXHhWVFcdTAwMTG1W9qupmB2qyrVmYO4XHUwMDEwTHKss6jDP1G8XHUwMDE1i0SSr2w2Xs7v26XLw921fvfgPl9aT+G6XHUwMDFiLzeXYqd6w5uyrdVcdTAwMDBf5ltcdTAwMTel1Fx1MDAxMG7AL/yK/i1cdTAwMTFTPmOD/jZcdTAwMWHlXHUwMDAweCs5wOlj7rSwcVq7a92/qpE8PCC5QSHbXHUwMDAwN1RcImVcIvtRtESGg21jcPZ0uMQ2nPB9PYlxiPlEtVk8XHUwMDEySzvPsrO588w3XHUwMDFm6KbsnHW3VtPaMmknIDMp00JiVHzMX9JcdTAwMTmAoTB2bLFmLlO6nVx1MDAxY4aiWCk9re2Zbq2yS3dcdTAwMWL93Yv+c8a7g1x1MDAwMV92w6Rm2GVKK0ORbVx1MDAxY15uXHUwMDFi5bwroyaKllNOtclk5b+yy17nkGjfjf2rg2NcdTAwMGJsYlpcZuwm2qpWttGFS+lSujfJ0b5/dFg+PCrsvL5cdTAwMDBzcLaxfrB/tJ1ttGtjXHUwMDEwpsxOfHN2+lx1MDAxMCTTmlx1MDAwNVx1MDAxMIn2ubdHTbYnYLCWsMliWcsv2t1oX2gl04J4j1x1MDAxY1x1MDAxM0xcdTAwMTmllPlcdTAwMDaZ++B+m1x1MDAxY+5cdTAwMDfHg83VQnft7IGc7HZcdTAwMGLFm7Na4TnbcDeExzX2XHSNbFxibbnKPeFcdTAwMWGpN5BcdTAwMWJwXHQk8a9I+Vx1MDAwNXnWQZ58NVMsslx1MDAwM5M0fVx1MDAxM8B5dGJbXHUwMDAwhYDl7oyBd+YpR4/LbXz3LK2owjWGXGbQXkQ9Otj1y1x1MDAxZoBCXHT4XHUwMDA30jBcdTAwMDHPgHE7WThcZnZuRzpcdTAwMTmpXHUwMDA1uM1cdTAwMDJ+ccrTb5hnttJWXHUwMDEzMb1ccpnBPLf593lCRFGYj1x1MDAxYXxcdTAwMWI/eGclsC6ISU6wXHUwMDFk4MpcdTAwMTTGfo3q21x1MDAxN1x1MDAwNDdcdTAwMTJuNVx1MDAwN1x1MDAxNvXjMq1BvbkuO9k+PH9UlUOsaXNtbW378MV9Xls0KaRcdTAwMWTdZMCc1Cy8LUggbefj2SYkZuCbzTfKPWV+XGbyT9ZcdTAwMTZcXEVDzbtQXGJlYfadfvNcdTAwMDRDij9kZVx1MDAxMZ6V6Ws518IurnJZXFx3yVk5Plx1MDAxZpVRVpZcbmFOlNJcXFJpiGPMjpRYXHUwMDE5YcTyWFx1MDAxOaxuwpnwpubYXGaSY9gzXGJcdTAwMWUoXHUwMDEwrVxykzbu5Zu+PmlcdTAwMTCUTCiuSFx1MDAxNmlZXHTMl0nL8fOdfDRnN0BQpmxRXHUwMDBmIXZcdTAwMTCFYyna7H4gX6AzPVpmhduLnXVezW3fli+fm/3n/CjXjlAjWIN9LW05oFx1MDAwNlx1MDAxZZEqPPBdIFx1MDAwZVx1MDAxYdlcdTAwMThcdTAwMDW0hdV0XHUwMDA12d9Hy3YoP8Ng1oOKgi+MZzmVXHRLznaaznjXXHUwMDE1+5CjI4E3vl5cdTAwMTBzy+ZoXHUwMDE1nXhS9lx1MDAwNFhjXHUwMDE3RXeTU3R8uiGbXHUwMDE0zVxysblcdTAwMWR4XGbOklBcdTAwMDF6XHUwMDE2XHUwMDFl5HInoVx1MDAxMWmQXHUwMDEyXGb0NbfLY4iLokHhw/ORzO46XHUwMDEwxLdMcZqIgkdcYuyDM1x1MDAxOFx1MDAwMFx1MDAxN5j5Q7DpU3T8fI1cdTAwMTnKXHUwMDAzfcuA6+BmXHUwMDAyMjFcdTAwMGUzNEHaTlaHO1x0tFx1MDAwN1x1MDAwNqv0m9YpUbTgt03ztNW42GDH6rZ1tdfaPl+NoGhtJ55cdTAwMWGr4+z0XHUwMDFhXHUwMDEyOi9cdTAwMDdbj1x1MDAwMCN5lVx1MDAwNkpLNtdxf1x1MDAxMkNrjbSmwVx1MDAxZViC4VWZyGyOXHUwMDA2mvduXHUwMDEwYstn5MhcdTAwMWMksfVq4NBcdTAwMGLXoKZeckqOr/HIJiV7sVxmI6MmNYFcIsZcdTAwMTL0Zlx1MDAxYU05MbFcZoLAXVx1MDAwNWBcdTAwMTG741x1MDAxMzzpMCVzXHL2kzs9wSjV4H99W9lPnLlsXHUwMDBiXHUwMDBl5yllm5eL42eDzXCbtYqEdfqpXHUwMDAw/0L4bct341x1MDAxM1x1MDAwM1x1MDAxZcHzoMqu2Fx1MDAxNUug4rXK+mUhv1HZrvRla/8oX1p93CxHULFcdTAwMTVJTjmoXHUwMDA2uJUghK6dx4LCl7LLkbD1vf9aLlx1MDAwNva0XHUwMDAxx9D0XHUwMDExXHUwMDFmKD40kCMxNr6SXHUwMDAyrvZcdTAwMTadXGIpKCi4lOh4dp2Df65RdIckXHUwMDAxfSEk5y427idn48rNy6g+OC5cdTAwMWbw69ftys5hd2utuZt1NsbwlEhUiyQoSiSAq1NpiY5k4/n2Vb13S2Hwa2k66aOZN76mL2runSz2XHUwMDBlRq48+uFcdTAwMWKXPsIueNmR2KVKYm3jpFx1MDAwZezeJ8cuKVx1MDAxZT2tnj9g3Xt46lXWqoe9rVx1MDAwM5Jx7GpibMbdXHUwMDA23cFWUtN11W/Ytcu9XHI4XHUwMDE2y6zwmHNl1cSAXHUwMDEy0nCMUzCgXHUwMDE2x+7COd7FsFx1MDAxYrvx6G/YuvRcdTAwMTGKJYvMXCJIO35b+MfYTEE8SFx1MDAwZeKSLN+f7pbz4rzd3zfnla2DVind9qb0QSw4QyxycK20XHUwMDFip+ymoaWWaVlcdTAwMTBcdTAwMDOA7WYr7P24UrshXHUwMDEwXHUwMDEzo8BsS2e5xcIoVtZsmKec2IXiZMuVPKmJWtp0Nqj2+1+vkpOf59NLmdpcdJLCXHUwMDEzXHUwMDBlXHUwMDE4NGqjsbzPXG67IWimvNcrPGa2O2BmqOW7YCqMrHdogz9WLH35qalyoVxiv+3r9USXxOBtXHUwMDExzFxc0Sa9ukqVRD5R+7XgqrXhXHUwMDFmJ+rCwYf3tMfUa/UtZ1x1MDAwMn+NhjpU7SNcdTAwMTCRxFx1MDAwZVx1MDAxOCWYMrPIstPfXHUwMDBl5fF13/7to1x1MDAwZWXmx/NcIj1cdTAwMTXjg75cdTAwMTZZvvuijnKt+sGR0re3/bvdgzDAQy1QVtDAXHUwMDEyR4LPhlxy3lx1MDAxYfFlaD3iO8ZcdTAwMDH9VFx1MDAxYVx1MDAxMdFcdTAwMTJgp1TPvPW7QXFcbutRUlhHL4inxkZhaFxiwH9id6HaJVx1MDAwM8xcdTAwMGLtpI3rT+DvY5xcYtuCNs/Sxlg716Hj/IWM0TePMFxmxp5xXHUwMDE2Mj4kt3bjXHUwMDBiXHUwMDAxMlmkLFxmRVx1MDAxMjxFXHUwMDFhNlx1MDAwMoxCNDxcdTAwMTknXHUwMDA1hZ2KLTHdT2XrZNhy6lx1MDAxN8PKN1x1MDAxMy39f0frPVx1MDAxM9H1XHUwMDExXHUwMDFjXFyfiNm3j8nxuJt/2dq+Xn2lJzebl1x1MDAwZifdvZtcIilmRsW4XHUwMDAxKbFBXHUwMDFju1S2xlx1MDAxMknK8Oy0+TS9zjlcdTAwMTX/ZKpcdTAwMDa4w5KLTO5/+MT0i1x1MDAwNNqLaqZTg0q89mKRXHUwMDAxV1xuuksxQ4UrVvOUXHUwMDFjLfGJucxqL+LUXnZvXHUwMDE2scXNn1x1MDAwNssytVx1MDAxN1x1MDAwMctDq5m1Z9nRXstcdTAwMWFXsfyxXHUwMDEyX7K1kUfWklx1MDAxOEm1loK6kpfPyfGYyz3yXHUwMDBiunYrcoXNzvrN/cWo/Jru0sZlaC+NjFt7KYLglnBcdTAwMGZcclx1MDAxOdJemklGtFbfVcVcdTAwMTeHlE9cZnZJoLzgOfjmXHUwMDE3LlN5KVx1MDAxY+l6MbBcdTAwMWRcZnHv+3pJjpX4+r5M6i4pXHUwMDA1slpbhXSX4XbPaXA8ceZ0l2G2zHo5zaKfVF3LmsOSK5bN6Va71NxcXC3fXHUwMDE39/frm4XbSlqAVDZr+1x1MDAxNaqLk0jHXHUwMDBiXGZcdTAwMTKhgb6Zy5Z8TY5HiU93h6NDdbRRz+3dkZf6U/OwlXXdpaltm1x1MDAwYvhX46p0glx1MDAxOJaSz5ZcdTAwMWV+u+7i4IBwSmVcdTAwMTZ111JHXHUwMDE2gVlcdTAwMGZW/2ehkiS+XHUwMDE5VVTsXHRcZpdIqXGWdkZelOSIy9nA2aTQlVx0xEXk6HmFXHUwMDAyK6R+o+tcdTAwMTNcdTAwMDK6wvjPwsL7vrGDUFx1MDAwM4hcdDe1eyZ9JC+Ch801g4eWgFx1MDAwMYMwmfkyYYdcdTAwMDX+z1x1MDAxNmrVSLe8lILIXHUwMDA2jFx1MDAxMe91hYKTgdxcdTAwMTdwyfXbXHUwMDA1ovZlTb9gsjrcj2uL41NlKzOdg1x1MDAxOGxcdTAwMWL7jTFcdTAwMTeSKZ9OXFx5ry2207eEsUNjXHUwMDE5XGKvlGS+To9E1dDxXHUwMDEzvmdPLLhcdTAwMWG7lsB+mDFcdTAwMTY6sEDU1vFcdTAwMGIphNFSczLXeT9V65ykIDhJRC6Wb8EmXHJxLTycIGVOqVx1MDAxNtteyohcdTAwMTmDVCMh9OzKn1+y9ZEt+TTZclx1MDAwMs6DoOFNOPZDKnK0NlHGzlCgPp8wNbK1jfHfT7ZcdTAwMDRcdTAwMDQzsFx1MDAxYdZ7XSNcdTAwMTZcdTAwMWHEXHUwMDE2Rbdh2fZen0r1V1x1MDAxMG58hmWWvuDIglx1MDAxOcVcclitdi5KiL7AmpJcdTAwMWPeI8RIo1x1MDAwNZ2ZsZFcdTAwMTLfxs9bXHUwMDBm8C24vdworTnnvlCJTz9cdTAwMTgmNWg8SeB9mkm2jVx1MDAwZiHFW7egTnRgVNz7+OeAkzSdLsfgrlx1MDAwNVq0/MYtw4Htqb+M62NcXPp5xqWKXHUwMDBi21x1MDAwZuRiXFxcdTAwMTa9flAyreTMTMa0XHUwMDE4l1GK5ynwWFx1MDAxMuNigaQhM1x1MDAwZbz3OkUsQJZcdTAwMTF865Bs71x1MDAwMlOZ/lxuvo3PXHRcdTAwMDT4XHUwMDE2XHUwMDFiwYRcdTAwMTBcZlx1MDAxYsNcZsP+yVx1MDAxN2+d1+nza/ywe99cdTAwMDExXCJwPzk1XHUwMDE4+FVcdIPD/EqQXCJS2jH0dtVcdTAwMDbD86mDL1wi2Pg4R1x1MDAxY8EqipFcdCyR9aJNkode97fJXHUwMDFhRaV7fifzPJbf6EFcdTAwMDS9sk/TK7hUWGCCXTW3NKa5XFyCP1x1MDAwNmyIl2DRXHUwMDEyXHUwMDBl1lIm+JWp8NqtXHUwMDFjR+/ZwFx1MDAwZlx1MDAxOdYh2t4lJlL9XHUwMDE1XHUwMDA0XHUwMDFiXHUwMDFmuJ4lWFx1MDAwMsYhXHUwMDEz2o5ywfC9XHUwMDFks3woXHUwMDAyM1x1MDAxNkvbr4kx3IYlXHUwMDE4tPHLXHUwMDA3Zlx1MDAwZmykZMrWf8OZXHUwMDE15uFcdTAwMDCCQsKGLeHI4ChcdTAwMTmM51x1MDAxYpb0RYxcdTAwMWJfuFx1MDAxZMe4dlx1MDAwMDNcdTAwMGZs9PbitUKDd8Ld4VpcdTAwMTOzXHUwMDA1nIGKXG6MUv1lXFxcdTAwMWbj8s+XQyutiJipa/Z1kMfMJjW2g5oquYSIrVx1MDAxMDxcdTAwMDMmbY7YcEFgS4b3xlQqP7yGS7zf3kChqVx1MDAwMstj3cRRUM8pXHUwMDE3UoP7aeBcdTAwMWZMOazG9Dk28dzNnFx1MDAxZI0jmDJcXFPOXHUwMDA05dxl1cpg5Cc73Fx1MDAxYV9ZXHUwMDFjx61cdTAwMDZTpJzhXHUwMDAy0N/BgqApuypEoveuy3Dvyi+9+uhVfJ5ejYLbL3V4OYt9pNE9/vBcdHDI2DLY1c5FXFxoumTK7FxuXHUwMDE2rXJcco2lXHUwMDA0vc3UT8CuYfFcdTAwMWW/MZXsr6DXxEFPXGbmkWZaaao1XHUwMDA2S9B/7OXRa+L5mUCvwPtcdTAwMDZMUzBktSZMhVx1MDAwN1x1MDAwMtmAzvj52NGRhs+Xs/uqoEFsXHRsrFx0q8CjXG4u8PBo1uhwuHZcdTAwMWE2wCH3bMaKXHJux/6lWVx1MDAxZs3Kz9OstFx1MDAxM5e0fz6Zz4plkYFcdTAwMDNtV9Rj/zbDtGjWXHUwMDEwXCKyQbNcdTAwMTQ5VpTkqEE6tMkgimZcdTAwMWTS7b0xXHUwMDE17K9g2TlCn+DPgFx1MDAxYmGkwpRK6ig9WFx1MDAwMssmnrtmjVg76o9cdTAwMTApbVx1MDAxYZaocKAgk7mu+OrMWOOVc5AgPZu38mKxXHUwMDE4NHWgSMCf7OKRsVi4YvC9X1L1kar6PKlqbqSg1FnLRXxcdTAwMGYs1C9FhVx1MDAxMGBoTj+XXHUwMDFlq865SnFZrEpcdTAwMTQyRIWmXHUwMDA1Mo1w4tCAQ7ztz1Sw0yTV6LU8n1x1MDAxZelcdTAwMGJ8xlx1MDAxNVx1MDAxMdxOXHUwMDA1N5hcdTAwMGJtwnzLkWHjnEsmrcYk/Ugkclx1MDAwNVx1MDAxN1HY2PUlPiryXHUwMDAxUSev6q6qXHUwMDAzOrwvlUj1Zlx1MDAwZtdfXppbm82M97fbXXs2LsHcKzapZkhcbq0m41x1MDAxNHngZHNx82hQ7Vx1MDAwZfvVXHUwMDAxyGi4xJtcdTAwMTNcdTAwMTQo+fFZ4Fx1MDAwNrk3clx1MDAxMUK414SRvcG2hlxuO1x1MDAwNmtcdTAwMGWyW1i0VXSrncHEm7DrkmyTXFyyuy+ng6dic7taXHUwMDFhXFzc6/XChrhrlDIv2dSGXHUwMDEyXHUwMDAx2K5cdTAwMTVUTHBkXHUwMDBiqSZzyj4l2dFLnFx1MDAxN5JqUNtagYWZxcaFXHUwMDFk3TztVrA6eLm5qK9dXHUwMDE1t45GpWefXlx0WZKTdz5uXFxIXHUwMDE5M1HrXHUwMDE4WUwqmlxuZovZXftcdTAwMTiv8GZyxFxcr5Hb7vPtSbH+enhQLGzfk729UcZcdTAwMTFjtzhJI7iOQFxmvFx1MDAwYv8wOlxyxMTqXHUwMDAyXGagXHS0pvu7fYKIeodccie2+CB721x1MDAxOedcdTAwMTfr+c3An7mdMVx1MDAxN37S3svTh1x1MDAxYzaiXHUwMDE3gjw1MalQaa0/Rlx1MDAxY9NUrvBWcsibysljt9AuvFx1MDAxNndcdTAwMWFHjatrWSv10lx1MDAxZFx1MDAxMJF+U5+HebjPUjm3sHKb5/Tvm1km5kWg9tWf6OKBXHUwMDFlhomm5MJcdTAwMTZiZG9cctgv5mOWrONQXHUwMDFmVW76jOdEfIxhLGIydIJxI4lrXGL3XHUwMDE13kuO+VZdlds5cX+V2z5vU9FcdTAwMWNcZoftSsbVPKdcdTAwMDZcdTAwMTFBXHUwMDA1cVx1MDAwZfBlYJZS/+LlJVx1MDAxOcZcdTAwMTixiM4jTkN1XHUwMDFiU39cdTAwMGasXHUwMDBmYY2QX8t4XHUwMDE5ljGX0YhRNkGDjWtsy1x1MDAxNT5MXHUwMDBlmY3X6uFdq7Alh7p5I5qX9eqgkm6UZFx0apJ7e0SsM+1Sk+AyIFx1MDAxYkRKR01GYlx1MDAwNphT04jOaEaRllx1MDAwMUS9Nz1wmyVcdTAwMTO/hvHPUpKBR21/fFx1MDAwZnlOLVx1MDAxObnzi1BcdTAwMWSZXHRgUsFcdTAwMTPi2In4cnLEx1x1MDAxM2NGXHUwMDExTzlBdmJsXHUwMDA04qX2dkgrcFx1MDAxZZaIeGKJhVx1MDAwYkytS27UdMGTzzi2omJcdTAwMDJjo96Hf2ojKWXZ28Boga/FQm39XHSzzfFcdTAwMTHLlcDucqFcdTAwMTWmtt9dw9lcdTAwMWP5Zru7XFyBZUQ0M8ouqfVfKJ38c7wlOXNgQsA4XHUwMDAzaGpcdTAwMWKzp4aHq3zAmMZcdTAwMTR8WmtpK6wxna9S/Sct/tJcdTAwMWPNXHUwMDBlTbM/OVx1MDAxZio+ukAkxrxcdTAwMGLZXHUwMDBlOFwiuCZMSFx1MDAwMTdcXMkw806/d1xua79YuHvGN8nSXHUwMDEwplwiXHUwMDEyVWfJXHRZrb7UrvKjp+fmc6tS2Lwv8J3CYdZcdNkuy8RcdTAwMDBU995cdTAwMTFKJMLALelEJ9Pd/EUotm1RhqdggS26d+RcdTAwMTOm1u/mrzngK2hkXHUwMDE3sc0zc8KwryDDXHUwMDA330py+J5cdTAwMTVJqVqpXFx3NqQoX29cZi83+ZPMOnxBXHUwMDFiIWnXKjLbeFx1MDAxYtz9RVx0Q3aTpVxcbtRhseVfXHUwMDE0vp7BhKYxXHUwMDA088fg93f7XHUwMDE3i1TEknKswfR3OkbnyYE8XHUwMDEw62Z0LoZ8w5TzhtZH5GKQ9Vx1MDAwMeyEXHUwMDAykJVhhDs31IM7XHSWl+Z0uXl1MIFD+1niNn9RqTTG0nzj5q90XHUwMDEwnMLmr6+G8cxBVtwn+fSyr49cIpuCRtd/YUFcYrV9XHUwMDEzLjhfJIfzXt5snlxmRi9cZu9v451eUV/t5jKvl21kXHUwMDEztC43XHUwMDFjM/CAfVFCL86BXHLSjEpcdTAwMWJcdTAwMDZcdTAwMTLgTvpGoGQgsmm0hvNjms1cdTAwMDDHb2TT+dspRzZj8n++hejhXHUwMDBlPeVcdTAwMTVYubNcdTAwMTnV5Jh/ab42aqfXXHUwMDFitdFcdTAwMGXeLVdlfW+4m+4k3/RcdTAwMTOAXHUwMDAyQFx1MDAxZJo05aGdY9CqktiqQWkoXHUwMDExMnCo78z9XHUwMDE5woie2cz3c8G+mFxuXHUwMDEz0eJMiFx1MDAxMmCOucX5Krk4P1x1MDAxN477R+S0fmDw2WG/X3x5kOXzrKsw0O0ouDlhnJajSHLw3SSnS1x1MDAxNOdcdTAwMDWVXHUwMDE3XHUwMDAxi1x1MDAwM6RZk7+hdvlXey2mvaKwLklkXHUwMDE4iVx1MDAxYaww8eUg/FCvJYd6n9eLJ93XYkOcXHUwMDBla5s31ZdXcZ31XHUwMDA18lx1MDAxZdTtKCGhQFx1MDAxYpBcdTAwMDDcXHRGdqBcdTAwMWXmXHUwMDEypFj6b2FcdTAwMDbgzsBdtjU1v1n4fy7aY2xVZaLn/VxurTi3+9ZdiK8nR/z2+d3uablVPDno7jBW3izwo/v7rNuqtlx1MDAwM0mFRlLZKjUjpMBUZs9SZcZow8Vydm7+XHUwMDA0S1XKSGG2bdPKTlFzyXIjuSyfmJfXh5Lqsl717EVsrD5Ivr6Tde0lMbW97eGZltZS5Vx1MDAxMnOsTVx1MDAxNi1VLVx1MDAwNVx1MDAwM0NV/lqq/1xc3Vx1MDAxNYV1/1x1MDAxY/pwJzllXFxcdTAwMTDurFdoJlx1MDAwN/uT2Oht1Fx1MDAwN6u3q7etm85DXHUwMDBmP5JWN/tgZ4hQrVx1MDAwNdbaZaqCZrNcdTAwMDWjXHUwMDE5NFWJ1pJKu9fjXHUwMDE37/84vI9cdTAwMTE36qxutq7k0zbH9KpdWbvuNnI9X+LImTtcdTAwMWTnXHUwMDEzXHUwMDE4QVhQ0GHCm1x1MDAwZmZmXHUwMDA0n1Or6Fx1MDAwMrFcdTAwMWGftaWVnS6gg+0+vmrHXHUwMDE42P2Dx4VcXP9xom9WUN/KwTUwXHUwMDEz5dPtN/42OVx1MDAxZe2FcI69oaG+lpl0xoJ8XHUwMDAy0++5zkHjXHUwMDExrfiDXHUwMDE38yZMl59cdTAwMDVcclx1MDAxZXHZ5Vx1MDAwYix6wosydqlcdTAwMTaXTrXcSq6Wq7uVYqFq7k/Kw8ur+uvJSf+1e5xcdTAwMTkoRSY/hHUoMfW2soN+XHUwMDBl8Fx1MDAxM0E6OF0+VY9SII6VXHUwMDExWsAhuH84j4vjJotcZlx1MDAxOVx1MDAxNf6FL39/9YJcdTAwMDdcdTAwMTffwo8vXHUwMDA0Kf1CkLJIkHKBrZp0dyW3k4O0dNAp3Z5ticfcXHQ2TfhcdTAwMGVn9Z1+5kGquZ07o22GxFx1MDAxOH+C/92IIEvcNspcdTAwMTlSSlx1MDAxOEBcdTAwMWPGnreeXHUwMDA0o4TZ8nCj0oj6/CiQsm9cdTAwMDEpS1x1MDAwZqRjnDzWNs9cdTAwMWGXl6/7m+ymRC7U4Hq1mlx1MDAwYlu8jul4YPIyr99cIpSA5FJcIlx1MDAxNnDAJlx1MDAxNWyGI1x1MDAxMj05XHUwMDFmXHUwMDA1x+1l1tz9RMx3UWv3xm3tzjVxXHUwMDE0XHUwMDFiQqR7OFx1MDAxZdUh23jCylxcSFxmbnvqXHUwMDEzRz9cdTAwMDHddDeVOMTS/uQmXHUwMDEyOb3Cv1x1MDAwMldKc6xdet1GyVx1MDAwN2Tu79ypUYeY6/xcdTAwMWHRNXJX2urXXHUwMDFky+BcdTAwMWNOL3A/MFx1MDAwMGhzrMeFNbM0oFx1MDAxOVwis6Oyp5utwek1XHUwMDA2ZMCo8W7DMFx1MDAxN/BcdTAwMWbg835cdTAwMDNcdNwmd3kls0tcdTAwMTGocoHdn6ZcdPpJXHUwMDE4c9s9l/ogzFx1MDAxNDzetU6vXHUwMDBiSFnpNf018iu97sqo1VjpVkftx8bKsFxyL/1Pt95rXGZXur3RyvhcdTAwMWPebzRtW8zKoNFsXGZcdTAwMWH22y5uXGIsX+Ev7bumZd7H5HUpjqw7XHUwMDE2TEhC/catT7o7yS38zkVcdTAwMGa3+1x1MDAxYqXrzv7t8Z7u0vtcdTAwMWKW7tyhJVxm5+NcdTAwMDYpLqm7mVx1MDAwZiBim1xiiFBcdTAwMThcdTAwMDDjn/aRiamT1K6C1FxcZzFcdTAwMWRGbVfwXHUwMDFjxLKwXFzL6IFaynD4XHUwMDFmM856hbs5ilx1MDAxMVfPxGG70TpmivPSw+tN/2g1Xdd1XHSCLUjMPC1lXHUwMDA0wtxgw8XnXHUwMDA1O92hk5RwkGvNsjhZ57aQOyjxxu3aXHI+XHUwMDFkYFxcOO9cdTAwMTIzzUbMiOxcdTAwMDKTdVKFTFSalJjINKnmTGo9s/1wXG6X4Vx1MDAxY+0n663qS/2AnVx1MDAxNJ6Pby5cdTAwMWVKd1x1MDAxYv38etbholxikkJyXHUwMDFhXHUwMDAxXHUwMDE3huyqc2JSgMsyJk5qu6RAKPNdoElTrD/po/2YROmXzZwkOtL0o9pIQ5h2mn6j5JA/barcoahcdTAwMWXePFxy1OHGxu1oSKhIXHUwMDE18stcdTAwMTjkXHUwMDAwmFx1MDAxN5RJO3s8jHktXHUwMDE5XHUwMDAyuHOmQYkuXHUwMDE584tMnNSCSDDa1S/kf1x1MDAwZeS/cORk9DQtgLvCVFx1MDAwYuxcdTAwMDT9S3LQ5+untHKkXHUwMDBlee3odSDUyTZRVZ1xPc/BJtVcXGn3mlx1MDAwMaVcdTAwMTRcdTAwMDJccq/5cs3ixUZOclx1MDAwZbY8aIvvquaNNYyPMNPV7uFqk5D6qzxevdjwWYwzQlx1MDAxYjSM/zPuuqWXcq+5s7ojajc5XjluXHUwMDFkt4bDZlxu12VcdTAwMGaty4uTp7WDQ70+rFx1MDAxZjR2XHUwMDBmNjtXP8uQ5775ICGEK0mEYcRV3ExocoS/3F/VhvutYa5cXLtq9dg9P2W7KutqnUtcdTAwMWMzPV5cdTAwMTPrePIle76L9pFcdTAwMGKh7DCYX53+o3R6qvXNUSVcdTAwMWEkpjGHXHUwMDExqzGMcOJ9jvUqj3u968dcdTAwMWHm67vnt/1C4X73YI2sZVx1MDAxZO+EaoSJUVi4VLpcdTAwMTRcbmFMaSque8rj2DhcdTAwMTOKg1x1MDAxNf+t45xcdTAwMTbG9e84tnnGsbHoPlpKMVx1MDAwN6pwhd1IPjl4r452S3dcdTAwMDf5vaPLerGxtlU8e9Db6YbdljGNTWmbz1x1MDAwN3dFOaaxSZvOtphOI/+S8jA2O+iAwTdMI1D9Y9D7j1x1MDAxZsamY8Lnlvelcivh1eQ4LpyzVuWE9of1WruVr1B8mlx1MDAxZvCs41x1MDAxOORcdTAwMTD8aozdu1x1MDAxY1x1MDAxNMZcYlx1MDAxYorBXCL6fCwtXHUwMDE2x4BhW/2GvZ+pXo1cdTAwMTnJRjG1XHUwMDEzpWhcdTAwMWFZ1O/FcVxuI9nOXHUwMDA21X7/69Vy8vOkNp9t0KiNxrLsQnnM1Fx1MDAwYkwkuJbEXHUwMDE5PfNcdTAwMWLLXHUwMDFmwXw1t188vOqwu+75ya5Yf7zrlCovqcJ8XHSL2Vx1MDAxNFx1MDAwZi+vXHUwMDFmXHUwMDA3zlxiYlgzgJ9QivtiVItcdTAwMDD8ijbp1VVcdTAwMTjgXG58rbe1uFx1MDAxNt7EUaMmKMJv87Y9XG7wXHUwMDFk5Fxy7obYpd5LKZlgb68sXHUwMDE4RMtgsCv2uk97j6c32/iC1tiWUmtcdTAwMGajNfGyncZ1L/l1bfuxsdbgzf3DXG7fvN7N76Rw3Vx1MDAxZpS9j4vsR1x1MDAwZnZcdTAwMDZcdTAwMGJWU4F9Pb4+alpPTk09USuUX1qrm+dcXFbW9+/ym61eutS0XGZcdTAwMGLEXHUwMDEwhFx1MDAxZMykMZJ2alx01ykwU5TpwSSiMjBPwZ+3XHUwMDBmvDWZvKVcYlx1MDAwNvc/i1x1MDAxMf1cZpLRV4MweldccjeRtbqUXHUwMDFheNT+XHUwMDA2XGZcdTAwMWZcdTAwMDZ3k2Mw/v5nXHUwMDE0g8xudFx1MDAwM1x1MDAxMlx1MDAwMlxyzKSggs9C0XCEpbYzzL0lXHUwMDE2y5k1YMdCa2vPM0rtplxmp1x1MDAxN0DtMTFTWFGsNfePOXmLxNuILuW+UECmXCLxRs8h5L7bnGhlTTz9r0w3wOSAWjGmdsa2sptgtPTFwN82wMCdNlx1MDAxY47N7F5cdTAwMTNhhPJfJ52NNbVSsdu57+BcdTAwMGLRI9v1g/xuI/d6XHUwMDE3cV4t4ZjWPMRcZkR0umVucl6GmCGCS2q8mvtpRVWi8/6khTWEMCTtXHUwMDEyRiUlPEDuv1x1MDAxOStcdTAwMGWIfHS9aOB57zJEwCantmlJXHUwMDFiO8V5er1cdTAwMTCxz7O/JpKldXTjOVFEXHUwMDEyjd2ljuQgOUvHa7OMsrSXIFx1MDAwNTeKXHUwMDExXHUwMDAzfqxcZpY6gicnhCbw7LFQNHiwtMbmS1tQaSfhe0dwcDTjyEjBhebAd1RcdTAwMTDfQd6a0aXiWvlr1/45XHUwMDE0XHUwMDFkX3rjozyM4CzW58VvS4lUeEnXXHUwMDEylojFXHUwMDA3N2YpWUktXHUwMDE50DFoXFwgXHKsQudjiNo+QJBcdTAwMTlcdTAwMDZMJLWY67w/iZJzzCCp7IizMSz8N8O+XHUwMDFihMSH14vEmfcucDJjRoKaY8JWgWKVXHUwMDEyJ0dOjsbRcTVcdTAwMDNcIuqvZvRcdTAwMTHyXHUwMDFjK1x1MDAxZe/IxVx1MDAwNT5q7V3Wiq3Wxb3NXHUwMDBl9E8yT8jCIK0kfHtik2AyYDZzXHSq0/ZnMaVAXHUwMDFkZ2qnK4EzaTCVMjmi67dkxU1cdTAwMGJfufpARk/lI5gxYCbmas9cIsfJMd+orkt1I+9cbsPbwnlvxI9cbpXHXFyqmF/COFlCQfE5JnAqJVx1MDAxMZd2IFx1MDAxMNA2QGs58apcdTAwMDVLUFxyp5hcdTAwMGL8bZPiJ59JN1x1MDAxYVx1MDAxZNJ131TS6Z/wXHUwMDEyXHUwMDA0XHUwMDBiML8g3K1cdTAwMWZPkmNle1U1i33evWE3vc3csy5fm9fTrOtHuC9IkvDwZU00Ysqu1FomVlx1MDAxNp2zzsG5xjSTW1x1MDAxNX5cdTAwMTXj1yjGSKDrSK1IOGHCLqd0hiZOkyOdlM1aY/NgrdlYK/dOT5+uXG7l88zXblx1MDAwYlx1MDAwNv6g8f6AYaDFbDmY4lx1MDAwMlx1MDAxMYrBLVx1MDAwMlx1MDAxZGSXdGZcdO9cdTAwMWNcdTAwMWNYbodcdTAwMDX84v1cdTAwMWaL91hDOLJcdJNz8Pj9XHLvPsDPsUw7PlxmnlEzWINv66gmXHUwMDExyMaqhFx1MDAwMdcyazYwXHUwMDE46JRcdTAwMGL/POHs2MDLStp+olwi41x1MDAxZDffblvTyGxcdTAwMDCTWjEs3WVcdTAwMTNzrMO+PLls3W/ly/mSPD872XrKbc6ox2xqXFyJXHUwMDA1skXMOFxiQk1cdTAwMTRSNlx1MDAwN7ZUXHUwMDEwLr5cdFx1MDAwMnBIXGb51bb/XFxtXHUwMDFibV1HutFEcdto7Xaj51iY/SSKjeZg8zl/vHq9u9bf4qtbTZp9qHNENJdWs7qMa464oPCGXHUwMDEymTOuieRcdTAwMWPbcdW/nZH/XFy8R9djXHUwMDExXHUwMDEysy5cdTAwMDBjybF72lx1MDAwMZljqXZ8fDGjkLf+tJaEYCG0XHUwMDFk7TlcciqM7Wxbzq3Bc7XLoDRfUluG0ogwzO2S49mk5lx1MDAxNPpcdTAwMTJcZm5FiFBUMG1YqGqbgHVGZHa966Um++PzXHUwMDFiK/5kP7Hj+Vx1MDAxNYabqLhcdTAwMTGchOubvjnZLzHjXFxisCiNtoWCofMppO1KTcWULYyVis113lxmJfuJtavBUVRUSkpsXHUwMDA18kd8mWPw5anFgFwijuw/V4hJaYd8aWVD3urjXHUwMDBiRkPPe9tmnblcIlJysP9cciVhPp7emDQqsoiIXHUwMDFlQsqo4YxJ4XTC5tiDXHUwMDFl76pmlaalXHUwMDA0XWlsXHUwMDA0kcB94LNrXHUwMDA24FkjeEtqxu2eZrqcXHUwMDAyXHUwMDAwKihcdTAwMTKGgzbQXHUwMDE07CxNp49qQtNcdTAwMWEjZbnFVuxIbXwhrUlLu6LEKv2M2mlL5enEdaiWp1xysTwomJFG+dols8LT3Fx1MDAwZUhcdTAwMTJcdTAwMTRcdTAwMWNcdTAwMDJsR0Sz0PlcdTAwMDSy61x1MDAwNmz1r9R2sflPKspiXHUwMDAyKULt4Vxy1XZUzIx9ikCHKlx1MDAwNd9eMIJB2D9kWWFcdTAwMTBcdTAwMTNcdTAwMWNcdTAwMWMnb1x1MDAwNiNR0n+5nFKIXHUwMDFibVx1MDAxYsWxZspQ8+H1KFx1MDAwMbyDXCLgWjCpqFaBqi3QokyDXHUwMDFiXHUwMDBiRjTncG2eXHUwMDEyb0f1PFNcdTAwMTI5Ylx1MDAxN8xqXHUwMDAz34o5WfsqOWvzzm5tV5hC+2jNtGV/f3im13tZZ21cdTAwMGVyXHUwMDA00IX/XHUwMDExalx1MDAxZuyscW3nXHUwMDA32qK2wMDOdFx1MDAwM9hzrKl7XHUwMDFmQW9cdTAwMDQ1RqRcdTAwMTE4+yndzsGNZ3/pnrXo/Vx1MDAwMWBcdTAwMDKCNS25M6VcXEuO0pfq/sXFwWP1qESPOqqt2rS68Zp1lFxuu+LUM6ntkHdcdTAwMWQod9fgeSqKXHUwMDE1ztaiNdC6oINYKvHtXHUwMDFmXHUwMDA1079/01x1MDAxYYmBKfhgXHUwMDFju5tS6slhelIuXFw97q9cdTAwMGVrXHUwMDAz0Tyqn9Vv2M5DJfMw1Vx1MDAwNlx0u79cdTAwMDagXHUwMDAyXHUwMDFlKZ7+3e8w9favzay2+v5da9hCWorv3bX2XHIw/fG71j6MVVBcdTAwMTFdomVcdTAwMTiVVHF3wriRXHUwMDFjqFfnm6K4T453Vlx1MDAxYrtP2+fs7rxUxVx1MDAxOa/YXHUwMDAwa1x1MDAxM+4p6EvwXHUwMDEwXHS4O7NJJINcdTAwMTX4hcG9yqlGk+dcXFf3Xo0pwM3WmY1L/OD80XJ7VD+zXHUwMDA1Llxy31dHW9XggmOhhLtQs5mcXHUwMDA1zrd2S5tcdTAwMTXSLVx1MDAxNI74/pDj7aG8SFddp89cdTAwMDJcZmMkbU+hjVx1MDAwZlx0X/RnzFx1MDAwMpQhXHUwMDFizVx1MDAxNWZp2prYzJWS0vYm+0dix1xm+lx1MDAxMppq2+f846dtJtfV8ywsXHUwMDFin3XovfM0XHUwMDFlu7Uy6k23lXlvdOyvjODFx7ZcdTAwMDeQL7ZcdTAwMDK+7vuks8s1fuJQ7C5XYD3k6ddgg5AmXHUwMDA0XHRcdTAwMTaYwTWZkFx1MDAwNe+RqDk0RCCpXHUwMDAzoMzsXCLHz7hcdTAwMThcdTAwMGJuciTXf5xon2OdK1x1MDAxZK/XJDRkPHqmS+TEdq4o5momjprWhseFs1x1MDAxZakqcodg2p+cTyZjNPnc+1xco1Ig8ZvcVmZSNIxjYnsxlG1OV3774y1cdTAwMDVcIpFcIoJKjqnAXFxcdTAwMTgzX6o63ZRcckbUSFxy7ij4yHafoVxuZ2yYl2L0XHUwMDFi5onO+UU7b8lcdTAwMTVr1J63+drr5Ysot43p3j1shanSMbbRgpdKu8aRhjrEJKVIzzLehCo5XHUwMDBiXHUwMDEz7NSR0DZtI7F5XHUwMDFmJDjVualQpnMh0Fx1MDAwZqXNVlLaXGbPR5w0ltrFLJrKUFx1MDAxOZf3ZuTQXHUwMDAwW8nJ4KmnT5te1cQ8i3FjvYvYYaMsujPEa270XHUwMDBmq/Td9XZyXHUwMDBmo7L6Wnnc3C9utc76p7v1yvPNWeEoM2JcdTAwMTfhYmDGXHUwMDExxiaQ2Vx1MDAxYYOaIFx1MDAxM65cdTAwMTRNeSvXwvwwXHThS7tiRJilTEZIMGr0y1ouYqWbh5ddT+NoXHUwMDE43GvNnJWZN8nFO/96elXtXHUwMDFknFx1MDAxY4NRfNrMy6OTg37mS36seMtQpMz7sFx1MDAxMj9AvG2pXHUwMDAzXHUwMDE4umYpXHUwMDA1mZ+U7nmXmn9CukVM4bFcdTAwMTJcdTAwMDLbMlx1MDAxYZd43yZcdTAwMTfvWzZcXLs8PX14uWzv3Vxc9Lk8ednOeiMvlVx1MDAxYVx0XHUwMDFj9ETH0s3BVOWBXHUwMDAwbtak2zZCSMmXXHUwMDEyLf5cdTAwMTbh/tebO/Wn2u+XR3DJydH+PLZcdTAwMWJPq06n3v7YVj7vpFbQXHUwMDFh3jf697/+/f9cdTAwMDGzXHUwMDFkMDEifQ==React JSFiberRN Shadow NodeTreeshared_ptr toShadowNodeReact JSFiberRN Shadow NodeTreeshared_ptr toShadowNodeWrapperReact JSFiberRN Shadow NodeTreeshared_ptr toShadowNoderev. 1rev. 2rev. 3Cloning of Shadow Node on the native side does not update the fiber referenceReact JSFiberRN Shadow NodeTreeshared_ptr toShadowNodeWrapperrev. 1rev. 2rev. 3Cloning of Shadow Node on the native side updates the wrapper to reference the latest revision \ No newline at end of file diff --git a/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.md b/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.md new file mode 100644 index 000000000000..f3fe7d44a13f --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/core/__docs__/RSNRU.md @@ -0,0 +1,61 @@ +# Runtime Shadow Node Reference Updates + +[🏠 Home](../../../../../../../__docs__/README.md) + +RSNRU (short for Runtime Shadow Node Reference Updates) is an update mechanism +for Shadow Node references held by the React renderer. The feature guarantees +that the React renderer holds onto the latest revision of the Shadow Node after +it was cloned internally behind the React renderer's back. + +This feature improves layout performance by maximizing the use of the layout +cache stored on the Shadow Node instances. Maintaining a reference to the latest +revision of Shadow Node instances cloned internally after a commit also improves +the freshness of native state held on the Shadow Node instance. + +## 🚀 Usage + +RSNRU is enabled by default in single threaded mode. The JS Runtime thread is +marked as the thread allowing Shadow Node refernce updates to happen. + +Threads can be marked for allowing RSNRU by calling the ShadowNode's +`setUseRuntimeShadowNodeReferenceUpdateOnThread` function from the thread. + +If the `updateRuntimeShadowNodeReferencesOnCommit` feature flag is enabled, +RSNRU will run on commit and propagate internal clones from any thread, ignoring +the `setUseRuntimeShadowNodeReferenceUpdateOnThread` setting. + +## 📐 Design + +![RSNRU in React Native](./RSNRU.excalidraw.svg) + +The React renderer running within the JS Runtime communicates with React Native +through operations running on pointers to ShadowNode instances created by React +Native. The renderer will submit requests for creating, mutating and cloning +ShadowNode instances. These operations take ShadowNode pointers as input (for +creation and mutation) and returns the resulting ShadowNode as a pointers to the +ShadowNode instance. Any operation requested by the renderer does not trigger +RSNRU since the renderer receives the cloned instance as a result for the call +to React Native. + +RSNRU modifies the returned response by returning a wrapper around the +ShadowNode pointer and storing a reference to this wrapper on the ShadowNode +instance. This mechanism enables React Native to update the wrapper to point to +new clone of the ShadowNode without needing to call into the JS Runtime. + +When the renderer commits a rendered tree, React Native will process the commit +by running state updates and the layout of the tree of ShadowNode instance. +Because ShadowNode instance are immutable, any change resulting from these +operations will lead to the ShadowNode being cloned so that the mutation can be +applied to the cloned instance. + +Whenever ShadowNode cloning happens outside of a direct renderer request, RSNRU +will check if the ShadowNode is referenced by the renderer within the JS Runtime +by checking if the ShadowNode instance holds a reference to a wrapper. If a +wrapper is present, it will be updated with the newly cloned instance so that +the renderer would hold a reference to that new revision of the ShadowNode +instance. + +When the renderer commits the next renderer tree, React Native will interact +with ShadowNode instances that hold the native state and layout information +evaluated during the last commit. This improves the "freshness" of the +ShadowNode layout cache and improves the layout pass.