diff --git a/Database ERD.drawio b/Database ERD.drawio
index e42429bd..aa8337b0 100644
--- a/Database ERD.drawio
+++ b/Database ERD.drawio
@@ -1 +1 @@
-7Z3bkts2EoafZqqyF+PiWdKlM/bYW8nGTuzdJFcqioQk2hSpkJRnJk+/4AE6oamhhgAJxO2kbJEiJQj48RFoNLpv7LvN47vM367/k4YkvrGM8PHGfnNjWbZlGfSf8sxTfcZyJs2ZVRaF9TnzcOJT9DdpTrLLdlFI8pMLizSNi2h7ejJIk4QExck5P8vSh9PLlml8+q1bf0W4E58CP+bP/h6Fxbo+O3WNw/n3JFqt2TebRvPOxmcXNyfytR+mD0en7Lc39l2WpkX9avN4R+Ky9li91Pfdt7y7L1hGkqLLDR/D4GH7+pf//vTRuXfj29+Nt0+/3Daf8s2Pd80Pzgt/uWxKXDyxasgfok3sJ/Tox2WaFJ+adwx6HKyjOPzZf0p3ZTHo7cFXdvTjOs2iv+n1fkzfMukJ+nZWNK1seSdXfCrvbD4zIzm95iP7bebZqf/4jycX/uznBStNGsf+No8WVfnKGzd+toqSH9OiSDfNRX4crRL6OqCfRTL2m+pSmQ495uuWVRTJCvJ4dKqp63ck3ZAie6KXNO96TbM3wp82hw8HEZnskvWRgCzTasTbCHe1/+RD29IXTfNe0dQW19T0cq6d1/62fEl/ehH58W+0S/nJqnz3xyLdNtUXkyWr7qwpefl6warYPKri+tofy3qLaK963ZzeRGFYfeoyiuO7NE5pK7xJ0kpg+dYPomT1c/0ttnM49VvzbeWplH7kMq461Jp+GEnK0qSFX/iLvTS3aZQUVT26P9L/aXXfGa/cG5f+0jt6bB6O6f/l5VlxlyZ5kflR1e6E6uqBlNr6MczS7WeqJMJ+7XE3cM8kZIESutgBn9cVI6jXTUi2IUlHNqejjz/11tHiuHsCmugqp1PtCJPOc+oof2Yj/BfqwGrRwf7J1pTt5OFxoo8jQdhD6sHh9LDLSZb4G0LP/rBLor925F9yQGM8r4zqwzSnzABUcTtShdFHuIpcTkVjM6VWjrZAcVokIAwo0qTgcVLY+nn+kGbhPFiT4Gu+2yBO1MbJ1BoZJxPEiViceC0SUB8nbEJ1pIVVnC78eJ75yVckidokMY3pyCgx+QkPsqQXS/Y9UkOY8LMdn9ZqOE8TJIniJLGdsUmCkxzRJNF3lmPy05yYVs08TlcRskR1lnhdzfnS5IMzHNEs0XiKM+XEEOVzPyiibwRRojhKpmObXs0ZokQwSqYtKlAfJRY/wclJnke0rnhRoFNA184OOwXYVsdhxH7uIr69+TkJugWM7xZgtU1s1PULsPgJDToGCHAMcFuUoL5ngN3iXTaXRRgclQrDyegOATa/bHM/Ok40H5fabQMWDcalvL2DPG4jOtRDlCiOktGdASzePIIg6TcombSIQAOQ8NaOkNYlUkRxiozvCMBkihgRhpFZiwrUx4g949qehCvCpv602tbpKk38+O3hLK3vXRKSsKntwzU/p5U2ypr8QoriqalKf1ek9NS62DBLGXmMij+a28vXf5avX7nN0ZvHo7fePLGDhP7eP44Pju4qDw+3VUdPgBpvLHs5DUgQlNoqsvQrOXpnMXUd1wBbvWnMPN1lAblUm2xrF0NLq2Lq68qqvgiNjMR+tfpxXAzhIpjxxtJF6mfhHDdRXZJDd3vpS3dRTWV1+xlvLq1bfESTRnejqWcoPIjobzSd6Wc0ncFG07v7n8xr9HRcgaaksYb+ptSZUFMqs5ANoxPe/CHXlCp0sQa580Lrqjw98SaRhjtXzWmQO530IdRaMih3TIN/Dqk+zzGvm+e8fNbC2lWzWYtp8H18wDY1X9Km/eauxAxdMoHmrjNvYvtePxW4HVXgmGrJgHkpaSSDK7t2sMu+VWU1e7WwY3dsYdNwRDdxdevrLPOfji5oHmCHT/5YnjhMm73p6bTZdGbHcnn2+lt3diavugQHse1/Sg9DPHO4xUcLUDnM2v285mxXKaxYjqFdsypsGbXsrkIQPsiAWWFOTllxPvSsy9ncdKYlEdRgMNboqdVPXqFPpktQXl4wJYtlP3lZI3LmZc+2M5Pwrem6lx9u5zecx0k7u35m9ru+sQbIfXY6wD7UJKEqD8iGNPWHaw8ifbWdaQOeZ321PVmTcctBZ20V7X+H3qjPwoPloLu2FJcGR19/bcsZepUB/aPEIWV0j236iOTkgy7bvXmisaulw/ta5rvFlzJOM+JEcZyM77XNYmyjv6U4mOjrcGm5/G6yDcnzMn47wkRxmIzvvG25FtJE9M5UjbeTubwBrYgoTwp/s0WeKM+T0WO5WS4GcxPOE32juVnuqMtS/7hVT0dP1yrL462q0Xa+8IGIft/XggynEqP6A3OuVTgvXr3x2Kr1cw8Mx5aGCI+3ruLqjQKrN/s+q9HqjQf7b+PqTc8hiCfd2ipRE4C1FVdvRpnRXI+U8VdvJry5FVdvevNEC4Pravq/TfDutTkJdumj8fDwMH37AUgNedjpavyQ7OiokBYdM3spj5YhV3JAJfGWVwRLd7Bc7JxKY6UligoQNMGnZQ7nyzSbb9O8qBFzUxbBNsvaRdroQ5vOSz2OJU1hvGkWgdNzJHPottKQI0IQICx54ATp9qlGDf0t6IyiPlTcjuY7aWMYXO0RPILRYq3n8717vyKb7PNm6c3cX99/cswpMDGK8nmxzogfwpZ+pIliNJkMaGwBJcTPiJAmXWlysU8qTZOW4LS82RaT92jDEosF0xjPcDtDP1nRZtupFmbbFjs+MD5Blzb1QWKN7iI7wWGJ8DjpGg9MJnzi6yjPdySc+2gyUZ8n7ugushPe8IY86ckTu0UHOvCE93/zt1vix8gTHXjSNfa2RAFhHhfhPNF4d/GEN5w0KaEQKBoAxTZGd3mbouVEOFD0tZzYzJR3JIctyTZ+QhLkifo8YRkjR0wQxc+YkSc93U6sFh2ozxNr2pb/NkkLXNpRHyju6BbZKf9EQqD0XNrR2CI75Z8vGAJFF5pMR7fHTtEeK5wmGttjp7xPY+An89omi0BRHSiOObpBlqVZRKCIA4r08LESHZH0yxW1P1AwBgrbO6pZDBTbGDUBiMbppS7t9Bshu1Rz61m6A8c6jawysZ1X7umH1L+JSwFybaYHxzn7Ju9yoofz683mx0nNxODwSwjVNmnMwNCm+O4xfJwO2Z+nwBPOY650wtnm8BY9DOEzfgiffSfsFcEHkpK0aC1ssyMG8BE6fnakW/fkKYI37uW0vFGaYACfoafj1wMFit8DAUXa7AvICIWb3vvSRAvr3vu78OHP27+9Ry81Pny4e2ttlxGwSXWXRfTED7sk+muHgTSUBwoUtUcWUEAF4dLjy2lysUsqDZOWVNG8oTeMMsSJPjgBw/IMOkAxTd7/H4nSa3xy6Jf6MQXIZZn43xZ+FQIsKqc9yBTVmQJlYRh20oMLkKKnPPquPwLZK4uoiNE3SnmOeB0N+/KkgzvLRHNE341lcNZKRIkWKJmObYfFrJXCUaLvljIgZ2VI8iCLtjjB0YAmljmgERYWEFphBdNE46SVLrD9w3+c0yYk89KHB3miOk/ssY2wQNpT5Ek/nmixRgwXnTfBljypQxkDDoxIE7Vo4o1tfnXR/CqaJvqaX13e/BqSpb+Li3ktB+SJ4jyZjW2GddEMK5on+pphXd4MG6fBVxIiSBQHiW2ObYT10AgrGiT6GmE93ggb0BlOgYGMtYAJ2ykzHkzQBisYJp6+NliPt8H6tM2eNukunyf+Bqc5ygPFG9sI66ERVjRQ9DXCerwRdplmAZnvsYJEUZ0os7ENsR4aYkUTRV9DrAfkWdgVaRkmcO4vy2gNCBS1gbKPsTIeUNASKxoo+lpiPd4Sm6TzaEOBkiNR9CCKM7ZJdoImWdFE0dckC+SoLD1PmmDG85gkK1ouhIriUGEJI8eDCppmBUNF44SVQL7KTZQgVDSDymxs8yymrRQOFX3NsxPePOvHtHrnZLMg6CSrPE5ca2zb7ARts6Jxoq9tFsiBm5EwymiZ50XauN4jVFSHiju2fRZT4QqHir72WSARbkb+2lGqVHsDESeq42QytnEWE+EKx4m+xlkgbSVJytLOA1qlcbpCoCgOFI9lTR0PKGiYFQwUjfNW2gZPlF9SelxlSqH/VqeMVZwugMRz9NeWNXiU6ofLPXLe1Ps8BlVuk4uNVnnGNK3BWrkMzVJfz7fN1UlM9umQWBYbB5g7mFBzSEs0wHybvpsETVLzdDlsyUSzPF0O4DQYbeeLMgXkLoyAnTHfVwIjTitG9Qd+9ggAxa15lr/KmwCkgBI82hJRwdurGo2MmJOke94jz1B4JCgg79H1WUOhxEegpuRJijddlZmP7q7LVnJcg6akEeM/IB2SWK9DFu9jIKHwZq0i2tCq8TdbOewRmnMN2dMlR9Kw7AGcEK/LuobY6aYNodavYbED+CZS5CyXGmRhUxo5gyAGCv87aE50B3BJxDxsfXki1isR4okIQXy+d+9XZJN93iy9mfvr+0+OOb3lnRKjvFnnL+dRiBTVkWJCQYBlMQWUEPojvpwnF/uk0jRpSVQBZKDO535Q2QuRJaqzBAoAPOz4BFfmhI9OxC7NDcwTfnxCHrdRVu7sVD44FgLFhGIADwwUHJ4IB4oWAxQzoz/wN+d+a81vn4LXb3I7+BPIO+1vt8SPkSY60ASKACyLJqB8cHDycpZc7I9Kk6SFgvzWqy3JNn5S/mJkieIssaAgwAOPTHDnlfCRidCtVwPzhPdlqRd2krRA24n6QIECAQ8MFNx1JRwo0h1UJMqBd1Bpgk0gTZSnCRQFeFiazHhnFKRJT5pI9zuRKAcgTUHpi12ZTxAoygMFCgI8MFDQeiI89bTG9pOZzbX+P2ybD9+KnTftMMfo5zftsCsV2bazD2hz0su9uMJf9I2+XJUv/5uXibKMotxm95WQbVmUUnlRXqRNaYM0Ky9hNy8ydi87Q8t39InAl6TLsh+sKUBIzr6sfl7lr/iPfUs70dP+hv31Cf3r3x/pX5U31B1/X7EuL07jsrAhxUFZQ+XX+WFY/cY1yQjwdW2/4qxLDLq9sFWw12wTYsFHmNHeMACrPbTblz2NJGTI4R80/zDUnO0oJGbokskNsEts5k1s3+sKp9X0f5vg3WtzEuzSR+Ph4WH69sOt3ZVNjikaTdWtr7PMfzq6oJH14ZM/licOCrw1Gw+I+5YLrJa3G0k7ZxvfrrzcPL2evqh/AHz3rfHKcGeHP47r2Ccfdzs7rZ66uZpPOeso+yru1HfeTYqPt8bbyHFc66P3xv2f/e/Pt5PvrOeI2osL9hxn1vWpLqXjXC828/wzW9TWuUuyPnLaRRz3co+6okO9QPdwC1j88l5GyuE8EFQRdx7L3HnsnTb/rQWEN9tr5HhAYU5lTV7206JjP9eQF4Zyu/6Ujj3Tf9ffodf22XEMiknaji7L4hf+rtv1h7v8LvdRaSFp5GnC5pfy6LSUtkg4XzzNDxv+jB+SHWU6/R3/kkMfcTZYpdEzCGqADcYgaqTZ3Oj0j5MV7v7ry5l9X9Uv9JVl8ZzZpnmhwWZixAnbKjMeTizEiYRhi8Y4Yd92Eo8JSaI6SUyD9zYZemTCuxcgSHqOS9oCs+oAEouTQ0ZrJ1U+IAHCxLR5T5OhYcLvGkWY9ISJ1aIDHWACGGvzeRAT+qtxnqM+ULyO9n6JCuJNtAiUnkCRbp0VIQdwTdzlG3+ARfHrF6rZMjp73WUZnW8+YHEbrBW2/2Wkxe2eS9CmOXvGraOPVwf3ZW63dXVRXhyufr6W5k0vNw63/A/qHfvF6pcrncU/UNk5E3bmmY4pg2swpJg3D1ibbIuOuoH1YfXql17hSha8vElZWqTjJoUfdoYSDzHr3NnWbnZttT3FuBtMz25/jol6/ABbmxtfKszl4FwS7MudpByr46RpH/NNPGj4tcW61TE5w7CuUpf7pJKeUnCR+eVGTM3Qf35+ufMqHSIdLDqwcRkTM2jMna5uU/IExa9NYloG8ciZCV2vHBY5/KZH3d01lcbQENgBcjVIW3WARcXvQEHvqr6McVpkoNSGebjoFicHfVYxv3uaQGkaBsYJOkWIhonVogL1YQLGnrw+SsNRhIWwc1iG4zgM9NWi/KBNGpKsTm38vURKOF8TdB3Ab8oYdJ7jcZWKKwNn9pDnF3tYn1VkuWc26g7+f9qaHxs/arbmN4Mig74Q9w/r8v1melsdl7Hzjdq03/kh8CGJ98F26KP+5jR2TvmF1YdHZfidOsJOU4zvJ5SO7Z48IG4dyA9uNuQDwjR40yqr/LXJKv51vaRH226ZXmyswy3s5PbkM6ooSlkViqms+rwSG6lOHKI6VQpJqUSy4+vq22oZUcUYn9eVrkjCLqg1Vaq8Vl8lbfLoB8WJ1Izf1ySBdZo03aMe5JWfWPWDOvZTWfxSwHfNRUG63Xcgv6rougC0+5NvfrVCexJBau3vI1YtSH1/VHWIchzM3qk/ollBrctRFvlinW+v6B6nAG2G9O1TvZvaLtwcfa6eFLdW2Vse1rQ2PtHz5Vc9ZP62dUB//NgR0IVu9/fsOxHbaHIcjQrqRKaIcFRw/CTtRln9HsihT6ZL8IHsBVOyWHZ9IIPPWdvo+kQ2GU9H9tnwzpbqJ884Hp5ff2tddvGYmf2ub4Y4Uh1CAH/qaFvmG53v54Xnlgn0CLmSfWeyMU1m73k2Aqwhy+rg8MMHLaLmKG297L8ka4twBQGlJG0k6uCS7BAWzn2H1W9Jlm1H4NKp4DrsmCsn17MGcP+QFrgcVhK/cILrsH3BovHSCS+HZuyqftCc7x4mQMycYWECpKNFmPSEiR75aGEO8nJoEtJW5jjEido4gQLnDDw44Z3EkCb9hib6uog5vFdHPefJSL6lFUZw5iOBLtDqhjziANF1QOI40kSGsTBEE0doKAyIOPLEwDsWRPmcVmuEPqnqj15YFp7xRi/8jj5kST+WSN+3J00MHj+UPV0UxM3iDiiE3kuDNuuHz4Fg7ykhPjQJT4JmIowrhBJXCEEXn46o8UTk2hh22XDKL0DjDnJJT6J9j9Zv7dDj59G4g1wZd4XrudN1CVGeoPqm+EHkdFKG9Im0PIXwE2l0Vxh/Un09a4Bt48POqT1MyiEeLPrOqif8kBdXGPXBCbRvfFieTDAzh+iZkXSvSnlisFqGKYcVRgSK2kCxx3ZZmGAgCtFAsVpUoAFQeAcoXEDUhiVeR2cEefJB9yfRLNHC/Qne4WnwT5acFjiilcWrAlcNr1w1dM43ou7DATy7bChiL3VLkwPPDx0WDJVO63SVjf6Zrqjk4mBLmfmHyXVW+u/eKv9MH5WW6kmiJvilwMTfKD/NVRovg+BkyG2DLWVGR1nhJNEiaVxL2fkVPn+xyMi3qIl7iERRmyhD7h1sKTO6ywonitCVvWGJYvJLe9s0j5AmOtBk0K2DLfrBlT3RODGFLu0NjBMgiUVdsQgT1WHSdVegRPWgJV44TKTbTUTIAYxxafGPll1OstJ0Uu7o4ZWB1vgrrfFcaFOTOdw/ywDmUiS+1S2u1dEYP6gx/nJnVNIWDxeZX8lDU/xVj5TLHVRpSzxcdH50ukj9LNTNQV5p1gzBliEN83CRMa+aeLDoO1R1+aHqYecNskRplgxpkofFw494kSU9WeK2yUB9lli8t0DNkiQt0GdAdZoMapKHy4wuA6IHJlp4DMBFh2Jr5TsSzn3l9+0hS4a0yMNlRmcB0SzRwlcAzjnFuwowezyiRHWUAHn/hkWJzU+RESW9ULLvjxqiBFjkyecZWdHfgShRHCVDRieB1YObf0WjRPqajjQx8NYS2noEnQTkOQncul3HEtKcBIDUj5IM7egj0J0ibWYSdV0EeOsIegj0f5q0BRFX30GAN3egf8D4Y9SruTK6ewCwqwKX9HpSRWgo4EGHqECGAvQO0IMk4zsHIEmEk8TRFyXAdit0DtAFJuP7BrAJOVrORLHEbLOnaMASIAkx+gZogpLRXQOAnZ6Ikn4oEZqCeFiU8AZZZoVHkihOktE9A0zeCosk6UcS6RZYeWLgbSXoGaAJSUZ3DLB4YwmSpB9J9DWV2PwAtRyToFeAJK8Aq6tbwJ4T4pscyP4qycSOfgHdIWK3bexU1zHA5t2K0DNAgJ9ZW3oA9V0DbH6Ki74B449Sr2fL6M4BNj/fxSW9vmDRd8br8GBB7wBNWDK6e4CDLBHOEkdflthtnkboHqABTcb3D3DQgCZ6YKKvAc3hfY3QP0AblozuIOBYyBLBAxN9fY0c3tcoWJPga77bIEpUR8noHgIO+hqJRom+vkauw7U9CVeErVPQalunqzTx47eHs7S+d0lIwqa2D9f8nFbaKGvyCymKp6Yq/V2R0lPrYsNW9shjVPxx9PrP8qNeuc3RG7ZgVx08sYOE/t4/jg+O7ioPD7dVR+w+2ubpV8L0eGPZM29i+96ZTul5YoYumYCt3jRmnu6ygFyozWZ4WjCy3LQEkmfPnrKqL0IjI7FfRN/ISTEgEVS3vs4y/+nogqYfHD75Y3niaNnRO111bFb871sud9iE5mWXm035D3Kty3sQ7/6H99Czq4ue23X5UqWL1zMLIjuWoHlNed4r7+jP5ExhZ+tVdbmbzzhIr3M/YUJvDIOc0v9B/cbTpd8Iew4spq7jAv1mOQ1IEPTqNyxg6rP9xlLiOXCuzybjeKtAx9DnRBd9tutMENcF6JMZ5UfSJ6eoszzm3vTV1J2YjtX8fTb47Ut1WMa3ZjN2UEr2/BLELyk9rpwl6L/VKWMVpws/5joInYsUp3rmfNlanWIqX7mLU6qyt+TNXInNwco8h/X1rdrs7hRnTs4bCJg5m9BkSYDXCpz/CYi0tk3zWmToAtmrtWf2aWu7NtfY+4Y9bmzHkZZATVcHSM9Q2MZ2lQPkM72wjwckKCZ5Wet7u0AeV54pyQynlUvkM31WiCmOzYqGCZfEP+uLdUb8UAPfJaWRMwhiAEdIEDESoyRhcBPhlv19n5SGE3n5Xz0oIsGcNsi8HLMiUVQnCuAOKY0oLQrClULR4xNP6FKhLKDEJH8d/3Y3y7bvpn+9zd799N5JbwEHpi1SRHWKQG6Q0jAC6oa3mSBEukLkYkdUGiGwfgGX2IBOcQoSzlNgIzHCRDGYAH6QA49JAD9axEm/Mcm+U+oIFH6IqkOcJEQJ5Ac5NEp4+z6ipCdKhGadHhglvIm+yKJtkIaIE/VxAoRLGhonmCpWOE6E5oodFidTIK1OPs/SmMxz2jp+scuQK8pzZZ91aTyuTDGio2iuTIVuSh+YK/wyMdn4Ee/+hSxRjSX2gKZYuNAz3JIunCUaLxHPgAQYu8UXWmakifI08Ua3xc5waUc0TWYaL+7MeIeTDclzf4XzHPVpMhvdHDtDbxPhNNHC26Sl7Lx1vqHJPPMfkCiqE8U2R7fIzniLPhKlJ1Gk+9dLlANvkd36ef6QZiHiRHmcsAhYI+IEDbHCcaKvIdYy+OlOSGJSaBHSD4Fie2NbYy0DZzyCgXLolEoDBd5rBGw3zucNUpAnyvNkNqA9FhYQTndEb//Td7ZjAf4nC5+WOZzvjbIaJVpBvjjW2BZaCz1RhI9XNPZEsQx+wFLmBPzuo+FwEcCM6g+sb14o1wdK2mPgQuwcAyCFzaK/StAGPxbRInaO0vGp+8fOOfTZXrFzQDHJip1jGfxIBtMHipgrC/WulpU/sKXs/FCkjGqhQagcpQkzCFGgUDkQUSSOXHgfWgyV0xsn0xYhKBUFHy47CyN5nt46zUI6xKMT5V0S/bUjVRFpCWl11LBRft6sC20e1lFBPtFylmceMn8rlUBQaB1wTDOVJjjcxi6aP/s+LG84I08OFicHOrWlM08/npcg0mFPuy6okYcVEzLRDTuyMflFaeRKT660mWp1GNfwA13EiTY4cUafKFn8uBhx0hMnWuQwbZEDP2rFxIPa4GTScdYjUT/8MBdx0g8nrctFOuCEH6xWVpcqrQjyRHWezAAHyoF5gg6UwnmiRS5Ti/w9//rtMf68fv3rl9/dryvjzewWjHee0xqMSaa+ByUCZd+dhwAKqCDEyctxcrFLKg2TX/zZb9HMfffhrRlN3jn37/77+TUQ7bwuCVJEdYq4AxphQengJOflFLnYF/WjCD8kab4WMaI6RiYDGl9B7eBgRDBG9B2M8I7WxXq3WSR+FM9xWKIFT2xjQOsrKCLcHSaYJ0I3hw3KE96h+sATHKBoAhRrQPMrqCLcDSYYKEL3gskCCrxRlm96Eq4I27FCa22drtLEj98eztLq3iUhCZvKPlzzc1pJo6zIL6QonpqaLBPO35yksyePUfFHc3v5+s/y9Su3OXrzePTWmyd2kNDf+wf7gPLg6K7y8HBbdcTua9/UxTdu02h5ussCcqHWJk0PKhhB2vDAkh6VdXqRDRmJ/SL6Rk7KIb61nVFae7iWO24QuOU80Q3S3PqxRM7NfmvfjPXivYehdfoRtcaauw7N+jrL/KejyxqSXf099y3XT6f9rm8CEx5EWBf4IMl9Fb5cpRNo1lTm0/7uN6i26r77ntOJcdqgLj+72Wd4On0CCdhyerFL4o7TsXacXu6FfTacglISsbkQLjLuN5URTGWixXbTiwO141gqqZ+FuN1U4kRZEE6A3aYtTyZZ4sHNpuJZosVeU7DobO/hkRziNPiKDkrKkwTYNTosSaa4uUswR/adUUOO8OvDOW2arxGSRHmSmAZvux8YJZj7WDRKhKY+HhYl/PTGT4J1il7TGqDE5p2mB0YJP79BlPRDib6zGyDBZPAUxGXjIEpURwnDxmgoAfJRIkr6RbCWHhRH3nOFX9CJadXMF7vNFlmiOkumY5tdgfjnyJJ+wxLpCzgixPD+Lnz48/Zv79FLjQ8f7t5a22UEODzqk1rju2fJPgLTECwB5YOeji9HycX+qB9J+MmuPkm/kCT2gHZXUD5AoFlESS+UaBFOC9YCsMc8zULaggXJ0EmRa/6rnRQP0ZFYDh2zq4VDRKhXuNEtrtHRTXFQN8XLfVFJN0W4yLw3ALop9n+eyA/3Kk8RvEvAwU1Ro2RvSrNmCLYM6bMIF5l3D0Cfxb5g0cJBAC46b4qno8jl8gQsJEawqA6WIV0Y4SLzllgES1+w6GuXN3nLag2WJC0wBKzqNBnUjREuM/oeiYaJFr5HYNGBZAVRnu/QNK8FS4b0Y4Tlg85Hglmy75AasoQ30+bEzwKMtKY8SIb0YoS1g9u0RINEuk1Wnhh4m2yUzzOyor8DUaI4SoZ0YoTVg9u0RKNEXyusxRtLgjVtajIvUmSJ4iwZ34nRQluJaJZobCvxuLYfMGAje31VwMb9Qbewf8dqvLFsYoYumdwA4QBn3sT2PbDVgUCOF5f2Rgjk2Nx6Fm/PYdJk9HHOfA7qkr48biBzqGqC23Bx/9j3GvDbrJisWC+73GwqRlQYQbinTL6znrKcBiQIoJ6ymLqOa/TrKV7HnmJJ6SjXxsU8E5zbhGluFahcfX6+d+9XZJN93iy9mfvr+0+OOb3l5dlbfKGfr6v760irIS119eBNt9Vjl565j8pCvumsBbDkgBTA60YLfnup1EejqM9VVNGFn5T1kJFvpJKUscsrL15jmdEREh0R0IsKOqgpfzELQ0pLYCx2pYCStKh+Qb5Nk7C5Kq0uJXxqXTrYKE5b7LSrNoOvC+Oxvddtq//ewzoqyCc6Diu/8yHztxzVWhu+u4OudRYWdgr551rAuGhm9G/dJP7yOP0wC3d/3Pp//RbEf/2++zfknvt5TeiJsBxp+jmpf18epUnVXkGalQ1ZtlPZxrusqo3ja9LljeXFZXstMvpqVb4qzj8yrr21rftlmm3K1apSGVvaQuVIckM1UX3q/TberaKkgx66t3PlvX1xDF3yIW8Gx/tmB4a8nBJam900ztqdjousVy7X9PtmFu09CTc91/Ksgeb71jyfLn2PLvn9mt503NOmtycm0PTg1Jh5Lwlver7TH/U6GYYVdM3vKqf2rqqEZz5YPHTMf4G1pbMRpYM+LFgfA/jlg8Xhl4BaHyhotX251VY8SYb0wweLh8s/40HEeRFEXiAFepildP53ZBag8631f9KQlFf8Hw==
\ No newline at end of file
+7Z3bkts2EoafZqqyF+PiWdKlM/bYW8nGTuzdJFcqioQk2hSpkJRnJk+/4AE6oamhhgAJxO2kbJEiJQhofAQaP7pv7LvN47vM367/k4YkvrGM8PHGfnNj0T8Ti/5Tnnmqz5gzqzmzyqKwOXc48Sn6mzQnjebsLgpJfnJhkaZxEW1PTwZpkpCgODnnZ1n6cHrZMo1Pv3Xrrwh34lPgx/zZ36OwWNdnp65xOP+eRKs1+2bTaN7Z+Ozi5kS+9sP04eiU/fbGvsvStKhfbR7vSFzWHquX+r77lnf3BctIUnS54WMYPGxf//Lfnz469258+7vx9umX2+ZTvvnxrvnBeeEvl02JiydWDflDtIn9hB79uEyT4lPzjkGPg3UUhz/7T+muLAa9PfjKjn5cp1n0N73ej+lbJj1B386KppUt7+SKT+WdzWdmJKfXfGS/zTw79R//8eTCn/28YKVJ49jf5tGiKl9548bPVlHyY1oU6aa5yI+jVUJfB/SzSMZ+U10q06HHfN2yiiJZQR6PTjV1/Y6kG1JkT/SS5l2vafbG8KfN4cPBiEx2yfrIgCyz6R9+Y7ir/Scf2pa+aJr3iqa2uKaml3PtvPa35Uv604vIj3+jXcpPVuW7Pxbptqm+mCxZdWdNycvXC1bF5lEV19f+WNZbRHvV6+b0JgrD6lOXURzfpXFKW+FNklYGlm/9IEpWP9ffYjuHU78131aeSulHLuOqQ63ph5GkLE1a+IW/2JvmNo2SoqpH90f6P63uO+OVe+PSX3pHj83DMf2/vDwr7tIkLzI/qtqdULt6IKVt/Rhm6fYztSTCfu1xN3DPTMgCTehiB3zerhpDor2mkyHZhiQ7sjk7+vhTbztaHHdPwCa6mtOp7Qgzneeso/yZjeG/0A6sFjvYP9masp08PE7s48gg7CHtweHsYZeTLPE3hJ79YZdEf+3Iv+SAxnjeMqoP05wyA1DF7UgVRh/hVuRyVjQ2U2rL0RYoTosJCAOKNFPwOFPY+nn+kGbhPFiT4Gu+2yBO1MbJ1BoZJxPEiViceC0moD5O2ITqyBZWcbrw43nmJ1+RJGqTxDSmI6PE5Cc8yJJeLNn3SA1hws92fFqr4TxNkCSKk8R2xiYJTnJEk0TfWY7JT3NiWjXzOF1FyBLVWeJ1dedLMx+c4YhmicZTnClnDFE+94Mi+kYQJYqjZDq269WcIUoEo2TaYgXqo8TiJzg5yfOI1hVvFCgK6NrZYVGAbXUcRuznLuLbm5+ToCxgfFmA1TaxUVcXYPETGhQGCBAGuC2WoL4ywG5Rl81lEQZHpcJwMrogwOaXbe5Hx4nm41K7bcCiwbiU93eQx21Eh3qIEsVRMroYwOLdIwiSfoOSSYsRaAAS3tsR0rpEiihOkfGFAMxMESPCMDJrsQL1MWLPuLYn4YqwqT+ttnW6ShM/fns4S+t7l4QkbGr7cM3PaWUbZU1+IUXx1FSlvytSempdbJinjDxGxR/N7eXrP8vXr9zm6M3j0VtvnthBQn/vH8cHR3eVh4fbqqMnwBpvLHs5DUgQlLZVZOlXcvTOYuo6rgG2etOYebrLAnKpNtnWLoaWVoupryur+iI0MhL71erHcTGEG8GMd5YuUj8L57iJ6pI5dPeXvnQX1VRWt5/x7tK6xUd0aXR3mnqGwoOI/k7TmX5O0xnsNL27/8m8xp6OK9CUNNbQ35U6E+pKZR6yYeyEd3/IdaUKXaxB7rzQuyrPnniXSMOdq+Y0yJ1O9iHUWzIod0yDfw6pPs8xr5vnvHzWwtpVs1mLafB9fMA2NV/Spv3mrsQMXTKB5q4zb2L7Xj8rcDtagWOqZQZMpaSRGVzZtYNd9q0qq9mrhR27YwubhiO6iatbX2eZ/3R0QfMAO3zyx/LEYdrsTU+nzaYzOzaXZ6+/dWdn5lWX4GBs+5/SwxHPBLf4aAEqh3m7n7c521UKK5ZjaNesCntGLburIQgfZMCsMCdnGsazoWddzuamM1sSQQ0GY42eWv3MK/TJdAmalxdMyWLZz7ysETnzsmfbmUv41nTdyw+38xvO46SdXT8z+13feAPkPjsdYB9qklArD8iGNPWHaw8itdrOtAHPs1ptT9Zk3HJQrK2i/+/QG/VZeLAclGtLkTQ4+uq1LWfoVQbUR4lDyuiKbfqI5MwHJdu9eaKx1NLhtZb5bvGljNOMOFEcJ+OrtlmMbdRbioOJvoJLy+V3k21Inpfx2xEmisNkfPG25VpIE9E7UzXeTubyDrQiojwp/M0WeaI8T0aP5Wa5GMxNOE/0jeZmuaMuS/3jVj0dPaVVlsd7VaPtfOEDEf2+rwUZzkqM6g/MuVbDefHqjcdWrZ97YDi2NER4vHcVV28UWL3Z91mNVm88WL+Nqzc9hyCedG+rRJsAvK24ejPKjOZ6pIy/ejPh3a24etObJ1o4XFfT/22Cd6/NSbBLH42Hh4fp2w9AasjDTlfjh2RHR4W06JjZS3m0DLmSA1oS73lFsHQHy8XOqTRWWqKoAEETfFrmcL5Ms/k2zYsaMTdlEWyzrF2kjT606bzU41jSLIx3zSJweo5kDt1WGnJEGAQISx44Qbp9qlFDfwuKUdSHitvRfSdtDIOrPYJHMFqs9Xy+d+9XZJN93iy9mfvr+0+OOQUmRlE+L9YZ8UPY0480UYwmkwGdLaAJ8TMipElXmlzsk0rTpCU4Le+2xeQ92rDEYsE0xnPczlAnK9ptO9XCbdvixwfGJyhpUx8k1ugS2QkOS4THSdd4YDLhE19Heb4j4dxHl4n6PHFHl8hOeMcb8qQnT+wWO9CBJ7z+zd9uiR8jT3TgSdfY2xINCPO4COeJxruLJ7zjpEkJhUDRACi2MbrkbYqeE+FA0ddzYjNX3pE5bEm28ROSIE/U5wnLGDligih+xow86Sk7sVrsQH2eWNO2/LdJWuDSjvpAcUf3yE75JxICpefSjsYe2Sn/fMEQKLrQZDq6P3aK/ljhNNHYHzvlNY2Bn8xrnywCRXWgOOboDlmWZhGBIg4o0sPHShQi6Zcran+gYAwUtndUsxgotjFqAhCN00td2uk3Qnap5tazdAeOdRpZZWI7r9zTD6l/E5cC5NpMD45z9k3e5UQP59ebzY+TmonB4ZcQqm3SmIGhzeK7x/BxOmR/ngJPOI9J6YSzzeE9ehjCZ/wQPvtO2CuCD2RK0qK1sM2OGMBH6PjZke7dk2cRvHMvp+WN0gQD+Aw9Hb8eKFD8Hggo0mZfQEYo3PTelyZaePfe34UPf97+7T16qfHhw91ba7uMgE2quyyiJ37YJdFfOwykoTxQoKg9soACWhAuPb6cJhe7pNIwaUkVzTt6wyhDnOiDEzAsz6ADFNPk9f9IlF7jk0O/1I8pQC7LxP+28KsQYFE57UGmqM4UKAvDsJMeXIAUPeXRd/0RyF5ZREWM2ijlOeJ1dOzLMx3cWSaaI/puLIOzViJKtEDJdGw/LGatFI4SfbeUATkrQ5IHWbTFCY4GNLHMAZ2wsAGhF1YwTTROWukC2z/8xzltQjIvNTzIE9V5Yo/thAXSniJP+vFEizViuOi8C7bkSR3KGBAwIk3Uook3tvvVRferaJro6351efdrSJb+Li7mtTkgTxTnyWxsN6yLbljRPNHXDevybtg4Db6SEEGiOEhsc2wnrIdOWNEg0dcJ6/FO2IDOcAoMZKwFTNhOmfFggj5YwTDx9PXBerwP1qdt9rRJd/k88Tc4zVEeKN7YTlgPnbCigaKvE9bjnbDLNAvIfI8VJIrqRJmN7Yj10BErmij6OmI9IM/CrkjLMIFzf1lGa0CgqA2UfYyV8YCCnljRQNHXE+vxntgknUcbCpQciaIHUZyxXbITdMmKJoq+LlkgR2WpPGmCGc9jkqxouRAqikOFJYwcDyromhUMFY0TVgL5KjdRglDRDCqzsd2zmLZSOFT0dc9OePesH9PqnZPNgqBIVnmcuNbYvtkJ+mZF40Rf3yyQAzcjYZTRMs+LtJHeI1RUh4o7tn8WU+EKh4q+/lkgEW5G/tpRqlR7AxEnquNkMrZzFhPhCseJvs5ZIG0lScrSzgNapXG6QqAoDhSPZU0dDyjomBUMFI3zVtoGT5RfUnpcZUqh/1anjFWcLoDEc/TXljV4lOqHyz1y3tT7PAZVbpOLjVYpY5rWYK1chmapr+fb5uokJvt0SCyLjQPMHUyoOaQlGmDapu8mQZPUPF0OWzLRLE+XA4gGo+18UaaA3IURsDPm+0pgxNmKUf2Bnz0CQHFrnuWv8iYAKaAEj7ZEVPD+qsZGRsxJ0j3vkWcoPBIUkPfo+qyhUOIj0KbkmRTvuiozH91dl63kuAZNSSPGf0A6JLGqQxbvYyBD4d1aRbShVeNvtnLYIzTnGrKnS46kYdkDiBCvy7qG2OlmG0K9X8NiB9AmUuQslxpkYVMaOYMgBgr/O2hOdAeQJGIetr48EatKhHgiwiA+37v3K7LJPm+W3sz99f0nx5ze8qLEKG/W+ct5FCJFdaSYUBBgWUwBTQj1iC/nycU+qTRNWhJVABmo87kfVP5CZInqLIECAA87PsGVOeGjE7FLcwPzhB+fkMdtlJU7O5UPjoVAMaEYwAMDBYcnwoGixQDFzOgP/M2531rz26fg9ZvcDv4E8k772y3xY6SJDjSBIgDLogloPjg4eTlLLvZHpUnSQkF+69WWZBs/KX8xskRxllhQEOCBRya480r4yETo1quBecJrWeqFnSQt0HeiPlCgQMADAwV3XQkHinSBikRz4AUqTbAJpInyNIGiAA9LkxkvRkGa9KSJdN2JRHMA0hSUWuzKfYJAUR4oUBDggYGC3hPhqac19p/MbK71/2HbfPhW7Lxphwmjn9+0w65UZNvOPqDNSS/34gp/0Tf6clW+/G9eJsoyinKb3VdCtmVRSsuL8iJtShukWXkJu3mRsXvZGVq+o08EviRdlv1gTQFCcvZl9fMqf8V/7FvaiZ72N+yvT+hf//5I/6rUUHf8fcW6vDiNy8KGFAdlDZVf54dh9RvXJCPA17X9irMuMej2wlaDvWabEAs+wpz2hgF47aHdvuxpJCFDDv+g+Yeh5mxHITFDl0xugF1iM29i+15XOK2m/9sE716bk2CXPhoPDw/Ttx9u7a5sckzRaKpufZ1l/tPRBY1ZHz75Y3niYIG3ZqOAuG+5wGp5uzFp52zj25WXm6fX0xf1D4DvvjVeGe7s8MdxHfvk425np9VTN1fzKWcdZV/FnfrOu0nx8dZ4GzmOa3303rj/s//9+XbynfUcUXtxwZ7jzLo+1aV0nOuNzTz/zBZr69wlWR857SKOe7lHXdGhXmD3cAtY/PJeRsrhPBBUEXcey9x57J02/60FhDfb28jxgMKcypq87KdFxzrXkDcM5Xb9KR17pv+uv0Ov7bPjGDQmaTu6LItf+Ltu1x/u8rvcR6WFpJFnEza/lEenpbRFwvniaX7Y8Gf8kOwo0+nv+Jcc+ojzwSqNnkFQA2wwBlEjzedGp3+cWeHuv76c2fdV/UJfWRbPmW2aFxpsJkacsK0y4+HEQpxIGLZojBP2bSfxmJAkqpPENHi1ydAjE15egCDpOS5pC8yqA0gszhwyWjup8gEJECamzStNhoYJv2sUYdITJlaLHegAE8BZm8+DmNBfjfMc9YHidfT3S7Qg3kWLQOkJFOneWRHmAK6Ju3zjD7Aofv1CNVtGZ6+7LKPzzQcsboO1wva/jLS43XMJ2jRnz8g6+qg6uC9zu62ri1JxuPppLc2bXjIOt/wP6h37xeqXWzqLf6CyOBMW80zHNINrMKSYmgesTbZFR93A+rD16pde4UoWvLxJWVqk4yaFH3aGEg8x61xsaze7ttqeYtwNpme3P8dEPX6Arc2NlgpzOTiXDPblIinH6jhp2sd8Ew8afm2xbnVMzjCsVOpyn1RSKQUXmV9uxNQM/efnlzuv0iHSwaIDG5cxMYPG3Okqm5JnUPzaJKZlEI+cmdD1ymGRw2961F2uqTSGhsAOkKtB2qoDbFT8DhRUV/VljNNiBkptmIeLbnHmoM8q5ndPEyhNw8A4QVGEaJhYLVagPkzA2JPXR2k4irAQdg7LcByHgb5alB+0SUOS1amNv5dICedrgq4D6KaMQec5HlepuDJw5g95frGH9VlFlntmo+7g/6et+bHxo2ZrfjMoMugLcf+wLt9vprfVcRk736hd+50fAh+SeB9shz7qb05j55RfWH14VIbfqSPsNMX4fkLp2O7JA+LWgXRwsyEfEKbBu1ZZ5a9NVvGv6yU92nbL9GJjHW5hJ7cnn1FFUcqqUExl1eeVsZHqxCGqU2UhKTWR7Pi6+rbajKjFGJ/XlV2RhF1Q21Rp5bX1VaZNHv2gODE14/c1SWA7TZruUQ/yyk+s+kEd+6ksfmnAd81FQbrddyC/qui6ALT7k29+tUJ7EkFq7e8jVi1IfX9UdYhyHMzeqT+iWUGty1EW+WKdb6/oHqcAbYb07VO9m9ov3Bx9rp4Ut1bZWx7WtDY+0fPlVz1k/rZ1QH/82BHQhW739+w7EdtochyNCupEpohwVHD8JO1GWf0eyKFPpkvwgewFU7JYdn0gg89Z2+j6RDYZT0fWbHhnS/WTZ4SH59ffWpclHjOz3/XNEEeqIATQU0fbMt/ofD8vPPdMoCLkSvadmY1pMn/PsxFgDVleB4cfPmgRNUdp72X/JVlbhBQENCVpI1EHl2SH8HDuO6x+S7JsOwKXTgXXYcdcObmeNYD8Q1rgctiS+IUTXIftCxaNl054c2jGruoHzfnuYQLEzBkWJkA6WoRJT5jokY8W5iBvDk1C2sodhzhRGydQ4JyBBye8SAxp0m9ooq9EzOFVHfWcJyP5llYYwZmPBLpAqxvyiANE1wGJ40gzMoyFIZo4QkNhQMSRZwy8sCDK57RaI9Skqj96YVl4xhu98Dv6kCX9WCJ93540Y/D4oezpoiBuFndAQ+i9NGizfvgcCPZKCfGhSXgSNBNhXCGUuEIISnw6osYTkWtj2GXDKb8AjTvIJT2J9j1av7VDj59H4w5yZeQK13On6xKiPIPqm+IHkdPJMqRPpOVZCD+RRrnC+JPq61kDbBsfdk7tYVIO8WDRd1Y94Ye8uMKoD06gfePD8mSCmTlEz4ykqyrlGYPVMkw5rDAiUNQGij22ZGGCgShEA8VqsQINgMILoHABURuWeB3FCPLMB+VPolmihfwJ3uFp8E+WnBY4opXFWwWuGl65auicb0TdhwN4dtlQxF7qliYHnh86LBgqndbpKh/9M11RycXBljLzD5PrvPTfvVf+mT4qLdWTRJvglwITf6P8NFdpvAyCkyG3DbaUGYWywkmiRdK4lrLzK3z+YpGRb1ET9xCJojZRhtw72FJmlMsKJ4rQlb1hiWLyS3vbNI+QJjrQZNCtgy32gyt7onFiCl3aGxgnQBKLumIRJqrDpOuuQInWg5544TCR7jcRYQ5gjEuLf7TscpKVrpNyRw9vGeiNv9Ibz4U2NZng/lkGMEmR+Fa3uFZHZ/ygzvjLnVFJXzxcZH4lD13xVz1SLndQpT3xcNH50eki9bNQN4G80qwZgi1DOubhImNeNfFg0Xeo6vJD1cPOG2SJ0iwZ0iUPGw8/4kWW9GSJ22YG6rPE4tUCNUuStEDNgOo0GdQlD5cZJQOiByZaKAbgokOxtfIdCee+8vv2kCVDeuThMqNYQDRLtNAKwDmneKkA88cjSlRHCZD3b1iU2PwUGVHSCyX7/qghSoBFnnyekRX9HYgSxVEyZHQS2Hpw869olEhf05FmDLy3hLYeQZGAPJHArdt1LCFNJACkfpTkaEeNQHeKtLlJ1JUI8N4RVAj0f5q0BRFXXyDAuztQHzD+GPVqrowuDwB2VeCSXk+qCA0FPOgQFchQgOoAPUgyvjgASSKcJI6+KAG2W6E4QBeYjK8NYBNy9JyJYonZ5k/RgCVAEmLUBmiCktGlAcBOT0RJP5QITUE8LEp4hyzzwiNJFCfJ6MoAk/fCIkn6kUS6B1aeMfC+ElQGaEKS0YUBFu8sQZL0I4m+rhKbH6CWYxJUBUhSBVhdZQF7TohvciD7qyQXO+oCukPEbtvYqa4wwOZlRagMEKAza0sPoL40wOanuKgNGH+Uej1bRhcH2Px8F5f0+oJF3xmvw4MF1QGasGR0eYCDLBHOEkdflthtSiOUB2hAk/H1AQ460EQPTPR1oDm81gj1AdqwZHSBgGMhSwQPTPTVGjm81ihYk+BrvtsgSlRHyegKAQe1RqJRoq/WyHW4tifhirB1Clpt63SVJn789nCW1vcuCUnY1Pbhmp/TyjbKmvxCiuKpqUp/V6T01LrYsJU98hgVfxy9/rP8qFduc/SGLdhVB0/sIKG/94/jg6O7ysPDbdURu4+2efqVMHu8seyZN7F978xO6Xlihi6ZgK3eNGae7rKAXKjNZnhaMLLctASSZ8+esqovQiMjsV9E38hJMSAjqG59nWX+09EFTT84fPLH8sTRsqN3uurYrPjft1zusAnNyy43m/IfzLUu78F49z+8hz27uthzu12+1NLF2zMLIjuWQfM25XmvvKM/kzMLO1uvqsvdfMbB9Dr3E2bojWOQs/R/UL/xdOk3wp4Di6nruEC/WU4DEgS9+g0LmPpsv7GUeA6c22eTcbzVQMewz4ku9tluZ4K4LsA+mVN+JPvkLOosj7k3fTV1J6ZjNX+fDX77Uh0241uzGTsoZfb8EsQvKT2uxBL03+qUsYrThR9zHYTORYpTe+a0bK2imEord3FKVfaWvJkrsTlYmeewvr7VNruL4szJeQMBM2cTmiwJUK3A+Z+ASGvbNK+NDCWQvVp7Zp+2tmtzjb1v2OPGdhxpCdR0FUB6hsI+tqsEkM/0wj4KSNCY5GWt7y2BPK48U5IbTitJ5DN9Vogrjs2KhgmXxD/ri3VG/FAD7ZLSyBkEMYAQEkSMxChJGNxEuGd/3yel4URe/lcPikgwpw0yL8esSBTViQLIIaURpcWCcKVQ9PjEE7pUKAsoMclfx7/dzbLtu+lfb7N3P7130ltAwLRFiqhOEUgGKQ0joN3wPhOESFeIXOyISiMEtl9AEhvQKU5BwnkKbCRGmCgGE0AHOfCYBNDRIk76jUn2nVJHoPBDVB3iJCFKIB3k0Cjh/fuIkp4oEZp1emCU8C76Iou2QRoiTtTHCRAuaWicYKpY4TgRmit2WJxMgbQ6+TxLYzLPaev4xS5DrijPlX3WpfG4MsWIjqK5MhW6KX1grvDLxGTjR7z8C1miGkvsAV2xcKFnuCVdOEs0XiKeAQkwdosvtMxIE+Vp4o3ui53h0o5omsw0XtyZ8YKTDclzf4XzHPVpMhvdHTtDtYlwmmihNmkpO++db2gyz/wHJIrqRLHN0T2yM96jj0TpSRTp+nqJ5sB7ZLd+nj+kWYg4UR4nLALWiDhBR6xwnOjriLUMfroTkpgUWoT0Q6DY3tjeWMvAGY9goBw6pdJAgfcaAduN83mDFOSJ8jyZDeiPhQ0Ipzuit//pO9uxAP3JwqdlDud7p6xGiVaQL441tofWQiWK8PGKxkoUy+AHLGVOwO8+Gg4XAcyo/sD2zRvK9YGS9hi4EDvHAEhhs+ivEmyDH4toETtH6fjU/WPnHPpsr9g5oDHJip1jGfxIBtMHipgrC1VXy8of2FJ2fihSRrXQIFSO0oQZhChQqByIKBJHLryGFkPl9MbJtMUQlIqCD5edhZE8T2+dZiEd4tGJ8i6J/tqRqoi0hLQ6atgoP2/WhTYP66ggn2g5yzMPmb+VSiAotA44pplKMzjcxi6aP/s+LG84I88cLM4c6NSWzjz9eF6CSIc97bqgRh5WTMhFN+zIxuQXpZErPbnS5qrVYVzDD3QRJ9rgxBl9omTx42LESU+caJHDtMUc+FErJh7UBieTjrMeifbDD3MRJ/1w0rpcpANO+MFq5XWp0oogT1TnyQwQUA7MExRQCueJFrlMLfL3/Ou3x/jz+vWvX353v66MN7NbMN55TmswJpn6CkoEyr47DwEU0IIQJy/HycUuqTRMfvFnv0Uz992Ht2Y0eefcv/vv59dAtPO6JEgR1SniDuiEBU0HJzkvp8jFvqgfRfghSfO1iBHVMTIZ0PkK2g4ORgRjRN/BCC+0Lta7zSLxo3iOwxIteGIbA3pfQSPC3WGCeSJ0c9igPOEF1Qee4ABFE6BYA7pfQSvC3WCCgSJ0L5gsoMAbZfmmJ+GKsB0rtNbW6SpN/Pjt4Syt7l0SkrCp7MM1P6eVaZQV+YUUxVNTk2XC+ZuTdPbkMSr+aG4vX/9Zvn7lNkdvHo/eevPEDhL6e/9gH1AeHN1VHh5uq47Yfe2buvjGbRotT3dZQC7U2qTpQQUjSBseWNKjsk4vsiEjsV9E38hJOcS3tjNKaw/XcscNArecJ7pBmls/lsi52W/tm7FevFcYWqcfUdtYc9ehWV9nmf90dFlDsqu/577l+um03/VNYMKDEdYFPpjkvgpfbqUTaNZU5tP+7jeottp99z2nE+O0QV1+drPP8HT6BBKw5fRil8Qdp2PtOL3cC/tsOAVNScTmQrjIuN9URjCViRbbTS8O1I5jqaR+FuJ2U4kTZUE4AXabtjyZZBkPbjYVzxIt9pqCRWd7D4/MIU6DryhQUp4kwK7RYUkyxc1dgjmy74wacoRfH85p03yNkCTKk8Q0eN/9wCjB3MeiUSI09fGwKOGnN34SrFNUTWuAEpsXTQ+MEn5+gyjphxJ9ZzdAgsngKYjLxkGUqI4Sho3RUALko0SU9ItgLT0ojrznCr+gE9OqmS92my2yRHWWTMd2uwLxz5El/YYl0hdwRBjD+7vw4c/bv71HLzU+fLh7a22XESB41Ce1xnfPkn0EpiFYApoPKh1fjpKL/VE/kvCTXX2SfiFJ7AH9rqD5AIFmESW9UKJFOC3YFoA95mkW0hYsSIYiRa75rxYpHqIjsRw6ZlcPh4hQr3CjW1yjo0xxUJni5b6opEwRLjKvBkCZYv/nifxwr/IsgpcEHGSKGiV7U5o1Q7BlSM0iXGReHoCaxb5g0UIgABedd8XTUeRyifpn9VkypGoRLjLvfEWW9GWJvq54k3em1ixJ0gKjvqpOk0GVi3CZUW4kGiZayI3AogP5CaI836E3XguWDCldhM0H9UaCWbLvkBqyhPfM5sTPAgyupjxIhhQuwraDO7NEg0S6G1aeMfBu2CifZ2RFfweiRHGUDKlbhK0Hd2aJRom+jleLd5YEa9rUZF6kyBLFWTK+btFCX4lolmjsK/G4th8wRiN7fVWMxv1Bt0h/x9Z4Y9nEDF0yuQEiAM68ie17YKsDsRsvruaNELuxufUsxJ7DTJPRxzmTGdQlfXmoQKahauLZcKH+2Pca8NusmKxYL7vcbCpGVORAuKdMvrOespwGJAignrKYuo5r9OspXseeYknpKNeGwjwzOLeJzNxqoHLt8/O9e78im+zzZunN3F/ff3LM6S1vnr2NL/TzdXV/HVw1pKWuHrzptnrs0jP3UVnIN51tASw5YArgdaPFu71U6qNR1OcqkOjCT8p6yMg3UpmUscsr4a6xzOgIiY4I6EUFHdSUv5hFHqUlMBa70oCStKh+Qb5Nk7C5Kq0uJXw2XTrYKE5b7LSrNoOvC+OxvdC2VbL3sI4K8omOw8rvfMj8LUe11obvrsm1ziLBTiFJrgWMi2ZG/9ZN4i+P0w+zcPfHrf/Xb0H81++7f0OK3M9rQk+E5UjTz0n9+/IoTar2CtKsbMiynco23mVVbRxfky5vLC8u22uR0Ver8lVx/pFxLdC27pdptilXq0rL2NIWKkeSG2oT1afeb+PdKko62EP3dq4E2xfH0CUf8mZwLKbZTeOs3em4yHrlck2/b2bRgkm46bmWZw0037fm+XQJVfjXNr3puKdNb09MoOnBqTFTLwlver7TH/U6GY4VVOOD5nSxXyopxgdLjFr8nt6Wi51UaSk+WHJ+Caj1gYJeWzFeWzEkGVJ6D5YYl38EQ0TF1R96mKV0/nfkFqDzrfV/0pCUV/wf
\ No newline at end of file
diff --git a/Database ERD.png b/Database ERD.png
index 426c001d..4564cee5 100644
Binary files a/Database ERD.png and b/Database ERD.png differ
diff --git a/cmd/gochan-migration/gcmigrate/migratepreapril2020.go b/cmd/gochan-migration/gcmigrate/migratepreapril2020.go
index 0b582e7e..9a063f38 100644
--- a/cmd/gochan-migration/gcmigrate/migratepreapril2020.go
+++ b/cmd/gochan-migration/gcmigrate/migratepreapril2020.go
@@ -63,10 +63,6 @@ func migratePreApril2020Database(dbType string) error {
if err != nil {
return err
}
- err = dropTable("wordfilters_old_normalized")
- if err != nil {
- return err
- }
return dropTable("numbersequel_temp")
}
diff --git a/initdb_master.sql b/initdb_master.sql
index f9a3ea56..a0ca6153 100644
--- a/initdb_master.sql
+++ b/initdb_master.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id {serial pk},
board_id {fk to serial},
- staff_id {fk to serial},
+ staff_id {fk to serial} NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/initdb_mysql.sql b/initdb_mysql.sql
index ca78e1c3..3c60306f 100644
--- a/initdb_mysql.sql
+++ b/initdb_mysql.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id BIGINT NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
board_id BIGINT,
- staff_id BIGINT,
+ staff_id BIGINT NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/initdb_postgres.sql b/initdb_postgres.sql
index 3f67f81a..88ea848e 100644
--- a/initdb_postgres.sql
+++ b/initdb_postgres.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id BIGSERIAL PRIMARY KEY,
board_id BIGINT,
- staff_id BIGINT,
+ staff_id BIGINT NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/sql/preapril2020migration/initdb_master.sql b/sql/preapril2020migration/initdb_master.sql
index f9a3ea56..a0ca6153 100644
--- a/sql/preapril2020migration/initdb_master.sql
+++ b/sql/preapril2020migration/initdb_master.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id {serial pk},
board_id {fk to serial},
- staff_id {fk to serial},
+ staff_id {fk to serial} NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/sql/preapril2020migration/initdb_mysql.sql b/sql/preapril2020migration/initdb_mysql.sql
index ca78e1c3..3c60306f 100644
--- a/sql/preapril2020migration/initdb_mysql.sql
+++ b/sql/preapril2020migration/initdb_mysql.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id BIGINT NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
board_id BIGINT,
- staff_id BIGINT,
+ staff_id BIGINT NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/sql/preapril2020migration/initdb_postgres.sql b/sql/preapril2020migration/initdb_postgres.sql
index 3f67f81a..88ea848e 100644
--- a/sql/preapril2020migration/initdb_postgres.sql
+++ b/sql/preapril2020migration/initdb_postgres.sql
@@ -257,7 +257,7 @@ CREATE TABLE DBPREFIXfile_ban(
CREATE TABLE DBPREFIXwordfilters(
id BIGSERIAL PRIMARY KEY,
board_id BIGINT,
- staff_id BIGINT,
+ staff_id BIGINT NOT NULL,
staff_note VARCHAR(255) NOT NULL,
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
search VARCHAR(75) NOT NULL,
diff --git a/sql/preapril2020migration/oldDBMigration_master.sql b/sql/preapril2020migration/oldDBMigration_master.sql
index d6580df5..ca4f445a 100644
--- a/sql/preapril2020migration/oldDBMigration_master.sql
+++ b/sql/preapril2020migration/oldDBMigration_master.sql
@@ -299,71 +299,4 @@ INSERT INTO DBPREFIXreports(post_id, ip, reason, is_cleared)(
SELECT post.id, report.id, report.reason, report.cleared
FROM DBPREFIXreports_old as report
JOIN DBPREFIXposts as post on post.oldselfid = report.postid
-);
-
---wordfilters
-
---normalize boards
---Create copy of table structure and drop not null constraint on boards
-#IF MYSQL
- CREATE TABLE DBPREFIXwordfilters_old_normalized SELECT * FROM DBPREFIXwordfilters_old LIMIT 0;
- ALTER TABLE DBPREFIXwordfilters_old_normalized MODIFY boards VARCHAR(255);
-#ENDIF
-#IF POSTGRES
- CREATE TABLE DBPREFIXwordfilters_old_normalized (like DBPREFIXwordfilters_old including all);
- ALTER TABLE DBPREFIXwordfilters_old_normalized ALTER COLUMN boards DROP NOT NULL;
-#ENDIF
-
---needed because id sequence is otherwise shared between this and the old table
-ALTER TABLE DBPREFIXwordfilters_old_normalized DROP COLUMN id;
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN old_id int;
-
-
-INSERT INTO DBPREFIXwordfilters_old_normalized(old_id, search, change_to, regex, boards)
-(SELECT
- filters.id,
- filters.search,
- filters.change_to,
- filters.regex,
- #IF MYSQL
- TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(filters.boards, ',', nums.num), ',', -1))
- #ENDIF
- #IF POSTGRES
- TRIM(SPLIT_PART(filters.boards, ',', nums.num))
- #ENDIF
-FROM
-DBPREFIXnumbersequel_temp AS nums INNER JOIN DBPREFIXwordfilters_old AS filters
-ON TRUE
-WHERE CHAR_LENGTH(filters.boards)-CHAR_LENGTH(REPLACE(filters.boards, ',', '')) >= nums.num-1);
-
---replace * with null
-UPDATE DBPREFIXwordfilters_old_normalized
-SET boards = null
-WHERE boards = '*';
-
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN board_id int;
-
---fix board id
-#IF POSTGRES
- UPDATE DBPREFIXwordfilters_old_normalized as filters
- SET board_id = boards.id
- FROM DBPREFIXboards as boards
- WHERE filters.boards = boards.dir;
-#ENDIF
-
-#IF MYSQL
- UPDATE DBPREFIXwordfilters_old_normalized as filters, DBPREFIXboards as boards
- SET filters.board_id = boards.id
- WHERE filters.boards = boards.dir;
-#ENDIF
-
-INSERT INTO DBPREFIXwordfilters(board_id, staff_note, issued_at, search, is_regex, change_to)(
- SELECT
- board_id,
- 'No staff, staff note or date.',
- CURRENT_TIMESTAMP,
- search,
- regex,
- change_to
- FROM DBPREFIXwordfilters_old_normalized
);
\ No newline at end of file
diff --git a/sql/preapril2020migration/oldDBMigration_mysql.sql b/sql/preapril2020migration/oldDBMigration_mysql.sql
index cf57d8fa..c303f618 100644
--- a/sql/preapril2020migration/oldDBMigration_mysql.sql
+++ b/sql/preapril2020migration/oldDBMigration_mysql.sql
@@ -241,51 +241,3 @@ INSERT INTO DBPREFIXreports(post_id, ip, reason, is_cleared)(
FROM DBPREFIXreports_old as report
JOIN DBPREFIXposts as post on post.oldselfid = report.postid
);
-
---wordfilters
-
---normalize boards
---Create copy of table structure and drop not null constraint on boards
- CREATE TABLE DBPREFIXwordfilters_old_normalized SELECT * FROM DBPREFIXwordfilters_old LIMIT 0;
- ALTER TABLE DBPREFIXwordfilters_old_normalized MODIFY boards VARCHAR(255);
-
---needed because id sequence is otherwise shared between this and the old table
-ALTER TABLE DBPREFIXwordfilters_old_normalized DROP COLUMN id;
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN old_id int;
-
-
-INSERT INTO DBPREFIXwordfilters_old_normalized(old_id, search, change_to, regex, boards)
-(SELECT
- filters.id,
- filters.search,
- filters.change_to,
- filters.regex,
- TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(filters.boards, ',', nums.num), ',', -1))
-FROM
-DBPREFIXnumbersequel_temp AS nums INNER JOIN DBPREFIXwordfilters_old AS filters
-ON TRUE
-WHERE CHAR_LENGTH(filters.boards)-CHAR_LENGTH(REPLACE(filters.boards, ',', '')) >= nums.num-1);
-
---replace * with null
-UPDATE DBPREFIXwordfilters_old_normalized
-SET boards = null
-WHERE boards = '*';
-
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN board_id int;
-
---fix board id
-
- UPDATE DBPREFIXwordfilters_old_normalized as filters, DBPREFIXboards as boards
- SET filters.board_id = boards.id
- WHERE filters.boards = boards.dir;
-
-INSERT INTO DBPREFIXwordfilters(board_id, staff_note, issued_at, search, is_regex, change_to)(
- SELECT
- board_id,
- 'No staff, staff note or date.',
- CURRENT_TIMESTAMP,
- search,
- regex,
- change_to
- FROM DBPREFIXwordfilters_old_normalized
-);
diff --git a/sql/preapril2020migration/oldDBMigration_postgres.sql b/sql/preapril2020migration/oldDBMigration_postgres.sql
index 16cdda9a..96f6de9c 100644
--- a/sql/preapril2020migration/oldDBMigration_postgres.sql
+++ b/sql/preapril2020migration/oldDBMigration_postgres.sql
@@ -245,52 +245,3 @@ INSERT INTO DBPREFIXreports(post_id, ip, reason, is_cleared)(
FROM DBPREFIXreports_old as report
JOIN DBPREFIXposts as post on post.oldselfid = report.postid
);
-
---wordfilters
-
---normalize boards
---Create copy of table structure and drop not null constraint on boards
- CREATE TABLE DBPREFIXwordfilters_old_normalized (like DBPREFIXwordfilters_old including all);
- ALTER TABLE DBPREFIXwordfilters_old_normalized ALTER COLUMN boards DROP NOT NULL;
-
---needed because id sequence is otherwise shared between this and the old table
-ALTER TABLE DBPREFIXwordfilters_old_normalized DROP COLUMN id;
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN old_id int;
-
-
-INSERT INTO DBPREFIXwordfilters_old_normalized(old_id, search, change_to, regex, boards)
-(SELECT
- filters.id,
- filters.search,
- filters.change_to,
- filters.regex,
- TRIM(SPLIT_PART(filters.boards, ',', nums.num))
-FROM
-DBPREFIXnumbersequel_temp AS nums INNER JOIN DBPREFIXwordfilters_old AS filters
-ON TRUE
-WHERE CHAR_LENGTH(filters.boards)-CHAR_LENGTH(REPLACE(filters.boards, ',', '')) >= nums.num-1);
-
---replace * with null
-UPDATE DBPREFIXwordfilters_old_normalized
-SET boards = null
-WHERE boards = '*';
-
-ALTER TABLE DBPREFIXwordfilters_old_normalized ADD COLUMN board_id int;
-
---fix board id
- UPDATE DBPREFIXwordfilters_old_normalized as filters
- SET board_id = boards.id
- FROM DBPREFIXboards as boards
- WHERE filters.boards = boards.dir;
-
-
-INSERT INTO DBPREFIXwordfilters(board_id, staff_note, issued_at, search, is_regex, change_to)(
- SELECT
- board_id,
- 'No staff, staff note or date.',
- CURRENT_TIMESTAMP,
- search,
- regex,
- change_to
- FROM DBPREFIXwordfilters_old_normalized
-);