<mxfile host="orrery" agent="orrery" type="device">
<diagram id="orrery" name="Chat system design">
<mxGraphModel dx="841" dy="1511" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="841" pageHeight="1511" background="#eef2f6" math="0" shadow="0">
<root><mxCell id="0"/><mxCell id="1" parent="0"/>
<mxCell id="title" value="Chat system design" style="text;html=1;align=left;verticalAlign=top;fontSize=20;fontStyle=1;fontColor=#54585b;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="28" y="24" width="211.51" height="25" as="geometry"/></mxCell>
<mxCell id="subtitle" value="WebSocket gateways keep clients connected; messages go through Kafka to Cassandra and to push providers for offline users" style="text;html=1;align=left;verticalAlign=top;fontSize=13;fontColor=#55595b;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="28" y="53" width="804.97" height="16.9" as="geometry"/></mxCell>
<mxCell id="n-clients" value="Clients&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Mobile and web&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIGQ9Ik02IDVhMiAyIDAgMCAxIDItMmg4YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg4YTIgMiAwIDAgMS0yLTJ6bTUtMWgybS0xIDEzdi4wMSIvPjwvc3ZnPg==;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="373" y="96" width="87" height="88" as="geometry"/></mxCell>
<mxCell id="n-lb" value="Load balancer&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;L4, Upgrade-aware&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik05IDEzYTMgMyAwIDEgMCA2IDBhMyAzIDAgMSAwLTYgMG0yIDdhMSAxIDAgMSAwIDIgMGExIDEgMCAxIDAtMiAwbTEtNHYzbTAtOVYzTTkgNmwzLTNsMyAzbS0zIDRWMyIvPjxwYXRoIGQ9Im05IDZsMy0zbDMgM20tLjEwNiA2LjIyN2w2LjExLTIuMjI0TTE3LjE1OSA4LjIxbDMuODQ1IDEuNzkzbC0xLjc5MyAzLjg0NW0tMTAuMTEtMS42MzRsLTYuMDc1LTIuMjExTTYuODcxIDguMjFsLTMuODQ1IDEuNzkzbDEuNzkzIDMuODQ1Ii8+PC9nPjwvc3ZnPg==;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="273" y="333" width="107" height="88" as="geometry"/></mxCell>
<mxCell id="n-gateway" value="WebSocket gateway&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Open connections&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjU2IDE5MyI+PHBhdGggZmlsbD0iIzIzMWYyMCIgZD0iTTE5Mi40NCAxNDQuNjQ1aDMxLjc4VjY4LjMzOWwtMzUuODA1LTM1LjgwNGwtMjIuNDcyIDIyLjQ3MmwyNi40OTcgMjYuNDk3em0zMS44NjQgMTUuOTMxSDExMy40NTJMODYuOTU0IDEzNC4wOGwxMS4yMzctMTEuMjM2bDIxLjg4NSAyMS44ODVoNDUuMDI4bC00NC4zNTctNDQuNDQxbDExLjMyLTExLjMybDQ0LjM1NyA0NC4zNTh2LTQ1LjAzbC0yMS44MDEtMjEuODAxbDExLjE1Mi0xMS4xNTNMMTEwLjY4NSAwSDBsMzEuNjk2IDMxLjY5NnYuMDg0aDY1Ljc0bDIzLjIyNyAyMy4yMjdsLTMzLjk2IDMzLjk2TDYzLjQ3NiA2NS43NFY0Ny43MTJoLTMxLjc4djMxLjE5M2w1NS4wMDcgNTUuMDA3TDY0LjMxNCAxNTYuM2wzNS44MDUgMzUuODA1SDI1NnoiLz48L3N2Zz4=;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="263" y="485" width="127" height="88" as="geometry"/></mxCell>
<mxCell id="n-chat" value="Chat service&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Ordering, fan-out,&lt;br&gt;presigned URLs&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIGQ9Ik0zIDdhMyAzIDAgMCAxIDMtM2gxMmEzIDMgMCAwIDEgMyAzdjJhMyAzIDAgMCAxLTMgM0g2YTMgMyAwIDAgMS0zLTN6bTAgOGEzIDMgMCAwIDEgMy0zaDEyYTMgMyAwIDAgMSAzIDN2MmEzIDMgMCAwIDEtMyAzSDZhMyAzIDAgMCAxLTMtM3ptNC03di4wMU03IDE2di4wMU0xMSA4aDZtLTYgOGg2Ii8+PC9zdmc+;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="256" y="637" width="98" height="103" as="geometry"/></mxCell>
<mxCell id="n-presence" value="Presence service&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Heartbeats&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIGQ9Ik0zIDdhMyAzIDAgMCAxIDMtM2gxMmEzIDMgMCAwIDEgMyAzdjJhMyAzIDAgMCAxLTMgM0g2YTMgMyAwIDAgMS0zLTN6bTAgOGEzIDMgMCAwIDEgMy0zaDEyYTMgMyAwIDAgMSAzIDN2MmEzIDMgMCAwIDEtMyAzSDZhMyAzIDAgMCAxLTMtM3ptNC03di4wMU03IDE2di4wMSIvPjwvc3ZnPg==;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="457" y="644.5" width="107" height="88" as="geometry"/></mxCell>
<mxCell id="n-topic" value="messages&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Kafka topic&lt;/font&gt;" style="shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#8b95a1;fontColor=#54585b;fontSize=13;fontStyle=1;fontFamily=Inter,Helvetica,Arial,sans-serif;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjU2IDQxMyI+PHBhdGggZmlsbD0iIzFhMTkxOSIgZD0iTTg3LjkzMiAzNi43MTRjLTQuNTUtNC41NzEtMTAuODk2LTcuMzk0LTE3Ljk1MS03LjM5NGMtNy4wMjkgMC0xMy4zMjYgMi44MjMtMTcuODIyIDcuMzk0aC0uMTNjLTQuNTM1IDQuNTUtNy4zNTggMTAuOS03LjM1OCAxNy45M2MwIDcuMDU1IDIuODIzIDEzLjM1MiA3LjM1OSAxNy44NzVsLjEyOS4xMDJjNC40OTYgNC41NSAxMC43OTMgNy4zNDYgMTcuODIyIDcuMzQ2YzcuMDU1IDAgMTMuNDAyLTIuNzk3IDE3Ljk1MS03LjM0Nkw4OCA3Mi41MmM0LjU1OC00LjUyMyA3LjM1NC0xMC44MiA3LjM1NC0xNy44NzZjMC03LjAyOS0yLjc5Ni0xMy4zOC03LjM1NC0xNy45Mjl6bS0xNy45NTEgMzQ2LjY0YTI1LjUgMjUuNSAwIDAgMCAxNy45NTEtNy4zNjhsLjA2Ny0uMTM0YzQuNTU4LTQuNDg3IDcuMzU0LTEwLjgzOCA3LjM1NC0xNy44MTdjMC03LjA1Ni0yLjc5Ni0xMy4zOC03LjM1NC0xNy45NTJoLS4wNjdjLTQuNTUtNC42MjUtMTAuODk2LTcuNDItMTcuOTUxLTcuNDJjLTcuMDI5IDAtMTMuMzI2IDIuNzk1LTE3LjgyMiA3LjQyaC0uMTNjLTQuNTM1IDQuNTcyLTcuMzU4IDEwLjg5Ni03LjM1OCAxNy45NTJjMCA2Ljk4IDIuODIzIDEzLjMzIDcuMzU5IDE3LjgxN2wuMTI5LjEzNGEyNS4xNSAyNS4xNSAwIDAgMCAxNy44MjIgNy4zNjhtMTM3Ljk3Mi03Ni43MmM2LjI3NS0xLjY0NiAxMS45NTctNS42NzMgMTUuNDIzLTExLjc2MWwuNDY4LS44ODdjMy4wODItNS43NzYgMy42NDQtMTIuNDQgMS45OTgtMTguMzQ0Yy0xLjY1OS02LjMyNC01LjczNS0xMS45MTctMTEuODEtMTUuNDE4bC0uMzUyLS4yMzdjLTUuOTE4LTMuMjQyLTEyLjY2Mi0zLjk0Ny0xOC44NTctMi4yNzRjLTYuMjk3IDEuNTctMTEuOTUyIDUuNzc1LTE1LjQgMTEuODE0Yy0zLjQ5MiA1Ljk4MS00LjIyMyAxMi44OC0yLjU1IDE5LjIzMWMxLjcyNSA2LjI0NCA1Ljc2MSAxMS44OSAxMS43OTYgMTUuNDE4aC4wNGM2LjA0NyAzLjQ3NSAxMi44OTggNC4xMDQgMTkuMjQ0IDIuNDU4TTk1Ljk3IDE4MC4zODdjLTYuNjU0LTYuNjM3LTE1LjgyNC0xMC43OTQtMjUuOTg4LTEwLjc5NGMtMTAuMTI0IDAtMTkuMjcyIDQuMTU3LTI1LjkxMiAxMC43OTRjLTYuNjEgNi42MTQtMTAuNjg2IDE1Ljc2LTEwLjY4NiAyNS44OThjMCAxMC4xNjUgNC4wNzYgMTkuMzM5IDEwLjY4NiAyNi4wMjljNi42NCA2LjU4MiAxNS43ODggMTAuNzEyIDI1LjkxMiAxMC43MTJjMTAuMTY0IDAgMTkuMzM0LTQuMTMgMjUuOTg4LTEwLjcxMmM2LjYyMy02LjY5IDEwLjctMTUuODY0IDEwLjctMjYuMDI5YzAtMTAuMTM3LTQuMDc3LTE5LjI4NC0xMC43LTI1Ljg5OG0tMTQuNjEtNDMuMTY0YzE0LjcyNiAyLjQyNiAyNy45NzYgOS40ODIgMzguMDg3IDE5LjY3M2guMDhhNzIgNzIgMCAwIDEgNC42MjUgNS4xNDdsMjUuMjg0LTE0LjYyOWMtMy4zOTktMTAuMjcxLTMuNTU1LTIxLjAxLS44MjYtMzEuMDcyYzMuNjA5LTEzLjQ4NyAxMi4zNS0yNS41NiAyNS40NTMtMzMuMTM3bC40MzMtLjI2YzEyLjk2LTcuMzQ1IDI3LjY5Ni04Ljg2MSA0MS01LjI1M2E1NC41MiA1NC41MiAwIDAgMSAzMy4xODYgMjUuNDh2LjAyNmM3LjUyOSAxMy4wMTUgOS4wNTkgMjcuOTYgNS40NjQgNDEuMzkzYy0zLjU4MSAxMy40NzgtMTIuMzYzIDI1LjYzMS0yNS40NTMgMzMuMTU1bC0zLjQ1MiAyLjA0M2gtLjM1MmMtMTIuMTA5IDUuNzcxLTI1LjQyNiA2LjY2My0zNy42NTUgMy40NDdjLTEwLjA0NC0yLjY2Ny0xOS4yNTgtOC4yNi0yNi40Ny0xNi4yM2wtMjUuMjQzIDE0LjU4NWE2OS43IDY5LjcgMCAwIDEgNC41MDkgMjQuNjk0YTcwLjcgNzAuNyAwIDAgMS00LjUxIDI0LjgyNGwyNS4yNDQgMTQuNTNjNy4yMTItOC4wNzIgMTYuNDI2LTEzLjU2MiAyNi40Ny0xNi4yMjljMTMuNDY5LTMuNjg0IDI4LjQwNS0yLjExNCA0MS40NiA1LjQ5bC44MzMuMzkzdi4wNTNjMTIuNjEzIDcuNjI3IDIxLjA3OCAxOS40NDEgMjQuNjE5IDMyLjc2N2E1NC40MyA1NC40MyAwIDAgMS01LjQ2NCA0MS4zNDRsLS40NTQuOTE0bC0uMDU0LS4wOGMtNy41NjQgMTIuNTczLTE5LjQ4IDIxLjA5MS0zMi42MzggMjQuNjk1Yy0xMy41IDMuNTU0LTI4LjQzMiAyLjAzOC00MS40NzMtNS40NnYtLjEwNmMtMTMuMTAzLTcuNTc4LTIxLjg0NC0xOS42NzgtMjUuNDUzLTMzLjEzM2MtMi43MjktMTAuMDM1LTIuNTczLTIwLjc3OS44MjYtMzEuMDQ2bC0yNS4yODQtMTQuNTg0Yy0xLjQ1IDEuNzgtMy4wMiAzLjQ1Mi00LjYyNSA1LjA3MWwtLjA4LjA3NmMtMTAuMTEgMTAuMTQyLTIzLjM2MSAxNy4xOTgtMzguMDg4IDE5LjU0OHYyOS4yMTdjMTAuNDk0IDIuMTk0IDE5LjkgNy40NDggMjcuMjczIDE0LjgxNmwuMDM1LjA4YzkuODggOS44MjUgMTUuOTk0IDIzLjUxNyAxNS45OTQgMzguNTdjMCAxNS4wMDMtNi4xMTUgMjguNjEtMTUuOTk0IDM4LjQ4OWwtLjAzNS4xNTZjLTkuOTQ2IDkuODc5LTIzLjU5OCAxNS45OTMtMzguNjUgMTUuOTkzYy0xNC45NzIgMC0yOC42NDItNi4xMTQtMzguNTYtMTUuOTkzaC0uMDM2di0uMTU2Yy05Ljg5My05Ljg3OS0xNi4wMi0yMy40ODYtMTYuMDItMzguNDlhNTQuMjYgNTQuMjYgMCAwIDEgMTYuMDItMzguNTY5di0uMDhoLjAzNWM3LjM2LTcuMzY4IDE2Ljc3OS0xMi42MjIgMjcuMjQ2LTE0LjgxNnYtMjkuMjE3Yy0xNC43NC0yLjM1LTI3Ljk1LTkuNDA2LTM4LjA0OC0xOS41NDhsLS4xMDctLjA3NkM3Ljg5IDI0My4wNTMgMCAyMjUuNjI0IDAgMjA2LjI4NWMwLTE5LjI4NCA3Ljg5LTM2LjcxNCAyMC41MTEtNDkuMzg5aC4xMDdjMTAuMDk4LTEwLjE5IDIzLjMwOC0xNy4yNDcgMzguMDQ4LTE5LjY3M3YtMjkuMDg3QTU1LjM0IDU1LjM0IDAgMCAxIDMxLjQyIDkzLjI5M2gtLjAzNXYtLjA4Yy05Ljg5My05LjkyOC0xNi4wMi0yMy41MTgtMTYuMDItMzguNTdjMC0xNC45NzYgNi4xMjctMjguNjk1IDE2LjAyLTM4LjU3NGwuMDM1LS4wNDlDNDEuMzQgNi4xMTUgNTUuMDEgMCA2OS45OCAwYzE1LjA1MyAwIDI4LjcwNSA2LjExNSAzOC42NSAxNi4wMnYuMDVoLjAzNmM5Ljg4IDkuODc4IDE1Ljk5NCAyMy41OTcgMTUuOTk0IDM4LjU3M2MwIDE1LjA1Mi02LjExNSAyOC42NDItMTUuOTk0IDM4LjU3bC0uMDM1LjA4Yy03LjM3MyA3LjMxOS0xNi43NzkgMTIuNTY4LTI3LjI3MyAxNC44NDN6bTE0Mi4wMTctMTkuMzkybC0uMjEtLjMxMmMtMy40OTItNS44ODItOS4wNTgtOS44MDMtMTUuMjEzLTExLjUwMmMtNi4zNDYtMS42NzItMTMuMTk3LS45NjMtMTkuMjg0IDIuNTExaC4wNGMtNi4wNzUgMy40NDgtMTAuMTM4IDkuMDk0LTExLjgzNyAxNS40MThhMjUuMyAyNS4zIDAgMCAwIDIuNTUxIDE5LjIzMWwuMTE2LjE2YTI1IDI1IDAgMCAwIDE1LjI4NCAxMS41N2EyNC44MyAyNC44MyAwIDAgMCAxOS4yMS0yLjQ4bC4zMjUtLjE1NmM1LjkwNS0zLjUyOCA5LjgzOC05LjA5NCAxMS40ODQtMTUuMjA4YzEuNjczLTYuMjk4IDEuMDA4LTEzLjE5Ny0yLjQ2Ni0xOS4yMzIiLz48L3N2Zz4=;imageWidth=20;imageHeight=20;" vertex="1" parent="1"><mxGeometry x="116" y="869" width="149" height="60" as="geometry"/></mxCell>
<mxCell id="n-status" value="Presence store&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Redis with TTL keys&lt;/font&gt;" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=8;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#8b95a1;fontColor=#54585b;fontSize=13;fontStyle=1;fontFamily=Inter,Helvetica,Arial,sans-serif;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjU2IDIyMCI+PHBhdGggZmlsbD0iIzkxMjYyNiIgZD0iTTI0NS45NyAxNjguOTQzYy0xMy42NjIgNy4xMjEtODQuNDM0IDM2LjIyLTk5LjUwMSA0NC4wNzVzLTIzLjQzNyA3Ljc4LTM1LjM0IDIuMDljLTExLjkwMi01LjY5LTg3LjIxNi0zNi4xMTItMTAwLjc4My00Mi41OTdDMy41NjYgMTY5LjI3MSAwIDE2Ni41MzUgMCAxNjMuOTUxdi0yNS44NzZzOTguMDUtMjEuMzQ1IDExMy44NzktMjcuMDI0YzE1LjgyOC01LjY3OSAyMS4zMi01Ljg4NCAzNC43OS0uOTVjMTMuNDcyIDQuOTM2IDk0LjAxOCAxOS40NjggMTA3LjMzMSAyNC4zNDRsLS4wMDYgMjUuNTFjLjAwMiAyLjU1OC0zLjA3IDUuMzY0LTEwLjAyNCA4Ljk4OCIvPjxwYXRoIGZpbGw9IiNjNjMwMmIiIGQ9Ik0yNDUuOTY1IDE0My4yMmMtMTMuNjYxIDcuMTE4LTg0LjQzMSAzNi4yMTgtOTkuNDk4IDQ0LjA3MmMtMTUuMDY2IDcuODU3LTIzLjQzNiA3Ljc4LTM1LjMzOCAyLjA5Yy0xMS45MDMtNS42ODYtODcuMjE0LTM2LjExMy0xMDAuNzgtNDIuNTk0Yy0xMy41NjYtNi40ODUtMTMuODUtMTAuOTQ4LS41MjQtMTYuMTY2YzEzLjMyNi01LjIyIDg4LjIyNC0zNC42MDUgMTA0LjA1NS00MC4yODRjMTUuODI4LTUuNjc3IDIxLjMxOS01Ljg4NCAzNC43ODktLjk0OGMxMy40NzEgNC45MzQgODMuODE5IDMyLjkzNSA5Ny4xMyAzNy44MWMxMy4zMTYgNC44ODEgMTMuODI3IDguOS4xNjYgMTYuMDIiLz48cGF0aCBmaWxsPSIjOTEyNjI2IiBkPSJNMjQ1Ljk3IDEyNy4wNzRjLTEzLjY2MiA3LjEyMi04NC40MzQgMzYuMjItOTkuNTAxIDQ0LjA3OGMtMTUuMDY3IDcuODUzLTIzLjQzNyA3Ljc3Ny0zNS4zNCAyLjA4N2MtMTEuOTAzLTUuNjg3LTg3LjIxNi0zNi4xMTItMTAwLjc4My00Mi41OTdDMy41NjYgMTI3LjQwMiAwIDEyNC42NyAwIDEyMi4wODVWOTYuMjA2czk4LjA1LTIxLjM0NCAxMTMuODc5LTI3LjAyM2MxNS44MjgtNS42NzkgMjEuMzItNS44ODUgMzQuNzktLjk1QzE2Mi4xNDIgNzMuMTY4IDI0Mi42ODggODcuNjk3IDI1NiA5Mi41NzRsLS4wMDYgMjUuNTEzYy4wMDIgMi41NTctMy4wNyA1LjM2My0xMC4wMjQgOC45ODciLz48cGF0aCBmaWxsPSIjYzYzMDJiIiBkPSJNMjQ1Ljk2NSAxMDEuMzUxYy0xMy42NjEgNy4xMi04NC40MzEgMzYuMjE4LTk5LjQ5OCA0NC4wNzVjLTE1LjA2NiA3Ljg1NC0yMy40MzYgNy43NzctMzUuMzM4IDIuMDg3Yy0xMS45MDMtNS42ODYtODcuMjE0LTM2LjExMi0xMDAuNzgtNDIuNTk0Yy0xMy41NjYtNi40ODMtMTMuODUtMTAuOTQ3LS41MjQtMTYuMTY3QzIzLjE1MSA4My41MzUgOTguMDUgNTQuMTQ4IDExMy44OCA0OC40N2MxNS44MjgtNS42NzggMjEuMzE5LTUuODg0IDM0Ljc4OS0uOTQ5YzEzLjQ3MSA0LjkzNCA4My44MTkgMzIuOTMzIDk3LjEzIDM3LjgxYzEzLjMxNiA0Ljg4IDEzLjgyNyA4LjkuMTY2IDE2LjAyIi8+PHBhdGggZmlsbD0iIzkxMjYyNiIgZD0iTTI0NS45NyA4My42NTNjLTEzLjY2MiA3LjEyLTg0LjQzNCAzNi4yMi05OS41MDEgNDQuMDc4Yy0xNS4wNjcgNy44NTQtMjMuNDM3IDcuNzc3LTM1LjM0IDIuMDg3Yy0xMS45MDMtNS42ODctODcuMjE2LTM2LjExMy0xMDAuNzgzLTQyLjU5NUMzLjU2NiA4My45OCAwIDgxLjI0NyAwIDc4LjY2NXYtMjUuODhzOTguMDUtMjEuMzQzIDExMy44NzktMjcuMDIxYzE1LjgyOC01LjY4IDIxLjMyLTUuODg0IDM0Ljc5LS45NUMxNjIuMTQyIDI5Ljc0OSAyNDIuNjg4IDQ0LjI3OCAyNTYgNDkuMTU1bC0uMDA2IDI1LjUxMmMuMDAyIDIuNTU1LTMuMDcgNS4zNjEtMTAuMDI0IDguOTg2Ii8+PHBhdGggZmlsbD0iI2M2MzAyYiIgZD0iTTI0NS45NjUgNTcuOTNjLTEzLjY2MSA3LjEyLTg0LjQzMSAzNi4yMi05OS40OTggNDQuMDc0Yy0xNS4wNjYgNy44NTQtMjMuNDM2IDcuNzc3LTM1LjMzOCAyLjA5Qzk5LjIyNyA5OC40MDQgMjMuOTE1IDY3Ljk4IDEwLjM1IDYxLjQ5N1MtMy41IDUwLjU1IDkuODI1IDQ1LjMzMUMyMy4xNTEgNDAuMTEzIDk4LjA1IDEwLjczIDExMy44OCA1LjA1YzE1LjgyOC01LjY3OSAyMS4zMTktNS44ODMgMzQuNzg5LS45NDhzODMuODE5IDMyLjkzNCA5Ny4xMyAzNy44MTFjMTMuMzE2IDQuODc2IDEzLjgyNyA4Ljg5Ny4xNjYgMTYuMDE3Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTE1OS4yODMgMzIuNzU3bC0yMi4wMSAyLjI4NWwtNC45MjcgMTEuODU2bC03Ljk1OC0xMy4yM2wtMjUuNDE1LTIuMjg0bDE4Ljk2NC02LjgzOWwtNS42OS0xMC40OThsMTcuNzU1IDYuOTQ0bDE2LjczOC01LjQ4bC00LjUyNCAxMC44NTV6bS0yOC4yNTEgNTcuNTE4TDg5Ljk1NSA3My4yMzhsNTguODYtOS4wMzV6bS01Ni45NS01MC45MjhjMTcuMzc1IDAgMzEuNDYgNS40NiAzMS40NiAxMi4xOTRjMCA2LjczNi0xNC4wODUgMTIuMTk1LTMxLjQ2IDEyLjE5NXMtMzEuNDYtNS40Ni0zMS40Ni0xMi4xOTVjMC02LjczNCAxNC4wODUtMTIuMTk0IDMxLjQ2LTEyLjE5NCIvPjxwYXRoIGZpbGw9IiM2MjFiMWMiIGQ9Im0xODUuMjk1IDM1Ljk5OGwzNC44MzYgMTMuNzY2bC0zNC44MDYgMTMuNzUzeiIvPjxwYXRoIGZpbGw9IiM5YTI5MjgiIGQ9Im0xNDYuNzU1IDUxLjI0M2wzOC41NC0xNS4yNDVsLjAzIDI3LjUxOWwtMy43NzkgMS40Nzh6Ii8+PC9zdmc+;imageWidth=20;imageHeight=20;" vertex="1" parent="1"><mxGeometry x="319" y="1328.5" width="170" height="76" as="geometry"/></mxCell>
<mxCell id="n-history" value="Message store&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Cassandra&lt;/font&gt;" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=8;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#8b95a1;fontColor=#54585b;fontSize=13;fontStyle=1;fontFamily=Inter,Helvetica,Arial,sans-serif;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiMxMjg3QjEiIGQ9Ik0xMC4zNzQgMTAuNTNhMyAzIDAgMCAxLS40MjgtLjIyMmwuNTU1LjE0M2MwIC4wMi0uMDEuMDM2LS4wMS4wNTVsLS4xMTcuMDI1em0tLjI4MyAxLjUwNmwtLjMxNS4yNTNsLjg1Mi0xLjA3OWwtMS4wNzguMzkxYy4wMDIuMDE3LjAwOS4wMzMuMDA5LjA1YS41Ny41NyAwIDAgMS0uMTg0LjQycS4xNTQuMzI3LjM3NS42MTZhMy4yIDMuMiAwIDAgMSAuMzQtLjY1MXptLjcxNy0yLjM0N2wtLjY1Mi0uODJhLjQzLjQzIDAgMCAxLS41MDYuMTYyYy0uMDU0LjA3My0uMDgzLjE2Mi0uMTMuMjRsMS4yNTguNDYzem0tMS42NjYuNDQ0Yy0uMDcuMzE0LS4wODcuNjM3LS4wNS45NTZhLjU3LjU3IDAgMCAxIC40NTEuNDc1bC45NDYtLjYwNmMtLjA2Ny0uMDIyLS4xMjYtLjA2LS4xOTEtLjA4OGwtMS4xMTktLjA4bC42NC0uMTRhMy4yIDMuMiAwIDAgMS0uNjY4LS41NTR6TTIwLjEgMTEuNjQ4Yy0uMTY0LjIwMi44MzMgMS4wMjIuODMzIDEuMDIycy0xLjY1NC0xLjAyMi0yLjIzNC0uNzJjLS4yNzguMTQ0LjU3NC44MTEgMS4xNzUgMS4yNDJjLS40MjgtLjI3NC0uOTgyLS41NzEtMS4xNzUtLjQwOGMtLjMyOC4yNzcgMS41NjUgMi41NDkgMS41NjUgMi41NDlzLTIuMTQ1LTIuMzIyLTIuMzYtMi4yMDljLS4yMTQuMTE0LjU5MyAxLjIyNC41OTMgMS4yMjRzLTEuMDYtMS4xNi0xLjM1LS45NTljLS4yOS4yMDIgMS41MTQgMy4yMTggMS41MTQgMy4yMThzLTEuOTU2LTMuMDkxLTIuNzYzLTIuNTc0YzEuMjY4IDIuNzgyLjc5NSAzLjE4Ljc5NSAzLjE4cy0uMTYyLTIuODM5LTEuNzQyLTIuNzY0Yy0uNzk1LjAzOC4zNzkgMi4xMi4zNzkgMi4xMnMtMS4wOC0xLjkwMi0xLjgtMS44NjRjMS4zMjYgMi41MS44NTQgMy41My44NTQgMy41M3MuMjE5LTIuMTQzLTEuNTgtMy4zMzZjLjY4Mi42MDYtLjQyNyAzLjMzNi0uNDI3IDMuMzM2cy45NzYtNC4wMjMtLjcxOS0zLjI1NmMtLjI2OC4xMjEtLjAxOSAyLjAwNy0uMDE5IDIuMDA3cy0uMzQtMi4xNTgtLjg1MS0yLjA0NWMtLjI5OC4wNjYtMS44OTMgMi45OS0xLjg5MyAyLjk5czEuMzA2LTMuMTYuOTA4LTMuMDI3Yy0uMjkuMDk2LS44MzMgMS40LS44MzMgMS40cy4yNjUtMS4yODcgMC0xLjM2M2MtLjI2NC0uMDc1LTEuNzQgMS4zNjMtMS43NCAxLjM2M3MxLjA5Ny0xLjI4Ny45MDgtMS41NTJjLS4yODctLjQwMi0uNjIzLS40Mi0xLjAyMi0uMjY1Yy0uNTgxLjIyNi0xLjM2MyAxLjI4Ny0xLjM2MyAxLjI4N3MuNzgtMS4wNzQuNjQzLTEuNDc2Yy0uMjE5LS42NDctMi40NiAxLjI0OS0yLjQ2IDEuMjQ5czEuMzI1LTEuMjUgMS4wMjItMS41MTRjLS4zMDMtLjI2NS0xLjk0Ny0uMTgzLTIuNDYtLjE4NWMtMS41MTUtLjAwNC0yLjAzOS0uMzYtMi40OTgtLjcyNGMxLjk4Ny45OTcgMy44MDMtLjE1MSA2LjA5NC40OTRsLjIxLjA2Yy0xLjMtLjU1OC0yLjE0NC0xLjM3OC0yLjIyNi0yLjM1NGMtLjAzNi0uNDE2LjA3NC0uODI3LjI5Ny0xLjIyMmMuNjE5LS40IDEuMjktLjc3MyAyLjA2LTEuMDk1YTQgNCAwIDAgMC0uMDY0LjY5OGMwIDIuNDQgMi4yMDMgNC40MTcgNC45MiA0LjQxN3M0LjkyLTEuOTc3IDQuOTItNC40MTdjMC0uNDUtLjA4My0uODgxLS4yMjMtMS4yOWMxLjQzMS40MDQgMi40NS45NjggMy4xMzIgMS4zMzVjLjAyMi4wOTIuMDQ1LjE4NC4wNTMuMjc5Yy4wMjQuMjc0LS4wMTguNTQ3LS4xMS44MTRjLjA5NS0uMTQ3LjE5OC0uMjg4LjI4LS40NDVjLjM2Ny0uOTk3IDEuODU1LjIyNyAxLjg1NS4yMjdzLTEuMDg1LS40NTQtMS4wNi0uMjRjLjAyNi4yMTUgMS42MjguOTYgMS42MjguOTZzLTEuNDUtLjQ1NS0xLjM2Mi0uMTE0Yy4wODguMzQgMS44MTcgMS43MDMgMS44MTcgMS43MDNzLTEuOTU2LTEuNDg5LTIuMTItMS4yODd6bS03LjI2OCAyLjY1bC4wNDItLjAwOGwtLjA2LjAxek05LjI1NiA5Ljc1M2MuMTIuMTMuMjYuMjM0LjM5Ni4zNDNsLjkyNy0uMDI5bC0xLjA2NC0uNzg4Yy0uMDkzLjE1NC0uMTk1LjMwMy0uMjYuNDc0Wm0xMC42MiAzLjQ0Yy4zLjIxNS41NC4zNzMuNTQuMzczcy0uMjQtLjE4MS0uNTQtLjM3NHpNNy41MDcgOC42MTdjLS4xNC4yMjktLjIxNC40OTItLjIxNS43NmEzLjk5IDMuOTkgMCAwIDAgMi4zNTggMy42NHEwLS4wMDguMDAzLS4wMTRhMy4yIDMuMiAwIDAgMS0uNTgtLjc4OGMtLjY0OC4wOTktLjkyNi0uNzk0LS4zMzYtMS4wOGEzLjIgMy4yIDAgMCAxIC4xMzgtMS4zODhhMy4xNiAzLjE2IDAgMCAxLS41Mi0xLjM2cS0uNDQ0LjEwNS0uODQ4LjIzbTEuNDg4LjgycS4xNjMtLjM2LjQwMi0uNjYxYS40MzUuNDM1IDAgMCAxIC41NjgtLjU1N2MuMDc3LS4wNTkuMTY2LS4wOTkuMjQ4LS4xNWExNiAxNiAwIDAgMC0xLjcyNy4yODRjLjExNC4zODguMjcyLjc2LjUwOSAxLjA4NG0yLjI4NSAzLjkyOGMxLjQgMCAyLjYzMy0uNzIzIDMuMzQ0LTEuODE2YTMuNCAzLjQgMCAwIDAtMS4yNjUtLjUzOWwtLjI5Ny0uMDIzbC45MTYuOWwtMS4xOTctLjQ2N2wuNzA0IDEuMDc4bC0xLjA3NC0uODMybC0uMDEyLjAwNmwuMzQ3IDEuMjc4bC0uNTk2LTEuMTM0bC0uMDk4IDEuMzNsLS40MDEtMS4zMjZsLS40NzIgMS4yNjFsLjExNC0xLjM1OWwtLjAxNS0uMDA4bC0uODE0IDEuMTU0bC4yODYtMS4wNjdjLS4zNC4zMjItLjYwNS43MTMtLjc4MSAxLjE0NnEuMTQzLjE1My4zMDMuMjlxLjQ4NC4xMjYgMS4wMDguMTI4bTEwLjE0NS00LjQzNGMuOTcxLS41NjcgMS43MTYtMS45NTUgMS43MTYtMS45NTVzLTEuODkzIDEuOTU1LTMuMjA1IDEuNjY1YzEuMTg2LS45MzQgMS43NjYtMi41NDkgMS43NjYtMi41NDlzLTEuNTA2IDIuMzI1LTIuNDQ4IDIuNDIzYzEuMDg2LS45NTkgMS41NC0yLjMyMiAxLjU0LTIuMzIycy0xLjIzNyAxLjgxNy0yLjE5NiAxLjk0NGMxLjI4Ny0xLjE2MSAxLjMzOC0xLjg5MyAxLjMzOC0xLjg5M3MtMS43ODEgMi4zMDItMi40OTkgMS45NDNjLjg1OC0uOTM0IDEuNDM5LTIuMTIgMS40MzktMi4xMnMtMS40ODkgMi4wMTktMS44OTMgMS42OWMtLjI3Ny0uMDUuNDU0LS45NTguNDU0LS45NThzLS45MDguODA3LTEuMTYuNjA2Yy40NTQtLjI3OCAxLjIzNi0xLjY0IDEuMjM2LTEuNjRTMTYgNy41MDUgMTUuNjIxIDcuMzA0bC43MzEtMS40ODNzLS43MyAxLjQ4My0xLjcxNSAxLjIzYy40NTQtLjU4LjYzLTEuMTEyLjYzLTEuMTEycy0uNzU2IDEuMjEzLTEuNjkuODg1Yy0uMjItLjA3Ny4yNzMtLjYzNS4yNzMtLjYzNXMtLjYyNi42MS0xLjA1NS41MzRjLS40My0uMDc2LjAyNS0uODU4LjAyNS0uODU4cy0uNzU3IDEuMTg2LS45MDggMS4xMzZzLjA3NS0uODMzLjA3NS0uODMzcy0uNTU1LjkwOC0uODU4Ljg1OHMwLS45MzQgMC0uOTM0cy0uMzI4Ljk4NC0uNTguOTA5Yy0uMjUyLS4wNzYtLjMwMy0uNjU2LS4zMDMtLjY1NnMtLjA2OC43ODgtLjQyOS44NThjLTIuNzI1LjUzLTUuNzI4IDEuNjktOS40ODkgNS40NUMzLjg4NyAxMC43MzggNS4zIDcuOTEgMTEuOTYyIDcuNjU5YzUuMDQ0LS4xOTEgNy4zOTkgMi4xMzcgOC4xNzcgMi4xN0MyMi41MSA5LjkzIDI0IDcuNjMzIDI0IDcuNjMzcy0xLjQ4OSAxLjcxNi0yLjU3NCAxLjN6bS03Ljc0Ljg3MmwtLjYwOC40NjR2LjAwMWwuMDU0LjAwM2EzLjQgMy40IDAgMCAwIC41NTQtLjQ2OG0xLjU4My0uNDI2YzAtLjUzNi0uMjM3LS45MjktLjU5NC0xLjIxN2EzLjIgMy4yIDAgMCAxLS4xNjUuODI1YS4zOTMuMzkzIDAgMCAxLS4zMjguNjgxYy0uMTU0LjIzMy0uMzQuNDQ1LS41NDkuNjNsLjY2MS4wMzRsLS45OTUuMjM3Yy0uMDI1LjAxOC0uMDQ1LjA0MS0uMDcuMDU4YTMuMiAzLjIgMCAwIDEgMS41MzYuNjkxYy4zMi0uNTc0LjUwNC0xLjIzNS41MDQtMS45NHpNMTAuOTkgNy45OTZhMy41IDMuNSAwIDAgMC0uNzg1LjQ2YS40My40MyAwIDAgMS0uMDEzLjM1N2wuODg1LjY0M2wuMDIzLS4wMTZsLS4zNi0xLjI2MmwuNjI3IDEuMTJjLjAxOC0uMDA2LjA0LS4wMDYuMDU4LS4wMTFsLS4wMi0xLjI1MWwuMzk4IDEuMTYzbC40NzctMS4xNWwuMDE2IDEuMjY4bC4wMTIuMDA3bC43MTMtMS4wMDVsLS4zNjMgMS4yMThsLjAwOS4wMWwxLjA0LS42OWwtLjc1OSAxLjA1bC4wMDIuMDA1bC45NS0uMzRsLjA0MS0uMDQ1YS4zOTUuMzk1IDAgMCAxIC4zOTQtLjYzMmEzLjQgMy40IDAgMCAwIC4yNy0uNzg0YTE0IDE0IDAgMCAwLTIuNzk4LS4xNjhjLS4yODYuMDExLS41NS4wMzMtLjgxNy4wNTMiLz48L3N2Zz4=;imageWidth=20;imageHeight=20;" vertex="1" parent="1"><mxGeometry x="232" y="1084" width="154" height="76" as="geometry"/></mxCell>
<mxCell id="n-push" value="Push service&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Offline users&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIGQ9Ik0xMCA1YTIgMiAwIDEgMSA0IDBhNyA3IDAgMCAxIDQgNnYzYTQgNCAwIDAgMCAyIDNINGE0IDQgMCAwIDAgMi0zdi0zYTcgNyAwIDAgMSA0LTZNOSAxN3YxYTMgMyAwIDAgMCA2IDB2LTEiLz48L3N2Zz4=;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="113" y="1078" width="79" height="88" as="geometry"/></mxCell>
<mxCell id="n-apns" value="APNs&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Apple Push Notification&lt;br&gt;service&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0xMSAzaDEwdjhoLTNsLTQgMnYtMmgtM3oiLz48cGF0aCBkPSJNMTUgMTZ2NGExIDEgMCAwIDEtMSAxSDZhMSAxIDAgMCAxLTEtMVY2YTEgMSAwIDAgMSAxLTFoMm0yIDEzdi4wMSIvPjwvZz48L3N2Zz4=;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="151" y="1315" width="128" height="103" as="geometry"/></mxCell>
<mxCell id="n-fcm" value="FCM&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Firebase Cloud&lt;br&gt;Messaging&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjU2IDMyMiI+PHBhdGggZmlsbD0iI2ZmOTEwMCIgZD0iTTgwLjE4IDMxMi4yOTVjMTMuNDU1IDUuNDE0IDI4LjA1IDguNjI4IDQzLjM3NiA5LjE2M2ExMjcuNSAxMjcuNSAwIDAgMCA1OC4wOTgtMTEuNzFjLTIxLjE0NS04LjMwNy00MC4yOTQtMjAuNDU1LTU2LjYzOC0zNS41NmMtMTAuNTk0IDE2Ljk2My0yNi4yNjMgMzAuMzYtNDQuODM1IDM4LjEwNyIvPjxwYXRoIGZpbGw9IiNmZmM0MDAiIGQ9Ik0xMjUuMDEzIDI3NC4xOTNjLTM3LjMwNy0zNC41MDQtNTkuOTM5LTg0LjQ0NC01OC4wMjYtMTM5LjIxOGMuMDYyLTEuNzguMTU2LTMuNTU3LjI2Ni01LjMzNGE5Ni42MyA5Ni42MyAwIDAgMC01MC40NTYuNTI4QzYuODM4IDE0Ny42MTQuODI4IDE2Ny42My4wNzkgMTg5LjA2OUMtMS44NTMgMjQ0LjQwMyAzMS42MzIgMjkyLjc1IDgwLjE3OCAzMTIuM2MxOC41NzItNy43NDcgMzQuMjQtMjEuMTMgNDQuODM1LTM4LjEwNyIvPjxwYXRoIGZpbGw9IiNmZjkxMDAiIGQ9Ik0xMjUuMDE1IDI3NC4xOTFjOC42NzQtMTMuODggMTMuOTMzLTMwLjE1NCAxNC41NDUtNDcuNjg3YzEuNjEtNDYuMTItMjkuMzk0LTg1Ljc5NC03Mi4zMDYtOTYuODY1Yy0uMTEgMS43NzctLjIwMyAzLjU1NS0uMjY1IDUuMzM0Yy0xLjkxMyA1NC43NzUgMjAuNzE5IDEwNC43MTQgNTguMDI2IDEzOS4yMTgiLz48cGF0aCBmaWxsPSIjZGQyYzAwIiBkPSJNMTM0Ljc2MSAwYy0yNC40NCAxOS41OC00My43MzggNDUuMzk2LTU1LjQxNCA3NS4xMzZhMTgwLjUgMTgwLjUgMCAwIDAtMTIuMTEzIDU0LjUxNWM0Mi45MTIgMTEuMDcgNzMuOTE3IDUwLjc0NSA3Mi4zMDYgOTYuODY1Yy0uNjEyIDE3LjUzMi01Ljg4NyAzMy43OS0xNC41NDUgNDcuNjg3YTE4MC43IDE4MC43IDAgMCAwIDU2LjYzNyAzNS41NmM0Mi40NDEtMTkuNjE4IDcyLjU1My02MS44MzMgNzQuMjk3LTExMS43NjRjMS4xMjktMzIuMzUxLTExLjMtNjEuMTg0LTI4Ljg2NC04NS41MjFDMjA4LjUxNyA4Ni43MzggMTM0Ljc2IDAgMTM0Ljc2IDAiLz48L3N2Zz4=;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="28" y="1315" width="83" height="103" as="geometry"/></mxCell>
<mxCell id="n-media" value="Media storage&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Presigned uploads&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik00IDdhOCA0IDAgMSAwIDE2IDBBOCA0IDAgMSAwIDQgNyIvPjxwYXRoIGQ9Ik00IDdjMCAuNjY0LjA4OCAxLjMyNC4yNjMgMS45NjVMNyAxOWMuNSAxLjUgMi4yMzkgMiA1IDJzNC41LS41IDUtMnEuNS0xLjUgMi43MzctMTAuMDM1QTcuNSA3LjUgMCAwIDAgMjAgNyIvPjwvZz48L3N2Zz4=;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="447" y="333" width="102" height="88" as="geometry"/></mxCell>
<mxCell id="n-cdn" value="CDN&lt;br&gt;&lt;font style=&quot;font-size: 11px;&quot; color=&quot;#55595b&quot;&gt;Media downloads&lt;/font&gt;" style="shape=label;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU0NTg1YiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiPjxwYXRoIGQ9Ik0yMC45ODUgMTIuNTJhOSA5IDAgMSAwLTcuNTIgOC4zNk0zLjYgOWgxNi44TTMuNiAxNWgxMC45Ii8+PHBhdGggZD0iTTExLjUgM2ExNyAxNyAwIDAgMCAwIDE4bTEtMThjMi4zMTMgMy43MDYgMy4wNyA3Ljg1NiAyLjI3IDEyTTE5IDE2bC0yIDNoNGwtMiAzIi8+PC9nPjwvc3ZnPg==;imageWidth=48;imageHeight=48;imageAlign=center;imageVerticalAlign=top;verticalAlign=bottom;align=center;fillColor=none;strokeColor=none;html=1;whiteSpace=nowrap;fontColor=#54585b;fontSize=13;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="1"><mxGeometry x="433" y="485" width="97" height="88" as="geometry"/></mxCell>
<mxCell id="e1" value="WebSocket" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=open;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.253;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.505;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-clients" target="n-lb"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="395" y="204"/><mxPoint x="327" y="204"/></Array></mxGeometry></mxCell>
<mxCell id="e2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=open;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.505;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.504;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-lb" target="n-gateway"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=open;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.331;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-gateway" target="n-chat"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e4" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.669;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.505;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-gateway" target="n-presence"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="348" y="593"/><mxPoint x="511" y="593"/></Array></mxGeometry></mxCell>
<mxCell id="e5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.505;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.753;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-presence" target="n-status"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="511" y="1271"/><mxPoint x="447" y="1271"/></Array></mxGeometry></mxCell>
<mxCell id="e6" value="who is online" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.755;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-chat" target="n-status"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="330" y="760"/><mxPoint x="404" y="760"/></Array></mxGeometry></mxCell>
<mxCell id="e7" value="offline?" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.747;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.253;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-push" target="n-status"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="172" y="1271"/><mxPoint x="362" y="1271"/></Array></mxGeometry></mxCell>
<mxCell id="e8" value="load history" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.669;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-chat" target="n-history"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="305" y="1034"/><mxPoint x="335" y="1034"/></Array></mxGeometry></mxCell>
<mxCell id="e9" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.255;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.503;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-chat" target="n-topic"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="281" y="760"/><mxPoint x="191" y="760"/></Array></mxGeometry></mxCell>
<mxCell id="e10" value="persist" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.664;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.331;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-topic" target="n-history"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="215" y="1034"/><mxPoint x="283" y="1034"/></Array></mxGeometry></mxCell>
<mxCell id="e11" value="notify" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.336;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.506;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-topic" target="n-push"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="166" y="949"/><mxPoint x="153" y="949"/></Array></mxGeometry></mxCell>
<mxCell id="e12" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.506;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-push" target="n-apns"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="153" y="1281"/><mxPoint x="215" y="1281"/></Array></mxGeometry></mxCell>
<mxCell id="e13" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.253;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.506;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-push" target="n-fcm"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="133" y="1186"/><mxPoint x="70" y="1186"/></Array></mxGeometry></mxCell>
<mxCell id="e14" value="upload" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=1;dashPattern=6 4;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.747;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-clients" target="n-media"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="438" y="204"/><mxPoint x="498" y="204"/></Array></mxGeometry></mxCell>
<mxCell id="e15" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=open;endFill=1;endSize=6;startArrow=none;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=1;dashPattern=6 4;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.67;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-media" target="n-cdn"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e16" value="download" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;html=1;endArrow=none;endFill=1;endSize=6;startArrow=open;startFill=1;startSize=6;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=1;dashPattern=6 4;fontColor=#525759;fontSize=11;fontFamily=Inter,Helvetica,Arial,sans-serif;labelBackgroundColor=#eef2f6;exitX=0.506;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.33;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-clients" target="n-cdn"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="417" y="441"/><mxPoint x="465" y="441"/></Array></mxGeometry></mxCell>
<mxCell id="legend" value="" style="rounded=1;absoluteArcSize=1;arcSize=12;html=1;fillColor=#ffffff;strokeColor=#caced2;container=1;collapsible=0;recursiveResize=0;" vertex="1" parent="1"><mxGeometry x="677" y="1430" width="136" height="53" as="geometry"/></mxCell>
<mxCell id="legend:0:line" value="" style="line;html=1;fillColor=none;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=0;" vertex="1" parent="legend"><mxGeometry x="10" y="11.5" width="28" height="12" as="geometry"/></mxCell>
<mxCell id="legend:0:text" value="Chat traffic" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=nowrap;fontSize=11.5;fontColor=#54585b;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="legend"><mxGeometry x="46" y="10" width="61.07" height="15" as="geometry"/></mxCell>
<mxCell id="legend:1:line" value="" style="line;html=1;fillColor=none;strokeColor=#aaaeb2;strokeWidth=1.5;dashed=1;dashPattern=6 4;" vertex="1" parent="legend"><mxGeometry x="10" y="29.5" width="28" height="12" as="geometry"/></mxCell>
<mxCell id="legend:1:text" value="Media transfer" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=nowrap;fontSize=11.5;fontColor=#54585b;fontFamily=Inter,Helvetica,Arial,sans-serif;spacing=0;" vertex="1" parent="legend"><mxGeometry x="46" y="28" width="79.32" height="15" as="geometry"/></mxCell>
</root></mxGraphModel></diagram></mxfile>
