{"version":3,"file":"accessibility.min.js","sources":["https:\/\/e-learning.fra.europa.eu\/theme\/snap\/amd\/src\/accessibility.js"],"sourcesContent":["\/**\n * 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 .\n *\n * @package\n * @author Oscar Nadjar oscar.nadjar@openlms.net\n * @copyright Copyright (c) 2019 Open LMS (https:\/\/www.openlms.net)\n * @license http:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later\n *\/\n\n\/**\n * JS code to assign attributes and expected behavior for elements in the Dom regarding accessibility.\n *\/\ndefine(['jquery', 'core\/str', 'core\/event'],\n function($, str, Event) {\n return {\n snapAxInit: function(localJouleGrader, allyReport, blockReports, localCatalogue) {\n\n \/**\n * Module to get the strings from Snap to add the aria-label attribute to new accessibility features.\n *\/\n str.get_strings([\n {key: 'accessforumstringdis', component: 'theme_snap'},\n {key: 'accessforumstringmov', component: 'theme_snap'},\n {key: 'calendar', component: 'calendar'},\n {key: 'accessglobalsearchstring', component: 'theme_snap'},\n {key: 'viewcalendar', component: 'theme_snap'},\n {key: 'viewmyfeedback', component: 'theme_snap'},\n {key: 'viewmessaging', component: 'theme_snap'},\n {key: 'viewforumposts', component: 'theme_snap'},\n {key: 'editcoursesettings', component: 'theme_snap'},\n {key: 'gradebook', component: 'local_joulegrader'},\n {key: 'gradebook', component: 'core_grades'},\n {key: 'numparticipants', component: 'core_message'},\n {key: 'pld', component: 'theme_snap'},\n {key: 'competencies', component: 'core_competency'},\n {key: 'outcomes', component: 'core_outcome'},\n {key: 'badges', component: 'core_badges'},\n {key: 'coursereport', component: 'report_allylti'},\n {key: 'pluginname', component: 'local_catalogue'},\n {key: 'experimental', component: 'block_reports'}\n ]).done(function(stringsjs) {\n if ($(\"#page-mod-forum-discuss\")) {\n $(\"div[data-content='forum-discussion'] div.singleselect form.form-inline \" +\n \"select.custom-select.singleselect\").attr(\"aria-label\", stringsjs[0]);\n $(\"div[data-content='forum-discussion'] div.movediscussionoption \" +\n \"select.custom-select.urlselect\").attr(\"aria-label\", stringsjs[1]);\n }\n $(\"i.fa-calendar\").parent().attr(\"aria-label\", stringsjs[2]);\n $(\"input[name='TimeEventSelector[calendar]']\").attr('aria-label', stringsjs[2]);\n var searchbutton = $(\"#mr-nav .simplesearchform a.btn.btn-open\");\n $(searchbutton).attr({\n title: stringsjs[3],\n 'aria-label': stringsjs[3],\n });\n\n\n \/\/ Add needed ID's for personal menu links.\n $('#snap-pm-updates section a.snap-personal-menu-more small:contains(\"' + stringsjs[4] + '\")')\n .attr(\"id\", \"snap-pm-deadline\");\n $('#snap-pm-updates section a.snap-personal-menu-more small:contains(\"' + stringsjs[5] + '\")')\n .attr(\"id\", \"snap-pm-feedback\");\n $('#snap-pm-updates section a.snap-personal-menu-more small:contains(\"' + stringsjs[6] + '\")')\n .attr(\"id\", \"snap-pm-messages\");\n $('#snap-pm-updates section a.snap-personal-menu-more small:contains(\"' + stringsjs[7] + '\")')\n .attr(\"id\", \"snap-pm-forum-posts\");\n\n \/\/ Add needed ID's for course dashboard.\n \/\/ These ID's were added for the most used elements in the course dashboard.\n\n \/\/ There is not a lang string that contains {$a} participants with capital P, and this function helps with that.\n \/\/ Taken from https:\/\/css-tricks.com\/snippets\/jquery\/make-jquery-contains-case-insensitive\/\n $.expr[\":\"].contains = $.expr.createPseudo(function(arg) {\n return function(elem) {\n return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;\n };\n });\n var ctparticipantsnumber = stringsjs[11].split(\" \");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[8] + '\")')\n .attr(\"id\", \"ct-course-settings\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + ctparticipantsnumber[1] + '\")')\n .attr(\"id\", \"ct-participants-number\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[12] + '\")')\n .attr(\"id\", \"ct-pld\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[13] + '\")')\n .attr(\"id\", \"ct-competencies\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[14] + '\")')\n .attr(\"id\", \"ct-outcomes\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[15] + '\")')\n .attr(\"id\", \"ct-badges\");\n\n \/\/ Check if the plugins are installed to pass the strings. These parameters are being passed from\n \/\/ $initaxvars in snap\/classes\/output\/shared.php. More validations can be added if needed.\n if (localJouleGrader) {\n $('section#coursetools ul#coursetools-list a:contains(\"' + 'Open Grader' + '\")')\n .attr(\"id\", \"ct-open-grader\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[9] + '\")')\n .attr(\"id\", \"ct-course-gradebook\");\n } else {\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[10] + '\")')\n .attr(\"id\", \"ct-course-gradebook\");\n }\n if (blockReports) {\n $('section#coursetools ul#coursetools-list a:contains(\"' + 'Open Reports' + '\")')\n .attr(\"id\", \"ct-open-reports\");\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[18] + '\")')\n .attr(\"id\", \"ct-open-reports-experimental\");\n }\n if (allyReport) {\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[16] + '\")')\n .attr(\"id\", \"ct-ally\");\n }\n if (localCatalogue) {\n $('section#coursetools ul#coursetools-list a:contains(\"' + stringsjs[17] + '\")')\n .attr(\"id\", \"ct-open-catalogue\");\n }\n\n \/\/ Add ARIA attributes.\n $('div[role=\"main\"] div.sitetopic ul.section.img-text').attr('role', 'presentation');\n });\n\n $(document).ready(function() {\n \/\/ Add necessary attributes to needed DOM elements to new accessibility features.\n $(\"#page-mod-data-edit input[id*='url']\").attr(\"type\", \"url\").attr(\"autocomplete\", \"url\");\n $(\"#moodle-blocks aside#block-region-side-pre a.sr-only.sr-only-focusable\").attr(\"tabindex\", \"-1\");\n\n \/\/ Focus first invalid input after a submit is done.\n $('.mform').submit(function() {\n $('input.form-control.is-invalid:first').focus();\n });\n\n \/\/ Retrieve value from the input buttons from add\/remove users in a group inside a course.\n var addtext = $('.groupmanagementtable #buttonscell p.arrow_button input[name=\"add\"]').attr('value');\n var removetext = $(\".groupmanagementtable #buttonscell p.arrow_button input[name='remove']\").attr('value');\n\n \/\/ Snap tab panels.\n new Tabpanel(\"snap-pm-accessible-tab\");\n new Tabpanel(\"modchooser-accessible-tab\");\n\n \/\/ Wrapping for dropdown elements in the actionable elements in an activity for PLD.\n if( $(\".dropdown-item.editing_pld\").closest(\".pld-dropdown\").length == 0 ) {\n $(\".dropdown-item.editing_pld\").wrap(\"
  • <\/li>\");\n }\n $(\".dropdown-item.editing_pld\").attr(\"role\",\"button\");\n\n \/**\n * Store the references outside the event handler.\n * Window reload to change the inputs value for Add and Remove buttons when adding new\n * members to a group.\n *\/\n var $window = $(window);\n\n \/**\n * Modifies attributes depending on the window size.\n *\/\n function checkWidth() {\n var windowsize = $window.width();\n if (windowsize < 1220) {\n $(\".groupmanagementtable #buttonscell p.arrow_button input[name='add']\").attr(\"value\", \"+\");\n $(\".groupmanagementtable #buttonscell p.arrow_button input[name='remove']\").attr(\"value\", \"-\");\n } else if (windowsize > 1220) {\n $(\".groupmanagementtable #buttonscell p.arrow_button input[name='add']\").attr(\"value\", addtext);\n $(\".groupmanagementtable #buttonscell p.arrow_button input[name='remove']\").attr(\"value\", removetext);\n }\n }\n \/\/ Execute on load\n checkWidth();\n \/\/ Bind event listener\n $(window).resize(checkWidth);\n\n \/**\n * Change for the active carousel slide.\n *\/\n function carouselAriaCurrentValue() {\n var carouselindicator = $('#snap-site-carousel .carousel-indicators button');\n carouselindicator.click(function (e) {\n var element = $(e.target);\n carouselindicator.attr('aria-current', false);\n element.attr('aria-current', true);\n });\n\n \/**\n * Listener to change aria-current value dynamically.\n *\/\n var targetNode = document.getElementById('snap-carousel-container');\n\n \/\/ Options for the observer (which mutations to observe)\n var config = { attributes: true, childList: true, subtree: true };\n\n \/\/ Callback function to execute when mutations are observed\n var callback = () => {\n $('.carousel-indicators button').attr('aria-current', false);\n $('.carousel-indicators button.active').attr('aria-current', true);\n };\n\n \/\/ Create an observer instance linked to the callback function\n var observer = new MutationObserver(callback);\n\n if (targetNode) {\n \/\/ Start observing the target node for configured mutations.\n observer.observe(targetNode, config);\n }\n }\n carouselAriaCurrentValue();\n\n \/**\n * Creates a pause and resume cycles for Snap's carousel.\n *\/\n function carouselPausePlay() {\n $('#snap-site-carousel').carousel({\n interval: 6000,\n pause: \"false\"\n });\n\n $('#play-button').click(function () {\n $('#snap-site-carousel').carousel('cycle');\n });\n $('#pause-button').click(function () {\n $('#snap-site-carousel').carousel('pause');\n });\n }\n carouselPausePlay();\n });\n\n \/**\n * Add needed accessibility for tabs inside Snap.\n * This makes use of Bootstrap accessible tab panel with WAI-ARIA with the arrow keys binding codes.\n * @param {string} id\n *\/\n function Tabpanel(id) {\n this._id = id;\n this.$tpanel = $('#' + id);\n this.$tabs = this.$tpanel.find('.tab');\n this.$panels = this.$tpanel.find('.tab-pane');\n this.bindHandlers();\n this.init();\n }\n\n Tabpanel.prototype.keys = {\n left: 37,\n up: 38,\n right: 39,\n down: 40\n };\n\n Tabpanel.prototype.init = function() {\n var $tab;\n this.$panels.attr('aria-hidden', 'true');\n this.$panels.removeClass('active in');\n $tab = this.$tabs.filter('.active');\n if ($tab === undefined) {\n $tab = this.$tabs.first();\n $tab.addClass('active');\n }\n this.$tpanel\n .find('#' + $tab.find('a').attr('aria-controls'))\n .addClass('active in').attr('aria-hidden', 'false');\n };\n\n Tabpanel.prototype.switchTabs = function($curTab, $newTab) {\n var $curTabLink = $curTab.find('a'),\n $newTabLink = $newTab.find('a');\n $curTab.removeClass('active');\n $curTabLink.attr('tabindex', '-1').attr('aria-selected', 'false');\n $newTab.addClass('active');\n $newTabLink.attr('aria-selected', 'true');\n this.$tpanel\n .find('#' + $curTabLink.attr('aria-controls'))\n .removeClass('active in').attr('aria-hidden', 'true');\n this.$tpanel\n .find('#' + $newTabLink.attr('aria-controls'))\n .addClass('active in').attr('aria-hidden', 'false');\n $newTabLink.attr('tabindex', '0');\n $newTabLink.focus();\n };\n\n Tabpanel.prototype.bindHandlers = function() {\n var self = this;\n this.$tabs.keydown(function(e) {\n return self.handleTabKeyDown($(this), e);\n });\n this.$tabs.click(function(e) {\n return self.handleTabClick($(this), e);\n });\n };\n\n Tabpanel.prototype.handleTabKeyDown = function($tab, e) {\n var $newTab, tabIndex;\n switch (e.keyCode) {\n case this.keys.left:\n case this.keys.up: {\n tabIndex = this.$tabs.index($tab);\n if (tabIndex === 0) {\n $newTab = this.$tabs.last();\n } else {\n $newTab = this.$tabs.eq(tabIndex - 1);\n }\n this.switchTabs($tab, $newTab);\n e.preventDefault();\n return false;\n }\n case this.keys.right:\n case this.keys.down: {\n tabIndex = this.$tabs.index($tab);\n if (tabIndex === this.$tabs.length - 1) {\n $newTab = this.$tabs.first();\n } else {\n $newTab = this.$tabs.eq(tabIndex + 1);\n }\n this.switchTabs($tab, $newTab);\n e.preventDefault();\n return false;\n }\n }\n };\n\n Tabpanel.prototype.handleTabClick = function($tab) {\n var $oldTab = this.$tpanel.find('.tab.active');\n this.switchTabs($oldTab, $tab);\n };\n },\n\n \/**\n * Custom form error event handler to manipulate the bootstrap markup and show\n * nicely styled errors in an mform focusing the necessary elements in the form.\n * @param {string} elementid\n *\/\n enhanceform: function(elementid) {\n var element = document.getElementById(elementid);\n $(element).on(Event.Events.FORM_FIELD_VALIDATION, function(event, msg) {\n event.preventDefault();\n var parent = $(element).closest('.form-group');\n var feedback = parent.find('.form-control-feedback');\n var invalidinput = parent.find('input.form-control.is-invalid');\n\n \/\/ Sometimes (atto) we have a hidden textarea backed by a real contenteditable div.\n if (($(element).prop(\"tagName\") == 'TEXTAREA') && parent.find('[contenteditable]')) {\n element = parent.find('[contenteditable]');\n }\n if (msg !== '') {\n parent.addClass('has-danger');\n parent.data('client-validation-error', true);\n $(element).addClass('is-invalid');\n $(element).attr('aria-describedby', feedback.attr('id'));\n $(element).attr('aria-invalid', true);\n invalidinput.attr('tabindex', 0);\n feedback.html(msg);\n\n \/\/ Only display and focus when the error was not already visible.\n if (!feedback.is(':visible')) {\n feedback.show();\n feedback.focus();\n }\n } else {\n if (parent.data('client-validation-error') === true) {\n parent.removeClass('has-danger');\n parent.data('client-validation-error', false);\n $(element).removeClass('is-invalid');\n $(element).removeAttr('aria-describedby');\n $(element).attr('aria-invalid', false);\n feedback.hide();\n }\n }\n });\n }\n };\n }\n);\n"],"names":["define","$","str","Event","snapAxInit","localJouleGrader","allyReport","blockReports","localCatalogue","Tabpanel","id","_id","$tpanel","$tabs","this","find","$panels","bindHandlers","init","get_strings","key","component","done","stringsjs","attr","parent","searchbutton","title","expr","contains","createPseudo","arg","elem","text","toUpperCase","indexOf","ctparticipantsnumber","split","document","ready","submit","focus","addtext","removetext","closest","length","wrap","$window","window","checkWidth","windowsize","width","resize","carouselindicator","click","e","element","target","targetNode","getElementById","observer","MutationObserver","observe","attributes","childList","subtree","carouselAriaCurrentValue","carousel","interval","pause","prototype","keys","left","up","right","down","$tab","removeClass","undefined","filter","first","addClass","switchTabs","$curTab","$newTab","$curTabLink","$newTabLink","self","keydown","handleTabKeyDown","handleTabClick","tabIndex","keyCode","index","last","eq","preventDefault","$oldTab","enhanceform","elementid","on","Events","FORM_FIELD_VALIDATION","event","msg","feedback","invalidinput","prop","data","html","is","show","removeAttr","hide"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyBAA,kCAAO,CAAC,SAAU,WAAY,eAC1B,SAASC,EAAGC,IAAKC,aACN,CACHC,WAAY,SAASC,iBAAkBC,WAAYC,aAAcC,yBAqNpDC,SAASC,SACTC,IAAMD,QACNE,QAAUX,EAAE,IAAMS,SAClBG,MAAQC,KAAKF,QAAQG,KAAK,aAC1BC,QAAUF,KAAKF,QAAQG,KAAK,kBAC5BE,oBACAC,OAtNThB,IAAIiB,YAAY,CACZ,CAACC,IAAK,uBAAwBC,UAAW,cACzC,CAACD,IAAK,uBAAwBC,UAAW,cACzC,CAACD,IAAK,WAAYC,UAAW,YAC7B,CAACD,IAAK,2BAA4BC,UAAW,cAC7C,CAACD,IAAK,eAAgBC,UAAW,cACjC,CAACD,IAAK,iBAAkBC,UAAW,cACnC,CAACD,IAAK,gBAAiBC,UAAW,cAClC,CAACD,IAAK,iBAAkBC,UAAW,cACnC,CAACD,IAAK,qBAAsBC,UAAW,cACvC,CAACD,IAAK,YAAaC,UAAW,qBAC9B,CAACD,IAAK,YAAaC,UAAW,eAC9B,CAACD,IAAK,kBAAmBC,UAAW,gBACpC,CAACD,IAAK,MAAOC,UAAW,cACxB,CAACD,IAAK,eAAgBC,UAAW,mBACjC,CAACD,IAAK,WAAYC,UAAW,gBAC7B,CAACD,IAAK,SAAUC,UAAW,eAC3B,CAACD,IAAK,eAAgBC,UAAW,kBACjC,CAACD,IAAK,aAAcC,UAAW,mBAC\/B,CAACD,IAAK,eAAgBC,UAAW,mBAClCC,MAAK,SAASC,WACTtB,EAAE,6BACFA,EAAE,4GACuCuB,KAAK,aAAcD,UAAU,IACtEtB,EAAE,gGACoCuB,KAAK,aAAcD,UAAU,KAEvEtB,EAAE,iBAAiBwB,SAASD,KAAK,aAAcD,UAAU,IACzDtB,EAAE,6CAA6CuB,KAAK,aAAcD,UAAU,QACxEG,aAAezB,EAAE,4CACrBA,EAAEyB,cAAcF,KAAK,CACjBG,MAAOJ,UAAU,gBACHA,UAAU,KAK5BtB,EAAE,sEAAwEsB,UAAU,GAAK,MACpFC,KAAK,KAAM,oBAChBvB,EAAE,sEAAwEsB,UAAU,GAAK,MACpFC,KAAK,KAAM,oBAChBvB,EAAE,sEAAwEsB,UAAU,GAAK,MACpFC,KAAK,KAAM,oBAChBvB,EAAE,sEAAwEsB,UAAU,GAAK,MACpFC,KAAK,KAAM,uBAOhBvB,EAAE2B,KAAK,KAAKC,SAAW5B,EAAE2B,KAAKE,cAAa,SAASC,YACzC,SAASC,aACL\/B,EAAE+B,MAAMC,OAAOC,cAAcC,QAAQJ,IAAIG,gBAAkB,UAGtEE,qBAAuBb,UAAU,IAAIc,MAAM,KAC\/CpC,EAAE,uDAAyDsB,UAAU,GAAK,MACrEC,KAAK,KAAM,sBAChBvB,EAAE,uDAAyDmC,qBAAqB,GAAK,MAChFZ,KAAK,KAAM,0BAChBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,UAChBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,mBAChBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,eAChBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,aAIZnB,kBACAJ,EAAE,qEACGuB,KAAK,KAAM,kBAChBvB,EAAE,uDAAyDsB,UAAU,GAAK,MACrEC,KAAK,KAAM,wBAEhBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,uBAEhBjB,eACAN,EAAE,sEACGuB,KAAK,KAAM,mBAChBvB,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,iCAEhBlB,YACAL,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,WAEhBhB,gBACAP,EAAE,uDAAyDsB,UAAU,IAAM,MACtEC,KAAK,KAAM,qBAIpBvB,EAAE,sDAAsDuB,KAAK,OAAQ,mBAGzEvB,EAAEqC,UAAUC,OAAM,WAEdtC,EAAE,wCAAwCuB,KAAK,OAAQ,OAAOA,KAAK,eAAgB,OACnFvB,EAAE,0EAA0EuB,KAAK,WAAY,MAG7FvB,EAAE,UAAUuC,QAAO,WACfvC,EAAE,uCAAuCwC,eAIzCC,QAAUzC,EAAE,uEAAuEuB,KAAK,SACxFmB,WAAa1C,EAAE,0EAA0EuB,KAAK,aAG9Ff,SAAS,8BACTA,SAAS,6BAG0D,GAAnER,EAAE,8BAA8B2C,QAAQ,iBAAiBC,QACzD5C,EAAE,8BAA8B6C,KAAK,kCAEzC7C,EAAE,8BAA8BuB,KAAK,OAAO,cAOxCuB,QAAU9C,EAAE+C,iBAKPC,iBACDC,WAAaH,QAAQI,QACrBD,WAAa,MACbjD,EAAE,uEAAuEuB,KAAK,QAAS,KACvFvB,EAAE,0EAA0EuB,KAAK,QAAS,MACnF0B,WAAa,OACpBjD,EAAE,uEAAuEuB,KAAK,QAASkB,SACvFzC,EAAE,0EAA0EuB,KAAK,QAASmB,aAIlGM,aAEAhD,EAAE+C,QAAQI,OAAOH,2BAMTI,kBAAoBpD,EAAE,mDAC1BoD,kBAAkBC,OAAM,SAAUC,OAC1BC,QAAUvD,EAAEsD,EAAEE,QAClBJ,kBAAkB7B,KAAK,gBAAgB,GACvCgC,QAAQhC,KAAK,gBAAgB,UAM7BkC,WAAapB,SAASqB,eAAe,2BAYrCC,SAAW,IAAIC,kBANJ,KACX5D,EAAE,+BAA+BuB,KAAK,gBAAgB,GACtDvB,EAAE,sCAAsCuB,KAAK,gBAAgB,MAM7DkC,YAEAE,SAASE,QAAQJ,WAbR,CAAEK,YAAY,EAAMC,WAAW,EAAMC,SAAS,IAgB\/DC,GAMIjE,EAAE,uBAAuBkE,SAAS,CAC9BC,SAAU,IACVC,MAAO,UAGXpE,EAAE,gBAAgBqD,OAAM,WACpBrD,EAAE,uBAAuBkE,SAAS,YAEtClE,EAAE,iBAAiBqD,OAAM,WACrBrD,EAAE,uBAAuBkE,SAAS,eAoB9C1D,SAAS6D,UAAUC,KAAO,CACtBC,KAAM,GACNC,GAAI,GACJC,MAAO,GACPC,KAAM,IAGVlE,SAAS6D,UAAUpD,KAAO,eAClB0D,UACC5D,QAAQQ,KAAK,cAAe,aAC5BR,QAAQ6D,YAAY,kBAEZC,KADbF,KAAO9D,KAAKD,MAAMkE,OAAO,cAErBH,KAAO9D,KAAKD,MAAMmE,SACbC,SAAS,eAEbrE,QACAG,KAAK,IAAM6D,KAAK7D,KAAK,KAAKS,KAAK,kBAC\/ByD,SAAS,aAAazD,KAAK,cAAe,UAGnDf,SAAS6D,UAAUY,WAAa,SAASC,QAASC,aAC1CC,YAAcF,QAAQpE,KAAK,KAC3BuE,YAAcF,QAAQrE,KAAK,KAC\/BoE,QAAQN,YAAY,UACpBQ,YAAY7D,KAAK,WAAY,MAAMA,KAAK,gBAAiB,SACzD4D,QAAQH,SAAS,UACjBK,YAAY9D,KAAK,gBAAiB,aAC7BZ,QACAG,KAAK,IAAMsE,YAAY7D,KAAK,kBAC5BqD,YAAY,aAAarD,KAAK,cAAe,aAC7CZ,QACAG,KAAK,IAAMuE,YAAY9D,KAAK,kBAC5ByD,SAAS,aAAazD,KAAK,cAAe,SAC\/C8D,YAAY9D,KAAK,WAAY,KAC7B8D,YAAY7C,SAGhBhC,SAAS6D,UAAUrD,aAAe,eAC1BsE,KAAOzE,UACND,MAAM2E,SAAQ,SAASjC,UACjBgC,KAAKE,iBAAiBxF,EAAEa,MAAOyC,WAErC1C,MAAMyC,OAAM,SAASC,UACfgC,KAAKG,eAAezF,EAAEa,MAAOyC,OAI5C9C,SAAS6D,UAAUmB,iBAAmB,SAASb,KAAMrB,OAC7C6B,QAASO,gBACLpC,EAAEqC,cACD9E,KAAKyD,KAAKC,UACV1D,KAAKyD,KAAKE,UAGPW,QADa,KADjBO,SAAW7E,KAAKD,MAAMgF,MAAMjB,OAEd9D,KAAKD,MAAMiF,OAEXhF,KAAKD,MAAMkF,GAAGJ,SAAW,QAElCT,WAAWN,KAAMQ,SACtB7B,EAAEyC,kBACK,OAENlF,KAAKyD,KAAKG,WACV5D,KAAKyD,KAAKI,YAGPS,SAFJO,SAAW7E,KAAKD,MAAMgF,MAAMjB,SACX9D,KAAKD,MAAMgC,OAAS,EACvB\/B,KAAKD,MAAMmE,QAEXlE,KAAKD,MAAMkF,GAAGJ,SAAW,QAElCT,WAAWN,KAAMQ,SACtB7B,EAAEyC,kBACK,IAKnBvF,SAAS6D,UAAUoB,eAAiB,SAASd,UACrCqB,QAAUnF,KAAKF,QAAQG,KAAK,oBAC3BmE,WAAWe,QAASrB,QASjCsB,YAAa,SAASC,eACd3C,QAAUlB,SAASqB,eAAewC,WACtClG,EAAEuD,SAAS4C,GAAGjG,MAAMkG,OAAOC,uBAAuB,SAASC,MAAOC,KAC9DD,MAAMP,qBACFvE,OAASxB,EAAEuD,SAASZ,QAAQ,eAC5B6D,SAAWhF,OAAOV,KAAK,0BACvB2F,aAAejF,OAAOV,KAAK,iCAGI,YAA9Bd,EAAEuD,SAASmD,KAAK,YAA6BlF,OAAOV,KAAK,uBAC1DyC,QAAU\/B,OAAOV,KAAK,sBAEd,KAARyF,KACA\/E,OAAOwD,SAAS,cAChBxD,OAAOmF,KAAK,2BAA2B,GACvC3G,EAAEuD,SAASyB,SAAS,cACpBhF,EAAEuD,SAAShC,KAAK,mBAAoBiF,SAASjF,KAAK,OAClDvB,EAAEuD,SAAShC,KAAK,gBAAgB,GAChCkF,aAAalF,KAAK,WAAY,GAC9BiF,SAASI,KAAKL,KAGTC,SAASK,GAAG,cACbL,SAASM,OACTN,SAAShE,WAGkC,IAA3ChB,OAAOmF,KAAK,6BACZnF,OAAOoD,YAAY,cACnBpD,OAAOmF,KAAK,2BAA2B,GACvC3G,EAAEuD,SAASqB,YAAY,cACvB5E,EAAEuD,SAASwD,WAAW,oBACtB\/G,EAAEuD,SAAShC,KAAK,gBAAgB,GAChCiF,SAASQ"}