1 |
{"version":3,"file":"message_drawer_lazy_load_list.min.js","sources":["../src/message_drawer_lazy_load_list.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Lazy loaded list of items.\n *\n * @module core_message/message_drawer_lazy_load_list\n * @copyright 2018 Ryan Wyllie <ryan@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events'\n],\nfunction(\n $,\n CustomEvents\n) {\n\n var SELECTORS = {\n ROOT: '[data-region=\"lazy-load-list\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n EMPTY_MESSAGE: '[data-region=\"empty-message-container\"]',\n PLACEHOLDER: '[data-region=\"placeholder-container\"]'\n };\n\n /**\n * Flag element as loading.\n *\n * @param {Object} root The section container element.\n */\n var startLoading = function(root) {\n root.attr('data-loading', true);\n };\n\n /**\n * Flag element as not loading.\n *\n * @param {Object} root The section container element.\n */\n var stopLoading = function(root) {\n root.attr('data-loading', false);\n };\n\n /**\n * Check if the element is loading.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var isLoading = function(root) {\n return root.attr('data-loading') === 'true';\n };\n\n /**\n * Get user id\n *\n * @param {Object} root The section container element.\n * @return {Number} Logged in user id.\n */\n var getUserId = function(root) {\n return root.attr('data-user-id');\n };\n\n /**\n * Get the section content container element.\n *\n * @param {Object} root The section container element.\n * @return {Object} The section content container element.\n */\n var getContentContainer = function(root) {\n return root.find(SELECTORS.CONTENT_CONTAINER);\n };\n\n /**\n * Get the root element.\n *\n * @param {Object} containerElement The container element to search in.\n * @return {Object} The list root element.\n */\n var getRoot = function(containerElement) {\n return containerElement.find(SELECTORS.ROOT);\n };\n\n /**\n * Show the loading icon.\n *\n * @param {Object} root The section container element.\n */\n var showLoadingIcon = function(root) {\n root.find(SELECTORS.LOADING_ICON_CONTAINER).removeClass('hidden');\n };\n\n /**\n * Hide the loading icon.\n *\n * @param {Object} root The section container element.\n */\n var hideLoadingIcon = function(root) {\n root.find(SELECTORS.LOADING_ICON_CONTAINER).addClass('hidden');\n };\n\n /**\n * Show the empty message.\n *\n * @param {Object} root The section container element.\n */\n var showEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Hide the empty message.\n *\n * @param {Object} root The section container element.\n */\n var hideEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Show the placeholder element.\n *\n * @param {Object} root The section container element.\n */\n var showPlaceholder = function(root) {\n root.find(SELECTORS.PLACEHOLDER).removeClass('hidden');\n };\n\n /**\n * Hide the placeholder element.\n *\n * @param {Object} root The section container element.\n */\n var hidePlaceholder = function(root) {\n root.find(SELECTORS.PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Show the section content container.\n *\n * @param {Object} root The section container element.\n */\n var showContent = function(root) {\n getContentContainer(root).removeClass('hidden');\n };\n\n /**\n * Hide the section content container.\n *\n * @param {Object} root The section container element.\n */\n var hideContent = function(root) {\n getContentContainer(root).addClass('hidden');\n };\n\n /**\n * If the section has loaded all content.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var hasLoadedAll = function(root) {\n return root.attr('data-loaded-all') == 'true';\n };\n\n /**\n * If the section has loaded all content.\n *\n * @param {Object} root The section container element.\n * @param {Bool} value If all items have been loaded.\n */\n var setLoadedAll = function(root, value) {\n root.attr('data-loaded-all', value);\n };\n\n /**\n * If the section can load more items.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var canLoadMore = function(root) {\n return !hasLoadedAll(root) && !isLoading(root);\n };\n\n /**\n * Load all items in this container from callback and render them.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n * @return {Object} jQuery promise\n */\n var loadAndRender = function(root, loadCallback, renderCallback) {\n var userId = getUserId(root);\n startLoading(root);\n\n return loadCallback(root, userId)\n .then(function(items) {\n if (items.length > 0) {\n var contentContainer = getContentContainer(root);\n return renderCallback(contentContainer, items, userId)\n .then(function() {\n return items;\n });\n } else {\n return items;\n }\n })\n .then(function(items) {\n stopLoading(root);\n root.attr('data-seen', true);\n\n if (!items.length) {\n setLoadedAll(root, true);\n }\n\n return items;\n })\n .catch(function() {\n stopLoading(root);\n root.attr('data-seen', true);\n return;\n });\n };\n\n /**\n * First load of this section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n * @return {Object} promise\n */\n var initialLoadAndRender = function(root, loadCallback, renderCallback) {\n getContentContainer(root).empty();\n showPlaceholder(root);\n hideContent(root);\n return loadAndRender(root, loadCallback, renderCallback)\n .then(function(items) {\n hidePlaceholder(root);\n\n if (!items.length) {\n showEmptyMessage(root);\n } else {\n showContent(root);\n }\n\n return;\n })\n .catch(function() {\n hidePlaceholder(root);\n showContent(root);\n return;\n });\n };\n\n /**\n * Listen to, and handle events in this section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n */\n var registerEventListeners = function(root, loadCallback, renderCallback) {\n CustomEvents.define(root, [\n CustomEvents.events.scrollBottom\n ]);\n\n root.on(CustomEvents.events.scrollBottom, function() {\n if (canLoadMore(root)) {\n showLoadingIcon(root);\n loadAndRender(root, loadCallback, renderCallback)\n .then(function() {\n return hideLoadingIcon(root);\n })\n .catch(function() {\n return hideLoadingIcon(root);\n });\n }\n });\n };\n\n /**\n * Setup the section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n */\n var show = function(root, loadCallback, renderCallback) {\n root = $(root);\n\n if (!root.attr('data-init')) {\n registerEventListeners(root, loadCallback, renderCallback);\n initialLoadAndRender(root, loadCallback, renderCallback);\n root.attr('data-init', true);\n }\n };\n\n return {\n show: show,\n getContentContainer: getContentContainer,\n getRoot: getRoot,\n setLoadedAll: setLoadedAll,\n showEmptyMessage: showEmptyMessage,\n hideEmptyMessage: hideEmptyMessage,\n showContent: showContent,\n hideContent: hideContent\n };\n});\n"],"names":["define","$","CustomEvents","SELECTORS","stopLoading","root","attr","getContentContainer","find","hideLoadingIcon","addClass","showEmptyMessage","removeClass","hidePlaceholder","showContent","hideContent","setLoadedAll","value","loadAndRender","loadCallback","renderCallback","userId","getUserId","startLoading","then","items","length","contentContainer","catch","initialLoadAndRender","empty","showPlaceholder","registerEventListeners","events","scrollBottom","on","hasLoadedAll","isLoading","canLoadMore","showLoadingIcon","show","getRoot","containerElement","hideEmptyMessage"],"mappings":";;;;;;;AAsBAA,oDACA,CACI,SACA,mCAEJ,SACIC,EACAC,kBAGIC,eACM,iCADNA,iCAEwB,yCAFxBA,4BAGmB,oCAHnBA,wBAIe,0CAJfA,sBAKa,wCAiBbC,YAAc,SAASC,MACvBA,KAAKC,KAAK,gBAAgB,IA6B1BC,oBAAsB,SAASF,aACxBA,KAAKG,KAAKL,8BA2BjBM,gBAAkB,SAASJ,MAC3BA,KAAKG,KAAKL,kCAAkCO,SAAS,WAQrDC,iBAAmB,SAASN,MAC5BA,KAAKG,KAAKL,yBAAyBS,YAAY,WA0B/CC,gBAAkB,SAASR,MAC3BA,KAAKG,KAAKL,uBAAuBO,SAAS,WAQ1CI,YAAc,SAAST,MACvBE,oBAAoBF,MAAMO,YAAY,WAQtCG,YAAc,SAASV,MACvBE,oBAAoBF,MAAMK,SAAS,WAmBnCM,aAAe,SAASX,KAAMY,OAC9BZ,KAAKC,KAAK,kBAAmBW,QAqB7BC,cAAgB,SAASb,KAAMc,aAAcC,oBACzCC,OAvIQ,SAAShB,aACdA,KAAKC,KAAK,gBAsIJgB,CAAUjB,aApKR,SAASA,MACxBA,KAAKC,KAAK,gBAAgB,GAoK1BiB,CAAalB,MAENc,aAAad,KAAMgB,QACrBG,MAAK,SAASC,UACPA,MAAMC,OAAS,EAAG,KACdC,iBAAmBpB,oBAAoBF,aACpCe,eAAeO,iBAAkBF,MAAOJ,QAC1CG,MAAK,kBACKC,gBAGRA,SAGdD,MAAK,SAASC,cACXrB,YAAYC,MACZA,KAAKC,KAAK,aAAa,GAElBmB,MAAMC,QACPV,aAAaX,MAAM,GAGhBoB,SAEVG,OAAM,WACHxB,YAAYC,MACZA,KAAKC,KAAK,aAAa,OAa/BuB,qBAAuB,SAASxB,KAAMc,aAAcC,uBACpDb,oBAAoBF,MAAMyB,QA/GR,SAASzB,MAC3BA,KAAKG,KAAKL,uBAAuBS,YAAY,UA+G7CmB,CAAgB1B,MAChBU,YAAYV,MACLa,cAAcb,KAAMc,aAAcC,gBACpCI,MAAK,SAASC,OACXZ,gBAAgBR,MAEXoB,MAAMC,OAGPZ,YAAYT,MAFZM,iBAAiBN,SAOxBuB,OAAM,WACHf,gBAAgBR,MAChBS,YAAYT,UAYpB2B,uBAAyB,SAAS3B,KAAMc,aAAcC,gBACtDlB,aAAaF,OAAOK,KAAM,CACtBH,aAAa+B,OAAOC,eAGxB7B,KAAK8B,GAAGjC,aAAa+B,OAAOC,cAAc,YAxF5B,SAAS7B,aApBR,SAASA,YACe,QAAhCA,KAAKC,KAAK,mBAoBT8B,CAAa/B,QArIT,SAASA,YACgB,SAA9BA,KAAKC,KAAK,gBAoIc+B,CAAUhC,OAwFjCiC,CAAYjC,SAtLF,SAASA,MAC3BA,KAAKG,KAAKL,kCAAkCS,YAAY,UAsLhD2B,CAAgBlC,MAChBa,cAAcb,KAAMc,aAAcC,gBAC7BI,MAAK,kBACKf,gBAAgBJ,SAE1BuB,OAAM,kBACInB,gBAAgBJ,oBAuBpC,CACHmC,KAXO,SAASnC,KAAMc,aAAcC,iBACpCf,KAAOJ,EAAEI,OAECC,KAAK,eACX0B,uBAAuB3B,KAAMc,aAAcC,gBAC3CS,qBAAqBxB,KAAMc,aAAcC,gBACzCf,KAAKC,KAAK,aAAa,KAM3BC,oBAAqBA,oBACrBkC,QAhOU,SAASC,yBACZA,iBAAiBlC,KAAKL,iBAgO7Ba,aAAcA,aACdL,iBAAkBA,iBAClBgC,iBA/LmB,SAAStC,MAC5BA,KAAKG,KAAKL,yBAAyBO,SAAS,WA+L5CI,YAAaA,YACbC,YAAaA"}
|
- |
|
2 |
|
1 |
{"version":3,"file":"message_drawer_lazy_load_list.min.js","sources":["../src/message_drawer_lazy_load_list.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Lazy loaded list of items.\n *\n * @module core_message/message_drawer_lazy_load_list\n * @copyright 2018 Ryan Wyllie <ryan@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'core/pending',\n],\nfunction(\n $,\n CustomEvents,\n PendingPromise,\n) {\n\n var SELECTORS = {\n ROOT: '[data-region=\"lazy-load-list\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n EMPTY_MESSAGE: '[data-region=\"empty-message-container\"]',\n PLACEHOLDER: '[data-region=\"placeholder-container\"]'\n };\n\n /**\n * Flag element as loading.\n *\n * @param {Object} root The section container element.\n */\n var startLoading = function(root) {\n root.attr('data-loading', true);\n };\n\n /**\n * Flag element as not loading.\n *\n * @param {Object} root The section container element.\n */\n var stopLoading = function(root) {\n root.attr('data-loading', false);\n };\n\n /**\n * Check if the element is loading.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var isLoading = function(root) {\n return root.attr('data-loading') === 'true';\n };\n\n /**\n * Get user id\n *\n * @param {Object} root The section container element.\n * @return {Number} Logged in user id.\n */\n var getUserId = function(root) {\n return root.attr('data-user-id');\n };\n\n /**\n * Get the section content container element.\n *\n * @param {Object} root The section container element.\n * @return {Object} The section content container element.\n */\n var getContentContainer = function(root) {\n return root.find(SELECTORS.CONTENT_CONTAINER);\n };\n\n /**\n * Get the root element.\n *\n * @param {Object} containerElement The container element to search in.\n * @return {Object} The list root element.\n */\n var getRoot = function(containerElement) {\n return containerElement.find(SELECTORS.ROOT);\n };\n\n /**\n * Show the loading icon.\n *\n * @param {Object} root The section container element.\n */\n var showLoadingIcon = function(root) {\n root.find(SELECTORS.LOADING_ICON_CONTAINER).removeClass('hidden');\n };\n\n /**\n * Hide the loading icon.\n *\n * @param {Object} root The section container element.\n */\n var hideLoadingIcon = function(root) {\n root.find(SELECTORS.LOADING_ICON_CONTAINER).addClass('hidden');\n };\n\n /**\n * Show the empty message.\n *\n * @param {Object} root The section container element.\n */\n var showEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Hide the empty message.\n *\n * @param {Object} root The section container element.\n */\n var hideEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Show the placeholder element.\n *\n * @param {Object} root The section container element.\n */\n var showPlaceholder = function(root) {\n root.find(SELECTORS.PLACEHOLDER).removeClass('hidden');\n };\n\n /**\n * Hide the placeholder element.\n *\n * @param {Object} root The section container element.\n */\n var hidePlaceholder = function(root) {\n root.find(SELECTORS.PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Show the section content container.\n *\n * @param {Object} root The section container element.\n */\n var showContent = function(root) {\n getContentContainer(root).removeClass('hidden');\n };\n\n /**\n * Hide the section content container.\n *\n * @param {Object} root The section container element.\n */\n var hideContent = function(root) {\n getContentContainer(root).addClass('hidden');\n };\n\n /**\n * If the section has loaded all content.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var hasLoadedAll = function(root) {\n return root.attr('data-loaded-all') == 'true';\n };\n\n /**\n * If the section has loaded all content.\n *\n * @param {Object} root The section container element.\n * @param {Bool} value If all items have been loaded.\n */\n var setLoadedAll = function(root, value) {\n root.attr('data-loaded-all', value);\n };\n\n /**\n * If the section can load more items.\n *\n * @param {Object} root The section container element.\n * @return {Bool}\n */\n var canLoadMore = function(root) {\n return !hasLoadedAll(root) && !isLoading(root);\n };\n\n /**\n * Load all items in this container from callback and render them.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n * @return {Object} jQuery promise\n */\n var loadAndRender = function(root, loadCallback, renderCallback) {\n var userId = getUserId(root);\n startLoading(root);\n\n return loadCallback(root, userId)\n .then(function(items) {\n if (items.length > 0) {\n var contentContainer = getContentContainer(root);\n return renderCallback(contentContainer, items, userId)\n .then(function() {\n return items;\n });\n } else {\n return items;\n }\n })\n .then(function(items) {\n stopLoading(root);\n root.attr('data-seen', true);\n\n if (!items.length) {\n setLoadedAll(root, true);\n }\n\n return items;\n })\n .catch(function() {\n stopLoading(root);\n root.attr('data-seen', true);\n return;\n });\n };\n\n /**\n * First load of this section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n * @return {Object} promise\n */\n var initialLoadAndRender = function(root, loadCallback, renderCallback) {\n const pendingPromise = new PendingPromise('initialLoadAndRender');\n getContentContainer(root).empty();\n showPlaceholder(root);\n hideContent(root);\n return loadAndRender(root, loadCallback, renderCallback)\n .then(function(items) {\n hidePlaceholder(root);\n\n if (!items.length) {\n showEmptyMessage(root);\n } else {\n showContent(root);\n }\n\n return;\n })\n .catch(function() {\n hidePlaceholder(root);\n showContent(root);\n return;\n })\n .then(() => {\n pendingPromise.resolve();\n return;\n });\n };\n\n /**\n * Listen to, and handle events in this section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n */\n var registerEventListeners = function(root, loadCallback, renderCallback) {\n CustomEvents.define(root, [\n CustomEvents.events.scrollBottom\n ]);\n\n root.on(CustomEvents.events.scrollBottom, function() {\n if (canLoadMore(root)) {\n showLoadingIcon(root);\n loadAndRender(root, loadCallback, renderCallback)\n .then(function() {\n return hideLoadingIcon(root);\n })\n .catch(function() {\n return hideLoadingIcon(root);\n });\n }\n });\n };\n\n /**\n * Setup the section.\n *\n * @param {Object} root The section container element.\n * @param {Function} loadCallback The callback to load items.\n * @param {Function} renderCallback The callback to render the results.\n */\n var show = function(root, loadCallback, renderCallback) {\n root = $(root);\n\n if (!root.attr('data-init')) {\n registerEventListeners(root, loadCallback, renderCallback);\n initialLoadAndRender(root, loadCallback, renderCallback);\n root.attr('data-init', true);\n }\n };\n\n return {\n show: show,\n getContentContainer: getContentContainer,\n getRoot: getRoot,\n setLoadedAll: setLoadedAll,\n showEmptyMessage: showEmptyMessage,\n hideEmptyMessage: hideEmptyMessage,\n showContent: showContent,\n hideContent: hideContent\n };\n});\n"],"names":["define","$","CustomEvents","PendingPromise","SELECTORS","stopLoading","root","attr","getContentContainer","find","hideLoadingIcon","addClass","showEmptyMessage","removeClass","hidePlaceholder","showContent","hideContent","setLoadedAll","value","loadAndRender","loadCallback","renderCallback","userId","getUserId","startLoading","then","items","length","contentContainer","catch","initialLoadAndRender","pendingPromise","empty","showPlaceholder","resolve","registerEventListeners","events","scrollBottom","on","hasLoadedAll","isLoading","canLoadMore","showLoadingIcon","show","getRoot","containerElement","hideEmptyMessage"],"mappings":";;;;;;;AAsBAA,oDACA,CACI,SACA,iCACA,iBAEJ,SACIC,EACAC,aACAC,oBAGIC,eACM,iCADNA,iCAEwB,yCAFxBA,4BAGmB,oCAHnBA,wBAIe,0CAJfA,sBAKa,wCAiBbC,YAAc,SAASC,MACvBA,KAAKC,KAAK,gBAAgB,IA6B1BC,oBAAsB,SAASF,aACxBA,KAAKG,KAAKL,8BA2BjBM,gBAAkB,SAASJ,MAC3BA,KAAKG,KAAKL,kCAAkCO,SAAS,WAQrDC,iBAAmB,SAASN,MAC5BA,KAAKG,KAAKL,yBAAyBS,YAAY,WA0B/CC,gBAAkB,SAASR,MAC3BA,KAAKG,KAAKL,uBAAuBO,SAAS,WAQ1CI,YAAc,SAAST,MACvBE,oBAAoBF,MAAMO,YAAY,WAQtCG,YAAc,SAASV,MACvBE,oBAAoBF,MAAMK,SAAS,WAmBnCM,aAAe,SAASX,KAAMY,OAC9BZ,KAAKC,KAAK,kBAAmBW,QAqB7BC,cAAgB,SAASb,KAAMc,aAAcC,oBACzCC,OAvIQ,SAAShB,aACdA,KAAKC,KAAK,gBAsIJgB,CAAUjB,aApKR,SAASA,MACxBA,KAAKC,KAAK,gBAAgB,GAoK1BiB,CAAalB,MAENc,aAAad,KAAMgB,QACrBG,MAAK,SAASC,UACPA,MAAMC,OAAS,EAAG,KACdC,iBAAmBpB,oBAAoBF,aACpCe,eAAeO,iBAAkBF,MAAOJ,QAC1CG,MAAK,kBACKC,gBAGRA,SAGdD,MAAK,SAASC,cACXrB,YAAYC,MACZA,KAAKC,KAAK,aAAa,GAElBmB,MAAMC,QACPV,aAAaX,MAAM,GAGhBoB,SAEVG,OAAM,WACHxB,YAAYC,MACZA,KAAKC,KAAK,aAAa,OAa/BuB,qBAAuB,SAASxB,KAAMc,aAAcC,sBAC9CU,eAAiB,IAAI5B,eAAe,+BAC1CK,oBAAoBF,MAAM0B,QAhHR,SAAS1B,MAC3BA,KAAKG,KAAKL,uBAAuBS,YAAY,UAgH7CoB,CAAgB3B,MAChBU,YAAYV,MACLa,cAAcb,KAAMc,aAAcC,gBACpCI,MAAK,SAASC,OACXZ,gBAAgBR,MAEXoB,MAAMC,OAGPZ,YAAYT,MAFZM,iBAAiBN,SAOxBuB,OAAM,WACHf,gBAAgBR,MAChBS,YAAYT,SAGfmB,MAAK,KACFM,eAAeG,cAYvBC,uBAAyB,SAAS7B,KAAMc,aAAcC,gBACtDnB,aAAaF,OAAOM,KAAM,CACtBJ,aAAakC,OAAOC,eAGxB/B,KAAKgC,GAAGpC,aAAakC,OAAOC,cAAc,YA7F5B,SAAS/B,aApBR,SAASA,YACe,QAAhCA,KAAKC,KAAK,mBAoBTgC,CAAajC,QArIT,SAASA,YACgB,SAA9BA,KAAKC,KAAK,gBAoIciC,CAAUlC,OA6FjCmC,CAAYnC,SA3LF,SAASA,MAC3BA,KAAKG,KAAKL,kCAAkCS,YAAY,UA2LhD6B,CAAgBpC,MAChBa,cAAcb,KAAMc,aAAcC,gBAC7BI,MAAK,kBACKf,gBAAgBJ,SAE1BuB,OAAM,kBACInB,gBAAgBJ,oBAuBpC,CACHqC,KAXO,SAASrC,KAAMc,aAAcC,iBACpCf,KAAOL,EAAEK,OAECC,KAAK,eACX4B,uBAAuB7B,KAAMc,aAAcC,gBAC3CS,qBAAqBxB,KAAMc,aAAcC,gBACzCf,KAAKC,KAAK,aAAa,KAM3BC,oBAAqBA,oBACrBoC,QArOU,SAASC,yBACZA,iBAAiBpC,KAAKL,iBAqO7Ba,aAAcA,aACdL,iBAAkBA,iBAClBkC,iBApMmB,SAASxC,MAC5BA,KAAKG,KAAKL,yBAAyBO,SAAS,WAoM5CI,YAAaA,YACbC,YAAaA"}
|