From eea50c298914a7a55388d4381a99d693f917a811 Mon Sep 17 00:00:00 2001 From: Jim Ezesinachi Date: Wed, 23 Oct 2024 12:25:16 +0100 Subject: [PATCH] fix: value 'is' or 'is not' null not working (#62) Signed-off-by: Jim Ezesinachi --- .../executors/PgExecutor/PgExecutor.test.ts | 48 +++++++++++++++++++ .../executors/PgExecutor/queryBuilder/exp.ts | 4 ++ .../static/reference/assets/navigation.js | 2 +- .../docs/static/reference/assets/search.js | 2 +- 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/execution/executors/PgExecutor/PgExecutor.test.ts b/packages/backend/src/execution/executors/PgExecutor/PgExecutor.test.ts index 4ffdfe7..2efb798 100644 --- a/packages/backend/src/execution/executors/PgExecutor/PgExecutor.test.ts +++ b/packages/backend/src/execution/executors/PgExecutor/PgExecutor.test.ts @@ -105,6 +105,54 @@ describe('PgExecutor', () => { ]); }); + it('single provider is null', async () => { + const q = from('film') + .columns('film_id', 'original_language_id', 'title', 'rating') + .where({ original_language_id: { is: null } }) + .take(2); + + const result = await executor.execute(q, executeProps); + + expect(result).toEqual([ + { + film_id: 1, + original_language_id: null, + title: 'ACADEMY DINOSAUR', + rating: 'PG', + }, + { + film_id: 2, + original_language_id: null, + title: 'ACE GOLDFINGER', + rating: 'G', + }, + ]); + }); + + it('single provider is not null', async () => { + const q = from('customer') + .columns('customer_id', 'email', 'first_name', 'last_name') + .where({ email: { 'is not': null } }) + .take(2); + + const result = await executor.execute(q, executeProps); + + expect(result).toEqual([ + { + customer_id: 1, + email: 'MARY.SMITH@sakilacustomer.org', + first_name: 'MARY', + last_name: 'SMITH', + }, + { + customer_id: 2, + email: 'PATRICIA.JOHNSON@sakilacustomer.org', + first_name: 'PATRICIA', + last_name: 'JOHNSON', + }, + ]); + }); + const language = from('language') .columns('language_id', 'name') .where({ diff --git a/packages/backend/src/execution/executors/PgExecutor/queryBuilder/exp.ts b/packages/backend/src/execution/executors/PgExecutor/queryBuilder/exp.ts index d78ab64..6c290fe 100644 --- a/packages/backend/src/execution/executors/PgExecutor/queryBuilder/exp.ts +++ b/packages/backend/src/execution/executors/PgExecutor/queryBuilder/exp.ts @@ -455,6 +455,10 @@ export class SqlBuilder { `Expected value ${JSON.stringify(value)} to be a primitive in ${JSON.stringify(op)}`, ); + if (value === null) { + return ['op', opName, quotedColumn, ['const', null]]; + } + if (opName === 'in') { return ['op', '= any', quotedColumn, ['param', value]]; } diff --git a/packages/docs/static/reference/assets/navigation.js b/packages/docs/static/reference/assets/navigation.js index c654691..a5b463c 100644 --- a/packages/docs/static/reference/assets/navigation.js +++ b/packages/docs/static/reference/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5WXXW/TMBRA/0ueC2ODDehb11ZigLbSTiA0TZPn3K7WXCe1ndEK8d9RnbR2Yufae5xyfGzfD+/27m+mYauzYfZI6DOI/ERJmg2ykuhVNszWRV5xUCfNxwcl6duVXvNskD0zkWfDs0FGV4znEkQ2vDvKflQgd1PxxARYGeVEqY7MAdvi07NP/wZH32In9GrDp1IWEhe6JGZ0Np7JolTWyoQGuSS0/6RmQScO5xdd+YwTkWbdk5iOFpwD1d+J0la4rATVrBBtn4O2jRcfWsJ1WSgwm8eNlkWUa5bnHP4QCTGhJT3dvXtGzsK1SDkL1KGzckVEzkG+gW0pQamwpYEeGii5sqkEomFar2qK7UvtCl08tA2iQCNyuJeArcYvtSeSb3QNW913Eb0rQ1p/SWend58/np67OfFXzGFTgVvQyXs1K2Nb1mHGbuen6bhr32I0QUxoWagSaE967Pfk5DyBAEl0sKk6ugOKHnFTgWTQ0xPNx+TDjQtercUElsFnzrUdSeyZO0L79xWkZhB+lYNiuyZpi1eYUeGCrmBNorIaw0S35JFDSigPICYbid24EOaPTnu5JkvFWmkkdpPLiGpymWDp/McJigL/aYIuE4iIyzCprlb0+3V+7D3jJRNE7m5KTHdgUl373i68pzlkrMmYd0xkzgThTKMJcbCo0XQMKjNEmud2V6LZtVSa7yfhVYLQYDHjBJYgJeRzUBVHe6xNxrxXgvIqR0/ZIDHT14IJvP5qIuaJNmxSt9ZTLpFkDdofLzzdkUzyxpPgYDHjHJZ42AwQsyxgP4RjmpqIeaJPXNL79msFErUYIMky5qRScVeNRV+2q+vR/PfDzWw6H93ezBdW+0Ik29+s8751+Lb/fWv2K3hoYnJttODIzxmm+mo2bOvyqLpTZH3GQKm1ROV+s5jGQIhk0/cb0JUY6M0pOllKIH1zr/mUPFU2A7c3wDjzkBW2YXRSq0mTpm/gvWme8gDGqlj1HNfWsFW32W5AWxXcnGImixeWh+vPO/IBRouvNw4hsYcjavUacQcO1JYVVwqaU+BOyyXJvIzhzmCJmR64/w/9nO/IRRMAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE5WXXW/TMBRA/0ueC2ODDehb11ZigLbSTiA0TZPn3K7WXCe1ndEK8d9RnbR2Yufae5xyfGzfD+/27m+mYauzYfZI6DOI/ERJmg2ykuhVNszWRV5xUCfNxwcl6duVXvNskD0zkWfDs0FGV4znEkQ2vDvKflQgd1PxxARYGeVEqY7MAdvi07NP/wZH32In9GrDp1IWEhe6JGZ0Np7JolTWyoQGuSS0/6RmQScO5xdd+YwTkWbdk5iOFpwD1d+J0la4rATVrBBtn4O2jRcfWsJ1WSgwm8eNlkWUa5bnHP4QCTGhJT3dvXtGzsK1SDkL1KGzckVEzkG+gW0pQamwpYEeGii5sqkEomFar2qK7UvtCl08tA2iQCNyuJeArcYvtSeSb3QNW913Eb0rQ1p/SWend58/np67OfFXzGFTgVvQyXs1K2Nb1mHGbuen6bhr32I0QUxoWagSaE967Pfk5DyBAEl0sKk6ugOKHnFTgWTQ0xPNx+TDjQtercUElsFnzrUdSeyZO0L79xWkZhB+lYNiuyZpi1eYUeGCrmBNorIaw0S35JFDSigPICYbid24EOaPTnu5JkvFWmkkdpPLiGpymWDp/McJigL/aYIuE4iIyzCprlb0+3V+7D3jJRNE7m5KTHdgUl373i68pzlkrMmYd0xkzgThTKMJcbCo0XQMKjNEmud2V6LZtVSa7yfhVYLQYDHjBJYgJeRzUBVHe6xNxrxXgvIqR0/ZIDHT14IJvP5qIuaJNmxSt9ZTLpFkDdofLzzdkUzyxpPgYDHjHJZ42AwQsyxgP4RjmpqIeaJPXNL79msFErUYIMky5qRScVeNRV+2q+vR/PfDzWw6H93ezBdW+0Ik29+s8751+Lb/fWv2K3hoYnJttODIzxmm+mo2bOvyqLpTZH3GQKm1ROV+s5jGQIhk0/cb0JUY6M0pOllKIH1zr/mUPFU2A7c3wDjzkBW2YXRSq0mTpm/gvWme8gDGqlj1HNfWsFW32W5AWxXcnGImixeWh+vPO/IBRouvNw4hsYcjavUacQcO1JYVVwqaU+BOyyXJvIzhzmCJmR64/w/9nO/IRRMAAA==" \ No newline at end of file diff --git a/packages/docs/static/reference/assets/search.js b/packages/docs/static/reference/assets/search.js index 30b4811..c77385c 100644 --- a/packages/docs/static/reference/assets/search.js +++ b/packages/docs/static/reference/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE71dW4/bSK7+Kwv3Pjoel+7qt8kFONmz2MkmwS4OGkFDsasd7ciSW5KT9Ab57wdVupFlUjer8zLJxEXyK34kq4q6/Vjl2bdidXv3Y/VnnO5Xt9Z6lUZHubpdfY52f8p0/1uR71br1TlPVrerY7Y/J7L4rf7tvsh3my/lMVmtV7skKgpZrG5Xq5/rS227JCY17ZJ4gpYvUbpPZP5Cfj/lsihIjfWY+3rMDO2p/F72qlYDJuiN0zLPipPc0Vq7nyfofDzLPJa0B+rfJmjLZcSA078MavKcjugsSeSu/HtUlK2yh3O6K+MsxYEDRhLK16tTlMu0NCKRsXk8ZYX851nmT4NGu6GzrLqu7bWG7+/Lp5OcavIG/UurYxAG1oQm3QEUW6tzTPGYvDzHyV7mS2DcIHVXwG3mzKCOzoejTEu5n0UoifxC5aLoQSge4/0+kd+ifCgquoFzwtByuyDUoN4lUdpajNNS5g/RzqjU7cA5FhFDb77L3VnN6S8f46OcZvemFb6vhYe56KbIAFK/pXF6mIOnkV0QzgdZlnF6KCYiAWLzQPRWp2kYptSlTkU7A8YxH/P4cJD5VMcAsQWDZWacLAdiBoDZxi8qxpv0EKfyXZ6dxrEBxl9dP5S1OTZvKsGRHoAz5BbI3Rd5jOZhaWWXg3PK5Umm+w+PM92D5JeDtY/Sg8yzc5E8vT2kWS7fyfwYF4Va1OYBHdC4HPRumZ2JFCtYkursa7wfWwoJpjvxBUFl2dzIqySXg5Jkh8PYGn2BphO+DpAVUDWzxVQr5wDNKZOuAGfmLC3K/Lwrs3ySyRssOMkFoyJjFIiLiCiL/Yu4eHHK469RKa/AYhTtUWiIYr0YHqJqj/MQXa0Xw0XVvlHAuJq3GDKpjwBZPhEXFFsGlbV1AgPVtPS+6YTm5hmF4fd0/+8oLmdB6WQXQaSOvnEy0Sud0FwMvUeZKRg29Z8vxOQjTa3NUNTTbFkG4KaYvn8zQQ60WE5RHh0nZh8Lt1W2MGIjMU5JFKdTM6IRmr0Igi3Ah6e0/PKYvMnzgQUZDpzV3UH5l8uolK+jMvocFfJVlqZSt5NmwLgZ0jXsJeSDXsQfHpO20zMfK6VlSZTv2jV4AbA9ypbE/F4Wpywt5Icyl9ExTg/zEbOqlsT7tyJL30V5cRVSQsmSGF9F+T5OoyQun+ZjJJQsGqvdGfmKGL1UMhvjnMMKgWviaYUBgzeY+VQUlcQy1gf3KpfmR29Mxtg/yqKIDlMhdFIXe+s4/SLzuJT7a1Dtsv1USLXIbK/Aa4Q6+t9UF4Xr4f9TXc8lrtRQF5F7NPQv8tRVa5jooS/cLpH+Ib+XDD4VJMRV6EuJcXja69wjd93TzN8M7LZNFISeSV56Lx/PElx0Ho22FpzvMzPIehi8jLAWGCe7BK6DTGUeldQ1SePug2Zkv1XjjgbuRgDCHLw3YZcl/WbgTQ6kDX3yGLCix1xp55G5EA3t6DEvxCxL424q4KzdPI65kQCYrqSr/3Jbjoc8G/Isi2FTC08CQp3/cM7j2wGq/IZ4RtzUMcP/fXaGahycau+NGsjbIyyO9/CYGy4KqW7EmWS/FVkGwbcvMp/k8k0jsYz9ON0l5/00BJ3MMhiS+BhPI6GRWMZ+9vBQyGkAWpFlEOy689MkGFhuITai/04DUQssY/2QZ+fTy2kAOpllMJyIi7xjcJxGXMqdiuVLVHyZBKIWWMa6/mOK9VpgtnVz5fs9fXqVpaX83pee3aBfsAYaxqYshGAyV0UeDWFy+AE1Y3j4GH1O5Gv50A+sGfVrmEDWJlLRzoc9tSfn4xAPFIBNJzkJyCgWXr/sB/T65RzPc3SPmPxC5oa2uM2QOebsztLLt//4/f3/3f/x7s373z/+8f5Da/FrlMdqOtiqOXyJyb6M0yh/+uOkTpuZ2eJAxtHAJU2PMLqEuVejdjVg1CJGdfL12dMDljP1ryg59yUKGLWc0Y/9pbEbtITJt4NnhHrEEsb+lsVpb4RWA5YwVd0tqroksrxoNl7sc9qBv+qgjQ1OPnF3ExvTrJ+CYTMTyNBRdD8PjZZbGMvXgaTugdOIXo+IjNf3sjgng4fVatQSSfJaPsg8l/tBu3jgEqbfy4feSqB//wXZ2NmZkoQVeia+/pr3bqQvLG7uK4GRZoknda6csgZQq30hJiPZ6AlzhWhgqzkAZtPIz4A01JcZ2kwMQWsVLI8tG5caNC4tvAgm+HjFB/ahAoitGjUnb3EK8Y8wMNZu7geeXIBTr+cyZu0cYVm73VrA8F4Wuzw+qWsSU+wDsZHZ2w/jlGcnmZcx/XABh6KTWgRELh/PcS73UyA0MosAiPb7WLk0St7N8gclvwiwv+7lwyQk97XADMNjH73rNT3lGl4tXM3xeXBs7u/jdC+/T1vwIDBD0Yg977UQx+6De1AOrDiLenSzjGMHIM8sl/3IsdLnhD+vzPajRzqfE/yc8twPHWh8TuAPWX6MyuVgt/qeE/S1a1H/FBjtz1pt4jJZstzU6p4TclzK44JOb9QtDPlZF8oKdPO/U3a8fehrV/ySdQlPYHyva+wshsK++LjsMtvoe87AP8ZpfDwfl0PdKXxW2NH3hWG3Cp8TtkyXxFxrWxgwbAtcXDlmMF9z7XhyQcBXbkdn+dBV4wkbToxg6qZyCMj4rSPGMXF7OARj7CYQg5i00RuCMGdnhOHM3v0Q0GBiVJfpXo84q3cjr04O876GcRZvptzUAOZ13baDATGlWwBUNFO4omr0Axq/WbhEtdhJcADixPyeDHRswg/AnFQBJoOcUxIGAM+uEWPAk0VjNOBfsp5ia+MX1G4616+oBoapS+oglBlJOGtRHQQyOclmLKuDIK5KoisXVgocmSQzoHUivzZxDLszUghMtveBB3S9dSospGJRcNVzBVeBQyoWBacfu7gKG9SwKLT0nCRXIQMKliW0eJfHxyh/+l/5NJ9SrORagOZNJh+GHgGqBixxP8vQLbWL3U/774GHivTvixl6lUTnYtBcNerKxxHjgrlnj35Ozxx+tXV8RxJndP59SeBFkYWsn4YlzHXvpu6G9dvr3nNNWisqHdpbMFcpk8bYoQc/ByzHzQPlo2xfjJ5u+yL/GfNVGHemrzYMJl3rele/yrB3ysbYq+x20WI+VNMfW6OeriGdDW8Ooi2D5eBi0rPtGu3S/SmL0+kmb4DkgG1DvG/fLovybRrPQIOFZwMCT0MUNCXdsxAXWV8PnZD0n9ar6g6I2x+rrzJXjyetblfWxt6Eq/XqIZbJXn2GoXnUbJcd1fvKV5/q3/4ld/q9d7d31ZDftqv13XbtBBtHOJ8+re8aCf2D/gc9TKzWd4IaJtAwa7W+s9b2dhMIb22vbWfjBD4ab6HxNhzvUONtNN5Zre9cCoaDhrmr9Z1HDXPRMG+1vvOpYR4a5q/WdwE1zEfDgtX6LqSGBWhYqDy5XVvOJnAFGhdijysCBO1zgxtNjkWOxPQI5X1hkyMxMUL5XTjkSEyJUK4Xbs3dWvGu6cQymB+heGhHroVPymCyhCJFkDwIzJfwWRcLTJlQ1AiSNIFZE5o2f+3YG8uAiWmzFDcWmVEWps1S3FgkwZaRVTqtSIItTJulE8pe2/7GtkI8EtNmKUYsh5iQhbmyFA0WmXQWZshSNFgepRITZCkWLDLzLEyQpViwAkol5sdSLFgkkxYmyFYs2CRBNibIVizYgjBuY35si0NpG+WOp8fG9NgsPTamx3Y5p9uYHVtxYJNBZGN6bMWBTVYJG9NjKxJsskrYmB9bkWCTUWRjfpwtm70O5sfR/JB13sEEOYoGmww4BzPkKBpssso4xlKkeLDJiHMwRY4iwiEjzsEcOYoIhywJDubIUUQ4JJsO5shRRDgkmw7myFFEOCSbDubIVUQ4JJsu5shVRDj0Wow5ci0u21xMkat4cEgyXUyRq3hwgrUVbvwQh5JrbBg0RSSZLqbIVTy4JJkupshVPLgkmS6myFU8uCSZLqbI5XcPLqbIUzy4JO0epshTPLgk7R6myFNEuCTtHubIU0S4JO0e5sjTWzp6F4Y58hQRLlVlPWNb57FO8jBFnqYopFRihryAtY0J8niCPEyQv+Vs+5gfX5HgbamBmB5fceBRGeRjdnxFgWdRAzE5vmLAI4PIx+T4estNBpGP2fEVBZ5LGTe23YoCj4whH7PjKw48MoZ8TI+vOPAoHn3MTqA48OjtPKYnUCT4ZEEIMD+BYsEnC0KACQpsNooCzFDgcBMKMEGBYsEna0yACQr49AkwQ4Giwbcp48bRSLHgk9ERYIICRYNPlpgAMxQqGnwyPELMUKgZIsMjxAyFmiFy9Q8xQ6GiwSfjI8QMhQ4X7yFmKFQ0BFSeh5igULEQkHEUYoJCfXQlSQ8xQ2HAlYTQOL4qFgKyJITmAVbRENBnyK1xhN0K/sy2NQ6xW4td1qvf4FhFRkB5v/oJDlV0BGRAVb/BsZorMqSq3+BYTRd9cN0aJ9etJow+kG6Ns+s26HGZcXrdKmpCskhVv4Gxgt+Ai4vOg6ImpJYcYbYedIOBDG9h9h50hyFkGhoGa7qzQB+phNl10B0FbqzBmu4pMEFm9ht0VyFk9Bqs6b5C6Kxtd2NvXWOswZpuLYQuPdZgTTcXQo8cazQehG4vhHT0WmbHyOKjwWg+CItftoTRfhC6y0AnptGAELrNwFBhtCCE7jQwVBhdCKF7DQwVRh9C6HYDQ4XRihC64RDSCW80I4TdQ5vRjhC66xDSxcHoSAi7oo3OeNvs9fXwZvQlhM2fqYTRmhC6AyG2dA/TaE8Iu9p20FlvdCiEXbX46E6m0aQQdlUomWamQZ5dbeDJHYgwWhVCNyQYZxjNCqFbEkxkGu0KoZsSTGQaDQuh2xJMZDpmq9bho81oWginIo9eD42+hdDdCXInKIzGhXB6urNG60JUvQvGvwZxukXB+czgTTcpGJ8ZDQyh2xSMz4wWhnCrrKMrq9HGEFUfg56c0cgQul3BBI9r9tZd3hFGM0PolgXnCIM43bTgHGEQ51YpR9dAo6chdOeCc4TBnFdtTugiaDQ2hG5fCEEXQaO3IXQHQzAXXIz2htBNDMFcczE6HEL3MQRz2cVocgjdyyBP+8IzL4h47ObL6HMI3c4gWwPC6HQI3dAQzKUfo9shqnaHoKul0fAQfnVFi64oRtND+BV3dCoZjQ/hV9xRx2Bh9D6EX1FHR5DR/xC+06PYYE73OQR96UcYTRChex2CvvojfPN6li6ZFnU6E0YrROiGh7DoYDO6IUI3PYRFc210RITuezAo6p6Ivjj9Veal3L+tLlLf3bWPJvxY1c/u34ptc8n8xypc3f74uV4Jv/rT2VZ/uvW/e179Z/3/gV3/Wf+7OhzWfwnqv4hahdqe1n+phdRmpvqLo8397K6Pq/9TM+ruoIX3GHfQQ6+DrvbVtd7mL45T/8VtYLmspfRp19wo0On3Rac/sHjR/Wck5QCpgJd6rN4KCQTBdMItL1jfnwoEXWAxHBDcq5vrgawFZF1OtvnQ+gVmAcSFYMTh97CALAg8braf9Rsb77P6PZGIfd8H7mJNawXqjUBAMASC9oBg8yZLIB4AcS4q0MurO1kPMOXXWRM6nI4kNl0GApKbcfV1lU7EBW52PVYoQTIgEj3OQ7ssUTePJlGBkgZ4h8u25sVRQAgWIbepHaxztbwRyGqn1znHHZSlS4raJgEtXPq2WgxhWJAcLpvap81ATNkgC/2mfvWwdT6mZiEPQCqG/a7/Wr3GD8iCwAp5s/XnHzs5G8SzzVUeJZcV8qJ2gDTk/Qy+IgXMArh2Xdx5xvUnWEBCyuoLWZ06B8zC5UpRpWZff2Vv135l71IbiGU+BrS2+ttB9f1nX5rPyoBEBBNlF69K13+KLD1Vn1K7hASWJIelSatRn5zpwQMUeWwF0orAG7sv8YA8cQfUVF/fKx4T2Xx971IdiHx2M1Gpy+tP4xXNp/EulYFUdNi41Mr6QQHq2EwGX0yP9RfT0XvOO2UWiFCLi6l9/ZLKvH6bJUhvWNS2LBijnIWwoFocTehBNCBsw41BU9KsZqfotFsybvXr7k+Fuw2o1efYqZ76h3UZhK1qMjFiOSYQTN/lFsH2Q8GgOAGMNheNtVyU7r/pr/oCcYCVh9qEHZqmC1efXkljK2WDBLK58Gg/uwrkQFw5vIu6D6RBWRDRjGTzbiEQVTCQLa6SVZ/RAVULrDReHYo+V+e7r2oBBcCzHodWf6njM97ugRBio5Uos5bhm/WKc271RQxgES6q3BTVy9RAcYBhs20OZRYXQPApNBB78Bgp2KWh/boOQAwm69fWQ85XxifKIEUgEjnh4lQ9bPWnxGcYAauKx4vrHcypez4HqoBO9LjAjItcPuDDiGrBgJLGUtZsEjSGiwmEUAcXK/Url2BdhKTZXGD/J4tTDDoADgu5yVafzgFEg4n6XF2sP34EpIApn6MmyQ6HOD2gFAIuYQtF+0ob6BMYDGz9bj+rCdYLYNHl1uhjvN8n8luU4+yBNjkaOlG8NQBubZZXmzefXk4YHuHZ6q9HwBMLCJ2AS/f2+4XQTWCp6RHr2YMCvOwB7VJF3nxJEmgCbve4zOueH4UJB33GnpCbD2mBaAaz9zmScK6FqMPCmaq/mQjmBpYetqQ133gHqzIQc7hIZDapHjz6Ny1C1nQSoa2EBeLJ4rhQQqmR6AId++vVi0v4U4YbHRaAbNU9S7YOdkcRpAJQatUdR5udNd3HhNtT0bROrbYP0LROnaY/y5aXU/0kHa4QwEMWV9DgQ5uQU5BrPZKo0LvAqV7NiMclqpaW6SFO8SYahIPNhQOQVY7FkwbHL/bswi/oAaRk2wvAjGSBDht9ksRBDQbzlvN49wQaLMjA6awc6piFcPXfcilzsWMJ4GZjy8VTXW7jNDZOcNA7Pm+0eZkHgAu3WKJJhSZrhdPsXN2m/892O5s3pYNogaeRWlF7fUI01xEER0jz3UyQN8C3fnPW9frlL1aZLfQ0u0AVsizj9IB3dvCcxLoBFzIb5LrDZUzxmHw+x8ne3P7CkOBEq+WYuM6irmOBoGjqHnt+qTVdtFxs4C+HK8G18Kl9PhnigBnBrs+9O3HoeL8p3OzG9YLzEHpStIHDUUhd0VH3y4ACxKVYGeMNHTqHtFfOWOHSwA1D1eaip8zjw8FYndDZhVslyuLysiX0FLvhNcUcwI/bzHLb8CSa9pTVbCTsZozTXlVsCo7bFhzOxeqJY1hk4LGe22ScC1k070aAcQUXBp/zbydMZhn0mM+F1OW1ARgYWy6S6y/3ggoIrLWJ4HHLBXh/DJw1RMw2XrTsrn5RB5SGSw29Afm0Xp3ik0zU7uP27tPPn/8PDaVSojufAAA="; \ No newline at end of file