diff --git a/docs/flow.drawio b/docs/flow.drawio deleted file mode 100644 index 751ab25c..00000000 --- a/docs/flow.drawio +++ /dev/null @@ -1 +0,0 @@ -7LzHsutKki34NTnsZ9BiCK0IrTGDVoQkFPH1jdj73MybVa+q+43a2qyuJU+SIIAIeLgvX8vDuf+BcsMlrenc6FNRvv+BQMX1D5T/B4LACE09/weOfH+PUATxe6Be2+L3EPSvA257l3+u/Ovo3hbl58+x30PbNL23dv73g/k0jmW+/duxdF2n899Pq6Z38W8H5rQu/9MBN0/f//lo2BZb8+cpEPJfx+WyrZu/RoYJ+vebIf3r5D9P8mnSYjr/dggV/oFy6zRtv++GiyvfwHj/bhfxv/j2nxNby3H7f3OBMi828p7MBcIUCqsJpkbr/wvG/0xu+/71xGXxGODPx2ndmqmexvQt/Osou077WJTgttDz6V/nvKZpfg7Cz8Gu3Lbvn9VM9216DjXb8P7zbXm1WwQu/1/4n0/xn5uB9/z19w/fvz6M2/r920XgY/z37/512c+nv66rpnH7MxEYXPifzfbHkp9pX/Pyv7PVH/dL17rc/pvzsN/zgB3/NsCfRZHKaSif+T0nrOU73drj3x0t/eOv9T/P+3Mps67p928nzFM7bp+/3dkCB54T/oQeQaC/d/wTeDCB/7t7/IfzUfDlf33+8+Z3Bn99+tuj/OvQj8v9n7jf75BH+t7/mOE/ueO/nA14ztm0W+nO6c9CnQ/k/LtjfbZ16v8ZqOh/t9xHuW7l9d8u0F+WhLF/swwC0f/rT9ic/4IE+g8iNH9DAwr5rxf1b4b9P7cb+v9stwduZvC2HX4QjgXP2z649kqz8m1Nn3Zrp/H5Ppu2bRqeE97gCzbN+/rH5Nz0ntafW6HVz39/uwfzbmtw7QbinU0/8y/yVu0FFor9GZL56yj015HnfZFu6T9Q5vcjIs5j/Q+EawPWdE5Ik+qJef4zXL8R/Pp5V4N/FIVjYnD89VzAJh04zghvwQ4cLNqRgovsMimG58sKvHRVGjyIS96fb4spmqqEOKeFAquHvXtdGfXy7EisfFn0yHh4hctHEyCtVTTt+R/jNgfla/JZJ4xQB4m4NYngC4KduGOBEE6S7Nk/EHYkS0ZZPWNAvGGIhudB2Ax9Bmdz8pJVAn9Wj92fVw/j+BvtxUplGC7568Uz7VkrbfIfj71t4VV7qsBwf71eX5GxS9btGUb96+WzHMZ8HYZp/7x63cN4XbFvq+UcpWZ+X5PMCJq9i9I9JepfB2Op5kTFbaRKEP45tuOaDBM2OWeM5z/va5/Gc/25cXqpKIKrMD8vri+Z+s1hfWY0QsuwP6+mTRkmaFIhpmxb6W0GvDRRgVhWM24F8f41d15AmLpjIAXH/ppSXeeKM3GMn+3OZ/jrIONKas+ykjo5Hv6XjVgGsxtbYCY07xL978//XK/fcT3+NU9XY0+Wq5XG+eDSN/6dZ8uxk/3YWEmGi9X/zFPpfR7YxOO65DT6889cdd4G1/+PTf/Hpv9/telZb3K1veDAbilpOg1tYrX1AfteWnnmltulFn24KuqzwvglzTQX5HdztW0EXtQlYnyEHpfp7rfmvVUO92BbEd8PpnWxxew6Er/iKJ4R64CptSzS7tLQaXm+PkvhwCk3Ms3FnVASQzobQYP8BtkOETfl+QdSmzUmRCZq8guB7QLZR0jIvdPpXyfnMcIp+FIEJ5YRHppiQVwlUnA6Xcdzd632q27LkAjb1WQOnpuhXodSqodUwqdbRUtYnRfEK+Karv7MPFdUZvjVHJFxEOY76wuVQRyJU9pzpX/4gWXxjv4aNb39mE9CZyd4JYgOstoAHZkvYtRtWw/a4OjdZ4GOy3OqSUZnaabk03tuQZkMvUdiTUEhaphfBKnIwdlwdoropqxMAh8XrbHZCfta1VSIuZTnaXWL+/hcK9GQ7akX6S9n8ir1k/nUAldrlme9Dyl5K230nFTTE5/sy3EOvqq/9ou6M2OEn1vTlCY/ukpMPFW143MawC03rLRSnRqqmnCBtblo2FCHjhTWY8pvVF/DyZrMHiRntXlFmTWIDu8kU1EWS2JZzdQysmnADOy5hZgsTN6T/x8T6gUcGoyNbFl7m2Hm4Wx81B1rZ1lADi7d1kX7kAS2KA0CHfy2IhFI9BrHFNo53S97oXiIFaE4LSgUk0VZnWEjOeMP+dxcBCvxrdswu89X7568hLwdlAnXgtlb9CSy9Lmxl8HmaOA35nPgUwvRFhZYoyrELNce5IWEA+x1w6wdicNx/suGVl85zWH2kZCDHB5Lty4szWRimhan5yJ9nlEsDjOgBQs5exk39VbhlogVg66CWrQ9VufyGEyI5Jf5nIq3LXDtrGPe/ol4tbaUR+WeyDryh36nGOY7jVmWptv64MYD8bbnXH494dVmFm0XL+Nh6az47fK64uLlRk1uOtwIxSt+3lZXPku8yq8UHnWnFp47jFvPhPRAcdwb+dIGn5p+wPh1w5YmRrMglOrvuYar7FZX9/AnNtwcrHCwdV3bLw7xcC7nZYoYBvKNa73AHlXI6lIK+NZLwfEuK2kqasGD6YyMfZWY4svhbdSkXH+gAPMgpWE5cSKqyUMfZ76e68XyID7+Q6/3jD/PAg5Q+oVRPoeqZ0jgCwaJZNwxy5vvvaQpnvPBulFxsuCrmZeMTSohjHySMxdYhs7Nx0+6FLvzN2aPx2eKEfDY8/C6mU+5RNidzQ8hZ+35Irgr2TJFfBEp93htI9qjU5lLiL58erjfA0RwFW/esGGsmk8xtbode2ZXLxoKAmxEgK3eW8v52aRA2Zwbhw44ZGrkPViSLWoQg4im4cBLZ3DfCwFDslU57PWc9RiIlW8uLZPhFTwOZxiJDoydNbK994Nr1g8VFK9a2AkvMQZzdATGBuxwPSRg6u+duLk4OXW0F7PP9+RcBTVi2WrDTLQeLlnVj8SSrwqkzeVHpI9AT1T508+Pk7BpQ71UHedLzwCBDdbYEz559KSlr8/Qq8QILFyYh5XeyMiKeZr776zeOBeQULxWnb3VXfmwvaFBEGOPGg0FFn0g4+H3bb5+aU0c8AdYPsPboifvaw/ySOJj3+bvuEwHwVC+Zg3JZiS/ZxL5tPt90AFZr5xbFBHrBd1as2dmkfLJLKgDMY+FVumZqpV54YupqUcLiUTd+vScHY/aYZNvCNtu+9H64ee7OISP4OHI4j6h0948ZyheYDBbeTzWEEu4pBAxApDPq5EvPPKLjWPVDqK3XnMHEAK1GdIEsHZ9A6QcoOV1kHpspAYrbMT6nMICNUDHOoU/iUDMtFUF86tKO6rKMBPlR0Kxx9HoXW/xbMO7+lthKPNrco0BYdmBpr1QqVRUxgCmtJEdwDg32csfy3bqSppwiW9gZpljCUOTLFTKo9XSeuaJXYH6r6LX7xdB7CHNk0+gqU0zD/3bVVLe5hPCqlIKn61sDli1lw2nsbMGjhtW5k9LA4LCGQ/J7VwQR9qrkGK0nCZOM5uvtFUuB56oXtm3nPLBqJAGK3kvW3NIFDguMsyvj1mVtcLXqL/m6dRymJFTVCEY7FfX/Ugb2HrgR9Wsbsm2yR9LVUGg25HatMe41IrprPKYRDYknTmK+Sx/jPSiLZrdmB0vRl7A2Hnnm19sbxSjxm1m4cbI7J4Rr+0+UduXFQp1PguGcLFxCOOCRGBE9GEr3ufcbgi2BUuh5GJbpi8fG52g1TPkIUgWVMrITqE8zKyv2T0mYb6dPDqIvKhmFMxvLuE0m0vqXoYE91h7JIomlM6I3abxAk+jUskosN80xPFscvm+9BYE9hP2I8EtuI8KJc/1Dbhe/Pfr387P/ZmInbLxvTvP+DMxxvC2iYyXqf1zD9l47uHK+JyNQVsrZUKYTxp0BOmbgetucI//Gft/xv6fsf+/G5tMNtvmEIeHaTrrasIiPsi5hLTUhYbHg8TEPPpKyKyelUr10X8fWY/wjSL0uO2aUyhSJOdXa8KZtxxDcMHbJZASqhAy9cz4bh6zGtMgWS2IZ07gWWotH604+GduQyQOaF2LSqU7pmgzbC6bcaA8kzqzxyDJYxBYsGcuaosuhiGfZfeRfTP/7fdO/2AwsmarOh26V0M3+4XsXlZOh8u1WOJiM58AW/o+CGx1+tmZN4cc3YPQVDclEqhFtQ9GY4ZH8LFZ+dsB6TZIrXE6n2jmH+HLDl7GQam9hXzXycIdqAT6l6jWm2hse+LkbGce1H1WZkeIOc3FFvvIYgLXMN7eZYHFI9ql9xpbpCOkz6UKVq1EXCMvin9WlUwemzc5S6xYtHkguSmRLpHzhwxIdtBWWQf0mmfjrwYUemA1GBVRDqhqFS0mABvuIUISY9CEz4mmcLPbEgDBGq93pR0MFurc9Khjx3kUkPj4gFxMHIfpjP2cQxscYsTT4FXQ+qgDtN6cIeq3l8QLQDs/vFDmYJqrdeqZb+8DD8LJtFg+phycJZaO6SPrkNXdeIe6NibpanFDeMNnGc04WB8h/HpWJnQrGb8xPDtp1HiiLJ5ujeP+eiiHK5J7pxX76ZKwqECq5fTxcb/Y9DZgi1DhwJgFpj0rWeXbe4erzviAeib5XtV9CV8vPGF9XMTWT/TD4aUpBSVGt1feNba/kcATZAV/t9Jrahm9zduBOWfKQmagsOR7MKIKkptboHzIlpICf7lX7TDPunIWd0074sbcM3bRPmn+MxoHsoCxq48A3KphfKMKelRs7xmMWTJvpCjAY5hWxzAPkfPy0giRn4cwzhc3aUVObyZsr4WkS1m9ppJDGvv9KFL2SxT5o7/bD4EAxdg70rMAX10CRK5VXu3NXLZQIBkeccA0l3UgL/y+3tQJiDU9/pzHTaG64fK/PcOBCZPBm08s51Ib32TsLjhWbhDQyOr5XPXQaNbfCLkx6vW+/bNZJAfjOJ2/SusFdcz4Vc+cpCfuCZEsL4LrYYwxzMrNer+BjGBbgQUznoo01K0TPG3zKV/zt1fIHXriXKIHW1GOqnmb0iFB8GMx+IvjEYtBXsjAUlCAQr9udedjs6ilSnV5SBlmPjbPh2/PiNF5hHPLvxCME2QPeilGO8xmLYeEVu/8mSsIes153HGGpXLC4+ySbtrXF7h4dxLzkKBonNQvGqNOwOJ7U8qkXnYeF5cZum8fAe+35py/lQdbvU1B3/7Oz99nxnVmDCvvhsVrVwNFeR+x/g4oIH/Ed2K/akGz16EvJfzRz64wOeObsm1RiWnPTe0BDpsBlsm+iHtBQny7QmWrhLxzgSUJK32Je3CI11XEavwHLTHHvx4fEz94kAIIUsJvVfU17sBAmIHVMo39dMvjcrmNcMv27F3lQUGXsbsaASXyBwsvASCSuebfxYYd3TaOhqAmatyXC9NnI6Fet35Q7QMRWcHVGEhEcZiVXO031CXpC8No59SeSKQ5i4VTHxklqGyYaHTZqK5C1kZkPZdcYkcgVYFlMUXpga/07PXq8WdsLpkTXF7riNVv/Li2YKBD13nm7ubkC96xIBAjmo81LXrSjbImr1p5MfhjfeaBCDOJB+XBeM94mcoDGsyneDwN/ZEw0ReEtfcQdRC3rBECpeR4IPmghsNjO1hLmQewxbbMKCga1yuab+mB34DSQ7tNmYUP2dLNBH3OQOJ7HyF6hF7cCoeSs6Pwqv0viDrOk6HB7rlJVZF5fHO7peVBAyFapnNj42A7rwHQ6knr9h/VK67l8/xcraFK14M6ZB+qi+4Iwul6OxlxK9rskMEiSXQKHxAu0Ea8Gq/+oMPSZhHVPF5fF7v9U+0dlY/np62itv0YhvsdEfpSIS+pAULrM9URvpATwcNxEFKM/6g2NhretczGAtkzMfs8cxoYpuX6ojKiwq5PNVf2T7Su9QlAxqcCyBEvkOD4wAxLy4iEcMbep5TbOzOqIEOpeuUmnK3V/ZgOZeLCQeQgBh6B6lfcdcARHYrN0NGs1aNGav1tMJ6FV8D00Y8JGLsfjFlvFPExwXbLlgjJVrftw5gEpMKdB0ZlCzG9li9Dcc6eLiumB7bAgFTHKAPiQaIiauUVs7YQE93dt41Ani5057dIJkX11dx2AuUkJ4jgd9TVwWFjmr0JqKKPQBTajQp1dtRiat2NASjxzFC1deAdF/PD/LUZ8H7bz5A/aJsxv++gYF1Eqt+8faaVazzxIKbfmf3JYBhWnD1wolRsufEFtTHI2k9UsrNt0XzJxAzq5zORfWslBOcxc3U+4LWPrg/4CdGt4sK2hIlcoLSi6/1JvEH9hRwnr2Ke9GPWfbw5J8jTX80S9RIwCzO4vttn5vpXqQ7aLs8Rf4JJSAgFvWUhHfgGqlKTWqpVbST9dK1+Zl22mabceJjkmf8Wlr9ZcVItCQkKsV+fWgyt4ZGi3ZslUXyUjS9IAShsnruZm5wWP74so197e+DxR0lvPMkqXOHQtvCiJpkpIljYeRi+LlBQQW1g035BuBEEpplFT6jQ9cdyIlwmVWUwQYWMNW077Uxu+2TZQxTWpDiQFpmoFpNz8XEA1IU+/Kmc204aabuR1tDZDH6Ksn4hjUIJQhU0MIzuprdDsKHyOlvYYUsfpPos8fgK5MAUFiY+74mLCxCSH/4wQZasUkus9igbLqQyKf3kEy2nYfPtZBKfBYHkFR6yr+UIilI/HsUxoBJi7k02yHfP1i6xS29Q2+jTA3nTStarMLlzH4VRtPAedcYsQnzJpOZT18pHcs/Vk6t66xzMLjD4khZ09blArQIJIJUxKAxnYd80HV9XB/iKjtyVJeDS7Wyn/qK+eS28rCiapyzDd0iNa/FhlGd4PPxCVBR5d1k2qq+3iIlsV/kelL5AqZ8FS0Eq+JMfsrOqV9FE1WqhfLGp6ccfWbiucwdPh9ebos6hzeuBucFzOl9GtyRks9+JGcrvjI6cbX0RxTA/7juSBGLOjf3Bhspy6VF0Tnoi6y6TaKq9ouJdEkHNIWNKfCuBkspgcz4BLqINaa4zpGqAj3FgH6K0Yjx+ZmGR8QFY1yk5UaYdTePrA8bU1zwZJgyRKQbOjQN6/drBzkEvlVfnA+DrOY6rKSXUg0bBPmAbcR6VzGTKJ3aOZOerK7B8SkmMoon0sLOvlw1R5oCMpmRJ2Xlqd1beGGuX74TlsY9C/NQwlfDd/BbCICs/NPmd4ne9ca2f2dDojxmqk+sLPsmKq9v14R9be8JaBup4ClnS2LwQHgQ19OwXX3wNIoigZYZJtifo2HdWEUlLrqGbMdvrDq5oRmyBvWAylOEERMy839B0PTycL9DR5TgZ+MJgCORB1UTmI2wQGCHKX3F+FMLCNfB6/dQDzf7yX2fR1+8Qxoku1q2k7MANzcpzZLVCyLdk7OT9ltj4w3Y63FXpPTv2Iwob75rxxFy+MO0Z4+x8BWHyHPYgItKeQG6A9/f8WftCgHk88GrpQlTWRupuGVj1pnP2UE00bciQtmZxk99nscNoM4YBlusPD6RLlVtGCSJfBafXk6JULxUOgTUU5bVGe/9RFHvov7Z/RMHJ+dVn/PqBzS1vSkUIgB0nvSIuTiO9yRmtqeKCTLZxWuPayKrba0RF+WphWsvekUUPr4GiUVqgix1/ra/6isd6oQt9uYdbY2tNtTvLmi27SARGPZnYxx9KSv3iobIyolBgwbihGNBMO75p60jSFRmf0sBYCmFbvU8/7stKey2f4hQYMYEQN8Xe99ehapdCcXMffUwA+colgJDauLSSMScSFoxr84e6BU22VeRlmAfTKW81xfQBoTj+IUCwXXSnKyKHQzclBNZ1lSxq2Mi5lX1UcHuaDsYpwzYfE0Xgn5Zop0DyiJkyfo94OtaS+GFFfi5QxYQ3nyi/FRx2oraEf10aX9AA4ELZK4PxFkXFHp8sYURliStvSiw6ovEJVi9n/c3k3IYVwQ6hcn0gxSH4y7p/E2lsvvLCHdrdXyLv2zNOwRoFX5V7u/KHKsuLsDv0U3RS5iQ0AgrojsnAZ+pQ2TeBhkbp9i4VlBXurW6FL4LwEfHY3sVkFy1hzD/zZLdtqXwZzgnPGpetyViJDmNg1onNaD0pt4gJElAKt0vmwUtWcH0lKMVXYBS/i2k4HV2CJy2iAMI8QnPG7FoH5lq3aebdo6f9SQZyuIkeftHeiWoHkP0IoyUHOVxQRTnILnnaxsDFUpKV++coAJ1gcNf1xcJuF2Cdslw2Jhkc7Sj+oX593DLAJBf+NPmfhQhZSsLZdwJ2I+TxtVHC4lzUY/bIH+aNrvhe7rBBHib5TQJcRGSiwIgZoVwtId23ZiAqHt/jy9eZW2tmulp5+mtoEd546+Q+PtXgSFMyh2A4QO29Ig/IPdy1ZNF+q0WmEiVta/5RWusG1kJ+yNamUkejDB+mq6JqvqWP1TZZj4tZ7lY52o8NaLMSdKz/4NgdUV5qQmZdizQHu1bgt2KsfaC3RDKA0LhRsCUsnrTnkcoQXLLUX/0AlgD6CXg/CIEqSh9xc4jQYi9vj1BCRrRKI4vXII4+XYZsOaxSIt1DnPpiDaZ5GMUnvVlxzo6Qr1vDrE3tBZlLzjjVhxti0cb6d2ya+hEx/W9jgCJtJCp39emUtsbBcHpMFnJpvPG2MDUoB/qHlMmAZotiEnioNWAYJUrNlam24LoqxrCuiM+PHXh1IfnTgjKGOxrkpk2tW7uz4LmCkJqQJq8jkBCH+nlKUqkZNpZJ30nZ6TXemcPkDNTNyBkUFX3a7kapoVxDai7Dbgb0GuhVIB0NqBK86ct6yz4IodAv9HthosIvWAB/IGSgH/WfEHCTf4TfyPWC8A4a0KugKm3NiIo7uGy8eXpW3ZjR3V7jTVROlrgPX0VZWxUjjkdlqfWERGSi/PRZoISnyE4t1qFOVq/ri/4UGD5mAvAqwOC27/BDdBtBdqVHG8j4ajBB7//0VRGOXOtnN39c2MQlHaisJ6z32+FpxmRks6kx6qBsUCoEYYWhM38fsQR/2p9OkBByJ4499UTpdLA/HEYRVFhiXssQtqcc1j4EUz7XTAJFB7eVmoT96QCp40fKMrrN4Xm7gX29HOJrFi5A7IdtbwNu4BaUIus2OUW0h/WCsX0c/8crQDUMZSSeffgCQh0PZAttvsrsqg3jo+QdztCYbUpkH3BRieVA14lrKzYweY0zQFtxWk+/dwIF5LGWjaq8tNpBG4QutgtMVb/9033pvYe4DNP7oFIxRfVt0DSgwWIJeA0PtkDt+8Zna+yXMMoXZVoBq8ykm0jDOhZ/ungUQX94vq1jTr5tAMZyOoKcilGZ2TPphcYc+kjB7Zw8v53PYnqGb/QKp4pMawtyLTf1W1AvBDpvYJUxbxCjmLC366VJvjyuDHsk9fxj61790x/zV51hWPZcqTSChAHxGe+zPq9WAJnFeXVvXRS74tH5XInYz3W+xIBZcjzQKR68V+XxtmoexrRXAeffVJKvDYiLiaeSFHjD15qetNR+wIgiqA1oJm/ntPVFjQ2lVnQKBRma6Nt/C2fjYeklK4bIR/kgYLjzs4w6QzH2M34JAojlFFAUWm+Tx7b9+JFu7pfCbUWqnAA/zQ9OSMA7P22wWY8P1bItaPXodzkp1u+Uf8N1XBOje+5XyERsiBjR7Z0FGQv1YNe6LmhMbfJ0icDTC48KE9iE9f0tywLr7dLc+/SeMMUPZJWmhz9TAQ+kZUH/rqH0AV1YH5XiAauAImZEq9sTJZxruDEacGz99KBCGJzuWqCzKN66ebNf2h8Y1lKNWtFsMPne/6yrBgobhdUNFi67fLDWmiIkVLgSEDkSr5qYvEQ8x9jDOC62KH0sbwYkgYf/nXW4//jX5eQGAXoZWioOeblJOiw+Ya8mXO9hQFzQvGpFrcmy1nyrpcgtlz8pIUz6q8lac8qmukExNHuiuCBnc3uWUA1BKWDgk1OZwxWstFumF7PWXm0CjCXjFVnGFkzdatrSqFBUEOWxRFIeoMju/myCbqnYxdRpLzhQWKwbmvgCPUm8pVBLmx2E/SF+MV4xWvAoAvYXC4ZYfcSzTg0pIjivcyC3AeQW5nuBkb0PDxERFmgFsK9cUUGi41ip+Grp/Pj7i1dA3xkb7/KH0G3poXlWpLYJKeBIEYKaYKqS56uXSVEaK9n7I/3OHgMbyqSwtaz7zGLBXFAoN99v+ReZ1Wwfsf4UcrZUCCSU8aytOyCRRb5P61uqic6/0w4yHj+yf0JMULH+Dyp6P6j4HDtb3crR8slfOY8wWhQH47jAigtGCCb0EA4BsdTNMJClBz27aY/tIltaIKUsHwmujLihvf5k7B6zCf6sF25R7eQLaMiK5T0/mJYDGmztwsfLkkfkl2hXQfdLl8b8WiaM+pDYpIUrbeT3CAUn/q6cXoH0lD0roERgmnTpC86EKzao0RJAzTtFcFwUfe/65GNLNYmNZjpD6MMksOj2o/ViEhBO08wuNlezkaGiVBJErCCDA0AkemiTBfzF4ZWx63JdTEoZY04NSgkMcBYcCxtgNV/u1Jx8mXeHJK+x2NG1JBu15pGNjCWxw1qGEStJjzDnFS5U2dusvjbTVaxT/lW/L4VDE5wrNSewHqGLE/VrpDmFYTiGcX2HDUyT+JZWb9vK3EFMw5ZyWURLzZIQe0rkO45ee2C+u/xRBWA7DJSTTCr6YV2yWkTRuj4aaisiQDE20HyBXjoNEQsRhpfLWhNIAhIchx6UcSeZDKJnz6b5QTSPdAmQXliPU2+0fntRgVGpB+Wh5BSJLKH3t0YB9QwpDdvx/c1xuUITpL33VuMtqzY9S1tWW85ZbMKHi4gl+iTsORRa/cOIQQUeRAkINHQOyHBwTzbwzo8yUwZyzbvXZV9CM7dIA371pPM3w82yjEFO37r1MoGhtzJ1uoug75uk3TyBX0HasJL8RvZaa3mb9QDBJQrSJveGZBhsxabPGwb0OsQrgIQ/PTAgSoPguHjlNgTk3vdNzVg1Rk/IexB8FWuv6hWKPPMn1vd5B/UVbEysBTd5ULPCyFfOEKKgeHtWQ4PMggQdBd6Q5F16bC6nM2vHP3IHkJoDkd1ypeiFQdH7tUPeT3OgcGzZZX4Ftmh7uGk8SkTvriXP9Et6vPgdA4LVHj8RIZk6acPmWNAT88BjWk4l1B0QUWqFptj1+pxLwnKgQf65jXUnj6i8HC2/bLj/oTPy6kjS5YiqP6yxoJBQ0sIRPEI/vRgZT+FW/AatjdpIT76HDTRFxXxkZ+8P7oarJORLjpG58rLeOILqHj+yD7uG0hcJ71uHvY7C+Q3be9nrxDYA/A13qkdFdKafsYiqm8I/RNXmzTWBEPKF8nwrBqWKJEnjHGguIrQ5M4oGr6rTsxUCfcPUBRw7p5AINEZSmYYMBnwcyDGyofze9+5VW1xBft4A9ReWWRtZ1KrN6mWqF9EM6t0l22ks5qD5CMYjITT9qifogf/6I83ubL7ATh774ChNoKGBtDUNvR7G7WXFUkH+x+zL5uoAdYFgaHAKRpCU0jeLgo8n+N1mQBrenxE3TLCxLIp0WcAVxPrrtSZw9sh7W2umetw6BxlKeMDVA+ss4YTHpMKFVjrlBwataADL8LDZVMGEPJjsYMFU6xuWBS5w3lEmuPuELAhHn0aJfMY/ADNduJAfGZX1K++cgrpIypkOFMirmwz6K+FizoJvM0f7i5KEmSkirIb1gVU+2+vJI2zwmUHnFPBXMHk6WpBlJkKu66XKldjCkXoqZ4ndy6NQILdqhavJyxVKn3NY19uO1ZWY7r32WsqDCjDiGI/wKotlZnMr2cNyM0014OocWmiDMq+tz4JuNbn8RS9JZu9Hf/WgGpGvlCQxtQbQ9DW7RnDhcQQqA8Qb0oaO4HAK+ioVP3rKXFPmqYIihBGckP34840QGYmWkzbLSZGf+rd4hI9Gg+r/F+yjuFaDfb86qOiJa2NM6ePPLAHlXLOVeqszjCNj5O6TpZ5qa09+p807zt8Mah/K2MD9ICTfE+OY9kwy6QPRnxxsTZqH0y5uvXLVZXyDht/DV4Qnob4s/VZ9O6BgFi2qK7AaoW0OBc50PcY9I6Rzr5zUEW7RfNDQSH0MktH6BJ19KvM+rBDZ+ms4P6gXBV/F5GLGuYm+Bw3rzjNMBcVDUHuYTpmJslS0n3kHGwE04qDWPyb/4dVWTxAHN6xSxICegdgTQCg372F22Z4DcqWFWVeo645jAApOl8pxvTlYT165OGPEH6dUyQ5SZ/Sn09TiYa7ivJc67vU+9iLjeZeBKg4k1cqrvb5VAlF5zr5dc/RmxggTP79N+NO4RfX9ArJC4RPYJz9v+it2rC1wk/IqkSvjT9MjSGS5FbA/TeZpejI/EMIyiaAORcRcAmBXnI6N8SDZIVvvvK6/j/DLUnCvvpMjEq7BKGCucUZwKfPBqOTrQBzoeuDS1ymIjK0xI6V/Wqn2jRMqYy26w0oMUfDor707XhGMskATBP0HpbowfStsJ5L++eVqRTyT93tbFQdOYhmYMTMHDwVvtDw7HpIVgKjU6K8aPymL1/Dldyfagj5gS5sF5SGRo3sX0Wywi4fQ2hg5bx/UbQ8fqg3k8U4kx+vGFvTv9SQAj40lDjOUxwoIPb+yq1MWmoD6++r2GhR058rsmHXwZfQDeQX+sR5SFRbEnmh67T++iYQ/+Z/s5tObcRi5PQNWQKBlFeA8MumrObNmTAWGWAsL7GmSTq3+zDcU+pIyVqjlah1orS8rvV+g19814zrexvzDlukxH/o1do/eP51rfd+qIzymeu3ITWYQdexJWfowX2OOJN1jt6EfyQ88wmH0qms00MtIIKqXTe3jCqJa6nFcqZM4qltBXhsFSS8HKF8HuEFxEnfQEGjzsKgzUVk8vXSwKkqYr99IEagVV+lKffVflwOCmKFXVfqWySw9PPSMWFnaI/0tPC5Q72SmZ4fbhjzEmcYx03xaFbv4sQPxtJ74RpWX9hKvnxrIQzCfKwAvf/QLpS4+l9vpfc+1vTIQ7gESLhb4QVTLzOhlduvvPPlZwessWuj1u4KzudMvC/mMMPrBpQEfsy0Eeh3zpc5MRp1jHgXYyPrdho3yuOkobktxLW4Gffc3YHIxyRUTEawWieSnW1z661lpKX9WOhV+VxoBnazs8e4kvSUfX2ig8LdSWcaEUhDBSzD6F1Dh4vQVGOaJn45zj1KAm7pWZkl0j+JqNRZZwnWuJEiosCVPPFZAe6zkYiW9U/hBnmeZYDRLlwgXKHVTCxvofWFd4P3OJkCnKJFiiNFmU0qyZ+50iroxYQ/4hAKfRTSk2mn9VEYymlH5NLhBLQ9ksBVTvM4NOnR0QfeWC3aIr/b6HRNQiSpdkicjHkNfHoOypBm1J1Al9tRu4KFVFsqDK6IyktJLcmtgxIimF3h8Z5+AK+VDXPobajoVhiuxcHU9sV6uYOh2L9f8f7BIUr8/QhJ0KoTYBPR908GHCM5DIGUo9vggOvnTbxjFtGIp1Oz6ee+FLSe66sXLMkg3FEjhfAdbOvWmuAo8IuRQlT3Oh3J55PQo+G6mRh826x8cW7L1COGLAu4hS8iuvW49thGoFezocbwIzd8Auro9y8JOdkY6DhH6uF9TRPqhrSCdyRyBWIeNbxrmKg7dgeruci+0raolIZ0dMDmne/XJV07HINK5xlXqCA3nGCArPabZ5PJAzrXbEbBT+4jiPYqY9SJDo7pyDnuQl/2aSZaLUMCCqtUe0K541B8m8D/D/WJN6vSf/PwGisumBZFC3zGNQ78dKtaa7w6wFKtWKEJGZdAjO43GKBx4NtT51ikOA9WJVlmD3ePhKrz++xM5FnCDnc6yoVmCoypLhd10Q4xBCYfdbmJ/3O1FqJX+dWTQ0zLOnyjGdTt9gvx1V9kRDgRjgdJ4oo9fyx+k5YOBPGTUXWp7tob8l9eShz9AnYZ722IYcpZ2XsD6ljDVIqLjkunCoAwsqjyBOvVPdih7sSAgPEgAZCUx4KqQ6FRg3wg62eeiHy8FFykNcay+2z9e+mgp+gv2SHsHzHKxicllMKOIoIEQ6hkUZOPLPn2WWbgWPbYcJBFi9d8wOvTt1KYp/qyG2rbjiJlcz+OdeBv2LwYT8PdGAfX+CERZ0Z8+b4QeEl/4OTMqcEXnnkGxZNarEM/rnzEAUzq2GJSjxUjUR+iaBbuxfoqeSGFdlcJCaB9PJAS6JaDhWdoBQGrE4hWMrF0RWPwcvwBmZVqnTtM6AF2ZpqIAGvxFhyMHV6GYh3TQW4vL8w/y32V2FSQALCv4OiTZnt845YgYRqE00Cmkjz//e1+iotIYN/iz6riddW9Raqh1+tQtbXtsKioQROzB+UCIK+FZqPUwM0zxtFUvNBxYXXxQ+9vbMhGXg6H33MRyvbaUKmR4/cNn+JZEOQxxevHM03WmIed/i0pIgk2cTpjGFkka087Y6CMm8xPXn3w9YtDdeqXD8KhtUYlQ6TWkv/BkPLIA3dsnB5LI286mL9e3W5VgP6xIu4EGgttn8QWReIi0Vq3nDMwKFtTkgA9vRiLul7HiLCuUyVf3cwJ0AYF12T670xM56E3KU0/ktBbTse+CTvDNv+H3tAtBSpgvp3Q8dXwcAQWY9CCZ5SItLng/CMxes2IrC6XZB9S158cUWeFEjoj9lIATA26WtEqUg8K78lAGvzn2q8ZzW/Eb3XXENqhVReXZKwcA+BGF83tEK3gEuQM8qike9yt/cqsLyCkp8e8LdKNdqhCqBC9AlCbqKD4uuxQQiNJF0HtfZqrFF5DzOG23qpDuL/YjJxDi5LvJPUO9Oj3ghBWmwrcBOeHwWWVL772fBVNf1UOv9c5mRMULIcduqGTrgNuJgdeleCzCUNuD4nr8/eTU1zF/rNlv1OL0XwNY08g8k4WzmkrbLXfpn6t0lFNKRbret6PTQdhbYAV7zaE3lIjaXoEn6oTOjNv6+ApyvkhRUFY6DRDcQ/5fz6+x69zpFCe5cypJX0lzZ8trRBy05RnbzZ4Fr77sDwXy+g2bHP8LIqR+pihwC5mKZGGNQ9iEQQkeka6Edy3fucM/EQh2kx587a0r1EN1AXdZUmFzJR6Pii7Uddj/PKvlBBSLm/sPNn8ANj9hm/ClBgXKG+AY+EWYSJ5OhDbvFTfak8hUU03e5Q6jy0RNiaoO3Ng/2gWcHadQrLcQqD9DD7y/1+HiVpMyxDtAhn3G8GzF5JNHDPVBykTpbAH0tLmoF399EyD0vigj6Aqp2yWdjkzmA81CV1rn472mf3Irqvz6sfn4cSL+MgkWuaiz93dOXR7ixgaagVqLHIihBev2A+ZJ6D2jNX9Gu934an84pt0MMG4IcbB1sbaq0MOHSJB2mIzolkrU8cHNE5AEuF75DpQ9OYD3KVdddLQqCdTrvmX08lF0ZSEKZkHtSq3ZDo2r1ZvyH7Q16S2vBQwouvgz96F83pm00bW6hXcYpJ+upNwz2cBQO/Qntp21YA9jmsCOg1+cu4p+BtKkcMGsAErP5aw2NOa0pVR7eAOktHh3f9Zbt6Ytrp0OrPf15sjRbxu91DxQ04gT9JYTQv/5ld6wMd0tJT35lh7X5EBn83O0yk53B/sPndR7e+Yr8msiM6k7VduH0HKHQDvAi2ZjNvXvIQG7dvbveqjiwRMUKCZzMfvFoXPktWVk6imzE1X/idbhtuHhc6sRp/+uvHJ9crQJVOB36rsu7nKeuuCT3R4R2SOa0Xx0raDEDQfIRI6O9Ju5LYMtW6F+c4zibLseXVgRc2vS5wNE4LFEYQ4VYaYtPBNMyQbkvwdLpO0WqNHtQQYYQPUG1uVlo4wBP3a96XNAimDic5C/9QBfYqz94fpbfoKYe+7BS3RX8rMH8MuzBHKI7se9o6g7Pv1rxoj09WLF9COjLUghlLx7ZvJeS+Y3prAQ0j2k0MDuihbhco98cmXD5MwHfSjxugIiT2crD3uwTgCRQeN/Iv9rTOGY99KTxrmXnjXxxcFNiJg8kSegus06vuGkL9FbX4VEDqDh99cT3JASnB1k8bzTNfycwMTOCjmjERRU1WO+3s+EvSu3LHrQuNnAEbDPIP9BxectbzwM9VEufcR/lstvKgxKQeMTi7m3Fq3vsMOyqQjGPvmQm0AAS/MYhQgO8F0nN7+r6DyaphKy6/qAupNWvoS52gMAK4whHkDHc/cXbD/kr2/wY2nKrDilVnxW2aUklOblWPlFRomZ1KejOg5zyEYuaJUQVEZ9JyKHmWP0zbZMdPW6PaTdEu+q6yZ9bvfI48EAqnt0BDG9fupkEUbeSUi+lqQMQa6SZgalNlKTfLgGIdzjnq5UTAxKVF+4Z0MfOLXfxZPsQGRNr6wm9aAs5VDWjRcE7b2pxOYoPtc9BeAwF7igf/snr9Td1bEC2OHiZPeCzu8SCwT0seRl5fn8gOYVO9eNOfhhleY6AgOxLLtbejIGdaKJdPuxwI7osZUroI8r7diJvpkv66h6DxuHaNA7Ubb6ZtJZ2A+O7ubOtVxZGbCIuoKUj/B9ueaLffdjsv/eXbICfC6NJf3ZCdJ5bFVLsDh+IcYqHKlf6lbrejPuXD30sFueiYVQX8NH5+8yKm2k8gHa9rcAjL66GzGWwpuKJccTWOR9lH00a73yVJ7AdkhYL0VuaD+pijbDAu3Myz59ezO2OL/6NYnG6HUThKqRX2FEXpKKOWosUvFXij/AUbox53CdQmlkO2N7zjNTqThL3ZUTBn9Hwu4FAYvI4Ds0RaUOys2+iVcEWuMcAdfUqtOrUZw6YR4mPVxXP3gY6tfp2SuruG3KPEV9zfzSLqvYWjS62qD2rHmhmSCNoj7AKExbNFZlB2eBT90bTOpv3mb/rgJ0c8BMbIo22YOZtP4OiYlTvV7LhhNhDwkC/UFhMzV+RnOIQvOKQ6q7XL6/ux3LplZFJa8WpCzhx/1gwmQ7LZ6sJ0iEKi5++5/a/J0feff6AVzHDEV3dM8rDHgbtfqtVa+P3hY3HpcM09NSjM5lC6pABvGB+cDdS6hZ5g5EmfjVczYw3UZtitVXwDOYUsCdVl4dIYd59cEF/TsWoZyx2Dzaa4ZekzkHsAjve/+Ljnv5wYTq1gvxseRJPeTqjF/hTUUytjBvkEgexmSzulB8N3pM4+ttRSdeHgrYlAqg9AwRI7RZtn1h+lcdEH7p4iLfZ3D7AzjV69BwGqFyAvzeJItBgXsqOqqlv3RW1zR5czkcgZmMbQekuH9bci+c+NthvM/bi7IsUmbuDe43X7zKbyV40O+1ibjttjRSgq0oOpgJK5KtQxdHy/v0lFWBfiU0GagQ4CBOBV/2a4WFnzLaej55MKoMyRZD2vrpT0Lf0seCH1W+kcuHFMobNwv6oo4UQT5WjqSjUwoJTA+QVU7E7LeS+hk8PTE7nZMkQyR5oj0IAftgdc39VvjdM8Dos95xNzQFkQ8u8AtiUL3n2OqT7YEc5S+52O+JcL1rrnfGxrKC4x+3J6Lzz44N8MeUs6MdxQ3FdhoAcaXGY0D3vdr1BmZjJ9DAgMzEnFfLUaXJtPsocFIXTS24qd9sRQeuDdhGGjmyPvISezuvVx+bL2kkqtxBMy+jv0eRrKZVE1SsvxjnG8P3eodiNc8xyEuvsE33qeqxGpnL0PA5QcTkY9W2QggEaWxNTL6f+AOothTVJBb6coDFfCcfDVTdxm3sxTfN7oxB39rt37p4aWJvlO1aPuBLDPIblUXiI8+UdR32waRM9EKpT3fu/UjTKuIRu1N/q7YUiTdqxpPQOJpQ0skcufw1w67ofUsjHkZ3f9t1RE82tr34Yg6MtPTjh3nd5psqG6u+HAXLoSqkvozA5e99wtwvJJN9Q1KIjy7WOWMQpjFJOZNSqY1XiLl+p5EwRGsU3KE3RMgoQoBHI62X+Vlh7skW91TS1Vw7JMTWHJnYQ7VXtIGZvZJ/WpZOXutBcxy+EJni1fEpEHn06AdNwAzkOoyKmAamsFcYiiq2tGlGm1iYja6JpjhN8ELHASUHCmMJlJpwdWW085wd98EyIZvR4rfUD7B1Oc8V75mufLTVYqmnX2dbQOvgL4jULggaK2pRZCldbp6HUWJLmBDtysnr2dsgaiBeaf4y4/AGWC7sPOmBRPKEkvtt5/nyfjYGsbkybL1M3xGM/fS+m5n2XZVtsxYHc3vP9MFmYuQ52DgD4XRhhK4zkx80ZpW8eUzifH4PL7rih5tG658OJAmj9F7huMluqd1QAb8VE0ZaN/Dn89htDbAzt9qmNQNZMN5jwzfYEEFA+e286GDFeOcdJNyJGsuAzxQwNcMtzOAuuVIvIS4nReH7vq0avNUMpshKkBUQjRq7ccxxq8RxTUZVaZoOjumZRLhcndWYBS0eCtON7lF72NWhweajJ38V7QhPG6P5CaR91U+D/e4fnnj88c4cfMCVSoIW0Cnx3vFSuwlZUSmwYS5GokI5pyoqb5ZIdnjdsEuuYKrQGYBRGNM+EYYwweWDH8yJCSGW/HVmmXTkLceK5/DosrPM1k9nO+4j01DUUsuUv2RWC0YJWtGW6yb+sQWo0PJaSmlc84HmWEoU4dP+1BeoSzoZVjvfOj/uj9y+9k8WY3CpVOwLQEQ/I3v1JGNQL7DA32xRtLeAeIn6YvmfTsq6VnuBaVluTvcadzH5o5Ec2O9xubARH1RwgpQiuXp7yDiL3KLdJMlfFUknDh37hQhLM5HzxH05YTHZyFbGm4sxAxQjlXCq8sQiEyjVviX7/q3qr6BvC2r1k8QznsGAZUVsLiKLghylnZggRFFsEgHwvqCaV75cUndg3+rCl8TVHhEjLuQFexCBDYv5KLkJ/4qT2B55dTeEeSYujj5yHwpAJ+QU8F2y6n3PSWxXYxXo/wF/tMP0WajAkmBWt9SwZ36Mrzu5v3bWqg/JkSHQ/QYNlc7/9P1RPaVF+76AHxuJk6ZVwsQAm1JvXeOUbtqX7KDeEULWxLbpgFP+/OApNkEHlsnp91yRffGoIECqE1RPkBSo2R4SaCErzCNfGXR72zZQMHX9TbNEZbJ61I9ysE9LP+pBc0uE7t9qeoKYmKmRLzYXIfHPzbgIgz2CRI3q01EU+cPlIM7uP79TwJ2z63G6j3rEFj992MCQs3Wpf9S7yT+u04JfAKbv8/OuvVxtGKi4KOmsBkbem3BG1Rfyst4W+NW3Au90HuwRlzB2xOL7/jVY6ewhayVzX6weZSTkpyAYa3reyRSMoXiAtf1MXI7rsPWWHu1qdnht9BNXsNY9rGP5anCa13PS5NfE2cpp6au2qBFYRnfjUWW3ENqP2pAK+UslyvlgfETOTdxxQ95JzHaP9l3EYfASUyGhoo2isC8elohSZkChZR8iiBKJMU8nJQHnApEEJ7R7ulVB5LMGmlFZ4Sa/tzRg6Zj1vkh/LlfgwK/lm887fJCjYFrQW0B9YUNZax96CSYd9f93e9+x7baWZPk1Pe0Fb4bwjvCOxAzeO8KR+PrCoaTnpO7MXiVlVWW/ge4SLy9IIOKE3xHxfFnre7P49boHX4DX15fKmMguJeRqjMbOQ4/uLilgPFLPctyjtIqaCuCJJc3AsLbrkPdK41UcqMS9nCZimcWvfP6DpWqyyZJLVVFwWmRv94oEuL/wfp61nt90CEb6PgVIS8rDchgg7xJ1ZSgI/qCplFXQK1n2LchmTxmg4AxRp3DoCUQKebwFlhs10UYsFaDuGIHcJHO9k3etYlj6dfl7cyEPLRatHxT1c79LxXaAHM0RwfHSMZfN1X0hbJYZBBp41pcihXoQhpQrFmF3OgD4vMvn7TEDhhJzVkqEZzq4LbmP3mnFk6Zb20rhwJOkFjg9shHDUWk0lEvks07R5Z11Jcu/vGRwh8f7YRtynnORsIMC8cpJb9KGdiRIGR9A80Dxy7cGSFWkiUfi00lAjHrbB9CzOAHsZW5z7EgUs9a/KfTjxaqXMQAaxjm9jacuTp9VC3ExODdxpnYJq5RMpguq1EwWeEzwPaeUIRKAJTTO5X/GDOr0O2DXody9FwT1YAxWVLccmJUnaIkhC3XpM1FYXl65XrNeNWKKo4CerpFo8ppeYtMekeiMIxNkH8xe6T+QVoEsJ3MD6GBznl3Ia20qOiM8O9b0QQToi9a1EyIpiaue5OL2Yi8C9ojvhzIsAAOOaQ85JD/1oPubCjCj5rC8ZSkmDSz2MPgBi/DXG557nl5oBBx3Wyhvqg50XdO2qR7t9PGuY65n3l6/nG2lcv0hUYZQcl1xued4HBgEwpdLSDGI6WxNMjxc7mEVVMhDaqszNqvc+rNvtc33BfERylNSJWWyCMhs2j1hIdW24206cAkVXCbyUigj169BSE+JtVEddeI1+3ZzccCnbhCuUwmOriI+B4iaIYPemUcujyKdk7pZ1xnIh7QvmrQ8Gd+SfG+Lki8OvgTdalzcLYU/S09HFl+SkN/HN7Wk2RN5UGqerSBbgKUgGnmlLq/MGYosfIgU6e0WCuNC4PTYPZ+vFyUTGlm/M0K5IhCFLPtAt/tBG2xMzCDuzVPCJhiB/LqDDzw7KQB5nHruOzJ5Cq4nFPu9CsB7PBZI4CyVihGuHiLvvEBRs5nQODSyvC1PYshkjkqGpoynDotJmcZADVzTnocD/ZVzaf/c1kGnb/Ur/uAQrjAlwNiQq96hTbOjw0NdToaducmd5Nztl4i73X0XBpCOrEcB1h9KF/MrdY/x53n5dHlBi109v8N0QQbbg/dyYuUHU8Kh/UmTK9z0AYcmDF93/WIB9EPagO9moUQt7VhmbuNld/SSYCIIXY935wu+2bLv8OVTtnZnfSMYqEjGNeM4em8mLTnbgfTNaI57/JEOxEaEwnlJn8IQl5OuxtPc6/Agpk/57lesaUboDlwuT7Ow2dFiv8HGAXpr5SHfLEDOBU4IBFdnKB0xMlmKrts35fKoWyHs66gRgxcXc2g+NxSw/lwKJj3nB0TGZk/IKVeNNKayT84smZvFyKoLX1YvIC+rJ5NPqWHT1BSERxa/h3Hxr/8y++iUudFL7i0TP901ZCY+V1R+B2zM8tmB1ui2VL06k8jlThNSCyw/bV/Ru188ra5aZ18HeI7tHJA3xlD8rRqEoDknfpTtu9sdMV0A17uMtAMjhNCtODPMyFMM/Pv+SsI+otNZr+9dSzw/mbHtUhgjQhefDjSCDba8n5ojHLf6xroFWTeLdIdXWiYi7QkQJTQYRi3mWeJhVL0CnZT2kmUSXh9NG5/AmLEQse+omfWM2JHnOF0GEwM/DTvcG1UsSghMb5kyc15QqseiLLlXd8ihMx5nUHzC44RbUz5kcAzHHONBrqdP+whXdvH2xMzR8jpvOPxOYbgOCpq8IeQnhc43t+bkJMo4QXpsl73j7NtewdyKs+rDDrlbrtYefV/cS/UkJyYrc/Cw34jkSJsZv9XcW8z9odJM+chxzbp1TSJyMIivKdbkVHRNhCtgc/xIjKFFEyH9DUTq3rqloCgHcBHi3HwLWG2YaAXxU/O4wk4CVUkFBqme7WbIL9MBXgNUdauhiQ8dBPVBD0UF2xYaqBvS5ot7VliQIhTh3ODSjHiyIZK+ntbmlTpVYyHHbAkVUAZjnHm7yVGgozei7825b4Tev2y+51xQus1zuDI+89KYta+KmaMnL3/tafeBF+J9o8knRsTx+nzRRC2O+9YeNUjLJ0BevSh0WmFbNOS1dd3A7b4Qp+J4tz3VPKiisnwIpLjnjSTmed7l3NwRfYBO9U6rnyYJcVPV/SEAV/UIHFh3ubuDGrMLaLECsIX1mnKCeCgA1iwsfELBgj1TNXOIJkeYDbvW1v52WTTpdOJml2fyxSely7HKW3EnbtIxku6+u8zlPmmO6giiz4yf6TVL30HICMwrO5XtTtGhcSNvPmt5jdIDikD3MsADkrac4QYK8+8D+WCIi11evNwn+6nC/IdKMO6JjeG5saQQXCezh9nwluAyIxeRlFDqG2Ur7XINrksvqbQXj+e7dpZYFSR3BuQkX9dDcq0zZEyZL7XkHSpoxwdeuPWclHdwZJdvgti6Nz7rwDNjvbV9JjCgZG1yWlemx1OPjqCSPpNdQeLeQ+5a6Joapc8xS31m8rUo7OZAoSra8BA6C90ojKSOWbvMtSiEMnarXvNp7MQMgvCg9OHmTbGUSuoxIrB42Y7jk6Pb5DJblHJy5pfsrZcvNDBDGaJZj3NHBr1nbbbKCPIKM/szAQeLnZoUz9dCDpzg8gf9D+bBE0eBrZzjfjok6WKNEAWIA9VfUG8rZt8PXJEA/19QpKHioUrkAzb3Vaagqse5t/5AgSzl99SgXFZwAVZbeCk5zRqxLgHQOf2C7+SbjnbJP0kqPxLR8u9xngETpaY2wvBjFIoeWdDtGcf1djfVejnNrST7D2qGKXe+OFUoqDRjI6PuQQBMF8horPMLX3NdcvRmNMr3NBPEOZXlzSAx15GLYaMCl3lBFphs6RdfCLU9LayxInQe8dgcYlZjEBl2HpX7GUuhlXOXPXDsy4yKmR197HRXCBw2U508imqX+rgunBY2eYv7qHqdqJ/DB12hv3bZM80BzPW5lNPthr+Jd5r2/dRHa8K54ENWqgdngHqwzH0yIt5/LeDvy4daFmb/SD91vLoppQKeHKHEscCA42yAHz4KJHO7DWNBFTdjDGpG69QcVAxH6AZgIqN4PISqedaiphAvzcLLszgc59V01R2/4TQlUvPkVJej0FVf6iI3sQu6Zx+AydCYspUSHHReF6NReT3hSrGuOWx55YsyZFfI/AGuaEvemIbQsakU+woCC+WdFhZiLVhHPg2Snfc7nuo836t1acr9QO86ln9qt6NCI9QE2jvsgwOROYszO1wV5HH31mrqwrbdmfCM81uExwBVyb2RE+/lBmOtUT8KYCJq0Q7uB4rMKCGqNQFUx+NmWuN6zxdRMqk63BNIPkCj4MgVL3wBfT6L1MVzVsxxctFDfYN4ZXoRY5VefjsBYqgYUnYz7KlTKz4RKDNzyANu1lVwxssUNhNNBiAQEIQn5iwUKE6dYfWMALqAtZSmjUpuN/D5/n4c7gdfoBybrJpGW14nIbIZNFnTQKMeg2iQ5TaArkc13oajOYTMwPuUSj/lyVRO10b2vs1Xg26+UreSksHew7glSSxtwxWvA/9Xni0oeunRZH9qjA/Zq3rp7YN4Zjy8kTQDq/IhWIBgFCczkD70N8byzyHysJP9wvyzpx7LG1TIOI+H0sv/jRV46Kwzu3g/ZAQOeMTdLu/4ulySkAPR208N9bFTAmI8wBhJpHb6Z3CElnOXqdvUUIFuDVu/8WkxyXs3OIhaG+oVEwI88a16e02kMGwo+YwBmhHuLFeYRg1BB61n1aAT8Mi8AkASe9MP+0NKHd+l26VmR45pD1p2NGZe6mias0aOBuBW7gSK1CGjlLra37cPOlG6AiygO6P0/dvMnOGBQHS4Vd4pR/eVd1e7Y55pn55ADbJfysMyfQtNCQfHVVUbIiRalfoyCpUVOA+lrXJFPdoeeXTDNqhX4Q8G93UxJSS3XjFKwowMeD6YgfeSoNDpBwSsZxE6oo7wVXljKU9yxU91VRLbK3i6QkDGr5SI3SpYvqJrKZVmAzXtV7xNGLfc9iRS9kAGKOyOW8Ds4fCYOdLRoaCgSzDeKHanSAOa3EYtuKtVfAIVqOni9wfvIxe8xMMRyDVFckvIAlRb9+HYjGnvkacz0AXNBTKt2Myriwwcqr/UfqfbWjUqtjD2dH3tmTXrozDWUNezoP54QU+fqzc2YHetLs5J+NG3Xb62j/LuByKeJv7zTNxJaBwQkdttnZyc18CDCybAX1LW7qGpD28b4AJcQ1lsgnofc5o87jbBdzNJMuarYG+sSKjSR+cdE0FCb108IjiStk7YK9SUh0VzDEfYZq7bXoNtVCbecwb9BTtyI0LqoX+b37SUnCNa6gGzIBPOOlS0UpGyveEbcRjXzYZuDXUfXMvn7npHv0J9cHecriyOVjk4G0agkYha/RUSbx0uDhp0wuA02RSwJPYkoyhJ5prdIKd7NnUbvCATRHSr0eUSmlnwreRhHQ/N/MstlgoRQnflDfDhmm2Jlqy8pyPMHJ+CRS+xHyuaURIt0/+3awYFGn2j84H79Z76L9VhN4mw597lxKUci+6LBvBuAVmV+BXbck1yRMZo9Misoxl0xCZGXPo6aec+9ROl/UiU5OIFddB3RvErU3AxtGWw4jm7w0u6XBoGAE5G6ejZ4zqrPdtDeNlJAKEmXVFz/dI0Q4BOlkTNl7F+5t8RzchuhZ2wiITkXuEELxagLydOKIocnbCJsxLztlgadgIxB3n/mjdxeB9HD1iRDCUdWKRGrDnaK9AstfxRYh903Gt3SuJ3dJxUMlUmel5YGNntiZr4nRVxSnnzpJQOsqq1zheQoZrcysgsASbMDkdyTP1Yz0ofQbzWJ5LkNRa1TDXlLX1cRr2dv6KE/G7Z2JZggRyzcbNVL0d5Xe7Y6nSseYsbfWiMs8mYSRfppcdRV/h0cNBYjMMOJB5JrAJMXiPMHMNx10l39aPZdUNJ2w/I8PNE6+aUGAueiHVLMO9ZdDeO1wlyZOvZSgGgZEWqF7CyNzCAhsXj7HoFv6N5YqnvEO/T64OGpNGnGwM0pJMl68b+ffXfV/999d9X/7td/aXrTgd1GJAuSDFXYhs5I6cI3ZMNeVCZ7z3pqWDbF0SAfrHNCiLBhM7v0PcfhFPcdNI78uPFf9vAtO5Uq5Aovs/vupAsvoGfc+exGAohT7laH4JUfPUlwK4cl0FWCBOmT2ehXNBBvFMTum2CKjZDho8wvgDIhVkZBgymD+WLwNU+Akv15dIFwJtJV2aXuEXqhyfhg9lpafAq8WQjDpHuiI46VV1iHii/gqZpVprEtXF7ROxwE/XMe+LhsqLlYYpHA9V2TJCnuxW/kDEdZrBvoLC52TOj9tnbaqXIqPaZKkZKluqsAK5qAMvbEahthZI9g3KI3noQE6yQtzY2qjrkAx1Xk9PNHTnjjMWlF/mCLezdWvDOmvd9uC+qGwGDJazE+SpG141Ovctr1tSAv4fdMZV1X3mR+xPUSDE/p+45jv7ZTU+j3+gFIKMQcr3DOe4Hic5ygGPFA2Fh5O2WoQK9JBi/gh6bzlvIpZqVsN7cHByK8gGC9rbyUp7WCzXmfaL11dIaVkeywWGnm0Vpw3IYTBrM/n24Y5ommajh+Qemgf5gd3hbYRLhz/YWpxQXq/Y7sa1TjEHBPyMeanU/k5g7JyjROHo/9CNK3Cq/wRPzVPBOLotTw+n34PX1PmQsUi803phv9K0Kt7J7SvODH6098+eWmFze5ChFvRNntxcU93jSfp+oFNO6gsnn8UGspsezra5rQSK1NLZ8GraJ47bdKovlMXetfAqDdW4foDW7s5U6FwxaWereR5l0OTvsk9CrbjAycPNLyW/3zlfse4NSE2Hl2FgwWnVkuLdlWsQMRAbSqnwof0aGZVFQfOAk5A4SxLxwk9aS3AS75ZqFQwvZoeJVSvGgjjCaTPKdH29j6zuN3tUzK3oNDxWrjhJxXKm38pVxgorTYi+fwtzo6+CYjruTWL9Yz6LT4Ra+Z+ELS+IGuI3HcCDz6/koMDCFrqTCiqYzEmvUGr9TD/MNMs59CjLc7cKs0SvZy34kNmXkgBOpphg5v+95hwTOXbqiCCwCGzw/6EdRGVTCmOsITNlU9mY2MmM+63N4Ku0pOhDNUv4ruagbshbeS4bAGhGLqxeV9vuqkCNBPNYYtncimdoblCk5hSGbWxiGNpE1jUhjivJbJulFBSFzJhqvS7A/U+CQPBGZoS3uCHasodrhlRD5Zt25RBHgJgUARA/SuB27vx13u0j3pVoKXQjK4PWEZGw0SasXtujeR1o3EhbR29ATcohlI8s51wWRG22NisnPmE3GSVM0pNqJCFQwhW7yurXwaa4R9QqE4rc9CtMoI/KddOMkvOOElieXax6BICkvH3QzBk8CDBIXKVAuinE8UquHO72dnFdBaRb0y+h8jIJCRXdfZTubDObG3LuzmmuQg2xajptPpDQSVnu2PveaNAPymseRXqquBdll0Xxs4dlcbjpIkoJv9lpDtmqODzWLrKHFAJiHDpdEG5xeMvOT7MBAwtIJGY9xfZpOH9YiO/dZmnPure1mi1lPuqZMpS9hnUSxh7Y5OGM8WADAo7GMtDWdsqZHGRPjvAljMbmvQtHEO+25Z+RJQQYw9mr7oITHTDu3l/oZOCRyII0BA3JgOX/v3FGG5txQ+GDxmJ3g8/FUQQQWh32CKVCkyZ3c1VQBRvIw81my8+AzdJm1d4ifGTM8QeXTf8vWlBJRQailkDOFa5VGOugxBmpiV3gtf6bQGCoFQiI1MWlswqDTC/NSMMsxp0dxL1D4hqGUr3r9yy55/4XzBJCeEqpnSmHvinpK8GPoNd0ek9q/vaqTsLcc61ME7hy8aD/rsyxuPw5Ql2K1cTYemBQf8UzQYkPMWyK8X5/QkiVEnw1S2j9MXbY3hQeHANNxHwTCxo3Wz9DEGBTCilLt33x9zogekgufCMw6z/qsWG5ehBrbQLbCC7GmsJNwR/39nNYwrwZ2SGCVFXncLprbU36FltD+tuGxArkUt9FngDL5bRukc0XCqm3VW65+XRSnKDIH2iNEKfE/Q96+bpB719l1fV2I4F5dhult8M+WBJAE1HRkRNzy2667Wwdw9R3A7moq1H9di1eXOkgdKX5kOB+wxJdtd4UC5hNpERX+vpFSZB4gL3KM77j5OoUNbLsD6QLQixmeWNv+vtqOOViuVStngSX38du+Owp8AtUNL/XrvYJJYxVAPoHVdvMf991h1/U3/CnXLvttiR8z8YAyvSid/h/23Q2fSWV/U/Zvyv5N2f8Hyl5qDozM8l9UIy4iSc0L2LJ7WZ/AdDSceygK2P77czYoo/CfNyjDxA82KBPU9xuUv/3up29Q/rbT+b9m8Tn8x7Xnvy1B/0eLz/+09vz3Lei/fPE59k8uPod/9uLz/xSHsZ+8W7you+5PS7FzIk1/2zn+h3cykk4g6OdIDkxCf9k9Dn8nN5dv8r3g0PQvIiv+HVkfI0D/QW7+3MGQ0L/Q+HrQ9UdL2r8RbBiH/C/U/fqr+OuW8S4v1h8sH+/rLPtI5Y/49mdJ/aMoEN9ef71F+OtrMe7rDlA5yJ9ZPMQ/i3/0P6H5YIT4noMI9KtUH/E/RfX9PBVG/o9UYTD5X8mp37nz+CNz/oGR+t0uPb593r/ESP2zHMb+W3GY/MlG6jtjRKRUnhS/vRN+VTro9wYti3OqSH+N2cJg+p80W+gvIjT1HaEvQTmWvw3WPzBYGIr9wFzR/0JzRf9qEaEJEo2Jf0ZEcjjDc/IXeQY48R2hEQr/ntDoL7M20HeUdrZl/V+As+L1U4332E2f9QR+5fLaL5Cc9KLnJZL/Kdn5GbyhsD/zhkC+5w35g3D11/lsyP8fUoB9Mxx/kgLyB5T+VfENjH5H6T8d/CVr/30PPoKjf2HHD4IV9AdK6Wcc/GTnDmEsYgVajhY/64URzG8O+R+4EeZJNY7t8t+aC9+R/AeM+T9yAYP/rH7gH9lg4gfe0y/jwvfahwH7JaE2B7e9LdfTI1AxgjTA8jUNAF1hxR9epWPfb0N6udTj8G/Mub8adYj+YbiP/At5970+E/M1rYBBDz3AtufY/5FTy0W4Dz+PegV/NT3rPQa7iiFL0L/x/N+VgTD9ZwWIYtT37IP/lez7Po3pL/lvzPsI2W+ylf/OtbUCL4wr0N+At5ZWebZ1+e8C+r//fXmI0cSfjdgPgk8Y+zneG0CSj+P6h/ek66kqfcxy8Bf/AQ== \ No newline at end of file diff --git a/docs/flow.svg b/docs/flow.svg deleted file mode 100644 index c1f601bf..00000000 --- a/docs/flow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
Your Server
Your Server
Browser
Browser
Rust / JavaScript SDK
Rust / JavaScript SDK
JavaScript sdk
JavaScript sdk
Webhooks
Webhooks
Api key used for server to server communication
Api key used for ser...
Fetch JWT from server signed with private PEM key
Fetch JWT from ser...
Use JWT to communicate with the Nettu Scheduler server.
Use JWT to communicate wi...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/google.md b/docs/google.md deleted file mode 100644 index 9f047c2c..00000000 --- a/docs/google.md +++ /dev/null @@ -1,11 +0,0 @@ -## Google calendar integration - -- List google calendars -- Import google calendar to nittei calendar - - Sync all updates to nittei calendar to google calendar - - Receive updates from google calendar -- Oauth -- Watch calendar lists to detect deleted calendars -- Create google calendar meeting if enabled - -## CalDav diff --git a/docs/logo.png b/docs/logo.png deleted file mode 100644 index 083677e9..00000000 Binary files a/docs/logo.png and /dev/null differ diff --git a/docs/roadmap.md b/docs/roadmap.md deleted file mode 100644 index 2bd941b8..00000000 --- a/docs/roadmap.md +++ /dev/null @@ -1,4 +0,0 @@ -## Upcoming features -- Get proposed meeting times between users -- Shared Calendars / Calendar events -- Resource policies \ No newline at end of file diff --git a/docs/rust.md b/docs/rust.md new file mode 100644 index 00000000..7a70488f --- /dev/null +++ b/docs/rust.md @@ -0,0 +1,159 @@ +# New to Rust + +As Rust is a relatively new language compared to older languages such as C, Java, and even Javascript, it can be useful to have a rough overview of what makes Rust interesting, and how it differs from these languages (with a heavy focus on Typescript). + +First, what is Rust ? + +Rust is a modern systems programming language focused on **performance**, **safety**, and **concurrency**, without needing a garbage collector. It's often compared to C++, as it's where its advantages can shine the best (safety without sacrificing performance). + +While its main domain is systems programming, it's also a very good language for writing backends. Of course, for most backends/APIs, having awesome performance isn't a hard requirement, and is often considered overkill compared to the complexity that is required to achieve it. But, one of the big advantages of Rust compared to other languages (C++, C, ...) is that it can achieve performance while providing a lot of safety mechanisms. This includes the borrow checker, but it also includes the explicit handling of `undefined` values (via `Option<...>`) and of errors (via `Result<...>`). + +For backends, Rust is mainly compared to Golang, as both are performant compiled languages that can be used for backends. Rust is more oriented towards safety and performance, at the cost of increased complexity. On the other hand, Golang's main aim is simplicity, which makes it easy to learn, use, and understand. In short, both have their advantages and disadvantages. + +## Comparisons with TypeScript + +### πŸ¦€ Variables are immutable by default + +```ts +let x = 5; +x = 6; +``` + +```rust +let x = 5; +// x = 6; // ❌ Error: x is immutable +let mut x = 5; +x = 6; // βœ… Use `mut` to make variables mutable +``` + +--- + +### 🧱 Strong, static typing (but with great inference) + +```ts +let name: string = "Alice"; +``` + +```rust +let name: &str = "Alice"; // or just `let name = "Alice";` β€” Rust infers types +``` + +--- + +### 🚫 No `null` or `undefined` β€” use `Option` + +```ts +function getUser(): User | null {} +``` + +```rust +fn get_user() -> Option { + // Some(user) or None +} +``` + +--- + +### 🎯 Pattern matching with `match` + +```ts +const role = "admin"; +switch (role) { + case "admin": + // ... +} +``` + +```rust +match role.as_str() { + "admin" => { /* ... */ } + _ => { /* ... */ } +} +``` + +--- + +### πŸŽ’ Ownership and borrowing (the big Rust idea) + +Rust tracks memory **at compile time** β€” no GC. + +```ts +function takeName(name: string) {} +const myName = "Bob"; +takeName(myName); // OK, string is copied +``` + +```rust +fn take_name(name: String) {} +let my_name = String::from("Bob"); +take_name(my_name); // OK, but ownership moved +// my_name is no longer valid here +``` + +Use references to **borrow** data instead of moving it: + +```rust +fn print_name(name: &String) {} +print_name(&my_name); // βœ… Borrowing, no move +``` + +--- + +### 🧡 Async is explicit + +Rust doesn't have a built-in runtime like Node β€” you pick one (like `tokio` or `async-std`). + +```ts +async function fetchData() {} +``` + +```rust +async fn fetch_data() {} +``` + +To run async functions, use `.await` inside an async runtime. + +--- + +### πŸ›  Enums with data + +Rust enums are more powerful than TS unions. + +```ts +type Result = { ok: true; value: T } | { ok: false; error: string }; +``` + +```rust +enum Result { + Ok(T), + Err(E), +} +``` + +--- + +### πŸ“¦ Dependencies use `Cargo.toml` + +Like `package.json`, but for Rust. + +```toml +[dependencies] +serde = "1.0" +tokio = { version = "1.0", features = ["full"] } +``` + +--- + +### πŸ“š Tooling is great + +- `cargo build` β€” compile +- `cargo run` β€” run the app +- `cargo test` β€” run tests +- `cargo fmt` β€” format code +- `cargo clippy` β€” linter + +--- + +### βœ… When in doubt, check the compiler + +Rust’s compiler is very strict β€” but its error messages are famously helpful. Trust it! diff --git a/docs/todos.md b/docs/todos.md deleted file mode 100644 index 9ccbef91..00000000 --- a/docs/todos.md +++ /dev/null @@ -1,5 +0,0 @@ - -## Todos - -- needs list methods for calendars, schedules and services -- more recurrence validation in rrule.rs crate