{"version":3,"sources":["modernizr.js","foundation.js","select2.js","select2_locale_fr.js","jquery.tablesorter.js","map.js","tablesorter-helpers.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACr7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACp7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"all.js","sourcesContent":["/*!\n * Modernizr v2.8.3\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\nwindow.Modernizr=function(a,b,c){function d(a){t.cssText=a}function e(a,b){return d(x.join(a+\";\")+(b||\"\"))}function f(a,b){return typeof a===b}function g(a,b){return!!~(\"\"+a).indexOf(b)}function h(a,b){for(var d in a){var e=a[d];if(!g(e,\"-\")&&t[e]!==c)return\"pfx\"==b?e:!0}return!1}function i(a,b,d){for(var e in a){var g=b[a[e]];if(g!==c)return d===!1?a[e]:f(g,\"function\")?g.bind(d||b):g}return!1}function j(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+\" \"+z.join(d+\" \")+d).split(\" \");return f(b,\"string\")||f(b,\"undefined\")?h(e,b):(e=(a+\" \"+A.join(d+\" \")+d).split(\" \"),i(e,b,c))}function k(){o.input=function(c){for(var d=0,e=c.length;e>d;d++)E[c[d]]=!!(c[d]in u);return E.list&&(E.list=!(!b.createElement(\"datalist\")||!a.HTMLDataListElement)),E}(\"autocomplete autofocus list placeholder max min multiple pattern required step\".split(\" \")),o.inputtypes=function(a){for(var d,e,f,g=0,h=a.length;h>g;g++)u.setAttribute(\"type\",e=a[g]),d=\"text\"!==u.type,d&&(u.value=v,u.style.cssText=\"position:absolute;visibility:hidden;\",/^range$/.test(e)&&u.style.WebkitAppearance!==c?(q.appendChild(u),f=b.defaultView,d=f.getComputedStyle&&\"textfield\"!==f.getComputedStyle(u,null).WebkitAppearance&&0!==u.offsetHeight,q.removeChild(u)):/^(search|tel)$/.test(e)||(d=/^(url|email)$/.test(e)?u.checkValidity&&u.checkValidity()===!1:u.value!=v)),D[a[g]]=!!d;return D}(\"search tel url email datetime date month week time datetime-local number range color\".split(\" \"))}var l,m,n=\"2.8.3\",o={},p=!0,q=b.documentElement,r=\"modernizr\",s=b.createElement(r),t=s.style,u=b.createElement(\"input\"),v=\":)\",w={}.toString,x=\" -webkit- -moz- -o- -ms- \".split(\" \"),y=\"Webkit Moz O ms\",z=y.split(\" \"),A=y.toLowerCase().split(\" \"),B={svg:\"http://www.w3.org/2000/svg\"},C={},D={},E={},F=[],G=F.slice,H=function(a,c,d,e){var f,g,h,i,j=b.createElement(\"div\"),k=b.body,l=k||b.createElement(\"body\");if(parseInt(d,10))for(;d--;)h=b.createElement(\"div\"),h.id=e?e[d]:r+(d+1),j.appendChild(h);return f=[\"­\",'\"].join(\"\"),j.id=r,(k?j:l).innerHTML+=f,l.appendChild(j),k||(l.style.background=\"\",l.style.overflow=\"hidden\",i=q.style.overflow,q.style.overflow=\"hidden\",q.appendChild(l)),g=c(j,a),k?j.parentNode.removeChild(j):(l.parentNode.removeChild(l),q.style.overflow=i),!!g},I=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return H(\"@media \"+b+\" { #\"+r+\" { position: absolute; } }\",function(b){d=\"absolute\"==(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).position}),d},J=function(){function a(a,e){e=e||b.createElement(d[a]||\"div\"),a=\"on\"+a;var g=a in e;return g||(e.setAttribute||(e=b.createElement(\"div\")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(a,\"\"),g=f(e[a],\"function\"),f(e[a],\"undefined\")||(e[a]=c),e.removeAttribute(a))),e=null,g}var d={select:\"input\",change:\"input\",submit:\"form\",reset:\"form\",error:\"img\",load:\"img\",abort:\"img\"};return a}(),K={}.hasOwnProperty;m=f(K,\"undefined\")||f(K.call,\"undefined\")?function(a,b){return b in a&&f(a.constructor.prototype[b],\"undefined\")}:function(a,b){return K.call(a,b)},Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if(\"function\"!=typeof b)throw new TypeError;var c=G.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,g=b.apply(f,c.concat(G.call(arguments)));return Object(g)===g?g:f}return b.apply(a,c.concat(G.call(arguments)))};return d}),C.flexbox=function(){return j(\"flexWrap\")},C.flexboxlegacy=function(){return j(\"boxDirection\")},C.canvas=function(){var a=b.createElement(\"canvas\");return!(!a.getContext||!a.getContext(\"2d\"))},C.canvastext=function(){return!(!o.canvas||!f(b.createElement(\"canvas\").getContext(\"2d\").fillText,\"function\"))},C.webgl=function(){return!!a.WebGLRenderingContext},C.touch=function(){var c;return\"ontouchstart\"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:H([\"@media (\",x.join(\"touch-enabled),(\"),r,\")\",\"{#modernizr{top:9px;position:absolute}}\"].join(\"\"),function(a){c=9===a.offsetTop}),c},C.geolocation=function(){return\"geolocation\"in navigator},C.postmessage=function(){return!!a.postMessage},C.websqldatabase=function(){return!!a.openDatabase},C.indexedDB=function(){return!!j(\"indexedDB\",a)},C.hashchange=function(){return J(\"hashchange\",a)&&(b.documentMode===c||b.documentMode>7)},C.history=function(){return!(!a.history||!history.pushState)},C.draganddrop=function(){var a=b.createElement(\"div\");return\"draggable\"in a||\"ondragstart\"in a&&\"ondrop\"in a},C.websockets=function(){return\"WebSocket\"in a||\"MozWebSocket\"in a},C.rgba=function(){return d(\"background-color:rgba(150,255,150,.5)\"),g(t.backgroundColor,\"rgba\")},C.hsla=function(){return d(\"background-color:hsla(120,40%,100%,.5)\"),g(t.backgroundColor,\"rgba\")||g(t.backgroundColor,\"hsla\")},C.multiplebgs=function(){return d(\"background:url(https://),url(https://),red url(https://)\"),/(url\\s*\\(.*?){3}/.test(t.background)},C.backgroundsize=function(){return j(\"backgroundSize\")},C.borderimage=function(){return j(\"borderImage\")},C.borderradius=function(){return j(\"borderRadius\")},C.boxshadow=function(){return j(\"boxShadow\")},C.textshadow=function(){return\"\"===b.createElement(\"div\").style.textShadow},C.opacity=function(){return e(\"opacity:.55\"),/^0.55$/.test(t.opacity)},C.cssanimations=function(){return j(\"animationName\")},C.csscolumns=function(){return j(\"columnCount\")},C.cssgradients=function(){var a=\"background-image:\",b=\"gradient(linear,left top,right bottom,from(#9f9),to(white));\",c=\"linear-gradient(left top,#9f9, white);\";return d((a+\"-webkit- \".split(\" \").join(b+a)+x.join(c+a)).slice(0,-a.length)),g(t.backgroundImage,\"gradient\")},C.cssreflections=function(){return j(\"boxReflect\")},C.csstransforms=function(){return!!j(\"transform\")},C.csstransforms3d=function(){var a=!!j(\"perspective\");return a&&\"webkitPerspective\"in q.style&&H(\"@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}\",function(b,c){a=9===b.offsetLeft&&3===b.offsetHeight}),a},C.csstransitions=function(){return j(\"transition\")},C.fontface=function(){var a;return H('@font-face {font-family:\"font\";src:url(\"https://\")}',function(c,d){var e=b.getElementById(\"smodernizr\"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||\"\":\"\";a=/src/i.test(g)&&0===g.indexOf(d.split(\" \")[0])}),a},C.generatedcontent=function(){var a;return H([\"#\",r,\"{font:0/0 a}#\",r,':after{content:\"',v,'\";visibility:hidden;font:3px/1 a}'].join(\"\"),function(b){a=b.offsetHeight>=3}),a},C.video=function(){var a=b.createElement(\"video\"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs=\"theora\"').replace(/^no$/,\"\"),c.h264=a.canPlayType('video/mp4; codecs=\"avc1.42E01E\"').replace(/^no$/,\"\"),c.webm=a.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,\"\"))}catch(d){}return c},C.audio=function(){var a=b.createElement(\"audio\"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,\"\"),c.mp3=a.canPlayType(\"audio/mpeg;\").replace(/^no$/,\"\"),c.wav=a.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/,\"\"),c.m4a=(a.canPlayType(\"audio/x-m4a;\")||a.canPlayType(\"audio/aac;\")).replace(/^no$/,\"\"))}catch(d){}return c},C.localstorage=function(){try{return localStorage.setItem(r,r),localStorage.removeItem(r),!0}catch(a){return!1}},C.sessionstorage=function(){try{return sessionStorage.setItem(r,r),sessionStorage.removeItem(r),!0}catch(a){return!1}},C.webworkers=function(){return!!a.Worker},C.applicationcache=function(){return!!a.applicationCache},C.svg=function(){return!!b.createElementNS&&!!b.createElementNS(B.svg,\"svg\").createSVGRect},C.inlinesvg=function(){var a=b.createElement(\"div\");return a.innerHTML=\"\",(a.firstChild&&a.firstChild.namespaceURI)==B.svg},C.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(w.call(b.createElementNS(B.svg,\"animate\")))},C.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(w.call(b.createElementNS(B.svg,\"clipPath\")))};for(var L in C)m(C,L)&&(l=L.toLowerCase(),o[l]=C[L](),F.push((o[l]?\"\":\"no-\")+l));return o.input||k(),o.addTest=function(a,b){if(\"object\"==typeof a)for(var d in a)m(a,d)&&o.addTest(d,a[d]);else{if(a=a.toLowerCase(),o[a]!==c)return o;b=\"function\"==typeof b?b():b,\"undefined\"!=typeof p&&p&&(q.className+=\" \"+(b?\"\":\"no-\")+a),o[a]=b}return o},d(\"\"),s=u=null,function(a,b){function c(a,b){var c=a.createElement(\"p\"),d=a.getElementsByTagName(\"head\")[0]||a.documentElement;return c.innerHTML=\"x\",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=s.elements;return\"string\"==typeof a?a.split(\" \"):a}function e(a){var b=r[a[p]];return b||(b={},q++,a[p]=q,r[q]=b),b}function f(a,c,d){if(c||(c=b),k)return c.createElement(a);d||(d=e(c));var f;return f=d.cache[a]?d.cache[a].cloneNode():o.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!f.canHaveChildren||n.test(a)||f.tagUrn?f:d.frag.appendChild(f)}function g(a,c){if(a||(a=b),k)return a.createDocumentFragment();c=c||e(a);for(var f=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)f.createElement(h[g]);return f}function h(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return s.shivMethods?f(c,a,b):b.createElem(c)},a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+d().join().replace(/[\\w\\-]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c(\"'+a+'\")'})+\");return n}\")(s,b.frag)}function i(a){a||(a=b);var d=e(a);return!s.shivCSS||j||d.hasCSS||(d.hasCSS=!!c(a,\"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}\")),k||h(a,d),a}var j,k,l=\"3.7.0\",m=a.html5||{},n=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,o=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,p=\"_html5shiv\",q=0,r={};!function(){try{var a=b.createElement(\"a\");a.innerHTML=\"\",j=\"hidden\"in a,k=1==a.childNodes.length||function(){b.createElement(\"a\");var a=b.createDocumentFragment();return\"undefined\"==typeof a.cloneNode||\"undefined\"==typeof a.createDocumentFragment||\"undefined\"==typeof a.createElement}()}catch(c){j=!0,k=!0}}();var s={elements:m.elements||\"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video\",version:l,shivCSS:m.shivCSS!==!1,supportsUnknownElements:k,shivMethods:m.shivMethods!==!1,type:\"default\",shivDocument:i,createElement:f,createDocumentFragment:g};a.html5=s,i(b)}(this,b),o._version=n,o._prefixes=x,o._domPrefixes=A,o._cssomPrefixes=z,o.mq=I,o.hasEvent=J,o.testProp=function(a){return h([a])},o.testAllProps=j,o.testStyles=H,o.prefixed=function(a,b,c){return b?j(a,b,c):j(a,\"pfx\")},q.className=q.className.replace(/(^|\\s)no-js(\\s|$)/,\"$1$2\")+(p?\" js \"+F.join(\" \"):\"\"),o}(this,this.document);","/*\n * Foundation Responsive Library\n * http://foundation.zurb.com\n * Copyright 2015, ZURB\n * Free to use under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n*/\n\n(function ($, window, document, undefined) {\n 'use strict';\n\n var header_helpers = function (class_array) {\n var head = $('head');\n head.prepend($.map(class_array, function (class_name) {\n if (head.has('.' + class_name).length === 0) {\n return '';\n }\n }));\n };\n\n header_helpers([\n 'foundation-mq-small',\n 'foundation-mq-small-only',\n 'foundation-mq-medium',\n 'foundation-mq-medium-only',\n 'foundation-mq-large',\n 'foundation-mq-large-only',\n 'foundation-mq-xlarge',\n 'foundation-mq-xlarge-only',\n 'foundation-mq-xxlarge',\n 'foundation-data-attribute-namespace']);\n\n // Enable FastClick if present\n\n $(function () {\n if (typeof FastClick !== 'undefined') {\n // Don't attach to body if undefined\n if (typeof document.body !== 'undefined') {\n FastClick.attach(document.body);\n }\n }\n });\n\n // private Fast Selector wrapper,\n // returns jQuery object. Only use where\n // getElementById is not available.\n var S = function (selector, context) {\n if (typeof selector === 'string') {\n if (context) {\n var cont;\n if (context.jquery) {\n cont = context[0];\n if (!cont) {\n return context;\n }\n } else {\n cont = context;\n }\n return $(cont.querySelectorAll(selector));\n }\n\n return $(document.querySelectorAll(selector));\n }\n\n return $(selector, context);\n };\n\n // Namespace functions.\n\n var attr_name = function (init) {\n var arr = [];\n if (!init) {\n arr.push('data');\n }\n if (this.namespace.length > 0) {\n arr.push(this.namespace);\n }\n arr.push(this.name);\n\n return arr.join('-');\n };\n\n var add_namespace = function (str) {\n var parts = str.split('-'),\n i = parts.length,\n arr = [];\n\n while (i--) {\n if (i !== 0) {\n arr.push(parts[i]);\n } else {\n if (this.namespace.length > 0) {\n arr.push(this.namespace, parts[i]);\n } else {\n arr.push(parts[i]);\n }\n }\n }\n\n return arr.reverse().join('-');\n };\n\n // Event binding and data-options updating.\n\n var bindings = function (method, options) {\n var self = this,\n bind = function(){\n var $this = S(this),\n should_bind_events = !$this.data(self.attr_name(true) + '-init');\n $this.data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options($this)));\n\n if (should_bind_events) {\n self.events(this);\n }\n };\n\n if (S(this.scope).is('[' + this.attr_name() +']')) {\n bind.call(this.scope);\n } else {\n S('[' + this.attr_name() +']', this.scope).each(bind);\n }\n // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating.\n if (typeof method === 'string') {\n return this[method].call(this, options);\n }\n\n };\n\n var single_image_loaded = function (image, callback) {\n function loaded () {\n callback(image[0]);\n }\n\n function bindLoad () {\n this.one('load', loaded);\n\n if (/MSIE (\\d+\\.\\d+);/.test(navigator.userAgent)) {\n var src = this.attr( 'src' ),\n param = src.match( /\\?/ ) ? '&' : '?';\n\n param += 'random=' + (new Date()).getTime();\n this.attr('src', src + param);\n }\n }\n\n if (!image.attr('src')) {\n loaded();\n return;\n }\n\n if (image[0].complete || image[0].readyState === 4) {\n loaded();\n } else {\n bindLoad.call(image);\n }\n };\n\n /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */\n\n window.matchMedia || (window.matchMedia = function() {\n \"use strict\";\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n var styleMedia = (window.styleMedia || window.media);\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function(media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function(media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n }());\n\n /*\n * jquery.requestAnimationFrame\n * https://github.com/gnarf37/jquery-requestAnimationFrame\n * Requires jQuery 1.8+\n *\n * Copyright (c) 2012 Corey Frang\n * Licensed under the MIT license.\n */\n\n (function(jQuery) {\n\n\n // requestAnimationFrame polyfill adapted from Erik Möller\n // fixes from Paul Irish and Tino Zijdel\n // http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n var animating,\n lastTime = 0,\n vendors = ['webkit', 'moz'],\n requestAnimationFrame = window.requestAnimationFrame,\n cancelAnimationFrame = window.cancelAnimationFrame,\n jqueryFxAvailable = 'undefined' !== typeof jQuery.fx;\n\n for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) {\n requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ];\n cancelAnimationFrame = cancelAnimationFrame ||\n window[ vendors[lastTime] + 'CancelAnimationFrame' ] ||\n window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ];\n }\n\n function raf() {\n if (animating) {\n requestAnimationFrame(raf);\n\n if (jqueryFxAvailable) {\n jQuery.fx.tick();\n }\n }\n }\n\n if (requestAnimationFrame) {\n // use rAF\n window.requestAnimationFrame = requestAnimationFrame;\n window.cancelAnimationFrame = cancelAnimationFrame;\n\n if (jqueryFxAvailable) {\n jQuery.fx.timer = function (timer) {\n if (timer() && jQuery.timers.push(timer) && !animating) {\n animating = true;\n raf();\n }\n };\n\n jQuery.fx.stop = function () {\n animating = false;\n };\n }\n } else {\n // polyfill\n window.requestAnimationFrame = function (callback) {\n var currTime = new Date().getTime(),\n timeToCall = Math.max(0, 16 - (currTime - lastTime)),\n id = window.setTimeout(function () {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n\n window.cancelAnimationFrame = function (id) {\n clearTimeout(id);\n };\n\n }\n\n }( $ ));\n\n function removeQuotes (string) {\n if (typeof string === 'string' || string instanceof String) {\n string = string.replace(/^['\\\\/\"]+|(;\\s?})+|['\\\\/\"]+$/g, '');\n }\n\n return string;\n }\n\n function MediaQuery(selector) {\n this.selector = selector;\n this.query = '';\n }\n\n MediaQuery.prototype.toString = function () {\n return this.query || (this.query = S(this.selector).css('font-family').replace(/^[\\/\\\\'\"]+|(;\\s?})+|[\\/\\\\'\"]+$/g, ''));\n };\n\n window.Foundation = {\n name : 'Foundation',\n\n version : '5.5.3',\n\n media_queries : {\n 'small' : new MediaQuery('.foundation-mq-small'),\n 'small-only' : new MediaQuery('.foundation-mq-small-only'),\n 'medium' : new MediaQuery('.foundation-mq-medium'),\n 'medium-only' : new MediaQuery('.foundation-mq-medium-only'),\n 'large' : new MediaQuery('.foundation-mq-large'),\n 'large-only' : new MediaQuery('.foundation-mq-large-only'),\n 'xlarge' : new MediaQuery('.foundation-mq-xlarge'),\n 'xlarge-only' : new MediaQuery('.foundation-mq-xlarge-only'),\n 'xxlarge' : new MediaQuery('.foundation-mq-xxlarge')\n },\n\n stylesheet : $('').appendTo('head')[0].sheet,\n\n global : {\n namespace : undefined\n },\n\n init : function (scope, libraries, method, options, response) {\n var args = [scope, method, options, response],\n responses = [];\n\n // check RTL\n this.rtl = /rtl/i.test(S('html').attr('dir'));\n\n // set foundation global scope\n this.scope = scope || this.scope;\n\n this.set_namespace();\n\n if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) {\n if (this.libs.hasOwnProperty(libraries)) {\n responses.push(this.init_lib(libraries, args));\n }\n } else {\n for (var lib in this.libs) {\n responses.push(this.init_lib(lib, libraries));\n }\n }\n\n S(window).load(function () {\n S(window)\n .trigger('resize.fndtn.clearing')\n .trigger('resize.fndtn.dropdown')\n .trigger('resize.fndtn.equalizer')\n .trigger('resize.fndtn.interchange')\n .trigger('resize.fndtn.joyride')\n .trigger('resize.fndtn.magellan')\n .trigger('resize.fndtn.topbar')\n .trigger('resize.fndtn.slider');\n });\n\n return scope;\n },\n\n init_lib : function (lib, args) {\n if (this.libs.hasOwnProperty(lib)) {\n this.patch(this.libs[lib]);\n\n if (args && args.hasOwnProperty(lib)) {\n if (typeof this.libs[lib].settings !== 'undefined') {\n $.extend(true, this.libs[lib].settings, args[lib]);\n } else if (typeof this.libs[lib].defaults !== 'undefined') {\n $.extend(true, this.libs[lib].defaults, args[lib]);\n }\n return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]);\n }\n\n args = args instanceof Array ? args : new Array(args);\n return this.libs[lib].init.apply(this.libs[lib], args);\n }\n\n return function () {};\n },\n\n patch : function (lib) {\n lib.scope = this.scope;\n lib.namespace = this.global.namespace;\n lib.rtl = this.rtl;\n lib['data_options'] = this.utils.data_options;\n lib['attr_name'] = attr_name;\n lib['add_namespace'] = add_namespace;\n lib['bindings'] = bindings;\n lib['S'] = this.utils.S;\n },\n\n inherit : function (scope, methods) {\n var methods_arr = methods.split(' '),\n i = methods_arr.length;\n\n while (i--) {\n if (this.utils.hasOwnProperty(methods_arr[i])) {\n scope[methods_arr[i]] = this.utils[methods_arr[i]];\n }\n }\n },\n\n set_namespace : function () {\n\n // Description:\n // Don't bother reading the namespace out of the meta tag\n // if the namespace has been set globally in javascript\n //\n // Example:\n // Foundation.global.namespace = 'my-namespace';\n // or make it an empty string:\n // Foundation.global.namespace = '';\n //\n //\n\n // If the namespace has not been set (is undefined), try to read it out of the meta element.\n // Otherwise use the globally defined namespace, even if it's empty ('')\n var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace;\n\n // Finally, if the namsepace is either undefined or false, set it to an empty string.\n // Otherwise use the namespace value.\n this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace;\n },\n\n libs : {},\n\n // methods that can be inherited in libraries\n utils : {\n\n // Description:\n // Fast Selector wrapper returns jQuery object. Only use where getElementById\n // is not available.\n //\n // Arguments:\n // Selector (String): CSS selector describing the element(s) to be\n // returned as a jQuery object.\n //\n // Scope (String): CSS selector describing the area to be searched. Default\n // is document.\n //\n // Returns:\n // Element (jQuery Object): jQuery object containing elements matching the\n // selector within the scope.\n S : S,\n\n // Description:\n // Executes a function a max of once every n milliseconds\n //\n // Arguments:\n // Func (Function): Function to be throttled.\n //\n // Delay (Integer): Function execution threshold in milliseconds.\n //\n // Returns:\n // Lazy_function (Function): Function with throttling applied.\n throttle : function (func, delay) {\n var timer = null;\n\n return function () {\n var context = this, args = arguments;\n\n if (timer == null) {\n timer = setTimeout(function () {\n func.apply(context, args);\n timer = null;\n }, delay);\n }\n };\n },\n\n // Description:\n // Executes a function when it stops being invoked for n seconds\n // Modified version of _.debounce() http://underscorejs.org\n //\n // Arguments:\n // Func (Function): Function to be debounced.\n //\n // Delay (Integer): Function execution threshold in milliseconds.\n //\n // Immediate (Bool): Whether the function should be called at the beginning\n // of the delay instead of the end. Default is false.\n //\n // Returns:\n // Lazy_function (Function): Function with debouncing applied.\n debounce : function (func, delay, immediate) {\n var timeout, result;\n return function () {\n var context = this, args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n }\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, delay);\n if (callNow) {\n result = func.apply(context, args);\n }\n return result;\n };\n },\n\n // Description:\n // Parses data-options attribute\n //\n // Arguments:\n // El (jQuery Object): Element to be parsed.\n //\n // Returns:\n // Options (Javascript Object): Contents of the element's data-options\n // attribute.\n data_options : function (el, data_attr_name) {\n data_attr_name = data_attr_name || 'options';\n var opts = {}, ii, p, opts_arr,\n data_options = function (el) {\n var namespace = Foundation.global.namespace;\n\n if (namespace.length > 0) {\n return el.data(namespace + '-' + data_attr_name);\n }\n\n return el.data(data_attr_name);\n };\n\n var cached_options = data_options(el);\n\n if (typeof cached_options === 'object') {\n return cached_options;\n }\n\n opts_arr = (cached_options || ':').split(';');\n ii = opts_arr.length;\n\n function isNumber (o) {\n return !isNaN (o - 0) && o !== null && o !== '' && o !== false && o !== true;\n }\n\n function trim (str) {\n if (typeof str === 'string') {\n return $.trim(str);\n }\n return str;\n }\n\n while (ii--) {\n p = opts_arr[ii].split(':');\n p = [p[0], p.slice(1).join(':')];\n\n if (/true/i.test(p[1])) {\n p[1] = true;\n }\n if (/false/i.test(p[1])) {\n p[1] = false;\n }\n if (isNumber(p[1])) {\n if (p[1].indexOf('.') === -1) {\n p[1] = parseInt(p[1], 10);\n } else {\n p[1] = parseFloat(p[1]);\n }\n }\n\n if (p.length === 2 && p[0].length > 0) {\n opts[trim(p[0])] = trim(p[1]);\n }\n }\n\n return opts;\n },\n\n // Description:\n // Adds JS-recognizable media queries\n //\n // Arguments:\n // Media (String): Key string for the media query to be stored as in\n // Foundation.media_queries\n //\n // Class (String): Class name for the generated tag\n register_media : function (media, media_class) {\n if (Foundation.media_queries[media] === undefined) {\n $('head').append('');\n Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family'));\n }\n },\n\n // Description:\n // Add custom CSS within a JS-defined media query\n //\n // Arguments:\n // Rule (String): CSS rule to be appended to the document.\n //\n // Media (String): Optional media query string for the CSS rule to be\n // nested under.\n add_custom_rule : function (rule, media) {\n if (media === undefined && Foundation.stylesheet) {\n Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length);\n } else {\n var query = Foundation.media_queries[media];\n\n if (query !== undefined) {\n Foundation.stylesheet.insertRule('@media ' +\n Foundation.media_queries[media] + '{ ' + rule + ' }', Foundation.stylesheet.cssRules.length);\n }\n }\n },\n\n // Description:\n // Performs a callback function when an image is fully loaded\n //\n // Arguments:\n // Image (jQuery Object): Image(s) to check if loaded.\n //\n // Callback (Function): Function to execute when image is fully loaded.\n image_loaded : function (images, callback) {\n var self = this,\n unloaded = images.length;\n\n function pictures_has_height(images) {\n var pictures_number = images.length;\n\n for (var i = pictures_number - 1; i >= 0; i--) {\n if(images.attr('height') === undefined) {\n return false;\n };\n };\n\n return true;\n }\n\n if (unloaded === 0 || pictures_has_height(images)) {\n callback(images);\n }\n\n images.each(function () {\n single_image_loaded(self.S(this), function () {\n unloaded -= 1;\n if (unloaded === 0) {\n callback(images);\n }\n });\n });\n },\n\n // Description:\n // Returns a random, alphanumeric string\n //\n // Arguments:\n // Length (Integer): Length of string to be generated. Defaults to random\n // integer.\n //\n // Returns:\n // Rand (String): Pseudo-random, alphanumeric string.\n random_str : function () {\n if (!this.fidx) {\n this.fidx = 0;\n }\n this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-');\n\n return this.prefix + (this.fidx++).toString(36);\n },\n\n // Description:\n // Helper for window.matchMedia\n //\n // Arguments:\n // mq (String): Media query\n //\n // Returns:\n // (Boolean): Whether the media query passes or not\n match : function (mq) {\n return window.matchMedia(mq).matches;\n },\n\n // Description:\n // Helpers for checking Foundation default media queries with JS\n //\n // Returns:\n // (Boolean): Whether the media query passes or not\n\n is_small_up : function () {\n return this.match(Foundation.media_queries.small);\n },\n\n is_medium_up : function () {\n return this.match(Foundation.media_queries.medium);\n },\n\n is_large_up : function () {\n return this.match(Foundation.media_queries.large);\n },\n\n is_xlarge_up : function () {\n return this.match(Foundation.media_queries.xlarge);\n },\n\n is_xxlarge_up : function () {\n return this.match(Foundation.media_queries.xxlarge);\n },\n\n is_small_only : function () {\n return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();\n },\n\n is_medium_only : function () {\n return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();\n },\n\n is_large_only : function () {\n return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up();\n },\n\n is_xlarge_only : function () {\n return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up();\n },\n\n is_xxlarge_only : function () {\n return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up();\n }\n }\n };\n\n $.fn.foundation = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n\n return this.each(function () {\n Foundation.init.apply(Foundation, [this].concat(args));\n return this;\n });\n };\n\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.abide = {\n name : 'abide',\n\n version : '5.5.3',\n\n settings : {\n live_validate : true, // validate the form as you go\n validate_on_blur : true, // validate whenever you focus/blur on an input field\n // validate_on: 'tab', // tab (when user tabs between fields), change (input changes), manual (call custom events)\n\n focus_on_invalid : true, // automatically bring the focus to an invalid input field\n error_labels : true, // labels with a for=\"inputId\" will receive an `error` class\n error_class : 'error', // labels with a for=\"inputId\" will receive an `error` class\n // the amount of time Abide will take before it validates the form (in ms).\n // smaller time will result in faster validation\n timeout : 1000,\n patterns : {\n alpha : /^[a-zA-Z]+$/,\n alpha_numeric : /^[a-zA-Z0-9]+$/,\n integer : /^[-+]?\\d+$/,\n number : /^[-+]?\\d*(?:[\\.\\,]\\d+)?$/,\n\n // amex, visa, diners\n card : /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$/,\n cvv : /^([0-9]){3,4}$/,\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address\n email : /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,\n\n // http://blogs.lse.ac.uk/lti/2008/04/23/a-regular-expression-to-match-any-url/\n url: /^(https?|ftp|file|ssh):\\/\\/([-;:&=\\+\\$,\\w]+@{1})?([-A-Za-z0-9\\.]+)+:?(\\d+)?((\\/[-\\+~%\\/\\.\\w]+)?\\??([-\\+=&;%@\\.\\w]+)?#?([\\w]+)?)?/,\n // abc.de\n domain : /^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,8}$/,\n\n datetime : /^([0-2][0-9]{3})\\-([0-1][0-9])\\-([0-3][0-9])T([0-5][0-9])\\:([0-5][0-9])\\:([0-5][0-9])(Z|([\\-\\+]([0-1][0-9])\\:00))$/,\n // YYYY-MM-DD\n date : /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,\n // HH:MM:SS\n time : /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,\n dateISO : /^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}$/,\n // MM/DD/YYYY\n month_day_year : /^(0[1-9]|1[012])[- \\/.](0[1-9]|[12][0-9]|3[01])[- \\/.]\\d{4}$/,\n // DD/MM/YYYY\n day_month_year : /^(0[1-9]|[12][0-9]|3[01])[- \\/.](0[1-9]|1[012])[- \\/.]\\d{4}$/,\n\n // #FFF or #FFFFFF\n color : /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/\n },\n validators : {\n equalTo : function (el, required, parent) {\n var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value,\n to = el.value,\n valid = (from === to);\n\n return valid;\n }\n }\n },\n\n timer : null,\n\n init : function (scope, method, options) {\n this.bindings(method, options);\n },\n\n events : function (scope) {\n var self = this,\n form = self.S(scope).attr('novalidate', 'novalidate'),\n settings = form.data(this.attr_name(true) + '-init') || {};\n\n this.invalid_attr = this.add_namespace('data-invalid');\n\n function validate(originalSelf, e) {\n clearTimeout(self.timer);\n self.timer = setTimeout(function () {\n self.validate([originalSelf], e);\n }.bind(originalSelf), settings.timeout);\n }\n\n form\n .off('.abide')\n .on('submit.fndtn.abide', function (e) {\n var is_ajax = /ajax/i.test(self.S(this).attr(self.attr_name()));\n return self.validate(self.S(this).find('input, textarea, select').not(\":hidden, [data-abide-ignore]\").get(), e, is_ajax);\n })\n .on('validate.fndtn.abide', function (e) {\n if (settings.validate_on === 'manual') {\n self.validate([e.target], e);\n }\n })\n .on('reset', function (e) {\n return self.reset($(this), e);\n })\n .find('input, textarea, select').not(\":hidden, [data-abide-ignore]\")\n .off('.abide')\n .on('blur.fndtn.abide change.fndtn.abide', function (e) {\n var id = this.getAttribute('id'),\n eqTo = form.find('[data-equalto=\"'+ id +'\"]');\n // old settings fallback\n // will be deprecated with F6 release\n if (settings.validate_on_blur && settings.validate_on_blur === true) {\n validate(this, e);\n }\n // checks if there is an equalTo equivalent related by id\n if(typeof eqTo.get(0) !== \"undefined\" && eqTo.val().length){\n validate(eqTo.get(0),e);\n }\n // new settings combining validate options into one setting\n if (settings.validate_on === 'change') {\n validate(this, e);\n }\n })\n .on('keydown.fndtn.abide', function (e) {\n var id = this.getAttribute('id'),\n eqTo = form.find('[data-equalto=\"'+ id +'\"]');\n // old settings fallback\n // will be deprecated with F6 release\n if (settings.live_validate && settings.live_validate === true && e.which != 9) {\n validate(this, e);\n }\n // checks if there is an equalTo equivalent related by id\n if(typeof eqTo.get(0) !== \"undefined\" && eqTo.val().length){\n validate(eqTo.get(0),e);\n }\n // new settings combining validate options into one setting\n if (settings.validate_on === 'tab' && e.which === 9) {\n validate(this, e);\n }\n else if (settings.validate_on === 'change') {\n validate(this, e);\n }\n })\n .on('focus', function (e) {\n if (navigator.userAgent.match(/iPad|iPhone|Android|BlackBerry|Windows Phone|webOS/i)) {\n $('html, body').animate({\n scrollTop: $(e.target).offset().top\n }, 100);\n }\n });\n },\n\n reset : function (form, e) {\n var self = this;\n form.removeAttr(self.invalid_attr);\n\n $('[' + self.invalid_attr + ']', form).removeAttr(self.invalid_attr);\n $('.' + self.settings.error_class, form).not('small').removeClass(self.settings.error_class);\n $(':input', form).not(':button, :submit, :reset, :hidden, [data-abide-ignore]').val('').removeAttr(self.invalid_attr);\n },\n\n validate : function (els, e, is_ajax) {\n var validations = this.parse_patterns(els),\n validation_count = validations.length,\n form = this.S(els[0]).closest('form'),\n submit_event = /submit/.test(e.type);\n\n // Has to count up to make sure the focus gets applied to the top error\n for (var i = 0; i < validation_count; i++) {\n if (!validations[i] && (submit_event || is_ajax)) {\n if (this.settings.focus_on_invalid) {\n els[i].focus();\n }\n form.trigger('invalid.fndtn.abide');\n this.S(els[i]).closest('form').attr(this.invalid_attr, '');\n return false;\n }\n }\n\n if (submit_event || is_ajax) {\n form.trigger('valid.fndtn.abide');\n }\n\n form.removeAttr(this.invalid_attr);\n\n if (is_ajax) {\n return false;\n }\n\n return true;\n },\n\n parse_patterns : function (els) {\n var i = els.length,\n el_patterns = [];\n\n while (i--) {\n el_patterns.push(this.pattern(els[i]));\n }\n\n return this.check_validation_and_apply_styles(el_patterns);\n },\n\n pattern : function (el) {\n var type = el.getAttribute('type'),\n required = typeof el.getAttribute('required') === 'string';\n\n var pattern = el.getAttribute('pattern') || '';\n\n if (this.settings.patterns.hasOwnProperty(pattern) && pattern.length > 0) {\n return [el, this.settings.patterns[pattern], required];\n } else if (pattern.length > 0) {\n return [el, new RegExp(pattern), required];\n }\n\n if (this.settings.patterns.hasOwnProperty(type)) {\n return [el, this.settings.patterns[type], required];\n }\n\n pattern = /.*/;\n\n return [el, pattern, required];\n },\n\n // TODO: Break this up into smaller methods, getting hard to read.\n check_validation_and_apply_styles : function (el_patterns) {\n var i = el_patterns.length,\n validations = [];\n if (i == 0) {\n return validations;\n }\n var form = this.S(el_patterns[0][0]).closest('[data-' + this.attr_name(true) + ']'),\n settings = form.data(this.attr_name(true) + '-init') || {};\n while (i--) {\n var el = el_patterns[i][0],\n required = el_patterns[i][2],\n value = el.value.trim(),\n direct_parent = this.S(el).parent(),\n validator = el.getAttribute(this.add_namespace('data-abide-validator')),\n is_radio = el.type === 'radio',\n is_checkbox = el.type === 'checkbox',\n label = this.S('label[for=\"' + el.getAttribute('id') + '\"]'),\n valid_length = (required) ? (el.value.length > 0) : true,\n el_validations = [];\n\n var parent, valid;\n\n // support old way to do equalTo validations\n if (el.getAttribute(this.add_namespace('data-equalto'))) { validator = 'equalTo' }\n\n if (!direct_parent.is('label')) {\n parent = direct_parent;\n } else {\n parent = direct_parent.parent();\n }\n\n if (is_radio && required) {\n el_validations.push(this.valid_radio(el, required));\n } else if (is_checkbox && required) {\n el_validations.push(this.valid_checkbox(el, required));\n\n } else if (validator) {\n // Validate using each of the specified (space-delimited) validators.\n var validators = validator.split(' ');\n var last_valid = true, all_valid = true;\n for (var iv = 0; iv < validators.length; iv++) {\n valid = this.settings.validators[validators[iv]].apply(this, [el, required, parent])\n el_validations.push(valid);\n all_valid = valid && last_valid;\n last_valid = valid;\n }\n if (all_valid) {\n this.S(el).removeAttr(this.invalid_attr);\n parent.removeClass('error');\n if (label.length > 0 && this.settings.error_labels) {\n label.removeClass(this.settings.error_class).removeAttr('role');\n }\n $(el).triggerHandler('valid');\n } else {\n this.S(el).attr(this.invalid_attr, '');\n parent.addClass('error');\n if (label.length > 0 && this.settings.error_labels) {\n label.addClass(this.settings.error_class).attr('role', 'alert');\n }\n $(el).triggerHandler('invalid');\n }\n } else {\n\n if (el_patterns[i][1].test(value) && valid_length ||\n !required && el.value.length < 1 || $(el).attr('disabled')) {\n el_validations.push(true);\n } else {\n el_validations.push(false);\n }\n\n el_validations = [el_validations.every(function (valid) {return valid;})];\n if (el_validations[0]) {\n this.S(el).removeAttr(this.invalid_attr);\n el.setAttribute('aria-invalid', 'false');\n el.removeAttribute('aria-describedby');\n parent.removeClass(this.settings.error_class);\n if (label.length > 0 && this.settings.error_labels) {\n label.removeClass(this.settings.error_class).removeAttr('role');\n }\n $(el).triggerHandler('valid');\n } else {\n this.S(el).attr(this.invalid_attr, '');\n el.setAttribute('aria-invalid', 'true');\n\n // Try to find the error associated with the input\n var errorElem = parent.find('small.' + this.settings.error_class, 'span.' + this.settings.error_class);\n var errorID = errorElem.length > 0 ? errorElem[0].id : '';\n if (errorID.length > 0) {\n el.setAttribute('aria-describedby', errorID);\n }\n\n // el.setAttribute('aria-describedby', $(el).find('.error')[0].id);\n parent.addClass(this.settings.error_class);\n if (label.length > 0 && this.settings.error_labels) {\n label.addClass(this.settings.error_class).attr('role', 'alert');\n }\n $(el).triggerHandler('invalid');\n }\n }\n validations = validations.concat(el_validations);\n }\n\n return validations;\n },\n\n valid_checkbox : function (el, required) {\n var el = this.S(el),\n valid = (el.is(':checked') || !required || el.get(0).getAttribute('disabled'));\n\n if (valid) {\n el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class);\n $(el).triggerHandler('valid');\n } else {\n el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class);\n $(el).triggerHandler('invalid');\n }\n\n return valid;\n },\n\n valid_radio : function (el, required) {\n var name = el.getAttribute('name'),\n group = this.S(el).closest('[data-' + this.attr_name(true) + ']').find(\"[name='\" + name + \"']\"),\n count = group.length,\n valid = false,\n disabled = false;\n\n // Has to count up to make sure the focus gets applied to the top error\n for (var i=0; i < count; i++) {\n if( group[i].getAttribute('disabled') ){\n disabled=true;\n valid=true;\n } else {\n if (group[i].checked){\n valid = true;\n } else {\n if( disabled ){\n valid = false;\n }\n }\n }\n }\n\n // Has to count up to make sure the focus gets applied to the top error\n for (var i = 0; i < count; i++) {\n if (valid) {\n this.S(group[i]).removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class);\n $(group[i]).triggerHandler('valid');\n } else {\n this.S(group[i]).attr(this.invalid_attr, '').parent().addClass(this.settings.error_class);\n $(group[i]).triggerHandler('invalid');\n }\n }\n\n return valid;\n },\n\n valid_equal : function (el, required, parent) {\n var from = document.getElementById(el.getAttribute(this.add_namespace('data-equalto'))).value,\n to = el.value,\n valid = (from === to);\n\n if (valid) {\n this.S(el).removeAttr(this.invalid_attr);\n parent.removeClass(this.settings.error_class);\n if (label.length > 0 && settings.error_labels) {\n label.removeClass(this.settings.error_class);\n }\n } else {\n this.S(el).attr(this.invalid_attr, '');\n parent.addClass(this.settings.error_class);\n if (label.length > 0 && settings.error_labels) {\n label.addClass(this.settings.error_class);\n }\n }\n\n return valid;\n },\n\n valid_oneof : function (el, required, parent, doNotValidateOthers) {\n var el = this.S(el),\n others = this.S('[' + this.add_namespace('data-oneof') + ']'),\n valid = others.filter(':checked').length > 0;\n\n if (valid) {\n el.removeAttr(this.invalid_attr).parent().removeClass(this.settings.error_class);\n } else {\n el.attr(this.invalid_attr, '').parent().addClass(this.settings.error_class);\n }\n\n if (!doNotValidateOthers) {\n var _this = this;\n others.each(function () {\n _this.valid_oneof.call(_this, this, null, null, true);\n });\n }\n\n return valid;\n },\n\n reflow : function(scope, options) {\n var self = this,\n form = self.S('[' + this.attr_name() + ']').attr('novalidate', 'novalidate');\n self.S(form).each(function (idx, el) {\n self.events(el);\n });\n }\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.accordion = {\n name : 'accordion',\n\n version : '5.5.3',\n\n settings : {\n content_class : 'content',\n active_class : 'active',\n multi_expand : false,\n toggleable : true,\n callback : function () {}\n },\n\n init : function (scope, method, options) {\n this.bindings(method, options);\n },\n\n events : function (instance) {\n var self = this;\n var S = this.S;\n self.create(this.S(instance));\n\n S(this.scope)\n .off('.fndtn.accordion')\n .on('click.fndtn.accordion', '[' + this.attr_name() + '] > dd > a, [' + this.attr_name() + '] > li > a', function (e) {\n var accordion = S(this).closest('[' + self.attr_name() + ']'),\n groupSelector = self.attr_name() + '=' + accordion.attr(self.attr_name()),\n settings = accordion.data(self.attr_name(true) + '-init') || self.settings,\n target = S('#' + this.href.split('#')[1]),\n aunts = $('> dd, > li', accordion),\n siblings = aunts.children('.' + settings.content_class),\n active_content = siblings.filter('.' + settings.active_class);\n\n e.preventDefault();\n\n if (accordion.attr(self.attr_name())) {\n siblings = siblings.add('[' + groupSelector + '] dd > ' + '.' + settings.content_class + ', [' + groupSelector + '] li > ' + '.' + settings.content_class);\n aunts = aunts.add('[' + groupSelector + '] dd, [' + groupSelector + '] li');\n }\n\n if (settings.toggleable && target.is(active_content)) {\n target.parent('dd, li').toggleClass(settings.active_class, false);\n target.toggleClass(settings.active_class, false);\n S(this).attr('aria-expanded', function(i, attr){\n return attr === 'true' ? 'false' : 'true';\n });\n settings.callback(target);\n target.triggerHandler('toggled', [accordion]);\n accordion.triggerHandler('toggled', [target]);\n return;\n }\n\n if (!settings.multi_expand) {\n siblings.removeClass(settings.active_class);\n aunts.removeClass(settings.active_class);\n aunts.children('a').attr('aria-expanded','false');\n }\n\n target.addClass(settings.active_class).parent().addClass(settings.active_class);\n settings.callback(target);\n target.triggerHandler('toggled', [accordion]);\n accordion.triggerHandler('toggled', [target]);\n S(this).attr('aria-expanded','true');\n });\n },\n\n create: function($instance) {\n var self = this,\n accordion = $instance,\n aunts = $('> .accordion-navigation', accordion),\n settings = accordion.data(self.attr_name(true) + '-init') || self.settings;\n\n aunts.children('a').attr('aria-expanded','false');\n aunts.has('.' + settings.content_class + '.' + settings.active_class).addClass(settings.active_class).children('a').attr('aria-expanded','true');\n\n if (settings.multi_expand) {\n $instance.attr('aria-multiselectable','true');\n }\n },\n\t\n \ttoggle : function(options) {\n \t\tvar options = typeof options !== 'undefined' ? options : {};\n \t\tvar selector = typeof options.selector !== 'undefined' ? options.selector : '';\n \t\tvar toggle_state = typeof options.toggle_state !== 'undefined' ? options.toggle_state : '';\n \t\tvar $accordion = typeof options.$accordion !== 'undefined' ? options.$accordion : this.S(this.scope).closest('[' + this.attr_name() + ']');\n \n \t\tvar $items = $accordion.find('> dd' + selector + ', > li' + selector);\n \t\tif ( $items.length < 1 ) {\n \t\t\tif ( window.console ) {\n \t\t\t\tconsole.error('Selection not found.', selector);\n \t\t\t}\n \t\t\treturn false;\n \t\t}\n \n \t\tvar S = this.S;\n \t\tvar active_class = this.settings.active_class;\n \t\t$items.each(function() {\n \t\t\tvar $item = S(this);\n \t\t\tvar is_active = $item.hasClass(active_class);\n \t\t\tif ( ( is_active && toggle_state === 'close' ) || ( !is_active && toggle_state === 'open' ) || toggle_state === '' ) {\n \t\t\t\t$item.find('> a').trigger('click.fndtn.accordion');\n \t\t\t}\n \t\t});\n \t},\n \n \topen : function(options) {\n \t\tvar options = typeof options !== 'undefined' ? options : {};\n \t\toptions.toggle_state = 'open';\n \t\tthis.toggle(options);\n \t},\n \n \tclose : function(options) {\n \t\tvar options = typeof options !== 'undefined' ? options : {};\n \t\toptions.toggle_state = 'close';\n \t\tthis.toggle(options);\n \t},\t\n\n off : function () {},\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.alert = {\n name : 'alert',\n\n version : '5.5.3',\n\n settings : {\n callback : function () {}\n },\n\n init : function (scope, method, options) {\n this.bindings(method, options);\n },\n\n events : function () {\n var self = this,\n S = this.S;\n\n $(this.scope).off('.alert').on('click.fndtn.alert', '[' + this.attr_name() + '] .close', function (e) {\n var alertBox = S(this).closest('[' + self.attr_name() + ']'),\n settings = alertBox.data(self.attr_name(true) + '-init') || self.settings;\n\n e.preventDefault();\n if (Modernizr.csstransitions) {\n alertBox.addClass('alert-close');\n alertBox.on('transitionend webkitTransitionEnd oTransitionEnd', function (e) {\n S(this).trigger('close.fndtn.alert').remove();\n settings.callback();\n });\n } else {\n alertBox.fadeOut(300, function () {\n S(this).trigger('close.fndtn.alert').remove();\n settings.callback();\n });\n }\n });\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.clearing = {\n name : 'clearing',\n\n version : '5.5.3',\n\n settings : {\n templates : {\n viewing : '×' +\n '
\"\"' +\n '

' +\n '
' +\n '\"\"' +\n '\"\"'\n },\n\n // comma delimited list of selectors that, on click, will close clearing,\n // add 'div.clearing-blackout, div.visible-img' to close on background click\n close_selectors : '.clearing-close, div.clearing-blackout',\n\n // Default to the entire li element.\n open_selectors : '',\n\n // Image will be skipped in carousel.\n skip_selector : '',\n\n touch_label : '',\n\n // event initializer and locks\n init : false,\n locked : false\n },\n\n init : function (scope, method, options) {\n var self = this;\n Foundation.inherit(this, 'throttle image_loaded');\n\n this.bindings(method, options);\n\n if (self.S(this.scope).is('[' + this.attr_name() + ']')) {\n this.assemble(self.S('li', this.scope));\n } else {\n self.S('[' + this.attr_name() + ']', this.scope).each(function () {\n self.assemble(self.S('li', this));\n });\n }\n },\n\n events : function (scope) {\n var self = this,\n S = self.S,\n $scroll_container = $('.scroll-container');\n\n if ($scroll_container.length > 0) {\n this.scope = $scroll_container;\n }\n\n S(this.scope)\n .off('.clearing')\n .on('click.fndtn.clearing', 'ul[' + this.attr_name() + '] li ' + this.settings.open_selectors,\n function (e, current, target) {\n var current = current || S(this),\n target = target || current,\n next = current.next('li'),\n settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init'),\n image = S(e.target);\n\n e.preventDefault();\n\n if (!settings) {\n self.init();\n settings = current.closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');\n }\n\n // if clearing is open and the current image is\n // clicked, go to the next image in sequence\n if (target.hasClass('visible') &&\n current[0] === target[0] &&\n next.length > 0 && self.is_open(current)) {\n target = next;\n image = S('img', target);\n }\n\n // set current and target to the clicked li if not otherwise defined.\n self.open(image, current, target);\n self.update_paddles(target);\n })\n\n .on('click.fndtn.clearing', '.clearing-main-next',\n function (e) { self.nav(e, 'next') })\n .on('click.fndtn.clearing', '.clearing-main-prev',\n function (e) { self.nav(e, 'prev') })\n .on('click.fndtn.clearing', this.settings.close_selectors,\n function (e) { Foundation.libs.clearing.close(e, this) });\n\n $(document).on('keydown.fndtn.clearing',\n function (e) { self.keydown(e) });\n\n S(window).off('.clearing').on('resize.fndtn.clearing',\n function () { self.resize() });\n\n this.swipe_events(scope);\n },\n\n swipe_events : function (scope) {\n var self = this,\n S = self.S;\n\n S(this.scope)\n .on('touchstart.fndtn.clearing', '.visible-img', function (e) {\n if (!e.touches) { e = e.originalEvent; }\n var data = {\n start_page_x : e.touches[0].pageX,\n start_page_y : e.touches[0].pageY,\n start_time : (new Date()).getTime(),\n delta_x : 0,\n is_scrolling : undefined\n };\n\n S(this).data('swipe-transition', data);\n e.stopPropagation();\n })\n .on('touchmove.fndtn.clearing', '.visible-img', function (e) {\n if (!e.touches) {\n e = e.originalEvent;\n }\n // Ignore pinch/zoom events\n if (e.touches.length > 1 || e.scale && e.scale !== 1) {\n return;\n }\n\n var data = S(this).data('swipe-transition');\n\n if (typeof data === 'undefined') {\n data = {};\n }\n\n data.delta_x = e.touches[0].pageX - data.start_page_x;\n\n if (Foundation.rtl) {\n data.delta_x = -data.delta_x;\n }\n\n if (typeof data.is_scrolling === 'undefined') {\n data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );\n }\n\n if (!data.is_scrolling && !data.active) {\n e.preventDefault();\n var direction = (data.delta_x < 0) ? 'next' : 'prev';\n data.active = true;\n self.nav(e, direction);\n }\n })\n .on('touchend.fndtn.clearing', '.visible-img', function (e) {\n S(this).data('swipe-transition', {});\n e.stopPropagation();\n });\n },\n\n assemble : function ($li) {\n var $el = $li.parent();\n\n if ($el.parent().hasClass('carousel')) {\n return;\n }\n\n $el.after('
');\n\n var grid = $el.detach(),\n grid_outerHTML = '';\n\n if (grid[0] == null) {\n return;\n } else {\n grid_outerHTML = grid[0].outerHTML;\n }\n\n var holder = this.S('#foundationClearingHolder'),\n settings = $el.data(this.attr_name(true) + '-init'),\n data = {\n grid : '
' + grid_outerHTML + '
',\n viewing : settings.templates.viewing\n },\n wrapper = '
' + data.viewing +\n data.grid + '
',\n touch_label = this.settings.touch_label;\n\n if (Modernizr.touch) {\n wrapper = $(wrapper).find('.clearing-touch-label').html(touch_label).end();\n }\n\n holder.after(wrapper).remove();\n },\n\n open : function ($image, current, target) {\n var self = this,\n body = $(document.body),\n root = target.closest('.clearing-assembled'),\n container = self.S('div', root).first(),\n visible_image = self.S('.visible-img', container),\n image = self.S('img', visible_image).not($image),\n label = self.S('.clearing-touch-label', container),\n error = false,\n loaded = {};\n\n // Event to disable scrolling on touch devices when Clearing is activated\n $('body').on('touchmove', function (e) {\n e.preventDefault();\n });\n\n image.error(function () {\n error = true;\n });\n\n function startLoad() {\n setTimeout(function () {\n this.image_loaded(image, function () {\n if (image.outerWidth() === 1 && !error) {\n startLoad.call(this);\n } else {\n cb.call(this, image);\n }\n }.bind(this));\n }.bind(this), 100);\n }\n\n function cb (image) {\n var $image = $(image);\n $image.css('visibility', 'visible');\n $image.trigger('imageVisible');\n // toggle the gallery\n body.css('overflow', 'hidden');\n root.addClass('clearing-blackout');\n container.addClass('clearing-container');\n visible_image.show();\n this.fix_height(target)\n .caption(self.S('.clearing-caption', visible_image), self.S('img', target))\n .center_and_label(image, label)\n .shift(current, target, function () {\n target.closest('li').siblings().removeClass('visible');\n target.closest('li').addClass('visible');\n });\n visible_image.trigger('opened.fndtn.clearing')\n }\n\n if (!this.locked()) {\n visible_image.trigger('open.fndtn.clearing');\n // set the image to the selected thumbnail\n loaded = this.load($image);\n if (loaded.interchange) {\n image\n .attr('data-interchange', loaded.interchange)\n .foundation('interchange', 'reflow');\n } else {\n image\n .attr('src', loaded.src)\n .attr('data-interchange', '');\n }\n image.css('visibility', 'hidden');\n\n startLoad.call(this);\n }\n },\n\n close : function (e, el) {\n e.preventDefault();\n\n var root = (function (target) {\n if (/blackout/.test(target.selector)) {\n return target;\n } else {\n return target.closest('.clearing-blackout');\n }\n }($(el))),\n body = $(document.body), container, visible_image;\n\n if (el === e.target && root) {\n body.css('overflow', '');\n container = $('div', root).first();\n visible_image = $('.visible-img', container);\n visible_image.trigger('close.fndtn.clearing');\n this.settings.prev_index = 0;\n $('ul[' + this.attr_name() + ']', root)\n .attr('style', '').closest('.clearing-blackout')\n .removeClass('clearing-blackout');\n container.removeClass('clearing-container');\n visible_image.hide();\n visible_image.trigger('closed.fndtn.clearing');\n }\n\n // Event to re-enable scrolling on touch devices\n $('body').off('touchmove');\n\n return false;\n },\n\n is_open : function (current) {\n return current.parent().prop('style').length > 0;\n },\n\n keydown : function (e) {\n var clearing = $('.clearing-blackout ul[' + this.attr_name() + ']'),\n NEXT_KEY = this.rtl ? 37 : 39,\n PREV_KEY = this.rtl ? 39 : 37,\n ESC_KEY = 27;\n\n if (e.which === NEXT_KEY) {\n this.go(clearing, 'next');\n }\n if (e.which === PREV_KEY) {\n this.go(clearing, 'prev');\n }\n if (e.which === ESC_KEY) {\n this.S('a.clearing-close').trigger('click.fndtn.clearing');\n }\n },\n\n nav : function (e, direction) {\n var clearing = $('ul[' + this.attr_name() + ']', '.clearing-blackout');\n\n e.preventDefault();\n this.go(clearing, direction);\n },\n\n resize : function () {\n var image = $('img', '.clearing-blackout .visible-img'),\n label = $('.clearing-touch-label', '.clearing-blackout');\n\n if (image.length) {\n this.center_and_label(image, label);\n image.trigger('resized.fndtn.clearing')\n }\n },\n\n // visual adjustments\n fix_height : function (target) {\n var lis = target.parent().children(),\n self = this;\n\n lis.each(function () {\n var li = self.S(this),\n image = li.find('img');\n\n if (li.height() > image.outerHeight()) {\n li.addClass('fix-height');\n }\n })\n .closest('ul')\n .width(lis.length * 100 + '%');\n\n return this;\n },\n\n update_paddles : function (target) {\n target = target.closest('li');\n var visible_image = target\n .closest('.carousel')\n .siblings('.visible-img');\n\n if (target.next().length > 0) {\n this.S('.clearing-main-next', visible_image).removeClass('disabled');\n } else {\n this.S('.clearing-main-next', visible_image).addClass('disabled');\n }\n\n if (target.prev().length > 0) {\n this.S('.clearing-main-prev', visible_image).removeClass('disabled');\n } else {\n this.S('.clearing-main-prev', visible_image).addClass('disabled');\n }\n },\n\n center_and_label : function (target, label) {\n if (!this.rtl && label.length > 0) {\n label.css({\n marginLeft : -(label.outerWidth() / 2),\n marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10\n });\n } else {\n label.css({\n marginRight : -(label.outerWidth() / 2),\n marginTop : -(target.outerHeight() / 2)-label.outerHeight()-10,\n left: 'auto',\n right: '50%'\n });\n }\n return this;\n },\n\n // image loading and preloading\n\n load : function ($image) {\n var href,\n interchange,\n closest_a;\n\n if ($image[0].nodeName === 'A') {\n href = $image.attr('href');\n interchange = $image.data('clearing-interchange');\n } else {\n closest_a = $image.closest('a');\n href = closest_a.attr('href');\n interchange = closest_a.data('clearing-interchange');\n }\n\n this.preload($image);\n\n return {\n 'src': href ? href : $image.attr('src'),\n 'interchange': href ? interchange : $image.data('clearing-interchange')\n }\n },\n\n preload : function ($image) {\n this\n .img($image.closest('li').next(), 'next')\n .img($image.closest('li').prev(), 'prev');\n },\n\n img : function (img, sibling_type) {\n if (img.length) {\n var preload_img = $('.clearing-preload-' + sibling_type),\n new_a = this.S('a', img),\n src,\n interchange,\n image;\n\n if (new_a.length) {\n src = new_a.attr('href');\n interchange = new_a.data('clearing-interchange');\n } else {\n image = this.S('img', img);\n src = image.attr('src');\n interchange = image.data('clearing-interchange');\n }\n\n if (interchange) {\n preload_img.attr('data-interchange', interchange);\n } else {\n preload_img.attr('src', src);\n preload_img.attr('data-interchange', '');\n }\n }\n return this;\n },\n\n // image caption\n\n caption : function (container, $image) {\n var caption = $image.attr('data-caption');\n\n if (caption) {\n \tvar containerPlain = container.get(0);\n \tcontainerPlain.innerHTML = caption;\n container.show();\n } else {\n container\n .text('')\n .hide();\n }\n return this;\n },\n\n // directional methods\n\n go : function ($ul, direction) {\n var current = this.S('.visible', $ul),\n target = current[direction]();\n\n // Check for skip selector.\n if (this.settings.skip_selector && target.find(this.settings.skip_selector).length != 0) {\n target = target[direction]();\n }\n\n if (target.length) {\n this.S('img', target)\n .trigger('click.fndtn.clearing', [current, target])\n .trigger('change.fndtn.clearing');\n }\n },\n\n shift : function (current, target, callback) {\n var clearing = target.parent(),\n old_index = this.settings.prev_index || target.index(),\n direction = this.direction(clearing, current, target),\n dir = this.rtl ? 'right' : 'left',\n left = parseInt(clearing.css('left'), 10),\n width = target.outerWidth(),\n skip_shift;\n\n var dir_obj = {};\n\n // we use jQuery animate instead of CSS transitions because we\n // need a callback to unlock the next animation\n // needs support for RTL **\n if (target.index() !== old_index && !/skip/.test(direction)) {\n if (/left/.test(direction)) {\n this.lock();\n dir_obj[dir] = left + width;\n clearing.animate(dir_obj, 300, this.unlock());\n } else if (/right/.test(direction)) {\n this.lock();\n dir_obj[dir] = left - width;\n clearing.animate(dir_obj, 300, this.unlock());\n }\n } else if (/skip/.test(direction)) {\n // the target image is not adjacent to the current image, so\n // do we scroll right or not\n skip_shift = target.index() - this.settings.up_count;\n this.lock();\n\n if (skip_shift > 0) {\n dir_obj[dir] = -(skip_shift * width);\n clearing.animate(dir_obj, 300, this.unlock());\n } else {\n dir_obj[dir] = 0;\n clearing.animate(dir_obj, 300, this.unlock());\n }\n }\n\n callback();\n },\n\n direction : function ($el, current, target) {\n var lis = this.S('li', $el),\n li_width = lis.outerWidth() + (lis.outerWidth() / 4),\n up_count = Math.floor(this.S('.clearing-container').outerWidth() / li_width) - 1,\n target_index = lis.index(target),\n response;\n\n this.settings.up_count = up_count;\n\n if (this.adjacent(this.settings.prev_index, target_index)) {\n if ((target_index > up_count) && target_index > this.settings.prev_index) {\n response = 'right';\n } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) {\n response = 'left';\n } else {\n response = false;\n }\n } else {\n response = 'skip';\n }\n\n this.settings.prev_index = target_index;\n\n return response;\n },\n\n adjacent : function (current_index, target_index) {\n for (var i = target_index + 1; i >= target_index - 1; i--) {\n if (i === current_index) {\n return true;\n }\n }\n return false;\n },\n\n // lock management\n\n lock : function () {\n this.settings.locked = true;\n },\n\n unlock : function () {\n this.settings.locked = false;\n },\n\n locked : function () {\n return this.settings.locked;\n },\n\n off : function () {\n this.S(this.scope).off('.fndtn.clearing');\n this.S(window).off('.fndtn.clearing');\n },\n\n reflow : function () {\n this.init();\n }\n };\n\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.dropdown = {\n name : 'dropdown',\n\n version : '5.5.3',\n\n settings : {\n active_class : 'open',\n disabled_class : 'disabled',\n mega_class : 'mega',\n align : 'bottom',\n is_hover : false,\n hover_timeout : 150,\n opened : function () {},\n closed : function () {}\n },\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'throttle');\n\n $.extend(true, this.settings, method, options);\n this.bindings(method, options);\n },\n\n events : function (scope) {\n var self = this,\n S = self.S;\n\n S(this.scope)\n .off('.dropdown')\n .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) {\n var settings = S(this).data(self.attr_name(true) + '-init') || self.settings;\n if (!settings.is_hover || Modernizr.touch) {\n e.preventDefault();\n if (S(this).parent('[data-reveal-id]').length) {\n e.stopPropagation();\n }\n self.toggle($(this));\n }\n })\n .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {\n var $this = S(this),\n dropdown,\n target;\n\n clearTimeout(self.timeout);\n\n if ($this.data(self.data_attr())) {\n dropdown = S('#' + $this.data(self.data_attr()));\n target = $this;\n } else {\n dropdown = $this;\n target = S('[' + self.attr_name() + '=\"' + dropdown.attr('id') + '\"]');\n }\n\n var settings = target.data(self.attr_name(true) + '-init') || self.settings;\n\n if (S(e.currentTarget).data(self.data_attr()) && settings.is_hover) {\n self.closeall.call(self);\n }\n\n if (settings.is_hover) {\n self.open.apply(self, [dropdown, target]);\n }\n })\n .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {\n var $this = S(this);\n var settings;\n\n if ($this.data(self.data_attr())) {\n settings = $this.data(self.data_attr(true) + '-init') || self.settings;\n } else {\n var target = S('[' + self.attr_name() + '=\"' + S(this).attr('id') + '\"]'),\n settings = target.data(self.attr_name(true) + '-init') || self.settings;\n }\n\n self.timeout = setTimeout(function () {\n if ($this.data(self.data_attr())) {\n if (settings.is_hover) {\n self.close.call(self, S('#' + $this.data(self.data_attr())));\n }\n } else {\n if (settings.is_hover) {\n self.close.call(self, $this);\n }\n }\n }.bind(this), settings.hover_timeout);\n })\n .on('click.fndtn.dropdown', function (e) {\n var parent = S(e.target).closest('[' + self.attr_name() + '-content]');\n var links = parent.find('a');\n\n if (links.length > 0 && parent.attr('aria-autoclose') !== 'false') {\n self.close.call(self, S('[' + self.attr_name() + '-content]'));\n }\n\n if (e.target !== document && !$.contains(document.documentElement, e.target)) {\n return;\n }\n\n if (S(e.target).closest('[' + self.attr_name() + ']').length > 0) {\n return;\n }\n\n if (!(S(e.target).data('revealId')) &&\n (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') ||\n $.contains(parent.first()[0], e.target)))) {\n e.stopPropagation();\n return;\n }\n\n self.close.call(self, S('[' + self.attr_name() + '-content]'));\n })\n .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {\n self.settings.opened.call(this);\n })\n .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {\n self.settings.closed.call(this);\n });\n\n S(window)\n .off('.dropdown')\n .on('resize.fndtn.dropdown', self.throttle(function () {\n self.resize.call(self);\n }, 50));\n\n this.resize();\n },\n\n close : function (dropdown) {\n var self = this;\n dropdown.each(function (idx) {\n var original_target = $('[' + self.attr_name() + '=' + dropdown[idx].id + ']') || $('aria-controls=' + dropdown[idx].id + ']');\n original_target.attr('aria-expanded', 'false');\n if (self.S(this).hasClass(self.settings.active_class)) {\n self.S(this)\n .css(Foundation.rtl ? 'right' : 'left', '-99999px')\n .attr('aria-hidden', 'true')\n .removeClass(self.settings.active_class)\n .prev('[' + self.attr_name() + ']')\n .removeClass(self.settings.active_class)\n .removeData('target');\n\n self.S(this).trigger('closed.fndtn.dropdown', [dropdown]);\n }\n });\n dropdown.removeClass('f-open-' + this.attr_name(true));\n },\n\n closeall : function () {\n var self = this;\n $.each(self.S('.f-open-' + this.attr_name(true)), function () {\n self.close.call(self, self.S(this));\n });\n },\n\n open : function (dropdown, target) {\n this\n .css(dropdown\n .addClass(this.settings.active_class), target);\n dropdown.prev('[' + this.attr_name() + ']').addClass(this.settings.active_class);\n dropdown.data('target', target.get(0)).trigger('opened.fndtn.dropdown', [dropdown, target]);\n dropdown.attr('aria-hidden', 'false');\n target.attr('aria-expanded', 'true');\n dropdown.focus();\n dropdown.addClass('f-open-' + this.attr_name(true));\n },\n\n data_attr : function () {\n if (this.namespace.length > 0) {\n return this.namespace + '-' + this.name;\n }\n\n return this.name;\n },\n\n toggle : function (target) {\n if (target.hasClass(this.settings.disabled_class)) {\n return;\n }\n var dropdown = this.S('#' + target.data(this.data_attr()));\n if (dropdown.length === 0) {\n // No dropdown found, not continuing\n return;\n }\n\n this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown));\n\n if (dropdown.hasClass(this.settings.active_class)) {\n this.close.call(this, dropdown);\n if (dropdown.data('target') !== target.get(0)) {\n this.open.call(this, dropdown, target);\n }\n } else {\n this.open.call(this, dropdown, target);\n }\n },\n\n resize : function () {\n var dropdown = this.S('[' + this.attr_name() + '-content].open');\n var target = $(dropdown.data(\"target\"));\n\n if (dropdown.length && target.length) {\n this.css(dropdown, target);\n }\n },\n\n css : function (dropdown, target) {\n var left_offset = Math.max((target.width() - dropdown.width()) / 2, 8),\n settings = target.data(this.attr_name(true) + '-init') || this.settings,\n parentOverflow = dropdown.parent().css('overflow-y') || dropdown.parent().css('overflow');\n\n this.clear_idx();\n\n\n\n if (this.small()) {\n var p = this.dirs.bottom.call(dropdown, target, settings);\n\n dropdown.attr('style', '').removeClass('drop-left drop-right drop-top').css({\n position : 'absolute',\n width : '95%',\n 'max-width' : 'none',\n top : p.top\n });\n\n dropdown.css(Foundation.rtl ? 'right' : 'left', left_offset);\n }\n // detect if dropdown is in an overflow container\n else if (parentOverflow !== 'visible') {\n var offset = target[0].offsetTop + target[0].offsetHeight;\n\n dropdown.attr('style', '').css({\n position : 'absolute',\n top : offset\n });\n\n dropdown.css(Foundation.rtl ? 'right' : 'left', left_offset);\n }\n else {\n\n this.style(dropdown, target, settings);\n }\n\n return dropdown;\n },\n\n style : function (dropdown, target, settings) {\n var css = $.extend({position : 'absolute'},\n this.dirs[settings.align].call(dropdown, target, settings));\n\n dropdown.attr('style', '').css(css);\n },\n\n // return CSS property object\n // `this` is the dropdown\n dirs : {\n // Calculate target offset\n _base : function (t, s) {\n var o_p = this.offsetParent(),\n o = o_p.offset(),\n p = t.offset();\n\n p.top -= o.top;\n p.left -= o.left;\n\n //set some flags on the p object to pass along\n p.missRight = false;\n p.missTop = false;\n p.missLeft = false;\n p.leftRightFlag = false;\n\n //lets see if the panel will be off the screen\n //get the actual width of the page and store it\n var actualBodyWidth;\n var windowWidth = window.innerWidth;\n \n if (document.getElementsByClassName('row')[0]) {\n actualBodyWidth = document.getElementsByClassName('row')[0].clientWidth;\n } else {\n actualBodyWidth = windowWidth;\n }\n\n var actualMarginWidth = (windowWidth - actualBodyWidth) / 2;\n var actualBoundary = actualBodyWidth;\n\n if (!this.hasClass('mega') && !s.ignore_repositioning) {\n var outerWidth = this.outerWidth();\n var o_left = t.offset().left;\n\t\t \n //miss top\n if (t.offset().top <= this.outerHeight()) {\n p.missTop = true;\n actualBoundary = windowWidth - actualMarginWidth;\n p.leftRightFlag = true;\n }\n\n //miss right\n if (o_left + outerWidth > o_left + actualMarginWidth && o_left - actualMarginWidth > outerWidth) {\n p.missRight = true;\n p.missLeft = false;\n }\n\n //miss left\n if (o_left - outerWidth <= 0) {\n p.missLeft = true;\n p.missRight = false;\n }\n }\n\n return p;\n },\n\n top : function (t, s) {\n var self = Foundation.libs.dropdown,\n p = self.dirs._base.call(this, t, s);\n\n this.addClass('drop-top');\n\n if (p.missTop == true) {\n p.top = p.top + t.outerHeight() + this.outerHeight();\n this.removeClass('drop-top');\n }\n\n if (p.missRight == true) {\n p.left = p.left - this.outerWidth() + t.outerWidth();\n }\n\n if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {\n self.adjust_pip(this, t, s, p);\n }\n\n if (Foundation.rtl) {\n return {left : p.left - this.outerWidth() + t.outerWidth(),\n top : p.top - this.outerHeight()};\n }\n\n return {left : p.left, top : p.top - this.outerHeight()};\n },\n\n bottom : function (t, s) {\n var self = Foundation.libs.dropdown,\n p = self.dirs._base.call(this, t, s);\n\n if (p.missRight == true) {\n p.left = p.left - this.outerWidth() + t.outerWidth();\n }\n\n if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {\n self.adjust_pip(this, t, s, p);\n }\n\n if (self.rtl) {\n return {left : p.left - this.outerWidth() + t.outerWidth(), top : p.top + t.outerHeight()};\n }\n\n return {left : p.left, top : p.top + t.outerHeight()};\n },\n\n left : function (t, s) {\n var p = Foundation.libs.dropdown.dirs._base.call(this, t, s);\n\n this.addClass('drop-left');\n\n if (p.missLeft == true) {\n p.left = p.left + this.outerWidth();\n p.top = p.top + t.outerHeight();\n this.removeClass('drop-left');\n }\n\n return {left : p.left - this.outerWidth(), top : p.top};\n },\n\n right : function (t, s) {\n var p = Foundation.libs.dropdown.dirs._base.call(this, t, s);\n\n this.addClass('drop-right');\n\n if (p.missRight == true) {\n p.left = p.left - this.outerWidth();\n p.top = p.top + t.outerHeight();\n this.removeClass('drop-right');\n } else {\n p.triggeredRight = true;\n }\n\n var self = Foundation.libs.dropdown;\n\n if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) {\n self.adjust_pip(this, t, s, p);\n }\n\n return {left : p.left + t.outerWidth(), top : p.top};\n }\n },\n\n // Insert rule to style psuedo elements\n adjust_pip : function (dropdown, target, settings, position) {\n var sheet = Foundation.stylesheet,\n pip_offset_base = 8;\n\n if (dropdown.hasClass(settings.mega_class)) {\n pip_offset_base = position.left + (target.outerWidth() / 2) - 8;\n } else if (this.small()) {\n pip_offset_base += position.left - 8;\n }\n\n this.rule_idx = sheet.cssRules.length;\n\n //default\n var sel_before = '.f-dropdown.open:before',\n sel_after = '.f-dropdown.open:after',\n css_before = 'left: ' + pip_offset_base + 'px;',\n css_after = 'left: ' + (pip_offset_base - 1) + 'px;';\n\n if (position.missRight == true) {\n pip_offset_base = dropdown.outerWidth() - 23;\n sel_before = '.f-dropdown.open:before',\n sel_after = '.f-dropdown.open:after',\n css_before = 'left: ' + pip_offset_base + 'px;',\n css_after = 'left: ' + (pip_offset_base - 1) + 'px;';\n }\n\n //just a case where right is fired, but its not missing right\n if (position.triggeredRight == true) {\n sel_before = '.f-dropdown.open:before',\n sel_after = '.f-dropdown.open:after',\n css_before = 'left:-12px;',\n css_after = 'left:-14px;';\n }\n\n if (sheet.insertRule) {\n sheet.insertRule([sel_before, '{', css_before, '}'].join(' '), this.rule_idx);\n sheet.insertRule([sel_after, '{', css_after, '}'].join(' '), this.rule_idx + 1);\n } else {\n sheet.addRule(sel_before, css_before, this.rule_idx);\n sheet.addRule(sel_after, css_after, this.rule_idx + 1);\n }\n },\n\n // Remove old dropdown rule index\n clear_idx : function () {\n var sheet = Foundation.stylesheet;\n\n if (typeof this.rule_idx !== 'undefined') {\n sheet.deleteRule(this.rule_idx);\n sheet.deleteRule(this.rule_idx);\n delete this.rule_idx;\n }\n },\n\n small : function () {\n return matchMedia(Foundation.media_queries.small).matches &&\n !matchMedia(Foundation.media_queries.medium).matches;\n },\n\n off : function () {\n this.S(this.scope).off('.fndtn.dropdown');\n this.S('html, body').off('.fndtn.dropdown');\n this.S(window).off('.fndtn.dropdown');\n this.S('[data-dropdown-content]').off('.fndtn.dropdown');\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.equalizer = {\n name : 'equalizer',\n\n version : '5.5.3',\n\n settings : {\n use_tallest : true,\n before_height_change : $.noop,\n after_height_change : $.noop,\n equalize_on_stack : false,\n act_on_hidden_el: false\n },\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'image_loaded');\n this.bindings(method, options);\n this.reflow();\n },\n\n events : function () {\n this.S(window).off('.equalizer').on('resize.fndtn.equalizer', function (e) {\n this.reflow();\n }.bind(this));\n },\n\n equalize : function (equalizer) {\n var isStacked = false,\n group = equalizer.data('equalizer'),\n settings = equalizer.data(this.attr_name(true)+'-init') || this.settings,\n vals,\n firstTopOffset;\n\n if (settings.act_on_hidden_el) {\n vals = group ? equalizer.find('['+this.attr_name()+'-watch=\"'+group+'\"]') : equalizer.find('['+this.attr_name()+'-watch]');\n }\n else {\n vals = group ? equalizer.find('['+this.attr_name()+'-watch=\"'+group+'\"]:visible') : equalizer.find('['+this.attr_name()+'-watch]:visible');\n }\n \n if (vals.length === 0) {\n return;\n }\n\n settings.before_height_change();\n equalizer.trigger('before-height-change.fndth.equalizer');\n vals.height('inherit');\n\n if (settings.equalize_on_stack === false) {\n firstTopOffset = vals.first().offset().top;\n vals.each(function () {\n if ($(this).offset().top !== firstTopOffset) {\n isStacked = true;\n return false;\n }\n });\n if (isStacked) {\n return;\n }\n }\n\n var heights = vals.map(function () { return $(this).outerHeight(false) }).get();\n\n if (settings.use_tallest) {\n var max = Math.max.apply(null, heights);\n vals.css('height', max);\n } else {\n var min = Math.min.apply(null, heights);\n vals.css('height', min);\n }\n\n settings.after_height_change();\n equalizer.trigger('after-height-change.fndtn.equalizer');\n },\n\n reflow : function () {\n var self = this;\n\n this.S('[' + this.attr_name() + ']', this.scope).each(function () {\n var $eq_target = $(this),\n media_query = $eq_target.data('equalizer-mq'),\n ignore_media_query = true;\n\n if (media_query) {\n media_query = 'is_' + media_query.replace(/-/g, '_');\n if (Foundation.utils.hasOwnProperty(media_query)) {\n ignore_media_query = false;\n }\n }\n\n self.image_loaded(self.S('img', this), function () {\n if (ignore_media_query || Foundation.utils[media_query]()) {\n self.equalize($eq_target)\n } else {\n var vals = $eq_target.find('[' + self.attr_name() + '-watch]:visible');\n vals.css('height', 'auto');\n }\n });\n });\n }\n };\n})(jQuery, window, window.document);\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.interchange = {\n name : 'interchange',\n\n version : '5.5.3',\n\n cache : {},\n\n images_loaded : false,\n nodes_loaded : false,\n\n settings : {\n load_attr : 'interchange',\n\n named_queries : {\n 'default' : 'only screen',\n 'small' : Foundation.media_queries['small'],\n 'small-only' : Foundation.media_queries['small-only'],\n 'medium' : Foundation.media_queries['medium'],\n 'medium-only' : Foundation.media_queries['medium-only'],\n 'large' : Foundation.media_queries['large'],\n 'large-only' : Foundation.media_queries['large-only'],\n 'xlarge' : Foundation.media_queries['xlarge'],\n 'xlarge-only' : Foundation.media_queries['xlarge-only'],\n 'xxlarge' : Foundation.media_queries['xxlarge'],\n 'landscape' : 'only screen and (orientation: landscape)',\n 'portrait' : 'only screen and (orientation: portrait)',\n 'retina' : 'only screen and (-webkit-min-device-pixel-ratio: 2),' +\n 'only screen and (min--moz-device-pixel-ratio: 2),' +\n 'only screen and (-o-min-device-pixel-ratio: 2/1),' +\n 'only screen and (min-device-pixel-ratio: 2),' +\n 'only screen and (min-resolution: 192dpi),' +\n 'only screen and (min-resolution: 2dppx)'\n },\n\n directives : {\n replace : function (el, path, trigger) {\n // The trigger argument, if called within the directive, fires\n // an event named after the directive on the element, passing\n // any parameters along to the event that you pass to trigger.\n //\n // ex. trigger(), trigger([a, b, c]), or trigger(a, b, c)\n //\n // This allows you to bind a callback like so:\n // $('#interchangeContainer').on('replace', function (e, a, b, c) {\n // console.log($(this).html(), a, b, c);\n // });\n\n if (el !== null && /IMG/.test(el[0].nodeName)) {\n var orig_path = $.each(el, function(){this.src = path;});\n // var orig_path = el[0].src;\n\n if (new RegExp(path, 'i').test(orig_path)) {\n return;\n }\n\n el.attr(\"src\", path);\n\n return trigger(el[0].src);\n }\n var last_path = el.data(this.data_attr + '-last-path'),\n self = this;\n\n if (last_path == path) {\n return;\n }\n\n if (/\\.(gif|jpg|jpeg|tiff|png)([?#].*)?/i.test(path)) {\n $(el).css('background-image', 'url(' + path + ')');\n el.data('interchange-last-path', path);\n return trigger(path);\n }\n\n return $.get(path, function (response) {\n el.html(response);\n el.data(self.data_attr + '-last-path', path);\n trigger();\n });\n\n }\n }\n },\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'throttle random_str');\n\n this.data_attr = this.set_data_attr();\n $.extend(true, this.settings, method, options);\n this.bindings(method, options);\n this.reflow();\n },\n\n get_media_hash : function () {\n var mediaHash = '';\n for (var queryName in this.settings.named_queries ) {\n mediaHash += matchMedia(this.settings.named_queries[queryName]).matches.toString();\n }\n return mediaHash;\n },\n\n events : function () {\n var self = this, prevMediaHash;\n\n $(window)\n .off('.interchange')\n .on('resize.fndtn.interchange', self.throttle(function () {\n var currMediaHash = self.get_media_hash();\n if (currMediaHash !== prevMediaHash) {\n self.resize();\n }\n prevMediaHash = currMediaHash;\n }, 50));\n\n return this;\n },\n\n resize : function () {\n var cache = this.cache;\n\n if (!this.images_loaded || !this.nodes_loaded) {\n setTimeout($.proxy(this.resize, this), 50);\n return;\n }\n\n for (var uuid in cache) {\n if (cache.hasOwnProperty(uuid)) {\n var passed = this.results(uuid, cache[uuid]);\n if (passed) {\n this.settings.directives[passed\n .scenario[1]].call(this, passed.el, passed.scenario[0], (function (passed) {\n if (arguments[0] instanceof Array) {\n var args = arguments[0];\n } else {\n var args = Array.prototype.slice.call(arguments, 0);\n }\n\n return function() {\n passed.el.trigger(passed.scenario[1], args);\n }\n }(passed)));\n }\n }\n }\n\n },\n\n results : function (uuid, scenarios) {\n var count = scenarios.length;\n\n if (count > 0) {\n var el = this.S('[' + this.add_namespace('data-uuid') + '=\"' + uuid + '\"]');\n\n while (count--) {\n var mq, rule = scenarios[count][2];\n if (this.settings.named_queries.hasOwnProperty(rule)) {\n mq = matchMedia(this.settings.named_queries[rule]);\n } else {\n mq = matchMedia(rule);\n }\n if (mq.matches) {\n return {el : el, scenario : scenarios[count]};\n }\n }\n }\n\n return false;\n },\n\n load : function (type, force_update) {\n if (typeof this['cached_' + type] === 'undefined' || force_update) {\n this['update_' + type]();\n }\n\n return this['cached_' + type];\n },\n\n update_images : function () {\n var images = this.S('img[' + this.data_attr + ']'),\n count = images.length,\n i = count,\n loaded_count = 0,\n data_attr = this.data_attr;\n\n this.cache = {};\n this.cached_images = [];\n this.images_loaded = (count === 0);\n\n while (i--) {\n loaded_count++;\n if (images[i]) {\n var str = images[i].getAttribute(data_attr) || '';\n\n if (str.length > 0) {\n this.cached_images.push(images[i]);\n }\n }\n\n if (loaded_count === count) {\n this.images_loaded = true;\n this.enhance('images');\n }\n }\n\n return this;\n },\n\n update_nodes : function () {\n var nodes = this.S('[' + this.data_attr + ']').not('img'),\n count = nodes.length,\n i = count,\n loaded_count = 0,\n data_attr = this.data_attr;\n\n this.cached_nodes = [];\n this.nodes_loaded = (count === 0);\n\n while (i--) {\n loaded_count++;\n var str = nodes[i].getAttribute(data_attr) || '';\n\n if (str.length > 0) {\n this.cached_nodes.push(nodes[i]);\n }\n\n if (loaded_count === count) {\n this.nodes_loaded = true;\n this.enhance('nodes');\n }\n }\n\n return this;\n },\n\n enhance : function (type) {\n var i = this['cached_' + type].length;\n\n while (i--) {\n this.object($(this['cached_' + type][i]));\n }\n\n return $(window).trigger('resize.fndtn.interchange');\n },\n\n convert_directive : function (directive) {\n\n var trimmed = this.trim(directive);\n\n if (trimmed.length > 0) {\n return trimmed;\n }\n\n return 'replace';\n },\n\n parse_scenario : function (scenario) {\n // This logic had to be made more complex since some users were using commas in the url path\n // So we cannot simply just split on a comma\n\n var directive_match = scenario[0].match(/(.+),\\s*(\\w+)\\s*$/),\n // getting the mq has gotten a bit complicated since we started accounting for several use cases\n // of URLs. For now we'll continue to match these scenarios, but we may consider having these scenarios\n // as nested objects or arrays in F6.\n // regex: match everything before close parenthesis for mq\n media_query = scenario[1].match(/(.*)\\)/);\n\n if (directive_match) {\n var path = directive_match[1],\n directive = directive_match[2];\n\n } else {\n var cached_split = scenario[0].split(/,\\s*$/),\n path = cached_split[0],\n directive = '';\n }\n\n return [this.trim(path), this.convert_directive(directive), this.trim(media_query[1])];\n },\n\n object : function (el) {\n var raw_arr = this.parse_data_attr(el),\n scenarios = [],\n i = raw_arr.length;\n\n if (i > 0) {\n while (i--) {\n // split array between comma delimited content and mq\n // regex: comma, optional space, open parenthesis\n var scenario = raw_arr[i].split(/,\\s?\\(/);\n\n if (scenario.length > 1) {\n var params = this.parse_scenario(scenario);\n scenarios.push(params);\n }\n }\n }\n\n return this.store(el, scenarios);\n },\n\n store : function (el, scenarios) {\n var uuid = this.random_str(),\n current_uuid = el.data(this.add_namespace('uuid', true));\n\n if (this.cache[current_uuid]) {\n return this.cache[current_uuid];\n }\n\n el.attr(this.add_namespace('data-uuid'), uuid);\n return this.cache[uuid] = scenarios;\n },\n\n trim : function (str) {\n\n if (typeof str === 'string') {\n return $.trim(str);\n }\n\n return str;\n },\n\n set_data_attr : function (init) {\n if (init) {\n if (this.namespace.length > 0) {\n return this.namespace + '-' + this.settings.load_attr;\n }\n\n return this.settings.load_attr;\n }\n\n if (this.namespace.length > 0) {\n return 'data-' + this.namespace + '-' + this.settings.load_attr;\n }\n\n return 'data-' + this.settings.load_attr;\n },\n\n parse_data_attr : function (el) {\n var raw = el.attr(this.attr_name()).split(/\\[(.*?)\\]/),\n i = raw.length,\n output = [];\n\n while (i--) {\n if (raw[i].replace(/[\\W\\d]+/, '').length > 4) {\n output.push(raw[i]);\n }\n }\n\n return output;\n },\n\n reflow : function () {\n this.load('images', true);\n this.load('nodes', true);\n }\n\n };\n\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n var Modernizr = Modernizr || false;\n\n Foundation.libs.joyride = {\n name : 'joyride',\n\n version : '5.5.3',\n\n defaults : {\n expose : false, // turn on or off the expose feature\n modal : true, // Whether to cover page with modal during the tour\n keyboard : true, // enable left, right and esc keystrokes\n tip_location : 'bottom', // 'top', 'bottom', 'left' or 'right' in relation to parent\n nub_position : 'auto', // override on a per tooltip bases\n scroll_speed : 1500, // Page scrolling speed in milliseconds, 0 = no scroll animation\n scroll_animation : 'linear', // supports 'swing' and 'linear', extend with jQuery UI.\n timer : 0, // 0 = no timer , all other numbers = timer in milliseconds\n start_timer_on_click : true, // true or false - true requires clicking the first button start the timer\n start_offset : 0, // the index of the tooltip you want to start on (index of the li)\n next_button : true, // true or false to control whether a next button is used\n prev_button : true, // true or false to control whether a prev button is used\n tip_animation : 'fade', // 'pop' or 'fade' in each tip\n pause_after : [], // array of indexes where to pause the tour after\n exposed : [], // array of expose elements\n tip_animation_fade_speed : 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition\n cookie_monster : false, // true or false to control whether cookies are used\n cookie_name : 'joyride', // Name the cookie you'll use\n cookie_domain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com'\n cookie_expires : 365, // set when you would like the cookie to expire.\n tip_container : 'body', // Where will the tip be attached\n abort_on_close : true, // When true, the close event will not fire any callback\n tip_location_patterns : {\n top : ['bottom'],\n bottom : [], // bottom should not need to be repositioned\n left : ['right', 'top', 'bottom'],\n right : ['left', 'top', 'bottom']\n },\n post_ride_callback : function () {}, // A method to call once the tour closes (canceled or complete)\n post_step_callback : function () {}, // A method to call after each step\n pre_step_callback : function () {}, // A method to call before each step\n pre_ride_callback : function () {}, // A method to call before the tour starts (passed index, tip, and cloned exposed element)\n post_expose_callback : function () {}, // A method to call after an element has been exposed\n template : { // HTML segments for tip layout\n link : '×',\n timer : '
',\n tip : '
',\n wrapper : '
',\n button : '',\n prev_button : '',\n modal : '
',\n expose : '
',\n expose_cover : '
'\n },\n expose_add_class : '' // One or more space-separated class names to be added to exposed element\n },\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'throttle random_str');\n\n this.settings = this.settings || $.extend({}, this.defaults, (options || method));\n\n this.bindings(method, options)\n },\n\n go_next : function () {\n if (this.settings.$li.next().length < 1) {\n this.end();\n } else if (this.settings.timer > 0) {\n clearTimeout(this.settings.automate);\n this.hide();\n this.show();\n this.startTimer();\n } else {\n this.hide();\n this.show();\n }\n },\n\n go_prev : function () {\n if (this.settings.$li.prev().length < 1) {\n // Do nothing if there are no prev element\n } else if (this.settings.timer > 0) {\n clearTimeout(this.settings.automate);\n this.hide();\n this.show(null, true);\n this.startTimer();\n } else {\n this.hide();\n this.show(null, true);\n }\n },\n\n events : function () {\n var self = this;\n\n $(this.scope)\n .off('.joyride')\n .on('click.fndtn.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) {\n e.preventDefault();\n this.go_next()\n }.bind(this))\n .on('click.fndtn.joyride', '.joyride-prev-tip', function (e) {\n e.preventDefault();\n this.go_prev();\n }.bind(this))\n\n .on('click.fndtn.joyride', '.joyride-close-tip', function (e) {\n e.preventDefault();\n this.end(this.settings.abort_on_close);\n }.bind(this))\n\n .on('keyup.fndtn.joyride', function (e) {\n // Don't do anything if keystrokes are disabled\n // or if the joyride is not being shown\n if (!this.settings.keyboard || !this.settings.riding) {\n return;\n }\n\n switch (e.which) {\n case 39: // right arrow\n e.preventDefault();\n this.go_next();\n break;\n case 37: // left arrow\n e.preventDefault();\n this.go_prev();\n break;\n case 27: // escape\n e.preventDefault();\n this.end(this.settings.abort_on_close);\n }\n }.bind(this));\n\n $(window)\n .off('.joyride')\n .on('resize.fndtn.joyride', self.throttle(function () {\n if ($('[' + self.attr_name() + ']').length > 0 && self.settings.$next_tip && self.settings.riding) {\n if (self.settings.exposed.length > 0) {\n var $els = $(self.settings.exposed);\n\n $els.each(function () {\n var $this = $(this);\n self.un_expose($this);\n self.expose($this);\n });\n }\n\n if (self.is_phone()) {\n self.pos_phone();\n } else {\n self.pos_default(false);\n }\n }\n }, 100));\n },\n\n start : function () {\n var self = this,\n $this = $('[' + this.attr_name() + ']', this.scope),\n integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'],\n int_settings_count = integer_settings.length;\n\n if (!$this.length > 0) {\n return;\n }\n\n if (!this.settings.init) {\n this.events();\n }\n\n this.settings = $this.data(this.attr_name(true) + '-init');\n\n // non configureable settings\n this.settings.$content_el = $this;\n this.settings.$body = $(this.settings.tip_container);\n this.settings.body_offset = $(this.settings.tip_container).position();\n this.settings.$tip_content = this.settings.$content_el.find('> li');\n this.settings.paused = false;\n this.settings.attempts = 0;\n this.settings.riding = true;\n\n // can we create cookies?\n if (typeof $.cookie !== 'function') {\n this.settings.cookie_monster = false;\n }\n\n // generate the tips and insert into dom.\n if (!this.settings.cookie_monster || this.settings.cookie_monster && !$.cookie(this.settings.cookie_name)) {\n this.settings.$tip_content.each(function (index) {\n var $this = $(this);\n this.settings = $.extend({}, self.defaults, self.data_options($this));\n\n // Make sure that settings parsed from data_options are integers where necessary\n var i = int_settings_count;\n while (i--) {\n self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10);\n }\n self.create({$li : $this, index : index});\n });\n\n // show first tip\n if (!this.settings.start_timer_on_click && this.settings.timer > 0) {\n this.show('init');\n this.startTimer();\n } else {\n this.show('init');\n }\n\n }\n },\n\n resume : function () {\n this.set_li();\n this.show();\n },\n\n tip_template : function (opts) {\n var $blank, content;\n\n opts.tip_class = opts.tip_class || '';\n\n $blank = $(this.settings.template.tip).addClass(opts.tip_class);\n content = $.trim($(opts.li).html()) +\n this.prev_button_text(opts.prev_button_text, opts.index) +\n this.button_text(opts.button_text) +\n this.settings.template.link +\n this.timer_instance(opts.index);\n\n $blank.append($(this.settings.template.wrapper));\n $blank.first().attr(this.add_namespace('data-index'), opts.index);\n $('.joyride-content-wrapper', $blank).append(content);\n\n return $blank[0];\n },\n\n timer_instance : function (index) {\n var txt;\n\n if ((index === 0 && this.settings.start_timer_on_click && this.settings.timer > 0) || this.settings.timer === 0) {\n txt = '';\n } else {\n txt = $(this.settings.template.timer)[0].outerHTML;\n }\n return txt;\n },\n\n button_text : function (txt) {\n if (this.settings.tip_settings.next_button) {\n txt = $.trim(txt) || 'Next';\n txt = $(this.settings.template.button).append(txt)[0].outerHTML;\n } else {\n txt = '';\n }\n return txt;\n },\n\n prev_button_text : function (txt, idx) {\n if (this.settings.tip_settings.prev_button) {\n txt = $.trim(txt) || 'Previous';\n\n // Add the disabled class to the button if it's the first element\n if (idx == 0) {\n txt = $(this.settings.template.prev_button).append(txt).addClass('disabled')[0].outerHTML;\n } else {\n txt = $(this.settings.template.prev_button).append(txt)[0].outerHTML;\n }\n } else {\n txt = '';\n }\n return txt;\n },\n\n create : function (opts) {\n this.settings.tip_settings = $.extend({}, this.settings, this.data_options(opts.$li));\n var buttonText = opts.$li.attr(this.add_namespace('data-button')) || opts.$li.attr(this.add_namespace('data-text')),\n prevButtonText = opts.$li.attr(this.add_namespace('data-button-prev')) || opts.$li.attr(this.add_namespace('data-prev-text')),\n tipClass = opts.$li.attr('class'),\n $tip_content = $(this.tip_template({\n tip_class : tipClass,\n index : opts.index,\n button_text : buttonText,\n prev_button_text : prevButtonText,\n li : opts.$li\n }));\n\n $(this.settings.tip_container).append($tip_content);\n },\n\n show : function (init, is_prev) {\n var $timer = null;\n\n // are we paused?\n if (this.settings.$li === undefined || ($.inArray(this.settings.$li.index(), this.settings.pause_after) === -1)) {\n\n // don't go to the next li if the tour was paused\n if (this.settings.paused) {\n this.settings.paused = false;\n } else {\n this.set_li(init, is_prev);\n }\n\n this.settings.attempts = 0;\n\n if (this.settings.$li.length && this.settings.$target.length > 0) {\n if (init) { //run when we first start\n this.settings.pre_ride_callback(this.settings.$li.index(), this.settings.$next_tip);\n if (this.settings.modal) {\n this.show_modal();\n }\n }\n\n this.settings.pre_step_callback(this.settings.$li.index(), this.settings.$next_tip);\n\n if (this.settings.modal && this.settings.expose) {\n this.expose();\n }\n\n this.settings.tip_settings = $.extend({}, this.settings, this.data_options(this.settings.$li));\n\n this.settings.timer = parseInt(this.settings.timer, 10);\n\n this.settings.tip_settings.tip_location_pattern = this.settings.tip_location_patterns[this.settings.tip_settings.tip_location];\n\n // scroll and hide bg if not modal and not expose\n if (!/body/i.test(this.settings.$target.selector) && !this.settings.expose) {\n var joyridemodalbg = $('.joyride-modal-bg');\n if (/pop/i.test(this.settings.tipAnimation)) {\n joyridemodalbg.hide();\n } else {\n joyridemodalbg.fadeOut(this.settings.tipAnimationFadeSpeed);\n }\n this.scroll_to();\n }\n\n if (this.is_phone()) {\n this.pos_phone(true);\n } else {\n this.pos_default(true);\n }\n\n $timer = this.settings.$next_tip.find('.joyride-timer-indicator');\n\n if (/pop/i.test(this.settings.tip_animation)) {\n\n $timer.width(0);\n\n if (this.settings.timer > 0) {\n\n this.settings.$next_tip.show();\n\n setTimeout(function () {\n $timer.animate({\n width : $timer.parent().width()\n }, this.settings.timer, 'linear');\n }.bind(this), this.settings.tip_animation_fade_speed);\n\n } else {\n this.settings.$next_tip.show();\n\n }\n\n } else if (/fade/i.test(this.settings.tip_animation)) {\n\n $timer.width(0);\n\n if (this.settings.timer > 0) {\n\n this.settings.$next_tip\n .fadeIn(this.settings.tip_animation_fade_speed)\n .show();\n\n setTimeout(function () {\n $timer.animate({\n width : $timer.parent().width()\n }, this.settings.timer, 'linear');\n }.bind(this), this.settings.tip_animation_fade_speed);\n\n } else {\n this.settings.$next_tip.fadeIn(this.settings.tip_animation_fade_speed);\n }\n }\n\n this.settings.$current_tip = this.settings.$next_tip;\n\n // skip non-existant targets\n } else if (this.settings.$li && this.settings.$target.length < 1) {\n\n this.show(init, is_prev);\n\n } else {\n\n this.end();\n\n }\n } else {\n\n this.settings.paused = true;\n\n }\n\n },\n\n is_phone : function () {\n return matchMedia(Foundation.media_queries.small).matches &&\n !matchMedia(Foundation.media_queries.medium).matches;\n },\n\n hide : function () {\n if (this.settings.modal && this.settings.expose) {\n this.un_expose();\n }\n\n if (!this.settings.modal) {\n $('.joyride-modal-bg').hide();\n }\n\n // Prevent scroll bouncing...wait to remove from layout\n this.settings.$current_tip.css('visibility', 'hidden');\n setTimeout($.proxy(function () {\n this.hide();\n this.css('visibility', 'visible');\n }, this.settings.$current_tip), 0);\n this.settings.post_step_callback(this.settings.$li.index(),\n this.settings.$current_tip);\n },\n\n set_li : function (init, is_prev) {\n if (init) {\n this.settings.$li = this.settings.$tip_content.eq(this.settings.start_offset);\n this.set_next_tip();\n this.settings.$current_tip = this.settings.$next_tip;\n } else {\n if (is_prev) {\n this.settings.$li = this.settings.$li.prev();\n } else {\n this.settings.$li = this.settings.$li.next();\n }\n this.set_next_tip();\n }\n\n this.set_target();\n },\n\n set_next_tip : function () {\n this.settings.$next_tip = $('.joyride-tip-guide').eq(this.settings.$li.index());\n this.settings.$next_tip.data('closed', '');\n },\n\n set_target : function () {\n var cl = this.settings.$li.attr(this.add_namespace('data-class')),\n id = this.settings.$li.attr(this.add_namespace('data-id')),\n $sel = function () {\n if (id) {\n return $(document.getElementById(id));\n } else if (cl) {\n return $('.' + cl).first();\n } else {\n return $('body');\n }\n };\n\n this.settings.$target = $sel();\n },\n\n scroll_to : function () {\n var window_half, tipOffset;\n\n window_half = $(window).height() / 2;\n tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight());\n\n if (tipOffset != 0) {\n $('html, body').stop().animate({\n scrollTop : tipOffset\n }, this.settings.scroll_speed, 'swing');\n }\n },\n\n paused : function () {\n return ($.inArray((this.settings.$li.index() + 1), this.settings.pause_after) === -1);\n },\n\n restart : function () {\n this.hide();\n this.settings.$li = undefined;\n this.show('init');\n },\n\n pos_default : function (init) {\n var $nub = this.settings.$next_tip.find('.joyride-nub'),\n nub_width = Math.ceil($nub.outerWidth() / 2),\n nub_height = Math.ceil($nub.outerHeight() / 2),\n toggle = init || false;\n\n // tip must not be \"display: none\" to calculate position\n if (toggle) {\n this.settings.$next_tip.css('visibility', 'hidden');\n this.settings.$next_tip.show();\n }\n\n if (!/body/i.test(this.settings.$target.selector)) {\n var topAdjustment = this.settings.tip_settings.tipAdjustmentY ? parseInt(this.settings.tip_settings.tipAdjustmentY) : 0,\n leftAdjustment = this.settings.tip_settings.tipAdjustmentX ? parseInt(this.settings.tip_settings.tipAdjustmentX) : 0;\n\n if (this.bottom()) {\n if (this.rtl) {\n this.settings.$next_tip.css({\n top : (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment),\n left : this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth() + leftAdjustment});\n } else {\n this.settings.$next_tip.css({\n top : (this.settings.$target.offset().top + nub_height + this.settings.$target.outerHeight() + topAdjustment),\n left : this.settings.$target.offset().left + leftAdjustment});\n }\n\n this.nub_position($nub, this.settings.tip_settings.nub_position, 'top');\n\n } else if (this.top()) {\n if (this.rtl) {\n this.settings.$next_tip.css({\n top : (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment),\n left : this.settings.$target.offset().left + this.settings.$target.outerWidth() - this.settings.$next_tip.outerWidth()});\n } else {\n this.settings.$next_tip.css({\n top : (this.settings.$target.offset().top - this.settings.$next_tip.outerHeight() - nub_height + topAdjustment),\n left : this.settings.$target.offset().left + leftAdjustment});\n }\n\n this.nub_position($nub, this.settings.tip_settings.nub_position, 'bottom');\n\n } else if (this.right()) {\n\n this.settings.$next_tip.css({\n top : this.settings.$target.offset().top + topAdjustment,\n left : (this.settings.$target.outerWidth() + this.settings.$target.offset().left + nub_width + leftAdjustment)});\n\n this.nub_position($nub, this.settings.tip_settings.nub_position, 'left');\n\n } else if (this.left()) {\n\n this.settings.$next_tip.css({\n top : this.settings.$target.offset().top + topAdjustment,\n left : (this.settings.$target.offset().left - this.settings.$next_tip.outerWidth() - nub_width + leftAdjustment)});\n\n this.nub_position($nub, this.settings.tip_settings.nub_position, 'right');\n\n }\n\n if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tip_settings.tip_location_pattern.length) {\n\n $nub.removeClass('bottom')\n .removeClass('top')\n .removeClass('right')\n .removeClass('left');\n\n this.settings.tip_settings.tip_location = this.settings.tip_settings.tip_location_pattern[this.settings.attempts];\n\n this.settings.attempts++;\n\n this.pos_default();\n\n }\n\n } else if (this.settings.$li.length) {\n\n this.pos_modal($nub);\n\n }\n\n if (toggle) {\n this.settings.$next_tip.hide();\n this.settings.$next_tip.css('visibility', 'visible');\n }\n\n },\n\n pos_phone : function (init) {\n var tip_height = this.settings.$next_tip.outerHeight(),\n tip_offset = this.settings.$next_tip.offset(),\n target_height = this.settings.$target.outerHeight(),\n $nub = $('.joyride-nub', this.settings.$next_tip),\n nub_height = Math.ceil($nub.outerHeight() / 2),\n toggle = init || false;\n\n $nub.removeClass('bottom')\n .removeClass('top')\n .removeClass('right')\n .removeClass('left');\n\n if (toggle) {\n this.settings.$next_tip.css('visibility', 'hidden');\n this.settings.$next_tip.show();\n }\n\n if (!/body/i.test(this.settings.$target.selector)) {\n\n if (this.top()) {\n\n this.settings.$next_tip.offset({top : this.settings.$target.offset().top - tip_height - nub_height});\n $nub.addClass('bottom');\n\n } else {\n\n this.settings.$next_tip.offset({top : this.settings.$target.offset().top + target_height + nub_height});\n $nub.addClass('top');\n\n }\n\n } else if (this.settings.$li.length) {\n this.pos_modal($nub);\n }\n\n if (toggle) {\n this.settings.$next_tip.hide();\n this.settings.$next_tip.css('visibility', 'visible');\n }\n },\n\n pos_modal : function ($nub) {\n this.center();\n $nub.hide();\n\n this.show_modal();\n },\n\n show_modal : function () {\n if (!this.settings.$next_tip.data('closed')) {\n var joyridemodalbg = $('.joyride-modal-bg');\n if (joyridemodalbg.length < 1) {\n var joyridemodalbg = $(this.settings.template.modal);\n joyridemodalbg.appendTo('body');\n }\n\n if (/pop/i.test(this.settings.tip_animation)) {\n joyridemodalbg.show();\n } else {\n joyridemodalbg.fadeIn(this.settings.tip_animation_fade_speed);\n }\n }\n },\n\n expose : function () {\n var expose,\n exposeCover,\n el,\n origCSS,\n origClasses,\n randId = 'expose-' + this.random_str(6);\n\n if (arguments.length > 0 && arguments[0] instanceof $) {\n el = arguments[0];\n } else if (this.settings.$target && !/body/i.test(this.settings.$target.selector)) {\n el = this.settings.$target;\n } else {\n return false;\n }\n\n if (el.length < 1) {\n if (window.console) {\n console.error('element not valid', el);\n }\n return false;\n }\n\n expose = $(this.settings.template.expose);\n this.settings.$body.append(expose);\n expose.css({\n top : el.offset().top,\n left : el.offset().left,\n width : el.outerWidth(true),\n height : el.outerHeight(true)\n });\n\n exposeCover = $(this.settings.template.expose_cover);\n\n origCSS = {\n zIndex : el.css('z-index'),\n position : el.css('position')\n };\n\n origClasses = el.attr('class') == null ? '' : el.attr('class');\n\n el.css('z-index', parseInt(expose.css('z-index')) + 1);\n\n if (origCSS.position == 'static') {\n el.css('position', 'relative');\n }\n\n el.data('expose-css', origCSS);\n el.data('orig-class', origClasses);\n el.attr('class', origClasses + ' ' + this.settings.expose_add_class);\n\n exposeCover.css({\n top : el.offset().top,\n left : el.offset().left,\n width : el.outerWidth(true),\n height : el.outerHeight(true)\n });\n\n if (this.settings.modal) {\n this.show_modal();\n }\n\n this.settings.$body.append(exposeCover);\n expose.addClass(randId);\n exposeCover.addClass(randId);\n el.data('expose', randId);\n this.settings.post_expose_callback(this.settings.$li.index(), this.settings.$next_tip, el);\n this.add_exposed(el);\n },\n\n un_expose : function () {\n var exposeId,\n el,\n expose,\n origCSS,\n origClasses,\n clearAll = false;\n\n if (arguments.length > 0 && arguments[0] instanceof $) {\n el = arguments[0];\n } else if (this.settings.$target && !/body/i.test(this.settings.$target.selector)) {\n el = this.settings.$target;\n } else {\n return false;\n }\n\n if (el.length < 1) {\n if (window.console) {\n console.error('element not valid', el);\n }\n return false;\n }\n\n exposeId = el.data('expose');\n expose = $('.' + exposeId);\n\n if (arguments.length > 1) {\n clearAll = arguments[1];\n }\n\n if (clearAll === true) {\n $('.joyride-expose-wrapper,.joyride-expose-cover').remove();\n } else {\n expose.remove();\n }\n\n origCSS = el.data('expose-css');\n\n if (origCSS.zIndex == 'auto') {\n el.css('z-index', '');\n } else {\n el.css('z-index', origCSS.zIndex);\n }\n\n if (origCSS.position != el.css('position')) {\n if (origCSS.position == 'static') {// this is default, no need to set it.\n el.css('position', '');\n } else {\n el.css('position', origCSS.position);\n }\n }\n\n origClasses = el.data('orig-class');\n el.attr('class', origClasses);\n el.removeData('orig-classes');\n\n el.removeData('expose');\n el.removeData('expose-z-index');\n this.remove_exposed(el);\n },\n\n add_exposed : function (el) {\n this.settings.exposed = this.settings.exposed || [];\n if (el instanceof $ || typeof el === 'object') {\n this.settings.exposed.push(el[0]);\n } else if (typeof el == 'string') {\n this.settings.exposed.push(el);\n }\n },\n\n remove_exposed : function (el) {\n var search, i;\n if (el instanceof $) {\n search = el[0]\n } else if (typeof el == 'string') {\n search = el;\n }\n\n this.settings.exposed = this.settings.exposed || [];\n i = this.settings.exposed.length;\n\n while (i--) {\n if (this.settings.exposed[i] == search) {\n this.settings.exposed.splice(i, 1);\n return;\n }\n }\n },\n\n center : function () {\n var $w = $(window);\n\n this.settings.$next_tip.css({\n top : ((($w.height() - this.settings.$next_tip.outerHeight()) / 2) + $w.scrollTop()),\n left : ((($w.width() - this.settings.$next_tip.outerWidth()) / 2) + $w.scrollLeft())\n });\n\n return true;\n },\n\n bottom : function () {\n return /bottom/i.test(this.settings.tip_settings.tip_location);\n },\n\n top : function () {\n return /top/i.test(this.settings.tip_settings.tip_location);\n },\n\n right : function () {\n return /right/i.test(this.settings.tip_settings.tip_location);\n },\n\n left : function () {\n return /left/i.test(this.settings.tip_settings.tip_location);\n },\n\n corners : function (el) {\n if (el.length === 0) {\n return [false, false, false, false]; \n }\n \n var w = $(window),\n window_half = w.height() / 2,\n //using this to calculate since scroll may not have finished yet.\n tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()),\n right = w.width() + w.scrollLeft(),\n offsetBottom = w.height() + tipOffset,\n bottom = w.height() + w.scrollTop(),\n top = w.scrollTop();\n\n if (tipOffset < top) {\n if (tipOffset < 0) {\n top = 0;\n } else {\n top = tipOffset;\n }\n }\n\n if (offsetBottom > bottom) {\n bottom = offsetBottom;\n }\n\n return [\n el.offset().top < top,\n right < el.offset().left + el.outerWidth(),\n bottom < el.offset().top + el.outerHeight(),\n w.scrollLeft() > el.offset().left\n ];\n },\n\n visible : function (hidden_corners) {\n var i = hidden_corners.length;\n\n while (i--) {\n if (hidden_corners[i]) {\n return false;\n }\n }\n\n return true;\n },\n\n nub_position : function (nub, pos, def) {\n if (pos === 'auto') {\n nub.addClass(def);\n } else {\n nub.addClass(pos);\n }\n },\n\n startTimer : function () {\n if (this.settings.$li.length) {\n this.settings.automate = setTimeout(function () {\n this.hide();\n this.show();\n this.startTimer();\n }.bind(this), this.settings.timer);\n } else {\n clearTimeout(this.settings.automate);\n }\n },\n\n end : function (abort) {\n if (this.settings.cookie_monster) {\n $.cookie(this.settings.cookie_name, 'ridden', {expires : this.settings.cookie_expires, domain : this.settings.cookie_domain});\n }\n\n if (this.settings.timer > 0) {\n clearTimeout(this.settings.automate);\n }\n\n if (this.settings.modal && this.settings.expose) {\n this.un_expose();\n }\n\n // Unplug keystrokes listener\n $(this.scope).off('keyup.joyride')\n\n this.settings.$next_tip.data('closed', true);\n this.settings.riding = false;\n\n $('.joyride-modal-bg').hide();\n this.settings.$current_tip.hide();\n\n if (typeof abort === 'undefined' || abort === false) {\n this.settings.post_step_callback(this.settings.$li.index(), this.settings.$current_tip);\n this.settings.post_ride_callback(this.settings.$li.index(), this.settings.$current_tip);\n }\n\n $('.joyride-tip-guide').remove();\n },\n\n off : function () {\n $(this.scope).off('.joyride');\n $(window).off('.joyride');\n $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride');\n $('.joyride-tip-guide, .joyride-modal-bg').remove();\n clearTimeout(this.settings.automate);\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs['magellan-expedition'] = {\n name : 'magellan-expedition',\n\n version : '5.5.3',\n\n settings : {\n active_class : 'active',\n threshold : 0, // pixels from the top of the expedition for it to become fixes\n destination_threshold : 20, // pixels from the top of destination for it to be considered active\n throttle_delay : 30, // calculation throttling to increase framerate\n fixed_top : 0, // top distance in pixels assigend to the fixed element on scroll\n offset_by_height : true, // whether to offset the destination by the expedition height. Usually you want this to be true, unless your expedition is on the side.\n duration : 700, // animation duration time\n easing : 'swing' // animation easing\n },\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'throttle');\n this.bindings(method, options);\n },\n\n events : function () {\n var self = this,\n S = self.S,\n settings = self.settings;\n\n // initialize expedition offset\n self.set_expedition_position();\n\n S(self.scope)\n .off('.magellan')\n .on('click.fndtn.magellan', '[' + self.add_namespace('data-magellan-arrival') + '] a[href*=#]', function (e) {\n var sameHost = ((this.hostname === location.hostname) || !this.hostname),\n samePath = self.filterPathname(location.pathname) === self.filterPathname(this.pathname),\n testHash = this.hash.replace(/(:|\\.|\\/)/g, '\\\\$1'),\n anchor = this;\n\n if (sameHost && samePath && testHash) {\n e.preventDefault();\n var expedition = $(this).closest('[' + self.attr_name() + ']'),\n settings = expedition.data('magellan-expedition-init'),\n hash = this.hash.split('#').join(''),\n target = $('a[name=\"' + hash + '\"]');\n\n if (target.length === 0) {\n target = $('#' + hash);\n\n }\n\n // Account for expedition height if fixed position\n var scroll_top = target.offset().top - settings.destination_threshold + 1;\n if (settings.offset_by_height) {\n scroll_top = scroll_top - expedition.outerHeight();\n }\n $('html, body').stop().animate({\n 'scrollTop' : scroll_top\n }, settings.duration, settings.easing, function () {\n if (history.pushState) {\n history.pushState(null, null, anchor.pathname + anchor.search + '#' + hash);\n } else {\n location.hash = anchor.pathname + anchor.search + '#' + hash;\n }\n });\n }\n })\n .on('scroll.fndtn.magellan', self.throttle(this.check_for_arrivals.bind(this), settings.throttle_delay));\n },\n\n check_for_arrivals : function () {\n var self = this;\n self.update_arrivals();\n self.update_expedition_positions();\n },\n\n set_expedition_position : function () {\n var self = this;\n $('[' + this.attr_name() + '=fixed]', self.scope).each(function (idx, el) {\n var expedition = $(this),\n settings = expedition.data('magellan-expedition-init'),\n styles = expedition.attr('styles'), // save styles\n top_offset, fixed_top;\n\n expedition.attr('style', '');\n top_offset = expedition.offset().top + settings.threshold;\n\n //set fixed-top by attribute\n fixed_top = parseInt(expedition.data('magellan-fixed-top'));\n if (!isNaN(fixed_top)) {\n self.settings.fixed_top = fixed_top;\n }\n\n expedition.data(self.data_attr('magellan-top-offset'), top_offset);\n expedition.attr('style', styles);\n });\n },\n\n update_expedition_positions : function () {\n var self = this,\n window_top_offset = $(window).scrollTop();\n\n $('[' + this.attr_name() + '=fixed]', self.scope).each(function () {\n var expedition = $(this),\n settings = expedition.data('magellan-expedition-init'),\n styles = expedition.attr('style'), // save styles\n top_offset = expedition.data('magellan-top-offset');\n\n //scroll to the top distance\n if (window_top_offset + self.settings.fixed_top >= top_offset) {\n // Placeholder allows height calculations to be consistent even when\n // appearing to switch between fixed/non-fixed placement\n var placeholder = expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']');\n if (placeholder.length === 0) {\n placeholder = expedition.clone();\n placeholder.removeAttr(self.attr_name());\n placeholder.attr(self.add_namespace('data-magellan-expedition-clone'), '');\n expedition.before(placeholder);\n }\n expedition.css({position :'fixed', top : settings.fixed_top}).addClass('fixed');\n } else {\n expedition.prev('[' + self.add_namespace('data-magellan-expedition-clone') + ']').remove();\n expedition.attr('style', styles).css('position', '').css('top', '').removeClass('fixed');\n }\n });\n },\n\n update_arrivals : function () {\n var self = this,\n window_top_offset = $(window).scrollTop();\n\n $('[' + this.attr_name() + ']', self.scope).each(function () {\n var expedition = $(this),\n settings = expedition.data(self.attr_name(true) + '-init'),\n offsets = self.offsets(expedition, window_top_offset),\n arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']'),\n active_item = false;\n offsets.each(function (idx, item) {\n if (item.viewport_offset >= item.top_offset) {\n var arrivals = expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']');\n arrivals.not(item.arrival).removeClass(settings.active_class);\n item.arrival.addClass(settings.active_class);\n active_item = true;\n return true;\n }\n });\n\n if (!active_item) {\n arrivals.removeClass(settings.active_class);\n }\n });\n },\n\n offsets : function (expedition, window_offset) {\n var self = this,\n settings = expedition.data(self.attr_name(true) + '-init'),\n viewport_offset = window_offset;\n\n return expedition.find('[' + self.add_namespace('data-magellan-arrival') + ']').map(function (idx, el) {\n var name = $(this).data(self.data_attr('magellan-arrival')),\n dest = $('[' + self.add_namespace('data-magellan-destination') + '=' + name + ']');\n if (dest.length > 0) {\n var top_offset = dest.offset().top - settings.destination_threshold;\n if (settings.offset_by_height) {\n top_offset = top_offset - expedition.outerHeight();\n }\n top_offset = Math.floor(top_offset);\n return {\n destination : dest,\n arrival : $(this),\n top_offset : top_offset,\n viewport_offset : viewport_offset\n }\n }\n }).sort(function (a, b) {\n if (a.top_offset < b.top_offset) {\n return -1;\n }\n if (a.top_offset > b.top_offset) {\n return 1;\n }\n return 0;\n });\n },\n\n data_attr : function (str) {\n if (this.namespace.length > 0) {\n return this.namespace + '-' + str;\n }\n\n return str;\n },\n\n off : function () {\n this.S(this.scope).off('.magellan');\n this.S(window).off('.magellan');\n },\n\n filterPathname : function (pathname) {\n pathname = pathname || '';\n return pathname\n .replace(/^\\//,'')\n .replace(/(?:index|default).[a-zA-Z]{3,4}$/,'')\n .replace(/\\/$/,'');\n },\n\n reflow : function () {\n var self = this;\n // remove placeholder expeditions used for height calculation purposes\n $('[' + self.add_namespace('data-magellan-expedition-clone') + ']', self.scope).remove();\n }\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.offcanvas = {\n name : 'offcanvas',\n\n version : '5.5.3',\n\n settings : {\n open_method : 'move',\n close_on_click : false\n },\n\n init : function (scope, method, options) {\n this.bindings(method, options);\n },\n\n events : function () {\n var self = this,\n S = self.S,\n move_class = '',\n right_postfix = '',\n left_postfix = '',\n top_postfix = '',\n bottom_postfix = '';\n\n if (this.settings.open_method === 'move') {\n move_class = 'move-';\n right_postfix = 'right';\n left_postfix = 'left';\n top_postfix = 'top';\n bottom_postfix = 'bottom';\n } else if (this.settings.open_method === 'overlap_single') {\n move_class = 'offcanvas-overlap-';\n right_postfix = 'right';\n left_postfix = 'left';\n top_postfix = 'top';\n bottom_postfix = 'bottom';\n } else if (this.settings.open_method === 'overlap') {\n move_class = 'offcanvas-overlap';\n }\n\n S(this.scope).off('.offcanvas')\n .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) {\n self.click_toggle_class(e, move_class + right_postfix);\n if (self.settings.open_method !== 'overlap') {\n S('.left-submenu').removeClass(move_class + right_postfix);\n }\n $('.left-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.left-off-canvas-menu a', function (e) {\n var settings = self.get_settings(e);\n var parent = S(this).parent();\n\n if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {\n self.hide.call(self, move_class + right_postfix, self.get_wrapper(e));\n parent.parent().removeClass(move_class + right_postfix);\n } else if (S(this).parent().hasClass('has-submenu')) {\n e.preventDefault();\n S(this).siblings('.left-submenu').toggleClass(move_class + right_postfix);\n } else if (parent.hasClass('back')) {\n e.preventDefault();\n parent.parent().removeClass(move_class + right_postfix);\n }\n $('.left-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n //end of left canvas\n .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) {\n self.click_toggle_class(e, move_class + left_postfix);\n if (self.settings.open_method !== 'overlap') {\n S('.right-submenu').removeClass(move_class + left_postfix);\n }\n $('.right-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.right-off-canvas-menu a', function (e) {\n var settings = self.get_settings(e);\n var parent = S(this).parent();\n\n if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {\n self.hide.call(self, move_class + left_postfix, self.get_wrapper(e));\n parent.parent().removeClass(move_class + left_postfix);\n } else if (S(this).parent().hasClass('has-submenu')) {\n e.preventDefault();\n S(this).siblings('.right-submenu').toggleClass(move_class + left_postfix);\n } else if (parent.hasClass('back')) {\n e.preventDefault();\n parent.parent().removeClass(move_class + left_postfix);\n }\n $('.right-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n //end of right canvas\n .on('click.fndtn.offcanvas', '.top-off-canvas-toggle', function (e) {\n self.click_toggle_class(e, move_class + bottom_postfix);\n if (self.settings.open_method !== 'overlap') {\n S('.top-submenu').removeClass(move_class + bottom_postfix);\n }\n $('.top-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.top-off-canvas-menu a', function (e) {\n var settings = self.get_settings(e);\n var parent = S(this).parent();\n\n if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {\n self.hide.call(self, move_class + bottom_postfix, self.get_wrapper(e));\n parent.parent().removeClass(move_class + bottom_postfix);\n } else if (S(this).parent().hasClass('has-submenu')) {\n e.preventDefault();\n S(this).siblings('.top-submenu').toggleClass(move_class + bottom_postfix);\n } else if (parent.hasClass('back')) {\n e.preventDefault();\n parent.parent().removeClass(move_class + bottom_postfix);\n }\n $('.top-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n //end of top canvas\n .on('click.fndtn.offcanvas', '.bottom-off-canvas-toggle', function (e) {\n self.click_toggle_class(e, move_class + top_postfix);\n if (self.settings.open_method !== 'overlap') {\n S('.bottom-submenu').removeClass(move_class + top_postfix);\n }\n $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.bottom-off-canvas-menu a', function (e) {\n var settings = self.get_settings(e);\n var parent = S(this).parent();\n\n if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) {\n self.hide.call(self, move_class + top_postfix, self.get_wrapper(e));\n parent.parent().removeClass(move_class + top_postfix);\n } else if (S(this).parent().hasClass('has-submenu')) {\n e.preventDefault();\n S(this).siblings('.bottom-submenu').toggleClass(move_class + top_postfix);\n } else if (parent.hasClass('back')) {\n e.preventDefault();\n parent.parent().removeClass(move_class + top_postfix);\n }\n $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n //end of bottom\n .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {\n self.click_remove_class(e, move_class + left_postfix);\n S('.right-submenu').removeClass(move_class + left_postfix);\n if (right_postfix) {\n self.click_remove_class(e, move_class + right_postfix);\n S('.left-submenu').removeClass(move_class + left_postfix);\n }\n $('.right-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {\n self.click_remove_class(e, move_class + left_postfix);\n $('.left-off-canvas-toggle').attr('aria-expanded', 'false');\n if (right_postfix) {\n self.click_remove_class(e, move_class + right_postfix);\n $('.right-off-canvas-toggle').attr('aria-expanded', 'false');\n }\n })\n .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {\n self.click_remove_class(e, move_class + top_postfix);\n S('.bottom-submenu').removeClass(move_class + top_postfix);\n if (bottom_postfix) {\n self.click_remove_class(e, move_class + bottom_postfix);\n S('.top-submenu').removeClass(move_class + top_postfix);\n }\n $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true');\n })\n .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) {\n self.click_remove_class(e, move_class + top_postfix);\n $('.top-off-canvas-toggle').attr('aria-expanded', 'false');\n if (bottom_postfix) {\n self.click_remove_class(e, move_class + bottom_postfix);\n $('.bottom-off-canvas-toggle').attr('aria-expanded', 'false');\n }\n });\n },\n\n toggle : function (class_name, $off_canvas) {\n $off_canvas = $off_canvas || this.get_wrapper();\n if ($off_canvas.is('.' + class_name)) {\n this.hide(class_name, $off_canvas);\n } else {\n this.show(class_name, $off_canvas);\n }\n },\n\n show : function (class_name, $off_canvas) {\n $off_canvas = $off_canvas || this.get_wrapper();\n $off_canvas.trigger('open.fndtn.offcanvas');\n $off_canvas.addClass(class_name);\n },\n\n hide : function (class_name, $off_canvas) {\n $off_canvas = $off_canvas || this.get_wrapper();\n $off_canvas.trigger('close.fndtn.offcanvas');\n $off_canvas.removeClass(class_name);\n },\n\n click_toggle_class : function (e, class_name) {\n e.preventDefault();\n var $off_canvas = this.get_wrapper(e);\n this.toggle(class_name, $off_canvas);\n },\n\n click_remove_class : function (e, class_name) {\n e.preventDefault();\n var $off_canvas = this.get_wrapper(e);\n this.hide(class_name, $off_canvas);\n },\n\n get_settings : function (e) {\n var offcanvas = this.S(e.target).closest('[' + this.attr_name() + ']');\n return offcanvas.data(this.attr_name(true) + '-init') || this.settings;\n },\n\n get_wrapper : function (e) {\n var $off_canvas = this.S(e ? e.target : this.scope).closest('.off-canvas-wrap');\n\n if ($off_canvas.length === 0) {\n $off_canvas = this.S('.off-canvas-wrap');\n }\n return $off_canvas;\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n var noop = function () {};\n\n var Orbit = function (el, settings) {\n // Don't reinitialize plugin\n if (el.hasClass(settings.slides_container_class)) {\n return this;\n }\n\n var self = this,\n container,\n slides_container = el,\n number_container,\n bullets_container,\n timer_container,\n idx = 0,\n animate,\n timer,\n locked = false,\n adjust_height_after = false;\n\n self.slides = function () {\n return slides_container.children(settings.slide_selector);\n };\n\n self.slides().first().addClass(settings.active_slide_class);\n\n self.update_slide_number = function (index) {\n if (settings.slide_number) {\n number_container.find('span:first').text(parseInt(index) + 1);\n number_container.find('span:last').text(self.slides().length);\n }\n if (settings.bullets) {\n bullets_container.children().removeClass(settings.bullets_active_class);\n $(bullets_container.children().get(index)).addClass(settings.bullets_active_class);\n }\n };\n\n self.update_active_link = function (index) {\n var link = $('[data-orbit-link=\"' + self.slides().eq(index).attr('data-orbit-slide') + '\"]');\n link.siblings().removeClass(settings.bullets_active_class);\n link.addClass(settings.bullets_active_class);\n };\n\n self.build_markup = function () {\n slides_container.wrap('
');\n container = slides_container.parent();\n slides_container.addClass(settings.slides_container_class);\n\n if (settings.stack_on_small) {\n container.addClass(settings.stack_on_small_class);\n }\n\n if (settings.navigation_arrows) {\n container.append($('').addClass(settings.prev_class));\n container.append($('').addClass(settings.next_class));\n }\n\n if (settings.timer) {\n timer_container = $('
').addClass(settings.timer_container_class);\n timer_container.append('');\n timer_container.append($('
').addClass(settings.timer_progress_class));\n timer_container.addClass(settings.timer_paused_class);\n container.append(timer_container);\n }\n\n if (settings.slide_number) {\n number_container = $('
').addClass(settings.slide_number_class);\n number_container.append(' ' + settings.slide_number_text + ' ');\n container.append(number_container);\n }\n\n if (settings.bullets) {\n bullets_container = $('
    ').addClass(settings.bullets_container_class);\n container.append(bullets_container);\n bullets_container.wrap('
    ');\n self.slides().each(function (idx, el) {\n var bullet = $('
  1. ').attr('data-orbit-slide', idx).on('click', self.link_bullet);;\n bullets_container.append(bullet);\n });\n }\n\n };\n\n self._goto = function (next_idx, start_timer) {\n // if (locked) {return false;}\n if (next_idx === idx) {return false;}\n if (typeof timer === 'object') {timer.restart();}\n var slides = self.slides();\n\n var dir = 'next';\n locked = true;\n if (next_idx < idx) {dir = 'prev';}\n if (next_idx >= slides.length) {\n if (!settings.circular) {\n return false;\n }\n next_idx = 0;\n } else if (next_idx < 0) {\n if (!settings.circular) {\n return false;\n }\n next_idx = slides.length - 1;\n }\n\n var current = $(slides.get(idx));\n var next = $(slides.get(next_idx));\n\n current.css('zIndex', 2);\n current.removeClass(settings.active_slide_class);\n next.css('zIndex', 4).addClass(settings.active_slide_class);\n\n slides_container.trigger('before-slide-change.fndtn.orbit');\n settings.before_slide_change();\n self.update_active_link(next_idx);\n\n var callback = function () {\n var unlock = function () {\n idx = next_idx;\n locked = false;\n if (start_timer === true) {timer = self.create_timer(); timer.start();}\n self.update_slide_number(idx);\n slides_container.trigger('after-slide-change.fndtn.orbit', [{slide_number : idx, total_slides : slides.length}]);\n settings.after_slide_change(idx, slides.length);\n };\n if (slides_container.outerHeight() != next.outerHeight() && settings.variable_height) {\n slides_container.animate({'height': next.outerHeight()}, 250, 'linear', unlock);\n } else {\n unlock();\n }\n };\n\n if (slides.length === 1) {callback(); return false;}\n\n var start_animation = function () {\n if (dir === 'next') {animate.next(current, next, callback);}\n if (dir === 'prev') {animate.prev(current, next, callback);}\n };\n\n if (next.outerHeight() > slides_container.outerHeight() && settings.variable_height) {\n slides_container.animate({'height': next.outerHeight()}, 250, 'linear', start_animation);\n } else {\n start_animation();\n }\n };\n\n self.next = function (e) {\n e.stopImmediatePropagation();\n e.preventDefault();\n self._goto(idx + 1);\n };\n\n self.prev = function (e) {\n e.stopImmediatePropagation();\n e.preventDefault();\n self._goto(idx - 1);\n };\n\n self.link_custom = function (e) {\n e.preventDefault();\n var link = $(this).attr('data-orbit-link');\n if ((typeof link === 'string') && (link = $.trim(link)) != '') {\n var slide = container.find('[data-orbit-slide=' + link + ']');\n if (slide.index() != -1) {self._goto(slide.index());}\n }\n };\n\n self.link_bullet = function (e) {\n var index = $(this).attr('data-orbit-slide');\n if ((typeof index === 'string') && (index = $.trim(index)) != '') {\n if (isNaN(parseInt(index))) {\n var slide = container.find('[data-orbit-slide=' + index + ']');\n if (slide.index() != -1) {self._goto(slide.index() + 1);}\n } else {\n self._goto(parseInt(index));\n }\n }\n\n }\n\n self.timer_callback = function () {\n self._goto(idx + 1, true);\n }\n\n self.compute_dimensions = function () {\n var current = $(self.slides().get(idx));\n var h = current.outerHeight();\n if (!settings.variable_height) {\n self.slides().each(function(){\n if ($(this).outerHeight() > h) { h = $(this).outerHeight(); }\n });\n }\n slides_container.height(h);\n };\n\n self.create_timer = function () {\n var t = new Timer(\n container.find('.' + settings.timer_container_class),\n settings,\n self.timer_callback\n );\n return t;\n };\n\n self.stop_timer = function () {\n if (typeof timer === 'object') {\n timer.stop();\n }\n };\n\n self.toggle_timer = function () {\n var t = container.find('.' + settings.timer_container_class);\n if (t.hasClass(settings.timer_paused_class)) {\n if (typeof timer === 'undefined') {timer = self.create_timer();}\n timer.start();\n } else {\n if (typeof timer === 'object') {timer.stop();}\n }\n };\n\n self.init = function () {\n self.build_markup();\n if (settings.timer) {\n timer = self.create_timer();\n Foundation.utils.image_loaded(this.slides().children('img'), timer.start);\n }\n animate = new FadeAnimation(settings, slides_container);\n if (settings.animation === 'slide') {\n animate = new SlideAnimation(settings, slides_container);\n }\n\n container.on('click', '.' + settings.next_class, self.next);\n container.on('click', '.' + settings.prev_class, self.prev);\n\n if (settings.next_on_click) {\n container.on('click', '.' + settings.slides_container_class + ' [data-orbit-slide]', self.link_bullet);\n }\n\n container.on('click', self.toggle_timer);\n if (settings.swipe) {\n container.on('touchstart.fndtn.orbit', function (e) {\n if (!e.touches) {e = e.originalEvent;}\n var data = {\n start_page_x : e.touches[0].pageX,\n start_page_y : e.touches[0].pageY,\n start_time : (new Date()).getTime(),\n delta_x : 0,\n is_scrolling : undefined\n };\n container.data('swipe-transition', data);\n e.stopPropagation();\n })\n .on('touchmove.fndtn.orbit', function (e) {\n if (!e.touches) {\n e = e.originalEvent;\n }\n // Ignore pinch/zoom events\n if (e.touches.length > 1 || e.scale && e.scale !== 1) {\n return;\n }\n\n var data = container.data('swipe-transition');\n if (typeof data === 'undefined') {data = {};}\n\n data.delta_x = e.touches[0].pageX - data.start_page_x;\n\n if ( typeof data.is_scrolling === 'undefined') {\n data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );\n }\n\n if (!data.is_scrolling && !data.active) {\n e.preventDefault();\n var direction = (data.delta_x < 0) ? (idx + 1) : (idx - 1);\n data.active = true;\n self._goto(direction);\n }\n })\n .on('touchend.fndtn.orbit', function (e) {\n container.data('swipe-transition', {});\n e.stopPropagation();\n })\n }\n container.on('mouseenter.fndtn.orbit', function (e) {\n if (settings.timer && settings.pause_on_hover) {\n self.stop_timer();\n }\n })\n .on('mouseleave.fndtn.orbit', function (e) {\n if (settings.timer && settings.resume_on_mouseout) {\n timer.start();\n }\n });\n\n $(document).on('click', '[data-orbit-link]', self.link_custom);\n $(window).on('load resize', self.compute_dimensions);\n Foundation.utils.image_loaded(this.slides().children('img'), self.compute_dimensions);\n Foundation.utils.image_loaded(this.slides().children('img'), function () {\n container.prev('.' + settings.preloader_class).css('display', 'none');\n self.update_slide_number(0);\n self.update_active_link(0);\n slides_container.trigger('ready.fndtn.orbit');\n });\n };\n\n self.init();\n };\n\n var Timer = function (el, settings, callback) {\n var self = this,\n duration = settings.timer_speed,\n progress = el.find('.' + settings.timer_progress_class),\n start,\n timeout,\n left = -1;\n\n this.update_progress = function (w) {\n var new_progress = progress.clone();\n new_progress.attr('style', '');\n new_progress.css('width', w + '%');\n progress.replaceWith(new_progress);\n progress = new_progress;\n };\n\n this.restart = function () {\n clearTimeout(timeout);\n el.addClass(settings.timer_paused_class);\n left = -1;\n self.update_progress(0);\n };\n\n this.start = function () {\n if (!el.hasClass(settings.timer_paused_class)) {return true;}\n left = (left === -1) ? duration : left;\n el.removeClass(settings.timer_paused_class);\n start = new Date().getTime();\n progress.animate({'width' : '100%'}, left, 'linear');\n timeout = setTimeout(function () {\n self.restart();\n callback();\n }, left);\n el.trigger('timer-started.fndtn.orbit')\n };\n\n this.stop = function () {\n if (el.hasClass(settings.timer_paused_class)) {return true;}\n clearTimeout(timeout);\n el.addClass(settings.timer_paused_class);\n var end = new Date().getTime();\n left = left - (end - start);\n var w = 100 - ((left / duration) * 100);\n self.update_progress(w);\n el.trigger('timer-stopped.fndtn.orbit');\n };\n };\n\n var SlideAnimation = function (settings, container) {\n var duration = settings.animation_speed;\n var is_rtl = ($('html[dir=rtl]').length === 1);\n var margin = is_rtl ? 'marginRight' : 'marginLeft';\n var animMargin = {};\n animMargin[margin] = '0%';\n\n this.next = function (current, next, callback) {\n current.animate({marginLeft : '-100%'}, duration);\n next.animate(animMargin, duration, function () {\n current.css(margin, '100%');\n callback();\n });\n };\n\n this.prev = function (current, prev, callback) {\n current.animate({marginLeft : '100%'}, duration);\n prev.css(margin, '-100%');\n prev.animate(animMargin, duration, function () {\n current.css(margin, '100%');\n callback();\n });\n };\n };\n\n var FadeAnimation = function (settings, container) {\n var duration = settings.animation_speed;\n var is_rtl = ($('html[dir=rtl]').length === 1);\n var margin = is_rtl ? 'marginRight' : 'marginLeft';\n\n this.next = function (current, next, callback) {\n next.css({'margin' : '0%', 'opacity' : '0.01'});\n next.animate({'opacity' :'1'}, duration, 'linear', function () {\n current.css('margin', '100%');\n callback();\n });\n };\n\n this.prev = function (current, prev, callback) {\n prev.css({'margin' : '0%', 'opacity' : '0.01'});\n prev.animate({'opacity' : '1'}, duration, 'linear', function () {\n current.css('margin', '100%');\n callback();\n });\n };\n };\n\n Foundation.libs = Foundation.libs || {};\n\n Foundation.libs.orbit = {\n name : 'orbit',\n\n version : '5.5.3',\n\n settings : {\n animation : 'slide',\n timer_speed : 10000,\n pause_on_hover : true,\n resume_on_mouseout : false,\n next_on_click : true,\n animation_speed : 500,\n stack_on_small : false,\n navigation_arrows : true,\n slide_number : true,\n slide_number_text : 'of',\n container_class : 'orbit-container',\n stack_on_small_class : 'orbit-stack-on-small',\n next_class : 'orbit-next',\n prev_class : 'orbit-prev',\n timer_container_class : 'orbit-timer',\n timer_paused_class : 'paused',\n timer_progress_class : 'orbit-progress',\n slides_container_class : 'orbit-slides-container',\n preloader_class : 'preloader',\n slide_selector : '*',\n bullets_container_class : 'orbit-bullets',\n bullets_active_class : 'active',\n slide_number_class : 'orbit-slide-number',\n caption_class : 'orbit-caption',\n active_slide_class : 'active',\n orbit_transition_class : 'orbit-transitioning',\n bullets : true,\n circular : true,\n timer : true,\n variable_height : false,\n swipe : true,\n before_slide_change : noop,\n after_slide_change : noop\n },\n\n init : function (scope, method, options) {\n var self = this;\n this.bindings(method, options);\n },\n\n events : function (instance) {\n var orbit_instance = new Orbit(this.S(instance), this.S(instance).data('orbit-init'));\n this.S(instance).data(this.name + '-instance', orbit_instance);\n },\n\n reflow : function () {\n var self = this;\n\n if (self.S(self.scope).is('[data-orbit]')) {\n var $el = self.S(self.scope);\n var instance = $el.data(self.name + '-instance');\n instance.compute_dimensions();\n } else {\n self.S('[data-orbit]', self.scope).each(function (idx, el) {\n var $el = self.S(el);\n var opts = self.data_options($el);\n var instance = $el.data(self.name + '-instance');\n instance.compute_dimensions();\n });\n }\n }\n };\n\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n var openModals = [];\n\n Foundation.libs.reveal = {\n name : 'reveal',\n\n version : '5.5.3',\n\n locked : false,\n\n settings : {\n animation : 'fadeAndPop',\n animation_speed : 250,\n close_on_background_click : true,\n close_on_esc : true,\n dismiss_modal_class : 'close-reveal-modal',\n multiple_opened : false,\n bg_class : 'reveal-modal-bg',\n root_element : 'body',\n open : function(){},\n opened : function(){},\n close : function(){},\n closed : function(){},\n on_ajax_error: $.noop,\n bg : $('.reveal-modal-bg'),\n css : {\n open : {\n 'opacity' : 0,\n 'visibility' : 'visible',\n 'display' : 'block'\n },\n close : {\n 'opacity' : 1,\n 'visibility' : 'hidden',\n 'display' : 'none'\n }\n }\n },\n\n init : function (scope, method, options) {\n $.extend(true, this.settings, method, options);\n this.bindings(method, options);\n },\n\n events : function (scope) {\n var self = this,\n S = self.S;\n\n S(this.scope)\n .off('.reveal')\n .on('click.fndtn.reveal', '[' + this.add_namespace('data-reveal-id') + ']:not([disabled])', function (e) {\n e.preventDefault();\n\n if (!self.locked) {\n var element = S(this),\n ajax = element.data(self.data_attr('reveal-ajax')),\n replaceContentSel = element.data(self.data_attr('reveal-replace-content'));\n\n self.locked = true;\n\n if (typeof ajax === 'undefined') {\n self.open.call(self, element);\n } else {\n var url = ajax === true ? element.attr('href') : ajax;\n self.open.call(self, element, {url : url}, { replaceContentSel : replaceContentSel });\n }\n }\n });\n\n S(document)\n .on('click.fndtn.reveal', this.close_targets(), function (e) {\n e.preventDefault();\n if (!self.locked) {\n var settings = S('[' + self.attr_name() + '].open').data(self.attr_name(true) + '-init') || self.settings,\n bg_clicked = S(e.target)[0] === S('.' + settings.bg_class)[0];\n\n if (bg_clicked) {\n if (settings.close_on_background_click) {\n e.stopPropagation();\n } else {\n return;\n }\n }\n\n self.locked = true;\n self.close.call(self, bg_clicked ? S('[' + self.attr_name() + '].open:not(.toback)') : S(this).closest('[' + self.attr_name() + ']'));\n }\n });\n\n if (S('[' + self.attr_name() + ']', this.scope).length > 0) {\n S(this.scope)\n // .off('.reveal')\n .on('open.fndtn.reveal', this.settings.open)\n .on('opened.fndtn.reveal', this.settings.opened)\n .on('opened.fndtn.reveal', this.open_video)\n .on('close.fndtn.reveal', this.settings.close)\n .on('closed.fndtn.reveal', this.settings.closed)\n .on('closed.fndtn.reveal', this.close_video);\n } else {\n S(this.scope)\n // .off('.reveal')\n .on('open.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.open)\n .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.opened)\n .on('opened.fndtn.reveal', '[' + self.attr_name() + ']', this.open_video)\n .on('close.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.close)\n .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.settings.closed)\n .on('closed.fndtn.reveal', '[' + self.attr_name() + ']', this.close_video);\n }\n\n return true;\n },\n\n // PATCH #3: turning on key up capture only when a reveal window is open\n key_up_on : function (scope) {\n var self = this;\n\n // PATCH #1: fixing multiple keyup event trigger from single key press\n self.S('body').off('keyup.fndtn.reveal').on('keyup.fndtn.reveal', function ( event ) {\n var open_modal = self.S('[' + self.attr_name() + '].open'),\n settings = open_modal.data(self.attr_name(true) + '-init') || self.settings ;\n // PATCH #2: making sure that the close event can be called only while unlocked,\n // so that multiple keyup.fndtn.reveal events don't prevent clean closing of the reveal window.\n if ( settings && event.which === 27 && settings.close_on_esc && !self.locked) { // 27 is the keycode for the Escape key\n self.close.call(self, open_modal);\n }\n });\n\n return true;\n },\n\n // PATCH #3: turning on key up capture only when a reveal window is open\n key_up_off : function (scope) {\n this.S('body').off('keyup.fndtn.reveal');\n return true;\n },\n\n open : function (target, ajax_settings) {\n var self = this,\n modal;\n\n if (target) {\n if (typeof target.selector !== 'undefined') {\n // Find the named node; only use the first one found, since the rest of the code assumes there's only one node\n modal = self.S('#' + target.data(self.data_attr('reveal-id'))).first();\n } else {\n modal = self.S(this.scope);\n\n ajax_settings = target;\n }\n } else {\n modal = self.S(this.scope);\n }\n\n var settings = modal.data(self.attr_name(true) + '-init');\n settings = settings || this.settings;\n\n\n if (modal.hasClass('open') && target !== undefined && target.attr('data-reveal-id') == modal.attr('id')) {\n return self.close(modal);\n }\n\n if (!modal.hasClass('open')) {\n var open_modal = self.S('[' + self.attr_name() + '].open');\n\n if (typeof modal.data('css-top') === 'undefined') {\n modal.data('css-top', parseInt(modal.css('top'), 10))\n .data('offset', this.cache_offset(modal));\n }\n\n modal.attr('tabindex','0').attr('aria-hidden','false');\n\n this.key_up_on(modal); // PATCH #3: turning on key up capture only when a reveal window is open\n\n // Prevent namespace event from triggering twice\n modal.on('open.fndtn.reveal', function(e) {\n if (e.namespace !== 'fndtn.reveal') return;\n });\n\n modal.on('open.fndtn.reveal').trigger('open.fndtn.reveal');\n\n if (open_modal.length < 1) {\n this.toggle_bg(modal, true);\n }\n\n if (typeof ajax_settings === 'string') {\n ajax_settings = {\n url : ajax_settings\n };\n }\n\n var openModal = function() {\n if(open_modal.length > 0) {\n if(settings.multiple_opened) {\n self.to_back(open_modal);\n } else {\n self.hide(open_modal, settings.css.close);\n }\n }\n\n // bl: add the open_modal that isn't already in the background to the openModals array\n if(settings.multiple_opened) {\n openModals.push(modal);\n }\n\n self.show(modal, settings.css.open);\n };\n\n if (typeof ajax_settings === 'undefined' || !ajax_settings.url) {\n openModal();\n } else {\n var old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null;\n $.extend(ajax_settings, {\n success : function (data, textStatus, jqXHR) {\n if ( $.isFunction(old_success) ) {\n var result = old_success(data, textStatus, jqXHR);\n if (typeof result == 'string') {\n data = result;\n }\n }\n\n if (typeof options !== 'undefined' && typeof options.replaceContentSel !== 'undefined') {\n modal.find(options.replaceContentSel).html(data);\n } else {\n modal.html(data);\n }\n\n self.S(modal).foundation('section', 'reflow');\n self.S(modal).children().foundation();\n\n openModal();\n }\n });\n\n // check for if user initalized with error callback\n if (settings.on_ajax_error !== $.noop) {\n $.extend(ajax_settings, {\n error : settings.on_ajax_error\n });\n }\n\n $.ajax(ajax_settings);\n }\n }\n self.S(window).trigger('resize');\n },\n\n close : function (modal) {\n var modal = modal && modal.length ? modal : this.S(this.scope),\n open_modals = this.S('[' + this.attr_name() + '].open'),\n settings = modal.data(this.attr_name(true) + '-init') || this.settings,\n self = this;\n\n if (open_modals.length > 0) {\n\n modal.removeAttr('tabindex','0').attr('aria-hidden','true');\n\n this.locked = true;\n this.key_up_off(modal); // PATCH #3: turning on key up capture only when a reveal window is open\n\n modal.trigger('close.fndtn.reveal');\n\n if ((settings.multiple_opened && open_modals.length === 1) || !settings.multiple_opened || modal.length > 1) {\n self.toggle_bg(modal, false);\n self.to_front(modal);\n }\n\n if (settings.multiple_opened) {\n var isCurrent = modal.is(':not(.toback)');\n self.hide(modal, settings.css.close, settings);\n if(isCurrent) {\n // remove the last modal since it is now closed\n openModals.pop();\n } else {\n // if this isn't the current modal, then find it in the array and remove it\n openModals = $.grep(openModals, function(elt) {\n var isThis = elt[0]===modal[0];\n if(isThis) {\n // since it's not currently in the front, put it in the front now that it is hidden\n // so that if it's re-opened, it won't be .toback\n self.to_front(modal);\n }\n return !isThis;\n });\n }\n // finally, show the next modal in the stack, if there is one\n if(openModals.length>0) {\n self.to_front(openModals[openModals.length - 1]);\n }\n } else {\n self.hide(open_modals, settings.css.close, settings);\n }\n }\n },\n\n close_targets : function () {\n var base = '.' + this.settings.dismiss_modal_class;\n\n if (this.settings.close_on_background_click) {\n return base + ', .' + this.settings.bg_class;\n }\n\n return base;\n },\n\n toggle_bg : function (modal, state) {\n if (this.S('.' + this.settings.bg_class).length === 0) {\n this.settings.bg = $('
    ', {'class': this.settings.bg_class})\n .appendTo('body').hide();\n }\n\n var visible = this.settings.bg.filter(':visible').length > 0;\n if ( state != visible ) {\n if ( state == undefined ? visible : !state ) {\n this.hide(this.settings.bg);\n } else {\n this.show(this.settings.bg);\n }\n }\n },\n\n show : function (el, css) {\n // is modal\n if (css) {\n var settings = el.data(this.attr_name(true) + '-init') || this.settings,\n root_element = settings.root_element,\n context = this;\n\n if (el.parent(root_element).length === 0) {\n var placeholder = el.wrap('
    ').parent();\n\n el.on('closed.fndtn.reveal.wrapped', function () {\n el.detach().appendTo(placeholder);\n el.unwrap().unbind('closed.fndtn.reveal.wrapped');\n });\n\n el.detach().appendTo(root_element);\n }\n\n var animData = getAnimationData(settings.animation);\n if (!animData.animate) {\n this.locked = false;\n }\n if (animData.pop) {\n css.top = $(window).scrollTop() - el.data('offset') + 'px';\n var end_css = {\n top: $(window).scrollTop() + el.data('css-top') + 'px',\n opacity: 1\n };\n\n return setTimeout(function () {\n return el\n .css(css)\n .animate(end_css, settings.animation_speed, 'linear', function () {\n context.locked = false;\n el.trigger('opened.fndtn.reveal');\n })\n .addClass('open');\n }, settings.animation_speed / 2);\n }\n\n css.top = $(window).scrollTop() + el.data('css-top') + 'px';\n\n if (animData.fade) {\n var end_css = {opacity: 1};\n\n return setTimeout(function () {\n return el\n .css(css)\n .animate(end_css, settings.animation_speed, 'linear', function () {\n context.locked = false;\n el.trigger('opened.fndtn.reveal');\n })\n .addClass('open');\n }, settings.animation_speed / 2);\n }\n\n return el.css(css).show().css({opacity : 1}).addClass('open').trigger('opened.fndtn.reveal');\n }\n\n var settings = this.settings;\n\n // should we animate the background?\n if (getAnimationData(settings.animation).fade) {\n return el.fadeIn(settings.animation_speed / 2);\n }\n\n this.locked = false;\n\n return el.show();\n },\n\n to_back : function(el) {\n el.addClass('toback');\n },\n\n to_front : function(el) {\n el.removeClass('toback');\n },\n\n hide : function (el, css) {\n // is modal\n if (css) {\n var settings = el.data(this.attr_name(true) + '-init'),\n context = this;\n settings = settings || this.settings;\n\n var animData = getAnimationData(settings.animation);\n if (!animData.animate) {\n this.locked = false;\n }\n if (animData.pop) {\n var end_css = {\n top: - $(window).scrollTop() - el.data('offset') + 'px',\n opacity: 0\n };\n\n return setTimeout(function () {\n return el\n .animate(end_css, settings.animation_speed, 'linear', function () {\n context.locked = false;\n el.css(css).trigger('closed.fndtn.reveal');\n })\n .removeClass('open');\n }, settings.animation_speed / 2);\n }\n\n if (animData.fade) {\n var end_css = {opacity : 0};\n\n return setTimeout(function () {\n return el\n .animate(end_css, settings.animation_speed, 'linear', function () {\n context.locked = false;\n el.css(css).trigger('closed.fndtn.reveal');\n })\n .removeClass('open');\n }, settings.animation_speed / 2);\n }\n\n return el.hide().css(css).removeClass('open').trigger('closed.fndtn.reveal');\n }\n\n var settings = this.settings;\n\n // should we animate the background?\n if (getAnimationData(settings.animation).fade) {\n return el.fadeOut(settings.animation_speed / 2);\n }\n\n return el.hide();\n },\n\n close_video : function (e) {\n var video = $('.flex-video', e.target),\n iframe = $('iframe', video);\n\n if (iframe.length > 0) {\n iframe.attr('data-src', iframe[0].src);\n iframe.attr('src', iframe.attr('src'));\n video.hide();\n }\n },\n\n open_video : function (e) {\n var video = $('.flex-video', e.target),\n iframe = video.find('iframe');\n\n if (iframe.length > 0) {\n var data_src = iframe.attr('data-src');\n if (typeof data_src === 'string') {\n iframe[0].src = iframe.attr('data-src');\n } else {\n var src = iframe[0].src;\n iframe[0].src = undefined;\n iframe[0].src = src;\n }\n video.show();\n }\n },\n\n data_attr : function (str) {\n if (this.namespace.length > 0) {\n return this.namespace + '-' + str;\n }\n\n return str;\n },\n\n cache_offset : function (modal) {\n var offset = modal.show().height() + parseInt(modal.css('top'), 10) + modal.scrollY;\n\n modal.hide();\n\n return offset;\n },\n\n off : function () {\n $(this.scope).off('.fndtn.reveal');\n },\n\n reflow : function () {}\n };\n\n /*\n * getAnimationData('popAndFade') // {animate: true, pop: true, fade: true}\n * getAnimationData('fade') // {animate: true, pop: false, fade: true}\n * getAnimationData('pop') // {animate: true, pop: true, fade: false}\n * getAnimationData('foo') // {animate: false, pop: false, fade: false}\n * getAnimationData(null) // {animate: false, pop: false, fade: false}\n */\n function getAnimationData(str) {\n var fade = /fade/i.test(str);\n var pop = /pop/i.test(str);\n return {\n animate : fade || pop,\n pop : pop,\n fade : fade\n };\n }\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.slider = {\n name : 'slider',\n\n version : '5.5.3',\n\n settings : {\n start : 0,\n end : 100,\n step : 1,\n precision : 2,\n initial : null,\n display_selector : '',\n vertical : false,\n trigger_input_change : false,\n on_change : function () {}\n },\n\n cache : {},\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'throttle');\n this.bindings(method, options);\n this.reflow();\n },\n\n events : function () {\n var self = this;\n $(this.scope)\n .off('.slider')\n .on('mousedown.fndtn.slider touchstart.fndtn.slider pointerdown.fndtn.slider',\n '[' + self.attr_name() + ']:not(.disabled, [disabled]) .range-slider-handle', function (e) {\n if (!self.cache.active) {\n e.preventDefault();\n self.set_active_slider($(e.target));\n }\n })\n .on('mousemove.fndtn.slider touchmove.fndtn.slider pointermove.fndtn.slider', function (e) {\n if (!!self.cache.active) {\n e.preventDefault();\n if ($.data(self.cache.active[0], 'settings').vertical) {\n var scroll_offset = 0;\n if (!e.pageY) {\n scroll_offset = window.scrollY;\n }\n self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset);\n } else {\n self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x'));\n }\n }\n })\n .on('mouseup.fndtn.slider touchend.fndtn.slider pointerup.fndtn.slider', function (e) {\n if(!self.cache.active) {\n // if the user has just clicked into the slider without starting to drag the handle\n var slider = $(e.target).attr('role') === 'slider' ? $(e.target) : $(e.target).closest('.range-slider').find(\"[role='slider']\");\n\n if (slider.length && (!slider.parent().hasClass('disabled') && !slider.parent().attr('disabled'))) {\n self.set_active_slider(slider);\n if ($.data(self.cache.active[0], 'settings').vertical) {\n var scroll_offset = 0;\n if (!e.pageY) {\n scroll_offset = window.scrollY;\n }\n self.calculate_position(self.cache.active, self.get_cursor_position(e, 'y') + scroll_offset);\n } else {\n self.calculate_position(self.cache.active, self.get_cursor_position(e, 'x'));\n }\n }\n }\n self.remove_active_slider();\n })\n .on('change.fndtn.slider', function (e) {\n self.settings.on_change();\n });\n\n self.S(window)\n .on('resize.fndtn.slider', self.throttle(function (e) {\n self.reflow();\n }, 300));\n\n // update slider value as users change input value\n this.S('[' + this.attr_name() + ']').each(function () {\n var slider = $(this),\n handle = slider.children('.range-slider-handle')[0],\n settings = self.initialize_settings(handle);\n\n if (settings.display_selector != '') {\n $(settings.display_selector).each(function(){\n if ($(this).attr('value')) {\n $(this).off('change').on('change', function () {\n slider.foundation(\"slider\", \"set_value\", $(this).val());\n });\n }\n });\n }\n });\n },\n\n get_cursor_position : function (e, xy) {\n var pageXY = 'page' + xy.toUpperCase(),\n clientXY = 'client' + xy.toUpperCase(),\n position;\n\n if (typeof e[pageXY] !== 'undefined') {\n position = e[pageXY];\n } else if (typeof e.originalEvent[clientXY] !== 'undefined') {\n position = e.originalEvent[clientXY];\n } else if (e.originalEvent.touches && e.originalEvent.touches[0] && typeof e.originalEvent.touches[0][clientXY] !== 'undefined') {\n position = e.originalEvent.touches[0][clientXY];\n } else if (e.currentPoint && typeof e.currentPoint[xy] !== 'undefined') {\n position = e.currentPoint[xy];\n }\n\n return position;\n },\n\n set_active_slider : function ($handle) {\n this.cache.active = $handle;\n },\n\n remove_active_slider : function () {\n this.cache.active = null;\n },\n\n calculate_position : function ($handle, cursor_x) {\n var self = this,\n settings = $.data($handle[0], 'settings'),\n handle_l = $.data($handle[0], 'handle_l'),\n handle_o = $.data($handle[0], 'handle_o'),\n bar_l = $.data($handle[0], 'bar_l'),\n bar_o = $.data($handle[0], 'bar_o');\n\n requestAnimationFrame(function () {\n var pct;\n\n if (Foundation.rtl && !settings.vertical) {\n pct = self.limit_to(((bar_o + bar_l - cursor_x) / bar_l), 0, 1);\n } else {\n pct = self.limit_to(((cursor_x - bar_o) / bar_l), 0, 1);\n }\n\n pct = settings.vertical ? 1 - pct : pct;\n\n var norm = self.normalized_value(pct, settings.start, settings.end, settings.step, settings.precision);\n\n self.set_ui($handle, norm);\n });\n },\n\n set_ui : function ($handle, value) {\n var settings = $.data($handle[0], 'settings'),\n handle_l = $.data($handle[0], 'handle_l'),\n bar_l = $.data($handle[0], 'bar_l'),\n norm_pct = this.normalized_percentage(value, settings.start, settings.end),\n handle_offset = norm_pct * (bar_l - handle_l) - 1,\n progress_bar_length = norm_pct * 100,\n $handle_parent = $handle.parent(),\n $hidden_inputs = $handle.parent().children('input[type=hidden]');\n\n if (Foundation.rtl && !settings.vertical) {\n handle_offset = -handle_offset;\n }\n\n handle_offset = settings.vertical ? -handle_offset + bar_l - handle_l + 1 : handle_offset;\n this.set_translate($handle, handle_offset, settings.vertical);\n\n if (settings.vertical) {\n $handle.siblings('.range-slider-active-segment').css('height', progress_bar_length + '%');\n } else {\n $handle.siblings('.range-slider-active-segment').css('width', progress_bar_length + '%');\n }\n\n $handle_parent.attr(this.attr_name(), value).trigger('change.fndtn.slider');\n\n $hidden_inputs.val(value);\n if (settings.trigger_input_change) {\n $hidden_inputs.trigger('change.fndtn.slider');\n }\n\n if (!$handle[0].hasAttribute('aria-valuemin')) {\n $handle.attr({\n 'aria-valuemin' : settings.start,\n 'aria-valuemax' : settings.end\n });\n }\n $handle.attr('aria-valuenow', value);\n\n if (settings.display_selector != '') {\n $(settings.display_selector).each(function () {\n if (this.hasAttribute('value')) {\n $(this).val(value);\n } else {\n $(this).text(value);\n }\n });\n }\n\n },\n\n normalized_percentage : function (val, start, end) {\n return Math.min(1, (val - start) / (end - start));\n },\n\n normalized_value : function (val, start, end, step, precision) {\n var range = end - start,\n point = val * range,\n mod = (point - (point % step)) / step,\n rem = point % step,\n round = ( rem >= step * 0.5 ? step : 0);\n return ((mod * step + round) + start).toFixed(precision);\n },\n\n set_translate : function (ele, offset, vertical) {\n if (vertical) {\n $(ele)\n .css('-webkit-transform', 'translateY(' + offset + 'px)')\n .css('-moz-transform', 'translateY(' + offset + 'px)')\n .css('-ms-transform', 'translateY(' + offset + 'px)')\n .css('-o-transform', 'translateY(' + offset + 'px)')\n .css('transform', 'translateY(' + offset + 'px)');\n } else {\n $(ele)\n .css('-webkit-transform', 'translateX(' + offset + 'px)')\n .css('-moz-transform', 'translateX(' + offset + 'px)')\n .css('-ms-transform', 'translateX(' + offset + 'px)')\n .css('-o-transform', 'translateX(' + offset + 'px)')\n .css('transform', 'translateX(' + offset + 'px)');\n }\n },\n\n limit_to : function (val, min, max) {\n return Math.min(Math.max(val, min), max);\n },\n\n initialize_settings : function (handle) {\n var settings = $.extend({}, this.settings, this.data_options($(handle).parent())),\n decimal_places_match_result;\n\n if (settings.precision === null) {\n decimal_places_match_result = ('' + settings.step).match(/\\.([\\d]*)/);\n settings.precision = decimal_places_match_result && decimal_places_match_result[1] ? decimal_places_match_result[1].length : 0;\n }\n\n if (settings.vertical) {\n $.data(handle, 'bar_o', $(handle).parent().offset().top);\n $.data(handle, 'bar_l', $(handle).parent().outerHeight());\n $.data(handle, 'handle_o', $(handle).offset().top);\n $.data(handle, 'handle_l', $(handle).outerHeight());\n } else {\n $.data(handle, 'bar_o', $(handle).parent().offset().left);\n $.data(handle, 'bar_l', $(handle).parent().outerWidth());\n $.data(handle, 'handle_o', $(handle).offset().left);\n $.data(handle, 'handle_l', $(handle).outerWidth());\n }\n\n $.data(handle, 'bar', $(handle).parent());\n return $.data(handle, 'settings', settings);\n },\n\n set_initial_position : function ($ele) {\n var settings = $.data($ele.children('.range-slider-handle')[0], 'settings'),\n initial = ((typeof settings.initial == 'number' && !isNaN(settings.initial)) ? settings.initial : Math.floor((settings.end - settings.start) * 0.5 / settings.step) * settings.step + settings.start),\n $handle = $ele.children('.range-slider-handle');\n this.set_ui($handle, initial);\n },\n\n set_value : function (value) {\n var self = this;\n $('[' + self.attr_name() + ']', this.scope).each(function () {\n $(this).attr(self.attr_name(), value);\n });\n if (!!$(this.scope).attr(self.attr_name())) {\n $(this.scope).attr(self.attr_name(), value);\n }\n self.reflow();\n },\n\n reflow : function () {\n var self = this;\n self.S('[' + this.attr_name() + ']').each(function () {\n var handle = $(this).children('.range-slider-handle')[0],\n val = $(this).attr(self.attr_name());\n self.initialize_settings(handle);\n\n if (val) {\n self.set_ui($(handle), parseFloat(val));\n } else {\n self.set_initial_position($(this));\n }\n });\n }\n };\n\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.tab = {\n name : 'tab',\n\n version : '5.5.3',\n\n settings : {\n active_class : 'active',\n callback : function () {},\n deep_linking : false,\n scroll_to_content : true,\n is_hover : false\n },\n\n default_tab_hashes : [],\n\n init : function (scope, method, options) {\n var self = this,\n S = this.S;\n\n \t // Store the default active tabs which will be referenced when the\n \t // location hash is absent, as in the case of navigating the tabs and\n \t // returning to the first viewing via the browser Back button.\n \t S('[' + this.attr_name() + '] > .active > a', this.scope).each(function () {\n \t self.default_tab_hashes.push(this.hash);\n \t });\n\n this.bindings(method, options);\n this.handle_location_hash_change();\n },\n\n events : function () {\n var self = this,\n S = this.S;\n\n var usual_tab_behavior = function (e, target) {\n var settings = S(target).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');\n if (!settings.is_hover || Modernizr.touch) {\n // if user did not pressed tab key, prevent default action\n var keyCode = e.keyCode || e.which;\n if (keyCode !== 9) { \n e.preventDefault();\n e.stopPropagation();\n }\n self.toggle_active_tab(S(target).parent());\n \n }\n };\n\n S(this.scope)\n .off('.tab')\n // Key event: focus/tab key\n .on('keydown.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {\n var keyCode = e.keyCode || e.which;\n // if user pressed tab key\n if (keyCode === 13 || keyCode === 32) { // enter or space\n var el = this;\n usual_tab_behavior(e, el);\n } \n })\n // Click event: tab title\n .on('click.fndtn.tab', '[' + this.attr_name() + '] > * > a', function(e) {\n var el = this;\n usual_tab_behavior(e, el);\n })\n // Hover event: tab title\n .on('mouseenter.fndtn.tab', '[' + this.attr_name() + '] > * > a', function (e) {\n var settings = S(this).closest('[' + self.attr_name() + ']').data(self.attr_name(true) + '-init');\n if (settings.is_hover) {\n self.toggle_active_tab(S(this).parent());\n }\n });\n\n // Location hash change event\n S(window).on('hashchange.fndtn.tab', function (e) {\n e.preventDefault();\n self.handle_location_hash_change();\n });\n },\n\n handle_location_hash_change : function () {\n\n var self = this,\n S = this.S;\n\n S('[' + this.attr_name() + ']', this.scope).each(function () {\n var settings = S(this).data(self.attr_name(true) + '-init');\n if (settings.deep_linking) {\n // Match the location hash to a label\n var hash;\n if (settings.scroll_to_content) {\n hash = self.scope.location.hash;\n } else {\n // prefix the hash to prevent anchor scrolling\n hash = self.scope.location.hash.replace('fndtn-', '');\n }\n if (hash != '') {\n // Check whether the location hash references a tab content div or\n // another element on the page (inside or outside the tab content div)\n var hash_element = S(hash);\n if (hash_element.hasClass('content') && hash_element.parent().hasClass('tabs-content')) {\n // Tab content div\n self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + hash + ']').parent());\n } else {\n // Not the tab content div. If inside the tab content, find the\n // containing tab and toggle it as active.\n var hash_tab_container_id = hash_element.closest('.content').attr('id');\n if (hash_tab_container_id != undefined) {\n self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=#' + hash_tab_container_id + ']').parent(), hash);\n }\n }\n } else {\n // Reference the default tab hashes which were initialized in the init function\n for (var ind = 0; ind < self.default_tab_hashes.length; ind++) {\n self.toggle_active_tab($('[' + self.attr_name() + '] > * > a[href=' + self.default_tab_hashes[ind] + ']').parent());\n }\n }\n }\n });\n },\n\n toggle_active_tab : function (tab, location_hash) {\n var self = this,\n S = self.S,\n tabs = tab.closest('[' + this.attr_name() + ']'),\n tab_link = tab.find('a'),\n anchor = tab.children('a').first(),\n target_hash = '#' + anchor.attr('href').split('#')[1],\n target = S(target_hash),\n siblings = tab.siblings(),\n settings = tabs.data(this.attr_name(true) + '-init'),\n interpret_keyup_action = function (e) {\n // Light modification of Heydon Pickering's Practical ARIA Examples: http://heydonworks.com/practical_aria_examples/js/a11y.js\n\n // define current, previous and next (possible) tabs\n\n var $original = $(this);\n var $prev = $(this).parents('li').prev().children('[role=\"tab\"]');\n var $next = $(this).parents('li').next().children('[role=\"tab\"]');\n var $target;\n\n // find the direction (prev or next)\n\n switch (e.keyCode) {\n case 37:\n $target = $prev;\n break;\n case 39:\n $target = $next;\n break;\n default:\n $target = false\n break;\n }\n\n if ($target.length) {\n $original.attr({\n 'tabindex' : '-1',\n 'aria-selected' : null\n });\n $target.attr({\n 'tabindex' : '0',\n 'aria-selected' : true\n }).focus();\n }\n\n // Hide panels\n\n $('[role=\"tabpanel\"]')\n .attr('aria-hidden', 'true');\n\n // Show panel which corresponds to target\n\n $('#' + $(document.activeElement).attr('href').substring(1))\n .attr('aria-hidden', null);\n\n },\n go_to_hash = function(hash) {\n // This function allows correct behaviour of the browser's back button when deep linking is enabled. Without it\n // the user would get continually redirected to the default hash.\n var default_hash = settings.scroll_to_content ? self.default_tab_hashes[0] : 'fndtn-' + self.default_tab_hashes[0].replace('#', '');\n\n if (hash !== default_hash || window.location.hash) {\n window.location.hash = hash;\n }\n };\n\n // allow usage of data-tab-content attribute instead of href\n if (anchor.data('tab-content')) {\n target_hash = '#' + anchor.data('tab-content').split('#')[1];\n target = S(target_hash);\n }\n\n if (settings.deep_linking) {\n\n if (settings.scroll_to_content) {\n\n // retain current hash to scroll to content\n go_to_hash(location_hash || target_hash);\n\n if (location_hash == undefined || location_hash == target_hash) {\n tab.parent()[0].scrollIntoView();\n } else {\n S(target_hash)[0].scrollIntoView();\n }\n } else {\n // prefix the hashes so that the browser doesn't scroll down\n if (location_hash != undefined) {\n go_to_hash('fndtn-' + location_hash.replace('#', ''));\n } else {\n go_to_hash('fndtn-' + target_hash.replace('#', ''));\n }\n }\n }\n\n // WARNING: The activation and deactivation of the tab content must\n // occur after the deep linking in order to properly refresh the browser\n // window (notably in Chrome).\n // Clean up multiple attr instances to done once\n tab.addClass(settings.active_class).triggerHandler('opened');\n tab_link.attr({'aria-selected' : 'true', tabindex : 0});\n siblings.removeClass(settings.active_class)\n siblings.find('a').attr({'aria-selected' : 'false'/*, tabindex : -1*/});\n target.siblings().removeClass(settings.active_class).attr({'aria-hidden' : 'true'/*, tabindex : -1*/});\n target.addClass(settings.active_class).attr('aria-hidden', 'false').removeAttr('tabindex');\n settings.callback(tab);\n target.triggerHandler('toggled', [target]);\n tabs.triggerHandler('toggled', [tab]);\n\n tab_link.off('keydown').on('keydown', interpret_keyup_action );\n },\n\n data_attr : function (str) {\n if (this.namespace.length > 0) {\n return this.namespace + '-' + str;\n }\n\n return str;\n },\n\n off : function () {},\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.tooltip = {\n name : 'tooltip',\n\n version : '5.5.3',\n\n settings : {\n additional_inheritable_classes : [],\n tooltip_class : '.tooltip',\n append_to : 'body',\n touch_close_text : 'Tap To Close',\n disable_for_touch : false,\n hover_delay : 200,\n fade_in_duration : 150,\n fade_out_duration : 150,\n show_on : 'all',\n tip_template : function (selector, content) {\n return '' + content + '';\n }\n },\n\n cache : {},\n\n init : function (scope, method, options) {\n Foundation.inherit(this, 'random_str');\n this.bindings(method, options);\n },\n\n should_show : function (target, tip) {\n var settings = $.extend({}, this.settings, this.data_options(target));\n\n if (settings.show_on === 'all') {\n return true;\n } else if (this.small() && settings.show_on === 'small') {\n return true;\n } else if (this.medium() && settings.show_on === 'medium') {\n return true;\n } else if (this.large() && settings.show_on === 'large') {\n return true;\n }\n return false;\n },\n\n medium : function () {\n return matchMedia(Foundation.media_queries['medium']).matches;\n },\n\n large : function () {\n return matchMedia(Foundation.media_queries['large']).matches;\n },\n\n events : function (instance) {\n var self = this,\n S = self.S;\n\n self.create(this.S(instance));\n\n function _startShow(elt, $this, immediate) {\n if (elt.timer) {\n return;\n }\n\n if (immediate) {\n elt.timer = null;\n self.showTip($this);\n } else {\n elt.timer = setTimeout(function () {\n elt.timer = null;\n self.showTip($this);\n }.bind(elt), self.settings.hover_delay);\n }\n }\n\n function _startHide(elt, $this) {\n if (elt.timer) {\n clearTimeout(elt.timer);\n elt.timer = null;\n }\n\n self.hide($this);\n }\n\n $(this.scope)\n .off('.tooltip')\n .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip',\n '[' + this.attr_name() + ']', function (e) {\n var $this = S(this),\n settings = $.extend({}, self.settings, self.data_options($this)),\n is_touch = false;\n\n if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type) && S(e.target).is('a')) {\n return false;\n }\n\n if (/mouse/i.test(e.type) && self.ie_touch(e)) {\n return false;\n }\n \n if ($this.hasClass('open')) {\n if (Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) {\n e.preventDefault();\n }\n self.hide($this);\n } else {\n if (settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) {\n return;\n } else if (!settings.disable_for_touch && Modernizr.touch && /touchstart|MSPointerDown/i.test(e.type)) {\n e.preventDefault();\n S(settings.tooltip_class + '.open').hide();\n is_touch = true;\n // close other open tooltips on touch\n if ($('.open[' + self.attr_name() + ']').length > 0) {\n var prevOpen = S($('.open[' + self.attr_name() + ']')[0]);\n self.hide(prevOpen);\n }\n }\n\n if (/enter|over/i.test(e.type)) {\n _startShow(this, $this);\n\n } else if (e.type === 'mouseout' || e.type === 'mouseleave') {\n _startHide(this, $this);\n } else {\n _startShow(this, $this, true);\n }\n }\n })\n .on('mouseleave.fndtn.tooltip touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', '[' + this.attr_name() + '].open', function (e) {\n if (/mouse/i.test(e.type) && self.ie_touch(e)) {\n return false;\n }\n\n if ($(this).data('tooltip-open-event-type') == 'touch' && e.type == 'mouseleave') {\n return;\n } else if ($(this).data('tooltip-open-event-type') == 'mouse' && /MSPointerDown|touchstart/i.test(e.type)) {\n self.convert_to_touch($(this));\n } else {\n _startHide(this, $(this));\n }\n })\n .on('DOMNodeRemoved DOMAttrModified', '[' + this.attr_name() + ']:not(a)', function (e) {\n _startHide(this, S(this));\n });\n },\n\n ie_touch : function (e) {\n // How do I distinguish between IE11 and Windows Phone 8?????\n return false;\n },\n\n showTip : function ($target) {\n var $tip = this.getTip($target);\n if (this.should_show($target, $tip)) {\n return this.show($target);\n }\n return;\n },\n\n getTip : function ($target) {\n var selector = this.selector($target),\n settings = $.extend({}, this.settings, this.data_options($target)),\n tip = null;\n\n if (selector) {\n tip = this.S('span[data-selector=\"' + selector + '\"]' + settings.tooltip_class);\n }\n\n return (typeof tip === 'object') ? tip : false;\n },\n\n selector : function ($target) {\n var dataSelector = $target.attr(this.attr_name()) || $target.attr('data-selector');\n\n if (typeof dataSelector != 'string') {\n dataSelector = this.random_str(6);\n $target\n .attr('data-selector', dataSelector)\n .attr('aria-describedby', dataSelector);\n }\n\n return dataSelector;\n },\n\n create : function ($target) {\n var self = this,\n settings = $.extend({}, this.settings, this.data_options($target)),\n tip_template = this.settings.tip_template;\n\n if (typeof settings.tip_template === 'string' && window.hasOwnProperty(settings.tip_template)) {\n tip_template = window[settings.tip_template];\n }\n\n var $tip = $(tip_template(this.selector($target), $('
    ').html($target.attr('title')).html())),\n classes = this.inheritable_classes($target);\n\n $tip.addClass(classes).appendTo(settings.append_to);\n\n if (Modernizr.touch) {\n $tip.append('' + settings.touch_close_text + '');\n $tip.on('touchstart.fndtn.tooltip MSPointerDown.fndtn.tooltip', function (e) {\n self.hide($target);\n });\n }\n\n $target.removeAttr('title').attr('title', '');\n },\n\n reposition : function (target, tip, classes) {\n var width, nub, nubHeight, nubWidth, objPos;\n\n tip.css('visibility', 'hidden').show();\n\n width = target.data('width');\n nub = tip.children('.nub');\n nubHeight = nub.outerHeight();\n nubWidth = nub.outerWidth();\n\n if (this.small()) {\n tip.css({'width' : '100%'});\n } else {\n tip.css({'width' : (width) ? width : 'auto'});\n }\n\n objPos = function (obj, top, right, bottom, left, width) {\n return obj.css({\n 'top' : (top) ? top : 'auto',\n 'bottom' : (bottom) ? bottom : 'auto',\n 'left' : (left) ? left : 'auto',\n 'right' : (right) ? right : 'auto'\n }).end();\n };\n \n var o_top = target.offset().top;\n var o_left = target.offset().left;\n var outerHeight = target.outerHeight();\n\n objPos(tip, (o_top + outerHeight + 10), 'auto', 'auto', o_left);\n\n if (this.small()) {\n objPos(tip, (o_top + outerHeight + 10), 'auto', 'auto', 12.5, $(this.scope).width());\n tip.addClass('tip-override');\n objPos(nub, -nubHeight, 'auto', 'auto', o_left);\n } else {\n \n if (Foundation.rtl) {\n nub.addClass('rtl');\n o_left = o_left + target.outerWidth() - tip.outerWidth();\n }\n\n objPos(tip, (o_top + outerHeight + 10), 'auto', 'auto', o_left);\n // reset nub from small styles, if they've been applied\n if (nub.attr('style')) {\n nub.removeAttr('style');\n }\n \n tip.removeClass('tip-override');\n \n var tip_outerHeight = tip.outerHeight();\n \n if (classes && classes.indexOf('tip-top') > -1) {\n if (Foundation.rtl) {\n nub.addClass('rtl');\n }\n objPos(tip, (o_top - tip_outerHeight), 'auto', 'auto', o_left)\n .removeClass('tip-override');\n } else if (classes && classes.indexOf('tip-left') > -1) {\n objPos(tip, (o_top + (outerHeight / 2) - (tip_outerHeight / 2)), 'auto', 'auto', (o_left - tip.outerWidth() - nubHeight))\n .removeClass('tip-override');\n nub.removeClass('rtl');\n } else if (classes && classes.indexOf('tip-right') > -1) {\n objPos(tip, (o_top + (outerHeight / 2) - (tip_outerHeight / 2)), 'auto', 'auto', (o_left + target.outerWidth() + nubHeight))\n .removeClass('tip-override');\n nub.removeClass('rtl');\n }\n }\n\n tip.css('visibility', 'visible').hide();\n },\n\n small : function () {\n return matchMedia(Foundation.media_queries.small).matches &&\n !matchMedia(Foundation.media_queries.medium).matches;\n },\n\n inheritable_classes : function ($target) {\n var settings = $.extend({}, this.settings, this.data_options($target)),\n inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'radius', 'round'].concat(settings.additional_inheritable_classes),\n classes = $target.attr('class'),\n filtered = classes ? $.map(classes.split(' '), function (el, i) {\n if ($.inArray(el, inheritables) !== -1) {\n return el;\n }\n }).join(' ') : '';\n\n return $.trim(filtered);\n },\n\n convert_to_touch : function ($target) {\n var self = this,\n $tip = self.getTip($target),\n settings = $.extend({}, self.settings, self.data_options($target));\n\n if ($tip.find('.tap-to-close').length === 0) {\n $tip.append('' + settings.touch_close_text + '');\n $tip.on('click.fndtn.tooltip.tapclose touchstart.fndtn.tooltip.tapclose MSPointerDown.fndtn.tooltip.tapclose', function (e) {\n self.hide($target);\n });\n }\n\n $target.data('tooltip-open-event-type', 'touch');\n },\n\n show : function ($target) {\n var $tip = this.getTip($target);\n if ($target.data('tooltip-open-event-type') == 'touch') {\n this.convert_to_touch($target);\n }\n\n this.reposition($target, $tip, $target.attr('class'));\n $target.addClass('open');\n $tip.fadeIn(this.settings.fade_in_duration);\n },\n\n hide : function ($target) {\n var $tip = this.getTip($target);\n\n $tip.fadeOut(this.settings.fade_out_duration, function () {\n $tip.find('.tap-to-close').remove();\n $tip.off('click.fndtn.tooltip.tapclose MSPointerDown.fndtn.tapclose');\n $target.removeClass('open');\n });\n },\n\n off : function () {\n var self = this;\n this.S(this.scope).off('.fndtn.tooltip');\n this.S(this.settings.tooltip_class).each(function (i) {\n $('[' + self.attr_name() + ']').eq(i).attr('title', $(this).text());\n }).remove();\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n\n;(function ($, window, document, undefined) {\n 'use strict';\n\n Foundation.libs.topbar = {\n name : 'topbar',\n\n version : '5.5.3',\n\n settings : {\n index : 0,\n start_offset : 0,\n sticky_class : 'sticky',\n custom_back_text : true,\n back_text : 'Back',\n mobile_show_parent_link : true,\n is_hover : true,\n scrolltop : true, // jump to top when sticky nav menu toggle is clicked\n sticky_on : 'all',\n dropdown_autoclose: true\n },\n\n init : function (section, method, options) {\n Foundation.inherit(this, 'add_custom_rule register_media throttle');\n var self = this;\n\n self.register_media('topbar', 'foundation-mq-topbar');\n\n this.bindings(method, options);\n\n self.S('[' + this.attr_name() + ']', this.scope).each(function () {\n var topbar = $(this),\n settings = topbar.data(self.attr_name(true) + '-init'),\n section = self.S('section, .top-bar-section', this);\n topbar.data('index', 0);\n var topbarContainer = topbar.parent();\n if (topbarContainer.hasClass('fixed') || self.is_sticky(topbar, topbarContainer, settings) ) {\n self.settings.sticky_class = settings.sticky_class;\n self.settings.sticky_topbar = topbar;\n topbar.data('height', topbarContainer.outerHeight());\n topbar.data('stickyoffset', topbarContainer.offset().top);\n } else {\n topbar.data('height', topbar.outerHeight());\n }\n\n if (!settings.assembled) {\n self.assemble(topbar);\n }\n\n if (settings.is_hover) {\n self.S('.has-dropdown', topbar).addClass('not-click');\n } else {\n self.S('.has-dropdown', topbar).removeClass('not-click');\n }\n\n // Pad body when sticky (scrolled) or fixed.\n self.add_custom_rule('.f-topbar-fixed { padding-top: ' + topbar.data('height') + 'px }');\n\n if (topbarContainer.hasClass('fixed')) {\n self.S('body').addClass('f-topbar-fixed');\n }\n });\n\n },\n\n is_sticky : function (topbar, topbarContainer, settings) {\n var sticky = topbarContainer.hasClass(settings.sticky_class);\n var smallMatch = matchMedia(Foundation.media_queries.small).matches;\n var medMatch = matchMedia(Foundation.media_queries.medium).matches;\n var lrgMatch = matchMedia(Foundation.media_queries.large).matches;\n\n if (sticky && settings.sticky_on === 'all') {\n return true;\n }\n if (sticky && this.small() && settings.sticky_on.indexOf('small') !== -1) {\n if (smallMatch && !medMatch && !lrgMatch) { return true; }\n }\n if (sticky && this.medium() && settings.sticky_on.indexOf('medium') !== -1) {\n if (smallMatch && medMatch && !lrgMatch) { return true; }\n }\n if (sticky && this.large() && settings.sticky_on.indexOf('large') !== -1) {\n if (smallMatch && medMatch && lrgMatch) { return true; }\n }\n\n return false;\n },\n\n toggle : function (toggleEl) {\n var self = this,\n topbar;\n\n if (toggleEl) {\n topbar = self.S(toggleEl).closest('[' + this.attr_name() + ']');\n } else {\n topbar = self.S('[' + this.attr_name() + ']');\n }\n\n var settings = topbar.data(this.attr_name(true) + '-init');\n\n var section = self.S('section, .top-bar-section', topbar);\n\n if (self.breakpoint()) {\n if (!self.rtl) {\n section.css({left : '0%'});\n $('>.name', section).css({left : '100%'});\n } else {\n section.css({right : '0%'});\n $('>.name', section).css({right : '100%'});\n }\n\n self.S('li.moved', section).removeClass('moved');\n topbar.data('index', 0);\n\n topbar\n .toggleClass('expanded')\n .css('height', '');\n }\n\n if (settings.scrolltop) {\n if (!topbar.hasClass('expanded')) {\n if (topbar.hasClass('fixed')) {\n topbar.parent().addClass('fixed');\n topbar.removeClass('fixed');\n self.S('body').addClass('f-topbar-fixed');\n }\n } else if (topbar.parent().hasClass('fixed')) {\n if (settings.scrolltop) {\n topbar.parent().removeClass('fixed');\n topbar.addClass('fixed');\n self.S('body').removeClass('f-topbar-fixed');\n\n window.scrollTo(0, 0);\n } else {\n topbar.parent().removeClass('expanded');\n }\n }\n } else {\n if (self.is_sticky(topbar, topbar.parent(), settings)) {\n topbar.parent().addClass('fixed');\n }\n\n if (topbar.parent().hasClass('fixed')) {\n if (!topbar.hasClass('expanded')) {\n topbar.removeClass('fixed');\n topbar.parent().removeClass('expanded');\n self.update_sticky_positioning();\n } else {\n topbar.addClass('fixed');\n topbar.parent().addClass('expanded');\n self.S('body').addClass('f-topbar-fixed');\n }\n }\n }\n },\n\n timer : null,\n\n events : function (bar) {\n var self = this,\n S = this.S;\n\n S(this.scope)\n .off('.topbar')\n .on('click.fndtn.topbar', '[' + this.attr_name() + '] .toggle-topbar', function (e) {\n e.preventDefault();\n self.toggle(this);\n })\n .on('click.fndtn.topbar contextmenu.fndtn.topbar', '.top-bar .top-bar-section li a[href^=\"#\"],[' + this.attr_name() + '] .top-bar-section li a[href^=\"#\"]', function (e) {\n var li = $(this).closest('li'),\n topbar = li.closest('[' + self.attr_name() + ']'),\n settings = topbar.data(self.attr_name(true) + '-init');\n\n if (settings.dropdown_autoclose && settings.is_hover) {\n var hoverLi = $(this).closest('.hover');\n hoverLi.removeClass('hover');\n }\n if (self.breakpoint() && !li.hasClass('back') && !li.hasClass('has-dropdown')) {\n self.toggle();\n }\n\n })\n .on('click.fndtn.topbar', '[' + this.attr_name() + '] li.has-dropdown', function (e) {\n var li = S(this),\n target = S(e.target),\n topbar = li.closest('[' + self.attr_name() + ']'),\n settings = topbar.data(self.attr_name(true) + '-init');\n\n if (target.data('revealId')) {\n self.toggle();\n return;\n }\n\n if (self.breakpoint()) {\n return;\n }\n\n if (settings.is_hover && !Modernizr.touch) {\n return;\n }\n\n e.stopImmediatePropagation();\n\n if (li.hasClass('hover')) {\n li\n .removeClass('hover')\n .find('li')\n .removeClass('hover');\n\n li.parents('li.hover')\n .removeClass('hover');\n } else {\n li.addClass('hover');\n\n $(li).siblings().removeClass('hover');\n\n if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) {\n e.preventDefault();\n }\n }\n })\n .on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown>a', function (e) {\n if (self.breakpoint()) {\n\n e.preventDefault();\n\n var $this = S(this),\n topbar = $this.closest('[' + self.attr_name() + ']'),\n section = topbar.find('section, .top-bar-section'),\n dropdownHeight = $this.next('.dropdown').outerHeight(),\n $selectedLi = $this.closest('li');\n\n topbar.data('index', topbar.data('index') + 1);\n $selectedLi.addClass('moved');\n\n if (!self.rtl) {\n section.css({left : -(100 * topbar.data('index')) + '%'});\n section.find('>.name').css({left : 100 * topbar.data('index') + '%'});\n } else {\n section.css({right : -(100 * topbar.data('index')) + '%'});\n section.find('>.name').css({right : 100 * topbar.data('index') + '%'});\n }\n\n topbar.css('height', $this.siblings('ul').outerHeight(true) + topbar.data('height'));\n }\n });\n\n S(window).off('.topbar').on('resize.fndtn.topbar', self.throttle(function () {\n self.resize.call(self);\n }, 50)).trigger('resize.fndtn.topbar').load(function () {\n // Ensure that the offset is calculated after all of the pages resources have loaded\n S(this).trigger('resize.fndtn.topbar');\n });\n\n S('body').off('.topbar').on('click.fndtn.topbar', function (e) {\n var parent = S(e.target).closest('li').closest('li.hover');\n\n if (parent.length > 0) {\n return;\n }\n\n S('[' + self.attr_name() + '] li.hover').removeClass('hover');\n });\n\n // Go up a level on Click\n S(this.scope).on('click.fndtn.topbar', '[' + this.attr_name() + '] .has-dropdown .back', function (e) {\n e.preventDefault();\n\n var $this = S(this),\n topbar = $this.closest('[' + self.attr_name() + ']'),\n section = topbar.find('section, .top-bar-section'),\n settings = topbar.data(self.attr_name(true) + '-init'),\n $movedLi = $this.closest('li.moved'),\n $previousLevelUl = $movedLi.parent();\n\n topbar.data('index', topbar.data('index') - 1);\n\n if (!self.rtl) {\n section.css({left : -(100 * topbar.data('index')) + '%'});\n section.find('>.name').css({left : 100 * topbar.data('index') + '%'});\n } else {\n section.css({right : -(100 * topbar.data('index')) + '%'});\n section.find('>.name').css({right : 100 * topbar.data('index') + '%'});\n }\n\n if (topbar.data('index') === 0) {\n topbar.css('height', '');\n } else {\n topbar.css('height', $previousLevelUl.outerHeight(true) + topbar.data('height'));\n }\n\n setTimeout(function () {\n $movedLi.removeClass('moved');\n }, 300);\n });\n\n // Show dropdown menus when their items are focused\n S(this.scope).find('.dropdown a')\n .focus(function () {\n $(this).parents('.has-dropdown').addClass('hover');\n })\n .blur(function () {\n $(this).parents('.has-dropdown').removeClass('hover');\n });\n },\n\n resize : function () {\n var self = this;\n self.S('[' + this.attr_name() + ']').each(function () {\n var topbar = self.S(this),\n settings = topbar.data(self.attr_name(true) + '-init');\n\n var stickyContainer = topbar.parent('.' + self.settings.sticky_class);\n var stickyOffset;\n\n if (!self.breakpoint()) {\n var doToggle = topbar.hasClass('expanded');\n topbar\n .css('height', '')\n .removeClass('expanded')\n .find('li')\n .removeClass('hover');\n\n if (doToggle) {\n self.toggle(topbar);\n }\n }\n\n if (self.is_sticky(topbar, stickyContainer, settings)) {\n if (stickyContainer.hasClass('fixed')) {\n // Remove the fixed to allow for correct calculation of the offset.\n stickyContainer.removeClass('fixed');\n\n stickyOffset = stickyContainer.offset().top;\n if (self.S(document.body).hasClass('f-topbar-fixed')) {\n stickyOffset -= topbar.data('height');\n }\n\n topbar.data('stickyoffset', stickyOffset);\n stickyContainer.addClass('fixed');\n } else {\n stickyOffset = stickyContainer.offset().top;\n topbar.data('stickyoffset', stickyOffset);\n }\n }\n\n });\n },\n\n breakpoint : function () {\n return !matchMedia(Foundation.media_queries['topbar']).matches;\n },\n\n small : function () {\n return matchMedia(Foundation.media_queries['small']).matches;\n },\n\n medium : function () {\n return matchMedia(Foundation.media_queries['medium']).matches;\n },\n\n large : function () {\n return matchMedia(Foundation.media_queries['large']).matches;\n },\n\n assemble : function (topbar) {\n var self = this,\n settings = topbar.data(this.attr_name(true) + '-init'),\n section = self.S('section, .top-bar-section', topbar);\n\n // Pull element out of the DOM for manipulation\n section.detach();\n\n self.S('.has-dropdown>a', section).each(function () {\n var $link = self.S(this),\n $dropdown = $link.siblings('.dropdown'),\n url = $link.attr('href'),\n $titleLi;\n\n if (!$dropdown.find('.title.back').length) {\n\n if (settings.mobile_show_parent_link == true && url) {\n $titleLi = $('
  2. ');\n } else {\n $titleLi = $('
  3. ');\n }\n\n // Copy link to subnav\n if (settings.custom_back_text == true) {\n $('h5>a', $titleLi).html(settings.back_text);\n } else {\n $('h5>a', $titleLi).html('« ' + $link.html());\n }\n $dropdown.prepend($titleLi);\n }\n });\n\n // Put element back in the DOM\n section.appendTo(topbar);\n\n // check for sticky\n this.sticky();\n\n this.assembled(topbar);\n },\n\n assembled : function (topbar) {\n topbar.data(this.attr_name(true), $.extend({}, topbar.data(this.attr_name(true)), {assembled : true}));\n },\n\n height : function (ul) {\n var total = 0,\n self = this;\n\n $('> li', ul).each(function () {\n total += self.S(this).outerHeight(true);\n });\n\n return total;\n },\n\n sticky : function () {\n var self = this;\n\n this.S(window).on('scroll', function () {\n self.update_sticky_positioning();\n });\n },\n\n update_sticky_positioning : function () {\n var klass = '.' + this.settings.sticky_class,\n $window = this.S(window),\n self = this;\n\n if (self.settings.sticky_topbar && self.is_sticky(this.settings.sticky_topbar,this.settings.sticky_topbar.parent(), this.settings)) {\n var distance = this.settings.sticky_topbar.data('stickyoffset') + this.settings.start_offset;\n if (!self.S(klass).hasClass('expanded')) {\n if ($window.scrollTop() > (distance)) {\n if (!self.S(klass).hasClass('fixed')) {\n self.S(klass).addClass('fixed');\n self.S('body').addClass('f-topbar-fixed');\n }\n } else if ($window.scrollTop() <= distance) {\n if (self.S(klass).hasClass('fixed')) {\n self.S(klass).removeClass('fixed');\n self.S('body').removeClass('f-topbar-fixed');\n }\n }\n }\n }\n },\n\n off : function () {\n this.S(this.scope).off('.fndtn.topbar');\n this.S(window).off('.fndtn.topbar');\n },\n\n reflow : function () {}\n };\n}(jQuery, window, window.document));\n","/*\nCopyright 2012 Igor Vaynberg\n\nVersion: @@ver@@ Timestamp: @@timestamp@@\n\nThis software is licensed under the Apache License, Version 2.0 (the \"Apache License\") or the GNU\nGeneral Public License version 2 (the \"GPL License\"). You may choose either license to govern your\nuse of this software only upon the condition that you accept all of the terms of either the Apache\nLicense or the GPL License.\n\nYou may obtain a copy of the Apache License and the GPL License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n http://www.gnu.org/licenses/gpl-2.0.html\n\nUnless required by applicable law or agreed to in writing, software distributed under the\nApache License or the GPL License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for\nthe specific language governing permissions and limitations under the Apache License and the GPL License.\n*/\n(function ($) {\n if(typeof $.fn.each2 == \"undefined\") {\n $.extend($.fn, {\n /*\n * 4-10 times faster .each replacement\n * use it carefully, as it overrides jQuery context of element on each iteration\n */\n each2 : function (c) {\n var j = $([0]), i = -1, l = this.length;\n while (\n ++i < l\n && (j.context = j[0] = this[i])\n && c.call(j[0], i, j) !== false //\"this\"=DOM, i=index, j=jQuery object\n );\n return this;\n }\n });\n }\n})(jQuery);\n\n(function ($, undefined) {\n \"use strict\";\n /*global document, window, jQuery, console */\n\n if (window.Select2 !== undefined) {\n return;\n }\n\n var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,\n lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,\n\n KEY = {\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n HOME: 36,\n END: 35,\n BACKSPACE: 8,\n DELETE: 46,\n isArrow: function (k) {\n k = k.which ? k.which : k;\n switch (k) {\n case KEY.LEFT:\n case KEY.RIGHT:\n case KEY.UP:\n case KEY.DOWN:\n return true;\n }\n return false;\n },\n isControl: function (e) {\n var k = e.which;\n switch (k) {\n case KEY.SHIFT:\n case KEY.CTRL:\n case KEY.ALT:\n return true;\n }\n\n if (e.metaKey) return true;\n\n return false;\n },\n isFunctionKey: function (k) {\n k = k.which ? k.which : k;\n return k >= 112 && k <= 123;\n }\n },\n MEASURE_SCROLLBAR_TEMPLATE = \"
    \",\n\n DIACRITICS = {\"\\u24B6\":\"A\",\"\\uFF21\":\"A\",\"\\u00C0\":\"A\",\"\\u00C1\":\"A\",\"\\u00C2\":\"A\",\"\\u1EA6\":\"A\",\"\\u1EA4\":\"A\",\"\\u1EAA\":\"A\",\"\\u1EA8\":\"A\",\"\\u00C3\":\"A\",\"\\u0100\":\"A\",\"\\u0102\":\"A\",\"\\u1EB0\":\"A\",\"\\u1EAE\":\"A\",\"\\u1EB4\":\"A\",\"\\u1EB2\":\"A\",\"\\u0226\":\"A\",\"\\u01E0\":\"A\",\"\\u00C4\":\"A\",\"\\u01DE\":\"A\",\"\\u1EA2\":\"A\",\"\\u00C5\":\"A\",\"\\u01FA\":\"A\",\"\\u01CD\":\"A\",\"\\u0200\":\"A\",\"\\u0202\":\"A\",\"\\u1EA0\":\"A\",\"\\u1EAC\":\"A\",\"\\u1EB6\":\"A\",\"\\u1E00\":\"A\",\"\\u0104\":\"A\",\"\\u023A\":\"A\",\"\\u2C6F\":\"A\",\"\\uA732\":\"AA\",\"\\u00C6\":\"AE\",\"\\u01FC\":\"AE\",\"\\u01E2\":\"AE\",\"\\uA734\":\"AO\",\"\\uA736\":\"AU\",\"\\uA738\":\"AV\",\"\\uA73A\":\"AV\",\"\\uA73C\":\"AY\",\"\\u24B7\":\"B\",\"\\uFF22\":\"B\",\"\\u1E02\":\"B\",\"\\u1E04\":\"B\",\"\\u1E06\":\"B\",\"\\u0243\":\"B\",\"\\u0182\":\"B\",\"\\u0181\":\"B\",\"\\u24B8\":\"C\",\"\\uFF23\":\"C\",\"\\u0106\":\"C\",\"\\u0108\":\"C\",\"\\u010A\":\"C\",\"\\u010C\":\"C\",\"\\u00C7\":\"C\",\"\\u1E08\":\"C\",\"\\u0187\":\"C\",\"\\u023B\":\"C\",\"\\uA73E\":\"C\",\"\\u24B9\":\"D\",\"\\uFF24\":\"D\",\"\\u1E0A\":\"D\",\"\\u010E\":\"D\",\"\\u1E0C\":\"D\",\"\\u1E10\":\"D\",\"\\u1E12\":\"D\",\"\\u1E0E\":\"D\",\"\\u0110\":\"D\",\"\\u018B\":\"D\",\"\\u018A\":\"D\",\"\\u0189\":\"D\",\"\\uA779\":\"D\",\"\\u01F1\":\"DZ\",\"\\u01C4\":\"DZ\",\"\\u01F2\":\"Dz\",\"\\u01C5\":\"Dz\",\"\\u24BA\":\"E\",\"\\uFF25\":\"E\",\"\\u00C8\":\"E\",\"\\u00C9\":\"E\",\"\\u00CA\":\"E\",\"\\u1EC0\":\"E\",\"\\u1EBE\":\"E\",\"\\u1EC4\":\"E\",\"\\u1EC2\":\"E\",\"\\u1EBC\":\"E\",\"\\u0112\":\"E\",\"\\u1E14\":\"E\",\"\\u1E16\":\"E\",\"\\u0114\":\"E\",\"\\u0116\":\"E\",\"\\u00CB\":\"E\",\"\\u1EBA\":\"E\",\"\\u011A\":\"E\",\"\\u0204\":\"E\",\"\\u0206\":\"E\",\"\\u1EB8\":\"E\",\"\\u1EC6\":\"E\",\"\\u0228\":\"E\",\"\\u1E1C\":\"E\",\"\\u0118\":\"E\",\"\\u1E18\":\"E\",\"\\u1E1A\":\"E\",\"\\u0190\":\"E\",\"\\u018E\":\"E\",\"\\u24BB\":\"F\",\"\\uFF26\":\"F\",\"\\u1E1E\":\"F\",\"\\u0191\":\"F\",\"\\uA77B\":\"F\",\"\\u24BC\":\"G\",\"\\uFF27\":\"G\",\"\\u01F4\":\"G\",\"\\u011C\":\"G\",\"\\u1E20\":\"G\",\"\\u011E\":\"G\",\"\\u0120\":\"G\",\"\\u01E6\":\"G\",\"\\u0122\":\"G\",\"\\u01E4\":\"G\",\"\\u0193\":\"G\",\"\\uA7A0\":\"G\",\"\\uA77D\":\"G\",\"\\uA77E\":\"G\",\"\\u24BD\":\"H\",\"\\uFF28\":\"H\",\"\\u0124\":\"H\",\"\\u1E22\":\"H\",\"\\u1E26\":\"H\",\"\\u021E\":\"H\",\"\\u1E24\":\"H\",\"\\u1E28\":\"H\",\"\\u1E2A\":\"H\",\"\\u0126\":\"H\",\"\\u2C67\":\"H\",\"\\u2C75\":\"H\",\"\\uA78D\":\"H\",\"\\u24BE\":\"I\",\"\\uFF29\":\"I\",\"\\u00CC\":\"I\",\"\\u00CD\":\"I\",\"\\u00CE\":\"I\",\"\\u0128\":\"I\",\"\\u012A\":\"I\",\"\\u012C\":\"I\",\"\\u0130\":\"I\",\"\\u00CF\":\"I\",\"\\u1E2E\":\"I\",\"\\u1EC8\":\"I\",\"\\u01CF\":\"I\",\"\\u0208\":\"I\",\"\\u020A\":\"I\",\"\\u1ECA\":\"I\",\"\\u012E\":\"I\",\"\\u1E2C\":\"I\",\"\\u0197\":\"I\",\"\\u24BF\":\"J\",\"\\uFF2A\":\"J\",\"\\u0134\":\"J\",\"\\u0248\":\"J\",\"\\u24C0\":\"K\",\"\\uFF2B\":\"K\",\"\\u1E30\":\"K\",\"\\u01E8\":\"K\",\"\\u1E32\":\"K\",\"\\u0136\":\"K\",\"\\u1E34\":\"K\",\"\\u0198\":\"K\",\"\\u2C69\":\"K\",\"\\uA740\":\"K\",\"\\uA742\":\"K\",\"\\uA744\":\"K\",\"\\uA7A2\":\"K\",\"\\u24C1\":\"L\",\"\\uFF2C\":\"L\",\"\\u013F\":\"L\",\"\\u0139\":\"L\",\"\\u013D\":\"L\",\"\\u1E36\":\"L\",\"\\u1E38\":\"L\",\"\\u013B\":\"L\",\"\\u1E3C\":\"L\",\"\\u1E3A\":\"L\",\"\\u0141\":\"L\",\"\\u023D\":\"L\",\"\\u2C62\":\"L\",\"\\u2C60\":\"L\",\"\\uA748\":\"L\",\"\\uA746\":\"L\",\"\\uA780\":\"L\",\"\\u01C7\":\"LJ\",\"\\u01C8\":\"Lj\",\"\\u24C2\":\"M\",\"\\uFF2D\":\"M\",\"\\u1E3E\":\"M\",\"\\u1E40\":\"M\",\"\\u1E42\":\"M\",\"\\u2C6E\":\"M\",\"\\u019C\":\"M\",\"\\u24C3\":\"N\",\"\\uFF2E\":\"N\",\"\\u01F8\":\"N\",\"\\u0143\":\"N\",\"\\u00D1\":\"N\",\"\\u1E44\":\"N\",\"\\u0147\":\"N\",\"\\u1E46\":\"N\",\"\\u0145\":\"N\",\"\\u1E4A\":\"N\",\"\\u1E48\":\"N\",\"\\u0220\":\"N\",\"\\u019D\":\"N\",\"\\uA790\":\"N\",\"\\uA7A4\":\"N\",\"\\u01CA\":\"NJ\",\"\\u01CB\":\"Nj\",\"\\u24C4\":\"O\",\"\\uFF2F\":\"O\",\"\\u00D2\":\"O\",\"\\u00D3\":\"O\",\"\\u00D4\":\"O\",\"\\u1ED2\":\"O\",\"\\u1ED0\":\"O\",\"\\u1ED6\":\"O\",\"\\u1ED4\":\"O\",\"\\u00D5\":\"O\",\"\\u1E4C\":\"O\",\"\\u022C\":\"O\",\"\\u1E4E\":\"O\",\"\\u014C\":\"O\",\"\\u1E50\":\"O\",\"\\u1E52\":\"O\",\"\\u014E\":\"O\",\"\\u022E\":\"O\",\"\\u0230\":\"O\",\"\\u00D6\":\"O\",\"\\u022A\":\"O\",\"\\u1ECE\":\"O\",\"\\u0150\":\"O\",\"\\u01D1\":\"O\",\"\\u020C\":\"O\",\"\\u020E\":\"O\",\"\\u01A0\":\"O\",\"\\u1EDC\":\"O\",\"\\u1EDA\":\"O\",\"\\u1EE0\":\"O\",\"\\u1EDE\":\"O\",\"\\u1EE2\":\"O\",\"\\u1ECC\":\"O\",\"\\u1ED8\":\"O\",\"\\u01EA\":\"O\",\"\\u01EC\":\"O\",\"\\u00D8\":\"O\",\"\\u01FE\":\"O\",\"\\u0186\":\"O\",\"\\u019F\":\"O\",\"\\uA74A\":\"O\",\"\\uA74C\":\"O\",\"\\u01A2\":\"OI\",\"\\uA74E\":\"OO\",\"\\u0222\":\"OU\",\"\\u24C5\":\"P\",\"\\uFF30\":\"P\",\"\\u1E54\":\"P\",\"\\u1E56\":\"P\",\"\\u01A4\":\"P\",\"\\u2C63\":\"P\",\"\\uA750\":\"P\",\"\\uA752\":\"P\",\"\\uA754\":\"P\",\"\\u24C6\":\"Q\",\"\\uFF31\":\"Q\",\"\\uA756\":\"Q\",\"\\uA758\":\"Q\",\"\\u024A\":\"Q\",\"\\u24C7\":\"R\",\"\\uFF32\":\"R\",\"\\u0154\":\"R\",\"\\u1E58\":\"R\",\"\\u0158\":\"R\",\"\\u0210\":\"R\",\"\\u0212\":\"R\",\"\\u1E5A\":\"R\",\"\\u1E5C\":\"R\",\"\\u0156\":\"R\",\"\\u1E5E\":\"R\",\"\\u024C\":\"R\",\"\\u2C64\":\"R\",\"\\uA75A\":\"R\",\"\\uA7A6\":\"R\",\"\\uA782\":\"R\",\"\\u24C8\":\"S\",\"\\uFF33\":\"S\",\"\\u1E9E\":\"S\",\"\\u015A\":\"S\",\"\\u1E64\":\"S\",\"\\u015C\":\"S\",\"\\u1E60\":\"S\",\"\\u0160\":\"S\",\"\\u1E66\":\"S\",\"\\u1E62\":\"S\",\"\\u1E68\":\"S\",\"\\u0218\":\"S\",\"\\u015E\":\"S\",\"\\u2C7E\":\"S\",\"\\uA7A8\":\"S\",\"\\uA784\":\"S\",\"\\u24C9\":\"T\",\"\\uFF34\":\"T\",\"\\u1E6A\":\"T\",\"\\u0164\":\"T\",\"\\u1E6C\":\"T\",\"\\u021A\":\"T\",\"\\u0162\":\"T\",\"\\u1E70\":\"T\",\"\\u1E6E\":\"T\",\"\\u0166\":\"T\",\"\\u01AC\":\"T\",\"\\u01AE\":\"T\",\"\\u023E\":\"T\",\"\\uA786\":\"T\",\"\\uA728\":\"TZ\",\"\\u24CA\":\"U\",\"\\uFF35\":\"U\",\"\\u00D9\":\"U\",\"\\u00DA\":\"U\",\"\\u00DB\":\"U\",\"\\u0168\":\"U\",\"\\u1E78\":\"U\",\"\\u016A\":\"U\",\"\\u1E7A\":\"U\",\"\\u016C\":\"U\",\"\\u00DC\":\"U\",\"\\u01DB\":\"U\",\"\\u01D7\":\"U\",\"\\u01D5\":\"U\",\"\\u01D9\":\"U\",\"\\u1EE6\":\"U\",\"\\u016E\":\"U\",\"\\u0170\":\"U\",\"\\u01D3\":\"U\",\"\\u0214\":\"U\",\"\\u0216\":\"U\",\"\\u01AF\":\"U\",\"\\u1EEA\":\"U\",\"\\u1EE8\":\"U\",\"\\u1EEE\":\"U\",\"\\u1EEC\":\"U\",\"\\u1EF0\":\"U\",\"\\u1EE4\":\"U\",\"\\u1E72\":\"U\",\"\\u0172\":\"U\",\"\\u1E76\":\"U\",\"\\u1E74\":\"U\",\"\\u0244\":\"U\",\"\\u24CB\":\"V\",\"\\uFF36\":\"V\",\"\\u1E7C\":\"V\",\"\\u1E7E\":\"V\",\"\\u01B2\":\"V\",\"\\uA75E\":\"V\",\"\\u0245\":\"V\",\"\\uA760\":\"VY\",\"\\u24CC\":\"W\",\"\\uFF37\":\"W\",\"\\u1E80\":\"W\",\"\\u1E82\":\"W\",\"\\u0174\":\"W\",\"\\u1E86\":\"W\",\"\\u1E84\":\"W\",\"\\u1E88\":\"W\",\"\\u2C72\":\"W\",\"\\u24CD\":\"X\",\"\\uFF38\":\"X\",\"\\u1E8A\":\"X\",\"\\u1E8C\":\"X\",\"\\u24CE\":\"Y\",\"\\uFF39\":\"Y\",\"\\u1EF2\":\"Y\",\"\\u00DD\":\"Y\",\"\\u0176\":\"Y\",\"\\u1EF8\":\"Y\",\"\\u0232\":\"Y\",\"\\u1E8E\":\"Y\",\"\\u0178\":\"Y\",\"\\u1EF6\":\"Y\",\"\\u1EF4\":\"Y\",\"\\u01B3\":\"Y\",\"\\u024E\":\"Y\",\"\\u1EFE\":\"Y\",\"\\u24CF\":\"Z\",\"\\uFF3A\":\"Z\",\"\\u0179\":\"Z\",\"\\u1E90\":\"Z\",\"\\u017B\":\"Z\",\"\\u017D\":\"Z\",\"\\u1E92\":\"Z\",\"\\u1E94\":\"Z\",\"\\u01B5\":\"Z\",\"\\u0224\":\"Z\",\"\\u2C7F\":\"Z\",\"\\u2C6B\":\"Z\",\"\\uA762\":\"Z\",\"\\u24D0\":\"a\",\"\\uFF41\":\"a\",\"\\u1E9A\":\"a\",\"\\u00E0\":\"a\",\"\\u00E1\":\"a\",\"\\u00E2\":\"a\",\"\\u1EA7\":\"a\",\"\\u1EA5\":\"a\",\"\\u1EAB\":\"a\",\"\\u1EA9\":\"a\",\"\\u00E3\":\"a\",\"\\u0101\":\"a\",\"\\u0103\":\"a\",\"\\u1EB1\":\"a\",\"\\u1EAF\":\"a\",\"\\u1EB5\":\"a\",\"\\u1EB3\":\"a\",\"\\u0227\":\"a\",\"\\u01E1\":\"a\",\"\\u00E4\":\"a\",\"\\u01DF\":\"a\",\"\\u1EA3\":\"a\",\"\\u00E5\":\"a\",\"\\u01FB\":\"a\",\"\\u01CE\":\"a\",\"\\u0201\":\"a\",\"\\u0203\":\"a\",\"\\u1EA1\":\"a\",\"\\u1EAD\":\"a\",\"\\u1EB7\":\"a\",\"\\u1E01\":\"a\",\"\\u0105\":\"a\",\"\\u2C65\":\"a\",\"\\u0250\":\"a\",\"\\uA733\":\"aa\",\"\\u00E6\":\"ae\",\"\\u01FD\":\"ae\",\"\\u01E3\":\"ae\",\"\\uA735\":\"ao\",\"\\uA737\":\"au\",\"\\uA739\":\"av\",\"\\uA73B\":\"av\",\"\\uA73D\":\"ay\",\"\\u24D1\":\"b\",\"\\uFF42\":\"b\",\"\\u1E03\":\"b\",\"\\u1E05\":\"b\",\"\\u1E07\":\"b\",\"\\u0180\":\"b\",\"\\u0183\":\"b\",\"\\u0253\":\"b\",\"\\u24D2\":\"c\",\"\\uFF43\":\"c\",\"\\u0107\":\"c\",\"\\u0109\":\"c\",\"\\u010B\":\"c\",\"\\u010D\":\"c\",\"\\u00E7\":\"c\",\"\\u1E09\":\"c\",\"\\u0188\":\"c\",\"\\u023C\":\"c\",\"\\uA73F\":\"c\",\"\\u2184\":\"c\",\"\\u24D3\":\"d\",\"\\uFF44\":\"d\",\"\\u1E0B\":\"d\",\"\\u010F\":\"d\",\"\\u1E0D\":\"d\",\"\\u1E11\":\"d\",\"\\u1E13\":\"d\",\"\\u1E0F\":\"d\",\"\\u0111\":\"d\",\"\\u018C\":\"d\",\"\\u0256\":\"d\",\"\\u0257\":\"d\",\"\\uA77A\":\"d\",\"\\u01F3\":\"dz\",\"\\u01C6\":\"dz\",\"\\u24D4\":\"e\",\"\\uFF45\":\"e\",\"\\u00E8\":\"e\",\"\\u00E9\":\"e\",\"\\u00EA\":\"e\",\"\\u1EC1\":\"e\",\"\\u1EBF\":\"e\",\"\\u1EC5\":\"e\",\"\\u1EC3\":\"e\",\"\\u1EBD\":\"e\",\"\\u0113\":\"e\",\"\\u1E15\":\"e\",\"\\u1E17\":\"e\",\"\\u0115\":\"e\",\"\\u0117\":\"e\",\"\\u00EB\":\"e\",\"\\u1EBB\":\"e\",\"\\u011B\":\"e\",\"\\u0205\":\"e\",\"\\u0207\":\"e\",\"\\u1EB9\":\"e\",\"\\u1EC7\":\"e\",\"\\u0229\":\"e\",\"\\u1E1D\":\"e\",\"\\u0119\":\"e\",\"\\u1E19\":\"e\",\"\\u1E1B\":\"e\",\"\\u0247\":\"e\",\"\\u025B\":\"e\",\"\\u01DD\":\"e\",\"\\u24D5\":\"f\",\"\\uFF46\":\"f\",\"\\u1E1F\":\"f\",\"\\u0192\":\"f\",\"\\uA77C\":\"f\",\"\\u24D6\":\"g\",\"\\uFF47\":\"g\",\"\\u01F5\":\"g\",\"\\u011D\":\"g\",\"\\u1E21\":\"g\",\"\\u011F\":\"g\",\"\\u0121\":\"g\",\"\\u01E7\":\"g\",\"\\u0123\":\"g\",\"\\u01E5\":\"g\",\"\\u0260\":\"g\",\"\\uA7A1\":\"g\",\"\\u1D79\":\"g\",\"\\uA77F\":\"g\",\"\\u24D7\":\"h\",\"\\uFF48\":\"h\",\"\\u0125\":\"h\",\"\\u1E23\":\"h\",\"\\u1E27\":\"h\",\"\\u021F\":\"h\",\"\\u1E25\":\"h\",\"\\u1E29\":\"h\",\"\\u1E2B\":\"h\",\"\\u1E96\":\"h\",\"\\u0127\":\"h\",\"\\u2C68\":\"h\",\"\\u2C76\":\"h\",\"\\u0265\":\"h\",\"\\u0195\":\"hv\",\"\\u24D8\":\"i\",\"\\uFF49\":\"i\",\"\\u00EC\":\"i\",\"\\u00ED\":\"i\",\"\\u00EE\":\"i\",\"\\u0129\":\"i\",\"\\u012B\":\"i\",\"\\u012D\":\"i\",\"\\u00EF\":\"i\",\"\\u1E2F\":\"i\",\"\\u1EC9\":\"i\",\"\\u01D0\":\"i\",\"\\u0209\":\"i\",\"\\u020B\":\"i\",\"\\u1ECB\":\"i\",\"\\u012F\":\"i\",\"\\u1E2D\":\"i\",\"\\u0268\":\"i\",\"\\u0131\":\"i\",\"\\u24D9\":\"j\",\"\\uFF4A\":\"j\",\"\\u0135\":\"j\",\"\\u01F0\":\"j\",\"\\u0249\":\"j\",\"\\u24DA\":\"k\",\"\\uFF4B\":\"k\",\"\\u1E31\":\"k\",\"\\u01E9\":\"k\",\"\\u1E33\":\"k\",\"\\u0137\":\"k\",\"\\u1E35\":\"k\",\"\\u0199\":\"k\",\"\\u2C6A\":\"k\",\"\\uA741\":\"k\",\"\\uA743\":\"k\",\"\\uA745\":\"k\",\"\\uA7A3\":\"k\",\"\\u24DB\":\"l\",\"\\uFF4C\":\"l\",\"\\u0140\":\"l\",\"\\u013A\":\"l\",\"\\u013E\":\"l\",\"\\u1E37\":\"l\",\"\\u1E39\":\"l\",\"\\u013C\":\"l\",\"\\u1E3D\":\"l\",\"\\u1E3B\":\"l\",\"\\u017F\":\"l\",\"\\u0142\":\"l\",\"\\u019A\":\"l\",\"\\u026B\":\"l\",\"\\u2C61\":\"l\",\"\\uA749\":\"l\",\"\\uA781\":\"l\",\"\\uA747\":\"l\",\"\\u01C9\":\"lj\",\"\\u24DC\":\"m\",\"\\uFF4D\":\"m\",\"\\u1E3F\":\"m\",\"\\u1E41\":\"m\",\"\\u1E43\":\"m\",\"\\u0271\":\"m\",\"\\u026F\":\"m\",\"\\u24DD\":\"n\",\"\\uFF4E\":\"n\",\"\\u01F9\":\"n\",\"\\u0144\":\"n\",\"\\u00F1\":\"n\",\"\\u1E45\":\"n\",\"\\u0148\":\"n\",\"\\u1E47\":\"n\",\"\\u0146\":\"n\",\"\\u1E4B\":\"n\",\"\\u1E49\":\"n\",\"\\u019E\":\"n\",\"\\u0272\":\"n\",\"\\u0149\":\"n\",\"\\uA791\":\"n\",\"\\uA7A5\":\"n\",\"\\u01CC\":\"nj\",\"\\u24DE\":\"o\",\"\\uFF4F\":\"o\",\"\\u00F2\":\"o\",\"\\u00F3\":\"o\",\"\\u00F4\":\"o\",\"\\u1ED3\":\"o\",\"\\u1ED1\":\"o\",\"\\u1ED7\":\"o\",\"\\u1ED5\":\"o\",\"\\u00F5\":\"o\",\"\\u1E4D\":\"o\",\"\\u022D\":\"o\",\"\\u1E4F\":\"o\",\"\\u014D\":\"o\",\"\\u1E51\":\"o\",\"\\u1E53\":\"o\",\"\\u014F\":\"o\",\"\\u022F\":\"o\",\"\\u0231\":\"o\",\"\\u00F6\":\"o\",\"\\u022B\":\"o\",\"\\u1ECF\":\"o\",\"\\u0151\":\"o\",\"\\u01D2\":\"o\",\"\\u020D\":\"o\",\"\\u020F\":\"o\",\"\\u01A1\":\"o\",\"\\u1EDD\":\"o\",\"\\u1EDB\":\"o\",\"\\u1EE1\":\"o\",\"\\u1EDF\":\"o\",\"\\u1EE3\":\"o\",\"\\u1ECD\":\"o\",\"\\u1ED9\":\"o\",\"\\u01EB\":\"o\",\"\\u01ED\":\"o\",\"\\u00F8\":\"o\",\"\\u01FF\":\"o\",\"\\u0254\":\"o\",\"\\uA74B\":\"o\",\"\\uA74D\":\"o\",\"\\u0275\":\"o\",\"\\u01A3\":\"oi\",\"\\u0223\":\"ou\",\"\\uA74F\":\"oo\",\"\\u24DF\":\"p\",\"\\uFF50\":\"p\",\"\\u1E55\":\"p\",\"\\u1E57\":\"p\",\"\\u01A5\":\"p\",\"\\u1D7D\":\"p\",\"\\uA751\":\"p\",\"\\uA753\":\"p\",\"\\uA755\":\"p\",\"\\u24E0\":\"q\",\"\\uFF51\":\"q\",\"\\u024B\":\"q\",\"\\uA757\":\"q\",\"\\uA759\":\"q\",\"\\u24E1\":\"r\",\"\\uFF52\":\"r\",\"\\u0155\":\"r\",\"\\u1E59\":\"r\",\"\\u0159\":\"r\",\"\\u0211\":\"r\",\"\\u0213\":\"r\",\"\\u1E5B\":\"r\",\"\\u1E5D\":\"r\",\"\\u0157\":\"r\",\"\\u1E5F\":\"r\",\"\\u024D\":\"r\",\"\\u027D\":\"r\",\"\\uA75B\":\"r\",\"\\uA7A7\":\"r\",\"\\uA783\":\"r\",\"\\u24E2\":\"s\",\"\\uFF53\":\"s\",\"\\u00DF\":\"s\",\"\\u015B\":\"s\",\"\\u1E65\":\"s\",\"\\u015D\":\"s\",\"\\u1E61\":\"s\",\"\\u0161\":\"s\",\"\\u1E67\":\"s\",\"\\u1E63\":\"s\",\"\\u1E69\":\"s\",\"\\u0219\":\"s\",\"\\u015F\":\"s\",\"\\u023F\":\"s\",\"\\uA7A9\":\"s\",\"\\uA785\":\"s\",\"\\u1E9B\":\"s\",\"\\u24E3\":\"t\",\"\\uFF54\":\"t\",\"\\u1E6B\":\"t\",\"\\u1E97\":\"t\",\"\\u0165\":\"t\",\"\\u1E6D\":\"t\",\"\\u021B\":\"t\",\"\\u0163\":\"t\",\"\\u1E71\":\"t\",\"\\u1E6F\":\"t\",\"\\u0167\":\"t\",\"\\u01AD\":\"t\",\"\\u0288\":\"t\",\"\\u2C66\":\"t\",\"\\uA787\":\"t\",\"\\uA729\":\"tz\",\"\\u24E4\":\"u\",\"\\uFF55\":\"u\",\"\\u00F9\":\"u\",\"\\u00FA\":\"u\",\"\\u00FB\":\"u\",\"\\u0169\":\"u\",\"\\u1E79\":\"u\",\"\\u016B\":\"u\",\"\\u1E7B\":\"u\",\"\\u016D\":\"u\",\"\\u00FC\":\"u\",\"\\u01DC\":\"u\",\"\\u01D8\":\"u\",\"\\u01D6\":\"u\",\"\\u01DA\":\"u\",\"\\u1EE7\":\"u\",\"\\u016F\":\"u\",\"\\u0171\":\"u\",\"\\u01D4\":\"u\",\"\\u0215\":\"u\",\"\\u0217\":\"u\",\"\\u01B0\":\"u\",\"\\u1EEB\":\"u\",\"\\u1EE9\":\"u\",\"\\u1EEF\":\"u\",\"\\u1EED\":\"u\",\"\\u1EF1\":\"u\",\"\\u1EE5\":\"u\",\"\\u1E73\":\"u\",\"\\u0173\":\"u\",\"\\u1E77\":\"u\",\"\\u1E75\":\"u\",\"\\u0289\":\"u\",\"\\u24E5\":\"v\",\"\\uFF56\":\"v\",\"\\u1E7D\":\"v\",\"\\u1E7F\":\"v\",\"\\u028B\":\"v\",\"\\uA75F\":\"v\",\"\\u028C\":\"v\",\"\\uA761\":\"vy\",\"\\u24E6\":\"w\",\"\\uFF57\":\"w\",\"\\u1E81\":\"w\",\"\\u1E83\":\"w\",\"\\u0175\":\"w\",\"\\u1E87\":\"w\",\"\\u1E85\":\"w\",\"\\u1E98\":\"w\",\"\\u1E89\":\"w\",\"\\u2C73\":\"w\",\"\\u24E7\":\"x\",\"\\uFF58\":\"x\",\"\\u1E8B\":\"x\",\"\\u1E8D\":\"x\",\"\\u24E8\":\"y\",\"\\uFF59\":\"y\",\"\\u1EF3\":\"y\",\"\\u00FD\":\"y\",\"\\u0177\":\"y\",\"\\u1EF9\":\"y\",\"\\u0233\":\"y\",\"\\u1E8F\":\"y\",\"\\u00FF\":\"y\",\"\\u1EF7\":\"y\",\"\\u1E99\":\"y\",\"\\u1EF5\":\"y\",\"\\u01B4\":\"y\",\"\\u024F\":\"y\",\"\\u1EFF\":\"y\",\"\\u24E9\":\"z\",\"\\uFF5A\":\"z\",\"\\u017A\":\"z\",\"\\u1E91\":\"z\",\"\\u017C\":\"z\",\"\\u017E\":\"z\",\"\\u1E93\":\"z\",\"\\u1E95\":\"z\",\"\\u01B6\":\"z\",\"\\u0225\":\"z\",\"\\u0240\":\"z\",\"\\u2C6C\":\"z\",\"\\uA763\":\"z\",\"\\u0386\":\"\\u0391\",\"\\u0388\":\"\\u0395\",\"\\u0389\":\"\\u0397\",\"\\u038A\":\"\\u0399\",\"\\u03AA\":\"\\u0399\",\"\\u038C\":\"\\u039F\",\"\\u038E\":\"\\u03A5\",\"\\u03AB\":\"\\u03A5\",\"\\u038F\":\"\\u03A9\",\"\\u03AC\":\"\\u03B1\",\"\\u03AD\":\"\\u03B5\",\"\\u03AE\":\"\\u03B7\",\"\\u03AF\":\"\\u03B9\",\"\\u03CA\":\"\\u03B9\",\"\\u0390\":\"\\u03B9\",\"\\u03CC\":\"\\u03BF\",\"\\u03CD\":\"\\u03C5\",\"\\u03CB\":\"\\u03C5\",\"\\u03B0\":\"\\u03C5\",\"\\u03C9\":\"\\u03C9\",\"\\u03C2\":\"\\u03C3\"};\n\n $document = $(document);\n\n nextUid=(function() { var counter=1; return function() { return counter++; }; }());\n\n\n function reinsertElement(element) {\n var placeholder = $(document.createTextNode(''));\n\n element.before(placeholder);\n placeholder.before(element);\n placeholder.remove();\n }\n\n function stripDiacritics(str) {\n // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n function match(a) {\n return DIACRITICS[a] || a;\n }\n\n return str.replace(/[^\\u0000-\\u007E]/g, match);\n }\n\n function indexOf(value, array) {\n var i = 0, l = array.length;\n for (; i < l; i = i + 1) {\n if (equal(value, array[i])) return i;\n }\n return -1;\n }\n\n function measureScrollbar () {\n var $template = $( MEASURE_SCROLLBAR_TEMPLATE );\n $template.appendTo('body');\n\n var dim = {\n width: $template.width() - $template[0].clientWidth,\n height: $template.height() - $template[0].clientHeight\n };\n $template.remove();\n\n return dim;\n }\n\n /**\n * Compares equality of a and b\n * @param a\n * @param b\n */\n function equal(a, b) {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n if (a === null || b === null) return false;\n // Check whether 'a' or 'b' is a string (primitive or object).\n // The concatenation of an empty string (+'') converts its argument to a string's primitive.\n if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object\n if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object\n return false;\n }\n\n /**\n * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty\n * strings\n * @param string\n * @param separator\n */\n function splitVal(string, separator) {\n var val, i, l;\n if (string === null || string.length < 1) return [];\n val = string.split(separator);\n for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);\n return val;\n }\n\n function getSideBorderPadding(element) {\n return element.outerWidth(false) - element.width();\n }\n\n function installKeyUpChangeEvent(element) {\n var key=\"keyup-change-value\";\n element.on(\"keydown\", function () {\n if ($.data(element, key) === undefined) {\n $.data(element, key, element.val());\n }\n });\n element.on(\"keyup\", function () {\n var val= $.data(element, key);\n if (val !== undefined && element.val() !== val) {\n $.removeData(element, key);\n element.trigger(\"keyup-change\");\n }\n });\n }\n\n\n /**\n * filters mouse events so an event is fired only if the mouse moved.\n *\n * filters out mouse events that occur when mouse is stationary but\n * the elements under the pointer are scrolled.\n */\n function installFilteredMouseMove(element) {\n element.on(\"mousemove\", function (e) {\n var lastpos = lastMousePosition;\n if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {\n $(e.target).trigger(\"mousemove-filtered\", e);\n }\n });\n }\n\n /**\n * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made\n * within the last quietMillis milliseconds.\n *\n * @param quietMillis number of milliseconds to wait before invoking fn\n * @param fn function to be debounced\n * @param ctx object to be used as this reference within fn\n * @return debounced version of fn\n */\n function debounce(quietMillis, fn, ctx) {\n ctx = ctx || undefined;\n var timeout;\n return function () {\n var args = arguments;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(function() {\n fn.apply(ctx, args);\n }, quietMillis);\n };\n }\n\n function installDebouncedScroll(threshold, element) {\n var notify = debounce(threshold, function (e) { element.trigger(\"scroll-debounced\", e);});\n element.on(\"scroll\", function (e) {\n if (indexOf(e.target, element.get()) >= 0) notify(e);\n });\n }\n\n function focus($el) {\n if ($el[0] === document.activeElement) return;\n\n /* set the focus in a 0 timeout - that way the focus is set after the processing\n of the current event has finished - which seems like the only reliable way\n to set focus */\n window.setTimeout(function() {\n var el=$el[0], pos=$el.val().length, range;\n\n $el.focus();\n\n /* make sure el received focus so we do not error out when trying to manipulate the caret.\n sometimes modals or others listeners may steal it after its set */\n var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);\n if (isVisible && el === document.activeElement) {\n\n /* after the focus is set move the caret to the end, necessary when we val()\n just before setting focus */\n if(el.setSelectionRange)\n {\n el.setSelectionRange(pos, pos);\n }\n else if (el.createTextRange) {\n range = el.createTextRange();\n range.collapse(false);\n range.select();\n }\n }\n }, 0);\n }\n\n function getCursorInfo(el) {\n el = $(el)[0];\n var offset = 0;\n var length = 0;\n if ('selectionStart' in el) {\n offset = el.selectionStart;\n length = el.selectionEnd - offset;\n } else if ('selection' in document) {\n el.focus();\n var sel = document.selection.createRange();\n length = document.selection.createRange().text.length;\n sel.moveStart('character', -el.value.length);\n offset = sel.text.length - length;\n }\n return { offset: offset, length: length };\n }\n\n function killEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n }\n function killEventImmediately(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n function measureTextWidth(e) {\n if (!sizer){\n var style = e[0].currentStyle || window.getComputedStyle(e[0], null);\n sizer = $(document.createElement(\"div\")).css({\n position: \"absolute\",\n left: \"-10000px\",\n top: \"-10000px\",\n display: \"none\",\n fontSize: style.fontSize,\n fontFamily: style.fontFamily,\n fontStyle: style.fontStyle,\n fontWeight: style.fontWeight,\n letterSpacing: style.letterSpacing,\n textTransform: style.textTransform,\n whiteSpace: \"nowrap\"\n });\n sizer.attr(\"class\",\"select2-sizer\");\n $(\"body\").append(sizer);\n }\n sizer.text(e.val());\n return sizer.width();\n }\n\n function syncCssClasses(dest, src, adapter) {\n var classes, replacements = [], adapted;\n\n classes = $.trim(dest.attr(\"class\"));\n\n if (classes) {\n classes = '' + classes; // for IE which returns object\n\n $(classes.split(/\\s+/)).each2(function() {\n if (this.indexOf(\"select2-\") === 0) {\n replacements.push(this);\n }\n });\n }\n\n classes = $.trim(src.attr(\"class\"));\n\n if (classes) {\n classes = '' + classes; // for IE which returns object\n\n $(classes.split(/\\s+/)).each2(function() {\n if (this.indexOf(\"select2-\") !== 0) {\n adapted = adapter(this);\n\n if (adapted) {\n replacements.push(adapted);\n }\n }\n });\n }\n\n dest.attr(\"class\", replacements.join(\" \"));\n }\n\n\n function markMatch(text, term, markup, escapeMarkup) {\n var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),\n tl=term.length;\n\n if (match<0) {\n markup.push(escapeMarkup(text));\n return;\n }\n\n markup.push(escapeMarkup(text.substring(0, match)));\n markup.push(\"\");\n markup.push(escapeMarkup(text.substring(match, match + tl)));\n markup.push(\"\");\n markup.push(escapeMarkup(text.substring(match + tl, text.length)));\n }\n\n function defaultEscapeMarkup(markup) {\n var replace_map = {\n '\\\\': '\',\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n \"/\": '/'\n };\n\n return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n return replace_map[match];\n });\n }\n\n /**\n * Produces an ajax-based query function\n *\n * @param options object containing configuration parameters\n * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax\n * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax\n * @param options.url url for the data\n * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.\n * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified\n * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often\n * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.\n * The expected format is an object containing the following keys:\n * results array of objects that will be used as choices\n * more (optional) boolean indicating whether there are more results available\n * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}\n */\n function ajax(options) {\n var timeout, // current scheduled but not yet executed request\n handler = null,\n quietMillis = options.quietMillis || 100,\n ajaxUrl = options.url,\n self = this;\n\n return function (query) {\n window.clearTimeout(timeout);\n timeout = window.setTimeout(function () {\n var data = options.data, // ajax data function\n url = ajaxUrl, // ajax url string or function\n transport = options.transport || $.fn.select2.ajaxDefaults.transport,\n // deprecated - to be removed in 4.0 - use params instead\n deprecated = {\n type: options.type || 'GET', // set type of request (GET or POST)\n cache: options.cache || false,\n jsonpCallback: options.jsonpCallback||undefined,\n dataType: options.dataType||\"json\"\n },\n params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);\n\n data = data ? data.call(self, query.term, query.page, query.context) : null;\n url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;\n\n if (handler && typeof handler.abort === \"function\") { handler.abort(); }\n\n if (options.params) {\n if ($.isFunction(options.params)) {\n $.extend(params, options.params.call(self));\n } else {\n $.extend(params, options.params);\n }\n }\n\n $.extend(params, {\n url: url,\n dataType: options.dataType,\n data: data,\n success: function (data) {\n // TODO - replace query.page with query so users have access to term, page, etc.\n // added query as third paramter to keep backwards compatibility\n var results = options.results(data, query.page, query);\n query.callback(results);\n },\n error: function(jqXHR, textStatus, errorThrown){\n var results = {\n hasError: true,\n jqXHR: jqXHR,\n textStatus: textStatus,\n errorThrown: errorThrown,\n };\n\n query.callback(results);\n }\n });\n handler = transport.call(self, params);\n }, quietMillis);\n };\n }\n\n /**\n * Produces a query function that works with a local array\n *\n * @param options object containing configuration parameters. The options parameter can either be an array or an\n * object.\n *\n * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.\n *\n * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain\n * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'\n * key can either be a String in which case it is expected that each element in the 'data' array has a key with the\n * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract\n * the text.\n */\n function local(options) {\n var data = options, // data elements\n dataText,\n tmp,\n text = function (item) { return \"\"+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search\n\n if ($.isArray(data)) {\n tmp = data;\n data = { results: tmp };\n }\n\n if ($.isFunction(data) === false) {\n tmp = data;\n data = function() { return tmp; };\n }\n\n var dataItem = data();\n if (dataItem.text) {\n text = dataItem.text;\n // if text is not a function we assume it to be a key name\n if (!$.isFunction(text)) {\n dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available\n text = function (item) { return item[dataText]; };\n }\n }\n\n return function (query) {\n var t = query.term, filtered = { results: [] }, process;\n if (t === \"\") {\n query.callback(data());\n return;\n }\n\n process = function(datum, collection) {\n var group, attr;\n datum = datum[0];\n if (datum.children) {\n group = {};\n for (attr in datum) {\n if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];\n }\n group.children=[];\n $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });\n if (group.children.length || query.matcher(t, text(group), datum)) {\n collection.push(group);\n }\n } else {\n if (query.matcher(t, text(datum), datum)) {\n collection.push(datum);\n }\n }\n };\n\n $(data().results).each2(function(i, datum) { process(datum, filtered.results); });\n query.callback(filtered);\n };\n }\n\n // TODO javadoc\n function tags(data) {\n var isFunc = $.isFunction(data);\n return function (query) {\n var t = query.term, filtered = {results: []};\n var result = isFunc ? data(query) : data;\n if ($.isArray(result)) {\n $(result).each(function () {\n var isObject = this.text !== undefined,\n text = isObject ? this.text : this;\n if (t === \"\" || query.matcher(t, text)) {\n filtered.results.push(isObject ? this : {id: this, text: this});\n }\n });\n query.callback(filtered);\n }\n };\n }\n\n /**\n * Checks if the formatter function should be used.\n *\n * Throws an error if it is not a function. Returns true if it should be used,\n * false if no formatting should be performed.\n *\n * @param formatter\n */\n function checkFormatter(formatter, formatterName) {\n if ($.isFunction(formatter)) return true;\n if (!formatter) return false;\n if (typeof(formatter) === 'string') return true;\n throw new Error(formatterName +\" must be a string, function, or falsy value\");\n }\n\n /**\n * Returns a given value\n * If given a function, returns its output\n *\n * @param val string|function\n * @param context value of \"this\" to be passed to function\n * @returns {*}\n */\n function evaluate(val, context) {\n if ($.isFunction(val)) {\n var args = Array.prototype.slice.call(arguments, 2);\n return val.apply(context, args);\n }\n return val;\n }\n\n function countResults(results) {\n var count = 0;\n $.each(results, function(i, item) {\n if (item.children) {\n count += countResults(item.children);\n } else {\n count++;\n }\n });\n return count;\n }\n\n /**\n * Default tokenizer. This function uses breaks the input on substring match of any string from the\n * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those\n * two options have to be defined in order for the tokenizer to work.\n *\n * @param input text user has typed so far or pasted into the search field\n * @param selection currently selected choices\n * @param selectCallback function(choice) callback tho add the choice to selection\n * @param opts select2's opts\n * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value\n */\n function defaultTokenizer(input, selection, selectCallback, opts) {\n var original = input, // store the original so we can compare and know if we need to tell the search to update its text\n dupe = false, // check for whether a token we extracted represents a duplicate selected choice\n token, // token\n index, // position at which the separator was found\n i, l, // looping variables\n separator; // the matched separator\n\n if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;\n\n while (true) {\n index = -1;\n\n for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {\n separator = opts.tokenSeparators[i];\n index = input.indexOf(separator);\n if (index >= 0) break;\n }\n\n if (index < 0) break; // did not find any token separator in the input string, bail\n\n token = input.substring(0, index);\n input = input.substring(index + separator.length);\n\n if (token.length > 0) {\n token = opts.createSearchChoice.call(this, token, selection);\n if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {\n dupe = false;\n for (i = 0, l = selection.length; i < l; i++) {\n if (equal(opts.id(token), opts.id(selection[i]))) {\n dupe = true; break;\n }\n }\n\n if (!dupe) selectCallback(token);\n }\n }\n }\n\n if (original!==input) return input;\n }\n\n function cleanupJQueryElements() {\n var self = this;\n\n $.each(arguments, function (i, element) {\n self[element].remove();\n self[element] = null;\n });\n }\n\n /**\n * Creates a new class\n *\n * @param superClass\n * @param methods\n */\n function clazz(SuperClass, methods) {\n var constructor = function () {};\n constructor.prototype = new SuperClass;\n constructor.prototype.constructor = constructor;\n constructor.prototype.parent = SuperClass.prototype;\n constructor.prototype = $.extend(constructor.prototype, methods);\n return constructor;\n }\n\n AbstractSelect2 = clazz(Object, {\n\n // abstract\n bind: function (func) {\n var self = this;\n return function () {\n func.apply(self, arguments);\n };\n },\n\n // abstract\n init: function (opts) {\n var results, search, resultsSelector = \".select2-results\";\n\n // prepare options\n this.opts = opts = this.prepareOpts(opts);\n\n this.id=opts.id;\n\n // destroy if called on an existing component\n if (opts.element.data(\"select2\") !== undefined &&\n opts.element.data(\"select2\") !== null) {\n opts.element.data(\"select2\").destroy();\n }\n\n this.container = this.createContainer();\n\n this.liveRegion = $(\"\", {\n role: \"status\",\n \"aria-live\": \"polite\"\n })\n .addClass(\"select2-hidden-accessible\")\n .appendTo(document.body);\n\n this.containerId=\"s2id_\"+(opts.element.attr(\"id\") || \"autogen\"+nextUid());\n this.containerEventName= this.containerId\n .replace(/([.])/g, '_')\n .replace(/([;&,\\-\\.\\+\\*\\~':\"\\!\\^#$%@\\[\\]\\(\\)=>\\|])/g, '\\\\$1');\n this.container.attr(\"id\", this.containerId);\n\n this.container.attr(\"title\", opts.element.attr(\"title\"));\n\n this.body = $(\"body\");\n\n syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);\n\n this.container.attr(\"style\", opts.element.attr(\"style\"));\n this.container.css(evaluate(opts.containerCss, this.opts.element));\n this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));\n\n this.elementTabIndex = this.opts.element.attr(\"tabindex\");\n\n // swap container for the element\n this.opts.element\n .data(\"select2\", this)\n .attr(\"tabindex\", \"-1\")\n .before(this.container)\n .on(\"click.select2\", killEvent); // do not leak click events\n\n this.container.data(\"select2\", this);\n\n this.dropdown = this.container.find(\".select2-drop\");\n\n syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);\n\n this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));\n this.dropdown.data(\"select2\", this);\n this.dropdown.on(\"click\", killEvent);\n\n this.results = results = this.container.find(resultsSelector);\n this.search = search = this.container.find(\"input.select2-input\");\n\n this.queryCount = 0;\n this.resultsPage = 0;\n this.context = null;\n\n // initialize the container\n this.initContainer();\n\n this.container.on(\"click\", killEvent);\n\n installFilteredMouseMove(this.results);\n\n this.dropdown.on(\"mousemove-filtered\", resultsSelector, this.bind(this.highlightUnderEvent));\n this.dropdown.on(\"touchstart touchmove touchend\", resultsSelector, this.bind(function (event) {\n this._touchEvent = true;\n this.highlightUnderEvent(event);\n }));\n this.dropdown.on(\"touchmove\", resultsSelector, this.bind(this.touchMoved));\n this.dropdown.on(\"touchstart touchend\", resultsSelector, this.bind(this.clearTouchMoved));\n\n // Waiting for a click event on touch devices to select option and hide dropdown\n // otherwise click will be triggered on an underlying element\n this.dropdown.on('click', this.bind(function (event) {\n if (this._touchEvent) {\n this._touchEvent = false;\n this.selectHighlighted();\n }\n }));\n\n installDebouncedScroll(80, this.results);\n this.dropdown.on(\"scroll-debounced\", resultsSelector, this.bind(this.loadMoreIfNeeded));\n\n // do not propagate change event from the search field out of the component\n $(this.container).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n $(this.dropdown).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n\n // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel\n if ($.fn.mousewheel) {\n results.mousewheel(function (e, delta, deltaX, deltaY) {\n var top = results.scrollTop();\n if (deltaY > 0 && top - deltaY <= 0) {\n results.scrollTop(0);\n killEvent(e);\n } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {\n results.scrollTop(results.get(0).scrollHeight - results.height());\n killEvent(e);\n }\n });\n }\n\n installKeyUpChangeEvent(search);\n search.on(\"keyup-change input paste\", this.bind(this.updateResults));\n search.on(\"focus\", function () { search.addClass(\"select2-focused\"); });\n search.on(\"blur\", function () { search.removeClass(\"select2-focused\");});\n\n this.dropdown.on(\"mouseup\", resultsSelector, this.bind(function (e) {\n if ($(e.target).closest(\".select2-result-selectable\").length > 0) {\n this.highlightUnderEvent(e);\n this.selectHighlighted(e);\n }\n }));\n\n // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening\n // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's\n // dom it will trigger the popup close, which is not what we want\n // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.\n this.dropdown.on(\"click mouseup mousedown touchstart touchend focusin\", function (e) { e.stopPropagation(); });\n\n this.nextSearchTerm = undefined;\n\n if ($.isFunction(this.opts.initSelection)) {\n // initialize selection based on the current value of the source element\n this.initSelection();\n\n // if the user has provided a function that can set selection based on the value of the source element\n // we monitor the change event on the element and trigger it, allowing for two way synchronization\n this.monitorSource();\n }\n\n if (opts.maximumInputLength !== null) {\n this.search.attr(\"maxlength\", opts.maximumInputLength);\n }\n\n var disabled = opts.element.prop(\"disabled\");\n if (disabled === undefined) disabled = false;\n this.enable(!disabled);\n\n var readonly = opts.element.prop(\"readonly\");\n if (readonly === undefined) readonly = false;\n this.readonly(readonly);\n\n // Calculate size of scrollbar\n scrollBarDimensions = scrollBarDimensions || measureScrollbar();\n\n this.autofocus = opts.element.prop(\"autofocus\");\n opts.element.prop(\"autofocus\", false);\n if (this.autofocus) this.focus();\n\n this.search.attr(\"placeholder\", opts.searchInputPlaceholder);\n },\n\n // abstract\n destroy: function () {\n var element=this.opts.element, select2 = element.data(\"select2\"), self = this;\n\n this.close();\n\n if (element.length && element[0].detachEvent) {\n element.each(function () {\n this.detachEvent(\"onpropertychange\", self._sync);\n });\n }\n if (this.propertyObserver) {\n this.propertyObserver.disconnect();\n this.propertyObserver = null;\n }\n this._sync = null;\n\n if (select2 !== undefined) {\n select2.container.remove();\n select2.liveRegion.remove();\n select2.dropdown.remove();\n element\n .removeClass(\"select2-offscreen\")\n .removeData(\"select2\")\n .off(\".select2\")\n .prop(\"autofocus\", this.autofocus || false);\n if (this.elementTabIndex) {\n element.attr({tabindex: this.elementTabIndex});\n } else {\n element.removeAttr(\"tabindex\");\n }\n element.show();\n }\n\n cleanupJQueryElements.call(this,\n \"container\",\n \"liveRegion\",\n \"dropdown\",\n \"results\",\n \"search\"\n );\n },\n\n // abstract\n optionToData: function(element) {\n if (element.is(\"option\")) {\n return {\n id:element.prop(\"value\"),\n text:element.text(),\n element: element.get(),\n css: element.attr(\"class\"),\n disabled: element.prop(\"disabled\"),\n locked: equal(element.attr(\"locked\"), \"locked\") || equal(element.data(\"locked\"), true)\n };\n } else if (element.is(\"optgroup\")) {\n return {\n text:element.attr(\"label\"),\n children:[],\n element: element.get(),\n css: element.attr(\"class\")\n };\n }\n },\n\n // abstract\n prepareOpts: function (opts) {\n var element, select, idKey, ajaxUrl, self = this;\n\n element = opts.element;\n\n if (element.get(0).tagName.toLowerCase() === \"select\") {\n this.select = select = opts.element;\n }\n\n if (select) {\n // these options are not allowed when attached to a select because they are picked up off the element itself\n $.each([\"id\", \"multiple\", \"ajax\", \"query\", \"createSearchChoice\", \"initSelection\", \"data\", \"tags\"], function () {\n if (this in opts) {\n throw new Error(\"Option '\" + this + \"' is not allowed for Select2 when attached to a \",\n \"
    \",\n \" \",\n \"
      \",\n \"
    \",\n \"
    \"].join(\"\"));\n return container;\n },\n\n // single\n enableInterface: function() {\n if (this.parent.enableInterface.apply(this, arguments)) {\n this.focusser.prop(\"disabled\", !this.isInterfaceEnabled());\n }\n },\n\n // single\n opening: function () {\n var el, range, len;\n\n if (this.opts.minimumResultsForSearch >= 0) {\n this.showSearch(true);\n }\n\n this.parent.opening.apply(this, arguments);\n\n if (this.showSearchInput !== false) {\n // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range\n // all other browsers handle this just fine\n\n this.search.val(this.focusser.val());\n }\n if (this.opts.shouldFocusInput(this)) {\n this.search.focus();\n // move the cursor to the end after focussing, otherwise it will be at the beginning and\n // new text will appear *before* focusser.val()\n el = this.search.get(0);\n if (el.createTextRange) {\n range = el.createTextRange();\n range.collapse(false);\n range.select();\n } else if (el.setSelectionRange) {\n len = this.search.val().length;\n el.setSelectionRange(len, len);\n }\n }\n\n // initializes search's value with nextSearchTerm (if defined by user)\n // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter\n if(this.search.val() === \"\") {\n if(this.nextSearchTerm != undefined){\n this.search.val(this.nextSearchTerm);\n this.search.select();\n }\n }\n\n this.focusser.prop(\"disabled\", true).val(\"\");\n this.updateResults(true);\n this.opts.element.trigger($.Event(\"select2-open\"));\n },\n\n // single\n close: function () {\n if (!this.opened()) return;\n this.parent.close.apply(this, arguments);\n\n this.focusser.prop(\"disabled\", false);\n\n if (this.opts.shouldFocusInput(this)) {\n this.focusser.focus();\n }\n },\n\n // single\n focus: function () {\n if (this.opened()) {\n this.close();\n } else {\n this.focusser.prop(\"disabled\", false);\n if (this.opts.shouldFocusInput(this)) {\n this.focusser.focus();\n }\n }\n },\n\n // single\n isFocused: function () {\n return this.container.hasClass(\"select2-container-active\");\n },\n\n // single\n cancel: function () {\n this.parent.cancel.apply(this, arguments);\n this.focusser.prop(\"disabled\", false);\n\n if (this.opts.shouldFocusInput(this)) {\n this.focusser.focus();\n }\n },\n\n // single\n destroy: function() {\n $(\"label[for='\" + this.focusser.attr('id') + \"']\")\n .attr('for', this.opts.element.attr(\"id\"));\n this.parent.destroy.apply(this, arguments);\n\n cleanupJQueryElements.call(this,\n \"selection\",\n \"focusser\"\n );\n },\n\n // single\n initContainer: function () {\n\n var selection,\n container = this.container,\n dropdown = this.dropdown,\n idSuffix = nextUid(),\n elementLabel;\n\n if (this.opts.minimumResultsForSearch < 0) {\n this.showSearch(false);\n } else {\n this.showSearch(true);\n }\n\n this.selection = selection = container.find(\".select2-choice\");\n\n this.focusser = container.find(\".select2-focusser\");\n\n // add aria associations\n selection.find(\".select2-chosen\").attr(\"id\", \"select2-chosen-\"+idSuffix);\n this.focusser.attr(\"aria-labelledby\", \"select2-chosen-\"+idSuffix);\n this.results.attr(\"id\", \"select2-results-\"+idSuffix);\n this.search.attr(\"aria-owns\", \"select2-results-\"+idSuffix);\n\n // rewrite labels from original element to focusser\n this.focusser.attr(\"id\", \"s2id_autogen\"+idSuffix);\n\n elementLabel = $(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\");\n\n this.focusser.prev()\n .text(elementLabel.text())\n .attr('for', this.focusser.attr('id'));\n\n // Ensure the original element retains an accessible name\n var originalTitle = this.opts.element.attr(\"title\");\n this.opts.element.attr(\"title\", (originalTitle || elementLabel.text()));\n\n this.focusser.attr(\"tabindex\", this.elementTabIndex);\n\n // write label for search field using the label from the focusser element\n this.search.attr(\"id\", this.focusser.attr('id') + '_search');\n\n this.search.prev()\n .text($(\"label[for='\" + this.focusser.attr('id') + \"']\").text())\n .attr('for', this.search.attr('id'));\n\n this.search.on(\"keydown\", this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n\n // filter 229 keyCodes (input method editor is processing key input)\n if (229 == e.keyCode) return;\n\n if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n // prevent the page from scrolling\n killEvent(e);\n return;\n }\n\n switch (e.which) {\n case KEY.UP:\n case KEY.DOWN:\n this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n killEvent(e);\n return;\n case KEY.ENTER:\n this.selectHighlighted();\n killEvent(e);\n return;\n case KEY.TAB:\n this.selectHighlighted({noFocus: true});\n return;\n case KEY.ESC:\n this.cancel(e);\n killEvent(e);\n return;\n }\n }));\n\n this.search.on(\"blur\", this.bind(function(e) {\n // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.\n // without this the search field loses focus which is annoying\n if (document.activeElement === this.body.get(0)) {\n window.setTimeout(this.bind(function() {\n if (this.opened()) {\n this.search.focus();\n }\n }), 0);\n }\n }));\n\n this.focusser.on(\"keydown\", this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n\n if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n return;\n }\n\n if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {\n killEvent(e);\n return;\n }\n\n if (e.which == KEY.DOWN || e.which == KEY.UP\n || (e.which == KEY.ENTER && this.opts.openOnEnter)) {\n\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;\n\n this.open();\n killEvent(e);\n return;\n }\n\n if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {\n if (this.opts.allowClear) {\n this.clear();\n }\n killEvent(e);\n return;\n }\n }));\n\n\n installKeyUpChangeEvent(this.focusser);\n this.focusser.on(\"keyup-change input\", this.bind(function(e) {\n if (this.opts.minimumResultsForSearch >= 0) {\n e.stopPropagation();\n if (this.opened()) return;\n this.open();\n }\n }));\n\n selection.on(\"mousedown touchstart\", \"abbr\", this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n this.clear();\n killEventImmediately(e);\n this.close();\n this.selection.focus();\n }));\n\n selection.on(\"mousedown touchstart\", this.bind(function (e) {\n // Prevent IE from generating a click event on the body\n reinsertElement(selection);\n\n if (!this.container.hasClass(\"select2-container-active\")) {\n this.opts.element.trigger($.Event(\"select2-focus\"));\n }\n\n if (this.opened()) {\n this.close();\n } else if (this.isInterfaceEnabled()) {\n this.open();\n }\n\n killEvent(e);\n }));\n\n dropdown.on(\"mousedown touchstart\", this.bind(function() {\n if (this.opts.shouldFocusInput(this)) {\n this.search.focus();\n }\n }));\n\n selection.on(\"focus\", this.bind(function(e) {\n killEvent(e);\n }));\n\n this.focusser.on(\"focus\", this.bind(function(){\n if (!this.container.hasClass(\"select2-container-active\")) {\n this.opts.element.trigger($.Event(\"select2-focus\"));\n }\n this.container.addClass(\"select2-container-active\");\n })).on(\"blur\", this.bind(function() {\n if (!this.opened()) {\n this.container.removeClass(\"select2-container-active\");\n this.opts.element.trigger($.Event(\"select2-blur\"));\n }\n }));\n this.search.on(\"focus\", this.bind(function(){\n if (!this.container.hasClass(\"select2-container-active\")) {\n this.opts.element.trigger($.Event(\"select2-focus\"));\n }\n this.container.addClass(\"select2-container-active\");\n }));\n\n this.initContainerWidth();\n this.opts.element.addClass(\"select2-offscreen\");\n this.setPlaceholder();\n\n },\n\n // single\n clear: function(triggerChange) {\n var data=this.selection.data(\"select2-data\");\n if (data) { // guard against queued quick consecutive clicks\n var evt = $.Event(\"select2-clearing\");\n this.opts.element.trigger(evt);\n if (evt.isDefaultPrevented()) {\n return;\n }\n var placeholderOption = this.getPlaceholderOption();\n this.opts.element.val(placeholderOption ? placeholderOption.val() : \"\");\n this.selection.find(\".select2-chosen\").empty();\n this.selection.removeData(\"select2-data\");\n this.setPlaceholder();\n\n if (triggerChange !== false){\n this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n this.triggerChange({removed:data});\n }\n }\n },\n\n /**\n * Sets selection based on source element's value\n */\n // single\n initSelection: function () {\n var selected;\n if (this.isPlaceholderOptionSelected()) {\n this.updateSelection(null);\n this.close();\n this.setPlaceholder();\n } else {\n var self = this;\n this.opts.initSelection.call(null, this.opts.element, function(selected){\n if (selected !== undefined && selected !== null) {\n self.updateSelection(selected);\n self.close();\n self.setPlaceholder();\n self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());\n }\n });\n }\n },\n\n isPlaceholderOptionSelected: function() {\n var placeholderOption;\n if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered\n return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop(\"selected\"))\n || (this.opts.element.val() === \"\")\n || (this.opts.element.val() === undefined)\n || (this.opts.element.val() === null);\n },\n\n // single\n prepareOpts: function () {\n var opts = this.parent.prepareOpts.apply(this, arguments),\n self=this;\n\n if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n // install the selection initializer\n opts.initSelection = function (element, callback) {\n var selected = element.find(\"option\").filter(function() { return this.selected && !this.disabled });\n // a single select box always has a value, no need to null check 'selected'\n callback(self.optionToData(selected));\n };\n } else if (\"data\" in opts) {\n // install default initSelection when applied to hidden input and data is local\n opts.initSelection = opts.initSelection || function (element, callback) {\n var id = element.val();\n //search in data by id, storing the actual matching item\n var match = null;\n opts.query({\n matcher: function(term, text, el){\n var is_match = equal(id, opts.id(el));\n if (is_match) {\n match = el;\n }\n return is_match;\n },\n callback: !$.isFunction(callback) ? $.noop : function() {\n callback(match);\n }\n });\n };\n }\n\n return opts;\n },\n\n // single\n getPlaceholder: function() {\n // if a placeholder is specified on a single select without a valid placeholder option ignore it\n if (this.select) {\n if (this.getPlaceholderOption() === undefined) {\n return undefined;\n }\n }\n\n return this.parent.getPlaceholder.apply(this, arguments);\n },\n\n // single\n setPlaceholder: function () {\n var placeholder = this.getPlaceholder();\n\n if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {\n\n // check for a placeholder option if attached to a select\n if (this.select && this.getPlaceholderOption() === undefined) return;\n\n this.selection.find(\".select2-chosen\").html(this.opts.escapeMarkup(placeholder));\n\n this.selection.addClass(\"select2-default\");\n\n this.container.removeClass(\"select2-allowclear\");\n }\n },\n\n // single\n postprocessResults: function (data, initial, noHighlightUpdate) {\n var selected = 0, self = this, showSearchInput = true;\n\n // find the selected element in the result list\n\n this.findHighlightableChoices().each2(function (i, elm) {\n if (equal(self.id(elm.data(\"select2-data\")), self.opts.element.val())) {\n selected = i;\n return false;\n }\n });\n\n // and highlight it\n if (noHighlightUpdate !== false) {\n if (initial === true && selected >= 0) {\n this.highlight(selected);\n } else {\n this.highlight(0);\n }\n }\n\n // hide the search box if this is the first we got the results and there are enough of them for search\n\n if (initial === true) {\n var min = this.opts.minimumResultsForSearch;\n if (min >= 0) {\n this.showSearch(countResults(data.results) >= min);\n }\n }\n },\n\n // single\n showSearch: function(showSearchInput) {\n if (this.showSearchInput === showSearchInput) return;\n\n this.showSearchInput = showSearchInput;\n\n this.dropdown.find(\".select2-search\").toggleClass(\"select2-search-hidden\", !showSearchInput);\n this.dropdown.find(\".select2-search\").toggleClass(\"select2-offscreen\", !showSearchInput);\n //add \"select2-with-searchbox\" to the container if search box is shown\n $(this.dropdown, this.container).toggleClass(\"select2-with-searchbox\", showSearchInput);\n },\n\n // single\n onSelect: function (data, options) {\n\n if (!this.triggerSelect(data)) { return; }\n\n var old = this.opts.element.val(),\n oldData = this.data();\n\n this.opts.element.val(this.id(data));\n this.updateSelection(data);\n\n this.opts.element.trigger({ type: \"select2-selected\", val: this.id(data), choice: data });\n\n this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());\n this.close();\n\n if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {\n this.focusser.focus();\n }\n\n if (!equal(old, this.id(data))) {\n this.triggerChange({ added: data, removed: oldData });\n }\n },\n\n // single\n updateSelection: function (data) {\n\n var container=this.selection.find(\".select2-chosen\"), formatted, cssClass;\n\n this.selection.data(\"select2-data\", data);\n\n container.empty();\n if (data !== null) {\n formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);\n }\n if (formatted !== undefined) {\n container.append(formatted);\n }\n cssClass=this.opts.formatSelectionCssClass(data, container);\n if (cssClass !== undefined) {\n container.addClass(cssClass);\n }\n\n this.selection.removeClass(\"select2-default\");\n\n if (this.opts.allowClear && this.getPlaceholder() !== undefined) {\n this.container.addClass(\"select2-allowclear\");\n }\n },\n\n // single\n val: function () {\n var val,\n triggerChange = false,\n data = null,\n self = this,\n oldData = this.data();\n\n if (arguments.length === 0) {\n return this.opts.element.val();\n }\n\n val = arguments[0];\n\n if (arguments.length > 1) {\n triggerChange = arguments[1];\n }\n\n if (this.select) {\n this.select\n .val(val)\n .find(\"option\").filter(function() { return this.selected }).each2(function (i, elm) {\n data = self.optionToData(elm);\n return false;\n });\n this.updateSelection(data);\n this.setPlaceholder();\n if (triggerChange) {\n this.triggerChange({added: data, removed:oldData});\n }\n } else {\n // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n if (!val && val !== 0) {\n this.clear(triggerChange);\n return;\n }\n if (this.opts.initSelection === undefined) {\n throw new Error(\"cannot call val() if initSelection() is not defined\");\n }\n this.opts.element.val(val);\n this.opts.initSelection(this.opts.element, function(data){\n self.opts.element.val(!data ? \"\" : self.id(data));\n self.updateSelection(data);\n self.setPlaceholder();\n if (triggerChange) {\n self.triggerChange({added: data, removed:oldData});\n }\n });\n }\n },\n\n // single\n clearSearch: function () {\n this.search.val(\"\");\n this.focusser.val(\"\");\n },\n\n // single\n data: function(value) {\n var data,\n triggerChange = false;\n\n if (arguments.length === 0) {\n data = this.selection.data(\"select2-data\");\n if (data == undefined) data = null;\n return data;\n } else {\n if (arguments.length > 1) {\n triggerChange = arguments[1];\n }\n if (!value) {\n this.clear(triggerChange);\n } else {\n data = this.data();\n this.opts.element.val(!value ? \"\" : this.id(value));\n this.updateSelection(value);\n if (triggerChange) {\n this.triggerChange({added: value, removed:data});\n }\n }\n }\n }\n });\n\n MultiSelect2 = clazz(AbstractSelect2, {\n\n // multi\n createContainer: function () {\n var container = $(document.createElement(\"div\")).attr({\n \"class\": \"select2-container select2-container-multi\"\n }).html([\n \"
      \",\n \"
    • \",\n \" \",\n \" \",\n \"
    • \",\n \"
    \",\n \"
    \",\n \"
      \",\n \"
    \",\n \"
    \"].join(\"\"));\n return container;\n },\n\n // multi\n prepareOpts: function () {\n var opts = this.parent.prepareOpts.apply(this, arguments),\n self=this;\n\n // TODO validate placeholder is a string if specified\n\n if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n // install the selection initializer\n opts.initSelection = function (element, callback) {\n\n var data = [];\n\n element.find(\"option\").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {\n data.push(self.optionToData(elm));\n });\n callback(data);\n };\n } else if (\"data\" in opts) {\n // install default initSelection when applied to hidden input and data is local\n opts.initSelection = opts.initSelection || function (element, callback) {\n var ids = splitVal(element.val(), opts.separator);\n //search in data by array of ids, storing matching items in a list\n var matches = [];\n opts.query({\n matcher: function(term, text, el){\n var is_match = $.grep(ids, function(id) {\n return equal(id, opts.id(el));\n }).length;\n if (is_match) {\n matches.push(el);\n }\n return is_match;\n },\n callback: !$.isFunction(callback) ? $.noop : function() {\n // reorder matches based on the order they appear in the ids array because right now\n // they are in the order in which they appear in data array\n var ordered = [];\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i];\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n if (equal(id, opts.id(match))) {\n ordered.push(match);\n matches.splice(j, 1);\n break;\n }\n }\n }\n callback(ordered);\n }\n });\n };\n }\n\n return opts;\n },\n\n // multi\n selectChoice: function (choice) {\n\n var selected = this.container.find(\".select2-search-choice-focus\");\n if (selected.length && choice && choice[0] == selected[0]) {\n\n } else {\n if (selected.length) {\n this.opts.element.trigger(\"choice-deselected\", selected);\n }\n selected.removeClass(\"select2-search-choice-focus\");\n if (choice && choice.length) {\n this.close();\n choice.addClass(\"select2-search-choice-focus\");\n this.opts.element.trigger(\"choice-selected\", choice);\n }\n }\n },\n\n // multi\n destroy: function() {\n $(\"label[for='\" + this.search.attr('id') + \"']\")\n .attr('for', this.opts.element.attr(\"id\"));\n this.parent.destroy.apply(this, arguments);\n\n cleanupJQueryElements.call(this,\n \"searchContainer\",\n \"selection\"\n );\n },\n\n // multi\n initContainer: function () {\n\n var selector = \".select2-choices\", selection;\n\n this.searchContainer = this.container.find(\".select2-search-field\");\n this.selection = selection = this.container.find(selector);\n\n var _this = this;\n this.selection.on(\"click\", \".select2-search-choice:not(.select2-locked)\", function (e) {\n //killEvent(e);\n _this.search[0].focus();\n _this.selectChoice($(this));\n });\n\n // rewrite labels from original element to focusser\n this.search.attr(\"id\", \"s2id_autogen\"+nextUid());\n\n this.search.prev()\n .text($(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\").text())\n .attr('for', this.search.attr('id'));\n\n this.search.on(\"input paste\", this.bind(function() {\n if (this.search.attr('placeholder') && this.search.val().length == 0) return;\n if (!this.isInterfaceEnabled()) return;\n if (!this.opened()) {\n this.open();\n }\n }));\n\n this.search.attr(\"tabindex\", this.elementTabIndex);\n\n this.keydowns = 0;\n this.search.on(\"keydown\", this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n\n ++this.keydowns;\n var selected = selection.find(\".select2-search-choice-focus\");\n var prev = selected.prev(\".select2-search-choice:not(.select2-locked)\");\n var next = selected.next(\".select2-search-choice:not(.select2-locked)\");\n var pos = getCursorInfo(this.search);\n\n if (selected.length &&\n (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {\n var selectedChoice = selected;\n if (e.which == KEY.LEFT && prev.length) {\n selectedChoice = prev;\n }\n else if (e.which == KEY.RIGHT) {\n selectedChoice = next.length ? next : null;\n }\n else if (e.which === KEY.BACKSPACE) {\n if (this.unselect(selected.first())) {\n this.search.width(10);\n selectedChoice = prev.length ? prev : next;\n }\n } else if (e.which == KEY.DELETE) {\n if (this.unselect(selected.first())) {\n this.search.width(10);\n selectedChoice = next.length ? next : null;\n }\n } else if (e.which == KEY.ENTER) {\n selectedChoice = null;\n }\n\n this.selectChoice(selectedChoice);\n killEvent(e);\n if (!selectedChoice || !selectedChoice.length) {\n this.open();\n }\n return;\n } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)\n || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {\n\n this.selectChoice(selection.find(\".select2-search-choice:not(.select2-locked)\").last());\n killEvent(e);\n return;\n } else {\n this.selectChoice(null);\n }\n\n if (this.opened()) {\n switch (e.which) {\n case KEY.UP:\n case KEY.DOWN:\n this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n killEvent(e);\n return;\n case KEY.ENTER:\n this.selectHighlighted();\n killEvent(e);\n return;\n case KEY.TAB:\n this.selectHighlighted({noFocus:true});\n this.close();\n return;\n case KEY.ESC:\n this.cancel(e);\n killEvent(e);\n return;\n }\n }\n\n if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)\n || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {\n return;\n }\n\n if (e.which === KEY.ENTER) {\n if (this.opts.openOnEnter === false) {\n return;\n } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n return;\n }\n }\n\n this.open();\n\n if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n // prevent the page from scrolling\n killEvent(e);\n }\n\n if (e.which === KEY.ENTER) {\n // prevent form from being submitted\n killEvent(e);\n }\n\n }));\n\n this.search.on(\"keyup\", this.bind(function (e) {\n this.keydowns = 0;\n this.resizeSearch();\n })\n );\n\n this.search.on(\"blur\", this.bind(function(e) {\n this.container.removeClass(\"select2-container-active\");\n this.search.removeClass(\"select2-focused\");\n this.selectChoice(null);\n if (!this.opened()) this.clearSearch();\n e.stopImmediatePropagation();\n this.opts.element.trigger($.Event(\"select2-blur\"));\n }));\n\n this.container.on(\"click\", selector, this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n if ($(e.target).closest(\".select2-search-choice\").length > 0) {\n // clicked inside a select2 search choice, do not open\n return;\n }\n this.selectChoice(null);\n this.clearPlaceholder();\n if (!this.container.hasClass(\"select2-container-active\")) {\n this.opts.element.trigger($.Event(\"select2-focus\"));\n }\n this.open();\n this.focusSearch();\n e.preventDefault();\n }));\n\n this.container.on(\"focus\", selector, this.bind(function () {\n if (!this.isInterfaceEnabled()) return;\n if (!this.container.hasClass(\"select2-container-active\")) {\n this.opts.element.trigger($.Event(\"select2-focus\"));\n }\n this.container.addClass(\"select2-container-active\");\n this.dropdown.addClass(\"select2-drop-active\");\n this.clearPlaceholder();\n }));\n\n this.initContainerWidth();\n this.opts.element.addClass(\"select2-offscreen\");\n\n // set the placeholder if necessary\n this.clearSearch();\n },\n\n // multi\n enableInterface: function() {\n if (this.parent.enableInterface.apply(this, arguments)) {\n this.search.prop(\"disabled\", !this.isInterfaceEnabled());\n }\n },\n\n // multi\n initSelection: function () {\n var data;\n if (this.opts.element.val() === \"\" && this.opts.element.text() === \"\") {\n this.updateSelection([]);\n this.close();\n // set the placeholder if necessary\n this.clearSearch();\n }\n if (this.select || this.opts.element.val() !== \"\") {\n var self = this;\n this.opts.initSelection.call(null, this.opts.element, function(data){\n if (data !== undefined && data !== null) {\n self.updateSelection(data);\n self.close();\n // set the placeholder if necessary\n self.clearSearch();\n }\n });\n }\n },\n\n // multi\n clearSearch: function () {\n var placeholder = this.getPlaceholder(),\n maxWidth = this.getMaxSearchWidth();\n\n if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass(\"select2-focused\") === false) {\n this.search.val(placeholder).addClass(\"select2-default\");\n // stretch the search box to full width of the container so as much of the placeholder is visible as possible\n // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944\n this.search.width(maxWidth > 0 ? maxWidth : this.container.css(\"width\"));\n } else {\n this.search.val(\"\").width(10);\n }\n },\n\n // multi\n clearPlaceholder: function () {\n if (this.search.hasClass(\"select2-default\")) {\n this.search.val(\"\").removeClass(\"select2-default\");\n }\n },\n\n // multi\n opening: function () {\n this.clearPlaceholder(); // should be done before super so placeholder is not used to search\n this.resizeSearch();\n\n this.parent.opening.apply(this, arguments);\n\n this.focusSearch();\n\n // initializes search's value with nextSearchTerm (if defined by user)\n // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter\n if(this.search.val() === \"\") {\n if(this.nextSearchTerm != undefined){\n this.search.val(this.nextSearchTerm);\n this.search.select();\n }\n }\n\n this.updateResults(true);\n if (this.opts.shouldFocusInput(this)) {\n this.search.focus();\n }\n this.opts.element.trigger($.Event(\"select2-open\"));\n },\n\n // multi\n close: function () {\n if (!this.opened()) return;\n this.parent.close.apply(this, arguments);\n },\n\n // multi\n focus: function () {\n this.close();\n this.search.focus();\n },\n\n // multi\n isFocused: function () {\n return this.search.hasClass(\"select2-focused\");\n },\n\n // multi\n updateSelection: function (data) {\n var ids = [], filtered = [], self = this;\n\n // filter out duplicates\n $(data).each(function () {\n if (indexOf(self.id(this), ids) < 0) {\n ids.push(self.id(this));\n filtered.push(this);\n }\n });\n data = filtered;\n\n this.selection.find(\".select2-search-choice\").remove();\n $(data).each(function () {\n self.addSelectedChoice(this);\n });\n self.postprocessResults();\n },\n\n // multi\n tokenize: function() {\n var input = this.search.val();\n input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);\n if (input != null && input != undefined) {\n this.search.val(input);\n if (input.length > 0) {\n this.open();\n }\n }\n\n },\n\n // multi\n onSelect: function (data, options) {\n\n if (!this.triggerSelect(data) || data.text === \"\") { return; }\n\n this.addSelectedChoice(data);\n\n this.opts.element.trigger({ type: \"selected\", val: this.id(data), choice: data });\n\n // keep track of the search's value before it gets cleared\n this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());\n\n this.clearSearch();\n this.updateResults();\n\n if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);\n\n if (this.opts.closeOnSelect) {\n this.close();\n this.search.width(10);\n } else {\n if (this.countSelectableResults()>0) {\n this.search.width(10);\n this.resizeSearch();\n if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {\n // if we reached max selection size repaint the results so choices\n // are replaced with the max selection reached message\n this.updateResults(true);\n } else {\n // initializes search's value with nextSearchTerm and update search result\n if(this.nextSearchTerm != undefined){\n this.search.val(this.nextSearchTerm);\n this.updateResults();\n this.search.select();\n }\n }\n this.positionDropdown();\n } else {\n // if nothing left to select close\n this.close();\n this.search.width(10);\n }\n }\n\n // since its not possible to select an element that has already been\n // added we do not need to check if this is a new element before firing change\n this.triggerChange({ added: data });\n\n if (!options || !options.noFocus)\n this.focusSearch();\n },\n\n // multi\n cancel: function () {\n this.close();\n this.focusSearch();\n },\n\n addSelectedChoice: function (data) {\n var enableChoice = !data.locked,\n enabledItem = $(\n \"
  4. \" +\n \"
    \" +\n \" \" +\n \"
  5. \"),\n disabledItem = $(\n \"
  6. \" +\n \"
    \" +\n \"
  7. \");\n var choice = enableChoice ? enabledItem : disabledItem,\n id = this.id(data),\n val = this.getVal(),\n formatted,\n cssClass;\n\n formatted=this.opts.formatSelection(data, choice.find(\"div\"), this.opts.escapeMarkup);\n if (formatted != undefined) {\n choice.find(\"div\").replaceWith(\"
    \"+formatted+\"
    \");\n }\n cssClass=this.opts.formatSelectionCssClass(data, choice.find(\"div\"));\n if (cssClass != undefined) {\n choice.addClass(cssClass);\n }\n\n if(enableChoice){\n choice.find(\".select2-search-choice-close\")\n .on(\"mousedown\", killEvent)\n .on(\"click dblclick\", this.bind(function (e) {\n if (!this.isInterfaceEnabled()) return;\n\n this.unselect($(e.target));\n this.selection.find(\".select2-search-choice-focus\").removeClass(\"select2-search-choice-focus\");\n killEvent(e);\n this.close();\n this.focusSearch();\n })).on(\"focus\", this.bind(function () {\n if (!this.isInterfaceEnabled()) return;\n this.container.addClass(\"select2-container-active\");\n this.dropdown.addClass(\"select2-drop-active\");\n }));\n }\n\n choice.data(\"select2-data\", data);\n choice.insertBefore(this.searchContainer);\n\n val.push(id);\n this.setVal(val);\n },\n\n // multi\n unselect: function (selected) {\n var val = this.getVal(),\n data,\n index;\n selected = selected.closest(\".select2-search-choice\");\n\n if (selected.length === 0) {\n throw \"Invalid argument: \" + selected + \". Must be .select2-search-choice\";\n }\n\n data = selected.data(\"select2-data\");\n\n if (!data) {\n // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued\n // and invoked on an element already removed\n return;\n }\n\n var evt = $.Event(\"select2-removing\");\n evt.val = this.id(data);\n evt.choice = data;\n this.opts.element.trigger(evt);\n\n if (evt.isDefaultPrevented()) {\n return false;\n }\n\n while((index = indexOf(this.id(data), val)) >= 0) {\n val.splice(index, 1);\n this.setVal(val);\n if (this.select) this.postprocessResults();\n }\n\n selected.remove();\n\n this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n this.triggerChange({ removed: data });\n\n return true;\n },\n\n // multi\n postprocessResults: function (data, initial, noHighlightUpdate) {\n var val = this.getVal(),\n choices = this.results.find(\".select2-result\"),\n compound = this.results.find(\".select2-result-with-children\"),\n self = this;\n\n choices.each2(function (i, choice) {\n var id = self.id(choice.data(\"select2-data\"));\n if (indexOf(id, val) >= 0) {\n choice.addClass(\"select2-selected\");\n // mark all children of the selected parent as selected\n choice.find(\".select2-result-selectable\").addClass(\"select2-selected\");\n }\n });\n\n compound.each2(function(i, choice) {\n // hide an optgroup if it doesn't have any selectable children\n if (!choice.is('.select2-result-selectable')\n && choice.find(\".select2-result-selectable:not(.select2-selected)\").length === 0) {\n choice.addClass(\"select2-selected\");\n }\n });\n\n if (this.highlight() == -1 && noHighlightUpdate !== false){\n self.highlight(0);\n }\n\n //If all results are chosen render formatNoMatches\n if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){\n if(!data || data && !data.more && this.results.find(\".select2-no-results\").length === 0) {\n if (checkFormatter(self.opts.formatNoMatches, \"formatNoMatches\")) {\n this.results.append(\"
  8. \" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + \"
  9. \");\n }\n }\n }\n\n },\n\n // multi\n getMaxSearchWidth: function() {\n return this.selection.width() - getSideBorderPadding(this.search);\n },\n\n // multi\n resizeSearch: function () {\n var minimumWidth, left, maxWidth, containerLeft, searchWidth,\n sideBorderPadding = getSideBorderPadding(this.search);\n\n minimumWidth = measureTextWidth(this.search) + 10;\n\n left = this.search.offset().left;\n\n maxWidth = this.selection.width();\n containerLeft = this.selection.offset().left;\n\n searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;\n\n if (searchWidth < minimumWidth) {\n searchWidth = maxWidth - sideBorderPadding;\n }\n\n if (searchWidth < 40) {\n searchWidth = maxWidth - sideBorderPadding;\n }\n\n if (searchWidth <= 0) {\n searchWidth = minimumWidth;\n }\n\n this.search.width(Math.floor(searchWidth));\n },\n\n // multi\n getVal: function () {\n var val;\n if (this.select) {\n val = this.select.val();\n return val === null ? [] : val;\n } else {\n val = this.opts.element.val();\n return splitVal(val, this.opts.separator);\n }\n },\n\n // multi\n setVal: function (val) {\n var unique;\n if (this.select) {\n this.select.val(val);\n } else {\n unique = [];\n // filter out duplicates\n $(val).each(function () {\n if (indexOf(this, unique) < 0) unique.push(this);\n });\n this.opts.element.val(unique.length === 0 ? \"\" : unique.join(this.opts.separator));\n }\n },\n\n // multi\n buildChangeDetails: function (old, current) {\n var current = current.slice(0),\n old = old.slice(0);\n\n // remove intersection from each array\n for (var i = 0; i < current.length; i++) {\n for (var j = 0; j < old.length; j++) {\n if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {\n current.splice(i, 1);\n if(i>0){\n \ti--;\n }\n old.splice(j, 1);\n j--;\n }\n }\n }\n\n return {added: current, removed: old};\n },\n\n\n // multi\n val: function (val, triggerChange) {\n var oldData, self=this;\n\n if (arguments.length === 0) {\n return this.getVal();\n }\n\n oldData=this.data();\n if (!oldData.length) oldData=[];\n\n // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n if (!val && val !== 0) {\n this.opts.element.val(\"\");\n this.updateSelection([]);\n this.clearSearch();\n if (triggerChange) {\n this.triggerChange({added: this.data(), removed: oldData});\n }\n return;\n }\n\n // val is a list of ids\n this.setVal(val);\n\n if (this.select) {\n this.opts.initSelection(this.select, this.bind(this.updateSelection));\n if (triggerChange) {\n this.triggerChange(this.buildChangeDetails(oldData, this.data()));\n }\n } else {\n if (this.opts.initSelection === undefined) {\n throw new Error(\"val() cannot be called if initSelection() is not defined\");\n }\n\n this.opts.initSelection(this.opts.element, function(data){\n var ids=$.map(data, self.id);\n self.setVal(ids);\n self.updateSelection(data);\n self.clearSearch();\n if (triggerChange) {\n self.triggerChange(self.buildChangeDetails(oldData, self.data()));\n }\n });\n }\n this.clearSearch();\n },\n\n // multi\n onSortStart: function() {\n if (this.select) {\n throw new Error(\"Sorting of elements is not supported when attached to instead.\");\n }\n\n // collapse search field into 0 width so its container can be collapsed as well\n this.search.width(0);\n // hide the container\n this.searchContainer.hide();\n },\n\n // multi\n onSortEnd:function() {\n\n var val=[], self=this;\n\n // show search and move it to the end of the list\n this.searchContainer.show();\n // make sure the search container is the last item in the list\n this.searchContainer.appendTo(this.searchContainer.parent());\n // since we collapsed the width in dragStarted, we resize it here\n this.resizeSearch();\n\n // update selection\n this.selection.find(\".select2-search-choice\").each(function() {\n val.push(self.opts.id($(this).data(\"select2-data\")));\n });\n this.setVal(val);\n this.triggerChange();\n },\n\n // multi\n data: function(values, triggerChange) {\n var self=this, ids, old;\n if (arguments.length === 0) {\n return this.selection\n .children(\".select2-search-choice\")\n .map(function() { return $(this).data(\"select2-data\"); })\n .get();\n } else {\n old = this.data();\n if (!values) { values = []; }\n ids = $.map(values, function(e) { return self.opts.id(e); });\n this.setVal(ids);\n this.updateSelection(values);\n this.clearSearch();\n if (triggerChange) {\n this.triggerChange(this.buildChangeDetails(old, this.data()));\n }\n }\n }\n });\n\n $.fn.select2 = function () {\n\n var args = Array.prototype.slice.call(arguments, 0),\n opts,\n select2,\n method, value, multiple,\n allowedMethods = [\"val\", \"destroy\", \"opened\", \"open\", \"close\", \"focus\", \"isFocused\", \"container\", \"dropdown\", \"onSortStart\", \"onSortEnd\", \"enable\", \"disable\", \"readonly\", \"positionDropdown\", \"data\", \"search\"],\n valueMethods = [\"opened\", \"isFocused\", \"container\", \"dropdown\"],\n propertyMethods = [\"val\", \"data\"],\n methodsMap = { search: \"externalSearch\" };\n\n this.each(function () {\n if (args.length === 0 || typeof(args[0]) === \"object\") {\n opts = args.length === 0 ? {} : $.extend({}, args[0]);\n opts.element = $(this);\n\n if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n multiple = opts.element.prop(\"multiple\");\n } else {\n multiple = opts.multiple || false;\n if (\"tags\" in opts) {opts.multiple = multiple = true;}\n }\n\n select2 = multiple ? new window.Select2[\"class\"].multi() : new window.Select2[\"class\"].single();\n select2.init(opts);\n } else if (typeof(args[0]) === \"string\") {\n\n if (indexOf(args[0], allowedMethods) < 0) {\n throw \"Unknown method: \" + args[0];\n }\n\n value = undefined;\n select2 = $(this).data(\"select2\");\n if (select2 === undefined) return;\n\n method=args[0];\n\n if (method === \"container\") {\n value = select2.container;\n } else if (method === \"dropdown\") {\n value = select2.dropdown;\n } else {\n if (methodsMap[method]) method = methodsMap[method];\n\n value = select2[method].apply(select2, args.slice(1));\n }\n if (indexOf(args[0], valueMethods) >= 0\n || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {\n return false; // abort the iteration, ready to return first matched value\n }\n } else {\n throw \"Invalid arguments to select2 plugin: \" + args;\n }\n });\n return (value === undefined) ? this : value;\n };\n\n // plugin defaults, accessible to users\n $.fn.select2.defaults = {\n width: \"copy\",\n loadMorePadding: 0,\n closeOnSelect: true,\n openOnEnter: true,\n containerCss: {},\n dropdownCss: {},\n containerCssClass: \"\",\n dropdownCssClass: \"\",\n formatResult: function(result, container, query, escapeMarkup) {\n var markup=[];\n markMatch(result.text, query.term, markup, escapeMarkup);\n return markup.join(\"\");\n },\n formatSelection: function (data, container, escapeMarkup) {\n return data ? escapeMarkup(data.text) : undefined;\n },\n sortResults: function (results, container, query) {\n return results;\n },\n formatResultCssClass: function(data) {return data.css;},\n formatSelectionCssClass: function(data, container) {return undefined;},\n minimumResultsForSearch: 0,\n minimumInputLength: 0,\n maximumInputLength: null,\n maximumSelectionSize: 0,\n id: function (e) { return e == undefined ? null : e.id; },\n matcher: function(term, text) {\n return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;\n },\n separator: \",\",\n tokenSeparators: [],\n tokenizer: defaultTokenizer,\n escapeMarkup: defaultEscapeMarkup,\n blurOnChange: false,\n selectOnBlur: false,\n adaptContainerCssClass: function(c) { return c; },\n adaptDropdownCssClass: function(c) { return null; },\n nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },\n searchInputPlaceholder: '',\n createSearchChoicePosition: 'top',\n shouldFocusInput: function (instance) {\n // Attempt to detect touch devices\n var supportsTouchEvents = (('ontouchstart' in window) ||\n (navigator.msMaxTouchPoints > 0));\n\n // Only devices which support touch events should be special cased\n if (!supportsTouchEvents) {\n return true;\n }\n\n // Never focus the input if search is disabled\n if (instance.opts.minimumResultsForSearch < 0) {\n return false;\n }\n\n return true;\n }\n };\n\n $.fn.select2.locales = [];\n\n $.fn.select2.locales['en'] = {\n formatMatches: function (matches) { if (matches === 1) { return \"One result is available, press enter to select it.\"; } return matches + \" results are available, use up and down arrow keys to navigate.\"; },\n formatNoMatches: function () { return \"No matches found\"; },\n formatAjaxError: function (jqXHR, textStatus, errorThrown) { return \"Loading failed\"; },\n formatInputTooShort: function (input, min) { var n = min - input.length; return \"Please enter \" + n + \" or more character\" + (n == 1 ? \"\" : \"s\"); },\n formatInputTooLong: function (input, max) { var n = input.length - max; return \"Please delete \" + n + \" character\" + (n == 1 ? \"\" : \"s\"); },\n formatSelectionTooBig: function (limit) { return \"You can only select \" + limit + \" item\" + (limit == 1 ? \"\" : \"s\"); },\n formatLoadMore: function (pageNumber) { return \"Loading more results…\"; },\n formatSearching: function () { return \"Searching…\"; },\n };\n\n $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);\n\n $.fn.select2.ajaxDefaults = {\n transport: $.ajax,\n params: {\n type: \"GET\",\n cache: false,\n dataType: \"json\"\n }\n };\n\n // exports\n window.Select2 = {\n query: {\n ajax: ajax,\n local: local,\n tags: tags\n }, util: {\n debounce: debounce,\n markMatch: markMatch,\n escapeMarkup: defaultEscapeMarkup,\n stripDiacritics: stripDiacritics\n }, \"class\": {\n \"abstract\": AbstractSelect2,\n \"single\": SingleSelect2,\n \"multi\": MultiSelect2\n }\n };\n\n}(jQuery));\n","/**\n * Select2 French translation\n */\n(function ($) {\n \"use strict\";\n\n $.fn.select2.locales['fr'] = {\n formatMatches: function (matches) { return matches + \" résultats sont disponibles, utilisez les flèches haut et bas pour naviguer.\"; },\n formatNoMatches: function () { return \"Aucun résultat trouvé\"; },\n formatInputTooShort: function (input, min) { var n = min - input.length; return \"Saisissez \" + n + \" caractère\" + (n == 1? \"\" : \"s\") + \" supplémentaire\" + (n == 1? \"\" : \"s\") ; },\n formatInputTooLong: function (input, max) { var n = input.length - max; return \"Supprimez \" + n + \" caractère\" + (n == 1? \"\" : \"s\"); },\n formatSelectionTooBig: function (limit) { return \"Vous pouvez seulement sélectionner \" + limit + \" élément\" + (limit == 1 ? \"\" : \"s\"); },\n formatLoadMore: function (pageNumber) { return \"Chargement de résultats supplémentaires…\"; },\n formatSearching: function () { return \"Recherche en cours…\"; }\n };\n\n $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']);\n})(jQuery);\n","(function(factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof module === 'object' && typeof module.exports === 'object') {\n\t\tmodule.exports = factory(require('jquery'));\n\t} else {\n\t\tfactory(jQuery);\n\t}\n}(function(jQuery) {\n\n/*! TableSorter (FORK) v2.28.4 *//*\n* Client-side table sorting with ease!\n* @requires jQuery v1.2.6+\n*\n* Copyright (c) 2007 Christian Bach\n* fork maintained by Rob Garrison\n*\n* Examples and original docs at: http://tablesorter.com\n* Dual licensed under the MIT and GPL licenses:\n* http://www.opensource.org/licenses/mit-license.php\n* http://www.gnu.org/licenses/gpl.html\n*\n* @type jQuery\n* @name tablesorter (FORK)\n* @cat Plugins/Tablesorter\n* @author Christian Bach - christian.bach@polyester.se\n* @contributor Rob Garrison - https://github.com/Mottie/tablesorter\n* @docs (fork) - https://mottie.github.io/tablesorter/docs/\n*/\n/*jshint browser:true, jquery:true, unused:false, expr: true */\n;( function( $ ) {\n\t'use strict';\n\tvar ts = $.tablesorter = {\n\n\t\tversion : '2.28.4',\n\n\t\tparsers : [],\n\t\twidgets : [],\n\t\tdefaults : {\n\n\t\t\t// *** appearance\n\t\t\ttheme : 'default', // adds tablesorter-{theme} to the table for styling\n\t\t\twidthFixed : false, // adds colgroup to fix widths of columns\n\t\t\tshowProcessing : false, // show an indeterminate timer icon in the header when the table is sorted or filtered.\n\n\t\t\theaderTemplate : '{content}',// header layout template (HTML ok); {content} = innerHTML, {icon} = // class from cssIcon\n\t\t\tonRenderTemplate : null, // function( index, template ){ return template; }, // template is a string\n\t\t\tonRenderHeader : null, // function( index ){}, // nothing to return\n\n\t\t\t// *** functionality\n\t\t\tcancelSelection : true, // prevent text selection in the header\n\t\t\ttabIndex : true, // add tabindex to header for keyboard accessibility\n\t\t\tdateFormat : 'mmddyyyy', // other options: 'ddmmyyy' or 'yyyymmdd'\n\t\t\tsortMultiSortKey : 'shiftKey', // key used to select additional columns\n\t\t\tsortResetKey : 'ctrlKey', // key used to remove sorting on a column\n\t\t\tusNumberFormat : true, // false for German '1.234.567,89' or French '1 234 567,89'\n\t\t\tdelayInit : false, // if false, the parsed table contents will not update until the first sort\n\t\t\tserverSideSorting: false, // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.\n\t\t\tresort : true, // default setting to trigger a resort after an 'update', 'addRows', 'updateCell', etc has completed\n\n\t\t\t// *** sort options\n\t\t\theaders : {}, // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.\n\t\t\tignoreCase : true, // ignore case while sorting\n\t\t\tsortForce : null, // column(s) first sorted; always applied\n\t\t\tsortList : [], // Initial sort order; applied initially; updated when manually sorted\n\t\t\tsortAppend : null, // column(s) sorted last; always applied\n\t\t\tsortStable : false, // when sorting two rows with exactly the same content, the original sort order is maintained\n\n\t\t\tsortInitialOrder : 'asc', // sort direction on first click\n\t\t\tsortLocaleCompare: false, // replace equivalent character (accented characters)\n\t\t\tsortReset : false, // third click on the header will reset column to default - unsorted\n\t\t\tsortRestart : false, // restart sort to 'sortInitialOrder' when clicking on previously unsorted columns\n\n\t\t\temptyTo : 'bottom', // sort empty cell to bottom, top, none, zero, emptyMax, emptyMin\n\t\t\tstringTo : 'max', // sort strings in numerical column as max, min, top, bottom, zero\n\t\t\tduplicateSpan : true, // colspan cells in the tbody will have duplicated content in the cache for each spanned column\n\t\t\ttextExtraction : 'basic', // text extraction method/function - function( node, table, cellIndex ){}\n\t\t\ttextAttribute : 'data-text',// data-attribute that contains alternate cell text (used in default textExtraction function)\n\t\t\ttextSorter : null, // choose overall or specific column sorter function( a, b, direction, table, columnIndex ) [alt: ts.sortText]\n\t\t\tnumberSorter : null, // choose overall numeric sorter function( a, b, direction, maxColumnValue )\n\n\t\t\t// *** widget options\n\t\t\tinitWidgets : true, // apply widgets on tablesorter initialization\n\t\t\twidgetClass : 'widget-{name}', // table class name template to match to include a widget\n\t\t\twidgets : [], // method to add widgets, e.g. widgets: ['zebra']\n\t\t\twidgetOptions : {\n\t\t\t\tzebra : [ 'even', 'odd' ] // zebra widget alternating row class names\n\t\t\t},\n\n\t\t\t// *** callbacks\n\t\t\tinitialized : null, // function( table ){},\n\n\t\t\t// *** extra css class names\n\t\t\ttableClass : '',\n\t\t\tcssAsc : '',\n\t\t\tcssDesc : '',\n\t\t\tcssNone : '',\n\t\t\tcssHeader : '',\n\t\t\tcssHeaderRow : '',\n\t\t\tcssProcessing : '', // processing icon applied to header during sort/filter\n\n\t\t\tcssChildRow : 'tablesorter-childRow', // class name indiciating that a row is to be attached to its parent\n\t\t\tcssInfoBlock : 'tablesorter-infoOnly', // don't sort tbody with this class name (only one class name allowed here!)\n\t\t\tcssNoSort : 'tablesorter-noSort', // class name added to element inside header; clicking on it won't cause a sort\n\t\t\tcssIgnoreRow : 'tablesorter-ignoreRow',// header row to ignore; cells within this row will not be added to c.$headers\n\n\t\t\tcssIcon : 'tablesorter-icon', // if this class does not exist, the {icon} will not be added from the headerTemplate\n\t\t\tcssIconNone : '', // class name added to the icon when there is no column sort\n\t\t\tcssIconAsc : '', // class name added to the icon when the column has an ascending sort\n\t\t\tcssIconDesc : '', // class name added to the icon when the column has a descending sort\n\n\t\t\t// *** events\n\t\t\tpointerClick : 'click',\n\t\t\tpointerDown : 'mousedown',\n\t\t\tpointerUp : 'mouseup',\n\n\t\t\t// *** selectors\n\t\t\tselectorHeaders : '> thead th, > thead td',\n\t\t\tselectorSort : 'th, td', // jQuery selector of content within selectorHeaders that is clickable to trigger a sort\n\t\t\tselectorRemove : '.remove-me',\n\n\t\t\t// *** advanced\n\t\t\tdebug : false,\n\n\t\t\t// *** Internal variables\n\t\t\theaderList: [],\n\t\t\tempties: {},\n\t\t\tstrings: {},\n\t\t\tparsers: [],\n\n\t\t\t// *** parser options for validator; values must be falsy!\n\t\t\tglobalize: 0,\n\t\t\timgAttr: 0\n\n\t\t\t// removed: widgetZebra: { css: ['even', 'odd'] }\n\n\t\t},\n\n\t\t// internal css classes - these will ALWAYS be added to\n\t\t// the table and MUST only contain one class name - fixes #381\n\t\tcss : {\n\t\t\ttable : 'tablesorter',\n\t\t\tcssHasChild: 'tablesorter-hasChildRow',\n\t\t\tchildRow : 'tablesorter-childRow',\n\t\t\tcolgroup : 'tablesorter-colgroup',\n\t\t\theader : 'tablesorter-header',\n\t\t\theaderRow : 'tablesorter-headerRow',\n\t\t\theaderIn : 'tablesorter-header-inner',\n\t\t\ticon : 'tablesorter-icon',\n\t\t\tprocessing : 'tablesorter-processing',\n\t\t\tsortAsc : 'tablesorter-headerAsc',\n\t\t\tsortDesc : 'tablesorter-headerDesc',\n\t\t\tsortNone : 'tablesorter-headerUnSorted'\n\t\t},\n\n\t\t// labels applied to sortable headers for accessibility (aria) support\n\t\tlanguage : {\n\t\t\tsortAsc : 'Ascending sort applied, ',\n\t\t\tsortDesc : 'Descending sort applied, ',\n\t\t\tsortNone : 'No sort applied, ',\n\t\t\tsortDisabled : 'sorting is disabled',\n\t\t\tnextAsc : 'activate to apply an ascending sort',\n\t\t\tnextDesc : 'activate to apply a descending sort',\n\t\t\tnextNone : 'activate to remove the sort'\n\t\t},\n\n\t\tregex : {\n\t\t\ttemplateContent : /\\{content\\}/g,\n\t\t\ttemplateIcon : /\\{icon\\}/g,\n\t\t\ttemplateName : /\\{name\\}/i,\n\t\t\tspaces : /\\s+/g,\n\t\t\tnonWord : /\\W/g,\n\t\t\tformElements : /(input|select|button|textarea)/i,\n\n\t\t\t// *** sort functions ***\n\t\t\t// regex used in natural sort\n\t\t\t// chunk/tokenize numbers & letters\n\t\t\tchunk : /(^([+\\-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\n\t\t\t// replace chunks @ ends\n\t\t\tchunks : /(^\\\\0|\\\\0$)/,\n\t\t\thex : /^0x[0-9a-f]+$/i,\n\n\t\t\t// *** formatFloat ***\n\t\t\tcomma : /,/g,\n\t\t\tdigitNonUS : /[\\s|\\.]/g,\n\t\t\tdigitNegativeTest : /^\\s*\\([.\\d]+\\)/,\n\t\t\tdigitNegativeReplace : /^\\s*\\(([.\\d]+)\\)/,\n\n\t\t\t// *** isDigit ***\n\t\t\tdigitTest : /^[\\-+(]?\\d+[)]?$/,\n\t\t\tdigitReplace : /[,.'\"\\s]/g\n\n\t\t},\n\n\t\t// digit sort, text location\n\t\tstring : {\n\t\t\tmax : 1,\n\t\t\tmin : -1,\n\t\t\temptymin : 1,\n\t\t\temptymax : -1,\n\t\t\tzero : 0,\n\t\t\tnone : 0,\n\t\t\t'null' : 0,\n\t\t\ttop : true,\n\t\t\tbottom : false\n\t\t},\n\n\t\tkeyCodes : {\n\t\t\tenter : 13\n\t\t},\n\n\t\t// placeholder date parser data (globalize)\n\t\tdates : {},\n\n\t\t// These methods can be applied on table.config instance\n\t\tinstanceMethods : {},\n\n\t\t/*\n\t\t▄█████ ██████ ██████ ██ ██ █████▄\n\t\t▀█▄ ██▄▄ ██ ██ ██ ██▄▄██\n\t\t ▀█▄ ██▀▀ ██ ██ ██ ██▀▀▀\n\t\t█████▀ ██████ ██ ▀████▀ ██\n\t\t*/\n\n\t\tsetup : function( table, c ) {\n\t\t\t// if no thead or tbody, or tablesorter is already present, quit\n\t\t\tif ( !table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\tconsole.warn( 'Stopping initialization. Tablesorter has already been initialized' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error( 'Stopping initialization! No table, thead or tbody', table );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tmp = '',\n\t\t\t\t$table = $( table ),\n\t\t\t\tmeta = $.metadata;\n\t\t\t// initialization flag\n\t\t\ttable.hasInitialized = false;\n\t\t\t// table is being processed flag\n\t\t\ttable.isProcessing = true;\n\t\t\t// make sure to store the config object\n\t\t\ttable.config = c;\n\t\t\t// save the settings where they read\n\t\t\t$.data( table, 'tablesorter', c );\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing tablesorter v' + ts.version );\n\t\t\t\t$.data( table, 'startoveralltimer', new Date() );\n\t\t\t}\n\n\t\t\t// removing this in version 3 (only supports jQuery 1.7+)\n\t\t\tc.supportsDataObject = ( function( version ) {\n\t\t\t\tversion[ 0 ] = parseInt( version[ 0 ], 10 );\n\t\t\t\treturn ( version[ 0 ] > 1 ) || ( version[ 0 ] === 1 && parseInt( version[ 1 ], 10 ) >= 4 );\n\t\t\t})( $.fn.jquery.split( '.' ) );\n\t\t\t// ensure case insensitivity\n\t\t\tc.emptyTo = c.emptyTo.toLowerCase();\n\t\t\tc.stringTo = c.stringTo.toLowerCase();\n\t\t\tc.last = { sortList : [], clickedIndex : -1 };\n\t\t\t// add table theme class only if there isn't already one there\n\t\t\tif ( !/tablesorter\\-/.test( $table.attr( 'class' ) ) ) {\n\t\t\t\ttmp = ( c.theme !== '' ? ' tablesorter-' + c.theme : '' );\n\t\t\t}\n\t\t\tc.table = table;\n\t\t\tc.$table = $table\n\t\t\t\t.addClass( ts.css.table + ' ' + c.tableClass + tmp )\n\t\t\t\t.attr( 'role', 'grid' );\n\t\t\tc.$headers = $table.find( c.selectorHeaders );\n\n\t\t\t// give the table a unique id, which will be used in namespace binding\n\t\t\tif ( !c.namespace ) {\n\t\t\t\tc.namespace = '.tablesorter' + Math.random().toString( 16 ).slice( 2 );\n\t\t\t} else {\n\t\t\t\t// make sure namespace starts with a period & doesn't have weird characters\n\t\t\t\tc.namespace = '.' + c.namespace.replace( ts.regex.nonWord, '' );\n\t\t\t}\n\n\t\t\tc.$table.children().children( 'tr' ).attr( 'role', 'row' );\n\t\t\tc.$tbodies = $table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ).attr({\n\t\t\t\t'aria-live' : 'polite',\n\t\t\t\t'aria-relevant' : 'all'\n\t\t\t});\n\t\t\tif ( c.$table.children( 'caption' ).length ) {\n\t\t\t\ttmp = c.$table.children( 'caption' )[ 0 ];\n\t\t\t\tif ( !tmp.id ) { tmp.id = c.namespace.slice( 1 ) + 'caption'; }\n\t\t\t\tc.$table.attr( 'aria-labelledby', tmp.id );\n\t\t\t}\n\t\t\tc.widgetInit = {}; // keep a list of initialized widgets\n\t\t\t// change textExtraction via data-attribute\n\t\t\tc.textExtraction = c.$table.attr( 'data-text-extraction' ) || c.textExtraction || 'basic';\n\t\t\t// build headers\n\t\t\tts.buildHeaders( c );\n\t\t\t// fixate columns if the users supplies the fixedWidth option\n\t\t\t// do this after theme has been applied\n\t\t\tts.fixColumnWidth( table );\n\t\t\t// add widgets from class name\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// add widget options before parsing (e.g. grouping widget has parser settings)\n\t\t\tts.applyWidgetOptions( table );\n\t\t\t// try to auto detect column type, and store in tables config\n\t\t\tts.setupParsers( c );\n\t\t\t// start total row count at zero\n\t\t\tc.totalRows = 0;\n\t\t\tts.validateOptions( c );\n\t\t\t// build the cache for the tbody cells\n\t\t\t// delayInit will delay building the cache until the user starts a sort\n\t\t\tif ( !c.delayInit ) { ts.buildCache( c ); }\n\t\t\t// bind all header events and methods\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\t// get sort list from jQuery data or metadata\n\t\t\t// in jQuery < 1.4, an error occurs when calling $table.data()\n\t\t\tif ( c.supportsDataObject && typeof $table.data().sortlist !== 'undefined' ) {\n\t\t\t\tc.sortList = $table.data().sortlist;\n\t\t\t} else if ( meta && ( $table.metadata() && $table.metadata().sortlist ) ) {\n\t\t\t\tc.sortList = $table.metadata().sortlist;\n\t\t\t}\n\t\t\t// apply widget init code\n\t\t\tts.applyWidget( table, true );\n\t\t\t// if user has supplied a sort list to constructor\n\t\t\tif ( c.sortList.length > 0 ) {\n\t\t\t\tts.sortOn( c, c.sortList, {}, !c.initWidgets );\n\t\t\t} else {\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tif ( c.initWidgets ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// show processesing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\t$table\n\t\t\t\t.unbind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace )\n\t\t\t\t.bind( 'sortBegin' + c.namespace + ' sortEnd' + c.namespace, function( e ) {\n\t\t\t\t\tclearTimeout( c.timerProcessing );\n\t\t\t\t\tts.isProcessing( table );\n\t\t\t\t\tif ( e.type === 'sortBegin' ) {\n\t\t\t\t\t\tc.timerProcessing = setTimeout( function() {\n\t\t\t\t\t\t\tts.isProcessing( table, true );\n\t\t\t\t\t\t}, 500 );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// initialized\n\t\t\ttable.hasInitialized = true;\n\t\t\ttable.isProcessing = false;\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Overall initialization time:' + ts.benchmark( $.data( table, 'startoveralltimer' ) ) );\n\t\t\t\tif ( c.debug && console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\t$table.triggerHandler( 'tablesorter-initialized', table );\n\t\t\tif ( typeof c.initialized === 'function' ) {\n\t\t\t\tc.initialized( table );\n\t\t\t}\n\t\t},\n\n\t\tbindMethods : function( c ) {\n\t\t\tvar $table = c.$table,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tevents = ( 'sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete ' +\n\t\t\t\t\t'sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup ' +\n\t\t\t\t\t'mouseleave ' ).split( ' ' )\n\t\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply easy methods that trigger bound events\n\t\t\t$table\n\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) )\n\t\t\t.bind( 'sortReset' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// using this.config to ensure functions are getting a non-cached version of the config\n\t\t\t\tts.sortReset( this.config, callback );\n\t\t\t})\n\t\t\t.bind( 'updateAll' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateAll( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'update' + namespace + ' updateRows' + namespace, function( e, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.update( this.config, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateHeaders' + namespace, function( e, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateHeaders( this.config, callback );\n\t\t\t})\n\t\t\t.bind( 'updateCell' + namespace, function( e, cell, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCell( this.config, cell, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'addRows' + namespace, function( e, $row, resort, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.addRows( this.config, $row, resort, callback );\n\t\t\t})\n\t\t\t.bind( 'updateComplete' + namespace, function() {\n\t\t\t\tthis.isUpdating = false;\n\t\t\t})\n\t\t\t.bind( 'sorton' + namespace, function( e, list, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.sortOn( this.config, list, callback, init );\n\t\t\t})\n\t\t\t.bind( 'appendCache' + namespace, function( e, callback, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.appendCache( this.config, init );\n\t\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\t\tcallback( this );\n\t\t\t\t}\n\t\t\t})\n\t\t\t// $tbodies variable is used by the tbody sorting widget\n\t\t\t.bind( 'updateCache' + namespace, function( e, callback, $tbodies ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.updateCache( this.config, callback, $tbodies );\n\t\t\t})\n\t\t\t.bind( 'applyWidgetId' + namespace, function( e, id ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.applyWidgetId( this, id );\n\t\t\t})\n\t\t\t.bind( 'applyWidgets' + namespace, function( e, init ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// apply widgets\n\t\t\t\tts.applyWidget( this, init );\n\t\t\t})\n\t\t\t.bind( 'refreshWidgets' + namespace, function( e, all, dontapply ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.refreshWidgets( this, all, dontapply );\n\t\t\t})\n\t\t\t.bind( 'removeWidget' + namespace, function( e, name, refreshing ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.removeWidget( this, name, refreshing );\n\t\t\t})\n\t\t\t.bind( 'destroy' + namespace, function( e, removeClasses, callback ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tts.destroy( this, removeClasses, callback );\n\t\t\t})\n\t\t\t.bind( 'resetToLoadState' + namespace, function( e ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t// remove all widgets\n\t\t\t\tts.removeWidget( this, true, false );\n\t\t\t\tvar tmp = $.extend( true, {}, c.originalSettings );\n\t\t\t\t// restore original settings; this clears out current settings, but does not clear\n\t\t\t\t// values saved to storage.\n\t\t\t\tc = $.extend( true, ts.defaults, tmp );\n\t\t\t\tc.originalSettings = tmp;\n\t\t\t\tthis.hasInitialized = false;\n\t\t\t\t// setup the entire table again\n\t\t\t\tts.setup( this, c );\n\t\t\t});\n\t\t},\n\n\t\tbindEvents : function( table, $headers, core ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar tmp,\n\t\t\t\tc = table.config,\n\t\t\t\tnamespace = c.namespace,\n\t\t\t\tdownTarget = null;\n\t\t\tif ( core !== true ) {\n\t\t\t\t$headers.addClass( namespace.slice( 1 ) + '_extra_headers' );\n\t\t\t\ttmp = $.fn.closest ? $headers.closest( 'table' )[ 0 ] : $headers.parents( 'table' )[ 0 ];\n\t\t\t\tif ( tmp && tmp.nodeName === 'TABLE' && tmp !== table ) {\n\t\t\t\t\t$( tmp ).addClass( namespace.slice( 1 ) + '_extra_table' );\n\t\t\t\t}\n\t\t\t}\n\t\t\ttmp = ( c.pointerDown + ' ' + c.pointerUp + ' ' + c.pointerClick + ' sort keyup ' )\n\t\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t\t.split( ' ' )\n\t\t\t\t.join( namespace + ' ' );\n\t\t\t// apply event handling to headers and/or additional headers (stickyheaders, scroller, etc)\n\t\t\t$headers\n\t\t\t// http://stackoverflow.com/questions/5312849/jquery-find-self;\n\t\t\t.find( c.selectorSort )\n\t\t\t.add( $headers.filter( c.selectorSort ) )\n\t\t\t.unbind( tmp )\n\t\t\t.bind( tmp, function( e, external ) {\n\t\t\t\tvar $cell, cell, temp,\n\t\t\t\t\t$target = $( e.target ),\n\t\t\t\t\t// wrap event type in spaces, so the match doesn't trigger on inner words\n\t\t\t\t\ttype = ' ' + e.type + ' ';\n\t\t\t\t// only recognize left clicks\n\t\t\t\tif ( ( ( e.which || e.button ) !== 1 && !type.match( ' ' + c.pointerClick + ' | sort | keyup ' ) ) ||\n\t\t\t\t\t// allow pressing enter\n\t\t\t\t\t( type === ' keyup ' && e.which !== ts.keyCodes.enter ) ||\n\t\t\t\t\t// allow triggering a click event (e.which is undefined) & ignore physical clicks\n\t\t\t\t\t( type.match( ' ' + c.pointerClick + ' ' ) && typeof e.which !== 'undefined' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// ignore mouseup if mousedown wasn't on the same target\n\t\t\t\tif ( type.match( ' ' + c.pointerUp + ' ' ) && downTarget !== e.target && external !== true ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// set target on mousedown\n\t\t\t\tif ( type.match( ' ' + c.pointerDown + ' ' ) ) {\n\t\t\t\t\tdownTarget = e.target;\n\t\t\t\t\t// preventDefault needed or jQuery v1.3.2 and older throws an\n\t\t\t\t\t// \"Uncaught TypeError: handler.apply is not a function\" error\n\t\t\t\t\ttemp = $target.jquery.split( '.' );\n\t\t\t\t\tif ( temp[ 0 ] === '1' && temp[ 1 ] < 4 ) { e.preventDefault(); }\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdownTarget = null;\n\t\t\t\t// prevent sort being triggered on form elements\n\t\t\t\tif ( ts.regex.formElements.test( e.target.nodeName ) ||\n\t\t\t\t\t// nosort class name, or elements within a nosort container\n\t\t\t\t\t$target.hasClass( c.cssNoSort ) || $target.parents( '.' + c.cssNoSort ).length > 0 ||\n\t\t\t\t\t// elements within a button\n\t\t\t\t\t$target.parents( 'button' ).length > 0 ) {\n\t\t\t\t\treturn !c.cancelSelection;\n\t\t\t\t}\n\t\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t\tts.buildCache( c );\n\t\t\t\t}\n\t\t\t\t// jQuery v1.2.6 doesn't have closest()\n\t\t\t\t$cell = $.fn.closest ? $( this ).closest( 'th, td' ) :\n\t\t\t\t\t/TH|TD/.test( this.nodeName ) ? $( this ) : $( this ).parents( 'th, td' );\n\t\t\t\t// reference original table headers and find the same cell\n\t\t\t\t// don't use $headers or IE8 throws an error - see #987\n\t\t\t\ttemp = $headers.index( $cell );\n\t\t\t\tc.last.clickedIndex = ( temp < 0 ) ? $cell.attr( 'data-column' ) : temp;\n\t\t\t\t// use column index if $headers is undefined\n\t\t\t\tcell = c.$headers[ c.last.clickedIndex ];\n\t\t\t\tif ( cell && !cell.sortDisabled ) {\n\t\t\t\t\tts.initSort( c, cell, e );\n\t\t\t\t}\n\t\t\t});\n\t\t\tif ( c.cancelSelection ) {\n\t\t\t\t// cancel selection\n\t\t\t\t$headers\n\t\t\t\t\t.attr( 'unselectable', 'on' )\n\t\t\t\t\t.bind( 'selectstart', false )\n\t\t\t\t\t.css({\n\t\t\t\t\t\t'user-select' : 'none',\n\t\t\t\t\t\t'MozUserSelect' : 'none' // not needed for jQuery 1.8+\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tbuildHeaders : function( c ) {\n\t\t\tvar $temp, icon, timer, indx;\n\t\t\tc.headerList = [];\n\t\t\tc.headerContent = [];\n\t\t\tc.sortVars = [];\n\t\t\tif ( c.debug ) {\n\t\t\t\ttimer = new Date();\n\t\t\t}\n\t\t\t// children tr in tfoot - see issue #196 & #547\n\t\t\t// don't pass table.config to computeColumnIndex here - widgets (math) pass it to \"quickly\" index tbody cells\n\t\t\tc.columns = ts.computeColumnIndex( c.$table.children( 'thead, tfoot' ).children( 'tr' ) );\n\t\t\t// add icon if cssIcon option exists\n\t\t\ticon = c.cssIcon ?\n\t\t\t\t'' :\n\t\t\t\t'';\n\t\t\t// redefine c.$headers here in case of an updateAll that replaces or adds an entire header cell - see #683\n\t\t\tc.$headers = $( $.map( c.$table.find( c.selectorHeaders ), function( elem, index ) {\n\t\t\t\tvar configHeaders, header, column, template, tmp,\n\t\t\t\t\t$elem = $( elem );\n\t\t\t\t// ignore cell (don't add it to c.$headers) if row has ignoreRow class\n\t\t\t\tif ( $elem.parent().hasClass( c.cssIgnoreRow ) ) { return; }\n\t\t\t\t// make sure to get header cell & not column indexed cell\n\t\t\t\tconfigHeaders = ts.getColumnData( c.table, c.headers, index, true );\n\t\t\t\t// save original header content\n\t\t\t\tc.headerContent[ index ] = $elem.html();\n\t\t\t\t// if headerTemplate is empty, don't reformat the header cell\n\t\t\t\tif ( c.headerTemplate !== '' && !$elem.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t// set up header template\n\t\t\t\t\ttemplate = c.headerTemplate\n\t\t\t\t\t\t.replace( ts.regex.templateContent, $elem.html() )\n\t\t\t\t\t\t.replace( ts.regex.templateIcon, $elem.find( '.' + ts.css.icon ).length ? '' : icon );\n\t\t\t\t\tif ( c.onRenderTemplate ) {\n\t\t\t\t\t\theader = c.onRenderTemplate.apply( $elem, [ index, template ] );\n\t\t\t\t\t\t// only change t if something is returned\n\t\t\t\t\t\tif ( header && typeof header === 'string' ) {\n\t\t\t\t\t\t\ttemplate = header;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$elem.html( '
    ' + template + '
    ' ); // faster than wrapInner\n\t\t\t\t}\n\t\t\t\tif ( c.onRenderHeader ) {\n\t\t\t\t\tc.onRenderHeader.apply( $elem, [ index, c, c.$table ] );\n\t\t\t\t}\n\t\t\t\tcolumn = parseInt( $elem.attr( 'data-column' ), 10 );\n\t\t\t\telem.column = column;\n\t\t\t\ttmp = ts.getOrder( ts.getData( $elem, configHeaders, 'sortInitialOrder' ) || c.sortInitialOrder );\n\t\t\t\t// this may get updated numerous times if there are multiple rows\n\t\t\t\tc.sortVars[ column ] = {\n\t\t\t\t\tcount : -1, // set to -1 because clicking on the header automatically adds one\n\t\t\t\t\torder: tmp ?\n\t\t\t\t\t\t( c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ] ) : // desc, asc, unsorted\n\t\t\t\t\t\t( c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ] ), // asc, desc, unsorted\n\t\t\t\t\tlockedOrder : false\n\t\t\t\t};\n\t\t\t\ttmp = ts.getData( $elem, configHeaders, 'lockedOrder' ) || false;\n\t\t\t\tif ( typeof tmp !== 'undefined' && tmp !== false ) {\n\t\t\t\t\tc.sortVars[ column ].lockedOrder = true;\n\t\t\t\t\tc.sortVars[ column ].order = ts.getOrder( tmp ) ? [ 1, 1 ] : [ 0, 0 ];\n\t\t\t\t}\n\t\t\t\t// add cell to headerList\n\t\t\t\tc.headerList[ index ] = elem;\n\t\t\t\t// add to parent in case there are multiple rows\n\t\t\t\t$elem\n\t\t\t\t\t.addClass( ts.css.header + ' ' + c.cssHeader )\n\t\t\t\t\t.parent()\n\t\t\t\t\t.addClass( ts.css.headerRow + ' ' + c.cssHeaderRow )\n\t\t\t\t\t.attr( 'role', 'row' );\n\t\t\t\t// allow keyboard cursor to focus on element\n\t\t\t\tif ( c.tabIndex ) {\n\t\t\t\t\t$elem.attr( 'tabindex', 0 );\n\t\t\t\t}\n\t\t\t\treturn elem;\n\t\t\t}) );\n\t\t\t// cache headers per column\n\t\t\tc.$headerIndexed = [];\n\t\t\tfor ( indx = 0; indx < c.columns; indx++ ) {\n\t\t\t\t// colspan in header making a column undefined\n\t\t\t\tif ( ts.isEmptyObject( c.sortVars[ indx ] ) ) {\n\t\t\t\t\tc.sortVars[ indx ] = {};\n\t\t\t\t}\n\t\t\t\t$temp = c.$headers.filter( '[data-column=\"' + indx + '\"]' );\n\t\t\t\t// target sortable column cells, unless there are none, then use non-sortable cells\n\t\t\t\t// .last() added in jQuery 1.4; use .filter(':last') to maintain compatibility with jQuery v1.2.6\n\t\t\t\tc.$headerIndexed[ indx ] = $temp.length ?\n\t\t\t\t\t$temp.not( '.sorter-false' ).length ?\n\t\t\t\t\t\t$temp.not( '.sorter-false' ).filter( ':last' ) :\n\t\t\t\t\t\t$temp.filter( ':last' ) :\n\t\t\t\t\t$();\n\t\t\t}\n\t\t\tc.$table.find( c.selectorHeaders ).attr({\n\t\t\t\tscope: 'col',\n\t\t\t\trole : 'columnheader'\n\t\t\t});\n\t\t\t// enable/disable sorting\n\t\t\tts.updateHeader( c );\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Built headers:' + ts.benchmark( timer ) );\n\t\t\t\tconsole.log( c.$headers );\n\t\t\t}\n\t\t},\n\n\t\t// Use it to add a set of methods to table.config which will be available for all tables.\n\t\t// This should be done before table initialization\n\t\taddInstanceMethods : function( methods ) {\n\t\t\t$.extend( ts.instanceMethods, methods );\n\t\t},\n\n\t\t/*\n\t\t█████▄ ▄████▄ █████▄ ▄█████ ██████ █████▄ ▄█████\n\t\t██▄▄██ ██▄▄██ ██▄▄██ ▀█▄ ██▄▄ ██▄▄██ ▀█▄\n\t\t██▀▀▀ ██▀▀██ ██▀██ ▀█▄ ██▀▀ ██▀██ ▀█▄\n\t\t██ ██ ██ ██ ██ █████▀ ██████ ██ ██ █████▀\n\t\t*/\n\t\tsetupParsers : function( c, $tbodies ) {\n\t\t\tvar rows, list, span, max, colIndex, indx, header, configHeaders,\n\t\t\t\tnoParser, parser, extractor, time, tbody, len,\n\t\t\t\ttable = c.table,\n\t\t\t\ttbodyIndex = 0,\n\t\t\t\tdebug = {};\n\t\t\t// update table bodies in case we start with an empty table\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\ttbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies;\n\t\t\tlen = tbody.length;\n\t\t\tif ( len === 0 ) {\n\t\t\t\treturn c.debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : '';\n\t\t\t} else if ( c.debug ) {\n\t\t\t\ttime = new Date();\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Detecting parsers for each column' );\n\t\t\t}\n\t\t\tlist = {\n\t\t\t\textractors: [],\n\t\t\t\tparsers: []\n\t\t\t};\n\t\t\twhile ( tbodyIndex < len ) {\n\t\t\t\trows = tbody[ tbodyIndex ].rows;\n\t\t\t\tif ( rows.length ) {\n\t\t\t\t\tcolIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t\t\theader = c.$headerIndexed[ colIndex ];\n\t\t\t\t\t\tif ( header && header.length ) {\n\t\t\t\t\t\t\t// get column indexed table cell\n\t\t\t\t\t\t\tconfigHeaders = ts.getColumnData( table, c.headers, colIndex );\n\t\t\t\t\t\t\t// get column parser/extractor\n\t\t\t\t\t\t\textractor = ts.getParserById( ts.getData( header, configHeaders, 'extractor' ) );\n\t\t\t\t\t\t\tparser = ts.getParserById( ts.getData( header, configHeaders, 'sorter' ) );\n\t\t\t\t\t\t\tnoParser = ts.getData( header, configHeaders, 'parser' ) === 'false';\n\t\t\t\t\t\t\t// empty cells behaviour - keeping emptyToBottom for backwards compatibility\n\t\t\t\t\t\t\tc.empties[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'empty' ) ||\n\t\t\t\t\t\t\t\tc.emptyTo || ( c.emptyToBottom ? 'bottom' : 'top' ) ).toLowerCase();\n\t\t\t\t\t\t\t// text strings behaviour in numerical sorts\n\t\t\t\t\t\t\tc.strings[colIndex] = (\n\t\t\t\t\t\t\t\tts.getData( header, configHeaders, 'string' ) ||\n\t\t\t\t\t\t\t\tc.stringTo ||\n\t\t\t\t\t\t\t\t'max' ).toLowerCase();\n\t\t\t\t\t\t\tif ( noParser ) {\n\t\t\t\t\t\t\t\tparser = ts.getParserById( 'no-parser' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !extractor ) {\n\t\t\t\t\t\t\t\t// For now, maybe detect someday\n\t\t\t\t\t\t\t\textractor = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( !parser ) {\n\t\t\t\t\t\t\t\tparser = ts.detectParserForColumn( c, rows, -1, colIndex );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\t\tdebug[ '(' + colIndex + ') ' + header.text() ] = {\n\t\t\t\t\t\t\t\t\tparser : parser.id,\n\t\t\t\t\t\t\t\t\textractor : extractor ? extractor.id : 'none',\n\t\t\t\t\t\t\t\t\tstring : c.strings[ colIndex ],\n\t\t\t\t\t\t\t\t\tempty : c.empties[ colIndex ]\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlist.parsers[ colIndex ] = parser;\n\t\t\t\t\t\t\tlist.extractors[ colIndex ] = extractor;\n\t\t\t\t\t\t\tspan = header[ 0 ].colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tcolIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\twhile ( span + 1 > 0 ) {\n\t\t\t\t\t\t\t\t\t// set colspan columns to use the same parsers & extractors\n\t\t\t\t\t\t\t\t\tlist.parsers[ colIndex - span ] = parser;\n\t\t\t\t\t\t\t\t\tlist.extractors[ colIndex - span ] = extractor;\n\t\t\t\t\t\t\t\t\tspan--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcolIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttbodyIndex += ( list.parsers.length ) ? len : 1;\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tif ( !ts.isEmptyObject( debug ) ) {\n\t\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( debug );\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn( ' No parsers detected!' );\n\t\t\t\t}\n\t\t\t\tconsole.log( 'Completed detecting parsers' + ts.benchmark( time ) );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tc.parsers = list.parsers;\n\t\t\tc.extractors = list.extractors;\n\t\t},\n\n\t\taddParser : function( parser ) {\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length,\n\t\t\t\tadd = true;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === parser.id.toLowerCase() ) {\n\t\t\t\t\tadd = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( add ) {\n\t\t\t\tts.parsers[ ts.parsers.length ] = parser;\n\t\t\t}\n\t\t},\n\n\t\tgetParserById : function( name ) {\n\t\t\t/*jshint eqeqeq:false */\n\t\t\tif ( name == 'false' ) { return false; }\n\t\t\tvar indx,\n\t\t\t\tlen = ts.parsers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( ts.parsers[ indx ].id.toLowerCase() === ( name.toString() ).toLowerCase() ) {\n\t\t\t\t\treturn ts.parsers[ indx ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tdetectParserForColumn : function( c, rows, rowIndex, cellIndex ) {\n\t\t\tvar cur, $node, row,\n\t\t\t\tindx = ts.parsers.length,\n\t\t\t\tnode = false,\n\t\t\t\tnodeValue = '',\n\t\t\t\tkeepLooking = true;\n\t\t\twhile ( nodeValue === '' && keepLooking ) {\n\t\t\t\trowIndex++;\n\t\t\t\trow = rows[ rowIndex ];\n\t\t\t\t// stop looking after 50 empty rows\n\t\t\t\tif ( row && rowIndex < 50 ) {\n\t\t\t\t\tif ( row.className.indexOf( ts.cssIgnoreRow ) < 0 ) {\n\t\t\t\t\t\tnode = rows[ rowIndex ].cells[ cellIndex ];\n\t\t\t\t\t\tnodeValue = ts.getElementText( c, node, cellIndex );\n\t\t\t\t\t\t$node = $( node );\n\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\tconsole.log( 'Checking if value was empty on row ' + rowIndex + ', column: ' +\n\t\t\t\t\t\t\t\tcellIndex + ': \"' + nodeValue + '\"' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tkeepLooking = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( --indx >= 0 ) {\n\t\t\t\tcur = ts.parsers[ indx ];\n\t\t\t\t// ignore the default text parser because it will always be true\n\t\t\t\tif ( cur && cur.id !== 'text' && cur.is && cur.is( nodeValue, c.table, node, $node ) ) {\n\t\t\t\t\treturn cur;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// nothing found, return the generic parser (text)\n\t\t\treturn ts.getParserById( 'text' );\n\t\t},\n\n\t\tgetElementText : function( c, node, cellIndex ) {\n\t\t\tif ( !node ) { return ''; }\n\t\t\tvar tmp,\n\t\t\t\textract = c.textExtraction || '',\n\t\t\t\t// node could be a jquery object\n\t\t\t\t// http://jsperf.com/jquery-vs-instanceof-jquery/2\n\t\t\t\t$node = node.jquery ? node : $( node );\n\t\t\tif ( typeof extract === 'string' ) {\n\t\t\t\t// check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!\n\t\t\t\t// http://www.kellegous.com/j/2013/02/27/innertext-vs-textcontent/\n\t\t\t\tif ( extract === 'basic' && typeof ( tmp = $node.attr( c.textAttribute ) ) !== 'undefined' ) {\n\t\t\t\t\treturn $.trim( tmp );\n\t\t\t\t}\n\t\t\t\treturn $.trim( node.textContent || $node.text() );\n\t\t\t} else {\n\t\t\t\tif ( typeof extract === 'function' ) {\n\t\t\t\t\treturn $.trim( extract( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t} else if ( typeof ( tmp = ts.getColumnData( c.table, extract, cellIndex ) ) === 'function' ) {\n\t\t\t\t\treturn $.trim( tmp( $node[ 0 ], c.table, cellIndex ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fallback\n\t\t\treturn $.trim( $node[ 0 ].textContent || $node.text() );\n\t\t},\n\n\t\t// centralized function to extract/parse cell contents\n\t\tgetParsedText : function( c, cell, colIndex, txt ) {\n\t\t\tif ( typeof txt === 'undefined' ) {\n\t\t\t\ttxt = ts.getElementText( c, cell, colIndex );\n\t\t\t}\n\t\t\t// if no parser, make sure to return the txt\n\t\t\tvar val = '' + txt,\n\t\t\t\tparser = c.parsers[ colIndex ],\n\t\t\t\textractor = c.extractors[ colIndex ];\n\t\t\tif ( parser ) {\n\t\t\t\t// do extract before parsing, if there is one\n\t\t\t\tif ( extractor && typeof extractor.format === 'function' ) {\n\t\t\t\t\ttxt = extractor.format( txt, c.table, cell, colIndex );\n\t\t\t\t}\n\t\t\t\t// allow parsing if the string is empty, previously parsing would change it to zero,\n\t\t\t\t// in case the parser needs to extract data from the table cell attributes\n\t\t\t\tval = parser.id === 'no-parser' ? '' :\n\t\t\t\t\t// make sure txt is a string (extractor may have converted it)\n\t\t\t\t\tparser.format( '' + txt, c.table, cell, colIndex );\n\t\t\t\tif ( c.ignoreCase && typeof val === 'string' ) {\n\t\t\t\t\tval = val.toLowerCase();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\t/*\n\t\t▄████▄ ▄████▄ ▄████▄ ██ ██ ██████\n\t\t██ ▀▀ ██▄▄██ ██ ▀▀ ██▄▄██ ██▄▄\n\t\t██ ▄▄ ██▀▀██ ██ ▄▄ ██▀▀██ ██▀▀\n\t\t▀████▀ ██ ██ ▀████▀ ██ ██ ██████\n\t\t*/\n\t\tbuildCache : function( c, callback, $tbodies ) {\n\t\t\tvar cache, val, txt, rowIndex, colIndex, tbodyIndex, $tbody, $row,\n\t\t\t\tcols, $cells, cell, cacheTime, totalRows, rowData, prevRowData,\n\t\t\t\tcolMax, span, cacheIndex, hasParser, max, len, index,\n\t\t\t\ttable = c.table,\n\t\t\t\tparsers = c.parsers;\n\t\t\t// update tbody variable\n\t\t\tc.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' );\n\t\t\t$tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies,\n\t\t\tc.cache = {};\n\t\t\tc.totalRows = 0;\n\t\t\t// if no parsers found, return - it's an empty table.\n\t\t\tif ( !parsers ) {\n\t\t\t\treturn c.debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : '';\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tcacheTime = new Date();\n\t\t\t}\n\t\t\t// processing icon\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table, true );\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbody.length; tbodyIndex++ ) {\n\t\t\t\tcolMax = []; // column max value per tbody\n\t\t\t\tcache = c.cache[ tbodyIndex ] = {\n\t\t\t\t\tnormalized: [] // array of normalized row data; last entry contains 'rowData' above\n\t\t\t\t\t// colMax: # // added at the end\n\t\t\t\t};\n\n\t\t\t\ttotalRows = ( $tbody[ tbodyIndex ] && $tbody[ tbodyIndex ].rows.length ) || 0;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; ++rowIndex ) {\n\t\t\t\t\trowData = {\n\t\t\t\t\t\t// order: original row order #\n\t\t\t\t\t\t// $row : jQuery Object[]\n\t\t\t\t\t\tchild: [], // child row text (filter widget)\n\t\t\t\t\t\traw: [] // original row text\n\t\t\t\t\t};\n\t\t\t\t\t/** Add the table data to main data array */\n\t\t\t\t\t$row = $( $tbody[ tbodyIndex ].rows[ rowIndex ] );\n\t\t\t\t\tcols = [];\n\t\t\t\t\t// ignore \"remove-me\" rows\n\t\t\t\t\tif ( $row.hasClass( c.selectorRemove.slice(1) ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// if this is a child row, add it to the last row's children and continue to the next row\n\t\t\t\t\t// ignore child row class, if it is the first row\n\t\t\t\t\tif ( $row.hasClass( c.cssChildRow ) && rowIndex !== 0 ) {\n\t\t\t\t\t\tlen = cache.normalized.length - 1;\n\t\t\t\t\t\tprevRowData = cache.normalized[ len ][ c.columns ];\n\t\t\t\t\t\tprevRowData.$row = prevRowData.$row.add( $row );\n\t\t\t\t\t\t// add 'hasChild' class name to parent row\n\t\t\t\t\t\tif ( !$row.prev().hasClass( c.cssChildRow ) ) {\n\t\t\t\t\t\t\t$row.prev().addClass( ts.css.cssHasChild );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// save child row content (un-parsed!)\n\t\t\t\t\t\t$cells = $row.children( 'th, td' );\n\t\t\t\t\t\tlen = prevRowData.child.length;\n\t\t\t\t\t\tprevRowData.child[ len ] = [];\n\t\t\t\t\t\t// child row content does not account for colspans/rowspans; so indexing may be off\n\t\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\t\tmax = c.columns;\n\t\t\t\t\t\tfor ( colIndex = 0; colIndex < max; colIndex++ ) {\n\t\t\t\t\t\t\tcell = $cells[ colIndex ];\n\t\t\t\t\t\t\tif ( cell ) {\n\t\t\t\t\t\t\t\tprevRowData.child[ len ][ colIndex ] = ts.getParsedText( c, cell, colIndex );\n\t\t\t\t\t\t\t\tspan = $cells[ colIndex ].colSpan - 1;\n\t\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// go to the next for loop\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\trowData.$row = $row;\n\t\t\t\t\trowData.order = rowIndex; // add original row position to rowCache\n\t\t\t\t\tcacheIndex = 0;\n\t\t\t\t\tmax = c.columns;\n\t\t\t\t\tfor ( colIndex = 0; colIndex < max; ++colIndex ) {\n\t\t\t\t\t\tcell = $row[ 0 ].cells[ colIndex ];\n\t\t\t\t\t\tif ( cell && cacheIndex < c.columns ) {\n\t\t\t\t\t\t\thasParser = typeof parsers[ cacheIndex ] !== 'undefined';\n\t\t\t\t\t\t\tif ( !hasParser && c.debug ) {\n\t\t\t\t\t\t\t\tconsole.warn( 'No parser found for row: ' + rowIndex + ', column: ' + colIndex +\n\t\t\t\t\t\t\t\t\t'; cell containing: \"' + $(cell).text() + '\"; does it have a header?' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tval = ts.getElementText( c, cell, cacheIndex );\n\t\t\t\t\t\t\trowData.raw[ cacheIndex ] = val; // save original row text\n\t\t\t\t\t\t\t// save raw column text even if there is no parser set\n\t\t\t\t\t\t\ttxt = ts.getParsedText( c, cell, cacheIndex, val );\n\t\t\t\t\t\t\tcols[ cacheIndex ] = txt;\n\t\t\t\t\t\t\tif ( hasParser && ( parsers[ cacheIndex ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t\t\t\t// determine column max value (ignore sign)\n\t\t\t\t\t\t\t\tcolMax[ cacheIndex ] = Math.max( Math.abs( txt ) || 0, colMax[ cacheIndex ] || 0 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// allow colSpan in tbody\n\t\t\t\t\t\t\tspan = cell.colSpan - 1;\n\t\t\t\t\t\t\tif ( span > 0 ) {\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t\twhile ( index <= span ) {\n\t\t\t\t\t\t\t\t\t// duplicate text (or not) to spanned columns\n\t\t\t\t\t\t\t\t\t// instead of setting duplicate span to empty string, use textExtraction to try to get a value\n\t\t\t\t\t\t\t\t\t// see http://stackoverflow.com/q/36449711/145346\n\t\t\t\t\t\t\t\t\ttxt = c.duplicateSpan || index === 0 ?\n\t\t\t\t\t\t\t\t\t\tval :\n\t\t\t\t\t\t\t\t\t\ttypeof c.textExtraction !== 'string' ?\n\t\t\t\t\t\t\t\t\t\t\tts.getElementText( c, cell, cacheIndex + index ) || '' :\n\t\t\t\t\t\t\t\t\t\t\t'';\n\t\t\t\t\t\t\t\t\trowData.raw[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tcols[ cacheIndex + index ] = txt;\n\t\t\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t\t\tmax += span;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// ensure rowData is always in the same location (after the last column)\n\t\t\t\t\tcols[ c.columns ] = rowData;\n\t\t\t\t\tcache.normalized[ cache.normalized.length ] = cols;\n\t\t\t\t}\n\t\t\t\tcache.colMax = colMax;\n\t\t\t\t// total up rows, not including child rows\n\t\t\t\tc.totalRows += cache.normalized.length;\n\n\t\t\t}\n\t\t\tif ( c.showProcessing ) {\n\t\t\t\tts.isProcessing( table ); // remove processing icon\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tlen = Math.min( 5, c.cache[ 0 ].normalized.length );\n\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Building cache for ' + c.totalRows +\n\t\t\t\t\t' rows (showing ' + len + ' rows in log) and ' + c.columns + ' columns' +\n\t\t\t\t\tts.benchmark( cacheTime ) );\n\t\t\t\tval = {};\n\t\t\t\tfor ( colIndex = 0; colIndex < c.columns; colIndex++ ) {\n\t\t\t\t\tfor ( cacheIndex = 0; cacheIndex < len; cacheIndex++ ) {\n\t\t\t\t\t\tif ( !val[ 'row: ' + cacheIndex ] ) {\n\t\t\t\t\t\t\tval[ 'row: ' + cacheIndex ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval[ 'row: ' + cacheIndex ][ c.$headerIndexed[ colIndex ].text() ] =\n\t\t\t\t\t\t\tc.cache[ 0 ].normalized[ cacheIndex ][ colIndex ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconsole[ console.table ? 'table' : 'log' ]( val );\n\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tgetColumnText : function( table, column, callback, rowFilter ) {\n\t\t\ttable = $( table )[0];\n\t\t\tvar tbodyIndex, rowIndex, cache, row, tbodyLen, rowLen, raw, parsed, $cell, result,\n\t\t\t\thasCallback = typeof callback === 'function',\n\t\t\t\tallColumns = column === 'all',\n\t\t\t\tdata = { raw : [], parsed: [], $cell: [] },\n\t\t\t\tc = table.config;\n\t\t\tif ( ts.isEmptyObject( c ) ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.warn( 'No cache found - aborting getColumnText function!' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttbodyLen = c.$tbodies.length;\n\t\t\t\tfor ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) {\n\t\t\t\t\tcache = c.cache[ tbodyIndex ].normalized;\n\t\t\t\t\trowLen = cache.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < rowLen; rowIndex++ ) {\n\t\t\t\t\t\trow = cache[ rowIndex ];\n\t\t\t\t\t\tif ( rowFilter && !row[ c.columns ].$row.is( rowFilter ) ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult = true;\n\t\t\t\t\t\tparsed = ( allColumns ) ? row.slice( 0, c.columns ) : row[ column ];\n\t\t\t\t\t\trow = row[ c.columns ];\n\t\t\t\t\t\traw = ( allColumns ) ? row.raw : row.raw[ column ];\n\t\t\t\t\t\t$cell = ( allColumns ) ? row.$row.children() : row.$row.children().eq( column );\n\t\t\t\t\t\tif ( hasCallback ) {\n\t\t\t\t\t\t\tresult = callback({\n\t\t\t\t\t\t\t\ttbodyIndex : tbodyIndex,\n\t\t\t\t\t\t\t\trowIndex : rowIndex,\n\t\t\t\t\t\t\t\tparsed : parsed,\n\t\t\t\t\t\t\t\traw : raw,\n\t\t\t\t\t\t\t\t$row : row.$row,\n\t\t\t\t\t\t\t\t$cell : $cell\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== false ) {\n\t\t\t\t\t\t\tdata.parsed[ data.parsed.length ] = parsed;\n\t\t\t\t\t\t\tdata.raw[ data.raw.length ] = raw;\n\t\t\t\t\t\t\tdata.$cell[ data.$cell.length ] = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// return everything\n\t\t\t\treturn data;\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██ ██ █████▄ █████▄ ▄████▄ ██████ ██████\n\t\t██ ██ ██▄▄██ ██ ██ ██▄▄██ ██ ██▄▄\n\t\t██ ██ ██▀▀▀ ██ ██ ██▀▀██ ██ ██▀▀\n\t\t▀████▀ ██ █████▀ ██ ██ ██ ██████\n\t\t*/\n\t\tsetHeadersCss : function( c ) {\n\t\t\tvar $sorted, indx, column,\n\t\t\t\tlist = c.sortList,\n\t\t\t\tlen = list.length,\n\t\t\t\tnone = ts.css.sortNone + ' ' + c.cssNone,\n\t\t\t\tcss = [ ts.css.sortAsc + ' ' + c.cssAsc, ts.css.sortDesc + ' ' + c.cssDesc ],\n\t\t\t\tcssIcon = [ c.cssIconAsc, c.cssIconDesc, c.cssIconNone ],\n\t\t\t\taria = [ 'ascending', 'descending' ],\n\t\t\t\t// find the footer\n\t\t\t\t$headers = c.$table\n\t\t\t\t\t.find( 'tfoot tr' )\n\t\t\t\t\t.children( 'td, th' )\n\t\t\t\t\t.add( $( c.namespace + '_extra_headers' ) )\n\t\t\t\t\t.removeClass( css.join( ' ' ) );\n\t\t\t// remove all header information\n\t\t\tc.$headers\n\t\t\t\t.add( $( 'thead ' + c.namespace + '_extra_headers' ) )\n\t\t\t\t.removeClass( css.join( ' ' ) )\n\t\t\t\t.addClass( none )\n\t\t\t\t.attr( 'aria-sort', 'none' )\n\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t.removeClass( cssIcon.join( ' ' ) )\n\t\t\t\t.addClass( cssIcon[ 2 ] );\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t// direction = 2 means reset!\n\t\t\t\tif ( list[ indx ][ 1 ] !== 2 ) {\n\t\t\t\t\t// multicolumn sorting updating - see #1005\n\t\t\t\t\t// .not(function(){}) needs jQuery 1.4\n\t\t\t\t\t// filter(function(i, el){}) <- el is undefined in jQuery v1.2.6\n\t\t\t\t\t$sorted = c.$headers.filter( function( i ) {\n\t\t\t\t\t\t// only include headers that are in the sortList (this includes colspans)\n\t\t\t\t\t\tvar include = true,\n\t\t\t\t\t\t\t$el = c.$headers.eq( i ),\n\t\t\t\t\t\t\tcol = parseInt( $el.attr( 'data-column' ), 10 ),\n\t\t\t\t\t\t\tend = col + c.$headers[ i ].colSpan;\n\t\t\t\t\t\tfor ( ; col < end; col++ ) {\n\t\t\t\t\t\t\tinclude = include ? include || ts.isValueInArray( col, c.sortList ) > -1 : false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn include;\n\t\t\t\t\t});\n\n\t\t\t\t\t// choose the :last in case there are nested columns\n\t\t\t\t\t$sorted = $sorted\n\t\t\t\t\t\t.not( '.sorter-false' )\n\t\t\t\t\t\t.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' + ( len === 1 ? ':last' : '' ) );\n\t\t\t\t\tif ( $sorted.length ) {\n\t\t\t\t\t\tfor ( column = 0; column < $sorted.length; column++ ) {\n\t\t\t\t\t\t\tif ( !$sorted[ column ].sortDisabled ) {\n\t\t\t\t\t\t\t\t$sorted\n\t\t\t\t\t\t\t\t\t.eq( column )\n\t\t\t\t\t\t\t\t\t.removeClass( none )\n\t\t\t\t\t\t\t\t\t.addClass( css[ list[ indx ][ 1 ] ] )\n\t\t\t\t\t\t\t\t\t.attr( 'aria-sort', aria[ list[ indx ][ 1 ] ] )\n\t\t\t\t\t\t\t\t\t.find( '.' + ts.css.icon )\n\t\t\t\t\t\t\t\t\t.removeClass( cssIcon[ 2 ] )\n\t\t\t\t\t\t\t\t\t.addClass( cssIcon[ list[ indx ][ 1 ] ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// add sorted class to footer & extra headers, if they exist\n\t\t\t\t\t\tif ( $headers.length ) {\n\t\t\t\t\t\t\t$headers\n\t\t\t\t\t\t\t\t.filter( '[data-column=\"' + list[ indx ][ 0 ] + '\"]' )\n\t\t\t\t\t\t\t\t.removeClass( none )\n\t\t\t\t\t\t\t\t.addClass( css[ list[ indx ][ 1 ] ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// add verbose aria labels\n\t\t\tlen = c.$headers.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tts.setColumnAriaLabel( c, c.$headers.eq( indx ) );\n\t\t\t}\n\t\t},\n\n\t\t// nextSort (optional), lets you disable next sort text\n\t\tsetColumnAriaLabel : function( c, $header, nextSort ) {\n\t\t\tif ( $header.length ) {\n\t\t\t\tvar column = parseInt( $header.attr( 'data-column' ), 10 ),\n\t\t\t\t\tvars = c.sortVars[ column ],\n\t\t\t\t\ttmp = $header.hasClass( ts.css.sortAsc ) ?\n\t\t\t\t\t\t'sortAsc' :\n\t\t\t\t\t\t$header.hasClass( ts.css.sortDesc ) ? 'sortDesc' : 'sortNone',\n\t\t\t\t\ttxt = $.trim( $header.text() ) + ': ' + ts.language[ tmp ];\n\t\t\t\tif ( $header.hasClass( 'sorter-false' ) || nextSort === false ) {\n\t\t\t\t\ttxt += ts.language.sortDisabled;\n\t\t\t\t} else {\n\t\t\t\t\ttmp = ( vars.count + 1 ) % vars.order.length;\n\t\t\t\t\tnextSort = vars.order[ tmp ];\n\t\t\t\t\t// if nextSort\n\t\t\t\t\ttxt += ts.language[ nextSort === 0 ? 'nextAsc' : nextSort === 1 ? 'nextDesc' : 'nextNone' ];\n\t\t\t\t}\n\t\t\t\t$header.attr( 'aria-label', txt );\n\t\t\t}\n\t\t},\n\n\t\tupdateHeader : function( c ) {\n\t\t\tvar index, isDisabled, $header, col,\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$header = c.$headers.eq( index );\n\t\t\t\tcol = ts.getColumnData( table, c.headers, index, true );\n\t\t\t\t// add 'sorter-false' class if 'parser-false' is set\n\t\t\t\tisDisabled = ts.getData( $header, col, 'sorter' ) === 'false' || ts.getData( $header, col, 'parser' ) === 'false';\n\t\t\t\tts.setColumnSort( c, $header, isDisabled );\n\t\t\t}\n\t\t},\n\n\t\tsetColumnSort : function( c, $header, isDisabled ) {\n\t\t\tvar id = c.table.id;\n\t\t\t$header[ 0 ].sortDisabled = isDisabled;\n\t\t\t$header[ isDisabled ? 'addClass' : 'removeClass' ]( 'sorter-false' )\n\t\t\t\t.attr( 'aria-disabled', '' + isDisabled );\n\t\t\t// disable tab index on disabled cells\n\t\t\tif ( c.tabIndex ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'tabindex' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'tabindex', '0' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// aria-controls - requires table ID\n\t\t\tif ( id ) {\n\t\t\t\tif ( isDisabled ) {\n\t\t\t\t\t$header.removeAttr( 'aria-controls' );\n\t\t\t\t} else {\n\t\t\t\t\t$header.attr( 'aria-controls', id );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateHeaderSortCount : function( c, list ) {\n\t\t\tvar col, dir, group, indx, primary, temp, val, order,\n\t\t\t\tsortList = list || c.sortList,\n\t\t\t\tlen = sortList.length;\n\t\t\tc.sortList = [];\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tval = sortList[ indx ];\n\t\t\t\t// ensure all sortList values are numeric - fixes #127\n\t\t\t\tcol = parseInt( val[ 0 ], 10 );\n\t\t\t\t// prevents error if sorton array is wrong\n\t\t\t\tif ( col < c.columns ) {\n\n\t\t\t\t\t// set order if not already defined - due to colspan header without associated header cell\n\t\t\t\t\t// adding this check prevents a javascript error\n\t\t\t\t\tif ( !c.sortVars[ col ].order ) {\n\t\t\t\t\t\tif ( ts.getOrder( c.sortInitialOrder ) ) {\n\t\t\t\t\t\t\torder = c.sortReset ? [ 1, 0, 2 ] : [ 1, 0 ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\torder = c.sortReset ? [ 0, 1, 2 ] : [ 0, 1 ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tc.sortVars[ col ].order = order;\n\t\t\t\t\t\tc.sortVars[ col ].count = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\torder = c.sortVars[ col ].order;\n\t\t\t\t\tdir = ( '' + val[ 1 ] ).match( /^(1|d|s|o|n)/ );\n\t\t\t\t\tdir = dir ? dir[ 0 ] : '';\n\t\t\t\t\t// 0/(a)sc (default), 1/(d)esc, (s)ame, (o)pposite, (n)ext\n\t\t\t\t\tswitch ( dir ) {\n\t\t\t\t\t\tcase '1' : case 'd' : // descending\n\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's' : // same direction (as primary column)\n\t\t\t\t\t\t\t// if primary sort is set to 's', make it ascending\n\t\t\t\t\t\t\tdir = primary || 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\ttemp = order[ ( primary || 0 ) % order.length ];\n\t\t\t\t\t\t\t// opposite of primary column; but resets if primary resets\n\t\t\t\t\t\t\tdir = temp === 0 ? 1 : temp === 1 ? 0 : 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\tdir = order[ ( ++c.sortVars[ col ].count ) % order.length ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault : // ascending\n\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprimary = indx === 0 ? dir : primary;\n\t\t\t\t\tgroup = [ col, parseInt( dir, 10 ) || 0 ];\n\t\t\t\t\tc.sortList[ c.sortList.length ] = group;\n\t\t\t\t\tdir = $.inArray( group[ 1 ], order ); // fixes issue #167\n\t\t\t\t\tc.sortVars[ col ].count = dir >= 0 ? dir : group[ 1 ] % order.length;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tupdateAll : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\tts.refreshWidgets( table, true, true );\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( table, c.$headers, true );\n\t\t\tts.bindMethods( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\tupdate : function( c, resort, callback ) {\n\t\t\tvar table = c.table;\n\t\t\ttable.isUpdating = true;\n\t\t\t// update sorting (if enabled/disabled)\n\t\t\tts.updateHeader( c );\n\t\t\tts.commonUpdate( c, resort, callback );\n\t\t},\n\n\t\t// simple header update - see #989\n\t\tupdateHeaders : function( c, callback ) {\n\t\t\tc.table.isUpdating = true;\n\t\t\tts.buildHeaders( c );\n\t\t\tts.bindEvents( c.table, c.$headers, true );\n\t\t\tts.resortComplete( c, callback );\n\t\t},\n\n\t\tupdateCell : function( c, cell, resort, callback ) {\n\t\t\tif ( ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table, do an update instead - fixes #1099\n\t\t\t\tts.updateHeader( c );\n\t\t\t\tts.commonUpdate( c, resort, callback );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tc.table.isUpdating = true;\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// get position from the dom\n\t\t\tvar tmp, indx, row, icell, cache, len,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\t$cell = $( cell ),\n\t\t\t\t// update cache - format: function( s, table, cell, cellIndex )\n\t\t\t\t// no closest in jQuery v1.2.6\n\t\t\t\ttbodyIndex = $tbodies\n\t\t\t\t\t.index( $.fn.closest ? $cell.closest( 'tbody' ) : $cell.parents( 'tbody' ).filter( ':first' ) ),\n\t\t\t\ttbcache = c.cache[ tbodyIndex ],\n\t\t\t\t$row = $.fn.closest ? $cell.closest( 'tr' ) : $cell.parents( 'tr' ).filter( ':first' );\n\t\t\tcell = $cell[ 0 ]; // in case cell is a jQuery object\n\t\t\t// tbody may not exist if update is initialized while tbody is removed for processing\n\t\t\tif ( $tbodies.length && tbodyIndex >= 0 ) {\n\t\t\t\trow = $tbodies.eq( tbodyIndex ).find( 'tr' ).index( $row );\n\t\t\t\tcache = tbcache.normalized[ row ];\n\t\t\t\tlen = $row[ 0 ].cells.length;\n\t\t\t\tif ( len !== c.columns ) {\n\t\t\t\t\t// colspan in here somewhere!\n\t\t\t\t\ticell = 0;\n\t\t\t\t\ttmp = false;\n\t\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\t\tif ( !tmp && $row[ 0 ].cells[ indx ] !== cell ) {\n\t\t\t\t\t\t\ticell += $row[ 0 ].cells[ indx ].colSpan;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttmp = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ticell = $cell.index();\n\t\t\t\t}\n\t\t\t\ttmp = ts.getElementText( c, cell, icell ); // raw\n\t\t\t\tcache[ c.columns ].raw[ icell ] = tmp;\n\t\t\t\ttmp = ts.getParsedText( c, cell, icell, tmp );\n\t\t\t\tcache[ icell ] = tmp; // parsed\n\t\t\t\tcache[ c.columns ].$row = $row;\n\t\t\t\tif ( ( c.parsers[ icell ].type || '' ).toLowerCase() === 'numeric' ) {\n\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\ttbcache.colMax[ icell ] = Math.max( Math.abs( tmp ) || 0, tbcache.colMax[ icell ] || 0 );\n\t\t\t\t}\n\t\t\t\ttmp = resort !== 'undefined' ? resort : c.resort;\n\t\t\t\tif ( tmp !== false ) {\n\t\t\t\t\t// widgets will be reapplied\n\t\t\t\t\tts.checkResort( c, tmp, callback );\n\t\t\t\t} else {\n\t\t\t\t\t// don't reapply widgets is resort is false, just in case it causes\n\t\t\t\t\t// problems with element focus\n\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.error( 'updateCell aborted, tbody missing or not within the indicated table' );\n\t\t\t\t}\n\t\t\t\tc.table.isUpdating = false;\n\t\t\t}\n\t\t},\n\n\t\taddRows : function( c, $row, resort, callback ) {\n\t\t\tvar txt, val, tbodyIndex, rowIndex, rows, cellIndex, len, order,\n\t\t\t\tcacheIndex, rowData, cells, cell, span,\n\t\t\t\t// allow passing a row string if only one non-info tbody exists in the table\n\t\t\t\tvalid = typeof $row === 'string' && c.$tbodies.length === 1 && / 0 ) {\n\t\t\t\t\t\t\tcacheIndex += span;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcacheIndex++;\n\t\t\t\t\t}\n\t\t\t\t\t// add the row data to the end\n\t\t\t\t\tcells[ c.columns ] = rowData;\n\t\t\t\t\t// update cache\n\t\t\t\t\tc.cache[ tbodyIndex ].normalized[ order ] = cells;\n\t\t\t\t}\n\t\t\t\t// resort using current settings\n\t\t\t\tts.checkResort( c, resort, callback );\n\t\t\t}\n\t\t},\n\n\t\tupdateCache : function( c, callback, $tbodies ) {\n\t\t\t// rebuild parsers\n\t\t\tif ( !( c.parsers && c.parsers.length ) ) {\n\t\t\t\tts.setupParsers( c, $tbodies );\n\t\t\t}\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c, callback, $tbodies );\n\t\t},\n\n\t\t// init flag (true) used by pager plugin to prevent widget application\n\t\t// renamed from appendToTable\n\t\tappendCache : function( c, init ) {\n\t\t\tvar parsed, totalRows, $tbody, $curTbody, rowIndex, tbodyIndex, appendTime,\n\t\t\t\ttable = c.table,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\trows = [],\n\t\t\t\tcache = c.cache;\n\t\t\t// empty table - fixes #206/#346\n\t\t\tif ( ts.isEmptyObject( cache ) ) {\n\t\t\t\t// run pager appender in case the table was just emptied\n\t\t\t\treturn c.appender ? c.appender( table, rows ) :\n\t\t\t\t\ttable.isUpdating ? c.$table.triggerHandler( 'updateComplete', table ) : ''; // Fixes #532\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tappendTime = new Date();\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t$tbody = $tbodies.eq( tbodyIndex );\n\t\t\t\tif ( $tbody.length ) {\n\t\t\t\t\t// detach tbody for manipulation\n\t\t\t\t\t$curTbody = ts.processTbody( table, $tbody, true );\n\t\t\t\t\tparsed = cache[ tbodyIndex ].normalized;\n\t\t\t\t\ttotalRows = parsed.length;\n\t\t\t\t\tfor ( rowIndex = 0; rowIndex < totalRows; rowIndex++ ) {\n\t\t\t\t\t\trows[rows.length] = parsed[ rowIndex ][ c.columns ].$row;\n\t\t\t\t\t\t// removeRows used by the pager plugin; don't render if using ajax - fixes #411\n\t\t\t\t\t\tif ( !c.appender || ( c.pager && ( !c.pager.removeRows || !wo.pager_removeRows ) && !c.pager.ajax ) ) {\n\t\t\t\t\t\t\t$curTbody.append( parsed[ rowIndex ][ c.columns ].$row );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// restore tbody\n\t\t\t\t\tts.processTbody( table, $curTbody, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( c.appender ) {\n\t\t\t\tc.appender( table, rows );\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Rebuilt table' + ts.benchmark( appendTime ) );\n\t\t\t}\n\t\t\t// apply table widgets; but not before ajax completes\n\t\t\tif ( !init && !c.appender ) {\n\t\t\t\tts.applyWidget( table );\n\t\t\t}\n\t\t\tif ( table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', table );\n\t\t\t}\n\t\t},\n\n\t\tcommonUpdate : function( c, resort, callback ) {\n\t\t\t// remove rows/elements before update\n\t\t\tc.$table.find( c.selectorRemove ).remove();\n\t\t\t// rebuild parsers\n\t\t\tts.setupParsers( c );\n\t\t\t// rebuild the cache map\n\t\t\tts.buildCache( c );\n\t\t\tts.checkResort( c, resort, callback );\n\t\t},\n\n\t\t/*\n\t\t▄█████ ▄████▄ █████▄ ██████ ██ █████▄ ▄████▄\n\t\t▀█▄ ██ ██ ██▄▄██ ██ ██ ██ ██ ██ ▄▄▄\n\t\t ▀█▄ ██ ██ ██▀██ ██ ██ ██ ██ ██ ▀██\n\t\t█████▀ ▀████▀ ██ ██ ██ ██ ██ ██ ▀████▀\n\t\t*/\n\t\tinitSort : function( c, cell, event ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\t// let any updates complete before initializing a sort\n\t\t\t\treturn setTimeout( function(){\n\t\t\t\t\tts.initSort( c, cell, event );\n\t\t\t\t}, 50 );\n\t\t\t}\n\n\t\t\tvar arry, indx, headerIndx, dir, temp, tmp, $header,\n\t\t\t\tnotMultiSort = !event[ c.sortMultiSortKey ],\n\t\t\t\ttable = c.table,\n\t\t\t\tlen = c.$headers.length,\n\t\t\t\t// get current column index\n\t\t\t\tcol = parseInt( $( cell ).attr( 'data-column' ), 10 ),\n\t\t\t\torder = c.sortVars[ col ].order;\n\n\t\t\t// Only call sortStart if sorting is enabled\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// get current column sort order\n\t\t\ttmp = ( c.sortVars[ col ].count + 1 ) % order.length;\n\t\t\tc.sortVars[ col ].count = event[ c.sortResetKey ] ? 2 : tmp;\n\t\t\t// reset all sorts on non-current column - issue #30\n\t\t\tif ( c.sortRestart ) {\n\t\t\t\tfor ( headerIndx = 0; headerIndx < len; headerIndx++ ) {\n\t\t\t\t\t$header = c.$headers.eq( headerIndx );\n\t\t\t\t\ttmp = parseInt( $header.attr( 'data-column' ), 10 );\n\t\t\t\t\t// only reset counts on columns that weren't just clicked on and if not included in a multisort\n\t\t\t\t\tif ( col !== tmp && ( notMultiSort || $header.hasClass( ts.css.sortNone ) ) ) {\n\t\t\t\t\t\tc.sortVars[ tmp ].count = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// user only wants to sort on one column\n\t\t\tif ( notMultiSort ) {\n\t\t\t\t// flush the sort list\n\t\t\t\tc.sortList = [];\n\t\t\t\tc.last.sortList = [];\n\t\t\t\tif ( c.sortForce !== null ) {\n\t\t\t\t\tarry = c.sortForce;\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = arry[ indx ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// add column to sort list\n\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\tif ( cell.colSpan > 1 ) {\n\t\t\t\t\t\tfor ( indx = 1; indx < cell.colSpan; indx++ ) {\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// multi column sorting\n\t\t\t} else {\n\t\t\t\t// get rid of the sortAppend before adding more - fixes issue #115 & #523\n\t\t\t\tc.sortList = $.extend( [], c.last.sortList );\n\n\t\t\t\t// the user has clicked on an already sorted column\n\t\t\t\tif ( ts.isValueInArray( col, c.sortList ) >= 0 ) {\n\t\t\t\t\t// reverse the sorting direction\n\t\t\t\t\tfor ( indx = 0; indx < c.sortList.length; indx++ ) {\n\t\t\t\t\t\ttmp = c.sortList[ indx ];\n\t\t\t\t\t\tif ( tmp[ 0 ] === col ) {\n\t\t\t\t\t\t\t// order.count seems to be incorrect when compared to cell.count\n\t\t\t\t\t\t\ttmp[ 1 ] = order[ c.sortVars[ col ].count ];\n\t\t\t\t\t\t\tif ( tmp[1] === 2 ) {\n\t\t\t\t\t\t\t\tc.sortList.splice( indx, 1 );\n\t\t\t\t\t\t\t\tc.sortVars[ col ].count = -1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// add column to sort list array\n\t\t\t\t\tdir = order[ c.sortVars[ col ].count ];\n\t\t\t\t\tif ( dir < 2 ) {\n\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col, dir ];\n\t\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\t\tif ( cell.colSpan > 1 ) {\n\t\t\t\t\t\t\tfor ( indx = 1; indx < cell.colSpan; indx++ ) {\n\t\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ col + indx, dir ];\n\t\t\t\t\t\t\t\t// update count on columns in colSpan\n\t\t\t\t\t\t\t\tc.sortVars[ col + indx ].count = $.inArray( dir, order );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// save sort before applying sortAppend\n\t\t\tc.last.sortList = $.extend( [], c.sortList );\n\t\t\tif ( c.sortList.length && c.sortAppend ) {\n\t\t\t\tarry = $.isArray( c.sortAppend ) ? c.sortAppend : c.sortAppend[ c.sortList[ 0 ][ 0 ] ];\n\t\t\t\tif ( !ts.isEmptyObject( arry ) ) {\n\t\t\t\t\tfor ( indx = 0; indx < arry.length; indx++ ) {\n\t\t\t\t\t\tif ( arry[ indx ][ 0 ] !== col && ts.isValueInArray( arry[ indx ][ 0 ], c.sortList ) < 0 ) {\n\t\t\t\t\t\t\tdir = arry[ indx ][ 1 ];\n\t\t\t\t\t\t\ttemp = ( '' + dir ).match( /^(a|d|s|o|n)/ );\n\t\t\t\t\t\t\tif ( temp ) {\n\t\t\t\t\t\t\t\ttmp = c.sortList[ 0 ][ 1 ];\n\t\t\t\t\t\t\t\tswitch ( temp[ 0 ] ) {\n\t\t\t\t\t\t\t\t\tcase 'd' :\n\t\t\t\t\t\t\t\t\t\tdir = 1;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 's' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'o' :\n\t\t\t\t\t\t\t\t\t\tdir = tmp === 0 ? 1 : 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'n' :\n\t\t\t\t\t\t\t\t\t\tdir = ( tmp + 1 ) % order.length;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tdir = 0;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tc.sortList[ c.sortList.length ] = [ arry[ indx ][ 0 ], dir ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// sortBegin event triggered immediately before the sort\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// setTimeout needed so the processing icon shows up\n\t\t\tsetTimeout( function() {\n\t\t\t\t// set css for headers\n\t\t\t\tts.setHeadersCss( c );\n\t\t\t\tts.multisort( c );\n\t\t\t\tts.appendCache( c );\n\t\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\t}, 1 );\n\t\t},\n\n\t\t// sort multiple columns\n\t\tmultisort : function( c ) { /*jshint loopfunc:true */\n\t\t\tvar tbodyIndex, sortTime, colMax, rows, tmp,\n\t\t\t\ttable = c.table,\n\t\t\t\tsorter = [],\n\t\t\t\tdir = 0,\n\t\t\t\ttextSorter = c.textSorter || '',\n\t\t\t\tsortList = c.sortList,\n\t\t\t\tsortLen = sortList.length,\n\t\t\t\tlen = c.$tbodies.length;\n\t\t\tif ( c.serverSideSorting || ts.isEmptyObject( c.cache ) ) {\n\t\t\t\t// empty table - fixes #206/#346\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( c.debug ) { sortTime = new Date(); }\n\t\t\t// cache textSorter to optimize speed\n\t\t\tif ( typeof textSorter === 'object' ) {\n\t\t\t\tcolMax = c.columns;\n\t\t\t\twhile ( colMax-- ) {\n\t\t\t\t\ttmp = ts.getColumnData( table, textSorter, colMax );\n\t\t\t\t\tif ( typeof tmp === 'function' ) {\n\t\t\t\t\t\tsorter[ colMax ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < len; tbodyIndex++ ) {\n\t\t\t\tcolMax = c.cache[ tbodyIndex ].colMax;\n\t\t\t\trows = c.cache[ tbodyIndex ].normalized;\n\n\t\t\t\trows.sort( function( a, b ) {\n\t\t\t\t\tvar sortIndex, num, col, order, sort, x, y;\n\t\t\t\t\t// rows is undefined here in IE, so don't use it!\n\t\t\t\t\tfor ( sortIndex = 0; sortIndex < sortLen; sortIndex++ ) {\n\t\t\t\t\t\tcol = sortList[ sortIndex ][ 0 ];\n\t\t\t\t\t\torder = sortList[ sortIndex ][ 1 ];\n\t\t\t\t\t\t// sort direction, true = asc, false = desc\n\t\t\t\t\t\tdir = order === 0;\n\n\t\t\t\t\t\tif ( c.sortStable && a[ col ] === b[ col ] && sortLen === 1 ) {\n\t\t\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// fallback to natural sort since it is more robust\n\t\t\t\t\t\tnum = /n/i.test( ts.getSortType( c.parsers, col ) );\n\t\t\t\t\t\tif ( num && c.strings[ col ] ) {\n\t\t\t\t\t\t\t// sort strings in numerical columns\n\t\t\t\t\t\t\tif ( typeof ( ts.string[ c.strings[ col ] ] ) === 'boolean' ) {\n\t\t\t\t\t\t\t\tnum = ( dir ? 1 : -1 ) * ( ts.string[ c.strings[ col ] ] ? -1 : 1 );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnum = ( c.strings[ col ] ) ? ts.string[ c.strings[ col ] ] || 0 : 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// fall back to built-in numeric sort\n\t\t\t\t\t\t\t// var sort = $.tablesorter['sort' + s]( a[col], b[col], dir, colMax[col], table );\n\t\t\t\t\t\t\tsort = c.numberSorter ? c.numberSorter( a[ col ], b[ col ], dir, colMax[ col ], table ) :\n\t\t\t\t\t\t\t\tts[ 'sortNumeric' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], num, colMax[ col ], col, c );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// set a & b depending on sort direction\n\t\t\t\t\t\t\tx = dir ? a : b;\n\t\t\t\t\t\t\ty = dir ? b : a;\n\t\t\t\t\t\t\t// text sort function\n\t\t\t\t\t\t\tif ( typeof textSorter === 'function' ) {\n\t\t\t\t\t\t\t\t// custom OVERALL text sorter\n\t\t\t\t\t\t\t\tsort = textSorter( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else if ( typeof sorter[ col ] === 'function' ) {\n\t\t\t\t\t\t\t\t// custom text sorter for a SPECIFIC COLUMN\n\t\t\t\t\t\t\t\tsort = sorter[ col ]( x[ col ], y[ col ], dir, col, table );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// fall back to natural sort\n\t\t\t\t\t\t\t\tsort = ts[ 'sortNatural' + ( dir ? 'Asc' : 'Desc' ) ]( a[ col ], b[ col ], col, c );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( sort ) { return sort; }\n\t\t\t\t\t}\n\t\t\t\t\treturn a[ c.columns ].order - b[ c.columns ].order;\n\t\t\t\t});\n\t\t\t}\n\t\t\tif ( c.debug ) {\n\t\t\t\tconsole.log( 'Applying sort ' + sortList.toString() + ts.benchmark( sortTime ) );\n\t\t\t}\n\t\t},\n\n\t\tresortComplete : function( c, callback ) {\n\t\t\tif ( c.table.isUpdating ) {\n\t\t\t\tc.$table.triggerHandler( 'updateComplete', c.table );\n\t\t\t}\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tcheckResort : function( c, resort, callback ) {\n\t\t\tvar sortList = $.isArray( resort ) ? resort : c.sortList,\n\t\t\t\t// if no resort parameter is passed, fallback to config.resort (true by default)\n\t\t\t\tresrt = typeof resort === 'undefined' ? c.resort : resort;\n\t\t\t// don't try to resort if the table is still processing\n\t\t\t// this will catch spamming of the updateCell method\n\t\t\tif ( resrt !== false && !c.serverSideSorting && !c.table.isProcessing ) {\n\t\t\t\tif ( sortList.length ) {\n\t\t\t\t\tts.sortOn( c, sortList, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t}, true );\n\t\t\t\t} else {\n\t\t\t\t\tts.sortReset( c, function() {\n\t\t\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tts.resortComplete( c, callback );\n\t\t\t\tts.applyWidget( c.table, false );\n\t\t\t}\n\t\t},\n\n\t\tsortOn : function( c, list, callback, init ) {\n\t\t\tvar table = c.table;\n\t\t\tc.$table.triggerHandler( 'sortStart', table );\n\t\t\t// update header count index\n\t\t\tts.updateHeaderSortCount( c, list );\n\t\t\t// set css for headers\n\t\t\tts.setHeadersCss( c );\n\t\t\t// fixes #346\n\t\t\tif ( c.delayInit && ts.isEmptyObject( c.cache ) ) {\n\t\t\t\tts.buildCache( c );\n\t\t\t}\n\t\t\tc.$table.triggerHandler( 'sortBegin', table );\n\t\t\t// sort the table and append it to the dom\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c, init );\n\t\t\tc.$table.triggerHandler( 'sortBeforeEnd', table );\n\t\t\tc.$table.triggerHandler( 'sortEnd', table );\n\t\t\tts.applyWidget( table );\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\tsortReset : function( c, callback ) {\n\t\t\tc.sortList = [];\n\t\t\tts.setHeadersCss( c );\n\t\t\tts.multisort( c );\n\t\t\tts.appendCache( c );\n\t\t\tif ( $.isFunction( callback ) ) {\n\t\t\t\tcallback( c.table );\n\t\t\t}\n\t\t},\n\n\t\tgetSortType : function( parsers, column ) {\n\t\t\treturn ( parsers && parsers[ column ] ) ? parsers[ column ].type || '' : '';\n\t\t},\n\n\t\tgetOrder : function( val ) {\n\t\t\t// look for 'd' in 'desc' order; return true\n\t\t\treturn ( /^d/i.test( val ) || val === 1 );\n\t\t},\n\n\t\t// Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)\n\t\t// this function will only accept strings, or you'll see 'TypeError: undefined is not a function'\n\t\t// I could add a = a.toString(); b = b.toString(); but it'll slow down the sort overall\n\t\tsortNatural : function( a, b ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar aNum, bNum, aFloat, bFloat, indx, max,\n\t\t\t\tregex = ts.regex;\n\t\t\t// first try and sort Hex codes\n\t\t\tif ( regex.hex.test( b ) ) {\n\t\t\t\taNum = parseInt( ( a || '' ).match( regex.hex ), 16 );\n\t\t\t\tbNum = parseInt( ( b || '' ).match( regex.hex ), 16 );\n\t\t\t\tif ( aNum < bNum ) { return -1; }\n\t\t\t\tif ( aNum > bNum ) { return 1; }\n\t\t\t}\n\t\t\t// chunk/tokenize\n\t\t\taNum = ( a || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tbNum = ( b || '' ).replace( regex.chunk, '\\\\0$1\\\\0' ).replace( regex.chunks, '' ).split( '\\\\0' );\n\t\t\tmax = Math.max( aNum.length, bNum.length );\n\t\t\t// natural sorting through split numeric strings and default strings\n\t\t\tfor ( indx = 0; indx < max; indx++ ) {\n\t\t\t\t// find floats not starting with '0', string or 0 if not defined\n\t\t\t\taFloat = isNaN( aNum[ indx ] ) ? aNum[ indx ] || 0 : parseFloat( aNum[ indx ] ) || 0;\n\t\t\t\tbFloat = isNaN( bNum[ indx ] ) ? bNum[ indx ] || 0 : parseFloat( bNum[ indx ] ) || 0;\n\t\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\n\t\t\t\tif ( isNaN( aFloat ) !== isNaN( bFloat ) ) { return isNaN( aFloat ) ? 1 : -1; }\n\t\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\n\t\t\t\tif ( typeof aFloat !== typeof bFloat ) {\n\t\t\t\t\taFloat += '';\n\t\t\t\t\tbFloat += '';\n\t\t\t\t}\n\t\t\t\tif ( aFloat < bFloat ) { return -1; }\n\t\t\t\tif ( aFloat > bFloat ) { return 1; }\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNaturalAsc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\treturn ts.sortNatural( a, b );\n\t\t},\n\n\t\tsortNaturalDesc : function( a, b, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\treturn ts.sortNatural( b, a );\n\t\t},\n\n\t\t// basic alphabetical sort\n\t\tsortText : function( a, b ) {\n\t\t\treturn a > b ? 1 : ( a < b ? -1 : 0 );\n\t\t},\n\n\t\t// return text string value by adding up ascii value\n\t\t// so the text is somewhat sorted when using a digital sort\n\t\t// this is NOT an alphanumeric sort\n\t\tgetTextValue : function( val, num, max ) {\n\t\t\tif ( max ) {\n\t\t\t\t// make sure the text value is greater than the max numerical value (max)\n\t\t\t\tvar indx,\n\t\t\t\t\tlen = val ? val.length : 0,\n\t\t\t\t\tn = max + num;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tn += val.charCodeAt( indx );\n\t\t\t\t}\n\t\t\t\treturn num * n;\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\tsortNumericAsc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : -empty || -1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : empty || 1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn a - b;\n\t\t},\n\n\t\tsortNumericDesc : function( a, b, num, max, col, c ) {\n\t\t\tif ( a === b ) { return 0; }\n\t\t\tvar empty = ts.string[ ( c.empties[ col ] || c.emptyTo ) ];\n\t\t\tif ( a === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? -1 : 1 ) : empty || 1; }\n\t\t\tif ( b === '' && empty !== 0 ) { return typeof empty === 'boolean' ? ( empty ? 1 : -1 ) : -empty || -1; }\n\t\t\tif ( isNaN( a ) ) { a = ts.getTextValue( a, num, max ); }\n\t\t\tif ( isNaN( b ) ) { b = ts.getTextValue( b, num, max ); }\n\t\t\treturn b - a;\n\t\t},\n\n\t\tsortNumeric : function( a, b ) {\n\t\t\treturn a - b;\n\t\t},\n\n\t\t/*\n\t\t██ ██ ██ ██ █████▄ ▄████▄ ██████ ██████ ▄█████\n\t\t██ ██ ██ ██ ██ ██ ██ ▄▄▄ ██▄▄ ██ ▀█▄\n\t\t██ ██ ██ ██ ██ ██ ██ ▀██ ██▀▀ ██ ▀█▄\n\t\t███████▀ ██ █████▀ ▀████▀ ██████ ██ █████▀\n\t\t*/\n\t\taddWidget : function( widget ) {\n\t\t\tif ( widget.id && !ts.isEmptyObject( ts.getWidgetById( widget.id ) ) ) {\n\t\t\t\tconsole.warn( '\"' + widget.id + '\" widget was loaded more than once!' );\n\t\t\t}\n\t\t\tts.widgets[ ts.widgets.length ] = widget;\n\t\t},\n\n\t\thasWidget : function( $table, name ) {\n\t\t\t$table = $( $table );\n\t\t\treturn $table.length && $table[ 0 ].config && $table[ 0 ].config.widgetInit[ name ] || false;\n\t\t},\n\n\t\tgetWidgetById : function( name ) {\n\t\t\tvar indx, widget,\n\t\t\t\tlen = ts.widgets.length;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && widget.id.toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\treturn widget;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetOptions : function( table ) {\n\t\t\tvar indx, widget,\n\t\t\t\tc = table.config,\n\t\t\t\tlen = c.widgets.length;\n\t\t\tif ( len ) {\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( c.widgets[ indx ] );\n\t\t\t\t\tif ( widget && widget.options ) {\n\t\t\t\t\t\tc.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );\n\t\t\t\t\t\t// add widgetOptions to defaults for option validator\n\t\t\t\t\t\t$.extend( true, ts.defaults.widgetOptions, widget.options );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\taddWidgetFromClass : function( table ) {\n\t\t\tvar len, indx,\n\t\t\t\tc = table.config,\n\t\t\t\t// look for widgets to apply from table class\n\t\t\t\t// don't match from 'ui-widget-content'; use \\S instead of \\w to include widgets\n\t\t\t\t// with dashes in the name, e.g. \"widget-test-2\" extracts out \"test-2\"\n\t\t\t\tregex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\\\S+)+' ) + '$',\n\t\t\t\twidgetClass = new RegExp( regex, 'g' ),\n\t\t\t\t// split up table class (widget id's can include dashes) - stop using match\n\t\t\t\t// otherwise only one widget gets extracted, see #1109\n\t\t\t\twidgets = ( table.className || '' ).split( ts.regex.spaces );\n\t\t\tif ( widgets.length ) {\n\t\t\t\tlen = widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\tif ( widgets[ indx ].match( widgetClass ) ) {\n\t\t\t\t\t\tc.widgets[ c.widgets.length ] = widgets[ indx ].replace( widgetClass, '$1' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidgetId : function( table, id, init ) {\n\t\t\ttable = $(table)[0];\n\t\t\tvar applied, time, name,\n\t\t\t\tc = table.config,\n\t\t\t\two = c.widgetOptions,\n\t\t\t\twidget = ts.getWidgetById( id );\n\t\t\tif ( widget ) {\n\t\t\t\tname = widget.id;\n\t\t\t\tapplied = false;\n\t\t\t\t// add widget name to option list so it gets reapplied after sorting, filtering, etc\n\t\t\t\tif ( $.inArray( name, c.widgets ) < 0 ) {\n\t\t\t\t\tc.widgets[ c.widgets.length ] = name;\n\t\t\t\t}\n\t\t\t\tif ( c.debug ) { time = new Date(); }\n\n\t\t\t\tif ( init || !( c.widgetInit[ name ] ) ) {\n\t\t\t\t\t// set init flag first to prevent calling init more than once (e.g. pager)\n\t\t\t\t\tc.widgetInit[ name ] = true;\n\t\t\t\t\tif ( table.hasInitialized ) {\n\t\t\t\t\t\t// don't reapply widget options on tablesorter init\n\t\t\t\t\t\tts.applyWidgetOptions( table );\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof widget.init === 'function' ) {\n\t\t\t\t\t\tapplied = true;\n\t\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidget.init( table, widget, c, wo );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !init && typeof widget.format === 'function' ) {\n\t\t\t\t\tapplied = true;\n\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.format( table, c, wo, false );\n\t\t\t\t}\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tif ( applied ) {\n\t\t\t\t\t\tconsole.log( 'Completed ' + ( init ? 'initializing ' : 'applying ' ) + name + ' widget' + ts.benchmark( time ) );\n\t\t\t\t\t\tif ( console.groupEnd ) { console.groupEnd(); }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyWidget : function( table, init, callback ) {\n\t\t\ttable = $( table )[ 0 ]; // in case this is called externally\n\t\t\tvar indx, len, names, widget, time,\n\t\t\t\tc = table.config,\n\t\t\t\twidgets = [];\n\t\t\t// prevent numerous consecutive widget applications\n\t\t\tif ( init !== false && table.hasInitialized && ( table.isApplyingWidgets || table.isUpdating ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( c.debug ) { time = new Date(); }\n\t\t\tts.addWidgetFromClass( table );\n\t\t\t// prevent \"tablesorter-ready\" from firing multiple times in a row\n\t\t\tclearTimeout( c.timerReady );\n\t\t\tif ( c.widgets.length ) {\n\t\t\t\ttable.isApplyingWidgets = true;\n\t\t\t\t// ensure unique widget ids\n\t\t\t\tc.widgets = $.grep( c.widgets, function( val, index ) {\n\t\t\t\t\treturn $.inArray( val, c.widgets ) === index;\n\t\t\t\t});\n\t\t\t\tnames = c.widgets || [];\n\t\t\t\tlen = names.length;\n\t\t\t\t// build widget array & add priority as needed\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.getWidgetById( names[ indx ] );\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\t// set priority to 10 if not defined\n\t\t\t\t\t\tif ( !widget.priority ) { widget.priority = 10; }\n\t\t\t\t\t\twidgets[ indx ] = widget;\n\t\t\t\t\t} else if ( c.debug ) {\n\t\t\t\t\t\tconsole.warn( '\"' + names[ indx ] + '\" widget code does not exist!' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sort widgets by priority\n\t\t\t\twidgets.sort( function( a, b ) {\n\t\t\t\t\treturn a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1;\n\t\t\t\t});\n\t\t\t\t// add/update selected widgets\n\t\t\t\tlen = widgets.length;\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole[ console.group ? 'group' : 'log' ]( 'Start ' + ( init ? 'initializing' : 'applying' ) + ' widgets' );\n\t\t\t\t}\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tts.applyWidgetId( table, widget.id, init );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( c.debug && console.groupEnd ) { console.groupEnd(); }\n\t\t\t\t// callback executed on init only\n\t\t\t\tif ( !init && typeof callback === 'function' ) {\n\t\t\t\t\tcallback( table );\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.timerReady = setTimeout( function() {\n\t\t\t\ttable.isApplyingWidgets = false;\n\t\t\t\t$.data( table, 'lastWidgetApplication', new Date() );\n\t\t\t\tc.$table.triggerHandler( 'tablesorter-ready' );\n\t\t\t}, 10 );\n\t\t\tif ( c.debug ) {\n\t\t\t\twidget = c.widgets.length;\n\t\t\t\tconsole.log( 'Completed ' +\n\t\t\t\t\t( init === true ? 'initializing ' : 'applying ' ) + widget +\n\t\t\t\t\t' widget' + ( widget !== 1 ? 's' : '' ) + ts.benchmark( time ) );\n\t\t\t}\n\t\t},\n\n\t\tremoveWidget : function( table, name, refreshing ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar index, widget, indx, len,\n\t\t\t\tc = table.config;\n\t\t\t// if name === true, add all widgets from $.tablesorter.widgets\n\t\t\tif ( name === true ) {\n\t\t\t\tname = [];\n\t\t\t\tlen = ts.widgets.length;\n\t\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\t\twidget = ts.widgets[ indx ];\n\t\t\t\t\tif ( widget && widget.id ) {\n\t\t\t\t\t\tname[ name.length ] = widget.id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// name can be either an array of widgets names,\n\t\t\t\t// or a space/comma separated list of widget names\n\t\t\t\tname = ( $.isArray( name ) ? name.join( ',' ) : name || '' ).toLowerCase().split( /[\\s,]+/ );\n\t\t\t}\n\t\t\tlen = name.length;\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\twidget = ts.getWidgetById( name[ index ] );\n\t\t\t\tindx = $.inArray( name[ index ], c.widgets );\n\t\t\t\t// don't remove the widget from config.widget if refreshing\n\t\t\t\tif ( indx >= 0 && refreshing !== true ) {\n\t\t\t\t\tc.widgets.splice( indx, 1 );\n\t\t\t\t}\n\t\t\t\tif ( widget && widget.remove ) {\n\t\t\t\t\tif ( c.debug ) {\n\t\t\t\t\t\tconsole.log( ( refreshing ? 'Refreshing' : 'Removing' ) + ' \"' + name[ index ] + '\" widget' );\n\t\t\t\t\t}\n\t\t\t\t\twidget.remove( table, c, c.widgetOptions, refreshing );\n\t\t\t\t\tc.widgetInit[ name[ index ] ] = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\trefreshWidgets : function( table, doAll, dontapply ) {\n\t\t\ttable = $( table )[ 0 ]; // see issue #243\n\t\t\tvar indx, widget,\n\t\t\t\tc = table.config,\n\t\t\t\tcurWidgets = c.widgets,\n\t\t\t\twidgets = ts.widgets,\n\t\t\t\tlen = widgets.length,\n\t\t\t\tlist = [],\n\t\t\t\tcallback = function( table ) {\n\t\t\t\t\t$( table ).triggerHandler( 'refreshComplete' );\n\t\t\t\t};\n\t\t\t// remove widgets not defined in config.widgets, unless doAll is true\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\twidget = widgets[ indx ];\n\t\t\t\tif ( widget && widget.id && ( doAll || $.inArray( widget.id, curWidgets ) < 0 ) ) {\n\t\t\t\t\tlist[ list.length ] = widget.id;\n\t\t\t\t}\n\t\t\t}\n\t\t\tts.removeWidget( table, list.join( ',' ), true );\n\t\t\tif ( dontapply !== true ) {\n\t\t\t\t// call widget init if\n\t\t\t\tts.applyWidget( table, doAll || false, callback );\n\t\t\t\tif ( doAll ) {\n\t\t\t\t\t// apply widget format\n\t\t\t\t\tts.applyWidget( table, false, callback );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t},\n\n\t\t/*\n\t\t██ ██ ██████ ██ ██ ██ ██████ ██ ██████ ▄█████\n\t\t██ ██ ██ ██ ██ ██ ██ ██ ██▄▄ ▀█▄\n\t\t██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀█▄\n\t\t▀████▀ ██ ██ ██████ ██ ██ ██ ██████ █████▀\n\t\t*/\n\t\tbenchmark : function( diff ) {\n\t\t\treturn ( ' (' + ( new Date().getTime() - diff.getTime() ) + ' ms)' );\n\t\t},\n\t\t// deprecated ts.log\n\t\tlog : function() {\n\t\t\tconsole.log( arguments );\n\t\t},\n\n\t\t// $.isEmptyObject from jQuery v1.4\n\t\tisEmptyObject : function( obj ) {\n\t\t\t/*jshint forin: false */\n\t\t\tfor ( var name in obj ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\tisValueInArray : function( column, arry ) {\n\t\t\tvar indx,\n\t\t\t\tlen = arry && arry.length || 0;\n\t\t\tfor ( indx = 0; indx < len; indx++ ) {\n\t\t\t\tif ( arry[ indx ][ 0 ] === column ) {\n\t\t\t\t\treturn indx;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t},\n\n\t\tformatFloat : function( str, table ) {\n\t\t\tif ( typeof str !== 'string' || str === '' ) { return str; }\n\t\t\t// allow using formatFloat without a table; defaults to US number format\n\t\t\tvar num,\n\t\t\t\tusFormat = table && table.config ? table.config.usNumberFormat !== false :\n\t\t\t\t\ttypeof table !== 'undefined' ? table : true;\n\t\t\tif ( usFormat ) {\n\t\t\t\t// US Format - 1,234,567.89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.comma, '' );\n\t\t\t} else {\n\t\t\t\t// German Format = 1.234.567,89 -> 1234567.89\n\t\t\t\t// French Format = 1 234 567,89 -> 1234567.89\n\t\t\t\tstr = str.replace( ts.regex.digitNonUS, '' ).replace( ts.regex.comma, '.' );\n\t\t\t}\n\t\t\tif ( ts.regex.digitNegativeTest.test( str ) ) {\n\t\t\t\t// make (#) into a negative number -> (10) = -10\n\t\t\t\tstr = str.replace( ts.regex.digitNegativeReplace, '-$1' );\n\t\t\t}\n\t\t\tnum = parseFloat( str );\n\t\t\t// return the text instead of zero\n\t\t\treturn isNaN( num ) ? $.trim( str ) : num;\n\t\t},\n\n\t\tisDigit : function( str ) {\n\t\t\t// replace all unwanted chars and match\n\t\t\treturn isNaN( str ) ?\n\t\t\t\tts.regex.digitTest.test( str.toString().replace( ts.regex.digitReplace, '' ) ) :\n\t\t\t\tstr !== '';\n\t\t},\n\n\t\t// computeTableHeaderCellIndexes from:\n\t\t// http://www.javascripttoolbox.com/lib/table/examples.php\n\t\t// http://www.javascripttoolbox.com/temp/table_cellindex.html\n\t\tcomputeColumnIndex : function( $rows, c ) {\n\t\t\tvar i, j, k, l, cell, cells, rowIndex, rowSpan, colSpan, firstAvailCol,\n\t\t\t\t// total columns has been calculated, use it to set the matrixrow\n\t\t\t\tcolumns = c && c.columns || 0,\n\t\t\t\tmatrix = [],\n\t\t\t\tmatrixrow = new Array( columns );\n\t\t\tfor ( i = 0; i < $rows.length; i++ ) {\n\t\t\t\tcells = $rows[ i ].cells;\n\t\t\t\tfor ( j = 0; j < cells.length; j++ ) {\n\t\t\t\t\tcell = cells[ j ];\n\t\t\t\t\trowIndex = cell.parentNode.rowIndex;\n\t\t\t\t\trowSpan = cell.rowSpan || 1;\n\t\t\t\t\tcolSpan = cell.colSpan || 1;\n\t\t\t\t\tif ( typeof matrix[ rowIndex ] === 'undefined' ) {\n\t\t\t\t\t\tmatrix[ rowIndex ] = [];\n\t\t\t\t\t}\n\t\t\t\t\t// Find first available column in the first row\n\t\t\t\t\tfor ( k = 0; k < matrix[ rowIndex ].length + 1; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ rowIndex ][ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tfirstAvailCol = k;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// jscs:disable disallowEmptyBlocks\n\t\t\t\t\tif ( columns && cell.cellIndex === firstAvailCol ) {\n\t\t\t\t\t\t// don't to anything\n\t\t\t\t\t} else if ( cell.setAttribute ) {\n\t\t\t\t\t\t// jscs:enable disallowEmptyBlocks\n\t\t\t\t\t\t// add data-column (setAttribute = IE8+)\n\t\t\t\t\t\tcell.setAttribute( 'data-column', firstAvailCol );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// remove once we drop support for IE7 - 1/12/2016\n\t\t\t\t\t\t$( cell ).attr( 'data-column', firstAvailCol );\n\t\t\t\t\t}\n\t\t\t\t\tfor ( k = rowIndex; k < rowIndex + rowSpan; k++ ) {\n\t\t\t\t\t\tif ( typeof matrix[ k ] === 'undefined' ) {\n\t\t\t\t\t\t\tmatrix[ k ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatrixrow = matrix[ k ];\n\t\t\t\t\t\tfor ( l = firstAvailCol; l < firstAvailCol + colSpan; l++ ) {\n\t\t\t\t\t\t\tmatrixrow[ l ] = 'x';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn matrixrow.length;\n\t\t},\n\n\t\t// automatically add a colgroup with col elements set to a percentage width\n\t\tfixColumnWidth : function( table ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar overallWidth, percent, $tbodies, len, index,\n\t\t\t\tc = table.config,\n\t\t\t\t$colgroup = c.$table.children( 'colgroup' );\n\t\t\t// remove plugin-added colgroup, in case we need to refresh the widths\n\t\t\tif ( $colgroup.length && $colgroup.hasClass( ts.css.colgroup ) ) {\n\t\t\t\t$colgroup.remove();\n\t\t\t}\n\t\t\tif ( c.widthFixed && c.$table.children( 'colgroup' ).length === 0 ) {\n\t\t\t\t$colgroup = $( '' );\n\t\t\t\toverallWidth = c.$table.width();\n\t\t\t\t// only add col for visible columns - fixes #371\n\t\t\t\t$tbodies = c.$tbodies.find( 'tr:first' ).children( ':visible' );\n\t\t\t\tlen = $tbodies.length;\n\t\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t\tpercent = parseInt( ( $tbodies.eq( index ).width() / overallWidth ) * 1000, 10 ) / 10 + '%';\n\t\t\t\t\t$colgroup.append( $( '' ).css( 'width', percent ) );\n\t\t\t\t}\n\t\t\t\tc.$table.prepend( $colgroup );\n\t\t\t}\n\t\t},\n\n\t\t// get sorter, string, empty, etc options for each column from\n\t\t// jQuery data, metadata, header option or header class name ('sorter-false')\n\t\t// priority = jQuery data > meta > headers option > header class name\n\t\tgetData : function( header, configHeader, key ) {\n\t\t\tvar meta, cl4ss,\n\t\t\t\tval = '',\n\t\t\t\t$header = $( header );\n\t\t\tif ( !$header.length ) { return ''; }\n\t\t\tmeta = $.metadata ? $header.metadata() : false;\n\t\t\tcl4ss = ' ' + ( $header.attr( 'class' ) || '' );\n\t\t\tif ( typeof $header.data( key ) !== 'undefined' ||\n\t\t\t\ttypeof $header.data( key.toLowerCase() ) !== 'undefined' ) {\n\t\t\t\t// 'data-lockedOrder' is assigned to 'lockedorder'; but 'data-locked-order' is assigned to 'lockedOrder'\n\t\t\t\t// 'data-sort-initial-order' is assigned to 'sortInitialOrder'\n\t\t\t\tval += $header.data( key ) || $header.data( key.toLowerCase() );\n\t\t\t} else if ( meta && typeof meta[ key ] !== 'undefined' ) {\n\t\t\t\tval += meta[ key ];\n\t\t\t} else if ( configHeader && typeof configHeader[ key ] !== 'undefined' ) {\n\t\t\t\tval += configHeader[ key ];\n\t\t\t} else if ( cl4ss !== ' ' && cl4ss.match( ' ' + key + '-' ) ) {\n\t\t\t\t// include sorter class name 'sorter-text', etc; now works with 'sorter-my-custom-parser'\n\t\t\t\tval = cl4ss.match( new RegExp( '\\\\s' + key + '-([\\\\w-]+)' ) )[ 1 ] || '';\n\t\t\t}\n\t\t\treturn $.trim( val );\n\t\t},\n\n\t\tgetColumnData : function( table, obj, indx, getCell, $headers ) {\n\t\t\tif ( typeof obj !== 'object' || obj === null ) {\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tvar $header, key,\n\t\t\t\tc = table.config,\n\t\t\t\t$cells = ( $headers || c.$headers ),\n\t\t\t\t// c.$headerIndexed is not defined initially\n\t\t\t\t$cell = c.$headerIndexed && c.$headerIndexed[ indx ] ||\n\t\t\t\t\t$cells.filter( '[data-column=\"' + indx + '\"]:last' );\n\t\t\tif ( typeof obj[ indx ] !== 'undefined' ) {\n\t\t\t\treturn getCell ? obj[ indx ] : obj[ $cells.index( $cell ) ];\n\t\t\t}\n\t\t\tfor ( key in obj ) {\n\t\t\t\tif ( typeof key === 'string' ) {\n\t\t\t\t\t$header = $cell\n\t\t\t\t\t\t// header cell with class/id\n\t\t\t\t\t\t.filter( key )\n\t\t\t\t\t\t// find elements within the header cell with cell/id\n\t\t\t\t\t\t.add( $cell.find( key ) );\n\t\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t\treturn obj[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t},\n\n\t\t// *** Process table ***\n\t\t// add processing indicator\n\t\tisProcessing : function( $table, toggle, $headers ) {\n\t\t\t$table = $( $table );\n\t\t\tvar c = $table[ 0 ].config,\n\t\t\t\t// default to all headers\n\t\t\t\t$header = $headers || $table.find( '.' + ts.css.header );\n\t\t\tif ( toggle ) {\n\t\t\t\t// don't use sortList if custom $headers used\n\t\t\t\tif ( typeof $headers !== 'undefined' && c.sortList.length > 0 ) {\n\t\t\t\t\t// get headers from the sortList\n\t\t\t\t\t$header = $header.filter( function() {\n\t\t\t\t\t\t// get data-column from attr to keep compatibility with jQuery 1.2.6\n\t\t\t\t\t\treturn this.sortDisabled ?\n\t\t\t\t\t\t\tfalse :\n\t\t\t\t\t\t\tts.isValueInArray( parseFloat( $( this ).attr( 'data-column' ) ), c.sortList ) >= 0;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$table.add( $header ).addClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t} else {\n\t\t\t\t$table.add( $header ).removeClass( ts.css.processing + ' ' + c.cssProcessing );\n\t\t\t}\n\t\t},\n\n\t\t// detach tbody but save the position\n\t\t// don't use tbody because there are portions that look for a tbody index (updateCell)\n\t\tprocessTbody : function( table, $tb, getIt ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( getIt ) {\n\t\t\t\ttable.isProcessing = true;\n\t\t\t\t$tb.before( '' );\n\t\t\t\treturn $.fn.detach ? $tb.detach() : $tb.remove();\n\t\t\t}\n\t\t\tvar holdr = $( table ).find( 'colgroup.tablesorter-savemyplace' );\n\t\t\t$tb.insertAfter( holdr );\n\t\t\tholdr.remove();\n\t\t\ttable.isProcessing = false;\n\t\t},\n\n\t\tclearTableBody : function( table ) {\n\t\t\t$( table )[ 0 ].config.$tbodies.children().detach();\n\t\t},\n\n\t\t// used when replacing accented characters during sorting\n\t\tcharacterEquivalents : {\n\t\t\t'a' : '\\u00e1\\u00e0\\u00e2\\u00e3\\u00e4\\u0105\\u00e5', // áàâãäąå\n\t\t\t'A' : '\\u00c1\\u00c0\\u00c2\\u00c3\\u00c4\\u0104\\u00c5', // ÁÀÂÃÄĄÅ\n\t\t\t'c' : '\\u00e7\\u0107\\u010d', // çćč\n\t\t\t'C' : '\\u00c7\\u0106\\u010c', // ÇĆČ\n\t\t\t'e' : '\\u00e9\\u00e8\\u00ea\\u00eb\\u011b\\u0119', // éèêëěę\n\t\t\t'E' : '\\u00c9\\u00c8\\u00ca\\u00cb\\u011a\\u0118', // ÉÈÊËĚĘ\n\t\t\t'i' : '\\u00ed\\u00ec\\u0130\\u00ee\\u00ef\\u0131', // íìİîïı\n\t\t\t'I' : '\\u00cd\\u00cc\\u0130\\u00ce\\u00cf', // ÍÌİÎÏ\n\t\t\t'o' : '\\u00f3\\u00f2\\u00f4\\u00f5\\u00f6\\u014d', // óòôõöō\n\t\t\t'O' : '\\u00d3\\u00d2\\u00d4\\u00d5\\u00d6\\u014c', // ÓÒÔÕÖŌ\n\t\t\t'ss': '\\u00df', // ß (s sharp)\n\t\t\t'SS': '\\u1e9e', // ẞ (Capital sharp s)\n\t\t\t'u' : '\\u00fa\\u00f9\\u00fb\\u00fc\\u016f', // úùûüů\n\t\t\t'U' : '\\u00da\\u00d9\\u00db\\u00dc\\u016e' // ÚÙÛÜŮ\n\t\t},\n\n\t\treplaceAccents : function( str ) {\n\t\t\tvar chr,\n\t\t\t\tacc = '[',\n\t\t\t\teq = ts.characterEquivalents;\n\t\t\tif ( !ts.characterRegex ) {\n\t\t\t\tts.characterRegexArray = {};\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tacc += eq[ chr ];\n\t\t\t\t\t\tts.characterRegexArray[ chr ] = new RegExp( '[' + eq[ chr ] + ']', 'g' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tts.characterRegex = new RegExp( acc + ']' );\n\t\t\t}\n\t\t\tif ( ts.characterRegex.test( str ) ) {\n\t\t\t\tfor ( chr in eq ) {\n\t\t\t\t\tif ( typeof chr === 'string' ) {\n\t\t\t\t\t\tstr = str.replace( ts.characterRegexArray[ chr ], chr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\n\t\tvalidateOptions : function( c ) {\n\t\t\tvar setting, setting2, typ, timer,\n\t\t\t\t// ignore options containing an array\n\t\t\t\tignore = 'headers sortForce sortList sortAppend widgets'.split( ' ' ),\n\t\t\t\torig = c.originalSettings;\n\t\t\tif ( orig ) {\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\ttimer = new Date();\n\t\t\t\t}\n\t\t\t\tfor ( setting in orig ) {\n\t\t\t\t\ttyp = typeof ts.defaults[setting];\n\t\t\t\t\tif ( typ === 'undefined' ) {\n\t\t\t\t\t\tconsole.warn( 'Tablesorter Warning! \"table.config.' + setting + '\" option not recognized' );\n\t\t\t\t\t} else if ( typ === 'object' ) {\n\t\t\t\t\t\tfor ( setting2 in orig[setting] ) {\n\t\t\t\t\t\t\ttyp = ts.defaults[setting] && typeof ts.defaults[setting][setting2];\n\t\t\t\t\t\t\tif ( $.inArray( setting, ignore ) < 0 && typ === 'undefined' ) {\n\t\t\t\t\t\t\t\tconsole.warn( 'Tablesorter Warning! \"table.config.' + setting + '.' + setting2 + '\" option not recognized' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( c.debug ) {\n\t\t\t\t\tconsole.log( 'validate options time:' + ts.benchmark( timer ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// restore headers\n\t\trestoreHeaders : function( table ) {\n\t\t\tvar index, $cell,\n\t\t\t\tc = $( table )[ 0 ].config,\n\t\t\t\t$headers = c.$table.find( c.selectorHeaders ),\n\t\t\t\tlen = $headers.length;\n\t\t\t// don't use c.$headers here in case header cells were swapped\n\t\t\tfor ( index = 0; index < len; index++ ) {\n\t\t\t\t$cell = $headers.eq( index );\n\t\t\t\t// only restore header cells if it is wrapped\n\t\t\t\t// because this is also used by the updateAll method\n\t\t\t\tif ( $cell.find( '.' + ts.css.headerIn ).length ) {\n\t\t\t\t\t$cell.html( c.headerContent[ index ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdestroy : function( table, removeClasses, callback ) {\n\t\t\ttable = $( table )[ 0 ];\n\t\t\tif ( !table.hasInitialized ) { return; }\n\t\t\t// remove all widgets\n\t\t\tts.removeWidget( table, true, false );\n\t\t\tvar events,\n\t\t\t\t$t = $( table ),\n\t\t\t\tc = table.config,\n\t\t\t\tdebug = c.debug,\n\t\t\t\t$h = $t.find( 'thead:first' ),\n\t\t\t\t$r = $h.find( 'tr.' + ts.css.headerRow ).removeClass( ts.css.headerRow + ' ' + c.cssHeaderRow ),\n\t\t\t\t$f = $t.find( 'tfoot:first > tr' ).children( 'th, td' );\n\t\t\tif ( removeClasses === false && $.inArray( 'uitheme', c.widgets ) >= 0 ) {\n\t\t\t\t// reapply uitheme classes, in case we want to maintain appearance\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'uitheme' ] );\n\t\t\t\t$t.triggerHandler( 'applyWidgetId', [ 'zebra' ] );\n\t\t\t}\n\t\t\t// remove widget added rows, just in case\n\t\t\t$h.find( 'tr' ).not( $r ).remove();\n\t\t\t// disable tablesorter - not using .unbind( namespace ) because namespacing was\n\t\t\t// added in jQuery v1.4.3 - see http://api.jquery.com/event.namespace/\n\t\t\tevents = 'sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton ' +\n\t\t\t\t'appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave ' +\n\t\t\t\t'keypress sortBegin sortEnd resetToLoadState '.split( ' ' )\n\t\t\t\t.join( c.namespace + ' ' );\n\t\t\t$t\n\t\t\t\t.removeData( 'tablesorter' )\n\t\t\t\t.unbind( events.replace( ts.regex.spaces, ' ' ) );\n\t\t\tc.$headers\n\t\t\t\t.add( $f )\n\t\t\t\t.removeClass( [ ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone ].join( ' ' ) )\n\t\t\t\t.removeAttr( 'data-column' )\n\t\t\t\t.removeAttr( 'aria-label' )\n\t\t\t\t.attr( 'aria-disabled', 'true' );\n\t\t\t$r\n\t\t\t\t.find( c.selectorSort )\n\t\t\t\t.unbind( ( 'mousedown mouseup keypress '.split( ' ' ).join( c.namespace + ' ' ) ).replace( ts.regex.spaces, ' ' ) );\n\t\t\tts.restoreHeaders( table );\n\t\t\t$t.toggleClass( ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false );\n\t\t\t// clear flag in case the plugin is initialized again\n\t\t\ttable.hasInitialized = false;\n\t\t\tdelete table.config.cache;\n\t\t\tif ( typeof callback === 'function' ) {\n\t\t\t\tcallback( table );\n\t\t\t}\n\t\t\tif ( debug ) {\n\t\t\t\tconsole.log( 'tablesorter has been removed' );\n\t\t\t}\n\t\t}\n\n\t};\n\n\t$.fn.tablesorter = function( settings ) {\n\t\treturn this.each( function() {\n\t\t\tvar table = this,\n\t\t\t// merge & extend config options\n\t\t\tc = $.extend( true, {}, ts.defaults, settings, ts.instanceMethods );\n\t\t\t// save initial settings\n\t\t\tc.originalSettings = settings;\n\t\t\t// create a table from data (build table widget)\n\t\t\tif ( !table.hasInitialized && ts.buildTable && this.nodeName !== 'TABLE' ) {\n\t\t\t\t// return the table (in case the original target is the table's container)\n\t\t\t\tts.buildTable( table, c );\n\t\t\t} else {\n\t\t\t\tts.setup( table, c );\n\t\t\t}\n\t\t});\n\t};\n\n\t// set up debug logs\n\tif ( !( window.console && window.console.log ) ) {\n\t\t// access $.tablesorter.logs for browsers that don't have a console...\n\t\tts.logs = [];\n\t\t/*jshint -W020 */\n\t\tconsole = {};\n\t\tconsole.log = console.warn = console.error = console.table = function() {\n\t\t\tvar arg = arguments.length > 1 ? arguments : arguments[0];\n\t\t\tts.logs[ ts.logs.length ] = { date: Date.now(), log: arg };\n\t\t};\n\t}\n\n\t// add default parsers\n\tts.addParser({\n\t\tid : 'no-parser',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function() {\n\t\t\treturn '';\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.addParser({\n\t\tid : 'text',\n\t\tis : function() {\n\t\t\treturn true;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar c = table.config;\n\t\t\tif ( str ) {\n\t\t\t\tstr = $.trim( c.ignoreCase ? str.toLocaleLowerCase() : str );\n\t\t\t\tstr = c.sortLocaleCompare ? ts.replaceAccents( str ) : str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.regex.nondigit = /[^\\w,. \\-()]/g;\n\tts.addParser({\n\t\tid : 'digit',\n\t\tis : function( str ) {\n\t\t\treturn ts.isDigit( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.currencyReplace = /[+\\-,. ]/g;\n\tts.regex.currencyTest = /^\\(?\\d+[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]|[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]\\d+\\)?$/;\n\tts.addParser({\n\t\tid : 'currency',\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.currencyReplace, '' );\n\t\t\t// test for £$€¤¥¢\n\t\t\treturn ts.regex.currencyTest.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar num = ts.formatFloat( ( str || '' ).replace( ts.regex.nondigit, '' ), table );\n\t\t\treturn str && typeof num === 'number' ? num :\n\t\t\t\tstr ? $.trim( str && table.config.ignoreCase ? str.toLocaleLowerCase() : str ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// too many protocols to add them all https://en.wikipedia.org/wiki/URI_scheme\n\t// now, this regex can be updated before initialization\n\tts.regex.urlProtocolTest = /^(https?|ftp|file):\\/\\//;\n\tts.regex.urlProtocolReplace = /(https?|ftp|file):\\/\\/(www\\.)?/;\n\tts.addParser({\n\t\tid : 'url',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.urlProtocolTest.test( str );\n\t\t},\n\t\tformat : function( str ) {\n\t\t\treturn str ? $.trim( str.replace( ts.regex.urlProtocolReplace, '' ) ) : str;\n\t\t},\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dash = /-/g;\n\tts.regex.isoDate = /^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}/;\n\tts.addParser({\n\t\tid : 'isoDate',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.isoDate.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dash, '/' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.regex.percent = /%/g;\n\tts.regex.percentTest = /(\\d\\s*?%|%\\s*?\\d)/;\n\tts.addParser({\n\t\tid : 'percent',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.percentTest.test( str ) && str.length < 15;\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\treturn str ? ts.formatFloat( str.replace( ts.regex.percent, '' ), table ) : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// added image parser to core v2.17.9\n\tts.addParser({\n\t\tid : 'image',\n\t\tis : function( str, table, node, $node ) {\n\t\t\treturn $node.find( 'img' ).length > 0;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\treturn $( cell ).find( 'img' ).attr( table.config.imgAttr || 'alt' ) || str;\n\t\t},\n\t\tparsed : true, // filter widget flag\n\t\ttype : 'text'\n\t});\n\n\tts.regex.dateReplace = /(\\S)([AP]M)$/i; // used by usLongDate & time parser\n\tts.regex.usLongDateTest1 = /^[A-Z]{3,10}\\.?\\s+\\d{1,2},?\\s+(\\d{4})(\\s+\\d{1,2}:\\d{2}(:\\d{2})?(\\s+[AP]M)?)?$/i;\n\tts.regex.usLongDateTest2 = /^\\d{1,2}\\s+[A-Z]{3,10}\\s+\\d{4}/i;\n\tts.addParser({\n\t\tid : 'usLongDate',\n\t\tis : function( str ) {\n\t\t\t// two digit years are not allowed cross-browser\n\t\t\t// Jan 01, 2013 12:34:56 PM or 01 Jan 2013\n\t\t\treturn ts.regex.usLongDateTest1.test( str ) || ts.regex.usLongDateTest2.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\tvar date = str ? new Date( str.replace( ts.regex.dateReplace, '$1 $2' ) ) : str;\n\t\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included\n\tts.regex.shortDateTest = /(^\\d{1,2}[\\/\\s]\\d{1,2}[\\/\\s]\\d{4})|(^\\d{4}[\\/\\s]\\d{1,2}[\\/\\s]\\d{1,2})/;\n\t// escaped \"-\" because JSHint in Firefox was showing it as an error\n\tts.regex.shortDateReplace = /[\\-.,]/g;\n\t// XXY covers MDY & DMY formats\n\tts.regex.shortDateXXY = /(\\d{1,2})[\\/\\s](\\d{1,2})[\\/\\s](\\d{4})/;\n\tts.regex.shortDateYMD = /(\\d{4})[\\/\\s](\\d{1,2})[\\/\\s](\\d{1,2})/;\n\tts.convertFormat = function( dateString, format ) {\n\t\tdateString = ( dateString || '' )\n\t\t\t.replace( ts.regex.spaces, ' ' )\n\t\t\t.replace( ts.regex.shortDateReplace, '/' );\n\t\tif ( format === 'mmddyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$1/$2' );\n\t\t} else if ( format === 'ddmmyyyy' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateXXY, '$3/$2/$1' );\n\t\t} else if ( format === 'yyyymmdd' ) {\n\t\t\tdateString = dateString.replace( ts.regex.shortDateYMD, '$1/$2/$3' );\n\t\t}\n\t\tvar date = new Date( dateString );\n\t\treturn date instanceof Date && isFinite( date ) ? date.getTime() : '';\n\t};\n\n\tts.addParser({\n\t\tid : 'shortDate', // 'mmddyyyy', 'ddmmyyyy' or 'yyyymmdd'\n\t\tis : function( str ) {\n\t\t\tstr = ( str || '' ).replace( ts.regex.spaces, ' ' ).replace( ts.regex.shortDateReplace, '/' );\n\t\t\treturn ts.regex.shortDateTest.test( str );\n\t\t},\n\t\tformat : function( str, table, cell, cellIndex ) {\n\t\t\tif ( str ) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\t$header = c.$headerIndexed[ cellIndex ],\n\t\t\t\t\tformat = $header.length && $header.data( 'dateFormat' ) ||\n\t\t\t\t\t\tts.getData( $header, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat' ) ||\n\t\t\t\t\t\tc.dateFormat;\n\t\t\t\t// save format because getData can be slow...\n\t\t\t\tif ( $header.length ) {\n\t\t\t\t\t$header.data( 'dateFormat', format );\n\t\t\t\t}\n\t\t\t\treturn ts.convertFormat( str, format ) || str;\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk\n\tts.regex.timeTest = /^(0?[1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)$|^((?:[01]\\d|[2][0-4]):[0-5]\\d)$/i;\n\tts.regex.timeMatch = /(0?[1-9]|1[0-2]):([0-5]\\d)(\\s[AP]M)|((?:[01]\\d|[2][0-4]):[0-5]\\d)/i;\n\tts.addParser({\n\t\tid : 'time',\n\t\tis : function( str ) {\n\t\t\treturn ts.regex.timeTest.test( str );\n\t\t},\n\t\tformat : function( str, table ) {\n\t\t\t// isolate time... ignore month, day and year\n\t\t\tvar temp,\n\t\t\t\ttimePart = ( str || '' ).match( ts.regex.timeMatch ),\n\t\t\t\torig = new Date( str ),\n\t\t\t\t// no time component? default to 00:00 by leaving it out, but only if str is defined\n\t\t\t\ttime = str && ( timePart !== null ? timePart[ 0 ] : '00:00 AM' ),\n\t\t\t\tdate = time ? new Date( '2000/01/01 ' + time.replace( ts.regex.dateReplace, '$1 $2' ) ) : time;\n\t\t\tif ( date instanceof Date && isFinite( date ) ) {\n\t\t\t\ttemp = orig instanceof Date && isFinite( orig ) ? orig.getTime() : 0;\n\t\t\t\t// if original string was a valid date, add it to the decimal so the column sorts in some kind of order\n\t\t\t\t// luckily new Date() ignores the decimals\n\t\t\t\treturn temp ? parseFloat( date.getTime() + '.' + orig.getTime() ) : date.getTime();\n\t\t\t}\n\t\t\treturn str;\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\tts.addParser({\n\t\tid : 'metadata',\n\t\tis : function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat : function( str, table, cell ) {\n\t\t\tvar c = table.config,\n\t\t\tp = ( !c.parserMetadataName ) ? 'sortValue' : c.parserMetadataName;\n\t\t\treturn $( cell ).metadata()[ p ];\n\t\t},\n\t\ttype : 'numeric'\n\t});\n\n\t/*\n\t\t██████ ██████ █████▄ █████▄ ▄████▄\n\t\t ▄█▀ ██▄▄ ██▄▄██ ██▄▄██ ██▄▄██\n\t\t▄█▀ ██▀▀ ██▀▀██ ██▀▀█ ██▀▀██\n\t\t██████ ██████ █████▀ ██ ██ ██ ██\n\t\t*/\n\t// add default widgets\n\tts.addWidget({\n\t\tid : 'zebra',\n\t\tpriority : 90,\n\t\tformat : function( table, c, wo ) {\n\t\t\tvar $visibleRows, $row, count, isEven, tbodyIndex, rowIndex, len,\n\t\t\t\tchild = new RegExp( c.cssChildRow, 'i' ),\n\t\t\t\t$tbodies = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody:not(.' + c.cssInfoBlock + ')' ) );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {\n\t\t\t\t// loop through the visible rows\n\t\t\t\tcount = 0;\n\t\t\t\t$visibleRows = $tbodies.eq( tbodyIndex ).children( 'tr:visible' ).not( c.selectorRemove );\n\t\t\t\tlen = $visibleRows.length;\n\t\t\t\tfor ( rowIndex = 0; rowIndex < len; rowIndex++ ) {\n\t\t\t\t\t$row = $visibleRows.eq( rowIndex );\n\t\t\t\t\t// style child rows the same way the parent row was styled\n\t\t\t\t\tif ( !child.test( $row[ 0 ].className ) ) { count++; }\n\t\t\t\t\tisEven = ( count % 2 === 0 );\n\t\t\t\t\t$row\n\t\t\t\t\t\t.removeClass( wo.zebra[ isEven ? 1 : 0 ] )\n\t\t\t\t\t\t.addClass( wo.zebra[ isEven ? 0 : 1 ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremove : function( table, c, wo, refreshing ) {\n\t\t\tif ( refreshing ) { return; }\n\t\t\tvar tbodyIndex, $tbody,\n\t\t\t\t$tbodies = c.$tbodies,\n\t\t\t\ttoRemove = ( wo.zebra || [ 'even', 'odd' ] ).join( ' ' );\n\t\t\tfor ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ){\n\t\t\t\t$tbody = ts.processTbody( table, $tbodies.eq( tbodyIndex ), true ); // remove tbody\n\t\t\t\t$tbody.children().removeClass( toRemove );\n\t\t\t\tts.processTbody( table, $tbody, false ); // restore tbody\n\t\t\t}\n\t\t}\n\t});\n\n})( jQuery );\n\nreturn jQuery.tablesorter;\n}));\n","// Initialise la carte\r\nfunction initMap() {\r\n\tgeocoder = new google.maps.Geocoder();\r\n\r\n\tvar france = new google.maps.LatLng(46.2157467, 2.2088258);\r\n\r\n\tvar mapOptions = {\r\n\t\tzoom: 5,\r\n\t\tmapTypeControl: false,\r\n\t\tcenter: france\r\n\t}\r\n\r\n\twindow.map = new google.maps.Map(document.getElementById(\"map\"), mapOptions);\r\n\r\n\r\n\t// [RECHERCHE]\r\n\r\n\t// Create the search box and link it to the UI element.\r\n\tvar input_text = document.getElementById('pac-input-text');\r\n\tvar input_button = document.getElementById('pac-input-button');\r\n\r\n\tif (input_text) {\r\n\t\tvar searchBox = new google.maps.places.SearchBox(input_text);\r\n\t\tmap.controls[google.maps.ControlPosition.TOP_LEFT].push(input_text);\r\n\t\tmap.controls[google.maps.ControlPosition.TOP_RIGHT].push(input_button);\r\n\r\n\t\t// Bias the SearchBox results towards current map's viewport.\r\n\t\tmap.addListener('bounds_changed', function() {\r\n\t\t\tsearchBox.setBounds(map.getBounds());\r\n\t\t});\r\n\r\n\t\twindow.markers = [];\r\n\t\t// [START region_getplaces]\r\n\r\n\t\t// Listen for the event fired when the user selects a prediction and retrieve\r\n\t\t// more details for that place.\r\n\t\tsearchBox.addListener('places_changed', function() {\r\n\t\t\tvar places = searchBox.getPlaces();\r\n\r\n\t\t\tif (places.length == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Clear out the old markers.\r\n\t\t\twindow.markers.forEach(function(marker) {\r\n\t\t\t\tmarker.setMap(null);\r\n\t\t\t});\r\n\t\t\twindow.markers = [];\r\n\r\n\t\t\t// For each place, get the icon, name and location.\r\n\t\t\tvar bounds = new google.maps.LatLngBounds();\r\n\t\t\tplaces.forEach(function(place) {\r\n\r\n\t\t\t\t// Create a marker for each place.\r\n\t\t\t\twindow.markers.push(new google.maps.Marker({\r\n\t\t\t\t\tmap: map,\r\n\t\t\t\t\ttitle: place.name,\r\n\t\t\t\t\tposition: place.geometry.location\r\n\t\t\t\t}));\r\n\r\n\t\t\t\tif (place.geometry.viewport) {\r\n\t\t\t\t\t// Only geocodes have viewport.\r\n\t\t\t\t\tbounds.union(place.geometry.viewport);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbounds.extend(place.geometry.location);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tmap.fitBounds(bounds);\r\n\t\t});\r\n\r\n\t\t// [END region_getplaces]\r\n\t};\r\n\r\n\t// [END RECHERCHE]\r\n\r\n\t// Affiche les marqueurs\r\n\tsetMarkers(window.map, window.locations);\r\n}\r\n\r\n// Place des marqueurs sur la carte\r\nfunction setMarkers(map, locations) {\r\n\tfor (var i = 0; i < locations.length; i++) {\r\n\t\tvar location = locations[i];\r\n\t\tvar marker = new google.maps.Marker({\r\n\t\t\tposition: {lat: location[1], lng: location[2]},\r\n\t\t\tmap: map,\r\n\t\t\ttitle: location[0],\r\n\t\t\tanimation: google.maps.Animation.DROP\r\n\t\t});\r\n\t}\r\n}\r\n","var solde = /(-?[0-9]{1,3}(,[0-9]{3})*\\.[0-9]{2})\\s?€/;\r\n$.tablesorter.addParser({ \r\n\t// set a unique id \r\n\tid: 'solde', \r\n\tis: function(s) { \r\n\t\tvar data = s.match(solde);\r\n\t\treturn data ? true : false; \r\n\t}, \r\n\tformat: function(s) { \r\n\t\t// format your data for normalization \r\n\t\tvar res = s.match(solde)[1].replace(\",\",\"\"); \r\n\t\treturn res;\r\n\t},\r\n\ttype:\"numeric\"\r\n}); \r\n$(document).ready(function() \r\n\t{ \r\n\t\t$(\".sortable\").tablesorter( {textExtraction: function(node){\r\n\t\t\t//va chercher un éventuel tag \"sortby\" dans le noeud parent\r\n\t\t\t//pour l'utiliser pour le tri\r\n\t\t\tvar text = node.getAttribute(\"sortby\");\r\n\t\t\tif(!text)\r\n\t\t\t{\r\n\t\t\t\t//etrait de la lib de base\r\n\t\t\t\tvar supportsTextContent = node.textContent || false;\r\n\t\t\t\tif (supportsTextContent) {\r\n\t\t\t\t\ttext = node.textContent;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (node.childNodes[0] && node.childNodes[0].hasChildNodes()) {\r\n\t\t\t\t\t\ttext = node.childNodes[0].innerHTML;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttext = node.innerHTML;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn text;\r\n\t\t}}); \r\n\t} \r\n); "]}