diff --git a/notemyprogress/ajax.php b/notemyprogress/ajax.php
index 6f2be358bfa312a5962bd5cfafa12c112f7313af..0ed7691410ffd51d3767c6aab06392b96592750d 100644
--- a/notemyprogress/ajax.php
+++ b/notemyprogress/ajax.php
@@ -27,11 +27,16 @@ define('AJAX_SCRIPT', true);
 require_once(dirname(__FILE__) . '/../../config.php');
 require_once(dirname(__FILE__) . '/locallib.php');
 
+<<<<<<< HEAD
 
 global $USER, $COURSE, $DB;
+=======
+global $USER, $COURSE, $DB; 
+
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
 
-$userid = required_param('userid', PARAM_INT);
 $courseid = required_param('courseid', PARAM_INT);
+$userid = required_param('userid', PARAM_INT);  
 
 $COURSE = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 $USER = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
@@ -39,8 +44,8 @@ $USER = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
 require_login($COURSE, false);
 $context = context_course::instance($courseid);
 require_capability('local/notemyprogress:ajax', $context);
-
-$beginDate = optional_param('beginDate', false, PARAM_TEXT);
+/*                    Start the déclaration of all the optional parrameters                               */
+$beginDate = optional_param('beginDate', false, PARAM_TEXT); //optional_param('keyValue','DefaultValue','Type value');
 $lastDate = optional_param('lastDate', false, PARAM_TEXT);
 
 $sectionname = optional_param('sectionname', false, PARAM_TEXT);
@@ -83,20 +88,39 @@ $modulename = optional_param('modulename', false, PARAM_TEXT);
 
 $newinstance = optional_param('newinstance', false, PARAM_BOOL);
 
+//gamification parameters
+$rules = optional_param('rules', false ,PARAM_TEXT);
+$levels = optional_param('levels', false ,PARAM_TEXT);
+$settings= optional_param('settings', false ,PARAM_TEXT);
+$url= optional_param('url', false ,PARAM_TEXT);
+//$courseid = optional_param('modulename', false ,PARAM_TEXT);
+$enable = optional_param('enable', false ,PARAM_BOOL);
+$section = optional_param('section',false,PARAM_TEXT);
 
-$params = array();
-$func = null;
+/*                                               */ 
 
+<<<<<<< HEAD
 //debug_text::print("Enter ajax file");
 
 if ($action == 'saveconfigweek') {
+=======
+$params = array(); // Array containing the data
+$func = null; // fuction which will be call at line 193
+
+if($action == 'saveconfigweek') {//Exemple: if the action passed is saveconfigweek then my array contain (weeks,courseid,userid,newinstance)
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     array_push($params, $weeks);
     array_push($params, $courseid);
     array_push($params, $userid);
     array_push($params, $newinstance);
 
+<<<<<<< HEAD
     if ($weeks && $courseid && $userid) {
         $func = "local_notemyprogress_save_weeks_config";
+=======
+    if($weeks && $courseid && $userid){
+        $func = "local_notemyprogress_save_weeks_config"; //this function must be contained in localib.php
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     }
 } elseif ($action == 'changegroup') {
     array_push($params, $courseid);
@@ -256,15 +280,54 @@ if ($action == 'saveconfigweek') {
     if ($courseid && $userid && $sectionname && $actiontype && $objectType && $objectName && $objectDescription && $currentUrl) {
         $func = "local_notemyprogress_addLogs";
     }
-}
+}elseif($action =='savegamification'){
+    array_push($params, $courseid);
+    array_push($params, $userid);
+    array_push($params, $rules);
+    array_push($params, $levels);
+    array_push($params, $settings);
+    array_push($params, $url);
+    array_push($params, $section);
+    if($courseid && $userid && $rules && $levels && $settings && $url) {
+        $func = "local_notemyprogress_save_gamification_config";
+    }
+}elseif($action =='rankable'){
+    array_push($params, $courseid);
+    array_push($params, $userid);
+    array_push($params, $url);
+    if($courseid && $userid) {
+        $func = "local_notemyprogress_set_rankable_player";
+    }
+}elseif($action =='saveEnable'){
+    array_push($params, $courseid);
+    array_push($params, $userid);
+    array_push($params,$enable);
+    array_push($params,$url);
+    if($courseid && $userid) {
+        $func = "local_notemyprogress_save_enable";
+    }
+}elseif($action =='studentGamificationViewed'){
+    array_push($params, $courseid);
+    array_push($params, $userid);
+    array_push($params,$url);
+    if($courseid && $userid) {
+        $func = "local_notemyprogress_viewed_student_lvl";
+    }
+}        
 
 if (isset($params) && isset($func)) {
     call_user_func_array($func, $params);
+<<<<<<< HEAD
 } else {
+=======
+    
+}else{
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     $message = get_string('api_invalid_data', 'local_notemyprogress');
-    local_notemyprogress_ajax_response(array($message), 400);
+    local_notemyprogress_ajax_response(array($message));//,$action,$courseid, $userid ,$rules , $levels, $settings, $url,$func), 442);
 }
 
+<<<<<<< HEAD
 function local_sr_metareflexion_get_week($weekcode, $courseid, $userid, $profile)
 {
 
@@ -357,6 +420,9 @@ function local_sr_update_lastweek($courseid, $userid, $lastweekid, $classroom_ho
 
 function local_notemyprogress_logsNMP($beginDate, $lastDate, $courseid, $userid, $currentUrl)
 {
+=======
+function local_notemyprogress_logsNMP($beginDate, $lastDate, $courseid, $userid, $currentUrl) {
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     $logs = new \local_notemyprogress\logs($courseid, $userid);
     $logs->addLogsNMP("downloaded", "logfile", "LOGFILES", "nmp", $currentUrl, "File that contains all the activities performed on the moodle course in a time interval");
     $jsonData = $logs->searchLogsNMP($beginDate, $lastDate);
@@ -471,8 +537,13 @@ function local_notemyprogress_generate_dropout_data($courseid, $userid, $profile
         $dropout = new \local_notemyprogress\dropout($courseid, $userid);
         $dropout->generate_data();
         local_notemyprogress_ajax_response([], "ok", true, 200);
+<<<<<<< HEAD
     } else {
         local_notemyprogress_ajax_response([], "", false, 400);
+=======
+    }else{
+        local_notemyprogress_ajax_response([], "", false, 402);
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     }
 }
 
@@ -490,7 +561,6 @@ function local_notemyprogress_get_student_sessions($weekcode, $courseid, $userid
 function local_notemyprogress_downloadMoodleLogs($beginDate, $lastDate, $courseid, $userid, $currentUrl)
 {
     $logs = new \local_notemyprogress\logs($courseid, $userid);
-
     $logs->addLogsNMP("downloaded", "logfile", "LOGFILES", "moodle", $currentUrl, "File that contains all the activities performed on the Note My Progress plugin in a time interval");
     $jsonData = $logs->searchLogsMoodle($beginDate, $lastDate);
     local_notemyprogress_ajax_response(array("jsonData" => $jsonData));
@@ -500,5 +570,49 @@ function local_notemyprogress_addLogs($sectionname, $actiontype, $courseid, $use
 {
     $logs = new \local_notemyprogress\logs($courseid, $userid);
     $logs->addLogsNMP($actiontype, $objectType, $sectionname, $objectName, $currentUrl, $objectDescription);
+<<<<<<< HEAD
     local_notemyprogress_ajax_response(array("ok" => "ok"));
 }
+=======
+    local_notemyprogress_ajax_response(array("ok"=>"ok"));
+}
+function local_notemyprogress_save_gamification_config($courseid, $userid, $rules, $levels, $settings, $url,$section){
+    $logs = new \local_notemyprogress\logs($courseid, $userid);
+    $logs->addLogsNMP("Saved", $section, "CONFIGURATION_GAMIFICATION", "configuration_gamification", $url, "GamificationSaved");
+
+     $configLevels = new \local_notemyprogress\configgamification($courseid, $userid);
+     $configLevels->save_levels($levels, $settings, $rules);
+     //$configLevels->save_enable($enable);
+     $message = get_string('fml_api_save_successful', 'local_notemyprogress');
+     local_notemyprogress_ajax_response($message);
+ }
+
+function local_notemyprogress_set_rankable_player($courseid, $userid,$url){
+    $logs = new \local_notemyprogress\logs($courseid, $userid);
+    $logs->addLogsNMP("Saved", "section", "STUDENT_GAMIFICATION", "student_gamification", $url, "GamificationSaved");
+    GLobal $DB;
+    $sql = "update {notemyprogress_xp} set rankable = ? where courseid = ? and userid = ?";
+    $DB->execute($sql, array(1,$courseid, $userid));
+    // $sql = "UPDATE {notemyprogress_xp} SET rankable = 1 WHERE courseid = 2 AND userid = 3";
+    // $DB->execute($sql);
+    $message = get_string('fml_api_save_successful', 'local_notemyprogress');
+    local_notemyprogress_ajax_response($message);
+}
+
+function local_notemyprogress_save_enable($courseid, $userid, $enable,$url){
+    $logs = new \local_notemyprogress\logs($courseid, $userid);
+    $logs->addLogsNMP("Saved", "section", "CONFIGURATION_GAMIFICATION", "configuration_gamification", $url, "GamificationSaved");
+     $configLevels = new \local_notemyprogress\configgamification($courseid, $userid);
+     $configLevels->save_enable($enable);
+     $message = get_string('fml_api_save_successful', 'local_notemyprogress');
+     local_notemyprogress_ajax_response($message);
+ }
+ function local_notemyprogress_viewed_student_lvl($courseid, $userid,$url){
+    $logs = new \local_notemyprogress\logs($courseid, $userid);
+    $logs->addLogsNMP("Viewed", "section", "STUDENT_GAMIFICATION", "student_gamification", $url, "GamificationSaved");;
+    //  $configLevels = new \local_notemyprogress\configgamification($courseid, $userid);
+    //  $configLevels->save_enable($enable);
+    //  $message = get_string('fml_api_save_successful', 'local_notemyprogress');
+    //  local_notemyprogress_ajax_response($message);
+ }
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
diff --git a/notemyprogress/amd/build/assignments.min.js b/notemyprogress/amd/build/assignments.min.js
index 367c4202f79dc0c286675268acc2304b0acce2a3..93f13d0d59c0e2966aa4fc705294eb9327686454 100644
--- a/notemyprogress/amd/build/assignments.min.js
+++ b/notemyprogress/amd/build/assignments.min.js
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
 define([
   "local_notemyprogress/vue",
   "local_notemyprogress/vuetify",
@@ -410,3 +411,7 @@ define([
   };
 });
 //# sourceMappingURL=assignments.min.js.map
+=======
+define(["local_notemyprogress/vue","local_notemyprogress/vuetify","local_notemyprogress/axios","local_notemyprogress/moment","local_notemyprogress/pagination","local_notemyprogress/chartdynamic","local_notemyprogress/pageheader","local_notemyprogress/emailform","local_notemyprogress/helpdialog"],function(s,e,t,i,n,o,a,r,c){"use strict";return{init:function(i){s.use(e),s.component("pagination",n),s.component("chart",o),s.component("pageheader",a),s.component("emailform",r),s.component("helpdialog",c);let l=new s({delimiters:["[[","]]"],el:"#submissions",vuetify:new e,data:()=>({dialog:!1,selected_users:[],modulename:"",moduleid:!1,strings:i.strings,groups:i.groups,userid:i.userid,courseid:i.courseid,timezone:i.timezone,render_has:i.profile_render,scriptname:i.scriptname,loading:!1,errors:[],pages:i.pages,submissions:i.submissions,email_strings:i.strings.email_strings,access:i.access,assigns_submissions_colors:i.assigns_submissions_colors,access_content_colors:i.access_content_colors,access_chart_categories:[],access_chart_series:[],access_chart_users:[],help_dialog:!1,help_contents:[],email_object_name:""}),beforeMount(){this.generate_access_content_data()},mounted(){document.querySelector("#sessions-loader").style.display="none",document.querySelector("#submissions").style.display="block",setTimeout(function(){l.setGraphicsEventListeners()},1e3)},methods:{get_help_content(){let s=[];return s.push({title:this.strings.section_help_title,description:this.strings.section_help_description}),s},update_interactions(s){this.loading=!0,this.errors=[];let e={action:"assignments",userid:this.userid,courseid:this.courseid,weekcode:s.weekcode,profile:this.render_has};return t({method:"get",url:M.cfg.wwwroot+"/local/notemyprogress/ajax.php",params:e}).then(s=>{200==s.status&&s.data.ok?(this.submissions=s.data.data.submissions,this.access=s.data.data.access,this.generate_access_content_data()):this.error_messages.push(this.strings.error_network)}).catch(s=>{this.errors.push(this.strings.api_error_network)}).finally(()=>{this.loading=!1,l.addLogsIntoDB("viewed","week_"+s.weekcode,"week_section","Week section that allows you to obtain information on a specific week"),l.setGraphicsEventListeners()}),this.data},build_assigns_submissions_chart(){let s=new Object;return s.chart={type:"column",backgroundColor:null,style:{fontFamily:"poppins"}},s.title={text:null},s.colors=this.assigns_submissions_colors,s.xAxis={categories:this.submissions.categories,crosshair:!0},s.yAxis={min:0,title:{text:this.strings.assignsubs_chart_yaxis},allowDecimals:!1},s.tooltip={formatter:function(){let s=this.x.split("</b>");s=(s=(s=s[0]||"").split("<b>"))[1]||"";let e=this.series.name,t=this.y,i=l.strings.students_text,n=l.strings.send_mail;return 1==t&&(i=l.strings.student_text),"<b>"+s+"</b><br/><b>"+e+": </b>"+t+" "+i+"<br/>"+n}},s.plotOptions={series:{cursor:"pointer",point:{events:{click:function(){l.email_object_name="assigns_submissions";let s=this.category.split("</b>");s=(s=(s=s[0]||"").split("<b>"))[1]||"",l.email_strings.subject=l.email_strings.subject_prefix+" - "+s;let e=this.x,t=this.series.colorIndex;l.dialog=!0,l.selected_users=l.submissions.users[e][t],l.moduleid=l.submissions.modules[e],l.modulename="assign",l.scriptname="test"}}}}},s.series=this.submissions.data,s},build_access_content_chart(){let s=new Object;return s.chart={type:"bar",backgroundColor:null,style:{fontFamily:"poppins"}},s.title={text:null},s.colors=this.access_content_colors,s.xAxis={categories:this.access_chart_categories,title:{text:null},crosshair:!0},s.yAxis={min:0,title:{text:this.strings.access_chart_yaxis_label},labels:{overflow:"justify"},allowDecimals:!1},s.tooltip={formatter:function(){let s=this.x,e=this.series.name,t=this.y,i=l.strings.students_text,n=l.strings.send_mail;return 1==t&&(i=l.strings.student_text),"<b>"+s+"</b><br/><b>"+e+": </b>"+t+" "+i+"<br/>"+n}},s.plotOptions={bar:{dataLabels:{enabled:!1}},series:{cursor:"pointer",point:{events:{click:function(){l.email_object_name="access_content";let s=this.category;l.email_strings.subject=l.email_strings.subject_prefix+" - "+s;let e=this.x,t=this.series.colorIndex,i=l.get_users(l.access_chart_users[e][t]);l.selected_users=i;let n=l.get_moduletype(this.category);l.modulename=n.type,l.moduleid=n.id,l.dialog=!0,l.scriptname="test"}}}}},s.series=this.access_chart_series,s},update_dialog(s){this.dialog=s},generate_access_content_data(){let s=[];this.access.users.forEach(e=>{s.push(Number(e.id))});let e=[];this.access.types.forEach(s=>{s.show&&e.push(s.type)});let t=[];this.access.modules.forEach(s=>{e.includes(s.type)&&t.push(s)});let i=[],n=[],o=[],a=[];t.forEach(e=>{i.push(e.name);let t=e.users,r=s.filter(s=>!t.includes(s));o.push(t.length),a.push(r.length),n.push([t,r])});let r=[{name:this.strings.access,data:o},{name:this.strings.no_access,data:a}];this.access_chart_categories=i,this.access_chart_series=r,this.access_chart_users=n},get_users(s){let e=[];return this.access.users.forEach(t=>{let i=Number(t.id);s.includes(i)&&e.push(t)}),e},get_moduletype(s){let e;return this.access.modules.forEach(t=>{t.name===s&&(e=t)}),e},open_chart_help(s){let e=[];var t="",i="",n="",o="";"assigns_submissions"==s?(e.push({title:this.strings.assigns_submissions_help_title,description:this.strings.assigns_submissions_help_description_p1}),e.push({description:this.strings.assigns_submissions_help_description_p2}),t="viewed",n="help",i="assigns_submissions",o="Help section that provides information about the invested time chart",l.addLogsIntoDB(t,i,n,o)):"access_content"==s&&(e.push({title:this.strings.access_content_help_title,description:this.strings.access_content_help_description_p1}),e.push({description:this.strings.access_content_help_description_p2}),t="viewed",n="help",i="access_content",o="Help section that provides information about the sessions per hour chart",l.addLogsIntoDB(t,i,n,o)),this.help_contents=e,this.help_contents.length&&(this.help_dialog=!0)},update_help_dialog(s){this.help_dialog=s},get_timezone(){return`${this.strings.ss_change_timezone} ${this.timezone}`},setGraphicsEventListeners(){let s=document.querySelectorAll(".highcharts-container");s.length<1?setTimeout(l.setGraphicsEventListeners,500):(s[0].id="submissions",s[1].id="accessContent",s.forEach(s=>{s.addEventListener("mouseenter",l.addLogsViewGraphic)}))},addLogsViewGraphic(s){event.stopPropagation();var e="",t="",i="",n="";switch(s.target.id){case"submissions":e="viewed",t="assigns_submissions",i="chart",n="Chart showing the work submited by the students";break;case"accessContent":e="viewed",t="access_content",i="chart",n="Chart showing the course content accessed by the students";break;default:e="viewed",t="",i="chart",n="A chart"}l.addLogsIntoDB(e,t,i,n)},addLogsIntoDB(s,e,n,o){let a={courseid:i.courseid,userid:i.userid,action:"addLogs",sectionname:"TASKS_MONITORING",actiontype:s,objectType:n,objectName:e,currentUrl:document.location.href,objectDescription:o};t({method:"get",url:M.cfg.wwwroot+"/local/notemyprogress/ajax.php",params:a}).then(s=>{200==s.status&&s.data.ok}).catch(s=>{})}}})}}});
+//# sourceMappingURL=assignments.min.js.map
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
diff --git a/notemyprogress/amd/build/gamification.js b/notemyprogress/amd/build/gamification.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ba1ae7061ea5405269a932cd210be99e41a35be
--- /dev/null
+++ b/notemyprogress/amd/build/gamification.js
@@ -0,0 +1,431 @@
+define([
+  "local_notemyprogress/vue",
+  "local_notemyprogress/vuetify",
+  "local_notemyprogress/axios",
+  "local_notemyprogress/alertify",
+  "local_notemyprogress/pageheader",
+  "local_notemyprogress/chartdynamic",
+], function (Vue, Vuetify, Axios, Alertify, PageHeader, ChartDynamic) {
+  "use strict";
+
+  function init(content) {
+    console.log(content);
+    Vue.use(Vuetify);
+    Vue.component("pageheader", PageHeader);
+    Vue.component("chart", ChartDynamic);
+    const app = new Vue({
+      delimiters: ["[[", "]]"],
+      el: "#gamification",
+      vuetify: new Vuetify(),
+      data: {
+        strings: content.strings,
+        token: content.token,
+        render_has: content.profile_render,
+        ranking: content.ranking,
+        notifications: [],
+        loading: false,
+        tab: null,
+        levelsData: content.levels_data.levelsdata,
+        settings: content.levels_data.settings,
+        rulesData: content.levels_data.rules,
+        courseid: content.levels_data.courseid,
+        userid: content.levels_data.created_by,
+        enable: false,
+        events: content.events,
+        setPointsOption: "calculated",
+        pointsBase: 0,
+        pointsBaseOri: 0,
+        swDisableEnable: content.strings.swValue,
+        spreadData: [],
+        week_resources_categories: [],
+        week_resources_data: [],
+        week_resources_colors: "#FA4641",
+        indicators: content.indicators,
+        chartdata: content.chart_data,
+      },
+
+      beforeMount() {},
+      mounted() {
+        this.pointsBase = +this.settings.pointsbase;
+        this.pointsBaseOri = +this.settings.pointsbase;
+      },
+      computed: {},
+      methods: {
+        get_help_content() {
+          let help_contents = [];
+          let help = new Object();
+          help.title = this.strings.help_title;
+          help.description = this.strings.help_description;
+          help_contents.push(help);
+          return help_contents;
+        },
+        update_dialog(value) {
+          this.dialog = value;
+        },
+        update_help_dialog(value) {
+          this.help_dialog = value;
+        },
+        openHelpSectionModalEvent() {
+          this.saveInteraction(
+            this.pluginSectionName,
+            "viewed",
+            "section_help_dialog",
+            3
+          );
+        },
+        get_timezone() {
+          let information = `${this.strings.change_timezone} ${this.timezone}`;
+          return information;
+        },
+        saveInteraction(component, interaction, target, interactiontype) {
+          let data = {
+            action: "saveinteraction",
+            pluginsection: this.pluginSectionName,
+            component,
+            interaction,
+            target,
+            url: window.location.href,
+            interactiontype,
+            token: this.token,
+          };
+          Axios({
+            method: "post",
+            url: `${M.cfg.wwwroot}/local/notemyprogress/ajax.php`,
+            data: data,
+          })
+            .then((r) => {})
+            .catch((e) => {});
+        },
+        addLevel() {
+          let newLevel = this.levelsData.length + 1;
+          this.levelsData.push({
+            lvl: newLevel,
+            nam: `${this.strings.level} ${newLevel}`,
+            des: ``,
+            points: this.pointsBase * (newLevel - 1),
+          });
+        },
+        removeLevel() {
+          if (this.levelsData.length > 2) {
+            this.levelsData.pop();
+          }
+        },
+        calculatePoints(index) {
+          let points = this.isNumber(this.pointsBase) * index;
+          this.levelsData[index].points = points;
+          return points;
+        },
+        isNumber(x) {
+          if (x === "" || isNaN(x) || x == 0) {
+            return this.pointsBaseOri;
+          }
+          return parseInt(x);
+        },
+        save_changes(logParam) {
+          this.notifications = ["Do you want to save the changes"];
+          Alertify.confirm(this.strings.save_warning_content, () => {
+            this.saveGamificationConfig(logParam);
+            console.log(logParam);
+          }) // ON CONFIRM
+            .set({ title: this.strings.save_warning_title })
+            .set({
+              labels: {
+                cancel: this.strings.confirm_cancel,
+                ok: this.strings.confirm_ok,
+              },
+            });
+        },
+        saveGamificationConfig(logParam) {
+          this.loading = true;
+          let settings = {
+            tit: this.settings.tit,
+            des: this.settings.des,
+            pointsbase: this.pointsBase,
+          };
+          let data = {
+            courseid: this.courseid,
+            userid: this.userid,
+            action: "savegamification",
+            levels: JSON.stringify(this.levelsData),
+            settings: JSON.stringify(settings),
+            rules: JSON.stringify(this.rulesData),
+            token: this.token,
+            enable: this.enable,
+            section: logParam,
+          };
+          let url = { url: window.location.href };
+          Axios({
+            method: "post",
+            url:
+              M.cfg.wwwroot +
+              "/local/notemyprogress/ajax.php?courseid=" +
+              this.courseid +
+              "&userid=" +
+              this.userid +
+              "&action=savegamification&levels=" +
+              data.levels +
+              "&settings=" +
+              data.settings +
+              "&rules=" +
+              data.rules +
+              "&url=" +
+              url.url +
+              "&enable=" +
+              data.enable +
+              "&section=" +
+              data.section,
+            params: data,
+          })
+            .then((response) => {
+              // console.log(response);
+              // console.log(response.status);
+              // console.log(url.url);
+              if (response.status == 200 && response.data.ok) {
+                this.showNotifications(response.data.data, "success");
+              } else {
+                let message =
+                  response.data.error || this.strings.api_error_network;
+                this.showNotifications(message, "error"); //in this line "error" define the kind of message send
+              }
+            })
+            .catch((e) => {
+              let message = e.response.data || this.strings.api_error_network;
+              this.showNotifications(message, "error");
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        },
+        showNotifications(message, type, alert = true, notify = true) {
+          if (alert) this.notifications.push({ message, type });
+          if (notify) Alertify.notify(message, type);
+        },
+        table_headers() {
+          let headers = [
+            { text: this.strings.ranking_text, value: "ranking" },
+            { text: this.strings.level, value: "level" },
+            { text: this.strings.student, value: "student" },
+            { text: this.strings.total, value: "total" },
+            { text: this.strings.progress, value: "progress_percentage" },
+          ];
+          return headers;
+        },
+        addRule() {
+          this.rulesData.push({
+            rule: "",
+            points: 0,
+          });
+        },
+        removeRule(index) {
+          if (this.rulesData.length > 2) {
+            this.rulesData.splice(index, 1);
+          }
+        },
+        disableEnable(swDisableEnable) {
+          //traitement
+          this.enable = swDisableEnable;
+          let data = {
+            courseid: this.courseid,
+            userid: this.userid,
+            action: "saveEnable",
+            enable: this.enable,
+          };
+          Axios({
+            method: "get",
+            url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+            params: data,
+          })
+            .then((response) => {
+              if (response.status == 200 && response.data.ok) {
+                this.showNotifications(response.data.data, "success");
+              } else {
+                let message =
+                  response.data.error || this.strings.api_error_network;
+                this.showNotifications(message, "error"); //in this line "error" define the kind of message send
+              }
+            })
+            .catch((e) => {
+              let message = e.response.data || this.strings.api_error_network;
+              this.showNotifications(message, "error");
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        },
+        //? ////////////////////////////////////////////////////////////////////// ?//
+        //? //////////////////////////// ChartPart /////////////////////////////// ?//
+        //? ////////////////////////////////////////////////////////////////////// ?//
+        chart_spread() {
+          let chart = new Object();
+          chart.chart = {
+            type: "column",
+            backgroundColor: null,
+          };
+          chart.title = {
+            text: this.strings.chartTitle,
+          };
+          chart.colors = ["#118AB2"];
+          (chart.xAxis = {
+            type: "category",
+            labels: {
+              rotation: -45,
+              style: {
+                fontSize: "13px",
+                fontFamily: "Verdana, sans-serif",
+              },
+            },
+          }),
+            (chart.yAxis = {
+              min: 0,
+              title: {
+                text: this.strings.chartYaxis,
+              },
+            });
+          chart.legend = {
+            enabled: false,
+          };
+          (chart.series = [
+            {
+              name: null,
+              data: this.chartdata, //[["level : 1", 1]],
+              dataLabels: {
+                enabled: true,
+                rotation: -90,
+                color: "#FFFFFF",
+                align: "right",
+                format: "{point.y:.1f}", // one decimal
+                y: 10, // 10 pixels down from the top
+                style: {
+                  fontSize: "13px",
+                  fontFamily: "Verdana, sans-serif",
+                },
+              },
+            },
+          ]),
+            console.log("series: ");
+          console.log(chart.series);
+          return chart;
+        },
+        /*
+        build_inverted_time_chart() {
+          console.log("enter build_inverted_time_chart ");
+          //console.log(this.students_planification);
+          //console.log("this.data_report_meta_hours = ");
+          //console.log(this.data_report_meta_hours);
+          let chart = new Object();
+          let meta = new Object();
+          meta = this.chartdata_hours_week_dedication();
+          console.log("meta = ");
+          console.log(meta);
+          let invest = [
+            {
+              name: meta.labels[0],
+              y: meta.datasets[0].data[0],
+            },
+            {
+              name: meta.labels[1],
+              y: meta.datasets[0].data[1],
+            },
+            {
+              name: meta.labels[2],
+              y: meta.datasets[0].data[2],
+            },
+          ];
+          console.log("invest = ");
+          console.log(invest);
+          chart.chart = {
+            type: "bar",
+            backgroundColor: null,
+            style: { fontFamily: "poppins" },
+          };
+          chart.title = { text: null };
+          chart.colors = this.inverted_time_colors;
+          chart.xAxis = {
+            type: "category",
+            crosshair: true,
+          };
+          chart.yAxis = {
+            title: {
+              text: "Framboise",
+            },
+          };
+          chart.tooltip = {
+            shared: true,
+            useHTML: true,
+            formatter: function () {
+              let category_name = this.points[0].key;
+              let time = vue.convert_time(this.y);
+              return `<b>${category_name}: </b>${time}`;
+            },
+          };
+          chart.legend = {
+            enabled: false,
+          };
+          chart.series = [
+            {
+              colorByPoint: true,
+              data: invest,
+            },
+          ];
+          //console.log("this.inverted_time.data = ");
+          //console.log(this.inverted_time.data);
+
+          // console.log("invest = ");
+          // console.log(invest);
+          return chart;
+        },
+        chartdata_hours_week_dedication() {
+          var data = new Object();
+          data.datasets = [];
+
+          let inverted =
+            this.render_has == "teacher"
+              ? this.strings.inverted_time
+              : `${this.strings.myself} ${this.strings.inverted_time}`;
+          let planified =
+            this.render_has == "teacher"
+              ? this.strings.planified_time
+              : `${this.strings.myself} ${this.strings.planified_time}`;
+          data.labels = [inverted, planified];
+          var dataset = new Object();
+          dataset.label = "Horas";
+          //console.log("data_report_meta_hours in chartdata_hours_week_dedication  = ");
+          //console.log(this.data_report_meta_hours);
+          dataset.data = [
+            parseFloat(this.data_report_meta_hours.horas_trabajadas),
+            parseInt(this.data_report_meta_hours.horas_planificadas),
+          ];
+          dataset.backgroundColor = ["#ffa700", "#a0c2fa"];
+          dataset.borderWidth = 0;
+          data.datasets.push(dataset);
+
+          //if (this.render_has == "student" && this.compare_with_course) {
+          data.labels.splice(1, 0, this.strings.inverted_time_course);
+          //data.labels.splice(3, 0, this.strings.planified_time_course);
+          dataset.data.splice(
+            1,
+            0,
+            parseFloat(this.course_report_hours.horas_trabajadas)
+          );
+          // dataset.data.splice(
+          //   3,
+          //   0,
+          //   parseFloat(this.course_report_hours.horas_planificadas)
+          // );
+          dataset.backgroundColor.splice(1, 0, "#ffa700");
+          //dataset.backgroundColor.splice(3, 0, "#a0c2fa");
+          //}
+          //console.log("data_report_meta_hours = ");
+          //console.log(this.data_report_meta_hours);
+
+          //console.log("data = ");
+          //console.log(data);
+          return data;
+        },*/
+      },
+    });
+  }
+  return {
+    init: init,
+  };
+});
diff --git a/notemyprogress/amd/build/listener.min.js b/notemyprogress/amd/build/listener.min.js
index 39c3b1a9a90cc0385a9174e8eddfc89de14df846..ebc131aa87cd97b1cd55b6ba818e52d66d6268f1 100644
--- a/notemyprogress/amd/build/listener.min.js
+++ b/notemyprogress/amd/build/listener.min.js
@@ -4,7 +4,11 @@ define([], function () {
       document
         .querySelector("#downloadButton")
         .addEventListener("click", function () {
+<<<<<<< HEAD
           //console.log("clicked !");
+=======
+          console.log("clicked !");
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
         });
     },
   };
diff --git a/notemyprogress/amd/build/student_gamification.js b/notemyprogress/amd/build/student_gamification.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7fb47847300386cc9b36ae99c5382f37b04e6d9
--- /dev/null
+++ b/notemyprogress/amd/build/student_gamification.js
@@ -0,0 +1,135 @@
+define([
+  "local_notemyprogress/vue",
+  "local_notemyprogress/vuetify",
+  "local_notemyprogress/axios",
+  "local_notemyprogress/alertify",
+  "local_notemyprogress/pageheader",
+], function (Vue, Vuetify, Axios, Alertify, PageHeader) {
+  "use strict";
+
+  function init(content) {
+    // console.log(content);
+    Vue.use(Vuetify);
+    Vue.component("pageheader", PageHeader);
+    const app = new Vue({
+      delimiters: ["[[", "]]"],
+      el: "#student_gamification",
+      vuetify: new Vuetify(),
+      data: {
+        strings: content.strings,
+        token: content.token,
+        render_has: content.profile_render,
+        indicators: content.indicators,
+        levelInfo: content.indicators.levelInfo,
+        activity: content.indicators.activity,
+        courseid: content.indicators.cid,
+        userid: content.indicators.uid,
+        ranking: content.ranking,
+        tab: null,
+        levelsData: content.levels_data.levelsdata,
+        settings: content.levels_data.settings,
+        error_messages: [],
+        save_successful: false,
+      },
+      beforeMount() {
+        let data = {
+          courseid: this.courseid,
+          userid: this.userid,
+          action: "studentGamificationViewed",
+        };
+        Axios({
+          method: "get",
+          url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+          params: data,
+        });
+      },
+      computed: {},
+      methods: {
+        get_help_content() {
+          let help_contents = [];
+          let help = new Object();
+          help.title = this.strings.help_title;
+          help.description = this.strings.help_description;
+          help_contents.push(help);
+          return help_contents;
+        },
+        update_dialog(value) {
+          this.dialog = value;
+        },
+        update_help_dialog(value) {
+          this.help_dialog = value;
+        },
+        openHelpSectionModalEvent() {
+          this.saveInteraction(
+            this.pluginSectionName,
+            "viewed",
+            "section_help_dialog",
+            3
+          );
+        },
+        get_timezone() {
+          let information = `${this.strings.change_timezone} ${this.timezone}`;
+          return information;
+        },
+        saveInteraction(component, interaction, target, interactiontype) {
+          let data = {
+            action: "saveinteraction",
+            pluginsection: this.pluginSectionName,
+            component,
+            interaction,
+            target,
+            url: window.location.href,
+            interactiontype,
+            token: content.token,
+          };
+          Axios({
+            method: "post",
+            url: `${M.cfg.wwwroot}/local/notemyprogress/ajax.php`,
+            data: data,
+          })
+            .then((r) => {})
+            .catch((e) => {});
+        },
+        table_headers() {
+          let headers = [
+            { text: this.strings.ranking_text, value: "ranking" },
+            { text: this.strings.level, value: "level" },
+            { text: this.strings.student, value: "student" },
+            { text: this.strings.total, value: "total" },
+            { text: this.strings.progress, value: "progress_percentage" },
+          ];
+          return headers;
+        },
+
+        activateRanking() {
+          location.reload();
+          //console.log(" cid : " + this.courseid + " UID : " + this.userid);
+          let data = {
+            action: "rankable",
+            pluginsection: this.pluginSectionName,
+            url: window.location.href,
+            token: content.token,
+            courseid: this.courseid,
+            userid: this.userid,
+          };
+          Axios({
+            method: "post",
+            url:
+              `${M.cfg.wwwroot}/local/notemyprogress/ajax.php?courseid=` +
+              this.courseid +
+              "&userid=" +
+              this.userid,
+            params: data,
+          })
+            .then((r) => {
+              // console.log(r);
+            })
+            .catch((e) => {});
+        },
+      },
+    });
+  }
+  return {
+    init: init,
+  };
+});
diff --git a/notemyprogress/amd/build/teacher.js b/notemyprogress/amd/build/teacher.js
new file mode 100644
index 0000000000000000000000000000000000000000..59e8e40d2f52b57d58a94dc6da977a237f792f03
--- /dev/null
+++ b/notemyprogress/amd/build/teacher.js
@@ -0,0 +1,305 @@
+define([
+  "local_notemyprogress/vue",
+  "local_notemyprogress/vuetify",
+  "local_notemyprogress/axios",
+  "local_notemyprogress/pagination",
+  "local_notemyprogress/chartstatic",
+  "local_notemyprogress/pageheader",
+  "local_notemyprogress/helpdialog",
+], function (
+  Vue,
+  Vuetify,
+  Axios,
+  Pagination,
+  ChartStatic,
+  PageHeader,
+  HelpDialog
+) {
+  "use strict";
+
+  function init(content) {
+    // console.log(content);
+    Vue.use(Vuetify);
+    Vue.component("pagination", Pagination);
+    Vue.component("chart", ChartStatic);
+    Vue.component("pageheader", PageHeader);
+    Vue.component("helpdialog", HelpDialog);
+    let vue = new Vue({
+      delimiters: ["[[", "]]"],
+      el: "#teacher",
+      vuetify: new Vuetify(),
+      data() {
+        return {
+          strings: content.strings,
+          groups: content.groups,
+          userid: content.userid,
+          courseid: content.courseid,
+          timezone: content.timezone,
+          render_has: content.profile_render,
+
+          indicators: content.indicators,
+          week_resources_colors: content.week_resources_colors,
+          search: null,
+          week_resources_categories: [],
+          week_resources_data: [],
+
+          help_dialog: false,
+          help_contents: [],
+        };
+      },
+      beforeMount() {
+        this.calculate_week_resources();
+      },
+      mounted() {
+        document.querySelector("#sessions-loader").style.display = "none";
+        document.querySelector("#teacher").style.display = "block";
+      },
+      methods: {
+        get_help_content() {
+          let contents = [];
+          contents.push({
+            title: this.strings.section_help_title,
+            description: this.strings.section_help_description,
+          });
+          return contents;
+        },
+
+        get_course_grade() {
+          let grade = Number(this.indicators.course.grademax);
+          return this.isInt(grade) ? grade : grade.toFixed(2);
+        },
+
+        calculate_week_resources() {
+          let categories = [],
+            data = [];
+          let week_name;
+          this.indicators.weeks.forEach((week) => {
+            week_name = `${week.name} ${week.position + 1}`;
+            categories.push(week_name);
+            data.push(week.cms);
+          });
+          let name = this.capitalizeFirstLetter(
+            this.strings.teacher_indicators_modules
+          );
+          this.week_resources_categories = categories;
+          this.week_resources_data = [{ name, data }];
+        },
+
+        build_week_resources_chart() {
+          let chart = new Object();
+          chart.chart = {
+            type: "bar",
+            backgroundColor: null,
+            style: { fontFamily: "poppins" },
+          };
+          chart.title = {
+            text: null,
+          };
+          chart.colors = this.week_resources_colors;
+          chart.xAxis = {
+            categories: this.week_resources_categories,
+          };
+          chart.yAxis = {
+            min: 0,
+            title: {
+              text: this.strings.teacher_indicators_week_resources_yaxis_title,
+            },
+          };
+          chart.legend = {
+            enabled: false,
+          };
+          chart.series = this.week_resources_data;
+          console.log(chart.series);
+          return chart;
+        },
+
+        build_weeks_sessions_chart() {
+          let chart = new Object();
+          chart.chart = {
+            type: "heatmap",
+            backgroundColor: null,
+            style: { fontFamily: "poppins" },
+          };
+          chart.title = {
+            text: null,
+          };
+          chart.xAxis = {
+            categories: this.strings.weeks,
+          };
+          chart.yAxis = {
+            categories: this.indicators.sessions.categories,
+            title: null,
+            reversed: true,
+          };
+          chart.colorAxis = {
+            min: 0,
+            minColor: "#E0E0E0",
+            maxColor: "#118AB2",
+          };
+          chart.legend = {
+            layout: "horizontal",
+            verticalAlign: "bottom",
+          };
+          chart.tooltip = {
+            formatter: function () {
+              let days =
+                vue.indicators.sessions.weeks[this.point.y][this.point.x] || "";
+              let xCategoryName = vue.get_point_category_name(this.point, "x");
+              let yCategoryName = vue.get_point_category_name(this.point, "y");
+              let label = vue.strings.teacher_indicators_sessions;
+              if (this.point.value == 1) {
+                label = vue.strings.teacher_indicators_session;
+              }
+              return (
+                "<b>" +
+                yCategoryName +
+                " " +
+                xCategoryName +
+                "</b>: " +
+                this.point.value +
+                " " +
+                label +
+                "<br/>" +
+                days
+              );
+            },
+          };
+          chart.series = [
+            {
+              borderWidth: 2,
+              borderColor: "#FAFAFA",
+              data: this.indicators.sessions.data,
+            },
+          ];
+          return chart;
+        },
+
+        table_headers() {
+          let headers = [
+            { text: "", value: "id", align: "center", sortable: false },
+            { text: this.strings.thead_name, value: "firstname" },
+            { text: this.strings.thead_lastname, value: "lastname" },
+            { text: this.strings.thead_email, value: "email" },
+            {
+              text: this.strings.thead_progress,
+              value: "progress_percentage",
+              align: "center",
+            },
+            {
+              text: this.strings.thead_sessions,
+              value: "sessions_number",
+              align: "center",
+            },
+            {
+              text: this.strings.thead_time,
+              value: "inverted_time",
+              align: "center",
+            },
+          ];
+          return headers;
+        },
+
+        get_picture_url(userid) {
+          let url = `${M.cfg.wwwroot}/user/pix.php?file=/${userid}/f1.jpg`;
+          return url;
+        },
+
+        get_percentage_progress(value) {
+          return `${value} %`;
+        },
+
+        get_progress_tooltip(item) {
+          let module_label = this.strings.teacher_indicators_modules;
+          let finished_label = this.strings.teacher_indicators_finished;
+          if (item.cms.complete == 1) {
+            module_label = this.strings.teacher_indicators_module;
+            finished_label = this.strings.teacher_indicators_finalized;
+          }
+          return `${item.cms.complete} ${module_label} ${finished_label} ${this.strings.of_conector} ${item.cms.total}`;
+        },
+
+        get_point_category_name(point, dimension) {
+          let series = point.series,
+            isY = dimension === "y",
+            axis = series[isY ? "yAxis" : "xAxis"];
+          return axis.categories[point[isY ? "y" : "x"]];
+        },
+
+        capitalizeFirstLetter(string) {
+          return string.charAt(0).toUpperCase() + string.slice(1);
+        },
+
+        isInt(n) {
+          return n % 1 === 0;
+        },
+
+        open_chart_help(chart) {
+          let contents = [];
+          if (chart == "week_resources") {
+            contents.push({
+              title: this.strings.week_resources_help_title,
+              description: this.strings.week_resources_help_description_p1,
+            });
+            contents.push({
+              description: this.strings.week_resources_help_description_p2,
+            });
+          } else if (chart == "weeks_sessions") {
+            contents.push({
+              title: this.strings.weeks_sessions_help_title,
+              description: this.strings.week_sessions_help_description_p1,
+            });
+            contents.push({
+              description: this.strings.week_sessions_help_description_p2,
+            });
+          } else if (chart == "progress_table") {
+            contents.push({
+              title: this.strings.progress_table_help_title,
+              description: this.strings.progress_table_help_description,
+            });
+          }
+          this.help_contents = contents;
+          if (this.help_contents.length) {
+            this.help_dialog = true;
+          }
+        },
+
+        update_help_dialog(value) {
+          this.help_dialog = value;
+        },
+
+        get_timezone() {
+          let information = `${this.strings.ss_change_timezone} ${this.timezone}`;
+          return information;
+        },
+
+        addLogsIntoDB(action, objectName, objectType, objectDescription) {
+          let data = {
+            courseid: content.courseid,
+            userid: content.userid,
+            action: "addLogs",
+            sectionname: "TEACHER_GENERAL_INDICATORS",
+            actiontype: action,
+            objectType: objectType,
+            objectName: objectName,
+            currentUrl: document.location.href,
+            objectDescription: objectDescription,
+          };
+          Axios({
+            method: "get",
+            url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+            params: data,
+          })
+            .then((response) => {
+              if (response.status == 200 && response.data.ok) {
+              }
+            })
+            .catch((e) => {});
+        },
+      },
+    });
+  }
+
+  return {
+    init: init,
+  };
+});
diff --git a/notemyprogress/amd/build/teacher.min.js b/notemyprogress/amd/build/teacher.min.js
deleted file mode 100644
index 7b49e25001efbe51976e1ee2eb2274b2f88de329..0000000000000000000000000000000000000000
--- a/notemyprogress/amd/build/teacher.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-define(["local_notemyprogress/vue","local_notemyprogress/vuetify","local_notemyprogress/axios","local_notemyprogress/pagination","local_notemyprogress/chartstatic","local_notemyprogress/pageheader","local_notemyprogress/helpdialog"],function(e,t,s,i,r,o,n){"use strict";return{init:function(a){e.use(t),e.component("pagination",i),e.component("chart",r),e.component("pageheader",o),e.component("helpdialog",n);let l=new e({delimiters:["[[","]]"],el:"#teacher",vuetify:new t,data:()=>({strings:a.strings,groups:a.groups,userid:a.userid,courseid:a.courseid,timezone:a.timezone,render_has:a.profile_render,indicators:a.indicators,week_resources_colors:a.week_resources_colors,search:null,week_resources_categories:[],week_resources_data:[],help_dialog:!1,help_contents:[]}),beforeMount(){this.calculate_week_resources()},mounted(){document.querySelector("#sessions-loader").style.display="none",document.querySelector("#teacher").style.display="block"},methods:{get_help_content(){let e=[];return e.push({title:this.strings.section_help_title,description:this.strings.section_help_description}),e},get_course_grade(){let e=Number(this.indicators.course.grademax);return this.isInt(e)?e:e.toFixed(2)},calculate_week_resources(){let e,t=[],s=[];this.indicators.weeks.forEach(i=>{e=`${i.name} ${i.position+1}`,t.push(e),s.push(i.cms)});let i=this.capitalizeFirstLetter(this.strings.teacher_indicators_modules);this.week_resources_categories=t,this.week_resources_data=[{name:i,data:s}]},build_week_resources_chart(){let e=new Object;return e.chart={type:"bar",backgroundColor:null,style:{fontFamily:"poppins"}},e.title={text:null},e.colors=this.week_resources_colors,e.xAxis={categories:this.week_resources_categories},e.yAxis={min:0,title:{text:this.strings.teacher_indicators_week_resources_yaxis_title}},e.legend={enabled:!1},e.series=this.week_resources_data,e},build_weeks_sessions_chart(){let e=new Object;return e.chart={type:"heatmap",backgroundColor:null,style:{fontFamily:"poppins"}},e.title={text:null},e.xAxis={categories:this.strings.weeks},e.yAxis={categories:this.indicators.sessions.categories,title:null,reversed:!0},e.colorAxis={min:0,minColor:"#E0E0E0",maxColor:"#118AB2"},e.legend={layout:"horizontal",verticalAlign:"bottom"},e.tooltip={formatter:function(){let e=l.indicators.sessions.weeks[this.point.y][this.point.x]||"",t=l.get_point_category_name(this.point,"x"),s=l.get_point_category_name(this.point,"y"),i=l.strings.teacher_indicators_sessions;return 1==this.point.value&&(i=l.strings.teacher_indicators_session),"<b>"+s+" "+t+"</b>: "+this.point.value+" "+i+"<br/>"+e}},e.series=[{borderWidth:2,borderColor:"#FAFAFA",data:this.indicators.sessions.data}],e},table_headers(){return[{text:"",value:"id",align:"center",sortable:!1},{text:this.strings.thead_name,value:"firstname"},{text:this.strings.thead_lastname,value:"lastname"},{text:this.strings.thead_email,value:"email"},{text:this.strings.thead_progress,value:"progress_percentage",align:"center"},{text:this.strings.thead_sessions,value:"sessions_number",align:"center"},{text:this.strings.thead_time,value:"inverted_time",align:"center"}]},get_picture_url:e=>`${M.cfg.wwwroot}/user/pix.php?file=/${e}/f1.jpg`,get_percentage_progress:e=>`${e} %`,get_progress_tooltip(e){let t=this.strings.teacher_indicators_modules,s=this.strings.teacher_indicators_finished;return 1==e.cms.complete&&(t=this.strings.teacher_indicators_module,s=this.strings.teacher_indicators_finalized),`${e.cms.complete} ${t} ${s} ${this.strings.of_conector} ${e.cms.total}`},get_point_category_name(e,t){let s="y"===t;return e.series[s?"yAxis":"xAxis"].categories[e[s?"y":"x"]]},capitalizeFirstLetter:e=>e.charAt(0).toUpperCase()+e.slice(1),isInt:e=>e%1==0,open_chart_help(e){let t=[];"week_resources"==e?(t.push({title:this.strings.week_resources_help_title,description:this.strings.week_resources_help_description_p1}),t.push({description:this.strings.week_resources_help_description_p2})):"weeks_sessions"==e?(t.push({title:this.strings.weeks_sessions_help_title,description:this.strings.week_sessions_help_description_p1}),t.push({description:this.strings.week_sessions_help_description_p2})):"progress_table"==e&&t.push({title:this.strings.progress_table_help_title,description:this.strings.progress_table_help_description}),this.help_contents=t,this.help_contents.length&&(this.help_dialog=!0)},update_help_dialog(e){this.help_dialog=e},get_timezone(){return`${this.strings.ss_change_timezone} ${this.timezone}`},addLogsIntoDB(e,t,i,r){let o={courseid:a.courseid,userid:a.userid,action:"addLogs",sectionname:"TEACHER_GENERAL_INDICATORS",actiontype:e,objectType:i,objectName:t,currentUrl:document.location.href,objectDescription:r};s({method:"get",url:M.cfg.wwwroot+"/local/notemyprogress/ajax.php",params:o}).then(e=>{200==e.status&&e.data.ok}).catch(e=>{})}}})}}});
-//# sourceMappingURL=teacher.min.js.map
diff --git a/notemyprogress/amd/src/logs.js b/notemyprogress/amd/src/logs.js
index 11f3883b60293bf7ae8fb7f7e14bb168c131588f..edc81115e83e526f5c3d83be4a402cbbe5afa8ca 100644
--- a/notemyprogress/amd/src/logs.js
+++ b/notemyprogress/amd/src/logs.js
@@ -2,305 +2,379 @@
 @author 2021 Éric Bart <bart.eric@hotmail.com>
  */
 
-define(["local_notemyprogress/vue",
-    "local_notemyprogress/vuetify",
-    "local_notemyprogress/axios",
-    "local_notemyprogress/moment",
-    "local_notemyprogress/pagination",
-    "local_notemyprogress/pageheader",
-    "local_notemyprogress/helpdialog",
-    "local_notemyprogress/alertify",
-
-],
-    function (Vue, Vuetify, Axios, Moment, Pagination, Pageheader, HelpDialog, Alertify) {
-        "use strict";
-
-        function init(content) {
-            const timeout = 60 * 120 * 1000
-            Axios.defaults.timeout = timeout
-            Vue.use(Vuetify);
-            Vue.component('pagination', Pagination);
-            Vue.component('pageheader', Pageheader);
-            Vue.component('helpdialog', HelpDialog);
-            let vue = new Vue({
-                delimiters: ["[[", "]]"],
-                el: "#logs",
-                vuetify: new Vuetify(),
-                data() {
-                    return {
-                        calendarData: {},
-                        strings: content.strings,
-                        groups: content.groups,
-                        userid: content.userid,
-                        courseid: content.courseid,
-                        timezone: content.timezone,
-                        render_has: content.profile_render,
-                        courseRole: content.courseRole,
-                        loading: false,
-                        errors: [],
-                        pages: content.pages,
-                        help_dialog: false,
-                        help_contents: [],
-                        dateRules: [
-                            v => !!v || this.strings.logs_invalid_date
-                        ]
+define([
+  "local_notemyprogress/vue",
+  "local_notemyprogress/vuetify",
+  "local_notemyprogress/axios",
+  "local_notemyprogress/moment",
+  "local_notemyprogress/pagination",
+  "local_notemyprogress/pageheader",
+  "local_notemyprogress/helpdialog",
+  "local_notemyprogress/alertify",
+], function (
+  Vue,
+  Vuetify,
+  Axios,
+  Moment,
+  Pagination,
+  Pageheader,
+  HelpDialog,
+  Alertify
+) {
+  "use strict";
 
+  function init(content) {
+    const timeout = 60 * 120 * 1000;
+    Axios.defaults.timeout = timeout;
+    Vue.use(Vuetify);
+    Vue.component("pagination", Pagination);
+    Vue.component("pageheader", Pageheader);
+    Vue.component("helpdialog", HelpDialog);
+    let vue = new Vue({
+      delimiters: ["[[", "]]"],
+      el: "#logs",
+      vuetify: new Vuetify(),
+      data() {
+        return {
+          calendarData: {},
+          strings: content.strings,
+          groups: content.groups,
+          userid: content.userid,
+          courseid: content.courseid,
+          timezone: content.timezone,
+          render_has: content.profile_render,
+          courseRole: content.courseRole,
+          loading: false,
+          errors: [],
+          pages: content.pages,
+          help_dialog: false,
+          help_contents: [],
+          dateRules: [(v) => !!v || this.strings.logs_invalid_date],
+        };
+      },
+      beforeMount() {
+        document.querySelector("#downloadButtonMoodle").style.display = "none";
+        document.querySelector("#downloadButtonNMP").style.display = "none";
+      },
+      mounted() {
+        document.querySelector(".v-application--wrap").style.minHeight = "60vh";
+        document.querySelector("#sessions-loader").style.display = "none";
+        document.querySelector("#helpMoodle").style.display = "block";
+        document.querySelector("#helpNMP").style.display = "block";
+        document.querySelector("#downloadButtonMoodle").style.display = "block";
+        document.querySelector("#downloadButtonNMP").style.display = "block";
+      },
+      methods: {
+        get_Moodlefile() {
+          let lastDate = document.querySelector("#lastDateMoodle");
+          let beginDate = document.querySelector("#beginDateMoodle");
+          let timestampBeginDate = 0;
+          let timestampLastDate = 0;
+          let parsedBeginDate = [];
+          let parsedLastDate = [];
+          this.url = false;
+          this.loading = true;
+          var data = {
+            action: "downloadMOODLElogs",
+            courseid: this.courseid,
+            userid: this.userid,
+            beginDate: beginDate.value,
+            lastDate: lastDate.value,
+            currentUrl: window.location.href,
+          };
+          if (beginDate.value != "" && lastDate.value != "") {
+            parsedBeginDate = beginDate.value.split("-");
+            timestampBeginDate = new Date(
+              parsedBeginDate[0],
+              parsedBeginDate[1] - 1,
+              parsedBeginDate[2]
+            );
+            parsedLastDate = lastDate.value.split("-");
+            timestampLastDate = new Date(
+              parsedLastDate[0],
+              parsedLastDate[1] - 1,
+              parsedLastDate[2]
+            );
+            if (timestampBeginDate.getTime() <= timestampLastDate.getTime()) {
+              if (timestampBeginDate.getTime() <= Date.now()) {
+                document.querySelector("#downloadButtonMoodle").innerHTML =
+                  this.strings.logs_download_btn;
+                document.getElementById("downloadButtonMoodle").disabled = true;
+                Axios({
+                  method: "get",
+                  url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+                  timeout: timeout,
+                  params: data,
+                })
+                  .then((response) => {
+                    this.loading = false;
+                    if (response.status == 200 && response.data.ok) {
+                      let jsonData = response.data.data.jsonData;
+                      jsonData = jsonData.map((row) => ({
+                        Role: row.user.role,
+                        Email: row.user.email,
+                        Fullname: row.user.firstname + " " + row.user.lastname,
+                        Date: row.time.date,
+                        Hour: row.time.hour,
+                        ACTION_VERB: row.action.actionverb,
+                        CourseID: row.course.courseid,
+                        CourseName: row.course.coursename,
+                        OBJECT_ID: row.action.objectid,
+                        OBJECT_NAME: row.action.objectname,
+                        OBJECT_TYPE: row.action.objecttype,
+                      }));
+                      let csvData = vue.objectToCSV(jsonData);
+                      vue.downloadCSV(csvData, "Activity_Moodle");
+                      document.querySelector(
+                        "#downloadButtonMoodle"
+                      ).innerHTML = this.strings.logs_valid_Moodlebtn;
+                      document.getElementById(
+                        "downloadButtonMoodle"
+                      ).disabled = false;
+                      Alertify.success(
+                        this.strings.logs_success_file_downloaded
+                      );
+                    } else {
+                      Alertify.error(
+                        this.strings.logs_error_problem_encountered
+                      );
+                      document.querySelector(
+                        "#downloadButtonMoodle"
+                      ).innerHTML = this.strings.logs_valid_Moodlebtn;
+                      document.getElementById(
+                        "downloadButtonMoodle"
+                      ).disabled = false;
                     }
-                },
-                beforeMount() {
-                    document.querySelector("#downloadButtonMoodle").style.display = "none";
-                    document.querySelector("#downloadButtonNMP").style.display = "none";
-                },
-                mounted() {
-                    document.querySelector(".v-application--wrap").style.minHeight = "60vh";
-                    document.querySelector("#sessions-loader").style.display = "none";
-                    document.querySelector("#helpMoodle").style.display = "block";
-                    document.querySelector("#helpNMP").style.display = "block";
-                    document.querySelector("#downloadButtonMoodle").style.display = "block";
-                    document.querySelector("#downloadButtonNMP").style.display = "block";
-                },
-                methods: {
-                    get_Moodlefile() {
-                        let lastDate = document.querySelector("#lastDateMoodle");
-                        let beginDate = document.querySelector("#beginDateMoodle");
-                        let timestampBeginDate = 0;
-                        let timestampLastDate = 0;
-                        let parsedBeginDate = [];
-                        let parsedLastDate = [];
-                        this.url = false;
-                        this.loading = true;
-                        var data = {
-                            action: "downloadMOODLElogs",
-                            courseid: this.courseid,
-                            userid: this.userid,
-                            beginDate: beginDate.value,
-                            lastDate: lastDate.value,
-                            currentUrl: window.location.href,
-                        }
-                        if (beginDate.value != "" && lastDate.value != "") {
-                            parsedBeginDate = beginDate.value.split("-");
-                            timestampBeginDate = new Date(parsedBeginDate[0], parsedBeginDate[1] - 1, parsedBeginDate[2]);
-                            parsedLastDate = lastDate.value.split("-");
-                            timestampLastDate = new Date(parsedLastDate[0], parsedLastDate[1] - 1, parsedLastDate[2]);
-                            if (timestampBeginDate.getTime() <= timestampLastDate.getTime()) {
-                                if (timestampBeginDate.getTime() <= Date.now()) {
-                                    document.querySelector('#downloadButtonMoodle').innerHTML = this.strings.logs_download_btn;
-                                    document.getElementById('downloadButtonMoodle').disabled = true;
-                                    Axios({
-                                        method: 'get',
-                                        url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
-                                        timeout: timeout,
-                                        params: data,
-                                    }).then((response) => {
-                                        this.loading = false
-                                        if (response.status == 200 && response.data.ok) {
-                                            let jsonData = response.data.data.jsonData;
-                                            jsonData = jsonData.map(row => ({
-                                                Role: row.user.role,
-                                                Email: row.user.email,
-                                                Fullname: row.user.firstname + ' ' + row.user.lastname,
-                                                Date: row.time.date,
-                                                Hour: row.time.hour,
-                                                ACTION_VERB: row.action.actionverb,
-                                                CourseID: row.course.courseid,
-                                                CourseName: row.course.coursename,
-                                                OBJECT_ID: row.action.objectid,
-                                                OBJECT_NAME: row.action.objectname,
-                                                OBJECT_TYPE: row.action.objecttype
-                                            }));
-                                            let csvData = vue.objectToCSV(jsonData);
-                                            vue.downloadCSV(csvData, "Activity_Moodle");
-                                            document.querySelector('#downloadButtonMoodle').innerHTML = this.strings.logs_valid_Moodlebtn;
-                                            document.getElementById('downloadButtonMoodle').disabled = false;
-                                            Alertify.success(this.strings.logs_success_file_downloaded);
-                                        } else {
-                                            Alertify.error(this.strings.logs_error_problem_encountered);
-                                            document.querySelector('#downloadButtonMoodle').innerHTML = this.strings.logs_valid_Moodlebtn;
-                                            document.getElementById('downloadButtonMoodle').disabled = false;
-                                        }
-                                    }).catch((e) => {
-                                        Alertify.error(this.strings.logs_error_problem_encountered);
-                                        this.loading = false;
-                                        document.querySelector('#downloadButtonMoodle').innerHTML = this.strings.logs_valid_Moodlebtn;
-                                        document.getElementById('downloadButtonMoodle').disabled = false;
-                                    }).finally(() => {
-                                        this.loading = false;
-                                        document.querySelector('#downloadButtonMoodle').innerHTML = this.strings.logs_valid_Moodlebtn;
-                                        document.getElementById('downloadButtonMoodle').disabled = false;
-                                    });
-                                } else {
-                                    Alertify.error(this.strings.logs_error_begin_date_superior);
-                                }
-                            } else {
-                                Alertify.error(this.strings.logs_error_begin_date_inferior);
-                            }
-                        } else {
-                            Alertify.error(this.strings.logs_error_empty_dates);
-                        }
-                    },
-
-                    objectToCSV(jsonData) {
-                        let csvRows = [];
+                  })
+                  .catch((e) => {
+                    Alertify.error(this.strings.logs_error_problem_encountered);
+                    this.loading = false;
+                    document.querySelector("#downloadButtonMoodle").innerHTML =
+                      this.strings.logs_valid_Moodlebtn;
+                    document.getElementById(
+                      "downloadButtonMoodle"
+                    ).disabled = false;
+                  })
+                  .finally(() => {
+                    this.loading = false;
+                    document.querySelector("#downloadButtonMoodle").innerHTML =
+                      this.strings.logs_valid_Moodlebtn;
+                    document.getElementById(
+                      "downloadButtonMoodle"
+                    ).disabled = false;
+                  });
+              } else {
+                Alertify.error(this.strings.logs_error_begin_date_superior);
+              }
+            } else {
+              Alertify.error(this.strings.logs_error_begin_date_inferior);
+            }
+          } else {
+            Alertify.error(this.strings.logs_error_empty_dates);
+          }
+        },
 
-                        let headers = Object.keys(jsonData[0]);
-                        csvRows.push(headers.join(';'));
+        objectToCSV(jsonData) {
+          let csvRows = [];
 
-                        for (const row of jsonData) {
-                            const values = headers.map(header => {
-                                const escaped = ('' + row[header]).replace(/"/g, '\\"');
-                                return `"${escaped}"`;
-                            })
-                            csvRows.push(values.join(';'));
-                        }
+          let headers = Object.keys(jsonData[0]);
+          csvRows.push(headers.join(";"));
 
-                        return csvRows.join('\n');
-                    },
+          for (const row of jsonData) {
+            const values = headers.map((header) => {
+              const escaped = ("" + row[header]).replace(/"/g, '\\"');
+              return `"${escaped}"`;
+            });
+            csvRows.push(values.join(";"));
+          }
 
-                    downloadCSV(data, documentName) {
-                        let blob = new Blob([data], { type: 'text/csv' });
-                        let url = window.URL.createObjectURL(blob);
-                        const a = document.createElement('a');
-                        a.setAttribute('hidden', '');
-                        a.setAttribute('href', url);
-                        a.setAttribute('download', documentName + '.csv');
-                        document.body.appendChild(a);
-                        a.click();
-                        document.body.removeChild(a);
-                    },
+          return csvRows.join("\n");
+        },
 
-                    getRapport() {
-                        Alertify.confirm(this.strings.logs_download_details_description,
-                            () => {
-                                let path = M.cfg.wwwroot + "/local/notemyprogress/downloads/Details_Informations_LogsNMP.pdf";
-                                var link = document.createElement('a');
-                                link.href = path;
-                                link.download = "Details_Informations_LogsNMP.pdf";
-                                link.click();
-                                Alertify.success(this.strings.logs_download_details_validation);
-                            }).set({ title: this.strings.logs_download_details_title })
-                            .set({ labels: { cancel: this.strings.logs_download_details_cancel, ok: this.strings.logs_download_details_ok } });
-                    },
+        downloadCSV(data, documentName) {
+          let blob = new Blob([data], { type: "text/csv" });
+          let url = window.URL.createObjectURL(blob);
+          const a = document.createElement("a");
+          a.setAttribute("hidden", "");
+          a.setAttribute("href", url);
+          a.setAttribute("download", documentName + ".csv");
+          document.body.appendChild(a);
+          a.click();
+          document.body.removeChild(a);
+        },
 
-                    get_NMPfile() {
-                        let lastDate = document.querySelector("#lastDateNMP");
-                        let beginDate = document.querySelector("#beginDateNMP");
-                        let timestampBeginDate = 0;
-                        let timestampLastDate = 0;
-                        let parsedBeginDate = [];
-                        let parsedLastDate = [];
-                        this.url = false;
-                        this.loading = true;
-                        var data = {
-                            action: "downloadNMPlogs",
-                            courseid: this.courseid,
-                            userid: this.userid,
-                            beginDate: beginDate.value,
-                            lastDate: lastDate.value,
-                            currentUrl: window.location.href,
-                        }
-                        if (beginDate.value != "" && lastDate.value != "") {
-                            parsedBeginDate = beginDate.value.split("-");
-                            timestampBeginDate = new Date(parsedBeginDate[0], parsedBeginDate[1] - 1, parsedBeginDate[2]);
-                            parsedLastDate = lastDate.value.split("-");
-                            timestampLastDate = new Date(parsedLastDate[0], parsedLastDate[1] - 1, parsedLastDate[2]);
-                            if (timestampBeginDate.getTime() <= timestampLastDate.getTime()) {
-                                if (timestampBeginDate.getTime() <= Date.now()) {
-                                    document.querySelector('#downloadButtonNMP').innerHTML = this.strings.logs_download_btn;
-                                    document.getElementById('downloadButtonNMP').disabled = true;
-                                    Axios({
-                                        method: 'get',
-                                        url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
-                                        timeout: timeout,
-                                        params: data,
-                                    }).then((response) => {
-                                        this.loading = false
-                                        if (response.status == 200 && response.data.ok) {
-                                            if (beginDate.value != "" || lastDate.value != "") {
-                                                let jsonData = response.data.data.jsonData;
-                                                jsonData = jsonData.map(row => ({
-                                                    Role: row.user.role,
-                                                    Email: row.user.email,
-                                                    Username: row.user.username,
-                                                    Fullname: row.user.fullname,
-                                                    Date: row.time.date,
-                                                    Hour: row.time.hour,
-                                                    CourseID: row.course.courseid,
-                                                    SECTION_NAME: row.action.sectionname,
-                                                    ACTION_TYPE: row.action.actiontype
-                                                }));
-                                                let csvData = vue.objectToCSV(jsonData);
-                                                vue.downloadCSV(csvData, "Activity_NoteMyProgress");
-                                                document.querySelector('#downloadButtonNMP').innerHTML = this.strings.logs_valid_NMPbtn;
-                                                document.getElementById('downloadButtonNMP').disabled = false;
-                                                Alertify.success(this.strings.logs_success_file_downloaded);
-                                            }
-                                        } else {
-                                            Alertify.error(this.strings.logs_error_problem_encountered);
-                                            document.querySelector('#downloadButtonNMP').innerHTML = this.strings.logs_valid_NMPbtn;
-                                            document.getElementById('downloadButtonNMP').disabled = false;
-                                        }
-                                    }).catch((e) => {
-                                        Alertify.error(this.strings.logs_error_problem_encountered);
-                                        this.loading = false;
-                                        document.querySelector('#downloadButtonNMP').innerHTML = this.strings.logs_valid_NMPbtn;
-                                        document.getElementById('downloadButtonNMP').disabled = false;
-                                    }).finally(() => {
-                                        this.loading = false;
-                                        document.querySelector('#downloadButtonNMP').innerHTML = this.strings.logs_valid_NMPbtn;
-                                        document.getElementById('downloadButtonNMP').disabled = false;
-                                    });
-                                } else { //Si la date de début est supérieure à la date de fin
-                                    Alertify.error(this.strings.logs_error_begin_date_superior);
-                                }
-                            } else { //Si la date de début est inférieure à la date du jour
-                                Alertify.error(this.strings.logs_error_begin_date_inferior);
-                            }
-                        } else { //Si les dates ne sont pas remplies
-                            Alertify.error(this.strings.logs_error_empty_dates);
-                        }
-                    },
+        getRapport() {
+          Alertify.confirm(
+            this.strings.logs_download_details_description,
+            () => {
+              let path =
+                M.cfg.wwwroot +
+                "/local/notemyprogress/downloads/Details_Informations_LogsNMP.pdf";
+              var link = document.createElement("a");
+              link.href = path;
+              link.download = "Details_Informations_LogsNMP.pdf";
+              link.click();
+              Alertify.success(this.strings.logs_download_details_validation);
+            }
+          )
+            .set({ title: this.strings.logs_download_details_title })
+            .set({
+              labels: {
+                cancel: this.strings.logs_download_details_cancel,
+                ok: this.strings.logs_download_details_ok,
+              },
+            });
+        },
 
-                    get_help_content() {
-                        var help_contents = [];
-                        var help = new Object();
-                        help.title = this.strings.title;
-                        help.description = this.strings.description;
-                        help_contents.push(help);
-                        return help_contents;
-                    },
-
-                    open_chart_help(chart) {
-                        let contents = [];
-                        if (chart == 'download_moodle') {
-                            contents.push({
-                                title: this.strings.logs_download_moodle_help_title,
-                                description: this.strings.logs_download_moodle_help_description,
-                            });
-                        } else if (chart == "download_nmp") {
-                            contents.push({
-                                title: this.strings.logs_download_nmp_help_title,
-                                description: this.strings.logs_download_nmp_help_description,
-                            });
-                        }
-                        this.help_contents = contents;
-                        if (this.help_contents.length) {
-                            this.help_dialog = true;
-                        }
-                    },
+        get_NMPfile() {
+          let lastDate = document.querySelector("#lastDateNMP");
+          let beginDate = document.querySelector("#beginDateNMP");
+          let timestampBeginDate = 0;
+          let timestampLastDate = 0;
+          let parsedBeginDate = [];
+          let parsedLastDate = [];
+          this.url = false;
+          this.loading = true;
+          var data = {
+            action: "downloadNMPlogs",
+            courseid: this.courseid,
+            userid: this.userid,
+            beginDate: beginDate.value,
+            lastDate: lastDate.value,
+            currentUrl: window.location.href,
+          };
+          if (beginDate.value != "" && lastDate.value != "") {
+            parsedBeginDate = beginDate.value.split("-");
+            timestampBeginDate = new Date(
+              parsedBeginDate[0],
+              parsedBeginDate[1] - 1,
+              parsedBeginDate[2]
+            );
+            parsedLastDate = lastDate.value.split("-");
+            timestampLastDate = new Date(
+              parsedLastDate[0],
+              parsedLastDate[1] - 1,
+              parsedLastDate[2]
+            );
+            if (timestampBeginDate.getTime() <= timestampLastDate.getTime()) {
+              if (timestampBeginDate.getTime() <= Date.now()) {
+                document.querySelector("#downloadButtonNMP").innerHTML =
+                  this.strings.logs_download_btn;
+                document.getElementById("downloadButtonNMP").disabled = true;
+                Axios({
+                  method: "get",
+                  url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+                  timeout: timeout,
+                  params: data,
+                })
+                  .then((response) => {
+                    this.loading = false;
+                    if (response.status == 200 && response.data.ok) {
+                      if (beginDate.value != "" || lastDate.value != "") {
+                        let jsonData = response.data.data.jsonData;
+                        jsonData = jsonData.map((row) => ({
+                          Role: row.user.role,
+                          Email: row.user.email,
+                          Username: row.user.username,
+                          Fullname: row.user.fullname,
+                          Date: row.time.date,
+                          Hour: row.time.hour,
+                          CourseID: row.course.courseid,
+                          SECTION_NAME: row.action.sectionname,
+                          ACTION_TYPE: row.action.actiontype,
+                        }));
+                        let csvData = vue.objectToCSV(jsonData);
+                        vue.downloadCSV(csvData, "Activity_NoteMyProgress");
+                        document.querySelector("#downloadButtonNMP").innerHTML =
+                          this.strings.logs_valid_NMPbtn;
+                        document.getElementById(
+                          "downloadButtonNMP"
+                        ).disabled = false;
+                        Alertify.success(
+                          this.strings.logs_success_file_downloaded
+                        );
+                      }
+                    } else {
+                      Alertify.error(
+                        this.strings.logs_error_problem_encountered
+                      );
+                      document.querySelector("#downloadButtonNMP").innerHTML =
+                        this.strings.logs_valid_NMPbtn;
+                      document.getElementById(
+                        "downloadButtonNMP"
+                      ).disabled = false;
+                    }
+                  })
+                  .catch((e) => {
+                    Alertify.error(this.strings.logs_error_problem_encountered);
+                    this.loading = false;
+                    document.querySelector("#downloadButtonNMP").innerHTML =
+                      this.strings.logs_valid_NMPbtn;
+                    document.getElementById(
+                      "downloadButtonNMP"
+                    ).disabled = false;
+                  })
+                  .finally(() => {
+                    this.loading = false;
+                    document.querySelector("#downloadButtonNMP").innerHTML =
+                      this.strings.logs_valid_NMPbtn;
+                    document.getElementById(
+                      "downloadButtonNMP"
+                    ).disabled = false;
+                  });
+              } else {
+                //Si la date de début est supérieure à la date de fin
+                Alertify.error(this.strings.logs_error_begin_date_superior);
+              }
+            } else {
+              //Si la date de début est inférieure à la date du jour
+              Alertify.error(this.strings.logs_error_begin_date_inferior);
+            }
+          } else {
+            //Si les dates ne sont pas remplies
+            Alertify.error(this.strings.logs_error_empty_dates);
+          }
+        },
 
-                    update_help_dialog(value) {
-                        this.help_dialog = value;
-                    },
+        get_help_content() {
+          var help_contents = [];
+          var help = new Object();
+          help.title = this.strings.title;
+          help.description = this.strings.description;
+          help_contents.push(help);
+          return help_contents;
+        },
 
-                    get_timezone() {
-                        let information = `${this.strings.ss_change_timezone} ${this.timezone}`
-                        return information;
-                    },
-                }
-            })
-        }
+        open_chart_help(chart) {
+          let contents = [];
+          if (chart == "download_moodle") {
+            contents.push({
+              title: this.strings.logs_download_moodle_help_title,
+              description: this.strings.logs_download_moodle_help_description,
+            });
+          } else if (chart == "download_nmp") {
+            contents.push({
+              title: this.strings.logs_download_nmp_help_title,
+              description: this.strings.logs_download_nmp_help_description,
+            });
+          }
+          this.help_contents = contents;
+          if (this.help_contents.length) {
+            this.help_dialog = true;
+          }
+        },
 
-        return {
-            init: init
-        };
-    });
\ No newline at end of file
+        update_help_dialog(value) {
+          this.help_dialog = value;
+        },
+        get_timezone() {
+          let information = `${this.strings.ss_change_timezone} ${this.timezone}`;
+          return information;
+        },
+      },
+    });
+  }
+  return {
+    init: init,
+  };
+});
diff --git a/notemyprogress/amd/src/quiz.js b/notemyprogress/amd/src/quiz.js
index 48a2e3a4c3d51862f5f53fc9d12955d2ebf639d2..de13aa346f84541c5b9065f5ba8c0cee1e4bb84b 100644
--- a/notemyprogress/amd/src/quiz.js
+++ b/notemyprogress/amd/src/quiz.js
@@ -20,7 +20,11 @@ define([
   "use strict";
 
   function init(content) {
+<<<<<<< HEAD
     // //console.log(content);
+=======
+    // console.log(content);
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     Vue.use(Vuetify);
     Vue.component("pagination", Pagination);
     Vue.component("chart", ChartDynamic);
@@ -467,7 +471,11 @@ define([
           Axios({
             method: "get",
             url: M.cfg.wwwroot + "/local/notemyprogress/ajax.php",
+<<<<<<< HEAD
             params: data,
+=======
+            data: data,
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
           })
             .then((response) => {
               if (response.status == 200 && response.data.ok) {
diff --git a/notemyprogress/amd/src/sessions.js b/notemyprogress/amd/src/sessions.js
index 25ddde416e4391e2e78ec1295f5bff694cdc97b1..24fdc255e386a3d1fbc508d503a1fce7b75c8a20 100644
--- a/notemyprogress/amd/src/sessions.js
+++ b/notemyprogress/amd/src/sessions.js
@@ -20,7 +20,11 @@ define([
   "use strict";
 
   function init(content) {
+<<<<<<< HEAD
     // //console.log(content);
+=======
+    // console.log(content);
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     Vue.use(Vuetify);
     Vue.component("pagination", Pagination);
     Vue.component("chart", ChartStatic);
@@ -183,7 +187,13 @@ define([
             backgroundColor: null,
             style: { fontFamily: "poppins" },
           };
+<<<<<<< HEAD
           chart.title = { text: null };
+=======
+          chart.title = {
+            text: null,
+          };
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
           chart.colors = this.inverted_time_colors;
           chart.xAxis = {
             type: "category",
diff --git a/notemyprogress/amd/src/setweeks.js b/notemyprogress/amd/src/setweeks.js
index 1b41697c4d5c776c641ae34c508a22ea31e7e940..a8af46c654737e45cb335d0cc66b281ec25eacb0 100644
--- a/notemyprogress/amd/src/setweeks.js
+++ b/notemyprogress/amd/src/setweeks.js
@@ -218,6 +218,7 @@ define([
                 params: data,
               })
                 .then((response) => {
+<<<<<<< HEAD
                   //console.log("then1");
                   if (response.status == 200 && response.data.ok) {
                     //console.log("then1.2");
@@ -246,6 +247,36 @@ define([
                   //console.log("finally1");
                   this.saving_loader = false;
                   //console.log("finally2");
+=======
+                  console.log("then1");
+                  if (response.status == 200 && response.data.ok) {
+                    console.log("then1.2");
+                    this.settings = response.data.data.settings;
+                    console.log("then1.3");
+                    Alertify.success(this.strings.save_successful);
+                    console.log("then1.4");
+                    this.save_successful = true;
+                    console.log("then1.5");
+                  } else {
+                    console.log("then1.6");
+                    Alertify.error(this.strings.error_network);
+                    console.log("then1.7");
+                    this.error_messages.push(this.strings.error_network);
+                    console.log("then1.8");
+                  }
+                })
+                .catch((e) => {
+                  console.log("catch1");
+                  Alertify.error(this.strings.error_network);
+                  console.log("catch2");
+                  this.error_messages.push(this.strings.error_network);
+                  console.log("catch3");
+                })
+                .finally(() => {
+                  console.log("finally1");
+                  this.saving_loader = false;
+                  console.log("finally2");
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
                   //this.addLogsIntoDB("saved", "configuration", "weeks", "Saved a new configuration for the weeks !");
                 });
             },
diff --git a/notemyprogress/classes/configgamification.php b/notemyprogress/classes/configgamification.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fb9d502f2dcd001c6e220e6eddce06380f743c5
--- /dev/null
+++ b/notemyprogress/classes/configgamification.php
@@ -0,0 +1,409 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Config Gamification
+ *
+ * @package     local_notemyprogress
+ * @autor       Edisson Sigua, Bryan Aguilar
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace local_notemyprogress;
+
+require_once("lib_trait.php");
+
+use stdClass;
+use DirectoryIterator;
+use core_collator;
+use core_component;
+use core_plugin_manager;
+
+class configgamification {
+
+    use \lib_trait;
+
+    public $course;
+    public $user;
+    public $levelsData;
+
+    function __construct($course, $userid){
+        $this->course = self::get_course($course);
+        $this->user = self::get_user($userid);
+        $this->levelsData = self::get_levels_data();
+        $this->levelsData = self::get_first_levels();
+    }
+
+    /**
+     *verify That There Are Levels,If There Are No Creation ByDefault
+     *
+     * @return array A list with gaming levels of the course
+     * @throws coding_exception | dml_exception
+     */
+    public function get_first_levels(){
+        $levelsData = $this->levelsData;
+
+        if(!$levelsData){
+            $levelsData = self::create_first_levels();
+            $this->levelsData = $levelsData;
+        }
+        return $levelsData;
+    }
+
+    /**
+     * Create the first two levels (default levels) of NoteMyProgress in a course.This function is executed
+     * automatically for each course.
+     *
+     * @return stdClass An object with the levels created
+     * @throws dml_exception
+     */
+    private function create_first_levels(){
+        global $DB;
+
+        $levelsInfo[] = array('lvl' => 1, 'name' => 'Level 1', 'des' => '', 'points' => 0);
+        $levelsInfo[] = array('lvl' => 2, 'name' => 'Level 2', 'des' => '', 'points' => 120);
+
+        $settings = array(
+            'pointsbase' => 120,
+            'tit' => 'Raise your level while learning',
+            'des' => 'Interact with your course make you stronger'
+        );
+
+        $levelsData = new stdClass();
+        $levelsData->levelsdata = json_encode($levelsInfo);
+        $levelsData->settings = json_encode($settings);
+        $levelsData->rules = json_encode(self::default_rules());
+        $levelsData->courseid = $this->course->id;
+        $levelsData->created_by = $this->user->id;
+        $levelsData->modified_by = $this->user->id;
+        $levelsData->timecreated = self::now_timestamp();
+        $levelsData->timemodified = self::now_timestamp();
+
+        $id = $DB->insert_record("notemyprogress_levels_data", $levelsData, true);
+        $levelsData->id = $id;
+        return $levelsData;
+    }
+
+    /**
+     * Gets information about the level configuration
+     *
+     * @return array a list with the weeks configured in a course
+     */
+    public function get_levels_data(){
+        global $DB;
+        $levelsData = $DB->get_record_select(
+            "notemyprogress_levels_data",
+            'courseid = ? AND timedeleted IS NULL',
+            array($this->course->id));
+
+        if($levelsData){
+            $levelsData->levelsdata = json_decode($levelsData->levelsdata);
+            $levelsData->settings = json_decode($levelsData->settings);
+            $levelsData->rules = json_decode($levelsData->rules);
+
+            
+
+            }
+            $sql = "SELECT enablegamification from {notemyprogress_gamification} where courseid=? AND timecreated=? ";
+            $value = $DB->get_record_sql($sql, array("courseid="=>($courseid),"timecreated="=>$timecrated->maximum));
+
+        return $levelsData;
+    }
+
+    /**
+     * Save the Gaming Levels of NotemyProgress configured in a course
+     *
+     * @param array $ Levels Levels to Save
+     *
+     * @return void
+     * @throws Exception
+     */
+    public function save_levels($levelsInfo, $settings, $rules){
+        global $DB;
+        self::delete_levels();
+        $levelsData = new stdClass();
+        $levelsData->levelsdata = ($levelsInfo);
+        $levelsData->settings = ($settings);
+        $levelsData->rules = ($rules);
+        $levelsData->courseid = $this->course->id;
+        $levelsData->created_by = $this->user->id;
+        $levelsData->modified_by = $this->user->id;
+        $levelsData->timecreated = self::now_timestamp();
+        $levelsData->timemodified = self::now_timestamp();
+        $id = $DB->insert_record("notemyprogress_levels_data", $levelsData, true);
+        $levelsData->id = $id;
+        return $levelsData;
+    }
+
+    public function save_enable($enable){
+        global $DB;
+        $param = new stdClass();
+        $param->courseid = $this->course->id;
+        $param->userid = $this->user->id;
+        if ($enable){ $param->enablegamification =1;}else{ $param->enablegamification =0;}
+        $param->timecreated = self::now_timestamp();
+        //if ($timecreated == null){$result = 1;}
+        //if ($timecreated === null){$result = 2;}
+        //if ($timecreated == 'null'){$result = 3;}
+        //if ($timecreated->maximum == null){$result = 9;}
+        //if ($timecreated->maximum === null){$result = 10;}
+        $DB->insert_record("notemyprogress_gamification", $param,true);
+    }
+    /**
+     * Eliminates the Gaming Levels of NoteMyProgress configured in a course
+     *
+     * @return void
+     * @throws dml_exception
+     */
+    public function delete_levels(){
+        global $DB;
+        $levelsData = $this->levelsData;
+        $id = $levelsData->id;
+        $sql = "update {notemyprogress_levels_data} set timedeleted = ? where id = ?";
+        $DB->execute($sql, array(self::now_timestamp() , $id));
+    }
+
+    /**
+     * Get the default gamification rules
+     *
+     * @return array a list of rules configured in a course
+     */
+    public function default_rules() {
+        $ruleset[] = array('rule' => '\mod_book\event\course_module_viewed', 'points' => 5);
+        $ruleset[] = array('rule' => '\mod_page\event\course_module_viewed', 'points' => 10);
+        $ruleset[] = array('rule' => '\mod_forum\event\discussion_subscription_created', 'points' => 20);
+        $ruleset[] = array('rule' => '\core\event\course_viewed', 'points' => 2);
+        return $ruleset;
+    }
+
+    /**
+     * Get a list of events.
+     */
+    public final function events_list() {
+        $list = [];
+
+        $coreevents = $this->get_core_events();
+        $coreevents = [get_string('coresystem') => array_reduce(array_keys($coreevents), function($carry, $prefix) use ($coreevents) {
+            return array_merge($carry, array_reduce($coreevents[$prefix], function($carry, $eventclass) use ($prefix) {
+                $infos = self::get_event_infos($eventclass);
+                if ($infos) {
+                    $name = get_string('tg_colon', 'local_notemyprogress', [
+                        'a' => $prefix,
+                        'b' => $infos['name']
+                    ]);
+                    $carry = array('name' => $name, 'event' => $infos['eventname']);
+                }
+                return $carry;
+            }, []));
+        }, [])];
+
+        foreach ($coreevents as $event) {
+            $list[] = $event;
+        }
+
+        // Get module events.
+        $list = array_merge($list, self::get_events_list_from_plugintype('mod'));
+
+        return $list;
+    }
+
+    /**
+     * Get the core events.
+     *
+     * @return array The keys are translated subsystem names, the values are the classes.
+     */
+    protected function get_core_events() {
+        // Add some system events.
+        return [get_string('course') => [
+            '\\core\\event\\course_viewed',
+        ]];
+    }
+
+
+    /**
+     * Return the info about an event.
+     *
+     * The key 'name' is added to contain the readable name of the event.
+     * It is done here because debugging is turned off and some events use
+     * deprecated strings.
+     *
+     * We also add the key 'isdeprecated' which indicates whether the event
+     * is obsolete or not.
+     *
+     * @param  string $class The name of the event class.
+     * @return array|false
+     */
+    public static function get_event_infos($class) {
+        global $CFG;
+        $infos = false;
+
+        // We need to disable debugging as some events can be deprecated.
+        $debuglevel = $CFG->debug;
+        $debugdisplay = $CFG->debugdisplay;
+        set_debugging(0, false);
+
+        // Check that the event exists, and is not an abstract event.
+        if (method_exists($class, 'get_static_info')) {
+            $ref = new \ReflectionClass($class);
+            if (!$ref->isAbstract()) {
+                $infos = $class::get_static_info();
+                $infos['name'] = method_exists($class, 'get_name_with_info') ? $class::get_name_with_info() : $class::get_name();
+                $infos['isdeprecated'] = method_exists($class, 'is_deprecated') ? $class::is_deprecated() : false;
+            }
+        }
+
+        // Restore debugging.
+        set_debugging($debuglevel, $debugdisplay);
+
+        return $infos;
+    }
+
+    /**
+     * Get events from plugin type.
+     *
+     * @param string $plugintype Plugin type.
+     * @return array
+     */
+    protected static function get_events_list_from_plugintype($plugintype) {
+        $list = [];
+
+        // Loop over each plugin of the type.
+        $pluginlist = core_component::get_plugin_list($plugintype);
+        foreach ($pluginlist as $plugin => $directory) {
+            $component = $plugintype . '_' . $plugin;
+            $events = self::get_events_list_from_plugin($component);
+
+            // If we found events for this plugin, we add them to the list.
+            if (!empty($events)) {
+                //$pluginmanager = core_plugin_manager::instance();
+                //$plugininfo = $pluginmanager->get_plugin_info($component);
+                foreach ($events as $event) {
+                    $list[] = $event;
+                }
+            }
+        }
+
+        return $list;
+    }
+
+    /**
+     * Get the events list from a plugin.
+     *
+     * From 3.1 we could be using core_component::get_component_classes_in_namespace().
+     *
+     * @param string $component The plugin's component name.
+     * @return array
+     */
+    protected static function get_events_list_from_plugin($component) {
+        $directory = core_component::get_component_directory($component);
+        $plugindirectory = $directory . '/classes/event';
+        if (!is_dir($plugindirectory)) {
+            return [];
+        }
+
+        // Get the plugin's events.
+        $eventclasses = static::get_event_classes_from_component($component);
+
+        $pluginmanager = core_plugin_manager::instance();
+        $plugininfo = $pluginmanager->get_plugin_info($component);
+
+        // Reduce to the participating, non-deprecated event.
+        $events = array_reduce($eventclasses, function($carry, $class) use ($plugininfo) {
+            $infos = self::get_event_infos($class);
+            if (empty($infos)) {
+                // Skip rare case where infos aren't found.
+                return $carry;
+            } else if ($infos['edulevel'] != \core\event\base::LEVEL_PARTICIPATING) {
+                // Skip events that are not of level 'participating'.
+                return $carry;
+            }
+
+//            $carry[$infos['eventname']] = get_string('tg_colon', 'local_notemyprogress', [
+//                'a' => $plugininfo->displayname,
+//                'b' => $infos['name']
+//            ]);
+
+            $name = get_string('tg_colon', 'local_notemyprogress', [
+                'a' => $plugininfo->displayname,
+                'b' => $infos['name']
+            ]);
+
+            $carry[] = array('name' => $name, 'event' => $infos['eventname']);
+
+            return $carry;
+        }, []);
+
+        // Order alphabetically.
+        //core_collator::asort($events, core_collator::SORT_NATURAL);
+
+        return $events;
+    }
+
+    /**
+     * Get the events classes from a component.
+     *
+     * @param string $component The component.
+     * @return Array of classes. Those may not be relevant (abstract, invalid, ...)
+     */
+    public static function get_event_classes_from_component($component) {
+        $directory = core_component::get_component_directory($component);
+        $plugindirectory = $directory . '/classes/event';
+        if (!is_dir($plugindirectory)) {
+            return [];
+        }
+
+        $eventclasses = [];
+        $diriter = new DirectoryIterator($plugindirectory);
+        foreach ($diriter as $file) {
+            if ($file->isDot() || $file->isDir()) {
+                continue;
+            }
+
+            // It's a good idea to use the leading slashes because the event's property
+            // 'eventname' includes them as well, so for consistency sake... Also we do
+            // not check if the class exists because that would cause the class to be
+            // autoloaded which would potentially trigger debugging messages when
+            // it is deprecated.
+            $name = substr($file->getFileName(), 0, -4);
+            $classname = '\\' . $component . '\\event\\' . $name;
+            $eventclasses[] = $classname;
+        }
+        return $eventclasses;
+    }
+    /**
+     * Get the data needed to complete the graph.
+     *
+     * @param int $courseid the course id.
+     * @return array an array containing the apropriate data well formated 
+     */
+    public static function get_spread_chart($courseid){
+        Global $DB;
+        $resultat = [];
+        $levelsData = "SELECT MAX(level) as lvl from {notemyprogress_xp} where courseid=?";
+        $lvl = $DB->get_record_sql($levelsData, array("courseid="=>($courseid)));
+        $i = 1;
+        while($i<=$lvl->lvl){
+            $levelCount = "SELECT COUNT(*) as cpt from {notemyprogress_xp} where courseid=? and level=?";
+            $cpt = $DB->get_record_sql($levelCount, array("courseid="=>($courseid),"level="=>($i)));
+            $string = "level {$i} :";
+            array_push( $resultat,[$string,intval($cpt->cpt)]);
+            $i = $i+1;
+        }
+        return $resultat;
+    }
+}
\ No newline at end of file
diff --git a/notemyprogress/classes/configweeks.php b/notemyprogress/classes/configweeks.php
index a5dbb940edb9b0055e9a23676e0f19b6fc76917f..5da7c22393306fd3a63ba6d269faad2624feb46f 100644
--- a/notemyprogress/classes/configweeks.php
+++ b/notemyprogress/classes/configweeks.php
@@ -53,10 +53,17 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Gets the last instance configured for Fliplearning weeks. If no weeks have been 
      * configured in a course yet, the last instance is the one created by default by the plugin.
      *
      * @return mixed a fieldset object that contains the first record that matches the query.
+=======
+     * Gets the last instance configured for the weeks of Note My Progress.If you have not yet been
+     * Configured weeks in a course, the last instance is the one that creates the plugin by default.
+     *
+     * @return mixed A FieldSet object that contains the first record that Match makes with the query
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      */
     public function last_instance()
     {
@@ -70,10 +77,15 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Crea una nueva instancia para la configuración de semanas de Fliplearning. Esta es la instancia
      * que se crea por defecto.
+=======
+     * Create a new instance for the setting of weeks of Note My Progress.This is the instance
+     * That is created by default.
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @return mixed un objeto fieldset que contiene el registro creado
+     * @return mixed A FieldSet object that contains the created record
      */
     public function create_instance()
     {
@@ -88,10 +100,15 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Gets the weeks configured in Fliplearning based on the ids of the class attributes
      * $course e $intance. You can specify.
+=======
+     * Obtain the weeks configured in Note My progress based on the IDs of class attributes
+     * $ Course and $ INTANCE.It can be specified
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @return array una lista con las semanas configuradas en un curso
+     * @return Array a list with the weeks configured in a course
      */
     public function get_weeks()
     {
@@ -104,10 +121,17 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Adds the sections field to the weeks class variable to store the sections assigned to each week.
      *
      * @return array a list with the weeks of the course and the sections assigned to each one.
      * @throws coding_exception | dml_exception
+=======
+     * Add the Sections field to the class variable weeks to store the sections assigned to each week.
+     *
+     * @return Array a list with the weeks of the course and sections assigned to each
+     * @throws Coding_Exception |DML_EXCEPTION.
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      */
     public function get_weeks_with_sections()
     {
@@ -145,10 +169,15 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Crea la primera semana (semana por defecto) de Fliplearning en un curso. Esta funcion se ejecuta
      * de manera automática para cada curso.
+=======
+     * Create the first week (default week) of Note My progress in a course.This function is executed
+     * automatically for each course.
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @return stdClass un objeto con la semana creada
+     * @return stdClass An object with the week created
      * @throws dml_exception
      */
     private function create_first_week()
@@ -352,7 +381,11 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Elimina las semanas de Fliplearning configuradas en un curso
+=======
+     * Eliminates the weeks of Note My Progress configured in a course
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
      * @return void
      * @throws dml_exception
@@ -369,9 +402,13 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Elimina las secciones asignadas a una semana de Fliplearning
+=======
+     * Eliminates sections assigned to a week of Note My Progress
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @param string $weekcode id de la semana a eliminar
+     * @param string $weekcode ID of the week to eliminate
      *
      * @return void
      * @throws dml_exception
@@ -384,10 +421,14 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Guarda una semana de Fliplearning configurada en un curso
+=======
+     * Save a week of Note My Progress configured in a course
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @param object $week semana a guardar
-     * @param int $position posicion de la semana
+     * @param Object $Week week to save
+     * @param int $Position position of the week
      *
      * @return void
      * @throws Exception
@@ -412,10 +453,14 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Guarda las secciones asignadas a una semana de Fliplearning
+=======
+     * Save the sections assigned to a week of Note My Progress
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @param string $weekcode id de la semana a la que pertenece las secciones
-     * @param array $sections lista de secciones a guardar
+     * @param string $Weekcode ID of the week to which the sections belong
+     * @param array $sections List of Sections to Save
      *
      * @return void
      * @throws dml_exception
@@ -429,11 +474,15 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Guarda una seccion asignada a una semana de Fliplearning
+=======
+     * Save a SECTION ASSIGNED A A WEEK OF NOTE MY PROGRAMS
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @param object $section sección a guardar
-     * @param int $weekcode id de la semana a la que pertenece la sección
-     * @param int $position posición de la sección
+     * @param object $section Save section
+     * @param int $weekcode ID of the week to which the section belongs
+     * @param int $position Position of the section
      *
      * @return void
      */
@@ -452,10 +501,10 @@ class configweeks
     }
 
     /**
-     * Obtiene el nombre de una sección dado su id
+     * Gets the name of a given section your ID
      *
-     * @param int $sectionid id de sección
-     * @param int $position posición de la sección
+     * @param int $sectionid Section ID.
+     * @param int $position Position of the section
      *
      * @return void
      */
@@ -468,13 +517,18 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Returns the current week of the configured Fliplearning weeks. In case the query
      * is made after the course has ended, the last configured week is returned.
+=======
+     * Returns the current week of the scheduled weeks of Note My progress.In case the consultation
+     * It is done after the course is over, the last week is returned
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
      *
-     * @param int $last_if_course_finished parámetro entero opcional para devolver la última semana configurada
-     *                                     en caso de que el curso haya terminado
+     * @param int $last_if_course_finished Optional whole parameter to return the last week configured
+     * In case the course has finished
      *
-     * @return object objeto con la semana actual a la última semana
+     * @return Object object with the current week at the last week
      */
     public function get_current_week($last_if_course_finished = true)
     {
@@ -495,12 +549,18 @@ class configweeks
     }
 
     /**
+<<<<<<< HEAD
      * Toma la fecha actual al momento de hacer la llamada a la funcion y le resta 7 días para obtener
      * el día de la peticion de la semana pasada. Si el día obtenido esta dentro de alguna de las semanas
      * configuradas de Fliplearning entonces se retorna esa semana, de lo contratio se retorna null
-     *
-     * @return object objeto con la semana a la que corresponde la fecha actual menos 7 días. En caso de
-     *                no encontrarlo se retorna null
+=======
+     * Take the current date at the time of making the call to the function and it has 7 days to get
+     * On the day of the past week.If the day obtained is within some of the weeks
+     * Configured Note My Progress then returns that week, of the contracted Null returns
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
+     *
+     * @return object Object with the week to which the current date corresponds less 7 days.In case of
+     * Do not find it Returns NULL
      */
     public function get_past_week()
     {
diff --git a/notemyprogress/classes/event_strategy.php b/notemyprogress/classes/event_strategy.php
new file mode 100644
index 0000000000000000000000000000000000000000..134b9aee5171eefbb2ab689e68ed484daf01eec2
--- /dev/null
+++ b/notemyprogress/classes/event_strategy.php
@@ -0,0 +1,494 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Event Collector Observer
+ *
+ * @package     local_notemyprogress
+ * @autor       Edisson Sigua, Bryan Aguilar
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace local_notemyprogress;
+
+defined('MOODLE_INTERNAL') || die();
+
+require_once("lib_trait.php");
+
+use stdClass;
+use DateTime;
+use dml_exception;
+use lang_string;
+
+class event_strategy {
+
+    use \lib_trait;
+
+    protected $table_xp = 'notemyprogress_xp';
+    protected $table_log = 'notemyprogress_xp_log';
+    public $course;
+    public $user;
+    public $configgamification;
+
+    public function __construct($course, $userid) {
+        $this->course = self::get_course($course);
+        $this->user = self::get_user($userid);
+        $this->configgamification = new \local_notemyprogress\configgamification($course, $userid);
+    }
+
+    /**
+     * Manejador de eventos.
+     *
+     * @param \core\event\base $event The event.
+     * @return void
+     */
+    public function collect_event(\core\event\base $event) {
+
+        if (!self::can_capture_event($event)) {
+            return;
+        }
+
+        $points = self::get_points_for_event($event);
+        if ($points === null) {
+            return;
+        }
+
+        if ($points > 0) {
+            self::increase($this->user->id, $this->course->id, $points);
+            self::save_log($this->user->id, $this->course->id, $points, $event->eventname);
+        }
+    }
+
+    /**
+     * Compruebe si el usuario puede capturar este evento.
+     *
+     * @param \core\event\base $event El evento.
+     * @return bool True cuando el evento es permitido.
+     */
+    protected function can_capture_event(\core\event\base $event) {
+        global $SESSION;
+
+        $now = time();
+        $maxcount = 64;
+
+        /*
+         * El número máximo de acciones que contarán como puntos durante el período de tiempo dado.
+         * Cualquier acción posterior será ignorada. Cuando este valor está vacío o es igual a cero, no se aplica.*/
+        $maxactions = 10;
+
+        /* El período de tiempo (segundos) durante el cual el usuario no debe exceder un número máximo de acciones.*/
+        $maxtime = 60;
+
+        /*
+         * Se acepta nuevamente el tiempo mínimo requerido antes de que una acción que ya sucedió anteriormente.
+         * Una acción se considera idéntica si se colocó en el mismo contexto y objeto.
+         * Cuando este valor está vacío o es igual a cero, no se aplica.*/
+        $actiontime = 180;
+
+        $actionkey = $event->eventname . ':' . $event->contextid . ':' . $event->objectid . ':' . $event->relateduserid;
+
+        if (!isset($SESSION->local_notemyprogress_cheatguard)) {
+            // Init the session variable.
+            $SESSION->local_notemyprogress_cheatguard = [];
+        } else {
+            // Ensure that all entries are arrays, they may not be when we just upgraded the plugin.
+            $SESSION->local_notemyprogress_cheatguard = array_map(function($entry) {
+                return is_array($entry) ? $entry : [$entry];
+            }, $SESSION->local_notemyprogress_cheatguard);
+        }
+
+        // Perform the check.
+        if (!static::is_action_accepted($actionkey, $now, $SESSION->local_notemyprogress_cheatguard, $maxactions, $maxtime, $actiontime)) {
+            return false;
+        }
+
+        // Move the action at the end of the array.
+        $times = isset($SESSION->local_notemyprogress_cheatguard[$actionkey]) ? $SESSION->local_notemyprogress_cheatguard[$actionkey] : [];
+        unset($SESSION->local_notemyprogress_cheatguard[$actionkey]);
+        $SESSION->local_notemyprogress_cheatguard[$actionkey] = $times;
+
+        // Log the time at which this event happened.
+        $SESSION->local_notemyprogress_cheatguard[$actionkey][] = time();
+
+        // Limit the timestamps of each action to a maximum of $maxcount within the timeframe desired or
+        // the last 15min. We want to keep at least 15 min so that when teachers are testing changes,
+        // they do not get confused because actions they had just performed no longer gets blocked.
+        $timethreshold = $now - max([$maxtime, $actiontime, 900]);
+        $SESSION->local_notemyprogress_cheatguard = array_filter(array_map(function($times) use ($maxcount, $timethreshold) {
+            return array_slice(array_filter($times, function($time) use ($timethreshold) {
+                return $time > $timethreshold;
+            }), -$maxcount);
+        }, $SESSION->local_notemyprogress_cheatguard));
+
+        // Limit the array of events to $maxcount, we do not want to flood the session for no reason.
+        $SESSION->local_notemyprogress_cheatguard = array_slice($SESSION->local_notemyprogress_cheatguard, -$maxcount, null, true);
+
+        return true;
+    }
+
+    /**
+     * Comprueba si la acción es aceptada.
+     *
+     * @param string $action Clave de la acción.
+     * @param int $now Timestamp.
+     * @param array $log Array where keys are actions, and values are timestamp arrays.
+     * @param int $maxactions El máximo número de acciones.
+     * @param int $maxintime Tiempo durante el cual el máximo número de acciones es permitido.
+     * @param int $timebetweenrepeats Tiempo entre acciones repetidas.
+     * @return bool
+     */
+    public static function is_action_accepted($action, $now, array $log, $maxactions, $maxintime, $timebetweenrepeats) {
+
+        if ($maxactions > 0 && $maxintime > 0) {
+            $timethreshold = $now - $maxintime;
+            $actionsintimeframe = array_reduce($log, function($carry, $times) use ($timethreshold) {
+                return $carry + array_reduce($times, function($carry, $time) use ($timethreshold) {
+                        return $carry + ($time > $timethreshold ? 1 : 0);
+                    });
+            }, 0);
+            if ($actionsintimeframe >= $maxactions) {
+                return false;
+            }
+        }
+
+        if ($timebetweenrepeats > 0) {
+            $timethreshold = $now - $timebetweenrepeats;
+            $times = isset($log[$action]) ? $log[$action] : [];
+            if (!empty($times) && max($times) > $timethreshold) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Obtiene los puntos para un evento.
+     *
+     * @param \core\event\base $event event.
+     * @return int Points, or null.
+     */
+    public function get_points_for_event(\core\event\base $event) {
+        $ruleset = $this->configgamification->get_levels_data()->rules;
+        foreach ($ruleset as $rule) {
+            if ($rule->rule == $event->eventname) {
+                return $rule->points;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Agregar puntos de experiencia.
+     *
+     * @param int $id The receiver.
+     * @param int $amount The amount.
+     */
+    public function increase($userid, $courseid, $amount) {
+        global $DB;
+        $prexp = 0;
+        $postxp = $amount;
+
+        if ($record = self::get_user_data($userid, $courseid)) {
+            $prexp = (int)$record->points;
+            $postxp = $prexp + $amount;
+
+            $sql = "UPDATE {{$this->table_xp}}
+                       SET points = points + :points
+                     WHERE courseid = :courseid
+                       AND userid = :userid";
+            $params = [
+                'points' => $amount,
+                'courseid' => $courseid,
+                'userid' => $userid
+            ];
+            $DB->execute($sql, $params);
+
+            $newxp = (int)$record->points + $amount;
+            $newlevel = self::get_level_from_xp($newxp)->lvl;
+            if ($record->level != $newlevel) {
+                $DB->set_field($this->table_xp, 'level', $newlevel, ['courseid' => $courseid, 'userid' => $userid]);
+            }
+        } else {
+            self::insert($userid, $courseid, $amount);
+        }
+    }
+
+    /**
+     * Log a thing.
+     *
+     * @param int $userid The target.
+     * @param int $courseid The target.
+     * @param int $points The points.
+     * @param reason $reason The reason.
+     * @param DateTime|null $time When that happened.
+     * @return void
+     */
+    public function save_log($userid, $courseid, $points, $eventName) {
+        global $DB;
+        $time = new DateTime();
+        $record = new stdClass();
+        $record->courseid = $courseid;
+        $record->userid = $userid;
+        $record->event = $eventName;
+        $record->points = $points;
+        $record->timecreated = $time->getTimestamp();
+        try {
+            $DB->insert_record($this->table_log, $record);
+        } catch (dml_exception $e) {}
+
+    }
+
+    /**
+     * Agregar puntos de experiencia a un usuario en la tabla notemyprogress_xp.
+     *
+     * @param int $id The receiver.
+     * @param int $amount The amount.
+     */
+    public function insert($userid, $courseid, $amount) {
+        global $DB;
+        $record = new stdClass();
+        $record->courseid = $courseid;
+        $record->userid = $userid;
+        $record->points = $amount;
+        $record->level = self::get_level_from_xp($amount)->lvl;
+        try {
+            $DB->insert_record($this->table_xp, $record); //*
+        } catch (dml_exception $e) {}
+    }
+
+    /**
+     * Give the level from the xp points.
+     *
+     * @param int $xp The xp points.
+     * @return level
+     */
+    public function get_level_from_xp($points) {
+        $levels = $this->configgamification->get_levels_data()->levelsdata;
+        for ($i = count($levels)-1; $i >= 0; $i--) {
+            $level = $levels[$i];
+            if ($level->points <= $points) {
+                return $level;
+            }
+        }
+        return $level;
+    }
+
+    /**
+     * Obtiene el próximo nivel de un usuario
+     *
+     * @return null|level
+     */
+    public function get_next_level($userid) {
+        $configgamification = $this->configgamification->get_levels_data();
+        $levels = $configgamification->levelsdata;
+        $userData = self::get_user_data($userid, $this->course->id);
+        $levelnum = $userData->level;
+
+        if ($levelnum > count($levels)-1) {
+            $nextlevel = false;
+        } else {
+            $nextlevel = $levels[$levelnum];
+        }
+
+        // TODO: validar que pasa cuando supera el ultimo nivel
+        if ($nextlevel === false) {
+            return null;
+        }
+
+        return $nextlevel;
+    }
+
+    /**
+     * Obtiene la información de puntos de experiencia de un usuario
+     *
+     * @return null|response
+     */
+    public function get_user_info() {
+
+        $response = new stdClass();
+        $recentCount = 3;
+        if (self::get_user_data($this->user->id, $this->course->id)) {
+
+            $userData = self::get_user_data($this->user->id, $this->course->id);
+            $nextlevel = self::get_next_level($this->user->id);
+            $activity = self::get_user_recent_activity($this->user->id, $this->course->id, $recentCount);
+            $levelInfo = self::get_level_from_xp($userData->points);
+
+            $response->points = $userData->points;
+            $response->level = $userData->level;
+            $response->activity = $activity;
+            $response->levelInfo = $levelInfo;
+            $response->uid=$this->user->id;
+            $response->cid=$this->course->id;
+
+            // $response->points = 1;
+            // $response->level = 2;
+            // $response->activity = 3;
+            // $response->levelInfo = $userData->points;
+
+            if(is_null($nextlevel)) {
+                // Si no existe un siguiente nivel
+                $response->pointsToNext = 0;
+                $response->progress = 100;
+            }else{
+                $response->pointsToNext = $nextlevel->points - $userData->points;
+                $response->progress = ($userData->points*100)/$nextlevel->points;
+            }
+        }else{return self::get_user_data($this->user->id, $this->course->id);}
+        return $response;
+    }
+
+    /**
+     * Obtiene un ranking con los puntos de experiencia de los usuarios
+     *
+     * @return users
+     */
+    public function get_ranking($int) {
+        global $DB;
+
+        $users = array();
+        if ($int==1){
+            $sql = "SELECT * FROM {{$this->table_xp}} WHERE courseid = {$this->course->id} and rankable = 1 ORDER BY points DESC";
+        }else{
+            $sql = "SELECT * FROM {{$this->table_xp}} WHERE courseid = {$this->course->id} ORDER BY points DESC";
+        }
+        
+        $rank = $DB->get_recordset_sql($sql);
+        $index = 1;
+
+        foreach($rank as $user){
+
+            $completeUser = self::get_user_from_id($user->userid);
+            $nextlevel = self::get_next_level($user->userid);
+
+            $aux = new stdClass();
+            $aux->ranking = $index;
+            $aux->level = $user->level;
+            $aux->student = $completeUser->firstname.' '.$completeUser->lastname;
+            $aux->total = $user->points;
+
+            if(is_null($nextlevel)) {
+                // Si no existe un siguiente nivel
+                $aux->progress_percentage = 100;
+            }else{
+                $aux->progress_percentage = ($user->points*100)/$nextlevel->points;
+            }
+
+            $users[] = $aux;
+
+            $index++;
+        }
+        $rank->close();
+        return $users;
+    }
+
+    /**
+     * Verifica si el usuario existe en la tabla de puntos de experiencia.
+     *
+     * @param int $id The receiver.
+     * @return stdClass|false
+     */
+    public function get_user_data($userid, $courseid) {
+        global $DB;
+        $params = [];
+        $params['userid'] = $userid;
+        $params['courseid'] = $courseid;
+        return $DB->get_record($this->table_xp, array("userid"=>$userid,"courseid"=>$courseid));
+    }
+
+    /**
+     * Obtener la actividad reciente del usuario de la tabla notemyprogress_xp_log.
+     *
+     * @param int $userid El identificador del usuario.
+     * @param int $courseid El identificador del curso.
+     * @param int $count El número de registros a recuperar.
+     * @return activity
+     */
+    public function get_user_recent_activity($userid, $courseid, $count = 0) {
+        global $DB;
+        $results = $DB->get_records_select($this->table_log, 'courseid = :courseid AND userid = :userid AND points > 0', [
+            'courseid' => $courseid,
+            'userid' => $userid,
+        ], 'timecreated DESC, id DESC', '*', 0, $count);
+
+        $activities = array();
+        foreach($results as $row){
+            $desc = '';
+            $class = $row->event;
+            if (class_exists($class) && is_subclass_of($class, 'core\event\base')) {
+                $desc = $class::get_name();
+            } else {
+                $desc = new lang_string('somethinghappened', 'local_notemyprogress');
+            }
+            $activity = new stdClass();
+            $activity->timeago = self::time_ago(new DateTime('@' . $row->timecreated));
+            $activity->description = $desc;
+            $activity->points = $row->points;
+            $activities[] = $activity;
+        }
+
+//        return array_map(function($row) {
+//            $desc = '';
+//            $class = $row->event;
+//            if (class_exists($class) && is_subclass_of($class, 'core\event\base')) {
+//                $desc = $class::get_name();
+//            } else {
+//                $desc = new lang_string('somethinghappened', 'local_notemyprogress');
+//            }
+//            $activity = new stdClass();
+//            $activity->timeago = self::time_ago(new DateTime('@' . $row->timecreated));
+//            $activity->description = $desc;
+//            $activity->points = $row->points;
+//            return $activity;
+//        }, $results);
+
+        return $activities;
+    }
+
+    /**
+     * Obtener un timestamp de la forma hace 5 min.
+     *
+     * @param DateTime $dt Objeto de tipo DateTime.
+     * @return string
+     */
+    public function time_ago(DateTime $dt) {
+        $now = new \DateTime();
+        $diff = $now->getTimestamp() - $dt->getTimestamp();
+        $ago = '?';
+
+        if ($diff < 15) {
+            $ago = get_string('tg_timenow', 'local_notemyprogress');
+        } else if ($diff < 45) {
+            $ago = get_string('tg_timeseconds', 'local_notemyprogress', $diff);
+        } else if ($diff < HOURSECS * 0.7) {
+            $ago = get_string('tg_timeminutes', 'local_notemyprogress', round($diff / 60));
+        } else if ($diff < DAYSECS * 0.7) {
+            $ago = get_string('tg_timehours', 'local_notemyprogress', round($diff / HOURSECS));
+        } else if ($diff < DAYSECS * 7 * 0.7) {
+            $ago = get_string('tg_timedays', 'local_notemyprogress', round($diff / DAYSECS));
+        } else if ($diff < DAYSECS * 30 * 0.7) {
+            $ago = get_string('tg_timeweeks', 'local_notemyprogress', round($diff / (DAYSECS * 7)));
+        } else if ($diff < DAYSECS * 365) {
+            $ago = userdate($dt->getTimestamp(), get_string('tg_timewithinayearformat', 'local_notemyprogress'));
+        } else {
+            $ago = userdate($dt->getTimestamp(), get_string('tg_timeolderyearformat', 'local_notemyprogress'));
+        }
+
+        return $ago;
+    }
+}
\ No newline at end of file
diff --git a/notemyprogress/classes/external/external.php b/notemyprogress/classes/external/external.php
new file mode 100644
index 0000000000000000000000000000000000000000..009182f43543c082660691198c8aee37b05bfd51
--- /dev/null
+++ b/notemyprogress/classes/external/external.php
@@ -0,0 +1,93 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+namespace local_notemyprogress\external;
+
+use coding_exception;
+use dml_exception;
+use function end;
+use external_api;
+use external_function_parameters;
+use external_multiple_structure;
+use external_single_structure;
+use external_value;
+use invalid_parameter_exception;
+use moodle_exception;
+use restricted_context_exception;
+use stdClass;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Class levels
+ *
+ * @package    mod_millionaire\external
+ * @copyright  2019 Benedikt Kulmann <b@kulmann.biz>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class external extends external_api {
+
+    /**
+     * Definition of parameters for {@see get_levels}.
+     *
+     * @return external_function_parameters
+     */
+    public static function get_levels_parameters() {
+        return new external_function_parameters([
+            'courseid' => new external_value(PARAM_INT, 'course id'),
+        ]);
+    }
+
+    /**
+     * Definition of return type for {@see get_levels}.
+     *
+     * @return external_multiple_structure
+     */
+        public static function get_levels_returns() {
+        return new external_multiple_structure(
+            level_dto::get_read_structure()
+        );
+    }
+
+    /**
+     * Get all levels.
+     *
+     * @param int $courseid
+     *
+     * @return array
+     * @throws coding_exception
+     * @throws dml_exception
+     * @throws invalid_parameter_exception
+     * @throws moodle_exception
+     * @throws restricted_context_exception
+     */
+    public static function get_levels($courseid) {
+        $params = ['courseid' => $courseid];
+        self::validate_parameters(self::get_levels_parameters(), $params);
+        global $DB;
+        $levelsData = $DB->get_record_select(
+            "notemyprogress_levels_data",
+            'courseid = ? AND timedeleted IS NULL', $params);
+
+        if($levelsData){
+            $levelsData->levelsdata = json_decode($levelsData->levelsdata);
+            $levelsData->settings = json_decode($levelsData->settings);
+            $levelsData->rules = json_decode($levelsData->rules);
+        }
+
+        return $levelsData;
+    }
+}
\ No newline at end of file
diff --git a/notemyprogress/classes/jwt/BeforeValidException.php b/notemyprogress/classes/jwt/BeforeValidException.php
new file mode 100644
index 0000000000000000000000000000000000000000..e71d2bfc09e2cc0e6315cc59ebb81669bf69cabd
--- /dev/null
+++ b/notemyprogress/classes/jwt/BeforeValidException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace local_notemyprogress\jwt;
+
+class BeforeValidException extends \UnexpectedValueException
+{
+}
diff --git a/notemyprogress/classes/jwt/ExpiredException.php b/notemyprogress/classes/jwt/ExpiredException.php
new file mode 100644
index 0000000000000000000000000000000000000000..90347ca97d421883a37536c0463e622433f8183c
--- /dev/null
+++ b/notemyprogress/classes/jwt/ExpiredException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace local_notemyprogress\jwt;
+
+class ExpiredException extends \UnexpectedValueException
+{
+}
diff --git a/notemyprogress/classes/jwt/JWK.php b/notemyprogress/classes/jwt/JWK.php
new file mode 100644
index 0000000000000000000000000000000000000000..831e6b70d42d74e4608aefeca650192e691150c9
--- /dev/null
+++ b/notemyprogress/classes/jwt/JWK.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace local_notemyprogress\jwt;
+
+use DomainException;
+use InvalidArgumentException;
+use UnexpectedValueException;
+
+/**
+ * JSON Web Key implementation, based on this spec:
+ * https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41
+ *
+ * PHP version 5
+ *
+ * @category Authentication
+ * @package  Authentication_JWT
+ * @author   Bui Sy Nguyen <nguyenbs@gmail.com>
+ * @license  http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
+ * @link     https://github.com/firebase/php-jwt
+ */
+class JWK
+{
+    /**
+     * Parse a set of JWK keys
+     *
+     * @param array $jwks The JSON Web Key Set as an associative array
+     *
+     * @return array An associative array that represents the set of keys
+     *
+     * @throws InvalidArgumentException     Provided JWK Set is empty
+     * @throws UnexpectedValueException     Provided JWK Set was invalid
+     * @throws DomainException              OpenSSL failure
+     *
+     * @uses parseKey
+     */
+    public static function parseKeySet(array $jwks)
+    {
+        $keys = array();
+
+        if (!isset($jwks['keys'])) {
+            throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
+        }
+        if (empty($jwks['keys'])) {
+            throw new InvalidArgumentException('JWK Set did not contain any keys');
+        }
+
+        foreach ($jwks['keys'] as $k => $v) {
+            $kid = isset($v['kid']) ? $v['kid'] : $k;
+            if ($key = self::parseKey($v)) {
+                $keys[$kid] = $key;
+            }
+        }
+
+        if (0 === \count($keys)) {
+            throw new UnexpectedValueException('No supported algorithms found in JWK Set');
+        }
+
+        return $keys;
+    }
+
+    /**
+     * Parse a JWK key
+     *
+     * @param array $jwk An individual JWK
+     *
+     * @return resource|array An associative array that represents the key
+     *
+     * @throws InvalidArgumentException     Provided JWK is empty
+     * @throws UnexpectedValueException     Provided JWK was invalid
+     * @throws DomainException              OpenSSL failure
+     *
+     * @uses createPemFromModulusAndExponent
+     */
+    public static function parseKey(array $jwk)
+    {
+        if (empty($jwk)) {
+            throw new InvalidArgumentException('JWK must not be empty');
+        }
+        if (!isset($jwk['kty'])) {
+            throw new UnexpectedValueException('JWK must contain a "kty" parameter');
+        }
+
+        switch ($jwk['kty']) {
+            case 'RSA':
+                if (!empty($jwk['d'])) {
+                    throw new UnexpectedValueException('RSA private keys are not supported');
+                }
+                if (!isset($jwk['n']) || !isset($jwk['e'])) {
+                    throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"');
+                }
+
+                $pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']);
+                $publicKey = \openssl_pkey_get_public($pem);
+                if (false === $publicKey) {
+                    throw new DomainException(
+                        'OpenSSL error: ' . \openssl_error_string()
+                    );
+                }
+                return $publicKey;
+            default:
+                // Currently only RSA is supported
+                break;
+        }
+    }
+
+    /**
+     * Create a public key represented in PEM format from RSA modulus and exponent information
+     *
+     * @param string $n The RSA modulus encoded in Base64
+     * @param string $e The RSA exponent encoded in Base64
+     *
+     * @return string The RSA public key represented in PEM format
+     *
+     * @uses encodeLength
+     */
+    private static function createPemFromModulusAndExponent($n, $e)
+    {
+        $modulus = JWT::urlsafeB64Decode($n);
+        $publicExponent = JWT::urlsafeB64Decode($e);
+
+        $components = array(
+            'modulus' => \pack('Ca*a*', 2, self::encodeLength(\strlen($modulus)), $modulus),
+            'publicExponent' => \pack('Ca*a*', 2, self::encodeLength(\strlen($publicExponent)), $publicExponent)
+        );
+
+        $rsaPublicKey = \pack(
+            'Ca*a*a*',
+            48,
+            self::encodeLength(\strlen($components['modulus']) + \strlen($components['publicExponent'])),
+            $components['modulus'],
+            $components['publicExponent']
+        );
+
+        // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
+        $rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
+        $rsaPublicKey = \chr(0) . $rsaPublicKey;
+        $rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey;
+
+        $rsaPublicKey = \pack(
+            'Ca*a*',
+            48,
+            self::encodeLength(\strlen($rsaOID . $rsaPublicKey)),
+            $rsaOID . $rsaPublicKey
+        );
+
+        $rsaPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
+            \chunk_split(\base64_encode($rsaPublicKey), 64) .
+            '-----END PUBLIC KEY-----';
+
+        return $rsaPublicKey;
+    }
+
+    /**
+     * DER-encode the length
+     *
+     * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4.  See
+     * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
+     *
+     * @param int $length
+     * @return string
+     */
+    private static function encodeLength($length)
+    {
+        if ($length <= 0x7F) {
+            return \chr($length);
+        }
+
+        $temp = \ltrim(\pack('N', $length), \chr(0));
+
+        return \pack('Ca*', 0x80 | \strlen($temp), $temp);
+    }
+}
diff --git a/notemyprogress/classes/jwt/JWT.php b/notemyprogress/classes/jwt/JWT.php
new file mode 100644
index 0000000000000000000000000000000000000000..41b06de07c179aad27e84560b9f3b0db4b60f5a8
--- /dev/null
+++ b/notemyprogress/classes/jwt/JWT.php
@@ -0,0 +1,547 @@
+<?php
+
+namespace local_notemyprogress\jwt;
+
+
+
+use DomainException;
+use Exception;
+use InvalidArgumentException;
+use UnexpectedValueException;
+use DateTime;
+
+
+/**
+ * JSON Web Token implementation, based on this spec:
+ * https://tools.ietf.org/html/rfc7519
+ *
+ * PHP version 5
+ *
+ * @category Authentication
+ * @package  Authentication_JWT
+ * @author   Neuman Vong <neuman@twilio.com>
+ * @author   Anant Narayanan <anant@php.net>
+ * @license  http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
+ * @link     https://github.com/firebase/php-jwt
+ */
+class JWT
+{
+    const ASN1_INTEGER = 0x02;
+    const ASN1_SEQUENCE = 0x10;
+    const ASN1_BIT_STRING = 0x03;
+
+    /**
+     * When checking nbf, iat or expiration times,
+     * we want to provide some extra leeway time to
+     * account for clock skew.
+     */
+    public static $leeway = 0;
+
+    /**
+     * Allow the current timestamp to be specified.
+     * Useful for fixing a value within unit testing.
+     *
+     * Will default to PHP time() value if null.
+     */
+    public static $timestamp = null;
+
+    public static $supported_algs = array(
+        'ES384' => array('openssl', 'SHA384'),
+        'ES256' => array('openssl', 'SHA256'),
+        'HS256' => array('hash_hmac', 'SHA256'),
+        'HS384' => array('hash_hmac', 'SHA384'),
+        'HS512' => array('hash_hmac', 'SHA512'),
+        'RS256' => array('openssl', 'SHA256'),
+        'RS384' => array('openssl', 'SHA384'),
+        'RS512' => array('openssl', 'SHA512'),
+        'EdDSA' => array('sodium_crypto', 'EdDSA'),
+    );
+
+    /**
+     * Decodes a JWT string into a PHP object.
+     *
+     * @param string                    $jwt            The JWT
+     * @param string|array|resource     $key            The key, or map of keys.
+     *                                                  If the algorithm used is asymmetric, this is the public key
+     * @param array                     $allowed_algs   List of supported verification algorithms
+     *                                                  Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
+     *                                                  'HS512', 'RS256', 'RS384', and 'RS512'
+     *
+     * @return object The JWT's payload as a PHP object
+     *
+     * @throws InvalidArgumentException     Provided JWT was empty
+     * @throws UnexpectedValueException     Provided JWT was invalid
+     * @throws SignatureInvalidException    Provided JWT was invalid because the signature verification failed
+     * @throws BeforeValidException         Provided JWT is trying to be used before it's eligible as defined by 'nbf'
+     * @throws BeforeValidException         Provided JWT is trying to be used before it's been created as defined by 'iat'
+     * @throws ExpiredException             Provided JWT has since expired, as defined by the 'exp' claim
+     *
+     * @uses jsonDecode
+     * @uses urlsafeB64Decode
+     */
+    public static function decode($jwt, $key, array $allowed_algs = array())
+    {
+        $timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp;
+
+        if (empty($key)) {
+            throw new InvalidArgumentException('Key may not be empty');
+        }
+        $tks = \explode('.', $jwt);
+        if (\count($tks) != 3) {
+            throw new UnexpectedValueException('Wrong number of segments');
+        }
+        list($headb64, $bodyb64, $cryptob64) = $tks;
+        if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) {
+            throw new UnexpectedValueException('Invalid header encoding');
+        }
+        if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) {
+            throw new UnexpectedValueException('Invalid claims encoding');
+        }
+        if (false === ($sig = static::urlsafeB64Decode($cryptob64))) {
+            throw new UnexpectedValueException('Invalid signature encoding');
+        }
+        if (empty($header->alg)) {
+            throw new UnexpectedValueException('Empty algorithm');
+        }
+        if (empty(static::$supported_algs[$header->alg])) {
+            throw new UnexpectedValueException('Algorithm not supported');
+        }
+        if (!\in_array($header->alg, $allowed_algs)) {
+            throw new UnexpectedValueException('Algorithm not allowed');
+        }
+        if ($header->alg === 'ES256' || $header->alg === 'ES384') {
+            // OpenSSL expects an ASN.1 DER sequence for ES256/ES384 signatures
+            $sig = self::signatureToDER($sig);
+        }
+
+        if (\is_array($key) || $key instanceof \ArrayAccess) {
+            if (isset($header->kid)) {
+                if (!isset($key[$header->kid])) {
+                    throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
+                }
+                $key = $key[$header->kid];
+            } else {
+                throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
+            }
+        }
+
+        // Check the signature
+        if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) {
+            throw new SignatureInvalidException('Signature verification failed');
+        }
+
+        // Check the nbf if it is defined. This is the time that the
+        // token can actually be used. If it's not yet that time, abort.
+        if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
+            throw new BeforeValidException(
+                'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf)
+            );
+        }
+
+        // Check that this token has been created before 'now'. This prevents
+        // using tokens that have been created for later use (and haven't
+        // correctly used the nbf claim).
+        if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
+            throw new BeforeValidException(
+                'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat)
+            );
+        }
+
+        // Check if this token has expired.
+        if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) {
+            throw new ExpiredException('Expired token');
+        }
+
+        return $payload;
+    }
+
+    /**
+     * Converts and signs a PHP object or array into a JWT string.
+     *
+     * @param object|array      $payload    PHP object or array
+     * @param string|resource   $key        The secret key.
+     *                                      If the algorithm used is asymmetric, this is the private key
+     * @param string            $alg        The signing algorithm.
+     *                                      Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
+     *                                      'HS512', 'RS256', 'RS384', and 'RS512'
+     * @param mixed             $keyId
+     * @param array             $head       An array with header elements to attach
+     *
+     * @return string A signed JWT
+     *
+     * @uses jsonEncode
+     * @uses urlsafeB64Encode
+     */
+    public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)
+    {
+        $header = array('typ' => 'JWT', 'alg' => $alg);
+        if ($keyId !== null) {
+            $header['kid'] = $keyId;
+        }
+        if (isset($head) && \is_array($head)) {
+            $header = \array_merge($head, $header);
+        }
+        $segments = array();
+        $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
+        $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
+        $signing_input = \implode('.', $segments);
+
+        $signature = static::sign($signing_input, $key, $alg);
+        $segments[] = static::urlsafeB64Encode($signature);
+
+        return \implode('.', $segments);
+    }
+
+    /**
+     * Sign a string with a given key and algorithm.
+     *
+     * @param string            $msg    The message to sign
+     * @param string|resource   $key    The secret key
+     * @param string            $alg    The signing algorithm.
+     *                                  Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
+     *                                  'HS512', 'RS256', 'RS384', and 'RS512'
+     *
+     * @return string An encrypted message
+     *
+     * @throws DomainException Unsupported algorithm or bad key was specified
+     */
+    public static function sign($msg, $key, $alg = 'HS256')
+    {
+        if (empty(static::$supported_algs[$alg])) {
+            throw new DomainException('Algorithm not supported');
+        }
+        list($function, $algorithm) = static::$supported_algs[$alg];
+        switch ($function) {
+            case 'hash_hmac':
+                return \hash_hmac($algorithm, $msg, $key, true);
+            case 'openssl':
+                $signature = '';
+                $success = \openssl_sign($msg, $signature, $key, $algorithm);
+                if (!$success) {
+                    throw new DomainException("OpenSSL unable to sign data");
+                }
+                if ($alg === 'ES256') {
+                    $signature = self::signatureFromDER($signature, 256);
+                } elseif ($alg === 'ES384') {
+                    $signature = self::signatureFromDER($signature, 384);
+                }
+                return $signature;
+            case 'sodium_crypto':
+                if (!function_exists('sodium_crypto_sign_detached')) {
+                    throw new DomainException('libsodium is not available');
+                }
+                try {
+                    // The last non-empty line is used as the key.
+                    $lines = array_filter(explode("\n", $key));
+                    $key = base64_decode(end($lines));
+                    return sodium_crypto_sign_detached($msg, $key);
+                } catch (Exception $e) {
+                    throw new DomainException($e->getMessage(), 0, $e);
+                }
+        }
+    }
+
+    /**
+     * Verify a signature with the message, key and method. Not all methods
+     * are symmetric, so we must have a separate verify and sign method.
+     *
+     * @param string            $msg        The original message (header and body)
+     * @param string            $signature  The original signature
+     * @param string|resource   $key        For HS*, a string key works. for RS*, must be a resource of an openssl public key
+     * @param string            $alg        The algorithm
+     *
+     * @return bool
+     *
+     * @throws DomainException Invalid Algorithm, bad key, or OpenSSL failure
+     */
+    private static function verify($msg, $signature, $key, $alg)
+    {
+        if (empty(static::$supported_algs[$alg])) {
+            throw new DomainException('Algorithm not supported');
+        }
+
+        list($function, $algorithm) = static::$supported_algs[$alg];
+        switch ($function) {
+            case 'openssl':
+                $success = \openssl_verify($msg, $signature, $key, $algorithm);
+                if ($success === 1) {
+                    return true;
+                } elseif ($success === 0) {
+                    return false;
+                }
+                // returns 1 on success, 0 on failure, -1 on error.
+                throw new DomainException(
+                    'OpenSSL error: ' . \openssl_error_string()
+                );
+            case 'sodium_crypto':
+              if (!function_exists('sodium_crypto_sign_verify_detached')) {
+                  throw new DomainException('libsodium is not available');
+              }
+              try {
+                  // The last non-empty line is used as the key.
+                  $lines = array_filter(explode("\n", $key));
+                  $key = base64_decode(end($lines));
+                  return sodium_crypto_sign_verify_detached($signature, $msg, $key);
+              } catch (Exception $e) {
+                  throw new DomainException($e->getMessage(), 0, $e);
+              }
+            case 'hash_hmac':
+            default:
+                $hash = \hash_hmac($algorithm, $msg, $key, true);
+                if (\function_exists('hash_equals')) {
+                    return \hash_equals($signature, $hash);
+                }
+                $len = \min(static::safeStrlen($signature), static::safeStrlen($hash));
+
+                $status = 0;
+                for ($i = 0; $i < $len; $i++) {
+                    $status |= (\ord($signature[$i]) ^ \ord($hash[$i]));
+                }
+                $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash));
+
+                return ($status === 0);
+        }
+    }
+
+    /**
+     * Decode a JSON string into a PHP object.
+     *
+     * @param string $input JSON string
+     *
+     * @return object Object representation of JSON string
+     *
+     * @throws DomainException Provided string was invalid JSON
+     */
+    public static function jsonDecode($input)
+    {
+        if (\version_compare(PHP_VERSION, '5.4.0', '>=') && !(\defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
+            /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you
+             * to specify that large ints (like Steam Transaction IDs) should be treated as
+             * strings, rather than the PHP default behaviour of converting them to floats.
+             */
+            $obj = \json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
+        } else {
+            /** Not all servers will support that, however, so for older versions we must
+             * manually detect large ints in the JSON string and quote them (thus converting
+             *them to strings) before decoding, hence the preg_replace() call.
+             */
+            $max_int_length = \strlen((string) PHP_INT_MAX) - 1;
+            $json_without_bigints = \preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input);
+            $obj = \json_decode($json_without_bigints);
+        }
+
+        if ($errno = \json_last_error()) {
+            static::handleJsonError($errno);
+        } elseif ($obj === null && $input !== 'null') {
+            throw new DomainException('Null result with non-null input');
+        }
+        return $obj;
+    }
+
+    /**
+     * Encode a PHP object into a JSON string.
+     *
+     * @param object|array $input A PHP object or array
+     *
+     * @return string JSON representation of the PHP object or array
+     *
+     * @throws DomainException Provided object could not be encoded to valid JSON
+     */
+    public static function jsonEncode($input)
+    {
+        $json = \json_encode($input);
+        if ($errno = \json_last_error()) {
+            static::handleJsonError($errno);
+        } elseif ($json === 'null' && $input !== null) {
+            throw new DomainException('Null result with non-null input');
+        }
+        return $json;
+    }
+
+    /**
+     * Decode a string with URL-safe Base64.
+     *
+     * @param string $input A Base64 encoded string
+     *
+     * @return string A decoded string
+     */
+    public static function urlsafeB64Decode($input)
+    {
+        $remainder = \strlen($input) % 4;
+        if ($remainder) {
+            $padlen = 4 - $remainder;
+            $input .= \str_repeat('=', $padlen);
+        }
+        return \base64_decode(\strtr($input, '-_', '+/'));
+    }
+
+    /**
+     * Encode a string with URL-safe Base64.
+     *
+     * @param string $input The string you want encoded
+     *
+     * @return string The base64 encode of what you passed in
+     */
+    public static function urlsafeB64Encode($input)
+    {
+        return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_'));
+    }
+
+    /**
+     * Helper method to create a JSON error.
+     *
+     * @param int $errno An error number from json_last_error()
+     *
+     * @return void
+     */
+    private static function handleJsonError($errno)
+    {
+        $messages = array(
+            JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
+            JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
+            JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
+            JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
+            JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
+        );
+        throw new DomainException(
+            isset($messages[$errno])
+            ? $messages[$errno]
+            : 'Unknown JSON error: ' . $errno
+        );
+    }
+
+    /**
+     * Get the number of bytes in cryptographic strings.
+     *
+     * @param string $str
+     *
+     * @return int
+     */
+    private static function safeStrlen($str)
+    {
+        if (\function_exists('mb_strlen')) {
+            return \mb_strlen($str, '8bit');
+        }
+        return \strlen($str);
+    }
+
+    /**
+     * Convert an ECDSA signature to an ASN.1 DER sequence
+     *
+     * @param   string $sig The ECDSA signature to convert
+     * @return  string The encoded DER object
+     */
+    private static function signatureToDER($sig)
+    {
+        // Separate the signature into r-value and s-value
+        list($r, $s) = \str_split($sig, (int) (\strlen($sig) / 2));
+
+        // Trim leading zeros
+        $r = \ltrim($r, "\x00");
+        $s = \ltrim($s, "\x00");
+
+        // Convert r-value and s-value from unsigned big-endian integers to
+        // signed two's complement
+        if (\ord($r[0]) > 0x7f) {
+            $r = "\x00" . $r;
+        }
+        if (\ord($s[0]) > 0x7f) {
+            $s = "\x00" . $s;
+        }
+
+        return self::encodeDER(
+            self::ASN1_SEQUENCE,
+            self::encodeDER(self::ASN1_INTEGER, $r) .
+            self::encodeDER(self::ASN1_INTEGER, $s)
+        );
+    }
+
+    /**
+     * Encodes a value into a DER object.
+     *
+     * @param   int     $type DER tag
+     * @param   string  $value the value to encode
+     * @return  string  the encoded object
+     */
+    private static function encodeDER($type, $value)
+    {
+        $tag_header = 0;
+        if ($type === self::ASN1_SEQUENCE) {
+            $tag_header |= 0x20;
+        }
+
+        // Type
+        $der = \chr($tag_header | $type);
+
+        // Length
+        $der .= \chr(\strlen($value));
+
+        return $der . $value;
+    }
+
+    /**
+     * Encodes signature from a DER object.
+     *
+     * @param   string  $der binary signature in DER format
+     * @param   int     $keySize the number of bits in the key
+     * @return  string  the signature
+     */
+    private static function signatureFromDER($der, $keySize)
+    {
+        // OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE
+        list($offset, $_) = self::readDER($der);
+        list($offset, $r) = self::readDER($der, $offset);
+        list($offset, $s) = self::readDER($der, $offset);
+
+        // Convert r-value and s-value from signed two's compliment to unsigned
+        // big-endian integers
+        $r = \ltrim($r, "\x00");
+        $s = \ltrim($s, "\x00");
+
+        // Pad out r and s so that they are $keySize bits long
+        $r = \str_pad($r, $keySize / 8, "\x00", STR_PAD_LEFT);
+        $s = \str_pad($s, $keySize / 8, "\x00", STR_PAD_LEFT);
+
+        return $r . $s;
+    }
+
+    /**
+     * Reads binary DER-encoded data and decodes into a single object
+     *
+     * @param string $der the binary data in DER format
+     * @param int $offset the offset of the data stream containing the object
+     * to decode
+     * @return array [$offset, $data] the new offset and the decoded object
+     */
+    private static function readDER($der, $offset = 0)
+    {
+        $pos = $offset;
+        $size = \strlen($der);
+        $constructed = (\ord($der[$pos]) >> 5) & 0x01;
+        $type = \ord($der[$pos++]) & 0x1f;
+
+        // Length
+        $len = \ord($der[$pos++]);
+        if ($len & 0x80) {
+            $n = $len & 0x1f;
+            $len = 0;
+            while ($n-- && $pos < $size) {
+                $len = ($len << 8) | \ord($der[$pos++]);
+            }
+        }
+
+        // Value
+        if ($type == self::ASN1_BIT_STRING) {
+            $pos++; // Skip the first contents octet (padding indicator)
+            $data = \substr($der, $pos, $len - 1);
+            $pos += $len - 1;
+        } elseif (!$constructed) {
+            $data = \substr($der, $pos, $len);
+            $pos += $len;
+        } else {
+            $data = null;
+        }
+
+        return array($pos, $data);
+    }
+}
diff --git a/notemyprogress/classes/jwt/SignatureInvalidException.php b/notemyprogress/classes/jwt/SignatureInvalidException.php
new file mode 100644
index 0000000000000000000000000000000000000000..bbf4bdb9b12eab65cfc55a27e18c45fb626a6ff9
--- /dev/null
+++ b/notemyprogress/classes/jwt/SignatureInvalidException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace local_notemyprogress\jwt;
+
+class SignatureInvalidException extends \UnexpectedValueException
+{
+}
diff --git a/notemyprogress/classes/lib_trait.php b/notemyprogress/classes/lib_trait.php
index 7ee3262c10e479da086e20d9a6c54b21637da34e..6cf0537022a54ce834b8e0a3ee1ee08ec7e3f7d7 100644
--- a/notemyprogress/classes/lib_trait.php
+++ b/notemyprogress/classes/lib_trait.php
@@ -68,14 +68,14 @@ trait lib_trait
     }
 
     /**
-     * Obtiene el registro de un usuario en base al parámetro $user.
+     * Obtain the registration of a user based on the $ User parameter.
      *
-     * Si el parámetro $user no es string ni entero, se retorma el mismo valor del
-     * parámetro recibido
+     * If the $ User parameter is not string or whole, the same value of the
+     * Parameter received
      *
-     * @param string $user id del curso que se desea buscar en formato string, entero u objeto
+     * @Param String $ User Id of the course you want to search in String format, whole or object
      *
-     * @return mixed un objeto fieldset que contiene el primer registro que hace match a la consulta
+     * @RETURN MIXED An Fieldset object containing the first record that matches the consultation
      */
     public function get_user($user)
     {
@@ -278,13 +278,13 @@ trait lib_trait
     }
 
     /**
-     * Retorna un string que representa la fecha ($timestamp) Unix formateada usando el parámetro $format
-     * y tomando como referencia la zona horaria obtenida con la función 'get_timezone'
+     * Returns a string that represents the date ($ Timestamp) formatted using the $ format parameter
+     * And taking as reference the time zone obtained with the 'Get_timezone' function
      *
-     * @param $format string objeto que representa una sección de un curso
-     * @param $timestamp int entero que representa una marca temporal de Unix
+     * @param $ format string object represents a section of a course
+     * @param $ Timestamp INTRO that represents a temporary brand of UNIX
      *
-     * @return string cadena de texto con la fecha formateada
+     * @return string text chain with the formatted date
      */
     public function to_format($format, $timestamp)
     {
@@ -298,9 +298,9 @@ trait lib_trait
     }
 
     /**
-     * Retorna un entero que representa la cantidad de segundos desde la Época Unix (January 1 1970 00:00:00 GMT)
-     * hasta la fecha actual. La fecha actual se calcula en base a la zona horaria obtenida con la función
-     * 'get_timezone'.
+     * A integer returns that represents the amount of seconds since the UNIX era (January 1 1970 00:00:00 GMT)
+     * Until now.The current date is calculated based on the time zone obtained with the function
+     * 'Get_timezone'.
      *
      * @return int entero que representa la cantidad de segundos desde la Época Unix hasta la fecha actual
      */
diff --git a/notemyprogress/classes/observer/observer.php b/notemyprogress/classes/observer/observer.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4caea72c4787a8df619230e20419b4620508335
--- /dev/null
+++ b/notemyprogress/classes/observer/observer.php
@@ -0,0 +1,122 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * notemyprogress Observer
+ *
+ * @package     local_notemyprogress
+ * @autor       Edisson Sigua, Bryan Aguilar
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace local_notemyprogress\observer;
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * notemyprogress observer class.
+ *
+ * @package     local_notemyprogress
+ * @autor       Edisson Sigua, Bryan Aguilar
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class observer
+{
+
+    /**
+     * When a course is deleted.
+     *
+     * @param \core\event\course_deleted $event The event.
+     * @return void
+     */
+    public static function course_deleted(\core\event\course_deleted $event)
+    {
+        global $DB;
+
+        $courseid = $event->objectid;
+
+        // Clean up the data that could be left behind.
+        $conditions = array('courseid' => $courseid);
+//        $DB->delete_records('block_xp', $conditions);
+//        $DB->delete_records('block_xp_config', $conditions);
+//        $DB->delete_records('block_xp_filters', $conditions);
+//        $DB->delete_records('block_xp_log', $conditions);
+
+        // Flags. Note that this is based on the actually implementation.
+//        $sql = $DB->sql_like('name', ':name');
+//        $DB->delete_records_select('user_preferences', $sql, [
+//            'name' => 'block_xp-notice-block_intro_' . $courseid
+//        ]);
+//        $DB->delete_records_select('user_preferences', $sql, [
+//            'name' => 'block_xp_notify_level_up_' . $courseid
+//        ]);
+
+        // Delete the files.
+//        $fs = get_file_storage();
+//        $fs->delete_area_files($event->contextid, 'block_xp', 'badges');
+    }
+
+    /**
+     * Observe all events.
+     *
+     * @param \core\event\base $event The event.
+     * @return void
+     */
+    public static function catch_all(\core\event\base $event) {
+
+        global $COURSE, $USER;
+        $userid = $event->userid;
+        
+        if ($event->component === 'local_notemyprogress') {
+          // omit your own events.
+            return;
+        } else if (!$userid || isguestuser($userid) || is_siteadmin($userid)) {
+            // Omitting users and invited that in Hayan started Sesión.
+            return;
+        }
+        else if ($event->anonymous) {
+            // Omit all events marked as anonymous.
+            return;
+        }
+        else if (!in_array($event->contextlevel, array(CONTEXT_COURSE, CONTEXT_MODULE))) {
+            // Omit events that are not in the right context.
+            return;
+        } else if ($event->edulevel !== \core\event\base::LEVEL_PARTICIPATING) {
+            // Ignore events that are not participating.
+            return;
+        } else if (!$event->get_context()) {
+            // If for some reason the context does not exist ...
+            return;
+        }
+
+        try {
+            // It has been reported that this can generate an exception when the context is missing ...
+            $canearn = has_capability('local/notemyprogress:earnxp', $event->get_context(), $userid);
+        } catch (moodle_exception $e) {
+            return;
+        }
+
+        // Omit events if the user does not have the ability to earn points.
+        if (!$canearn) {
+            return;
+        }
+
+        $cs = new \local_notemyprogress\event_strategy($COURSE, $USER);
+        $cs->collect_event($event);
+    }
+
+}
\ No newline at end of file
diff --git a/notemyprogress/css/materialdesignicons.css b/notemyprogress/css/materialdesignicons.css
index 9954f8f7029dea12ba5b5b28ca094175db4b2ab1..9946b6be69608d3d74bd6d3cf1935215fe9e6543 100644
--- a/notemyprogress/css/materialdesignicons.css
+++ b/notemyprogress/css/materialdesignicons.css
@@ -1,3 +1,12121 @@
+<<<<<<< HEAD
 @font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=3.9.97");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=3.9.97") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=3.9.97") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=3.9.97") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=3.9.97") format("truetype");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point::before{content:"\F002"}.mdi-access-point-network::before{content:"\F003"}.mdi-access-point-network-off::before{content:"\FBBD"}.mdi-account::before{content:"\F004"}.mdi-account-alert::before{content:"\F005"}.mdi-account-alert-outline::before{content:"\FB2C"}.mdi-account-arrow-left::before{content:"\FB2D"}.mdi-account-arrow-left-outline::before{content:"\FB2E"}.mdi-account-arrow-right::before{content:"\FB2F"}.mdi-account-arrow-right-outline::before{content:"\FB30"}.mdi-account-badge::before{content:"\FD83"}.mdi-account-badge-alert::before{content:"\FD84"}.mdi-account-badge-alert-outline::before{content:"\FD85"}.mdi-account-badge-horizontal::before{content:"\FDF0"}.mdi-account-badge-horizontal-outline::before{content:"\FDF1"}.mdi-account-badge-outline::before{content:"\FD86"}.mdi-account-box::before{content:"\F006"}.mdi-account-box-multiple::before{content:"\F933"}.mdi-account-box-outline::before{content:"\F007"}.mdi-account-card-details::before{content:"\F5D2"}.mdi-account-card-details-outline::before{content:"\FD87"}.mdi-account-check::before{content:"\F008"}.mdi-account-check-outline::before{content:"\FBBE"}.mdi-account-child::before{content:"\FA88"}.mdi-account-child-circle::before{content:"\FA89"}.mdi-account-circle::before{content:"\F009"}.mdi-account-circle-outline::before{content:"\FB31"}.mdi-account-clock::before{content:"\FB32"}.mdi-account-clock-outline::before{content:"\FB33"}.mdi-account-convert::before{content:"\F00A"}.mdi-account-details::before{content:"\F631"}.mdi-account-edit::before{content:"\F6BB"}.mdi-account-group::before{content:"\F848"}.mdi-account-group-outline::before{content:"\FB34"}.mdi-account-heart::before{content:"\F898"}.mdi-account-heart-outline::before{content:"\FBBF"}.mdi-account-key::before{content:"\F00B"}.mdi-account-key-outline::before{content:"\FBC0"}.mdi-account-minus::before{content:"\F00D"}.mdi-account-minus-outline::before{content:"\FAEB"}.mdi-account-multiple::before{content:"\F00E"}.mdi-account-multiple-check::before{content:"\F8C4"}.mdi-account-multiple-minus::before{content:"\F5D3"}.mdi-account-multiple-minus-outline::before{content:"\FBC1"}.mdi-account-multiple-outline::before{content:"\F00F"}.mdi-account-multiple-plus::before{content:"\F010"}.mdi-account-multiple-plus-outline::before{content:"\F7FF"}.mdi-account-network::before{content:"\F011"}.mdi-account-network-outline::before{content:"\FBC2"}.mdi-account-off::before{content:"\F012"}.mdi-account-off-outline::before{content:"\FBC3"}.mdi-account-outline::before{content:"\F013"}.mdi-account-plus::before{content:"\F014"}.mdi-account-plus-outline::before{content:"\F800"}.mdi-account-question::before{content:"\FB35"}.mdi-account-question-outline::before{content:"\FB36"}.mdi-account-remove::before{content:"\F015"}.mdi-account-remove-outline::before{content:"\FAEC"}.mdi-account-search::before{content:"\F016"}.mdi-account-search-outline::before{content:"\F934"}.mdi-account-settings::before{content:"\F630"}.mdi-account-star::before{content:"\F017"}.mdi-account-star-outline::before{content:"\FBC4"}.mdi-account-supervisor::before{content:"\FA8A"}.mdi-account-supervisor-circle::before{content:"\FA8B"}.mdi-account-switch::before{content:"\F019"}.mdi-account-tie::before{content:"\FCBF"}.mdi-accusoft::before{content:"\F849"}.mdi-adchoices::before{content:"\FD1E"}.mdi-adjust::before{content:"\F01A"}.mdi-adobe::before{content:"\F935"}.mdi-air-conditioner::before{content:"\F01B"}.mdi-air-filter::before{content:"\FD1F"}.mdi-air-horn::before{content:"\FD88"}.mdi-air-purifier::before{content:"\FD20"}.mdi-airbag::before{content:"\FBC5"}.mdi-airballoon::before{content:"\F01C"}.mdi-airplane::before{content:"\F01D"}.mdi-airplane-landing::before{content:"\F5D4"}.mdi-airplane-off::before{content:"\F01E"}.mdi-airplane-takeoff::before{content:"\F5D5"}.mdi-airplay::before{content:"\F01F"}.mdi-airport::before{content:"\F84A"}.mdi-alarm::before{content:"\F020"}.mdi-alarm-bell::before{content:"\F78D"}.mdi-alarm-check::before{content:"\F021"}.mdi-alarm-light::before{content:"\F78E"}.mdi-alarm-light-outline::before{content:"\FBC6"}.mdi-alarm-multiple::before{content:"\F022"}.mdi-alarm-note::before{content:"\FE8E"}.mdi-alarm-note-off::before{content:"\FE8F"}.mdi-alarm-off::before{content:"\F023"}.mdi-alarm-plus::before{content:"\F024"}.mdi-alarm-snooze::before{content:"\F68D"}.mdi-album::before{content:"\F025"}.mdi-alert::before{content:"\F026"}.mdi-alert-box::before{content:"\F027"}.mdi-alert-box-outline::before{content:"\FCC0"}.mdi-alert-circle::before{content:"\F028"}.mdi-alert-circle-outline::before{content:"\F5D6"}.mdi-alert-decagram::before{content:"\F6BC"}.mdi-alert-decagram-outline::before{content:"\FCC1"}.mdi-alert-octagon::before{content:"\F029"}.mdi-alert-octagon-outline::before{content:"\FCC2"}.mdi-alert-octagram::before{content:"\F766"}.mdi-alert-octagram-outline::before{content:"\FCC3"}.mdi-alert-outline::before{content:"\F02A"}.mdi-alien::before{content:"\F899"}.mdi-all-inclusive::before{content:"\F6BD"}.mdi-alpha::before{content:"\F02B"}.mdi-alpha-a::before{content:"\41"}.mdi-alpha-a-box::before{content:"\FAED"}.mdi-alpha-a-box-outline::before{content:"\FBC7"}.mdi-alpha-a-circle::before{content:"\FBC8"}.mdi-alpha-a-circle-outline::before{content:"\FBC9"}.mdi-alpha-b::before{content:"\42"}.mdi-alpha-b-box::before{content:"\FAEE"}.mdi-alpha-b-box-outline::before{content:"\FBCA"}.mdi-alpha-b-circle::before{content:"\FBCB"}.mdi-alpha-b-circle-outline::before{content:"\FBCC"}.mdi-alpha-c::before{content:"\43"}.mdi-alpha-c-box::before{content:"\FAEF"}.mdi-alpha-c-box-outline::before{content:"\FBCD"}.mdi-alpha-c-circle::before{content:"\FBCE"}.mdi-alpha-c-circle-outline::before{content:"\FBCF"}.mdi-alpha-d::before{content:"\44"}.mdi-alpha-d-box::before{content:"\FAF0"}.mdi-alpha-d-box-outline::before{content:"\FBD0"}.mdi-alpha-d-circle::before{content:"\FBD1"}.mdi-alpha-d-circle-outline::before{content:"\FBD2"}.mdi-alpha-e::before{content:"\45"}.mdi-alpha-e-box::before{content:"\FAF1"}.mdi-alpha-e-box-outline::before{content:"\FBD3"}.mdi-alpha-e-circle::before{content:"\FBD4"}.mdi-alpha-e-circle-outline::before{content:"\FBD5"}.mdi-alpha-f::before{content:"\46"}.mdi-alpha-f-box::before{content:"\FAF2"}.mdi-alpha-f-box-outline::before{content:"\FBD6"}.mdi-alpha-f-circle::before{content:"\FBD7"}.mdi-alpha-f-circle-outline::before{content:"\FBD8"}.mdi-alpha-g::before{content:"\47"}.mdi-alpha-g-box::before{content:"\FAF3"}.mdi-alpha-g-box-outline::before{content:"\FBD9"}.mdi-alpha-g-circle::before{content:"\FBDA"}.mdi-alpha-g-circle-outline::before{content:"\FBDB"}.mdi-alpha-h::before{content:"\48"}.mdi-alpha-h-box::before{content:"\FAF4"}.mdi-alpha-h-box-outline::before{content:"\FBDC"}.mdi-alpha-h-circle::before{content:"\FBDD"}.mdi-alpha-h-circle-outline::before{content:"\FBDE"}.mdi-alpha-i::before{content:"\49"}.mdi-alpha-i-box::before{content:"\FAF5"}.mdi-alpha-i-box-outline::before{content:"\FBDF"}.mdi-alpha-i-circle::before{content:"\FBE0"}.mdi-alpha-i-circle-outline::before{content:"\FBE1"}.mdi-alpha-j::before{content:"\4A"}.mdi-alpha-j-box::before{content:"\FAF6"}.mdi-alpha-j-box-outline::before{content:"\FBE2"}.mdi-alpha-j-circle::before{content:"\FBE3"}.mdi-alpha-j-circle-outline::before{content:"\FBE4"}.mdi-alpha-k::before{content:"\4B"}.mdi-alpha-k-box::before{content:"\FAF7"}.mdi-alpha-k-box-outline::before{content:"\FBE5"}.mdi-alpha-k-circle::before{content:"\FBE6"}.mdi-alpha-k-circle-outline::before{content:"\FBE7"}.mdi-alpha-l::before{content:"\4C"}.mdi-alpha-l-box::before{content:"\FAF8"}.mdi-alpha-l-box-outline::before{content:"\FBE8"}.mdi-alpha-l-circle::before{content:"\FBE9"}.mdi-alpha-l-circle-outline::before{content:"\FBEA"}.mdi-alpha-m::before{content:"\4D"}.mdi-alpha-m-box::before{content:"\FAF9"}.mdi-alpha-m-box-outline::before{content:"\FBEB"}.mdi-alpha-m-circle::before{content:"\FBEC"}.mdi-alpha-m-circle-outline::before{content:"\FBED"}.mdi-alpha-n::before{content:"\4E"}.mdi-alpha-n-box::before{content:"\FAFA"}.mdi-alpha-n-box-outline::before{content:"\FBEE"}.mdi-alpha-n-circle::before{content:"\FBEF"}.mdi-alpha-n-circle-outline::before{content:"\FBF0"}.mdi-alpha-o::before{content:"\4F"}.mdi-alpha-o-box::before{content:"\FAFB"}.mdi-alpha-o-box-outline::before{content:"\FBF1"}.mdi-alpha-o-circle::before{content:"\FBF2"}.mdi-alpha-o-circle-outline::before{content:"\FBF3"}.mdi-alpha-p::before{content:"\50"}.mdi-alpha-p-box::before{content:"\FAFC"}.mdi-alpha-p-box-outline::before{content:"\FBF4"}.mdi-alpha-p-circle::before{content:"\FBF5"}.mdi-alpha-p-circle-outline::before{content:"\FBF6"}.mdi-alpha-q::before{content:"\51"}.mdi-alpha-q-box::before{content:"\FAFD"}.mdi-alpha-q-box-outline::before{content:"\FBF7"}.mdi-alpha-q-circle::before{content:"\FBF8"}.mdi-alpha-q-circle-outline::before{content:"\FBF9"}.mdi-alpha-r::before{content:"\52"}.mdi-alpha-r-box::before{content:"\FAFE"}.mdi-alpha-r-box-outline::before{content:"\FBFA"}.mdi-alpha-r-circle::before{content:"\FBFB"}.mdi-alpha-r-circle-outline::before{content:"\FBFC"}.mdi-alpha-s::before{content:"\53"}.mdi-alpha-s-box::before{content:"\FAFF"}.mdi-alpha-s-box-outline::before{content:"\FBFD"}.mdi-alpha-s-circle::before{content:"\FBFE"}.mdi-alpha-s-circle-outline::before{content:"\FBFF"}.mdi-alpha-t::before{content:"\54"}.mdi-alpha-t-box::before{content:"\FB00"}.mdi-alpha-t-box-outline::before{content:"\FC00"}.mdi-alpha-t-circle::before{content:"\FC01"}.mdi-alpha-t-circle-outline::before{content:"\FC02"}.mdi-alpha-u::before{content:"\55"}.mdi-alpha-u-box::before{content:"\FB01"}.mdi-alpha-u-box-outline::before{content:"\FC03"}.mdi-alpha-u-circle::before{content:"\FC04"}.mdi-alpha-u-circle-outline::before{content:"\FC05"}.mdi-alpha-v::before{content:"\56"}.mdi-alpha-v-box::before{content:"\FB02"}.mdi-alpha-v-box-outline::before{content:"\FC06"}.mdi-alpha-v-circle::before{content:"\FC07"}.mdi-alpha-v-circle-outline::before{content:"\FC08"}.mdi-alpha-w::before{content:"\57"}.mdi-alpha-w-box::before{content:"\FB03"}.mdi-alpha-w-box-outline::before{content:"\FC09"}.mdi-alpha-w-circle::before{content:"\FC0A"}.mdi-alpha-w-circle-outline::before{content:"\FC0B"}.mdi-alpha-x::before{content:"\58"}.mdi-alpha-x-box::before{content:"\FB04"}.mdi-alpha-x-box-outline::before{content:"\FC0C"}.mdi-alpha-x-circle::before{content:"\FC0D"}.mdi-alpha-x-circle-outline::before{content:"\FC0E"}.mdi-alpha-y::before{content:"\59"}.mdi-alpha-y-box::before{content:"\FB05"}.mdi-alpha-y-box-outline::before{content:"\FC0F"}.mdi-alpha-y-circle::before{content:"\FC10"}.mdi-alpha-y-circle-outline::before{content:"\FC11"}.mdi-alpha-z::before{content:"\5A"}.mdi-alpha-z-box::before{content:"\FB06"}.mdi-alpha-z-box-outline::before{content:"\FC12"}.mdi-alpha-z-circle::before{content:"\FC13"}.mdi-alpha-z-circle-outline::before{content:"\FC14"}.mdi-alphabetical::before{content:"\F02C"}.mdi-altimeter::before{content:"\F5D7"}.mdi-amazon::before{content:"\F02D"}.mdi-amazon-alexa::before{content:"\F8C5"}.mdi-amazon-drive::before{content:"\F02E"}.mdi-ambulance::before{content:"\F02F"}.mdi-ammunition::before{content:"\FCC4"}.mdi-ampersand::before{content:"\FA8C"}.mdi-amplifier::before{content:"\F030"}.mdi-anchor::before{content:"\F031"}.mdi-android::before{content:"\F032"}.mdi-android-auto::before{content:"\FA8D"}.mdi-android-debug-bridge::before{content:"\F033"}.mdi-android-head::before{content:"\F78F"}.mdi-android-messages::before{content:"\FD21"}.mdi-android-studio::before{content:"\F034"}.mdi-angle-acute::before{content:"\F936"}.mdi-angle-obtuse::before{content:"\F937"}.mdi-angle-right::before{content:"\F938"}.mdi-angular::before{content:"\F6B1"}.mdi-angularjs::before{content:"\F6BE"}.mdi-animation::before{content:"\F5D8"}.mdi-animation-outline::before{content:"\FA8E"}.mdi-animation-play::before{content:"\F939"}.mdi-animation-play-outline::before{content:"\FA8F"}.mdi-anvil::before{content:"\F89A"}.mdi-apple::before{content:"\F035"}.mdi-apple-finder::before{content:"\F036"}.mdi-apple-icloud::before{content:"\F038"}.mdi-apple-ios::before{content:"\F037"}.mdi-apple-keyboard-caps::before{content:"\F632"}.mdi-apple-keyboard-command::before{content:"\F633"}.mdi-apple-keyboard-control::before{content:"\F634"}.mdi-apple-keyboard-option::before{content:"\F635"}.mdi-apple-keyboard-shift::before{content:"\F636"}.mdi-apple-safari::before{content:"\F039"}.mdi-application::before{content:"\F614"}.mdi-application-export::before{content:"\FD89"}.mdi-application-import::before{content:"\FD8A"}.mdi-apps::before{content:"\F03B"}.mdi-apps-box::before{content:"\FD22"}.mdi-arch::before{content:"\F8C6"}.mdi-archive::before{content:"\F03C"}.mdi-arrange-bring-forward::before{content:"\F03D"}.mdi-arrange-bring-to-front::before{content:"\F03E"}.mdi-arrange-send-backward::before{content:"\F03F"}.mdi-arrange-send-to-back::before{content:"\F040"}.mdi-arrow-all::before{content:"\F041"}.mdi-arrow-bottom-left::before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline::before{content:"\F9B6"}.mdi-arrow-bottom-left-thick::before{content:"\F9B7"}.mdi-arrow-bottom-right::before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline::before{content:"\F9B8"}.mdi-arrow-bottom-right-thick::before{content:"\F9B9"}.mdi-arrow-collapse::before{content:"\F615"}.mdi-arrow-collapse-all::before{content:"\F044"}.mdi-arrow-collapse-down::before{content:"\F791"}.mdi-arrow-collapse-horizontal::before{content:"\F84B"}.mdi-arrow-collapse-left::before{content:"\F792"}.mdi-arrow-collapse-right::before{content:"\F793"}.mdi-arrow-collapse-up::before{content:"\F794"}.mdi-arrow-collapse-vertical::before{content:"\F84C"}.mdi-arrow-decision::before{content:"\F9BA"}.mdi-arrow-decision-auto::before{content:"\F9BB"}.mdi-arrow-decision-auto-outline::before{content:"\F9BC"}.mdi-arrow-decision-outline::before{content:"\F9BD"}.mdi-arrow-down::before{content:"\F045"}.mdi-arrow-down-bold::before{content:"\F72D"}.mdi-arrow-down-bold-box::before{content:"\F72E"}.mdi-arrow-down-bold-box-outline::before{content:"\F72F"}.mdi-arrow-down-bold-circle::before{content:"\F047"}.mdi-arrow-down-bold-circle-outline::before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline::before{content:"\F049"}.mdi-arrow-down-bold-outline::before{content:"\F9BE"}.mdi-arrow-down-box::before{content:"\F6BF"}.mdi-arrow-down-circle::before{content:"\FCB7"}.mdi-arrow-down-circle-outline::before{content:"\FCB8"}.mdi-arrow-down-drop-circle::before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline::before{content:"\F04B"}.mdi-arrow-down-thick::before{content:"\F046"}.mdi-arrow-expand::before{content:"\F616"}.mdi-arrow-expand-all::before{content:"\F04C"}.mdi-arrow-expand-down::before{content:"\F795"}.mdi-arrow-expand-horizontal::before{content:"\F84D"}.mdi-arrow-expand-left::before{content:"\F796"}.mdi-arrow-expand-right::before{content:"\F797"}.mdi-arrow-expand-up::before{content:"\F798"}.mdi-arrow-expand-vertical::before{content:"\F84E"}.mdi-arrow-left::before{content:"\F04D"}.mdi-arrow-left-bold::before{content:"\F730"}.mdi-arrow-left-bold-box::before{content:"\F731"}.mdi-arrow-left-bold-box-outline::before{content:"\F732"}.mdi-arrow-left-bold-circle::before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline::before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline::before{content:"\F051"}.mdi-arrow-left-bold-outline::before{content:"\F9BF"}.mdi-arrow-left-box::before{content:"\F6C0"}.mdi-arrow-left-circle::before{content:"\FCB9"}.mdi-arrow-left-circle-outline::before{content:"\FCBA"}.mdi-arrow-left-drop-circle::before{content:"\F052"}.mdi-arrow-left-drop-circle-outline::before{content:"\F053"}.mdi-arrow-left-right::before{content:"\FE90"}.mdi-arrow-left-right-bold::before{content:"\FE91"}.mdi-arrow-left-right-bold-outline::before{content:"\F9C0"}.mdi-arrow-left-thick::before{content:"\F04E"}.mdi-arrow-right::before{content:"\F054"}.mdi-arrow-right-bold::before{content:"\F733"}.mdi-arrow-right-bold-box::before{content:"\F734"}.mdi-arrow-right-bold-box-outline::before{content:"\F735"}.mdi-arrow-right-bold-circle::before{content:"\F056"}.mdi-arrow-right-bold-circle-outline::before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline::before{content:"\F058"}.mdi-arrow-right-bold-outline::before{content:"\F9C1"}.mdi-arrow-right-box::before{content:"\F6C1"}.mdi-arrow-right-circle::before{content:"\FCBB"}.mdi-arrow-right-circle-outline::before{content:"\FCBC"}.mdi-arrow-right-drop-circle::before{content:"\F059"}.mdi-arrow-right-drop-circle-outline::before{content:"\F05A"}.mdi-arrow-right-thick::before{content:"\F055"}.mdi-arrow-split-horizontal::before{content:"\F93A"}.mdi-arrow-split-vertical::before{content:"\F93B"}.mdi-arrow-top-left::before{content:"\F05B"}.mdi-arrow-top-left-bold-outline::before{content:"\F9C2"}.mdi-arrow-top-left-bottom-right::before{content:"\FE92"}.mdi-arrow-top-left-bottom-right-bold::before{content:"\FE93"}.mdi-arrow-top-left-thick::before{content:"\F9C3"}.mdi-arrow-top-right::before{content:"\F05C"}.mdi-arrow-top-right-bold-outline::before{content:"\F9C4"}.mdi-arrow-top-right-bottom-left::before{content:"\FE94"}.mdi-arrow-top-right-bottom-left-bold::before{content:"\FE95"}.mdi-arrow-top-right-thick::before{content:"\F9C5"}.mdi-arrow-up::before{content:"\F05D"}.mdi-arrow-up-bold::before{content:"\F736"}.mdi-arrow-up-bold-box::before{content:"\F737"}.mdi-arrow-up-bold-box-outline::before{content:"\F738"}.mdi-arrow-up-bold-circle::before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline::before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline::before{content:"\F061"}.mdi-arrow-up-bold-outline::before{content:"\F9C6"}.mdi-arrow-up-box::before{content:"\F6C2"}.mdi-arrow-up-circle::before{content:"\FCBD"}.mdi-arrow-up-circle-outline::before{content:"\FCBE"}.mdi-arrow-up-down::before{content:"\FE96"}.mdi-arrow-up-down-bold::before{content:"\FE97"}.mdi-arrow-up-down-bold-outline::before{content:"\F9C7"}.mdi-arrow-up-drop-circle::before{content:"\F062"}.mdi-arrow-up-drop-circle-outline::before{content:"\F063"}.mdi-arrow-up-thick::before{content:"\F05E"}.mdi-artist::before{content:"\F802"}.mdi-artist-outline::before{content:"\FCC5"}.mdi-artstation::before{content:"\FB37"}.mdi-aspect-ratio::before{content:"\FA23"}.mdi-assistant::before{content:"\F064"}.mdi-asterisk::before{content:"\F6C3"}.mdi-at::before{content:"\F065"}.mdi-atlassian::before{content:"\F803"}.mdi-atm::before{content:"\FD23"}.mdi-atom::before{content:"\F767"}.mdi-atom-variant::before{content:"\FE98"}.mdi-attachment::before{content:"\F066"}.mdi-audio-video::before{content:"\F93C"}.mdi-audiobook::before{content:"\F067"}.mdi-augmented-reality::before{content:"\F84F"}.mdi-auto-fix::before{content:"\F068"}.mdi-auto-upload::before{content:"\F069"}.mdi-autorenew::before{content:"\F06A"}.mdi-av-timer::before{content:"\F06B"}.mdi-aws::before{content:"\FDF2"}.mdi-axe::before{content:"\F8C7"}.mdi-axis::before{content:"\FD24"}.mdi-axis-arrow::before{content:"\FD25"}.mdi-axis-arrow-lock::before{content:"\FD26"}.mdi-axis-lock::before{content:"\FD27"}.mdi-axis-x-arrow::before{content:"\FD28"}.mdi-axis-x-arrow-lock::before{content:"\FD29"}.mdi-axis-x-rotate-clockwise::before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise::before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock::before{content:"\FD2C"}.mdi-axis-y-arrow::before{content:"\FD2D"}.mdi-axis-y-arrow-lock::before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise::before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise::before{content:"\FD30"}.mdi-axis-z-arrow::before{content:"\FD31"}.mdi-axis-z-arrow-lock::before{content:"\FD32"}.mdi-axis-z-rotate-clockwise::before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise::before{content:"\FD34"}.mdi-azure::before{content:"\F804"}.mdi-babel::before{content:"\FA24"}.mdi-baby::before{content:"\F06C"}.mdi-baby-bottle::before{content:"\FF56"}.mdi-baby-bottle-outline::before{content:"\FF57"}.mdi-baby-buggy::before{content:"\F68E"}.mdi-baby-face::before{content:"\FE99"}.mdi-baby-face-outline::before{content:"\FE9A"}.mdi-backburger::before{content:"\F06D"}.mdi-backspace::before{content:"\F06E"}.mdi-backspace-outline::before{content:"\FB38"}.mdi-backspace-reverse::before{content:"\FE9B"}.mdi-backspace-reverse-outline::before{content:"\FE9C"}.mdi-backup-restore::before{content:"\F06F"}.mdi-bacteria::before{content:"\FEF2"}.mdi-bacteria-outline::before{content:"\FEF3"}.mdi-badminton::before{content:"\F850"}.mdi-bag-carry-on::before{content:"\FF58"}.mdi-bag-carry-on-check::before{content:"\FD41"}.mdi-bag-carry-on-off::before{content:"\FF59"}.mdi-bag-checked::before{content:"\FF5A"}.mdi-bag-personal::before{content:"\FDF3"}.mdi-bag-personal-off::before{content:"\FDF4"}.mdi-bag-personal-off-outline::before{content:"\FDF5"}.mdi-bag-personal-outline::before{content:"\FDF6"}.mdi-baguette::before{content:"\FF5B"}.mdi-balloon::before{content:"\FA25"}.mdi-ballot::before{content:"\F9C8"}.mdi-ballot-outline::before{content:"\F9C9"}.mdi-ballot-recount::before{content:"\FC15"}.mdi-ballot-recount-outline::before{content:"\FC16"}.mdi-bandage::before{content:"\FD8B"}.mdi-bandcamp::before{content:"\F674"}.mdi-bank::before{content:"\F070"}.mdi-bank-minus::before{content:"\FD8C"}.mdi-bank-outline::before{content:"\FE9D"}.mdi-bank-plus::before{content:"\FD8D"}.mdi-bank-remove::before{content:"\FD8E"}.mdi-bank-transfer::before{content:"\FA26"}.mdi-bank-transfer-in::before{content:"\FA27"}.mdi-bank-transfer-out::before{content:"\FA28"}.mdi-barcode::before{content:"\F071"}.mdi-barcode-scan::before{content:"\F072"}.mdi-barley::before{content:"\F073"}.mdi-barley-off::before{content:"\FB39"}.mdi-barn::before{content:"\FB3A"}.mdi-barrel::before{content:"\F074"}.mdi-baseball::before{content:"\F851"}.mdi-baseball-bat::before{content:"\F852"}.mdi-basecamp::before{content:"\F075"}.mdi-basket::before{content:"\F076"}.mdi-basket-fill::before{content:"\F077"}.mdi-basket-unfill::before{content:"\F078"}.mdi-basketball::before{content:"\F805"}.mdi-basketball-hoop::before{content:"\FC17"}.mdi-basketball-hoop-outline::before{content:"\FC18"}.mdi-bat::before{content:"\FB3B"}.mdi-battery::before{content:"\F079"}.mdi-battery-10::before{content:"\F07A"}.mdi-battery-10-bluetooth::before{content:"\F93D"}.mdi-battery-20::before{content:"\F07B"}.mdi-battery-20-bluetooth::before{content:"\F93E"}.mdi-battery-30::before{content:"\F07C"}.mdi-battery-30-bluetooth::before{content:"\F93F"}.mdi-battery-40::before{content:"\F07D"}.mdi-battery-40-bluetooth::before{content:"\F940"}.mdi-battery-50::before{content:"\F07E"}.mdi-battery-50-bluetooth::before{content:"\F941"}.mdi-battery-60::before{content:"\F07F"}.mdi-battery-60-bluetooth::before{content:"\F942"}.mdi-battery-70::before{content:"\F080"}.mdi-battery-70-bluetooth::before{content:"\F943"}.mdi-battery-80::before{content:"\F081"}.mdi-battery-80-bluetooth::before{content:"\F944"}.mdi-battery-90::before{content:"\F082"}.mdi-battery-90-bluetooth::before{content:"\F945"}.mdi-battery-alert::before{content:"\F083"}.mdi-battery-alert-bluetooth::before{content:"\F946"}.mdi-battery-bluetooth::before{content:"\F947"}.mdi-battery-bluetooth-variant::before{content:"\F948"}.mdi-battery-charging::before{content:"\F084"}.mdi-battery-charging-10::before{content:"\F89B"}.mdi-battery-charging-100::before{content:"\F085"}.mdi-battery-charging-20::before{content:"\F086"}.mdi-battery-charging-30::before{content:"\F087"}.mdi-battery-charging-40::before{content:"\F088"}.mdi-battery-charging-50::before{content:"\F89C"}.mdi-battery-charging-60::before{content:"\F089"}.mdi-battery-charging-70::before{content:"\F89D"}.mdi-battery-charging-80::before{content:"\F08A"}.mdi-battery-charging-90::before{content:"\F08B"}.mdi-battery-charging-outline::before{content:"\F89E"}.mdi-battery-charging-wireless::before{content:"\F806"}.mdi-battery-charging-wireless-10::before{content:"\F807"}.mdi-battery-charging-wireless-20::before{content:"\F808"}.mdi-battery-charging-wireless-30::before{content:"\F809"}.mdi-battery-charging-wireless-40::before{content:"\F80A"}.mdi-battery-charging-wireless-50::before{content:"\F80B"}.mdi-battery-charging-wireless-60::before{content:"\F80C"}.mdi-battery-charging-wireless-70::before{content:"\F80D"}.mdi-battery-charging-wireless-80::before{content:"\F80E"}.mdi-battery-charging-wireless-90::before{content:"\F80F"}.mdi-battery-charging-wireless-alert::before{content:"\F810"}.mdi-battery-charging-wireless-outline::before{content:"\F811"}.mdi-battery-minus::before{content:"\F08C"}.mdi-battery-negative::before{content:"\F08D"}.mdi-battery-outline::before{content:"\F08E"}.mdi-battery-plus::before{content:"\F08F"}.mdi-battery-positive::before{content:"\F090"}.mdi-battery-unknown::before{content:"\F091"}.mdi-battery-unknown-bluetooth::before{content:"\F949"}.mdi-battlenet::before{content:"\FB3C"}.mdi-beach::before{content:"\F092"}.mdi-beaker::before{content:"\FCC6"}.mdi-beaker-outline::before{content:"\F68F"}.mdi-beats::before{content:"\F097"}.mdi-bed-empty::before{content:"\F89F"}.mdi-beer::before{content:"\F098"}.mdi-behance::before{content:"\F099"}.mdi-bell::before{content:"\F09A"}.mdi-bell-alert::before{content:"\FD35"}.mdi-bell-alert-outline::before{content:"\FE9E"}.mdi-bell-circle::before{content:"\FD36"}.mdi-bell-circle-outline::before{content:"\FD37"}.mdi-bell-off::before{content:"\F09B"}.mdi-bell-off-outline::before{content:"\FA90"}.mdi-bell-outline::before{content:"\F09C"}.mdi-bell-plus::before{content:"\F09D"}.mdi-bell-plus-outline::before{content:"\FA91"}.mdi-bell-ring::before{content:"\F09E"}.mdi-bell-ring-outline::before{content:"\F09F"}.mdi-bell-sleep::before{content:"\F0A0"}.mdi-bell-sleep-outline::before{content:"\FA92"}.mdi-beta::before{content:"\F0A1"}.mdi-betamax::before{content:"\F9CA"}.mdi-biathlon::before{content:"\FDF7"}.mdi-bible::before{content:"\F0A2"}.mdi-bike::before{content:"\F0A3"}.mdi-billiards::before{content:"\FB3D"}.mdi-billiards-rack::before{content:"\FB3E"}.mdi-bing::before{content:"\F0A4"}.mdi-binoculars::before{content:"\F0A5"}.mdi-bio::before{content:"\F0A6"}.mdi-biohazard::before{content:"\F0A7"}.mdi-bitbucket::before{content:"\F0A8"}.mdi-bitcoin::before{content:"\F812"}.mdi-black-mesa::before{content:"\F0A9"}.mdi-blackberry::before{content:"\F0AA"}.mdi-blender::before{content:"\FCC7"}.mdi-blender-software::before{content:"\F0AB"}.mdi-blinds::before{content:"\F0AC"}.mdi-block-helper::before{content:"\F0AD"}.mdi-blogger::before{content:"\F0AE"}.mdi-blood-bag::before{content:"\FCC8"}.mdi-bluetooth::before{content:"\F0AF"}.mdi-bluetooth-audio::before{content:"\F0B0"}.mdi-bluetooth-connect::before{content:"\F0B1"}.mdi-bluetooth-off::before{content:"\F0B2"}.mdi-bluetooth-settings::before{content:"\F0B3"}.mdi-bluetooth-transfer::before{content:"\F0B4"}.mdi-blur::before{content:"\F0B5"}.mdi-blur-linear::before{content:"\F0B6"}.mdi-blur-off::before{content:"\F0B7"}.mdi-blur-radial::before{content:"\F0B8"}.mdi-bolnisi-cross::before{content:"\FCC9"}.mdi-bolt::before{content:"\FD8F"}.mdi-bomb::before{content:"\F690"}.mdi-bomb-off::before{content:"\F6C4"}.mdi-bone::before{content:"\F0B9"}.mdi-book::before{content:"\F0BA"}.mdi-book-lock::before{content:"\F799"}.mdi-book-lock-open::before{content:"\F79A"}.mdi-book-minus::before{content:"\F5D9"}.mdi-book-minus-multiple::before{content:"\FA93"}.mdi-book-multiple::before{content:"\F0BB"}.mdi-book-open::before{content:"\F0BD"}.mdi-book-open-outline::before{content:"\FB3F"}.mdi-book-open-page-variant::before{content:"\F5DA"}.mdi-book-open-variant::before{content:"\F0BE"}.mdi-book-outline::before{content:"\FB40"}.mdi-book-play::before{content:"\FE9F"}.mdi-book-play-outline::before{content:"\FEA0"}.mdi-book-plus::before{content:"\F5DB"}.mdi-book-plus-multiple::before{content:"\FA94"}.mdi-book-remove::before{content:"\FA96"}.mdi-book-remove-multiple::before{content:"\FA95"}.mdi-book-search::before{content:"\FEA1"}.mdi-book-search-outline::before{content:"\FEA2"}.mdi-book-variant::before{content:"\F0BF"}.mdi-book-variant-multiple::before{content:"\F0BC"}.mdi-bookmark::before{content:"\F0C0"}.mdi-bookmark-check::before{content:"\F0C1"}.mdi-bookmark-minus::before{content:"\F9CB"}.mdi-bookmark-minus-outline::before{content:"\F9CC"}.mdi-bookmark-multiple::before{content:"\FDF8"}.mdi-bookmark-multiple-outline::before{content:"\FDF9"}.mdi-bookmark-music::before{content:"\F0C2"}.mdi-bookmark-off::before{content:"\F9CD"}.mdi-bookmark-off-outline::before{content:"\F9CE"}.mdi-bookmark-outline::before{content:"\F0C3"}.mdi-bookmark-plus::before{content:"\F0C5"}.mdi-bookmark-plus-outline::before{content:"\F0C4"}.mdi-bookmark-remove::before{content:"\F0C6"}.mdi-boom-gate::before{content:"\FEA3"}.mdi-boom-gate-alert::before{content:"\FEA4"}.mdi-boom-gate-alert-outline::before{content:"\FEA5"}.mdi-boom-gate-down::before{content:"\FEA6"}.mdi-boom-gate-down-outline::before{content:"\FEA7"}.mdi-boom-gate-outline::before{content:"\FEA8"}.mdi-boom-gate-up::before{content:"\FEA9"}.mdi-boom-gate-up-outline::before{content:"\FEAA"}.mdi-boombox::before{content:"\F5DC"}.mdi-bootstrap::before{content:"\F6C5"}.mdi-border-all::before{content:"\F0C7"}.mdi-border-all-variant::before{content:"\F8A0"}.mdi-border-bottom::before{content:"\F0C8"}.mdi-border-bottom-variant::before{content:"\F8A1"}.mdi-border-color::before{content:"\F0C9"}.mdi-border-horizontal::before{content:"\F0CA"}.mdi-border-inside::before{content:"\F0CB"}.mdi-border-left::before{content:"\F0CC"}.mdi-border-left-variant::before{content:"\F8A2"}.mdi-border-none::before{content:"\F0CD"}.mdi-border-none-variant::before{content:"\F8A3"}.mdi-border-outside::before{content:"\F0CE"}.mdi-border-right::before{content:"\F0CF"}.mdi-border-right-variant::before{content:"\F8A4"}.mdi-border-style::before{content:"\F0D0"}.mdi-border-top::before{content:"\F0D1"}.mdi-border-top-variant::before{content:"\F8A5"}.mdi-border-vertical::before{content:"\F0D2"}.mdi-bottle-wine::before{content:"\F853"}.mdi-bow-tie::before{content:"\F677"}.mdi-bowl::before{content:"\F617"}.mdi-bowling::before{content:"\F0D3"}.mdi-box::before{content:"\F0D4"}.mdi-box-cutter::before{content:"\F0D5"}.mdi-box-shadow::before{content:"\F637"}.mdi-boxing-glove::before{content:"\FB41"}.mdi-braille::before{content:"\F9CF"}.mdi-brain::before{content:"\F9D0"}.mdi-bread-slice::before{content:"\FCCA"}.mdi-bread-slice-outline::before{content:"\FCCB"}.mdi-bridge::before{content:"\F618"}.mdi-briefcase::before{content:"\F0D6"}.mdi-briefcase-account::before{content:"\FCCC"}.mdi-briefcase-account-outline::before{content:"\FCCD"}.mdi-briefcase-check::before{content:"\F0D7"}.mdi-briefcase-download::before{content:"\F0D8"}.mdi-briefcase-download-outline::before{content:"\FC19"}.mdi-briefcase-edit::before{content:"\FA97"}.mdi-briefcase-edit-outline::before{content:"\FC1A"}.mdi-briefcase-minus::before{content:"\FA29"}.mdi-briefcase-minus-outline::before{content:"\FC1B"}.mdi-briefcase-outline::before{content:"\F813"}.mdi-briefcase-plus::before{content:"\FA2A"}.mdi-briefcase-plus-outline::before{content:"\FC1C"}.mdi-briefcase-remove::before{content:"\FA2B"}.mdi-briefcase-remove-outline::before{content:"\FC1D"}.mdi-briefcase-search::before{content:"\FA2C"}.mdi-briefcase-search-outline::before{content:"\FC1E"}.mdi-briefcase-upload::before{content:"\F0D9"}.mdi-briefcase-upload-outline::before{content:"\FC1F"}.mdi-brightness-1::before{content:"\F0DA"}.mdi-brightness-2::before{content:"\F0DB"}.mdi-brightness-3::before{content:"\F0DC"}.mdi-brightness-4::before{content:"\F0DD"}.mdi-brightness-5::before{content:"\F0DE"}.mdi-brightness-6::before{content:"\F0DF"}.mdi-brightness-7::before{content:"\F0E0"}.mdi-brightness-auto::before{content:"\F0E1"}.mdi-brightness-percent::before{content:"\FCCE"}.mdi-broom::before{content:"\F0E2"}.mdi-brush::before{content:"\F0E3"}.mdi-buddhism::before{content:"\F94A"}.mdi-buffer::before{content:"\F619"}.mdi-bug::before{content:"\F0E4"}.mdi-bug-check::before{content:"\FA2D"}.mdi-bug-check-outline::before{content:"\FA2E"}.mdi-bug-outline::before{content:"\FA2F"}.mdi-bugle::before{content:"\FD90"}.mdi-bulldozer::before{content:"\FB07"}.mdi-bullet::before{content:"\FCCF"}.mdi-bulletin-board::before{content:"\F0E5"}.mdi-bullhorn::before{content:"\F0E6"}.mdi-bullhorn-outline::before{content:"\FB08"}.mdi-bullseye::before{content:"\F5DD"}.mdi-bullseye-arrow::before{content:"\F8C8"}.mdi-bus::before{content:"\F0E7"}.mdi-bus-alert::before{content:"\FA98"}.mdi-bus-articulated-end::before{content:"\F79B"}.mdi-bus-articulated-front::before{content:"\F79C"}.mdi-bus-clock::before{content:"\F8C9"}.mdi-bus-double-decker::before{content:"\F79D"}.mdi-bus-multiple::before{content:"\FF5C"}.mdi-bus-school::before{content:"\F79E"}.mdi-bus-side::before{content:"\F79F"}.mdi-cached::before{content:"\F0E8"}.mdi-cactus::before{content:"\FD91"}.mdi-cake::before{content:"\F0E9"}.mdi-cake-layered::before{content:"\F0EA"}.mdi-cake-variant::before{content:"\F0EB"}.mdi-calculator::before{content:"\F0EC"}.mdi-calculator-variant::before{content:"\FA99"}.mdi-calendar::before{content:"\F0ED"}.mdi-calendar-account::before{content:"\FEF4"}.mdi-calendar-account-outline::before{content:"\FEF5"}.mdi-calendar-alert::before{content:"\FA30"}.mdi-calendar-blank::before{content:"\F0EE"}.mdi-calendar-blank-outline::before{content:"\FB42"}.mdi-calendar-check::before{content:"\F0EF"}.mdi-calendar-check-outline::before{content:"\FC20"}.mdi-calendar-clock::before{content:"\F0F0"}.mdi-calendar-edit::before{content:"\F8A6"}.mdi-calendar-export::before{content:"\FB09"}.mdi-calendar-heart::before{content:"\F9D1"}.mdi-calendar-import::before{content:"\FB0A"}.mdi-calendar-minus::before{content:"\FD38"}.mdi-calendar-month::before{content:"\FDFA"}.mdi-calendar-month-outline::before{content:"\FDFB"}.mdi-calendar-multiple::before{content:"\F0F1"}.mdi-calendar-multiple-check::before{content:"\F0F2"}.mdi-calendar-multiselect::before{content:"\FA31"}.mdi-calendar-outline::before{content:"\FB43"}.mdi-calendar-plus::before{content:"\F0F3"}.mdi-calendar-question::before{content:"\F691"}.mdi-calendar-range::before{content:"\F678"}.mdi-calendar-range-outline::before{content:"\FB44"}.mdi-calendar-remove::before{content:"\F0F4"}.mdi-calendar-remove-outline::before{content:"\FC21"}.mdi-calendar-repeat::before{content:"\FEAB"}.mdi-calendar-repeat-outline::before{content:"\FEAC"}.mdi-calendar-search::before{content:"\F94B"}.mdi-calendar-star::before{content:"\F9D2"}.mdi-calendar-text::before{content:"\F0F5"}.mdi-calendar-text-outline::before{content:"\FC22"}.mdi-calendar-today::before{content:"\F0F6"}.mdi-calendar-week::before{content:"\FA32"}.mdi-calendar-week-begin::before{content:"\FA33"}.mdi-calendar-weekend::before{content:"\FEF6"}.mdi-calendar-weekend-outline::before{content:"\FEF7"}.mdi-call-made::before{content:"\F0F7"}.mdi-call-merge::before{content:"\F0F8"}.mdi-call-missed::before{content:"\F0F9"}.mdi-call-received::before{content:"\F0FA"}.mdi-call-split::before{content:"\F0FB"}.mdi-camcorder::before{content:"\F0FC"}.mdi-camcorder-box::before{content:"\F0FD"}.mdi-camcorder-box-off::before{content:"\F0FE"}.mdi-camcorder-off::before{content:"\F0FF"}.mdi-camera::before{content:"\F100"}.mdi-camera-account::before{content:"\F8CA"}.mdi-camera-burst::before{content:"\F692"}.mdi-camera-control::before{content:"\FB45"}.mdi-camera-enhance::before{content:"\F101"}.mdi-camera-enhance-outline::before{content:"\FB46"}.mdi-camera-front::before{content:"\F102"}.mdi-camera-front-variant::before{content:"\F103"}.mdi-camera-gopro::before{content:"\F7A0"}.mdi-camera-image::before{content:"\F8CB"}.mdi-camera-iris::before{content:"\F104"}.mdi-camera-metering-center::before{content:"\F7A1"}.mdi-camera-metering-matrix::before{content:"\F7A2"}.mdi-camera-metering-partial::before{content:"\F7A3"}.mdi-camera-metering-spot::before{content:"\F7A4"}.mdi-camera-off::before{content:"\F5DF"}.mdi-camera-outline::before{content:"\FD39"}.mdi-camera-party-mode::before{content:"\F105"}.mdi-camera-plus::before{content:"\FEF8"}.mdi-camera-plus-outline::before{content:"\FEF9"}.mdi-camera-rear::before{content:"\F106"}.mdi-camera-rear-variant::before{content:"\F107"}.mdi-camera-retake::before{content:"\FDFC"}.mdi-camera-retake-outline::before{content:"\FDFD"}.mdi-camera-switch::before{content:"\F108"}.mdi-camera-timer::before{content:"\F109"}.mdi-camera-wireless::before{content:"\FD92"}.mdi-camera-wireless-outline::before{content:"\FD93"}.mdi-campfire::before{content:"\FEFA"}.mdi-cancel::before{content:"\F739"}.mdi-candle::before{content:"\F5E2"}.mdi-candycane::before{content:"\F10A"}.mdi-cannabis::before{content:"\F7A5"}.mdi-caps-lock::before{content:"\FA9A"}.mdi-car::before{content:"\F10B"}.mdi-car-back::before{content:"\FDFE"}.mdi-car-battery::before{content:"\F10C"}.mdi-car-brake-abs::before{content:"\FC23"}.mdi-car-brake-alert::before{content:"\FC24"}.mdi-car-brake-hold::before{content:"\FD3A"}.mdi-car-brake-parking::before{content:"\FD3B"}.mdi-car-connected::before{content:"\F10D"}.mdi-car-convertible::before{content:"\F7A6"}.mdi-car-cruise-control::before{content:"\FD3C"}.mdi-car-defrost-front::before{content:"\FD3D"}.mdi-car-defrost-rear::before{content:"\FD3E"}.mdi-car-door::before{content:"\FB47"}.mdi-car-electric::before{content:"\FB48"}.mdi-car-esp::before{content:"\FC25"}.mdi-car-estate::before{content:"\F7A7"}.mdi-car-hatchback::before{content:"\F7A8"}.mdi-car-key::before{content:"\FB49"}.mdi-car-light-dimmed::before{content:"\FC26"}.mdi-car-light-fog::before{content:"\FC27"}.mdi-car-light-high::before{content:"\FC28"}.mdi-car-limousine::before{content:"\F8CC"}.mdi-car-multiple::before{content:"\FB4A"}.mdi-car-off::before{content:"\FDFF"}.mdi-car-parking-lights::before{content:"\FD3F"}.mdi-car-pickup::before{content:"\F7A9"}.mdi-car-shift-pattern::before{content:"\FF5D"}.mdi-car-side::before{content:"\F7AA"}.mdi-car-sports::before{content:"\F7AB"}.mdi-car-tire-alert::before{content:"\FC29"}.mdi-car-traction-control::before{content:"\FD40"}.mdi-car-wash::before{content:"\F10E"}.mdi-caravan::before{content:"\F7AC"}.mdi-card::before{content:"\FB4B"}.mdi-card-bulleted::before{content:"\FB4C"}.mdi-card-bulleted-off::before{content:"\FB4D"}.mdi-card-bulleted-off-outline::before{content:"\FB4E"}.mdi-card-bulleted-outline::before{content:"\FB4F"}.mdi-card-bulleted-settings::before{content:"\FB50"}.mdi-card-bulleted-settings-outline::before{content:"\FB51"}.mdi-card-outline::before{content:"\FB52"}.mdi-card-text::before{content:"\FB53"}.mdi-card-text-outline::before{content:"\FB54"}.mdi-cards::before{content:"\F638"}.mdi-cards-club::before{content:"\F8CD"}.mdi-cards-diamond::before{content:"\F8CE"}.mdi-cards-heart::before{content:"\F8CF"}.mdi-cards-outline::before{content:"\F639"}.mdi-cards-playing-outline::before{content:"\F63A"}.mdi-cards-spade::before{content:"\F8D0"}.mdi-cards-variant::before{content:"\F6C6"}.mdi-carrot::before{content:"\F10F"}.mdi-cart::before{content:"\F110"}.mdi-cart-arrow-down::before{content:"\FD42"}.mdi-cart-arrow-right::before{content:"\FC2A"}.mdi-cart-arrow-up::before{content:"\FD43"}.mdi-cart-minus::before{content:"\FD44"}.mdi-cart-off::before{content:"\F66B"}.mdi-cart-outline::before{content:"\F111"}.mdi-cart-plus::before{content:"\F112"}.mdi-cart-remove::before{content:"\FD45"}.mdi-case-sensitive-alt::before{content:"\F113"}.mdi-cash::before{content:"\F114"}.mdi-cash-100::before{content:"\F115"}.mdi-cash-marker::before{content:"\FD94"}.mdi-cash-multiple::before{content:"\F116"}.mdi-cash-refund::before{content:"\FA9B"}.mdi-cash-register::before{content:"\FCD0"}.mdi-cash-usd::before{content:"\F117"}.mdi-cassette::before{content:"\F9D3"}.mdi-cast::before{content:"\F118"}.mdi-cast-connected::before{content:"\F119"}.mdi-cast-education::before{content:"\FE6D"}.mdi-cast-off::before{content:"\F789"}.mdi-castle::before{content:"\F11A"}.mdi-cat::before{content:"\F11B"}.mdi-cctv::before{content:"\F7AD"}.mdi-ceiling-light::before{content:"\F768"}.mdi-cellphone::before{content:"\F11C"}.mdi-cellphone-android::before{content:"\F11D"}.mdi-cellphone-arrow-down::before{content:"\F9D4"}.mdi-cellphone-basic::before{content:"\F11E"}.mdi-cellphone-dock::before{content:"\F11F"}.mdi-cellphone-erase::before{content:"\F94C"}.mdi-cellphone-information::before{content:"\FF5E"}.mdi-cellphone-iphone::before{content:"\F120"}.mdi-cellphone-key::before{content:"\F94D"}.mdi-cellphone-link::before{content:"\F121"}.mdi-cellphone-link-off::before{content:"\F122"}.mdi-cellphone-lock::before{content:"\F94E"}.mdi-cellphone-message::before{content:"\F8D2"}.mdi-cellphone-nfc::before{content:"\FEAD"}.mdi-cellphone-off::before{content:"\F94F"}.mdi-cellphone-screenshot::before{content:"\FA34"}.mdi-cellphone-settings::before{content:"\F123"}.mdi-cellphone-settings-variant::before{content:"\F950"}.mdi-cellphone-sound::before{content:"\F951"}.mdi-cellphone-text::before{content:"\F8D1"}.mdi-cellphone-wireless::before{content:"\F814"}.mdi-celtic-cross::before{content:"\FCD1"}.mdi-certificate::before{content:"\F124"}.mdi-chair-rolling::before{content:"\FFBA"}.mdi-chair-school::before{content:"\F125"}.mdi-charity::before{content:"\FC2B"}.mdi-chart-arc::before{content:"\F126"}.mdi-chart-areaspline::before{content:"\F127"}.mdi-chart-areaspline-variant::before{content:"\FEAE"}.mdi-chart-bar::before{content:"\F128"}.mdi-chart-bar-stacked::before{content:"\F769"}.mdi-chart-bell-curve::before{content:"\FC2C"}.mdi-chart-bubble::before{content:"\F5E3"}.mdi-chart-donut::before{content:"\F7AE"}.mdi-chart-donut-variant::before{content:"\F7AF"}.mdi-chart-gantt::before{content:"\F66C"}.mdi-chart-histogram::before{content:"\F129"}.mdi-chart-line::before{content:"\F12A"}.mdi-chart-line-stacked::before{content:"\F76A"}.mdi-chart-line-variant::before{content:"\F7B0"}.mdi-chart-multiline::before{content:"\F8D3"}.mdi-chart-pie::before{content:"\F12B"}.mdi-chart-scatter-plot::before{content:"\FEAF"}.mdi-chart-scatter-plot-hexbin::before{content:"\F66D"}.mdi-chart-timeline::before{content:"\F66E"}.mdi-chart-timeline-variant::before{content:"\FEB0"}.mdi-chart-tree::before{content:"\FEB1"}.mdi-chat::before{content:"\FB55"}.mdi-chat-alert::before{content:"\FB56"}.mdi-chat-outline::before{content:"\FEFB"}.mdi-chat-processing::before{content:"\FB57"}.mdi-check::before{content:"\F12C"}.mdi-check-all::before{content:"\F12D"}.mdi-check-bold::before{content:"\FE6E"}.mdi-check-box-multiple-outline::before{content:"\FC2D"}.mdi-check-box-outline::before{content:"\FC2E"}.mdi-check-circle::before{content:"\F5E0"}.mdi-check-circle-outline::before{content:"\F5E1"}.mdi-check-decagram::before{content:"\F790"}.mdi-check-network::before{content:"\FC2F"}.mdi-check-network-outline::before{content:"\FC30"}.mdi-check-outline::before{content:"\F854"}.mdi-check-underline::before{content:"\FE70"}.mdi-check-underline-circle::before{content:"\FE71"}.mdi-check-underline-circle-outline::before{content:"\FE72"}.mdi-checkbook::before{content:"\FA9C"}.mdi-checkbox-blank::before{content:"\F12E"}.mdi-checkbox-blank-circle::before{content:"\F12F"}.mdi-checkbox-blank-circle-outline::before{content:"\F130"}.mdi-checkbox-blank-outline::before{content:"\F131"}.mdi-checkbox-intermediate::before{content:"\F855"}.mdi-checkbox-marked::before{content:"\F132"}.mdi-checkbox-marked-circle::before{content:"\F133"}.mdi-checkbox-marked-circle-outline::before{content:"\F134"}.mdi-checkbox-marked-outline::before{content:"\F135"}.mdi-checkbox-multiple-blank::before{content:"\F136"}.mdi-checkbox-multiple-blank-circle::before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline::before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline::before{content:"\F137"}.mdi-checkbox-multiple-marked::before{content:"\F138"}.mdi-checkbox-multiple-marked-circle::before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline::before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline::before{content:"\F139"}.mdi-checkerboard::before{content:"\F13A"}.mdi-chef-hat::before{content:"\FB58"}.mdi-chemical-weapon::before{content:"\F13B"}.mdi-chess-bishop::before{content:"\F85B"}.mdi-chess-king::before{content:"\F856"}.mdi-chess-knight::before{content:"\F857"}.mdi-chess-pawn::before{content:"\F858"}.mdi-chess-queen::before{content:"\F859"}.mdi-chess-rook::before{content:"\F85A"}.mdi-chevron-double-down::before{content:"\F13C"}.mdi-chevron-double-left::before{content:"\F13D"}.mdi-chevron-double-right::before{content:"\F13E"}.mdi-chevron-double-up::before{content:"\F13F"}.mdi-chevron-down::before{content:"\F140"}.mdi-chevron-down-box::before{content:"\F9D5"}.mdi-chevron-down-box-outline::before{content:"\F9D6"}.mdi-chevron-down-circle::before{content:"\FB0B"}.mdi-chevron-down-circle-outline::before{content:"\FB0C"}.mdi-chevron-left::before{content:"\F141"}.mdi-chevron-left-box::before{content:"\F9D7"}.mdi-chevron-left-box-outline::before{content:"\F9D8"}.mdi-chevron-left-circle::before{content:"\FB0D"}.mdi-chevron-left-circle-outline::before{content:"\FB0E"}.mdi-chevron-right::before{content:"\F142"}.mdi-chevron-right-box::before{content:"\F9D9"}.mdi-chevron-right-box-outline::before{content:"\F9DA"}.mdi-chevron-right-circle::before{content:"\FB0F"}.mdi-chevron-right-circle-outline::before{content:"\FB10"}.mdi-chevron-triple-down::before{content:"\FD95"}.mdi-chevron-triple-left::before{content:"\FD96"}.mdi-chevron-triple-right::before{content:"\FD97"}.mdi-chevron-triple-up::before{content:"\FD98"}.mdi-chevron-up::before{content:"\F143"}.mdi-chevron-up-box::before{content:"\F9DB"}.mdi-chevron-up-box-outline::before{content:"\F9DC"}.mdi-chevron-up-circle::before{content:"\FB11"}.mdi-chevron-up-circle-outline::before{content:"\FB12"}.mdi-chili-hot::before{content:"\F7B1"}.mdi-chili-medium::before{content:"\F7B2"}.mdi-chili-mild::before{content:"\F7B3"}.mdi-chip::before{content:"\F61A"}.mdi-christianity::before{content:"\F952"}.mdi-christianity-outline::before{content:"\FCD2"}.mdi-church::before{content:"\F144"}.mdi-circle::before{content:"\F764"}.mdi-circle-double::before{content:"\FEB2"}.mdi-circle-edit-outline::before{content:"\F8D4"}.mdi-circle-expand::before{content:"\FEB3"}.mdi-circle-medium::before{content:"\F9DD"}.mdi-circle-outline::before{content:"\F765"}.mdi-circle-slice-1::before{content:"\FA9D"}.mdi-circle-slice-2::before{content:"\FA9E"}.mdi-circle-slice-3::before{content:"\FA9F"}.mdi-circle-slice-4::before{content:"\FAA0"}.mdi-circle-slice-5::before{content:"\FAA1"}.mdi-circle-slice-6::before{content:"\FAA2"}.mdi-circle-slice-7::before{content:"\FAA3"}.mdi-circle-slice-8::before{content:"\FAA4"}.mdi-circle-small::before{content:"\F9DE"}.mdi-circular-saw::before{content:"\FE73"}.mdi-cisco-webex::before{content:"\F145"}.mdi-city::before{content:"\F146"}.mdi-city-variant::before{content:"\FA35"}.mdi-city-variant-outline::before{content:"\FA36"}.mdi-clipboard::before{content:"\F147"}.mdi-clipboard-account::before{content:"\F148"}.mdi-clipboard-account-outline::before{content:"\FC31"}.mdi-clipboard-alert::before{content:"\F149"}.mdi-clipboard-alert-outline::before{content:"\FCD3"}.mdi-clipboard-arrow-down::before{content:"\F14A"}.mdi-clipboard-arrow-down-outline::before{content:"\FC32"}.mdi-clipboard-arrow-left::before{content:"\F14B"}.mdi-clipboard-arrow-left-outline::before{content:"\FCD4"}.mdi-clipboard-arrow-right::before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline::before{content:"\FCD6"}.mdi-clipboard-arrow-up::before{content:"\FC33"}.mdi-clipboard-arrow-up-outline::before{content:"\FC34"}.mdi-clipboard-check::before{content:"\F14C"}.mdi-clipboard-check-outline::before{content:"\F8A7"}.mdi-clipboard-flow::before{content:"\F6C7"}.mdi-clipboard-outline::before{content:"\F14D"}.mdi-clipboard-play::before{content:"\FC35"}.mdi-clipboard-play-outline::before{content:"\FC36"}.mdi-clipboard-plus::before{content:"\F750"}.mdi-clipboard-pulse::before{content:"\F85C"}.mdi-clipboard-pulse-outline::before{content:"\F85D"}.mdi-clipboard-text::before{content:"\F14E"}.mdi-clipboard-text-outline::before{content:"\FA37"}.mdi-clipboard-text-play::before{content:"\FC37"}.mdi-clipboard-text-play-outline::before{content:"\FC38"}.mdi-clippy::before{content:"\F14F"}.mdi-clock::before{content:"\F953"}.mdi-clock-alert::before{content:"\F954"}.mdi-clock-alert-outline::before{content:"\F5CE"}.mdi-clock-digital::before{content:"\FEB4"}.mdi-clock-end::before{content:"\F151"}.mdi-clock-fast::before{content:"\F152"}.mdi-clock-in::before{content:"\F153"}.mdi-clock-out::before{content:"\F154"}.mdi-clock-outline::before{content:"\F150"}.mdi-clock-start::before{content:"\F155"}.mdi-close::before{content:"\F156"}.mdi-close-box::before{content:"\F157"}.mdi-close-box-multiple::before{content:"\FC39"}.mdi-close-box-multiple-outline::before{content:"\FC3A"}.mdi-close-box-outline::before{content:"\F158"}.mdi-close-circle::before{content:"\F159"}.mdi-close-circle-outline::before{content:"\F15A"}.mdi-close-network::before{content:"\F15B"}.mdi-close-network-outline::before{content:"\FC3B"}.mdi-close-octagon::before{content:"\F15C"}.mdi-close-octagon-outline::before{content:"\F15D"}.mdi-close-outline::before{content:"\F6C8"}.mdi-closed-caption::before{content:"\F15E"}.mdi-closed-caption-outline::before{content:"\FD99"}.mdi-cloud::before{content:"\F15F"}.mdi-cloud-alert::before{content:"\F9DF"}.mdi-cloud-braces::before{content:"\F7B4"}.mdi-cloud-check::before{content:"\F160"}.mdi-cloud-circle::before{content:"\F161"}.mdi-cloud-download::before{content:"\F162"}.mdi-cloud-download-outline::before{content:"\FB59"}.mdi-cloud-off-outline::before{content:"\F164"}.mdi-cloud-outline::before{content:"\F163"}.mdi-cloud-print::before{content:"\F165"}.mdi-cloud-print-outline::before{content:"\F166"}.mdi-cloud-question::before{content:"\FA38"}.mdi-cloud-search::before{content:"\F955"}.mdi-cloud-search-outline::before{content:"\F956"}.mdi-cloud-sync::before{content:"\F63F"}.mdi-cloud-tags::before{content:"\F7B5"}.mdi-cloud-upload::before{content:"\F167"}.mdi-cloud-upload-outline::before{content:"\FB5A"}.mdi-clover::before{content:"\F815"}.mdi-code-array::before{content:"\F168"}.mdi-code-braces::before{content:"\F169"}.mdi-code-brackets::before{content:"\F16A"}.mdi-code-equal::before{content:"\F16B"}.mdi-code-greater-than::before{content:"\F16C"}.mdi-code-greater-than-or-equal::before{content:"\F16D"}.mdi-code-less-than::before{content:"\F16E"}.mdi-code-less-than-or-equal::before{content:"\F16F"}.mdi-code-not-equal::before{content:"\F170"}.mdi-code-not-equal-variant::before{content:"\F171"}.mdi-code-parentheses::before{content:"\F172"}.mdi-code-string::before{content:"\F173"}.mdi-code-tags::before{content:"\F174"}.mdi-code-tags-check::before{content:"\F693"}.mdi-codepen::before{content:"\F175"}.mdi-coffee::before{content:"\F176"}.mdi-coffee-off::before{content:"\FFCA"}.mdi-coffee-off-outline::before{content:"\FFCB"}.mdi-coffee-outline::before{content:"\F6C9"}.mdi-coffee-to-go::before{content:"\F177"}.mdi-coffin::before{content:"\FB5B"}.mdi-cogs::before{content:"\F8D5"}.mdi-coin::before{content:"\F178"}.mdi-coins::before{content:"\F694"}.mdi-collage::before{content:"\F640"}.mdi-collapse-all::before{content:"\FAA5"}.mdi-collapse-all-outline::before{content:"\FAA6"}.mdi-color-helper::before{content:"\F179"}.mdi-comma::before{content:"\FE74"}.mdi-comma-box::before{content:"\FE75"}.mdi-comma-box-outline::before{content:"\FE76"}.mdi-comma-circle::before{content:"\FE77"}.mdi-comma-circle-outline::before{content:"\FE78"}.mdi-comment::before{content:"\F17A"}.mdi-comment-account::before{content:"\F17B"}.mdi-comment-account-outline::before{content:"\F17C"}.mdi-comment-alert::before{content:"\F17D"}.mdi-comment-alert-outline::before{content:"\F17E"}.mdi-comment-arrow-left::before{content:"\F9E0"}.mdi-comment-arrow-left-outline::before{content:"\F9E1"}.mdi-comment-arrow-right::before{content:"\F9E2"}.mdi-comment-arrow-right-outline::before{content:"\F9E3"}.mdi-comment-check::before{content:"\F17F"}.mdi-comment-check-outline::before{content:"\F180"}.mdi-comment-eye::before{content:"\FA39"}.mdi-comment-eye-outline::before{content:"\FA3A"}.mdi-comment-multiple::before{content:"\F85E"}.mdi-comment-multiple-outline::before{content:"\F181"}.mdi-comment-outline::before{content:"\F182"}.mdi-comment-plus::before{content:"\F9E4"}.mdi-comment-plus-outline::before{content:"\F183"}.mdi-comment-processing::before{content:"\F184"}.mdi-comment-processing-outline::before{content:"\F185"}.mdi-comment-question::before{content:"\F816"}.mdi-comment-question-outline::before{content:"\F186"}.mdi-comment-remove::before{content:"\F5DE"}.mdi-comment-remove-outline::before{content:"\F187"}.mdi-comment-search::before{content:"\FA3B"}.mdi-comment-search-outline::before{content:"\FA3C"}.mdi-comment-text::before{content:"\F188"}.mdi-comment-text-multiple::before{content:"\F85F"}.mdi-comment-text-multiple-outline::before{content:"\F860"}.mdi-comment-text-outline::before{content:"\F189"}.mdi-compare::before{content:"\F18A"}.mdi-compass::before{content:"\F18B"}.mdi-compass-off::before{content:"\FB5C"}.mdi-compass-off-outline::before{content:"\FB5D"}.mdi-compass-outline::before{content:"\F18C"}.mdi-console::before{content:"\F18D"}.mdi-console-line::before{content:"\F7B6"}.mdi-console-network::before{content:"\F8A8"}.mdi-console-network-outline::before{content:"\FC3C"}.mdi-contact-mail::before{content:"\F18E"}.mdi-contact-mail-outline::before{content:"\FEB5"}.mdi-contact-phone::before{content:"\FEB6"}.mdi-contact-phone-outline::before{content:"\FEB7"}.mdi-contactless-payment::before{content:"\FD46"}.mdi-contacts::before{content:"\F6CA"}.mdi-contain::before{content:"\FA3D"}.mdi-contain-end::before{content:"\FA3E"}.mdi-contain-start::before{content:"\FA3F"}.mdi-content-copy::before{content:"\F18F"}.mdi-content-cut::before{content:"\F190"}.mdi-content-duplicate::before{content:"\F191"}.mdi-content-paste::before{content:"\F192"}.mdi-content-save::before{content:"\F193"}.mdi-content-save-alert::before{content:"\FF5F"}.mdi-content-save-alert-outline::before{content:"\FF60"}.mdi-content-save-all::before{content:"\F194"}.mdi-content-save-all-outline::before{content:"\FF61"}.mdi-content-save-edit::before{content:"\FCD7"}.mdi-content-save-edit-outline::before{content:"\FCD8"}.mdi-content-save-move::before{content:"\FE79"}.mdi-content-save-move-outline::before{content:"\FE7A"}.mdi-content-save-outline::before{content:"\F817"}.mdi-content-save-settings::before{content:"\F61B"}.mdi-content-save-settings-outline::before{content:"\FB13"}.mdi-contrast::before{content:"\F195"}.mdi-contrast-box::before{content:"\F196"}.mdi-contrast-circle::before{content:"\F197"}.mdi-controller-classic::before{content:"\FB5E"}.mdi-controller-classic-outline::before{content:"\FB5F"}.mdi-cookie::before{content:"\F198"}.mdi-copyright::before{content:"\F5E6"}.mdi-cordova::before{content:"\F957"}.mdi-corn::before{content:"\F7B7"}.mdi-counter::before{content:"\F199"}.mdi-cow::before{content:"\F19A"}.mdi-cowboy::before{content:"\FEB8"}.mdi-cpu-32-bit::before{content:"\FEFC"}.mdi-cpu-64-bit::before{content:"\FEFD"}.mdi-crane::before{content:"\F861"}.mdi-creation::before{content:"\F1C9"}.mdi-creative-commons::before{content:"\FD47"}.mdi-credit-card::before{content:"\F19B"}.mdi-credit-card-clock::before{content:"\FEFE"}.mdi-credit-card-clock-outline::before{content:"\FFBC"}.mdi-credit-card-marker::before{content:"\FD9A"}.mdi-credit-card-multiple::before{content:"\F19C"}.mdi-credit-card-off::before{content:"\F5E4"}.mdi-credit-card-plus::before{content:"\F675"}.mdi-credit-card-refund::before{content:"\FAA7"}.mdi-credit-card-scan::before{content:"\F19D"}.mdi-credit-card-settings::before{content:"\F8D6"}.mdi-credit-card-wireless::before{content:"\FD48"}.mdi-cricket::before{content:"\FD49"}.mdi-crop::before{content:"\F19E"}.mdi-crop-free::before{content:"\F19F"}.mdi-crop-landscape::before{content:"\F1A0"}.mdi-crop-portrait::before{content:"\F1A1"}.mdi-crop-rotate::before{content:"\F695"}.mdi-crop-square::before{content:"\F1A2"}.mdi-crosshairs::before{content:"\F1A3"}.mdi-crosshairs-gps::before{content:"\F1A4"}.mdi-crosshairs-off::before{content:"\FF62"}.mdi-crown::before{content:"\F1A5"}.mdi-cryengine::before{content:"\F958"}.mdi-crystal-ball::before{content:"\FB14"}.mdi-cube::before{content:"\F1A6"}.mdi-cube-outline::before{content:"\F1A7"}.mdi-cube-scan::before{content:"\FB60"}.mdi-cube-send::before{content:"\F1A8"}.mdi-cube-unfolded::before{content:"\F1A9"}.mdi-cup::before{content:"\F1AA"}.mdi-cup-off::before{content:"\F5E5"}.mdi-cup-water::before{content:"\F1AB"}.mdi-cupboard::before{content:"\FF63"}.mdi-cupboard-outline::before{content:"\FF64"}.mdi-cupcake::before{content:"\F959"}.mdi-curling::before{content:"\F862"}.mdi-currency-bdt::before{content:"\F863"}.mdi-currency-brl::before{content:"\FB61"}.mdi-currency-btc::before{content:"\F1AC"}.mdi-currency-chf::before{content:"\F7B8"}.mdi-currency-cny::before{content:"\F7B9"}.mdi-currency-eth::before{content:"\F7BA"}.mdi-currency-eur::before{content:"\F1AD"}.mdi-currency-gbp::before{content:"\F1AE"}.mdi-currency-ils::before{content:"\FC3D"}.mdi-currency-inr::before{content:"\F1AF"}.mdi-currency-jpy::before{content:"\F7BB"}.mdi-currency-krw::before{content:"\F7BC"}.mdi-currency-kzt::before{content:"\F864"}.mdi-currency-ngn::before{content:"\F1B0"}.mdi-currency-php::before{content:"\F9E5"}.mdi-currency-rial::before{content:"\FEB9"}.mdi-currency-rub::before{content:"\F1B1"}.mdi-currency-sign::before{content:"\F7BD"}.mdi-currency-try::before{content:"\F1B2"}.mdi-currency-twd::before{content:"\F7BE"}.mdi-currency-usd::before{content:"\F1B3"}.mdi-currency-usd-off::before{content:"\F679"}.mdi-current-ac::before{content:"\F95A"}.mdi-current-dc::before{content:"\F95B"}.mdi-cursor-default::before{content:"\F1B4"}.mdi-cursor-default-click::before{content:"\FCD9"}.mdi-cursor-default-click-outline::before{content:"\FCDA"}.mdi-cursor-default-outline::before{content:"\F1B5"}.mdi-cursor-move::before{content:"\F1B6"}.mdi-cursor-pointer::before{content:"\F1B7"}.mdi-cursor-text::before{content:"\F5E7"}.mdi-database::before{content:"\F1B8"}.mdi-database-check::before{content:"\FAA8"}.mdi-database-edit::before{content:"\FB62"}.mdi-database-export::before{content:"\F95D"}.mdi-database-import::before{content:"\F95C"}.mdi-database-lock::before{content:"\FAA9"}.mdi-database-minus::before{content:"\F1B9"}.mdi-database-plus::before{content:"\F1BA"}.mdi-database-refresh::before{content:"\FCDB"}.mdi-database-remove::before{content:"\FCDC"}.mdi-database-search::before{content:"\F865"}.mdi-database-settings::before{content:"\FCDD"}.mdi-death-star::before{content:"\F8D7"}.mdi-death-star-variant::before{content:"\F8D8"}.mdi-deathly-hallows::before{content:"\FB63"}.mdi-debian::before{content:"\F8D9"}.mdi-debug-step-into::before{content:"\F1BB"}.mdi-debug-step-out::before{content:"\F1BC"}.mdi-debug-step-over::before{content:"\F1BD"}.mdi-decagram::before{content:"\F76B"}.mdi-decagram-outline::before{content:"\F76C"}.mdi-decimal-decrease::before{content:"\F1BE"}.mdi-decimal-increase::before{content:"\F1BF"}.mdi-delete::before{content:"\F1C0"}.mdi-delete-circle::before{content:"\F682"}.mdi-delete-circle-outline::before{content:"\FB64"}.mdi-delete-empty::before{content:"\F6CB"}.mdi-delete-empty-outline::before{content:"\FEBA"}.mdi-delete-forever::before{content:"\F5E8"}.mdi-delete-forever-outline::before{content:"\FB65"}.mdi-delete-outline::before{content:"\F9E6"}.mdi-delete-restore::before{content:"\F818"}.mdi-delete-sweep::before{content:"\F5E9"}.mdi-delete-sweep-outline::before{content:"\FC3E"}.mdi-delete-variant::before{content:"\F1C1"}.mdi-delta::before{content:"\F1C2"}.mdi-desk-lamp::before{content:"\F95E"}.mdi-deskphone::before{content:"\F1C3"}.mdi-desktop-classic::before{content:"\F7BF"}.mdi-desktop-mac::before{content:"\F1C4"}.mdi-desktop-mac-dashboard::before{content:"\F9E7"}.mdi-desktop-tower::before{content:"\F1C5"}.mdi-desktop-tower-monitor::before{content:"\FAAA"}.mdi-details::before{content:"\F1C6"}.mdi-dev-to::before{content:"\FD4A"}.mdi-developer-board::before{content:"\F696"}.mdi-deviantart::before{content:"\F1C7"}.mdi-dialpad::before{content:"\F61C"}.mdi-diameter::before{content:"\FC3F"}.mdi-diameter-outline::before{content:"\FC40"}.mdi-diameter-variant::before{content:"\FC41"}.mdi-diamond::before{content:"\FB66"}.mdi-diamond-outline::before{content:"\FB67"}.mdi-diamond-stone::before{content:"\F1C8"}.mdi-dice-1::before{content:"\F1CA"}.mdi-dice-2::before{content:"\F1CB"}.mdi-dice-3::before{content:"\F1CC"}.mdi-dice-4::before{content:"\F1CD"}.mdi-dice-5::before{content:"\F1CE"}.mdi-dice-6::before{content:"\F1CF"}.mdi-dice-d10::before{content:"\F76E"}.mdi-dice-d12::before{content:"\F866"}.mdi-dice-d20::before{content:"\F5EA"}.mdi-dice-d4::before{content:"\F5EB"}.mdi-dice-d6::before{content:"\F5EC"}.mdi-dice-d8::before{content:"\F5ED"}.mdi-dice-multiple::before{content:"\F76D"}.mdi-dictionary::before{content:"\F61D"}.mdi-dip-switch::before{content:"\F7C0"}.mdi-directions::before{content:"\F1D0"}.mdi-directions-fork::before{content:"\F641"}.mdi-disc::before{content:"\F5EE"}.mdi-disc-alert::before{content:"\F1D1"}.mdi-disc-player::before{content:"\F95F"}.mdi-discord::before{content:"\F66F"}.mdi-dishwasher::before{content:"\FAAB"}.mdi-disqus::before{content:"\F1D2"}.mdi-disqus-outline::before{content:"\F1D3"}.mdi-diving-flippers::before{content:"\FD9B"}.mdi-diving-helmet::before{content:"\FD9C"}.mdi-diving-scuba::before{content:"\FD9D"}.mdi-diving-scuba-flag::before{content:"\FD9E"}.mdi-diving-scuba-tank::before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple::before{content:"\FDA0"}.mdi-diving-snorkel::before{content:"\FDA1"}.mdi-division::before{content:"\F1D4"}.mdi-division-box::before{content:"\F1D5"}.mdi-dlna::before{content:"\FA40"}.mdi-dna::before{content:"\F683"}.mdi-dns::before{content:"\F1D6"}.mdi-dns-outline::before{content:"\FB68"}.mdi-do-not-disturb::before{content:"\F697"}.mdi-do-not-disturb-off::before{content:"\F698"}.mdi-docker::before{content:"\F867"}.mdi-doctor::before{content:"\FA41"}.mdi-dog::before{content:"\FA42"}.mdi-dog-service::before{content:"\FAAC"}.mdi-dog-side::before{content:"\FA43"}.mdi-dolby::before{content:"\F6B2"}.mdi-dolly::before{content:"\FEBB"}.mdi-domain::before{content:"\F1D7"}.mdi-domain-off::before{content:"\FD4B"}.mdi-donkey::before{content:"\F7C1"}.mdi-door::before{content:"\F819"}.mdi-door-closed::before{content:"\F81A"}.mdi-door-open::before{content:"\F81B"}.mdi-doorbell-video::before{content:"\F868"}.mdi-dot-net::before{content:"\FAAD"}.mdi-dots-horizontal::before{content:"\F1D8"}.mdi-dots-horizontal-circle::before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline::before{content:"\FB69"}.mdi-dots-vertical::before{content:"\F1D9"}.mdi-dots-vertical-circle::before{content:"\F7C3"}.mdi-dots-vertical-circle-outline::before{content:"\FB6A"}.mdi-douban::before{content:"\F699"}.mdi-download::before{content:"\F1DA"}.mdi-download-multiple::before{content:"\F9E8"}.mdi-download-network::before{content:"\F6F3"}.mdi-download-network-outline::before{content:"\FC42"}.mdi-download-outline::before{content:"\FB6B"}.mdi-drag::before{content:"\F1DB"}.mdi-drag-horizontal::before{content:"\F1DC"}.mdi-drag-variant::before{content:"\FB6C"}.mdi-drag-vertical::before{content:"\F1DD"}.mdi-drama-masks::before{content:"\FCDE"}.mdi-draw::before{content:"\FF66"}.mdi-drawing::before{content:"\F1DE"}.mdi-drawing-box::before{content:"\F1DF"}.mdi-dresser::before{content:"\FF67"}.mdi-dresser-outline::before{content:"\FF68"}.mdi-dribbble::before{content:"\F1E0"}.mdi-dribbble-box::before{content:"\F1E1"}.mdi-drone::before{content:"\F1E2"}.mdi-dropbox::before{content:"\F1E3"}.mdi-drupal::before{content:"\F1E4"}.mdi-duck::before{content:"\F1E5"}.mdi-dumbbell::before{content:"\F1E6"}.mdi-dump-truck::before{content:"\FC43"}.mdi-ear-hearing::before{content:"\F7C4"}.mdi-ear-hearing-off::before{content:"\FA44"}.mdi-earth::before{content:"\F1E7"}.mdi-earth-box::before{content:"\F6CC"}.mdi-earth-box-off::before{content:"\F6CD"}.mdi-earth-off::before{content:"\F1E8"}.mdi-edge::before{content:"\F1E9"}.mdi-egg::before{content:"\FAAE"}.mdi-egg-easter::before{content:"\FAAF"}.mdi-eight-track::before{content:"\F9E9"}.mdi-eject::before{content:"\F1EA"}.mdi-eject-outline::before{content:"\FB6D"}.mdi-electric-switch::before{content:"\FEBC"}.mdi-elephant::before{content:"\F7C5"}.mdi-elevation-decline::before{content:"\F1EB"}.mdi-elevation-rise::before{content:"\F1EC"}.mdi-elevator::before{content:"\F1ED"}.mdi-ellipse::before{content:"\FEBD"}.mdi-ellipse-outline::before{content:"\FEBE"}.mdi-email::before{content:"\F1EE"}.mdi-email-alert::before{content:"\F6CE"}.mdi-email-box::before{content:"\FCDF"}.mdi-email-check::before{content:"\FAB0"}.mdi-email-check-outline::before{content:"\FAB1"}.mdi-email-edit::before{content:"\FF00"}.mdi-email-edit-outline::before{content:"\FF01"}.mdi-email-lock::before{content:"\F1F1"}.mdi-email-mark-as-unread::before{content:"\FB6E"}.mdi-email-minus::before{content:"\FF02"}.mdi-email-minus-outline::before{content:"\FF03"}.mdi-email-multiple::before{content:"\FF04"}.mdi-email-multiple-outline::before{content:"\FF05"}.mdi-email-open::before{content:"\F1EF"}.mdi-email-open-multiple::before{content:"\FF06"}.mdi-email-open-multiple-outline::before{content:"\FF07"}.mdi-email-open-outline::before{content:"\F5EF"}.mdi-email-outline::before{content:"\F1F0"}.mdi-email-plus::before{content:"\F9EA"}.mdi-email-plus-outline::before{content:"\F9EB"}.mdi-email-search::before{content:"\F960"}.mdi-email-search-outline::before{content:"\F961"}.mdi-email-variant::before{content:"\F5F0"}.mdi-ember::before{content:"\FB15"}.mdi-emby::before{content:"\F6B3"}.mdi-emoticon::before{content:"\FC44"}.mdi-emoticon-angry::before{content:"\FC45"}.mdi-emoticon-angry-outline::before{content:"\FC46"}.mdi-emoticon-cool::before{content:"\FC47"}.mdi-emoticon-cool-outline::before{content:"\F1F3"}.mdi-emoticon-cry::before{content:"\FC48"}.mdi-emoticon-cry-outline::before{content:"\FC49"}.mdi-emoticon-dead::before{content:"\FC4A"}.mdi-emoticon-dead-outline::before{content:"\F69A"}.mdi-emoticon-devil::before{content:"\FC4B"}.mdi-emoticon-devil-outline::before{content:"\F1F4"}.mdi-emoticon-excited::before{content:"\FC4C"}.mdi-emoticon-excited-outline::before{content:"\F69B"}.mdi-emoticon-frown::before{content:"\FF69"}.mdi-emoticon-frown-outline::before{content:"\FF6A"}.mdi-emoticon-happy::before{content:"\FC4D"}.mdi-emoticon-happy-outline::before{content:"\F1F5"}.mdi-emoticon-kiss::before{content:"\FC4E"}.mdi-emoticon-kiss-outline::before{content:"\FC4F"}.mdi-emoticon-neutral::before{content:"\FC50"}.mdi-emoticon-neutral-outline::before{content:"\F1F6"}.mdi-emoticon-outline::before{content:"\F1F2"}.mdi-emoticon-poop::before{content:"\F1F7"}.mdi-emoticon-poop-outline::before{content:"\FC51"}.mdi-emoticon-sad::before{content:"\FC52"}.mdi-emoticon-sad-outline::before{content:"\F1F8"}.mdi-emoticon-tongue::before{content:"\F1F9"}.mdi-emoticon-tongue-outline::before{content:"\FC53"}.mdi-emoticon-wink::before{content:"\FC54"}.mdi-emoticon-wink-outline::before{content:"\FC55"}.mdi-engine::before{content:"\F1FA"}.mdi-engine-off::before{content:"\FA45"}.mdi-engine-off-outline::before{content:"\FA46"}.mdi-engine-outline::before{content:"\F1FB"}.mdi-equal::before{content:"\F1FC"}.mdi-equal-box::before{content:"\F1FD"}.mdi-equalizer::before{content:"\FEBF"}.mdi-equalizer-outline::before{content:"\FEC0"}.mdi-eraser::before{content:"\F1FE"}.mdi-eraser-variant::before{content:"\F642"}.mdi-escalator::before{content:"\F1FF"}.mdi-eslint::before{content:"\FC56"}.mdi-et::before{content:"\FAB2"}.mdi-ethereum::before{content:"\F869"}.mdi-ethernet::before{content:"\F200"}.mdi-ethernet-cable::before{content:"\F201"}.mdi-ethernet-cable-off::before{content:"\F202"}.mdi-etsy::before{content:"\F203"}.mdi-ev-station::before{content:"\F5F1"}.mdi-eventbrite::before{content:"\F7C6"}.mdi-evernote::before{content:"\F204"}.mdi-exclamation::before{content:"\F205"}.mdi-exit-run::before{content:"\FA47"}.mdi-exit-to-app::before{content:"\F206"}.mdi-expand-all::before{content:"\FAB3"}.mdi-expand-all-outline::before{content:"\FAB4"}.mdi-exponent::before{content:"\F962"}.mdi-exponent-box::before{content:"\F963"}.mdi-export::before{content:"\F207"}.mdi-export-variant::before{content:"\FB6F"}.mdi-eye::before{content:"\F208"}.mdi-eye-check::before{content:"\FCE0"}.mdi-eye-check-outline::before{content:"\FCE1"}.mdi-eye-circle::before{content:"\FB70"}.mdi-eye-circle-outline::before{content:"\FB71"}.mdi-eye-off::before{content:"\F209"}.mdi-eye-off-outline::before{content:"\F6D0"}.mdi-eye-outline::before{content:"\F6CF"}.mdi-eye-plus::before{content:"\F86A"}.mdi-eye-plus-outline::before{content:"\F86B"}.mdi-eye-settings::before{content:"\F86C"}.mdi-eye-settings-outline::before{content:"\F86D"}.mdi-eyedropper::before{content:"\F20A"}.mdi-eyedropper-variant::before{content:"\F20B"}.mdi-face::before{content:"\F643"}.mdi-face-agent::before{content:"\FD4C"}.mdi-face-outline::before{content:"\FB72"}.mdi-face-profile::before{content:"\F644"}.mdi-face-recognition::before{content:"\FC57"}.mdi-facebook::before{content:"\F20C"}.mdi-facebook-box::before{content:"\F20D"}.mdi-facebook-messenger::before{content:"\F20E"}.mdi-facebook-workplace::before{content:"\FB16"}.mdi-factory::before{content:"\F20F"}.mdi-fan::before{content:"\F210"}.mdi-fan-off::before{content:"\F81C"}.mdi-fast-forward::before{content:"\F211"}.mdi-fast-forward-10::before{content:"\FD4D"}.mdi-fast-forward-30::before{content:"\FCE2"}.mdi-fast-forward-outline::before{content:"\F6D1"}.mdi-fax::before{content:"\F212"}.mdi-feather::before{content:"\F6D2"}.mdi-feature-search::before{content:"\FA48"}.mdi-feature-search-outline::before{content:"\FA49"}.mdi-fedora::before{content:"\F8DA"}.mdi-ferris-wheel::before{content:"\FEC1"}.mdi-ferry::before{content:"\F213"}.mdi-file::before{content:"\F214"}.mdi-file-account::before{content:"\F73A"}.mdi-file-alert::before{content:"\FA4A"}.mdi-file-alert-outline::before{content:"\FA4B"}.mdi-file-cabinet::before{content:"\FAB5"}.mdi-file-cad::before{content:"\FF08"}.mdi-file-cad-box::before{content:"\FF09"}.mdi-file-cancel::before{content:"\FDA2"}.mdi-file-cancel-outline::before{content:"\FDA3"}.mdi-file-chart::before{content:"\F215"}.mdi-file-check::before{content:"\F216"}.mdi-file-check-outline::before{content:"\FE7B"}.mdi-file-cloud::before{content:"\F217"}.mdi-file-compare::before{content:"\F8A9"}.mdi-file-delimited::before{content:"\F218"}.mdi-file-delimited-outline::before{content:"\FEC2"}.mdi-file-document::before{content:"\F219"}.mdi-file-document-box::before{content:"\F21A"}.mdi-file-document-box-check::before{content:"\FEC3"}.mdi-file-document-box-check-outline::before{content:"\FEC4"}.mdi-file-document-box-minus::before{content:"\FEC5"}.mdi-file-document-box-minus-outline::before{content:"\FEC6"}.mdi-file-document-box-multiple::before{content:"\FAB6"}.mdi-file-document-box-multiple-outline::before{content:"\FAB7"}.mdi-file-document-box-outline::before{content:"\F9EC"}.mdi-file-document-box-plus::before{content:"\FEC7"}.mdi-file-document-box-plus-outline::before{content:"\FEC8"}.mdi-file-document-box-remove::before{content:"\FEC9"}.mdi-file-document-box-remove-outline::before{content:"\FECA"}.mdi-file-document-box-search::before{content:"\FECB"}.mdi-file-document-box-search-outline::before{content:"\FECC"}.mdi-file-document-edit::before{content:"\FDA4"}.mdi-file-document-edit-outline::before{content:"\FDA5"}.mdi-file-document-outline::before{content:"\F9ED"}.mdi-file-download::before{content:"\F964"}.mdi-file-download-outline::before{content:"\F965"}.mdi-file-excel::before{content:"\F21B"}.mdi-file-excel-box::before{content:"\F21C"}.mdi-file-export::before{content:"\F21D"}.mdi-file-eye::before{content:"\FDA6"}.mdi-file-eye-outline::before{content:"\FDA7"}.mdi-file-find::before{content:"\F21E"}.mdi-file-find-outline::before{content:"\FB73"}.mdi-file-hidden::before{content:"\F613"}.mdi-file-image::before{content:"\F21F"}.mdi-file-image-outline::before{content:"\FECD"}.mdi-file-import::before{content:"\F220"}.mdi-file-lock::before{content:"\F221"}.mdi-file-move::before{content:"\FAB8"}.mdi-file-multiple::before{content:"\F222"}.mdi-file-music::before{content:"\F223"}.mdi-file-music-outline::before{content:"\FE7C"}.mdi-file-outline::before{content:"\F224"}.mdi-file-pdf::before{content:"\F225"}.mdi-file-pdf-box::before{content:"\F226"}.mdi-file-pdf-outline::before{content:"\FE7D"}.mdi-file-percent::before{content:"\F81D"}.mdi-file-plus::before{content:"\F751"}.mdi-file-plus-outline::before{content:"\FF0A"}.mdi-file-powerpoint::before{content:"\F227"}.mdi-file-powerpoint-box::before{content:"\F228"}.mdi-file-presentation-box::before{content:"\F229"}.mdi-file-question::before{content:"\F86E"}.mdi-file-remove::before{content:"\FB74"}.mdi-file-replace::before{content:"\FB17"}.mdi-file-replace-outline::before{content:"\FB18"}.mdi-file-restore::before{content:"\F670"}.mdi-file-search::before{content:"\FC58"}.mdi-file-search-outline::before{content:"\FC59"}.mdi-file-send::before{content:"\F22A"}.mdi-file-table::before{content:"\FC5A"}.mdi-file-table-outline::before{content:"\FC5B"}.mdi-file-tree::before{content:"\F645"}.mdi-file-undo::before{content:"\F8DB"}.mdi-file-upload::before{content:"\FA4C"}.mdi-file-upload-outline::before{content:"\FA4D"}.mdi-file-video::before{content:"\F22B"}.mdi-file-video-outline::before{content:"\FE10"}.mdi-file-word::before{content:"\F22C"}.mdi-file-word-box::before{content:"\F22D"}.mdi-file-xml::before{content:"\F22E"}.mdi-film::before{content:"\F22F"}.mdi-filmstrip::before{content:"\F230"}.mdi-filmstrip-off::before{content:"\F231"}.mdi-filter::before{content:"\F232"}.mdi-filter-minus::before{content:"\FF0B"}.mdi-filter-minus-outline::before{content:"\FF0C"}.mdi-filter-outline::before{content:"\F233"}.mdi-filter-plus::before{content:"\FF0D"}.mdi-filter-plus-outline::before{content:"\FF0E"}.mdi-filter-remove::before{content:"\F234"}.mdi-filter-remove-outline::before{content:"\F235"}.mdi-filter-variant::before{content:"\F236"}.mdi-finance::before{content:"\F81E"}.mdi-find-replace::before{content:"\F6D3"}.mdi-fingerprint::before{content:"\F237"}.mdi-fingerprint-off::before{content:"\FECE"}.mdi-fire::before{content:"\F238"}.mdi-fire-extinguisher::before{content:"\FF0F"}.mdi-fire-truck::before{content:"\F8AA"}.mdi-firebase::before{content:"\F966"}.mdi-firefox::before{content:"\F239"}.mdi-fireplace::before{content:"\FE11"}.mdi-fireplace-off::before{content:"\FE12"}.mdi-firework::before{content:"\FE13"}.mdi-fish::before{content:"\F23A"}.mdi-fishbowl::before{content:"\FF10"}.mdi-fishbowl-outline::before{content:"\FF11"}.mdi-fit-to-page::before{content:"\FF12"}.mdi-fit-to-page-outline::before{content:"\FF13"}.mdi-flag::before{content:"\F23B"}.mdi-flag-checkered::before{content:"\F23C"}.mdi-flag-minus::before{content:"\FB75"}.mdi-flag-outline::before{content:"\F23D"}.mdi-flag-plus::before{content:"\FB76"}.mdi-flag-remove::before{content:"\FB77"}.mdi-flag-triangle::before{content:"\F23F"}.mdi-flag-variant::before{content:"\F240"}.mdi-flag-variant-outline::before{content:"\F23E"}.mdi-flare::before{content:"\FD4E"}.mdi-flash::before{content:"\F241"}.mdi-flash-alert::before{content:"\FF14"}.mdi-flash-alert-outline::before{content:"\FF15"}.mdi-flash-auto::before{content:"\F242"}.mdi-flash-circle::before{content:"\F81F"}.mdi-flash-off::before{content:"\F243"}.mdi-flash-outline::before{content:"\F6D4"}.mdi-flash-red-eye::before{content:"\F67A"}.mdi-flashlight::before{content:"\F244"}.mdi-flashlight-off::before{content:"\F245"}.mdi-flask::before{content:"\F093"}.mdi-flask-empty::before{content:"\F094"}.mdi-flask-empty-outline::before{content:"\F095"}.mdi-flask-outline::before{content:"\F096"}.mdi-flattr::before{content:"\F246"}.mdi-flickr::before{content:"\FCE3"}.mdi-flip-to-back::before{content:"\F247"}.mdi-flip-to-front::before{content:"\F248"}.mdi-floor-lamp::before{content:"\F8DC"}.mdi-floor-plan::before{content:"\F820"}.mdi-floppy::before{content:"\F249"}.mdi-floppy-variant::before{content:"\F9EE"}.mdi-flower::before{content:"\F24A"}.mdi-flower-outline::before{content:"\F9EF"}.mdi-flower-poppy::before{content:"\FCE4"}.mdi-flower-tulip::before{content:"\F9F0"}.mdi-flower-tulip-outline::before{content:"\F9F1"}.mdi-focus-auto::before{content:"\FF6B"}.mdi-focus-field::before{content:"\FF6C"}.mdi-focus-field-horizontal::before{content:"\FF6D"}.mdi-focus-field-vertical::before{content:"\FF6E"}.mdi-folder::before{content:"\F24B"}.mdi-folder-account::before{content:"\F24C"}.mdi-folder-account-outline::before{content:"\FB78"}.mdi-folder-alert::before{content:"\FDA8"}.mdi-folder-alert-outline::before{content:"\FDA9"}.mdi-folder-clock::before{content:"\FAB9"}.mdi-folder-clock-outline::before{content:"\FABA"}.mdi-folder-download::before{content:"\F24D"}.mdi-folder-edit::before{content:"\F8DD"}.mdi-folder-edit-outline::before{content:"\FDAA"}.mdi-folder-google-drive::before{content:"\F24E"}.mdi-folder-image::before{content:"\F24F"}.mdi-folder-key::before{content:"\F8AB"}.mdi-folder-key-network::before{content:"\F8AC"}.mdi-folder-key-network-outline::before{content:"\FC5C"}.mdi-folder-lock::before{content:"\F250"}.mdi-folder-lock-open::before{content:"\F251"}.mdi-folder-move::before{content:"\F252"}.mdi-folder-multiple::before{content:"\F253"}.mdi-folder-multiple-image::before{content:"\F254"}.mdi-folder-multiple-outline::before{content:"\F255"}.mdi-folder-network::before{content:"\F86F"}.mdi-folder-network-outline::before{content:"\FC5D"}.mdi-folder-open::before{content:"\F76F"}.mdi-folder-open-outline::before{content:"\FDAB"}.mdi-folder-outline::before{content:"\F256"}.mdi-folder-plus::before{content:"\F257"}.mdi-folder-plus-outline::before{content:"\FB79"}.mdi-folder-pound::before{content:"\FCE5"}.mdi-folder-pound-outline::before{content:"\FCE6"}.mdi-folder-remove::before{content:"\F258"}.mdi-folder-remove-outline::before{content:"\FB7A"}.mdi-folder-search::before{content:"\F967"}.mdi-folder-search-outline::before{content:"\F968"}.mdi-folder-star::before{content:"\F69C"}.mdi-folder-star-outline::before{content:"\FB7B"}.mdi-folder-sync::before{content:"\FCE7"}.mdi-folder-sync-outline::before{content:"\FCE8"}.mdi-folder-text::before{content:"\FC5E"}.mdi-folder-text-outline::before{content:"\FC5F"}.mdi-folder-upload::before{content:"\F259"}.mdi-font-awesome::before{content:"\F03A"}.mdi-food::before{content:"\F25A"}.mdi-food-apple::before{content:"\F25B"}.mdi-food-apple-outline::before{content:"\FC60"}.mdi-food-croissant::before{content:"\F7C7"}.mdi-food-fork-drink::before{content:"\F5F2"}.mdi-food-off::before{content:"\F5F3"}.mdi-food-variant::before{content:"\F25C"}.mdi-foot-print::before{content:"\FF6F"}.mdi-football::before{content:"\F25D"}.mdi-football-australian::before{content:"\F25E"}.mdi-football-helmet::before{content:"\F25F"}.mdi-forklift::before{content:"\F7C8"}.mdi-format-align-bottom::before{content:"\F752"}.mdi-format-align-center::before{content:"\F260"}.mdi-format-align-justify::before{content:"\F261"}.mdi-format-align-left::before{content:"\F262"}.mdi-format-align-middle::before{content:"\F753"}.mdi-format-align-right::before{content:"\F263"}.mdi-format-align-top::before{content:"\F754"}.mdi-format-annotation-minus::before{content:"\FABB"}.mdi-format-annotation-plus::before{content:"\F646"}.mdi-format-bold::before{content:"\F264"}.mdi-format-clear::before{content:"\F265"}.mdi-format-color-fill::before{content:"\F266"}.mdi-format-color-highlight::before{content:"\FE14"}.mdi-format-color-text::before{content:"\F69D"}.mdi-format-columns::before{content:"\F8DE"}.mdi-format-float-center::before{content:"\F267"}.mdi-format-float-left::before{content:"\F268"}.mdi-format-float-none::before{content:"\F269"}.mdi-format-float-right::before{content:"\F26A"}.mdi-format-font::before{content:"\F6D5"}.mdi-format-font-size-decrease::before{content:"\F9F2"}.mdi-format-font-size-increase::before{content:"\F9F3"}.mdi-format-header-1::before{content:"\F26B"}.mdi-format-header-2::before{content:"\F26C"}.mdi-format-header-3::before{content:"\F26D"}.mdi-format-header-4::before{content:"\F26E"}.mdi-format-header-5::before{content:"\F26F"}.mdi-format-header-6::before{content:"\F270"}.mdi-format-header-decrease::before{content:"\F271"}.mdi-format-header-equal::before{content:"\F272"}.mdi-format-header-increase::before{content:"\F273"}.mdi-format-header-pound::before{content:"\F274"}.mdi-format-horizontal-align-center::before{content:"\F61E"}.mdi-format-horizontal-align-left::before{content:"\F61F"}.mdi-format-horizontal-align-right::before{content:"\F620"}.mdi-format-indent-decrease::before{content:"\F275"}.mdi-format-indent-increase::before{content:"\F276"}.mdi-format-italic::before{content:"\F277"}.mdi-format-letter-case::before{content:"\FB19"}.mdi-format-letter-case-lower::before{content:"\FB1A"}.mdi-format-letter-case-upper::before{content:"\FB1B"}.mdi-format-line-spacing::before{content:"\F278"}.mdi-format-line-style::before{content:"\F5C8"}.mdi-format-line-weight::before{content:"\F5C9"}.mdi-format-list-bulleted::before{content:"\F279"}.mdi-format-list-bulleted-square::before{content:"\FDAC"}.mdi-format-list-bulleted-type::before{content:"\F27A"}.mdi-format-list-checkbox::before{content:"\F969"}.mdi-format-list-checks::before{content:"\F755"}.mdi-format-list-numbered::before{content:"\F27B"}.mdi-format-list-numbered-rtl::before{content:"\FCE9"}.mdi-format-list-triangle::before{content:"\FECF"}.mdi-format-overline::before{content:"\FED0"}.mdi-format-page-break::before{content:"\F6D6"}.mdi-format-paint::before{content:"\F27C"}.mdi-format-paragraph::before{content:"\F27D"}.mdi-format-pilcrow::before{content:"\F6D7"}.mdi-format-quote-close::before{content:"\F27E"}.mdi-format-quote-open::before{content:"\F756"}.mdi-format-rotate-90::before{content:"\F6A9"}.mdi-format-section::before{content:"\F69E"}.mdi-format-size::before{content:"\F27F"}.mdi-format-strikethrough::before{content:"\F280"}.mdi-format-strikethrough-variant::before{content:"\F281"}.mdi-format-subscript::before{content:"\F282"}.mdi-format-superscript::before{content:"\F283"}.mdi-format-text::before{content:"\F284"}.mdi-format-text-rotation-down::before{content:"\FD4F"}.mdi-format-text-rotation-none::before{content:"\FD50"}.mdi-format-text-variant::before{content:"\FE15"}.mdi-format-text-wrapping-clip::before{content:"\FCEA"}.mdi-format-text-wrapping-overflow::before{content:"\FCEB"}.mdi-format-text-wrapping-wrap::before{content:"\FCEC"}.mdi-format-textbox::before{content:"\FCED"}.mdi-format-textdirection-l-to-r::before{content:"\F285"}.mdi-format-textdirection-r-to-l::before{content:"\F286"}.mdi-format-title::before{content:"\F5F4"}.mdi-format-underline::before{content:"\F287"}.mdi-format-vertical-align-bottom::before{content:"\F621"}.mdi-format-vertical-align-center::before{content:"\F622"}.mdi-format-vertical-align-top::before{content:"\F623"}.mdi-format-wrap-inline::before{content:"\F288"}.mdi-format-wrap-square::before{content:"\F289"}.mdi-format-wrap-tight::before{content:"\F28A"}.mdi-format-wrap-top-bottom::before{content:"\F28B"}.mdi-forum::before{content:"\F28C"}.mdi-forum-outline::before{content:"\F821"}.mdi-forward::before{content:"\F28D"}.mdi-forwardburger::before{content:"\FD51"}.mdi-fountain::before{content:"\F96A"}.mdi-fountain-pen::before{content:"\FCEE"}.mdi-fountain-pen-tip::before{content:"\FCEF"}.mdi-foursquare::before{content:"\F28E"}.mdi-freebsd::before{content:"\F8DF"}.mdi-frequently-asked-questions::before{content:"\FED1"}.mdi-fridge::before{content:"\F290"}.mdi-fridge-bottom::before{content:"\F292"}.mdi-fridge-outline::before{content:"\F28F"}.mdi-fridge-top::before{content:"\F291"}.mdi-fuel::before{content:"\F7C9"}.mdi-fullscreen::before{content:"\F293"}.mdi-fullscreen-exit::before{content:"\F294"}.mdi-function::before{content:"\F295"}.mdi-function-variant::before{content:"\F870"}.mdi-fuse::before{content:"\FC61"}.mdi-fuse-blade::before{content:"\FC62"}.mdi-gamepad::before{content:"\F296"}.mdi-gamepad-circle::before{content:"\FE16"}.mdi-gamepad-circle-down::before{content:"\FE17"}.mdi-gamepad-circle-left::before{content:"\FE18"}.mdi-gamepad-circle-outline::before{content:"\FE19"}.mdi-gamepad-circle-right::before{content:"\FE1A"}.mdi-gamepad-circle-up::before{content:"\FE1B"}.mdi-gamepad-down::before{content:"\FE1C"}.mdi-gamepad-left::before{content:"\FE1D"}.mdi-gamepad-right::before{content:"\FE1E"}.mdi-gamepad-round::before{content:"\FE1F"}.mdi-gamepad-round-down::before{content:"\FE7E"}.mdi-gamepad-round-left::before{content:"\FE7F"}.mdi-gamepad-round-outline::before{content:"\FE80"}.mdi-gamepad-round-right::before{content:"\FE81"}.mdi-gamepad-round-up::before{content:"\FE82"}.mdi-gamepad-square::before{content:"\FED2"}.mdi-gamepad-square-outline::before{content:"\FED3"}.mdi-gamepad-up::before{content:"\FE83"}.mdi-gamepad-variant::before{content:"\F297"}.mdi-gamepad-variant-outline::before{content:"\FED4"}.mdi-gantry-crane::before{content:"\FDAD"}.mdi-garage::before{content:"\F6D8"}.mdi-garage-alert::before{content:"\F871"}.mdi-garage-open::before{content:"\F6D9"}.mdi-gas-cylinder::before{content:"\F647"}.mdi-gas-station::before{content:"\F298"}.mdi-gas-station-outline::before{content:"\FED5"}.mdi-gate::before{content:"\F299"}.mdi-gate-and::before{content:"\F8E0"}.mdi-gate-nand::before{content:"\F8E1"}.mdi-gate-nor::before{content:"\F8E2"}.mdi-gate-not::before{content:"\F8E3"}.mdi-gate-or::before{content:"\F8E4"}.mdi-gate-xnor::before{content:"\F8E5"}.mdi-gate-xor::before{content:"\F8E6"}.mdi-gatsby::before{content:"\FE84"}.mdi-gauge::before{content:"\F29A"}.mdi-gauge-empty::before{content:"\F872"}.mdi-gauge-full::before{content:"\F873"}.mdi-gauge-low::before{content:"\F874"}.mdi-gavel::before{content:"\F29B"}.mdi-gender-female::before{content:"\F29C"}.mdi-gender-male::before{content:"\F29D"}.mdi-gender-male-female::before{content:"\F29E"}.mdi-gender-transgender::before{content:"\F29F"}.mdi-gentoo::before{content:"\F8E7"}.mdi-gesture::before{content:"\F7CA"}.mdi-gesture-double-tap::before{content:"\F73B"}.mdi-gesture-pinch::before{content:"\FABC"}.mdi-gesture-spread::before{content:"\FABD"}.mdi-gesture-swipe::before{content:"\FD52"}.mdi-gesture-swipe-down::before{content:"\F73C"}.mdi-gesture-swipe-horizontal::before{content:"\FABE"}.mdi-gesture-swipe-left::before{content:"\F73D"}.mdi-gesture-swipe-right::before{content:"\F73E"}.mdi-gesture-swipe-up::before{content:"\F73F"}.mdi-gesture-swipe-vertical::before{content:"\FABF"}.mdi-gesture-tap::before{content:"\F740"}.mdi-gesture-tap-hold::before{content:"\FD53"}.mdi-gesture-two-double-tap::before{content:"\F741"}.mdi-gesture-two-tap::before{content:"\F742"}.mdi-ghost::before{content:"\F2A0"}.mdi-ghost-off::before{content:"\F9F4"}.mdi-gif::before{content:"\FD54"}.mdi-gift::before{content:"\FE85"}.mdi-gift-outline::before{content:"\F2A1"}.mdi-git::before{content:"\F2A2"}.mdi-github-box::before{content:"\F2A3"}.mdi-github-circle::before{content:"\F2A4"}.mdi-github-face::before{content:"\F6DA"}.mdi-gitlab::before{content:"\FB7C"}.mdi-glass-cocktail::before{content:"\F356"}.mdi-glass-flute::before{content:"\F2A5"}.mdi-glass-mug::before{content:"\F2A6"}.mdi-glass-stange::before{content:"\F2A7"}.mdi-glass-tulip::before{content:"\F2A8"}.mdi-glass-wine::before{content:"\F875"}.mdi-glassdoor::before{content:"\F2A9"}.mdi-glasses::before{content:"\F2AA"}.mdi-globe-model::before{content:"\F8E8"}.mdi-gmail::before{content:"\F2AB"}.mdi-gnome::before{content:"\F2AC"}.mdi-go-kart::before{content:"\FD55"}.mdi-go-kart-track::before{content:"\FD56"}.mdi-gog::before{content:"\FB7D"}.mdi-golf::before{content:"\F822"}.mdi-gondola::before{content:"\F685"}.mdi-goodreads::before{content:"\FD57"}.mdi-google::before{content:"\F2AD"}.mdi-google-adwords::before{content:"\FC63"}.mdi-google-allo::before{content:"\F801"}.mdi-google-analytics::before{content:"\F7CB"}.mdi-google-assistant::before{content:"\F7CC"}.mdi-google-cardboard::before{content:"\F2AE"}.mdi-google-chrome::before{content:"\F2AF"}.mdi-google-circles::before{content:"\F2B0"}.mdi-google-circles-communities::before{content:"\F2B1"}.mdi-google-circles-extended::before{content:"\F2B2"}.mdi-google-circles-group::before{content:"\F2B3"}.mdi-google-classroom::before{content:"\F2C0"}.mdi-google-controller::before{content:"\F2B4"}.mdi-google-controller-off::before{content:"\F2B5"}.mdi-google-drive::before{content:"\F2B6"}.mdi-google-earth::before{content:"\F2B7"}.mdi-google-fit::before{content:"\F96B"}.mdi-google-glass::before{content:"\F2B8"}.mdi-google-hangouts::before{content:"\F2C9"}.mdi-google-home::before{content:"\F823"}.mdi-google-keep::before{content:"\F6DB"}.mdi-google-lens::before{content:"\F9F5"}.mdi-google-maps::before{content:"\F5F5"}.mdi-google-nearby::before{content:"\F2B9"}.mdi-google-pages::before{content:"\F2BA"}.mdi-google-photos::before{content:"\F6DC"}.mdi-google-physical-web::before{content:"\F2BB"}.mdi-google-play::before{content:"\F2BC"}.mdi-google-plus::before{content:"\F2BD"}.mdi-google-plus-box::before{content:"\F2BE"}.mdi-google-podcast::before{content:"\FED6"}.mdi-google-spreadsheet::before{content:"\F9F6"}.mdi-google-street-view::before{content:"\FC64"}.mdi-google-translate::before{content:"\F2BF"}.mdi-gpu::before{content:"\F8AD"}.mdi-gradient::before{content:"\F69F"}.mdi-grain::before{content:"\FD58"}.mdi-graphql::before{content:"\F876"}.mdi-grave-stone::before{content:"\FB7E"}.mdi-grease-pencil::before{content:"\F648"}.mdi-greater-than::before{content:"\F96C"}.mdi-greater-than-or-equal::before{content:"\F96D"}.mdi-grid::before{content:"\F2C1"}.mdi-grid-large::before{content:"\F757"}.mdi-grid-off::before{content:"\F2C2"}.mdi-grill::before{content:"\FE86"}.mdi-group::before{content:"\F2C3"}.mdi-guitar-acoustic::before{content:"\F770"}.mdi-guitar-electric::before{content:"\F2C4"}.mdi-guitar-pick::before{content:"\F2C5"}.mdi-guitar-pick-outline::before{content:"\F2C6"}.mdi-guy-fawkes-mask::before{content:"\F824"}.mdi-hackernews::before{content:"\F624"}.mdi-hail::before{content:"\FAC0"}.mdi-halloween::before{content:"\FB7F"}.mdi-hamburger::before{content:"\F684"}.mdi-hammer::before{content:"\F8E9"}.mdi-hand::before{content:"\FA4E"}.mdi-hand-left::before{content:"\FE87"}.mdi-hand-okay::before{content:"\FA4F"}.mdi-hand-peace::before{content:"\FA50"}.mdi-hand-peace-variant::before{content:"\FA51"}.mdi-hand-pointing-down::before{content:"\FA52"}.mdi-hand-pointing-left::before{content:"\FA53"}.mdi-hand-pointing-right::before{content:"\F2C7"}.mdi-hand-pointing-up::before{content:"\FA54"}.mdi-hand-right::before{content:"\FE88"}.mdi-hand-saw::before{content:"\FE89"}.mdi-handball::before{content:"\FF70"}.mdi-hanger::before{content:"\F2C8"}.mdi-hard-hat::before{content:"\F96E"}.mdi-harddisk::before{content:"\F2CA"}.mdi-hat-fedora::before{content:"\FB80"}.mdi-hazard-lights::before{content:"\FC65"}.mdi-hdr::before{content:"\FD59"}.mdi-hdr-off::before{content:"\FD5A"}.mdi-headphones::before{content:"\F2CB"}.mdi-headphones-bluetooth::before{content:"\F96F"}.mdi-headphones-box::before{content:"\F2CC"}.mdi-headphones-off::before{content:"\F7CD"}.mdi-headphones-settings::before{content:"\F2CD"}.mdi-headset::before{content:"\F2CE"}.mdi-headset-dock::before{content:"\F2CF"}.mdi-headset-off::before{content:"\F2D0"}.mdi-heart::before{content:"\F2D1"}.mdi-heart-box::before{content:"\F2D2"}.mdi-heart-box-outline::before{content:"\F2D3"}.mdi-heart-broken::before{content:"\F2D4"}.mdi-heart-broken-outline::before{content:"\FCF0"}.mdi-heart-circle::before{content:"\F970"}.mdi-heart-circle-outline::before{content:"\F971"}.mdi-heart-flash::before{content:"\FF16"}.mdi-heart-half::before{content:"\F6DE"}.mdi-heart-half-full::before{content:"\F6DD"}.mdi-heart-half-outline::before{content:"\F6DF"}.mdi-heart-multiple::before{content:"\FA55"}.mdi-heart-multiple-outline::before{content:"\FA56"}.mdi-heart-off::before{content:"\F758"}.mdi-heart-outline::before{content:"\F2D5"}.mdi-heart-pulse::before{content:"\F5F6"}.mdi-helicopter::before{content:"\FAC1"}.mdi-help::before{content:"\F2D6"}.mdi-help-box::before{content:"\F78A"}.mdi-help-circle::before{content:"\F2D7"}.mdi-help-circle-outline::before{content:"\F625"}.mdi-help-network::before{content:"\F6F4"}.mdi-help-network-outline::before{content:"\FC66"}.mdi-help-rhombus::before{content:"\FB81"}.mdi-help-rhombus-outline::before{content:"\FB82"}.mdi-hexagon::before{content:"\F2D8"}.mdi-hexagon-multiple::before{content:"\F6E0"}.mdi-hexagon-outline::before{content:"\F2D9"}.mdi-hexagon-slice-1::before{content:"\FAC2"}.mdi-hexagon-slice-2::before{content:"\FAC3"}.mdi-hexagon-slice-3::before{content:"\FAC4"}.mdi-hexagon-slice-4::before{content:"\FAC5"}.mdi-hexagon-slice-5::before{content:"\FAC6"}.mdi-hexagon-slice-6::before{content:"\FAC7"}.mdi-hexagram::before{content:"\FAC8"}.mdi-hexagram-outline::before{content:"\FAC9"}.mdi-high-definition::before{content:"\F7CE"}.mdi-high-definition-box::before{content:"\F877"}.mdi-highway::before{content:"\F5F7"}.mdi-hiking::before{content:"\FD5B"}.mdi-hinduism::before{content:"\F972"}.mdi-history::before{content:"\F2DA"}.mdi-hockey-puck::before{content:"\F878"}.mdi-hockey-sticks::before{content:"\F879"}.mdi-hololens::before{content:"\F2DB"}.mdi-home::before{content:"\F2DC"}.mdi-home-account::before{content:"\F825"}.mdi-home-alert::before{content:"\F87A"}.mdi-home-analytics::before{content:"\FED7"}.mdi-home-assistant::before{content:"\F7CF"}.mdi-home-automation::before{content:"\F7D0"}.mdi-home-circle::before{content:"\F7D1"}.mdi-home-city::before{content:"\FCF1"}.mdi-home-city-outline::before{content:"\FCF2"}.mdi-home-currency-usd::before{content:"\F8AE"}.mdi-home-export-outline::before{content:"\FFB8"}.mdi-home-flood::before{content:"\FF17"}.mdi-home-floor-0::before{content:"\FDAE"}.mdi-home-floor-1::before{content:"\FD5C"}.mdi-home-floor-2::before{content:"\FD5D"}.mdi-home-floor-3::before{content:"\FD5E"}.mdi-home-floor-a::before{content:"\FD5F"}.mdi-home-floor-b::before{content:"\FD60"}.mdi-home-floor-g::before{content:"\FD61"}.mdi-home-floor-l::before{content:"\FD62"}.mdi-home-floor-negative-1::before{content:"\FDAF"}.mdi-home-group::before{content:"\FDB0"}.mdi-home-heart::before{content:"\F826"}.mdi-home-import-outline::before{content:"\FFB9"}.mdi-home-lock::before{content:"\F8EA"}.mdi-home-lock-open::before{content:"\F8EB"}.mdi-home-map-marker::before{content:"\F5F8"}.mdi-home-minus::before{content:"\F973"}.mdi-home-modern::before{content:"\F2DD"}.mdi-home-outline::before{content:"\F6A0"}.mdi-home-plus::before{content:"\F974"}.mdi-home-thermometer::before{content:"\FF71"}.mdi-home-thermometer-outline::before{content:"\FF72"}.mdi-home-variant::before{content:"\F2DE"}.mdi-home-variant-outline::before{content:"\FB83"}.mdi-hook::before{content:"\F6E1"}.mdi-hook-off::before{content:"\F6E2"}.mdi-hops::before{content:"\F2DF"}.mdi-horseshoe::before{content:"\FA57"}.mdi-hospital::before{content:"\F2E0"}.mdi-hospital-building::before{content:"\F2E1"}.mdi-hospital-marker::before{content:"\F2E2"}.mdi-hot-tub::before{content:"\F827"}.mdi-hotel::before{content:"\F2E3"}.mdi-houzz::before{content:"\F2E4"}.mdi-houzz-box::before{content:"\F2E5"}.mdi-hubspot::before{content:"\FCF3"}.mdi-hulu::before{content:"\F828"}.mdi-human::before{content:"\F2E6"}.mdi-human-child::before{content:"\F2E7"}.mdi-human-female::before{content:"\F649"}.mdi-human-female-boy::before{content:"\FA58"}.mdi-human-female-female::before{content:"\FA59"}.mdi-human-female-girl::before{content:"\FA5A"}.mdi-human-greeting::before{content:"\F64A"}.mdi-human-handsdown::before{content:"\F64B"}.mdi-human-handsup::before{content:"\F64C"}.mdi-human-male::before{content:"\F64D"}.mdi-human-male-boy::before{content:"\FA5B"}.mdi-human-male-female::before{content:"\F2E8"}.mdi-human-male-girl::before{content:"\FA5C"}.mdi-human-male-height::before{content:"\FF18"}.mdi-human-male-height-variant::before{content:"\FF19"}.mdi-human-male-male::before{content:"\FA5D"}.mdi-human-pregnant::before{content:"\F5CF"}.mdi-humble-bundle::before{content:"\F743"}.mdi-ice-cream::before{content:"\F829"}.mdi-ice-pop::before{content:"\FF1A"}.mdi-identifier::before{content:"\FF1B"}.mdi-iframe::before{content:"\FC67"}.mdi-iframe-outline::before{content:"\FC68"}.mdi-image::before{content:"\F2E9"}.mdi-image-album::before{content:"\F2EA"}.mdi-image-area::before{content:"\F2EB"}.mdi-image-area-close::before{content:"\F2EC"}.mdi-image-broken::before{content:"\F2ED"}.mdi-image-broken-variant::before{content:"\F2EE"}.mdi-image-filter::before{content:"\F2EF"}.mdi-image-filter-black-white::before{content:"\F2F0"}.mdi-image-filter-center-focus::before{content:"\F2F1"}.mdi-image-filter-center-focus-strong::before{content:"\FF1C"}.mdi-image-filter-center-focus-strong-outline::before{content:"\FF1D"}.mdi-image-filter-center-focus-weak::before{content:"\F2F2"}.mdi-image-filter-drama::before{content:"\F2F3"}.mdi-image-filter-frames::before{content:"\F2F4"}.mdi-image-filter-hdr::before{content:"\F2F5"}.mdi-image-filter-none::before{content:"\F2F6"}.mdi-image-filter-tilt-shift::before{content:"\F2F7"}.mdi-image-filter-vintage::before{content:"\F2F8"}.mdi-image-frame::before{content:"\FE8A"}.mdi-image-move::before{content:"\F9F7"}.mdi-image-multiple::before{content:"\F2F9"}.mdi-image-off::before{content:"\F82A"}.mdi-image-outline::before{content:"\F975"}.mdi-image-plus::before{content:"\F87B"}.mdi-image-search::before{content:"\F976"}.mdi-image-search-outline::before{content:"\F977"}.mdi-image-size-select-actual::before{content:"\FC69"}.mdi-image-size-select-large::before{content:"\FC6A"}.mdi-image-size-select-small::before{content:"\FC6B"}.mdi-import::before{content:"\F2FA"}.mdi-inbox::before{content:"\F686"}.mdi-inbox-arrow-down::before{content:"\F2FB"}.mdi-inbox-arrow-up::before{content:"\F3D1"}.mdi-inbox-multiple::before{content:"\F8AF"}.mdi-inbox-multiple-outline::before{content:"\FB84"}.mdi-incognito::before{content:"\F5F9"}.mdi-infinity::before{content:"\F6E3"}.mdi-information::before{content:"\F2FC"}.mdi-information-outline::before{content:"\F2FD"}.mdi-information-variant::before{content:"\F64E"}.mdi-instagram::before{content:"\F2FE"}.mdi-instapaper::before{content:"\F2FF"}.mdi-internet-explorer::before{content:"\F300"}.mdi-invert-colors::before{content:"\F301"}.mdi-invert-colors-off::before{content:"\FE8B"}.mdi-ip::before{content:"\FA5E"}.mdi-ip-network::before{content:"\FA5F"}.mdi-ip-network-outline::before{content:"\FC6C"}.mdi-ipod::before{content:"\FC6D"}.mdi-islam::before{content:"\F978"}.mdi-itunes::before{content:"\F676"}.mdi-jabber::before{content:"\FDB1"}.mdi-jeepney::before{content:"\F302"}.mdi-jellyfish::before{content:"\FF1E"}.mdi-jellyfish-outline::before{content:"\FF1F"}.mdi-jira::before{content:"\F303"}.mdi-jquery::before{content:"\F87C"}.mdi-jsfiddle::before{content:"\F304"}.mdi-json::before{content:"\F626"}.mdi-judaism::before{content:"\F979"}.mdi-kabaddi::before{content:"\FD63"}.mdi-karate::before{content:"\F82B"}.mdi-keg::before{content:"\F305"}.mdi-kettle::before{content:"\F5FA"}.mdi-kettle-outline::before{content:"\FF73"}.mdi-key::before{content:"\F306"}.mdi-key-change::before{content:"\F307"}.mdi-key-minus::before{content:"\F308"}.mdi-key-outline::before{content:"\FDB2"}.mdi-key-plus::before{content:"\F309"}.mdi-key-remove::before{content:"\F30A"}.mdi-key-variant::before{content:"\F30B"}.mdi-keyboard::before{content:"\F30C"}.mdi-keyboard-backspace::before{content:"\F30D"}.mdi-keyboard-caps::before{content:"\F30E"}.mdi-keyboard-close::before{content:"\F30F"}.mdi-keyboard-off::before{content:"\F310"}.mdi-keyboard-off-outline::before{content:"\FE8C"}.mdi-keyboard-outline::before{content:"\F97A"}.mdi-keyboard-return::before{content:"\F311"}.mdi-keyboard-settings::before{content:"\F9F8"}.mdi-keyboard-settings-outline::before{content:"\F9F9"}.mdi-keyboard-tab::before{content:"\F312"}.mdi-keyboard-variant::before{content:"\F313"}.mdi-kickstarter::before{content:"\F744"}.mdi-knife::before{content:"\F9FA"}.mdi-knife-military::before{content:"\F9FB"}.mdi-kodi::before{content:"\F314"}.mdi-label::before{content:"\F315"}.mdi-label-off::before{content:"\FACA"}.mdi-label-off-outline::before{content:"\FACB"}.mdi-label-outline::before{content:"\F316"}.mdi-label-variant::before{content:"\FACC"}.mdi-label-variant-outline::before{content:"\FACD"}.mdi-ladybug::before{content:"\F82C"}.mdi-lambda::before{content:"\F627"}.mdi-lamp::before{content:"\F6B4"}.mdi-lan::before{content:"\F317"}.mdi-lan-connect::before{content:"\F318"}.mdi-lan-disconnect::before{content:"\F319"}.mdi-lan-pending::before{content:"\F31A"}.mdi-language-c::before{content:"\F671"}.mdi-language-cpp::before{content:"\F672"}.mdi-language-csharp::before{content:"\F31B"}.mdi-language-css3::before{content:"\F31C"}.mdi-language-go::before{content:"\F7D2"}.mdi-language-haskell::before{content:"\FC6E"}.mdi-language-html5::before{content:"\F31D"}.mdi-language-java::before{content:"\FB1C"}.mdi-language-javascript::before{content:"\F31E"}.mdi-language-lua::before{content:"\F8B0"}.mdi-language-php::before{content:"\F31F"}.mdi-language-python::before{content:"\F320"}.mdi-language-python-text::before{content:"\F321"}.mdi-language-r::before{content:"\F7D3"}.mdi-language-ruby-on-rails::before{content:"\FACE"}.mdi-language-swift::before{content:"\F6E4"}.mdi-language-typescript::before{content:"\F6E5"}.mdi-laptop::before{content:"\F322"}.mdi-laptop-chromebook::before{content:"\F323"}.mdi-laptop-mac::before{content:"\F324"}.mdi-laptop-off::before{content:"\F6E6"}.mdi-laptop-windows::before{content:"\F325"}.mdi-laravel::before{content:"\FACF"}.mdi-lasso::before{content:"\FF20"}.mdi-lastfm::before{content:"\F326"}.mdi-lastpass::before{content:"\F446"}.mdi-latitude::before{content:"\FF74"}.mdi-launch::before{content:"\F327"}.mdi-lava-lamp::before{content:"\F7D4"}.mdi-layers::before{content:"\F328"}.mdi-layers-minus::before{content:"\FE8D"}.mdi-layers-off::before{content:"\F329"}.mdi-layers-off-outline::before{content:"\F9FC"}.mdi-layers-outline::before{content:"\F9FD"}.mdi-layers-plus::before{content:"\FE30"}.mdi-layers-remove::before{content:"\FE31"}.mdi-layers-triple::before{content:"\FF75"}.mdi-layers-triple-outline::before{content:"\FF76"}.mdi-lead-pencil::before{content:"\F64F"}.mdi-leaf::before{content:"\F32A"}.mdi-leaf-maple::before{content:"\FC6F"}.mdi-leak::before{content:"\FDB3"}.mdi-leak-off::before{content:"\FDB4"}.mdi-led-off::before{content:"\F32B"}.mdi-led-on::before{content:"\F32C"}.mdi-led-outline::before{content:"\F32D"}.mdi-led-strip::before{content:"\F7D5"}.mdi-led-variant-off::before{content:"\F32E"}.mdi-led-variant-on::before{content:"\F32F"}.mdi-led-variant-outline::before{content:"\F330"}.mdi-less-than::before{content:"\F97B"}.mdi-less-than-or-equal::before{content:"\F97C"}.mdi-library::before{content:"\F331"}.mdi-library-books::before{content:"\F332"}.mdi-library-movie::before{content:"\FCF4"}.mdi-library-music::before{content:"\F333"}.mdi-library-music-outline::before{content:"\FF21"}.mdi-library-plus::before{content:"\F334"}.mdi-library-shelves::before{content:"\FB85"}.mdi-library-video::before{content:"\FCF5"}.mdi-lifebuoy::before{content:"\F87D"}.mdi-light-switch::before{content:"\F97D"}.mdi-lightbulb::before{content:"\F335"}.mdi-lightbulb-off::before{content:"\FE32"}.mdi-lightbulb-off-outline::before{content:"\FE33"}.mdi-lightbulb-on::before{content:"\F6E7"}.mdi-lightbulb-on-outline::before{content:"\F6E8"}.mdi-lightbulb-outline::before{content:"\F336"}.mdi-lighthouse::before{content:"\F9FE"}.mdi-lighthouse-on::before{content:"\F9FF"}.mdi-link::before{content:"\F337"}.mdi-link-box::before{content:"\FCF6"}.mdi-link-box-outline::before{content:"\FCF7"}.mdi-link-box-variant::before{content:"\FCF8"}.mdi-link-box-variant-outline::before{content:"\FCF9"}.mdi-link-off::before{content:"\F338"}.mdi-link-plus::before{content:"\FC70"}.mdi-link-variant::before{content:"\F339"}.mdi-link-variant-off::before{content:"\F33A"}.mdi-linkedin::before{content:"\F33B"}.mdi-linkedin-box::before{content:"\F33C"}.mdi-linux::before{content:"\F33D"}.mdi-linux-mint::before{content:"\F8EC"}.mdi-litecoin::before{content:"\FA60"}.mdi-loading::before{content:"\F771"}.mdi-lock::before{content:"\F33E"}.mdi-lock-alert::before{content:"\F8ED"}.mdi-lock-clock::before{content:"\F97E"}.mdi-lock-open::before{content:"\F33F"}.mdi-lock-open-outline::before{content:"\F340"}.mdi-lock-outline::before{content:"\F341"}.mdi-lock-pattern::before{content:"\F6E9"}.mdi-lock-plus::before{content:"\F5FB"}.mdi-lock-question::before{content:"\F8EE"}.mdi-lock-reset::before{content:"\F772"}.mdi-lock-smart::before{content:"\F8B1"}.mdi-locker::before{content:"\F7D6"}.mdi-locker-multiple::before{content:"\F7D7"}.mdi-login::before{content:"\F342"}.mdi-login-variant::before{content:"\F5FC"}.mdi-logout::before{content:"\F343"}.mdi-logout-variant::before{content:"\F5FD"}.mdi-longitude::before{content:"\FF77"}.mdi-looks::before{content:"\F344"}.mdi-loop::before{content:"\F6EA"}.mdi-loupe::before{content:"\F345"}.mdi-lumx::before{content:"\F346"}.mdi-lyft::before{content:"\FB1D"}.mdi-magnet::before{content:"\F347"}.mdi-magnet-on::before{content:"\F348"}.mdi-magnify::before{content:"\F349"}.mdi-magnify-close::before{content:"\F97F"}.mdi-magnify-minus::before{content:"\F34A"}.mdi-magnify-minus-cursor::before{content:"\FA61"}.mdi-magnify-minus-outline::before{content:"\F6EB"}.mdi-magnify-plus::before{content:"\F34B"}.mdi-magnify-plus-cursor::before{content:"\FA62"}.mdi-magnify-plus-outline::before{content:"\F6EC"}.mdi-mail::before{content:"\FED8"}.mdi-mail-ru::before{content:"\F34C"}.mdi-mailbox::before{content:"\F6ED"}.mdi-mailbox-open::before{content:"\FD64"}.mdi-mailbox-open-outline::before{content:"\FD65"}.mdi-mailbox-open-up::before{content:"\FD66"}.mdi-mailbox-open-up-outline::before{content:"\FD67"}.mdi-mailbox-outline::before{content:"\FD68"}.mdi-mailbox-up::before{content:"\FD69"}.mdi-mailbox-up-outline::before{content:"\FD6A"}.mdi-map::before{content:"\F34D"}.mdi-map-check::before{content:"\FED9"}.mdi-map-check-outline::before{content:"\FEDA"}.mdi-map-clock::before{content:"\FCFA"}.mdi-map-clock-outline::before{content:"\FCFB"}.mdi-map-legend::before{content:"\FA00"}.mdi-map-marker::before{content:"\F34E"}.mdi-map-marker-alert::before{content:"\FF22"}.mdi-map-marker-alert-outline::before{content:"\FF23"}.mdi-map-marker-check::before{content:"\FC71"}.mdi-map-marker-circle::before{content:"\F34F"}.mdi-map-marker-distance::before{content:"\F8EF"}.mdi-map-marker-minus::before{content:"\F650"}.mdi-map-marker-multiple::before{content:"\F350"}.mdi-map-marker-off::before{content:"\F351"}.mdi-map-marker-outline::before{content:"\F7D8"}.mdi-map-marker-path::before{content:"\FCFC"}.mdi-map-marker-plus::before{content:"\F651"}.mdi-map-marker-question::before{content:"\FF24"}.mdi-map-marker-question-outline::before{content:"\FF25"}.mdi-map-marker-radius::before{content:"\F352"}.mdi-map-marker-remove::before{content:"\FF26"}.mdi-map-marker-remove-variant::before{content:"\FF27"}.mdi-map-minus::before{content:"\F980"}.mdi-map-outline::before{content:"\F981"}.mdi-map-plus::before{content:"\F982"}.mdi-map-search::before{content:"\F983"}.mdi-map-search-outline::before{content:"\F984"}.mdi-mapbox::before{content:"\FB86"}.mdi-margin::before{content:"\F353"}.mdi-markdown::before{content:"\F354"}.mdi-markdown-outline::before{content:"\FF78"}.mdi-marker::before{content:"\F652"}.mdi-marker-cancel::before{content:"\FDB5"}.mdi-marker-check::before{content:"\F355"}.mdi-mastodon::before{content:"\FAD0"}.mdi-mastodon-variant::before{content:"\FAD1"}.mdi-material-design::before{content:"\F985"}.mdi-material-ui::before{content:"\F357"}.mdi-math-compass::before{content:"\F358"}.mdi-math-cos::before{content:"\FC72"}.mdi-math-sin::before{content:"\FC73"}.mdi-math-tan::before{content:"\FC74"}.mdi-matrix::before{content:"\F628"}.mdi-maxcdn::before{content:"\F359"}.mdi-medal::before{content:"\F986"}.mdi-medical-bag::before{content:"\F6EE"}.mdi-medium::before{content:"\F35A"}.mdi-meetup::before{content:"\FAD2"}.mdi-memory::before{content:"\F35B"}.mdi-menu::before{content:"\F35C"}.mdi-menu-down::before{content:"\F35D"}.mdi-menu-down-outline::before{content:"\F6B5"}.mdi-menu-left::before{content:"\F35E"}.mdi-menu-left-outline::before{content:"\FA01"}.mdi-menu-open::before{content:"\FB87"}.mdi-menu-right::before{content:"\F35F"}.mdi-menu-right-outline::before{content:"\FA02"}.mdi-menu-swap::before{content:"\FA63"}.mdi-menu-swap-outline::before{content:"\FA64"}.mdi-menu-up::before{content:"\F360"}.mdi-menu-up-outline::before{content:"\F6B6"}.mdi-merge::before{content:"\FF79"}.mdi-message::before{content:"\F361"}.mdi-message-alert::before{content:"\F362"}.mdi-message-alert-outline::before{content:"\FA03"}.mdi-message-bulleted::before{content:"\F6A1"}.mdi-message-bulleted-off::before{content:"\F6A2"}.mdi-message-draw::before{content:"\F363"}.mdi-message-image::before{content:"\F364"}.mdi-message-outline::before{content:"\F365"}.mdi-message-plus::before{content:"\F653"}.mdi-message-processing::before{content:"\F366"}.mdi-message-reply::before{content:"\F367"}.mdi-message-reply-text::before{content:"\F368"}.mdi-message-settings::before{content:"\F6EF"}.mdi-message-settings-variant::before{content:"\F6F0"}.mdi-message-text::before{content:"\F369"}.mdi-message-text-outline::before{content:"\F36A"}.mdi-message-video::before{content:"\F36B"}.mdi-meteor::before{content:"\F629"}.mdi-metronome::before{content:"\F7D9"}.mdi-metronome-tick::before{content:"\F7DA"}.mdi-micro-sd::before{content:"\F7DB"}.mdi-microphone::before{content:"\F36C"}.mdi-microphone-minus::before{content:"\F8B2"}.mdi-microphone-off::before{content:"\F36D"}.mdi-microphone-outline::before{content:"\F36E"}.mdi-microphone-plus::before{content:"\F8B3"}.mdi-microphone-settings::before{content:"\F36F"}.mdi-microphone-variant::before{content:"\F370"}.mdi-microphone-variant-off::before{content:"\F371"}.mdi-microscope::before{content:"\F654"}.mdi-microsoft::before{content:"\F372"}.mdi-microsoft-dynamics::before{content:"\F987"}.mdi-microwave::before{content:"\FC75"}.mdi-middleware::before{content:"\FF7A"}.mdi-middleware-outline::before{content:"\FF7B"}.mdi-midi::before{content:"\F8F0"}.mdi-midi-port::before{content:"\F8F1"}.mdi-mine::before{content:"\FDB6"}.mdi-minecraft::before{content:"\F373"}.mdi-mini-sd::before{content:"\FA04"}.mdi-minidisc::before{content:"\FA05"}.mdi-minus::before{content:"\F374"}.mdi-minus-box::before{content:"\F375"}.mdi-minus-box-outline::before{content:"\F6F1"}.mdi-minus-circle::before{content:"\F376"}.mdi-minus-circle-outline::before{content:"\F377"}.mdi-minus-network::before{content:"\F378"}.mdi-minus-network-outline::before{content:"\FC76"}.mdi-mixcloud::before{content:"\F62A"}.mdi-mixed-martial-arts::before{content:"\FD6B"}.mdi-mixed-reality::before{content:"\F87E"}.mdi-mixer::before{content:"\F7DC"}.mdi-molecule::before{content:"\FB88"}.mdi-monitor::before{content:"\F379"}.mdi-monitor-cellphone::before{content:"\F988"}.mdi-monitor-cellphone-star::before{content:"\F989"}.mdi-monitor-dashboard::before{content:"\FA06"}.mdi-monitor-lock::before{content:"\FDB7"}.mdi-monitor-multiple::before{content:"\F37A"}.mdi-monitor-off::before{content:"\FD6C"}.mdi-monitor-screenshot::before{content:"\FE34"}.mdi-monitor-speaker::before{content:"\FF7C"}.mdi-monitor-speaker-off::before{content:"\FF7D"}.mdi-monitor-star::before{content:"\FDB8"}.mdi-moon-first-quarter::before{content:"\FF7E"}.mdi-moon-full::before{content:"\FF7F"}.mdi-moon-last-quarter::before{content:"\FF80"}.mdi-moon-new::before{content:"\FF81"}.mdi-moon-waning-crescent::before{content:"\FF82"}.mdi-moon-waning-gibbous::before{content:"\FF83"}.mdi-moon-waxing-crescent::before{content:"\FF84"}.mdi-moon-waxing-gibbous::before{content:"\FF85"}.mdi-more::before{content:"\F37B"}.mdi-mother-nurse::before{content:"\FCFD"}.mdi-motion-sensor::before{content:"\FD6D"}.mdi-motorbike::before{content:"\F37C"}.mdi-mouse::before{content:"\F37D"}.mdi-mouse-bluetooth::before{content:"\F98A"}.mdi-mouse-off::before{content:"\F37E"}.mdi-mouse-variant::before{content:"\F37F"}.mdi-mouse-variant-off::before{content:"\F380"}.mdi-move-resize::before{content:"\F655"}.mdi-move-resize-variant::before{content:"\F656"}.mdi-movie::before{content:"\F381"}.mdi-movie-outline::before{content:"\FDB9"}.mdi-movie-roll::before{content:"\F7DD"}.mdi-muffin::before{content:"\F98B"}.mdi-multiplication::before{content:"\F382"}.mdi-multiplication-box::before{content:"\F383"}.mdi-mushroom::before{content:"\F7DE"}.mdi-mushroom-outline::before{content:"\F7DF"}.mdi-music::before{content:"\F759"}.mdi-music-accidental-double-flat::before{content:"\FF86"}.mdi-music-accidental-double-sharp::before{content:"\FF87"}.mdi-music-accidental-flat::before{content:"\FF88"}.mdi-music-accidental-natural::before{content:"\FF89"}.mdi-music-accidental-sharp::before{content:"\FF8A"}.mdi-music-box::before{content:"\F384"}.mdi-music-box-outline::before{content:"\F385"}.mdi-music-circle::before{content:"\F386"}.mdi-music-circle-outline::before{content:"\FAD3"}.mdi-music-clef-alto::before{content:"\FF8B"}.mdi-music-clef-bass::before{content:"\FF8C"}.mdi-music-clef-treble::before{content:"\FF8D"}.mdi-music-note::before{content:"\F387"}.mdi-music-note-bluetooth::before{content:"\F5FE"}.mdi-music-note-bluetooth-off::before{content:"\F5FF"}.mdi-music-note-eighth::before{content:"\F388"}.mdi-music-note-eighth-dotted::before{content:"\FF8E"}.mdi-music-note-half::before{content:"\F389"}.mdi-music-note-half-dotted::before{content:"\FF8F"}.mdi-music-note-off::before{content:"\F38A"}.mdi-music-note-off-outline::before{content:"\FF90"}.mdi-music-note-outline::before{content:"\FF91"}.mdi-music-note-plus::before{content:"\FDBA"}.mdi-music-note-quarter::before{content:"\F38B"}.mdi-music-note-quarter-dotted::before{content:"\FF92"}.mdi-music-note-sixteenth::before{content:"\F38C"}.mdi-music-note-sixteenth-dotted::before{content:"\FF93"}.mdi-music-note-whole::before{content:"\F38D"}.mdi-music-note-whole-dotted::before{content:"\FF94"}.mdi-music-off::before{content:"\F75A"}.mdi-music-rest-eighth::before{content:"\FF95"}.mdi-music-rest-half::before{content:"\FF96"}.mdi-music-rest-quarter::before{content:"\FF97"}.mdi-music-rest-sixteenth::before{content:"\FF98"}.mdi-music-rest-whole::before{content:"\FF99"}.mdi-nail::before{content:"\FDBB"}.mdi-nas::before{content:"\F8F2"}.mdi-nativescript::before{content:"\F87F"}.mdi-nature::before{content:"\F38E"}.mdi-nature-people::before{content:"\F38F"}.mdi-navigation::before{content:"\F390"}.mdi-near-me::before{content:"\F5CD"}.mdi-necklace::before{content:"\FF28"}.mdi-needle::before{content:"\F391"}.mdi-netflix::before{content:"\F745"}.mdi-network::before{content:"\F6F2"}.mdi-network-off::before{content:"\FC77"}.mdi-network-off-outline::before{content:"\FC78"}.mdi-network-outline::before{content:"\FC79"}.mdi-network-strength-1::before{content:"\F8F3"}.mdi-network-strength-1-alert::before{content:"\F8F4"}.mdi-network-strength-2::before{content:"\F8F5"}.mdi-network-strength-2-alert::before{content:"\F8F6"}.mdi-network-strength-3::before{content:"\F8F7"}.mdi-network-strength-3-alert::before{content:"\F8F8"}.mdi-network-strength-4::before{content:"\F8F9"}.mdi-network-strength-4-alert::before{content:"\F8FA"}.mdi-network-strength-off::before{content:"\F8FB"}.mdi-network-strength-off-outline::before{content:"\F8FC"}.mdi-network-strength-outline::before{content:"\F8FD"}.mdi-new-box::before{content:"\F394"}.mdi-newspaper::before{content:"\F395"}.mdi-newspaper-minus::before{content:"\FF29"}.mdi-newspaper-plus::before{content:"\FF2A"}.mdi-nfc::before{content:"\F396"}.mdi-nfc-off::before{content:"\FE35"}.mdi-nfc-search-variant::before{content:"\FE36"}.mdi-nfc-tap::before{content:"\F397"}.mdi-nfc-variant::before{content:"\F398"}.mdi-nfc-variant-off::before{content:"\FE37"}.mdi-ninja::before{content:"\F773"}.mdi-nintendo-switch::before{content:"\F7E0"}.mdi-nodejs::before{content:"\F399"}.mdi-not-equal::before{content:"\F98C"}.mdi-not-equal-variant::before{content:"\F98D"}.mdi-note::before{content:"\F39A"}.mdi-note-circle::before{content:"\FEDB"}.mdi-note-multiple::before{content:"\F6B7"}.mdi-note-multiple-outline::before{content:"\F6B8"}.mdi-note-outline::before{content:"\F39B"}.mdi-note-plus::before{content:"\F39C"}.mdi-note-plus-outline::before{content:"\F39D"}.mdi-note-text::before{content:"\F39E"}.mdi-notebook::before{content:"\F82D"}.mdi-notebook-multiple::before{content:"\FE38"}.mdi-notebook-outline::before{content:"\FEDC"}.mdi-notification-clear-all::before{content:"\F39F"}.mdi-npm::before{content:"\F6F6"}.mdi-npm-variant::before{content:"\F98E"}.mdi-npm-variant-outline::before{content:"\F98F"}.mdi-nuke::before{content:"\F6A3"}.mdi-null::before{content:"\F7E1"}.mdi-numeric::before{content:"\F3A0"}.mdi-numeric-0::before{content:"\30"}.mdi-numeric-0-box::before{content:"\F3A1"}.mdi-numeric-0-box-multiple::before{content:"\FF2B"}.mdi-numeric-0-box-multiple-outline::before{content:"\F3A2"}.mdi-numeric-0-box-outline::before{content:"\F3A3"}.mdi-numeric-0-circle::before{content:"\FC7A"}.mdi-numeric-0-circle-outline::before{content:"\FC7B"}.mdi-numeric-1::before{content:"\31"}.mdi-numeric-1-box::before{content:"\F3A4"}.mdi-numeric-1-box-multiple::before{content:"\FF2C"}.mdi-numeric-1-box-multiple-outline::before{content:"\F3A5"}.mdi-numeric-1-box-outline::before{content:"\F3A6"}.mdi-numeric-1-circle::before{content:"\FC7C"}.mdi-numeric-1-circle-outline::before{content:"\FC7D"}.mdi-numeric-10-box::before{content:"\FF9A"}.mdi-numeric-10-box-outline::before{content:"\FF9B"}.mdi-numeric-2::before{content:"\32"}.mdi-numeric-2-box::before{content:"\F3A7"}.mdi-numeric-2-box-multiple::before{content:"\FF2D"}.mdi-numeric-2-box-multiple-outline::before{content:"\F3A8"}.mdi-numeric-2-box-outline::before{content:"\F3A9"}.mdi-numeric-2-circle::before{content:"\FC7E"}.mdi-numeric-2-circle-outline::before{content:"\FC7F"}.mdi-numeric-3::before{content:"\33"}.mdi-numeric-3-box::before{content:"\F3AA"}.mdi-numeric-3-box-multiple::before{content:"\FF2E"}.mdi-numeric-3-box-multiple-outline::before{content:"\F3AB"}.mdi-numeric-3-box-outline::before{content:"\F3AC"}.mdi-numeric-3-circle::before{content:"\FC80"}.mdi-numeric-3-circle-outline::before{content:"\FC81"}.mdi-numeric-4::before{content:"\34"}.mdi-numeric-4-box::before{content:"\F3AD"}.mdi-numeric-4-box-multiple::before{content:"\FF2F"}.mdi-numeric-4-box-multiple-outline::before{content:"\F3AE"}.mdi-numeric-4-box-outline::before{content:"\F3AF"}.mdi-numeric-4-circle::before{content:"\FC82"}.mdi-numeric-4-circle-outline::before{content:"\FC83"}.mdi-numeric-5::before{content:"\35"}.mdi-numeric-5-box::before{content:"\F3B0"}.mdi-numeric-5-box-multiple::before{content:"\FF30"}.mdi-numeric-5-box-multiple-outline::before{content:"\F3B1"}.mdi-numeric-5-box-outline::before{content:"\F3B2"}.mdi-numeric-5-circle::before{content:"\FC84"}.mdi-numeric-5-circle-outline::before{content:"\FC85"}.mdi-numeric-6::before{content:"\36"}.mdi-numeric-6-box::before{content:"\F3B3"}.mdi-numeric-6-box-multiple::before{content:"\FF31"}.mdi-numeric-6-box-multiple-outline::before{content:"\F3B4"}.mdi-numeric-6-box-outline::before{content:"\F3B5"}.mdi-numeric-6-circle::before{content:"\FC86"}.mdi-numeric-6-circle-outline::before{content:"\FC87"}.mdi-numeric-7::before{content:"\37"}.mdi-numeric-7-box::before{content:"\F3B6"}.mdi-numeric-7-box-multiple::before{content:"\FF32"}.mdi-numeric-7-box-multiple-outline::before{content:"\F3B7"}.mdi-numeric-7-box-outline::before{content:"\F3B8"}.mdi-numeric-7-circle::before{content:"\FC88"}.mdi-numeric-7-circle-outline::before{content:"\FC89"}.mdi-numeric-8::before{content:"\38"}.mdi-numeric-8-box::before{content:"\F3B9"}.mdi-numeric-8-box-multiple::before{content:"\FF33"}.mdi-numeric-8-box-multiple-outline::before{content:"\F3BA"}.mdi-numeric-8-box-outline::before{content:"\F3BB"}.mdi-numeric-8-circle::before{content:"\FC8A"}.mdi-numeric-8-circle-outline::before{content:"\FC8B"}.mdi-numeric-9::before{content:"\39"}.mdi-numeric-9-box::before{content:"\F3BC"}.mdi-numeric-9-box-multiple::before{content:"\FF34"}.mdi-numeric-9-box-multiple-outline::before{content:"\F3BD"}.mdi-numeric-9-box-outline::before{content:"\F3BE"}.mdi-numeric-9-circle::before{content:"\FC8C"}.mdi-numeric-9-circle-outline::before{content:"\FC8D"}.mdi-numeric-9-plus-box::before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple::before{content:"\FF35"}.mdi-numeric-9-plus-box-multiple-outline::before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline::before{content:"\F3C1"}.mdi-numeric-9-plus-circle::before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline::before{content:"\FC8F"}.mdi-nut::before{content:"\F6F7"}.mdi-nutrition::before{content:"\F3C2"}.mdi-oar::before{content:"\F67B"}.mdi-ocarina::before{content:"\FDBC"}.mdi-octagon::before{content:"\F3C3"}.mdi-octagon-outline::before{content:"\F3C4"}.mdi-octagram::before{content:"\F6F8"}.mdi-octagram-outline::before{content:"\F774"}.mdi-odnoklassniki::before{content:"\F3C5"}.mdi-office::before{content:"\F3C6"}.mdi-office-building::before{content:"\F990"}.mdi-oil::before{content:"\F3C7"}.mdi-oil-lamp::before{content:"\FF36"}.mdi-oil-temperature::before{content:"\F3C8"}.mdi-omega::before{content:"\F3C9"}.mdi-one-up::before{content:"\FB89"}.mdi-onedrive::before{content:"\F3CA"}.mdi-onenote::before{content:"\F746"}.mdi-onepassword::before{content:"\F880"}.mdi-opacity::before{content:"\F5CC"}.mdi-open-in-app::before{content:"\F3CB"}.mdi-open-in-new::before{content:"\F3CC"}.mdi-open-source-initiative::before{content:"\FB8A"}.mdi-openid::before{content:"\F3CD"}.mdi-opera::before{content:"\F3CE"}.mdi-orbit::before{content:"\F018"}.mdi-origin::before{content:"\FB2B"}.mdi-ornament::before{content:"\F3CF"}.mdi-ornament-variant::before{content:"\F3D0"}.mdi-outlook::before{content:"\FCFE"}.mdi-owl::before{content:"\F3D2"}.mdi-pac-man::before{content:"\FB8B"}.mdi-package::before{content:"\F3D3"}.mdi-package-down::before{content:"\F3D4"}.mdi-package-up::before{content:"\F3D5"}.mdi-package-variant::before{content:"\F3D6"}.mdi-package-variant-closed::before{content:"\F3D7"}.mdi-page-first::before{content:"\F600"}.mdi-page-last::before{content:"\F601"}.mdi-page-layout-body::before{content:"\F6F9"}.mdi-page-layout-footer::before{content:"\F6FA"}.mdi-page-layout-header::before{content:"\F6FB"}.mdi-page-layout-header-footer::before{content:"\FF9C"}.mdi-page-layout-sidebar-left::before{content:"\F6FC"}.mdi-page-layout-sidebar-right::before{content:"\F6FD"}.mdi-page-next::before{content:"\FB8C"}.mdi-page-next-outline::before{content:"\FB8D"}.mdi-page-previous::before{content:"\FB8E"}.mdi-page-previous-outline::before{content:"\FB8F"}.mdi-palette::before{content:"\F3D8"}.mdi-palette-advanced::before{content:"\F3D9"}.mdi-palette-outline::before{content:"\FE6C"}.mdi-palette-swatch::before{content:"\F8B4"}.mdi-pan::before{content:"\FB90"}.mdi-pan-bottom-left::before{content:"\FB91"}.mdi-pan-bottom-right::before{content:"\FB92"}.mdi-pan-down::before{content:"\FB93"}.mdi-pan-horizontal::before{content:"\FB94"}.mdi-pan-left::before{content:"\FB95"}.mdi-pan-right::before{content:"\FB96"}.mdi-pan-top-left::before{content:"\FB97"}.mdi-pan-top-right::before{content:"\FB98"}.mdi-pan-up::before{content:"\FB99"}.mdi-pan-vertical::before{content:"\FB9A"}.mdi-panda::before{content:"\F3DA"}.mdi-pandora::before{content:"\F3DB"}.mdi-panorama::before{content:"\F3DC"}.mdi-panorama-fisheye::before{content:"\F3DD"}.mdi-panorama-horizontal::before{content:"\F3DE"}.mdi-panorama-vertical::before{content:"\F3DF"}.mdi-panorama-wide-angle::before{content:"\F3E0"}.mdi-paper-cut-vertical::before{content:"\F3E1"}.mdi-paperclip::before{content:"\F3E2"}.mdi-parachute::before{content:"\FC90"}.mdi-parachute-outline::before{content:"\FC91"}.mdi-parking::before{content:"\F3E3"}.mdi-passport::before{content:"\F7E2"}.mdi-passport-biometric::before{content:"\FDBD"}.mdi-patio-heater::before{content:"\FF9D"}.mdi-patreon::before{content:"\F881"}.mdi-pause::before{content:"\F3E4"}.mdi-pause-circle::before{content:"\F3E5"}.mdi-pause-circle-outline::before{content:"\F3E6"}.mdi-pause-octagon::before{content:"\F3E7"}.mdi-pause-octagon-outline::before{content:"\F3E8"}.mdi-paw::before{content:"\F3E9"}.mdi-paw-off::before{content:"\F657"}.mdi-paypal::before{content:"\F882"}.mdi-pdf-box::before{content:"\FE39"}.mdi-peace::before{content:"\F883"}.mdi-pen::before{content:"\F3EA"}.mdi-pen-lock::before{content:"\FDBE"}.mdi-pen-minus::before{content:"\FDBF"}.mdi-pen-off::before{content:"\FDC0"}.mdi-pen-plus::before{content:"\FDC1"}.mdi-pen-remove::before{content:"\FDC2"}.mdi-pencil::before{content:"\F3EB"}.mdi-pencil-box::before{content:"\F3EC"}.mdi-pencil-box-outline::before{content:"\F3ED"}.mdi-pencil-circle::before{content:"\F6FE"}.mdi-pencil-circle-outline::before{content:"\F775"}.mdi-pencil-lock::before{content:"\F3EE"}.mdi-pencil-lock-outline::before{content:"\FDC3"}.mdi-pencil-minus::before{content:"\FDC4"}.mdi-pencil-minus-outline::before{content:"\FDC5"}.mdi-pencil-off::before{content:"\F3EF"}.mdi-pencil-off-outline::before{content:"\FDC6"}.mdi-pencil-outline::before{content:"\FC92"}.mdi-pencil-plus::before{content:"\FDC7"}.mdi-pencil-plus-outline::before{content:"\FDC8"}.mdi-pencil-remove::before{content:"\FDC9"}.mdi-pencil-remove-outline::before{content:"\FDCA"}.mdi-penguin::before{content:"\FEDD"}.mdi-pentagon::before{content:"\F6FF"}.mdi-pentagon-outline::before{content:"\F700"}.mdi-percent::before{content:"\F3F0"}.mdi-periodic-table::before{content:"\F8B5"}.mdi-periodic-table-co2::before{content:"\F7E3"}.mdi-periscope::before{content:"\F747"}.mdi-perspective-less::before{content:"\FCFF"}.mdi-perspective-more::before{content:"\FD00"}.mdi-pharmacy::before{content:"\F3F1"}.mdi-phone::before{content:"\F3F2"}.mdi-phone-alert::before{content:"\FF37"}.mdi-phone-bluetooth::before{content:"\F3F3"}.mdi-phone-classic::before{content:"\F602"}.mdi-phone-forward::before{content:"\F3F4"}.mdi-phone-hangup::before{content:"\F3F5"}.mdi-phone-in-talk::before{content:"\F3F6"}.mdi-phone-incoming::before{content:"\F3F7"}.mdi-phone-lock::before{content:"\F3F8"}.mdi-phone-log::before{content:"\F3F9"}.mdi-phone-minus::before{content:"\F658"}.mdi-phone-missed::before{content:"\F3FA"}.mdi-phone-off::before{content:"\FDCB"}.mdi-phone-outgoing::before{content:"\F3FB"}.mdi-phone-outline::before{content:"\FDCC"}.mdi-phone-paused::before{content:"\F3FC"}.mdi-phone-plus::before{content:"\F659"}.mdi-phone-return::before{content:"\F82E"}.mdi-phone-rotate-landscape::before{content:"\F884"}.mdi-phone-rotate-portrait::before{content:"\F885"}.mdi-phone-settings::before{content:"\F3FD"}.mdi-phone-voip::before{content:"\F3FE"}.mdi-pi::before{content:"\F3FF"}.mdi-pi-box::before{content:"\F400"}.mdi-pi-hole::before{content:"\FDCD"}.mdi-piano::before{content:"\F67C"}.mdi-pickaxe::before{content:"\F8B6"}.mdi-picture-in-picture-bottom-right::before{content:"\FE3A"}.mdi-picture-in-picture-bottom-right-outline::before{content:"\FE3B"}.mdi-picture-in-picture-top-right::before{content:"\FE3C"}.mdi-picture-in-picture-top-right-outline::before{content:"\FE3D"}.mdi-pier::before{content:"\F886"}.mdi-pier-crane::before{content:"\F887"}.mdi-pig::before{content:"\F401"}.mdi-pill::before{content:"\F402"}.mdi-pillar::before{content:"\F701"}.mdi-pin::before{content:"\F403"}.mdi-pin-off::before{content:"\F404"}.mdi-pin-off-outline::before{content:"\F92F"}.mdi-pin-outline::before{content:"\F930"}.mdi-pine-tree::before{content:"\F405"}.mdi-pine-tree-box::before{content:"\F406"}.mdi-pinterest::before{content:"\F407"}.mdi-pinterest-box::before{content:"\F408"}.mdi-pinwheel::before{content:"\FAD4"}.mdi-pinwheel-outline::before{content:"\FAD5"}.mdi-pipe::before{content:"\F7E4"}.mdi-pipe-disconnected::before{content:"\F7E5"}.mdi-pipe-leak::before{content:"\F888"}.mdi-pirate::before{content:"\FA07"}.mdi-pistol::before{content:"\F702"}.mdi-piston::before{content:"\F889"}.mdi-pizza::before{content:"\F409"}.mdi-play::before{content:"\F40A"}.mdi-play-box-outline::before{content:"\F40B"}.mdi-play-circle::before{content:"\F40C"}.mdi-play-circle-outline::before{content:"\F40D"}.mdi-play-network::before{content:"\F88A"}.mdi-play-network-outline::before{content:"\FC93"}.mdi-play-outline::before{content:"\FF38"}.mdi-play-pause::before{content:"\F40E"}.mdi-play-protected-content::before{content:"\F40F"}.mdi-play-speed::before{content:"\F8FE"}.mdi-playlist-check::before{content:"\F5C7"}.mdi-playlist-edit::before{content:"\F8FF"}.mdi-playlist-minus::before{content:"\F410"}.mdi-playlist-music::before{content:"\FC94"}.mdi-playlist-music-outline::before{content:"\FC95"}.mdi-playlist-play::before{content:"\F411"}.mdi-playlist-plus::before{content:"\F412"}.mdi-playlist-remove::before{content:"\F413"}.mdi-playlist-star::before{content:"\FDCE"}.mdi-playstation::before{content:"\F414"}.mdi-plex::before{content:"\F6B9"}.mdi-plus::before{content:"\F415"}.mdi-plus-box::before{content:"\F416"}.mdi-plus-box-outline::before{content:"\F703"}.mdi-plus-circle::before{content:"\F417"}.mdi-plus-circle-multiple-outline::before{content:"\F418"}.mdi-plus-circle-outline::before{content:"\F419"}.mdi-plus-minus::before{content:"\F991"}.mdi-plus-minus-box::before{content:"\F992"}.mdi-plus-network::before{content:"\F41A"}.mdi-plus-network-outline::before{content:"\FC96"}.mdi-plus-one::before{content:"\F41B"}.mdi-plus-outline::before{content:"\F704"}.mdi-pocket::before{content:"\F41C"}.mdi-podcast::before{content:"\F993"}.mdi-podium::before{content:"\FD01"}.mdi-podium-bronze::before{content:"\FD02"}.mdi-podium-gold::before{content:"\FD03"}.mdi-podium-silver::before{content:"\FD04"}.mdi-point-of-sale::before{content:"\FD6E"}.mdi-pokeball::before{content:"\F41D"}.mdi-pokemon-go::before{content:"\FA08"}.mdi-poker-chip::before{content:"\F82F"}.mdi-polaroid::before{content:"\F41E"}.mdi-poll::before{content:"\F41F"}.mdi-poll-box::before{content:"\F420"}.mdi-polymer::before{content:"\F421"}.mdi-pool::before{content:"\F606"}.mdi-popcorn::before{content:"\F422"}.mdi-postage-stamp::before{content:"\FC97"}.mdi-pot::before{content:"\F65A"}.mdi-pot-mix::before{content:"\F65B"}.mdi-pound::before{content:"\F423"}.mdi-pound-box::before{content:"\F424"}.mdi-power::before{content:"\F425"}.mdi-power-cycle::before{content:"\F900"}.mdi-power-off::before{content:"\F901"}.mdi-power-on::before{content:"\F902"}.mdi-power-plug::before{content:"\F6A4"}.mdi-power-plug-off::before{content:"\F6A5"}.mdi-power-settings::before{content:"\F426"}.mdi-power-sleep::before{content:"\F903"}.mdi-power-socket::before{content:"\F427"}.mdi-power-socket-au::before{content:"\F904"}.mdi-power-socket-eu::before{content:"\F7E6"}.mdi-power-socket-uk::before{content:"\F7E7"}.mdi-power-socket-us::before{content:"\F7E8"}.mdi-power-standby::before{content:"\F905"}.mdi-powershell::before{content:"\FA09"}.mdi-prescription::before{content:"\F705"}.mdi-presentation::before{content:"\F428"}.mdi-presentation-play::before{content:"\F429"}.mdi-printer::before{content:"\F42A"}.mdi-printer-3d::before{content:"\F42B"}.mdi-printer-3d-nozzle::before{content:"\FE3E"}.mdi-printer-3d-nozzle-outline::before{content:"\FE3F"}.mdi-printer-alert::before{content:"\F42C"}.mdi-printer-off::before{content:"\FE40"}.mdi-printer-settings::before{content:"\F706"}.mdi-printer-wireless::before{content:"\FA0A"}.mdi-priority-high::before{content:"\F603"}.mdi-priority-low::before{content:"\F604"}.mdi-professional-hexagon::before{content:"\F42D"}.mdi-progress-alert::before{content:"\FC98"}.mdi-progress-check::before{content:"\F994"}.mdi-progress-clock::before{content:"\F995"}.mdi-progress-download::before{content:"\F996"}.mdi-progress-upload::before{content:"\F997"}.mdi-progress-wrench::before{content:"\FC99"}.mdi-projector::before{content:"\F42E"}.mdi-projector-screen::before{content:"\F42F"}.mdi-publish::before{content:"\F6A6"}.mdi-pulse::before{content:"\F430"}.mdi-pumpkin::before{content:"\FB9B"}.mdi-purse::before{content:"\FF39"}.mdi-purse-outline::before{content:"\FF3A"}.mdi-puzzle::before{content:"\F431"}.mdi-puzzle-outline::before{content:"\FA65"}.mdi-qi::before{content:"\F998"}.mdi-qqchat::before{content:"\F605"}.mdi-qrcode::before{content:"\F432"}.mdi-qrcode-edit::before{content:"\F8B7"}.mdi-qrcode-scan::before{content:"\F433"}.mdi-quadcopter::before{content:"\F434"}.mdi-quality-high::before{content:"\F435"}.mdi-quality-low::before{content:"\FA0B"}.mdi-quality-medium::before{content:"\FA0C"}.mdi-quicktime::before{content:"\F436"}.mdi-quora::before{content:"\FD05"}.mdi-rabbit::before{content:"\F906"}.mdi-racing-helmet::before{content:"\FD6F"}.mdi-racquetball::before{content:"\FD70"}.mdi-radar::before{content:"\F437"}.mdi-radiator::before{content:"\F438"}.mdi-radiator-disabled::before{content:"\FAD6"}.mdi-radiator-off::before{content:"\FAD7"}.mdi-radio::before{content:"\F439"}.mdi-radio-am::before{content:"\FC9A"}.mdi-radio-fm::before{content:"\FC9B"}.mdi-radio-handheld::before{content:"\F43A"}.mdi-radio-tower::before{content:"\F43B"}.mdi-radioactive::before{content:"\F43C"}.mdi-radioactive-off::before{content:"\FEDE"}.mdi-radiobox-blank::before{content:"\F43D"}.mdi-radiobox-marked::before{content:"\F43E"}.mdi-radius::before{content:"\FC9C"}.mdi-radius-outline::before{content:"\FC9D"}.mdi-railroad-light::before{content:"\FF3B"}.mdi-raspberry-pi::before{content:"\F43F"}.mdi-ray-end::before{content:"\F440"}.mdi-ray-end-arrow::before{content:"\F441"}.mdi-ray-start::before{content:"\F442"}.mdi-ray-start-arrow::before{content:"\F443"}.mdi-ray-start-end::before{content:"\F444"}.mdi-ray-vertex::before{content:"\F445"}.mdi-react::before{content:"\F707"}.mdi-read::before{content:"\F447"}.mdi-receipt::before{content:"\F449"}.mdi-record::before{content:"\F44A"}.mdi-record-circle::before{content:"\FEDF"}.mdi-record-circle-outline::before{content:"\FEE0"}.mdi-record-player::before{content:"\F999"}.mdi-record-rec::before{content:"\F44B"}.mdi-rectangle::before{content:"\FE41"}.mdi-rectangle-outline::before{content:"\FE42"}.mdi-recycle::before{content:"\F44C"}.mdi-reddit::before{content:"\F44D"}.mdi-redo::before{content:"\F44E"}.mdi-redo-variant::before{content:"\F44F"}.mdi-reflect-horizontal::before{content:"\FA0D"}.mdi-reflect-vertical::before{content:"\FA0E"}.mdi-refresh::before{content:"\F450"}.mdi-regex::before{content:"\F451"}.mdi-registered-trademark::before{content:"\FA66"}.mdi-relative-scale::before{content:"\F452"}.mdi-reload::before{content:"\F453"}.mdi-reminder::before{content:"\F88B"}.mdi-remote::before{content:"\F454"}.mdi-remote-desktop::before{content:"\F8B8"}.mdi-remote-off::before{content:"\FEE1"}.mdi-remote-tv::before{content:"\FEE2"}.mdi-remote-tv-off::before{content:"\FEE3"}.mdi-rename-box::before{content:"\F455"}.mdi-reorder-horizontal::before{content:"\F687"}.mdi-reorder-vertical::before{content:"\F688"}.mdi-repeat::before{content:"\F456"}.mdi-repeat-off::before{content:"\F457"}.mdi-repeat-once::before{content:"\F458"}.mdi-replay::before{content:"\F459"}.mdi-reply::before{content:"\F45A"}.mdi-reply-all::before{content:"\F45B"}.mdi-reply-all-outline::before{content:"\FF3C"}.mdi-reply-outline::before{content:"\FF3D"}.mdi-reproduction::before{content:"\F45C"}.mdi-resistor::before{content:"\FB1F"}.mdi-resistor-nodes::before{content:"\FB20"}.mdi-resize::before{content:"\FA67"}.mdi-resize-bottom-right::before{content:"\F45D"}.mdi-responsive::before{content:"\F45E"}.mdi-restart::before{content:"\F708"}.mdi-restart-off::before{content:"\FD71"}.mdi-restore::before{content:"\F99A"}.mdi-restore-clock::before{content:"\F6A7"}.mdi-rewind::before{content:"\F45F"}.mdi-rewind-10::before{content:"\FD06"}.mdi-rewind-30::before{content:"\FD72"}.mdi-rewind-outline::before{content:"\F709"}.mdi-rhombus::before{content:"\F70A"}.mdi-rhombus-medium::before{content:"\FA0F"}.mdi-rhombus-outline::before{content:"\F70B"}.mdi-rhombus-split::before{content:"\FA10"}.mdi-ribbon::before{content:"\F460"}.mdi-rice::before{content:"\F7E9"}.mdi-ring::before{content:"\F7EA"}.mdi-rivet::before{content:"\FE43"}.mdi-road::before{content:"\F461"}.mdi-road-variant::before{content:"\F462"}.mdi-robot::before{content:"\F6A8"}.mdi-robot-industrial::before{content:"\FB21"}.mdi-robot-vacuum::before{content:"\F70C"}.mdi-robot-vacuum-variant::before{content:"\F907"}.mdi-rocket::before{content:"\F463"}.mdi-roller-skate::before{content:"\FD07"}.mdi-rollerblade::before{content:"\FD08"}.mdi-rollupjs::before{content:"\FB9C"}.mdi-room-service::before{content:"\F88C"}.mdi-room-service-outline::before{content:"\FD73"}.mdi-rotate-3d::before{content:"\FEE4"}.mdi-rotate-3d-variant::before{content:"\F464"}.mdi-rotate-left::before{content:"\F465"}.mdi-rotate-left-variant::before{content:"\F466"}.mdi-rotate-orbit::before{content:"\FD74"}.mdi-rotate-right::before{content:"\F467"}.mdi-rotate-right-variant::before{content:"\F468"}.mdi-rounded-corner::before{content:"\F607"}.mdi-router-wireless::before{content:"\F469"}.mdi-router-wireless-settings::before{content:"\FA68"}.mdi-routes::before{content:"\F46A"}.mdi-rowing::before{content:"\F608"}.mdi-rss::before{content:"\F46B"}.mdi-rss-box::before{content:"\F46C"}.mdi-rss-off::before{content:"\FF3E"}.mdi-ruby::before{content:"\FD09"}.mdi-rugby::before{content:"\FD75"}.mdi-ruler::before{content:"\F46D"}.mdi-ruler-square::before{content:"\FC9E"}.mdi-run::before{content:"\F70D"}.mdi-run-fast::before{content:"\F46E"}.mdi-sack::before{content:"\FD0A"}.mdi-sack-percent::before{content:"\FD0B"}.mdi-safe::before{content:"\FA69"}.mdi-safety-goggles::before{content:"\FD0C"}.mdi-sailing::before{content:"\FEE5"}.mdi-sale::before{content:"\F46F"}.mdi-salesforce::before{content:"\F88D"}.mdi-sass::before{content:"\F7EB"}.mdi-satellite::before{content:"\F470"}.mdi-satellite-uplink::before{content:"\F908"}.mdi-satellite-variant::before{content:"\F471"}.mdi-sausage::before{content:"\F8B9"}.mdi-saw-blade::before{content:"\FE44"}.mdi-saxophone::before{content:"\F609"}.mdi-scale::before{content:"\F472"}.mdi-scale-balance::before{content:"\F5D1"}.mdi-scale-bathroom::before{content:"\F473"}.mdi-scanner::before{content:"\F6AA"}.mdi-scanner-off::before{content:"\F909"}.mdi-scatter-plot::before{content:"\FEE6"}.mdi-scatter-plot-outline::before{content:"\FEE7"}.mdi-school::before{content:"\F474"}.mdi-scissors-cutting::before{content:"\FA6A"}.mdi-screen-rotation::before{content:"\F475"}.mdi-screen-rotation-lock::before{content:"\F476"}.mdi-screw-flat-top::before{content:"\FDCF"}.mdi-screw-lag::before{content:"\FE54"}.mdi-screw-machine-flat-top::before{content:"\FE55"}.mdi-screw-machine-round-top::before{content:"\FE56"}.mdi-screw-round-top::before{content:"\FE57"}.mdi-screwdriver::before{content:"\F477"}.mdi-script::before{content:"\FB9D"}.mdi-script-outline::before{content:"\F478"}.mdi-script-text::before{content:"\FB9E"}.mdi-script-text-outline::before{content:"\FB9F"}.mdi-sd::before{content:"\F479"}.mdi-seal::before{content:"\F47A"}.mdi-search-web::before{content:"\F70E"}.mdi-seat::before{content:"\FC9F"}.mdi-seat-flat::before{content:"\F47B"}.mdi-seat-flat-angled::before{content:"\F47C"}.mdi-seat-individual-suite::before{content:"\F47D"}.mdi-seat-legroom-extra::before{content:"\F47E"}.mdi-seat-legroom-normal::before{content:"\F47F"}.mdi-seat-legroom-reduced::before{content:"\F480"}.mdi-seat-outline::before{content:"\FCA0"}.mdi-seat-recline-extra::before{content:"\F481"}.mdi-seat-recline-normal::before{content:"\F482"}.mdi-seatbelt::before{content:"\FCA1"}.mdi-security::before{content:"\F483"}.mdi-security-network::before{content:"\F484"}.mdi-seed::before{content:"\FE45"}.mdi-seed-outline::before{content:"\FE46"}.mdi-segment::before{content:"\FEE8"}.mdi-select::before{content:"\F485"}.mdi-select-all::before{content:"\F486"}.mdi-select-color::before{content:"\FD0D"}.mdi-select-compare::before{content:"\FAD8"}.mdi-select-drag::before{content:"\FA6B"}.mdi-select-group::before{content:"\FF9F"}.mdi-select-inverse::before{content:"\F487"}.mdi-select-off::before{content:"\F488"}.mdi-selection::before{content:"\F489"}.mdi-selection-drag::before{content:"\FA6C"}.mdi-selection-ellipse::before{content:"\FD0E"}.mdi-selection-ellipse-arrow-inside::before{content:"\FF3F"}.mdi-selection-off::before{content:"\F776"}.mdi-send::before{content:"\F48A"}.mdi-send-circle::before{content:"\FE58"}.mdi-send-circle-outline::before{content:"\FE59"}.mdi-send-lock::before{content:"\F7EC"}.mdi-serial-port::before{content:"\F65C"}.mdi-server::before{content:"\F48B"}.mdi-server-minus::before{content:"\F48C"}.mdi-server-network::before{content:"\F48D"}.mdi-server-network-off::before{content:"\F48E"}.mdi-server-off::before{content:"\F48F"}.mdi-server-plus::before{content:"\F490"}.mdi-server-remove::before{content:"\F491"}.mdi-server-security::before{content:"\F492"}.mdi-set-all::before{content:"\F777"}.mdi-set-center::before{content:"\F778"}.mdi-set-center-right::before{content:"\F779"}.mdi-set-left::before{content:"\F77A"}.mdi-set-left-center::before{content:"\F77B"}.mdi-set-left-right::before{content:"\F77C"}.mdi-set-none::before{content:"\F77D"}.mdi-set-right::before{content:"\F77E"}.mdi-set-top-box::before{content:"\F99E"}.mdi-settings::before{content:"\F493"}.mdi-settings-box::before{content:"\F494"}.mdi-settings-helper::before{content:"\FA6D"}.mdi-settings-outline::before{content:"\F8BA"}.mdi-shape::before{content:"\F830"}.mdi-shape-circle-plus::before{content:"\F65D"}.mdi-shape-outline::before{content:"\F831"}.mdi-shape-plus::before{content:"\F495"}.mdi-shape-polygon-plus::before{content:"\F65E"}.mdi-shape-rectangle-plus::before{content:"\F65F"}.mdi-shape-square-plus::before{content:"\F660"}.mdi-share::before{content:"\F496"}.mdi-share-off::before{content:"\FF40"}.mdi-share-off-outline::before{content:"\FF41"}.mdi-share-outline::before{content:"\F931"}.mdi-share-variant::before{content:"\F497"}.mdi-sheep::before{content:"\FCA2"}.mdi-shield::before{content:"\F498"}.mdi-shield-account::before{content:"\F88E"}.mdi-shield-account-outline::before{content:"\FA11"}.mdi-shield-airplane::before{content:"\F6BA"}.mdi-shield-airplane-outline::before{content:"\FCA3"}.mdi-shield-alert::before{content:"\FEE9"}.mdi-shield-alert-outline::before{content:"\FEEA"}.mdi-shield-car::before{content:"\FFA0"}.mdi-shield-check::before{content:"\F565"}.mdi-shield-check-outline::before{content:"\FCA4"}.mdi-shield-cross::before{content:"\FCA5"}.mdi-shield-cross-outline::before{content:"\FCA6"}.mdi-shield-half-full::before{content:"\F77F"}.mdi-shield-home::before{content:"\F689"}.mdi-shield-home-outline::before{content:"\FCA7"}.mdi-shield-key::before{content:"\FBA0"}.mdi-shield-key-outline::before{content:"\FBA1"}.mdi-shield-link-variant::before{content:"\FD0F"}.mdi-shield-link-variant-outline::before{content:"\FD10"}.mdi-shield-lock::before{content:"\F99C"}.mdi-shield-lock-outline::before{content:"\FCA8"}.mdi-shield-off::before{content:"\F99D"}.mdi-shield-off-outline::before{content:"\F99B"}.mdi-shield-outline::before{content:"\F499"}.mdi-shield-plus::before{content:"\FAD9"}.mdi-shield-plus-outline::before{content:"\FADA"}.mdi-shield-remove::before{content:"\FADB"}.mdi-shield-remove-outline::before{content:"\FADC"}.mdi-shield-search::before{content:"\FD76"}.mdi-ship-wheel::before{content:"\F832"}.mdi-shoe-formal::before{content:"\FB22"}.mdi-shoe-heel::before{content:"\FB23"}.mdi-shoe-print::before{content:"\FE5A"}.mdi-shopify::before{content:"\FADD"}.mdi-shopping::before{content:"\F49A"}.mdi-shopping-music::before{content:"\F49B"}.mdi-shopping-search::before{content:"\FFA1"}.mdi-shovel::before{content:"\F70F"}.mdi-shovel-off::before{content:"\F710"}.mdi-shower::before{content:"\F99F"}.mdi-shower-head::before{content:"\F9A0"}.mdi-shredder::before{content:"\F49C"}.mdi-shuffle::before{content:"\F49D"}.mdi-shuffle-disabled::before{content:"\F49E"}.mdi-shuffle-variant::before{content:"\F49F"}.mdi-sigma::before{content:"\F4A0"}.mdi-sigma-lower::before{content:"\F62B"}.mdi-sign-caution::before{content:"\F4A1"}.mdi-sign-direction::before{content:"\F780"}.mdi-sign-text::before{content:"\F781"}.mdi-signal::before{content:"\F4A2"}.mdi-signal-2g::before{content:"\F711"}.mdi-signal-3g::before{content:"\F712"}.mdi-signal-4g::before{content:"\F713"}.mdi-signal-5g::before{content:"\FA6E"}.mdi-signal-cellular-1::before{content:"\F8BB"}.mdi-signal-cellular-2::before{content:"\F8BC"}.mdi-signal-cellular-3::before{content:"\F8BD"}.mdi-signal-cellular-outline::before{content:"\F8BE"}.mdi-signal-distance-variant::before{content:"\FE47"}.mdi-signal-hspa::before{content:"\F714"}.mdi-signal-hspa-plus::before{content:"\F715"}.mdi-signal-off::before{content:"\F782"}.mdi-signal-variant::before{content:"\F60A"}.mdi-signature::before{content:"\FE5B"}.mdi-signature-freehand::before{content:"\FE5C"}.mdi-signature-image::before{content:"\FE5D"}.mdi-signature-text::before{content:"\FE5E"}.mdi-silo::before{content:"\FB24"}.mdi-silverware::before{content:"\F4A3"}.mdi-silverware-fork::before{content:"\F4A4"}.mdi-silverware-fork-knife::before{content:"\FA6F"}.mdi-silverware-spoon::before{content:"\F4A5"}.mdi-silverware-variant::before{content:"\F4A6"}.mdi-sim::before{content:"\F4A7"}.mdi-sim-alert::before{content:"\F4A8"}.mdi-sim-off::before{content:"\F4A9"}.mdi-sina-weibo::before{content:"\FADE"}.mdi-sitemap::before{content:"\F4AA"}.mdi-skate::before{content:"\FD11"}.mdi-skew-less::before{content:"\FD12"}.mdi-skew-more::before{content:"\FD13"}.mdi-skip-backward::before{content:"\F4AB"}.mdi-skip-backward-outline::before{content:"\FF42"}.mdi-skip-forward::before{content:"\F4AC"}.mdi-skip-forward-outline::before{content:"\FF43"}.mdi-skip-next::before{content:"\F4AD"}.mdi-skip-next-circle::before{content:"\F661"}.mdi-skip-next-circle-outline::before{content:"\F662"}.mdi-skip-next-outline::before{content:"\FF44"}.mdi-skip-previous::before{content:"\F4AE"}.mdi-skip-previous-circle::before{content:"\F663"}.mdi-skip-previous-circle-outline::before{content:"\F664"}.mdi-skip-previous-outline::before{content:"\FF45"}.mdi-skull::before{content:"\F68B"}.mdi-skull-crossbones::before{content:"\FBA2"}.mdi-skull-crossbones-outline::before{content:"\FBA3"}.mdi-skull-outline::before{content:"\FBA4"}.mdi-skype::before{content:"\F4AF"}.mdi-skype-business::before{content:"\F4B0"}.mdi-slack::before{content:"\F4B1"}.mdi-slackware::before{content:"\F90A"}.mdi-sleep::before{content:"\F4B2"}.mdi-sleep-off::before{content:"\F4B3"}.mdi-slope-downhill::before{content:"\FE5F"}.mdi-slope-uphill::before{content:"\FE60"}.mdi-smog::before{content:"\FA70"}.mdi-smoke-detector::before{content:"\F392"}.mdi-smoking::before{content:"\F4B4"}.mdi-smoking-off::before{content:"\F4B5"}.mdi-snapchat::before{content:"\F4B6"}.mdi-snowflake::before{content:"\F716"}.mdi-snowflake-alert::before{content:"\FF46"}.mdi-snowflake-variant::before{content:"\FF47"}.mdi-snowman::before{content:"\F4B7"}.mdi-soccer::before{content:"\F4B8"}.mdi-soccer-field::before{content:"\F833"}.mdi-sofa::before{content:"\F4B9"}.mdi-solar-panel::before{content:"\FD77"}.mdi-solar-panel-large::before{content:"\FD78"}.mdi-solar-power::before{content:"\FA71"}.mdi-solid::before{content:"\F68C"}.mdi-sort::before{content:"\F4BA"}.mdi-sort-alphabetical::before{content:"\F4BB"}.mdi-sort-ascending::before{content:"\F4BC"}.mdi-sort-descending::before{content:"\F4BD"}.mdi-sort-numeric::before{content:"\F4BE"}.mdi-sort-variant::before{content:"\F4BF"}.mdi-sort-variant-lock::before{content:"\FCA9"}.mdi-sort-variant-lock-open::before{content:"\FCAA"}.mdi-soundcloud::before{content:"\F4C0"}.mdi-source-branch::before{content:"\F62C"}.mdi-source-commit::before{content:"\F717"}.mdi-source-commit-end::before{content:"\F718"}.mdi-source-commit-end-local::before{content:"\F719"}.mdi-source-commit-local::before{content:"\F71A"}.mdi-source-commit-next-local::before{content:"\F71B"}.mdi-source-commit-start::before{content:"\F71C"}.mdi-source-commit-start-next-local::before{content:"\F71D"}.mdi-source-fork::before{content:"\F4C1"}.mdi-source-merge::before{content:"\F62D"}.mdi-source-pull::before{content:"\F4C2"}.mdi-source-repository::before{content:"\FCAB"}.mdi-source-repository-multiple::before{content:"\FCAC"}.mdi-soy-sauce::before{content:"\F7ED"}.mdi-spa::before{content:"\FCAD"}.mdi-spa-outline::before{content:"\FCAE"}.mdi-space-invaders::before{content:"\FBA5"}.mdi-spade::before{content:"\FE48"}.mdi-speaker::before{content:"\F4C3"}.mdi-speaker-bluetooth::before{content:"\F9A1"}.mdi-speaker-multiple::before{content:"\FD14"}.mdi-speaker-off::before{content:"\F4C4"}.mdi-speaker-wireless::before{content:"\F71E"}.mdi-speedometer::before{content:"\F4C5"}.mdi-speedometer-medium::before{content:"\FFA2"}.mdi-speedometer-slow::before{content:"\FFA3"}.mdi-spellcheck::before{content:"\F4C6"}.mdi-spider-web::before{content:"\FBA6"}.mdi-spotify::before{content:"\F4C7"}.mdi-spotlight::before{content:"\F4C8"}.mdi-spotlight-beam::before{content:"\F4C9"}.mdi-spray::before{content:"\F665"}.mdi-spray-bottle::before{content:"\FADF"}.mdi-sprout::before{content:"\FE49"}.mdi-sprout-outline::before{content:"\FE4A"}.mdi-square::before{content:"\F763"}.mdi-square-edit-outline::before{content:"\F90B"}.mdi-square-inc::before{content:"\F4CA"}.mdi-square-inc-cash::before{content:"\F4CB"}.mdi-square-medium::before{content:"\FA12"}.mdi-square-medium-outline::before{content:"\FA13"}.mdi-square-outline::before{content:"\F762"}.mdi-square-root::before{content:"\F783"}.mdi-square-root-box::before{content:"\F9A2"}.mdi-square-small::before{content:"\FA14"}.mdi-squeegee::before{content:"\FAE0"}.mdi-ssh::before{content:"\F8BF"}.mdi-stack-exchange::before{content:"\F60B"}.mdi-stack-overflow::before{content:"\F4CC"}.mdi-stadium::before{content:"\F71F"}.mdi-stairs::before{content:"\F4CD"}.mdi-stamper::before{content:"\FD15"}.mdi-standard-definition::before{content:"\F7EE"}.mdi-star::before{content:"\F4CE"}.mdi-star-box::before{content:"\FA72"}.mdi-star-box-outline::before{content:"\FA73"}.mdi-star-circle::before{content:"\F4CF"}.mdi-star-circle-outline::before{content:"\F9A3"}.mdi-star-face::before{content:"\F9A4"}.mdi-star-four-points::before{content:"\FAE1"}.mdi-star-four-points-outline::before{content:"\FAE2"}.mdi-star-half::before{content:"\F4D0"}.mdi-star-off::before{content:"\F4D1"}.mdi-star-outline::before{content:"\F4D2"}.mdi-star-three-points::before{content:"\FAE3"}.mdi-star-three-points-outline::before{content:"\FAE4"}.mdi-steam::before{content:"\F4D3"}.mdi-steam-box::before{content:"\F90C"}.mdi-steering::before{content:"\F4D4"}.mdi-steering-off::before{content:"\F90D"}.mdi-step-backward::before{content:"\F4D5"}.mdi-step-backward-2::before{content:"\F4D6"}.mdi-step-forward::before{content:"\F4D7"}.mdi-step-forward-2::before{content:"\F4D8"}.mdi-stethoscope::before{content:"\F4D9"}.mdi-sticker::before{content:"\F5D0"}.mdi-sticker-emoji::before{content:"\F784"}.mdi-stocking::before{content:"\F4DA"}.mdi-stop::before{content:"\F4DB"}.mdi-stop-circle::before{content:"\F666"}.mdi-stop-circle-outline::before{content:"\F667"}.mdi-store::before{content:"\F4DC"}.mdi-store-24-hour::before{content:"\F4DD"}.mdi-stove::before{content:"\F4DE"}.mdi-strava::before{content:"\FB25"}.mdi-stretch-to-page::before{content:"\FF48"}.mdi-stretch-to-page-outline::before{content:"\FF49"}.mdi-subdirectory-arrow-left::before{content:"\F60C"}.mdi-subdirectory-arrow-right::before{content:"\F60D"}.mdi-subtitles::before{content:"\FA15"}.mdi-subtitles-outline::before{content:"\FA16"}.mdi-subway::before{content:"\F6AB"}.mdi-subway-alert-variant::before{content:"\FD79"}.mdi-subway-variant::before{content:"\F4DF"}.mdi-summit::before{content:"\F785"}.mdi-sunglasses::before{content:"\F4E0"}.mdi-surround-sound::before{content:"\F5C5"}.mdi-surround-sound-2-0::before{content:"\F7EF"}.mdi-surround-sound-3-1::before{content:"\F7F0"}.mdi-surround-sound-5-1::before{content:"\F7F1"}.mdi-surround-sound-7-1::before{content:"\F7F2"}.mdi-svg::before{content:"\F720"}.mdi-swap-horizontal::before{content:"\F4E1"}.mdi-swap-horizontal-bold::before{content:"\FBA9"}.mdi-swap-horizontal-variant::before{content:"\F8C0"}.mdi-swap-vertical::before{content:"\F4E2"}.mdi-swap-vertical-bold::before{content:"\FBAA"}.mdi-swap-vertical-variant::before{content:"\F8C1"}.mdi-swim::before{content:"\F4E3"}.mdi-switch::before{content:"\F4E4"}.mdi-sword::before{content:"\F4E5"}.mdi-sword-cross::before{content:"\F786"}.mdi-symfony::before{content:"\FAE5"}.mdi-sync::before{content:"\F4E6"}.mdi-sync-alert::before{content:"\F4E7"}.mdi-sync-off::before{content:"\F4E8"}.mdi-tab::before{content:"\F4E9"}.mdi-tab-minus::before{content:"\FB26"}.mdi-tab-plus::before{content:"\F75B"}.mdi-tab-remove::before{content:"\FB27"}.mdi-tab-unselected::before{content:"\F4EA"}.mdi-table::before{content:"\F4EB"}.mdi-table-border::before{content:"\FA17"}.mdi-table-column::before{content:"\F834"}.mdi-table-column-plus-after::before{content:"\F4EC"}.mdi-table-column-plus-before::before{content:"\F4ED"}.mdi-table-column-remove::before{content:"\F4EE"}.mdi-table-column-width::before{content:"\F4EF"}.mdi-table-edit::before{content:"\F4F0"}.mdi-table-large::before{content:"\F4F1"}.mdi-table-large-plus::before{content:"\FFA4"}.mdi-table-large-remove::before{content:"\FFA5"}.mdi-table-merge-cells::before{content:"\F9A5"}.mdi-table-of-contents::before{content:"\F835"}.mdi-table-plus::before{content:"\FA74"}.mdi-table-remove::before{content:"\FA75"}.mdi-table-row::before{content:"\F836"}.mdi-table-row-height::before{content:"\F4F2"}.mdi-table-row-plus-after::before{content:"\F4F3"}.mdi-table-row-plus-before::before{content:"\F4F4"}.mdi-table-row-remove::before{content:"\F4F5"}.mdi-table-search::before{content:"\F90E"}.mdi-table-settings::before{content:"\F837"}.mdi-table-tennis::before{content:"\FE4B"}.mdi-tablet::before{content:"\F4F6"}.mdi-tablet-android::before{content:"\F4F7"}.mdi-tablet-cellphone::before{content:"\F9A6"}.mdi-tablet-dashboard::before{content:"\FEEB"}.mdi-tablet-ipad::before{content:"\F4F8"}.mdi-taco::before{content:"\F761"}.mdi-tag::before{content:"\F4F9"}.mdi-tag-faces::before{content:"\F4FA"}.mdi-tag-heart::before{content:"\F68A"}.mdi-tag-heart-outline::before{content:"\FBAB"}.mdi-tag-minus::before{content:"\F90F"}.mdi-tag-multiple::before{content:"\F4FB"}.mdi-tag-outline::before{content:"\F4FC"}.mdi-tag-plus::before{content:"\F721"}.mdi-tag-remove::before{content:"\F722"}.mdi-tag-text-outline::before{content:"\F4FD"}.mdi-tank::before{content:"\FD16"}.mdi-tape-measure::before{content:"\FB28"}.mdi-target::before{content:"\F4FE"}.mdi-target-account::before{content:"\FBAC"}.mdi-target-variant::before{content:"\FA76"}.mdi-taxi::before{content:"\F4FF"}.mdi-tea::before{content:"\FD7A"}.mdi-tea-outline::before{content:"\FD7B"}.mdi-teach::before{content:"\F88F"}.mdi-teamviewer::before{content:"\F500"}.mdi-telegram::before{content:"\F501"}.mdi-telescope::before{content:"\FB29"}.mdi-television::before{content:"\F502"}.mdi-television-box::before{content:"\F838"}.mdi-television-classic::before{content:"\F7F3"}.mdi-television-classic-off::before{content:"\F839"}.mdi-television-guide::before{content:"\F503"}.mdi-television-off::before{content:"\F83A"}.mdi-television-pause::before{content:"\FFA6"}.mdi-television-play::before{content:"\FEEC"}.mdi-television-stop::before{content:"\FFA7"}.mdi-temperature-celsius::before{content:"\F504"}.mdi-temperature-fahrenheit::before{content:"\F505"}.mdi-temperature-kelvin::before{content:"\F506"}.mdi-tennis::before{content:"\FD7C"}.mdi-tennis-ball::before{content:"\F507"}.mdi-tent::before{content:"\F508"}.mdi-terrain::before{content:"\F509"}.mdi-test-tube::before{content:"\F668"}.mdi-test-tube-empty::before{content:"\F910"}.mdi-test-tube-off::before{content:"\F911"}.mdi-text::before{content:"\F9A7"}.mdi-text-shadow::before{content:"\F669"}.mdi-text-short::before{content:"\F9A8"}.mdi-text-subject::before{content:"\F9A9"}.mdi-text-to-speech::before{content:"\F50A"}.mdi-text-to-speech-off::before{content:"\F50B"}.mdi-textbox::before{content:"\F60E"}.mdi-textbox-password::before{content:"\F7F4"}.mdi-texture::before{content:"\F50C"}.mdi-theater::before{content:"\F50D"}.mdi-theme-light-dark::before{content:"\F50E"}.mdi-thermometer::before{content:"\F50F"}.mdi-thermometer-alert::before{content:"\FE61"}.mdi-thermometer-chevron-down::before{content:"\FE62"}.mdi-thermometer-chevron-up::before{content:"\FE63"}.mdi-thermometer-lines::before{content:"\F510"}.mdi-thermometer-minus::before{content:"\FE64"}.mdi-thermometer-plus::before{content:"\FE65"}.mdi-thermostat::before{content:"\F393"}.mdi-thermostat-box::before{content:"\F890"}.mdi-thought-bubble::before{content:"\F7F5"}.mdi-thought-bubble-outline::before{content:"\F7F6"}.mdi-thumb-down::before{content:"\F511"}.mdi-mdi-thumb-down-outline::before{content:"\F512"}.mdi-thumb-up::before{content:"\F513"}.mdi-thumb-up-outline::before{content:"\F514"}.mdi-thumbs-up-down::before{content:"\F515"}.mdi-ticket::before{content:"\F516"}.mdi-ticket-account::before{content:"\F517"}.mdi-ticket-confirmation::before{content:"\F518"}.mdi-ticket-outline::before{content:"\F912"}.mdi-ticket-percent::before{content:"\F723"}.mdi-tie::before{content:"\F519"}.mdi-tilde::before{content:"\F724"}.mdi-timelapse::before{content:"\F51A"}.mdi-timeline::before{content:"\FBAD"}.mdi-timeline-alert::before{content:"\FFB2"}.mdi-timeline-alert-outline::before{content:"\FFB5"}.mdi-timeline-help::before{content:"\FFB6"}.mdi-timeline-help-outline::before{content:"\FFB7"}.mdi-timeline-outline::before{content:"\FBAE"}.mdi-timeline-plus::before{content:"\FFB3"}.mdi-timeline-plus-outline::before{content:"\FFB4"}.mdi-timeline-text::before{content:"\FBAF"}.mdi-timeline-text-outline::before{content:"\FBB0"}.mdi-timer::before{content:"\F51B"}.mdi-timer-10::before{content:"\F51C"}.mdi-timer-3::before{content:"\F51D"}.mdi-timer-off::before{content:"\F51E"}.mdi-timer-sand::before{content:"\F51F"}.mdi-timer-sand-empty::before{content:"\F6AC"}.mdi-timer-sand-full::before{content:"\F78B"}.mdi-timetable::before{content:"\F520"}.mdi-toaster-oven::before{content:"\FCAF"}.mdi-toggle-switch::before{content:"\F521"}.mdi-toggle-switch-off::before{content:"\F522"}.mdi-toggle-switch-off-outline::before{content:"\FA18"}.mdi-toggle-switch-outline::before{content:"\FA19"}.mdi-toilet::before{content:"\F9AA"}.mdi-toolbox::before{content:"\F9AB"}.mdi-toolbox-outline::before{content:"\F9AC"}.mdi-tooltip::before{content:"\F523"}.mdi-tooltip-account::before{content:"\F00C"}.mdi-tooltip-edit::before{content:"\F524"}.mdi-tooltip-image::before{content:"\F525"}.mdi-tooltip-image-outline::before{content:"\FBB1"}.mdi-tooltip-outline::before{content:"\F526"}.mdi-tooltip-plus::before{content:"\FBB2"}.mdi-tooltip-plus-outline::before{content:"\F527"}.mdi-tooltip-text::before{content:"\F528"}.mdi-tooltip-text-outline::before{content:"\FBB3"}.mdi-tooth::before{content:"\F8C2"}.mdi-tooth-outline::before{content:"\F529"}.mdi-tor::before{content:"\F52A"}.mdi-tortoise::before{content:"\FD17"}.mdi-tournament::before{content:"\F9AD"}.mdi-tower-beach::before{content:"\F680"}.mdi-tower-fire::before{content:"\F681"}.mdi-towing::before{content:"\F83B"}.mdi-track-light::before{content:"\F913"}.mdi-trackpad::before{content:"\F7F7"}.mdi-trackpad-lock::before{content:"\F932"}.mdi-tractor::before{content:"\F891"}.mdi-trademark::before{content:"\FA77"}.mdi-traffic-light::before{content:"\F52B"}.mdi-train::before{content:"\F52C"}.mdi-train-car::before{content:"\FBB4"}.mdi-train-variant::before{content:"\F8C3"}.mdi-tram::before{content:"\F52D"}.mdi-transcribe::before{content:"\F52E"}.mdi-transcribe-close::before{content:"\F52F"}.mdi-transfer-down::before{content:"\FD7D"}.mdi-transfer-left::before{content:"\FD7E"}.mdi-transfer-right::before{content:"\F530"}.mdi-transfer-up::before{content:"\FD7F"}.mdi-transit-connection::before{content:"\FD18"}.mdi-transit-connection-variant::before{content:"\FD19"}.mdi-transit-detour::before{content:"\FFA8"}.mdi-transit-transfer::before{content:"\F6AD"}.mdi-transition::before{content:"\F914"}.mdi-transition-masked::before{content:"\F915"}.mdi-translate::before{content:"\F5CA"}.mdi-translate-off::before{content:"\FE66"}.mdi-transmission-tower::before{content:"\FD1A"}.mdi-trash-can::before{content:"\FA78"}.mdi-trash-can-outline::before{content:"\FA79"}.mdi-treasure-chest::before{content:"\F725"}.mdi-tree::before{content:"\F531"}.mdi-tree-outline::before{content:"\FE4C"}.mdi-trello::before{content:"\F532"}.mdi-trending-down::before{content:"\F533"}.mdi-trending-neutral::before{content:"\F534"}.mdi-trending-up::before{content:"\F535"}.mdi-triangle::before{content:"\F536"}.mdi-triangle-outline::before{content:"\F537"}.mdi-triforce::before{content:"\FBB5"}.mdi-trophy::before{content:"\F538"}.mdi-trophy-award::before{content:"\F539"}.mdi-trophy-broken::before{content:"\FD80"}.mdi-trophy-outline::before{content:"\F53A"}.mdi-trophy-variant::before{content:"\F53B"}.mdi-trophy-variant-outline::before{content:"\F53C"}.mdi-truck::before{content:"\F53D"}.mdi-truck-check::before{content:"\FCB0"}.mdi-truck-delivery::before{content:"\F53E"}.mdi-truck-fast::before{content:"\F787"}.mdi-truck-trailer::before{content:"\F726"}.mdi-tshirt-crew::before{content:"\FA7A"}.mdi-tshirt-crew-outline::before{content:"\F53F"}.mdi-tshirt-v::before{content:"\FA7B"}.mdi-tshirt-v-outline::before{content:"\F540"}.mdi-tumble-dryer::before{content:"\F916"}.mdi-tumblr::before{content:"\F541"}.mdi-tumblr-box::before{content:"\F917"}.mdi-tumblr-reblog::before{content:"\F542"}.mdi-tune::before{content:"\F62E"}.mdi-tune-vertical::before{content:"\F66A"}.mdi-turnstile::before{content:"\FCB1"}.mdi-turnstile-outline::before{content:"\FCB2"}.mdi-turtle::before{content:"\FCB3"}.mdi-twitch::before{content:"\F543"}.mdi-twitter::before{content:"\F544"}.mdi-twitter-box::before{content:"\F545"}.mdi-twitter-circle::before{content:"\F546"}.mdi-twitter-retweet::before{content:"\F547"}.mdi-two-factor-authentication::before{content:"\F9AE"}.mdi-typewriter::before{content:"\FF4A"}.mdi-uber::before{content:"\F748"}.mdi-ubisoft::before{content:"\FBB6"}.mdi-ubuntu::before{content:"\F548"}.mdi-ultra-high-definition::before{content:"\F7F8"}.mdi-umbraco::before{content:"\F549"}.mdi-umbrella::before{content:"\F54A"}.mdi-umbrella-closed::before{content:"\F9AF"}.mdi-umbrella-outline::before{content:"\F54B"}.mdi-undo::before{content:"\F54C"}.mdi-undo-variant::before{content:"\F54D"}.mdi-unfold-less-horizontal::before{content:"\F54E"}.mdi-unfold-less-vertical::before{content:"\F75F"}.mdi-unfold-more-horizontal::before{content:"\F54F"}.mdi-unfold-more-vertical::before{content:"\F760"}.mdi-ungroup::before{content:"\F550"}.mdi-unicode::before{content:"\FEED"}.mdi-unity::before{content:"\F6AE"}.mdi-unreal::before{content:"\F9B0"}.mdi-untappd::before{content:"\F551"}.mdi-update::before{content:"\F6AF"}.mdi-upload::before{content:"\F552"}.mdi-upload-multiple::before{content:"\F83C"}.mdi-upload-network::before{content:"\F6F5"}.mdi-upload-network-outline::before{content:"\FCB4"}.mdi-upload-outline::before{content:"\FE67"}.mdi-usb::before{content:"\F553"}.mdi-van-passenger::before{content:"\F7F9"}.mdi-van-utility::before{content:"\F7FA"}.mdi-vanish::before{content:"\F7FB"}.mdi-variable::before{content:"\FAE6"}.mdi-vector-arrange-above::before{content:"\F554"}.mdi-vector-arrange-below::before{content:"\F555"}.mdi-vector-bezier::before{content:"\FAE7"}.mdi-vector-circle::before{content:"\F556"}.mdi-vector-circle-variant::before{content:"\F557"}.mdi-vector-combine::before{content:"\F558"}.mdi-vector-curve::before{content:"\F559"}.mdi-vector-difference::before{content:"\F55A"}.mdi-vector-difference-ab::before{content:"\F55B"}.mdi-vector-difference-ba::before{content:"\F55C"}.mdi-vector-ellipse::before{content:"\F892"}.mdi-vector-intersection::before{content:"\F55D"}.mdi-vector-line::before{content:"\F55E"}.mdi-vector-point::before{content:"\F55F"}.mdi-vector-polygon::before{content:"\F560"}.mdi-vector-polyline::before{content:"\F561"}.mdi-vector-radius::before{content:"\F749"}.mdi-vector-rectangle::before{content:"\F5C6"}.mdi-vector-selection::before{content:"\F562"}.mdi-vector-square::before{content:"\F001"}.mdi-vector-triangle::before{content:"\F563"}.mdi-vector-union::before{content:"\F564"}.mdi-venmo::before{content:"\F578"}.mdi-vhs::before{content:"\FA1A"}.mdi-vibrate::before{content:"\F566"}.mdi-vibrate-off::before{content:"\FCB5"}.mdi-video::before{content:"\F567"}.mdi-video-3d::before{content:"\F7FC"}.mdi-video-3d-variant::before{content:"\FEEE"}.mdi-video-4k-box::before{content:"\F83D"}.mdi-video-account::before{content:"\F918"}.mdi-video-image::before{content:"\F919"}.mdi-video-input-antenna::before{content:"\F83E"}.mdi-video-input-component::before{content:"\F83F"}.mdi-video-input-hdmi::before{content:"\F840"}.mdi-video-input-scart::before{content:"\FFA9"}.mdi-video-input-svideo::before{content:"\F841"}.mdi-video-minus::before{content:"\F9B1"}.mdi-video-off::before{content:"\F568"}.mdi-video-off-outline::before{content:"\FBB7"}.mdi-video-outline::before{content:"\FBB8"}.mdi-video-plus::before{content:"\F9B2"}.mdi-video-stabilization::before{content:"\F91A"}.mdi-video-switch::before{content:"\F569"}.mdi-video-vintage::before{content:"\FA1B"}.mdi-video-wireless::before{content:"\FEEF"}.mdi-video-wireless-outline::before{content:"\FEF0"}.mdi-view-agenda::before{content:"\F56A"}.mdi-view-array::before{content:"\F56B"}.mdi-view-carousel::before{content:"\F56C"}.mdi-view-column::before{content:"\F56D"}.mdi-view-comfy::before{content:"\FE4D"}.mdi-view-compact::before{content:"\FE4E"}.mdi-view-compact-outline::before{content:"\FE4F"}.mdi-view-dashboard::before{content:"\F56E"}.mdi-view-dashboard-outline::before{content:"\FA1C"}.mdi-view-dashboard-variant::before{content:"\F842"}.mdi-view-day::before{content:"\F56F"}.mdi-view-grid::before{content:"\F570"}.mdi-view-grid-plus::before{content:"\FFAA"}.mdi-view-headline::before{content:"\F571"}.mdi-view-list::before{content:"\F572"}.mdi-view-module::before{content:"\F573"}.mdi-view-parallel::before{content:"\F727"}.mdi-view-quilt::before{content:"\F574"}.mdi-view-sequential::before{content:"\F728"}.mdi-view-split-horizontal::before{content:"\FBA7"}.mdi-view-split-vertical::before{content:"\FBA8"}.mdi-view-stream::before{content:"\F575"}.mdi-view-week::before{content:"\F576"}.mdi-vimeo::before{content:"\F577"}.mdi-violin::before{content:"\F60F"}.mdi-virtual-reality::before{content:"\F893"}.mdi-visual-studio::before{content:"\F610"}.mdi-visual-studio-code::before{content:"\FA1D"}.mdi-vk::before{content:"\F579"}.mdi-vk-box::before{content:"\F57A"}.mdi-vk-circle::before{content:"\F57B"}.mdi-vlc::before{content:"\F57C"}.mdi-voice::before{content:"\F5CB"}.mdi-voice-off::before{content:"\FEF1"}.mdi-voicemail::before{content:"\F57D"}.mdi-volleyball::before{content:"\F9B3"}.mdi-volume-high::before{content:"\F57E"}.mdi-volume-low::before{content:"\F57F"}.mdi-volume-medium::before{content:"\F580"}.mdi-volume-minus::before{content:"\F75D"}.mdi-volume-mute::before{content:"\F75E"}.mdi-volume-off::before{content:"\F581"}.mdi-volume-plus::before{content:"\F75C"}.mdi-volume-variant-off::before{content:"\FE68"}.mdi-vote::before{content:"\FA1E"}.mdi-vote-outline::before{content:"\FA1F"}.mdi-vpn::before{content:"\F582"}.mdi-vuejs::before{content:"\F843"}.mdi-vuetify::before{content:"\FE50"}.mdi-walk::before{content:"\F583"}.mdi-wall::before{content:"\F7FD"}.mdi-wall-sconce::before{content:"\F91B"}.mdi-wall-sconce-flat::before{content:"\F91C"}.mdi-wall-sconce-variant::before{content:"\F91D"}.mdi-wallet::before{content:"\F584"}.mdi-wallet-giftcard::before{content:"\F585"}.mdi-wallet-membership::before{content:"\F586"}.mdi-wallet-outline::before{content:"\FBB9"}.mdi-wallet-plus::before{content:"\FFAB"}.mdi-wallet-plus-outline::before{content:"\FFAC"}.mdi-wallet-travel::before{content:"\F587"}.mdi-wallpaper::before{content:"\FE69"}.mdi-wan::before{content:"\F588"}.mdi-wardrobe::before{content:"\FFAD"}.mdi-wardrobe-outline::before{content:"\FFAE"}.mdi-warehouse::before{content:"\FFBB"}.mdi-washing-machine::before{content:"\F729"}.mdi-watch::before{content:"\F589"}.mdi-watch-export::before{content:"\F58A"}.mdi-watch-export-variant::before{content:"\F894"}.mdi-watch-import::before{content:"\F58B"}.mdi-watch-import-variant::before{content:"\F895"}.mdi-watch-variant::before{content:"\F896"}.mdi-watch-vibrate::before{content:"\F6B0"}.mdi-watch-vibrate-off::before{content:"\FCB6"}.mdi-water::before{content:"\F58C"}.mdi-water-boiler::before{content:"\FFAF"}.mdi-water-off::before{content:"\F58D"}.mdi-water-outline::before{content:"\FE6A"}.mdi-water-percent::before{content:"\F58E"}.mdi-water-pump::before{content:"\F58F"}.mdi-water-pump-off::before{content:"\FFB0"}.mdi-watermark::before{content:"\F612"}.mdi-wave::before{content:"\FF4B"}.mdi-waves::before{content:"\F78C"}.mdi-waze::before{content:"\FBBA"}.mdi-weather-cloudy::before{content:"\F590"}.mdi-weather-cloudy-alert::before{content:"\FF4C"}.mdi-weather-cloudy-arrow-right::before{content:"\FE51"}.mdi-weather-fog::before{content:"\F591"}.mdi-weather-hail::before{content:"\F592"}.mdi-weather-hazy::before{content:"\FF4D"}.mdi-weather-hurricane::before{content:"\F897"}.mdi-weather-lightning::before{content:"\F593"}.mdi-weather-lightning-rainy::before{content:"\F67D"}.mdi-weather-night::before{content:"\F594"}.mdi-weather-night-partly-cloudy::before{content:"\FF4E"}.mdi-weather-partly-cloudy::before{content:"\F595"}.mdi-weather-partly-lightning::before{content:"\FF4F"}.mdi-weather-partly-rainy::before{content:"\FF50"}.mdi-weather-partly-snowy::before{content:"\FF51"}.mdi-weather-partly-snowy-rainy::before{content:"\FF52"}.mdi-weather-pouring::before{content:"\F596"}.mdi-weather-rainy::before{content:"\F597"}.mdi-weather-snowy::before{content:"\F598"}.mdi-weather-snowy-heavy::before{content:"\FF53"}.mdi-weather-snowy-rainy::before{content:"\F67E"}.mdi-weather-sunny::before{content:"\F599"}.mdi-weather-sunny-alert::before{content:"\FF54"}.mdi-weather-sunset::before{content:"\F59A"}.mdi-weather-sunset-down::before{content:"\F59B"}.mdi-weather-sunset-up::before{content:"\F59C"}.mdi-weather-tornado::before{content:"\FF55"}.mdi-weather-windy::before{content:"\F59D"}.mdi-weather-windy-variant::before{content:"\F59E"}.mdi-web::before{content:"\F59F"}.mdi-web-box::before{content:"\FFB1"}.mdi-webcam::before{content:"\F5A0"}.mdi-webhook::before{content:"\F62F"}.mdi-webpack::before{content:"\F72A"}.mdi-wechat::before{content:"\F611"}.mdi-weight::before{content:"\F5A1"}.mdi-weight-gram::before{content:"\FD1B"}.mdi-weight-kilogram::before{content:"\F5A2"}.mdi-weight-pound::before{content:"\F9B4"}.mdi-whatsapp::before{content:"\F5A3"}.mdi-wheelchair-accessibility::before{content:"\F5A4"}.mdi-whistle::before{content:"\F9B5"}.mdi-white-balance-auto::before{content:"\F5A5"}.mdi-white-balance-incandescent::before{content:"\F5A6"}.mdi-white-balance-iridescent::before{content:"\F5A7"}.mdi-white-balance-sunny::before{content:"\F5A8"}.mdi-widgets::before{content:"\F72B"}.mdi-wifi::before{content:"\F5A9"}.mdi-wifi-off::before{content:"\F5AA"}.mdi-wifi-star::before{content:"\FE6B"}.mdi-wifi-strength-1::before{content:"\F91E"}.mdi-wifi-strength-1-alert::before{content:"\F91F"}.mdi-wifi-strength-1-lock::before{content:"\F920"}.mdi-wifi-strength-2::before{content:"\F921"}.mdi-wifi-strength-2-alert::before{content:"\F922"}.mdi-wifi-strength-2-lock::before{content:"\F923"}.mdi-wifi-strength-3::before{content:"\F924"}.mdi-wifi-strength-3-alert::before{content:"\F925"}.mdi-wifi-strength-3-lock::before{content:"\F926"}.mdi-wifi-strength-4::before{content:"\F927"}.mdi-wifi-strength-4-alert::before{content:"\F928"}.mdi-wifi-strength-4-lock::before{content:"\F929"}.mdi-wifi-strength-alert-outline::before{content:"\F92A"}.mdi-wifi-strength-lock-outline::before{content:"\F92B"}.mdi-wifi-strength-off::before{content:"\F92C"}.mdi-wifi-strength-off-outline::before{content:"\F92D"}.mdi-wifi-strength-outline::before{content:"\F92E"}.mdi-wii::before{content:"\F5AB"}.mdi-wiiu::before{content:"\F72C"}.mdi-wikipedia::before{content:"\F5AC"}.mdi-wind-turbine::before{content:"\FD81"}.mdi-window-close::before{content:"\F5AD"}.mdi-window-closed::before{content:"\F5AE"}.mdi-window-maximize::before{content:"\F5AF"}.mdi-window-minimize::before{content:"\F5B0"}.mdi-window-open::before{content:"\F5B1"}.mdi-window-restore::before{content:"\F5B2"}.mdi-windows::before{content:"\F5B3"}.mdi-windows-classic::before{content:"\FA20"}.mdi-wiper::before{content:"\FAE8"}.mdi-wiper-wash::before{content:"\FD82"}.mdi-wordpress::before{content:"\F5B4"}.mdi-worker::before{content:"\F5B5"}.mdi-wrap::before{content:"\F5B6"}.mdi-wrap-disabled::before{content:"\FBBB"}.mdi-wrench::before{content:"\F5B7"}.mdi-wrench-outline::before{content:"\FBBC"}.mdi-wunderlist::before{content:"\F5B8"}.mdi-xamarin::before{content:"\F844"}.mdi-xamarin-outline::before{content:"\F845"}.mdi-xaml::before{content:"\F673"}.mdi-xbox::before{content:"\F5B9"}.mdi-xbox-controller::before{content:"\F5BA"}.mdi-xbox-controller-battery-alert::before{content:"\F74A"}.mdi-xbox-controller-battery-charging::before{content:"\FA21"}.mdi-xbox-controller-battery-empty::before{content:"\F74B"}.mdi-xbox-controller-battery-full::before{content:"\F74C"}.mdi-xbox-controller-battery-low::before{content:"\F74D"}.mdi-xbox-controller-battery-medium::before{content:"\F74E"}.mdi-xbox-controller-battery-unknown::before{content:"\F74F"}.mdi-xbox-controller-menu::before{content:"\FE52"}.mdi-xbox-controller-off::before{content:"\F5BB"}.mdi-xbox-controller-view::before{content:"\FE53"}.mdi-xda::before{content:"\F5BC"}.mdi-xing::before{content:"\F5BD"}.mdi-xing-box::before{content:"\F5BE"}.mdi-xing-circle::before{content:"\F5BF"}.mdi-xml::before{content:"\F5C0"}.mdi-xmpp::before{content:"\F7FE"}.mdi-yahoo::before{content:"\FB2A"}.mdi-yammer::before{content:"\F788"}.mdi-yeast::before{content:"\F5C1"}.mdi-yelp::before{content:"\F5C2"}.mdi-yin-yang::before{content:"\F67F"}.mdi-youtube::before{content:"\F5C3"}.mdi-youtube-creator-studio::before{content:"\F846"}.mdi-youtube-gaming::before{content:"\F847"}.mdi-youtube-subscription::before{content:"\FD1C"}.mdi-youtube-tv::before{content:"\F448"}.mdi-z-wave::before{content:"\FAE9"}.mdi-zend::before{content:"\FAEA"}.mdi-zigbee::before{content:"\FD1D"}.mdi-zip-box::before{content:"\F5C4"}.mdi-zip-disk::before{content:"\FA22"}.mdi-zodiac-aquarius::before{content:"\FA7C"}.mdi-zodiac-aries::before{content:"\FA7D"}.mdi-zodiac-cancer::before{content:"\FA7E"}.mdi-zodiac-capricorn::before{content:"\FA7F"}.mdi-zodiac-gemini::before{content:"\FA80"}.mdi-zodiac-leo::before{content:"\FA81"}.mdi-zodiac-libra::before{content:"\FA82"}.mdi-zodiac-pisces::before{content:"\FA83"}.mdi-zodiac-sagittarius::before{content:"\FA84"}.mdi-zodiac-scorpio::before{content:"\FA85"}.mdi-zodiac-taurus::before{content:"\FA86"}.mdi-zodiac-virgo::before{content:"\FA87"}.mdi-blank::before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+=======
+@font-face {
+  font-family: "Material Design Icons";
+  src: url("../fonts/materialdesignicons-webfont.eot?v=3.9.97");
+  src: url("../fonts/materialdesignicons-webfont.eot?#iefix&v=3.9.97")
+      format("embedded-opentype"),
+    url("../fonts/materialdesignicons-webfont.woff2?v=3.9.97") format("woff2"),
+    url("../fonts/materialdesignicons-webfont.woff?v=3.9.97") format("woff"),
+    url("../fonts/materialdesignicons-webfont.ttf?v=3.9.97") format("truetype");
+  font-weight: normal;
+  font-style: normal;
+}
+.mdi:before,
+.mdi-set {
+  display: inline-block;
+  font: normal normal normal 24px/1 "Material Design Icons";
+  font-size: inherit;
+  text-rendering: auto;
+  line-height: inherit;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.mdi-access-point::before {
+  content: "\F002";
+}
+.mdi-access-point-network::before {
+  content: "\F003";
+}
+.mdi-access-point-network-off::before {
+  content: "\FBBD";
+}
+.mdi-account::before {
+  content: "\F004";
+}
+.mdi-account-alert::before {
+  content: "\F005";
+}
+.mdi-account-alert-outline::before {
+  content: "\FB2C";
+}
+.mdi-account-arrow-left::before {
+  content: "\FB2D";
+}
+.mdi-account-arrow-left-outline::before {
+  content: "\FB2E";
+}
+.mdi-account-arrow-right::before {
+  content: "\FB2F";
+}
+.mdi-account-arrow-right-outline::before {
+  content: "\FB30";
+}
+.mdi-account-badge::before {
+  content: "\FD83";
+}
+.mdi-account-badge-alert::before {
+  content: "\FD84";
+}
+.mdi-account-badge-alert-outline::before {
+  content: "\FD85";
+}
+.mdi-account-badge-horizontal::before {
+  content: "\FDF0";
+}
+.mdi-account-badge-horizontal-outline::before {
+  content: "\FDF1";
+}
+.mdi-account-badge-outline::before {
+  content: "\FD86";
+}
+.mdi-account-box::before {
+  content: "\F006";
+}
+.mdi-account-box-multiple::before {
+  content: "\F933";
+}
+.mdi-account-box-outline::before {
+  content: "\F007";
+}
+.mdi-account-card-details::before {
+  content: "\F5D2";
+}
+.mdi-account-card-details-outline::before {
+  content: "\FD87";
+}
+.mdi-account-check::before {
+  content: "\F008";
+}
+.mdi-account-check-outline::before {
+  content: "\FBBE";
+}
+.mdi-account-child::before {
+  content: "\FA88";
+}
+.mdi-account-child-circle::before {
+  content: "\FA89";
+}
+.mdi-account-circle::before {
+  content: "\F009";
+}
+.mdi-account-circle-outline::before {
+  content: "\FB31";
+}
+.mdi-account-clock::before {
+  content: "\FB32";
+}
+.mdi-account-clock-outline::before {
+  content: "\FB33";
+}
+.mdi-account-convert::before {
+  content: "\F00A";
+}
+.mdi-account-details::before {
+  content: "\F631";
+}
+.mdi-account-edit::before {
+  content: "\F6BB";
+}
+.mdi-account-group::before {
+  content: "\F848";
+}
+.mdi-account-group-outline::before {
+  content: "\FB34";
+}
+.mdi-account-heart::before {
+  content: "\F898";
+}
+.mdi-account-heart-outline::before {
+  content: "\FBBF";
+}
+.mdi-account-key::before {
+  content: "\F00B";
+}
+.mdi-account-key-outline::before {
+  content: "\FBC0";
+}
+.mdi-account-minus::before {
+  content: "\F00D";
+}
+.mdi-account-minus-outline::before {
+  content: "\FAEB";
+}
+.mdi-account-multiple::before {
+  content: "\F00E";
+}
+.mdi-account-multiple-check::before {
+  content: "\F8C4";
+}
+.mdi-account-multiple-minus::before {
+  content: "\F5D3";
+}
+.mdi-account-multiple-minus-outline::before {
+  content: "\FBC1";
+}
+.mdi-account-multiple-outline::before {
+  content: "\F00F";
+}
+.mdi-account-multiple-plus::before {
+  content: "\F010";
+}
+.mdi-account-multiple-plus-outline::before {
+  content: "\F7FF";
+}
+.mdi-account-network::before {
+  content: "\F011";
+}
+.mdi-account-network-outline::before {
+  content: "\FBC2";
+}
+.mdi-account-off::before {
+  content: "\F012";
+}
+.mdi-account-off-outline::before {
+  content: "\FBC3";
+}
+.mdi-account-outline::before {
+  content: "\F013";
+}
+.mdi-account-plus::before {
+  content: "\F014";
+}
+.mdi-account-plus-outline::before {
+  content: "\F800";
+}
+.mdi-account-question::before {
+  content: "\FB35";
+}
+.mdi-account-question-outline::before {
+  content: "\FB36";
+}
+.mdi-account-remove::before {
+  content: "\F015";
+}
+.mdi-account-remove-outline::before {
+  content: "\FAEC";
+}
+.mdi-account-search::before {
+  content: "\F016";
+}
+.mdi-account-search-outline::before {
+  content: "\F934";
+}
+.mdi-account-settings::before {
+  content: "\F630";
+}
+.mdi-account-star::before {
+  content: "\F017";
+}
+.mdi-account-star-outline::before {
+  content: "\FBC4";
+}
+.mdi-account-supervisor::before {
+  content: "\FA8A";
+}
+.mdi-account-supervisor-circle::before {
+  content: "\FA8B";
+}
+.mdi-account-switch::before {
+  content: "\F019";
+}
+.mdi-account-tie::before {
+  content: "\FCBF";
+}
+.mdi-accusoft::before {
+  content: "\F849";
+}
+.mdi-adchoices::before {
+  content: "\FD1E";
+}
+.mdi-adjust::before {
+  content: "\F01A";
+}
+.mdi-adobe::before {
+  content: "\F935";
+}
+.mdi-air-conditioner::before {
+  content: "\F01B";
+}
+.mdi-air-filter::before {
+  content: "\FD1F";
+}
+.mdi-air-horn::before {
+  content: "\FD88";
+}
+.mdi-air-purifier::before {
+  content: "\FD20";
+}
+.mdi-airbag::before {
+  content: "\FBC5";
+}
+.mdi-airballoon::before {
+  content: "\F01C";
+}
+.mdi-airplane::before {
+  content: "\F01D";
+}
+.mdi-airplane-landing::before {
+  content: "\F5D4";
+}
+.mdi-airplane-off::before {
+  content: "\F01E";
+}
+.mdi-airplane-takeoff::before {
+  content: "\F5D5";
+}
+.mdi-airplay::before {
+  content: "\F01F";
+}
+.mdi-airport::before {
+  content: "\F84A";
+}
+.mdi-alarm::before {
+  content: "\F020";
+}
+.mdi-alarm-bell::before {
+  content: "\F78D";
+}
+.mdi-alarm-check::before {
+  content: "\F021";
+}
+.mdi-alarm-light::before {
+  content: "\F78E";
+}
+.mdi-alarm-light-outline::before {
+  content: "\FBC6";
+}
+.mdi-alarm-multiple::before {
+  content: "\F022";
+}
+.mdi-alarm-note::before {
+  content: "\FE8E";
+}
+.mdi-alarm-note-off::before {
+  content: "\FE8F";
+}
+.mdi-alarm-off::before {
+  content: "\F023";
+}
+.mdi-alarm-plus::before {
+  content: "\F024";
+}
+.mdi-alarm-snooze::before {
+  content: "\F68D";
+}
+.mdi-album::before {
+  content: "\F025";
+}
+.mdi-alert::before {
+  content: "\F026";
+}
+.mdi-alert-box::before {
+  content: "\F027";
+}
+.mdi-alert-box-outline::before {
+  content: "\FCC0";
+}
+.mdi-alert-circle::before {
+  content: "\F028";
+}
+.mdi-alert-circle-outline::before {
+  content: "\F5D6";
+}
+.mdi-alert-decagram::before {
+  content: "\F6BC";
+}
+.mdi-alert-decagram-outline::before {
+  content: "\FCC1";
+}
+.mdi-alert-octagon::before {
+  content: "\F029";
+}
+.mdi-alert-octagon-outline::before {
+  content: "\FCC2";
+}
+.mdi-alert-octagram::before {
+  content: "\F766";
+}
+.mdi-alert-octagram-outline::before {
+  content: "\FCC3";
+}
+.mdi-alert-outline::before {
+  content: "\F02A";
+}
+.mdi-alien::before {
+  content: "\F899";
+}
+.mdi-all-inclusive::before {
+  content: "\F6BD";
+}
+.mdi-alpha::before {
+  content: "\F02B";
+}
+.mdi-alpha-a::before {
+  content: "\41";
+}
+.mdi-alpha-a-box::before {
+  content: "\FAED";
+}
+.mdi-alpha-a-box-outline::before {
+  content: "\FBC7";
+}
+.mdi-alpha-a-circle::before {
+  content: "\FBC8";
+}
+.mdi-alpha-a-circle-outline::before {
+  content: "\FBC9";
+}
+.mdi-alpha-b::before {
+  content: "\42";
+}
+.mdi-alpha-b-box::before {
+  content: "\FAEE";
+}
+.mdi-alpha-b-box-outline::before {
+  content: "\FBCA";
+}
+.mdi-alpha-b-circle::before {
+  content: "\FBCB";
+}
+.mdi-alpha-b-circle-outline::before {
+  content: "\FBCC";
+}
+.mdi-alpha-c::before {
+  content: "\43";
+}
+.mdi-alpha-c-box::before {
+  content: "\FAEF";
+}
+.mdi-alpha-c-box-outline::before {
+  content: "\FBCD";
+}
+.mdi-alpha-c-circle::before {
+  content: "\FBCE";
+}
+.mdi-alpha-c-circle-outline::before {
+  content: "\FBCF";
+}
+.mdi-alpha-d::before {
+  content: "\44";
+}
+.mdi-alpha-d-box::before {
+  content: "\FAF0";
+}
+.mdi-alpha-d-box-outline::before {
+  content: "\FBD0";
+}
+.mdi-alpha-d-circle::before {
+  content: "\FBD1";
+}
+.mdi-alpha-d-circle-outline::before {
+  content: "\FBD2";
+}
+.mdi-alpha-e::before {
+  content: "\45";
+}
+.mdi-alpha-e-box::before {
+  content: "\FAF1";
+}
+.mdi-alpha-e-box-outline::before {
+  content: "\FBD3";
+}
+.mdi-alpha-e-circle::before {
+  content: "\FBD4";
+}
+.mdi-alpha-e-circle-outline::before {
+  content: "\FBD5";
+}
+.mdi-alpha-f::before {
+  content: "\46";
+}
+.mdi-alpha-f-box::before {
+  content: "\FAF2";
+}
+.mdi-alpha-f-box-outline::before {
+  content: "\FBD6";
+}
+.mdi-alpha-f-circle::before {
+  content: "\FBD7";
+}
+.mdi-alpha-f-circle-outline::before {
+  content: "\FBD8";
+}
+.mdi-alpha-g::before {
+  content: "\47";
+}
+.mdi-alpha-g-box::before {
+  content: "\FAF3";
+}
+.mdi-alpha-g-box-outline::before {
+  content: "\FBD9";
+}
+.mdi-alpha-g-circle::before {
+  content: "\FBDA";
+}
+.mdi-alpha-g-circle-outline::before {
+  content: "\FBDB";
+}
+.mdi-alpha-h::before {
+  content: "\48";
+}
+.mdi-alpha-h-box::before {
+  content: "\FAF4";
+}
+.mdi-alpha-h-box-outline::before {
+  content: "\FBDC";
+}
+.mdi-alpha-h-circle::before {
+  content: "\FBDD";
+}
+.mdi-alpha-h-circle-outline::before {
+  content: "\FBDE";
+}
+.mdi-alpha-i::before {
+  content: "\49";
+}
+.mdi-alpha-i-box::before {
+  content: "\FAF5";
+}
+.mdi-alpha-i-box-outline::before {
+  content: "\FBDF";
+}
+.mdi-alpha-i-circle::before {
+  content: "\FBE0";
+}
+.mdi-alpha-i-circle-outline::before {
+  content: "\FBE1";
+}
+.mdi-alpha-j::before {
+  content: "\4A";
+}
+.mdi-alpha-j-box::before {
+  content: "\FAF6";
+}
+.mdi-alpha-j-box-outline::before {
+  content: "\FBE2";
+}
+.mdi-alpha-j-circle::before {
+  content: "\FBE3";
+}
+.mdi-alpha-j-circle-outline::before {
+  content: "\FBE4";
+}
+.mdi-alpha-k::before {
+  content: "\4B";
+}
+.mdi-alpha-k-box::before {
+  content: "\FAF7";
+}
+.mdi-alpha-k-box-outline::before {
+  content: "\FBE5";
+}
+.mdi-alpha-k-circle::before {
+  content: "\FBE6";
+}
+.mdi-alpha-k-circle-outline::before {
+  content: "\FBE7";
+}
+.mdi-alpha-l::before {
+  content: "\4C";
+}
+.mdi-alpha-l-box::before {
+  content: "\FAF8";
+}
+.mdi-alpha-l-box-outline::before {
+  content: "\FBE8";
+}
+.mdi-alpha-l-circle::before {
+  content: "\FBE9";
+}
+.mdi-alpha-l-circle-outline::before {
+  content: "\FBEA";
+}
+.mdi-alpha-m::before {
+  content: "\4D";
+}
+.mdi-alpha-m-box::before {
+  content: "\FAF9";
+}
+.mdi-alpha-m-box-outline::before {
+  content: "\FBEB";
+}
+.mdi-alpha-m-circle::before {
+  content: "\FBEC";
+}
+.mdi-alpha-m-circle-outline::before {
+  content: "\FBED";
+}
+.mdi-alpha-n::before {
+  content: "\4E";
+}
+.mdi-alpha-n-box::before {
+  content: "\FAFA";
+}
+.mdi-alpha-n-box-outline::before {
+  content: "\FBEE";
+}
+.mdi-alpha-n-circle::before {
+  content: "\FBEF";
+}
+.mdi-alpha-n-circle-outline::before {
+  content: "\FBF0";
+}
+.mdi-alpha-o::before {
+  content: "\4F";
+}
+.mdi-alpha-o-box::before {
+  content: "\FAFB";
+}
+.mdi-alpha-o-box-outline::before {
+  content: "\FBF1";
+}
+.mdi-alpha-o-circle::before {
+  content: "\FBF2";
+}
+.mdi-alpha-o-circle-outline::before {
+  content: "\FBF3";
+}
+.mdi-alpha-p::before {
+  content: "\50";
+}
+.mdi-alpha-p-box::before {
+  content: "\FAFC";
+}
+.mdi-alpha-p-box-outline::before {
+  content: "\FBF4";
+}
+.mdi-alpha-p-circle::before {
+  content: "\FBF5";
+}
+.mdi-alpha-p-circle-outline::before {
+  content: "\FBF6";
+}
+.mdi-alpha-q::before {
+  content: "\51";
+}
+.mdi-alpha-q-box::before {
+  content: "\FAFD";
+}
+.mdi-alpha-q-box-outline::before {
+  content: "\FBF7";
+}
+.mdi-alpha-q-circle::before {
+  content: "\FBF8";
+}
+.mdi-alpha-q-circle-outline::before {
+  content: "\FBF9";
+}
+.mdi-alpha-r::before {
+  content: "\52";
+}
+.mdi-alpha-r-box::before {
+  content: "\FAFE";
+}
+.mdi-alpha-r-box-outline::before {
+  content: "\FBFA";
+}
+.mdi-alpha-r-circle::before {
+  content: "\FBFB";
+}
+.mdi-alpha-r-circle-outline::before {
+  content: "\FBFC";
+}
+.mdi-alpha-s::before {
+  content: "\53";
+}
+.mdi-alpha-s-box::before {
+  content: "\FAFF";
+}
+.mdi-alpha-s-box-outline::before {
+  content: "\FBFD";
+}
+.mdi-alpha-s-circle::before {
+  content: "\FBFE";
+}
+.mdi-alpha-s-circle-outline::before {
+  content: "\FBFF";
+}
+.mdi-alpha-t::before {
+  content: "\54";
+}
+.mdi-alpha-t-box::before {
+  content: "\FB00";
+}
+.mdi-alpha-t-box-outline::before {
+  content: "\FC00";
+}
+.mdi-alpha-t-circle::before {
+  content: "\FC01";
+}
+.mdi-alpha-t-circle-outline::before {
+  content: "\FC02";
+}
+.mdi-alpha-u::before {
+  content: "\55";
+}
+.mdi-alpha-u-box::before {
+  content: "\FB01";
+}
+.mdi-alpha-u-box-outline::before {
+  content: "\FC03";
+}
+.mdi-alpha-u-circle::before {
+  content: "\FC04";
+}
+.mdi-alpha-u-circle-outline::before {
+  content: "\FC05";
+}
+.mdi-alpha-v::before {
+  content: "\56";
+}
+.mdi-alpha-v-box::before {
+  content: "\FB02";
+}
+.mdi-alpha-v-box-outline::before {
+  content: "\FC06";
+}
+.mdi-alpha-v-circle::before {
+  content: "\FC07";
+}
+.mdi-alpha-v-circle-outline::before {
+  content: "\FC08";
+}
+.mdi-alpha-w::before {
+  content: "\57";
+}
+.mdi-alpha-w-box::before {
+  content: "\FB03";
+}
+.mdi-alpha-w-box-outline::before {
+  content: "\FC09";
+}
+.mdi-alpha-w-circle::before {
+  content: "\FC0A";
+}
+.mdi-alpha-w-circle-outline::before {
+  content: "\FC0B";
+}
+.mdi-alpha-x::before {
+  content: "\58";
+}
+.mdi-alpha-x-box::before {
+  content: "\FB04";
+}
+.mdi-alpha-x-box-outline::before {
+  content: "\FC0C";
+}
+.mdi-alpha-x-circle::before {
+  content: "\FC0D";
+}
+.mdi-alpha-x-circle-outline::before {
+  content: "\FC0E";
+}
+.mdi-alpha-y::before {
+  content: "\59";
+}
+.mdi-alpha-y-box::before {
+  content: "\FB05";
+}
+.mdi-alpha-y-box-outline::before {
+  content: "\FC0F";
+}
+.mdi-alpha-y-circle::before {
+  content: "\FC10";
+}
+.mdi-alpha-y-circle-outline::before {
+  content: "\FC11";
+}
+.mdi-alpha-z::before {
+  content: "\5A";
+}
+.mdi-alpha-z-box::before {
+  content: "\FB06";
+}
+.mdi-alpha-z-box-outline::before {
+  content: "\FC12";
+}
+.mdi-alpha-z-circle::before {
+  content: "\FC13";
+}
+.mdi-alpha-z-circle-outline::before {
+  content: "\FC14";
+}
+.mdi-alphabetical::before {
+  content: "\F02C";
+}
+.mdi-altimeter::before {
+  content: "\F5D7";
+}
+.mdi-amazon::before {
+  content: "\F02D";
+}
+.mdi-amazon-alexa::before {
+  content: "\F8C5";
+}
+.mdi-amazon-drive::before {
+  content: "\F02E";
+}
+.mdi-ambulance::before {
+  content: "\F02F";
+}
+.mdi-ammunition::before {
+  content: "\FCC4";
+}
+.mdi-ampersand::before {
+  content: "\FA8C";
+}
+.mdi-amplifier::before {
+  content: "\F030";
+}
+.mdi-anchor::before {
+  content: "\F031";
+}
+.mdi-android::before {
+  content: "\F032";
+}
+.mdi-android-auto::before {
+  content: "\FA8D";
+}
+.mdi-android-debug-bridge::before {
+  content: "\F033";
+}
+.mdi-android-head::before {
+  content: "\F78F";
+}
+.mdi-android-messages::before {
+  content: "\FD21";
+}
+.mdi-android-studio::before {
+  content: "\F034";
+}
+.mdi-angle-acute::before {
+  content: "\F936";
+}
+.mdi-angle-obtuse::before {
+  content: "\F937";
+}
+.mdi-angle-right::before {
+  content: "\F938";
+}
+.mdi-angular::before {
+  content: "\F6B1";
+}
+.mdi-angularjs::before {
+  content: "\F6BE";
+}
+.mdi-animation::before {
+  content: "\F5D8";
+}
+.mdi-animation-outline::before {
+  content: "\FA8E";
+}
+.mdi-animation-play::before {
+  content: "\F939";
+}
+.mdi-animation-play-outline::before {
+  content: "\FA8F";
+}
+.mdi-anvil::before {
+  content: "\F89A";
+}
+.mdi-apple::before {
+  content: "\F035";
+}
+.mdi-apple-finder::before {
+  content: "\F036";
+}
+.mdi-apple-icloud::before {
+  content: "\F038";
+}
+.mdi-apple-ios::before {
+  content: "\F037";
+}
+.mdi-apple-keyboard-caps::before {
+  content: "\F632";
+}
+.mdi-apple-keyboard-command::before {
+  content: "\F633";
+}
+.mdi-apple-keyboard-control::before {
+  content: "\F634";
+}
+.mdi-apple-keyboard-option::before {
+  content: "\F635";
+}
+.mdi-apple-keyboard-shift::before {
+  content: "\F636";
+}
+.mdi-apple-safari::before {
+  content: "\F039";
+}
+.mdi-application::before {
+  content: "\F614";
+}
+.mdi-application-export::before {
+  content: "\FD89";
+}
+.mdi-application-import::before {
+  content: "\FD8A";
+}
+.mdi-apps::before {
+  content: "\F03B";
+}
+.mdi-apps-box::before {
+  content: "\FD22";
+}
+.mdi-arch::before {
+  content: "\F8C6";
+}
+.mdi-archive::before {
+  content: "\F03C";
+}
+.mdi-arrange-bring-forward::before {
+  content: "\F03D";
+}
+.mdi-arrange-bring-to-front::before {
+  content: "\F03E";
+}
+.mdi-arrange-send-backward::before {
+  content: "\F03F";
+}
+.mdi-arrange-send-to-back::before {
+  content: "\F040";
+}
+.mdi-arrow-all::before {
+  content: "\F041";
+}
+.mdi-arrow-bottom-left::before {
+  content: "\F042";
+}
+.mdi-arrow-bottom-left-bold-outline::before {
+  content: "\F9B6";
+}
+.mdi-arrow-bottom-left-thick::before {
+  content: "\F9B7";
+}
+.mdi-arrow-bottom-right::before {
+  content: "\F043";
+}
+.mdi-arrow-bottom-right-bold-outline::before {
+  content: "\F9B8";
+}
+.mdi-arrow-bottom-right-thick::before {
+  content: "\F9B9";
+}
+.mdi-arrow-collapse::before {
+  content: "\F615";
+}
+.mdi-arrow-collapse-all::before {
+  content: "\F044";
+}
+.mdi-arrow-collapse-down::before {
+  content: "\F791";
+}
+.mdi-arrow-collapse-horizontal::before {
+  content: "\F84B";
+}
+.mdi-arrow-collapse-left::before {
+  content: "\F792";
+}
+.mdi-arrow-collapse-right::before {
+  content: "\F793";
+}
+.mdi-arrow-collapse-up::before {
+  content: "\F794";
+}
+.mdi-arrow-collapse-vertical::before {
+  content: "\F84C";
+}
+.mdi-arrow-decision::before {
+  content: "\F9BA";
+}
+.mdi-arrow-decision-auto::before {
+  content: "\F9BB";
+}
+.mdi-arrow-decision-auto-outline::before {
+  content: "\F9BC";
+}
+.mdi-arrow-decision-outline::before {
+  content: "\F9BD";
+}
+.mdi-arrow-down::before {
+  content: "\F045";
+}
+.mdi-arrow-down-bold::before {
+  content: "\F72D";
+}
+.mdi-arrow-down-bold-box::before {
+  content: "\F72E";
+}
+.mdi-arrow-down-bold-box-outline::before {
+  content: "\F72F";
+}
+.mdi-arrow-down-bold-circle::before {
+  content: "\F047";
+}
+.mdi-arrow-down-bold-circle-outline::before {
+  content: "\F048";
+}
+.mdi-arrow-down-bold-hexagon-outline::before {
+  content: "\F049";
+}
+.mdi-arrow-down-bold-outline::before {
+  content: "\F9BE";
+}
+.mdi-arrow-down-box::before {
+  content: "\F6BF";
+}
+.mdi-arrow-down-circle::before {
+  content: "\FCB7";
+}
+.mdi-arrow-down-circle-outline::before {
+  content: "\FCB8";
+}
+.mdi-arrow-down-drop-circle::before {
+  content: "\F04A";
+}
+.mdi-arrow-down-drop-circle-outline::before {
+  content: "\F04B";
+}
+.mdi-arrow-down-thick::before {
+  content: "\F046";
+}
+.mdi-arrow-expand::before {
+  content: "\F616";
+}
+.mdi-arrow-expand-all::before {
+  content: "\F04C";
+}
+.mdi-arrow-expand-down::before {
+  content: "\F795";
+}
+.mdi-arrow-expand-horizontal::before {
+  content: "\F84D";
+}
+.mdi-arrow-expand-left::before {
+  content: "\F796";
+}
+.mdi-arrow-expand-right::before {
+  content: "\F797";
+}
+.mdi-arrow-expand-up::before {
+  content: "\F798";
+}
+.mdi-arrow-expand-vertical::before {
+  content: "\F84E";
+}
+.mdi-arrow-left::before {
+  content: "\F04D";
+}
+.mdi-arrow-left-bold::before {
+  content: "\F730";
+}
+.mdi-arrow-left-bold-box::before {
+  content: "\F731";
+}
+.mdi-arrow-left-bold-box-outline::before {
+  content: "\F732";
+}
+.mdi-arrow-left-bold-circle::before {
+  content: "\F04F";
+}
+.mdi-arrow-left-bold-circle-outline::before {
+  content: "\F050";
+}
+.mdi-arrow-left-bold-hexagon-outline::before {
+  content: "\F051";
+}
+.mdi-arrow-left-bold-outline::before {
+  content: "\F9BF";
+}
+.mdi-arrow-left-box::before {
+  content: "\F6C0";
+}
+.mdi-arrow-left-circle::before {
+  content: "\FCB9";
+}
+.mdi-arrow-left-circle-outline::before {
+  content: "\FCBA";
+}
+.mdi-arrow-left-drop-circle::before {
+  content: "\F052";
+}
+.mdi-arrow-left-drop-circle-outline::before {
+  content: "\F053";
+}
+.mdi-arrow-left-right::before {
+  content: "\FE90";
+}
+.mdi-arrow-left-right-bold::before {
+  content: "\FE91";
+}
+.mdi-arrow-left-right-bold-outline::before {
+  content: "\F9C0";
+}
+.mdi-arrow-left-thick::before {
+  content: "\F04E";
+}
+.mdi-arrow-right::before {
+  content: "\F054";
+}
+.mdi-arrow-right-bold::before {
+  content: "\F733";
+}
+.mdi-arrow-right-bold-box::before {
+  content: "\F734";
+}
+.mdi-arrow-right-bold-box-outline::before {
+  content: "\F735";
+}
+.mdi-arrow-right-bold-circle::before {
+  content: "\F056";
+}
+.mdi-arrow-right-bold-circle-outline::before {
+  content: "\F057";
+}
+.mdi-arrow-right-bold-hexagon-outline::before {
+  content: "\F058";
+}
+.mdi-arrow-right-bold-outline::before {
+  content: "\F9C1";
+}
+.mdi-arrow-right-box::before {
+  content: "\F6C1";
+}
+.mdi-arrow-right-circle::before {
+  content: "\FCBB";
+}
+.mdi-arrow-right-circle-outline::before {
+  content: "\FCBC";
+}
+.mdi-arrow-right-drop-circle::before {
+  content: "\F059";
+}
+.mdi-arrow-right-drop-circle-outline::before {
+  content: "\F05A";
+}
+.mdi-arrow-right-thick::before {
+  content: "\F055";
+}
+.mdi-arrow-split-horizontal::before {
+  content: "\F93A";
+}
+.mdi-arrow-split-vertical::before {
+  content: "\F93B";
+}
+.mdi-arrow-top-left::before {
+  content: "\F05B";
+}
+.mdi-arrow-top-left-bold-outline::before {
+  content: "\F9C2";
+}
+.mdi-arrow-top-left-bottom-right::before {
+  content: "\FE92";
+}
+.mdi-arrow-top-left-bottom-right-bold::before {
+  content: "\FE93";
+}
+.mdi-arrow-top-left-thick::before {
+  content: "\F9C3";
+}
+.mdi-arrow-top-right::before {
+  content: "\F05C";
+}
+.mdi-arrow-top-right-bold-outline::before {
+  content: "\F9C4";
+}
+.mdi-arrow-top-right-bottom-left::before {
+  content: "\FE94";
+}
+.mdi-arrow-top-right-bottom-left-bold::before {
+  content: "\FE95";
+}
+.mdi-arrow-top-right-thick::before {
+  content: "\F9C5";
+}
+.mdi-arrow-up::before {
+  content: "\F05D";
+}
+.mdi-arrow-up-bold::before {
+  content: "\F736";
+}
+.mdi-arrow-up-bold-box::before {
+  content: "\F737";
+}
+.mdi-arrow-up-bold-box-outline::before {
+  content: "\F738";
+}
+.mdi-arrow-up-bold-circle::before {
+  content: "\F05F";
+}
+.mdi-arrow-up-bold-circle-outline::before {
+  content: "\F060";
+}
+.mdi-arrow-up-bold-hexagon-outline::before {
+  content: "\F061";
+}
+.mdi-arrow-up-bold-outline::before {
+  content: "\F9C6";
+}
+.mdi-arrow-up-box::before {
+  content: "\F6C2";
+}
+.mdi-arrow-up-circle::before {
+  content: "\FCBD";
+}
+.mdi-arrow-up-circle-outline::before {
+  content: "\FCBE";
+}
+.mdi-arrow-up-down::before {
+  content: "\FE96";
+}
+.mdi-arrow-up-down-bold::before {
+  content: "\FE97";
+}
+.mdi-arrow-up-down-bold-outline::before {
+  content: "\F9C7";
+}
+.mdi-arrow-up-drop-circle::before {
+  content: "\F062";
+}
+.mdi-arrow-up-drop-circle-outline::before {
+  content: "\F063";
+}
+.mdi-arrow-up-thick::before {
+  content: "\F05E";
+}
+.mdi-artist::before {
+  content: "\F802";
+}
+.mdi-artist-outline::before {
+  content: "\FCC5";
+}
+.mdi-artstation::before {
+  content: "\FB37";
+}
+.mdi-aspect-ratio::before {
+  content: "\FA23";
+}
+.mdi-assistant::before {
+  content: "\F064";
+}
+.mdi-asterisk::before {
+  content: "\F6C3";
+}
+.mdi-at::before {
+  content: "\F065";
+}
+.mdi-atlassian::before {
+  content: "\F803";
+}
+.mdi-atm::before {
+  content: "\FD23";
+}
+.mdi-atom::before {
+  content: "\F767";
+}
+.mdi-atom-variant::before {
+  content: "\FE98";
+}
+.mdi-attachment::before {
+  content: "\F066";
+}
+.mdi-audio-video::before {
+  content: "\F93C";
+}
+.mdi-audiobook::before {
+  content: "\F067";
+}
+.mdi-augmented-reality::before {
+  content: "\F84F";
+}
+.mdi-auto-fix::before {
+  content: "\F068";
+}
+.mdi-auto-upload::before {
+  content: "\F069";
+}
+.mdi-autorenew::before {
+  content: "\F06A";
+}
+.mdi-av-timer::before {
+  content: "\F06B";
+}
+.mdi-aws::before {
+  content: "\FDF2";
+}
+.mdi-axe::before {
+  content: "\F8C7";
+}
+.mdi-axis::before {
+  content: "\FD24";
+}
+.mdi-axis-arrow::before {
+  content: "\FD25";
+}
+.mdi-axis-arrow-lock::before {
+  content: "\FD26";
+}
+.mdi-axis-lock::before {
+  content: "\FD27";
+}
+.mdi-axis-x-arrow::before {
+  content: "\FD28";
+}
+.mdi-axis-x-arrow-lock::before {
+  content: "\FD29";
+}
+.mdi-axis-x-rotate-clockwise::before {
+  content: "\FD2A";
+}
+.mdi-axis-x-rotate-counterclockwise::before {
+  content: "\FD2B";
+}
+.mdi-axis-x-y-arrow-lock::before {
+  content: "\FD2C";
+}
+.mdi-axis-y-arrow::before {
+  content: "\FD2D";
+}
+.mdi-axis-y-arrow-lock::before {
+  content: "\FD2E";
+}
+.mdi-axis-y-rotate-clockwise::before {
+  content: "\FD2F";
+}
+.mdi-axis-y-rotate-counterclockwise::before {
+  content: "\FD30";
+}
+.mdi-axis-z-arrow::before {
+  content: "\FD31";
+}
+.mdi-axis-z-arrow-lock::before {
+  content: "\FD32";
+}
+.mdi-axis-z-rotate-clockwise::before {
+  content: "\FD33";
+}
+.mdi-axis-z-rotate-counterclockwise::before {
+  content: "\FD34";
+}
+.mdi-azure::before {
+  content: "\F804";
+}
+.mdi-babel::before {
+  content: "\FA24";
+}
+.mdi-baby::before {
+  content: "\F06C";
+}
+.mdi-baby-bottle::before {
+  content: "\FF56";
+}
+.mdi-baby-bottle-outline::before {
+  content: "\FF57";
+}
+.mdi-baby-buggy::before {
+  content: "\F68E";
+}
+.mdi-baby-face::before {
+  content: "\FE99";
+}
+.mdi-baby-face-outline::before {
+  content: "\FE9A";
+}
+.mdi-backburger::before {
+  content: "\F06D";
+}
+.mdi-backspace::before {
+  content: "\F06E";
+}
+.mdi-backspace-outline::before {
+  content: "\FB38";
+}
+.mdi-backspace-reverse::before {
+  content: "\FE9B";
+}
+.mdi-backspace-reverse-outline::before {
+  content: "\FE9C";
+}
+.mdi-backup-restore::before {
+  content: "\F06F";
+}
+.mdi-bacteria::before {
+  content: "\FEF2";
+}
+.mdi-bacteria-outline::before {
+  content: "\FEF3";
+}
+.mdi-badminton::before {
+  content: "\F850";
+}
+.mdi-bag-carry-on::before {
+  content: "\FF58";
+}
+.mdi-bag-carry-on-check::before {
+  content: "\FD41";
+}
+.mdi-bag-carry-on-off::before {
+  content: "\FF59";
+}
+.mdi-bag-checked::before {
+  content: "\FF5A";
+}
+.mdi-bag-personal::before {
+  content: "\FDF3";
+}
+.mdi-bag-personal-off::before {
+  content: "\FDF4";
+}
+.mdi-bag-personal-off-outline::before {
+  content: "\FDF5";
+}
+.mdi-bag-personal-outline::before {
+  content: "\FDF6";
+}
+.mdi-baguette::before {
+  content: "\FF5B";
+}
+.mdi-balloon::before {
+  content: "\FA25";
+}
+.mdi-ballot::before {
+  content: "\F9C8";
+}
+.mdi-ballot-outline::before {
+  content: "\F9C9";
+}
+.mdi-ballot-recount::before {
+  content: "\FC15";
+}
+.mdi-ballot-recount-outline::before {
+  content: "\FC16";
+}
+.mdi-bandage::before {
+  content: "\FD8B";
+}
+.mdi-bandcamp::before {
+  content: "\F674";
+}
+.mdi-bank::before {
+  content: "\F070";
+}
+.mdi-bank-minus::before {
+  content: "\FD8C";
+}
+.mdi-bank-outline::before {
+  content: "\FE9D";
+}
+.mdi-bank-plus::before {
+  content: "\FD8D";
+}
+.mdi-bank-remove::before {
+  content: "\FD8E";
+}
+.mdi-bank-transfer::before {
+  content: "\FA26";
+}
+.mdi-bank-transfer-in::before {
+  content: "\FA27";
+}
+.mdi-bank-transfer-out::before {
+  content: "\FA28";
+}
+.mdi-barcode::before {
+  content: "\F071";
+}
+.mdi-barcode-scan::before {
+  content: "\F072";
+}
+.mdi-barley::before {
+  content: "\F073";
+}
+.mdi-barley-off::before {
+  content: "\FB39";
+}
+.mdi-barn::before {
+  content: "\FB3A";
+}
+.mdi-barrel::before {
+  content: "\F074";
+}
+.mdi-baseball::before {
+  content: "\F851";
+}
+.mdi-baseball-bat::before {
+  content: "\F852";
+}
+.mdi-basecamp::before {
+  content: "\F075";
+}
+.mdi-basket::before {
+  content: "\F076";
+}
+.mdi-basket-fill::before {
+  content: "\F077";
+}
+.mdi-basket-unfill::before {
+  content: "\F078";
+}
+.mdi-basketball::before {
+  content: "\F805";
+}
+.mdi-basketball-hoop::before {
+  content: "\FC17";
+}
+.mdi-basketball-hoop-outline::before {
+  content: "\FC18";
+}
+.mdi-bat::before {
+  content: "\FB3B";
+}
+.mdi-battery::before {
+  content: "\F079";
+}
+.mdi-battery-10::before {
+  content: "\F07A";
+}
+.mdi-battery-10-bluetooth::before {
+  content: "\F93D";
+}
+.mdi-battery-20::before {
+  content: "\F07B";
+}
+.mdi-battery-20-bluetooth::before {
+  content: "\F93E";
+}
+.mdi-battery-30::before {
+  content: "\F07C";
+}
+.mdi-battery-30-bluetooth::before {
+  content: "\F93F";
+}
+.mdi-battery-40::before {
+  content: "\F07D";
+}
+.mdi-battery-40-bluetooth::before {
+  content: "\F940";
+}
+.mdi-battery-50::before {
+  content: "\F07E";
+}
+.mdi-battery-50-bluetooth::before {
+  content: "\F941";
+}
+.mdi-battery-60::before {
+  content: "\F07F";
+}
+.mdi-battery-60-bluetooth::before {
+  content: "\F942";
+}
+.mdi-battery-70::before {
+  content: "\F080";
+}
+.mdi-battery-70-bluetooth::before {
+  content: "\F943";
+}
+.mdi-battery-80::before {
+  content: "\F081";
+}
+.mdi-battery-80-bluetooth::before {
+  content: "\F944";
+}
+.mdi-battery-90::before {
+  content: "\F082";
+}
+.mdi-battery-90-bluetooth::before {
+  content: "\F945";
+}
+.mdi-battery-alert::before {
+  content: "\F083";
+}
+.mdi-battery-alert-bluetooth::before {
+  content: "\F946";
+}
+.mdi-battery-bluetooth::before {
+  content: "\F947";
+}
+.mdi-battery-bluetooth-variant::before {
+  content: "\F948";
+}
+.mdi-battery-charging::before {
+  content: "\F084";
+}
+.mdi-battery-charging-10::before {
+  content: "\F89B";
+}
+.mdi-battery-charging-100::before {
+  content: "\F085";
+}
+.mdi-battery-charging-20::before {
+  content: "\F086";
+}
+.mdi-battery-charging-30::before {
+  content: "\F087";
+}
+.mdi-battery-charging-40::before {
+  content: "\F088";
+}
+.mdi-battery-charging-50::before {
+  content: "\F89C";
+}
+.mdi-battery-charging-60::before {
+  content: "\F089";
+}
+.mdi-battery-charging-70::before {
+  content: "\F89D";
+}
+.mdi-battery-charging-80::before {
+  content: "\F08A";
+}
+.mdi-battery-charging-90::before {
+  content: "\F08B";
+}
+.mdi-battery-charging-outline::before {
+  content: "\F89E";
+}
+.mdi-battery-charging-wireless::before {
+  content: "\F806";
+}
+.mdi-battery-charging-wireless-10::before {
+  content: "\F807";
+}
+.mdi-battery-charging-wireless-20::before {
+  content: "\F808";
+}
+.mdi-battery-charging-wireless-30::before {
+  content: "\F809";
+}
+.mdi-battery-charging-wireless-40::before {
+  content: "\F80A";
+}
+.mdi-battery-charging-wireless-50::before {
+  content: "\F80B";
+}
+.mdi-battery-charging-wireless-60::before {
+  content: "\F80C";
+}
+.mdi-battery-charging-wireless-70::before {
+  content: "\F80D";
+}
+.mdi-battery-charging-wireless-80::before {
+  content: "\F80E";
+}
+.mdi-battery-charging-wireless-90::before {
+  content: "\F80F";
+}
+.mdi-battery-charging-wireless-alert::before {
+  content: "\F810";
+}
+.mdi-battery-charging-wireless-outline::before {
+  content: "\F811";
+}
+.mdi-battery-minus::before {
+  content: "\F08C";
+}
+.mdi-battery-negative::before {
+  content: "\F08D";
+}
+.mdi-battery-outline::before {
+  content: "\F08E";
+}
+.mdi-battery-plus::before {
+  content: "\F08F";
+}
+.mdi-battery-positive::before {
+  content: "\F090";
+}
+.mdi-battery-unknown::before {
+  content: "\F091";
+}
+.mdi-battery-unknown-bluetooth::before {
+  content: "\F949";
+}
+.mdi-battlenet::before {
+  content: "\FB3C";
+}
+.mdi-beach::before {
+  content: "\F092";
+}
+.mdi-beaker::before {
+  content: "\FCC6";
+}
+.mdi-beaker-outline::before {
+  content: "\F68F";
+}
+.mdi-beats::before {
+  content: "\F097";
+}
+.mdi-bed-empty::before {
+  content: "\F89F";
+}
+.mdi-beer::before {
+  content: "\F098";
+}
+.mdi-behance::before {
+  content: "\F099";
+}
+.mdi-bell::before {
+  content: "\F09A";
+}
+.mdi-bell-alert::before {
+  content: "\FD35";
+}
+.mdi-bell-alert-outline::before {
+  content: "\FE9E";
+}
+.mdi-bell-circle::before {
+  content: "\FD36";
+}
+.mdi-bell-circle-outline::before {
+  content: "\FD37";
+}
+.mdi-bell-off::before {
+  content: "\F09B";
+}
+.mdi-bell-off-outline::before {
+  content: "\FA90";
+}
+.mdi-bell-outline::before {
+  content: "\F09C";
+}
+.mdi-bell-plus::before {
+  content: "\F09D";
+}
+.mdi-bell-plus-outline::before {
+  content: "\FA91";
+}
+.mdi-bell-ring::before {
+  content: "\F09E";
+}
+.mdi-bell-ring-outline::before {
+  content: "\F09F";
+}
+.mdi-bell-sleep::before {
+  content: "\F0A0";
+}
+.mdi-bell-sleep-outline::before {
+  content: "\FA92";
+}
+.mdi-beta::before {
+  content: "\F0A1";
+}
+.mdi-betamax::before {
+  content: "\F9CA";
+}
+.mdi-biathlon::before {
+  content: "\FDF7";
+}
+.mdi-bible::before {
+  content: "\F0A2";
+}
+.mdi-bike::before {
+  content: "\F0A3";
+}
+.mdi-billiards::before {
+  content: "\FB3D";
+}
+.mdi-billiards-rack::before {
+  content: "\FB3E";
+}
+.mdi-bing::before {
+  content: "\F0A4";
+}
+.mdi-binoculars::before {
+  content: "\F0A5";
+}
+.mdi-bio::before {
+  content: "\F0A6";
+}
+.mdi-biohazard::before {
+  content: "\F0A7";
+}
+.mdi-bitbucket::before {
+  content: "\F0A8";
+}
+.mdi-bitcoin::before {
+  content: "\F812";
+}
+.mdi-black-mesa::before {
+  content: "\F0A9";
+}
+.mdi-blackberry::before {
+  content: "\F0AA";
+}
+.mdi-blender::before {
+  content: "\FCC7";
+}
+.mdi-blender-software::before {
+  content: "\F0AB";
+}
+.mdi-blinds::before {
+  content: "\F0AC";
+}
+.mdi-block-helper::before {
+  content: "\F0AD";
+}
+.mdi-blogger::before {
+  content: "\F0AE";
+}
+.mdi-blood-bag::before {
+  content: "\FCC8";
+}
+.mdi-bluetooth::before {
+  content: "\F0AF";
+}
+.mdi-bluetooth-audio::before {
+  content: "\F0B0";
+}
+.mdi-bluetooth-connect::before {
+  content: "\F0B1";
+}
+.mdi-bluetooth-off::before {
+  content: "\F0B2";
+}
+.mdi-bluetooth-settings::before {
+  content: "\F0B3";
+}
+.mdi-bluetooth-transfer::before {
+  content: "\F0B4";
+}
+.mdi-blur::before {
+  content: "\F0B5";
+}
+.mdi-blur-linear::before {
+  content: "\F0B6";
+}
+.mdi-blur-off::before {
+  content: "\F0B7";
+}
+.mdi-blur-radial::before {
+  content: "\F0B8";
+}
+.mdi-bolnisi-cross::before {
+  content: "\FCC9";
+}
+.mdi-bolt::before {
+  content: "\FD8F";
+}
+.mdi-bomb::before {
+  content: "\F690";
+}
+.mdi-bomb-off::before {
+  content: "\F6C4";
+}
+.mdi-bone::before {
+  content: "\F0B9";
+}
+.mdi-book::before {
+  content: "\F0BA";
+}
+.mdi-book-lock::before {
+  content: "\F799";
+}
+.mdi-book-lock-open::before {
+  content: "\F79A";
+}
+.mdi-book-minus::before {
+  content: "\F5D9";
+}
+.mdi-book-minus-multiple::before {
+  content: "\FA93";
+}
+.mdi-book-multiple::before {
+  content: "\F0BB";
+}
+.mdi-book-open::before {
+  content: "\F0BD";
+}
+.mdi-book-open-outline::before {
+  content: "\FB3F";
+}
+.mdi-book-open-page-variant::before {
+  content: "\F5DA";
+}
+.mdi-book-open-variant::before {
+  content: "\F0BE";
+}
+.mdi-book-outline::before {
+  content: "\FB40";
+}
+.mdi-book-play::before {
+  content: "\FE9F";
+}
+.mdi-book-play-outline::before {
+  content: "\FEA0";
+}
+.mdi-book-plus::before {
+  content: "\F5DB";
+}
+.mdi-book-plus-multiple::before {
+  content: "\FA94";
+}
+.mdi-book-remove::before {
+  content: "\FA96";
+}
+.mdi-book-remove-multiple::before {
+  content: "\FA95";
+}
+.mdi-book-search::before {
+  content: "\FEA1";
+}
+.mdi-book-search-outline::before {
+  content: "\FEA2";
+}
+.mdi-book-variant::before {
+  content: "\F0BF";
+}
+.mdi-book-variant-multiple::before {
+  content: "\F0BC";
+}
+.mdi-bookmark::before {
+  content: "\F0C0";
+}
+.mdi-bookmark-check::before {
+  content: "\F0C1";
+}
+.mdi-bookmark-minus::before {
+  content: "\F9CB";
+}
+.mdi-bookmark-minus-outline::before {
+  content: "\F9CC";
+}
+.mdi-bookmark-multiple::before {
+  content: "\FDF8";
+}
+.mdi-bookmark-multiple-outline::before {
+  content: "\FDF9";
+}
+.mdi-bookmark-music::before {
+  content: "\F0C2";
+}
+.mdi-bookmark-off::before {
+  content: "\F9CD";
+}
+.mdi-bookmark-off-outline::before {
+  content: "\F9CE";
+}
+.mdi-bookmark-outline::before {
+  content: "\F0C3";
+}
+.mdi-bookmark-plus::before {
+  content: "\F0C5";
+}
+.mdi-bookmark-plus-outline::before {
+  content: "\F0C4";
+}
+.mdi-bookmark-remove::before {
+  content: "\F0C6";
+}
+.mdi-boom-gate::before {
+  content: "\FEA3";
+}
+.mdi-boom-gate-alert::before {
+  content: "\FEA4";
+}
+.mdi-boom-gate-alert-outline::before {
+  content: "\FEA5";
+}
+.mdi-boom-gate-down::before {
+  content: "\FEA6";
+}
+.mdi-boom-gate-down-outline::before {
+  content: "\FEA7";
+}
+.mdi-boom-gate-outline::before {
+  content: "\FEA8";
+}
+.mdi-boom-gate-up::before {
+  content: "\FEA9";
+}
+.mdi-boom-gate-up-outline::before {
+  content: "\FEAA";
+}
+.mdi-boombox::before {
+  content: "\F5DC";
+}
+.mdi-bootstrap::before {
+  content: "\F6C5";
+}
+.mdi-border-all::before {
+  content: "\F0C7";
+}
+.mdi-border-all-variant::before {
+  content: "\F8A0";
+}
+.mdi-border-bottom::before {
+  content: "\F0C8";
+}
+.mdi-border-bottom-variant::before {
+  content: "\F8A1";
+}
+.mdi-border-color::before {
+  content: "\F0C9";
+}
+.mdi-border-horizontal::before {
+  content: "\F0CA";
+}
+.mdi-border-inside::before {
+  content: "\F0CB";
+}
+.mdi-border-left::before {
+  content: "\F0CC";
+}
+.mdi-border-left-variant::before {
+  content: "\F8A2";
+}
+.mdi-border-none::before {
+  content: "\F0CD";
+}
+.mdi-border-none-variant::before {
+  content: "\F8A3";
+}
+.mdi-border-outside::before {
+  content: "\F0CE";
+}
+.mdi-border-right::before {
+  content: "\F0CF";
+}
+.mdi-border-right-variant::before {
+  content: "\F8A4";
+}
+.mdi-border-style::before {
+  content: "\F0D0";
+}
+.mdi-border-top::before {
+  content: "\F0D1";
+}
+.mdi-border-top-variant::before {
+  content: "\F8A5";
+}
+.mdi-border-vertical::before {
+  content: "\F0D2";
+}
+.mdi-bottle-wine::before {
+  content: "\F853";
+}
+.mdi-bow-tie::before {
+  content: "\F677";
+}
+.mdi-bowl::before {
+  content: "\F617";
+}
+.mdi-bowling::before {
+  content: "\F0D3";
+}
+.mdi-box::before {
+  content: "\F0D4";
+}
+.mdi-box-cutter::before {
+  content: "\F0D5";
+}
+.mdi-box-shadow::before {
+  content: "\F637";
+}
+.mdi-boxing-glove::before {
+  content: "\FB41";
+}
+.mdi-braille::before {
+  content: "\F9CF";
+}
+.mdi-brain::before {
+  content: "\F9D0";
+}
+.mdi-bread-slice::before {
+  content: "\FCCA";
+}
+.mdi-bread-slice-outline::before {
+  content: "\FCCB";
+}
+.mdi-bridge::before {
+  content: "\F618";
+}
+.mdi-briefcase::before {
+  content: "\F0D6";
+}
+.mdi-briefcase-account::before {
+  content: "\FCCC";
+}
+.mdi-briefcase-account-outline::before {
+  content: "\FCCD";
+}
+.mdi-briefcase-check::before {
+  content: "\F0D7";
+}
+.mdi-briefcase-download::before {
+  content: "\F0D8";
+}
+.mdi-briefcase-download-outline::before {
+  content: "\FC19";
+}
+.mdi-briefcase-edit::before {
+  content: "\FA97";
+}
+.mdi-briefcase-edit-outline::before {
+  content: "\FC1A";
+}
+.mdi-briefcase-minus::before {
+  content: "\FA29";
+}
+.mdi-briefcase-minus-outline::before {
+  content: "\FC1B";
+}
+.mdi-briefcase-outline::before {
+  content: "\F813";
+}
+.mdi-briefcase-plus::before {
+  content: "\FA2A";
+}
+.mdi-briefcase-plus-outline::before {
+  content: "\FC1C";
+}
+.mdi-briefcase-remove::before {
+  content: "\FA2B";
+}
+.mdi-briefcase-remove-outline::before {
+  content: "\FC1D";
+}
+.mdi-briefcase-search::before {
+  content: "\FA2C";
+}
+.mdi-briefcase-search-outline::before {
+  content: "\FC1E";
+}
+.mdi-briefcase-upload::before {
+  content: "\F0D9";
+}
+.mdi-briefcase-upload-outline::before {
+  content: "\FC1F";
+}
+.mdi-brightness-1::before {
+  content: "\F0DA";
+}
+.mdi-brightness-2::before {
+  content: "\F0DB";
+}
+.mdi-brightness-3::before {
+  content: "\F0DC";
+}
+.mdi-brightness-4::before {
+  content: "\F0DD";
+}
+.mdi-brightness-5::before {
+  content: "\F0DE";
+}
+.mdi-brightness-6::before {
+  content: "\F0DF";
+}
+.mdi-brightness-7::before {
+  content: "\F0E0";
+}
+.mdi-brightness-auto::before {
+  content: "\F0E1";
+}
+.mdi-brightness-percent::before {
+  content: "\FCCE";
+}
+.mdi-broom::before {
+  content: "\F0E2";
+}
+.mdi-brush::before {
+  content: "\F0E3";
+}
+.mdi-buddhism::before {
+  content: "\F94A";
+}
+.mdi-buffer::before {
+  content: "\F619";
+}
+.mdi-bug::before {
+  content: "\F0E4";
+}
+.mdi-bug-check::before {
+  content: "\FA2D";
+}
+.mdi-bug-check-outline::before {
+  content: "\FA2E";
+}
+.mdi-bug-outline::before {
+  content: "\FA2F";
+}
+.mdi-bugle::before {
+  content: "\FD90";
+}
+.mdi-bulldozer::before {
+  content: "\FB07";
+}
+.mdi-bullet::before {
+  content: "\FCCF";
+}
+.mdi-bulletin-board::before {
+  content: "\F0E5";
+}
+.mdi-bullhorn::before {
+  content: "\F0E6";
+}
+.mdi-bullhorn-outline::before {
+  content: "\FB08";
+}
+.mdi-bullseye::before {
+  content: "\F5DD";
+}
+.mdi-bullseye-arrow::before {
+  content: "\F8C8";
+}
+.mdi-bus::before {
+  content: "\F0E7";
+}
+.mdi-bus-alert::before {
+  content: "\FA98";
+}
+.mdi-bus-articulated-end::before {
+  content: "\F79B";
+}
+.mdi-bus-articulated-front::before {
+  content: "\F79C";
+}
+.mdi-bus-clock::before {
+  content: "\F8C9";
+}
+.mdi-bus-double-decker::before {
+  content: "\F79D";
+}
+.mdi-bus-multiple::before {
+  content: "\FF5C";
+}
+.mdi-bus-school::before {
+  content: "\F79E";
+}
+.mdi-bus-side::before {
+  content: "\F79F";
+}
+.mdi-cached::before {
+  content: "\F0E8";
+}
+.mdi-cactus::before {
+  content: "\FD91";
+}
+.mdi-cake::before {
+  content: "\F0E9";
+}
+.mdi-cake-layered::before {
+  content: "\F0EA";
+}
+.mdi-cake-variant::before {
+  content: "\F0EB";
+}
+.mdi-calculator::before {
+  content: "\F0EC";
+}
+.mdi-calculator-variant::before {
+  content: "\FA99";
+}
+.mdi-calendar::before {
+  content: "\F0ED";
+}
+.mdi-calendar-account::before {
+  content: "\FEF4";
+}
+.mdi-calendar-account-outline::before {
+  content: "\FEF5";
+}
+.mdi-calendar-alert::before {
+  content: "\FA30";
+}
+.mdi-calendar-blank::before {
+  content: "\F0EE";
+}
+.mdi-calendar-blank-outline::before {
+  content: "\FB42";
+}
+.mdi-calendar-check::before {
+  content: "\F0EF";
+}
+.mdi-calendar-check-outline::before {
+  content: "\FC20";
+}
+.mdi-calendar-clock::before {
+  content: "\F0F0";
+}
+.mdi-calendar-edit::before {
+  content: "\F8A6";
+}
+.mdi-calendar-export::before {
+  content: "\FB09";
+}
+.mdi-calendar-heart::before {
+  content: "\F9D1";
+}
+.mdi-calendar-import::before {
+  content: "\FB0A";
+}
+.mdi-calendar-minus::before {
+  content: "\FD38";
+}
+.mdi-calendar-month::before {
+  content: "\FDFA";
+}
+.mdi-calendar-month-outline::before {
+  content: "\FDFB";
+}
+.mdi-calendar-multiple::before {
+  content: "\F0F1";
+}
+.mdi-calendar-multiple-check::before {
+  content: "\F0F2";
+}
+.mdi-calendar-multiselect::before {
+  content: "\FA31";
+}
+.mdi-calendar-outline::before {
+  content: "\FB43";
+}
+.mdi-calendar-plus::before {
+  content: "\F0F3";
+}
+.mdi-calendar-question::before {
+  content: "\F691";
+}
+.mdi-calendar-range::before {
+  content: "\F678";
+}
+.mdi-calendar-range-outline::before {
+  content: "\FB44";
+}
+.mdi-calendar-remove::before {
+  content: "\F0F4";
+}
+.mdi-calendar-remove-outline::before {
+  content: "\FC21";
+}
+.mdi-calendar-repeat::before {
+  content: "\FEAB";
+}
+.mdi-calendar-repeat-outline::before {
+  content: "\FEAC";
+}
+.mdi-calendar-search::before {
+  content: "\F94B";
+}
+.mdi-calendar-star::before {
+  content: "\F9D2";
+}
+.mdi-calendar-text::before {
+  content: "\F0F5";
+}
+.mdi-calendar-text-outline::before {
+  content: "\FC22";
+}
+.mdi-calendar-today::before {
+  content: "\F0F6";
+}
+.mdi-calendar-week::before {
+  content: "\FA32";
+}
+.mdi-calendar-week-begin::before {
+  content: "\FA33";
+}
+.mdi-calendar-weekend::before {
+  content: "\FEF6";
+}
+.mdi-calendar-weekend-outline::before {
+  content: "\FEF7";
+}
+.mdi-call-made::before {
+  content: "\F0F7";
+}
+.mdi-call-merge::before {
+  content: "\F0F8";
+}
+.mdi-call-missed::before {
+  content: "\F0F9";
+}
+.mdi-call-received::before {
+  content: "\F0FA";
+}
+.mdi-call-split::before {
+  content: "\F0FB";
+}
+.mdi-camcorder::before {
+  content: "\F0FC";
+}
+.mdi-camcorder-box::before {
+  content: "\F0FD";
+}
+.mdi-camcorder-box-off::before {
+  content: "\F0FE";
+}
+.mdi-camcorder-off::before {
+  content: "\F0FF";
+}
+.mdi-camera::before {
+  content: "\F100";
+}
+.mdi-camera-account::before {
+  content: "\F8CA";
+}
+.mdi-camera-burst::before {
+  content: "\F692";
+}
+.mdi-camera-control::before {
+  content: "\FB45";
+}
+.mdi-camera-enhance::before {
+  content: "\F101";
+}
+.mdi-camera-enhance-outline::before {
+  content: "\FB46";
+}
+.mdi-camera-front::before {
+  content: "\F102";
+}
+.mdi-camera-front-variant::before {
+  content: "\F103";
+}
+.mdi-camera-gopro::before {
+  content: "\F7A0";
+}
+.mdi-camera-image::before {
+  content: "\F8CB";
+}
+.mdi-camera-iris::before {
+  content: "\F104";
+}
+.mdi-camera-metering-center::before {
+  content: "\F7A1";
+}
+.mdi-camera-metering-matrix::before {
+  content: "\F7A2";
+}
+.mdi-camera-metering-partial::before {
+  content: "\F7A3";
+}
+.mdi-camera-metering-spot::before {
+  content: "\F7A4";
+}
+.mdi-camera-off::before {
+  content: "\F5DF";
+}
+.mdi-camera-outline::before {
+  content: "\FD39";
+}
+.mdi-camera-party-mode::before {
+  content: "\F105";
+}
+.mdi-camera-plus::before {
+  content: "\FEF8";
+}
+.mdi-camera-plus-outline::before {
+  content: "\FEF9";
+}
+.mdi-camera-rear::before {
+  content: "\F106";
+}
+.mdi-camera-rear-variant::before {
+  content: "\F107";
+}
+.mdi-camera-retake::before {
+  content: "\FDFC";
+}
+.mdi-camera-retake-outline::before {
+  content: "\FDFD";
+}
+.mdi-camera-switch::before {
+  content: "\F108";
+}
+.mdi-camera-timer::before {
+  content: "\F109";
+}
+.mdi-camera-wireless::before {
+  content: "\FD92";
+}
+.mdi-camera-wireless-outline::before {
+  content: "\FD93";
+}
+.mdi-campfire::before {
+  content: "\FEFA";
+}
+.mdi-cancel::before {
+  content: "\F739";
+}
+.mdi-candle::before {
+  content: "\F5E2";
+}
+.mdi-candycane::before {
+  content: "\F10A";
+}
+.mdi-cannabis::before {
+  content: "\F7A5";
+}
+.mdi-caps-lock::before {
+  content: "\FA9A";
+}
+.mdi-car::before {
+  content: "\F10B";
+}
+.mdi-car-back::before {
+  content: "\FDFE";
+}
+.mdi-car-battery::before {
+  content: "\F10C";
+}
+.mdi-car-brake-abs::before {
+  content: "\FC23";
+}
+.mdi-car-brake-alert::before {
+  content: "\FC24";
+}
+.mdi-car-brake-hold::before {
+  content: "\FD3A";
+}
+.mdi-car-brake-parking::before {
+  content: "\FD3B";
+}
+.mdi-car-connected::before {
+  content: "\F10D";
+}
+.mdi-car-convertible::before {
+  content: "\F7A6";
+}
+.mdi-car-cruise-control::before {
+  content: "\FD3C";
+}
+.mdi-car-defrost-front::before {
+  content: "\FD3D";
+}
+.mdi-car-defrost-rear::before {
+  content: "\FD3E";
+}
+.mdi-car-door::before {
+  content: "\FB47";
+}
+.mdi-car-electric::before {
+  content: "\FB48";
+}
+.mdi-car-esp::before {
+  content: "\FC25";
+}
+.mdi-car-estate::before {
+  content: "\F7A7";
+}
+.mdi-car-hatchback::before {
+  content: "\F7A8";
+}
+.mdi-car-key::before {
+  content: "\FB49";
+}
+.mdi-car-light-dimmed::before {
+  content: "\FC26";
+}
+.mdi-car-light-fog::before {
+  content: "\FC27";
+}
+.mdi-car-light-high::before {
+  content: "\FC28";
+}
+.mdi-car-limousine::before {
+  content: "\F8CC";
+}
+.mdi-car-multiple::before {
+  content: "\FB4A";
+}
+.mdi-car-off::before {
+  content: "\FDFF";
+}
+.mdi-car-parking-lights::before {
+  content: "\FD3F";
+}
+.mdi-car-pickup::before {
+  content: "\F7A9";
+}
+.mdi-car-shift-pattern::before {
+  content: "\FF5D";
+}
+.mdi-car-side::before {
+  content: "\F7AA";
+}
+.mdi-car-sports::before {
+  content: "\F7AB";
+}
+.mdi-car-tire-alert::before {
+  content: "\FC29";
+}
+.mdi-car-traction-control::before {
+  content: "\FD40";
+}
+.mdi-car-wash::before {
+  content: "\F10E";
+}
+.mdi-caravan::before {
+  content: "\F7AC";
+}
+.mdi-card::before {
+  content: "\FB4B";
+}
+.mdi-card-bulleted::before {
+  content: "\FB4C";
+}
+.mdi-card-bulleted-off::before {
+  content: "\FB4D";
+}
+.mdi-card-bulleted-off-outline::before {
+  content: "\FB4E";
+}
+.mdi-card-bulleted-outline::before {
+  content: "\FB4F";
+}
+.mdi-card-bulleted-settings::before {
+  content: "\FB50";
+}
+.mdi-card-bulleted-settings-outline::before {
+  content: "\FB51";
+}
+.mdi-card-outline::before {
+  content: "\FB52";
+}
+.mdi-card-text::before {
+  content: "\FB53";
+}
+.mdi-card-text-outline::before {
+  content: "\FB54";
+}
+.mdi-cards::before {
+  content: "\F638";
+}
+.mdi-cards-club::before {
+  content: "\F8CD";
+}
+.mdi-cards-diamond::before {
+  content: "\F8CE";
+}
+.mdi-cards-heart::before {
+  content: "\F8CF";
+}
+.mdi-cards-outline::before {
+  content: "\F639";
+}
+.mdi-cards-playing-outline::before {
+  content: "\F63A";
+}
+.mdi-cards-spade::before {
+  content: "\F8D0";
+}
+.mdi-cards-variant::before {
+  content: "\F6C6";
+}
+.mdi-carrot::before {
+  content: "\F10F";
+}
+.mdi-cart::before {
+  content: "\F110";
+}
+.mdi-cart-arrow-down::before {
+  content: "\FD42";
+}
+.mdi-cart-arrow-right::before {
+  content: "\FC2A";
+}
+.mdi-cart-arrow-up::before {
+  content: "\FD43";
+}
+.mdi-cart-minus::before {
+  content: "\FD44";
+}
+.mdi-cart-off::before {
+  content: "\F66B";
+}
+.mdi-cart-outline::before {
+  content: "\F111";
+}
+.mdi-cart-plus::before {
+  content: "\F112";
+}
+.mdi-cart-remove::before {
+  content: "\FD45";
+}
+.mdi-case-sensitive-alt::before {
+  content: "\F113";
+}
+.mdi-cash::before {
+  content: "\F114";
+}
+.mdi-cash-100::before {
+  content: "\F115";
+}
+.mdi-cash-marker::before {
+  content: "\FD94";
+}
+.mdi-cash-multiple::before {
+  content: "\F116";
+}
+.mdi-cash-refund::before {
+  content: "\FA9B";
+}
+.mdi-cash-register::before {
+  content: "\FCD0";
+}
+.mdi-cash-usd::before {
+  content: "\F117";
+}
+.mdi-cassette::before {
+  content: "\F9D3";
+}
+.mdi-cast::before {
+  content: "\F118";
+}
+.mdi-cast-connected::before {
+  content: "\F119";
+}
+.mdi-cast-education::before {
+  content: "\FE6D";
+}
+.mdi-cast-off::before {
+  content: "\F789";
+}
+.mdi-castle::before {
+  content: "\F11A";
+}
+.mdi-cat::before {
+  content: "\F11B";
+}
+.mdi-cctv::before {
+  content: "\F7AD";
+}
+.mdi-ceiling-light::before {
+  content: "\F768";
+}
+.mdi-cellphone::before {
+  content: "\F11C";
+}
+.mdi-cellphone-android::before {
+  content: "\F11D";
+}
+.mdi-cellphone-arrow-down::before {
+  content: "\F9D4";
+}
+.mdi-cellphone-basic::before {
+  content: "\F11E";
+}
+.mdi-cellphone-dock::before {
+  content: "\F11F";
+}
+.mdi-cellphone-erase::before {
+  content: "\F94C";
+}
+.mdi-cellphone-information::before {
+  content: "\FF5E";
+}
+.mdi-cellphone-iphone::before {
+  content: "\F120";
+}
+.mdi-cellphone-key::before {
+  content: "\F94D";
+}
+.mdi-cellphone-link::before {
+  content: "\F121";
+}
+.mdi-cellphone-link-off::before {
+  content: "\F122";
+}
+.mdi-cellphone-lock::before {
+  content: "\F94E";
+}
+.mdi-cellphone-message::before {
+  content: "\F8D2";
+}
+.mdi-cellphone-nfc::before {
+  content: "\FEAD";
+}
+.mdi-cellphone-off::before {
+  content: "\F94F";
+}
+.mdi-cellphone-screenshot::before {
+  content: "\FA34";
+}
+.mdi-cellphone-settings::before {
+  content: "\F123";
+}
+.mdi-cellphone-settings-variant::before {
+  content: "\F950";
+}
+.mdi-cellphone-sound::before {
+  content: "\F951";
+}
+.mdi-cellphone-text::before {
+  content: "\F8D1";
+}
+.mdi-cellphone-wireless::before {
+  content: "\F814";
+}
+.mdi-celtic-cross::before {
+  content: "\FCD1";
+}
+.mdi-certificate::before {
+  content: "\F124";
+}
+.mdi-chair-rolling::before {
+  content: "\FFBA";
+}
+.mdi-chair-school::before {
+  content: "\F125";
+}
+.mdi-charity::before {
+  content: "\FC2B";
+}
+.mdi-chart-arc::before {
+  content: "\F126";
+}
+.mdi-chart-areaspline::before {
+  content: "\F127";
+}
+.mdi-chart-areaspline-variant::before {
+  content: "\FEAE";
+}
+.mdi-chart-bar::before {
+  content: "\F128";
+}
+.mdi-chart-bar-stacked::before {
+  content: "\F769";
+}
+.mdi-chart-bell-curve::before {
+  content: "\FC2C";
+}
+.mdi-chart-bubble::before {
+  content: "\F5E3";
+}
+.mdi-chart-donut::before {
+  content: "\F7AE";
+}
+.mdi-chart-donut-variant::before {
+  content: "\F7AF";
+}
+.mdi-chart-gantt::before {
+  content: "\F66C";
+}
+.mdi-chart-histogram::before {
+  content: "\F129";
+}
+.mdi-chart-line::before {
+  content: "\F12A";
+}
+.mdi-chart-line-stacked::before {
+  content: "\F76A";
+}
+.mdi-chart-line-variant::before {
+  content: "\F7B0";
+}
+.mdi-chart-multiline::before {
+  content: "\F8D3";
+}
+.mdi-chart-pie::before {
+  content: "\F12B";
+}
+.mdi-chart-scatter-plot::before {
+  content: "\FEAF";
+}
+.mdi-chart-scatter-plot-hexbin::before {
+  content: "\F66D";
+}
+.mdi-chart-timeline::before {
+  content: "\F66E";
+}
+.mdi-chart-timeline-variant::before {
+  content: "\FEB0";
+}
+.mdi-chart-tree::before {
+  content: "\FEB1";
+}
+.mdi-chat::before {
+  content: "\FB55";
+}
+.mdi-chat-alert::before {
+  content: "\FB56";
+}
+.mdi-chat-outline::before {
+  content: "\FEFB";
+}
+.mdi-chat-processing::before {
+  content: "\FB57";
+}
+.mdi-check::before {
+  content: "\F12C";
+}
+.mdi-check-all::before {
+  content: "\F12D";
+}
+.mdi-check-bold::before {
+  content: "\FE6E";
+}
+.mdi-check-box-multiple-outline::before {
+  content: "\FC2D";
+}
+.mdi-check-box-outline::before {
+  content: "\FC2E";
+}
+.mdi-check-circle::before {
+  content: "\F5E0";
+}
+.mdi-check-circle-outline::before {
+  content: "\F5E1";
+}
+.mdi-check-decagram::before {
+  content: "\F790";
+}
+.mdi-check-network::before {
+  content: "\FC2F";
+}
+.mdi-check-network-outline::before {
+  content: "\FC30";
+}
+.mdi-check-outline::before {
+  content: "\F854";
+}
+.mdi-check-underline::before {
+  content: "\FE70";
+}
+.mdi-check-underline-circle::before {
+  content: "\FE71";
+}
+.mdi-check-underline-circle-outline::before {
+  content: "\FE72";
+}
+.mdi-checkbook::before {
+  content: "\FA9C";
+}
+.mdi-checkbox-blank::before {
+  content: "\F12E";
+}
+.mdi-checkbox-blank-circle::before {
+  content: "\F12F";
+}
+.mdi-checkbox-blank-circle-outline::before {
+  content: "\F130";
+}
+.mdi-checkbox-blank-outline::before {
+  content: "\F131";
+}
+.mdi-checkbox-intermediate::before {
+  content: "\F855";
+}
+.mdi-checkbox-marked::before {
+  content: "\F132";
+}
+.mdi-checkbox-marked-circle::before {
+  content: "\F133";
+}
+.mdi-checkbox-marked-circle-outline::before {
+  content: "\F134";
+}
+.mdi-checkbox-marked-outline::before {
+  content: "\F135";
+}
+.mdi-checkbox-multiple-blank::before {
+  content: "\F136";
+}
+.mdi-checkbox-multiple-blank-circle::before {
+  content: "\F63B";
+}
+.mdi-checkbox-multiple-blank-circle-outline::before {
+  content: "\F63C";
+}
+.mdi-checkbox-multiple-blank-outline::before {
+  content: "\F137";
+}
+.mdi-checkbox-multiple-marked::before {
+  content: "\F138";
+}
+.mdi-checkbox-multiple-marked-circle::before {
+  content: "\F63D";
+}
+.mdi-checkbox-multiple-marked-circle-outline::before {
+  content: "\F63E";
+}
+.mdi-checkbox-multiple-marked-outline::before {
+  content: "\F139";
+}
+.mdi-checkerboard::before {
+  content: "\F13A";
+}
+.mdi-chef-hat::before {
+  content: "\FB58";
+}
+.mdi-chemical-weapon::before {
+  content: "\F13B";
+}
+.mdi-chess-bishop::before {
+  content: "\F85B";
+}
+.mdi-chess-king::before {
+  content: "\F856";
+}
+.mdi-chess-knight::before {
+  content: "\F857";
+}
+.mdi-chess-pawn::before {
+  content: "\F858";
+}
+.mdi-chess-queen::before {
+  content: "\F859";
+}
+.mdi-chess-rook::before {
+  content: "\F85A";
+}
+.mdi-chevron-double-down::before {
+  content: "\F13C";
+}
+.mdi-chevron-double-left::before {
+  content: "\F13D";
+}
+.mdi-chevron-double-right::before {
+  content: "\F13E";
+}
+.mdi-chevron-double-up::before {
+  content: "\F13F";
+}
+.mdi-chevron-down::before {
+  content: "\F140";
+}
+.mdi-chevron-down-box::before {
+  content: "\F9D5";
+}
+.mdi-chevron-down-box-outline::before {
+  content: "\F9D6";
+}
+.mdi-chevron-down-circle::before {
+  content: "\FB0B";
+}
+.mdi-chevron-down-circle-outline::before {
+  content: "\FB0C";
+}
+.mdi-chevron-left::before {
+  content: "\F141";
+}
+.mdi-chevron-left-box::before {
+  content: "\F9D7";
+}
+.mdi-chevron-left-box-outline::before {
+  content: "\F9D8";
+}
+.mdi-chevron-left-circle::before {
+  content: "\FB0D";
+}
+.mdi-chevron-left-circle-outline::before {
+  content: "\FB0E";
+}
+.mdi-chevron-right::before {
+  content: "\F142";
+}
+.mdi-chevron-right-box::before {
+  content: "\F9D9";
+}
+.mdi-chevron-right-box-outline::before {
+  content: "\F9DA";
+}
+.mdi-chevron-right-circle::before {
+  content: "\FB0F";
+}
+.mdi-chevron-right-circle-outline::before {
+  content: "\FB10";
+}
+.mdi-chevron-triple-down::before {
+  content: "\FD95";
+}
+.mdi-chevron-triple-left::before {
+  content: "\FD96";
+}
+.mdi-chevron-triple-right::before {
+  content: "\FD97";
+}
+.mdi-chevron-triple-up::before {
+  content: "\FD98";
+}
+.mdi-chevron-up::before {
+  content: "\F143";
+}
+.mdi-chevron-up-box::before {
+  content: "\F9DB";
+}
+.mdi-chevron-up-box-outline::before {
+  content: "\F9DC";
+}
+.mdi-chevron-up-circle::before {
+  content: "\FB11";
+}
+.mdi-chevron-up-circle-outline::before {
+  content: "\FB12";
+}
+.mdi-chili-hot::before {
+  content: "\F7B1";
+}
+.mdi-chili-medium::before {
+  content: "\F7B2";
+}
+.mdi-chili-mild::before {
+  content: "\F7B3";
+}
+.mdi-chip::before {
+  content: "\F61A";
+}
+.mdi-christianity::before {
+  content: "\F952";
+}
+.mdi-christianity-outline::before {
+  content: "\FCD2";
+}
+.mdi-church::before {
+  content: "\F144";
+}
+.mdi-circle::before {
+  content: "\F764";
+}
+.mdi-circle-double::before {
+  content: "\FEB2";
+}
+.mdi-circle-edit-outline::before {
+  content: "\F8D4";
+}
+.mdi-circle-expand::before {
+  content: "\FEB3";
+}
+.mdi-circle-medium::before {
+  content: "\F9DD";
+}
+.mdi-circle-outline::before {
+  content: "\F765";
+}
+.mdi-circle-slice-1::before {
+  content: "\FA9D";
+}
+.mdi-circle-slice-2::before {
+  content: "\FA9E";
+}
+.mdi-circle-slice-3::before {
+  content: "\FA9F";
+}
+.mdi-circle-slice-4::before {
+  content: "\FAA0";
+}
+.mdi-circle-slice-5::before {
+  content: "\FAA1";
+}
+.mdi-circle-slice-6::before {
+  content: "\FAA2";
+}
+.mdi-circle-slice-7::before {
+  content: "\FAA3";
+}
+.mdi-circle-slice-8::before {
+  content: "\FAA4";
+}
+.mdi-circle-small::before {
+  content: "\F9DE";
+}
+.mdi-circular-saw::before {
+  content: "\FE73";
+}
+.mdi-cisco-webex::before {
+  content: "\F145";
+}
+.mdi-city::before {
+  content: "\F146";
+}
+.mdi-city-variant::before {
+  content: "\FA35";
+}
+.mdi-city-variant-outline::before {
+  content: "\FA36";
+}
+.mdi-clipboard::before {
+  content: "\F147";
+}
+.mdi-clipboard-account::before {
+  content: "\F148";
+}
+.mdi-clipboard-account-outline::before {
+  content: "\FC31";
+}
+.mdi-clipboard-alert::before {
+  content: "\F149";
+}
+.mdi-clipboard-alert-outline::before {
+  content: "\FCD3";
+}
+.mdi-clipboard-arrow-down::before {
+  content: "\F14A";
+}
+.mdi-clipboard-arrow-down-outline::before {
+  content: "\FC32";
+}
+.mdi-clipboard-arrow-left::before {
+  content: "\F14B";
+}
+.mdi-clipboard-arrow-left-outline::before {
+  content: "\FCD4";
+}
+.mdi-clipboard-arrow-right::before {
+  content: "\FCD5";
+}
+.mdi-clipboard-arrow-right-outline::before {
+  content: "\FCD6";
+}
+.mdi-clipboard-arrow-up::before {
+  content: "\FC33";
+}
+.mdi-clipboard-arrow-up-outline::before {
+  content: "\FC34";
+}
+.mdi-clipboard-check::before {
+  content: "\F14C";
+}
+.mdi-clipboard-check-outline::before {
+  content: "\F8A7";
+}
+.mdi-clipboard-flow::before {
+  content: "\F6C7";
+}
+.mdi-clipboard-outline::before {
+  content: "\F14D";
+}
+.mdi-clipboard-play::before {
+  content: "\FC35";
+}
+.mdi-clipboard-play-outline::before {
+  content: "\FC36";
+}
+.mdi-clipboard-plus::before {
+  content: "\F750";
+}
+.mdi-clipboard-pulse::before {
+  content: "\F85C";
+}
+.mdi-clipboard-pulse-outline::before {
+  content: "\F85D";
+}
+.mdi-clipboard-text::before {
+  content: "\F14E";
+}
+.mdi-clipboard-text-outline::before {
+  content: "\FA37";
+}
+.mdi-clipboard-text-play::before {
+  content: "\FC37";
+}
+.mdi-clipboard-text-play-outline::before {
+  content: "\FC38";
+}
+.mdi-clippy::before {
+  content: "\F14F";
+}
+.mdi-clock::before {
+  content: "\F953";
+}
+.mdi-clock-alert::before {
+  content: "\F954";
+}
+.mdi-clock-alert-outline::before {
+  content: "\F5CE";
+}
+.mdi-clock-digital::before {
+  content: "\FEB4";
+}
+.mdi-clock-end::before {
+  content: "\F151";
+}
+.mdi-clock-fast::before {
+  content: "\F152";
+}
+.mdi-clock-in::before {
+  content: "\F153";
+}
+.mdi-clock-out::before {
+  content: "\F154";
+}
+.mdi-clock-outline::before {
+  content: "\F150";
+}
+.mdi-clock-start::before {
+  content: "\F155";
+}
+.mdi-close::before {
+  content: "\F156";
+}
+.mdi-close-box::before {
+  content: "\F157";
+}
+.mdi-close-box-multiple::before {
+  content: "\FC39";
+}
+.mdi-close-box-multiple-outline::before {
+  content: "\FC3A";
+}
+.mdi-close-box-outline::before {
+  content: "\F158";
+}
+.mdi-close-circle::before {
+  content: "\F159";
+}
+.mdi-close-circle-outline::before {
+  content: "\F15A";
+}
+.mdi-close-network::before {
+  content: "\F15B";
+}
+.mdi-close-network-outline::before {
+  content: "\FC3B";
+}
+.mdi-close-octagon::before {
+  content: "\F15C";
+}
+.mdi-close-octagon-outline::before {
+  content: "\F15D";
+}
+.mdi-close-outline::before {
+  content: "\F6C8";
+}
+.mdi-closed-caption::before {
+  content: "\F15E";
+}
+.mdi-closed-caption-outline::before {
+  content: "\FD99";
+}
+.mdi-cloud::before {
+  content: "\F15F";
+}
+.mdi-cloud-alert::before {
+  content: "\F9DF";
+}
+.mdi-cloud-braces::before {
+  content: "\F7B4";
+}
+.mdi-cloud-check::before {
+  content: "\F160";
+}
+.mdi-cloud-circle::before {
+  content: "\F161";
+}
+.mdi-cloud-download::before {
+  content: "\F162";
+}
+.mdi-cloud-download-outline::before {
+  content: "\FB59";
+}
+.mdi-cloud-off-outline::before {
+  content: "\F164";
+}
+.mdi-cloud-outline::before {
+  content: "\F163";
+}
+.mdi-cloud-print::before {
+  content: "\F165";
+}
+.mdi-cloud-print-outline::before {
+  content: "\F166";
+}
+.mdi-cloud-question::before {
+  content: "\FA38";
+}
+.mdi-cloud-search::before {
+  content: "\F955";
+}
+.mdi-cloud-search-outline::before {
+  content: "\F956";
+}
+.mdi-cloud-sync::before {
+  content: "\F63F";
+}
+.mdi-cloud-tags::before {
+  content: "\F7B5";
+}
+.mdi-cloud-upload::before {
+  content: "\F167";
+}
+.mdi-cloud-upload-outline::before {
+  content: "\FB5A";
+}
+.mdi-clover::before {
+  content: "\F815";
+}
+.mdi-code-array::before {
+  content: "\F168";
+}
+.mdi-code-braces::before {
+  content: "\F169";
+}
+.mdi-code-brackets::before {
+  content: "\F16A";
+}
+.mdi-code-equal::before {
+  content: "\F16B";
+}
+.mdi-code-greater-than::before {
+  content: "\F16C";
+}
+.mdi-code-greater-than-or-equal::before {
+  content: "\F16D";
+}
+.mdi-code-less-than::before {
+  content: "\F16E";
+}
+.mdi-code-less-than-or-equal::before {
+  content: "\F16F";
+}
+.mdi-code-not-equal::before {
+  content: "\F170";
+}
+.mdi-code-not-equal-variant::before {
+  content: "\F171";
+}
+.mdi-code-parentheses::before {
+  content: "\F172";
+}
+.mdi-code-string::before {
+  content: "\F173";
+}
+.mdi-code-tags::before {
+  content: "\F174";
+}
+.mdi-code-tags-check::before {
+  content: "\F693";
+}
+.mdi-codepen::before {
+  content: "\F175";
+}
+.mdi-coffee::before {
+  content: "\F176";
+}
+.mdi-coffee-off::before {
+  content: "\FFCA";
+}
+.mdi-coffee-off-outline::before {
+  content: "\FFCB";
+}
+.mdi-coffee-outline::before {
+  content: "\F6C9";
+}
+.mdi-coffee-to-go::before {
+  content: "\F177";
+}
+.mdi-coffin::before {
+  content: "\FB5B";
+}
+.mdi-cogs::before {
+  content: "\F8D5";
+}
+.mdi-coin::before {
+  content: "\F178";
+}
+.mdi-coins::before {
+  content: "\F694";
+}
+.mdi-collage::before {
+  content: "\F640";
+}
+.mdi-collapse-all::before {
+  content: "\FAA5";
+}
+.mdi-collapse-all-outline::before {
+  content: "\FAA6";
+}
+.mdi-color-helper::before {
+  content: "\F179";
+}
+.mdi-comma::before {
+  content: "\FE74";
+}
+.mdi-comma-box::before {
+  content: "\FE75";
+}
+.mdi-comma-box-outline::before {
+  content: "\FE76";
+}
+.mdi-comma-circle::before {
+  content: "\FE77";
+}
+.mdi-comma-circle-outline::before {
+  content: "\FE78";
+}
+.mdi-comment::before {
+  content: "\F17A";
+}
+.mdi-comment-account::before {
+  content: "\F17B";
+}
+.mdi-comment-account-outline::before {
+  content: "\F17C";
+}
+.mdi-comment-alert::before {
+  content: "\F17D";
+}
+.mdi-comment-alert-outline::before {
+  content: "\F17E";
+}
+.mdi-comment-arrow-left::before {
+  content: "\F9E0";
+}
+.mdi-comment-arrow-left-outline::before {
+  content: "\F9E1";
+}
+.mdi-comment-arrow-right::before {
+  content: "\F9E2";
+}
+.mdi-comment-arrow-right-outline::before {
+  content: "\F9E3";
+}
+.mdi-comment-check::before {
+  content: "\F17F";
+}
+.mdi-comment-check-outline::before {
+  content: "\F180";
+}
+.mdi-comment-eye::before {
+  content: "\FA39";
+}
+.mdi-comment-eye-outline::before {
+  content: "\FA3A";
+}
+.mdi-comment-multiple::before {
+  content: "\F85E";
+}
+.mdi-comment-multiple-outline::before {
+  content: "\F181";
+}
+.mdi-comment-outline::before {
+  content: "\F182";
+}
+.mdi-comment-plus::before {
+  content: "\F9E4";
+}
+.mdi-comment-plus-outline::before {
+  content: "\F183";
+}
+.mdi-comment-processing::before {
+  content: "\F184";
+}
+.mdi-comment-processing-outline::before {
+  content: "\F185";
+}
+.mdi-comment-question::before {
+  content: "\F816";
+}
+.mdi-comment-question-outline::before {
+  content: "\F186";
+}
+.mdi-comment-remove::before {
+  content: "\F5DE";
+}
+.mdi-comment-remove-outline::before {
+  content: "\F187";
+}
+.mdi-comment-search::before {
+  content: "\FA3B";
+}
+.mdi-comment-search-outline::before {
+  content: "\FA3C";
+}
+.mdi-comment-text::before {
+  content: "\F188";
+}
+.mdi-comment-text-multiple::before {
+  content: "\F85F";
+}
+.mdi-comment-text-multiple-outline::before {
+  content: "\F860";
+}
+.mdi-comment-text-outline::before {
+  content: "\F189";
+}
+.mdi-compare::before {
+  content: "\F18A";
+}
+.mdi-compass::before {
+  content: "\F18B";
+}
+.mdi-compass-off::before {
+  content: "\FB5C";
+}
+.mdi-compass-off-outline::before {
+  content: "\FB5D";
+}
+.mdi-compass-outline::before {
+  content: "\F18C";
+}
+.mdi-console::before {
+  content: "\F18D";
+}
+.mdi-console-line::before {
+  content: "\F7B6";
+}
+.mdi-console-network::before {
+  content: "\F8A8";
+}
+.mdi-console-network-outline::before {
+  content: "\FC3C";
+}
+.mdi-contact-mail::before {
+  content: "\F18E";
+}
+.mdi-contact-mail-outline::before {
+  content: "\FEB5";
+}
+.mdi-contact-phone::before {
+  content: "\FEB6";
+}
+.mdi-contact-phone-outline::before {
+  content: "\FEB7";
+}
+.mdi-contactless-payment::before {
+  content: "\FD46";
+}
+.mdi-contacts::before {
+  content: "\F6CA";
+}
+.mdi-contain::before {
+  content: "\FA3D";
+}
+.mdi-contain-end::before {
+  content: "\FA3E";
+}
+.mdi-contain-start::before {
+  content: "\FA3F";
+}
+.mdi-content-copy::before {
+  content: "\F18F";
+}
+.mdi-content-cut::before {
+  content: "\F190";
+}
+.mdi-content-duplicate::before {
+  content: "\F191";
+}
+.mdi-content-paste::before {
+  content: "\F192";
+}
+.mdi-content-save::before {
+  content: "\F193";
+}
+.mdi-content-save-alert::before {
+  content: "\FF5F";
+}
+.mdi-content-save-alert-outline::before {
+  content: "\FF60";
+}
+.mdi-content-save-all::before {
+  content: "\F194";
+}
+.mdi-content-save-all-outline::before {
+  content: "\FF61";
+}
+.mdi-content-save-edit::before {
+  content: "\FCD7";
+}
+.mdi-content-save-edit-outline::before {
+  content: "\FCD8";
+}
+.mdi-content-save-move::before {
+  content: "\FE79";
+}
+.mdi-content-save-move-outline::before {
+  content: "\FE7A";
+}
+.mdi-content-save-outline::before {
+  content: "\F817";
+}
+.mdi-content-save-settings::before {
+  content: "\F61B";
+}
+.mdi-content-save-settings-outline::before {
+  content: "\FB13";
+}
+.mdi-contrast::before {
+  content: "\F195";
+}
+.mdi-contrast-box::before {
+  content: "\F196";
+}
+.mdi-contrast-circle::before {
+  content: "\F197";
+}
+.mdi-controller-classic::before {
+  content: "\FB5E";
+}
+.mdi-controller-classic-outline::before {
+  content: "\FB5F";
+}
+.mdi-cookie::before {
+  content: "\F198";
+}
+.mdi-copyright::before {
+  content: "\F5E6";
+}
+.mdi-cordova::before {
+  content: "\F957";
+}
+.mdi-corn::before {
+  content: "\F7B7";
+}
+.mdi-counter::before {
+  content: "\F199";
+}
+.mdi-cow::before {
+  content: "\F19A";
+}
+.mdi-cowboy::before {
+  content: "\FEB8";
+}
+.mdi-cpu-32-bit::before {
+  content: "\FEFC";
+}
+.mdi-cpu-64-bit::before {
+  content: "\FEFD";
+}
+.mdi-crane::before {
+  content: "\F861";
+}
+.mdi-creation::before {
+  content: "\F1C9";
+}
+.mdi-creative-commons::before {
+  content: "\FD47";
+}
+.mdi-credit-card::before {
+  content: "\F19B";
+}
+.mdi-credit-card-clock::before {
+  content: "\FEFE";
+}
+.mdi-credit-card-clock-outline::before {
+  content: "\FFBC";
+}
+.mdi-credit-card-marker::before {
+  content: "\FD9A";
+}
+.mdi-credit-card-multiple::before {
+  content: "\F19C";
+}
+.mdi-credit-card-off::before {
+  content: "\F5E4";
+}
+.mdi-credit-card-plus::before {
+  content: "\F675";
+}
+.mdi-credit-card-refund::before {
+  content: "\FAA7";
+}
+.mdi-credit-card-scan::before {
+  content: "\F19D";
+}
+.mdi-credit-card-settings::before {
+  content: "\F8D6";
+}
+.mdi-credit-card-wireless::before {
+  content: "\FD48";
+}
+.mdi-cricket::before {
+  content: "\FD49";
+}
+.mdi-crop::before {
+  content: "\F19E";
+}
+.mdi-crop-free::before {
+  content: "\F19F";
+}
+.mdi-crop-landscape::before {
+  content: "\F1A0";
+}
+.mdi-crop-portrait::before {
+  content: "\F1A1";
+}
+.mdi-crop-rotate::before {
+  content: "\F695";
+}
+.mdi-crop-square::before {
+  content: "\F1A2";
+}
+.mdi-crosshairs::before {
+  content: "\F1A3";
+}
+.mdi-crosshairs-gps::before {
+  content: "\F1A4";
+}
+.mdi-crosshairs-off::before {
+  content: "\FF62";
+}
+.mdi-crown::before {
+  content: "\F1A5";
+}
+.mdi-cryengine::before {
+  content: "\F958";
+}
+.mdi-crystal-ball::before {
+  content: "\FB14";
+}
+.mdi-cube::before {
+  content: "\F1A6";
+}
+.mdi-cube-outline::before {
+  content: "\F1A7";
+}
+.mdi-cube-scan::before {
+  content: "\FB60";
+}
+.mdi-cube-send::before {
+  content: "\F1A8";
+}
+.mdi-cube-unfolded::before {
+  content: "\F1A9";
+}
+.mdi-cup::before {
+  content: "\F1AA";
+}
+.mdi-cup-off::before {
+  content: "\F5E5";
+}
+.mdi-cup-water::before {
+  content: "\F1AB";
+}
+.mdi-cupboard::before {
+  content: "\FF63";
+}
+.mdi-cupboard-outline::before {
+  content: "\FF64";
+}
+.mdi-cupcake::before {
+  content: "\F959";
+}
+.mdi-curling::before {
+  content: "\F862";
+}
+.mdi-currency-bdt::before {
+  content: "\F863";
+}
+.mdi-currency-brl::before {
+  content: "\FB61";
+}
+.mdi-currency-btc::before {
+  content: "\F1AC";
+}
+.mdi-currency-chf::before {
+  content: "\F7B8";
+}
+.mdi-currency-cny::before {
+  content: "\F7B9";
+}
+.mdi-currency-eth::before {
+  content: "\F7BA";
+}
+.mdi-currency-eur::before {
+  content: "\F1AD";
+}
+.mdi-currency-gbp::before {
+  content: "\F1AE";
+}
+.mdi-currency-ils::before {
+  content: "\FC3D";
+}
+.mdi-currency-inr::before {
+  content: "\F1AF";
+}
+.mdi-currency-jpy::before {
+  content: "\F7BB";
+}
+.mdi-currency-krw::before {
+  content: "\F7BC";
+}
+.mdi-currency-kzt::before {
+  content: "\F864";
+}
+.mdi-currency-ngn::before {
+  content: "\F1B0";
+}
+.mdi-currency-php::before {
+  content: "\F9E5";
+}
+.mdi-currency-rial::before {
+  content: "\FEB9";
+}
+.mdi-currency-rub::before {
+  content: "\F1B1";
+}
+.mdi-currency-sign::before {
+  content: "\F7BD";
+}
+.mdi-currency-try::before {
+  content: "\F1B2";
+}
+.mdi-currency-twd::before {
+  content: "\F7BE";
+}
+.mdi-currency-usd::before {
+  content: "\F1B3";
+}
+.mdi-currency-usd-off::before {
+  content: "\F679";
+}
+.mdi-current-ac::before {
+  content: "\F95A";
+}
+.mdi-current-dc::before {
+  content: "\F95B";
+}
+.mdi-cursor-default::before {
+  content: "\F1B4";
+}
+.mdi-cursor-default-click::before {
+  content: "\FCD9";
+}
+.mdi-cursor-default-click-outline::before {
+  content: "\FCDA";
+}
+.mdi-cursor-default-outline::before {
+  content: "\F1B5";
+}
+.mdi-cursor-move::before {
+  content: "\F1B6";
+}
+.mdi-cursor-pointer::before {
+  content: "\F1B7";
+}
+.mdi-cursor-text::before {
+  content: "\F5E7";
+}
+.mdi-database::before {
+  content: "\F1B8";
+}
+.mdi-database-check::before {
+  content: "\FAA8";
+}
+.mdi-database-edit::before {
+  content: "\FB62";
+}
+.mdi-database-export::before {
+  content: "\F95D";
+}
+.mdi-database-import::before {
+  content: "\F95C";
+}
+.mdi-database-lock::before {
+  content: "\FAA9";
+}
+.mdi-database-minus::before {
+  content: "\F1B9";
+}
+.mdi-database-plus::before {
+  content: "\F1BA";
+}
+.mdi-database-refresh::before {
+  content: "\FCDB";
+}
+.mdi-database-remove::before {
+  content: "\FCDC";
+}
+.mdi-database-search::before {
+  content: "\F865";
+}
+.mdi-database-settings::before {
+  content: "\FCDD";
+}
+.mdi-death-star::before {
+  content: "\F8D7";
+}
+.mdi-death-star-variant::before {
+  content: "\F8D8";
+}
+.mdi-deathly-hallows::before {
+  content: "\FB63";
+}
+.mdi-debian::before {
+  content: "\F8D9";
+}
+.mdi-debug-step-into::before {
+  content: "\F1BB";
+}
+.mdi-debug-step-out::before {
+  content: "\F1BC";
+}
+.mdi-debug-step-over::before {
+  content: "\F1BD";
+}
+.mdi-decagram::before {
+  content: "\F76B";
+}
+.mdi-decagram-outline::before {
+  content: "\F76C";
+}
+.mdi-decimal-decrease::before {
+  content: "\F1BE";
+}
+.mdi-decimal-increase::before {
+  content: "\F1BF";
+}
+.mdi-delete::before {
+  content: "\F1C0";
+}
+.mdi-delete-circle::before {
+  content: "\F682";
+}
+.mdi-delete-circle-outline::before {
+  content: "\FB64";
+}
+.mdi-delete-empty::before {
+  content: "\F6CB";
+}
+.mdi-delete-empty-outline::before {
+  content: "\FEBA";
+}
+.mdi-delete-forever::before {
+  content: "\F5E8";
+}
+.mdi-delete-forever-outline::before {
+  content: "\FB65";
+}
+.mdi-delete-outline::before {
+  content: "\F9E6";
+}
+.mdi-delete-restore::before {
+  content: "\F818";
+}
+.mdi-delete-sweep::before {
+  content: "\F5E9";
+}
+.mdi-delete-sweep-outline::before {
+  content: "\FC3E";
+}
+.mdi-delete-variant::before {
+  content: "\F1C1";
+}
+.mdi-delta::before {
+  content: "\F1C2";
+}
+.mdi-desk-lamp::before {
+  content: "\F95E";
+}
+.mdi-deskphone::before {
+  content: "\F1C3";
+}
+.mdi-desktop-classic::before {
+  content: "\F7BF";
+}
+.mdi-desktop-mac::before {
+  content: "\F1C4";
+}
+.mdi-desktop-mac-dashboard::before {
+  content: "\F9E7";
+}
+.mdi-desktop-tower::before {
+  content: "\F1C5";
+}
+.mdi-desktop-tower-monitor::before {
+  content: "\FAAA";
+}
+.mdi-details::before {
+  content: "\F1C6";
+}
+.mdi-dev-to::before {
+  content: "\FD4A";
+}
+.mdi-developer-board::before {
+  content: "\F696";
+}
+.mdi-deviantart::before {
+  content: "\F1C7";
+}
+.mdi-dialpad::before {
+  content: "\F61C";
+}
+.mdi-diameter::before {
+  content: "\FC3F";
+}
+.mdi-diameter-outline::before {
+  content: "\FC40";
+}
+.mdi-diameter-variant::before {
+  content: "\FC41";
+}
+.mdi-diamond::before {
+  content: "\FB66";
+}
+.mdi-diamond-outline::before {
+  content: "\FB67";
+}
+.mdi-diamond-stone::before {
+  content: "\F1C8";
+}
+.mdi-dice-1::before {
+  content: "\F1CA";
+}
+.mdi-dice-2::before {
+  content: "\F1CB";
+}
+.mdi-dice-3::before {
+  content: "\F1CC";
+}
+.mdi-dice-4::before {
+  content: "\F1CD";
+}
+.mdi-dice-5::before {
+  content: "\F1CE";
+}
+.mdi-dice-6::before {
+  content: "\F1CF";
+}
+.mdi-dice-d10::before {
+  content: "\F76E";
+}
+.mdi-dice-d12::before {
+  content: "\F866";
+}
+.mdi-dice-d20::before {
+  content: "\F5EA";
+}
+.mdi-dice-d4::before {
+  content: "\F5EB";
+}
+.mdi-dice-d6::before {
+  content: "\F5EC";
+}
+.mdi-dice-d8::before {
+  content: "\F5ED";
+}
+.mdi-dice-multiple::before {
+  content: "\F76D";
+}
+.mdi-dictionary::before {
+  content: "\F61D";
+}
+.mdi-dip-switch::before {
+  content: "\F7C0";
+}
+.mdi-directions::before {
+  content: "\F1D0";
+}
+.mdi-directions-fork::before {
+  content: "\F641";
+}
+.mdi-disc::before {
+  content: "\F5EE";
+}
+.mdi-disc-alert::before {
+  content: "\F1D1";
+}
+.mdi-disc-player::before {
+  content: "\F95F";
+}
+.mdi-discord::before {
+  content: "\F66F";
+}
+.mdi-dishwasher::before {
+  content: "\FAAB";
+}
+.mdi-disqus::before {
+  content: "\F1D2";
+}
+.mdi-disqus-outline::before {
+  content: "\F1D3";
+}
+.mdi-diving-flippers::before {
+  content: "\FD9B";
+}
+.mdi-diving-helmet::before {
+  content: "\FD9C";
+}
+.mdi-diving-scuba::before {
+  content: "\FD9D";
+}
+.mdi-diving-scuba-flag::before {
+  content: "\FD9E";
+}
+.mdi-diving-scuba-tank::before {
+  content: "\FD9F";
+}
+.mdi-diving-scuba-tank-multiple::before {
+  content: "\FDA0";
+}
+.mdi-diving-snorkel::before {
+  content: "\FDA1";
+}
+.mdi-division::before {
+  content: "\F1D4";
+}
+.mdi-division-box::before {
+  content: "\F1D5";
+}
+.mdi-dlna::before {
+  content: "\FA40";
+}
+.mdi-dna::before {
+  content: "\F683";
+}
+.mdi-dns::before {
+  content: "\F1D6";
+}
+.mdi-dns-outline::before {
+  content: "\FB68";
+}
+.mdi-do-not-disturb::before {
+  content: "\F697";
+}
+.mdi-do-not-disturb-off::before {
+  content: "\F698";
+}
+.mdi-docker::before {
+  content: "\F867";
+}
+.mdi-doctor::before {
+  content: "\FA41";
+}
+.mdi-dog::before {
+  content: "\FA42";
+}
+.mdi-dog-service::before {
+  content: "\FAAC";
+}
+.mdi-dog-side::before {
+  content: "\FA43";
+}
+.mdi-dolby::before {
+  content: "\F6B2";
+}
+.mdi-dolly::before {
+  content: "\FEBB";
+}
+.mdi-domain::before {
+  content: "\F1D7";
+}
+.mdi-domain-off::before {
+  content: "\FD4B";
+}
+.mdi-donkey::before {
+  content: "\F7C1";
+}
+.mdi-door::before {
+  content: "\F819";
+}
+.mdi-door-closed::before {
+  content: "\F81A";
+}
+.mdi-door-open::before {
+  content: "\F81B";
+}
+.mdi-doorbell-video::before {
+  content: "\F868";
+}
+.mdi-dot-net::before {
+  content: "\FAAD";
+}
+.mdi-dots-horizontal::before {
+  content: "\F1D8";
+}
+.mdi-dots-horizontal-circle::before {
+  content: "\F7C2";
+}
+.mdi-dots-horizontal-circle-outline::before {
+  content: "\FB69";
+}
+.mdi-dots-vertical::before {
+  content: "\F1D9";
+}
+.mdi-dots-vertical-circle::before {
+  content: "\F7C3";
+}
+.mdi-dots-vertical-circle-outline::before {
+  content: "\FB6A";
+}
+.mdi-douban::before {
+  content: "\F699";
+}
+.mdi-download::before {
+  content: "\F1DA";
+}
+.mdi-download-multiple::before {
+  content: "\F9E8";
+}
+.mdi-download-network::before {
+  content: "\F6F3";
+}
+.mdi-download-network-outline::before {
+  content: "\FC42";
+}
+.mdi-download-outline::before {
+  content: "\FB6B";
+}
+.mdi-drag::before {
+  content: "\F1DB";
+}
+.mdi-drag-horizontal::before {
+  content: "\F1DC";
+}
+.mdi-drag-variant::before {
+  content: "\FB6C";
+}
+.mdi-drag-vertical::before {
+  content: "\F1DD";
+}
+.mdi-drama-masks::before {
+  content: "\FCDE";
+}
+.mdi-draw::before {
+  content: "\FF66";
+}
+.mdi-drawing::before {
+  content: "\F1DE";
+}
+.mdi-drawing-box::before {
+  content: "\F1DF";
+}
+.mdi-dresser::before {
+  content: "\FF67";
+}
+.mdi-dresser-outline::before {
+  content: "\FF68";
+}
+.mdi-dribbble::before {
+  content: "\F1E0";
+}
+.mdi-dribbble-box::before {
+  content: "\F1E1";
+}
+.mdi-drone::before {
+  content: "\F1E2";
+}
+.mdi-dropbox::before {
+  content: "\F1E3";
+}
+.mdi-drupal::before {
+  content: "\F1E4";
+}
+.mdi-duck::before {
+  content: "\F1E5";
+}
+.mdi-dumbbell::before {
+  content: "\F1E6";
+}
+.mdi-dump-truck::before {
+  content: "\FC43";
+}
+.mdi-ear-hearing::before {
+  content: "\F7C4";
+}
+.mdi-ear-hearing-off::before {
+  content: "\FA44";
+}
+.mdi-earth::before {
+  content: "\F1E7";
+}
+.mdi-earth-box::before {
+  content: "\F6CC";
+}
+.mdi-earth-box-off::before {
+  content: "\F6CD";
+}
+.mdi-earth-off::before {
+  content: "\F1E8";
+}
+.mdi-edge::before {
+  content: "\F1E9";
+}
+.mdi-egg::before {
+  content: "\FAAE";
+}
+.mdi-egg-easter::before {
+  content: "\FAAF";
+}
+.mdi-eight-track::before {
+  content: "\F9E9";
+}
+.mdi-eject::before {
+  content: "\F1EA";
+}
+.mdi-eject-outline::before {
+  content: "\FB6D";
+}
+.mdi-electric-switch::before {
+  content: "\FEBC";
+}
+.mdi-elephant::before {
+  content: "\F7C5";
+}
+.mdi-elevation-decline::before {
+  content: "\F1EB";
+}
+.mdi-elevation-rise::before {
+  content: "\F1EC";
+}
+.mdi-elevator::before {
+  content: "\F1ED";
+}
+.mdi-ellipse::before {
+  content: "\FEBD";
+}
+.mdi-ellipse-outline::before {
+  content: "\FEBE";
+}
+.mdi-email::before {
+  content: "\F1EE";
+}
+.mdi-email-alert::before {
+  content: "\F6CE";
+}
+.mdi-email-box::before {
+  content: "\FCDF";
+}
+.mdi-email-check::before {
+  content: "\FAB0";
+}
+.mdi-email-check-outline::before {
+  content: "\FAB1";
+}
+.mdi-email-edit::before {
+  content: "\FF00";
+}
+.mdi-email-edit-outline::before {
+  content: "\FF01";
+}
+.mdi-email-lock::before {
+  content: "\F1F1";
+}
+.mdi-email-mark-as-unread::before {
+  content: "\FB6E";
+}
+.mdi-email-minus::before {
+  content: "\FF02";
+}
+.mdi-email-minus-outline::before {
+  content: "\FF03";
+}
+.mdi-email-multiple::before {
+  content: "\FF04";
+}
+.mdi-email-multiple-outline::before {
+  content: "\FF05";
+}
+.mdi-email-open::before {
+  content: "\F1EF";
+}
+.mdi-email-open-multiple::before {
+  content: "\FF06";
+}
+.mdi-email-open-multiple-outline::before {
+  content: "\FF07";
+}
+.mdi-email-open-outline::before {
+  content: "\F5EF";
+}
+.mdi-email-outline::before {
+  content: "\F1F0";
+}
+.mdi-email-plus::before {
+  content: "\F9EA";
+}
+.mdi-email-plus-outline::before {
+  content: "\F9EB";
+}
+.mdi-email-search::before {
+  content: "\F960";
+}
+.mdi-email-search-outline::before {
+  content: "\F961";
+}
+.mdi-email-variant::before {
+  content: "\F5F0";
+}
+.mdi-ember::before {
+  content: "\FB15";
+}
+.mdi-emby::before {
+  content: "\F6B3";
+}
+.mdi-emoticon::before {
+  content: "\FC44";
+}
+.mdi-emoticon-angry::before {
+  content: "\FC45";
+}
+.mdi-emoticon-angry-outline::before {
+  content: "\FC46";
+}
+.mdi-emoticon-cool::before {
+  content: "\FC47";
+}
+.mdi-emoticon-cool-outline::before {
+  content: "\F1F3";
+}
+.mdi-emoticon-cry::before {
+  content: "\FC48";
+}
+.mdi-emoticon-cry-outline::before {
+  content: "\FC49";
+}
+.mdi-emoticon-dead::before {
+  content: "\FC4A";
+}
+.mdi-emoticon-dead-outline::before {
+  content: "\F69A";
+}
+.mdi-emoticon-devil::before {
+  content: "\FC4B";
+}
+.mdi-emoticon-devil-outline::before {
+  content: "\F1F4";
+}
+.mdi-emoticon-excited::before {
+  content: "\FC4C";
+}
+.mdi-emoticon-excited-outline::before {
+  content: "\F69B";
+}
+.mdi-emoticon-frown::before {
+  content: "\FF69";
+}
+.mdi-emoticon-frown-outline::before {
+  content: "\FF6A";
+}
+.mdi-emoticon-happy::before {
+  content: "\FC4D";
+}
+.mdi-emoticon-happy-outline::before {
+  content: "\F1F5";
+}
+.mdi-emoticon-kiss::before {
+  content: "\FC4E";
+}
+.mdi-emoticon-kiss-outline::before {
+  content: "\FC4F";
+}
+.mdi-emoticon-neutral::before {
+  content: "\FC50";
+}
+.mdi-emoticon-neutral-outline::before {
+  content: "\F1F6";
+}
+.mdi-emoticon-outline::before {
+  content: "\F1F2";
+}
+.mdi-emoticon-poop::before {
+  content: "\F1F7";
+}
+.mdi-emoticon-poop-outline::before {
+  content: "\FC51";
+}
+.mdi-emoticon-sad::before {
+  content: "\FC52";
+}
+.mdi-emoticon-sad-outline::before {
+  content: "\F1F8";
+}
+.mdi-emoticon-tongue::before {
+  content: "\F1F9";
+}
+.mdi-emoticon-tongue-outline::before {
+  content: "\FC53";
+}
+.mdi-emoticon-wink::before {
+  content: "\FC54";
+}
+.mdi-emoticon-wink-outline::before {
+  content: "\FC55";
+}
+.mdi-engine::before {
+  content: "\F1FA";
+}
+.mdi-engine-off::before {
+  content: "\FA45";
+}
+.mdi-engine-off-outline::before {
+  content: "\FA46";
+}
+.mdi-engine-outline::before {
+  content: "\F1FB";
+}
+.mdi-equal::before {
+  content: "\F1FC";
+}
+.mdi-equal-box::before {
+  content: "\F1FD";
+}
+.mdi-equalizer::before {
+  content: "\FEBF";
+}
+.mdi-equalizer-outline::before {
+  content: "\FEC0";
+}
+.mdi-eraser::before {
+  content: "\F1FE";
+}
+.mdi-eraser-variant::before {
+  content: "\F642";
+}
+.mdi-escalator::before {
+  content: "\F1FF";
+}
+.mdi-eslint::before {
+  content: "\FC56";
+}
+.mdi-et::before {
+  content: "\FAB2";
+}
+.mdi-ethereum::before {
+  content: "\F869";
+}
+.mdi-ethernet::before {
+  content: "\F200";
+}
+.mdi-ethernet-cable::before {
+  content: "\F201";
+}
+.mdi-ethernet-cable-off::before {
+  content: "\F202";
+}
+.mdi-etsy::before {
+  content: "\F203";
+}
+.mdi-ev-station::before {
+  content: "\F5F1";
+}
+.mdi-eventbrite::before {
+  content: "\F7C6";
+}
+.mdi-evernote::before {
+  content: "\F204";
+}
+.mdi-exclamation::before {
+  content: "\F205";
+}
+.mdi-exit-run::before {
+  content: "\FA47";
+}
+.mdi-exit-to-app::before {
+  content: "\F206";
+}
+.mdi-expand-all::before {
+  content: "\FAB3";
+}
+.mdi-expand-all-outline::before {
+  content: "\FAB4";
+}
+.mdi-exponent::before {
+  content: "\F962";
+}
+.mdi-exponent-box::before {
+  content: "\F963";
+}
+.mdi-export::before {
+  content: "\F207";
+}
+.mdi-export-variant::before {
+  content: "\FB6F";
+}
+.mdi-eye::before {
+  content: "\F208";
+}
+.mdi-eye-check::before {
+  content: "\FCE0";
+}
+.mdi-eye-check-outline::before {
+  content: "\FCE1";
+}
+.mdi-eye-circle::before {
+  content: "\FB70";
+}
+.mdi-eye-circle-outline::before {
+  content: "\FB71";
+}
+.mdi-eye-off::before {
+  content: "\F209";
+}
+.mdi-eye-off-outline::before {
+  content: "\F6D0";
+}
+.mdi-eye-outline::before {
+  content: "\F6CF";
+}
+.mdi-eye-plus::before {
+  content: "\F86A";
+}
+.mdi-eye-plus-outline::before {
+  content: "\F86B";
+}
+.mdi-eye-settings::before {
+  content: "\F86C";
+}
+.mdi-eye-settings-outline::before {
+  content: "\F86D";
+}
+.mdi-eyedropper::before {
+  content: "\F20A";
+}
+.mdi-eyedropper-variant::before {
+  content: "\F20B";
+}
+.mdi-face::before {
+  content: "\F643";
+}
+.mdi-face-agent::before {
+  content: "\FD4C";
+}
+.mdi-face-outline::before {
+  content: "\FB72";
+}
+.mdi-face-profile::before {
+  content: "\F644";
+}
+.mdi-face-recognition::before {
+  content: "\FC57";
+}
+.mdi-facebook::before {
+  content: "\F20C";
+}
+.mdi-facebook-box::before {
+  content: "\F20D";
+}
+.mdi-facebook-messenger::before {
+  content: "\F20E";
+}
+.mdi-facebook-workplace::before {
+  content: "\FB16";
+}
+.mdi-factory::before {
+  content: "\F20F";
+}
+.mdi-fan::before {
+  content: "\F210";
+}
+.mdi-fan-off::before {
+  content: "\F81C";
+}
+.mdi-fast-forward::before {
+  content: "\F211";
+}
+.mdi-fast-forward-10::before {
+  content: "\FD4D";
+}
+.mdi-fast-forward-30::before {
+  content: "\FCE2";
+}
+.mdi-fast-forward-outline::before {
+  content: "\F6D1";
+}
+.mdi-fax::before {
+  content: "\F212";
+}
+.mdi-feather::before {
+  content: "\F6D2";
+}
+.mdi-feature-search::before {
+  content: "\FA48";
+}
+.mdi-feature-search-outline::before {
+  content: "\FA49";
+}
+.mdi-fedora::before {
+  content: "\F8DA";
+}
+.mdi-ferris-wheel::before {
+  content: "\FEC1";
+}
+.mdi-ferry::before {
+  content: "\F213";
+}
+.mdi-file::before {
+  content: "\F214";
+}
+.mdi-file-account::before {
+  content: "\F73A";
+}
+.mdi-file-alert::before {
+  content: "\FA4A";
+}
+.mdi-file-alert-outline::before {
+  content: "\FA4B";
+}
+.mdi-file-cabinet::before {
+  content: "\FAB5";
+}
+.mdi-file-cad::before {
+  content: "\FF08";
+}
+.mdi-file-cad-box::before {
+  content: "\FF09";
+}
+.mdi-file-cancel::before {
+  content: "\FDA2";
+}
+.mdi-file-cancel-outline::before {
+  content: "\FDA3";
+}
+.mdi-file-chart::before {
+  content: "\F215";
+}
+.mdi-file-check::before {
+  content: "\F216";
+}
+.mdi-file-check-outline::before {
+  content: "\FE7B";
+}
+.mdi-file-cloud::before {
+  content: "\F217";
+}
+.mdi-file-compare::before {
+  content: "\F8A9";
+}
+.mdi-file-delimited::before {
+  content: "\F218";
+}
+.mdi-file-delimited-outline::before {
+  content: "\FEC2";
+}
+.mdi-file-document::before {
+  content: "\F219";
+}
+.mdi-file-document-box::before {
+  content: "\F21A";
+}
+.mdi-file-document-box-check::before {
+  content: "\FEC3";
+}
+.mdi-file-document-box-check-outline::before {
+  content: "\FEC4";
+}
+.mdi-file-document-box-minus::before {
+  content: "\FEC5";
+}
+.mdi-file-document-box-minus-outline::before {
+  content: "\FEC6";
+}
+.mdi-file-document-box-multiple::before {
+  content: "\FAB6";
+}
+.mdi-file-document-box-multiple-outline::before {
+  content: "\FAB7";
+}
+.mdi-file-document-box-outline::before {
+  content: "\F9EC";
+}
+.mdi-file-document-box-plus::before {
+  content: "\FEC7";
+}
+.mdi-file-document-box-plus-outline::before {
+  content: "\FEC8";
+}
+.mdi-file-document-box-remove::before {
+  content: "\FEC9";
+}
+.mdi-file-document-box-remove-outline::before {
+  content: "\FECA";
+}
+.mdi-file-document-box-search::before {
+  content: "\FECB";
+}
+.mdi-file-document-box-search-outline::before {
+  content: "\FECC";
+}
+.mdi-file-document-edit::before {
+  content: "\FDA4";
+}
+.mdi-file-document-edit-outline::before {
+  content: "\FDA5";
+}
+.mdi-file-document-outline::before {
+  content: "\F9ED";
+}
+.mdi-file-download::before {
+  content: "\F964";
+}
+.mdi-file-download-outline::before {
+  content: "\F965";
+}
+.mdi-file-excel::before {
+  content: "\F21B";
+}
+.mdi-file-excel-box::before {
+  content: "\F21C";
+}
+.mdi-file-export::before {
+  content: "\F21D";
+}
+.mdi-file-eye::before {
+  content: "\FDA6";
+}
+.mdi-file-eye-outline::before {
+  content: "\FDA7";
+}
+.mdi-file-find::before {
+  content: "\F21E";
+}
+.mdi-file-find-outline::before {
+  content: "\FB73";
+}
+.mdi-file-hidden::before {
+  content: "\F613";
+}
+.mdi-file-image::before {
+  content: "\F21F";
+}
+.mdi-file-image-outline::before {
+  content: "\FECD";
+}
+.mdi-file-import::before {
+  content: "\F220";
+}
+.mdi-file-lock::before {
+  content: "\F221";
+}
+.mdi-file-move::before {
+  content: "\FAB8";
+}
+.mdi-file-multiple::before {
+  content: "\F222";
+}
+.mdi-file-music::before {
+  content: "\F223";
+}
+.mdi-file-music-outline::before {
+  content: "\FE7C";
+}
+.mdi-file-outline::before {
+  content: "\F224";
+}
+.mdi-file-pdf::before {
+  content: "\F225";
+}
+.mdi-file-pdf-box::before {
+  content: "\F226";
+}
+.mdi-file-pdf-outline::before {
+  content: "\FE7D";
+}
+.mdi-file-percent::before {
+  content: "\F81D";
+}
+.mdi-file-plus::before {
+  content: "\F751";
+}
+.mdi-file-plus-outline::before {
+  content: "\FF0A";
+}
+.mdi-file-powerpoint::before {
+  content: "\F227";
+}
+.mdi-file-powerpoint-box::before {
+  content: "\F228";
+}
+.mdi-file-presentation-box::before {
+  content: "\F229";
+}
+.mdi-file-question::before {
+  content: "\F86E";
+}
+.mdi-file-remove::before {
+  content: "\FB74";
+}
+.mdi-file-replace::before {
+  content: "\FB17";
+}
+.mdi-file-replace-outline::before {
+  content: "\FB18";
+}
+.mdi-file-restore::before {
+  content: "\F670";
+}
+.mdi-file-search::before {
+  content: "\FC58";
+}
+.mdi-file-search-outline::before {
+  content: "\FC59";
+}
+.mdi-file-send::before {
+  content: "\F22A";
+}
+.mdi-file-table::before {
+  content: "\FC5A";
+}
+.mdi-file-table-outline::before {
+  content: "\FC5B";
+}
+.mdi-file-tree::before {
+  content: "\F645";
+}
+.mdi-file-undo::before {
+  content: "\F8DB";
+}
+.mdi-file-upload::before {
+  content: "\FA4C";
+}
+.mdi-file-upload-outline::before {
+  content: "\FA4D";
+}
+.mdi-file-video::before {
+  content: "\F22B";
+}
+.mdi-file-video-outline::before {
+  content: "\FE10";
+}
+.mdi-file-word::before {
+  content: "\F22C";
+}
+.mdi-file-word-box::before {
+  content: "\F22D";
+}
+.mdi-file-xml::before {
+  content: "\F22E";
+}
+.mdi-film::before {
+  content: "\F22F";
+}
+.mdi-filmstrip::before {
+  content: "\F230";
+}
+.mdi-filmstrip-off::before {
+  content: "\F231";
+}
+.mdi-filter::before {
+  content: "\F232";
+}
+.mdi-filter-minus::before {
+  content: "\FF0B";
+}
+.mdi-filter-minus-outline::before {
+  content: "\FF0C";
+}
+.mdi-filter-outline::before {
+  content: "\F233";
+}
+.mdi-filter-plus::before {
+  content: "\FF0D";
+}
+.mdi-filter-plus-outline::before {
+  content: "\FF0E";
+}
+.mdi-filter-remove::before {
+  content: "\F234";
+}
+.mdi-filter-remove-outline::before {
+  content: "\F235";
+}
+.mdi-filter-variant::before {
+  content: "\F236";
+}
+.mdi-finance::before {
+  content: "\F81E";
+}
+.mdi-find-replace::before {
+  content: "\F6D3";
+}
+.mdi-fingerprint::before {
+  content: "\F237";
+}
+.mdi-fingerprint-off::before {
+  content: "\FECE";
+}
+.mdi-fire::before {
+  content: "\F238";
+}
+.mdi-fire-extinguisher::before {
+  content: "\FF0F";
+}
+.mdi-fire-truck::before {
+  content: "\F8AA";
+}
+.mdi-firebase::before {
+  content: "\F966";
+}
+.mdi-firefox::before {
+  content: "\F239";
+}
+.mdi-fireplace::before {
+  content: "\FE11";
+}
+.mdi-fireplace-off::before {
+  content: "\FE12";
+}
+.mdi-firework::before {
+  content: "\FE13";
+}
+.mdi-fish::before {
+  content: "\F23A";
+}
+.mdi-fishbowl::before {
+  content: "\FF10";
+}
+.mdi-fishbowl-outline::before {
+  content: "\FF11";
+}
+.mdi-fit-to-page::before {
+  content: "\FF12";
+}
+.mdi-fit-to-page-outline::before {
+  content: "\FF13";
+}
+.mdi-flag::before {
+  content: "\F23B";
+}
+.mdi-flag-checkered::before {
+  content: "\F23C";
+}
+.mdi-flag-minus::before {
+  content: "\FB75";
+}
+.mdi-flag-outline::before {
+  content: "\F23D";
+}
+.mdi-flag-plus::before {
+  content: "\FB76";
+}
+.mdi-flag-remove::before {
+  content: "\FB77";
+}
+.mdi-flag-triangle::before {
+  content: "\F23F";
+}
+.mdi-flag-variant::before {
+  content: "\F240";
+}
+.mdi-flag-variant-outline::before {
+  content: "\F23E";
+}
+.mdi-flare::before {
+  content: "\FD4E";
+}
+.mdi-flash::before {
+  content: "\F241";
+}
+.mdi-flash-alert::before {
+  content: "\FF14";
+}
+.mdi-flash-alert-outline::before {
+  content: "\FF15";
+}
+.mdi-flash-auto::before {
+  content: "\F242";
+}
+.mdi-flash-circle::before {
+  content: "\F81F";
+}
+.mdi-flash-off::before {
+  content: "\F243";
+}
+.mdi-flash-outline::before {
+  content: "\F6D4";
+}
+.mdi-flash-red-eye::before {
+  content: "\F67A";
+}
+.mdi-flashlight::before {
+  content: "\F244";
+}
+.mdi-flashlight-off::before {
+  content: "\F245";
+}
+.mdi-flask::before {
+  content: "\F093";
+}
+.mdi-flask-empty::before {
+  content: "\F094";
+}
+.mdi-flask-empty-outline::before {
+  content: "\F095";
+}
+.mdi-flask-outline::before {
+  content: "\F096";
+}
+.mdi-flattr::before {
+  content: "\F246";
+}
+.mdi-flickr::before {
+  content: "\FCE3";
+}
+.mdi-flip-to-back::before {
+  content: "\F247";
+}
+.mdi-flip-to-front::before {
+  content: "\F248";
+}
+.mdi-floor-lamp::before {
+  content: "\F8DC";
+}
+.mdi-floor-plan::before {
+  content: "\F820";
+}
+.mdi-floppy::before {
+  content: "\F249";
+}
+.mdi-floppy-variant::before {
+  content: "\F9EE";
+}
+.mdi-flower::before {
+  content: "\F24A";
+}
+.mdi-flower-outline::before {
+  content: "\F9EF";
+}
+.mdi-flower-poppy::before {
+  content: "\FCE4";
+}
+.mdi-flower-tulip::before {
+  content: "\F9F0";
+}
+.mdi-flower-tulip-outline::before {
+  content: "\F9F1";
+}
+.mdi-focus-auto::before {
+  content: "\FF6B";
+}
+.mdi-focus-field::before {
+  content: "\FF6C";
+}
+.mdi-focus-field-horizontal::before {
+  content: "\FF6D";
+}
+.mdi-focus-field-vertical::before {
+  content: "\FF6E";
+}
+.mdi-folder::before {
+  content: "\F24B";
+}
+.mdi-folder-account::before {
+  content: "\F24C";
+}
+.mdi-folder-account-outline::before {
+  content: "\FB78";
+}
+.mdi-folder-alert::before {
+  content: "\FDA8";
+}
+.mdi-folder-alert-outline::before {
+  content: "\FDA9";
+}
+.mdi-folder-clock::before {
+  content: "\FAB9";
+}
+.mdi-folder-clock-outline::before {
+  content: "\FABA";
+}
+.mdi-folder-download::before {
+  content: "\F24D";
+}
+.mdi-folder-edit::before {
+  content: "\F8DD";
+}
+.mdi-folder-edit-outline::before {
+  content: "\FDAA";
+}
+.mdi-folder-google-drive::before {
+  content: "\F24E";
+}
+.mdi-folder-image::before {
+  content: "\F24F";
+}
+.mdi-folder-key::before {
+  content: "\F8AB";
+}
+.mdi-folder-key-network::before {
+  content: "\F8AC";
+}
+.mdi-folder-key-network-outline::before {
+  content: "\FC5C";
+}
+.mdi-folder-lock::before {
+  content: "\F250";
+}
+.mdi-folder-lock-open::before {
+  content: "\F251";
+}
+.mdi-folder-move::before {
+  content: "\F252";
+}
+.mdi-folder-multiple::before {
+  content: "\F253";
+}
+.mdi-folder-multiple-image::before {
+  content: "\F254";
+}
+.mdi-folder-multiple-outline::before {
+  content: "\F255";
+}
+.mdi-folder-network::before {
+  content: "\F86F";
+}
+.mdi-folder-network-outline::before {
+  content: "\FC5D";
+}
+.mdi-folder-open::before {
+  content: "\F76F";
+}
+.mdi-folder-open-outline::before {
+  content: "\FDAB";
+}
+.mdi-folder-outline::before {
+  content: "\F256";
+}
+.mdi-folder-plus::before {
+  content: "\F257";
+}
+.mdi-folder-plus-outline::before {
+  content: "\FB79";
+}
+.mdi-folder-pound::before {
+  content: "\FCE5";
+}
+.mdi-folder-pound-outline::before {
+  content: "\FCE6";
+}
+.mdi-folder-remove::before {
+  content: "\F258";
+}
+.mdi-folder-remove-outline::before {
+  content: "\FB7A";
+}
+.mdi-folder-search::before {
+  content: "\F967";
+}
+.mdi-folder-search-outline::before {
+  content: "\F968";
+}
+.mdi-folder-star::before {
+  content: "\F69C";
+}
+.mdi-folder-star-outline::before {
+  content: "\FB7B";
+}
+.mdi-folder-sync::before {
+  content: "\FCE7";
+}
+.mdi-folder-sync-outline::before {
+  content: "\FCE8";
+}
+.mdi-folder-text::before {
+  content: "\FC5E";
+}
+.mdi-folder-text-outline::before {
+  content: "\FC5F";
+}
+.mdi-folder-upload::before {
+  content: "\F259";
+}
+.mdi-font-awesome::before {
+  content: "\F03A";
+}
+.mdi-food::before {
+  content: "\F25A";
+}
+.mdi-food-apple::before {
+  content: "\F25B";
+}
+.mdi-food-apple-outline::before {
+  content: "\FC60";
+}
+.mdi-food-croissant::before {
+  content: "\F7C7";
+}
+.mdi-food-fork-drink::before {
+  content: "\F5F2";
+}
+.mdi-food-off::before {
+  content: "\F5F3";
+}
+.mdi-food-variant::before {
+  content: "\F25C";
+}
+.mdi-foot-print::before {
+  content: "\FF6F";
+}
+.mdi-football::before {
+  content: "\F25D";
+}
+.mdi-football-australian::before {
+  content: "\F25E";
+}
+.mdi-football-helmet::before {
+  content: "\F25F";
+}
+.mdi-forklift::before {
+  content: "\F7C8";
+}
+.mdi-format-align-bottom::before {
+  content: "\F752";
+}
+.mdi-format-align-center::before {
+  content: "\F260";
+}
+.mdi-format-align-justify::before {
+  content: "\F261";
+}
+.mdi-format-align-left::before {
+  content: "\F262";
+}
+.mdi-format-align-middle::before {
+  content: "\F753";
+}
+.mdi-format-align-right::before {
+  content: "\F263";
+}
+.mdi-format-align-top::before {
+  content: "\F754";
+}
+.mdi-format-annotation-minus::before {
+  content: "\FABB";
+}
+.mdi-format-annotation-plus::before {
+  content: "\F646";
+}
+.mdi-format-bold::before {
+  content: "\F264";
+}
+.mdi-format-clear::before {
+  content: "\F265";
+}
+.mdi-format-color-fill::before {
+  content: "\F266";
+}
+.mdi-format-color-highlight::before {
+  content: "\FE14";
+}
+.mdi-format-color-text::before {
+  content: "\F69D";
+}
+.mdi-format-columns::before {
+  content: "\F8DE";
+}
+.mdi-format-float-center::before {
+  content: "\F267";
+}
+.mdi-format-float-left::before {
+  content: "\F268";
+}
+.mdi-format-float-none::before {
+  content: "\F269";
+}
+.mdi-format-float-right::before {
+  content: "\F26A";
+}
+.mdi-format-font::before {
+  content: "\F6D5";
+}
+.mdi-format-font-size-decrease::before {
+  content: "\F9F2";
+}
+.mdi-format-font-size-increase::before {
+  content: "\F9F3";
+}
+.mdi-format-header-1::before {
+  content: "\F26B";
+}
+.mdi-format-header-2::before {
+  content: "\F26C";
+}
+.mdi-format-header-3::before {
+  content: "\F26D";
+}
+.mdi-format-header-4::before {
+  content: "\F26E";
+}
+.mdi-format-header-5::before {
+  content: "\F26F";
+}
+.mdi-format-header-6::before {
+  content: "\F270";
+}
+.mdi-format-header-decrease::before {
+  content: "\F271";
+}
+.mdi-format-header-equal::before {
+  content: "\F272";
+}
+.mdi-format-header-increase::before {
+  content: "\F273";
+}
+.mdi-format-header-pound::before {
+  content: "\F274";
+}
+.mdi-format-horizontal-align-center::before {
+  content: "\F61E";
+}
+.mdi-format-horizontal-align-left::before {
+  content: "\F61F";
+}
+.mdi-format-horizontal-align-right::before {
+  content: "\F620";
+}
+.mdi-format-indent-decrease::before {
+  content: "\F275";
+}
+.mdi-format-indent-increase::before {
+  content: "\F276";
+}
+.mdi-format-italic::before {
+  content: "\F277";
+}
+.mdi-format-letter-case::before {
+  content: "\FB19";
+}
+.mdi-format-letter-case-lower::before {
+  content: "\FB1A";
+}
+.mdi-format-letter-case-upper::before {
+  content: "\FB1B";
+}
+.mdi-format-line-spacing::before {
+  content: "\F278";
+}
+.mdi-format-line-style::before {
+  content: "\F5C8";
+}
+.mdi-format-line-weight::before {
+  content: "\F5C9";
+}
+.mdi-format-list-bulleted::before {
+  content: "\F279";
+}
+.mdi-format-list-bulleted-square::before {
+  content: "\FDAC";
+}
+.mdi-format-list-bulleted-type::before {
+  content: "\F27A";
+}
+.mdi-format-list-checkbox::before {
+  content: "\F969";
+}
+.mdi-format-list-checks::before {
+  content: "\F755";
+}
+.mdi-format-list-numbered::before {
+  content: "\F27B";
+}
+.mdi-format-list-numbered-rtl::before {
+  content: "\FCE9";
+}
+.mdi-format-list-triangle::before {
+  content: "\FECF";
+}
+.mdi-format-overline::before {
+  content: "\FED0";
+}
+.mdi-format-page-break::before {
+  content: "\F6D6";
+}
+.mdi-format-paint::before {
+  content: "\F27C";
+}
+.mdi-format-paragraph::before {
+  content: "\F27D";
+}
+.mdi-format-pilcrow::before {
+  content: "\F6D7";
+}
+.mdi-format-quote-close::before {
+  content: "\F27E";
+}
+.mdi-format-quote-open::before {
+  content: "\F756";
+}
+.mdi-format-rotate-90::before {
+  content: "\F6A9";
+}
+.mdi-format-section::before {
+  content: "\F69E";
+}
+.mdi-format-size::before {
+  content: "\F27F";
+}
+.mdi-format-strikethrough::before {
+  content: "\F280";
+}
+.mdi-format-strikethrough-variant::before {
+  content: "\F281";
+}
+.mdi-format-subscript::before {
+  content: "\F282";
+}
+.mdi-format-superscript::before {
+  content: "\F283";
+}
+.mdi-format-text::before {
+  content: "\F284";
+}
+.mdi-format-text-rotation-down::before {
+  content: "\FD4F";
+}
+.mdi-format-text-rotation-none::before {
+  content: "\FD50";
+}
+.mdi-format-text-variant::before {
+  content: "\FE15";
+}
+.mdi-format-text-wrapping-clip::before {
+  content: "\FCEA";
+}
+.mdi-format-text-wrapping-overflow::before {
+  content: "\FCEB";
+}
+.mdi-format-text-wrapping-wrap::before {
+  content: "\FCEC";
+}
+.mdi-format-textbox::before {
+  content: "\FCED";
+}
+.mdi-format-textdirection-l-to-r::before {
+  content: "\F285";
+}
+.mdi-format-textdirection-r-to-l::before {
+  content: "\F286";
+}
+.mdi-format-title::before {
+  content: "\F5F4";
+}
+.mdi-format-underline::before {
+  content: "\F287";
+}
+.mdi-format-vertical-align-bottom::before {
+  content: "\F621";
+}
+.mdi-format-vertical-align-center::before {
+  content: "\F622";
+}
+.mdi-format-vertical-align-top::before {
+  content: "\F623";
+}
+.mdi-format-wrap-inline::before {
+  content: "\F288";
+}
+.mdi-format-wrap-square::before {
+  content: "\F289";
+}
+.mdi-format-wrap-tight::before {
+  content: "\F28A";
+}
+.mdi-format-wrap-top-bottom::before {
+  content: "\F28B";
+}
+.mdi-forum::before {
+  content: "\F28C";
+}
+.mdi-forum-outline::before {
+  content: "\F821";
+}
+.mdi-forward::before {
+  content: "\F28D";
+}
+.mdi-forwardburger::before {
+  content: "\FD51";
+}
+.mdi-fountain::before {
+  content: "\F96A";
+}
+.mdi-fountain-pen::before {
+  content: "\FCEE";
+}
+.mdi-fountain-pen-tip::before {
+  content: "\FCEF";
+}
+.mdi-foursquare::before {
+  content: "\F28E";
+}
+.mdi-freebsd::before {
+  content: "\F8DF";
+}
+.mdi-frequently-asked-questions::before {
+  content: "\FED1";
+}
+.mdi-fridge::before {
+  content: "\F290";
+}
+.mdi-fridge-bottom::before {
+  content: "\F292";
+}
+.mdi-fridge-outline::before {
+  content: "\F28F";
+}
+.mdi-fridge-top::before {
+  content: "\F291";
+}
+.mdi-fuel::before {
+  content: "\F7C9";
+}
+.mdi-fullscreen::before {
+  content: "\F293";
+}
+.mdi-fullscreen-exit::before {
+  content: "\F294";
+}
+.mdi-function::before {
+  content: "\F295";
+}
+.mdi-function-variant::before {
+  content: "\F870";
+}
+.mdi-fuse::before {
+  content: "\FC61";
+}
+.mdi-fuse-blade::before {
+  content: "\FC62";
+}
+.mdi-gamepad::before {
+  content: "\F296";
+}
+.mdi-gamepad-circle::before {
+  content: "\FE16";
+}
+.mdi-gamepad-circle-down::before {
+  content: "\FE17";
+}
+.mdi-gamepad-circle-left::before {
+  content: "\FE18";
+}
+.mdi-gamepad-circle-outline::before {
+  content: "\FE19";
+}
+.mdi-gamepad-circle-right::before {
+  content: "\FE1A";
+}
+.mdi-gamepad-circle-up::before {
+  content: "\FE1B";
+}
+.mdi-gamepad-down::before {
+  content: "\FE1C";
+}
+.mdi-gamepad-left::before {
+  content: "\FE1D";
+}
+.mdi-gamepad-right::before {
+  content: "\FE1E";
+}
+.mdi-gamepad-round::before {
+  content: "\FE1F";
+}
+.mdi-gamepad-round-down::before {
+  content: "\FE7E";
+}
+.mdi-gamepad-round-left::before {
+  content: "\FE7F";
+}
+.mdi-gamepad-round-outline::before {
+  content: "\FE80";
+}
+.mdi-gamepad-round-right::before {
+  content: "\FE81";
+}
+.mdi-gamepad-round-up::before {
+  content: "\FE82";
+}
+.mdi-gamepad-square::before {
+  content: "\FED2";
+}
+.mdi-gamepad-square-outline::before {
+  content: "\FED3";
+}
+.mdi-gamepad-up::before {
+  content: "\FE83";
+}
+.mdi-gamepad-variant::before {
+  content: "\F297";
+}
+.mdi-gamepad-variant-outline::before {
+  content: "\FED4";
+}
+.mdi-gantry-crane::before {
+  content: "\FDAD";
+}
+.mdi-garage::before {
+  content: "\F6D8";
+}
+.mdi-garage-alert::before {
+  content: "\F871";
+}
+.mdi-garage-open::before {
+  content: "\F6D9";
+}
+.mdi-gas-cylinder::before {
+  content: "\F647";
+}
+.mdi-gas-station::before {
+  content: "\F298";
+}
+.mdi-gas-station-outline::before {
+  content: "\FED5";
+}
+.mdi-gate::before {
+  content: "\F299";
+}
+.mdi-gate-and::before {
+  content: "\F8E0";
+}
+.mdi-gate-nand::before {
+  content: "\F8E1";
+}
+.mdi-gate-nor::before {
+  content: "\F8E2";
+}
+.mdi-gate-not::before {
+  content: "\F8E3";
+}
+.mdi-gate-or::before {
+  content: "\F8E4";
+}
+.mdi-gate-xnor::before {
+  content: "\F8E5";
+}
+.mdi-gate-xor::before {
+  content: "\F8E6";
+}
+.mdi-gatsby::before {
+  content: "\FE84";
+}
+.mdi-gauge::before {
+  content: "\F29A";
+}
+.mdi-gauge-empty::before {
+  content: "\F872";
+}
+.mdi-gauge-full::before {
+  content: "\F873";
+}
+.mdi-gauge-low::before {
+  content: "\F874";
+}
+.mdi-gavel::before {
+  content: "\F29B";
+}
+.mdi-gender-female::before {
+  content: "\F29C";
+}
+.mdi-gender-male::before {
+  content: "\F29D";
+}
+.mdi-gender-male-female::before {
+  content: "\F29E";
+}
+.mdi-gender-transgender::before {
+  content: "\F29F";
+}
+.mdi-gentoo::before {
+  content: "\F8E7";
+}
+.mdi-gesture::before {
+  content: "\F7CA";
+}
+.mdi-gesture-double-tap::before {
+  content: "\F73B";
+}
+.mdi-gesture-pinch::before {
+  content: "\FABC";
+}
+.mdi-gesture-spread::before {
+  content: "\FABD";
+}
+.mdi-gesture-swipe::before {
+  content: "\FD52";
+}
+.mdi-gesture-swipe-down::before {
+  content: "\F73C";
+}
+.mdi-gesture-swipe-horizontal::before {
+  content: "\FABE";
+}
+.mdi-gesture-swipe-left::before {
+  content: "\F73D";
+}
+.mdi-gesture-swipe-right::before {
+  content: "\F73E";
+}
+.mdi-gesture-swipe-up::before {
+  content: "\F73F";
+}
+.mdi-gesture-swipe-vertical::before {
+  content: "\FABF";
+}
+.mdi-gesture-tap::before {
+  content: "\F740";
+}
+.mdi-gesture-tap-hold::before {
+  content: "\FD53";
+}
+.mdi-gesture-two-double-tap::before {
+  content: "\F741";
+}
+.mdi-gesture-two-tap::before {
+  content: "\F742";
+}
+.mdi-ghost::before {
+  content: "\F2A0";
+}
+.mdi-ghost-off::before {
+  content: "\F9F4";
+}
+.mdi-gif::before {
+  content: "\FD54";
+}
+.mdi-gift::before {
+  content: "\FE85";
+}
+.mdi-gift-outline::before {
+  content: "\F2A1";
+}
+.mdi-git::before {
+  content: "\F2A2";
+}
+.mdi-github-box::before {
+  content: "\F2A3";
+}
+.mdi-github-circle::before {
+  content: "\F2A4";
+}
+.mdi-github-face::before {
+  content: "\F6DA";
+}
+.mdi-gitlab::before {
+  content: "\FB7C";
+}
+.mdi-glass-cocktail::before {
+  content: "\F356";
+}
+.mdi-glass-flute::before {
+  content: "\F2A5";
+}
+.mdi-glass-mug::before {
+  content: "\F2A6";
+}
+.mdi-glass-stange::before {
+  content: "\F2A7";
+}
+.mdi-glass-tulip::before {
+  content: "\F2A8";
+}
+.mdi-glass-wine::before {
+  content: "\F875";
+}
+.mdi-glassdoor::before {
+  content: "\F2A9";
+}
+.mdi-glasses::before {
+  content: "\F2AA";
+}
+.mdi-globe-model::before {
+  content: "\F8E8";
+}
+.mdi-gmail::before {
+  content: "\F2AB";
+}
+.mdi-gnome::before {
+  content: "\F2AC";
+}
+.mdi-go-kart::before {
+  content: "\FD55";
+}
+.mdi-go-kart-track::before {
+  content: "\FD56";
+}
+.mdi-gog::before {
+  content: "\FB7D";
+}
+.mdi-golf::before {
+  content: "\F822";
+}
+.mdi-gondola::before {
+  content: "\F685";
+}
+.mdi-goodreads::before {
+  content: "\FD57";
+}
+.mdi-google::before {
+  content: "\F2AD";
+}
+.mdi-google-adwords::before {
+  content: "\FC63";
+}
+.mdi-google-allo::before {
+  content: "\F801";
+}
+.mdi-google-analytics::before {
+  content: "\F7CB";
+}
+.mdi-google-assistant::before {
+  content: "\F7CC";
+}
+.mdi-google-cardboard::before {
+  content: "\F2AE";
+}
+.mdi-google-chrome::before {
+  content: "\F2AF";
+}
+.mdi-google-circles::before {
+  content: "\F2B0";
+}
+.mdi-google-circles-communities::before {
+  content: "\F2B1";
+}
+.mdi-google-circles-extended::before {
+  content: "\F2B2";
+}
+.mdi-google-circles-group::before {
+  content: "\F2B3";
+}
+.mdi-google-classroom::before {
+  content: "\F2C0";
+}
+.mdi-google-controller::before {
+  content: "\F2B4";
+}
+.mdi-google-controller-off::before {
+  content: "\F2B5";
+}
+.mdi-google-drive::before {
+  content: "\F2B6";
+}
+.mdi-google-earth::before {
+  content: "\F2B7";
+}
+.mdi-google-fit::before {
+  content: "\F96B";
+}
+.mdi-google-glass::before {
+  content: "\F2B8";
+}
+.mdi-google-hangouts::before {
+  content: "\F2C9";
+}
+.mdi-google-home::before {
+  content: "\F823";
+}
+.mdi-google-keep::before {
+  content: "\F6DB";
+}
+.mdi-google-lens::before {
+  content: "\F9F5";
+}
+.mdi-google-maps::before {
+  content: "\F5F5";
+}
+.mdi-google-nearby::before {
+  content: "\F2B9";
+}
+.mdi-google-pages::before {
+  content: "\F2BA";
+}
+.mdi-google-photos::before {
+  content: "\F6DC";
+}
+.mdi-google-physical-web::before {
+  content: "\F2BB";
+}
+.mdi-google-play::before {
+  content: "\F2BC";
+}
+.mdi-google-plus::before {
+  content: "\F2BD";
+}
+.mdi-google-plus-box::before {
+  content: "\F2BE";
+}
+.mdi-google-podcast::before {
+  content: "\FED6";
+}
+.mdi-google-spreadsheet::before {
+  content: "\F9F6";
+}
+.mdi-google-street-view::before {
+  content: "\FC64";
+}
+.mdi-google-translate::before {
+  content: "\F2BF";
+}
+.mdi-gpu::before {
+  content: "\F8AD";
+}
+.mdi-gradient::before {
+  content: "\F69F";
+}
+.mdi-grain::before {
+  content: "\FD58";
+}
+.mdi-graphql::before {
+  content: "\F876";
+}
+.mdi-grave-stone::before {
+  content: "\FB7E";
+}
+.mdi-grease-pencil::before {
+  content: "\F648";
+}
+.mdi-greater-than::before {
+  content: "\F96C";
+}
+.mdi-greater-than-or-equal::before {
+  content: "\F96D";
+}
+.mdi-grid::before {
+  content: "\F2C1";
+}
+.mdi-grid-large::before {
+  content: "\F757";
+}
+.mdi-grid-off::before {
+  content: "\F2C2";
+}
+.mdi-grill::before {
+  content: "\FE86";
+}
+.mdi-group::before {
+  content: "\F2C3";
+}
+.mdi-guitar-acoustic::before {
+  content: "\F770";
+}
+.mdi-guitar-electric::before {
+  content: "\F2C4";
+}
+.mdi-guitar-pick::before {
+  content: "\F2C5";
+}
+.mdi-guitar-pick-outline::before {
+  content: "\F2C6";
+}
+.mdi-guy-fawkes-mask::before {
+  content: "\F824";
+}
+.mdi-hackernews::before {
+  content: "\F624";
+}
+.mdi-hail::before {
+  content: "\FAC0";
+}
+.mdi-halloween::before {
+  content: "\FB7F";
+}
+.mdi-hamburger::before {
+  content: "\F684";
+}
+.mdi-hammer::before {
+  content: "\F8E9";
+}
+.mdi-hand::before {
+  content: "\FA4E";
+}
+.mdi-hand-left::before {
+  content: "\FE87";
+}
+.mdi-hand-okay::before {
+  content: "\FA4F";
+}
+.mdi-hand-peace::before {
+  content: "\FA50";
+}
+.mdi-hand-peace-variant::before {
+  content: "\FA51";
+}
+.mdi-hand-pointing-down::before {
+  content: "\FA52";
+}
+.mdi-hand-pointing-left::before {
+  content: "\FA53";
+}
+.mdi-hand-pointing-right::before {
+  content: "\F2C7";
+}
+.mdi-hand-pointing-up::before {
+  content: "\FA54";
+}
+.mdi-hand-right::before {
+  content: "\FE88";
+}
+.mdi-hand-saw::before {
+  content: "\FE89";
+}
+.mdi-handball::before {
+  content: "\FF70";
+}
+.mdi-hanger::before {
+  content: "\F2C8";
+}
+.mdi-hard-hat::before {
+  content: "\F96E";
+}
+.mdi-harddisk::before {
+  content: "\F2CA";
+}
+.mdi-hat-fedora::before {
+  content: "\FB80";
+}
+.mdi-hazard-lights::before {
+  content: "\FC65";
+}
+.mdi-hdr::before {
+  content: "\FD59";
+}
+.mdi-hdr-off::before {
+  content: "\FD5A";
+}
+.mdi-headphones::before {
+  content: "\F2CB";
+}
+.mdi-headphones-bluetooth::before {
+  content: "\F96F";
+}
+.mdi-headphones-box::before {
+  content: "\F2CC";
+}
+.mdi-headphones-off::before {
+  content: "\F7CD";
+}
+.mdi-headphones-settings::before {
+  content: "\F2CD";
+}
+.mdi-headset::before {
+  content: "\F2CE";
+}
+.mdi-headset-dock::before {
+  content: "\F2CF";
+}
+.mdi-headset-off::before {
+  content: "\F2D0";
+}
+.mdi-heart::before {
+  content: "\F2D1";
+}
+.mdi-heart-box::before {
+  content: "\F2D2";
+}
+.mdi-heart-box-outline::before {
+  content: "\F2D3";
+}
+.mdi-heart-broken::before {
+  content: "\F2D4";
+}
+.mdi-heart-broken-outline::before {
+  content: "\FCF0";
+}
+.mdi-heart-circle::before {
+  content: "\F970";
+}
+.mdi-heart-circle-outline::before {
+  content: "\F971";
+}
+.mdi-heart-flash::before {
+  content: "\FF16";
+}
+.mdi-heart-half::before {
+  content: "\F6DE";
+}
+.mdi-heart-half-full::before {
+  content: "\F6DD";
+}
+.mdi-heart-half-outline::before {
+  content: "\F6DF";
+}
+.mdi-heart-multiple::before {
+  content: "\FA55";
+}
+.mdi-heart-multiple-outline::before {
+  content: "\FA56";
+}
+.mdi-heart-off::before {
+  content: "\F758";
+}
+.mdi-heart-outline::before {
+  content: "\F2D5";
+}
+.mdi-heart-pulse::before {
+  content: "\F5F6";
+}
+.mdi-helicopter::before {
+  content: "\FAC1";
+}
+.mdi-help::before {
+  content: "\F2D6";
+}
+.mdi-help-box::before {
+  content: "\F78A";
+}
+.mdi-help-circle::before {
+  content: "\F2D7";
+}
+.mdi-help-circle-outline::before {
+  content: "\F625";
+}
+.mdi-help-network::before {
+  content: "\F6F4";
+}
+.mdi-help-network-outline::before {
+  content: "\FC66";
+}
+.mdi-help-rhombus::before {
+  content: "\FB81";
+}
+.mdi-help-rhombus-outline::before {
+  content: "\FB82";
+}
+.mdi-hexagon::before {
+  content: "\F2D8";
+}
+.mdi-hexagon-multiple::before {
+  content: "\F6E0";
+}
+.mdi-hexagon-outline::before {
+  content: "\F2D9";
+}
+.mdi-hexagon-slice-1::before {
+  content: "\FAC2";
+}
+.mdi-hexagon-slice-2::before {
+  content: "\FAC3";
+}
+.mdi-hexagon-slice-3::before {
+  content: "\FAC4";
+}
+.mdi-hexagon-slice-4::before {
+  content: "\FAC5";
+}
+.mdi-hexagon-slice-5::before {
+  content: "\FAC6";
+}
+.mdi-hexagon-slice-6::before {
+  content: "\FAC7";
+}
+.mdi-hexagram::before {
+  content: "\FAC8";
+}
+.mdi-hexagram-outline::before {
+  content: "\FAC9";
+}
+.mdi-high-definition::before {
+  content: "\F7CE";
+}
+.mdi-high-definition-box::before {
+  content: "\F877";
+}
+.mdi-highway::before {
+  content: "\F5F7";
+}
+.mdi-hiking::before {
+  content: "\FD5B";
+}
+.mdi-hinduism::before {
+  content: "\F972";
+}
+.mdi-history::before {
+  content: "\F2DA";
+}
+.mdi-hockey-puck::before {
+  content: "\F878";
+}
+.mdi-hockey-sticks::before {
+  content: "\F879";
+}
+.mdi-hololens::before {
+  content: "\F2DB";
+}
+.mdi-home::before {
+  content: "\F2DC";
+}
+.mdi-home-account::before {
+  content: "\F825";
+}
+.mdi-home-alert::before {
+  content: "\F87A";
+}
+.mdi-home-analytics::before {
+  content: "\FED7";
+}
+.mdi-home-assistant::before {
+  content: "\F7CF";
+}
+.mdi-home-automation::before {
+  content: "\F7D0";
+}
+.mdi-home-circle::before {
+  content: "\F7D1";
+}
+.mdi-home-city::before {
+  content: "\FCF1";
+}
+.mdi-home-city-outline::before {
+  content: "\FCF2";
+}
+.mdi-home-currency-usd::before {
+  content: "\F8AE";
+}
+.mdi-home-export-outline::before {
+  content: "\FFB8";
+}
+.mdi-home-flood::before {
+  content: "\FF17";
+}
+.mdi-home-floor-0::before {
+  content: "\FDAE";
+}
+.mdi-home-floor-1::before {
+  content: "\FD5C";
+}
+.mdi-home-floor-2::before {
+  content: "\FD5D";
+}
+.mdi-home-floor-3::before {
+  content: "\FD5E";
+}
+.mdi-home-floor-a::before {
+  content: "\FD5F";
+}
+.mdi-home-floor-b::before {
+  content: "\FD60";
+}
+.mdi-home-floor-g::before {
+  content: "\FD61";
+}
+.mdi-home-floor-l::before {
+  content: "\FD62";
+}
+.mdi-home-floor-negative-1::before {
+  content: "\FDAF";
+}
+.mdi-home-group::before {
+  content: "\FDB0";
+}
+.mdi-home-heart::before {
+  content: "\F826";
+}
+.mdi-home-import-outline::before {
+  content: "\FFB9";
+}
+.mdi-home-lock::before {
+  content: "\F8EA";
+}
+.mdi-home-lock-open::before {
+  content: "\F8EB";
+}
+.mdi-home-map-marker::before {
+  content: "\F5F8";
+}
+.mdi-home-minus::before {
+  content: "\F973";
+}
+.mdi-home-modern::before {
+  content: "\F2DD";
+}
+.mdi-home-outline::before {
+  content: "\F6A0";
+}
+.mdi-home-plus::before {
+  content: "\F974";
+}
+.mdi-home-thermometer::before {
+  content: "\FF71";
+}
+.mdi-home-thermometer-outline::before {
+  content: "\FF72";
+}
+.mdi-home-variant::before {
+  content: "\F2DE";
+}
+.mdi-home-variant-outline::before {
+  content: "\FB83";
+}
+.mdi-hook::before {
+  content: "\F6E1";
+}
+.mdi-hook-off::before {
+  content: "\F6E2";
+}
+.mdi-hops::before {
+  content: "\F2DF";
+}
+.mdi-horseshoe::before {
+  content: "\FA57";
+}
+.mdi-hospital::before {
+  content: "\F2E0";
+}
+.mdi-hospital-building::before {
+  content: "\F2E1";
+}
+.mdi-hospital-marker::before {
+  content: "\F2E2";
+}
+.mdi-hot-tub::before {
+  content: "\F827";
+}
+.mdi-hotel::before {
+  content: "\F2E3";
+}
+.mdi-houzz::before {
+  content: "\F2E4";
+}
+.mdi-houzz-box::before {
+  content: "\F2E5";
+}
+.mdi-hubspot::before {
+  content: "\FCF3";
+}
+.mdi-hulu::before {
+  content: "\F828";
+}
+.mdi-human::before {
+  content: "\F2E6";
+}
+.mdi-human-child::before {
+  content: "\F2E7";
+}
+.mdi-human-female::before {
+  content: "\F649";
+}
+.mdi-human-female-boy::before {
+  content: "\FA58";
+}
+.mdi-human-female-female::before {
+  content: "\FA59";
+}
+.mdi-human-female-girl::before {
+  content: "\FA5A";
+}
+.mdi-human-greeting::before {
+  content: "\F64A";
+}
+.mdi-human-handsdown::before {
+  content: "\F64B";
+}
+.mdi-human-handsup::before {
+  content: "\F64C";
+}
+.mdi-human-male::before {
+  content: "\F64D";
+}
+.mdi-human-male-boy::before {
+  content: "\FA5B";
+}
+.mdi-human-male-female::before {
+  content: "\F2E8";
+}
+.mdi-human-male-girl::before {
+  content: "\FA5C";
+}
+.mdi-human-male-height::before {
+  content: "\FF18";
+}
+.mdi-human-male-height-variant::before {
+  content: "\FF19";
+}
+.mdi-human-male-male::before {
+  content: "\FA5D";
+}
+.mdi-human-pregnant::before {
+  content: "\F5CF";
+}
+.mdi-humble-bundle::before {
+  content: "\F743";
+}
+.mdi-ice-cream::before {
+  content: "\F829";
+}
+.mdi-ice-pop::before {
+  content: "\FF1A";
+}
+.mdi-identifier::before {
+  content: "\FF1B";
+}
+.mdi-iframe::before {
+  content: "\FC67";
+}
+.mdi-iframe-outline::before {
+  content: "\FC68";
+}
+.mdi-image::before {
+  content: "\F2E9";
+}
+.mdi-image-album::before {
+  content: "\F2EA";
+}
+.mdi-image-area::before {
+  content: "\F2EB";
+}
+.mdi-image-area-close::before {
+  content: "\F2EC";
+}
+.mdi-image-broken::before {
+  content: "\F2ED";
+}
+.mdi-image-broken-variant::before {
+  content: "\F2EE";
+}
+.mdi-image-filter::before {
+  content: "\F2EF";
+}
+.mdi-image-filter-black-white::before {
+  content: "\F2F0";
+}
+.mdi-image-filter-center-focus::before {
+  content: "\F2F1";
+}
+.mdi-image-filter-center-focus-strong::before {
+  content: "\FF1C";
+}
+.mdi-image-filter-center-focus-strong-outline::before {
+  content: "\FF1D";
+}
+.mdi-image-filter-center-focus-weak::before {
+  content: "\F2F2";
+}
+.mdi-image-filter-drama::before {
+  content: "\F2F3";
+}
+.mdi-image-filter-frames::before {
+  content: "\F2F4";
+}
+.mdi-image-filter-hdr::before {
+  content: "\F2F5";
+}
+.mdi-image-filter-none::before {
+  content: "\F2F6";
+}
+.mdi-image-filter-tilt-shift::before {
+  content: "\F2F7";
+}
+.mdi-image-filter-vintage::before {
+  content: "\F2F8";
+}
+.mdi-image-frame::before {
+  content: "\FE8A";
+}
+.mdi-image-move::before {
+  content: "\F9F7";
+}
+.mdi-image-multiple::before {
+  content: "\F2F9";
+}
+.mdi-image-off::before {
+  content: "\F82A";
+}
+.mdi-image-outline::before {
+  content: "\F975";
+}
+.mdi-image-plus::before {
+  content: "\F87B";
+}
+.mdi-image-search::before {
+  content: "\F976";
+}
+.mdi-image-search-outline::before {
+  content: "\F977";
+}
+.mdi-image-size-select-actual::before {
+  content: "\FC69";
+}
+.mdi-image-size-select-large::before {
+  content: "\FC6A";
+}
+.mdi-image-size-select-small::before {
+  content: "\FC6B";
+}
+.mdi-import::before {
+  content: "\F2FA";
+}
+.mdi-inbox::before {
+  content: "\F686";
+}
+.mdi-inbox-arrow-down::before {
+  content: "\F2FB";
+}
+.mdi-inbox-arrow-up::before {
+  content: "\F3D1";
+}
+.mdi-inbox-multiple::before {
+  content: "\F8AF";
+}
+.mdi-inbox-multiple-outline::before {
+  content: "\FB84";
+}
+.mdi-incognito::before {
+  content: "\F5F9";
+}
+.mdi-infinity::before {
+  content: "\F6E3";
+}
+.mdi-information::before {
+  content: "\F2FC";
+}
+.mdi-information-outline::before {
+  content: "\F2FD";
+}
+.mdi-information-variant::before {
+  content: "\F64E";
+}
+.mdi-instagram::before {
+  content: "\F2FE";
+}
+.mdi-instapaper::before {
+  content: "\F2FF";
+}
+.mdi-internet-explorer::before {
+  content: "\F300";
+}
+.mdi-invert-colors::before {
+  content: "\F301";
+}
+.mdi-invert-colors-off::before {
+  content: "\FE8B";
+}
+.mdi-ip::before {
+  content: "\FA5E";
+}
+.mdi-ip-network::before {
+  content: "\FA5F";
+}
+.mdi-ip-network-outline::before {
+  content: "\FC6C";
+}
+.mdi-ipod::before {
+  content: "\FC6D";
+}
+.mdi-islam::before {
+  content: "\F978";
+}
+.mdi-itunes::before {
+  content: "\F676";
+}
+.mdi-jabber::before {
+  content: "\FDB1";
+}
+.mdi-jeepney::before {
+  content: "\F302";
+}
+.mdi-jellyfish::before {
+  content: "\FF1E";
+}
+.mdi-jellyfish-outline::before {
+  content: "\FF1F";
+}
+.mdi-jira::before {
+  content: "\F303";
+}
+.mdi-jquery::before {
+  content: "\F87C";
+}
+.mdi-jsfiddle::before {
+  content: "\F304";
+}
+.mdi-json::before {
+  content: "\F626";
+}
+.mdi-judaism::before {
+  content: "\F979";
+}
+.mdi-kabaddi::before {
+  content: "\FD63";
+}
+.mdi-karate::before {
+  content: "\F82B";
+}
+.mdi-keg::before {
+  content: "\F305";
+}
+.mdi-kettle::before {
+  content: "\F5FA";
+}
+.mdi-kettle-outline::before {
+  content: "\FF73";
+}
+.mdi-key::before {
+  content: "\F306";
+}
+.mdi-key-change::before {
+  content: "\F307";
+}
+.mdi-key-minus::before {
+  content: "\F308";
+}
+.mdi-key-outline::before {
+  content: "\FDB2";
+}
+.mdi-key-plus::before {
+  content: "\F309";
+}
+.mdi-key-remove::before {
+  content: "\F30A";
+}
+.mdi-key-variant::before {
+  content: "\F30B";
+}
+.mdi-keyboard::before {
+  content: "\F30C";
+}
+.mdi-keyboard-backspace::before {
+  content: "\F30D";
+}
+.mdi-keyboard-caps::before {
+  content: "\F30E";
+}
+.mdi-keyboard-close::before {
+  content: "\F30F";
+}
+.mdi-keyboard-off::before {
+  content: "\F310";
+}
+.mdi-keyboard-off-outline::before {
+  content: "\FE8C";
+}
+.mdi-keyboard-outline::before {
+  content: "\F97A";
+}
+.mdi-keyboard-return::before {
+  content: "\F311";
+}
+.mdi-keyboard-settings::before {
+  content: "\F9F8";
+}
+.mdi-keyboard-settings-outline::before {
+  content: "\F9F9";
+}
+.mdi-keyboard-tab::before {
+  content: "\F312";
+}
+.mdi-keyboard-variant::before {
+  content: "\F313";
+}
+.mdi-kickstarter::before {
+  content: "\F744";
+}
+.mdi-knife::before {
+  content: "\F9FA";
+}
+.mdi-knife-military::before {
+  content: "\F9FB";
+}
+.mdi-kodi::before {
+  content: "\F314";
+}
+.mdi-label::before {
+  content: "\F315";
+}
+.mdi-label-off::before {
+  content: "\FACA";
+}
+.mdi-label-off-outline::before {
+  content: "\FACB";
+}
+.mdi-label-outline::before {
+  content: "\F316";
+}
+.mdi-label-variant::before {
+  content: "\FACC";
+}
+.mdi-label-variant-outline::before {
+  content: "\FACD";
+}
+.mdi-ladybug::before {
+  content: "\F82C";
+}
+.mdi-lambda::before {
+  content: "\F627";
+}
+.mdi-lamp::before {
+  content: "\F6B4";
+}
+.mdi-lan::before {
+  content: "\F317";
+}
+.mdi-lan-connect::before {
+  content: "\F318";
+}
+.mdi-lan-disconnect::before {
+  content: "\F319";
+}
+.mdi-lan-pending::before {
+  content: "\F31A";
+}
+.mdi-language-c::before {
+  content: "\F671";
+}
+.mdi-language-cpp::before {
+  content: "\F672";
+}
+.mdi-language-csharp::before {
+  content: "\F31B";
+}
+.mdi-language-css3::before {
+  content: "\F31C";
+}
+.mdi-language-go::before {
+  content: "\F7D2";
+}
+.mdi-language-haskell::before {
+  content: "\FC6E";
+}
+.mdi-language-html5::before {
+  content: "\F31D";
+}
+.mdi-language-java::before {
+  content: "\FB1C";
+}
+.mdi-language-javascript::before {
+  content: "\F31E";
+}
+.mdi-language-lua::before {
+  content: "\F8B0";
+}
+.mdi-language-php::before {
+  content: "\F31F";
+}
+.mdi-language-python::before {
+  content: "\F320";
+}
+.mdi-language-python-text::before {
+  content: "\F321";
+}
+.mdi-language-r::before {
+  content: "\F7D3";
+}
+.mdi-language-ruby-on-rails::before {
+  content: "\FACE";
+}
+.mdi-language-swift::before {
+  content: "\F6E4";
+}
+.mdi-language-typescript::before {
+  content: "\F6E5";
+}
+.mdi-laptop::before {
+  content: "\F322";
+}
+.mdi-laptop-chromebook::before {
+  content: "\F323";
+}
+.mdi-laptop-mac::before {
+  content: "\F324";
+}
+.mdi-laptop-off::before {
+  content: "\F6E6";
+}
+.mdi-laptop-windows::before {
+  content: "\F325";
+}
+.mdi-laravel::before {
+  content: "\FACF";
+}
+.mdi-lasso::before {
+  content: "\FF20";
+}
+.mdi-lastfm::before {
+  content: "\F326";
+}
+.mdi-lastpass::before {
+  content: "\F446";
+}
+.mdi-latitude::before {
+  content: "\FF74";
+}
+.mdi-launch::before {
+  content: "\F327";
+}
+.mdi-lava-lamp::before {
+  content: "\F7D4";
+}
+.mdi-layers::before {
+  content: "\F328";
+}
+.mdi-layers-minus::before {
+  content: "\FE8D";
+}
+.mdi-layers-off::before {
+  content: "\F329";
+}
+.mdi-layers-off-outline::before {
+  content: "\F9FC";
+}
+.mdi-layers-outline::before {
+  content: "\F9FD";
+}
+.mdi-layers-plus::before {
+  content: "\FE30";
+}
+.mdi-layers-remove::before {
+  content: "\FE31";
+}
+.mdi-layers-triple::before {
+  content: "\FF75";
+}
+.mdi-layers-triple-outline::before {
+  content: "\FF76";
+}
+.mdi-lead-pencil::before {
+  content: "\F64F";
+}
+.mdi-leaf::before {
+  content: "\F32A";
+}
+.mdi-leaf-maple::before {
+  content: "\FC6F";
+}
+.mdi-leak::before {
+  content: "\FDB3";
+}
+.mdi-leak-off::before {
+  content: "\FDB4";
+}
+.mdi-led-off::before {
+  content: "\F32B";
+}
+.mdi-led-on::before {
+  content: "\F32C";
+}
+.mdi-led-outline::before {
+  content: "\F32D";
+}
+.mdi-led-strip::before {
+  content: "\F7D5";
+}
+.mdi-led-variant-off::before {
+  content: "\F32E";
+}
+.mdi-led-variant-on::before {
+  content: "\F32F";
+}
+.mdi-led-variant-outline::before {
+  content: "\F330";
+}
+.mdi-less-than::before {
+  content: "\F97B";
+}
+.mdi-less-than-or-equal::before {
+  content: "\F97C";
+}
+.mdi-library::before {
+  content: "\F331";
+}
+.mdi-library-books::before {
+  content: "\F332";
+}
+.mdi-library-movie::before {
+  content: "\FCF4";
+}
+.mdi-library-music::before {
+  content: "\F333";
+}
+.mdi-library-music-outline::before {
+  content: "\FF21";
+}
+.mdi-library-plus::before {
+  content: "\F334";
+}
+.mdi-library-shelves::before {
+  content: "\FB85";
+}
+.mdi-library-video::before {
+  content: "\FCF5";
+}
+.mdi-lifebuoy::before {
+  content: "\F87D";
+}
+.mdi-light-switch::before {
+  content: "\F97D";
+}
+.mdi-lightbulb::before {
+  content: "\F335";
+}
+.mdi-lightbulb-off::before {
+  content: "\FE32";
+}
+.mdi-lightbulb-off-outline::before {
+  content: "\FE33";
+}
+.mdi-lightbulb-on::before {
+  content: "\F6E7";
+}
+.mdi-lightbulb-on-outline::before {
+  content: "\F6E8";
+}
+.mdi-lightbulb-outline::before {
+  content: "\F336";
+}
+.mdi-lighthouse::before {
+  content: "\F9FE";
+}
+.mdi-lighthouse-on::before {
+  content: "\F9FF";
+}
+.mdi-link::before {
+  content: "\F337";
+}
+.mdi-link-box::before {
+  content: "\FCF6";
+}
+.mdi-link-box-outline::before {
+  content: "\FCF7";
+}
+.mdi-link-box-variant::before {
+  content: "\FCF8";
+}
+.mdi-link-box-variant-outline::before {
+  content: "\FCF9";
+}
+.mdi-link-off::before {
+  content: "\F338";
+}
+.mdi-link-plus::before {
+  content: "\FC70";
+}
+.mdi-link-variant::before {
+  content: "\F339";
+}
+.mdi-link-variant-off::before {
+  content: "\F33A";
+}
+.mdi-linkedin::before {
+  content: "\F33B";
+}
+.mdi-linkedin-box::before {
+  content: "\F33C";
+}
+.mdi-linux::before {
+  content: "\F33D";
+}
+.mdi-linux-mint::before {
+  content: "\F8EC";
+}
+.mdi-litecoin::before {
+  content: "\FA60";
+}
+.mdi-loading::before {
+  content: "\F771";
+}
+.mdi-lock::before {
+  content: "\F33E";
+}
+.mdi-lock-alert::before {
+  content: "\F8ED";
+}
+.mdi-lock-clock::before {
+  content: "\F97E";
+}
+.mdi-lock-open::before {
+  content: "\F33F";
+}
+.mdi-lock-open-outline::before {
+  content: "\F340";
+}
+.mdi-lock-outline::before {
+  content: "\F341";
+}
+.mdi-lock-pattern::before {
+  content: "\F6E9";
+}
+.mdi-lock-plus::before {
+  content: "\F5FB";
+}
+.mdi-lock-question::before {
+  content: "\F8EE";
+}
+.mdi-lock-reset::before {
+  content: "\F772";
+}
+.mdi-lock-smart::before {
+  content: "\F8B1";
+}
+.mdi-locker::before {
+  content: "\F7D6";
+}
+.mdi-locker-multiple::before {
+  content: "\F7D7";
+}
+.mdi-login::before {
+  content: "\F342";
+}
+.mdi-login-variant::before {
+  content: "\F5FC";
+}
+.mdi-logout::before {
+  content: "\F343";
+}
+.mdi-logout-variant::before {
+  content: "\F5FD";
+}
+.mdi-longitude::before {
+  content: "\FF77";
+}
+.mdi-looks::before {
+  content: "\F344";
+}
+.mdi-loop::before {
+  content: "\F6EA";
+}
+.mdi-loupe::before {
+  content: "\F345";
+}
+.mdi-lumx::before {
+  content: "\F346";
+}
+.mdi-lyft::before {
+  content: "\FB1D";
+}
+.mdi-magnet::before {
+  content: "\F347";
+}
+.mdi-magnet-on::before {
+  content: "\F348";
+}
+.mdi-magnify::before {
+  content: "\F349";
+}
+.mdi-magnify-close::before {
+  content: "\F97F";
+}
+.mdi-magnify-minus::before {
+  content: "\F34A";
+}
+.mdi-magnify-minus-cursor::before {
+  content: "\FA61";
+}
+.mdi-magnify-minus-outline::before {
+  content: "\F6EB";
+}
+.mdi-magnify-plus::before {
+  content: "\F34B";
+}
+.mdi-magnify-plus-cursor::before {
+  content: "\FA62";
+}
+.mdi-magnify-plus-outline::before {
+  content: "\F6EC";
+}
+.mdi-mail::before {
+  content: "\FED8";
+}
+.mdi-mail-ru::before {
+  content: "\F34C";
+}
+.mdi-mailbox::before {
+  content: "\F6ED";
+}
+.mdi-mailbox-open::before {
+  content: "\FD64";
+}
+.mdi-mailbox-open-outline::before {
+  content: "\FD65";
+}
+.mdi-mailbox-open-up::before {
+  content: "\FD66";
+}
+.mdi-mailbox-open-up-outline::before {
+  content: "\FD67";
+}
+.mdi-mailbox-outline::before {
+  content: "\FD68";
+}
+.mdi-mailbox-up::before {
+  content: "\FD69";
+}
+.mdi-mailbox-up-outline::before {
+  content: "\FD6A";
+}
+.mdi-map::before {
+  content: "\F34D";
+}
+.mdi-map-check::before {
+  content: "\FED9";
+}
+.mdi-map-check-outline::before {
+  content: "\FEDA";
+}
+.mdi-map-clock::before {
+  content: "\FCFA";
+}
+.mdi-map-clock-outline::before {
+  content: "\FCFB";
+}
+.mdi-map-legend::before {
+  content: "\FA00";
+}
+.mdi-map-marker::before {
+  content: "\F34E";
+}
+.mdi-map-marker-alert::before {
+  content: "\FF22";
+}
+.mdi-map-marker-alert-outline::before {
+  content: "\FF23";
+}
+.mdi-map-marker-check::before {
+  content: "\FC71";
+}
+.mdi-map-marker-circle::before {
+  content: "\F34F";
+}
+.mdi-map-marker-distance::before {
+  content: "\F8EF";
+}
+.mdi-map-marker-minus::before {
+  content: "\F650";
+}
+.mdi-map-marker-multiple::before {
+  content: "\F350";
+}
+.mdi-map-marker-off::before {
+  content: "\F351";
+}
+.mdi-map-marker-outline::before {
+  content: "\F7D8";
+}
+.mdi-map-marker-path::before {
+  content: "\FCFC";
+}
+.mdi-map-marker-plus::before {
+  content: "\F651";
+}
+.mdi-map-marker-question::before {
+  content: "\FF24";
+}
+.mdi-map-marker-question-outline::before {
+  content: "\FF25";
+}
+.mdi-map-marker-radius::before {
+  content: "\F352";
+}
+.mdi-map-marker-remove::before {
+  content: "\FF26";
+}
+.mdi-map-marker-remove-variant::before {
+  content: "\FF27";
+}
+.mdi-map-minus::before {
+  content: "\F980";
+}
+.mdi-map-outline::before {
+  content: "\F981";
+}
+.mdi-map-plus::before {
+  content: "\F982";
+}
+.mdi-map-search::before {
+  content: "\F983";
+}
+.mdi-map-search-outline::before {
+  content: "\F984";
+}
+.mdi-mapbox::before {
+  content: "\FB86";
+}
+.mdi-margin::before {
+  content: "\F353";
+}
+.mdi-markdown::before {
+  content: "\F354";
+}
+.mdi-markdown-outline::before {
+  content: "\FF78";
+}
+.mdi-marker::before {
+  content: "\F652";
+}
+.mdi-marker-cancel::before {
+  content: "\FDB5";
+}
+.mdi-marker-check::before {
+  content: "\F355";
+}
+.mdi-mastodon::before {
+  content: "\FAD0";
+}
+.mdi-mastodon-variant::before {
+  content: "\FAD1";
+}
+.mdi-material-design::before {
+  content: "\F985";
+}
+.mdi-material-ui::before {
+  content: "\F357";
+}
+.mdi-math-compass::before {
+  content: "\F358";
+}
+.mdi-math-cos::before {
+  content: "\FC72";
+}
+.mdi-math-sin::before {
+  content: "\FC73";
+}
+.mdi-math-tan::before {
+  content: "\FC74";
+}
+.mdi-matrix::before {
+  content: "\F628";
+}
+.mdi-maxcdn::before {
+  content: "\F359";
+}
+.mdi-medal::before {
+  content: "\F986";
+}
+.mdi-medical-bag::before {
+  content: "\F6EE";
+}
+.mdi-medium::before {
+  content: "\F35A";
+}
+.mdi-meetup::before {
+  content: "\FAD2";
+}
+.mdi-memory::before {
+  content: "\F35B";
+}
+.mdi-menu::before {
+  content: "\F35C";
+}
+.mdi-menu-down::before {
+  content: "\F35D";
+}
+.mdi-menu-down-outline::before {
+  content: "\F6B5";
+}
+.mdi-menu-left::before {
+  content: "\F35E";
+}
+.mdi-menu-left-outline::before {
+  content: "\FA01";
+}
+.mdi-menu-open::before {
+  content: "\FB87";
+}
+.mdi-menu-right::before {
+  content: "\F35F";
+}
+.mdi-menu-right-outline::before {
+  content: "\FA02";
+}
+.mdi-menu-swap::before {
+  content: "\FA63";
+}
+.mdi-menu-swap-outline::before {
+  content: "\FA64";
+}
+.mdi-menu-up::before {
+  content: "\F360";
+}
+.mdi-menu-up-outline::before {
+  content: "\F6B6";
+}
+.mdi-merge::before {
+  content: "\FF79";
+}
+.mdi-message::before {
+  content: "\F361";
+}
+.mdi-message-alert::before {
+  content: "\F362";
+}
+.mdi-message-alert-outline::before {
+  content: "\FA03";
+}
+.mdi-message-bulleted::before {
+  content: "\F6A1";
+}
+.mdi-message-bulleted-off::before {
+  content: "\F6A2";
+}
+.mdi-message-draw::before {
+  content: "\F363";
+}
+.mdi-message-image::before {
+  content: "\F364";
+}
+.mdi-message-outline::before {
+  content: "\F365";
+}
+.mdi-message-plus::before {
+  content: "\F653";
+}
+.mdi-message-processing::before {
+  content: "\F366";
+}
+.mdi-message-reply::before {
+  content: "\F367";
+}
+.mdi-message-reply-text::before {
+  content: "\F368";
+}
+.mdi-message-settings::before {
+  content: "\F6EF";
+}
+.mdi-message-settings-variant::before {
+  content: "\F6F0";
+}
+.mdi-message-text::before {
+  content: "\F369";
+}
+.mdi-message-text-outline::before {
+  content: "\F36A";
+}
+.mdi-message-video::before {
+  content: "\F36B";
+}
+.mdi-meteor::before {
+  content: "\F629";
+}
+.mdi-metronome::before {
+  content: "\F7D9";
+}
+.mdi-metronome-tick::before {
+  content: "\F7DA";
+}
+.mdi-micro-sd::before {
+  content: "\F7DB";
+}
+.mdi-microphone::before {
+  content: "\F36C";
+}
+.mdi-microphone-minus::before {
+  content: "\F8B2";
+}
+.mdi-microphone-off::before {
+  content: "\F36D";
+}
+.mdi-microphone-outline::before {
+  content: "\F36E";
+}
+.mdi-microphone-plus::before {
+  content: "\F8B3";
+}
+.mdi-microphone-settings::before {
+  content: "\F36F";
+}
+.mdi-microphone-variant::before {
+  content: "\F370";
+}
+.mdi-microphone-variant-off::before {
+  content: "\F371";
+}
+.mdi-microscope::before {
+  content: "\F654";
+}
+.mdi-microsoft::before {
+  content: "\F372";
+}
+.mdi-microsoft-dynamics::before {
+  content: "\F987";
+}
+.mdi-microwave::before {
+  content: "\FC75";
+}
+.mdi-middleware::before {
+  content: "\FF7A";
+}
+.mdi-middleware-outline::before {
+  content: "\FF7B";
+}
+.mdi-midi::before {
+  content: "\F8F0";
+}
+.mdi-midi-port::before {
+  content: "\F8F1";
+}
+.mdi-mine::before {
+  content: "\FDB6";
+}
+.mdi-minecraft::before {
+  content: "\F373";
+}
+.mdi-mini-sd::before {
+  content: "\FA04";
+}
+.mdi-minidisc::before {
+  content: "\FA05";
+}
+.mdi-minus::before {
+  content: "\F374";
+}
+.mdi-minus-box::before {
+  content: "\F375";
+}
+.mdi-minus-box-outline::before {
+  content: "\F6F1";
+}
+.mdi-minus-circle::before {
+  content: "\F376";
+}
+.mdi-minus-circle-outline::before {
+  content: "\F377";
+}
+.mdi-minus-network::before {
+  content: "\F378";
+}
+.mdi-minus-network-outline::before {
+  content: "\FC76";
+}
+.mdi-mixcloud::before {
+  content: "\F62A";
+}
+.mdi-mixed-martial-arts::before {
+  content: "\FD6B";
+}
+.mdi-mixed-reality::before {
+  content: "\F87E";
+}
+.mdi-mixer::before {
+  content: "\F7DC";
+}
+.mdi-molecule::before {
+  content: "\FB88";
+}
+.mdi-monitor::before {
+  content: "\F379";
+}
+.mdi-monitor-cellphone::before {
+  content: "\F988";
+}
+.mdi-monitor-cellphone-star::before {
+  content: "\F989";
+}
+.mdi-monitor-dashboard::before {
+  content: "\FA06";
+}
+.mdi-monitor-lock::before {
+  content: "\FDB7";
+}
+.mdi-monitor-multiple::before {
+  content: "\F37A";
+}
+.mdi-monitor-off::before {
+  content: "\FD6C";
+}
+.mdi-monitor-screenshot::before {
+  content: "\FE34";
+}
+.mdi-monitor-speaker::before {
+  content: "\FF7C";
+}
+.mdi-monitor-speaker-off::before {
+  content: "\FF7D";
+}
+.mdi-monitor-star::before {
+  content: "\FDB8";
+}
+.mdi-moon-first-quarter::before {
+  content: "\FF7E";
+}
+.mdi-moon-full::before {
+  content: "\FF7F";
+}
+.mdi-moon-last-quarter::before {
+  content: "\FF80";
+}
+.mdi-moon-new::before {
+  content: "\FF81";
+}
+.mdi-moon-waning-crescent::before {
+  content: "\FF82";
+}
+.mdi-moon-waning-gibbous::before {
+  content: "\FF83";
+}
+.mdi-moon-waxing-crescent::before {
+  content: "\FF84";
+}
+.mdi-moon-waxing-gibbous::before {
+  content: "\FF85";
+}
+.mdi-more::before {
+  content: "\F37B";
+}
+.mdi-mother-nurse::before {
+  content: "\FCFD";
+}
+.mdi-motion-sensor::before {
+  content: "\FD6D";
+}
+.mdi-motorbike::before {
+  content: "\F37C";
+}
+.mdi-mouse::before {
+  content: "\F37D";
+}
+.mdi-mouse-bluetooth::before {
+  content: "\F98A";
+}
+.mdi-mouse-off::before {
+  content: "\F37E";
+}
+.mdi-mouse-variant::before {
+  content: "\F37F";
+}
+.mdi-mouse-variant-off::before {
+  content: "\F380";
+}
+.mdi-move-resize::before {
+  content: "\F655";
+}
+.mdi-move-resize-variant::before {
+  content: "\F656";
+}
+.mdi-movie::before {
+  content: "\F381";
+}
+.mdi-movie-outline::before {
+  content: "\FDB9";
+}
+.mdi-movie-roll::before {
+  content: "\F7DD";
+}
+.mdi-muffin::before {
+  content: "\F98B";
+}
+.mdi-multiplication::before {
+  content: "\F382";
+}
+.mdi-multiplication-box::before {
+  content: "\F383";
+}
+.mdi-mushroom::before {
+  content: "\F7DE";
+}
+.mdi-mushroom-outline::before {
+  content: "\F7DF";
+}
+.mdi-music::before {
+  content: "\F759";
+}
+.mdi-music-accidental-double-flat::before {
+  content: "\FF86";
+}
+.mdi-music-accidental-double-sharp::before {
+  content: "\FF87";
+}
+.mdi-music-accidental-flat::before {
+  content: "\FF88";
+}
+.mdi-music-accidental-natural::before {
+  content: "\FF89";
+}
+.mdi-music-accidental-sharp::before {
+  content: "\FF8A";
+}
+.mdi-music-box::before {
+  content: "\F384";
+}
+.mdi-music-box-outline::before {
+  content: "\F385";
+}
+.mdi-music-circle::before {
+  content: "\F386";
+}
+.mdi-music-circle-outline::before {
+  content: "\FAD3";
+}
+.mdi-music-clef-alto::before {
+  content: "\FF8B";
+}
+.mdi-music-clef-bass::before {
+  content: "\FF8C";
+}
+.mdi-music-clef-treble::before {
+  content: "\FF8D";
+}
+.mdi-music-note::before {
+  content: "\F387";
+}
+.mdi-music-note-bluetooth::before {
+  content: "\F5FE";
+}
+.mdi-music-note-bluetooth-off::before {
+  content: "\F5FF";
+}
+.mdi-music-note-eighth::before {
+  content: "\F388";
+}
+.mdi-music-note-eighth-dotted::before {
+  content: "\FF8E";
+}
+.mdi-music-note-half::before {
+  content: "\F389";
+}
+.mdi-music-note-half-dotted::before {
+  content: "\FF8F";
+}
+.mdi-music-note-off::before {
+  content: "\F38A";
+}
+.mdi-music-note-off-outline::before {
+  content: "\FF90";
+}
+.mdi-music-note-outline::before {
+  content: "\FF91";
+}
+.mdi-music-note-plus::before {
+  content: "\FDBA";
+}
+.mdi-music-note-quarter::before {
+  content: "\F38B";
+}
+.mdi-music-note-quarter-dotted::before {
+  content: "\FF92";
+}
+.mdi-music-note-sixteenth::before {
+  content: "\F38C";
+}
+.mdi-music-note-sixteenth-dotted::before {
+  content: "\FF93";
+}
+.mdi-music-note-whole::before {
+  content: "\F38D";
+}
+.mdi-music-note-whole-dotted::before {
+  content: "\FF94";
+}
+.mdi-music-off::before {
+  content: "\F75A";
+}
+.mdi-music-rest-eighth::before {
+  content: "\FF95";
+}
+.mdi-music-rest-half::before {
+  content: "\FF96";
+}
+.mdi-music-rest-quarter::before {
+  content: "\FF97";
+}
+.mdi-music-rest-sixteenth::before {
+  content: "\FF98";
+}
+.mdi-music-rest-whole::before {
+  content: "\FF99";
+}
+.mdi-nail::before {
+  content: "\FDBB";
+}
+.mdi-nas::before {
+  content: "\F8F2";
+}
+.mdi-nativescript::before {
+  content: "\F87F";
+}
+.mdi-nature::before {
+  content: "\F38E";
+}
+.mdi-nature-people::before {
+  content: "\F38F";
+}
+.mdi-navigation::before {
+  content: "\F390";
+}
+.mdi-near-me::before {
+  content: "\F5CD";
+}
+.mdi-necklace::before {
+  content: "\FF28";
+}
+.mdi-needle::before {
+  content: "\F391";
+}
+.mdi-netflix::before {
+  content: "\F745";
+}
+.mdi-network::before {
+  content: "\F6F2";
+}
+.mdi-network-off::before {
+  content: "\FC77";
+}
+.mdi-network-off-outline::before {
+  content: "\FC78";
+}
+.mdi-network-outline::before {
+  content: "\FC79";
+}
+.mdi-network-strength-1::before {
+  content: "\F8F3";
+}
+.mdi-network-strength-1-alert::before {
+  content: "\F8F4";
+}
+.mdi-network-strength-2::before {
+  content: "\F8F5";
+}
+.mdi-network-strength-2-alert::before {
+  content: "\F8F6";
+}
+.mdi-network-strength-3::before {
+  content: "\F8F7";
+}
+.mdi-network-strength-3-alert::before {
+  content: "\F8F8";
+}
+.mdi-network-strength-4::before {
+  content: "\F8F9";
+}
+.mdi-network-strength-4-alert::before {
+  content: "\F8FA";
+}
+.mdi-network-strength-off::before {
+  content: "\F8FB";
+}
+.mdi-network-strength-off-outline::before {
+  content: "\F8FC";
+}
+.mdi-network-strength-outline::before {
+  content: "\F8FD";
+}
+.mdi-new-box::before {
+  content: "\F394";
+}
+.mdi-newspaper::before {
+  content: "\F395";
+}
+.mdi-newspaper-minus::before {
+  content: "\FF29";
+}
+.mdi-newspaper-plus::before {
+  content: "\FF2A";
+}
+.mdi-nfc::before {
+  content: "\F396";
+}
+.mdi-nfc-off::before {
+  content: "\FE35";
+}
+.mdi-nfc-search-variant::before {
+  content: "\FE36";
+}
+.mdi-nfc-tap::before {
+  content: "\F397";
+}
+.mdi-nfc-variant::before {
+  content: "\F398";
+}
+.mdi-nfc-variant-off::before {
+  content: "\FE37";
+}
+.mdi-ninja::before {
+  content: "\F773";
+}
+.mdi-nintendo-switch::before {
+  content: "\F7E0";
+}
+.mdi-nodejs::before {
+  content: "\F399";
+}
+.mdi-not-equal::before {
+  content: "\F98C";
+}
+.mdi-not-equal-variant::before {
+  content: "\F98D";
+}
+.mdi-note::before {
+  content: "\F39A";
+}
+.mdi-note-circle::before {
+  content: "\FEDB";
+}
+.mdi-note-multiple::before {
+  content: "\F6B7";
+}
+.mdi-note-multiple-outline::before {
+  content: "\F6B8";
+}
+.mdi-note-outline::before {
+  content: "\F39B";
+}
+.mdi-note-plus::before {
+  content: "\F39C";
+}
+.mdi-note-plus-outline::before {
+  content: "\F39D";
+}
+.mdi-note-text::before {
+  content: "\F39E";
+}
+.mdi-notebook::before {
+  content: "\F82D";
+}
+.mdi-notebook-multiple::before {
+  content: "\FE38";
+}
+.mdi-notebook-outline::before {
+  content: "\FEDC";
+}
+.mdi-notification-clear-all::before {
+  content: "\F39F";
+}
+.mdi-npm::before {
+  content: "\F6F6";
+}
+.mdi-npm-variant::before {
+  content: "\F98E";
+}
+.mdi-npm-variant-outline::before {
+  content: "\F98F";
+}
+.mdi-nuke::before {
+  content: "\F6A3";
+}
+.mdi-null::before {
+  content: "\F7E1";
+}
+.mdi-numeric::before {
+  content: "\F3A0";
+}
+.mdi-numeric-0::before {
+  content: "\30";
+}
+.mdi-numeric-0-box::before {
+  content: "\F3A1";
+}
+.mdi-numeric-0-box-multiple::before {
+  content: "\FF2B";
+}
+.mdi-numeric-0-box-multiple-outline::before {
+  content: "\F3A2";
+}
+.mdi-numeric-0-box-outline::before {
+  content: "\F3A3";
+}
+.mdi-numeric-0-circle::before {
+  content: "\FC7A";
+}
+.mdi-numeric-0-circle-outline::before {
+  content: "\FC7B";
+}
+.mdi-numeric-1::before {
+  content: "\31";
+}
+.mdi-numeric-1-box::before {
+  content: "\F3A4";
+}
+.mdi-numeric-1-box-multiple::before {
+  content: "\FF2C";
+}
+.mdi-numeric-1-box-multiple-outline::before {
+  content: "\F3A5";
+}
+.mdi-numeric-1-box-outline::before {
+  content: "\F3A6";
+}
+.mdi-numeric-1-circle::before {
+  content: "\FC7C";
+}
+.mdi-numeric-1-circle-outline::before {
+  content: "\FC7D";
+}
+.mdi-numeric-10-box::before {
+  content: "\FF9A";
+}
+.mdi-numeric-10-box-outline::before {
+  content: "\FF9B";
+}
+.mdi-numeric-2::before {
+  content: "\32";
+}
+.mdi-numeric-2-box::before {
+  content: "\F3A7";
+}
+.mdi-numeric-2-box-multiple::before {
+  content: "\FF2D";
+}
+.mdi-numeric-2-box-multiple-outline::before {
+  content: "\F3A8";
+}
+.mdi-numeric-2-box-outline::before {
+  content: "\F3A9";
+}
+.mdi-numeric-2-circle::before {
+  content: "\FC7E";
+}
+.mdi-numeric-2-circle-outline::before {
+  content: "\FC7F";
+}
+.mdi-numeric-3::before {
+  content: "\33";
+}
+.mdi-numeric-3-box::before {
+  content: "\F3AA";
+}
+.mdi-numeric-3-box-multiple::before {
+  content: "\FF2E";
+}
+.mdi-numeric-3-box-multiple-outline::before {
+  content: "\F3AB";
+}
+.mdi-numeric-3-box-outline::before {
+  content: "\F3AC";
+}
+.mdi-numeric-3-circle::before {
+  content: "\FC80";
+}
+.mdi-numeric-3-circle-outline::before {
+  content: "\FC81";
+}
+.mdi-numeric-4::before {
+  content: "\34";
+}
+.mdi-numeric-4-box::before {
+  content: "\F3AD";
+}
+.mdi-numeric-4-box-multiple::before {
+  content: "\FF2F";
+}
+.mdi-numeric-4-box-multiple-outline::before {
+  content: "\F3AE";
+}
+.mdi-numeric-4-box-outline::before {
+  content: "\F3AF";
+}
+.mdi-numeric-4-circle::before {
+  content: "\FC82";
+}
+.mdi-numeric-4-circle-outline::before {
+  content: "\FC83";
+}
+.mdi-numeric-5::before {
+  content: "\35";
+}
+.mdi-numeric-5-box::before {
+  content: "\F3B0";
+}
+.mdi-numeric-5-box-multiple::before {
+  content: "\FF30";
+}
+.mdi-numeric-5-box-multiple-outline::before {
+  content: "\F3B1";
+}
+.mdi-numeric-5-box-outline::before {
+  content: "\F3B2";
+}
+.mdi-numeric-5-circle::before {
+  content: "\FC84";
+}
+.mdi-numeric-5-circle-outline::before {
+  content: "\FC85";
+}
+.mdi-numeric-6::before {
+  content: "\36";
+}
+.mdi-numeric-6-box::before {
+  content: "\F3B3";
+}
+.mdi-numeric-6-box-multiple::before {
+  content: "\FF31";
+}
+.mdi-numeric-6-box-multiple-outline::before {
+  content: "\F3B4";
+}
+.mdi-numeric-6-box-outline::before {
+  content: "\F3B5";
+}
+.mdi-numeric-6-circle::before {
+  content: "\FC86";
+}
+.mdi-numeric-6-circle-outline::before {
+  content: "\FC87";
+}
+.mdi-numeric-7::before {
+  content: "\37";
+}
+.mdi-numeric-7-box::before {
+  content: "\F3B6";
+}
+.mdi-numeric-7-box-multiple::before {
+  content: "\FF32";
+}
+.mdi-numeric-7-box-multiple-outline::before {
+  content: "\F3B7";
+}
+.mdi-numeric-7-box-outline::before {
+  content: "\F3B8";
+}
+.mdi-numeric-7-circle::before {
+  content: "\FC88";
+}
+.mdi-numeric-7-circle-outline::before {
+  content: "\FC89";
+}
+.mdi-numeric-8::before {
+  content: "\38";
+}
+.mdi-numeric-8-box::before {
+  content: "\F3B9";
+}
+.mdi-numeric-8-box-multiple::before {
+  content: "\FF33";
+}
+.mdi-numeric-8-box-multiple-outline::before {
+  content: "\F3BA";
+}
+.mdi-numeric-8-box-outline::before {
+  content: "\F3BB";
+}
+.mdi-numeric-8-circle::before {
+  content: "\FC8A";
+}
+.mdi-numeric-8-circle-outline::before {
+  content: "\FC8B";
+}
+.mdi-numeric-9::before {
+  content: "\39";
+}
+.mdi-numeric-9-box::before {
+  content: "\F3BC";
+}
+.mdi-numeric-9-box-multiple::before {
+  content: "\FF34";
+}
+.mdi-numeric-9-box-multiple-outline::before {
+  content: "\F3BD";
+}
+.mdi-numeric-9-box-outline::before {
+  content: "\F3BE";
+}
+.mdi-numeric-9-circle::before {
+  content: "\FC8C";
+}
+.mdi-numeric-9-circle-outline::before {
+  content: "\FC8D";
+}
+.mdi-numeric-9-plus-box::before {
+  content: "\F3BF";
+}
+.mdi-numeric-9-plus-box-multiple::before {
+  content: "\FF35";
+}
+.mdi-numeric-9-plus-box-multiple-outline::before {
+  content: "\F3C0";
+}
+.mdi-numeric-9-plus-box-outline::before {
+  content: "\F3C1";
+}
+.mdi-numeric-9-plus-circle::before {
+  content: "\FC8E";
+}
+.mdi-numeric-9-plus-circle-outline::before {
+  content: "\FC8F";
+}
+.mdi-nut::before {
+  content: "\F6F7";
+}
+.mdi-nutrition::before {
+  content: "\F3C2";
+}
+.mdi-oar::before {
+  content: "\F67B";
+}
+.mdi-ocarina::before {
+  content: "\FDBC";
+}
+.mdi-octagon::before {
+  content: "\F3C3";
+}
+.mdi-octagon-outline::before {
+  content: "\F3C4";
+}
+.mdi-octagram::before {
+  content: "\F6F8";
+}
+.mdi-octagram-outline::before {
+  content: "\F774";
+}
+.mdi-odnoklassniki::before {
+  content: "\F3C5";
+}
+.mdi-office::before {
+  content: "\F3C6";
+}
+.mdi-office-building::before {
+  content: "\F990";
+}
+.mdi-oil::before {
+  content: "\F3C7";
+}
+.mdi-oil-lamp::before {
+  content: "\FF36";
+}
+.mdi-oil-temperature::before {
+  content: "\F3C8";
+}
+.mdi-omega::before {
+  content: "\F3C9";
+}
+.mdi-one-up::before {
+  content: "\FB89";
+}
+.mdi-onedrive::before {
+  content: "\F3CA";
+}
+.mdi-onenote::before {
+  content: "\F746";
+}
+.mdi-onepassword::before {
+  content: "\F880";
+}
+.mdi-opacity::before {
+  content: "\F5CC";
+}
+.mdi-open-in-app::before {
+  content: "\F3CB";
+}
+.mdi-open-in-new::before {
+  content: "\F3CC";
+}
+.mdi-open-source-initiative::before {
+  content: "\FB8A";
+}
+.mdi-openid::before {
+  content: "\F3CD";
+}
+.mdi-opera::before {
+  content: "\F3CE";
+}
+.mdi-orbit::before {
+  content: "\F018";
+}
+.mdi-origin::before {
+  content: "\FB2B";
+}
+.mdi-ornament::before {
+  content: "\F3CF";
+}
+.mdi-ornament-variant::before {
+  content: "\F3D0";
+}
+.mdi-outlook::before {
+  content: "\FCFE";
+}
+.mdi-owl::before {
+  content: "\F3D2";
+}
+.mdi-pac-man::before {
+  content: "\FB8B";
+}
+.mdi-package::before {
+  content: "\F3D3";
+}
+.mdi-package-down::before {
+  content: "\F3D4";
+}
+.mdi-package-up::before {
+  content: "\F3D5";
+}
+.mdi-package-variant::before {
+  content: "\F3D6";
+}
+.mdi-package-variant-closed::before {
+  content: "\F3D7";
+}
+.mdi-page-first::before {
+  content: "\F600";
+}
+.mdi-page-last::before {
+  content: "\F601";
+}
+.mdi-page-layout-body::before {
+  content: "\F6F9";
+}
+.mdi-page-layout-footer::before {
+  content: "\F6FA";
+}
+.mdi-page-layout-header::before {
+  content: "\F6FB";
+}
+.mdi-page-layout-header-footer::before {
+  content: "\FF9C";
+}
+.mdi-page-layout-sidebar-left::before {
+  content: "\F6FC";
+}
+.mdi-page-layout-sidebar-right::before {
+  content: "\F6FD";
+}
+.mdi-page-next::before {
+  content: "\FB8C";
+}
+.mdi-page-next-outline::before {
+  content: "\FB8D";
+}
+.mdi-page-previous::before {
+  content: "\FB8E";
+}
+.mdi-page-previous-outline::before {
+  content: "\FB8F";
+}
+.mdi-palette::before {
+  content: "\F3D8";
+}
+.mdi-palette-advanced::before {
+  content: "\F3D9";
+}
+.mdi-palette-outline::before {
+  content: "\FE6C";
+}
+.mdi-palette-swatch::before {
+  content: "\F8B4";
+}
+.mdi-pan::before {
+  content: "\FB90";
+}
+.mdi-pan-bottom-left::before {
+  content: "\FB91";
+}
+.mdi-pan-bottom-right::before {
+  content: "\FB92";
+}
+.mdi-pan-down::before {
+  content: "\FB93";
+}
+.mdi-pan-horizontal::before {
+  content: "\FB94";
+}
+.mdi-pan-left::before {
+  content: "\FB95";
+}
+.mdi-pan-right::before {
+  content: "\FB96";
+}
+.mdi-pan-top-left::before {
+  content: "\FB97";
+}
+.mdi-pan-top-right::before {
+  content: "\FB98";
+}
+.mdi-pan-up::before {
+  content: "\FB99";
+}
+.mdi-pan-vertical::before {
+  content: "\FB9A";
+}
+.mdi-panda::before {
+  content: "\F3DA";
+}
+.mdi-pandora::before {
+  content: "\F3DB";
+}
+.mdi-panorama::before {
+  content: "\F3DC";
+}
+.mdi-panorama-fisheye::before {
+  content: "\F3DD";
+}
+.mdi-panorama-horizontal::before {
+  content: "\F3DE";
+}
+.mdi-panorama-vertical::before {
+  content: "\F3DF";
+}
+.mdi-panorama-wide-angle::before {
+  content: "\F3E0";
+}
+.mdi-paper-cut-vertical::before {
+  content: "\F3E1";
+}
+.mdi-paperclip::before {
+  content: "\F3E2";
+}
+.mdi-parachute::before {
+  content: "\FC90";
+}
+.mdi-parachute-outline::before {
+  content: "\FC91";
+}
+.mdi-parking::before {
+  content: "\F3E3";
+}
+.mdi-passport::before {
+  content: "\F7E2";
+}
+.mdi-passport-biometric::before {
+  content: "\FDBD";
+}
+.mdi-patio-heater::before {
+  content: "\FF9D";
+}
+.mdi-patreon::before {
+  content: "\F881";
+}
+.mdi-pause::before {
+  content: "\F3E4";
+}
+.mdi-pause-circle::before {
+  content: "\F3E5";
+}
+.mdi-pause-circle-outline::before {
+  content: "\F3E6";
+}
+.mdi-pause-octagon::before {
+  content: "\F3E7";
+}
+.mdi-pause-octagon-outline::before {
+  content: "\F3E8";
+}
+.mdi-paw::before {
+  content: "\F3E9";
+}
+.mdi-paw-off::before {
+  content: "\F657";
+}
+.mdi-paypal::before {
+  content: "\F882";
+}
+.mdi-pdf-box::before {
+  content: "\FE39";
+}
+.mdi-peace::before {
+  content: "\F883";
+}
+.mdi-pen::before {
+  content: "\F3EA";
+}
+.mdi-pen-lock::before {
+  content: "\FDBE";
+}
+.mdi-pen-minus::before {
+  content: "\FDBF";
+}
+.mdi-pen-off::before {
+  content: "\FDC0";
+}
+.mdi-pen-plus::before {
+  content: "\FDC1";
+}
+.mdi-pen-remove::before {
+  content: "\FDC2";
+}
+.mdi-pencil::before {
+  content: "\F3EB";
+}
+.mdi-pencil-box::before {
+  content: "\F3EC";
+}
+.mdi-pencil-box-outline::before {
+  content: "\F3ED";
+}
+.mdi-pencil-circle::before {
+  content: "\F6FE";
+}
+.mdi-pencil-circle-outline::before {
+  content: "\F775";
+}
+.mdi-pencil-lock::before {
+  content: "\F3EE";
+}
+.mdi-pencil-lock-outline::before {
+  content: "\FDC3";
+}
+.mdi-pencil-minus::before {
+  content: "\FDC4";
+}
+.mdi-pencil-minus-outline::before {
+  content: "\FDC5";
+}
+.mdi-pencil-off::before {
+  content: "\F3EF";
+}
+.mdi-pencil-off-outline::before {
+  content: "\FDC6";
+}
+.mdi-pencil-outline::before {
+  content: "\FC92";
+}
+.mdi-pencil-plus::before {
+  content: "\FDC7";
+}
+.mdi-pencil-plus-outline::before {
+  content: "\FDC8";
+}
+.mdi-pencil-remove::before {
+  content: "\FDC9";
+}
+.mdi-pencil-remove-outline::before {
+  content: "\FDCA";
+}
+.mdi-penguin::before {
+  content: "\FEDD";
+}
+.mdi-pentagon::before {
+  content: "\F6FF";
+}
+.mdi-pentagon-outline::before {
+  content: "\F700";
+}
+.mdi-percent::before {
+  content: "\F3F0";
+}
+.mdi-periodic-table::before {
+  content: "\F8B5";
+}
+.mdi-periodic-table-co2::before {
+  content: "\F7E3";
+}
+.mdi-periscope::before {
+  content: "\F747";
+}
+.mdi-perspective-less::before {
+  content: "\FCFF";
+}
+.mdi-perspective-more::before {
+  content: "\FD00";
+}
+.mdi-pharmacy::before {
+  content: "\F3F1";
+}
+.mdi-phone::before {
+  content: "\F3F2";
+}
+.mdi-phone-alert::before {
+  content: "\FF37";
+}
+.mdi-phone-bluetooth::before {
+  content: "\F3F3";
+}
+.mdi-phone-classic::before {
+  content: "\F602";
+}
+.mdi-phone-forward::before {
+  content: "\F3F4";
+}
+.mdi-phone-hangup::before {
+  content: "\F3F5";
+}
+.mdi-phone-in-talk::before {
+  content: "\F3F6";
+}
+.mdi-phone-incoming::before {
+  content: "\F3F7";
+}
+.mdi-phone-lock::before {
+  content: "\F3F8";
+}
+.mdi-phone-log::before {
+  content: "\F3F9";
+}
+.mdi-phone-minus::before {
+  content: "\F658";
+}
+.mdi-phone-missed::before {
+  content: "\F3FA";
+}
+.mdi-phone-off::before {
+  content: "\FDCB";
+}
+.mdi-phone-outgoing::before {
+  content: "\F3FB";
+}
+.mdi-phone-outline::before {
+  content: "\FDCC";
+}
+.mdi-phone-paused::before {
+  content: "\F3FC";
+}
+.mdi-phone-plus::before {
+  content: "\F659";
+}
+.mdi-phone-return::before {
+  content: "\F82E";
+}
+.mdi-phone-rotate-landscape::before {
+  content: "\F884";
+}
+.mdi-phone-rotate-portrait::before {
+  content: "\F885";
+}
+.mdi-phone-settings::before {
+  content: "\F3FD";
+}
+.mdi-phone-voip::before {
+  content: "\F3FE";
+}
+.mdi-pi::before {
+  content: "\F3FF";
+}
+.mdi-pi-box::before {
+  content: "\F400";
+}
+.mdi-pi-hole::before {
+  content: "\FDCD";
+}
+.mdi-piano::before {
+  content: "\F67C";
+}
+.mdi-pickaxe::before {
+  content: "\F8B6";
+}
+.mdi-picture-in-picture-bottom-right::before {
+  content: "\FE3A";
+}
+.mdi-picture-in-picture-bottom-right-outline::before {
+  content: "\FE3B";
+}
+.mdi-picture-in-picture-top-right::before {
+  content: "\FE3C";
+}
+.mdi-picture-in-picture-top-right-outline::before {
+  content: "\FE3D";
+}
+.mdi-pier::before {
+  content: "\F886";
+}
+.mdi-pier-crane::before {
+  content: "\F887";
+}
+.mdi-pig::before {
+  content: "\F401";
+}
+.mdi-pill::before {
+  content: "\F402";
+}
+.mdi-pillar::before {
+  content: "\F701";
+}
+.mdi-pin::before {
+  content: "\F403";
+}
+.mdi-pin-off::before {
+  content: "\F404";
+}
+.mdi-pin-off-outline::before {
+  content: "\F92F";
+}
+.mdi-pin-outline::before {
+  content: "\F930";
+}
+.mdi-pine-tree::before {
+  content: "\F405";
+}
+.mdi-pine-tree-box::before {
+  content: "\F406";
+}
+.mdi-pinterest::before {
+  content: "\F407";
+}
+.mdi-pinterest-box::before {
+  content: "\F408";
+}
+.mdi-pinwheel::before {
+  content: "\FAD4";
+}
+.mdi-pinwheel-outline::before {
+  content: "\FAD5";
+}
+.mdi-pipe::before {
+  content: "\F7E4";
+}
+.mdi-pipe-disconnected::before {
+  content: "\F7E5";
+}
+.mdi-pipe-leak::before {
+  content: "\F888";
+}
+.mdi-pirate::before {
+  content: "\FA07";
+}
+.mdi-pistol::before {
+  content: "\F702";
+}
+.mdi-piston::before {
+  content: "\F889";
+}
+.mdi-pizza::before {
+  content: "\F409";
+}
+.mdi-play::before {
+  content: "\F40A";
+}
+.mdi-play-box-outline::before {
+  content: "\F40B";
+}
+.mdi-play-circle::before {
+  content: "\F40C";
+}
+.mdi-play-circle-outline::before {
+  content: "\F40D";
+}
+.mdi-play-network::before {
+  content: "\F88A";
+}
+.mdi-play-network-outline::before {
+  content: "\FC93";
+}
+.mdi-play-outline::before {
+  content: "\FF38";
+}
+.mdi-play-pause::before {
+  content: "\F40E";
+}
+.mdi-play-protected-content::before {
+  content: "\F40F";
+}
+.mdi-play-speed::before {
+  content: "\F8FE";
+}
+.mdi-playlist-check::before {
+  content: "\F5C7";
+}
+.mdi-playlist-edit::before {
+  content: "\F8FF";
+}
+.mdi-playlist-minus::before {
+  content: "\F410";
+}
+.mdi-playlist-music::before {
+  content: "\FC94";
+}
+.mdi-playlist-music-outline::before {
+  content: "\FC95";
+}
+.mdi-playlist-play::before {
+  content: "\F411";
+}
+.mdi-playlist-plus::before {
+  content: "\F412";
+}
+.mdi-playlist-remove::before {
+  content: "\F413";
+}
+.mdi-playlist-star::before {
+  content: "\FDCE";
+}
+.mdi-playstation::before {
+  content: "\F414";
+}
+.mdi-plex::before {
+  content: "\F6B9";
+}
+.mdi-plus::before {
+  content: "\F415";
+}
+.mdi-plus-box::before {
+  content: "\F416";
+}
+.mdi-plus-box-outline::before {
+  content: "\F703";
+}
+.mdi-plus-circle::before {
+  content: "\F417";
+}
+.mdi-plus-circle-multiple-outline::before {
+  content: "\F418";
+}
+.mdi-plus-circle-outline::before {
+  content: "\F419";
+}
+.mdi-plus-minus::before {
+  content: "\F991";
+}
+.mdi-plus-minus-box::before {
+  content: "\F992";
+}
+.mdi-plus-network::before {
+  content: "\F41A";
+}
+.mdi-plus-network-outline::before {
+  content: "\FC96";
+}
+.mdi-plus-one::before {
+  content: "\F41B";
+}
+.mdi-plus-outline::before {
+  content: "\F704";
+}
+.mdi-pocket::before {
+  content: "\F41C";
+}
+.mdi-podcast::before {
+  content: "\F993";
+}
+.mdi-podium::before {
+  content: "\FD01";
+}
+.mdi-podium-bronze::before {
+  content: "\FD02";
+}
+.mdi-podium-gold::before {
+  content: "\FD03";
+}
+.mdi-podium-silver::before {
+  content: "\FD04";
+}
+.mdi-point-of-sale::before {
+  content: "\FD6E";
+}
+.mdi-pokeball::before {
+  content: "\F41D";
+}
+.mdi-pokemon-go::before {
+  content: "\FA08";
+}
+.mdi-poker-chip::before {
+  content: "\F82F";
+}
+.mdi-polaroid::before {
+  content: "\F41E";
+}
+.mdi-poll::before {
+  content: "\F41F";
+}
+.mdi-poll-box::before {
+  content: "\F420";
+}
+.mdi-polymer::before {
+  content: "\F421";
+}
+.mdi-pool::before {
+  content: "\F606";
+}
+.mdi-popcorn::before {
+  content: "\F422";
+}
+.mdi-postage-stamp::before {
+  content: "\FC97";
+}
+.mdi-pot::before {
+  content: "\F65A";
+}
+.mdi-pot-mix::before {
+  content: "\F65B";
+}
+.mdi-pound::before {
+  content: "\F423";
+}
+.mdi-pound-box::before {
+  content: "\F424";
+}
+.mdi-power::before {
+  content: "\F425";
+}
+.mdi-power-cycle::before {
+  content: "\F900";
+}
+.mdi-power-off::before {
+  content: "\F901";
+}
+.mdi-power-on::before {
+  content: "\F902";
+}
+.mdi-power-plug::before {
+  content: "\F6A4";
+}
+.mdi-power-plug-off::before {
+  content: "\F6A5";
+}
+.mdi-power-settings::before {
+  content: "\F426";
+}
+.mdi-power-sleep::before {
+  content: "\F903";
+}
+.mdi-power-socket::before {
+  content: "\F427";
+}
+.mdi-power-socket-au::before {
+  content: "\F904";
+}
+.mdi-power-socket-eu::before {
+  content: "\F7E6";
+}
+.mdi-power-socket-uk::before {
+  content: "\F7E7";
+}
+.mdi-power-socket-us::before {
+  content: "\F7E8";
+}
+.mdi-power-standby::before {
+  content: "\F905";
+}
+.mdi-powershell::before {
+  content: "\FA09";
+}
+.mdi-prescription::before {
+  content: "\F705";
+}
+.mdi-presentation::before {
+  content: "\F428";
+}
+.mdi-presentation-play::before {
+  content: "\F429";
+}
+.mdi-printer::before {
+  content: "\F42A";
+}
+.mdi-printer-3d::before {
+  content: "\F42B";
+}
+.mdi-printer-3d-nozzle::before {
+  content: "\FE3E";
+}
+.mdi-printer-3d-nozzle-outline::before {
+  content: "\FE3F";
+}
+.mdi-printer-alert::before {
+  content: "\F42C";
+}
+.mdi-printer-off::before {
+  content: "\FE40";
+}
+.mdi-printer-settings::before {
+  content: "\F706";
+}
+.mdi-printer-wireless::before {
+  content: "\FA0A";
+}
+.mdi-priority-high::before {
+  content: "\F603";
+}
+.mdi-priority-low::before {
+  content: "\F604";
+}
+.mdi-professional-hexagon::before {
+  content: "\F42D";
+}
+.mdi-progress-alert::before {
+  content: "\FC98";
+}
+.mdi-progress-check::before {
+  content: "\F994";
+}
+.mdi-progress-clock::before {
+  content: "\F995";
+}
+.mdi-progress-download::before {
+  content: "\F996";
+}
+.mdi-progress-upload::before {
+  content: "\F997";
+}
+.mdi-progress-wrench::before {
+  content: "\FC99";
+}
+.mdi-projector::before {
+  content: "\F42E";
+}
+.mdi-projector-screen::before {
+  content: "\F42F";
+}
+.mdi-publish::before {
+  content: "\F6A6";
+}
+.mdi-pulse::before {
+  content: "\F430";
+}
+.mdi-pumpkin::before {
+  content: "\FB9B";
+}
+.mdi-purse::before {
+  content: "\FF39";
+}
+.mdi-purse-outline::before {
+  content: "\FF3A";
+}
+.mdi-puzzle::before {
+  content: "\F431";
+}
+.mdi-puzzle-outline::before {
+  content: "\FA65";
+}
+.mdi-qi::before {
+  content: "\F998";
+}
+.mdi-qqchat::before {
+  content: "\F605";
+}
+.mdi-qrcode::before {
+  content: "\F432";
+}
+.mdi-qrcode-edit::before {
+  content: "\F8B7";
+}
+.mdi-qrcode-scan::before {
+  content: "\F433";
+}
+.mdi-quadcopter::before {
+  content: "\F434";
+}
+.mdi-quality-high::before {
+  content: "\F435";
+}
+.mdi-quality-low::before {
+  content: "\FA0B";
+}
+.mdi-quality-medium::before {
+  content: "\FA0C";
+}
+.mdi-quicktime::before {
+  content: "\F436";
+}
+.mdi-quora::before {
+  content: "\FD05";
+}
+.mdi-rabbit::before {
+  content: "\F906";
+}
+.mdi-racing-helmet::before {
+  content: "\FD6F";
+}
+.mdi-racquetball::before {
+  content: "\FD70";
+}
+.mdi-radar::before {
+  content: "\F437";
+}
+.mdi-radiator::before {
+  content: "\F438";
+}
+.mdi-radiator-disabled::before {
+  content: "\FAD6";
+}
+.mdi-radiator-off::before {
+  content: "\FAD7";
+}
+.mdi-radio::before {
+  content: "\F439";
+}
+.mdi-radio-am::before {
+  content: "\FC9A";
+}
+.mdi-radio-fm::before {
+  content: "\FC9B";
+}
+.mdi-radio-handheld::before {
+  content: "\F43A";
+}
+.mdi-radio-tower::before {
+  content: "\F43B";
+}
+.mdi-radioactive::before {
+  content: "\F43C";
+}
+.mdi-radioactive-off::before {
+  content: "\FEDE";
+}
+.mdi-radiobox-blank::before {
+  content: "\F43D";
+}
+.mdi-radiobox-marked::before {
+  content: "\F43E";
+}
+.mdi-radius::before {
+  content: "\FC9C";
+}
+.mdi-radius-outline::before {
+  content: "\FC9D";
+}
+.mdi-railroad-light::before {
+  content: "\FF3B";
+}
+.mdi-raspberry-pi::before {
+  content: "\F43F";
+}
+.mdi-ray-end::before {
+  content: "\F440";
+}
+.mdi-ray-end-arrow::before {
+  content: "\F441";
+}
+.mdi-ray-start::before {
+  content: "\F442";
+}
+.mdi-ray-start-arrow::before {
+  content: "\F443";
+}
+.mdi-ray-start-end::before {
+  content: "\F444";
+}
+.mdi-ray-vertex::before {
+  content: "\F445";
+}
+.mdi-react::before {
+  content: "\F707";
+}
+.mdi-read::before {
+  content: "\F447";
+}
+.mdi-receipt::before {
+  content: "\F449";
+}
+.mdi-record::before {
+  content: "\F44A";
+}
+.mdi-record-circle::before {
+  content: "\FEDF";
+}
+.mdi-record-circle-outline::before {
+  content: "\FEE0";
+}
+.mdi-record-player::before {
+  content: "\F999";
+}
+.mdi-record-rec::before {
+  content: "\F44B";
+}
+.mdi-rectangle::before {
+  content: "\FE41";
+}
+.mdi-rectangle-outline::before {
+  content: "\FE42";
+}
+.mdi-recycle::before {
+  content: "\F44C";
+}
+.mdi-reddit::before {
+  content: "\F44D";
+}
+.mdi-redo::before {
+  content: "\F44E";
+}
+.mdi-redo-variant::before {
+  content: "\F44F";
+}
+.mdi-reflect-horizontal::before {
+  content: "\FA0D";
+}
+.mdi-reflect-vertical::before {
+  content: "\FA0E";
+}
+.mdi-refresh::before {
+  content: "\F450";
+}
+.mdi-regex::before {
+  content: "\F451";
+}
+.mdi-registered-trademark::before {
+  content: "\FA66";
+}
+.mdi-relative-scale::before {
+  content: "\F452";
+}
+.mdi-reload::before {
+  content: "\F453";
+}
+.mdi-reminder::before {
+  content: "\F88B";
+}
+.mdi-remote::before {
+  content: "\F454";
+}
+.mdi-remote-desktop::before {
+  content: "\F8B8";
+}
+.mdi-remote-off::before {
+  content: "\FEE1";
+}
+.mdi-remote-tv::before {
+  content: "\FEE2";
+}
+.mdi-remote-tv-off::before {
+  content: "\FEE3";
+}
+.mdi-rename-box::before {
+  content: "\F455";
+}
+.mdi-reorder-horizontal::before {
+  content: "\F687";
+}
+.mdi-reorder-vertical::before {
+  content: "\F688";
+}
+.mdi-repeat::before {
+  content: "\F456";
+}
+.mdi-repeat-off::before {
+  content: "\F457";
+}
+.mdi-repeat-once::before {
+  content: "\F458";
+}
+.mdi-replay::before {
+  content: "\F459";
+}
+.mdi-reply::before {
+  content: "\F45A";
+}
+.mdi-reply-all::before {
+  content: "\F45B";
+}
+.mdi-reply-all-outline::before {
+  content: "\FF3C";
+}
+.mdi-reply-outline::before {
+  content: "\FF3D";
+}
+.mdi-reproduction::before {
+  content: "\F45C";
+}
+.mdi-resistor::before {
+  content: "\FB1F";
+}
+.mdi-resistor-nodes::before {
+  content: "\FB20";
+}
+.mdi-resize::before {
+  content: "\FA67";
+}
+.mdi-resize-bottom-right::before {
+  content: "\F45D";
+}
+.mdi-responsive::before {
+  content: "\F45E";
+}
+.mdi-restart::before {
+  content: "\F708";
+}
+.mdi-restart-off::before {
+  content: "\FD71";
+}
+.mdi-restore::before {
+  content: "\F99A";
+}
+.mdi-restore-clock::before {
+  content: "\F6A7";
+}
+.mdi-rewind::before {
+  content: "\F45F";
+}
+.mdi-rewind-10::before {
+  content: "\FD06";
+}
+.mdi-rewind-30::before {
+  content: "\FD72";
+}
+.mdi-rewind-outline::before {
+  content: "\F709";
+}
+.mdi-rhombus::before {
+  content: "\F70A";
+}
+.mdi-rhombus-medium::before {
+  content: "\FA0F";
+}
+.mdi-rhombus-outline::before {
+  content: "\F70B";
+}
+.mdi-rhombus-split::before {
+  content: "\FA10";
+}
+.mdi-ribbon::before {
+  content: "\F460";
+}
+.mdi-rice::before {
+  content: "\F7E9";
+}
+.mdi-ring::before {
+  content: "\F7EA";
+}
+.mdi-rivet::before {
+  content: "\FE43";
+}
+.mdi-road::before {
+  content: "\F461";
+}
+.mdi-road-variant::before {
+  content: "\F462";
+}
+.mdi-robot::before {
+  content: "\F6A8";
+}
+.mdi-robot-industrial::before {
+  content: "\FB21";
+}
+.mdi-robot-vacuum::before {
+  content: "\F70C";
+}
+.mdi-robot-vacuum-variant::before {
+  content: "\F907";
+}
+.mdi-rocket::before {
+  content: "\F463";
+}
+.mdi-roller-skate::before {
+  content: "\FD07";
+}
+.mdi-rollerblade::before {
+  content: "\FD08";
+}
+.mdi-rollupjs::before {
+  content: "\FB9C";
+}
+.mdi-room-service::before {
+  content: "\F88C";
+}
+.mdi-room-service-outline::before {
+  content: "\FD73";
+}
+.mdi-rotate-3d::before {
+  content: "\FEE4";
+}
+.mdi-rotate-3d-variant::before {
+  content: "\F464";
+}
+.mdi-rotate-left::before {
+  content: "\F465";
+}
+.mdi-rotate-left-variant::before {
+  content: "\F466";
+}
+.mdi-rotate-orbit::before {
+  content: "\FD74";
+}
+.mdi-rotate-right::before {
+  content: "\F467";
+}
+.mdi-rotate-right-variant::before {
+  content: "\F468";
+}
+.mdi-rounded-corner::before {
+  content: "\F607";
+}
+.mdi-router-wireless::before {
+  content: "\F469";
+}
+.mdi-router-wireless-settings::before {
+  content: "\FA68";
+}
+.mdi-routes::before {
+  content: "\F46A";
+}
+.mdi-rowing::before {
+  content: "\F608";
+}
+.mdi-rss::before {
+  content: "\F46B";
+}
+.mdi-rss-box::before {
+  content: "\F46C";
+}
+.mdi-rss-off::before {
+  content: "\FF3E";
+}
+.mdi-ruby::before {
+  content: "\FD09";
+}
+.mdi-rugby::before {
+  content: "\FD75";
+}
+.mdi-ruler::before {
+  content: "\F46D";
+}
+.mdi-ruler-square::before {
+  content: "\FC9E";
+}
+.mdi-run::before {
+  content: "\F70D";
+}
+.mdi-run-fast::before {
+  content: "\F46E";
+}
+.mdi-sack::before {
+  content: "\FD0A";
+}
+.mdi-sack-percent::before {
+  content: "\FD0B";
+}
+.mdi-safe::before {
+  content: "\FA69";
+}
+.mdi-safety-goggles::before {
+  content: "\FD0C";
+}
+.mdi-sailing::before {
+  content: "\FEE5";
+}
+.mdi-sale::before {
+  content: "\F46F";
+}
+.mdi-salesforce::before {
+  content: "\F88D";
+}
+.mdi-sass::before {
+  content: "\F7EB";
+}
+.mdi-satellite::before {
+  content: "\F470";
+}
+.mdi-satellite-uplink::before {
+  content: "\F908";
+}
+.mdi-satellite-variant::before {
+  content: "\F471";
+}
+.mdi-sausage::before {
+  content: "\F8B9";
+}
+.mdi-saw-blade::before {
+  content: "\FE44";
+}
+.mdi-saxophone::before {
+  content: "\F609";
+}
+.mdi-scale::before {
+  content: "\F472";
+}
+.mdi-scale-balance::before {
+  content: "\F5D1";
+}
+.mdi-scale-bathroom::before {
+  content: "\F473";
+}
+.mdi-scanner::before {
+  content: "\F6AA";
+}
+.mdi-scanner-off::before {
+  content: "\F909";
+}
+.mdi-scatter-plot::before {
+  content: "\FEE6";
+}
+.mdi-scatter-plot-outline::before {
+  content: "\FEE7";
+}
+.mdi-school::before {
+  content: "\F474";
+}
+.mdi-scissors-cutting::before {
+  content: "\FA6A";
+}
+.mdi-screen-rotation::before {
+  content: "\F475";
+}
+.mdi-screen-rotation-lock::before {
+  content: "\F476";
+}
+.mdi-screw-flat-top::before {
+  content: "\FDCF";
+}
+.mdi-screw-lag::before {
+  content: "\FE54";
+}
+.mdi-screw-machine-flat-top::before {
+  content: "\FE55";
+}
+.mdi-screw-machine-round-top::before {
+  content: "\FE56";
+}
+.mdi-screw-round-top::before {
+  content: "\FE57";
+}
+.mdi-screwdriver::before {
+  content: "\F477";
+}
+.mdi-script::before {
+  content: "\FB9D";
+}
+.mdi-script-outline::before {
+  content: "\F478";
+}
+.mdi-script-text::before {
+  content: "\FB9E";
+}
+.mdi-script-text-outline::before {
+  content: "\FB9F";
+}
+.mdi-sd::before {
+  content: "\F479";
+}
+.mdi-seal::before {
+  content: "\F47A";
+}
+.mdi-search-web::before {
+  content: "\F70E";
+}
+.mdi-seat::before {
+  content: "\FC9F";
+}
+.mdi-seat-flat::before {
+  content: "\F47B";
+}
+.mdi-seat-flat-angled::before {
+  content: "\F47C";
+}
+.mdi-seat-individual-suite::before {
+  content: "\F47D";
+}
+.mdi-seat-legroom-extra::before {
+  content: "\F47E";
+}
+.mdi-seat-legroom-normal::before {
+  content: "\F47F";
+}
+.mdi-seat-legroom-reduced::before {
+  content: "\F480";
+}
+.mdi-seat-outline::before {
+  content: "\FCA0";
+}
+.mdi-seat-recline-extra::before {
+  content: "\F481";
+}
+.mdi-seat-recline-normal::before {
+  content: "\F482";
+}
+.mdi-seatbelt::before {
+  content: "\FCA1";
+}
+.mdi-security::before {
+  content: "\F483";
+}
+.mdi-security-network::before {
+  content: "\F484";
+}
+.mdi-seed::before {
+  content: "\FE45";
+}
+.mdi-seed-outline::before {
+  content: "\FE46";
+}
+.mdi-segment::before {
+  content: "\FEE8";
+}
+.mdi-select::before {
+  content: "\F485";
+}
+.mdi-select-all::before {
+  content: "\F486";
+}
+.mdi-select-color::before {
+  content: "\FD0D";
+}
+.mdi-select-compare::before {
+  content: "\FAD8";
+}
+.mdi-select-drag::before {
+  content: "\FA6B";
+}
+.mdi-select-group::before {
+  content: "\FF9F";
+}
+.mdi-select-inverse::before {
+  content: "\F487";
+}
+.mdi-select-off::before {
+  content: "\F488";
+}
+.mdi-selection::before {
+  content: "\F489";
+}
+.mdi-selection-drag::before {
+  content: "\FA6C";
+}
+.mdi-selection-ellipse::before {
+  content: "\FD0E";
+}
+.mdi-selection-ellipse-arrow-inside::before {
+  content: "\FF3F";
+}
+.mdi-selection-off::before {
+  content: "\F776";
+}
+.mdi-send::before {
+  content: "\F48A";
+}
+.mdi-send-circle::before {
+  content: "\FE58";
+}
+.mdi-send-circle-outline::before {
+  content: "\FE59";
+}
+.mdi-send-lock::before {
+  content: "\F7EC";
+}
+.mdi-serial-port::before {
+  content: "\F65C";
+}
+.mdi-server::before {
+  content: "\F48B";
+}
+.mdi-server-minus::before {
+  content: "\F48C";
+}
+.mdi-server-network::before {
+  content: "\F48D";
+}
+.mdi-server-network-off::before {
+  content: "\F48E";
+}
+.mdi-server-off::before {
+  content: "\F48F";
+}
+.mdi-server-plus::before {
+  content: "\F490";
+}
+.mdi-server-remove::before {
+  content: "\F491";
+}
+.mdi-server-security::before {
+  content: "\F492";
+}
+.mdi-set-all::before {
+  content: "\F777";
+}
+.mdi-set-center::before {
+  content: "\F778";
+}
+.mdi-set-center-right::before {
+  content: "\F779";
+}
+.mdi-set-left::before {
+  content: "\F77A";
+}
+.mdi-set-left-center::before {
+  content: "\F77B";
+}
+.mdi-set-left-right::before {
+  content: "\F77C";
+}
+.mdi-set-none::before {
+  content: "\F77D";
+}
+.mdi-set-right::before {
+  content: "\F77E";
+}
+.mdi-set-top-box::before {
+  content: "\F99E";
+}
+.mdi-settings::before {
+  content: "\F493";
+}
+.mdi-settings-box::before {
+  content: "\F494";
+}
+.mdi-settings-helper::before {
+  content: "\FA6D";
+}
+.mdi-settings-outline::before {
+  content: "\F8BA";
+}
+.mdi-shape::before {
+  content: "\F830";
+}
+.mdi-shape-circle-plus::before {
+  content: "\F65D";
+}
+.mdi-shape-outline::before {
+  content: "\F831";
+}
+.mdi-shape-plus::before {
+  content: "\F495";
+}
+.mdi-shape-polygon-plus::before {
+  content: "\F65E";
+}
+.mdi-shape-rectangle-plus::before {
+  content: "\F65F";
+}
+.mdi-shape-square-plus::before {
+  content: "\F660";
+}
+.mdi-share::before {
+  content: "\F496";
+}
+.mdi-share-off::before {
+  content: "\FF40";
+}
+.mdi-share-off-outline::before {
+  content: "\FF41";
+}
+.mdi-share-outline::before {
+  content: "\F931";
+}
+.mdi-share-variant::before {
+  content: "\F497";
+}
+.mdi-sheep::before {
+  content: "\FCA2";
+}
+.mdi-shield::before {
+  content: "\F498";
+}
+.mdi-shield-account::before {
+  content: "\F88E";
+}
+.mdi-shield-account-outline::before {
+  content: "\FA11";
+}
+.mdi-shield-airplane::before {
+  content: "\F6BA";
+}
+.mdi-shield-airplane-outline::before {
+  content: "\FCA3";
+}
+.mdi-shield-alert::before {
+  content: "\FEE9";
+}
+.mdi-shield-alert-outline::before {
+  content: "\FEEA";
+}
+.mdi-shield-car::before {
+  content: "\FFA0";
+}
+.mdi-shield-check::before {
+  content: "\F565";
+}
+.mdi-shield-check-outline::before {
+  content: "\FCA4";
+}
+.mdi-shield-cross::before {
+  content: "\FCA5";
+}
+.mdi-shield-cross-outline::before {
+  content: "\FCA6";
+}
+.mdi-shield-half-full::before {
+  content: "\F77F";
+}
+.mdi-shield-home::before {
+  content: "\F689";
+}
+.mdi-shield-home-outline::before {
+  content: "\FCA7";
+}
+.mdi-shield-key::before {
+  content: "\FBA0";
+}
+.mdi-shield-key-outline::before {
+  content: "\FBA1";
+}
+.mdi-shield-link-variant::before {
+  content: "\FD0F";
+}
+.mdi-shield-link-variant-outline::before {
+  content: "\FD10";
+}
+.mdi-shield-lock::before {
+  content: "\F99C";
+}
+.mdi-shield-lock-outline::before {
+  content: "\FCA8";
+}
+.mdi-shield-off::before {
+  content: "\F99D";
+}
+.mdi-shield-off-outline::before {
+  content: "\F99B";
+}
+.mdi-shield-outline::before {
+  content: "\F499";
+}
+.mdi-shield-plus::before {
+  content: "\FAD9";
+}
+.mdi-shield-plus-outline::before {
+  content: "\FADA";
+}
+.mdi-shield-remove::before {
+  content: "\FADB";
+}
+.mdi-shield-remove-outline::before {
+  content: "\FADC";
+}
+.mdi-shield-search::before {
+  content: "\FD76";
+}
+.mdi-ship-wheel::before {
+  content: "\F832";
+}
+.mdi-shoe-formal::before {
+  content: "\FB22";
+}
+.mdi-shoe-heel::before {
+  content: "\FB23";
+}
+.mdi-shoe-print::before {
+  content: "\FE5A";
+}
+.mdi-shopify::before {
+  content: "\FADD";
+}
+.mdi-shopping::before {
+  content: "\F49A";
+}
+.mdi-shopping-music::before {
+  content: "\F49B";
+}
+.mdi-shopping-search::before {
+  content: "\FFA1";
+}
+.mdi-shovel::before {
+  content: "\F70F";
+}
+.mdi-shovel-off::before {
+  content: "\F710";
+}
+.mdi-shower::before {
+  content: "\F99F";
+}
+.mdi-shower-head::before {
+  content: "\F9A0";
+}
+.mdi-shredder::before {
+  content: "\F49C";
+}
+.mdi-shuffle::before {
+  content: "\F49D";
+}
+.mdi-shuffle-disabled::before {
+  content: "\F49E";
+}
+.mdi-shuffle-variant::before {
+  content: "\F49F";
+}
+.mdi-sigma::before {
+  content: "\F4A0";
+}
+.mdi-sigma-lower::before {
+  content: "\F62B";
+}
+.mdi-sign-caution::before {
+  content: "\F4A1";
+}
+.mdi-sign-direction::before {
+  content: "\F780";
+}
+.mdi-sign-text::before {
+  content: "\F781";
+}
+.mdi-signal::before {
+  content: "\F4A2";
+}
+.mdi-signal-2g::before {
+  content: "\F711";
+}
+.mdi-signal-3g::before {
+  content: "\F712";
+}
+.mdi-signal-4g::before {
+  content: "\F713";
+}
+.mdi-signal-5g::before {
+  content: "\FA6E";
+}
+.mdi-signal-cellular-1::before {
+  content: "\F8BB";
+}
+.mdi-signal-cellular-2::before {
+  content: "\F8BC";
+}
+.mdi-signal-cellular-3::before {
+  content: "\F8BD";
+}
+.mdi-signal-cellular-outline::before {
+  content: "\F8BE";
+}
+.mdi-signal-distance-variant::before {
+  content: "\FE47";
+}
+.mdi-signal-hspa::before {
+  content: "\F714";
+}
+.mdi-signal-hspa-plus::before {
+  content: "\F715";
+}
+.mdi-signal-off::before {
+  content: "\F782";
+}
+.mdi-signal-variant::before {
+  content: "\F60A";
+}
+.mdi-signature::before {
+  content: "\FE5B";
+}
+.mdi-signature-freehand::before {
+  content: "\FE5C";
+}
+.mdi-signature-image::before {
+  content: "\FE5D";
+}
+.mdi-signature-text::before {
+  content: "\FE5E";
+}
+.mdi-silo::before {
+  content: "\FB24";
+}
+.mdi-silverware::before {
+  content: "\F4A3";
+}
+.mdi-silverware-fork::before {
+  content: "\F4A4";
+}
+.mdi-silverware-fork-knife::before {
+  content: "\FA6F";
+}
+.mdi-silverware-spoon::before {
+  content: "\F4A5";
+}
+.mdi-silverware-variant::before {
+  content: "\F4A6";
+}
+.mdi-sim::before {
+  content: "\F4A7";
+}
+.mdi-sim-alert::before {
+  content: "\F4A8";
+}
+.mdi-sim-off::before {
+  content: "\F4A9";
+}
+.mdi-sina-weibo::before {
+  content: "\FADE";
+}
+.mdi-sitemap::before {
+  content: "\F4AA";
+}
+.mdi-skate::before {
+  content: "\FD11";
+}
+.mdi-skew-less::before {
+  content: "\FD12";
+}
+.mdi-skew-more::before {
+  content: "\FD13";
+}
+.mdi-skip-backward::before {
+  content: "\F4AB";
+}
+.mdi-skip-backward-outline::before {
+  content: "\FF42";
+}
+.mdi-skip-forward::before {
+  content: "\F4AC";
+}
+.mdi-skip-forward-outline::before {
+  content: "\FF43";
+}
+.mdi-skip-next::before {
+  content: "\F4AD";
+}
+.mdi-skip-next-circle::before {
+  content: "\F661";
+}
+.mdi-skip-next-circle-outline::before {
+  content: "\F662";
+}
+.mdi-skip-next-outline::before {
+  content: "\FF44";
+}
+.mdi-skip-previous::before {
+  content: "\F4AE";
+}
+.mdi-skip-previous-circle::before {
+  content: "\F663";
+}
+.mdi-skip-previous-circle-outline::before {
+  content: "\F664";
+}
+.mdi-skip-previous-outline::before {
+  content: "\FF45";
+}
+.mdi-skull::before {
+  content: "\F68B";
+}
+.mdi-skull-crossbones::before {
+  content: "\FBA2";
+}
+.mdi-skull-crossbones-outline::before {
+  content: "\FBA3";
+}
+.mdi-skull-outline::before {
+  content: "\FBA4";
+}
+.mdi-skype::before {
+  content: "\F4AF";
+}
+.mdi-skype-business::before {
+  content: "\F4B0";
+}
+.mdi-slack::before {
+  content: "\F4B1";
+}
+.mdi-slackware::before {
+  content: "\F90A";
+}
+.mdi-sleep::before {
+  content: "\F4B2";
+}
+.mdi-sleep-off::before {
+  content: "\F4B3";
+}
+.mdi-slope-downhill::before {
+  content: "\FE5F";
+}
+.mdi-slope-uphill::before {
+  content: "\FE60";
+}
+.mdi-smog::before {
+  content: "\FA70";
+}
+.mdi-smoke-detector::before {
+  content: "\F392";
+}
+.mdi-smoking::before {
+  content: "\F4B4";
+}
+.mdi-smoking-off::before {
+  content: "\F4B5";
+}
+.mdi-snapchat::before {
+  content: "\F4B6";
+}
+.mdi-snowflake::before {
+  content: "\F716";
+}
+.mdi-snowflake-alert::before {
+  content: "\FF46";
+}
+.mdi-snowflake-variant::before {
+  content: "\FF47";
+}
+.mdi-snowman::before {
+  content: "\F4B7";
+}
+.mdi-soccer::before {
+  content: "\F4B8";
+}
+.mdi-soccer-field::before {
+  content: "\F833";
+}
+.mdi-sofa::before {
+  content: "\F4B9";
+}
+.mdi-solar-panel::before {
+  content: "\FD77";
+}
+.mdi-solar-panel-large::before {
+  content: "\FD78";
+}
+.mdi-solar-power::before {
+  content: "\FA71";
+}
+.mdi-solid::before {
+  content: "\F68C";
+}
+.mdi-sort::before {
+  content: "\F4BA";
+}
+.mdi-sort-alphabetical::before {
+  content: "\F4BB";
+}
+.mdi-sort-ascending::before {
+  content: "\F4BC";
+}
+.mdi-sort-descending::before {
+  content: "\F4BD";
+}
+.mdi-sort-numeric::before {
+  content: "\F4BE";
+}
+.mdi-sort-variant::before {
+  content: "\F4BF";
+}
+.mdi-sort-variant-lock::before {
+  content: "\FCA9";
+}
+.mdi-sort-variant-lock-open::before {
+  content: "\FCAA";
+}
+.mdi-soundcloud::before {
+  content: "\F4C0";
+}
+.mdi-source-branch::before {
+  content: "\F62C";
+}
+.mdi-source-commit::before {
+  content: "\F717";
+}
+.mdi-source-commit-end::before {
+  content: "\F718";
+}
+.mdi-source-commit-end-local::before {
+  content: "\F719";
+}
+.mdi-source-commit-local::before {
+  content: "\F71A";
+}
+.mdi-source-commit-next-local::before {
+  content: "\F71B";
+}
+.mdi-source-commit-start::before {
+  content: "\F71C";
+}
+.mdi-source-commit-start-next-local::before {
+  content: "\F71D";
+}
+.mdi-source-fork::before {
+  content: "\F4C1";
+}
+.mdi-source-merge::before {
+  content: "\F62D";
+}
+.mdi-source-pull::before {
+  content: "\F4C2";
+}
+.mdi-source-repository::before {
+  content: "\FCAB";
+}
+.mdi-source-repository-multiple::before {
+  content: "\FCAC";
+}
+.mdi-soy-sauce::before {
+  content: "\F7ED";
+}
+.mdi-spa::before {
+  content: "\FCAD";
+}
+.mdi-spa-outline::before {
+  content: "\FCAE";
+}
+.mdi-space-invaders::before {
+  content: "\FBA5";
+}
+.mdi-spade::before {
+  content: "\FE48";
+}
+.mdi-speaker::before {
+  content: "\F4C3";
+}
+.mdi-speaker-bluetooth::before {
+  content: "\F9A1";
+}
+.mdi-speaker-multiple::before {
+  content: "\FD14";
+}
+.mdi-speaker-off::before {
+  content: "\F4C4";
+}
+.mdi-speaker-wireless::before {
+  content: "\F71E";
+}
+.mdi-speedometer::before {
+  content: "\F4C5";
+}
+.mdi-speedometer-medium::before {
+  content: "\FFA2";
+}
+.mdi-speedometer-slow::before {
+  content: "\FFA3";
+}
+.mdi-spellcheck::before {
+  content: "\F4C6";
+}
+.mdi-spider-web::before {
+  content: "\FBA6";
+}
+.mdi-spotify::before {
+  content: "\F4C7";
+}
+.mdi-spotlight::before {
+  content: "\F4C8";
+}
+.mdi-spotlight-beam::before {
+  content: "\F4C9";
+}
+.mdi-spray::before {
+  content: "\F665";
+}
+.mdi-spray-bottle::before {
+  content: "\FADF";
+}
+.mdi-sprout::before {
+  content: "\FE49";
+}
+.mdi-sprout-outline::before {
+  content: "\FE4A";
+}
+.mdi-square::before {
+  content: "\F763";
+}
+.mdi-square-edit-outline::before {
+  content: "\F90B";
+}
+.mdi-square-inc::before {
+  content: "\F4CA";
+}
+.mdi-square-inc-cash::before {
+  content: "\F4CB";
+}
+.mdi-square-medium::before {
+  content: "\FA12";
+}
+.mdi-square-medium-outline::before {
+  content: "\FA13";
+}
+.mdi-square-outline::before {
+  content: "\F762";
+}
+.mdi-square-root::before {
+  content: "\F783";
+}
+.mdi-square-root-box::before {
+  content: "\F9A2";
+}
+.mdi-square-small::before {
+  content: "\FA14";
+}
+.mdi-squeegee::before {
+  content: "\FAE0";
+}
+.mdi-ssh::before {
+  content: "\F8BF";
+}
+.mdi-stack-exchange::before {
+  content: "\F60B";
+}
+.mdi-stack-overflow::before {
+  content: "\F4CC";
+}
+.mdi-stadium::before {
+  content: "\F71F";
+}
+.mdi-stairs::before {
+  content: "\F4CD";
+}
+.mdi-stamper::before {
+  content: "\FD15";
+}
+.mdi-standard-definition::before {
+  content: "\F7EE";
+}
+.mdi-star::before {
+  content: "\F4CE";
+}
+.mdi-star-box::before {
+  content: "\FA72";
+}
+.mdi-star-box-outline::before {
+  content: "\FA73";
+}
+.mdi-star-circle::before {
+  content: "\F4CF";
+}
+.mdi-star-circle-outline::before {
+  content: "\F9A3";
+}
+.mdi-star-face::before {
+  content: "\F9A4";
+}
+.mdi-star-four-points::before {
+  content: "\FAE1";
+}
+.mdi-star-four-points-outline::before {
+  content: "\FAE2";
+}
+.mdi-star-half::before {
+  content: "\F4D0";
+}
+.mdi-star-off::before {
+  content: "\F4D1";
+}
+.mdi-star-outline::before {
+  content: "\F4D2";
+}
+.mdi-star-three-points::before {
+  content: "\FAE3";
+}
+.mdi-star-three-points-outline::before {
+  content: "\FAE4";
+}
+.mdi-steam::before {
+  content: "\F4D3";
+}
+.mdi-steam-box::before {
+  content: "\F90C";
+}
+.mdi-steering::before {
+  content: "\F4D4";
+}
+.mdi-steering-off::before {
+  content: "\F90D";
+}
+.mdi-step-backward::before {
+  content: "\F4D5";
+}
+.mdi-step-backward-2::before {
+  content: "\F4D6";
+}
+.mdi-step-forward::before {
+  content: "\F4D7";
+}
+.mdi-step-forward-2::before {
+  content: "\F4D8";
+}
+.mdi-stethoscope::before {
+  content: "\F4D9";
+}
+.mdi-sticker::before {
+  content: "\F5D0";
+}
+.mdi-sticker-emoji::before {
+  content: "\F784";
+}
+.mdi-stocking::before {
+  content: "\F4DA";
+}
+.mdi-stop::before {
+  content: "\F4DB";
+}
+.mdi-stop-circle::before {
+  content: "\F666";
+}
+.mdi-stop-circle-outline::before {
+  content: "\F667";
+}
+.mdi-store::before {
+  content: "\F4DC";
+}
+.mdi-store-24-hour::before {
+  content: "\F4DD";
+}
+.mdi-stove::before {
+  content: "\F4DE";
+}
+.mdi-strava::before {
+  content: "\FB25";
+}
+.mdi-stretch-to-page::before {
+  content: "\FF48";
+}
+.mdi-stretch-to-page-outline::before {
+  content: "\FF49";
+}
+.mdi-subdirectory-arrow-left::before {
+  content: "\F60C";
+}
+.mdi-subdirectory-arrow-right::before {
+  content: "\F60D";
+}
+.mdi-subtitles::before {
+  content: "\FA15";
+}
+.mdi-subtitles-outline::before {
+  content: "\FA16";
+}
+.mdi-subway::before {
+  content: "\F6AB";
+}
+.mdi-subway-alert-variant::before {
+  content: "\FD79";
+}
+.mdi-subway-variant::before {
+  content: "\F4DF";
+}
+.mdi-summit::before {
+  content: "\F785";
+}
+.mdi-sunglasses::before {
+  content: "\F4E0";
+}
+.mdi-surround-sound::before {
+  content: "\F5C5";
+}
+.mdi-surround-sound-2-0::before {
+  content: "\F7EF";
+}
+.mdi-surround-sound-3-1::before {
+  content: "\F7F0";
+}
+.mdi-surround-sound-5-1::before {
+  content: "\F7F1";
+}
+.mdi-surround-sound-7-1::before {
+  content: "\F7F2";
+}
+.mdi-svg::before {
+  content: "\F720";
+}
+.mdi-swap-horizontal::before {
+  content: "\F4E1";
+}
+.mdi-swap-horizontal-bold::before {
+  content: "\FBA9";
+}
+.mdi-swap-horizontal-variant::before {
+  content: "\F8C0";
+}
+.mdi-swap-vertical::before {
+  content: "\F4E2";
+}
+.mdi-swap-vertical-bold::before {
+  content: "\FBAA";
+}
+.mdi-swap-vertical-variant::before {
+  content: "\F8C1";
+}
+.mdi-swim::before {
+  content: "\F4E3";
+}
+.mdi-switch::before {
+  content: "\F4E4";
+}
+.mdi-sword::before {
+  content: "\F4E5";
+}
+.mdi-sword-cross::before {
+  content: "\F786";
+}
+.mdi-symfony::before {
+  content: "\FAE5";
+}
+.mdi-sync::before {
+  content: "\F4E6";
+}
+.mdi-sync-alert::before {
+  content: "\F4E7";
+}
+.mdi-sync-off::before {
+  content: "\F4E8";
+}
+.mdi-tab::before {
+  content: "\F4E9";
+}
+.mdi-tab-minus::before {
+  content: "\FB26";
+}
+.mdi-tab-plus::before {
+  content: "\F75B";
+}
+.mdi-tab-remove::before {
+  content: "\FB27";
+}
+.mdi-tab-unselected::before {
+  content: "\F4EA";
+}
+.mdi-table::before {
+  content: "\F4EB";
+}
+.mdi-table-border::before {
+  content: "\FA17";
+}
+.mdi-table-column::before {
+  content: "\F834";
+}
+.mdi-table-column-plus-after::before {
+  content: "\F4EC";
+}
+.mdi-table-column-plus-before::before {
+  content: "\F4ED";
+}
+.mdi-table-column-remove::before {
+  content: "\F4EE";
+}
+.mdi-table-column-width::before {
+  content: "\F4EF";
+}
+.mdi-table-edit::before {
+  content: "\F4F0";
+}
+.mdi-table-large::before {
+  content: "\F4F1";
+}
+.mdi-table-large-plus::before {
+  content: "\FFA4";
+}
+.mdi-table-large-remove::before {
+  content: "\FFA5";
+}
+.mdi-table-merge-cells::before {
+  content: "\F9A5";
+}
+.mdi-table-of-contents::before {
+  content: "\F835";
+}
+.mdi-table-plus::before {
+  content: "\FA74";
+}
+.mdi-table-remove::before {
+  content: "\FA75";
+}
+.mdi-table-row::before {
+  content: "\F836";
+}
+.mdi-table-row-height::before {
+  content: "\F4F2";
+}
+.mdi-table-row-plus-after::before {
+  content: "\F4F3";
+}
+.mdi-table-row-plus-before::before {
+  content: "\F4F4";
+}
+.mdi-table-row-remove::before {
+  content: "\F4F5";
+}
+.mdi-table-search::before {
+  content: "\F90E";
+}
+.mdi-table-settings::before {
+  content: "\F837";
+}
+.mdi-table-tennis::before {
+  content: "\FE4B";
+}
+.mdi-tablet::before {
+  content: "\F4F6";
+}
+.mdi-tablet-android::before {
+  content: "\F4F7";
+}
+.mdi-tablet-cellphone::before {
+  content: "\F9A6";
+}
+.mdi-tablet-dashboard::before {
+  content: "\FEEB";
+}
+.mdi-tablet-ipad::before {
+  content: "\F4F8";
+}
+.mdi-taco::before {
+  content: "\F761";
+}
+.mdi-tag::before {
+  content: "\F4F9";
+}
+.mdi-tag-faces::before {
+  content: "\F4FA";
+}
+.mdi-tag-heart::before {
+  content: "\F68A";
+}
+.mdi-tag-heart-outline::before {
+  content: "\FBAB";
+}
+.mdi-tag-minus::before {
+  content: "\F90F";
+}
+.mdi-tag-multiple::before {
+  content: "\F4FB";
+}
+.mdi-tag-outline::before {
+  content: "\F4FC";
+}
+.mdi-tag-plus::before {
+  content: "\F721";
+}
+.mdi-tag-remove::before {
+  content: "\F722";
+}
+.mdi-tag-text-outline::before {
+  content: "\F4FD";
+}
+.mdi-tank::before {
+  content: "\FD16";
+}
+.mdi-tape-measure::before {
+  content: "\FB28";
+}
+.mdi-target::before {
+  content: "\F4FE";
+}
+.mdi-target-account::before {
+  content: "\FBAC";
+}
+.mdi-target-variant::before {
+  content: "\FA76";
+}
+.mdi-taxi::before {
+  content: "\F4FF";
+}
+.mdi-tea::before {
+  content: "\FD7A";
+}
+.mdi-tea-outline::before {
+  content: "\FD7B";
+}
+.mdi-teach::before {
+  content: "\F88F";
+}
+.mdi-teamviewer::before {
+  content: "\F500";
+}
+.mdi-telegram::before {
+  content: "\F501";
+}
+.mdi-telescope::before {
+  content: "\FB29";
+}
+.mdi-television::before {
+  content: "\F502";
+}
+.mdi-television-box::before {
+  content: "\F838";
+}
+.mdi-television-classic::before {
+  content: "\F7F3";
+}
+.mdi-television-classic-off::before {
+  content: "\F839";
+}
+.mdi-television-guide::before {
+  content: "\F503";
+}
+.mdi-television-off::before {
+  content: "\F83A";
+}
+.mdi-television-pause::before {
+  content: "\FFA6";
+}
+.mdi-television-play::before {
+  content: "\FEEC";
+}
+.mdi-television-stop::before {
+  content: "\FFA7";
+}
+.mdi-temperature-celsius::before {
+  content: "\F504";
+}
+.mdi-temperature-fahrenheit::before {
+  content: "\F505";
+}
+.mdi-temperature-kelvin::before {
+  content: "\F506";
+}
+.mdi-tennis::before {
+  content: "\FD7C";
+}
+.mdi-tennis-ball::before {
+  content: "\F507";
+}
+.mdi-tent::before {
+  content: "\F508";
+}
+.mdi-terrain::before {
+  content: "\F509";
+}
+.mdi-test-tube::before {
+  content: "\F668";
+}
+.mdi-test-tube-empty::before {
+  content: "\F910";
+}
+.mdi-test-tube-off::before {
+  content: "\F911";
+}
+.mdi-text::before {
+  content: "\F9A7";
+}
+.mdi-text-shadow::before {
+  content: "\F669";
+}
+.mdi-text-short::before {
+  content: "\F9A8";
+}
+.mdi-text-subject::before {
+  content: "\F9A9";
+}
+.mdi-text-to-speech::before {
+  content: "\F50A";
+}
+.mdi-text-to-speech-off::before {
+  content: "\F50B";
+}
+.mdi-textbox::before {
+  content: "\F60E";
+}
+.mdi-textbox-password::before {
+  content: "\F7F4";
+}
+.mdi-texture::before {
+  content: "\F50C";
+}
+.mdi-theater::before {
+  content: "\F50D";
+}
+.mdi-theme-light-dark::before {
+  content: "\F50E";
+}
+.mdi-thermometer::before {
+  content: "\F50F";
+}
+.mdi-thermometer-alert::before {
+  content: "\FE61";
+}
+.mdi-thermometer-chevron-down::before {
+  content: "\FE62";
+}
+.mdi-thermometer-chevron-up::before {
+  content: "\FE63";
+}
+.mdi-thermometer-lines::before {
+  content: "\F510";
+}
+.mdi-thermometer-minus::before {
+  content: "\FE64";
+}
+.mdi-thermometer-plus::before {
+  content: "\FE65";
+}
+.mdi-thermostat::before {
+  content: "\F393";
+}
+.mdi-thermostat-box::before {
+  content: "\F890";
+}
+.mdi-thought-bubble::before {
+  content: "\F7F5";
+}
+.mdi-thought-bubble-outline::before {
+  content: "\F7F6";
+}
+.mdi-thumb-down::before {
+  content: "\F511";
+}
+.mdi-thumb-down-outline::before {
+  content: "\F512";
+}
+.mdi-thumb-up::before {
+  content: "\F513";
+}
+.mdi-thumb-up-outline::before {
+  content: "\F514";
+}
+.mdi-thumbs-up-down::before {
+  content: "\F515";
+}
+.mdi-ticket::before {
+  content: "\F516";
+}
+.mdi-ticket-account::before {
+  content: "\F517";
+}
+.mdi-ticket-confirmation::before {
+  content: "\F518";
+}
+.mdi-ticket-outline::before {
+  content: "\F912";
+}
+.mdi-ticket-percent::before {
+  content: "\F723";
+}
+.mdi-tie::before {
+  content: "\F519";
+}
+.mdi-tilde::before {
+  content: "\F724";
+}
+.mdi-timelapse::before {
+  content: "\F51A";
+}
+.mdi-timeline::before {
+  content: "\FBAD";
+}
+.mdi-timeline-alert::before {
+  content: "\FFB2";
+}
+.mdi-timeline-alert-outline::before {
+  content: "\FFB5";
+}
+.mdi-timeline-help::before {
+  content: "\FFB6";
+}
+.mdi-timeline-help-outline::before {
+  content: "\FFB7";
+}
+.mdi-timeline-outline::before {
+  content: "\FBAE";
+}
+.mdi-timeline-plus::before {
+  content: "\FFB3";
+}
+.mdi-timeline-plus-outline::before {
+  content: "\FFB4";
+}
+.mdi-timeline-text::before {
+  content: "\FBAF";
+}
+.mdi-timeline-text-outline::before {
+  content: "\FBB0";
+}
+.mdi-timer::before {
+  content: "\F51B";
+}
+.mdi-timer-10::before {
+  content: "\F51C";
+}
+.mdi-timer-3::before {
+  content: "\F51D";
+}
+.mdi-timer-off::before {
+  content: "\F51E";
+}
+.mdi-timer-sand::before {
+  content: "\F51F";
+}
+.mdi-timer-sand-empty::before {
+  content: "\F6AC";
+}
+.mdi-timer-sand-full::before {
+  content: "\F78B";
+}
+.mdi-timetable::before {
+  content: "\F520";
+}
+.mdi-toaster-oven::before {
+  content: "\FCAF";
+}
+.mdi-toggle-switch::before {
+  content: "\F521";
+}
+.mdi-toggle-switch-off::before {
+  content: "\F522";
+}
+.mdi-toggle-switch-off-outline::before {
+  content: "\FA18";
+}
+.mdi-toggle-switch-outline::before {
+  content: "\FA19";
+}
+.mdi-toilet::before {
+  content: "\F9AA";
+}
+.mdi-toolbox::before {
+  content: "\F9AB";
+}
+.mdi-toolbox-outline::before {
+  content: "\F9AC";
+}
+.mdi-tooltip::before {
+  content: "\F523";
+}
+.mdi-tooltip-account::before {
+  content: "\F00C";
+}
+.mdi-tooltip-edit::before {
+  content: "\F524";
+}
+.mdi-tooltip-image::before {
+  content: "\F525";
+}
+.mdi-tooltip-image-outline::before {
+  content: "\FBB1";
+}
+.mdi-tooltip-outline::before {
+  content: "\F526";
+}
+.mdi-tooltip-plus::before {
+  content: "\FBB2";
+}
+.mdi-tooltip-plus-outline::before {
+  content: "\F527";
+}
+.mdi-tooltip-text::before {
+  content: "\F528";
+}
+.mdi-tooltip-text-outline::before {
+  content: "\FBB3";
+}
+.mdi-tooth::before {
+  content: "\F8C2";
+}
+.mdi-tooth-outline::before {
+  content: "\F529";
+}
+.mdi-tor::before {
+  content: "\F52A";
+}
+.mdi-tortoise::before {
+  content: "\FD17";
+}
+.mdi-tournament::before {
+  content: "\F9AD";
+}
+.mdi-tower-beach::before {
+  content: "\F680";
+}
+.mdi-tower-fire::before {
+  content: "\F681";
+}
+.mdi-towing::before {
+  content: "\F83B";
+}
+.mdi-track-light::before {
+  content: "\F913";
+}
+.mdi-trackpad::before {
+  content: "\F7F7";
+}
+.mdi-trackpad-lock::before {
+  content: "\F932";
+}
+.mdi-tractor::before {
+  content: "\F891";
+}
+.mdi-trademark::before {
+  content: "\FA77";
+}
+.mdi-traffic-light::before {
+  content: "\F52B";
+}
+.mdi-train::before {
+  content: "\F52C";
+}
+.mdi-train-car::before {
+  content: "\FBB4";
+}
+.mdi-train-variant::before {
+  content: "\F8C3";
+}
+.mdi-tram::before {
+  content: "\F52D";
+}
+.mdi-transcribe::before {
+  content: "\F52E";
+}
+.mdi-transcribe-close::before {
+  content: "\F52F";
+}
+.mdi-transfer-down::before {
+  content: "\FD7D";
+}
+.mdi-transfer-left::before {
+  content: "\FD7E";
+}
+.mdi-transfer-right::before {
+  content: "\F530";
+}
+.mdi-transfer-up::before {
+  content: "\FD7F";
+}
+.mdi-transit-connection::before {
+  content: "\FD18";
+}
+.mdi-transit-connection-variant::before {
+  content: "\FD19";
+}
+.mdi-transit-detour::before {
+  content: "\FFA8";
+}
+.mdi-transit-transfer::before {
+  content: "\F6AD";
+}
+.mdi-transition::before {
+  content: "\F914";
+}
+.mdi-transition-masked::before {
+  content: "\F915";
+}
+.mdi-translate::before {
+  content: "\F5CA";
+}
+.mdi-translate-off::before {
+  content: "\FE66";
+}
+.mdi-transmission-tower::before {
+  content: "\FD1A";
+}
+.mdi-trash-can::before {
+  content: "\FA78";
+}
+.mdi-trash-can-outline::before {
+  content: "\FA79";
+}
+.mdi-treasure-chest::before {
+  content: "\F725";
+}
+.mdi-tree::before {
+  content: "\F531";
+}
+.mdi-tree-outline::before {
+  content: "\FE4C";
+}
+.mdi-trello::before {
+  content: "\F532";
+}
+.mdi-trending-down::before {
+  content: "\F533";
+}
+.mdi-trending-neutral::before {
+  content: "\F534";
+}
+.mdi-trending-up::before {
+  content: "\F535";
+}
+.mdi-triangle::before {
+  content: "\F536";
+}
+.mdi-triangle-outline::before {
+  content: "\F537";
+}
+.mdi-triforce::before {
+  content: "\FBB5";
+}
+.mdi-trophy::before {
+  content: "\F538";
+}
+.mdi-trophy-award::before {
+  content: "\F539";
+}
+.mdi-trophy-broken::before {
+  content: "\FD80";
+}
+.mdi-trophy-outline::before {
+  content: "\F53A";
+}
+.mdi-trophy-variant::before {
+  content: "\F53B";
+}
+.mdi-trophy-variant-outline::before {
+  content: "\F53C";
+}
+.mdi-truck::before {
+  content: "\F53D";
+}
+.mdi-truck-check::before {
+  content: "\FCB0";
+}
+.mdi-truck-delivery::before {
+  content: "\F53E";
+}
+.mdi-truck-fast::before {
+  content: "\F787";
+}
+.mdi-truck-trailer::before {
+  content: "\F726";
+}
+.mdi-tshirt-crew::before {
+  content: "\FA7A";
+}
+.mdi-tshirt-crew-outline::before {
+  content: "\F53F";
+}
+.mdi-tshirt-v::before {
+  content: "\FA7B";
+}
+.mdi-tshirt-v-outline::before {
+  content: "\F540";
+}
+.mdi-tumble-dryer::before {
+  content: "\F916";
+}
+.mdi-tumblr::before {
+  content: "\F541";
+}
+.mdi-tumblr-box::before {
+  content: "\F917";
+}
+.mdi-tumblr-reblog::before {
+  content: "\F542";
+}
+.mdi-tune::before {
+  content: "\F62E";
+}
+.mdi-tune-vertical::before {
+  content: "\F66A";
+}
+.mdi-turnstile::before {
+  content: "\FCB1";
+}
+.mdi-turnstile-outline::before {
+  content: "\FCB2";
+}
+.mdi-turtle::before {
+  content: "\FCB3";
+}
+.mdi-twitch::before {
+  content: "\F543";
+}
+.mdi-twitter::before {
+  content: "\F544";
+}
+.mdi-twitter-box::before {
+  content: "\F545";
+}
+.mdi-twitter-circle::before {
+  content: "\F546";
+}
+.mdi-twitter-retweet::before {
+  content: "\F547";
+}
+.mdi-two-factor-authentication::before {
+  content: "\F9AE";
+}
+.mdi-typewriter::before {
+  content: "\FF4A";
+}
+.mdi-uber::before {
+  content: "\F748";
+}
+.mdi-ubisoft::before {
+  content: "\FBB6";
+}
+.mdi-ubuntu::before {
+  content: "\F548";
+}
+.mdi-ultra-high-definition::before {
+  content: "\F7F8";
+}
+.mdi-umbraco::before {
+  content: "\F549";
+}
+.mdi-umbrella::before {
+  content: "\F54A";
+}
+.mdi-umbrella-closed::before {
+  content: "\F9AF";
+}
+.mdi-umbrella-outline::before {
+  content: "\F54B";
+}
+.mdi-undo::before {
+  content: "\F54C";
+}
+.mdi-undo-variant::before {
+  content: "\F54D";
+}
+.mdi-unfold-less-horizontal::before {
+  content: "\F54E";
+}
+.mdi-unfold-less-vertical::before {
+  content: "\F75F";
+}
+.mdi-unfold-more-horizontal::before {
+  content: "\F54F";
+}
+.mdi-unfold-more-vertical::before {
+  content: "\F760";
+}
+.mdi-ungroup::before {
+  content: "\F550";
+}
+.mdi-unicode::before {
+  content: "\FEED";
+}
+.mdi-unity::before {
+  content: "\F6AE";
+}
+.mdi-unreal::before {
+  content: "\F9B0";
+}
+.mdi-untappd::before {
+  content: "\F551";
+}
+.mdi-update::before {
+  content: "\F6AF";
+}
+.mdi-upload::before {
+  content: "\F552";
+}
+.mdi-upload-multiple::before {
+  content: "\F83C";
+}
+.mdi-upload-network::before {
+  content: "\F6F5";
+}
+.mdi-upload-network-outline::before {
+  content: "\FCB4";
+}
+.mdi-upload-outline::before {
+  content: "\FE67";
+}
+.mdi-usb::before {
+  content: "\F553";
+}
+.mdi-van-passenger::before {
+  content: "\F7F9";
+}
+.mdi-van-utility::before {
+  content: "\F7FA";
+}
+.mdi-vanish::before {
+  content: "\F7FB";
+}
+.mdi-variable::before {
+  content: "\FAE6";
+}
+.mdi-vector-arrange-above::before {
+  content: "\F554";
+}
+.mdi-vector-arrange-below::before {
+  content: "\F555";
+}
+.mdi-vector-bezier::before {
+  content: "\FAE7";
+}
+.mdi-vector-circle::before {
+  content: "\F556";
+}
+.mdi-vector-circle-variant::before {
+  content: "\F557";
+}
+.mdi-vector-combine::before {
+  content: "\F558";
+}
+.mdi-vector-curve::before {
+  content: "\F559";
+}
+.mdi-vector-difference::before {
+  content: "\F55A";
+}
+.mdi-vector-difference-ab::before {
+  content: "\F55B";
+}
+.mdi-vector-difference-ba::before {
+  content: "\F55C";
+}
+.mdi-vector-ellipse::before {
+  content: "\F892";
+}
+.mdi-vector-intersection::before {
+  content: "\F55D";
+}
+.mdi-vector-line::before {
+  content: "\F55E";
+}
+.mdi-vector-point::before {
+  content: "\F55F";
+}
+.mdi-vector-polygon::before {
+  content: "\F560";
+}
+.mdi-vector-polyline::before {
+  content: "\F561";
+}
+.mdi-vector-radius::before {
+  content: "\F749";
+}
+.mdi-vector-rectangle::before {
+  content: "\F5C6";
+}
+.mdi-vector-selection::before {
+  content: "\F562";
+}
+.mdi-vector-square::before {
+  content: "\F001";
+}
+.mdi-vector-triangle::before {
+  content: "\F563";
+}
+.mdi-vector-union::before {
+  content: "\F564";
+}
+.mdi-venmo::before {
+  content: "\F578";
+}
+.mdi-vhs::before {
+  content: "\FA1A";
+}
+.mdi-vibrate::before {
+  content: "\F566";
+}
+.mdi-vibrate-off::before {
+  content: "\FCB5";
+}
+.mdi-video::before {
+  content: "\F567";
+}
+.mdi-video-3d::before {
+  content: "\F7FC";
+}
+.mdi-video-3d-variant::before {
+  content: "\FEEE";
+}
+.mdi-video-4k-box::before {
+  content: "\F83D";
+}
+.mdi-video-account::before {
+  content: "\F918";
+}
+.mdi-video-image::before {
+  content: "\F919";
+}
+.mdi-video-input-antenna::before {
+  content: "\F83E";
+}
+.mdi-video-input-component::before {
+  content: "\F83F";
+}
+.mdi-video-input-hdmi::before {
+  content: "\F840";
+}
+.mdi-video-input-scart::before {
+  content: "\FFA9";
+}
+.mdi-video-input-svideo::before {
+  content: "\F841";
+}
+.mdi-video-minus::before {
+  content: "\F9B1";
+}
+.mdi-video-off::before {
+  content: "\F568";
+}
+.mdi-video-off-outline::before {
+  content: "\FBB7";
+}
+.mdi-video-outline::before {
+  content: "\FBB8";
+}
+.mdi-video-plus::before {
+  content: "\F9B2";
+}
+.mdi-video-stabilization::before {
+  content: "\F91A";
+}
+.mdi-video-switch::before {
+  content: "\F569";
+}
+.mdi-video-vintage::before {
+  content: "\FA1B";
+}
+.mdi-video-wireless::before {
+  content: "\FEEF";
+}
+.mdi-video-wireless-outline::before {
+  content: "\FEF0";
+}
+.mdi-view-agenda::before {
+  content: "\F56A";
+}
+.mdi-view-array::before {
+  content: "\F56B";
+}
+.mdi-view-carousel::before {
+  content: "\F56C";
+}
+.mdi-view-column::before {
+  content: "\F56D";
+}
+.mdi-view-comfy::before {
+  content: "\FE4D";
+}
+.mdi-view-compact::before {
+  content: "\FE4E";
+}
+.mdi-view-compact-outline::before {
+  content: "\FE4F";
+}
+.mdi-view-dashboard::before {
+  content: "\F56E";
+}
+.mdi-view-dashboard-outline::before {
+  content: "\FA1C";
+}
+.mdi-view-dashboard-variant::before {
+  content: "\F842";
+}
+.mdi-view-day::before {
+  content: "\F56F";
+}
+.mdi-view-grid::before {
+  content: "\F570";
+}
+.mdi-view-grid-plus::before {
+  content: "\FFAA";
+}
+.mdi-view-headline::before {
+  content: "\F571";
+}
+.mdi-view-list::before {
+  content: "\F572";
+}
+.mdi-view-module::before {
+  content: "\F573";
+}
+.mdi-view-parallel::before {
+  content: "\F727";
+}
+.mdi-view-quilt::before {
+  content: "\F574";
+}
+.mdi-view-sequential::before {
+  content: "\F728";
+}
+.mdi-view-split-horizontal::before {
+  content: "\FBA7";
+}
+.mdi-view-split-vertical::before {
+  content: "\FBA8";
+}
+.mdi-view-stream::before {
+  content: "\F575";
+}
+.mdi-view-week::before {
+  content: "\F576";
+}
+.mdi-vimeo::before {
+  content: "\F577";
+}
+.mdi-violin::before {
+  content: "\F60F";
+}
+.mdi-virtual-reality::before {
+  content: "\F893";
+}
+.mdi-visual-studio::before {
+  content: "\F610";
+}
+.mdi-visual-studio-code::before {
+  content: "\FA1D";
+}
+.mdi-vk::before {
+  content: "\F579";
+}
+.mdi-vk-box::before {
+  content: "\F57A";
+}
+.mdi-vk-circle::before {
+  content: "\F57B";
+}
+.mdi-vlc::before {
+  content: "\F57C";
+}
+.mdi-voice::before {
+  content: "\F5CB";
+}
+.mdi-voice-off::before {
+  content: "\FEF1";
+}
+.mdi-voicemail::before {
+  content: "\F57D";
+}
+.mdi-volleyball::before {
+  content: "\F9B3";
+}
+.mdi-volume-high::before {
+  content: "\F57E";
+}
+.mdi-volume-low::before {
+  content: "\F57F";
+}
+.mdi-volume-medium::before {
+  content: "\F580";
+}
+.mdi-volume-minus::before {
+  content: "\F75D";
+}
+.mdi-volume-mute::before {
+  content: "\F75E";
+}
+.mdi-volume-off::before {
+  content: "\F581";
+}
+.mdi-volume-plus::before {
+  content: "\F75C";
+}
+.mdi-volume-variant-off::before {
+  content: "\FE68";
+}
+.mdi-vote::before {
+  content: "\FA1E";
+}
+.mdi-vote-outline::before {
+  content: "\FA1F";
+}
+.mdi-vpn::before {
+  content: "\F582";
+}
+.mdi-vuejs::before {
+  content: "\F843";
+}
+.mdi-vuetify::before {
+  content: "\FE50";
+}
+.mdi-walk::before {
+  content: "\F583";
+}
+.mdi-wall::before {
+  content: "\F7FD";
+}
+.mdi-wall-sconce::before {
+  content: "\F91B";
+}
+.mdi-wall-sconce-flat::before {
+  content: "\F91C";
+}
+.mdi-wall-sconce-variant::before {
+  content: "\F91D";
+}
+.mdi-wallet::before {
+  content: "\F584";
+}
+.mdi-wallet-giftcard::before {
+  content: "\F585";
+}
+.mdi-wallet-membership::before {
+  content: "\F586";
+}
+.mdi-wallet-outline::before {
+  content: "\FBB9";
+}
+.mdi-wallet-plus::before {
+  content: "\FFAB";
+}
+.mdi-wallet-plus-outline::before {
+  content: "\FFAC";
+}
+.mdi-wallet-travel::before {
+  content: "\F587";
+}
+.mdi-wallpaper::before {
+  content: "\FE69";
+}
+.mdi-wan::before {
+  content: "\F588";
+}
+.mdi-wardrobe::before {
+  content: "\FFAD";
+}
+.mdi-wardrobe-outline::before {
+  content: "\FFAE";
+}
+.mdi-warehouse::before {
+  content: "\FFBB";
+}
+.mdi-washing-machine::before {
+  content: "\F729";
+}
+.mdi-watch::before {
+  content: "\F589";
+}
+.mdi-watch-export::before {
+  content: "\F58A";
+}
+.mdi-watch-export-variant::before {
+  content: "\F894";
+}
+.mdi-watch-import::before {
+  content: "\F58B";
+}
+.mdi-watch-import-variant::before {
+  content: "\F895";
+}
+.mdi-watch-variant::before {
+  content: "\F896";
+}
+.mdi-watch-vibrate::before {
+  content: "\F6B0";
+}
+.mdi-watch-vibrate-off::before {
+  content: "\FCB6";
+}
+.mdi-water::before {
+  content: "\F58C";
+}
+.mdi-water-boiler::before {
+  content: "\FFAF";
+}
+.mdi-water-off::before {
+  content: "\F58D";
+}
+.mdi-water-outline::before {
+  content: "\FE6A";
+}
+.mdi-water-percent::before {
+  content: "\F58E";
+}
+.mdi-water-pump::before {
+  content: "\F58F";
+}
+.mdi-water-pump-off::before {
+  content: "\FFB0";
+}
+.mdi-watermark::before {
+  content: "\F612";
+}
+.mdi-wave::before {
+  content: "\FF4B";
+}
+.mdi-waves::before {
+  content: "\F78C";
+}
+.mdi-waze::before {
+  content: "\FBBA";
+}
+.mdi-weather-cloudy::before {
+  content: "\F590";
+}
+.mdi-weather-cloudy-alert::before {
+  content: "\FF4C";
+}
+.mdi-weather-cloudy-arrow-right::before {
+  content: "\FE51";
+}
+.mdi-weather-fog::before {
+  content: "\F591";
+}
+.mdi-weather-hail::before {
+  content: "\F592";
+}
+.mdi-weather-hazy::before {
+  content: "\FF4D";
+}
+.mdi-weather-hurricane::before {
+  content: "\F897";
+}
+.mdi-weather-lightning::before {
+  content: "\F593";
+}
+.mdi-weather-lightning-rainy::before {
+  content: "\F67D";
+}
+.mdi-weather-night::before {
+  content: "\F594";
+}
+.mdi-weather-night-partly-cloudy::before {
+  content: "\FF4E";
+}
+.mdi-weather-partly-cloudy::before {
+  content: "\F595";
+}
+.mdi-weather-partly-lightning::before {
+  content: "\FF4F";
+}
+.mdi-weather-partly-rainy::before {
+  content: "\FF50";
+}
+.mdi-weather-partly-snowy::before {
+  content: "\FF51";
+}
+.mdi-weather-partly-snowy-rainy::before {
+  content: "\FF52";
+}
+.mdi-weather-pouring::before {
+  content: "\F596";
+}
+.mdi-weather-rainy::before {
+  content: "\F597";
+}
+.mdi-weather-snowy::before {
+  content: "\F598";
+}
+.mdi-weather-snowy-heavy::before {
+  content: "\FF53";
+}
+.mdi-weather-snowy-rainy::before {
+  content: "\F67E";
+}
+.mdi-weather-sunny::before {
+  content: "\F599";
+}
+.mdi-weather-sunny-alert::before {
+  content: "\FF54";
+}
+.mdi-weather-sunset::before {
+  content: "\F59A";
+}
+.mdi-weather-sunset-down::before {
+  content: "\F59B";
+}
+.mdi-weather-sunset-up::before {
+  content: "\F59C";
+}
+.mdi-weather-tornado::before {
+  content: "\FF55";
+}
+.mdi-weather-windy::before {
+  content: "\F59D";
+}
+.mdi-weather-windy-variant::before {
+  content: "\F59E";
+}
+.mdi-web::before {
+  content: "\F59F";
+}
+.mdi-web-box::before {
+  content: "\FFB1";
+}
+.mdi-webcam::before {
+  content: "\F5A0";
+}
+.mdi-webhook::before {
+  content: "\F62F";
+}
+.mdi-webpack::before {
+  content: "\F72A";
+}
+.mdi-wechat::before {
+  content: "\F611";
+}
+.mdi-weight::before {
+  content: "\F5A1";
+}
+.mdi-weight-gram::before {
+  content: "\FD1B";
+}
+.mdi-weight-kilogram::before {
+  content: "\F5A2";
+}
+.mdi-weight-pound::before {
+  content: "\F9B4";
+}
+.mdi-whatsapp::before {
+  content: "\F5A3";
+}
+.mdi-wheelchair-accessibility::before {
+  content: "\F5A4";
+}
+.mdi-whistle::before {
+  content: "\F9B5";
+}
+.mdi-white-balance-auto::before {
+  content: "\F5A5";
+}
+.mdi-white-balance-incandescent::before {
+  content: "\F5A6";
+}
+.mdi-white-balance-iridescent::before {
+  content: "\F5A7";
+}
+.mdi-white-balance-sunny::before {
+  content: "\F5A8";
+}
+.mdi-widgets::before {
+  content: "\F72B";
+}
+.mdi-wifi::before {
+  content: "\F5A9";
+}
+.mdi-wifi-off::before {
+  content: "\F5AA";
+}
+.mdi-wifi-star::before {
+  content: "\FE6B";
+}
+.mdi-wifi-strength-1::before {
+  content: "\F91E";
+}
+.mdi-wifi-strength-1-alert::before {
+  content: "\F91F";
+}
+.mdi-wifi-strength-1-lock::before {
+  content: "\F920";
+}
+.mdi-wifi-strength-2::before {
+  content: "\F921";
+}
+.mdi-wifi-strength-2-alert::before {
+  content: "\F922";
+}
+.mdi-wifi-strength-2-lock::before {
+  content: "\F923";
+}
+.mdi-wifi-strength-3::before {
+  content: "\F924";
+}
+.mdi-wifi-strength-3-alert::before {
+  content: "\F925";
+}
+.mdi-wifi-strength-3-lock::before {
+  content: "\F926";
+}
+.mdi-wifi-strength-4::before {
+  content: "\F927";
+}
+.mdi-wifi-strength-4-alert::before {
+  content: "\F928";
+}
+.mdi-wifi-strength-4-lock::before {
+  content: "\F929";
+}
+.mdi-wifi-strength-alert-outline::before {
+  content: "\F92A";
+}
+.mdi-wifi-strength-lock-outline::before {
+  content: "\F92B";
+}
+.mdi-wifi-strength-off::before {
+  content: "\F92C";
+}
+.mdi-wifi-strength-off-outline::before {
+  content: "\F92D";
+}
+.mdi-wifi-strength-outline::before {
+  content: "\F92E";
+}
+.mdi-wii::before {
+  content: "\F5AB";
+}
+.mdi-wiiu::before {
+  content: "\F72C";
+}
+.mdi-wikipedia::before {
+  content: "\F5AC";
+}
+.mdi-wind-turbine::before {
+  content: "\FD81";
+}
+.mdi-window-close::before {
+  content: "\F5AD";
+}
+.mdi-window-closed::before {
+  content: "\F5AE";
+}
+.mdi-window-maximize::before {
+  content: "\F5AF";
+}
+.mdi-window-minimize::before {
+  content: "\F5B0";
+}
+.mdi-window-open::before {
+  content: "\F5B1";
+}
+.mdi-window-restore::before {
+  content: "\F5B2";
+}
+.mdi-windows::before {
+  content: "\F5B3";
+}
+.mdi-windows-classic::before {
+  content: "\FA20";
+}
+.mdi-wiper::before {
+  content: "\FAE8";
+}
+.mdi-wiper-wash::before {
+  content: "\FD82";
+}
+.mdi-wordpress::before {
+  content: "\F5B4";
+}
+.mdi-worker::before {
+  content: "\F5B5";
+}
+.mdi-wrap::before {
+  content: "\F5B6";
+}
+.mdi-wrap-disabled::before {
+  content: "\FBBB";
+}
+.mdi-wrench::before {
+  content: "\F5B7";
+}
+.mdi-wrench-outline::before {
+  content: "\FBBC";
+}
+.mdi-wunderlist::before {
+  content: "\F5B8";
+}
+.mdi-xamarin::before {
+  content: "\F844";
+}
+.mdi-xamarin-outline::before {
+  content: "\F845";
+}
+.mdi-xaml::before {
+  content: "\F673";
+}
+.mdi-xbox::before {
+  content: "\F5B9";
+}
+.mdi-xbox-controller::before {
+  content: "\F5BA";
+}
+.mdi-xbox-controller-battery-alert::before {
+  content: "\F74A";
+}
+.mdi-xbox-controller-battery-charging::before {
+  content: "\FA21";
+}
+.mdi-xbox-controller-battery-empty::before {
+  content: "\F74B";
+}
+.mdi-xbox-controller-battery-full::before {
+  content: "\F74C";
+}
+.mdi-xbox-controller-battery-low::before {
+  content: "\F74D";
+}
+.mdi-xbox-controller-battery-medium::before {
+  content: "\F74E";
+}
+.mdi-xbox-controller-battery-unknown::before {
+  content: "\F74F";
+}
+.mdi-xbox-controller-menu::before {
+  content: "\FE52";
+}
+.mdi-xbox-controller-off::before {
+  content: "\F5BB";
+}
+.mdi-xbox-controller-view::before {
+  content: "\FE53";
+}
+.mdi-xda::before {
+  content: "\F5BC";
+}
+.mdi-xing::before {
+  content: "\F5BD";
+}
+.mdi-xing-box::before {
+  content: "\F5BE";
+}
+.mdi-xing-circle::before {
+  content: "\F5BF";
+}
+.mdi-xml::before {
+  content: "\F5C0";
+}
+.mdi-xmpp::before {
+  content: "\F7FE";
+}
+.mdi-yahoo::before {
+  content: "\FB2A";
+}
+.mdi-yammer::before {
+  content: "\F788";
+}
+.mdi-yeast::before {
+  content: "\F5C1";
+}
+.mdi-yelp::before {
+  content: "\F5C2";
+}
+.mdi-yin-yang::before {
+  content: "\F67F";
+}
+.mdi-youtube::before {
+  content: "\F5C3";
+}
+.mdi-youtube-creator-studio::before {
+  content: "\F846";
+}
+.mdi-youtube-gaming::before {
+  content: "\F847";
+}
+.mdi-youtube-subscription::before {
+  content: "\FD1C";
+}
+.mdi-youtube-tv::before {
+  content: "\F448";
+}
+.mdi-z-wave::before {
+  content: "\FAE9";
+}
+.mdi-zend::before {
+  content: "\FAEA";
+}
+.mdi-zigbee::before {
+  content: "\FD1D";
+}
+.mdi-zip-box::before {
+  content: "\F5C4";
+}
+.mdi-zip-disk::before {
+  content: "\FA22";
+}
+.mdi-zodiac-aquarius::before {
+  content: "\FA7C";
+}
+.mdi-zodiac-aries::before {
+  content: "\FA7D";
+}
+.mdi-zodiac-cancer::before {
+  content: "\FA7E";
+}
+.mdi-zodiac-capricorn::before {
+  content: "\FA7F";
+}
+.mdi-zodiac-gemini::before {
+  content: "\FA80";
+}
+.mdi-zodiac-leo::before {
+  content: "\FA81";
+}
+.mdi-zodiac-libra::before {
+  content: "\FA82";
+}
+.mdi-zodiac-pisces::before {
+  content: "\FA83";
+}
+.mdi-zodiac-sagittarius::before {
+  content: "\FA84";
+}
+.mdi-zodiac-scorpio::before {
+  content: "\FA85";
+}
+.mdi-zodiac-taurus::before {
+  content: "\FA86";
+}
+.mdi-zodiac-virgo::before {
+  content: "\FA87";
+}
+.mdi-blank::before {
+  content: "\F68C";
+  visibility: hidden;
+}
+.mdi-18px.mdi-set,
+.mdi-18px.mdi:before {
+  font-size: 18px;
+}
+.mdi-24px.mdi-set,
+.mdi-24px.mdi:before {
+  font-size: 24px;
+}
+.mdi-36px.mdi-set,
+.mdi-36px.mdi:before {
+  font-size: 36px;
+}
+.mdi-48px.mdi-set,
+.mdi-48px.mdi:before {
+  font-size: 48px;
+}
+.mdi-dark:before {
+  color: rgba(0, 0, 0, 0.54);
+}
+.mdi-dark.mdi-inactive:before {
+  color: rgba(0, 0, 0, 0.26);
+}
+.mdi-light:before {
+  color: #fff;
+}
+.mdi-light.mdi-inactive:before {
+  color: rgba(255, 255, 255, 0.3);
+}
+.mdi-rotate-45:before {
+  -webkit-transform: rotate(45deg);
+  -ms-transform: rotate(45deg);
+  transform: rotate(45deg);
+}
+.mdi-rotate-90:before {
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.mdi-rotate-135:before {
+  -webkit-transform: rotate(135deg);
+  -ms-transform: rotate(135deg);
+  transform: rotate(135deg);
+}
+.mdi-rotate-180:before {
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.mdi-rotate-225:before {
+  -webkit-transform: rotate(225deg);
+  -ms-transform: rotate(225deg);
+  transform: rotate(225deg);
+}
+.mdi-rotate-270:before {
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.mdi-rotate-315:before {
+  -webkit-transform: rotate(315deg);
+  -ms-transform: rotate(315deg);
+  transform: rotate(315deg);
+}
+.mdi-flip-h:before {
+  -webkit-transform: scaleX(-1);
+  transform: scaleX(-1);
+  filter: FlipH;
+  -ms-filter: "FlipH";
+}
+.mdi-flip-v:before {
+  -webkit-transform: scaleY(-1);
+  transform: scaleY(-1);
+  filter: FlipV;
+  -ms-filter: "FlipV";
+}
+.mdi-spin:before {
+  -webkit-animation: mdi-spin 2s infinite linear;
+  animation: mdi-spin 2s infinite linear;
+}
+@-webkit-keyframes mdi-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes mdi-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
 
-/*# sourceMappingURL=materialdesignicons.css.map */
\ No newline at end of file
+/*# sourceMappingURL=materialdesignicons.css.map */
diff --git a/notemyprogress/db/access.php b/notemyprogress/db/access.php
index f3fdcaec36b9c5d8d00a77364b919efdc8d84434..8b11e6e5e62a389c199e19a3d2d5a29dbadbc720 100644
--- a/notemyprogress/db/access.php
+++ b/notemyprogress/db/access.php
@@ -157,12 +157,35 @@ $capabilities = array(
             'student'        => CAP_ALLOW,
         )
     ),
+<<<<<<< HEAD
 
     'local/notemyprogress:student_planning' => array(
+=======
+    'local/notemyprogress:teacher_gamification' => array(
+        'captype'      => 'read',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes'   => array(
+            'teacher'        => CAP_ALLOW,
+            'editingteacher' => CAP_ALLOW,
+            'manager'        => CAP_ALLOW
+        )
+    ),
+    'local/notemyprogress:student_gamification' => array(
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
         'captype'      => 'read',
         'contextlevel' => CONTEXT_COURSE,
         'archetypes'   => array(
             'student'        => CAP_ALLOW,
         )
     ),
+<<<<<<< HEAD
+=======
+    'local/notemyprogress:earnxp' => array(
+        'captype' => 'read',
+        'contextlevel' => CONTEXT_MODULE,
+        'archetypes' => array(
+            'student' => CAP_ALLOW
+        ),
+    ),
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
 );
diff --git a/notemyprogress/db/events.php b/notemyprogress/db/events.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a10a57177ecef0ccf703d1627f16cecf33da2d9
--- /dev/null
+++ b/notemyprogress/db/events.php
@@ -0,0 +1,38 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Observers
+ *
+ * @package     local_notemyprogress
+ * @autor       Edisson Sigua, Bryan Aguilar
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$observers = [
+    [
+        'eventname' => '*',
+        'callback' => 'local_notemyprogress\\observer\\observer::catch_all',
+        'internal' => false
+    ],
+    [
+        'eventname' => '\\core\\event\\course_deleted',
+        'callback' => 'local_notemyprogress\\observer\\observer::course_deleted'
+    ]
+];
\ No newline at end of file
diff --git a/notemyprogress/db/install.php b/notemyprogress/db/install.php
index 8637b100e653bf6c1f68b91f7f65621298e8087f..06c46a760f6ef6b24ef590a5489ee55417102063 100644
--- a/notemyprogress/db/install.php
+++ b/notemyprogress/db/install.php
@@ -28,6 +28,7 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Custom code to be run on installing the plugin.
  */
+<<<<<<< HEAD
 function xmldb_local_notemyprogress_install()
 {
     global $DB;
@@ -155,4 +156,8 @@ function xmldb_local_notemyprogress_install()
     $answer->questionid = $questionid;
     $answer->enunciated = 'answers_number_four_option_four';
     $DB->insert_record("st_rpt_answers", $answer, true);
+=======
+function xmldb_local_notemyprogress_install() {
+    return true;
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
 }
diff --git a/notemyprogress/db/install.xml b/notemyprogress/db/install.xml
index c1225693c1d0358a0b3c84b706bd8b76be010d0a..fda68475ab3794e4b100139a0236af5475adc5b7 100644
--- a/notemyprogress/db/install.xml
+++ b/notemyprogress/db/install.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <XMLDB PATH="local/notemyprogress/db" VERSION="2020111000" COMMENT="XMLDB file for Moodle local/notemyprogress"
+<<<<<<< HEAD
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd">
   <TABLES>
     <TABLE NAME="notemyprogress_instances" COMMENT="table notemyprogress_instances">
@@ -199,5 +200,162 @@
         <INDEX NAME="userid" UNIQUE="false" FIELDS="userid" HINTS="userid" COMMENT="userid index"/>
       </INDEXES>
     </TABLE>
+=======
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
+>
+    <TABLES>
+        <TABLE NAME="notemyprogress_instances" COMMENT="table notemyprogress_instances">
+            <FIELDS>
+                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+                <FIELD NAME="courseid" TYPE="int" LENGTH="20" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
+                <FIELD NAME="year" TYPE="int" LENGTH="20" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
+            </FIELDS>
+            <KEYS>
+                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+            </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_weeks" COMMENT="table notemyprogress_weeks">
+            <FIELDS>
+                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+                <FIELD NAME="instanceid" TYPE="int" LENGTH="20" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="weekstart" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="weekend" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="position" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="modified_by" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="created_by" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timedeleted" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="weekcode" TYPE="int" LENGTH="20" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="hours_dedications" TYPE="int" LENGTH="5" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="hours_dedications"/>
+            </FIELDS>
+            <KEYS>
+                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+            </KEYS>
+            <INDEXES>
+                <INDEX NAME="weekcode" UNIQUE="false" FIELDS="weekcode" HINTS="weekcode" COMMENT="weekcode index"/>
+                <INDEX NAME="instanceid" UNIQUE="false" FIELDS="instanceid" HINTS="instanceid" COMMENT="instanceid index"/>
+            </INDEXES>
+        </TABLE>
+        <TABLE NAME="notemyprogress_sections" COMMENT="table notemyprogress_sections">
+            <FIELDS>
+                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+                <FIELD NAME="weekcode" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="sectionid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="section_name" TYPE="char" LENGTH="1333" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="position" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timedeleted" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+            </FIELDS>
+            <KEYS>
+                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+            </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_logs" COMMENT="table notemyprogress_logs">
+            <FIELDS>
+                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+                <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="username" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="name" TYPE="char" LENGTH="1333" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="lastname" TYPE="char" LENGTH="1333" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="email" TYPE="char" LENGTH="1333" NOTNULL="false" SEQUENCE="false"/>
+                <FIELD NAME="current_roles" TYPE="char" LENGTH="1333" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="component" TYPE="char" LENGTH="1333" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="action" TYPE="char" LENGTH="1333" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            </FIELDS>
+            <KEYS>
+                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+            </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_clustering" COMMENT="table notemyprogress_clustering">
+            <FIELDS>
+                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+                <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="cluster" TYPE="int" LENGTH="2" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="active" TYPE="int" LENGTH="2" NOTNULL="true" SEQUENCE="false"/>
+                <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            </FIELDS>
+            <KEYS>
+                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+            </KEYS>
+            <INDEXES>
+                <INDEX NAME="courseid" UNIQUE="false" FIELDS="courseid" HINTS="courseid" COMMENT="courseid index"/>
+                <INDEX NAME="userid" UNIQUE="false" FIELDS="userid" HINTS="userid" COMMENT="userid index"/>
+            </INDEXES>
+        </TABLE>
+        <TABLE NAME="notemyprogress_levels_data" COMMENT="Default comment for the table, please edit me">
+          <FIELDS>
+            <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+            <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="levelsdata" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="settings" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="rules" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="created_by" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="modified_by" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME ="timedeleted" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+          </FIELDS>
+          <KEYS>
+            <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+          </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_xp" COMMENT="Esta tabla contiene el nivel y los puntos de experiencia de los usuarios">
+          <FIELDS>
+            <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+            <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="points" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="level" TYPE="int" LENGTH="5" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="rankable" TYPE="int" LENGTH="5" NOTNULL="false" SEQUENCE="false"/>
+          </FIELDS>
+          <KEYS>
+            <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+          </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_xp_log" COMMENT="Esta tabla almacena los eventos por los cuales los estudiantes reciben puntos de experiencia">
+          <FIELDS>
+            <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+            <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="event" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="points" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+          </FIELDS>
+          <KEYS>
+            <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+          </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_times" COMMENT="notemyprogress students times">
+          <FIELDS>
+            <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+            <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="weeks" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
+            <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+          </FIELDS>
+          <KEYS>
+            <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+          </KEYS>
+        </TABLE>
+        <TABLE NAME="notemyprogress_gamification" COMMENT="gamification parameters">
+          <FIELDS>
+            <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
+            <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+            <FIELD NAME="enablegamification" TYPE="int" LENGTH="1" NOTNULL="true" SEQUENCE="false" />
+            <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
+          </FIELDS>
+          <KEYS>
+            <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
+          </KEYS>
+        </TABLE>
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
   </TABLES>
 </XMLDB>
\ No newline at end of file
diff --git a/notemyprogress/db/services.php b/notemyprogress/db/services.php
new file mode 100644
index 0000000000000000000000000000000000000000..9784a00f6fd570a83711313ac91fc3bebc5d00a3
--- /dev/null
+++ b/notemyprogress/db/services.php
@@ -0,0 +1,33 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file defines available ajax calls for mod_millionaire.
+ *
+ * @package    mod_millionaire
+ * @copyright  2019 Benedikt Kulmann <b@kulmann.biz>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$functions = [
+    'local_notemyprogress_get_levels' => [
+        'classname' => 'local_notemyprogress\external\external',
+        'methodname' => 'get_levels',
+        'description' => 'Get levels for the game overview.',
+        'type' => 'read',
+        'ajax' => true,
+    ],
+];
\ No newline at end of file
diff --git a/notemyprogress/gamification.php b/notemyprogress/gamification.php
new file mode 100644
index 0000000000000000000000000000000000000000..392dac98236677db5eaaea684b5bde729fa11283
--- /dev/null
+++ b/notemyprogress/gamification.php
@@ -0,0 +1,132 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * local notemyprogress
+ *
+ * @package     local_notemyprogress
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+require_once('locallib.php');
+global $COURSE, $USER , $DB;
+
+$courseid = required_param('courseid', PARAM_INT);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
+$context = context_course::instance($course->id);
+
+$url = '/local/notemyprogress/gamification.php';
+local_notemyprogress_set_page($course, $url);
+
+require_capability('local/notemyprogress:usepluggin', $context);
+require_capability('local/notemyprogress:teacher_gamification', $context);
+require_capability('local/notemyprogress:setweeks', $context);
+
+$maxTimeSql = "SELECT MAX(timecreated) as maximum from {notemyprogress_gamification} where courseid=? ";
+$timecrated = $DB->get_record_sql($maxTimeSql, array("courseid="=>($courseid)));
+
+$sql = "SELECT enablegamification from {notemyprogress_gamification} where courseid=? AND timecreated=? ";
+$value = $DB->get_record_sql($sql, array("courseid="=>($courseid),"timecreated="=>$timecrated->maximum));
+if($value->enablegamification==1){
+    $swValue = true;
+}else{
+    $swValue = false;
+}
+
+$actualLink = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
+
+$logs = new \local_notemyprogress\logs($COURSE->id, $USER->id);
+$logs->addLogsNMP("viewed", "section", "CONFIGURATION_GAMIFICATION", "configuration_gamification", $actualLink, "Section where teacher can configure gamification"); 
+
+$configgamification = new \local_notemyprogress\configgamification($COURSE->id, $USER->id);
+$es = new \local_notemyprogress\event_strategy($COURSE, $USER);
+$reports = new \local_notemyprogress\teacher($COURSE->id, $USER->id);
+
+
+
+$content = [
+    'strings' =>[
+        'title' => get_string('tg_section_title', 'local_notemyprogress'),
+        'help_title' => get_string('tg_section_help_title', 'local_notemyprogress'),
+        'help_description' => get_string('tg_section_help_description', 'local_notemyprogress'),
+        'helplabel' => get_string("helplabel","local_notemyprogress"),
+        'error_network' => get_string('fml_api_error_network', 'local_notemyprogress'),
+        'save_successful' => get_string('fml_api_save_successful', 'local_notemyprogress'),
+        'cancel_action' => get_string('fml_api_cancel_action', 'local_notemyprogress'),
+        'save_warning_title' => get_string('tg_save_warning_title', 'local_notemyprogress'),
+        'save_warning_content' => get_string('tg_save_warning_content', 'local_notemyprogress'),
+        'confirm_ok' => get_string('tg_confirm_ok', 'local_notemyprogress'),
+        'confirm_cancel' => get_string('tg_confirm_cancel', 'local_notemyprogress'),
+        'exitbutton' => get_string("exitbutton","local_notemyprogress"),
+        'save' => get_string("tg_save","local_notemyprogress"),
+        'preview' => get_string("tg_section_preview","local_notemyprogress"),
+        'information' => get_string("tg_section_information","local_notemyprogress"),
+        'ranking' => get_string("tg_section_ranking","local_notemyprogress"),
+        'settings' => get_string("tg_section_settings","local_notemyprogress"),
+        'points' => get_string("tg_section_points","local_notemyprogress"),
+        'no_description' => get_string("tg_section_no_description","local_notemyprogress"),
+        'no_name' => get_string("tg_section_no_name","local_notemyprogress"),
+        'description' => get_string("tg_section_description","local_notemyprogress"),
+        'to_next_level' => get_string("tg_section_preview_next_level","local_notemyprogress"),
+        'ranking_text' => get_string("tg_section_ranking_ranking_text","local_notemyprogress"),
+        'level' => get_string("tg_section_ranking_level","local_notemyprogress"),
+        'student' => get_string("tg_section_ranking_student","local_notemyprogress"),
+        'total' => get_string("tg_section_ranking_total","local_notemyprogress"),
+        'progress' => get_string("tg_section_ranking_progress","local_notemyprogress"),
+        'appearance' => get_string("tg_section_settings_appearance","local_notemyprogress"),
+        'appearance_title' => get_string("tg_section_settings_appearance_title","local_notemyprogress"),
+        'settings_level' => get_string("tg_section_settings_levels","local_notemyprogress"),
+        'quantity' => get_string("tg_section_settings_levels_quantity","local_notemyprogress"),
+        'base_points' => get_string("tg_section_settings_levels_base_points","local_notemyprogress"),
+        'calculated' => get_string("tg_section_settings_levels_calculated","local_notemyprogress"),
+        'manually' => get_string("tg_section_settings_levels_manually","local_notemyprogress"),
+        'name' => get_string("tg_section_settings_levels_name","local_notemyprogress"),
+        'levels_required' => get_string("tg_section_settings_levels_required","local_notemyprogress"),
+        'rules' => get_string("tg_section_settings_rules","local_notemyprogress"),
+        'add_rule' => get_string("tg_section_settings_add_rule","local_notemyprogress"),
+        'earn' => get_string("tg_section_settings_earn","local_notemyprogress"),
+        'select_event' => get_string("tg_section_settings_select_event","local_notemyprogress"),
+        'enable'=>get_string("EnableGame","local_notemyprogress"),
+        'swValue'=>$swValue,
+        'chart' => $reports->get_chart_langs(),
+        'pointError'=>get_string("game_point_error","local_notemyprogress"),
+        'eventError'=>get_string("game_event_error","local_notemyprogress"),
+        'nameError'=>get_string("game_name_error","local_notemyprogress"),
+        'chartTitle'=>get_string("gm_Chart_Title","local_notemyprogress"),
+        'chartYaxis'=>get_string("gm_Chart_Y","local_notemyprogress"),
+    ],
+    'token' => local_notemyprogress_generate_token($COURSE->id, $USER->id, "teacher"),
+    'userid' => $USER->id,
+    'courseid' => $courseid,
+    'levels_data' => $configgamification->get_levels_data(),
+    'ranking' => $es->get_ranking(0),
+    'events' => $configgamification->events_list(),
+    'image' => $OUTPUT->image_url('badge', 'local_notemyprogress'),
+    'indicators' => $reports->get_general_indicators(),
+    'profile_render' => $reports->render_has(),
+    'timezone' => $reports->timezone,
+    'chart_data' => $configgamification->get_spread_chart($COURSE->id),
+];
+
+$templatecontext = [
+    'image' => $OUTPUT->image_url('badge', 'local_notemyprogress')
+];
+
+$PAGE->requires->js_call_amd('local_notemyprogress/gamification','init', ['content' => $content]); 
+echo $OUTPUT->header();
+echo $OUTPUT->render_from_template('local_notemyprogress/gamification', $templatecontext);
+echo $OUTPUT->footer();
\ No newline at end of file
diff --git a/notemyprogress/js/alertify.js b/notemyprogress/js/alertify.js
index 745a8a92965c172f231b528782f35106efec7de0..33a34522a46302071f7a3ef8f509c40a93b2749a 100644
--- a/notemyprogress/js/alertify.js
+++ b/notemyprogress/js/alertify.js
@@ -1,3609 +1,3831 @@
 /**
  * alertifyjs 1.11.4 http://alertifyjs.com
  * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications.
- * Copyright 2019 Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com) 
+ * Copyright 2019 Mohammad Younes <Mohammad@alertifyjs.com> (http://alertifyjs.com)
  * Licensed under GPL 3 <https://opensource.org/licenses/gpl-3.0>*/
-( function ( window ) {
-    'use strict';
-    
+(function (window) {
+  "use strict";
+
+  /**
+   * Keys enum
+   * @type {Object}
+   */
+  var keys = {
+    ENTER: 13,
+    ESC: 27,
+    F1: 112,
+    F12: 123,
+    LEFT: 37,
+    RIGHT: 39,
+  };
+  /**
+   * Default options
+   * @type {Object}
+   */
+  var defaults = {
+    autoReset: true,
+    basic: false,
+    closable: true,
+    closableByDimmer: true,
+    frameless: false,
+    maintainFocus: true, //global default not per instance, applies to all dialogs
+    maximizable: true,
+    modal: true,
+    movable: true,
+    moveBounded: false,
+    overflow: true,
+    padding: true,
+    pinnable: true,
+    pinned: true,
+    preventBodyShift: false, //global default not per instance, applies to all dialogs
+    resizable: true,
+    startMaximized: false,
+    transition: "pulse",
+    notifier: {
+      delay: 5,
+      position: "bottom-right",
+      closeButton: false,
+    },
+    glossary: {
+      title: "AlertifyJS",
+      ok: "OK",
+      cancel: "Cancel",
+      acccpt: "Accept",
+      deny: "Deny",
+      confirm: "Confirm",
+      decline: "Decline",
+      close: "Close",
+      maximize: "Maximize",
+      restore: "Restore",
+    },
+    theme: {
+      input: "ajs-input",
+      ok: "ajs-ok",
+      cancel: "ajs-cancel",
+    },
+  };
+
+  //holds open dialogs instances
+  var openDialogs = [];
+
+  /**
+   * [Helper]  Adds the specified class(es) to the element.
+   *
+   * @element {node}      The element
+   * @className {string}  One or more space-separated classes to be added to the class attribute of the element.
+   *
+   * @return {undefined}
+   */
+  function addClass(element, classNames) {
+    element.className += " " + classNames;
+  }
+
+  /**
+   * [Helper]  Removes the specified class(es) from the element.
+   *
+   * @element {node}      The element
+   * @className {string}  One or more space-separated classes to be removed from the class attribute of the element.
+   *
+   * @return {undefined}
+   */
+  function removeClass(element, classNames) {
+    var original = element.className.split(" ");
+    var toBeRemoved = classNames.split(" ");
+    for (var x = 0; x < toBeRemoved.length; x += 1) {
+      var index = original.indexOf(toBeRemoved[x]);
+      if (index > -1) {
+        original.splice(index, 1);
+      }
+    }
+    element.className = original.join(" ");
+  }
+
+  /**
+   * [Helper]  Checks if the document is RTL
+   *
+   * @return {Boolean} True if the document is RTL, false otherwise.
+   */
+  function isRightToLeft() {
+    return window.getComputedStyle(document.body).direction === "rtl";
+  }
+  /**
+   * [Helper]  Get the document current scrollTop
+   *
+   * @return {Number} current document scrollTop value
+   */
+  function getScrollTop() {
+    return (
+      (document.documentElement && document.documentElement.scrollTop) ||
+      document.body.scrollTop
+    );
+  }
+
+  /**
+   * [Helper]  Get the document current scrollLeft
+   *
+   * @return {Number} current document scrollLeft value
+   */
+  function getScrollLeft() {
+    return (
+      (document.documentElement && document.documentElement.scrollLeft) ||
+      document.body.scrollLeft
+    );
+  }
+
+  /**
+   * Helper: clear contents
+   *
+   */
+  function clearContents(element) {
+    while (element.lastChild) {
+      element.removeChild(element.lastChild);
+    }
+  }
+  /**
+   * Extends a given prototype by merging properties from base into sub.
+   *
+   * @sub {Object} sub The prototype being overwritten.
+   * @base {Object} base The prototype being written.
+   *
+   * @return {Object} The extended prototype.
+   */
+  function copy(src) {
+    if (null === src) {
+      return src;
+    }
+    var cpy;
+    if (Array.isArray(src)) {
+      cpy = [];
+      for (var x = 0; x < src.length; x += 1) {
+        cpy.push(copy(src[x]));
+      }
+      return cpy;
+    }
+
+    if (src instanceof Date) {
+      return new Date(src.getTime());
+    }
+
+    if (src instanceof RegExp) {
+      cpy = new RegExp(src.source);
+      cpy.global = src.global;
+      cpy.ignoreCase = src.ignoreCase;
+      cpy.multiline = src.multiline;
+      cpy.lastIndex = src.lastIndex;
+      return cpy;
+    }
+
+    if (typeof src === "object") {
+      cpy = {};
+      // copy dialog pototype over definition.
+      for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+          cpy[prop] = copy(src[prop]);
+        }
+      }
+      return cpy;
+    }
+    return src;
+  }
+  /**
+   * Helper: destruct the dialog
+   *
+   */
+  function destruct(instance, initialize) {
+    if (instance.elements) {
+      //delete the dom and it's references.
+      var root = instance.elements.root;
+      root.parentNode.removeChild(root);
+      delete instance.elements;
+      //copy back initial settings.
+      instance.settings = copy(instance.__settings);
+      //re-reference init function.
+      instance.__init = initialize;
+      //delete __internal variable to allow re-initialization.
+      delete instance.__internal;
+    }
+  }
+
+  /**
+   * Use a closure to return proper event listener method. Try to use
+   * `addEventListener` by default but fallback to `attachEvent` for
+   * unsupported browser. The closure simply ensures that the test doesn't
+   * happen every time the method is called.
+   *
+   * @param    {Node}     el    Node element
+   * @param    {String}   event Event type
+   * @param    {Function} fn    Callback of event
+   * @return   {Function}
+   */
+  var on = (function () {
+    if (document.addEventListener) {
+      return function (el, event, fn, useCapture) {
+        el.addEventListener(event, fn, useCapture === true);
+      };
+    } else if (document.attachEvent) {
+      return function (el, event, fn) {
+        el.attachEvent("on" + event, fn);
+      };
+    }
+  })();
+
+  /**
+   * Use a closure to return proper event listener method. Try to use
+   * `removeEventListener` by default but fallback to `detachEvent` for
+   * unsupported browser. The closure simply ensures that the test doesn't
+   * happen every time the method is called.
+   *
+   * @param    {Node}     el    Node element
+   * @param    {String}   event Event type
+   * @param    {Function} fn    Callback of event
+   * @return   {Function}
+   */
+  var off = (function () {
+    if (document.removeEventListener) {
+      return function (el, event, fn, useCapture) {
+        el.removeEventListener(event, fn, useCapture === true);
+      };
+    } else if (document.detachEvent) {
+      return function (el, event, fn) {
+        el.detachEvent("on" + event, fn);
+      };
+    }
+  })();
+
+  /**
+     * Prevent default event from firing
+     *
+     * @param  {Event} event Event object
+     * @return {undefined}
+
+    function prevent ( event ) {
+        if ( event ) {
+            if ( event.preventDefault ) {
+                event.preventDefault();
+            } else {
+                event.returnValue = false;
+            }
+        }
+    }
+    */
+  var transition = (function () {
+    var t, type;
+    var supported = false;
+    var transitions = {
+      animation: "animationend",
+      OAnimation: "oAnimationEnd oanimationend",
+      msAnimation: "MSAnimationEnd",
+      MozAnimation: "animationend",
+      WebkitAnimation: "webkitAnimationEnd",
+    };
+
+    for (t in transitions) {
+      if (document.documentElement.style[t] !== undefined) {
+        type = transitions[t];
+        supported = true;
+        break;
+      }
+    }
+
+    return {
+      type: type,
+      supported: supported,
+    };
+  })();
+
+  /**
+   * Creates event handler delegate that sends the instance as last argument.
+   *
+   * @return {Function}    a function wrapper which sends the instance as last argument.
+   */
+  function delegate(context, method) {
+    return function () {
+      if (arguments.length > 0) {
+        var args = [];
+        for (var x = 0; x < arguments.length; x += 1) {
+          args.push(arguments[x]);
+        }
+        args.push(context);
+        return method.apply(context, args);
+      }
+      return method.apply(context, [null, context]);
+    };
+  }
+  /**
+   * Helper for creating a dialog close event.
+   *
+   * @return {object}
+   */
+  function createCloseEvent(index, button) {
+    return {
+      index: index,
+      button: button,
+      cancel: false,
+    };
+  }
+  /**
+   * Helper for dispatching events.
+   *
+   * @param  {string} evenType The type of the event to disptach.
+   * @param  {object} instance The dialog instance disptaching the event.
+   *
+   * @return   {any}   The result of the invoked function.
+   */
+  function dispatchEvent(eventType, instance) {
+    if (typeof instance.get(eventType) === "function") {
+      return instance.get(eventType).call(instance);
+    }
+  }
+
+  /**
+   * Super class for all dialogs
+   *
+   * @return {Object}		base dialog prototype
+   */
+  var dialog = (function () {
+    var //holds the list of used keys.
+      usedKeys = [],
+      //dummy variable, used to trigger dom reflow.
+      reflow = null,
+      //holds body tab index in case it has any.
+      tabindex = false,
+      //condition for detecting safari
+      isSafari =
+        window.navigator.userAgent.indexOf("Safari") > -1 &&
+        window.navigator.userAgent.indexOf("Chrome") < 0,
+      //dialog building blocks
+      templates = {
+        dimmer: '<div class="ajs-dimmer"></div>',
+        /*tab index required to fire click event before body focus*/
+        modal: '<div class="ajs-modal" tabindex="0"></div>',
+        dialog: '<div class="ajs-dialog" tabindex="0"></div>',
+        reset: '<button class="ajs-reset"></button>',
+        commands:
+          '<div class="ajs-commands"><button class="ajs-pin"></button><button class="ajs-maximize"></button><button class="ajs-close"></button></div>',
+        header: '<div class="ajs-header"></div>',
+        body: '<div class="ajs-body"></div>',
+        content: '<div class="ajs-content"></div>',
+        footer: '<div class="ajs-footer"></div>',
+        buttons: {
+          primary: '<div class="ajs-primary ajs-buttons"></div>',
+          auxiliary: '<div class="ajs-auxiliary ajs-buttons"></div>',
+        },
+        button: '<button class="ajs-button"></button>',
+        resizeHandle: '<div class="ajs-handle"></div>',
+      },
+      //common class names
+      classes = {
+        animationIn: "ajs-in",
+        animationOut: "ajs-out",
+        base: "alertify",
+        basic: "ajs-basic",
+        capture: "ajs-capture",
+        closable: "ajs-closable",
+        fixed: "ajs-fixed",
+        frameless: "ajs-frameless",
+        hidden: "ajs-hidden",
+        maximize: "ajs-maximize",
+        maximized: "ajs-maximized",
+        maximizable: "ajs-maximizable",
+        modeless: "ajs-modeless",
+        movable: "ajs-movable",
+        noSelection: "ajs-no-selection",
+        noOverflow: "ajs-no-overflow",
+        noPadding: "ajs-no-padding",
+        pin: "ajs-pin",
+        pinnable: "ajs-pinnable",
+        prefix: "ajs-",
+        resizable: "ajs-resizable",
+        restore: "ajs-restore",
+        shake: "ajs-shake",
+        unpinned: "ajs-unpinned",
+      };
+
     /**
-     * Keys enum
-     * @type {Object}
+     * Helper: initializes the dialog instance
+     *
+     * @return	{Number}	The total count of currently open modals.
      */
-    var keys = {
-        ENTER: 13,
-        ESC: 27,
-        F1: 112,
-        F12: 123,
-        LEFT: 37,
-        RIGHT: 39
-    };
+    function initialize(instance) {
+      if (!instance.__internal) {
+        //no need to expose init after this.
+        delete instance.__init;
+
+        //keep a copy of initial dialog settings
+        if (!instance.__settings) {
+          instance.__settings = copy(instance.settings);
+        }
+
+        //get dialog buttons/focus setup
+        var setup;
+        if (typeof instance.setup === "function") {
+          setup = instance.setup();
+          setup.options = setup.options || {};
+          setup.focus = setup.focus || {};
+        } else {
+          setup = {
+            buttons: [],
+            focus: {
+              element: null,
+              select: false,
+            },
+            options: {},
+          };
+        }
+
+        //initialize hooks object.
+        if (typeof instance.hooks !== "object") {
+          instance.hooks = {};
+        }
+
+        //copy buttons defintion
+        var buttonsDefinition = [];
+        if (Array.isArray(setup.buttons)) {
+          for (var b = 0; b < setup.buttons.length; b += 1) {
+            var ref = setup.buttons[b],
+              cpy = {};
+            for (var i in ref) {
+              if (ref.hasOwnProperty(i)) {
+                cpy[i] = ref[i];
+              }
+            }
+            buttonsDefinition.push(cpy);
+          }
+        }
+
+        var internal = (instance.__internal = {
+          /**
+           * Flag holding the open state of the dialog
+           *
+           * @type {Boolean}
+           */
+          isOpen: false,
+          /**
+           * Active element is the element that will receive focus after
+           * closing the dialog. It defaults as the body tag, but gets updated
+           * to the last focused element before the dialog was opened.
+           *
+           * @type {Node}
+           */
+          activeElement: document.body,
+          timerIn: undefined,
+          timerOut: undefined,
+          buttons: buttonsDefinition,
+          focus: setup.focus,
+          options: {
+            title: undefined,
+            modal: undefined,
+            basic: undefined,
+            frameless: undefined,
+            pinned: undefined,
+            movable: undefined,
+            moveBounded: undefined,
+            resizable: undefined,
+            autoReset: undefined,
+            closable: undefined,
+            closableByDimmer: undefined,
+            maximizable: undefined,
+            startMaximized: undefined,
+            pinnable: undefined,
+            transition: undefined,
+            padding: undefined,
+            overflow: undefined,
+            onshow: undefined,
+            onclosing: undefined,
+            onclose: undefined,
+            onfocus: undefined,
+            onmove: undefined,
+            onmoved: undefined,
+            onresize: undefined,
+            onresized: undefined,
+            onmaximize: undefined,
+            onmaximized: undefined,
+            onrestore: undefined,
+            onrestored: undefined,
+          },
+          resetHandler: undefined,
+          beginMoveHandler: undefined,
+          beginResizeHandler: undefined,
+          bringToFrontHandler: undefined,
+          modalClickHandler: undefined,
+          buttonsClickHandler: undefined,
+          commandsClickHandler: undefined,
+          transitionInHandler: undefined,
+          transitionOutHandler: undefined,
+          destroy: undefined,
+        });
+
+        var elements = {};
+        //root node
+        elements.root = document.createElement("div");
+        //prevent FOUC in case of async styles loading.
+        elements.root.style.display = "none";
+        elements.root.className = classes.base + " " + classes.hidden + " ";
+
+        elements.root.innerHTML = templates.dimmer + templates.modal;
+
+        //dimmer
+        elements.dimmer = elements.root.firstChild;
+
+        //dialog
+        elements.modal = elements.root.lastChild;
+        elements.modal.innerHTML = templates.dialog;
+        elements.dialog = elements.modal.firstChild;
+        elements.dialog.innerHTML =
+          templates.reset +
+          templates.commands +
+          templates.header +
+          templates.body +
+          templates.footer +
+          templates.resizeHandle +
+          templates.reset;
+
+        //reset links
+        elements.reset = [];
+        elements.reset.push(elements.dialog.firstChild);
+        elements.reset.push(elements.dialog.lastChild);
+
+        //commands
+        elements.commands = {};
+        elements.commands.container = elements.reset[0].nextSibling;
+        elements.commands.pin = elements.commands.container.firstChild;
+        elements.commands.maximize = elements.commands.pin.nextSibling;
+        elements.commands.close = elements.commands.maximize.nextSibling;
+
+        //header
+        elements.header = elements.commands.container.nextSibling;
+
+        //body
+        elements.body = elements.header.nextSibling;
+        elements.body.innerHTML = templates.content;
+        elements.content = elements.body.firstChild;
+
+        //footer
+        elements.footer = elements.body.nextSibling;
+        elements.footer.innerHTML =
+          templates.buttons.auxiliary + templates.buttons.primary;
+
+        //resize handle
+        elements.resizeHandle = elements.footer.nextSibling;
+
+        //buttons
+        elements.buttons = {};
+        elements.buttons.auxiliary = elements.footer.firstChild;
+        elements.buttons.primary = elements.buttons.auxiliary.nextSibling;
+        elements.buttons.primary.innerHTML = templates.button;
+        elements.buttonTemplate = elements.buttons.primary.firstChild;
+        //remove button template
+        elements.buttons.primary.removeChild(elements.buttonTemplate);
+
+        for (var x = 0; x < instance.__internal.buttons.length; x += 1) {
+          var button = instance.__internal.buttons[x];
+
+          // add to the list of used keys.
+          if (usedKeys.indexOf(button.key) < 0) {
+            usedKeys.push(button.key);
+          }
+
+          button.element = elements.buttonTemplate.cloneNode();
+          button.element.innerHTML = button.text;
+          if (typeof button.className === "string" && button.className !== "") {
+            addClass(button.element, button.className);
+          }
+          for (var key in button.attrs) {
+            if (key !== "className" && button.attrs.hasOwnProperty(key)) {
+              button.element.setAttribute(key, button.attrs[key]);
+            }
+          }
+          if (button.scope === "auxiliary") {
+            elements.buttons.auxiliary.appendChild(button.element);
+          } else {
+            elements.buttons.primary.appendChild(button.element);
+          }
+        }
+        //make elements pubic
+        instance.elements = elements;
+
+        //save event handlers delegates
+        internal.resetHandler = delegate(instance, onReset);
+        internal.beginMoveHandler = delegate(instance, beginMove);
+        internal.beginResizeHandler = delegate(instance, beginResize);
+        internal.bringToFrontHandler = delegate(instance, bringToFront);
+        internal.modalClickHandler = delegate(instance, modalClickHandler);
+        internal.buttonsClickHandler = delegate(instance, buttonsClickHandler);
+        internal.commandsClickHandler = delegate(
+          instance,
+          commandsClickHandler
+        );
+        internal.transitionInHandler = delegate(
+          instance,
+          handleTransitionInEvent
+        );
+        internal.transitionOutHandler = delegate(
+          instance,
+          handleTransitionOutEvent
+        );
+
+        //settings
+        for (var opKey in internal.options) {
+          if (setup.options[opKey] !== undefined) {
+            // if found in user options
+            instance.set(opKey, setup.options[opKey]);
+          } else if (alertify.defaults.hasOwnProperty(opKey)) {
+            // else if found in defaults options
+            instance.set(opKey, alertify.defaults[opKey]);
+          } else if (opKey === "title") {
+            // else if title key, use alertify.defaults.glossary
+            instance.set(opKey, alertify.defaults.glossary[opKey]);
+          }
+        }
+
+        // allow dom customization
+        if (typeof instance.build === "function") {
+          instance.build();
+        }
+      }
+
+      //add to the end of the DOM tree.
+      document.body.appendChild(instance.elements.root);
+    }
+
     /**
-     * Default options 
-     * @type {Object}
+     * Helper: maintains scroll position
+     *
      */
-    var defaults = {
-        autoReset:true,
-        basic:false,
-        closable:true,
-        closableByDimmer:true,
-        frameless:false,
-        maintainFocus:true, //global default not per instance, applies to all dialogs
-        maximizable:true,
-        modal:true,
-        movable:true,
-        moveBounded:false,
-        overflow:true,
-        padding: true,
-        pinnable:true,
-        pinned:true,
-        preventBodyShift:false, //global default not per instance, applies to all dialogs
-        resizable:true,
-        startMaximized:false,
-        transition:'pulse',
-        notifier:{
-            delay:5,
-            position:'bottom-right',
-            closeButton:false
-        },
-        glossary:{
-            title:'AlertifyJS',
-            ok: 'OK',
-            cancel: 'Cancel',
-            acccpt: 'Accept',
-            deny: 'Deny',
-            confirm: 'Confirm',
-            decline: 'Decline',
-            close: 'Close',
-            maximize: 'Maximize',
-            restore: 'Restore',
-        },
-        theme:{
-            input:'ajs-input',
-            ok:'ajs-ok',
-            cancel:'ajs-cancel',
-        }
-    };
-    
-    //holds open dialogs instances
-    var openDialogs = [];
+    var scrollX, scrollY;
+    function saveScrollPosition() {
+      scrollX = getScrollLeft();
+      scrollY = getScrollTop();
+    }
+    function restoreScrollPosition() {
+      window.scrollTo(scrollX, scrollY);
+    }
 
     /**
-     * [Helper]  Adds the specified class(es) to the element.
+     * Helper: adds/removes no-overflow class from body
+     *
+     */
+    function ensureNoOverflow() {
+      var requiresNoOverflow = 0;
+      for (var x = 0; x < openDialogs.length; x += 1) {
+        var instance = openDialogs[x];
+        if (instance.isModal() || instance.isMaximized()) {
+          requiresNoOverflow += 1;
+        }
+      }
+      if (
+        requiresNoOverflow === 0 &&
+        document.body.className.indexOf(classes.noOverflow) >= 0
+      ) {
+        //last open modal or last maximized one
+        removeClass(document.body, classes.noOverflow);
+        preventBodyShift(false);
+      } else if (
+        requiresNoOverflow > 0 &&
+        document.body.className.indexOf(classes.noOverflow) < 0
+      ) {
+        //first open modal or first maximized one
+        preventBodyShift(true);
+        addClass(document.body, classes.noOverflow);
+      }
+    }
+    var top = "",
+      topScroll = 0;
+    /**
+     * Helper: prevents body shift.
+     *
+     */
+    function preventBodyShift(add) {
+      if (alertify.defaults.preventBodyShift) {
+        if (
+          add &&
+          document.documentElement.scrollHeight >
+            document.documentElement.clientHeight
+        ) {
+          //&& openDialogs[openDialogs.length-1].elements.dialog.clientHeight <= document.documentElement.clientHeight){
+          topScroll = scrollY;
+          top = window.getComputedStyle(document.body).top;
+          addClass(document.body, classes.fixed);
+          document.body.style.top = -scrollY + "px";
+        } else if (!add) {
+          scrollY = topScroll;
+          document.body.style.top = top;
+          removeClass(document.body, classes.fixed);
+          restoreScrollPosition();
+        }
+      }
+    }
+
+    /**
+     * Sets the name of the transition used to show/hide the dialog
+     *
+     * @param {Object} instance The dilog instance.
      *
-     * @element {node}      The element
-     * @className {string}  One or more space-separated classes to be added to the class attribute of the element.
-     * 
-     * @return {undefined}
      */
-    function addClass(element,classNames){
-        element.className += ' ' + classNames;
+    function updateTransition(instance, value, oldValue) {
+      if (typeof oldValue === "string") {
+        removeClass(instance.elements.root, classes.prefix + oldValue);
+      }
+      addClass(instance.elements.root, classes.prefix + value);
+      reflow = instance.elements.root.offsetWidth;
     }
-    
+
     /**
-     * [Helper]  Removes the specified class(es) from the element.
+     * Toggles the dialog display mode
+     *
+     * @param {Object} instance The dilog instance.
      *
-     * @element {node}      The element
-     * @className {string}  One or more space-separated classes to be removed from the class attribute of the element.
-     * 
      * @return {undefined}
      */
-    function removeClass(element, classNames) {
-        var original = element.className.split(' ');
-        var toBeRemoved = classNames.split(' ');
-        for (var x = 0; x < toBeRemoved.length; x += 1) {
-            var index = original.indexOf(toBeRemoved[x]);
-            if (index > -1){
-                original.splice(index,1);
-            }
+    function updateDisplayMode(instance) {
+      if (instance.get("modal")) {
+        //make modal
+        removeClass(instance.elements.root, classes.modeless);
+
+        //only if open
+        if (instance.isOpen()) {
+          unbindModelessEvents(instance);
+
+          //in case a pinned modless dialog was made modal while open.
+          updateAbsPositionFix(instance);
+
+          ensureNoOverflow();
+        }
+      } else {
+        //make modelss
+        addClass(instance.elements.root, classes.modeless);
+
+        //only if open
+        if (instance.isOpen()) {
+          bindModelessEvents(instance);
+
+          //in case pin/unpin was called while a modal is open
+          updateAbsPositionFix(instance);
+
+          ensureNoOverflow();
         }
-        element.className = original.join(' ');
+      }
     }
 
     /**
-     * [Helper]  Checks if the document is RTL
+     * Toggles the dialog basic view mode
+     *
+     * @param {Object} instance The dilog instance.
      *
-     * @return {Boolean} True if the document is RTL, false otherwise.
+     * @return {undefined}
      */
-    function isRightToLeft(){
-        return window.getComputedStyle(document.body).direction === 'rtl';
+    function updateBasicMode(instance) {
+      if (instance.get("basic")) {
+        // add class
+        addClass(instance.elements.root, classes.basic);
+      } else {
+        // remove class
+        removeClass(instance.elements.root, classes.basic);
+      }
     }
+
     /**
-     * [Helper]  Get the document current scrollTop
+     * Toggles the dialog frameless view mode
      *
-     * @return {Number} current document scrollTop value
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
      */
-    function getScrollTop(){
-        return ((document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop);
+    function updateFramelessMode(instance) {
+      if (instance.get("frameless")) {
+        // add class
+        addClass(instance.elements.root, classes.frameless);
+      } else {
+        // remove class
+        removeClass(instance.elements.root, classes.frameless);
+      }
     }
 
     /**
-     * [Helper]  Get the document current scrollLeft
+     * Helper: Brings the modeless dialog to front, attached to modeless dialogs.
      *
-     * @return {Number} current document scrollLeft value
+     * @param {Event} event Focus event
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
      */
-    function getScrollLeft(){
-        return ((document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft);
+    function bringToFront(event, instance) {
+      // Do not bring to front if preceeded by an open modal
+      var index = openDialogs.indexOf(instance);
+      for (var x = index + 1; x < openDialogs.length; x += 1) {
+        if (openDialogs[x].isModal()) {
+          return;
+        }
+      }
+
+      // Bring to front by making it the last child.
+      if (document.body.lastChild !== instance.elements.root) {
+        document.body.appendChild(instance.elements.root);
+        //also make sure its at the end of the list
+        openDialogs.splice(openDialogs.indexOf(instance), 1);
+        openDialogs.push(instance);
+        setFocus(instance);
+      }
+
+      return false;
     }
 
     /**
-    * Helper: clear contents
-    *
-    */
-    function clearContents(element){
-        while (element.lastChild) {
-            element.removeChild(element.lastChild);
-        }
+     * Helper: reflects dialogs options updates
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {String} option The updated option name.
+     *
+     * @return	{undefined}
+     */
+    function optionUpdated(instance, option, oldValue, newValue) {
+      switch (option) {
+        case "title":
+          instance.setHeader(newValue);
+          break;
+        case "modal":
+          updateDisplayMode(instance);
+          break;
+        case "basic":
+          updateBasicMode(instance);
+          break;
+        case "frameless":
+          updateFramelessMode(instance);
+          break;
+        case "pinned":
+          updatePinned(instance);
+          break;
+        case "closable":
+          updateClosable(instance);
+          break;
+        case "maximizable":
+          updateMaximizable(instance);
+          break;
+        case "pinnable":
+          updatePinnable(instance);
+          break;
+        case "movable":
+          updateMovable(instance);
+          break;
+        case "resizable":
+          updateResizable(instance);
+          break;
+        case "padding":
+          if (newValue) {
+            removeClass(instance.elements.root, classes.noPadding);
+          } else if (
+            instance.elements.root.className.indexOf(classes.noPadding) < 0
+          ) {
+            addClass(instance.elements.root, classes.noPadding);
+          }
+          break;
+        case "overflow":
+          if (newValue) {
+            removeClass(instance.elements.root, classes.noOverflow);
+          } else if (
+            instance.elements.root.className.indexOf(classes.noOverflow) < 0
+          ) {
+            addClass(instance.elements.root, classes.noOverflow);
+          }
+          break;
+        case "transition":
+          updateTransition(instance, newValue, oldValue);
+          break;
+      }
+
+      // internal on option updated event
+      if (typeof instance.hooks.onupdate === "function") {
+        instance.hooks.onupdate.call(instance, option, oldValue, newValue);
+      }
     }
+
     /**
-     * Extends a given prototype by merging properties from base into sub.
+     * Helper: reflects dialogs options updates
      *
-     * @sub {Object} sub The prototype being overwritten.
-     * @base {Object} base The prototype being written.
+     * @param {Object} instance The dilog instance.
+     * @param {Object} obj The object to set/get a value on/from.
+     * @param {Function} callback The callback function to call if the key was found.
+     * @param {String|Object} key A string specifying a propery name or a collection of key value pairs.
+     * @param {Object} value Optional, the value associated with the key (in case it was a string).
+     * @param {String} option The updated option name.
      *
-     * @return {Object} The extended prototype.
+     * @return	{Object} result object
+     *	The result objects has an 'op' property, indicating of this is a SET or GET operation.
+     *		GET:
+     *		- found: a flag indicating if the key was found or not.
+     *		- value: the property value.
+     *		SET:
+     *		- items: a list of key value pairs of the properties being set.
+     *				each contains:
+     *					- found: a flag indicating if the key was found or not.
+     *					- key: the property key.
+     *					- value: the property value.
      */
-    function copy(src) {
-        if(null === src){
-            return src;
-        }
-        var cpy;
-        if(Array.isArray(src)){
-            cpy = [];
-            for(var x=0;x<src.length;x+=1){
-                cpy.push(copy(src[x]));
-            }
-            return cpy;
-        }
-      
-        if(src instanceof Date){
-            return new Date(src.getTime());
-        }
-      
-        if(src instanceof RegExp){
-            cpy = new RegExp(src.source);
-            cpy.global = src.global;
-            cpy.ignoreCase = src.ignoreCase;
-            cpy.multiline = src.multiline;
-            cpy.lastIndex = src.lastIndex;
-            return cpy;
-        }
-        
-        if(typeof src === 'object'){
-            cpy = {};
-            // copy dialog pototype over definition.
-            for (var prop in src) {
-                if (src.hasOwnProperty(prop)) {
-                    cpy[prop] = copy(src[prop]);
-                }
-            }
-            return cpy;
-        }
-        return src;
+    function update(instance, obj, callback, key, value) {
+      var result = { op: undefined, items: [] };
+      if (typeof value === "undefined" && typeof key === "string") {
+        //get
+        result.op = "get";
+        if (obj.hasOwnProperty(key)) {
+          result.found = true;
+          result.value = obj[key];
+        } else {
+          result.found = false;
+          result.value = undefined;
+        }
+      } else {
+        var old;
+        //set
+        result.op = "set";
+        if (typeof key === "object") {
+          //set multiple
+          var args = key;
+          for (var prop in args) {
+            if (obj.hasOwnProperty(prop)) {
+              if (obj[prop] !== args[prop]) {
+                old = obj[prop];
+                obj[prop] = args[prop];
+                callback.call(instance, prop, old, args[prop]);
+              }
+              result.items.push({ key: prop, value: args[prop], found: true });
+            } else {
+              result.items.push({ key: prop, value: args[prop], found: false });
+            }
+          }
+        } else if (typeof key === "string") {
+          //set single
+          if (obj.hasOwnProperty(key)) {
+            if (obj[key] !== value) {
+              old = obj[key];
+              obj[key] = value;
+              callback.call(instance, key, old, value);
+            }
+            result.items.push({ key: key, value: value, found: true });
+          } else {
+            result.items.push({ key: key, value: value, found: false });
+          }
+        } else {
+          //invalid params
+          throw new Error("args must be a string or object");
+        }
+      }
+      return result;
     }
+
     /**
-      * Helper: destruct the dialog
-      *
-      */
-    function destruct(instance, initialize){
-        if(instance.elements){
-            //delete the dom and it's references.
-            var root = instance.elements.root;
-            root.parentNode.removeChild(root);
-            delete instance.elements;
-            //copy back initial settings.
-            instance.settings = copy(instance.__settings);
-            //re-reference init function.
-            instance.__init = initialize;
-            //delete __internal variable to allow re-initialization.
-            delete instance.__internal;
-        }
+     * Triggers a close event.
+     *
+     * @param {Object} instance	The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function triggerClose(instance) {
+      var found;
+      triggerCallback(instance, function (button) {
+        return (found = button.invokeOnClose === true);
+      });
+      //none of the buttons registered as onclose callback
+      //close the dialog
+      if (!found && instance.isOpen()) {
+        instance.close();
+      }
     }
 
     /**
-     * Use a closure to return proper event listener method. Try to use
-     * `addEventListener` by default but fallback to `attachEvent` for
-     * unsupported browser. The closure simply ensures that the test doesn't
-     * happen every time the method is called.
-     *
-     * @param    {Node}     el    Node element
-     * @param    {String}   event Event type
-     * @param    {Function} fn    Callback of event
-     * @return   {Function}
+     * Dialogs commands event handler, attached to the dialog commands element.
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Object} instance	The dilog instance.
+     *
+     * @return {undefined}
      */
-    var on = (function () {
-        if (document.addEventListener) {
-            return function (el, event, fn, useCapture) {
-                el.addEventListener(event, fn, useCapture === true);
-            };
-        } else if (document.attachEvent) {
-            return function (el, event, fn) {
-                el.attachEvent('on' + event, fn);
-            };
-        }
-    }());
+    function commandsClickHandler(event, instance) {
+      var target = event.srcElement || event.target;
+      switch (target) {
+        case instance.elements.commands.pin:
+          if (!instance.isPinned()) {
+            pin(instance);
+          } else {
+            unpin(instance);
+          }
+          break;
+        case instance.elements.commands.maximize:
+          if (!instance.isMaximized()) {
+            maximize(instance);
+          } else {
+            restore(instance);
+          }
+          break;
+        case instance.elements.commands.close:
+          triggerClose(instance);
+          break;
+      }
+      return false;
+    }
 
     /**
-     * Use a closure to return proper event listener method. Try to use
-     * `removeEventListener` by default but fallback to `detachEvent` for
-     * unsupported browser. The closure simply ensures that the test doesn't
-     * happen every time the method is called.
-     *
-     * @param    {Node}     el    Node element
-     * @param    {String}   event Event type
-     * @param    {Function} fn    Callback of event
-     * @return   {Function}
+     * Helper: pins the modeless dialog.
+     *
+     * @param {Object} instance	The dialog instance.
+     *
+     * @return {undefined}
      */
-    var off = (function () {
-        if (document.removeEventListener) {
-            return function (el, event, fn, useCapture) {
-                el.removeEventListener(event, fn, useCapture === true);
-            };
-        } else if (document.detachEvent) {
-            return function (el, event, fn) {
-                el.detachEvent('on' + event, fn);
-            };
-        }
-    }());
+    function pin(instance) {
+      //pin the dialog
+      instance.set("pinned", true);
+    }
 
     /**
-     * Prevent default event from firing
+     * Helper: unpins the modeless dialog.
+     *
+     * @param {Object} instance	The dilog instance.
      *
-     * @param  {Event} event Event object
      * @return {undefined}
+     */
+    function unpin(instance) {
+      //unpin the dialog
+      instance.set("pinned", false);
+    }
 
-    function prevent ( event ) {
-        if ( event ) {
-            if ( event.preventDefault ) {
-                event.preventDefault();
-            } else {
-                event.returnValue = false;
-            }
-        }
+    /**
+     * Helper: enlarges the dialog to fill the entire screen.
+     *
+     * @param {Object} instance	The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function maximize(instance) {
+      // allow custom `onmaximize` method
+      dispatchEvent("onmaximize", instance);
+      //maximize the dialog
+      addClass(instance.elements.root, classes.maximized);
+      if (instance.isOpen()) {
+        ensureNoOverflow();
+      }
+      // allow custom `onmaximized` method
+      dispatchEvent("onmaximized", instance);
     }
-    */
-    var transition = (function () {
-        var t, type;
-        var supported = false;
-        var transitions = {
-            'animation'        : 'animationend',
-            'OAnimation'       : 'oAnimationEnd oanimationend',
-            'msAnimation'      : 'MSAnimationEnd',
-            'MozAnimation'     : 'animationend',
-            'WebkitAnimation'  : 'webkitAnimationEnd'
-        };
 
-        for (t in transitions) {
-            if (document.documentElement.style[t] !== undefined) {
-                type = transitions[t];
-                supported = true;
-                break;
-            }
-        }
+    /**
+     * Helper: returns the dialog to its former size.
+     *
+     * @param {Object} instance	The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function restore(instance) {
+      // allow custom `onrestore` method
+      dispatchEvent("onrestore", instance);
+      //maximize the dialog
+      removeClass(instance.elements.root, classes.maximized);
+      if (instance.isOpen()) {
+        ensureNoOverflow();
+      }
+      // allow custom `onrestored` method
+      dispatchEvent("onrestored", instance);
+    }
 
-        return {
-            type: type,
-            supported: supported
-        };
-    }());
+    /**
+     * Show or hide the maximize box.
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to add the behavior, removes it otherwise.
+     *
+     * @return {undefined}
+     */
+    function updatePinnable(instance) {
+      if (instance.get("pinnable")) {
+        // add class
+        addClass(instance.elements.root, classes.pinnable);
+      } else {
+        // remove class
+        removeClass(instance.elements.root, classes.pinnable);
+      }
+    }
 
     /**
-    * Creates event handler delegate that sends the instance as last argument.
-    * 
-    * @return {Function}    a function wrapper which sends the instance as last argument.
-    */
-    function delegate(context, method) {
-        return function () {
-            if (arguments.length > 0) {
-                var args = [];
-                for (var x = 0; x < arguments.length; x += 1) {
-                    args.push(arguments[x]);
-                }
-                args.push(context);
-                return method.apply(context, args);
-            }
-            return method.apply(context, [null, context]);
-        };
+     * Helper: Fixes the absolutly positioned modal div position.
+     *
+     * @param {Object} instance The dialog instance.
+     *
+     * @return {undefined}
+     */
+    function addAbsPositionFix(instance) {
+      var scrollLeft = getScrollLeft();
+      instance.elements.modal.style.marginTop = getScrollTop() + "px";
+      instance.elements.modal.style.marginLeft = scrollLeft + "px";
+      instance.elements.modal.style.marginRight = -scrollLeft + "px";
     }
+
     /**
-    * Helper for creating a dialog close event.
-    * 
-    * @return {object}
-    */
-    function createCloseEvent(index, button) {
-        return {
-            index: index,
-            button: button,
-            cancel: false
-        };
+     * Helper: Removes the absolutly positioned modal div position fix.
+     *
+     * @param {Object} instance The dialog instance.
+     *
+     * @return {undefined}
+     */
+    function removeAbsPositionFix(instance) {
+      var marginTop = parseInt(instance.elements.modal.style.marginTop, 10);
+      var marginLeft = parseInt(instance.elements.modal.style.marginLeft, 10);
+      instance.elements.modal.style.marginTop = "";
+      instance.elements.modal.style.marginLeft = "";
+      instance.elements.modal.style.marginRight = "";
+
+      if (instance.isOpen()) {
+        var top = 0,
+          left = 0;
+        if (instance.elements.dialog.style.top !== "") {
+          top = parseInt(instance.elements.dialog.style.top, 10);
+        }
+        instance.elements.dialog.style.top =
+          top + (marginTop - getScrollTop()) + "px";
+
+        if (instance.elements.dialog.style.left !== "") {
+          left = parseInt(instance.elements.dialog.style.left, 10);
+        }
+        instance.elements.dialog.style.left =
+          left + (marginLeft - getScrollLeft()) + "px";
+      }
     }
     /**
-    * Helper for dispatching events.
-    *
-    * @param  {string} evenType The type of the event to disptach.
-    * @param  {object} instance The dialog instance disptaching the event.
-    *
-    * @return   {any}   The result of the invoked function.
-    */
-    function dispatchEvent(eventType, instance) {
-        if ( typeof instance.get(eventType) === 'function' ) {
-            return instance.get(eventType).call(instance);
-        }
+     * Helper: Adds/Removes the absolutly positioned modal div position fix based on its pinned setting.
+     *
+     * @param {Object} instance The dialog instance.
+     *
+     * @return {undefined}
+     */
+    function updateAbsPositionFix(instance) {
+      // if modeless and unpinned add fix
+      if (!instance.get("modal") && !instance.get("pinned")) {
+        addAbsPositionFix(instance);
+      } else {
+        removeAbsPositionFix(instance);
+      }
+    }
+    /**
+     * Toggles the dialog position lock | modeless only.
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to make it modal, false otherwise.
+     *
+     * @return {undefined}
+     */
+    function updatePinned(instance) {
+      if (instance.get("pinned")) {
+        removeClass(instance.elements.root, classes.unpinned);
+        if (instance.isOpen()) {
+          removeAbsPositionFix(instance);
+        }
+      } else {
+        addClass(instance.elements.root, classes.unpinned);
+        if (instance.isOpen() && !instance.isModal()) {
+          addAbsPositionFix(instance);
+        }
+      }
     }
 
+    /**
+     * Show or hide the maximize box.
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to add the behavior, removes it otherwise.
+     *
+     * @return {undefined}
+     */
+    function updateMaximizable(instance) {
+      if (instance.get("maximizable")) {
+        // add class
+        addClass(instance.elements.root, classes.maximizable);
+      } else {
+        // remove class
+        removeClass(instance.elements.root, classes.maximizable);
+      }
+    }
 
     /**
-     * Super class for all dialogs
+     * Show or hide the close box.
      *
-     * @return {Object}		base dialog prototype
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to add the behavior, removes it otherwise.
+     *
+     * @return {undefined}
      */
-    var dialog = (function () {
-        var //holds the list of used keys.
-            usedKeys = [],
-            //dummy variable, used to trigger dom reflow.
-            reflow = null,
-            //holds body tab index in case it has any.
-            tabindex = false,
-            //condition for detecting safari
-            isSafari = window.navigator.userAgent.indexOf('Safari') > -1 && window.navigator.userAgent.indexOf('Chrome') < 0,
-            //dialog building blocks
-            templates = {
-                dimmer:'<div class="ajs-dimmer"></div>',
-                /*tab index required to fire click event before body focus*/
-                modal: '<div class="ajs-modal" tabindex="0"></div>',
-                dialog: '<div class="ajs-dialog" tabindex="0"></div>',
-                reset: '<button class="ajs-reset"></button>',
-                commands: '<div class="ajs-commands"><button class="ajs-pin"></button><button class="ajs-maximize"></button><button class="ajs-close"></button></div>',
-                header: '<div class="ajs-header"></div>',
-                body: '<div class="ajs-body"></div>',
-                content: '<div class="ajs-content"></div>',
-                footer: '<div class="ajs-footer"></div>',
-                buttons: { primary: '<div class="ajs-primary ajs-buttons"></div>', auxiliary: '<div class="ajs-auxiliary ajs-buttons"></div>' },
-                button: '<button class="ajs-button"></button>',
-                resizeHandle: '<div class="ajs-handle"></div>',
-            },
-            //common class names
-            classes = {
-                animationIn: 'ajs-in',
-                animationOut: 'ajs-out',
-                base: 'alertify',
-                basic:'ajs-basic',
-                capture: 'ajs-capture',
-                closable:'ajs-closable',
-                fixed: 'ajs-fixed',
-                frameless:'ajs-frameless',
-                hidden: 'ajs-hidden',
-                maximize: 'ajs-maximize',
-                maximized: 'ajs-maximized',
-                maximizable:'ajs-maximizable',
-                modeless: 'ajs-modeless',
-                movable: 'ajs-movable',
-                noSelection: 'ajs-no-selection',
-                noOverflow: 'ajs-no-overflow',
-                noPadding:'ajs-no-padding',
-                pin:'ajs-pin',
-                pinnable:'ajs-pinnable',
-                prefix: 'ajs-',
-                resizable: 'ajs-resizable',
-                restore: 'ajs-restore',
-                shake:'ajs-shake',
-                unpinned:'ajs-unpinned',
-            };
+    function updateClosable(instance) {
+      if (instance.get("closable")) {
+        // add class
+        addClass(instance.elements.root, classes.closable);
+        bindClosableEvents(instance);
+      } else {
+        // remove class
+        removeClass(instance.elements.root, classes.closable);
+        unbindClosableEvents(instance);
+      }
+    }
 
-        /**
-         * Helper: initializes the dialog instance
-         * 
-         * @return	{Number}	The total count of currently open modals.
-         */
-        function initialize(instance){
-            
-            if(!instance.__internal){
-
-                //no need to expose init after this.
-                delete instance.__init;
-              
-                //keep a copy of initial dialog settings
-                if(!instance.__settings){
-                    instance.__settings = copy(instance.settings);
-                }
-                
-                //get dialog buttons/focus setup
-                var setup;
-                if(typeof instance.setup === 'function'){
-                    setup = instance.setup();
-                    setup.options = setup.options  || {};
-                    setup.focus = setup.focus  || {};
-                }else{
-                    setup = {
-                        buttons:[],
-                        focus:{
-                            element:null,
-                            select:false
-                        },
-                        options:{
-                        }
-                    };
-                }
-                
-                //initialize hooks object.
-                if(typeof instance.hooks !== 'object'){
-                    instance.hooks = {};
-                }
+    var cancelClick = false, // flag to cancel click event if already handled by end resize event (the mousedown, mousemove, mouseup sequence fires a click event.).
+      modalClickHandlerTS = 0; // stores last click timestamp to prevent executing the handler twice on double click.
+    /**
+     * Helper: closes the modal dialog when clicking the modal
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function modalClickHandler(event, instance) {
+      if (
+        event.timeStamp - modalClickHandlerTS > 200 &&
+        (modalClickHandlerTS = event.timeStamp) &&
+        !cancelClick
+      ) {
+        var target = event.srcElement || event.target;
+        if (
+          instance.get("closableByDimmer") === true &&
+          target === instance.elements.modal
+        ) {
+          triggerClose(instance);
+        }
+        cancelClick = false;
+        return false;
+      }
+    }
 
-                //copy buttons defintion
-                var buttonsDefinition = [];
-                if(Array.isArray(setup.buttons)){
-                    for(var b=0;b<setup.buttons.length;b+=1){
-                        var ref  = setup.buttons[b],
-                            cpy = {};
-                        for (var i in ref) {
-                            if (ref.hasOwnProperty(i)) {
-                                cpy[i] = ref[i];
-                            }
-                        }
-                        buttonsDefinition.push(cpy);
-                    }
-                }
+    // stores last call timestamp to prevent triggering the callback twice.
+    var callbackTS = 0;
+    // flag to cancel keyup event if already handled by click event (pressing Enter on a focusted button).
+    var cancelKeyup = false;
+    /**
+     * Helper: triggers a button callback
+     *
+     * @param {Object}		The dilog instance.
+     * @param {Function}	Callback to check which button triggered the event.
+     *
+     * @return {undefined}
+     */
+    function triggerCallback(instance, check) {
+      if (Date.now() - callbackTS > 200 && (callbackTS = Date.now())) {
+        for (var idx = 0; idx < instance.__internal.buttons.length; idx += 1) {
+          var button = instance.__internal.buttons[idx];
+          if (!button.element.disabled && check(button)) {
+            var closeEvent = createCloseEvent(idx, button);
+            if (typeof instance.callback === "function") {
+              instance.callback.apply(instance, [closeEvent]);
+            }
+            //close the dialog only if not canceled.
+            if (closeEvent.cancel === false) {
+              instance.close();
+            }
+            break;
+          }
+        }
+      }
+    }
 
-                var internal = instance.__internal = {
-                    /**
-                     * Flag holding the open state of the dialog
-                     * 
-                     * @type {Boolean}
-                     */
-                    isOpen:false,
-                    /**
-                     * Active element is the element that will receive focus after
-                     * closing the dialog. It defaults as the body tag, but gets updated
-                     * to the last focused element before the dialog was opened.
-                     *
-                     * @type {Node}
-                     */
-                    activeElement:document.body,
-                    timerIn:undefined,
-                    timerOut:undefined,
-                    buttons: buttonsDefinition,
-                    focus: setup.focus,
-                    options: {
-                        title: undefined,
-                        modal: undefined,
-                        basic:undefined,
-                        frameless:undefined,
-                        pinned: undefined,
-                        movable: undefined,
-                        moveBounded:undefined,
-                        resizable: undefined,
-                        autoReset: undefined,
-                        closable: undefined,
-                        closableByDimmer: undefined,
-                        maximizable: undefined,
-                        startMaximized: undefined,
-                        pinnable: undefined,
-                        transition: undefined,
-                        padding:undefined,
-                        overflow:undefined,
-                        onshow:undefined,
-                        onclosing:undefined,
-                        onclose:undefined,
-                        onfocus:undefined,
-                        onmove:undefined,
-                        onmoved:undefined,
-                        onresize:undefined,
-                        onresized:undefined,
-                        onmaximize:undefined,
-                        onmaximized:undefined,
-                        onrestore:undefined,
-                        onrestored:undefined
-                    },
-                    resetHandler:undefined,
-                    beginMoveHandler:undefined,
-                    beginResizeHandler:undefined,
-                    bringToFrontHandler:undefined,
-                    modalClickHandler:undefined,
-                    buttonsClickHandler:undefined,
-                    commandsClickHandler:undefined,
-                    transitionInHandler:undefined,
-                    transitionOutHandler:undefined,
-                    destroy:undefined
-                };
-
-                var elements = {};
-                //root node
-                elements.root = document.createElement('div');
-                //prevent FOUC in case of async styles loading.
-                elements.root.style.display = 'none';
-                elements.root.className = classes.base + ' ' + classes.hidden + ' ';
-
-                elements.root.innerHTML = templates.dimmer + templates.modal;
-                
-                //dimmer
-                elements.dimmer = elements.root.firstChild;
-
-                //dialog
-                elements.modal = elements.root.lastChild;
-                elements.modal.innerHTML = templates.dialog;
-                elements.dialog = elements.modal.firstChild;
-                elements.dialog.innerHTML = templates.reset + templates.commands + templates.header + templates.body + templates.footer + templates.resizeHandle + templates.reset;
-
-                //reset links
-                elements.reset = [];
-                elements.reset.push(elements.dialog.firstChild);
-                elements.reset.push(elements.dialog.lastChild);
-                
-                //commands
-                elements.commands = {};
-                elements.commands.container = elements.reset[0].nextSibling;
-                elements.commands.pin = elements.commands.container.firstChild;
-                elements.commands.maximize = elements.commands.pin.nextSibling;
-                elements.commands.close = elements.commands.maximize.nextSibling;
-                
-                //header
-                elements.header = elements.commands.container.nextSibling;
-
-                //body
-                elements.body = elements.header.nextSibling;
-                elements.body.innerHTML = templates.content;
-                elements.content = elements.body.firstChild;
-
-                //footer
-                elements.footer = elements.body.nextSibling;
-                elements.footer.innerHTML = templates.buttons.auxiliary + templates.buttons.primary;
-                
-                //resize handle
-                elements.resizeHandle = elements.footer.nextSibling;
-
-                //buttons
-                elements.buttons = {};
-                elements.buttons.auxiliary = elements.footer.firstChild;
-                elements.buttons.primary = elements.buttons.auxiliary.nextSibling;
-                elements.buttons.primary.innerHTML = templates.button;
-                elements.buttonTemplate = elements.buttons.primary.firstChild;
-                //remove button template
-                elements.buttons.primary.removeChild(elements.buttonTemplate);
-                               
-                for(var x=0; x < instance.__internal.buttons.length; x+=1) {
-                    var button = instance.__internal.buttons[x];
-                    
-                    // add to the list of used keys.
-                    if(usedKeys.indexOf(button.key) < 0){
-                        usedKeys.push(button.key);
-                    }
-
-                    button.element = elements.buttonTemplate.cloneNode();
-                    button.element.innerHTML = button.text;
-                    if(typeof button.className === 'string' &&  button.className !== ''){
-                        addClass(button.element, button.className);
-                    }
-                    for(var key in button.attrs){
-                        if(key !== 'className' && button.attrs.hasOwnProperty(key)){
-                            button.element.setAttribute(key, button.attrs[key]);
-                        }
-                    }
-                    if(button.scope === 'auxiliary'){
-                        elements.buttons.auxiliary.appendChild(button.element);
-                    }else{
-                        elements.buttons.primary.appendChild(button.element);
-                    }
-                }
-                //make elements pubic
-                instance.elements = elements;
-                
-                //save event handlers delegates
-                internal.resetHandler = delegate(instance, onReset);
-                internal.beginMoveHandler = delegate(instance, beginMove);
-                internal.beginResizeHandler = delegate(instance, beginResize);
-                internal.bringToFrontHandler = delegate(instance, bringToFront);
-                internal.modalClickHandler = delegate(instance, modalClickHandler);
-                internal.buttonsClickHandler = delegate(instance, buttonsClickHandler);
-                internal.commandsClickHandler = delegate(instance, commandsClickHandler);
-                internal.transitionInHandler = delegate(instance, handleTransitionInEvent);
-                internal.transitionOutHandler = delegate(instance, handleTransitionOutEvent);
-
-                //settings
-                for(var opKey in internal.options){
-                    if(setup.options[opKey] !== undefined){
-                        // if found in user options
-                        instance.set(opKey, setup.options[opKey]);
-                    }else if(alertify.defaults.hasOwnProperty(opKey)) {
-                        // else if found in defaults options
-                        instance.set(opKey, alertify.defaults[opKey]);
-                    }else if(opKey === 'title' ) {
-                        // else if title key, use alertify.defaults.glossary
-                        instance.set(opKey, alertify.defaults.glossary[opKey]);
-                    }
-                }
+    /**
+     * Clicks event handler, attached to the dialog footer.
+     *
+     * @param {Event}		DOM event object.
+     * @param {Object}		The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function buttonsClickHandler(event, instance) {
+      var target = event.srcElement || event.target;
+      triggerCallback(instance, function (button) {
+        // if this button caused the click, cancel keyup event
+        return button.element === target && (cancelKeyup = true);
+      });
+    }
 
-                // allow dom customization
-                if(typeof instance.build === 'function'){
-                    instance.build();
-                }
+    /**
+     * Keyup event handler, attached to the document.body
+     *
+     * @param {Event}		DOM event object.
+     * @param {Object}		The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function keyupHandler(event) {
+      //hitting enter while button has focus will trigger keyup too.
+      //ignore if handled by clickHandler
+      if (cancelKeyup) {
+        cancelKeyup = false;
+        return;
+      }
+      var instance = openDialogs[openDialogs.length - 1];
+      var keyCode = event.keyCode;
+      if (
+        instance.__internal.buttons.length === 0 &&
+        keyCode === keys.ESC &&
+        instance.get("closable") === true
+      ) {
+        triggerClose(instance);
+        return false;
+      } else if (usedKeys.indexOf(keyCode) > -1) {
+        triggerCallback(instance, function (button) {
+          return button.key === keyCode;
+        });
+        return false;
+      }
+    }
+    /**
+     * Keydown event handler, attached to the document.body
+     *
+     * @param {Event}		DOM event object.
+     * @param {Object}		The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function keydownHandler(event) {
+      var instance = openDialogs[openDialogs.length - 1];
+      var keyCode = event.keyCode;
+      if (keyCode === keys.LEFT || keyCode === keys.RIGHT) {
+        var buttons = instance.__internal.buttons;
+        for (var x = 0; x < buttons.length; x += 1) {
+          if (document.activeElement === buttons[x].element) {
+            switch (keyCode) {
+              case keys.LEFT:
+                buttons[(x || buttons.length) - 1].element.focus();
+                return;
+              case keys.RIGHT:
+                buttons[(x + 1) % buttons.length].element.focus();
+                return;
             }
-            
-            //add to the end of the DOM tree.
-            document.body.appendChild(instance.elements.root);
-        }
+          }
+        }
+      } else if (
+        keyCode < keys.F12 + 1 &&
+        keyCode > keys.F1 - 1 &&
+        usedKeys.indexOf(keyCode) > -1
+      ) {
+        event.preventDefault();
+        event.stopPropagation();
+        triggerCallback(instance, function (button) {
+          return button.key === keyCode;
+        });
+        return false;
+      }
+    }
 
-        /**
-         * Helper: maintains scroll position
-         *
-         */
-        var scrollX, scrollY;
-        function saveScrollPosition(){
-            scrollX = getScrollLeft();
-            scrollY = getScrollTop();
-        }
-        function restoreScrollPosition(){
-            window.scrollTo(scrollX, scrollY);
-        }
+    /**
+     * Sets focus to proper dialog element
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Node} [resetTarget=undefined] DOM element to reset focus to.
+     *
+     * @return {undefined}
+     */
+    function setFocus(instance, resetTarget) {
+      // reset target has already been determined.
+      if (resetTarget) {
+        resetTarget.focus();
+      } else {
+        // current instance focus settings
+        var focus = instance.__internal.focus;
+        // the focus element.
+        var element = focus.element;
+
+        switch (typeof focus.element) {
+          // a number means a button index
+          case "number":
+            if (instance.__internal.buttons.length > focus.element) {
+              //in basic view, skip focusing the buttons.
+              if (instance.get("basic") === true) {
+                element = instance.elements.reset[0];
+              } else {
+                element = instance.__internal.buttons[focus.element].element;
+              }
+            }
+            break;
+          // a string means querySelector to select from dialog body contents.
+          case "string":
+            element = instance.elements.body.querySelector(focus.element);
+            break;
+          // a function should return the focus element.
+          case "function":
+            element = focus.element.call(instance);
+            break;
+        }
+
+        // if no focus element, default to first reset element.
+        if (
+          (typeof element === "undefined" || element === null) &&
+          instance.__internal.buttons.length === 0
+        ) {
+          element = instance.elements.reset[0];
+        }
+        // focus
+        if (element && element.focus) {
+          element.focus();
+          // if selectable
+          if (focus.select && element.select) {
+            element.select();
+          }
+        }
+      }
+    }
 
-        /**
-         * Helper: adds/removes no-overflow class from body
-         *
-         */
-        function ensureNoOverflow(){
-            var requiresNoOverflow = 0;
-            for(var x=0;x<openDialogs.length;x+=1){
-                var instance = openDialogs[x];
-                if(instance.isModal() || instance.isMaximized()){
-                    requiresNoOverflow+=1;
-                }
-            }
-            if(requiresNoOverflow === 0 && document.body.className.indexOf(classes.noOverflow) >= 0){
-                //last open modal or last maximized one
-                removeClass(document.body, classes.noOverflow);
-                preventBodyShift(false);
-            }else if(requiresNoOverflow > 0 && document.body.className.indexOf(classes.noOverflow) < 0){
-                //first open modal or first maximized one
-                preventBodyShift(true);
-                addClass(document.body, classes.noOverflow);
-            }
-        }
-        var top = '', topScroll = 0;
-        /**
-         * Helper: prevents body shift.
-         *
-         */
-        function preventBodyShift(add){
-            if(alertify.defaults.preventBodyShift){
-                if(add && document.documentElement.scrollHeight > document.documentElement.clientHeight ){//&& openDialogs[openDialogs.length-1].elements.dialog.clientHeight <= document.documentElement.clientHeight){
-                    topScroll = scrollY;
-                    top = window.getComputedStyle(document.body).top;
-                    addClass(document.body, classes.fixed);
-                    document.body.style.top = -scrollY + 'px';
-                } else if(!add) {
-                    scrollY = topScroll;
-                    document.body.style.top = top;
-                    removeClass(document.body, classes.fixed);
-                    restoreScrollPosition();
-                }
-            }
-        }
-		
-        /**
-         * Sets the name of the transition used to show/hide the dialog
-         * 
-         * @param {Object} instance The dilog instance.
-         *
-         */
-        function updateTransition(instance, value, oldValue){
-            if(typeof oldValue === 'string'){
-                removeClass(instance.elements.root,classes.prefix +  oldValue);
-            }
-            addClass(instance.elements.root, classes.prefix + value);
-            reflow = instance.elements.root.offsetWidth;
-        }
-		
-        /**
-         * Toggles the dialog display mode
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function updateDisplayMode(instance){
-            if(instance.get('modal')){
-
-                //make modal
-                removeClass(instance.elements.root, classes.modeless);
-
-                //only if open
-                if(instance.isOpen()){
-                    unbindModelessEvents(instance);
-
-                    //in case a pinned modless dialog was made modal while open.
-                    updateAbsPositionFix(instance);
-
-                    ensureNoOverflow();
-                }
-            }else{
-                //make modelss
-                addClass(instance.elements.root, classes.modeless);
-
-                //only if open
-                if(instance.isOpen()){
-                    bindModelessEvents(instance);
-
-                    //in case pin/unpin was called while a modal is open
-                    updateAbsPositionFix(instance);
-
-                    ensureNoOverflow();
-                }
-            }
-        }
-
-        /**
-         * Toggles the dialog basic view mode 
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function updateBasicMode(instance){
-            if (instance.get('basic')) {
-                // add class
-                addClass(instance.elements.root, classes.basic);
-            } else {
-                // remove class
-                removeClass(instance.elements.root, classes.basic);
-            }
-        }
-
-        /**
-         * Toggles the dialog frameless view mode 
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function updateFramelessMode(instance){
-            if (instance.get('frameless')) {
-                // add class
-                addClass(instance.elements.root, classes.frameless);
-            } else {
-                // remove class
-                removeClass(instance.elements.root, classes.frameless);
-            }
-        }
-		
-        /**
-         * Helper: Brings the modeless dialog to front, attached to modeless dialogs.
-         *
-         * @param {Event} event Focus event
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bringToFront(event, instance){
-            
-            // Do not bring to front if preceeded by an open modal
-            var index = openDialogs.indexOf(instance);
-            for(var x=index+1;x<openDialogs.length;x+=1){
-                if(openDialogs[x].isModal()){
-                    return;
-                }
-            }
-			
-            // Bring to front by making it the last child.
-            if(document.body.lastChild !== instance.elements.root){
-                document.body.appendChild(instance.elements.root);
-                //also make sure its at the end of the list
-                openDialogs.splice(openDialogs.indexOf(instance),1);
-                openDialogs.push(instance);
-                setFocus(instance);
-            }
-			
-            return false;
-        }
-		
-        /**
-         * Helper: reflects dialogs options updates
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {String} option The updated option name.
-         *
-         * @return	{undefined}	
-         */
-        function optionUpdated(instance, option, oldValue, newValue){
-            switch(option){
-            case 'title':
-                instance.setHeader(newValue);
-                break;
-            case 'modal':
-                updateDisplayMode(instance);
-                break;
-            case 'basic':
-                updateBasicMode(instance);
-                break;
-            case 'frameless':
-                updateFramelessMode(instance);
-                break;
-            case 'pinned':
-                updatePinned(instance);
-                break;
-            case 'closable':
-                updateClosable(instance);
-                break;
-            case 'maximizable':
-                updateMaximizable(instance);
-                break;
-            case 'pinnable':
-                updatePinnable(instance);
-                break;
-            case 'movable':
-                updateMovable(instance);
-                break;
-            case 'resizable':
-                updateResizable(instance);
-                break;
-            case 'padding':
-                if(newValue){
-                    removeClass(instance.elements.root, classes.noPadding);
-                }else if(instance.elements.root.className.indexOf(classes.noPadding) < 0){
-                    addClass(instance.elements.root, classes.noPadding);
-                }
-                break;
-            case 'overflow':
-                if(newValue){
-                    removeClass(instance.elements.root, classes.noOverflow);
-                }else if(instance.elements.root.className.indexOf(classes.noOverflow) < 0){
-                    addClass(instance.elements.root, classes.noOverflow);
-                }
-                break;
-            case 'transition':
-                updateTransition(instance,newValue, oldValue);
-                break;
-            }
-
-            // internal on option updated event
-            if(typeof instance.hooks.onupdate === 'function'){
-                instance.hooks.onupdate.call(instance, option, oldValue, newValue);
-            }
-        }
-		
-        /**
-         * Helper: reflects dialogs options updates
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Object} obj The object to set/get a value on/from.
-         * @param {Function} callback The callback function to call if the key was found.
-         * @param {String|Object} key A string specifying a propery name or a collection of key value pairs.
-         * @param {Object} value Optional, the value associated with the key (in case it was a string).
-         * @param {String} option The updated option name.
-         *
-         * @return	{Object} result object 
-         *	The result objects has an 'op' property, indicating of this is a SET or GET operation.
-         *		GET: 
-         *		- found: a flag indicating if the key was found or not.
-         *		- value: the property value.
-         *		SET:
-         *		- items: a list of key value pairs of the properties being set.
-         *				each contains:
-         *					- found: a flag indicating if the key was found or not.
-         *					- key: the property key.
-         *					- value: the property value.
-         */
-        function update(instance, obj, callback, key, value){
-            var result = {op:undefined, items: [] };
-            if(typeof value === 'undefined' && typeof key === 'string') {
-                //get
-                result.op = 'get';
-                if(obj.hasOwnProperty(key)){
-                    result.found = true;
-                    result.value = obj[key];
-                }else{
-                    result.found = false;
-                    result.value = undefined;
-                }
-            }
-            else
-            {
-                var old;
-                //set
-                result.op = 'set';
-                if(typeof key === 'object'){
-                    //set multiple
-                    var args = key;
-                    for (var prop in args) {
-                        if (obj.hasOwnProperty(prop)) {
-                            if(obj[prop] !== args[prop]){
-                                old = obj[prop];
-                                obj[prop] = args[prop];
-                                callback.call(instance,prop, old, args[prop]);
-                            }
-                            result.items.push({ 'key': prop, 'value': args[prop], 'found':true});
-                        }else{
-                            result.items.push({ 'key': prop, 'value': args[prop], 'found':false});
-                        }
-                    }
-                } else if (typeof key === 'string'){
-                    //set single
-                    if (obj.hasOwnProperty(key)) {
-                        if(obj[key] !== value){
-                            old  = obj[key];
-                            obj[key] = value;
-                            callback.call(instance,key, old, value);
-                        }
-                        result.items.push({'key': key, 'value': value , 'found':true});
-
-                    }else{
-                        result.items.push({'key': key, 'value': value , 'found':false});
-                    }
-                } else {
-                    //invalid params
-                    throw new Error('args must be a string or object');
-                }
-            }
-            return result;
-        }
-
-
-        /**
-         * Triggers a close event.
-         *
-         * @param {Object} instance	The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function triggerClose(instance) {
-            var found;
-            triggerCallback(instance, function (button) {
-                return found = (button.invokeOnClose === true);
-            });
-            //none of the buttons registered as onclose callback
-            //close the dialog
-            if (!found && instance.isOpen()) {
-                instance.close();
-            }
-        }
-
-        /**
-         * Dialogs commands event handler, attached to the dialog commands element.
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Object} instance	The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function commandsClickHandler(event, instance) {
-            var target = event.srcElement || event.target;
-            switch (target) {
-            case instance.elements.commands.pin:
-                if (!instance.isPinned()) {
-                    pin(instance);
-                } else {
-                    unpin(instance);
-                }
-                break;
-            case instance.elements.commands.maximize:
-                if (!instance.isMaximized()) {
-                    maximize(instance);
-                } else {
-                    restore(instance);
-                }
-                break;
-            case instance.elements.commands.close:
-                triggerClose(instance);
-                break;
-            }
-            return false;
-        }
-
-        /**
-         * Helper: pins the modeless dialog.
-         *
-         * @param {Object} instance	The dialog instance.
-         * 
-         * @return {undefined}
-         */
-        function pin(instance) {
-            //pin the dialog
-            instance.set('pinned', true);
-        }
-
-        /**
-         * Helper: unpins the modeless dialog.
-         *
-         * @param {Object} instance	The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function unpin(instance) {
-            //unpin the dialog 
-            instance.set('pinned', false);
-        }
-
-
-        /**
-         * Helper: enlarges the dialog to fill the entire screen.
-         *
-         * @param {Object} instance	The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function maximize(instance) {
-            // allow custom `onmaximize` method
-            dispatchEvent('onmaximize', instance);
-            //maximize the dialog 
-            addClass(instance.elements.root, classes.maximized);
-            if (instance.isOpen()) {
-                ensureNoOverflow();
-            }
-            // allow custom `onmaximized` method
-            dispatchEvent('onmaximized', instance);
-        }
-
-        /**
-         * Helper: returns the dialog to its former size.
-         *
-         * @param {Object} instance	The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function restore(instance) {
-            // allow custom `onrestore` method
-            dispatchEvent('onrestore', instance);
-            //maximize the dialog 
-            removeClass(instance.elements.root, classes.maximized);
-            if (instance.isOpen()) {
-                ensureNoOverflow();
-            }
-            // allow custom `onrestored` method
-            dispatchEvent('onrestored', instance);
-        }
-
-        /**
-         * Show or hide the maximize box.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to add the behavior, removes it otherwise.
-         *
-         * @return {undefined}
-         */
-        function updatePinnable(instance) {
-            if (instance.get('pinnable')) {
-                // add class
-                addClass(instance.elements.root, classes.pinnable);
-            } else {
-                // remove class
-                removeClass(instance.elements.root, classes.pinnable);
-            }
-        }
-
-        /**
-         * Helper: Fixes the absolutly positioned modal div position.
-         *
-         * @param {Object} instance The dialog instance.
-         *
-         * @return {undefined}
-         */
-        function addAbsPositionFix(instance) {
-            var scrollLeft = getScrollLeft();
-            instance.elements.modal.style.marginTop = getScrollTop() + 'px';
-            instance.elements.modal.style.marginLeft = scrollLeft + 'px';
-            instance.elements.modal.style.marginRight = (-scrollLeft) + 'px';
-        }
-
-        /**
-         * Helper: Removes the absolutly positioned modal div position fix.
-         *
-         * @param {Object} instance The dialog instance.
-         *
-         * @return {undefined}
-         */
-        function removeAbsPositionFix(instance) {
-            var marginTop = parseInt(instance.elements.modal.style.marginTop, 10);
-            var marginLeft = parseInt(instance.elements.modal.style.marginLeft, 10);
-            instance.elements.modal.style.marginTop = '';
-            instance.elements.modal.style.marginLeft = '';
-            instance.elements.modal.style.marginRight = '';
-
-            if (instance.isOpen()) {
-                var top = 0,
-                    left = 0
-                ;
-                if (instance.elements.dialog.style.top !== '') {
-                    top = parseInt(instance.elements.dialog.style.top, 10);
-                }
-                instance.elements.dialog.style.top = (top + (marginTop - getScrollTop())) + 'px';
-
-                if (instance.elements.dialog.style.left !== '') {
-                    left = parseInt(instance.elements.dialog.style.left, 10);
-                }
-                instance.elements.dialog.style.left = (left + (marginLeft - getScrollLeft())) + 'px';
-            }
-        }
-        /**
-         * Helper: Adds/Removes the absolutly positioned modal div position fix based on its pinned setting.
-         *
-         * @param {Object} instance The dialog instance.
-         *
-         * @return {undefined}
-         */
-        function updateAbsPositionFix(instance) {
-            // if modeless and unpinned add fix
-            if (!instance.get('modal') && !instance.get('pinned')) {
-                addAbsPositionFix(instance);
-            } else {
-                removeAbsPositionFix(instance);
-            }
-        }
-        /**
-         * Toggles the dialog position lock | modeless only.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to make it modal, false otherwise.
-         *
-         * @return {undefined}
-         */
-        function updatePinned(instance) {
-            if (instance.get('pinned')) {
-                removeClass(instance.elements.root, classes.unpinned);
-                if (instance.isOpen()) {
-                    removeAbsPositionFix(instance);
-                }
-            } else {
-                addClass(instance.elements.root, classes.unpinned);
-                if (instance.isOpen() && !instance.isModal()) {
-                    addAbsPositionFix(instance);
-                }
-            }
-        }
-
-        /**
-         * Show or hide the maximize box.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to add the behavior, removes it otherwise.
-         *
-         * @return {undefined}
-         */
-        function updateMaximizable(instance) {
-            if (instance.get('maximizable')) {
-                // add class
-                addClass(instance.elements.root, classes.maximizable);
-            } else {
-                // remove class
-                removeClass(instance.elements.root, classes.maximizable);
-            }
-        }
-
-        /**
-         * Show or hide the close box.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to add the behavior, removes it otherwise.
-         *
-         * @return {undefined}
-         */
-        function updateClosable(instance) {
-            if (instance.get('closable')) {
-                // add class
-                addClass(instance.elements.root, classes.closable);
-                bindClosableEvents(instance);
-            } else {
-                // remove class
-                removeClass(instance.elements.root, classes.closable);
-                unbindClosableEvents(instance);
-            }
-        }
-
-        
-        var cancelClick = false,// flag to cancel click event if already handled by end resize event (the mousedown, mousemove, mouseup sequence fires a click event.).
-            modalClickHandlerTS=0 // stores last click timestamp to prevent executing the handler twice on double click.
-            ;
-
-        /**
-         * Helper: closes the modal dialog when clicking the modal
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function modalClickHandler(event, instance) {
-            if(event.timeStamp - modalClickHandlerTS > 200 && (modalClickHandlerTS = event.timeStamp) && !cancelClick){
-                var target = event.srcElement || event.target;
-                if (instance.get('closableByDimmer') === true && target === instance.elements.modal) {
-                    triggerClose(instance);
-                }
-                cancelClick = false;
-                return false;
-            }
-        }
-
-        // stores last call timestamp to prevent triggering the callback twice.
-        var callbackTS = 0;
-        // flag to cancel keyup event if already handled by click event (pressing Enter on a focusted button).
-        var cancelKeyup = false;
-        /** 
-         * Helper: triggers a button callback
-         *
-         * @param {Object}		The dilog instance.
-         * @param {Function}	Callback to check which button triggered the event.
-         *
-         * @return {undefined}
-         */
-        function triggerCallback(instance, check) {
-            if(Date.now() - callbackTS > 200 && (callbackTS = Date.now())){
-                for (var idx = 0; idx < instance.__internal.buttons.length; idx += 1) {
-                    var button = instance.__internal.buttons[idx];
-                    if (!button.element.disabled && check(button)) {
-                        var closeEvent = createCloseEvent(idx, button);
-                        if (typeof instance.callback === 'function') {
-                            instance.callback.apply(instance, [closeEvent]);
-                        }
-                        //close the dialog only if not canceled.
-                        if (closeEvent.cancel === false) {
-                            instance.close();
-                        }
-                        break;
-                    }
-                }
-            }
-        }
-
-        /**
-         * Clicks event handler, attached to the dialog footer.
-         *
-         * @param {Event}		DOM event object.
-         * @param {Object}		The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function buttonsClickHandler(event, instance) {
-            var target = event.srcElement || event.target;
-            triggerCallback(instance, function (button) {
-                // if this button caused the click, cancel keyup event
-                return button.element === target && (cancelKeyup = true);
-            });
-        }
-
-        /**
-         * Keyup event handler, attached to the document.body
-         *
-         * @param {Event}		DOM event object.
-         * @param {Object}		The dilog instance.
-         * 
-         * @return {undefined}
-         */
-        function keyupHandler(event) {
-            //hitting enter while button has focus will trigger keyup too.
-            //ignore if handled by clickHandler
-            if (cancelKeyup) {
-                cancelKeyup = false;
-                return;
-            }
-            var instance = openDialogs[openDialogs.length - 1];
-            var keyCode = event.keyCode;
-            if (instance.__internal.buttons.length === 0 && keyCode === keys.ESC && instance.get('closable') === true) {
-                triggerClose(instance);
-                return false;
-            }else if (usedKeys.indexOf(keyCode) > -1) {
-                triggerCallback(instance, function (button) {
-                    return button.key === keyCode;
-                });
-                return false;
-            }
-        }
-        /**
-        * Keydown event handler, attached to the document.body
-        *
-        * @param {Event}		DOM event object.
-        * @param {Object}		The dilog instance.
-        * 
-        * @return {undefined}
-        */
-        function keydownHandler(event) {
-            var instance = openDialogs[openDialogs.length - 1];
-            var keyCode = event.keyCode;
-            if (keyCode === keys.LEFT || keyCode === keys.RIGHT) {
-                var buttons = instance.__internal.buttons;
-                for (var x = 0; x < buttons.length; x += 1) {
-                    if (document.activeElement === buttons[x].element) {
-                        switch (keyCode) {
-                        case keys.LEFT:
-                            buttons[(x || buttons.length) - 1].element.focus();
-                            return;
-                        case keys.RIGHT:
-                            buttons[(x + 1) % buttons.length].element.focus();
-                            return;
-                        }
-                    }
-                }
-            }else if (keyCode < keys.F12 + 1 && keyCode > keys.F1 - 1 && usedKeys.indexOf(keyCode) > -1) {
-                event.preventDefault();
-                event.stopPropagation();
-                triggerCallback(instance, function (button) {
-                    return button.key === keyCode;
-                });
-                return false;
-            }
-        }
-
-
-        /**
-         * Sets focus to proper dialog element
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Node} [resetTarget=undefined] DOM element to reset focus to.
-         *
-         * @return {undefined}
-         */
-        function setFocus(instance, resetTarget) {
-            // reset target has already been determined.
-            if (resetTarget) {
-                resetTarget.focus();
-            } else {
-                // current instance focus settings
-                var focus = instance.__internal.focus;
-                // the focus element.
-                var element = focus.element;
-
-                switch (typeof focus.element) {
-                // a number means a button index
-                case 'number':
-                    if (instance.__internal.buttons.length > focus.element) {
-                        //in basic view, skip focusing the buttons.
-                        if (instance.get('basic') === true) {
-                            element = instance.elements.reset[0];
-                        } else {
-                            element = instance.__internal.buttons[focus.element].element;
-                        }
-                    }
-                    break;
-                // a string means querySelector to select from dialog body contents.
-                case 'string':
-                    element = instance.elements.body.querySelector(focus.element);
-                    break;
-                // a function should return the focus element.
-                case 'function':
-                    element = focus.element.call(instance);
-                    break;
-                }
-                
-                // if no focus element, default to first reset element.
-                if ((typeof element === 'undefined' || element === null) && instance.__internal.buttons.length === 0) {
-                    element = instance.elements.reset[0];
-                }
-                // focus
-                if (element && element.focus) {
-                    element.focus();
-                    // if selectable
-                    if (focus.select && element.select) {
-                        element.select();
-                    }
-                }
-            }
-        }
-
-        /**
-         * Focus event handler, attached to document.body and dialogs own reset links.
-         * handles the focus for modal dialogs only.
-         *
-         * @param {Event} event DOM focus event object.
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function onReset(event, instance) {
-
-            // should work on last modal if triggered from document.body 
-            if (!instance) {
-                for (var x = openDialogs.length - 1; x > -1; x -= 1) {
-                    if (openDialogs[x].isModal()) {
-                        instance = openDialogs[x];
-                        break;
-                    }
-                }
-            }
-            // if modal
-            if (instance && instance.isModal()) {
-                // determine reset target to enable forward/backward tab cycle.
-                var resetTarget, target = event.srcElement || event.target;
-                var lastResetElement = target === instance.elements.reset[1] || (instance.__internal.buttons.length === 0 && target === document.body);
-
-                // if last reset link, then go to maximize or close
-                if (lastResetElement) {
-                    if (instance.get('maximizable')) {
-                        resetTarget = instance.elements.commands.maximize;
-                    } else if (instance.get('closable')) {
-                        resetTarget = instance.elements.commands.close;
-                    }
-                }
-                // if no reset target found, try finding the best button
-                if (resetTarget === undefined) {
-                    if (typeof instance.__internal.focus.element === 'number') {
-                        // button focus element, go to first available button
-                        if (target === instance.elements.reset[0]) {
-                            resetTarget = instance.elements.buttons.auxiliary.firstChild || instance.elements.buttons.primary.firstChild;
-                        } else if (lastResetElement) {
-                            //restart the cycle by going to first reset link
-                            resetTarget = instance.elements.reset[0];
-                        }
-                    } else {
-                        // will reach here when tapping backwards, so go to last child
-                        // The focus element SHOULD NOT be a button (logically!).
-                        if (target === instance.elements.reset[0]) {
-                            resetTarget = instance.elements.buttons.primary.lastChild || instance.elements.buttons.auxiliary.lastChild;
-                        }
-                    }
-                }
-                // focus
-                setFocus(instance, resetTarget);
-            }
-        }
-        /**
-         * Transition in transitionend event handler. 
-         *
-         * @param {Event}		TransitionEnd event object.
-         * @param {Object}		The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function handleTransitionInEvent(event, instance) {
-            // clear the timer
-            clearTimeout(instance.__internal.timerIn);
-
-            // once transition is complete, set focus
-            setFocus(instance);
-
-            //restore scroll to prevent document jump
-            restoreScrollPosition();
-
-            // allow handling key up after transition ended.
-            cancelKeyup = false;
-
-            // allow custom `onfocus` method
-            dispatchEvent('onfocus', instance);
-
-            // unbind the event
-            off(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler);
-
-            removeClass(instance.elements.root, classes.animationIn);
-        }
-
-        /**
-         * Transition out transitionend event handler. 
-         *
-         * @param {Event}		TransitionEnd event object.
-         * @param {Object}		The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function handleTransitionOutEvent(event, instance) {
-            // clear the timer
-            clearTimeout(instance.__internal.timerOut);
-            // unbind the event
-            off(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler);
-
-            // reset move updates
-            resetMove(instance);
-            // reset resize updates
-            resetResize(instance);
-
-            // restore if maximized
-            if (instance.isMaximized() && !instance.get('startMaximized')) {
-                restore(instance);
-            }
-
-            // return focus to the last active element
-            if (alertify.defaults.maintainFocus && instance.__internal.activeElement) {
-                instance.__internal.activeElement.focus();
-                instance.__internal.activeElement = null;
-            }
-            
-            //destory the instance
-            if (typeof instance.__internal.destroy === 'function') {
-                instance.__internal.destroy.apply(instance);
-            }
-        }
-        /* Controls moving a dialog around */
-        //holde the current moving instance
-        var movable = null,
-            //holds the current X offset when move starts
-            offsetX = 0,
-            //holds the current Y offset when move starts
-            offsetY = 0,
-            xProp = 'pageX',
-            yProp = 'pageY',
-            bounds = null,
-            refreshTop = false,
-            moveDelegate = null
-        ;
-
-        /**
-         * Helper: sets the element top/left coordinates
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Node} element The element being moved.
-         * 
-         * @return {undefined}
-         */
-        function moveElement(event, element) {
-            var left = (event[xProp] - offsetX),
-                top  = (event[yProp] - offsetY);
-
-            if(refreshTop){
-                top -= document.body.scrollTop;
-            }
-           
-            element.style.left = left + 'px';
-            element.style.top = top + 'px';
-           
-        }
-        /**
-         * Helper: sets the element top/left coordinates within screen bounds
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Node} element The element being moved.
-         * 
-         * @return {undefined}
-         */
-        function moveElementBounded(event, element) {
-            var left = (event[xProp] - offsetX),
-                top  = (event[yProp] - offsetY);
+    /**
+     * Focus event handler, attached to document.body and dialogs own reset links.
+     * handles the focus for modal dialogs only.
+     *
+     * @param {Event} event DOM focus event object.
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function onReset(event, instance) {
+      // should work on last modal if triggered from document.body
+      if (!instance) {
+        for (var x = openDialogs.length - 1; x > -1; x -= 1) {
+          if (openDialogs[x].isModal()) {
+            instance = openDialogs[x];
+            break;
+          }
+        }
+      }
+      // if modal
+      if (instance && instance.isModal()) {
+        // determine reset target to enable forward/backward tab cycle.
+        var resetTarget,
+          target = event.srcElement || event.target;
+        var lastResetElement =
+          target === instance.elements.reset[1] ||
+          (instance.__internal.buttons.length === 0 &&
+            target === document.body);
+
+        // if last reset link, then go to maximize or close
+        if (lastResetElement) {
+          if (instance.get("maximizable")) {
+            resetTarget = instance.elements.commands.maximize;
+          } else if (instance.get("closable")) {
+            resetTarget = instance.elements.commands.close;
+          }
+        }
+        // if no reset target found, try finding the best button
+        if (resetTarget === undefined) {
+          if (typeof instance.__internal.focus.element === "number") {
+            // button focus element, go to first available button
+            if (target === instance.elements.reset[0]) {
+              resetTarget =
+                instance.elements.buttons.auxiliary.firstChild ||
+                instance.elements.buttons.primary.firstChild;
+            } else if (lastResetElement) {
+              //restart the cycle by going to first reset link
+              resetTarget = instance.elements.reset[0];
+            }
+          } else {
+            // will reach here when tapping backwards, so go to last child
+            // The focus element SHOULD NOT be a button (logically!).
+            if (target === instance.elements.reset[0]) {
+              resetTarget =
+                instance.elements.buttons.primary.lastChild ||
+                instance.elements.buttons.auxiliary.lastChild;
+            }
+          }
+        }
+        // focus
+        setFocus(instance, resetTarget);
+      }
+    }
+    /**
+     * Transition in transitionend event handler.
+     *
+     * @param {Event}		TransitionEnd event object.
+     * @param {Object}		The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function handleTransitionInEvent(event, instance) {
+      // clear the timer
+      clearTimeout(instance.__internal.timerIn);
 
-            if(refreshTop){
-                top -= document.body.scrollTop;
-            }
-            
-            element.style.left = Math.min(bounds.maxLeft, Math.max(bounds.minLeft, left)) + 'px';
-            if(refreshTop){
-                element.style.top = Math.min(bounds.maxTop, Math.max(bounds.minTop, top)) + 'px';
-            }else{
-                element.style.top = Math.max(bounds.minTop, top) + 'px';
-            }
-        }
-            
+      // once transition is complete, set focus
+      setFocus(instance);
 
-        /**
-         * Triggers the start of a move event, attached to the header element mouse down event.
-         * Adds no-selection class to the body, disabling selection while moving.
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Object} instance The dilog instance.
-         * 
-         * @return {Boolean} false
-         */
-        function beginMove(event, instance) {
-            if (resizable === null && !instance.isMaximized() && instance.get('movable')) {
-                var eventSrc, left=0, top=0;
-                if (event.type === 'touchstart') {
-                    event.preventDefault();
-                    eventSrc = event.targetTouches[0];
-                    xProp = 'clientX';
-                    yProp = 'clientY';
-                } else if (event.button === 0) {
-                    eventSrc = event;
-                }
+      //restore scroll to prevent document jump
+      restoreScrollPosition();
 
-                if (eventSrc) {
-
-                    var element = instance.elements.dialog;
-                    addClass(element, classes.capture);
-
-                    if (element.style.left) {
-                        left = parseInt(element.style.left, 10);
-                    }
-
-                    if (element.style.top) {
-                        top = parseInt(element.style.top, 10);
-                    }
-                    
-                    offsetX = eventSrc[xProp] - left;
-                    offsetY = eventSrc[yProp] - top;
-
-                    if(instance.isModal()){
-                        offsetY += instance.elements.modal.scrollTop;
-                    }else if(instance.isPinned()){
-                        offsetY -= document.body.scrollTop;
-                    }
-                    
-                    if(instance.get('moveBounded')){
-                        var current = element,
-                            offsetLeft = -left,
-                            offsetTop = -top;
-                        
-                        //calc offset
-                        do {
-                            offsetLeft += current.offsetLeft;
-                            offsetTop += current.offsetTop;
-                        } while (current = current.offsetParent);
-                        
-                        bounds = {
-                            maxLeft : offsetLeft,
-                            minLeft : -offsetLeft,
-                            maxTop  : document.documentElement.clientHeight - element.clientHeight - offsetTop,
-                            minTop  : -offsetTop
-                        };
-                        moveDelegate = moveElementBounded;
-                    }else{
-                        bounds = null;
-                        moveDelegate = moveElement;
-                    }
-                    
-                    // allow custom `onmove` method
-                    dispatchEvent('onmove', instance);
-
-                    refreshTop = !instance.isModal() && instance.isPinned();
-                    movable = instance;
-                    moveDelegate(eventSrc, element);
-                    addClass(document.body, classes.noSelection);
-                    return false;
-                }
-            }
-        }
+      // allow handling key up after transition ended.
+      cancelKeyup = false;
 
-        /**
-         * The actual move handler,  attached to document.body mousemove event.
-         *
-         * @param {Event} event	DOM event object.
-         * 
-         * @return {undefined}
-         */
-        function move(event) {
-            if (movable) {
-                var eventSrc;
-                if (event.type === 'touchmove') {
-                    event.preventDefault();
-                    eventSrc = event.targetTouches[0];
-                } else if (event.button === 0) {
-                    eventSrc = event;
-                }
-                if (eventSrc) {
-                    moveDelegate(eventSrc, movable.elements.dialog);
-                }
-            }
-        }
+      // allow custom `onfocus` method
+      dispatchEvent("onfocus", instance);
 
-        /**
-         * Triggers the end of a move event,  attached to document.body mouseup event.
-         * Removes no-selection class from document.body, allowing selection.
-         *
-         * @return {undefined}
-         */
-        function endMove() {
-            if (movable) {
-                var instance = movable;
-                movable = bounds = null;
-                removeClass(document.body, classes.noSelection);
-                removeClass(instance.elements.dialog, classes.capture);
-                // allow custom `onmoved` method
-                dispatchEvent('onmoved', instance);
-            }
-        }
+      // unbind the event
+      off(
+        instance.elements.dialog,
+        transition.type,
+        instance.__internal.transitionInHandler
+      );
 
-        /**
-         * Resets any changes made by moving the element to its original state,
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function resetMove(instance) {
-            movable = null;
-            var element = instance.elements.dialog;
-            element.style.left = element.style.top = '';
-        }
+      removeClass(instance.elements.root, classes.animationIn);
+    }
 
-        /**
-         * Updates the dialog move behavior.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to add the behavior, removes it otherwise.
-         *
-         * @return {undefined}
-         */
-        function updateMovable(instance) {
-            if (instance.get('movable')) {
-                // add class
-                addClass(instance.elements.root, classes.movable);
-                if (instance.isOpen()) {
-                    bindMovableEvents(instance);
-                }
-            } else {
+    /**
+     * Transition out transitionend event handler.
+     *
+     * @param {Event}		TransitionEnd event object.
+     * @param {Object}		The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function handleTransitionOutEvent(event, instance) {
+      // clear the timer
+      clearTimeout(instance.__internal.timerOut);
+      // unbind the event
+      off(
+        instance.elements.dialog,
+        transition.type,
+        instance.__internal.transitionOutHandler
+      );
+
+      // reset move updates
+      resetMove(instance);
+      // reset resize updates
+      resetResize(instance);
+
+      // restore if maximized
+      if (instance.isMaximized() && !instance.get("startMaximized")) {
+        restore(instance);
+      }
+
+      // return focus to the last active element
+      if (
+        alertify.defaults.maintainFocus &&
+        instance.__internal.activeElement
+      ) {
+        instance.__internal.activeElement.focus();
+        instance.__internal.activeElement = null;
+      }
+
+      //destory the instance
+      if (typeof instance.__internal.destroy === "function") {
+        instance.__internal.destroy.apply(instance);
+      }
+    }
+    /* Controls moving a dialog around */
+    //holde the current moving instance
+    var movable = null,
+      //holds the current X offset when move starts
+      offsetX = 0,
+      //holds the current Y offset when move starts
+      offsetY = 0,
+      xProp = "pageX",
+      yProp = "pageY",
+      bounds = null,
+      refreshTop = false,
+      moveDelegate = null;
+    /**
+     * Helper: sets the element top/left coordinates
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Node} element The element being moved.
+     *
+     * @return {undefined}
+     */
+    function moveElement(event, element) {
+      var left = event[xProp] - offsetX,
+        top = event[yProp] - offsetY;
 
-                //reset
-                resetMove(instance);
-                // remove class
-                removeClass(instance.elements.root, classes.movable);
-                if (instance.isOpen()) {
-                    unbindMovableEvents(instance);
-                }
-            }
-        }
+      if (refreshTop) {
+        top -= document.body.scrollTop;
+      }
 
-        /* Controls moving a dialog around */
-        //holde the current instance being resized		
-        var resizable = null,
-            //holds the staring left offset when resize starts.
-            startingLeft = Number.Nan,
-            //holds the staring width when resize starts.
-            startingWidth = 0,
-            //holds the initial width when resized for the first time.
-            minWidth = 0,
-            //holds the offset of the resize handle.
-            handleOffset = 0
-        ;
-
-        /**
-         * Helper: sets the element width/height and updates left coordinate if neccessary.
-         *
-         * @param {Event} event	DOM mousemove event object.
-         * @param {Node} element The element being moved.
-         * @param {Boolean} pinned A flag indicating if the element being resized is pinned to the screen.
-         * 
-         * @return {undefined}
-         */
-        function resizeElement(event, element, pageRelative) {
+      element.style.left = left + "px";
+      element.style.top = top + "px";
+    }
+    /**
+     * Helper: sets the element top/left coordinates within screen bounds
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Node} element The element being moved.
+     *
+     * @return {undefined}
+     */
+    function moveElementBounded(event, element) {
+      var left = event[xProp] - offsetX,
+        top = event[yProp] - offsetY;
+
+      if (refreshTop) {
+        top -= document.body.scrollTop;
+      }
+
+      element.style.left =
+        Math.min(bounds.maxLeft, Math.max(bounds.minLeft, left)) + "px";
+      if (refreshTop) {
+        element.style.top =
+          Math.min(bounds.maxTop, Math.max(bounds.minTop, top)) + "px";
+      } else {
+        element.style.top = Math.max(bounds.minTop, top) + "px";
+      }
+    }
 
-            //calculate offsets from 0,0
-            var current = element;
-            var offsetLeft = 0;
-            var offsetTop = 0;
+    /**
+     * Triggers the start of a move event, attached to the header element mouse down event.
+     * Adds no-selection class to the body, disabling selection while moving.
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {Boolean} false
+     */
+    function beginMove(event, instance) {
+      if (
+        resizable === null &&
+        !instance.isMaximized() &&
+        instance.get("movable")
+      ) {
+        var eventSrc,
+          left = 0,
+          top = 0;
+        if (event.type === "touchstart") {
+          event.preventDefault();
+          eventSrc = event.targetTouches[0];
+          xProp = "clientX";
+          yProp = "clientY";
+        } else if (event.button === 0) {
+          eventSrc = event;
+        }
+
+        if (eventSrc) {
+          var element = instance.elements.dialog;
+          addClass(element, classes.capture);
+
+          if (element.style.left) {
+            left = parseInt(element.style.left, 10);
+          }
+
+          if (element.style.top) {
+            top = parseInt(element.style.top, 10);
+          }
+
+          offsetX = eventSrc[xProp] - left;
+          offsetY = eventSrc[yProp] - top;
+
+          if (instance.isModal()) {
+            offsetY += instance.elements.modal.scrollTop;
+          } else if (instance.isPinned()) {
+            offsetY -= document.body.scrollTop;
+          }
+
+          if (instance.get("moveBounded")) {
+            var current = element,
+              offsetLeft = -left,
+              offsetTop = -top;
+
+            //calc offset
             do {
-                offsetLeft += current.offsetLeft;
-                offsetTop += current.offsetTop;
-            } while (current = current.offsetParent);
-
-            // determine X,Y coordinates.
-            var X, Y;
-            if (pageRelative === true) {
-                X = event.pageX;
-                Y = event.pageY;
-            } else {
-                X = event.clientX;
-                Y = event.clientY;
-            }
-            // rtl handling
-            var isRTL = isRightToLeft();
-            if (isRTL) {
-                // reverse X 
-                X = document.body.offsetWidth - X;
-                // if has a starting left, calculate offsetRight
-                if (!isNaN(startingLeft)) {
-                    offsetLeft = document.body.offsetWidth - offsetLeft - element.offsetWidth;
-                }
-            }
-
-            // set width/height
-            element.style.height = (Y - offsetTop + handleOffset) + 'px';
-            element.style.width = (X - offsetLeft + handleOffset) + 'px';
-
-            // if the element being resized has a starting left, maintain it.
-            // the dialog is centered, divide by half the offset to maintain the margins.
-            if (!isNaN(startingLeft)) {
-                var diff = Math.abs(element.offsetWidth - startingWidth) * 0.5;
-                if (isRTL) {
-                    //negate the diff, why?
-                    //when growing it should decrease left
-                    //when shrinking it should increase left
-                    diff *= -1;
-                }
-                if (element.offsetWidth > startingWidth) {
-                    //growing
-                    element.style.left = (startingLeft + diff) + 'px';
-                } else if (element.offsetWidth >= minWidth) {
-                    //shrinking
-                    element.style.left = (startingLeft - diff) + 'px';
-                }
-            }
-        }
-
-        /**
-         * Triggers the start of a resize event, attached to the resize handle element mouse down event.
-         * Adds no-selection class to the body, disabling selection while moving.
-         *
-         * @param {Event} event	DOM event object.
-         * @param {Object} instance The dilog instance.
-         * 
-         * @return {Boolean} false
-         */
-        function beginResize(event, instance) {
-            if (!instance.isMaximized()) {
-                var eventSrc;
-                if (event.type === 'touchstart') {
-                    event.preventDefault();
-                    eventSrc = event.targetTouches[0];
-                } else if (event.button === 0) {
-                    eventSrc = event;
-                }
-                if (eventSrc) {
-                    // allow custom `onresize` method
-                    dispatchEvent('onresize', instance);
-                    
-                    resizable = instance;
-                    handleOffset = instance.elements.resizeHandle.offsetHeight / 2;
-                    var element = instance.elements.dialog;
-                    addClass(element, classes.capture);
-                    startingLeft = parseInt(element.style.left, 10);
-                    element.style.height = element.offsetHeight + 'px';
-                    element.style.minHeight = instance.elements.header.offsetHeight + instance.elements.footer.offsetHeight + 'px';
-                    element.style.width = (startingWidth = element.offsetWidth) + 'px';
-
-                    if (element.style.maxWidth !== 'none') {
-                        element.style.minWidth = (minWidth = element.offsetWidth) + 'px';
-                    }
-                    element.style.maxWidth = 'none';
-                    addClass(document.body, classes.noSelection);
-                    return false;
-                }
-            }
-        }
-
-        /**
-         * The actual resize handler,  attached to document.body mousemove event.
-         *
-         * @param {Event} event	DOM event object.
-         * 
-         * @return {undefined}
-         */
-        function resize(event) {
-            if (resizable) {
-                var eventSrc;
-                if (event.type === 'touchmove') {
-                    event.preventDefault();
-                    eventSrc = event.targetTouches[0];
-                } else if (event.button === 0) {
-                    eventSrc = event;
-                }
-                if (eventSrc) {
-                    resizeElement(eventSrc, resizable.elements.dialog, !resizable.get('modal') && !resizable.get('pinned'));
-                }
-            }
-        }
-
-        /**
-         * Triggers the end of a resize event,  attached to document.body mouseup event.
-         * Removes no-selection class from document.body, allowing selection.
-         *
-         * @return {undefined}
-         */
-        function endResize() {
-            if (resizable) {
-                var instance = resizable;
-                resizable = null;
-                removeClass(document.body, classes.noSelection);
-                removeClass(instance.elements.dialog, classes.capture);
-                cancelClick = true;
-                // allow custom `onresized` method
-                dispatchEvent('onresized', instance);
-            }
-        }
-
-        /**
-         * Resets any changes made by resizing the element to its original state.
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function resetResize(instance) {
-            resizable = null;
-            var element = instance.elements.dialog;
-            if (element.style.maxWidth === 'none') {
-                //clear inline styles.
-                element.style.maxWidth = element.style.minWidth = element.style.width = element.style.height = element.style.minHeight = element.style.left = '';
-                //reset variables.
-                startingLeft = Number.Nan;
-                startingWidth = minWidth = handleOffset = 0;
-            }
-        }
-
-
-        /**
-         * Updates the dialog move behavior.
-         *
-         * @param {Object} instance The dilog instance.
-         * @param {Boolean} on True to add the behavior, removes it otherwise.
-         *
-         * @return {undefined}
-         */
-        function updateResizable(instance) {
-            if (instance.get('resizable')) {
-                // add class
-                addClass(instance.elements.root, classes.resizable);
-                if (instance.isOpen()) {
-                    bindResizableEvents(instance);
-                }
-            } else {
-                //reset
-                resetResize(instance);
-                // remove class
-                removeClass(instance.elements.root, classes.resizable);
-                if (instance.isOpen()) {
-                    unbindResizableEvents(instance);
-                }
-            }
-        }
-
-        /**
-         * Reset move/resize on window resize.
-         *
-         * @param {Event} event	window resize event object.
-         *
-         * @return {undefined}
-         */
-        function windowResize(/*event*/) {
-            for (var x = 0; x < openDialogs.length; x += 1) {
-                var instance = openDialogs[x];
-                if (instance.get('autoReset')) {
-                    resetMove(instance);
-                    resetResize(instance);
-                }
-            }
-        }
-        /**
-         * Bind dialogs events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bindEvents(instance) {
-            // if first dialog, hook global handlers
-            if (openDialogs.length === 1) {
-                //global
-                on(window, 'resize', windowResize);
-                on(document.body, 'keyup', keyupHandler);
-                on(document.body, 'keydown', keydownHandler);
-                on(document.body, 'focus', onReset);
-
-                //move
-                on(document.documentElement, 'mousemove', move);
-                on(document.documentElement, 'touchmove', move);
-                on(document.documentElement, 'mouseup', endMove);
-                on(document.documentElement, 'touchend', endMove);
-                //resize
-                on(document.documentElement, 'mousemove', resize);
-                on(document.documentElement, 'touchmove', resize);
-                on(document.documentElement, 'mouseup', endResize);
-                on(document.documentElement, 'touchend', endResize);
-            }
-
-            // common events
-            on(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler);
-            on(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler);
-            on(instance.elements.reset[0], 'focus', instance.__internal.resetHandler);
-            on(instance.elements.reset[1], 'focus', instance.__internal.resetHandler);
-
-            //prevent handling key up when dialog is being opened by a key stroke.
-            cancelKeyup = true;
-            // hook in transition handler
-            on(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler);
-
-            // modelss only events
-            if (!instance.get('modal')) {
-                bindModelessEvents(instance);
-            }
-
-            // resizable
-            if (instance.get('resizable')) {
-                bindResizableEvents(instance);
-            }
-
-            // movable
-            if (instance.get('movable')) {
-                bindMovableEvents(instance);
-            }
-        }
-
-        /**
-         * Unbind dialogs events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function unbindEvents(instance) {
-            // if last dialog, remove global handlers
-            if (openDialogs.length === 1) {
-                //global
-                off(window, 'resize', windowResize);
-                off(document.body, 'keyup', keyupHandler);
-                off(document.body, 'keydown', keydownHandler);
-                off(document.body, 'focus', onReset);
-                //move
-                off(document.documentElement, 'mousemove', move);
-                off(document.documentElement, 'mouseup', endMove);
-                //resize
-                off(document.documentElement, 'mousemove', resize);
-                off(document.documentElement, 'mouseup', endResize);
-            }
-
-            // common events
-            off(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler);
-            off(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler);
-            off(instance.elements.reset[0], 'focus', instance.__internal.resetHandler);
-            off(instance.elements.reset[1], 'focus', instance.__internal.resetHandler);
-
-            // hook out transition handler
-            on(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler);
-
-            // modelss only events
-            if (!instance.get('modal')) {
-                unbindModelessEvents(instance);
-            }
-
-            // movable
-            if (instance.get('movable')) {
-                unbindMovableEvents(instance);
-            }
-
-            // resizable
-            if (instance.get('resizable')) {
-                unbindResizableEvents(instance);
-            }
-
-        }
-
-        /**
-         * Bind modeless specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bindModelessEvents(instance) {
-            on(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true);
-        }
+              offsetLeft += current.offsetLeft;
+              offsetTop += current.offsetTop;
+            } while ((current = current.offsetParent));
+
+            bounds = {
+              maxLeft: offsetLeft,
+              minLeft: -offsetLeft,
+              maxTop:
+                document.documentElement.clientHeight -
+                element.clientHeight -
+                offsetTop,
+              minTop: -offsetTop,
+            };
+            moveDelegate = moveElementBounded;
+          } else {
+            bounds = null;
+            moveDelegate = moveElement;
+          }
+
+          // allow custom `onmove` method
+          dispatchEvent("onmove", instance);
+
+          refreshTop = !instance.isModal() && instance.isPinned();
+          movable = instance;
+          moveDelegate(eventSrc, element);
+          addClass(document.body, classes.noSelection);
+          return false;
+        }
+      }
+    }
 
-        /**
-         * Unbind modeless specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function unbindModelessEvents(instance) {
-            off(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true);
-        }
+    /**
+     * The actual move handler,  attached to document.body mousemove event.
+     *
+     * @param {Event} event	DOM event object.
+     *
+     * @return {undefined}
+     */
+    function move(event) {
+      if (movable) {
+        var eventSrc;
+        if (event.type === "touchmove") {
+          event.preventDefault();
+          eventSrc = event.targetTouches[0];
+        } else if (event.button === 0) {
+          eventSrc = event;
+        }
+        if (eventSrc) {
+          moveDelegate(eventSrc, movable.elements.dialog);
+        }
+      }
+    }
 
+    /**
+     * Triggers the end of a move event,  attached to document.body mouseup event.
+     * Removes no-selection class from document.body, allowing selection.
+     *
+     * @return {undefined}
+     */
+    function endMove() {
+      if (movable) {
+        var instance = movable;
+        movable = bounds = null;
+        removeClass(document.body, classes.noSelection);
+        removeClass(instance.elements.dialog, classes.capture);
+        // allow custom `onmoved` method
+        dispatchEvent("onmoved", instance);
+      }
+    }
 
+    /**
+     * Resets any changes made by moving the element to its original state,
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function resetMove(instance) {
+      movable = null;
+      var element = instance.elements.dialog;
+      element.style.left = element.style.top = "";
+    }
 
-        /**
-         * Bind movable specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bindMovableEvents(instance) {
-            on(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler);
-            on(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler);
-        }
+    /**
+     * Updates the dialog move behavior.
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to add the behavior, removes it otherwise.
+     *
+     * @return {undefined}
+     */
+    function updateMovable(instance) {
+      if (instance.get("movable")) {
+        // add class
+        addClass(instance.elements.root, classes.movable);
+        if (instance.isOpen()) {
+          bindMovableEvents(instance);
+        }
+      } else {
+        //reset
+        resetMove(instance);
+        // remove class
+        removeClass(instance.elements.root, classes.movable);
+        if (instance.isOpen()) {
+          unbindMovableEvents(instance);
+        }
+      }
+    }
 
-        /**
-         * Unbind movable specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function unbindMovableEvents(instance) {
-            off(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler);
-            off(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler);
-        }
+    /* Controls moving a dialog around */
+    //holde the current instance being resized
+    var resizable = null,
+      //holds the staring left offset when resize starts.
+      startingLeft = Number.Nan,
+      //holds the staring width when resize starts.
+      startingWidth = 0,
+      //holds the initial width when resized for the first time.
+      minWidth = 0,
+      //holds the offset of the resize handle.
+      handleOffset = 0;
+    /**
+     * Helper: sets the element width/height and updates left coordinate if neccessary.
+     *
+     * @param {Event} event	DOM mousemove event object.
+     * @param {Node} element The element being moved.
+     * @param {Boolean} pinned A flag indicating if the element being resized is pinned to the screen.
+     *
+     * @return {undefined}
+     */
+    function resizeElement(event, element, pageRelative) {
+      //calculate offsets from 0,0
+      var current = element;
+      var offsetLeft = 0;
+      var offsetTop = 0;
+      do {
+        offsetLeft += current.offsetLeft;
+        offsetTop += current.offsetTop;
+      } while ((current = current.offsetParent));
+
+      // determine X,Y coordinates.
+      var X, Y;
+      if (pageRelative === true) {
+        X = event.pageX;
+        Y = event.pageY;
+      } else {
+        X = event.clientX;
+        Y = event.clientY;
+      }
+      // rtl handling
+      var isRTL = isRightToLeft();
+      if (isRTL) {
+        // reverse X
+        X = document.body.offsetWidth - X;
+        // if has a starting left, calculate offsetRight
+        if (!isNaN(startingLeft)) {
+          offsetLeft =
+            document.body.offsetWidth - offsetLeft - element.offsetWidth;
+        }
+      }
+
+      // set width/height
+      element.style.height = Y - offsetTop + handleOffset + "px";
+      element.style.width = X - offsetLeft + handleOffset + "px";
+
+      // if the element being resized has a starting left, maintain it.
+      // the dialog is centered, divide by half the offset to maintain the margins.
+      if (!isNaN(startingLeft)) {
+        var diff = Math.abs(element.offsetWidth - startingWidth) * 0.5;
+        if (isRTL) {
+          //negate the diff, why?
+          //when growing it should decrease left
+          //when shrinking it should increase left
+          diff *= -1;
+        }
+        if (element.offsetWidth > startingWidth) {
+          //growing
+          element.style.left = startingLeft + diff + "px";
+        } else if (element.offsetWidth >= minWidth) {
+          //shrinking
+          element.style.left = startingLeft - diff + "px";
+        }
+      }
+    }
 
+    /**
+     * Triggers the start of a resize event, attached to the resize handle element mouse down event.
+     * Adds no-selection class to the body, disabling selection while moving.
+     *
+     * @param {Event} event	DOM event object.
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {Boolean} false
+     */
+    function beginResize(event, instance) {
+      if (!instance.isMaximized()) {
+        var eventSrc;
+        if (event.type === "touchstart") {
+          event.preventDefault();
+          eventSrc = event.targetTouches[0];
+        } else if (event.button === 0) {
+          eventSrc = event;
+        }
+        if (eventSrc) {
+          // allow custom `onresize` method
+          dispatchEvent("onresize", instance);
+
+          resizable = instance;
+          handleOffset = instance.elements.resizeHandle.offsetHeight / 2;
+          var element = instance.elements.dialog;
+          addClass(element, classes.capture);
+          startingLeft = parseInt(element.style.left, 10);
+          element.style.height = element.offsetHeight + "px";
+          element.style.minHeight =
+            instance.elements.header.offsetHeight +
+            instance.elements.footer.offsetHeight +
+            "px";
+          element.style.width = (startingWidth = element.offsetWidth) + "px";
+
+          if (element.style.maxWidth !== "none") {
+            element.style.minWidth = (minWidth = element.offsetWidth) + "px";
+          }
+          element.style.maxWidth = "none";
+          addClass(document.body, classes.noSelection);
+          return false;
+        }
+      }
+    }
 
+    /**
+     * The actual resize handler,  attached to document.body mousemove event.
+     *
+     * @param {Event} event	DOM event object.
+     *
+     * @return {undefined}
+     */
+    function resize(event) {
+      if (resizable) {
+        var eventSrc;
+        if (event.type === "touchmove") {
+          event.preventDefault();
+          eventSrc = event.targetTouches[0];
+        } else if (event.button === 0) {
+          eventSrc = event;
+        }
+        if (eventSrc) {
+          resizeElement(
+            eventSrc,
+            resizable.elements.dialog,
+            !resizable.get("modal") && !resizable.get("pinned")
+          );
+        }
+      }
+    }
 
-        /**
-         * Bind resizable specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bindResizableEvents(instance) {
-            on(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler);
-            on(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler);
-        }
+    /**
+     * Triggers the end of a resize event,  attached to document.body mouseup event.
+     * Removes no-selection class from document.body, allowing selection.
+     *
+     * @return {undefined}
+     */
+    function endResize() {
+      if (resizable) {
+        var instance = resizable;
+        resizable = null;
+        removeClass(document.body, classes.noSelection);
+        removeClass(instance.elements.dialog, classes.capture);
+        cancelClick = true;
+        // allow custom `onresized` method
+        dispatchEvent("onresized", instance);
+      }
+    }
 
-        /**
-         * Unbind resizable specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function unbindResizableEvents(instance) {
-            off(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler);
-            off(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler);
-        }
+    /**
+     * Resets any changes made by resizing the element to its original state.
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function resetResize(instance) {
+      resizable = null;
+      var element = instance.elements.dialog;
+      if (element.style.maxWidth === "none") {
+        //clear inline styles.
+        element.style.maxWidth =
+          element.style.minWidth =
+          element.style.width =
+          element.style.height =
+          element.style.minHeight =
+          element.style.left =
+            "";
+        //reset variables.
+        startingLeft = Number.Nan;
+        startingWidth = minWidth = handleOffset = 0;
+      }
+    }
 
-        /**
-         * Bind closable events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function bindClosableEvents(instance) {
-            on(instance.elements.modal, 'click', instance.__internal.modalClickHandler);
-        }
+    /**
+     * Updates the dialog move behavior.
+     *
+     * @param {Object} instance The dilog instance.
+     * @param {Boolean} on True to add the behavior, removes it otherwise.
+     *
+     * @return {undefined}
+     */
+    function updateResizable(instance) {
+      if (instance.get("resizable")) {
+        // add class
+        addClass(instance.elements.root, classes.resizable);
+        if (instance.isOpen()) {
+          bindResizableEvents(instance);
+        }
+      } else {
+        //reset
+        resetResize(instance);
+        // remove class
+        removeClass(instance.elements.root, classes.resizable);
+        if (instance.isOpen()) {
+          unbindResizableEvents(instance);
+        }
+      }
+    }
 
-        /**
-         * Unbind closable specific events
-         *
-         * @param {Object} instance The dilog instance.
-         *
-         * @return {undefined}
-         */
-        function unbindClosableEvents(instance) {
-            off(instance.elements.modal, 'click', instance.__internal.modalClickHandler);
-        }
-        // dialog API
-        return {
-            __init:initialize,
-            /**
-             * Check if dialog is currently open
-             *
-             * @return {Boolean}
-             */
-            isOpen: function () {
-                return this.__internal.isOpen;
-            },
-            isModal: function (){
-                return this.elements.root.className.indexOf(classes.modeless) < 0;
-            },
-            isMaximized:function(){
-                return this.elements.root.className.indexOf(classes.maximized) > -1;
-            },
-            isPinned:function(){
-                return this.elements.root.className.indexOf(classes.unpinned) < 0;
-            },
-            maximize:function(){
-                if(!this.isMaximized()){
-                    maximize(this);
-                }
-                return this;
-            },
-            restore:function(){
-                if(this.isMaximized()){
-                    restore(this);
-                }
-                return this;
-            },
-            pin:function(){
-                if(!this.isPinned()){
-                    pin(this);
-                }
-                return this;
-            },
-            unpin:function(){
-                if(this.isPinned()){
-                    unpin(this);
-                }
-                return this;
-            },
-            bringToFront:function(){
-                bringToFront(null, this);
-                return this;
-            },
-            /**
-             * Move the dialog to a specific x/y coordinates
-             *
-             * @param {Number} x    The new dialog x coordinate in pixels.
-             * @param {Number} y    The new dialog y coordinate in pixels.
-             *
-             * @return {Object} The dialog instance.
-             */
-            moveTo:function(x,y){
-                if(!isNaN(x) && !isNaN(y)){
-                    // allow custom `onmove` method
-                    dispatchEvent('onmove', this);
-                    
-                    var element = this.elements.dialog,
-                        current = element,
-                        offsetLeft = 0,
-                        offsetTop = 0;
-                    
-                    //subtract existing left,top
-                    if (element.style.left) {
-                        offsetLeft -= parseInt(element.style.left, 10);
-                    }
-                    if (element.style.top) {
-                        offsetTop -= parseInt(element.style.top, 10);
-                    }
-                    //calc offset
-                    do {
-                        offsetLeft += current.offsetLeft;
-                        offsetTop += current.offsetTop;
-                    } while (current = current.offsetParent);
-
-                    //calc left, top
-                    var left = (x - offsetLeft);
-                    var top  = (y - offsetTop);
-
-                    //// rtl handling
-                    if (isRightToLeft()) {
-                        left *= -1;
-                    }
-
-                    element.style.left = left + 'px';
-                    element.style.top = top + 'px';
-                    
-                    // allow custom `onmoved` method
-                    dispatchEvent('onmoved', this);
-                }
-                return this;
-            },
-            /**
-             * Resize the dialog to a specific width/height (the dialog must be 'resizable').
-             * The dialog can be resized to:
-             *  A minimum width equal to the initial display width
-             *  A minimum height equal to the sum of header/footer heights.
-             *
-             *
-             * @param {Number or String} width    The new dialog width in pixels or in percent.
-             * @param {Number or String} height   The new dialog height in pixels or in percent.
-             *
-             * @return {Object} The dialog instance.
-             */
-            resizeTo:function(width,height){
-                var w = parseFloat(width),
-                    h = parseFloat(height),
-                    regex = /(\d*\.\d+|\d+)%/
-                ;
-
-                if(!isNaN(w) && !isNaN(h) && this.get('resizable') === true){
-                    
-                    // allow custom `onresize` method
-                    dispatchEvent('onresize', this);
-                    
-                    if(('' + width).match(regex)){
-                        w = w / 100 * document.documentElement.clientWidth ;
-                    }
-
-                    if(('' + height).match(regex)){
-                        h = h / 100 * document.documentElement.clientHeight;
-                    }
-
-                    var element = this.elements.dialog;
-                    if (element.style.maxWidth !== 'none') {
-                        element.style.minWidth = (minWidth = element.offsetWidth) + 'px';
-                    }
-                    element.style.maxWidth = 'none';
-                    element.style.minHeight = this.elements.header.offsetHeight + this.elements.footer.offsetHeight + 'px';
-                    element.style.width = w + 'px';
-                    element.style.height = h + 'px';
-                    
-                    // allow custom `onresized` method
-                    dispatchEvent('onresized', this);
-                }
-                return this;
-            },
-            /**
-             * Gets or Sets dialog settings/options 
-             *
-             * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs.
-             * @param {Object} value Optional, the value associated with the key (in case it was a string).
-             *
-             * @return {undefined}
-             */
-            setting : function (key, value) {
-                var self = this;
-                var result = update(this, this.__internal.options, function(k,o,n){ optionUpdated(self,k,o,n); }, key, value);
-                if(result.op === 'get'){
-                    if(result.found){
-                        return result.value;
-                    }else if(typeof this.settings !== 'undefined'){
-                        return update(this, this.settings, this.settingUpdated || function(){}, key, value).value;
-                    }else{
-                        return undefined;
-                    }
-                }else if(result.op === 'set'){
-                    if(result.items.length > 0){
-                        var callback = this.settingUpdated || function(){};
-                        for(var x=0;x<result.items.length;x+=1){
-                            var item = result.items[x];
-                            if(!item.found && typeof this.settings !== 'undefined'){
-                                update(this, this.settings, callback, item.key, item.value);
-                            }
-                        }
-                    }
-                    return this;
-                }
-            },
-            /**
-             * [Alias] Sets dialog settings/options 
-             */
-            set:function(key, value){
-                this.setting(key,value);
-                return this;
-            },
-            /**
-             * [Alias] Gets dialog settings/options 
-             */
-            get:function(key){
-                return this.setting(key);
-            },
-            /**
-            * Sets dialog header
-            * @content {string or element}
-            *
-            * @return {undefined}
-            */
-            setHeader:function(content){
-                if(typeof content === 'string'){
-                    clearContents(this.elements.header);
-                    this.elements.header.innerHTML = content;
-                }else if (content instanceof window.HTMLElement && this.elements.header.firstChild !== content){
-                    clearContents(this.elements.header);
-                    this.elements.header.appendChild(content);
-                }
-                return this;
-            },
-            /**
-            * Sets dialog contents
-            * @content {string or element}
-            *
-            * @return {undefined}
-            */
-            setContent:function(content){
-                if(typeof content === 'string'){
-                    clearContents(this.elements.content);
-                    this.elements.content.innerHTML = content;
-                }else if (content instanceof window.HTMLElement && this.elements.content.firstChild !== content){
-                    clearContents(this.elements.content);
-                    this.elements.content.appendChild(content);
-                }
-                return this;
-            },
-            /**
-             * Show the dialog as modal
-             *
-             * @return {Object} the dialog instance.
-             */
-            showModal: function(className){
-                return this.show(true, className);
-            },
-            /**
-             * Show the dialog
-             *
-             * @return {Object} the dialog instance.
-             */
-            show: function (modal, className) {
-                
-                // ensure initialization
-                initialize(this);
-
-                if ( !this.__internal.isOpen ) {
-
-                    // add to open dialogs
-                    this.__internal.isOpen = true;
-                    openDialogs.push(this);
-
-                    // save last focused element
-                    if(alertify.defaults.maintainFocus){
-                        this.__internal.activeElement = document.activeElement;
-                    }
-
-                    // set tabindex attribute on body element this allows script to give it focusable
-                    if(!document.body.hasAttribute('tabindex')) {
-                        document.body.setAttribute( 'tabindex', tabindex = '0');
-                    }
-
-                    //allow custom dom manipulation updates before showing the dialog.
-                    if(typeof this.prepare === 'function'){
-                        this.prepare();
-                    }
-
-                    bindEvents(this);
-
-                    if(modal !== undefined){
-                        this.set('modal', modal);
-                    }
-
-                    //save scroll to prevent document jump
-                    saveScrollPosition();
-
-                    ensureNoOverflow();
-
-                    // allow custom dialog class on show
-                    if(typeof className === 'string' && className !== ''){
-                        this.__internal.className = className;
-                        addClass(this.elements.root, className);
-                    }
-
-                    // maximize if start maximized
-                    if ( this.get('startMaximized')) {
-                        this.maximize();
-                    }else if(this.isMaximized()){
-                        restore(this);
-                    }
-
-                    updateAbsPositionFix(this);
-                    this.elements.root.removeAttribute('style');
-                    removeClass(this.elements.root, classes.animationOut);
-                    addClass(this.elements.root, classes.animationIn);
-
-                    // set 1s fallback in case transition event doesn't fire
-                    clearTimeout( this.__internal.timerIn);
-                    this.__internal.timerIn = setTimeout( this.__internal.transitionInHandler, transition.supported ? 1000 : 100 );
-
-                    if(isSafari){
-                        // force desktop safari reflow
-                        var root = this.elements.root;
-                        root.style.display  = 'none';
-                        setTimeout(function(){root.style.display  = 'block';}, 0);
-                    }
-
-                    //reflow
-                    reflow = this.elements.root.offsetWidth;
-                  
-                    // show dialog
-                    removeClass(this.elements.root, classes.hidden);
-
-                    // internal on show event
-                    if(typeof this.hooks.onshow === 'function'){
-                        this.hooks.onshow.call(this);
-                    }
-
-                    // allow custom `onshow` method
-                    dispatchEvent('onshow', this);
-
-                }else{
-                    // reset move updates
-                    resetMove(this);
-                    // reset resize updates
-                    resetResize(this);
-                    // shake the dialog to indicate its already open
-                    addClass(this.elements.dialog, classes.shake);
-                    var self = this;
-                    setTimeout(function(){
-                        removeClass(self.elements.dialog, classes.shake);
-                    },200);
-                }
-                return this;
-            },
-            /**
-             * Close the dialog
-             *
-             * @return {Object} The dialog instance
-             */
-            close: function () {
-                if (this.__internal.isOpen ) {
-                    // custom `onclosing` event
-                    if(dispatchEvent('onclosing', this) !== false){
-
-                        unbindEvents(this);
-
-                        removeClass(this.elements.root, classes.animationIn);
-                        addClass(this.elements.root, classes.animationOut);
-
-                        // set 1s fallback in case transition event doesn't fire
-                        clearTimeout( this.__internal.timerOut );
-                        this.__internal.timerOut = setTimeout( this.__internal.transitionOutHandler, transition.supported ? 1000 : 100 );
-                        // hide dialog
-                        addClass(this.elements.root, classes.hidden);
-                        //reflow
-                        reflow = this.elements.modal.offsetWidth;
-
-                        // remove custom dialog class on hide
-                        if (typeof this.__internal.className !== 'undefined' && this.__internal.className !== '') {
-                            removeClass(this.elements.root, this.__internal.className);
-                        }
-
-                        // internal on close event
-                        if(typeof this.hooks.onclose === 'function'){
-                            this.hooks.onclose.call(this);
-                        }
-
-                        // allow custom `onclose` method
-                        dispatchEvent('onclose', this);
-
-                        //remove from open dialogs
-                        openDialogs.splice(openDialogs.indexOf(this),1);
-                        this.__internal.isOpen = false;
-
-                        ensureNoOverflow();
-                    }
+    /**
+     * Reset move/resize on window resize.
+     *
+     * @param {Event} event	window resize event object.
+     *
+     * @return {undefined}
+     */
+    function windowResize(/*event*/) {
+      for (var x = 0; x < openDialogs.length; x += 1) {
+        var instance = openDialogs[x];
+        if (instance.get("autoReset")) {
+          resetMove(instance);
+          resetResize(instance);
+        }
+      }
+    }
+    /**
+     * Bind dialogs events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function bindEvents(instance) {
+      // if first dialog, hook global handlers
+      if (openDialogs.length === 1) {
+        //global
+        on(window, "resize", windowResize);
+        on(document.body, "keyup", keyupHandler);
+        on(document.body, "keydown", keydownHandler);
+        on(document.body, "focus", onReset);
+
+        //move
+        on(document.documentElement, "mousemove", move);
+        on(document.documentElement, "touchmove", move);
+        on(document.documentElement, "mouseup", endMove);
+        on(document.documentElement, "touchend", endMove);
+        //resize
+        on(document.documentElement, "mousemove", resize);
+        on(document.documentElement, "touchmove", resize);
+        on(document.documentElement, "mouseup", endResize);
+        on(document.documentElement, "touchend", endResize);
+      }
+
+      // common events
+      on(
+        instance.elements.commands.container,
+        "click",
+        instance.__internal.commandsClickHandler
+      );
+      on(
+        instance.elements.footer,
+        "click",
+        instance.__internal.buttonsClickHandler
+      );
+      on(instance.elements.reset[0], "focus", instance.__internal.resetHandler);
+      on(instance.elements.reset[1], "focus", instance.__internal.resetHandler);
+
+      //prevent handling key up when dialog is being opened by a key stroke.
+      cancelKeyup = true;
+      // hook in transition handler
+      on(
+        instance.elements.dialog,
+        transition.type,
+        instance.__internal.transitionInHandler
+      );
+
+      // modelss only events
+      if (!instance.get("modal")) {
+        bindModelessEvents(instance);
+      }
+
+      // resizable
+      if (instance.get("resizable")) {
+        bindResizableEvents(instance);
+      }
+
+      // movable
+      if (instance.get("movable")) {
+        bindMovableEvents(instance);
+      }
+    }
 
-                }
-                // last dialog and tab index was set by us, remove it.
-                if(!openDialogs.length && tabindex === '0'){
-                    document.body.removeAttribute('tabindex');
-                }
-                return this;
-            },
-            /**
-             * Close all open dialogs except this.
-             *
-             * @return {undefined}
-             */
-            closeOthers:function(){
-                alertify.closeAll(this);
-                return this;
-            },
-            /**
-             * Destroys this dialog instance
-             *
-             * @return {undefined}
-             */
-            destroy:function(){
-                if(this.__internal) {
-                    if (this.__internal.isOpen ) {
-                        //mark dialog for destruction, this will be called on tranistionOut event.
-                        this.__internal.destroy = function(){
-                            destruct(this, initialize);
-                        };
-                        //close the dialog to unbind all events.
-                        this.close();
-                    }else if(!this.__internal.destroy){
-                        destruct(this, initialize);
-                    }
-                }
-                return this;
-            },
-        };
-	} () );
-    var notifier = (function () {
-        var reflow,
-            element,
-            openInstances = [],
-            classes = {
-                base: 'alertify-notifier',
-                message: 'ajs-message',
-                top: 'ajs-top',
-                right: 'ajs-right',
-                bottom: 'ajs-bottom',
-                left: 'ajs-left',
-                center: 'ajs-center',
-                visible: 'ajs-visible',
-                hidden: 'ajs-hidden',
-                close: 'ajs-close'
-            };
-        /**
-         * Helper: initializes the notifier instance
-         *
-         */
-        function initialize(instance) {
+    /**
+     * Unbind dialogs events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function unbindEvents(instance) {
+      // if last dialog, remove global handlers
+      if (openDialogs.length === 1) {
+        //global
+        off(window, "resize", windowResize);
+        off(document.body, "keyup", keyupHandler);
+        off(document.body, "keydown", keydownHandler);
+        off(document.body, "focus", onReset);
+        //move
+        off(document.documentElement, "mousemove", move);
+        off(document.documentElement, "mouseup", endMove);
+        //resize
+        off(document.documentElement, "mousemove", resize);
+        off(document.documentElement, "mouseup", endResize);
+      }
+
+      // common events
+      off(
+        instance.elements.commands.container,
+        "click",
+        instance.__internal.commandsClickHandler
+      );
+      off(
+        instance.elements.footer,
+        "click",
+        instance.__internal.buttonsClickHandler
+      );
+      off(
+        instance.elements.reset[0],
+        "focus",
+        instance.__internal.resetHandler
+      );
+      off(
+        instance.elements.reset[1],
+        "focus",
+        instance.__internal.resetHandler
+      );
+
+      // hook out transition handler
+      on(
+        instance.elements.dialog,
+        transition.type,
+        instance.__internal.transitionOutHandler
+      );
+
+      // modelss only events
+      if (!instance.get("modal")) {
+        unbindModelessEvents(instance);
+      }
+
+      // movable
+      if (instance.get("movable")) {
+        unbindMovableEvents(instance);
+      }
+
+      // resizable
+      if (instance.get("resizable")) {
+        unbindResizableEvents(instance);
+      }
+    }
 
-            if (!instance.__internal) {
-                instance.__internal = {
-                    position: alertify.defaults.notifier.position,
-                    delay: alertify.defaults.notifier.delay,
-                };
+    /**
+     * Bind modeless specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function bindModelessEvents(instance) {
+      on(
+        instance.elements.dialog,
+        "focus",
+        instance.__internal.bringToFrontHandler,
+        true
+      );
+    }
 
-                element = document.createElement('DIV');
+    /**
+     * Unbind modeless specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function unbindModelessEvents(instance) {
+      off(
+        instance.elements.dialog,
+        "focus",
+        instance.__internal.bringToFrontHandler,
+        true
+      );
+    }
 
-                updatePosition(instance);
-            }
+    /**
+     * Bind movable specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function bindMovableEvents(instance) {
+      on(
+        instance.elements.header,
+        "mousedown",
+        instance.__internal.beginMoveHandler
+      );
+      on(
+        instance.elements.header,
+        "touchstart",
+        instance.__internal.beginMoveHandler
+      );
+    }
 
-            //add to DOM tree.
-            if (element.parentNode !== document.body) {
-                document.body.appendChild(element);
-            }
-        }
+    /**
+     * Unbind movable specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function unbindMovableEvents(instance) {
+      off(
+        instance.elements.header,
+        "mousedown",
+        instance.__internal.beginMoveHandler
+      );
+      off(
+        instance.elements.header,
+        "touchstart",
+        instance.__internal.beginMoveHandler
+      );
+    }
 
-        function pushInstance(instance) {
-            instance.__internal.pushed = true;
-            openInstances.push(instance);
-        }
-        function popInstance(instance) {
-            openInstances.splice(openInstances.indexOf(instance), 1);
-            instance.__internal.pushed = false;
-        }
-        /**
-         * Helper: update the notifier instance position
-         *
-         */
-        function updatePosition(instance) {
-            element.className = classes.base;
-            switch (instance.__internal.position) {
-            case 'top-right':
-                addClass(element, classes.top + ' ' + classes.right);
-                break;
-            case 'top-left':
-                addClass(element, classes.top + ' ' + classes.left);
-                break;
-            case 'top-center':
-                addClass(element, classes.top + ' ' + classes.center);
-                break;
-            case 'bottom-left':
-                addClass(element, classes.bottom + ' ' + classes.left);
-                break;
-            case 'bottom-center':
-                addClass(element, classes.bottom + ' ' + classes.center);
-                break;
+    /**
+     * Bind resizable specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function bindResizableEvents(instance) {
+      on(
+        instance.elements.resizeHandle,
+        "mousedown",
+        instance.__internal.beginResizeHandler
+      );
+      on(
+        instance.elements.resizeHandle,
+        "touchstart",
+        instance.__internal.beginResizeHandler
+      );
+    }
 
-            default:
-            case 'bottom-right':
-                addClass(element, classes.bottom + ' ' + classes.right);
-                break;
-            }
-        }
+    /**
+     * Unbind resizable specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function unbindResizableEvents(instance) {
+      off(
+        instance.elements.resizeHandle,
+        "mousedown",
+        instance.__internal.beginResizeHandler
+      );
+      off(
+        instance.elements.resizeHandle,
+        "touchstart",
+        instance.__internal.beginResizeHandler
+      );
+    }
 
-        /**
-        * creates a new notification message
-        *
-        * @param  {DOMElement} message	The notifier message element
-        * @param  {Number} wait   Time (in ms) to wait before the message is dismissed, a value of 0 means keep open till clicked.
-        * @param  {Function} callback A callback function to be invoked when the message is dismissed.
-        *
-        * @return {undefined}
-        */
-        function create(div, callback) {
-
-            function clickDelegate(event, instance) {
-                if(!instance.__internal.closeButton || event.target.getAttribute('data-close') === 'true'){
-                    instance.dismiss(true);
-                }
-            }
+    /**
+     * Bind closable events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function bindClosableEvents(instance) {
+      on(
+        instance.elements.modal,
+        "click",
+        instance.__internal.modalClickHandler
+      );
+    }
 
-            function transitionDone(event, instance) {
-                // unbind event
-                off(instance.element, transition.type, transitionDone);
-                // remove the message
-                element.removeChild(instance.element);
-            }
+    /**
+     * Unbind closable specific events
+     *
+     * @param {Object} instance The dilog instance.
+     *
+     * @return {undefined}
+     */
+    function unbindClosableEvents(instance) {
+      off(
+        instance.elements.modal,
+        "click",
+        instance.__internal.modalClickHandler
+      );
+    }
+    // dialog API
+    return {
+      __init: initialize,
+      /**
+       * Check if dialog is currently open
+       *
+       * @return {Boolean}
+       */
+      isOpen: function () {
+        return this.__internal.isOpen;
+      },
+      isModal: function () {
+        return this.elements.root.className.indexOf(classes.modeless) < 0;
+      },
+      isMaximized: function () {
+        return this.elements.root.className.indexOf(classes.maximized) > -1;
+      },
+      isPinned: function () {
+        return this.elements.root.className.indexOf(classes.unpinned) < 0;
+      },
+      maximize: function () {
+        if (!this.isMaximized()) {
+          maximize(this);
+        }
+        return this;
+      },
+      restore: function () {
+        if (this.isMaximized()) {
+          restore(this);
+        }
+        return this;
+      },
+      pin: function () {
+        if (!this.isPinned()) {
+          pin(this);
+        }
+        return this;
+      },
+      unpin: function () {
+        if (this.isPinned()) {
+          unpin(this);
+        }
+        return this;
+      },
+      bringToFront: function () {
+        bringToFront(null, this);
+        return this;
+      },
+      /**
+       * Move the dialog to a specific x/y coordinates
+       *
+       * @param {Number} x    The new dialog x coordinate in pixels.
+       * @param {Number} y    The new dialog y coordinate in pixels.
+       *
+       * @return {Object} The dialog instance.
+       */
+      moveTo: function (x, y) {
+        if (!isNaN(x) && !isNaN(y)) {
+          // allow custom `onmove` method
+          dispatchEvent("onmove", this);
+
+          var element = this.elements.dialog,
+            current = element,
+            offsetLeft = 0,
+            offsetTop = 0;
+
+          //subtract existing left,top
+          if (element.style.left) {
+            offsetLeft -= parseInt(element.style.left, 10);
+          }
+          if (element.style.top) {
+            offsetTop -= parseInt(element.style.top, 10);
+          }
+          //calc offset
+          do {
+            offsetLeft += current.offsetLeft;
+            offsetTop += current.offsetTop;
+          } while ((current = current.offsetParent));
+
+          //calc left, top
+          var left = x - offsetLeft;
+          var top = y - offsetTop;
+
+          //// rtl handling
+          if (isRightToLeft()) {
+            left *= -1;
+          }
+
+          element.style.left = left + "px";
+          element.style.top = top + "px";
+
+          // allow custom `onmoved` method
+          dispatchEvent("onmoved", this);
+        }
+        return this;
+      },
+      /**
+       * Resize the dialog to a specific width/height (the dialog must be 'resizable').
+       * The dialog can be resized to:
+       *  A minimum width equal to the initial display width
+       *  A minimum height equal to the sum of header/footer heights.
+       *
+       *
+       * @param {Number or String} width    The new dialog width in pixels or in percent.
+       * @param {Number or String} height   The new dialog height in pixels or in percent.
+       *
+       * @return {Object} The dialog instance.
+       */
+      resizeTo: function (width, height) {
+        var w = parseFloat(width),
+          h = parseFloat(height),
+          regex = /(\d*\.\d+|\d+)%/;
+        if (!isNaN(w) && !isNaN(h) && this.get("resizable") === true) {
+          // allow custom `onresize` method
+          dispatchEvent("onresize", this);
+
+          if (("" + width).match(regex)) {
+            w = (w / 100) * document.documentElement.clientWidth;
+          }
+
+          if (("" + height).match(regex)) {
+            h = (h / 100) * document.documentElement.clientHeight;
+          }
+
+          var element = this.elements.dialog;
+          if (element.style.maxWidth !== "none") {
+            element.style.minWidth = (minWidth = element.offsetWidth) + "px";
+          }
+          element.style.maxWidth = "none";
+          element.style.minHeight =
+            this.elements.header.offsetHeight +
+            this.elements.footer.offsetHeight +
+            "px";
+          element.style.width = w + "px";
+          element.style.height = h + "px";
+
+          // allow custom `onresized` method
+          dispatchEvent("onresized", this);
+        }
+        return this;
+      },
+      /**
+       * Gets or Sets dialog settings/options
+       *
+       * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs.
+       * @param {Object} value Optional, the value associated with the key (in case it was a string).
+       *
+       * @return {undefined}
+       */
+      setting: function (key, value) {
+        var self = this;
+        var result = update(
+          this,
+          this.__internal.options,
+          function (k, o, n) {
+            optionUpdated(self, k, o, n);
+          },
+          key,
+          value
+        );
+        if (result.op === "get") {
+          if (result.found) {
+            return result.value;
+          } else if (typeof this.settings !== "undefined") {
+            return update(
+              this,
+              this.settings,
+              this.settingUpdated || function () {},
+              key,
+              value
+            ).value;
+          } else {
+            return undefined;
+          }
+        } else if (result.op === "set") {
+          if (result.items.length > 0) {
+            var callback = this.settingUpdated || function () {};
+            for (var x = 0; x < result.items.length; x += 1) {
+              var item = result.items[x];
+              if (!item.found && typeof this.settings !== "undefined") {
+                update(this, this.settings, callback, item.key, item.value);
+              }
+            }
+          }
+          return this;
+        }
+      },
+      /**
+       * [Alias] Sets dialog settings/options
+       */
+      set: function (key, value) {
+        this.setting(key, value);
+        return this;
+      },
+      /**
+       * [Alias] Gets dialog settings/options
+       */
+      get: function (key) {
+        return this.setting(key);
+      },
+      /**
+       * Sets dialog header
+       * @content {string or element}
+       *
+       * @return {undefined}
+       */
+      setHeader: function (content) {
+        if (typeof content === "string") {
+          clearContents(this.elements.header);
+          this.elements.header.innerHTML = content;
+        } else if (
+          content instanceof window.HTMLElement &&
+          this.elements.header.firstChild !== content
+        ) {
+          clearContents(this.elements.header);
+          this.elements.header.appendChild(content);
+        }
+        return this;
+      },
+      /**
+       * Sets dialog contents
+       * @content {string or element}
+       *
+       * @return {undefined}
+       */
+      setContent: function (content) {
+        if (typeof content === "string") {
+          clearContents(this.elements.content);
+          this.elements.content.innerHTML = content;
+        } else if (
+          content instanceof window.HTMLElement &&
+          this.elements.content.firstChild !== content
+        ) {
+          clearContents(this.elements.content);
+          this.elements.content.appendChild(content);
+        }
+        return this;
+      },
+      /**
+       * Show the dialog as modal
+       *
+       * @return {Object} the dialog instance.
+       */
+      showModal: function (className) {
+        return this.show(true, className);
+      },
+      /**
+       * Show the dialog
+       *
+       * @return {Object} the dialog instance.
+       */
+      show: function (modal, className) {
+        // ensure initialization
+        initialize(this);
+
+        if (!this.__internal.isOpen) {
+          // add to open dialogs
+          this.__internal.isOpen = true;
+          openDialogs.push(this);
+
+          // save last focused element
+          if (alertify.defaults.maintainFocus) {
+            this.__internal.activeElement = document.activeElement;
+          }
+
+          // set tabindex attribute on body element this allows script to give it focusable
+          if (!document.body.hasAttribute("tabindex")) {
+            document.body.setAttribute("tabindex", (tabindex = "0"));
+          }
+
+          //allow custom dom manipulation updates before showing the dialog.
+          if (typeof this.prepare === "function") {
+            this.prepare();
+          }
+
+          bindEvents(this);
+
+          if (modal !== undefined) {
+            this.set("modal", modal);
+          }
+
+          //save scroll to prevent document jump
+          saveScrollPosition();
+
+          ensureNoOverflow();
+
+          // allow custom dialog class on show
+          if (typeof className === "string" && className !== "") {
+            this.__internal.className = className;
+            addClass(this.elements.root, className);
+          }
+
+          // maximize if start maximized
+          if (this.get("startMaximized")) {
+            this.maximize();
+          } else if (this.isMaximized()) {
+            restore(this);
+          }
+
+          updateAbsPositionFix(this);
+          this.elements.root.removeAttribute("style");
+          removeClass(this.elements.root, classes.animationOut);
+          addClass(this.elements.root, classes.animationIn);
+
+          // set 1s fallback in case transition event doesn't fire
+          clearTimeout(this.__internal.timerIn);
+          this.__internal.timerIn = setTimeout(
+            this.__internal.transitionInHandler,
+            transition.supported ? 1000 : 100
+          );
+
+          if (isSafari) {
+            // force desktop safari reflow
+            var root = this.elements.root;
+            root.style.display = "none";
+            setTimeout(function () {
+              root.style.display = "block";
+            }, 0);
+          }
+
+          //reflow
+          reflow = this.elements.root.offsetWidth;
+
+          // show dialog
+          removeClass(this.elements.root, classes.hidden);
+
+          // internal on show event
+          if (typeof this.hooks.onshow === "function") {
+            this.hooks.onshow.call(this);
+          }
+
+          // allow custom `onshow` method
+          dispatchEvent("onshow", this);
+        } else {
+          // reset move updates
+          resetMove(this);
+          // reset resize updates
+          resetResize(this);
+          // shake the dialog to indicate its already open
+          addClass(this.elements.dialog, classes.shake);
+          var self = this;
+          setTimeout(function () {
+            removeClass(self.elements.dialog, classes.shake);
+          }, 200);
+        }
+        return this;
+      },
+      /**
+       * Close the dialog
+       *
+       * @return {Object} The dialog instance
+       */
+      close: function () {
+        if (this.__internal.isOpen) {
+          // custom `onclosing` event
+          if (dispatchEvent("onclosing", this) !== false) {
+            unbindEvents(this);
+
+            removeClass(this.elements.root, classes.animationIn);
+            addClass(this.elements.root, classes.animationOut);
+
+            // set 1s fallback in case transition event doesn't fire
+            clearTimeout(this.__internal.timerOut);
+            this.__internal.timerOut = setTimeout(
+              this.__internal.transitionOutHandler,
+              transition.supported ? 1000 : 100
+            );
+            // hide dialog
+            addClass(this.elements.root, classes.hidden);
+            //reflow
+            reflow = this.elements.modal.offsetWidth;
+
+            // remove custom dialog class on hide
+            if (
+              typeof this.__internal.className !== "undefined" &&
+              this.__internal.className !== ""
+            ) {
+              removeClass(this.elements.root, this.__internal.className);
+            }
+
+            // internal on close event
+            if (typeof this.hooks.onclose === "function") {
+              this.hooks.onclose.call(this);
+            }
+
+            // allow custom `onclose` method
+            dispatchEvent("onclose", this);
+
+            //remove from open dialogs
+            openDialogs.splice(openDialogs.indexOf(this), 1);
+            this.__internal.isOpen = false;
+
+            ensureNoOverflow();
+          }
+        }
+        // last dialog and tab index was set by us, remove it.
+        if (!openDialogs.length && tabindex === "0") {
+          document.body.removeAttribute("tabindex");
+        }
+        return this;
+      },
+      /**
+       * Close all open dialogs except this.
+       *
+       * @return {undefined}
+       */
+      closeOthers: function () {
+        alertify.closeAll(this);
+        return this;
+      },
+      /**
+       * Destroys this dialog instance
+       *
+       * @return {undefined}
+       */
+      destroy: function () {
+        if (this.__internal) {
+          if (this.__internal.isOpen) {
+            //mark dialog for destruction, this will be called on tranistionOut event.
+            this.__internal.destroy = function () {
+              destruct(this, initialize);
+            };
+            //close the dialog to unbind all events.
+            this.close();
+          } else if (!this.__internal.destroy) {
+            destruct(this, initialize);
+          }
+        }
+        return this;
+      },
+    };
+  })();
+  var notifier = (function () {
+    var reflow,
+      element,
+      openInstances = [],
+      classes = {
+        base: "alertify-notifier",
+        message: "ajs-message",
+        top: "ajs-top",
+        right: "ajs-right",
+        bottom: "ajs-bottom",
+        left: "ajs-left",
+        center: "ajs-center",
+        visible: "ajs-visible",
+        hidden: "ajs-hidden",
+        close: "ajs-close",
+      };
+    /**
+     * Helper: initializes the notifier instance
+     *
+     */
+    function initialize(instance) {
+      if (!instance.__internal) {
+        instance.__internal = {
+          position: alertify.defaults.notifier.position,
+          delay: alertify.defaults.notifier.delay,
+        };
 
-            function initialize(instance) {
-                if (!instance.__internal) {
-                    instance.__internal = {
-                        pushed: false,
-                        delay : undefined,
-                        timer: undefined,
-                        clickHandler: undefined,
-                        transitionEndHandler: undefined,
-                        transitionTimeout: undefined
-                    };
-                    instance.__internal.clickHandler = delegate(instance, clickDelegate);
-                    instance.__internal.transitionEndHandler = delegate(instance, transitionDone);
-                }
-                return instance;
-            }
-            function clearTimers(instance) {
-                clearTimeout(instance.__internal.timer);
-                clearTimeout(instance.__internal.transitionTimeout);
-            }
-            return initialize({
-                /* notification DOM element*/
-                element: div,
-                /*
-                 * Pushes a notification message
-                 * @param {string or DOMElement} content The notification message content
-                 * @param {Number} wait The time (in seconds) to wait before the message is dismissed, a value of 0 means keep open till clicked.
-                 *
-                 */
-                push: function (_content, _wait) {
-                    if (!this.__internal.pushed) {
-
-                        pushInstance(this);
-                        clearTimers(this);
-
-                        var content, wait;
-                        switch (arguments.length) {
-                        case 0:
-                            wait = this.__internal.delay;
-                            break;
-                        case 1:
-                            if (typeof (_content) === 'number') {
-                                wait = _content;
-                            } else {
-                                content = _content;
-                                wait = this.__internal.delay;
-                            }
-                            break;
-                        case 2:
-                            content = _content;
-                            wait = _wait;
-                            break;
-                        }
-                        this.__internal.closeButton = alertify.defaults.notifier.closeButton;
-                        // set contents
-                        if (typeof content !== 'undefined') {
-                            this.setContent(content);
-                        }
-                        // append or insert
-                        if (notifier.__internal.position.indexOf('top') < 0) {
-                            element.appendChild(this.element);
-                        } else {
-                            element.insertBefore(this.element, element.firstChild);
-                        }
-                        reflow = this.element.offsetWidth;
-                        addClass(this.element, classes.visible);
-                        // attach click event
-                        on(this.element, 'click', this.__internal.clickHandler);
-                        return this.delay(wait);
-                    }
-                    return this;
-                },
-                /*
-                 * {Function} callback function to be invoked before dismissing the notification message.
-                 * Remarks: A return value === 'false' will cancel the dismissal
-                 *
-                 */
-                ondismiss: function () { },
-                /*
-                 * {Function} callback function to be invoked when the message is dismissed.
-                 *
-                 */
-                callback: callback,
-                /*
-                 * Dismisses the notification message
-                 * @param {Boolean} clicked A flag indicating if the dismissal was caused by a click.
-                 *
-                 */
-                dismiss: function (clicked) {
-                    if (this.__internal.pushed) {
-                        clearTimers(this);
-                        if (!(typeof this.ondismiss === 'function' && this.ondismiss.call(this) === false)) {
-                            //detach click event
-                            off(this.element, 'click', this.__internal.clickHandler);
-                            // ensure element exists
-                            if (typeof this.element !== 'undefined' && this.element.parentNode === element) {
-                                //transition end or fallback
-                                this.__internal.transitionTimeout = setTimeout(this.__internal.transitionEndHandler, transition.supported ? 1000 : 100);
-                                removeClass(this.element, classes.visible);
-
-                                // custom callback on dismiss
-                                if (typeof this.callback === 'function') {
-                                    this.callback.call(this, clicked);
-                                }
-                            }
-                            popInstance(this);
-                        }
-                    }
-                    return this;
-                },
-                /*
-                 * Delays the notification message dismissal
-                 * @param {Number} wait The time (in seconds) to wait before the message is dismissed, a value of 0 means keep open till clicked.
-                 *
-                 */
-                delay: function (wait) {
-                    clearTimers(this);
-                    this.__internal.delay = typeof wait !== 'undefined' && !isNaN(+wait) ? +wait : notifier.__internal.delay;
-                    if (this.__internal.delay > 0) {
-                        var  self = this;
-                        this.__internal.timer = setTimeout(function () { self.dismiss(); }, this.__internal.delay * 1000);
-                    }
-                    return this;
-                },
-                /*
-                 * Sets the notification message contents
-                 * @param {string or DOMElement} content The notification message content
-                 *
-                 */
-                setContent: function (content) {
-                    if (typeof content === 'string') {
-                        clearContents(this.element);
-                        this.element.innerHTML = content;
-                    } else if (content instanceof window.HTMLElement && this.element.firstChild !== content) {
-                        clearContents(this.element);
-                        this.element.appendChild(content);
-                    }
-                    if(this.__internal.closeButton){
-                        var close = document.createElement('span');
-                        addClass(close, classes.close);
-                        close.setAttribute('data-close', true);
-                        this.element.appendChild(close);
-                    }
-                    return this;
-                },
-                /*
-                 * Dismisses all open notifications except this.
-                 *
-                 */
-                dismissOthers: function () {
-                    notifier.dismissAll(this);
-                    return this;
-                }
-            });
-        }
+        element = document.createElement("DIV");
 
-        //notifier api
-        return {
-            /**
-             * Gets or Sets notifier settings.
-             *
-             * @param {string} key The setting name
-             * @param {Variant} value The setting value.
-             *
-             * @return {Object}	if the called as a setter, return the notifier instance.
-             */
-            setting: function (key, value) {
-                //ensure init
-                initialize(this);
-
-                if (typeof value === 'undefined') {
-                    //get
-                    return this.__internal[key];
-                } else {
-                    //set
-                    switch (key) {
-                    case 'position':
-                        this.__internal.position = value;
-                        updatePosition(this);
-                        break;
-                    case 'delay':
-                        this.__internal.delay = value;
-                        break;
-                    }
-                }
-                return this;
-            },
-            /**
-             * [Alias] Sets dialog settings/options
-             */
-            set:function(key,value){
-                this.setting(key,value);
-                return this;
-            },
-            /**
-             * [Alias] Gets dialog settings/options
-             */
-            get:function(key){
-                return this.setting(key);
-            },
-            /**
-             * Creates a new notification message
-             *
-             * @param {string} type The type of notification message (simply a CSS class name 'ajs-{type}' to be added).
-             * @param {Function} callback  A callback function to be invoked when the message is dismissed.
-             *
-             * @return {undefined}
-             */
-            create: function (type, callback) {
-                //ensure notifier init
-                initialize(this);
-                //create new notification message
-                var div = document.createElement('div');
-                div.className = classes.message + ((typeof type === 'string' && type !== '') ? ' ajs-' + type : '');
-                return create(div, callback);
-            },
-            /**
-             * Dismisses all open notifications.
-             *
-             * @param {Object} excpet [optional] The notification object to exclude from dismissal.
-             *
-             */
-            dismissAll: function (except) {
-                var clone = openInstances.slice(0);
-                for (var x = 0; x < clone.length; x += 1) {
-                    var  instance = clone[x];
-                    if (except === undefined || except !== instance) {
-                        instance.dismiss();
-                    }
-                }
-            }
-        };
-    })();
+        updatePosition(instance);
+      }
+
+      //add to DOM tree.
+      if (element.parentNode !== document.body) {
+        document.body.appendChild(element);
+      }
+    }
 
+    function pushInstance(instance) {
+      instance.__internal.pushed = true;
+      openInstances.push(instance);
+    }
+    function popInstance(instance) {
+      openInstances.splice(openInstances.indexOf(instance), 1);
+      instance.__internal.pushed = false;
+    }
     /**
-     * Alertify public API
-     * This contains everything that is exposed through the alertify object.
+     * Helper: update the notifier instance position
      *
-     * @return {Object}
      */
-    function Alertify() {
-
-        // holds a references of created dialogs
-        var dialogs = {};
+    function updatePosition(instance) {
+      element.className = classes.base;
+      switch (instance.__internal.position) {
+        case "top-right":
+          addClass(element, classes.top + " " + classes.right);
+          break;
+        case "top-left":
+          addClass(element, classes.top + " " + classes.left);
+          break;
+        case "top-center":
+          addClass(element, classes.top + " " + classes.center);
+          break;
+        case "bottom-left":
+          addClass(element, classes.bottom + " " + classes.left);
+          break;
+        case "bottom-center":
+          addClass(element, classes.bottom + " " + classes.center);
+          break;
+
+        default:
+        case "bottom-right":
+          addClass(element, classes.bottom + " " + classes.right);
+          break;
+      }
+    }
 
-        /**
-         * Extends a given prototype by merging properties from base into sub.
-         *
-         * @sub {Object} sub The prototype being overwritten.
-         * @base {Object} base The prototype being written.
+    /**
+     * creates a new notification message
+     *
+     * @param  {DOMElement} message	The notifier message element
+     * @param  {Number} wait   Time (in ms) to wait before the message is dismissed, a value of 0 means keep open till clicked.
+     * @param  {Function} callback A callback function to be invoked when the message is dismissed.
+     *
+     * @return {undefined}
+     */
+    function create(div, callback) {
+      function clickDelegate(event, instance) {
+        if (
+          !instance.__internal.closeButton ||
+          event.target.getAttribute("data-close") === "true"
+        ) {
+          instance.dismiss(true);
+        }
+      }
+
+      function transitionDone(event, instance) {
+        // unbind event
+        off(instance.element, transition.type, transitionDone);
+        // remove the message
+        element.removeChild(instance.element);
+      }
+
+      function initialize(instance) {
+        if (!instance.__internal) {
+          instance.__internal = {
+            pushed: false,
+            delay: undefined,
+            timer: undefined,
+            clickHandler: undefined,
+            transitionEndHandler: undefined,
+            transitionTimeout: undefined,
+          };
+          instance.__internal.clickHandler = delegate(instance, clickDelegate);
+          instance.__internal.transitionEndHandler = delegate(
+            instance,
+            transitionDone
+          );
+        }
+        return instance;
+      }
+      function clearTimers(instance) {
+        clearTimeout(instance.__internal.timer);
+        clearTimeout(instance.__internal.transitionTimeout);
+      }
+      return initialize({
+        /* notification DOM element*/
+        element: div,
+        /*
+         * Pushes a notification message
+         * @param {string or DOMElement} content The notification message content
+         * @param {Number} wait The time (in seconds) to wait before the message is dismissed, a value of 0 means keep open till clicked.
          *
-         * @return {Object} The extended prototype.
          */
-        function extend(sub, base) {
-            // copy dialog pototype over definition.
-            for (var prop in base) {
-                if (base.hasOwnProperty(prop)) {
-                    sub[prop] = base[prop];
+        push: function (_content, _wait) {
+          if (!this.__internal.pushed) {
+            pushInstance(this);
+            clearTimers(this);
+
+            var content, wait;
+            switch (arguments.length) {
+              case 0:
+                wait = this.__internal.delay;
+                break;
+              case 1:
+                if (typeof _content === "number") {
+                  wait = _content;
+                } else {
+                  content = _content;
+                  wait = this.__internal.delay;
                 }
+                break;
+              case 2:
+                content = _content;
+                wait = _wait;
+                break;
             }
-            return sub;
-        }
-
-
-        /**
-        * Helper: returns a dialog instance from saved dialogs.
-        * and initializes the dialog if its not already initialized.
-        *
-        * @name {String} name The dialog name.
-        *
-        * @return {Object} The dialog instance.
-        */
-        function get_dialog(name) {
-            var dialog = dialogs[name].dialog;
-            //initialize the dialog if its not already initialized.
-            if (dialog && typeof dialog.__init === 'function') {
-                dialog.__init(dialog);
+            this.__internal.closeButton =
+              alertify.defaults.notifier.closeButton;
+            // set contents
+            if (typeof content !== "undefined") {
+              this.setContent(content);
             }
-            return dialog;
-        }
-
-        /**
-         * Helper:  registers a new dialog definition.
+            // append or insert
+            if (notifier.__internal.position.indexOf("top") < 0) {
+              element.appendChild(this.element);
+            } else {
+              element.insertBefore(this.element, element.firstChild);
+            }
+            reflow = this.element.offsetWidth;
+            addClass(this.element, classes.visible);
+            // attach click event
+            on(this.element, "click", this.__internal.clickHandler);
+            return this.delay(wait);
+          }
+          return this;
+        },
+        /*
+         * {Function} callback function to be invoked before dismissing the notification message.
+         * Remarks: A return value === 'false' will cancel the dismissal
          *
-         * @name {String} name The dialog name.
-         * @Factory {Function} Factory a function resposible for creating dialog prototype.
-         * @transient {Boolean} transient True to create a new dialog instance each time the dialog is invoked, false otherwise.
-         * @base {String} base the name of another dialog to inherit from.
+         */
+        ondismiss: function () {},
+        /*
+         * {Function} callback function to be invoked when the message is dismissed.
          *
-         * @return {Object} The dialog definition.
          */
-        function register(name, Factory, transient, base) {
-            var definition = {
-                dialog: null,
-                factory: Factory
-            };
-
-            //if this is based on an existing dialog, create a new definition
-            //by applying the new protoype over the existing one.
-            if (base !== undefined) {
-                definition.factory = function () {
-                    return extend(new dialogs[base].factory(), new Factory());
-                };
-            }
-
-            if (!transient) {
-                //create a new definition based on dialog
-                definition.dialog = extend(new definition.factory(), dialog);
-            }
-            return dialogs[name] = definition;
-        }
-
-        return {
-            /**
-             * Alertify defaults
-             * 
-             * @type {Object}
-             */
-            defaults: defaults,
-            /**
-             * Dialogs factory 
-             *
-             * @param {string}      Dialog name.
-             * @param {Function}    A Dialog factory function.
-             * @param {Boolean}     Indicates whether to create a singleton or transient dialog.
-             * @param {String}      The name of the base type to inherit from.
-             */
-            dialog: function (name, Factory, transient, base) {
-
-                // get request, create a new instance and return it.
-                if (typeof Factory !== 'function') {
-                    return get_dialog(name);
-                }
-
-                if (this.hasOwnProperty(name)) {
-                    throw new Error('alertify.dialog: name already exists');
-                }
+        callback: callback,
+        /*
+         * Dismisses the notification message
+         * @param {Boolean} clicked A flag indicating if the dismissal was caused by a click.
+         *
+         */
+        dismiss: function (clicked) {
+          if (this.__internal.pushed) {
+            clearTimers(this);
+            if (
+              !(
+                typeof this.ondismiss === "function" &&
+                this.ondismiss.call(this) === false
+              )
+            ) {
+              //detach click event
+              off(this.element, "click", this.__internal.clickHandler);
+              // ensure element exists
+              if (
+                typeof this.element !== "undefined" &&
+                this.element.parentNode === element
+              ) {
+                //transition end or fallback
+                this.__internal.transitionTimeout = setTimeout(
+                  this.__internal.transitionEndHandler,
+                  transition.supported ? 1000 : 100
+                );
+                removeClass(this.element, classes.visible);
+
+                // custom callback on dismiss
+                if (typeof this.callback === "function") {
+                  this.callback.call(this, clicked);
+                }
+              }
+              popInstance(this);
+            }
+          }
+          return this;
+        },
+        /*
+         * Delays the notification message dismissal
+         * @param {Number} wait The time (in seconds) to wait before the message is dismissed, a value of 0 means keep open till clicked.
+         *
+         */
+        delay: function (wait) {
+          clearTimers(this);
+          this.__internal.delay =
+            typeof wait !== "undefined" && !isNaN(+wait)
+              ? +wait
+              : notifier.__internal.delay;
+          if (this.__internal.delay > 0) {
+            var self = this;
+            this.__internal.timer = setTimeout(function () {
+              self.dismiss();
+            }, this.__internal.delay * 1000);
+          }
+          return this;
+        },
+        /*
+         * Sets the notification message contents
+         * @param {string or DOMElement} content The notification message content
+         *
+         */
+        setContent: function (content) {
+          if (typeof content === "string") {
+            clearContents(this.element);
+            this.element.innerHTML = content;
+          } else if (
+            content instanceof window.HTMLElement &&
+            this.element.firstChild !== content
+          ) {
+            clearContents(this.element);
+            this.element.appendChild(content);
+          }
+          if (this.__internal.closeButton) {
+            var close = document.createElement("span");
+            addClass(close, classes.close);
+            close.setAttribute("data-close", true);
+            this.element.appendChild(close);
+          }
+          return this;
+        },
+        /*
+         * Dismisses all open notifications except this.
+         *
+         */
+        dismissOthers: function () {
+          notifier.dismissAll(this);
+          return this;
+        },
+      });
+    }
 
-                // register the dialog
-                var definition = register(name, Factory, transient, base);
-
-                if (transient) {
-
-                    // make it public
-                    this[name] = function () {
-                        //if passed with no params, consider it a get request
-                        if (arguments.length === 0) {
-                            return definition.dialog;
-                        } else {
-                            var instance = extend(new definition.factory(), dialog);
-                            //ensure init
-                            if (instance && typeof instance.__init === 'function') {
-                                instance.__init(instance);
-                            }
-                            instance['main'].apply(instance, arguments);
-                            return instance['show'].apply(instance);
-                        }
-                    };
-                } else {
-                    // make it public
-                    this[name] = function () {
-                        //ensure init
-                        if (definition.dialog && typeof definition.dialog.__init === 'function') {
-                            definition.dialog.__init(definition.dialog);
-                        }
-                        //if passed with no params, consider it a get request
-                        if (arguments.length === 0) {
-                            return definition.dialog;
-                        } else {
-                            var dialog = definition.dialog;
-                            dialog['main'].apply(definition.dialog, arguments);
-                            return dialog['show'].apply(definition.dialog);
-                        }
-                    };
-                }
-            },
-            /**
-             * Close all open dialogs.
-             *
-             * @param {Object} excpet [optional] The dialog object to exclude from closing.
-             *
-             * @return {undefined}
-             */
-            closeAll: function (except) {
-                var clone = openDialogs.slice(0);
-                for (var x = 0; x < clone.length; x += 1) {
-                    var instance = clone[x];
-                    if (except === undefined || except !== instance) {
-                        instance.close();
-                    }
-                }
-            },
-            /**
-             * Gets or Sets dialog settings/options. if the dialog is transient, this call does nothing.
-             *
-             * @param {string} name The dialog name.
-             * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs.
-             * @param {Variant} value Optional, the value associated with the key (in case it was a string).
-             *
-             * @return {undefined}
-             */
-            setting: function (name, key, value) {
-
-                if (name === 'notifier') {
-                    return notifier.setting(key, value);
-                }
+    //notifier api
+    return {
+      /**
+       * Gets or Sets notifier settings.
+       *
+       * @param {string} key The setting name
+       * @param {Variant} value The setting value.
+       *
+       * @return {Object}	if the called as a setter, return the notifier instance.
+       */
+      setting: function (key, value) {
+        //ensure init
+        initialize(this);
+
+        if (typeof value === "undefined") {
+          //get
+          return this.__internal[key];
+        } else {
+          //set
+          switch (key) {
+            case "position":
+              this.__internal.position = value;
+              updatePosition(this);
+              break;
+            case "delay":
+              this.__internal.delay = value;
+              break;
+          }
+        }
+        return this;
+      },
+      /**
+       * [Alias] Sets dialog settings/options
+       */
+      set: function (key, value) {
+        this.setting(key, value);
+        return this;
+      },
+      /**
+       * [Alias] Gets dialog settings/options
+       */
+      get: function (key) {
+        return this.setting(key);
+      },
+      /**
+       * Creates a new notification message
+       *
+       * @param {string} type The type of notification message (simply a CSS class name 'ajs-{type}' to be added).
+       * @param {Function} callback  A callback function to be invoked when the message is dismissed.
+       *
+       * @return {undefined}
+       */
+      create: function (type, callback) {
+        //ensure notifier init
+        initialize(this);
+        //create new notification message
+        var div = document.createElement("div");
+        div.className =
+          classes.message +
+          (typeof type === "string" && type !== "" ? " ajs-" + type : "");
+        return create(div, callback);
+      },
+      /**
+       * Dismisses all open notifications.
+       *
+       * @param {Object} excpet [optional] The notification object to exclude from dismissal.
+       *
+       */
+      dismissAll: function (except) {
+        var clone = openInstances.slice(0);
+        for (var x = 0; x < clone.length; x += 1) {
+          var instance = clone[x];
+          if (except === undefined || except !== instance) {
+            instance.dismiss();
+          }
+        }
+      },
+    };
+  })();
+
+  /**
+   * Alertify public API
+   * This contains everything that is exposed through the alertify object.
+   *
+   * @return {Object}
+   */
+  function Alertify() {
+    // holds a references of created dialogs
+    var dialogs = {};
 
-                var dialog = get_dialog(name);
-                if (dialog) {
-                    return dialog.setting(key, value);
-                }
-            },
-            /**
-             * [Alias] Sets dialog settings/options 
-             */
-            set: function(name,key,value){
-                return this.setting(name, key,value);
-            },
-            /**
-             * [Alias] Gets dialog settings/options 
-             */
-            get: function(name, key){
-                return this.setting(name, key);
-            },
-            /**
-             * Creates a new notification message.
-             * If a type is passed, a class name "ajs-{type}" will be added.
-             * This allows for custom look and feel for various types of notifications.
-             *
-             * @param  {String | DOMElement}    [message=undefined]		Message text
-             * @param  {String}                 [type='']				Type of log message
-             * @param  {String}                 [wait='']				Time (in seconds) to wait before auto-close
-             * @param  {Function}               [callback=undefined]	A callback function to be invoked when the log is closed.
-             *
-             * @return {Object} Notification object.
-             */
-            notify: function (message, type, wait, callback) {
-                return notifier.create(type, callback).push(message, wait);
-            },
-            /**
-             * Creates a new notification message.
-             *
-             * @param  {String}		[message=undefined]		Message text
-             * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
-             * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
-             *
-             * @return {Object} Notification object.
-             */
-            message: function (message, wait, callback) {
-                return notifier.create(null, callback).push(message, wait);
-            },
-            /**
-             * Creates a new notification message of type 'success'.
-             *
-             * @param  {String}		[message=undefined]		Message text
-             * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
-             * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
-             *
-             * @return {Object} Notification object.
-             */
-            success: function (message, wait, callback) {
-                return notifier.create('success', callback).push(message, wait);
-            },
-            /**
-             * Creates a new notification message of type 'error'.
-             *
-             * @param  {String}		[message=undefined]		Message text
-             * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
-             * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
-             *
-             * @return {Object} Notification object.
-             */
-            error: function (message, wait, callback) {
-                return notifier.create('error', callback).push(message, wait);
-            },
-            /**
-             * Creates a new notification message of type 'warning'.
-             *
-             * @param  {String}		[message=undefined]		Message text
-             * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
-             * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
-             *
-             * @return {Object} Notification object.
-             */
-            warning: function (message, wait, callback) {
-                return notifier.create('warning', callback).push(message, wait);
-            },
-            /**
-             * Dismisses all open notifications
-             *
-             * @return {undefined}
-             */
-            dismissAll: function () {
-                notifier.dismissAll();
-            }
-        };
+    /**
+     * Extends a given prototype by merging properties from base into sub.
+     *
+     * @sub {Object} sub The prototype being overwritten.
+     * @base {Object} base The prototype being written.
+     *
+     * @return {Object} The extended prototype.
+     */
+    function extend(sub, base) {
+      // copy dialog pototype over definition.
+      for (var prop in base) {
+        if (base.hasOwnProperty(prop)) {
+          sub[prop] = base[prop];
+        }
+      }
+      return sub;
     }
-    var alertify = new Alertify();
 
     /**
-    * Alert dialog definition
-    *
-    * invoked by:
-    *	alertify.alert(message);
-    *	alertify.alert(title, message);
-    *	alertify.alert(message, onok);
-    *	alertify.alert(title, message, onok);
+     * Helper: returns a dialog instance from saved dialogs.
+     * and initializes the dialog if its not already initialized.
+     *
+     * @name {String} name The dialog name.
+     *
+     * @return {Object} The dialog instance.
      */
-    alertify.dialog('alert', function () {
-        return {
-            main: function (_title, _message, _onok) {
-                var title, message, onok;
-                switch (arguments.length) {
-                case 1:
-                    message = _title;
-                    break;
-                case 2:
-                    if (typeof _message === 'function') {
-                        message = _title;
-                        onok = _message;
-                    } else {
-                        title = _title;
-                        message = _message;
-                    }
-                    break;
-                case 3:
-                    title = _title;
-                    message = _message;
-                    onok = _onok;
-                    break;
-                }
-                this.set('title', title);
-                this.set('message', message);
-                this.set('onok', onok);
-                return this;
-            },
-            setup: function () {
-                return {
-                    buttons: [
-                        {
-                            text: alertify.defaults.glossary.ok,
-                            key: keys.ESC,
-                            invokeOnClose: true,
-                            className: alertify.defaults.theme.ok,
-                        }
-                    ],
-                    focus: {
-                        element: 0,
-                        select: false
-                    },
-                    options: {
-                        maximizable: false,
-                        resizable: false
-                    }
-                };
-            },
-            build: function () {
-                // nothing
-            },
-            prepare: function () {
-                //nothing
-            },
-            setMessage: function (message) {
-                this.setContent(message);
-            },
-            settings: {
-                message: undefined,
-                onok: undefined,
-                label: undefined,
-            },
-            settingUpdated: function (key, oldValue, newValue) {
-                switch (key) {
-                case 'message':
-                    this.setMessage(newValue);
-                    break;
-                case 'label':
-                    if (this.__internal.buttons[0].element) {
-                        this.__internal.buttons[0].element.innerHTML = newValue;
-                    }
-                    break;
-                }
-            },
-            callback: function (closeEvent) {
-                if (typeof this.get('onok') === 'function') {
-                    var returnValue = this.get('onok').call(this, closeEvent);
-                    if (typeof returnValue !== 'undefined') {
-                        closeEvent.cancel = !returnValue;
-                    }
-                }
-            }
-        };
-    });
+    function get_dialog(name) {
+      var dialog = dialogs[name].dialog;
+      //initialize the dialog if its not already initialized.
+      if (dialog && typeof dialog.__init === "function") {
+        dialog.__init(dialog);
+      }
+      return dialog;
+    }
+
     /**
-     * Confirm dialog object
+     * Helper:  registers a new dialog definition.
      *
-     *	alertify.confirm(message);
-     *	alertify.confirm(message, onok);
-     *	alertify.confirm(message, onok, oncancel);
-     *	alertify.confirm(title, message, onok, oncancel);
+     * @name {String} name The dialog name.
+     * @Factory {Function} Factory a function resposible for creating dialog prototype.
+     * @transient {Boolean} transient True to create a new dialog instance each time the dialog is invoked, false otherwise.
+     * @base {String} base the name of another dialog to inherit from.
+     *
+     * @return {Object} The dialog definition.
      */
-    alertify.dialog('confirm', function () {
-
-        var autoConfirm = {
-            timer: null,
-            index: null,
-            text: null,
-            duration: null,
-            task: function (event, self) {
-                if (self.isOpen()) {
-                    self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text + ' (&#8207;' + autoConfirm.duration + '&#8207;) ';
-                    autoConfirm.duration -= 1;
-                    if (autoConfirm.duration === -1) {
-                        clearAutoConfirm(self);
-                        var button = self.__internal.buttons[autoConfirm.index];
-                        var closeEvent = createCloseEvent(autoConfirm.index, button);
-
-                        if (typeof self.callback === 'function') {
-                            self.callback.apply(self, [closeEvent]);
-                        }
-                        //close the dialog.
-                        if (closeEvent.close !== false) {
-                            self.close();
-                        }
-                    }
-                } else {
-                    clearAutoConfirm(self);
-                }
-            }
+    function register(name, Factory, transient, base) {
+      var definition = {
+        dialog: null,
+        factory: Factory,
+      };
+
+      //if this is based on an existing dialog, create a new definition
+      //by applying the new protoype over the existing one.
+      if (base !== undefined) {
+        definition.factory = function () {
+          return extend(new dialogs[base].factory(), new Factory());
         };
+      }
 
-        function clearAutoConfirm(self) {
-            if (autoConfirm.timer !== null) {
-                clearInterval(autoConfirm.timer);
-                autoConfirm.timer = null;
-                self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text;
-            }
-        }
+      if (!transient) {
+        //create a new definition based on dialog
+        definition.dialog = extend(new definition.factory(), dialog);
+      }
+      return (dialogs[name] = definition);
+    }
 
-        function startAutoConfirm(self, index, duration) {
+    return {
+      /**
+       * Alertify defaults
+       *
+       * @type {Object}
+       */
+      defaults: defaults,
+      /**
+       * Dialogs factory
+       *
+       * @param {string}      Dialog name.
+       * @param {Function}    A Dialog factory function.
+       * @param {Boolean}     Indicates whether to create a singleton or transient dialog.
+       * @param {String}      The name of the base type to inherit from.
+       */
+      dialog: function (name, Factory, transient, base) {
+        // get request, create a new instance and return it.
+        if (typeof Factory !== "function") {
+          return get_dialog(name);
+        }
+
+        if (this.hasOwnProperty(name)) {
+          throw new Error("alertify.dialog: name already exists");
+        }
+
+        // register the dialog
+        var definition = register(name, Factory, transient, base);
+
+        if (transient) {
+          // make it public
+          this[name] = function () {
+            //if passed with no params, consider it a get request
+            if (arguments.length === 0) {
+              return definition.dialog;
+            } else {
+              var instance = extend(new definition.factory(), dialog);
+              //ensure init
+              if (instance && typeof instance.__init === "function") {
+                instance.__init(instance);
+              }
+              instance["main"].apply(instance, arguments);
+              return instance["show"].apply(instance);
+            }
+          };
+        } else {
+          // make it public
+          this[name] = function () {
+            //ensure init
+            if (
+              definition.dialog &&
+              typeof definition.dialog.__init === "function"
+            ) {
+              definition.dialog.__init(definition.dialog);
+            }
+            //if passed with no params, consider it a get request
+            if (arguments.length === 0) {
+              return definition.dialog;
+            } else {
+              var dialog = definition.dialog;
+              dialog["main"].apply(definition.dialog, arguments);
+              return dialog["show"].apply(definition.dialog);
+            }
+          };
+        }
+      },
+      /**
+       * Close all open dialogs.
+       *
+       * @param {Object} excpet [optional] The dialog object to exclude from closing.
+       *
+       * @return {undefined}
+       */
+      closeAll: function (except) {
+        var clone = openDialogs.slice(0);
+        for (var x = 0; x < clone.length; x += 1) {
+          var instance = clone[x];
+          if (except === undefined || except !== instance) {
+            instance.close();
+          }
+        }
+      },
+      /**
+       * Gets or Sets dialog settings/options. if the dialog is transient, this call does nothing.
+       *
+       * @param {string} name The dialog name.
+       * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs.
+       * @param {Variant} value Optional, the value associated with the key (in case it was a string).
+       *
+       * @return {undefined}
+       */
+      setting: function (name, key, value) {
+        if (name === "notifier") {
+          return notifier.setting(key, value);
+        }
+
+        var dialog = get_dialog(name);
+        if (dialog) {
+          return dialog.setting(key, value);
+        }
+      },
+      /**
+       * [Alias] Sets dialog settings/options
+       */
+      set: function (name, key, value) {
+        return this.setting(name, key, value);
+      },
+      /**
+       * [Alias] Gets dialog settings/options
+       */
+      get: function (name, key) {
+        return this.setting(name, key);
+      },
+      /**
+       * Creates a new notification message.
+       * If a type is passed, a class name "ajs-{type}" will be added.
+       * This allows for custom look and feel for various types of notifications.
+       *
+       * @param  {String | DOMElement}    [message=undefined]		Message text
+       * @param  {String}                 [type='']				Type of log message
+       * @param  {String}                 [wait='']				Time (in seconds) to wait before auto-close
+       * @param  {Function}               [callback=undefined]	A callback function to be invoked when the log is closed.
+       *
+       * @return {Object} Notification object.
+       */
+      notify: function (message, type, wait, callback) {
+        return notifier.create(type, callback).push(message, wait);
+      },
+      /**
+       * Creates a new notification message.
+       *
+       * @param  {String}		[message=undefined]		Message text
+       * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
+       * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
+       *
+       * @return {Object} Notification object.
+       */
+      message: function (message, wait, callback) {
+        return notifier.create(null, callback).push(message, wait);
+      },
+      /**
+       * Creates a new notification message of type 'success'.
+       *
+       * @param  {String}		[message=undefined]		Message text
+       * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
+       * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
+       *
+       * @return {Object} Notification object.
+       */
+      success: function (message, wait, callback) {
+        return notifier.create("success", callback).push(message, wait);
+      },
+      /**
+       * Creates a new notification message of type 'error'.
+       *
+       * @param  {String}		[message=undefined]		Message text
+       * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
+       * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
+       *
+       * @return {Object} Notification object.
+       */
+      error: function (message, wait, callback) {
+        return notifier.create("error", callback).push(message, wait);
+      },
+      /**
+       * Creates a new notification message of type 'warning'.
+       *
+       * @param  {String}		[message=undefined]		Message text
+       * @param  {String}     [wait='']				Time (in seconds) to wait before auto-close
+       * @param  {Function}	[callback=undefined]	A callback function to be invoked when the log is closed.
+       *
+       * @return {Object} Notification object.
+       */
+      warning: function (message, wait, callback) {
+        return notifier.create("warning", callback).push(message, wait);
+      },
+      /**
+       * Dismisses all open notifications
+       *
+       * @return {undefined}
+       */
+      dismissAll: function () {
+        notifier.dismissAll();
+      },
+    };
+  }
+  var alertify = new Alertify();
+
+  /**
+   * Alert dialog definition
+   *
+   * invoked by:
+   *	alertify.alert(message);
+   *	alertify.alert(title, message);
+   *	alertify.alert(message, onok);
+   *	alertify.alert(title, message, onok);
+   */
+  alertify.dialog("alert", function () {
+    return {
+      main: function (_title, _message, _onok) {
+        var title, message, onok;
+        switch (arguments.length) {
+          case 1:
+            message = _title;
+            break;
+          case 2:
+            if (typeof _message === "function") {
+              message = _title;
+              onok = _message;
+            } else {
+              title = _title;
+              message = _message;
+            }
+            break;
+          case 3:
+            title = _title;
+            message = _message;
+            onok = _onok;
+            break;
+        }
+        this.set("title", title);
+        this.set("message", message);
+        this.set("onok", onok);
+        return this;
+      },
+      setup: function () {
+        return {
+          buttons: [
+            {
+              text: alertify.defaults.glossary.ok,
+              key: keys.ESC,
+              invokeOnClose: true,
+              className: alertify.defaults.theme.ok,
+            },
+          ],
+          focus: {
+            element: 0,
+            select: false,
+          },
+          options: {
+            maximizable: false,
+            resizable: false,
+          },
+        };
+      },
+      build: function () {
+        // nothing
+      },
+      prepare: function () {
+        //nothing
+      },
+      setMessage: function (message) {
+        this.setContent(message);
+      },
+      settings: {
+        message: undefined,
+        onok: undefined,
+        label: undefined,
+      },
+      settingUpdated: function (key, oldValue, newValue) {
+        switch (key) {
+          case "message":
+            this.setMessage(newValue);
+            break;
+          case "label":
+            if (this.__internal.buttons[0].element) {
+              this.__internal.buttons[0].element.innerHTML = newValue;
+            }
+            break;
+        }
+      },
+      callback: function (closeEvent) {
+        if (typeof this.get("onok") === "function") {
+          var returnValue = this.get("onok").call(this, closeEvent);
+          if (typeof returnValue !== "undefined") {
+            closeEvent.cancel = !returnValue;
+          }
+        }
+      },
+    };
+  });
+  /**
+   * Confirm dialog object
+   *
+   *	alertify.confirm(message);
+   *	alertify.confirm(message, onok);
+   *	alertify.confirm(message, onok, oncancel);
+   *	alertify.confirm(title, message, onok, oncancel);
+   */
+  alertify.dialog("confirm", function () {
+    var autoConfirm = {
+      timer: null,
+      index: null,
+      text: null,
+      duration: null,
+      task: function (event, self) {
+        if (self.isOpen()) {
+          self.__internal.buttons[autoConfirm.index].element.innerHTML =
+            autoConfirm.text + " (&#8207;" + autoConfirm.duration + "&#8207;) ";
+          autoConfirm.duration -= 1;
+          if (autoConfirm.duration === -1) {
             clearAutoConfirm(self);
-            autoConfirm.duration = duration;
-            autoConfirm.index = index;
-            autoConfirm.text = self.__internal.buttons[index].element.innerHTML;
-            autoConfirm.timer = setInterval(delegate(self, autoConfirm.task), 1000);
-            autoConfirm.task(null, self);
+            var button = self.__internal.buttons[autoConfirm.index];
+            var closeEvent = createCloseEvent(autoConfirm.index, button);
+
+            if (typeof self.callback === "function") {
+              self.callback.apply(self, [closeEvent]);
+            }
+            //close the dialog.
+            if (closeEvent.close !== false) {
+              self.close();
+            }
+          }
+        } else {
+          clearAutoConfirm(self);
         }
+      },
+    };
 
+    function clearAutoConfirm(self) {
+      if (autoConfirm.timer !== null) {
+        clearInterval(autoConfirm.timer);
+        autoConfirm.timer = null;
+        self.__internal.buttons[autoConfirm.index].element.innerHTML =
+          autoConfirm.text;
+      }
+    }
+
+    function startAutoConfirm(self, index, duration) {
+      clearAutoConfirm(self);
+      autoConfirm.duration = duration;
+      autoConfirm.index = index;
+      autoConfirm.text = self.__internal.buttons[index].element.innerHTML;
+      autoConfirm.timer = setInterval(delegate(self, autoConfirm.task), 1000);
+      autoConfirm.task(null, self);
+    }
 
+    return {
+      main: function (_title, _message, _onok, _oncancel) {
+        var title, message, onok, oncancel;
+        switch (arguments.length) {
+          case 1:
+            message = _title;
+            break;
+          case 2:
+            message = _title;
+            onok = _message;
+            break;
+          case 3:
+            message = _title;
+            onok = _message;
+            oncancel = _onok;
+            break;
+          case 4:
+            title = _title;
+            message = _message;
+            onok = _onok;
+            oncancel = _oncancel;
+            break;
+        }
+        this.set("title", title);
+        this.set("message", message);
+        this.set("onok", onok);
+        this.set("oncancel", oncancel);
+        return this;
+      },
+      setup: function () {
         return {
-            main: function (_title, _message, _onok, _oncancel) {
-                var title, message, onok, oncancel;
-                switch (arguments.length) {
-                case 1:
-                    message = _title;
-                    break;
-                case 2:
-                    message = _title;
-                    onok = _message;
-                    break;
-                case 3:
-                    message = _title;
-                    onok = _message;
-                    oncancel = _onok;
-                    break;
-                case 4:
-                    title = _title;
-                    message = _message;
-                    onok = _onok;
-                    oncancel = _oncancel;
-                    break;
-                }
-                this.set('title', title);
-                this.set('message', message);
-                this.set('onok', onok);
-                this.set('oncancel', oncancel);
-                return this;
-            },
-            setup: function () {
-                return {
-                    buttons: [
-                        {
-                            text: alertify.defaults.glossary.ok,
-                            key: keys.ENTER,
-                            className: alertify.defaults.theme.ok,
-                        },
-                        {
-                            text: alertify.defaults.glossary.cancel,
-                            key: keys.ESC,
-                            invokeOnClose: true,
-                            className: alertify.defaults.theme.cancel,
-                        }
-                    ],
-                    focus: {
-                        element: 0,
-                        select: false
-                    },
-                    options: {
-                        maximizable: false,
-                        resizable: false
-                    }
-                };
-            },
-            build: function () {
-                //nothing
-            },
-            prepare: function () {
-                //nothing
-            },
-            setMessage: function (message) {
-                this.setContent(message);
-            },
-            settings: {
-                message: null,
-                labels: null,
-                onok: null,
-                oncancel: null,
-                defaultFocus: null,
-                reverseButtons: null,
-            },
-            settingUpdated: function (key, oldValue, newValue) {
-                switch (key) {
-                case 'message':
-                    this.setMessage(newValue);
-                    break;
-                case 'labels':
-                    if ('ok' in newValue && this.__internal.buttons[0].element) {
-                        this.__internal.buttons[0].text = newValue.ok;
-                        this.__internal.buttons[0].element.innerHTML = newValue.ok;
-                    }
-                    if ('cancel' in newValue && this.__internal.buttons[1].element) {
-                        this.__internal.buttons[1].text = newValue.cancel;
-                        this.__internal.buttons[1].element.innerHTML = newValue.cancel;
-                    }
-                    break;
-                case 'reverseButtons':
-                    if (newValue === true) {
-                        this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element);
-                    } else {
-                        this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element);
-                    }
-                    break;
-                case 'defaultFocus':
-                    this.__internal.focus.element = newValue === 'ok' ? 0 : 1;
-                    break;
-                }
-            },
-            callback: function (closeEvent) {
-                clearAutoConfirm(this);
-                var returnValue;
-                switch (closeEvent.index) {
-                case 0:
-                    if (typeof this.get('onok') === 'function') {
-                        returnValue = this.get('onok').call(this, closeEvent);
-                        if (typeof returnValue !== 'undefined') {
-                            closeEvent.cancel = !returnValue;
-                        }
-                    }
-                    break;
-                case 1:
-                    if (typeof this.get('oncancel') === 'function') {
-                        returnValue = this.get('oncancel').call(this, closeEvent);
-                        if (typeof returnValue !== 'undefined') {
-                            closeEvent.cancel = !returnValue;
-                        }
-                    }
-                    break;
-                }
+          buttons: [
+            {
+              text: alertify.defaults.glossary.ok,
+              key: keys.ENTER,
+              className: alertify.defaults.theme.ok,
             },
-            autoOk: function (duration) {
-                startAutoConfirm(this, 0, duration);
-                return this;
+            {
+              text: alertify.defaults.glossary.cancel,
+              key: keys.ESC,
+              invokeOnClose: true,
+              className: alertify.defaults.theme.cancel,
             },
-            autoCancel: function (duration) {
-                startAutoConfirm(this, 1, duration);
-                return this;
-            }
+          ],
+          focus: {
+            element: 0,
+            select: false,
+          },
+          options: {
+            maximizable: false,
+            resizable: false,
+          },
         };
-    });
-    /**
-     * Prompt dialog object
-     *
-     * invoked by:
-     *	alertify.prompt(message);
-     *	alertify.prompt(message, value);
-     *	alertify.prompt(message, value, onok);
-     *	alertify.prompt(message, value, onok, oncancel);
-     *	alertify.prompt(title, message, value, onok, oncancel);
-     */
-    alertify.dialog('prompt', function () {
-        var input = document.createElement('INPUT');
-        var p = document.createElement('P');
+      },
+      build: function () {
+        //nothing
+      },
+      prepare: function () {
+        //nothing
+      },
+      setMessage: function (message) {
+        this.setContent(message);
+      },
+      settings: {
+        message: null,
+        labels: null,
+        onok: null,
+        oncancel: null,
+        defaultFocus: null,
+        reverseButtons: null,
+      },
+      settingUpdated: function (key, oldValue, newValue) {
+        switch (key) {
+          case "message":
+            this.setMessage(newValue);
+            break;
+          case "labels":
+            if ("ok" in newValue && this.__internal.buttons[0].element) {
+              this.__internal.buttons[0].text = newValue.ok;
+              this.__internal.buttons[0].element.innerHTML = newValue.ok;
+            }
+            if ("cancel" in newValue && this.__internal.buttons[1].element) {
+              this.__internal.buttons[1].text = newValue.cancel;
+              this.__internal.buttons[1].element.innerHTML = newValue.cancel;
+            }
+            break;
+          case "reverseButtons":
+            if (newValue === true) {
+              this.elements.buttons.primary.appendChild(
+                this.__internal.buttons[0].element
+              );
+            } else {
+              this.elements.buttons.primary.appendChild(
+                this.__internal.buttons[1].element
+              );
+            }
+            break;
+          case "defaultFocus":
+            this.__internal.focus.element = newValue === "ok" ? 0 : 1;
+            break;
+        }
+      },
+      callback: function (closeEvent) {
+        clearAutoConfirm(this);
+        var returnValue;
+        switch (closeEvent.index) {
+          case 0:
+            if (typeof this.get("onok") === "function") {
+              returnValue = this.get("onok").call(this, closeEvent);
+              if (typeof returnValue !== "undefined") {
+                closeEvent.cancel = !returnValue;
+              }
+            }
+            break;
+          case 1:
+            if (typeof this.get("oncancel") === "function") {
+              returnValue = this.get("oncancel").call(this, closeEvent);
+              if (typeof returnValue !== "undefined") {
+                closeEvent.cancel = !returnValue;
+              }
+            }
+            break;
+        }
+      },
+      autoOk: function (duration) {
+        startAutoConfirm(this, 0, duration);
+        return this;
+      },
+      autoCancel: function (duration) {
+        startAutoConfirm(this, 1, duration);
+        return this;
+      },
+    };
+  });
+  /**
+   * Prompt dialog object
+   *
+   * invoked by:
+   *	alertify.prompt(message);
+   *	alertify.prompt(message, value);
+   *	alertify.prompt(message, value, onok);
+   *	alertify.prompt(message, value, onok, oncancel);
+   *	alertify.prompt(title, message, value, onok, oncancel);
+   */
+  alertify.dialog("prompt", function () {
+    var input = document.createElement("INPUT");
+    var p = document.createElement("P");
+    return {
+      main: function (_title, _message, _value, _onok, _oncancel) {
+        var title, message, value, onok, oncancel;
+        switch (arguments.length) {
+          case 1:
+            message = _title;
+            break;
+          case 2:
+            message = _title;
+            value = _message;
+            break;
+          case 3:
+            message = _title;
+            value = _message;
+            onok = _value;
+            break;
+          case 4:
+            message = _title;
+            value = _message;
+            onok = _value;
+            oncancel = _onok;
+            break;
+          case 5:
+            title = _title;
+            message = _message;
+            value = _value;
+            onok = _onok;
+            oncancel = _oncancel;
+            break;
+        }
+        this.set("title", title);
+        this.set("message", message);
+        this.set("value", value);
+        this.set("onok", onok);
+        this.set("oncancel", oncancel);
+        return this;
+      },
+      setup: function () {
         return {
-            main: function (_title, _message, _value, _onok, _oncancel) {
-                var title, message, value, onok, oncancel;
-                switch (arguments.length) {
-                case 1:
-                    message = _title;
-                    break;
-                case 2:
-                    message = _title;
-                    value = _message;
-                    break;
-                case 3:
-                    message = _title;
-                    value = _message;
-                    onok = _value;
-                    break;
-                case 4:
-                    message = _title;
-                    value = _message;
-                    onok = _value;
-                    oncancel = _onok;
-                    break;
-                case 5:
-                    title = _title;
-                    message = _message;
-                    value = _value;
-                    onok = _onok;
-                    oncancel = _oncancel;
-                    break;
-                }
-                this.set('title', title);
-                this.set('message', message);
-                this.set('value', value);
-                this.set('onok', onok);
-                this.set('oncancel', oncancel);
-                return this;
-            },
-            setup: function () {
-                return {
-                    buttons: [
-                        {
-                            text: alertify.defaults.glossary.ok,
-                            key: keys.ENTER,
-                            className: alertify.defaults.theme.ok,
-                        },
-                        {
-                            text: alertify.defaults.glossary.cancel,
-                            key: keys.ESC,
-                            invokeOnClose: true,
-                            className: alertify.defaults.theme.cancel,
-                        }
-                    ],
-                    focus: {
-                        element: input,
-                        select: true
-                    },
-                    options: {
-                        maximizable: false,
-                        resizable: false
-                    }
-                };
-            },
-            build: function () {
-                input.className = alertify.defaults.theme.input;
-                input.setAttribute('type', 'text');
-                input.value = this.get('value');
-                this.elements.content.appendChild(p);
-                this.elements.content.appendChild(input);
-            },
-            prepare: function () {
-                //nothing
-            },
-            setMessage: function (message) {
-                if (typeof message === 'string') {
-                    clearContents(p);
-                    p.innerHTML = message;
-                } else if (message instanceof window.HTMLElement && p.firstChild !== message) {
-                    clearContents(p);
-                    p.appendChild(message);
-                }
-            },
-            settings: {
-                message: undefined,
-                labels: undefined,
-                onok: undefined,
-                oncancel: undefined,
-                value: '',
-                type:'text',
-                reverseButtons: undefined,
+          buttons: [
+            {
+              text: alertify.defaults.glossary.ok,
+              key: keys.ENTER,
+              className: alertify.defaults.theme.ok,
             },
-            settingUpdated: function (key, oldValue, newValue) {
-                switch (key) {
-                case 'message':
-                    this.setMessage(newValue);
-                    break;
-                case 'value':
-                    input.value = newValue;
-                    break;
-                case 'type':
-                    switch (newValue) {
-                    case 'text':
-                    case 'color':
-                    case 'date':
-                    case 'datetime-local':
-                    case 'email':
-                    case 'month':
-                    case 'number':
-                    case 'password':
-                    case 'search':
-                    case 'tel':
-                    case 'time':
-                    case 'week':
-                        input.type = newValue;
-                        break;
-                    default:
-                        input.type = 'text';
-                        break;
-                    }
-                    break;
-                case 'labels':
-                    if (newValue.ok && this.__internal.buttons[0].element) {
-                        this.__internal.buttons[0].element.innerHTML = newValue.ok;
-                    }
-                    if (newValue.cancel && this.__internal.buttons[1].element) {
-                        this.__internal.buttons[1].element.innerHTML = newValue.cancel;
-                    }
-                    break;
-                case 'reverseButtons':
-                    if (newValue === true) {
-                        this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element);
-                    } else {
-                        this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element);
-                    }
-                    break;
-                }
+            {
+              text: alertify.defaults.glossary.cancel,
+              key: keys.ESC,
+              invokeOnClose: true,
+              className: alertify.defaults.theme.cancel,
             },
-            callback: function (closeEvent) {
-                var returnValue;
-                switch (closeEvent.index) {
-                case 0:
-                    this.settings.value = input.value;
-                    if (typeof this.get('onok') === 'function') {
-                        returnValue = this.get('onok').call(this, closeEvent, this.settings.value);
-                        if (typeof returnValue !== 'undefined') {
-                            closeEvent.cancel = !returnValue;
-                        }
-                    }
-                    break;
-                case 1:
-                    if (typeof this.get('oncancel') === 'function') {
-                        returnValue = this.get('oncancel').call(this, closeEvent);
-                        if (typeof returnValue !== 'undefined') {
-                            closeEvent.cancel = !returnValue;
-                        }
-                    }
-                    if(!closeEvent.cancel){
-                        input.value = this.settings.value;
-                    }
-                    break;
-                }
-            }
+          ],
+          focus: {
+            element: input,
+            select: true,
+          },
+          options: {
+            maximizable: false,
+            resizable: false,
+          },
         };
-    });
+      },
+      build: function () {
+        input.className = alertify.defaults.theme.input;
+        input.setAttribute("type", "text");
+        input.value = this.get("value");
+        this.elements.content.appendChild(p);
+        this.elements.content.appendChild(input);
+      },
+      prepare: function () {
+        //nothing
+      },
+      setMessage: function (message) {
+        if (typeof message === "string") {
+          clearContents(p);
+          p.innerHTML = message;
+        } else if (
+          message instanceof window.HTMLElement &&
+          p.firstChild !== message
+        ) {
+          clearContents(p);
+          p.appendChild(message);
+        }
+      },
+      settings: {
+        message: undefined,
+        labels: undefined,
+        onok: undefined,
+        oncancel: undefined,
+        value: "",
+        type: "text",
+        reverseButtons: undefined,
+      },
+      settingUpdated: function (key, oldValue, newValue) {
+        switch (key) {
+          case "message":
+            this.setMessage(newValue);
+            break;
+          case "value":
+            input.value = newValue;
+            break;
+          case "type":
+            switch (newValue) {
+              case "text":
+              case "color":
+              case "date":
+              case "datetime-local":
+              case "email":
+              case "month":
+              case "number":
+              case "password":
+              case "search":
+              case "tel":
+              case "time":
+              case "week":
+                input.type = newValue;
+                break;
+              default:
+                input.type = "text";
+                break;
+            }
+            break;
+          case "labels":
+            if (newValue.ok && this.__internal.buttons[0].element) {
+              this.__internal.buttons[0].element.innerHTML = newValue.ok;
+            }
+            if (newValue.cancel && this.__internal.buttons[1].element) {
+              this.__internal.buttons[1].element.innerHTML = newValue.cancel;
+            }
+            break;
+          case "reverseButtons":
+            if (newValue === true) {
+              this.elements.buttons.primary.appendChild(
+                this.__internal.buttons[0].element
+              );
+            } else {
+              this.elements.buttons.primary.appendChild(
+                this.__internal.buttons[1].element
+              );
+            }
+            break;
+        }
+      },
+      callback: function (closeEvent) {
+        var returnValue;
+        switch (closeEvent.index) {
+          case 0:
+            this.settings.value = input.value;
+            if (typeof this.get("onok") === "function") {
+              returnValue = this.get("onok").call(
+                this,
+                closeEvent,
+                this.settings.value
+              );
+              if (typeof returnValue !== "undefined") {
+                closeEvent.cancel = !returnValue;
+              }
+            }
+            break;
+          case 1:
+            if (typeof this.get("oncancel") === "function") {
+              returnValue = this.get("oncancel").call(this, closeEvent);
+              if (typeof returnValue !== "undefined") {
+                closeEvent.cancel = !returnValue;
+              }
+            }
+            if (!closeEvent.cancel) {
+              input.value = this.settings.value;
+            }
+            break;
+        }
+      },
+    };
+  });
 
-    // CommonJS
-    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
-        module.exports = alertify;
+  // CommonJS
+  if (typeof module === "object" && typeof module.exports === "object") {
+    module.exports = alertify;
     // AMD
-    } else if ( typeof define === 'function' && define.amd) {
-        define( [], function () {
-            return alertify;
-        } );
+  } else if (typeof define === "function" && define.amd) {
+    define([], function () {
+      return alertify;
+    });
     // window
-    } else if ( !window.alertify ) {
-        window.alertify = alertify;
-    }
-
-} ( typeof window !== 'undefined' ? window : this ) );
+  } else if (!window.alertify) {
+    window.alertify = alertify;
+  }
+})(typeof window !== "undefined" ? window : this);
diff --git a/notemyprogress/js/axios.js b/notemyprogress/js/axios.js
index 6ace1061432fa40193fcd995d6d15674276a5675..ce4a02a42a0f56513712253ad71967a3920ab63f 100644
--- a/notemyprogress/js/axios.js
+++ b/notemyprogress/js/axios.js
@@ -373,7 +373,11 @@
          *
          * ```js
          * var result = merge({foo: 123}, {foo: 456});
+<<<<<<< HEAD
          * //console.log(result.foo); // outputs 456
+=======
+         * console.log(result.foo); // outputs 456
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
          * ```
          *
          * @param {Object} obj1 Object to merge
diff --git a/notemyprogress/js/highcharts/highcharts.src.js b/notemyprogress/js/highcharts/highcharts.src.js
index 27bc6118483898f892d9945fccb679437b3cf465..104c0c148e6fa8bbd0da40942f68765acee8e1dc 100644
--- a/notemyprogress/js/highcharts/highcharts.src.js
+++ b/notemyprogress/js/highcharts/highcharts.src.js
@@ -506,7 +506,11 @@
               win.console &&
               error.messages.indexOf(message) === -1 // prevent console flooting
             ) {
+<<<<<<< HEAD
               //console.log(message); // eslint-disable-line no-console
+=======
+              console.log(message); // eslint-disable-line no-console
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
             }
           };
         if (typeof params !== "undefined") {
@@ -10608,7 +10612,11 @@
        * });
        *
        * // Use the Time object
+<<<<<<< HEAD
        * //console.log(
+=======
+       * console.log(
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
        *        'Current time in New York',
        *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())
        * );
@@ -10912,7 +10920,11 @@
          * @example
          * const time = new Highcharts.Time();
          * const s = time.dateFormat('%Y-%m-%d %H:%M:%S', Date.UTC(2020, 0, 1));
+<<<<<<< HEAD
          * //console.log(s); // => 2020-01-01 00:00:00
+=======
+         * console.log(s); // => 2020-01-01 00:00:00
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
          *
          * @function Highcharts.Time#dateFormat
          *
@@ -11813,7 +11825,11 @@
          * });
          *
          * // Use the Time object
+<<<<<<< HEAD
          * //console.log(
+=======
+         * console.log(
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
          *        'Current time in New York',
          *        chart.time.dateFormat('%Y-%m-%d %H:%M:%S', Date.now())
          * );
@@ -12051,7 +12067,11 @@
            *
            * ```js
            * click: function(e) {
+<<<<<<< HEAD
            *     //console.log(
+=======
+           *     console.log(
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
            *         Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', e.xAxis[0].value),
            *         e.yAxis[0].value
            *     )
@@ -12141,7 +12161,11 @@
            * ```js
            * selection: function(event) {
            *     // log the min and max of the primary, datetime x-axis
+<<<<<<< HEAD
            *     //console.log(
+=======
+           *     console.log(
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
            *         Highcharts.dateFormat(
            *             '%Y-%m-%d %H:%M:%S',
            *             event.xAxis[0].min
@@ -12152,7 +12176,11 @@
            *         )
            *     );
            *     // log the min and max of the y axis
+<<<<<<< HEAD
            *     //console.log(event.yAxis[0].min, event.yAxis[0].max);
+=======
+           *     console.log(event.yAxis[0].min, event.yAxis[0].max);
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
            * }
            * ```
            *
@@ -13674,12 +13702,21 @@
             /**
              * The pixel size of the up and down arrows in the legend paging
              * navigation.
+<<<<<<< HEAD
              *
              * @sample {highcharts} highcharts/legend/navigation/
              *         Legend page navigation demonstrated
              * @sample {highstock} highcharts/legend/navigation/
              *         Legend page navigation demonstrated
              *
+=======
+             *
+             * @sample {highcharts} highcharts/legend/navigation/
+             *         Legend page navigation demonstrated
+             * @sample {highstock} highcharts/legend/navigation/
+             *         Legend page navigation demonstrated
+             *
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
              * @type      {number}
              * @default   12
              * @since     2.2.4
@@ -15898,6 +15935,16 @@
          * Translate a value in terms of axis units into pixels within the chart.
          *
          * @function Highcharts.Axis#toPixels
+<<<<<<< HEAD
+         *
+         * @param {number} value
+         * A value in terms of axis units.
+         *
+         * @param {boolean} paneCoordinates
+         * Whether to return the pixel coordinate relative to the chart or just the
+         * axis/pane itself.
+         *
+=======
          *
          * @param {number} value
          * A value in terms of axis units.
@@ -15906,6 +15953,7 @@
          * Whether to return the pixel coordinate relative to the chart or just the
          * axis/pane itself.
          *
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
          * @return {number}
          * Pixel position of the value on the chart or axis.
          */
@@ -18495,6 +18543,22 @@
           ].forEach(function (prop) {
             if (axis[prop]) {
               axis[prop] = axis[prop].destroy();
+<<<<<<< HEAD
+            }
+          });
+          // Destroy each generated group for plotlines and plotbands
+          for (plotGroup in axis.plotLinesAndBandsGroups) {
+            // eslint-disable-line guard-for-in
+            axis.plotLinesAndBandsGroups[plotGroup] =
+              axis.plotLinesAndBandsGroups[plotGroup].destroy();
+          }
+          // Delete all properties and fall back to the prototype.
+          objectEach(axis, function (val, key) {
+            if (axis.getKeepProps().indexOf(key) === -1) {
+              delete axis[key];
+            }
+          });
+=======
             }
           });
           // Destroy each generated group for plotlines and plotbands
@@ -18509,6 +18573,7 @@
               delete axis[key];
             }
           });
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
         };
         /**
          * Internal function to draw a crosshair.
diff --git a/notemyprogress/js/highcharts/modules/accessibility.js b/notemyprogress/js/highcharts/modules/accessibility.js
index 05cad981ff09c89e33328b9d9eadcfd771a831e7..7df713986a0e8ebfe31ba0cbe87a584d7124e553 100644
--- a/notemyprogress/js/highcharts/modules/accessibility.js
+++ b/notemyprogress/js/highcharts/modules/accessibility.js
@@ -8,174 +8,4199 @@
 
  License: www.highcharts.com/license
 */
-(function(a){"object"===typeof module&&module.exports?(a["default"]=a,module.exports=a):"function"===typeof define&&define.amd?define("highcharts/modules/accessibility",["highcharts"],function(p){a(p);a.Highcharts=p;return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){function p(a,f,l,m){a.hasOwnProperty(f)||(a[f]=m.apply(null,l))}a=a?a._modules:{};p(a,"Accessibility/Utils/HTMLUtilities.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,f){function u(a){return a.replace(/&/g,
-"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")}var m=a.doc,n=a.win,g=f.merge;return{addClass:function(a,g){a.classList?a.classList.add(g):0>a.className.indexOf(g)&&(a.className+=g)},escapeStringForHTML:u,getElement:function(a){return m.getElementById(a)},getFakeMouseEvent:function(a){if("function"===typeof n.MouseEvent)return new n.MouseEvent(a);if(m.createEvent){var g=m.createEvent("MouseEvent");if(g.initMouseEvent)return g.initMouseEvent(a,
-!0,!0,n,"click"===a?1:0,0,0,0,0,!1,!1,!1,!1,0,null),g}return{type:a}},removeElement:function(a){a&&a.parentNode&&a.parentNode.removeChild(a)},reverseChildNodes:function(a){for(var g=a.childNodes.length;g--;)a.appendChild(a.childNodes[g])},setElAttrs:function(a,g){Object.keys(g).forEach(function(e){var d=g[e];null===d?a.removeAttribute(e):(d=u(""+d),a.setAttribute(e,d))})},stripHTMLTagsFromString:function(a){return"string"===typeof a?a.replace(/<\/?[^>]+(>|$)/g,""):a},visuallyHideElement:function(a){g(!0,
-a.style,{position:"absolute",width:"1px",height:"1px",overflow:"hidden",whiteSpace:"nowrap",clip:"rect(1px, 1px, 1px, 1px)",marginTop:"-3px","-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity=1)",filter:"alpha(opacity=1)",opacity:"0.01"})}}});p(a,"Accessibility/Utils/ChartUtilities.js",[a["Accessibility/Utils/HTMLUtilities.js"],a["Core/Utilities.js"]],function(a,f){function u(d){var b,c;if(null===(b=d.points)||void 0===b?0:b.length)return d=q(d.points,function(c){return!!c.graphic}),null===
-(c=null===d||void 0===d?void 0:d.graphic)||void 0===c?void 0:c.element}function m(d){var b=u(d);return b&&b.parentNode||d.graph&&d.graph.element||d.group&&d.group.element}function n(d,b){b.setAttribute("aria-hidden",!1);b!==d.renderTo&&b.parentNode&&(Array.prototype.forEach.call(b.parentNode.childNodes,function(c){c.hasAttribute("aria-hidden")||c.setAttribute("aria-hidden",!0)}),n(d,b.parentNode))}var g=a.stripHTMLTagsFromString,h=f.defined,q=f.find,e=f.fireEvent;return{getChartTitle:function(d){return g(d.options.title.text||
-d.langFormat("accessibility.defaultChartTitle",{chart:d}))},getAxisDescription:function(d){return g(d&&(d.userOptions&&d.userOptions.accessibility&&d.userOptions.accessibility.description||d.axisTitle&&d.axisTitle.textStr||d.options.id||d.categories&&"categories"||d.dateTime&&"Time"||"values"))},getPointFromXY:function(d,b,c){for(var k=d.length,t;k--;)if(t=q(d[k].points||[],function(v){return v.x===b&&v.y===c}))return t},getSeriesFirstPointElement:u,getSeriesFromName:function(d,b){return b?(d.series||
-[]).filter(function(c){return c.name===b}):d.series},getSeriesA11yElement:m,unhideChartElementFromAT:n,hideSeriesFromAT:function(d){(d=m(d))&&d.setAttribute("aria-hidden",!0)},scrollToPoint:function(d){var b=d.series.xAxis,c=d.series.yAxis,k=(null===b||void 0===b?0:b.scrollbar)?b:c;if((b=null===k||void 0===k?void 0:k.scrollbar)&&h(b.to)&&h(b.from)){c=b.to-b.from;if(h(k.dataMin)&&h(k.dataMax)){var t=k.toPixels(k.dataMin),v=k.toPixels(k.dataMax);d=(k.toPixels(d["xAxis"===k.coll?"x":"y"]||0)-t)/(v-t)}else d=
-0;b.updatePosition(d-c/2,d+c/2);e(b,"changed",{from:b.from,to:b.to,trigger:"scrollbar",DOMEvent:null})}}}});p(a,"Accessibility/KeyboardNavigationHandler.js",[a["Core/Utilities.js"]],function(a){function f(a,f){this.chart=a;this.keyCodeMap=f.keyCodeMap||[];this.validate=f.validate;this.init=f.init;this.terminate=f.terminate;this.response={success:1,prev:2,next:3,noHandler:4,fail:5}}var u=a.find;f.prototype={run:function(a){var f=a.which||a.keyCode,g=this.response.noHandler,h=u(this.keyCodeMap,function(a){return-1<
-a[0].indexOf(f)});h?g=h[1].call(this,f,a):9===f&&(g=this.response[a.shiftKey?"prev":"next"]);return g}};return f});p(a,"Accessibility/Utils/DOMElementProvider.js",[a["Core/Globals.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Core/Utilities.js"]],function(a,f,l){var u=a.doc,n=f.removeElement;a=l.extend;f=function(){this.elements=[]};a(f.prototype,{createElement:function(){var a=u.createElement.apply(u,arguments);this.elements.push(a);return a},destroyCreatedElements:function(){this.elements.forEach(function(a){n(a)});
-this.elements=[]}});return f});p(a,"Accessibility/Utils/EventProvider.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,f){var u=f.addEvent;f=f.extend;var m=function(){this.eventRemovers=[]};f(m.prototype,{addEvent:function(){var f=u.apply(a,arguments);this.eventRemovers.push(f);return f},removeAddedEvents:function(){this.eventRemovers.forEach(function(a){a()});this.eventRemovers=[]}});return m});p(a,"Accessibility/AccessibilityComponent.js",[a["Accessibility/Utils/ChartUtilities.js"],
-a["Accessibility/Utils/DOMElementProvider.js"],a["Accessibility/Utils/EventProvider.js"],a["Core/Globals.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Core/Utilities.js"]],function(a,f,l,m,n,g){function h(){}var q=a.unhideChartElementFromAT,e=m.doc,d=m.win,b=n.removeElement,c=n.getFakeMouseEvent;a=g.extend;var k=g.fireEvent,t=g.merge;h.prototype={initBase:function(c){this.chart=c;this.eventProvider=new l;this.domElementProvider=new f;this.keyCodes={left:37,right:39,up:38,down:40,enter:13,space:32,
-esc:27,tab:9}},addEvent:function(){return this.eventProvider.addEvent.apply(this.eventProvider,arguments)},createElement:function(){return this.domElementProvider.createElement.apply(this.domElementProvider,arguments)},fireEventOnWrappedOrUnwrappedElement:function(c,b){var v=b.type;e.createEvent&&(c.dispatchEvent||c.fireEvent)?c.dispatchEvent?c.dispatchEvent(b):c.fireEvent(v,b):k(c,v,b)},fakeClickEvent:function(b){if(b){var v=c("click");this.fireEventOnWrappedOrUnwrappedElement(b,v)}},addProxyGroup:function(c){this.createOrUpdateProxyContainer();
-var b=this.createElement("div");Object.keys(c||{}).forEach(function(v){null!==c[v]&&b.setAttribute(v,c[v])});this.chart.a11yProxyContainer.appendChild(b);return b},createOrUpdateProxyContainer:function(){var c=this.chart,b=c.renderer.box;c.a11yProxyContainer=c.a11yProxyContainer||this.createProxyContainerElement();b.nextSibling!==c.a11yProxyContainer&&c.container.insertBefore(c.a11yProxyContainer,b.nextSibling)},createProxyContainerElement:function(){var c=e.createElement("div");c.className="highcharts-a11y-proxy-container";
-return c},createProxyButton:function(c,b,a,d,k){var v=c.element,e=this.createElement("button"),w=t({"aria-label":v.getAttribute("aria-label")},a);Object.keys(w).forEach(function(c){null!==w[c]&&e.setAttribute(c,w[c])});e.className="highcharts-a11y-proxy-button";k&&this.addEvent(e,"click",k);this.setProxyButtonStyle(e);this.updateProxyButtonPosition(e,d||c);this.proxyMouseEventsForButton(v,e);b.appendChild(e);w["aria-hidden"]||q(this.chart,e);return e},getElementPosition:function(c){var b=c.element;
-return(c=this.chart.renderTo)&&b&&b.getBoundingClientRect?(b=b.getBoundingClientRect(),c=c.getBoundingClientRect(),{x:b.left-c.left,y:b.top-c.top,width:b.right-b.left,height:b.bottom-b.top}):{x:0,y:0,width:1,height:1}},setProxyButtonStyle:function(c){t(!0,c.style,{"border-width":0,"background-color":"transparent",cursor:"pointer",outline:"none",opacity:.001,filter:"alpha(opacity=1)","-ms-filter":"progid:DXImageTransform.Microsoft.Alpha(Opacity=1)",zIndex:999,overflow:"hidden",padding:0,margin:0,display:"block",
-position:"absolute"})},updateProxyButtonPosition:function(c,b){b=this.getElementPosition(b);t(!0,c.style,{width:(b.width||1)+"px",height:(b.height||1)+"px",left:(b.x||0)+"px",top:(b.y||0)+"px"})},proxyMouseEventsForButton:function(c,b){var a=this;"click touchstart touchend touchcancel touchmove mouseover mouseenter mouseleave mouseout".split(" ").forEach(function(d){var t=0===d.indexOf("touch");a.addEvent(b,d,function(b){var d=t?a.cloneTouchEvent(b):a.cloneMouseEvent(b);c&&a.fireEventOnWrappedOrUnwrappedElement(c,
-d);b.stopPropagation();b.preventDefault()})})},cloneMouseEvent:function(b){if("function"===typeof d.MouseEvent)return new d.MouseEvent(b.type,b);if(e.createEvent){var a=e.createEvent("MouseEvent");if(a.initMouseEvent)return a.initMouseEvent(b.type,b.bubbles,b.cancelable,b.view||d,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget),a}return c(b.type)},cloneTouchEvent:function(b){var c=function(b){for(var c=[],a=0;a<b.length;++a){var d=
-b.item(a);d&&c.push(d)}return c};if("function"===typeof d.TouchEvent)return c=new d.TouchEvent(b.type,{touches:c(b.touches),targetTouches:c(b.targetTouches),changedTouches:c(b.changedTouches),ctrlKey:b.ctrlKey,shiftKey:b.shiftKey,altKey:b.altKey,metaKey:b.metaKey,bubbles:b.bubbles,cancelable:b.cancelable,composed:b.composed,detail:b.detail,view:b.view}),b.defaultPrevented&&c.preventDefault(),c;c=this.cloneMouseEvent(b);c.touches=b.touches;c.changedTouches=b.changedTouches;c.targetTouches=b.targetTouches;
-return c},destroyBase:function(){b(this.chart.a11yProxyContainer);this.domElementProvider.destroyCreatedElements();this.eventProvider.removeAddedEvents()}};a(h.prototype,{init:function(){},getKeyboardNavigation:function(){},onChartUpdate:function(){},onChartRender:function(){},destroy:function(){}});return h});p(a,"Accessibility/KeyboardNavigation.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Accessibility/Utils/EventProvider.js"]],function(a,f,l,m){function n(b,
-c){this.init(b,c)}var g=a.doc,h=a.win,q=f.addEvent,e=f.fireEvent,d=l.getElement;q(g,"keydown",function(b){27===(b.which||b.keyCode)&&a.charts&&a.charts.forEach(function(b){b&&b.dismissPopupContent&&b.dismissPopupContent()})});a.Chart.prototype.dismissPopupContent=function(){var b=this;e(this,"dismissPopupContent",{},function(){b.tooltip&&b.tooltip.hide(0);b.hideExportMenu()})};n.prototype={init:function(b,c){var a=this,d=this.eventProvider=new m;this.chart=b;this.components=c;this.modules=[];this.currentModuleIx=
-0;this.update();d.addEvent(this.tabindexContainer,"keydown",function(b){return a.onKeydown(b)});d.addEvent(this.tabindexContainer,"focus",function(b){return a.onFocus(b)});["mouseup","touchend"].forEach(function(b){return d.addEvent(g,b,function(){return a.onMouseUp()})});["mousedown","touchstart"].forEach(function(c){return d.addEvent(b.renderTo,c,function(){a.isClickingChart=!0})});d.addEvent(b.renderTo,"mouseover",function(){a.pointerIsOverChart=!0});d.addEvent(b.renderTo,"mouseout",function(){a.pointerIsOverChart=
-!1});this.modules.length&&this.modules[0].init(1)},update:function(b){var c=this.chart.options.accessibility;c=c&&c.keyboardNavigation;var a=this.components;this.updateContainerTabindex();c&&c.enabled&&b&&b.length?(this.modules=b.reduce(function(b,c){c=a[c].getKeyboardNavigation();return b.concat(c)},[]),this.updateExitAnchor()):(this.modules=[],this.currentModuleIx=0,this.removeExitAnchor())},onFocus:function(b){var c,a=this.chart;b=b.relatedTarget&&a.container.contains(b.relatedTarget);this.isClickingChart||
-b||(null===(c=this.modules[0])||void 0===c?void 0:c.init(1))},onMouseUp:function(){delete this.isClickingChart;if(!this.keyboardReset&&!this.pointerIsOverChart){var b=this.chart,c=this.modules&&this.modules[this.currentModuleIx||0];c&&c.terminate&&c.terminate();b.focusElement&&b.focusElement.removeFocusBorder();this.currentModuleIx=0;this.keyboardReset=!0}},onKeydown:function(b){b=b||h.event;var c,a=this.modules&&this.modules.length&&this.modules[this.currentModuleIx];this.keyboardReset=!1;if(a){var d=
-a.run(b);d===a.response.success?c=!0:d===a.response.prev?c=this.prev():d===a.response.next&&(c=this.next());c&&(b.preventDefault(),b.stopPropagation())}},prev:function(){return this.move(-1)},next:function(){return this.move(1)},move:function(b){var c=this.modules&&this.modules[this.currentModuleIx];c&&c.terminate&&c.terminate(b);this.chart.focusElement&&this.chart.focusElement.removeFocusBorder();this.currentModuleIx+=b;if(c=this.modules&&this.modules[this.currentModuleIx]){if(c.validate&&!c.validate())return this.move(b);
-if(c.init)return c.init(b),!0}this.currentModuleIx=0;0<b?(this.exiting=!0,this.exitAnchor.focus()):this.tabindexContainer.focus();return!1},updateExitAnchor:function(){var b=d("highcharts-end-of-chart-marker-"+this.chart.index);this.removeExitAnchor();b?(this.makeElementAnExitAnchor(b),this.exitAnchor=b):this.createExitAnchor()},updateContainerTabindex:function(){var b=this.chart.options.accessibility;b=b&&b.keyboardNavigation;b=!(b&&!1===b.enabled);var c=this.chart,a=c.container;c.renderTo.hasAttribute("tabindex")&&
-(a.removeAttribute("tabindex"),a=c.renderTo);this.tabindexContainer=a;var d=a.getAttribute("tabindex");b&&!d?a.setAttribute("tabindex","0"):b||c.container.removeAttribute("tabindex")},makeElementAnExitAnchor:function(b){var c=this.tabindexContainer.getAttribute("tabindex")||0;b.setAttribute("class","highcharts-exit-anchor");b.setAttribute("tabindex",c);b.setAttribute("aria-hidden",!1);this.addExitAnchorEventsToEl(b)},createExitAnchor:function(){var b=this.chart,c=this.exitAnchor=g.createElement("div");
-b.renderTo.appendChild(c);this.makeElementAnExitAnchor(c)},removeExitAnchor:function(){this.exitAnchor&&this.exitAnchor.parentNode&&(this.exitAnchor.parentNode.removeChild(this.exitAnchor),delete this.exitAnchor)},addExitAnchorEventsToEl:function(b){var c=this.chart,a=this;this.eventProvider.addEvent(b,"focus",function(b){b=b||h.event;b.relatedTarget&&c.container.contains(b.relatedTarget)||a.exiting?a.exiting=!1:(a.tabindexContainer.focus(),b.preventDefault(),a.modules&&a.modules.length&&(a.currentModuleIx=
-a.modules.length-1,(b=a.modules[a.currentModuleIx])&&b.validate&&!b.validate()?a.prev():b&&b.init(-1)))})},destroy:function(){this.removeExitAnchor();this.eventProvider.removeAddedEvents();this.chart.container.removeAttribute("tabindex")}};return n});p(a,"Accessibility/Components/LegendComponent.js",[a["Core/Globals.js"],a["Core/Legend.js"],a["Core/Utilities.js"],a["Accessibility/AccessibilityComponent.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Accessibility/Utils/HTMLUtilities.js"]],
-function(a,f,l,m,n,g){function h(b){var c=b.legend&&b.legend.allItems,a=b.options.legend.accessibility||{};return!(!c||!c.length||b.colorAxis&&b.colorAxis.length||!1===a.enabled)}var q=l.addEvent,e=l.extend,d=l.find,b=l.fireEvent,c=g.stripHTMLTagsFromString,k=g.removeElement;a.Chart.prototype.highlightLegendItem=function(c){var a=this.legend.allItems,d=this.highlightedLegendItemIx;if(a[c]){a[d]&&b(a[d].legendGroup.element,"mouseout");d=this.legend;var k=d.allItems[c].pageIx,t=d.currentPage;"undefined"!==
-typeof k&&k+1!==t&&d.scroll(1+k-t);this.setFocusToElement(a[c].legendItem,a[c].a11yProxyElement);b(a[c].legendGroup.element,"mouseover");return!0}return!1};q(f,"afterColorizeItem",function(b){var c=b.item;this.chart.options.accessibility.enabled&&c&&c.a11yProxyElement&&c.a11yProxyElement.setAttribute("aria-pressed",b.visible?"false":"true")});a=function(){};a.prototype=new m;e(a.prototype,{init:function(){var b=this;this.proxyElementsList=[];this.recreateProxies();this.addEvent(f,"afterScroll",function(){this.chart===
-b.chart&&(b.updateProxiesPositions(),b.updateLegendItemProxyVisibility(),this.chart.highlightLegendItem(b.highlightedLegendItemIx))});this.addEvent(f,"afterPositionItem",function(c){this.chart===b.chart&&this.chart.renderer&&b.updateProxyPositionForItem(c.item)})},updateLegendItemProxyVisibility:function(){var b=this.chart.legend,c=b.currentPage||1,a=b.clipHeight||0;(b.allItems||[]).forEach(function(d){var k=d.pageIx||0,t=d._legendItemPos?d._legendItemPos[1]:0,e=d.legendItem?Math.round(d.legendItem.getBBox().height):
-0;k=t+e-b.pages[k]>a||k!==c-1;d.a11yProxyElement&&(d.a11yProxyElement.style.visibility=k?"hidden":"visible")})},onChartRender:function(){h(this.chart)?this.updateProxiesPositions():this.removeProxies()},updateProxiesPositions:function(){for(var b=0,c=this.proxyElementsList;b<c.length;b++){var a=c[b];this.updateProxyButtonPosition(a.element,a.posElement)}},updateProxyPositionForItem:function(b){var c=d(this.proxyElementsList,function(c){return c.item===b});c&&this.updateProxyButtonPosition(c.element,
-c.posElement)},recreateProxies:function(){this.removeProxies();h(this.chart)&&(this.addLegendProxyGroup(),this.proxyLegendItems(),this.updateLegendItemProxyVisibility())},removeProxies:function(){k(this.legendProxyGroup);this.proxyElementsList=[]},addLegendProxyGroup:function(){var b=this.chart.options.accessibility,c=this.chart.langFormat("accessibility.legend.legendLabel",{});this.legendProxyGroup=this.addProxyGroup({"aria-label":c,role:"all"===b.landmarkVerbosity?"region":null})},proxyLegendItems:function(){var b=
-this;(this.chart.legend&&this.chart.legend.allItems||[]).forEach(function(c){c.legendItem&&c.legendItem.element&&b.proxyLegendItem(c)})},proxyLegendItem:function(b){if(b.legendItem&&b.legendGroup){var a=this.chart.langFormat("accessibility.legend.legendItem",{chart:this.chart,itemName:c(b.name)}),d=b.legendGroup.div?b.legendItem:b.legendGroup;b.a11yProxyElement=this.createProxyButton(b.legendItem,this.legendProxyGroup,{tabindex:-1,"aria-pressed":!b.visible,"aria-label":a},d);this.proxyElementsList.push({item:b,
-element:b.a11yProxyElement,posElement:d})}},getKeyboardNavigation:function(){var b=this.keyCodes,c=this;return new n(this.chart,{keyCodeMap:[[[b.left,b.right,b.up,b.down],function(b){return c.onKbdArrowKey(this,b)}],[[b.enter,b.space],function(){return c.onKbdClick(this)}]],validate:function(){return c.shouldHaveLegendNavigation()},init:function(b){return c.onKbdNavigationInit(b)}})},onKbdArrowKey:function(b,c){var a=this.keyCodes,d=b.response,k=this.chart,e=k.options.accessibility,t=k.legend.allItems.length;
-c=c===a.left||c===a.up?-1:1;return k.highlightLegendItem(this.highlightedLegendItemIx+c)?(this.highlightedLegendItemIx+=c,d.success):1<t&&e.keyboardNavigation.wrapAround?(b.init(c),d.success):d[0<c?"next":"prev"]},onKbdClick:function(c){var a=this.chart.legend.allItems[this.highlightedLegendItemIx];a&&a.a11yProxyElement&&b(a.a11yProxyElement,"click");return c.response.success},shouldHaveLegendNavigation:function(){var b=this.chart,c=b.colorAxis&&b.colorAxis.length,a=(b.options.legend||{}).accessibility||
-{};return!!(b.legend&&b.legend.allItems&&b.legend.display&&!c&&a.enabled&&a.keyboardNavigation&&a.keyboardNavigation.enabled)},onKbdNavigationInit:function(b){var c=this.chart,a=c.legend.allItems.length-1;b=0<b?0:a;c.highlightLegendItem(b);this.highlightedLegendItemIx=b}});return a});p(a,"Accessibility/Components/MenuComponent.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Accessibility/AccessibilityComponent.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Accessibility/Utils/ChartUtilities.js"],
-a["Accessibility/Utils/HTMLUtilities.js"]],function(a,f,l,m,n,g){function h(b){return b.exportSVGElements&&b.exportSVGElements[0]}f=f.extend;var q=n.unhideChartElementFromAT,e=g.removeElement,d=g.getFakeMouseEvent;a.Chart.prototype.showExportMenu=function(){var b=h(this);if(b&&(b=b.element,b.onclick))b.onclick(d("click"))};a.Chart.prototype.hideExportMenu=function(){var b=this.exportDivElements;b&&this.exportContextMenu&&(b.forEach(function(b){if("highcharts-menu-item"===b.className&&b.onmouseout)b.onmouseout(d("mouseout"))}),
-this.highlightedExportItemIx=0,this.exportContextMenu.hideMenu(),this.container.focus())};a.Chart.prototype.highlightExportItem=function(b){var c=this.exportDivElements&&this.exportDivElements[b],a=this.exportDivElements&&this.exportDivElements[this.highlightedExportItemIx];if(c&&"LI"===c.tagName&&(!c.children||!c.children.length)){var e=!!(this.renderTo.getElementsByTagName("g")[0]||{}).focus;c.focus&&e&&c.focus();if(a&&a.onmouseout)a.onmouseout(d("mouseout"));if(c.onmouseover)c.onmouseover(d("mouseover"));
-this.highlightedExportItemIx=b;return!0}return!1};a.Chart.prototype.highlightLastExportItem=function(){var b;if(this.exportDivElements)for(b=this.exportDivElements.length;b--;)if(this.highlightExportItem(b))return!0;return!1};a=function(){};a.prototype=new l;f(a.prototype,{init:function(){var b=this.chart,c=this;this.addEvent(b,"exportMenuShown",function(){c.onMenuShown()});this.addEvent(b,"exportMenuHidden",function(){c.onMenuHidden()})},onMenuHidden:function(){var b=this.chart.exportContextMenu;
-b&&b.setAttribute("aria-hidden","true");this.isExportMenuShown=!1;this.setExportButtonExpandedState("false")},onMenuShown:function(){var b=this.chart,c=b.exportContextMenu;c&&(this.addAccessibleContextMenuAttribs(),q(b,c));this.isExportMenuShown=!0;this.setExportButtonExpandedState("true")},setExportButtonExpandedState:function(b){var c=this.exportButtonProxy;c&&c.setAttribute("aria-expanded",b)},onChartRender:function(){var b=this.chart,c=b.options.accessibility;e(this.exportProxyGroup);var a=b.options.exporting,
-d=h(b);a&&!1!==a.enabled&&a.accessibility&&a.accessibility.enabled&&d&&d.element&&(this.exportProxyGroup=this.addProxyGroup("all"===c.landmarkVerbosity?{"aria-label":b.langFormat("accessibility.exporting.exportRegionLabel",{chart:b}),role:"region"}:{}),c=h(this.chart),this.exportButtonProxy=this.createProxyButton(c,this.exportProxyGroup,{"aria-label":b.langFormat("accessibility.exporting.menuButtonLabel",{chart:b}),"aria-expanded":"false"}))},addAccessibleContextMenuAttribs:function(){var b=this.chart,
-c=b.exportDivElements;c&&c.length&&(c.forEach(function(b){"LI"!==b.tagName||b.children&&b.children.length?b.setAttribute("aria-hidden","true"):b.setAttribute("tabindex",-1)}),c=c[0].parentNode,c.removeAttribute("aria-hidden"),c.setAttribute("aria-label",b.langFormat("accessibility.exporting.chartMenuLabel",{chart:b})))},getKeyboardNavigation:function(){var b=this.keyCodes,c=this.chart,a=this;return new m(c,{keyCodeMap:[[[b.left,b.up],function(){return a.onKbdPrevious(this)}],[[b.right,b.down],function(){return a.onKbdNext(this)}],
-[[b.enter,b.space],function(){return a.onKbdClick(this)}]],validate:function(){return c.exportChart&&!1!==c.options.exporting.enabled&&!1!==c.options.exporting.accessibility.enabled},init:function(){var b=a.exportButtonProxy,d=c.exportingGroup;d&&b&&c.setFocusToElement(d,b)},terminate:function(){c.hideExportMenu()}})},onKbdPrevious:function(b){var c=this.chart,a=c.options.accessibility;b=b.response;for(var d=c.highlightedExportItemIx||0;d--;)if(c.highlightExportItem(d))return b.success;return a.keyboardNavigation.wrapAround?
-(c.highlightLastExportItem(),b.success):b.prev},onKbdNext:function(b){var c=this.chart,a=c.options.accessibility;b=b.response;for(var d=(c.highlightedExportItemIx||0)+1;d<c.exportDivElements.length;++d)if(c.highlightExportItem(d))return b.success;return a.keyboardNavigation.wrapAround?(c.highlightExportItem(0),b.success):b.next},onKbdClick:function(b){var c=this.chart,a=c.exportDivElements[c.highlightedExportItemIx],d=h(c).element;this.isExportMenuShown?this.fakeClickEvent(a):(this.fakeClickEvent(d),
-c.highlightExportItem(0));return b.response.success}});return a});p(a,"Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js",[a["Core/Series/Series.js"],a["Core/Series/CartesianSeries.js"],a["Core/Chart/Chart.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Accessibility/Utils/EventProvider.js"],a["Accessibility/Utils/ChartUtilities.js"]],function(a,f,l,m,n,g,h,q){function e(b){var c=b.index,a=b.series.points,d=a.length;if(a[c]!==
-b)for(;d--;){if(a[d]===b)return d}else return c}function d(b){var c=b.chart.options.accessibility.keyboardNavigation.seriesNavigation,a=b.options.accessibility||{},d=a.keyboardNavigation;return d&&!1===d.enabled||!1===a.enabled||!1===b.options.enableMouseTracking||!b.visible||c.pointNavigationEnabledThreshold&&c.pointNavigationEnabledThreshold<=b.points.length}function b(b){var c=b.series.chart.options.accessibility;return b.isNull&&c.keyboardNavigation.seriesNavigation.skipNullPoints||!1===b.visible||
-d(b.series)}function c(b,c,a,d){var r=Infinity,e=c.points.length,k=function(b){return!(w(b.plotX)&&w(b.plotY))};if(!k(b)){for(;e--;){var g=c.points[e];if(!k(g)&&(g=(b.plotX-g.plotX)*(b.plotX-g.plotX)*(a||1)+(b.plotY-g.plotY)*(b.plotY-g.plotY)*(d||1),g<r)){r=g;var h=e}}return w(h)?c.points[h]:void 0}}function k(b){var c=!1;delete b.highlightedPoint;return c=b.series.reduce(function(b,c){return b||c.highlightFirstValidPoint()},!1)}function t(b,c){this.keyCodes=c;this.chart=b}var v=a.seriesTypes,w=n.defined;
-a=n.extend;var u=q.getPointFromXY,A=q.getSeriesFromName,p=q.scrollToPoint;f.prototype.keyboardMoveVertical=!0;["column","pie"].forEach(function(b){v[b]&&(v[b].prototype.keyboardMoveVertical=!1)});m.prototype.highlight=function(){var b=this.series.chart;if(this.isNull)b.tooltip&&b.tooltip.hide(0);else this.onMouseOver();p(this);this.graphic&&b.setFocusToElement(this.graphic);b.highlightedPoint=this;return this};l.prototype.highlightAdjacentPoint=function(c){var a=this.series,k=this.highlightedPoint,
-r=k&&e(k)||0,g=k&&k.series.points,h=this.series&&this.series[this.series.length-1];h=h&&h.points&&h.points[h.points.length-1];if(!a[0]||!a[0].points)return!1;if(k){if(a=a[k.series.index+(c?1:-1)],r=g[r+(c?1:-1)],!r&&a&&(r=a.points[c?0:a.points.length-1]),!r)return!1}else r=c?a[0].points[0]:h;return b(r)?(a=r.series,d(a)?this.highlightedPoint=c?a.points[a.points.length-1]:a.points[0]:this.highlightedPoint=r,this.highlightAdjacentPoint(c)):r.highlight()};f.prototype.highlightFirstValidPoint=function(){var c=
-this.chart.highlightedPoint,a=(c&&c.series)===this?e(c):0;c=this.points;var d=c.length;if(c&&d){for(var r=a;r<d;++r)if(!b(c[r]))return c[r].highlight();for(;0<=a;--a)if(!b(c[a]))return c[a].highlight()}return!1};l.prototype.highlightAdjacentSeries=function(b){var a,k=this.highlightedPoint;var r=(a=this.series&&this.series[this.series.length-1])&&a.points&&a.points[a.points.length-1];if(!this.highlightedPoint)return a=b?this.series&&this.series[0]:a,(r=b?a&&a.points&&a.points[0]:r)?r.highlight():!1;
-a=this.series[k.series.index+(b?-1:1)];if(!a)return!1;r=c(k,a,4);if(!r)return!1;if(d(a))return r.highlight(),b=this.highlightAdjacentSeries(b),b?b:(k.highlight(),!1);r.highlight();return r.series.highlightFirstValidPoint()};l.prototype.highlightAdjacentPointVertical=function(c){var a=this.highlightedPoint,k=Infinity,r;if(!w(a.plotX)||!w(a.plotY))return!1;this.series.forEach(function(e){d(e)||e.points.forEach(function(d){if(w(d.plotY)&&w(d.plotX)&&d!==a){var g=d.plotY-a.plotY,h=Math.abs(d.plotX-a.plotX);
-h=Math.abs(g)*Math.abs(g)+h*h*4;e.yAxis&&e.yAxis.reversed&&(g*=-1);!(0>=g&&c||0<=g&&!c||5>h||b(d))&&h<k&&(k=h,r=d)}})});return r?r.highlight():!1};a(t.prototype,{init:function(){var b=this,c=this.chart,a=this.eventProvider=new h;a.addEvent(f,"destroy",function(){return b.onSeriesDestroy(this)});a.addEvent(c,"afterDrilldown",function(){k(this);this.focusElement&&this.focusElement.removeFocusBorder()});a.addEvent(c,"drilldown",function(c){c=c.point;var a=c.series;b.lastDrilledDownPoint={x:c.x,y:c.y,
-seriesName:a?a.name:""}});a.addEvent(c,"drillupall",function(){setTimeout(function(){b.onDrillupAll()},10)})},onDrillupAll:function(){var b=this.lastDrilledDownPoint,c=this.chart,a=b&&A(c,b.seriesName),d;b&&a&&w(b.x)&&w(b.y)&&(d=u(a,b.x,b.y));c.container&&c.container.focus();d&&d.highlight&&d.highlight();c.focusElement&&c.focusElement.removeFocusBorder()},getKeyboardNavigationHandler:function(){var b=this,c=this.keyCodes,a=this.chart,d=a.inverted;return new g(a,{keyCodeMap:[[d?[c.up,c.down]:[c.left,
-c.right],function(c){return b.onKbdSideways(this,c)}],[d?[c.left,c.right]:[c.up,c.down],function(c){return b.onKbdVertical(this,c)}],[[c.enter,c.space],function(){a.highlightedPoint&&a.highlightedPoint.firePointEvent("click");return this.response.success}]],init:function(c){return b.onHandlerInit(this,c)},terminate:function(){return b.onHandlerTerminate()}})},onKbdSideways:function(b,c){var a=this.keyCodes;return this.attemptHighlightAdjacentPoint(b,c===a.right||c===a.down)},onKbdVertical:function(b,
-c){var a=this.chart,d=this.keyCodes;c=c===d.down||c===d.right;d=a.options.accessibility.keyboardNavigation.seriesNavigation;if(d.mode&&"serialize"===d.mode)return this.attemptHighlightAdjacentPoint(b,c);a[a.highlightedPoint&&a.highlightedPoint.series.keyboardMoveVertical?"highlightAdjacentPointVertical":"highlightAdjacentSeries"](c);return b.response.success},onHandlerInit:function(b,c){var a=this.chart;if(0<c)k(a);else{c=a.series.length;for(var d;c--&&!(a.highlightedPoint=a.series[c].points[a.series[c].points.length-
-1],d=a.series[c].highlightFirstValidPoint()););}return b.response.success},onHandlerTerminate:function(){var b,c,a=this.chart,d=a.highlightedPoint;null===(b=a.tooltip)||void 0===b?void 0:b.hide(0);null===(c=null===d||void 0===d?void 0:d.onMouseOut)||void 0===c?void 0:c.call(d);delete a.highlightedPoint},attemptHighlightAdjacentPoint:function(b,c){var a=this.chart,d=a.options.accessibility.keyboardNavigation.wrapAround;return a.highlightAdjacentPoint(c)?b.response.success:d?b.init(c?1:-1):b.response[c?
-"next":"prev"]},onSeriesDestroy:function(b){var c=this.chart;c.highlightedPoint&&c.highlightedPoint.series===b&&(delete c.highlightedPoint,c.focusElement&&c.focusElement.removeFocusBorder())},destroy:function(){this.eventProvider.removeAddedEvents()}});return t});p(a,"Accessibility/Components/AnnotationsA11y.js",[a["Accessibility/Utils/HTMLUtilities.js"]],function(a){function f(a){return(a.annotations||[]).reduce(function(a,d){var b;!1!==(null===(b=d.options)||void 0===b?void 0:b.visible)&&(a=a.concat(d.labels));
-return a},[])}function l(a){var e,d,b,c,k=null===(d=null===(e=a.options)||void 0===e?void 0:e.accessibility)||void 0===d?void 0:d.description;return k?k:(null===(c=null===(b=a.graphic)||void 0===b?void 0:b.text)||void 0===c?void 0:c.textStr)||""}function m(a){var e,d,b=null===(d=null===(e=a.options)||void 0===e?void 0:e.accessibility)||void 0===d?void 0:d.description;if(b)return b;e=a.chart;d=l(a);b=a.points.filter(function(b){return!!b.graphic}).map(function(b){var c,a;if(!(a=null===(c=null===b||
-void 0===b?void 0:b.accessibility)||void 0===c?void 0:c.valueDescription)){var d,e;a=(null===(e=null===(d=null===b||void 0===b?void 0:b.graphic)||void 0===d?void 0:d.element)||void 0===e?void 0:e.getAttribute("aria-label"))||""}b=(null===b||void 0===b?void 0:b.series.name)||"";return(b?b+", ":"")+"data point "+a}).filter(function(b){return!!b});var c=b.length;a="accessibility.screenReaderSection.annotations.description"+(1<c?"MultiplePoints":c?"SinglePoint":"NoPoints");d={annotationText:d,numPoints:c,
-annotationPoint:b[0],additionalAnnotationPoints:b.slice(1)};return e.langFormat(a,d)}function n(a){return f(a).map(function(a){return(a=g(h(m(a))))?"<li>"+a+"</li>":""})}var g=a.escapeStringForHTML,h=a.stripHTMLTagsFromString;return{getAnnotationsInfoHTML:function(a){var e=a.annotations;return e&&e.length?"<ul>"+n(a).join(" ")+"</ul>":""},getAnnotationLabelDescription:m,getAnnotationListItems:n,getPointAnnotationTexts:function(a){var e=f(a.series.chart).filter(function(d){return-1<d.points.indexOf(a)});
-return e.length?e.map(function(a){return""+l(a)}):[]}}});p(a,"Accessibility/Components/SeriesComponent/SeriesDescriber.js",[a["Accessibility/Components/AnnotationsA11y.js"],a["Accessibility/Utils/ChartUtilities.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Core/Tooltip.js"],a["Core/Utilities.js"]],function(a,f,l,m,n){function g(b){var c=b.index;return b.series&&b.series.data&&G(c)?K(b.series.data,function(b){return!!(b&&"undefined"!==typeof b.index&&b.index>c&&b.graphic&&b.graphic.element)})||
-null:null}function h(b){var c=b.chart.options.accessibility.series.pointDescriptionEnabledThreshold;return!!(!1!==c&&b.points&&b.points.length>=c)}function q(b){var c=b.options.accessibility||{};return!h(b)&&!c.exposeAsGroupOnly}function e(b){var c=b.chart.options.accessibility.keyboardNavigation.seriesNavigation;return!(!b.points||!(b.points.length<c.pointNavigationEnabledThreshold||!1===c.pointNavigationEnabledThreshold))}function d(b,c){var a=b.series.chart,d=a.options.accessibility.point||{};
-b=b.series.tooltipOptions||{};a=a.options.lang;return L(c)?M(c,d.valueDecimals||b.valueDecimals||-1,a.decimalPoint,a.accessibility.thousandsSep||a.thousandsSep):c}function b(b){var c=(b.options.accessibility||{}).description;return c&&b.chart.langFormat("accessibility.series.description",{description:c,series:b})||""}function c(b,c){return b.chart.langFormat("accessibility.series."+c+"Description",{name:x(b[c]),series:b})}function k(b){var c=b.series,a=c.chart,d=a.options.accessibility.point||{};
-if(c.xAxis&&c.xAxis.dateTime)return c=m.prototype.getXDateFormat.call({getDateFormat:m.prototype.getDateFormat,chart:a},b,a.options.tooltip,c.xAxis),d=d.dateFormatter&&d.dateFormatter(b)||d.dateFormat||c,a.time.dateFormat(d,b.x,void 0)}function t(b){var c=k(b),a=(b.series.xAxis||{}).categories&&G(b.category)&&(""+b.category).replace("<br/>"," "),d=b.id&&0>b.id.indexOf("highcharts-"),e="x, "+b.x;return b.name||c||a||(d?b.id:e)}function v(b,c,a){var e=c||"",k=a||"";return b.series.pointArrayMap.reduce(function(c,
-a){c+=c.length?", ":"";var r=d(b,C(b[a],b.options[a]));return c+(a+": "+e+r+k)},"")}function w(b){var c=b.series,a=c.chart.options.accessibility.point||{},e=c.tooltipOptions||{},k=a.valuePrefix||e.valuePrefix||"";a=a.valueSuffix||e.valueSuffix||"";e=d(b,b["undefined"!==typeof b.value?"value":"y"]);return b.isNull?c.chart.langFormat("accessibility.series.nullPointValue",{point:b}):c.pointArrayMap?v(b,k,a):k+e+a}function u(b){var c=b.series,a=c.chart,d=a.options.accessibility.point.valueDescriptionFormat,
-e=(c=C(c.xAxis&&c.xAxis.options.accessibility&&c.xAxis.options.accessibility.enabled,!a.angular))?t(b):"";b={point:b,index:G(b.index)?b.index+1:"",xDescription:e,value:w(b),separator:c?", ":""};return N(d,b,a)}function A(b){var c=b.series,a=c.chart,d=u(b),e=b.options&&b.options.accessibility&&b.options.accessibility.description;e=e?" "+e:"";c=1<a.series.length&&c.name?" "+c.name+".":"";a=b.series.chart;var k=z(b),r={point:b,annotations:k};a=k.length?a.langFormat("accessibility.series.pointAnnotationsDescription",
-r):"";b.accessibility=b.accessibility||{};b.accessibility.valueDescription=d;return d+e+c+(a?" "+a:"")}function p(b){var c=q(b),a=e(b);(c||a)&&b.points.forEach(function(b){var a;if(!(a=b.graphic&&b.graphic.element)&&(a=b.series&&b.series.is("sunburst"),a=b.isNull&&!a)){var d=b.series,e=g(b);d=(a=e&&e.graphic)?a.parentGroup:d.graph||d.group;e=e?{x:C(b.plotX,e.plotX,0),y:C(b.plotY,e.plotY,0)}:{x:C(b.plotX,0),y:C(b.plotY,0)};e=b.series.chart.renderer.rect(e.x,e.y,1,1);e.attr({"class":"highcharts-a11y-dummy-point",
-fill:"none",opacity:0,"fill-opacity":0,"stroke-opacity":0});d&&d.element?(b.graphic=e,b.hasDummyGraphic=!0,e.add(d),d.element.insertBefore(e.element,a?a.element:null),a=e.element):a=void 0}a&&(a.setAttribute("tabindex","-1"),a.style.outline="0",c?(e=b.series,d=e.chart.options.accessibility.point||{},e=e.options.accessibility||{},b=B(I(e.pointDescriptionFormatter&&e.pointDescriptionFormatter(b)||d.descriptionFormatter&&d.descriptionFormatter(b)||A(b))),a.setAttribute("role","img"),a.setAttribute("aria-label",
-b)):a.setAttribute("aria-hidden",!0))})}function y(a){var d=a.chart,e=d.types||[],k=b(a),r=function(b){return d[b]&&1<d[b].length&&a[b]},g=c(a,"xAxis"),h=c(a,"yAxis"),f={name:a.name||"",ix:a.index+1,numSeries:d.series&&d.series.length,numPoints:a.points&&a.points.length,series:a};e=1<e.length?"Combination":"";return(d.langFormat("accessibility.series.summary."+a.type+e,f)||d.langFormat("accessibility.series.summary.default"+e,f))+(k?" "+k:"")+(r("yAxis")?" "+h:"")+(r("xAxis")?" "+g:"")}var z=a.getPointAnnotationTexts,
-x=f.getAxisDescription,r=f.getSeriesFirstPointElement,J=f.getSeriesA11yElement,F=f.unhideChartElementFromAT,B=l.escapeStringForHTML,E=l.reverseChildNodes,I=l.stripHTMLTagsFromString,K=n.find,N=n.format,L=n.isNumber,M=n.numberFormat,C=n.pick,G=n.defined;return{describeSeries:function(b){var c=b.chart,a=r(b),d=J(b),e=c.is3d&&c.is3d();if(d){d.lastChild!==a||e||E(d);p(b);F(c,d);e=b.chart;c=e.options.chart||{};a=1<e.series.length;e=e.options.accessibility.series.describeSingleSeries;var k=(b.options.accessibility||
-{}).exposeAsGroupOnly;c.options3d&&c.options3d.enabled&&a||!(a||e||k||h(b))?d.setAttribute("aria-label",""):(c=b.chart.options.accessibility,a=c.landmarkVerbosity,(b.options.accessibility||{}).exposeAsGroupOnly?d.setAttribute("role","img"):"all"===a&&d.setAttribute("role","region"),d.setAttribute("tabindex","-1"),d.style.outline="0",d.setAttribute("aria-label",B(I(c.series.descriptionFormatter&&c.series.descriptionFormatter(b)||y(b)))))}},defaultPointDescriptionFormatter:A,defaultSeriesDescriptionFormatter:y,
-getPointA11yTimeDescription:k,getPointXDescription:t,getPointValue:w,getPointValueDescription:u}});p(a,"Accessibility/Utils/Announcer.js",[a["Core/Globals.js"],a["Accessibility/Utils/DOMElementProvider.js"],a["Accessibility/Utils/HTMLUtilities.js"]],function(a,f,l){var m=l.visuallyHideElement;l=function(){function a(a,h){this.chart=a;this.domElementProvider=new f;this.announceRegion=this.addAnnounceRegion(h)}a.prototype.destroy=function(){this.domElementProvider.destroyCreatedElements()};a.prototype.announce=
-function(a){var g=this;this.announceRegion.innerHTML=a;this.clearAnnouncementRegionTimer&&clearTimeout(this.clearAnnouncementRegionTimer);this.clearAnnouncementRegionTimer=setTimeout(function(){g.announceRegion.innerHTML="";delete g.clearAnnouncementRegionTimer},1E3)};a.prototype.addAnnounceRegion=function(a){var g=this.chart.renderTo,f=this.domElementProvider.createElement("div");f.setAttribute("aria-hidden",!1);f.setAttribute("aria-live",a);m(f);g.insertBefore(f,g.firstChild);return f};return a}();
-return a.Announcer=l});p(a,"Accessibility/Components/SeriesComponent/NewDataAnnouncer.js",[a["Core/Globals.js"],a["Core/Series/CartesianSeries.js"],a["Core/Utilities.js"],a["Accessibility/Utils/ChartUtilities.js"],a["Accessibility/Components/SeriesComponent/SeriesDescriber.js"],a["Accessibility/Utils/Announcer.js"],a["Accessibility/Utils/EventProvider.js"]],function(a,f,l,m,n,g,h){function q(b){var c=b.series.data.filter(function(c){return b.x===c.x&&b.y===c.y});return 1===c.length?c[0]:b}function e(b,
-c){var a=(b||[]).concat(c||[]).reduce(function(b,c){b[c.name+c.index]=c;return b},{});return Object.keys(a).map(function(b){return a[b]})}var d=l.extend,b=l.defined,c=m.getChartTitle,k=n.defaultPointDescriptionFormatter,t=n.defaultSeriesDescriptionFormatter;l=function(b){this.chart=b};d(l.prototype,{init:function(){var b=this.chart,c=b.options.accessibility.announceNewData.interruptUser?"assertive":"polite";this.lastAnnouncementTime=0;this.dirty={allSeries:{}};this.eventProvider=new h;this.announcer=
-new g(b,c);this.addEventListeners()},destroy:function(){this.eventProvider.removeAddedEvents();this.announcer.destroy()},addEventListeners:function(){var b=this,c=this.chart,a=this.eventProvider;a.addEvent(c,"afterDrilldown",function(){b.lastAnnouncementTime=0});a.addEvent(f,"updatedData",function(){b.onSeriesUpdatedData(this)});a.addEvent(c,"afterAddSeries",function(c){b.onSeriesAdded(c.series)});a.addEvent(f,"addPoint",function(c){b.onPointAdded(c.point)});a.addEvent(c,"redraw",function(){b.announceDirtyData()})},
-onSeriesUpdatedData:function(b){var c=this.chart;b.chart===c&&c.options.accessibility.announceNewData.enabled&&(this.dirty.hasDirty=!0,this.dirty.allSeries[b.name+b.index]=b)},onSeriesAdded:function(c){this.chart.options.accessibility.announceNewData.enabled&&(this.dirty.hasDirty=!0,this.dirty.allSeries[c.name+c.index]=c,this.dirty.newSeries=b(this.dirty.newSeries)?void 0:c)},onPointAdded:function(c){var a=c.series.chart;this.chart===a&&a.options.accessibility.announceNewData.enabled&&(this.dirty.newPoint=
-b(this.dirty.newPoint)?void 0:c)},announceDirtyData:function(){var b=this;if(this.chart.options.accessibility.announceNewData&&this.dirty.hasDirty){var c=this.dirty.newPoint;c&&(c=q(c));this.queueAnnouncement(Object.keys(this.dirty.allSeries).map(function(c){return b.dirty.allSeries[c]}),this.dirty.newSeries,c);this.dirty={allSeries:{}}}},queueAnnouncement:function(b,c,a){var d=this,k=this.chart.options.accessibility.announceNewData;if(k.enabled){var g=+new Date;k=Math.max(0,k.minAnnounceInterval-
-(g-this.lastAnnouncementTime));b=e(this.queuedAnnouncement&&this.queuedAnnouncement.series,b);if(c=this.buildAnnouncementMessage(b,c,a))this.queuedAnnouncement&&clearTimeout(this.queuedAnnouncementTimer),this.queuedAnnouncement={time:g,message:c,series:b},this.queuedAnnouncementTimer=setTimeout(function(){d&&d.announcer&&(d.lastAnnouncementTime=+new Date,d.announcer.announce(d.queuedAnnouncement.message),delete d.queuedAnnouncement,delete d.queuedAnnouncementTimer)},k)}},buildAnnouncementMessage:function(b,
-d,e){var g=this.chart,h=g.options.accessibility.announceNewData;if(h.announcementFormatter&&(b=h.announcementFormatter(b,d,e),!1!==b))return b.length?b:null;b=a.charts&&1<a.charts.length?"Multiple":"Single";b=d?"newSeriesAnnounce"+b:e?"newPointAnnounce"+b:"newDataAnnounce";h=c(g);return g.langFormat("accessibility.announceNewData."+b,{chartTitle:h,seriesDesc:d?t(d):null,pointDesc:e?k(e):null,point:e,series:d})}});return l});p(a,"Accessibility/Components/SeriesComponent/ForcedMarkers.js",[a["Core/Series/CartesianSeries.js"],
-a["Core/Utilities.js"]],function(a,f){function l(a){n(!0,a,{marker:{enabled:!0,states:{normal:{opacity:0}}}})}var m=f.addEvent,n=f.merge;return function(){m(a,"render",function(){var a=this.options,h=!1!==(this.options.accessibility&&this.options.accessibility.enabled);if(h=this.chart.options.accessibility.enabled&&h)h=this.chart.options.accessibility,h=this.points.length<h.series.pointDescriptionEnabledThreshold||!1===h.series.pointDescriptionEnabledThreshold;if(h){if(a.marker&&!1===a.marker.enabled&&
-(this.a11yMarkersForced=!0,l(this.options)),this._hasPointMarkers&&this.points&&this.points.length)for(a=this.points.length;a--;){h=this.points[a];var f=h.options;delete h.hasForcedA11yMarker;f.marker&&(f.marker.enabled?(n(!0,f.marker,{states:{normal:{opacity:f.marker.states&&f.marker.states.normal&&f.marker.states.normal.opacity||1}}}),h.hasForcedA11yMarker=!1):(l(f),h.hasForcedA11yMarker=!0))}}else this.a11yMarkersForced&&(delete this.a11yMarkersForced,(a=this.resetA11yMarkerOptions)&&n(!0,this.options,
-{marker:{enabled:a.enabled,states:{normal:{opacity:a.states&&a.states.normal&&a.states.normal.opacity}}}}))});m(a,"afterSetOptions",function(a){this.resetA11yMarkerOptions=n(a.options.marker||{},this.userOptions.marker||{})});m(a,"afterRender",function(){if(this.chart.styledMode){if(this.markerGroup)this.markerGroup[this.a11yMarkersForced?"addClass":"removeClass"]("highcharts-a11y-markers-hidden");this._hasPointMarkers&&this.points&&this.points.length&&this.points.forEach(function(a){a.graphic&&(a.graphic[a.hasForcedA11yMarker?
-"addClass":"removeClass"]("highcharts-a11y-marker-hidden"),a.graphic[!1===a.hasForcedA11yMarker?"addClass":"removeClass"]("highcharts-a11y-marker-visible"))})}})}});p(a,"Accessibility/Components/SeriesComponent/SeriesComponent.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Accessibility/AccessibilityComponent.js"],a["Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js"],a["Accessibility/Components/SeriesComponent/NewDataAnnouncer.js"],a["Accessibility/Components/SeriesComponent/ForcedMarkers.js"],
-a["Accessibility/Utils/ChartUtilities.js"],a["Accessibility/Components/SeriesComponent/SeriesDescriber.js"],a["Core/Tooltip.js"]],function(a,f,l,m,n,g,h,q,e){f=f.extend;var d=h.hideSeriesFromAT,b=q.describeSeries;a.SeriesAccessibilityDescriber=q;g();a=function(){};a.prototype=new l;f(a.prototype,{init:function(){this.newDataAnnouncer=new n(this.chart);this.newDataAnnouncer.init();this.keyboardNavigation=new m(this.chart,this.keyCodes);this.keyboardNavigation.init();this.hideTooltipFromATWhenShown();
-this.hideSeriesLabelsFromATWhenShown()},hideTooltipFromATWhenShown:function(){var b=this;this.addEvent(e,"refresh",function(){this.chart===b.chart&&this.label&&this.label.element&&this.label.element.setAttribute("aria-hidden",!0)})},hideSeriesLabelsFromATWhenShown:function(){this.addEvent(this.chart,"afterDrawSeriesLabels",function(){this.series.forEach(function(b){b.labelBySeries&&b.labelBySeries.attr("aria-hidden",!0)})})},onChartRender:function(){this.chart.series.forEach(function(c){!1!==(c.options.accessibility&&
-c.options.accessibility.enabled)&&c.visible?b(c):d(c)})},getKeyboardNavigation:function(){return this.keyboardNavigation.getKeyboardNavigationHandler()},destroy:function(){this.newDataAnnouncer.destroy();this.keyboardNavigation.destroy()}});return a});p(a,"Accessibility/Components/ZoomComponent.js",[a["Accessibility/AccessibilityComponent.js"],a["Accessibility/Utils/ChartUtilities.js"],a["Core/Globals.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Core/Utilities.js"]],
-function(a,f,l,m,n,g){var h=f.unhideChartElementFromAT;f=l.noop;var q=m.removeElement,e=m.setElAttrs;m=g.extend;var d=g.pick;l.Axis.prototype.panStep=function(b,c){var a=c||3;c=this.getExtremes();var d=(c.max-c.min)/a*b;a=c.max+d;d=c.min+d;var e=a-d;0>b&&d<c.dataMin?(d=c.dataMin,a=d+e):0<b&&a>c.dataMax&&(a=c.dataMax,d=a-e);this.setExtremes(d,a)};f.prototype=new a;m(f.prototype,{init:function(){var b=this,c=this.chart;["afterShowResetZoom","afterDrilldown","drillupall"].forEach(function(a){b.addEvent(c,
-a,function(){b.updateProxyOverlays()})})},onChartUpdate:function(){var b=this.chart,c=this;b.mapNavButtons&&b.mapNavButtons.forEach(function(a,d){h(b,a.element);c.setMapNavButtonAttrs(a.element,"accessibility.zoom.mapZoom"+(d?"Out":"In"))})},setMapNavButtonAttrs:function(b,c){var a=this.chart;c=a.langFormat(c,{chart:a});e(b,{tabindex:-1,role:"button","aria-label":c})},onChartRender:function(){this.updateProxyOverlays()},updateProxyOverlays:function(){var b=this.chart;q(this.drillUpProxyGroup);q(this.resetZoomProxyGroup);
-b.resetZoomButton&&this.recreateProxyButtonAndGroup(b.resetZoomButton,"resetZoomProxyButton","resetZoomProxyGroup",b.langFormat("accessibility.zoom.resetZoomButton",{chart:b}));b.drillUpButton&&this.recreateProxyButtonAndGroup(b.drillUpButton,"drillUpProxyButton","drillUpProxyGroup",b.langFormat("accessibility.drillUpButton",{chart:b,buttonText:b.getDrilldownBackText()}))},recreateProxyButtonAndGroup:function(b,c,a,d){q(this[a]);this[a]=this.addProxyGroup();this[c]=this.createProxyButton(b,this[a],
-{"aria-label":d,tabindex:-1})},getMapZoomNavigation:function(){var b=this.keyCodes,a=this.chart,d=this;return new n(a,{keyCodeMap:[[[b.up,b.down,b.left,b.right],function(b){return d.onMapKbdArrow(this,b)}],[[b.tab],function(b,a){return d.onMapKbdTab(this,a)}],[[b.space,b.enter],function(){return d.onMapKbdClick(this)}]],validate:function(){return!!(a.mapZoom&&a.mapNavButtons&&a.mapNavButtons.length)},init:function(b){return d.onMapNavInit(b)}})},onMapKbdArrow:function(b,a){var c=this.keyCodes;this.chart[a===
-c.up||a===c.down?"yAxis":"xAxis"][0].panStep(a===c.left||a===c.up?-1:1);return b.response.success},onMapKbdTab:function(b,a){var c=this.chart;b=b.response;var d=(a=a.shiftKey)&&!this.focusedMapNavButtonIx||!a&&this.focusedMapNavButtonIx;c.mapNavButtons[this.focusedMapNavButtonIx].setState(0);if(d)return c.mapZoom(),b[a?"prev":"next"];this.focusedMapNavButtonIx+=a?-1:1;a=c.mapNavButtons[this.focusedMapNavButtonIx];c.setFocusToElement(a.box,a.element);a.setState(2);return b.success},onMapKbdClick:function(b){this.fakeClickEvent(this.chart.mapNavButtons[this.focusedMapNavButtonIx].element);
-return b.response.success},onMapNavInit:function(b){var a=this.chart,d=a.mapNavButtons[0],e=a.mapNavButtons[1];d=0<b?d:e;a.setFocusToElement(d.box,d.element);d.setState(2);this.focusedMapNavButtonIx=0<b?0:1},simpleButtonNavigation:function(b,a,e){var c=this.keyCodes,k=this,g=this.chart;return new n(g,{keyCodeMap:[[[c.tab,c.up,c.down,c.left,c.right],function(b,a){return this.response[b===c.tab&&a.shiftKey||b===c.left||b===c.up?"prev":"next"]}],[[c.space,c.enter],function(){var b=e(this,g);return d(b,
-this.response.success)}]],validate:function(){return g[b]&&g[b].box&&k[a]},init:function(){g.setFocusToElement(g[b].box,k[a])}})},getKeyboardNavigation:function(){return[this.simpleButtonNavigation("resetZoomButton","resetZoomProxyButton",function(b,a){a.zoomOut()}),this.simpleButtonNavigation("drillUpButton","drillUpProxyButton",function(b,a){a.drillUp();return b.response.prev}),this.getMapZoomNavigation()]}});return f});p(a,"Accessibility/Components/RangeSelectorComponent.js",[a["Accessibility/AccessibilityComponent.js"],
-a["Accessibility/Utils/ChartUtilities.js"],a["Core/Globals.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Core/Utilities.js"]],function(a,f,l,m,n,g){var h=f.unhideChartElementFromAT,q=m.setElAttrs;f=g.extend;l.Chart.prototype.highlightRangeSelectorButton=function(a){var d=this.rangeSelector.buttons,b=this.highlightedRangeSelectorItemIx;"undefined"!==typeof b&&d[b]&&d[b].setState(this.oldRangeSelectorItemState||0);this.highlightedRangeSelectorItemIx=
-a;return d[a]?(this.setFocusToElement(d[a].box,d[a].element),this.oldRangeSelectorItemState=d[a].state,d[a].setState(2),!0):!1};l=function(){};l.prototype=new a;f(l.prototype,{onChartUpdate:function(){var a=this.chart,d=this,b=a.rangeSelector;b&&(b.buttons&&b.buttons.length&&b.buttons.forEach(function(b){h(a,b.element);d.setRangeButtonAttrs(b)}),b.maxInput&&b.minInput&&["minInput","maxInput"].forEach(function(c,e){if(c=b[c])h(a,c),d.setRangeInputAttrs(c,"accessibility.rangeSelector."+(e?"max":"min")+
-"InputLabel")}))},setRangeButtonAttrs:function(a){var d=this.chart;d=d.langFormat("accessibility.rangeSelector.buttonText",{chart:d,buttonText:a.text&&a.text.textStr});q(a.element,{tabindex:-1,role:"button","aria-label":d})},setRangeInputAttrs:function(a,d){var b=this.chart;q(a,{tabindex:-1,role:"textbox","aria-label":b.langFormat(d,{chart:b})})},getRangeSelectorButtonNavigation:function(){var a=this.chart,d=this.keyCodes,b=this;return new n(a,{keyCodeMap:[[[d.left,d.right,d.up,d.down],function(a){return b.onButtonNavKbdArrowKey(this,
-a)}],[[d.enter,d.space],function(){return b.onButtonNavKbdClick(this)}]],validate:function(){return a.rangeSelector&&a.rangeSelector.buttons&&a.rangeSelector.buttons.length},init:function(b){var c=a.rangeSelector.buttons.length-1;a.highlightRangeSelectorButton(0<b?0:c)}})},onButtonNavKbdArrowKey:function(a,d){var b=a.response,c=this.keyCodes,e=this.chart,g=e.options.accessibility.keyboardNavigation.wrapAround;d=d===c.left||d===c.up?-1:1;return e.highlightRangeSelectorButton(e.highlightedRangeSelectorItemIx+
-d)?b.success:g?(a.init(d),b.success):b[0<d?"next":"prev"]},onButtonNavKbdClick:function(a){a=a.response;var d=this.chart;3!==d.oldRangeSelectorItemState&&this.fakeClickEvent(d.rangeSelector.buttons[d.highlightedRangeSelectorItemIx].element);return a.success},getRangeSelectorInputNavigation:function(){var a=this.chart,d=this.keyCodes,b=this;return new n(a,{keyCodeMap:[[[d.tab,d.up,d.down],function(a,e){return b.onInputKbdMove(this,a===d.tab&&e.shiftKey||a===d.up?-1:1)}]],validate:function(){return a.rangeSelector&&
-a.rangeSelector.inputGroup&&"hidden"!==a.rangeSelector.inputGroup.element.getAttribute("visibility")&&!1!==a.options.rangeSelector.inputEnabled&&a.rangeSelector.minInput&&a.rangeSelector.maxInput},init:function(a){b.onInputNavInit(a)},terminate:function(){b.onInputNavTerminate()}})},onInputKbdMove:function(a,d){var b=this.chart;a=a.response;var c=b.highlightedInputRangeIx+=d;if(1<c||0>c)return a[0<d?"next":"prev"];b.rangeSelector[c?"maxInput":"minInput"].focus();return a.success},onInputNavInit:function(a){var d=
-this.chart;a=0<a?0:1;d.highlightedInputRangeIx=a;d.rangeSelector[a?"maxInput":"minInput"].focus()},onInputNavTerminate:function(){var a=this.chart.rangeSelector||{};a.maxInput&&a.hideInput("max");a.minInput&&a.hideInput("min")},getKeyboardNavigation:function(){return[this.getRangeSelectorButtonNavigation(),this.getRangeSelectorInputNavigation()]}});return l});p(a,"Accessibility/Components/InfoRegionsComponent.js",[a["Core/Globals.js"],a["Core/Utilities.js"],a["Accessibility/AccessibilityComponent.js"],
-a["Accessibility/Utils/Announcer.js"],a["Accessibility/Components/AnnotationsA11y.js"],a["Accessibility/Utils/ChartUtilities.js"],a["Accessibility/Utils/HTMLUtilities.js"]],function(a,f,l,m,n,g,h){function q(b){return b.replace(/&lt;(h[1-7]|p|div|ul|ol|li)&gt;/g,"<$1>").replace(/&lt;&#x2F;(h[1-7]|p|div|ul|ol|li|a|button)&gt;/g,"</$1>").replace(/&lt;(div|a|button) id=&quot;([a-zA-Z\-0-9#]*?)&quot;&gt;/g,'<$1 id="$2">')}var e=a.doc,d=f.extend,b=f.format,c=f.pick,k=n.getAnnotationsInfoHTML,t=g.unhideChartElementFromAT,
-v=g.getChartTitle,w=g.getAxisDescription,p=h.addClass,u=h.setElAttrs,D=h.escapeStringForHTML,y=h.stripHTMLTagsFromString,z=h.getElement,x=h.visuallyHideElement;a.Chart.prototype.getTypeDescription=function(b){var a=b[0],c=this.series&&this.series[0]||{};c={numSeries:this.series.length,numPoints:c.points&&c.points.length,chart:this,mapTitle:c.mapTitle};if(!a)return this.langFormat("accessibility.chartTypes.emptyChart",c);if("map"===a)return c.mapTitle?this.langFormat("accessibility.chartTypes.mapTypeDescription",
-c):this.langFormat("accessibility.chartTypes.unknownMap",c);if(1<this.types.length)return this.langFormat("accessibility.chartTypes.combinationChart",c);b=b[0];a=this.langFormat("accessibility.seriesTypeDescriptions."+b,c);var d=this.series&&2>this.series.length?"Single":"Multiple";return(this.langFormat("accessibility.chartTypes."+b+d,c)||this.langFormat("accessibility.chartTypes.default"+d,c))+(a?" "+a:"")};f=function(){};f.prototype=new l;d(f.prototype,{init:function(){var b=this.chart,a=this;
-this.initRegionsDefinitions();this.addEvent(b,"afterGetTable",function(b){a.onDataTableCreated(b)});this.addEvent(b,"afterViewData",function(b){a.dataTableDiv=b;setTimeout(function(){a.focusDataTable()},300)});this.announcer=new m(b,"assertive")},initRegionsDefinitions:function(){var b=this;this.screenReaderSections={before:{element:null,buildContent:function(a){var c=a.options.accessibility.screenReaderSection.beforeChartFormatter;return c?c(a):b.defaultBeforeChartFormatter(a)},insertIntoDOM:function(b,
-a){a.renderTo.insertBefore(b,a.renderTo.firstChild)},afterInserted:function(){"undefined"!==typeof b.sonifyButtonId&&b.initSonifyButton(b.sonifyButtonId);"undefined"!==typeof b.dataTableButtonId&&b.initDataTableButton(b.dataTableButtonId)}},after:{element:null,buildContent:function(a){var c=a.options.accessibility.screenReaderSection.afterChartFormatter;return c?c(a):b.defaultAfterChartFormatter()},insertIntoDOM:function(b,a){a.renderTo.insertBefore(b,a.container.nextSibling)}}}},onChartRender:function(){var b=
-this;this.linkedDescriptionElement=this.getLinkedDescriptionElement();this.setLinkedDescriptionAttrs();Object.keys(this.screenReaderSections).forEach(function(a){b.updateScreenReaderSection(a)})},getLinkedDescriptionElement:function(){var a=this.chart.options.accessibility.linkedDescription;if(a){if("string"!==typeof a)return a;a=b(a,this.chart);a=e.querySelectorAll(a);if(1===a.length)return a[0]}},setLinkedDescriptionAttrs:function(){var b=this.linkedDescriptionElement;b&&(b.setAttribute("aria-hidden",
-"true"),p(b,"highcharts-linked-description"))},updateScreenReaderSection:function(b){var a=this.chart,c=this.screenReaderSections[b],d=c.buildContent(a),e=c.element=c.element||this.createElement("div"),g=e.firstChild||this.createElement("div");this.setScreenReaderSectionAttribs(e,b);g.innerHTML=d;e.appendChild(g);c.insertIntoDOM(e,a);x(g);t(a,g);c.afterInserted&&c.afterInserted()},setScreenReaderSectionAttribs:function(b,a){var c=this.chart,d=c.langFormat("accessibility.screenReaderSection."+a+"RegionLabel",
-{chart:c});u(b,{id:"highcharts-screen-reader-region-"+a+"-"+c.index,"aria-label":d});b.style.position="relative";"all"===c.options.accessibility.landmarkVerbosity&&d&&b.setAttribute("role","region")},defaultBeforeChartFormatter:function(){var b,c=this.chart,d=c.options.accessibility.screenReaderSection.beforeChartFormat,e=this.getAxesDescription(),g=c.sonify&&(null===(b=c.options.sonification)||void 0===b?void 0:b.enabled);b="highcharts-a11y-sonify-data-btn-"+c.index;var h="hc-linkto-highcharts-data-table-"+
-c.index,f=k(c),t=c.langFormat("accessibility.screenReaderSection.annotations.heading",{chart:c});e={chartTitle:v(c),typeDescription:this.getTypeDescriptionText(),chartSubtitle:this.getSubtitleText(),chartLongdesc:this.getLongdescText(),xAxisDescription:e.xAxis,yAxisDescription:e.yAxis,playAsSoundButton:g?this.getSonifyButtonText(b):"",viewTableButton:c.getCSV?this.getDataTableButtonText(h):"",annotationsTitle:f?t:"",annotationsList:f};c=a.i18nFormat(d,e,c);this.dataTableButtonId=h;this.sonifyButtonId=
-b;return q(D(c)).replace(/<(\w+)[^>]*?>\s*<\/\1>/g,"")},defaultAfterChartFormatter:function(){var b=this.chart,c=b.options.accessibility.screenReaderSection.afterChartFormat,d={endOfChartMarker:this.getEndOfChartMarkerText()};b=a.i18nFormat(c,d,b);return q(D(b)).replace(/<(\w+)[^>]*?>\s*<\/\1>/g,"")},getLinkedDescription:function(){var b=this.linkedDescriptionElement;return y(b&&b.innerHTML||"")},getLongdescText:function(){var b=this.chart.options,a=b.caption;a=a&&a.text;var c=this.getLinkedDescription();
-return b.accessibility.description||c||a||""},getTypeDescriptionText:function(){var b=this.chart;return b.types?b.options.accessibility.typeDescription||b.getTypeDescription(b.types):""},getDataTableButtonText:function(b){var a=this.chart;a=a.langFormat("accessibility.table.viewAsDataTableButtonText",{chart:a,chartTitle:v(a)});return'<button id="'+b+'">'+a+"</button>"},getSonifyButtonText:function(b){var a,c=this.chart;if(!1===(null===(a=c.options.sonification)||void 0===a?void 0:a.enabled))return"";
-a=c.langFormat("accessibility.sonification.playAsSoundButtonText",{chart:c,chartTitle:v(c)});return'<button id="'+b+'">'+a+"</button>"},getSubtitleText:function(){var b=this.chart.options.subtitle;return y(b&&b.text||"")},getEndOfChartMarkerText:function(){var b=this.chart,a=b.langFormat("accessibility.screenReaderSection.endOfChartMarker",{chart:b});return'<div id="highcharts-end-of-chart-marker-'+b.index+'">'+a+"</div>"},onDataTableCreated:function(b){var a=this.chart;a.options.accessibility.enabled&&
-(this.viewDataTableButton&&this.viewDataTableButton.setAttribute("aria-expanded","true"),b.html=b.html.replace("<table ",'<table tabindex="-1" summary="'+a.langFormat("accessibility.table.tableSummary",{chart:a})+'"'))},focusDataTable:function(){var b=this.dataTableDiv;(b=b&&b.getElementsByTagName("table")[0])&&b.focus&&b.focus()},initSonifyButton:function(b){var a=this,c=this.sonifyButton=z(b),d=this.chart,e=function(b){null===c||void 0===c?void 0:c.setAttribute("aria-hidden","true");null===c||void 0===
-c?void 0:c.setAttribute("aria-label","");b.preventDefault();b.stopPropagation();b=d.langFormat("accessibility.sonification.playAsSoundClickAnnouncement",{chart:d});a.announcer.announce(b);setTimeout(function(){null===c||void 0===c?void 0:c.removeAttribute("aria-hidden");null===c||void 0===c?void 0:c.removeAttribute("aria-label");d.sonify&&d.sonify()},1E3)};c&&d&&(u(c,{tabindex:"-1"}),c.onclick=function(b){var a;((null===(a=d.options.accessibility)||void 0===a?void 0:a.screenReaderSection.onPlayAsSoundClick)||
-e).call(this,b,d)})},initDataTableButton:function(b){var a=this.viewDataTableButton=z(b),c=this.chart;b=b.replace("hc-linkto-","");a&&(u(a,{tabindex:"-1","aria-expanded":!!z(b)}),a.onclick=c.options.accessibility.screenReaderSection.onViewDataTableClick||function(){c.viewData()})},getAxesDescription:function(){var b=this.chart,a=function(a,d){a=b[a];return 1<a.length||a[0]&&c(a[0].options.accessibility&&a[0].options.accessibility.enabled,d)},d=!!b.types&&0>b.types.indexOf("map"),e=!!b.hasCartesianSeries,
-g=a("xAxis",!b.angular&&e&&d);a=a("yAxis",e&&d);d={};g&&(d.xAxis=this.getAxisDescriptionText("xAxis"));a&&(d.yAxis=this.getAxisDescriptionText("yAxis"));return d},getAxisDescriptionText:function(b){var a=this,c=this.chart,d=c[b];return c.langFormat("accessibility.axis."+b+"Description"+(1<d.length?"Plural":"Singular"),{chart:c,names:d.map(function(b){return w(b)}),ranges:d.map(function(b){return a.getAxisRangeDescription(b)}),numAxes:d.length})},getAxisRangeDescription:function(b){var a=b.options||
-{};return a.accessibility&&"undefined"!==typeof a.accessibility.rangeDescription?a.accessibility.rangeDescription:b.categories?this.getCategoryAxisRangeDesc(b):!b.dateTime||0!==b.min&&0!==b.dataMin?this.getAxisFromToDescription(b):this.getAxisTimeLengthDesc(b)},getCategoryAxisRangeDesc:function(b){var a=this.chart;return b.dataMax&&b.dataMin?a.langFormat("accessibility.axis.rangeCategories",{chart:a,axis:b,numCategories:b.dataMax-b.dataMin+1}):""},getAxisTimeLengthDesc:function(b){var a=this.chart,
-c={},d="Seconds";c.Seconds=((b.max||0)-(b.min||0))/1E3;c.Minutes=c.Seconds/60;c.Hours=c.Minutes/60;c.Days=c.Hours/24;["Minutes","Hours","Days"].forEach(function(b){2<c[b]&&(d=b)});var e=c[d].toFixed("Seconds"!==d&&"Minutes"!==d?1:0);return a.langFormat("accessibility.axis.timeRange"+d,{chart:a,axis:b,range:e.replace(".0","")})},getAxisFromToDescription:function(b){var a=this.chart,c=a.options.accessibility.screenReaderSection.axisRangeDateFormat,d=function(d){return b.dateTime?a.time.dateFormat(c,
-b[d]):b[d]};return a.langFormat("accessibility.axis.rangeFromTo",{chart:a,axis:b,rangeFrom:d("min"),rangeTo:d("max")})},destroy:function(){var b;null===(b=this.announcer)||void 0===b?void 0:b.destroy()}});return f});p(a,"Accessibility/Components/ContainerComponent.js",[a["Accessibility/AccessibilityComponent.js"],a["Accessibility/Utils/ChartUtilities.js"],a["Core/Globals.js"],a["Accessibility/Utils/HTMLUtilities.js"],a["Core/Utilities.js"]],function(a,f,l,m,n){var g=f.unhideChartElementFromAT,h=f.getChartTitle,
-q=l.doc,e=m.stripHTMLTagsFromString;f=n.extend;l=function(){};l.prototype=new a;f(l.prototype,{onChartUpdate:function(){this.handleSVGTitleElement();this.setSVGContainerLabel();this.setGraphicContainerAttrs();this.setRenderToAttrs();this.makeCreditsAccessible()},handleSVGTitleElement:function(){var a=this.chart,b="highcharts-title-"+a.index,c=e(a.langFormat("accessibility.svgContainerTitle",{chartTitle:h(a)}));if(c.length){var g=this.svgTitleElement=this.svgTitleElement||q.createElementNS("http://www.w3.org/2000/svg",
-"title");g.textContent=c;g.id=b;a.renderTo.insertBefore(g,a.renderTo.firstChild)}},setSVGContainerLabel:function(){var a=this.chart,b=e(a.langFormat("accessibility.svgContainerLabel",{chartTitle:h(a)}));a.renderer.box&&b.length&&a.renderer.box.setAttribute("aria-label",b)},setGraphicContainerAttrs:function(){var a=this.chart,b=a.langFormat("accessibility.graphicContainerLabel",{chartTitle:h(a)});b.length&&a.container.setAttribute("aria-label",b)},setRenderToAttrs:function(){var a=this.chart;"disabled"!==
-a.options.accessibility.landmarkVerbosity?a.renderTo.setAttribute("role","region"):a.renderTo.removeAttribute("role");a.renderTo.setAttribute("aria-label",a.langFormat("accessibility.chartContainerLabel",{title:h(a),chart:a}))},makeCreditsAccessible:function(){var a=this.chart,b=a.credits;b&&(b.textStr&&b.element.setAttribute("aria-label",e(a.langFormat("accessibility.credits",{creditsStr:b.textStr}))),g(a,b.element))},destroy:function(){this.chart.renderTo.setAttribute("aria-hidden",!0)}});return l});
-p(a,"Accessibility/HighContrastMode.js",[a["Core/Globals.js"]],function(a){var f=a.isMS,l=a.win,m=l.document;return{isHighContrastModeActive:function(){var a=/(Edg)/.test(l.navigator.userAgent);if(l.matchMedia&&a)return l.matchMedia("(-ms-high-contrast: active)").matches;if(f&&l.getComputedStyle){a=m.createElement("div");a.style.backgroundImage="url(data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==)";m.body.appendChild(a);var g=(a.currentStyle||l.getComputedStyle(a)).backgroundImage;
-m.body.removeChild(a);return"none"===g}return!1},setHighContrastTheme:function(a){a.highContrastModeActive=!0;var g=a.options.accessibility.highContrastTheme;a.update(g,!1);a.series.forEach(function(a){var f=g.plotOptions[a.type]||{};a.update({color:f.color||"windowText",colors:[f.color||"windowText"],borderColor:f.borderColor||"window"});a.points.forEach(function(a){a.options&&a.options.color&&a.update({color:f.color||"windowText",borderColor:f.borderColor||"window"},!1)})});a.redraw()}}});p(a,"Accessibility/HighContrastTheme.js",
-[],function(){return{chart:{backgroundColor:"window"},title:{style:{color:"windowText"}},subtitle:{style:{color:"windowText"}},colorAxis:{minColor:"windowText",maxColor:"windowText",stops:[]},colors:["windowText"],xAxis:{gridLineColor:"windowText",labels:{style:{color:"windowText"}},lineColor:"windowText",minorGridLineColor:"windowText",tickColor:"windowText",title:{style:{color:"windowText"}}},yAxis:{gridLineColor:"windowText",labels:{style:{color:"windowText"}},lineColor:"windowText",minorGridLineColor:"windowText",
-tickColor:"windowText",title:{style:{color:"windowText"}}},tooltip:{backgroundColor:"window",borderColor:"windowText",style:{color:"windowText"}},plotOptions:{series:{lineColor:"windowText",fillColor:"window",borderColor:"windowText",edgeColor:"windowText",borderWidth:1,dataLabels:{connectorColor:"windowText",color:"windowText",style:{color:"windowText",textOutline:"none"}},marker:{lineColor:"windowText",fillColor:"windowText"}},pie:{color:"window",colors:["window"],borderColor:"windowText",borderWidth:1},
-boxplot:{fillColor:"window"},candlestick:{lineColor:"windowText",fillColor:"window"},errorbar:{fillColor:"window"}},legend:{backgroundColor:"window",itemStyle:{color:"windowText"},itemHoverStyle:{color:"windowText"},itemHiddenStyle:{color:"#555"},title:{style:{color:"windowText"}}},credits:{style:{color:"windowText"}},labels:{style:{color:"windowText"}},drilldown:{activeAxisLabelStyle:{color:"windowText"},activeDataLabelStyle:{color:"windowText"}},navigation:{buttonOptions:{symbolStroke:"windowText",
-theme:{fill:"window"}}},rangeSelector:{buttonTheme:{fill:"window",stroke:"windowText",style:{color:"windowText"},states:{hover:{fill:"window",stroke:"windowText",style:{color:"windowText"}},select:{fill:"#444",stroke:"windowText",style:{color:"windowText"}}}},inputBoxBorderColor:"windowText",inputStyle:{backgroundColor:"window",color:"windowText"},labelStyle:{color:"windowText"}},navigator:{handles:{backgroundColor:"window",borderColor:"windowText"},outlineColor:"windowText",maskFill:"transparent",
-series:{color:"windowText",lineColor:"windowText"},xAxis:{gridLineColor:"windowText"}},scrollbar:{barBackgroundColor:"#444",barBorderColor:"windowText",buttonArrowColor:"windowText",buttonBackgroundColor:"window",buttonBorderColor:"windowText",rifleColor:"windowText",trackBackgroundColor:"window",trackBorderColor:"windowText"}}});p(a,"Accessibility/Options/Options.js",[],function(){return{accessibility:{enabled:!0,screenReaderSection:{beforeChartFormat:"<h5>{chartTitle}</h5><div>{typeDescription}</div><div>{chartSubtitle}</div><div>{chartLongdesc}</div><div>{playAsSoundButton}</div><div>{viewTableButton}</div><div>{xAxisDescription}</div><div>{yAxisDescription}</div><div>{annotationsTitle}{annotationsList}</div>",
-afterChartFormat:"{endOfChartMarker}",axisRangeDateFormat:"%Y-%m-%d %H:%M:%S"},series:{describeSingleSeries:!1,pointDescriptionEnabledThreshold:200},point:{valueDescriptionFormat:"{index}. {xDescription}{separator}{value}."},landmarkVerbosity:"all",linkedDescription:'*[data-highcharts-chart="{index}"] + .highcharts-description',keyboardNavigation:{enabled:!0,focusBorder:{enabled:!0,hideBrowserFocusOutline:!0,style:{color:"#335cad",lineWidth:2,borderRadius:3},margin:2},order:["series","zoom","rangeSelector",
-"legend","chartMenu"],wrapAround:!0,seriesNavigation:{skipNullPoints:!0,pointNavigationEnabledThreshold:!1}},announceNewData:{enabled:!1,minAnnounceInterval:5E3,interruptUser:!1}},legend:{accessibility:{enabled:!0,keyboardNavigation:{enabled:!0}}},exporting:{accessibility:{enabled:!0}}}});p(a,"Accessibility/Options/LangOptions.js",[],function(){return{accessibility:{defaultChartTitle:"Chart",chartContainerLabel:"{title}. Highcharts interactive chart.",svgContainerLabel:"Interactive chart",drillUpButton:"{buttonText}",
-credits:"Chart credits: {creditsStr}",thousandsSep:",",svgContainerTitle:"",graphicContainerLabel:"",screenReaderSection:{beforeRegionLabel:"Chart screen reader information.",afterRegionLabel:"",annotations:{heading:"Chart annotations summary",descriptionSinglePoint:"{annotationText}. Related to {annotationPoint}",descriptionMultiplePoints:"{annotationText}. Related to {annotationPoint}{ Also related to, #each(additionalAnnotationPoints)}",descriptionNoPoints:"{annotationText}"},endOfChartMarker:"End of interactive chart."},
-sonification:{playAsSoundButtonText:"Play as sound, {chartTitle}",playAsSoundClickAnnouncement:"Play"},legend:{legendLabel:"Toggle series visibility",legendItem:"Hide {itemName}"},zoom:{mapZoomIn:"Zoom chart",mapZoomOut:"Zoom out chart",resetZoomButton:"Reset zoom"},rangeSelector:{minInputLabel:"Select start date.",maxInputLabel:"Select end date.",buttonText:"Select range {buttonText}"},table:{viewAsDataTableButtonText:"View as data table, {chartTitle}",tableSummary:"Table representation of chart."},
-announceNewData:{newDataAnnounce:"Updated data for chart {chartTitle}",newSeriesAnnounceSingle:"New data series: {seriesDesc}",newPointAnnounceSingle:"New data point: {pointDesc}",newSeriesAnnounceMultiple:"New data series in chart {chartTitle}: {seriesDesc}",newPointAnnounceMultiple:"New data point in chart {chartTitle}: {pointDesc}"},seriesTypeDescriptions:{boxplot:"Box plot charts are typically used to display groups of statistical data. Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile, and maximum.",
-arearange:"Arearange charts are line charts displaying a range between a lower and higher value for each point.",areasplinerange:"These charts are line charts displaying a range between a lower and higher value for each point.",bubble:"Bubble charts are scatter charts where each data point also has a size value.",columnrange:"Columnrange charts are column charts displaying a range between a lower and higher value for each point.",errorbar:"Errorbar series are used to display the variability of the data.",
-funnel:"Funnel charts are used to display reduction of data in stages.",pyramid:"Pyramid charts consist of a single pyramid with item heights corresponding to each point value.",waterfall:"A waterfall chart is a column chart where each column contributes towards a total end value."},chartTypes:{emptyChart:"Empty chart",mapTypeDescription:"Map of {mapTitle} with {numSeries} data series.",unknownMap:"Map of unspecified region with {numSeries} data series.",combinationChart:"Combination chart with {numSeries} data series.",
-defaultSingle:"Chart with {numPoints} data {#plural(numPoints, points, point)}.",defaultMultiple:"Chart with {numSeries} data series.",splineSingle:"Line chart with {numPoints} data {#plural(numPoints, points, point)}.",splineMultiple:"Line chart with {numSeries} lines.",lineSingle:"Line chart with {numPoints} data {#plural(numPoints, points, point)}.",lineMultiple:"Line chart with {numSeries} lines.",columnSingle:"Bar chart with {numPoints} {#plural(numPoints, bars, bar)}.",columnMultiple:"Bar chart with {numSeries} data series.",
-barSingle:"Bar chart with {numPoints} {#plural(numPoints, bars, bar)}.",barMultiple:"Bar chart with {numSeries} data series.",pieSingle:"Pie chart with {numPoints} {#plural(numPoints, slices, slice)}.",pieMultiple:"Pie chart with {numSeries} pies.",scatterSingle:"Scatter chart with {numPoints} {#plural(numPoints, points, point)}.",scatterMultiple:"Scatter chart with {numSeries} data series.",boxplotSingle:"Boxplot with {numPoints} {#plural(numPoints, boxes, box)}.",boxplotMultiple:"Boxplot with {numSeries} data series.",
-bubbleSingle:"Bubble chart with {numPoints} {#plural(numPoints, bubbles, bubble)}.",bubbleMultiple:"Bubble chart with {numSeries} data series."},axis:{xAxisDescriptionSingular:"The chart has 1 X axis displaying {names[0]}. {ranges[0]}",xAxisDescriptionPlural:"The chart has {numAxes} X axes displaying {#each(names, -1) }and {names[-1]}.",yAxisDescriptionSingular:"The chart has 1 Y axis displaying {names[0]}. {ranges[0]}",yAxisDescriptionPlural:"The chart has {numAxes} Y axes displaying {#each(names, -1) }and {names[-1]}.",
-timeRangeDays:"Range: {range} days.",timeRangeHours:"Range: {range} hours.",timeRangeMinutes:"Range: {range} minutes.",timeRangeSeconds:"Range: {range} seconds.",rangeFromTo:"Range: {rangeFrom} to {rangeTo}.",rangeCategories:"Range: {numCategories} categories."},exporting:{chartMenuLabel:"Chart menu",menuButtonLabel:"View chart menu",exportRegionLabel:"Chart menu"},series:{summary:{"default":"{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",defaultCombination:"{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
-line:"{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",lineCombination:"{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",spline:"{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",splineCombination:"{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",column:"{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.",
-columnCombination:"{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.",bar:"{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.",barCombination:"{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.",pie:"{name}, pie {ix} of {numSeries} with {numPoints} {#plural(numPoints, slices, slice)}.",pieCombination:"{name}, series {ix} of {numSeries}. Pie with {numPoints} {#plural(numPoints, slices, slice)}.",
-scatter:"{name}, scatter plot {ix} of {numSeries} with {numPoints} {#plural(numPoints, points, point)}.",scatterCombination:"{name}, series {ix} of {numSeries}, scatter plot with {numPoints} {#plural(numPoints, points, point)}.",boxplot:"{name}, boxplot {ix} of {numSeries} with {numPoints} {#plural(numPoints, boxes, box)}.",boxplotCombination:"{name}, series {ix} of {numSeries}. Boxplot with {numPoints} {#plural(numPoints, boxes, box)}.",bubble:"{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
-bubbleCombination:"{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}.",map:"{name}, map {ix} of {numSeries} with {numPoints} {#plural(numPoints, areas, area)}.",mapCombination:"{name}, series {ix} of {numSeries}. Map with {numPoints} {#plural(numPoints, areas, area)}.",mapline:"{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",maplineCombination:"{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",
-mapbubble:"{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.",mapbubbleCombination:"{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}."},description:"{description}",xAxisDescription:"X axis, {name}",yAxisDescription:"Y axis, {name}",nullPointValue:"No value",pointAnnotationsDescription:"{Annotation: #each(annotations). }"}}}});p(a,"Accessibility/Options/DeprecatedOptions.js",[a["Core/Utilities.js"]],
-function(a){function f(a,d,b){for(var c,e=0;e<d.length-1;++e)c=d[e],a=a[c]=q(a[c],{});a[d[d.length-1]]=b}function l(a,d,b,c){function e(b,a){return a.reduce(function(b,a){return b[a]},b)}var g=e(a.options,d),l=e(a.options,b);Object.keys(c).forEach(function(e){var k,t=g[e];"undefined"!==typeof t&&(f(l,c[e],t),h(32,!1,a,(k={},k[d.join(".")+"."+e]=b.join(".")+"."+c[e].join("."),k)))})}function m(a){var d=a.options.chart||{},b=a.options.accessibility||{};["description","typeDescription"].forEach(function(c){var e;
-d[c]&&(b[c]=d[c],h(32,!1,a,(e={},e["chart."+c]="use accessibility."+c,e)))})}function n(a){a.axes.forEach(function(d){(d=d.options)&&d.description&&(d.accessibility=d.accessibility||{},d.accessibility.description=d.description,h(32,!1,a,{"axis.description":"use axis.accessibility.description"}))})}function g(a){var d={description:["accessibility","description"],exposeElementToA11y:["accessibility","exposeAsGroupOnly"],pointDescriptionFormatter:["accessibility","pointDescriptionFormatter"],skipKeyboardNavigation:["accessibility",
-"keyboardNavigation","enabled"]};a.series.forEach(function(b){Object.keys(d).forEach(function(c){var e,g=b.options[c];"undefined"!==typeof g&&(f(b.options,d[c],"skipKeyboardNavigation"===c?!g:g),h(32,!1,a,(e={},e["series."+c]="series."+d[c].join("."),e)))})})}var h=a.error,q=a.pick;return function(a){m(a);n(a);a.series&&g(a);l(a,["accessibility"],["accessibility"],{pointDateFormat:["point","dateFormat"],pointDateFormatter:["point","dateFormatter"],pointDescriptionFormatter:["point","descriptionFormatter"],
-pointDescriptionThreshold:["series","pointDescriptionEnabledThreshold"],pointNavigationThreshold:["keyboardNavigation","seriesNavigation","pointNavigationEnabledThreshold"],pointValueDecimals:["point","valueDecimals"],pointValuePrefix:["point","valuePrefix"],pointValueSuffix:["point","valueSuffix"],screenReaderSectionFormatter:["screenReaderSection","beforeChartFormatter"],describeSingleSeries:["series","describeSingleSeries"],seriesDescriptionFormatter:["series","descriptionFormatter"],onTableAnchorClick:["screenReaderSection",
-"onViewDataTableClick"],axisRangeDateFormat:["screenReaderSection","axisRangeDateFormat"]});l(a,["accessibility","keyboardNavigation"],["accessibility","keyboardNavigation","seriesNavigation"],{skipNullPoints:["skipNullPoints"],mode:["mode"]});l(a,["lang","accessibility"],["lang","accessibility"],{legendItem:["legend","legendItem"],legendLabel:["legend","legendLabel"],mapZoomIn:["zoom","mapZoomIn"],mapZoomOut:["zoom","mapZoomOut"],resetZoomButton:["zoom","resetZoomButton"],screenReaderRegionLabel:["screenReaderSection",
-"beforeRegionLabel"],rangeSelectorButton:["rangeSelector","buttonText"],rangeSelectorMaxInput:["rangeSelector","maxInputLabel"],rangeSelectorMinInput:["rangeSelector","minInputLabel"],svgContainerEnd:["screenReaderSection","endOfChartMarker"],viewAsDataTable:["table","viewAsDataTableButtonText"],tableSummary:["table","tableSummary"]})}});p(a,"Accessibility/A11yI18n.js",[a["Core/Globals.js"],a["Core/Utilities.js"]],function(a,f){function l(a,f){var g=a.indexOf("#each("),e=a.indexOf("#plural("),d=a.indexOf("["),
-b=a.indexOf("]");if(-1<g){d=a.slice(g).indexOf(")")+g;var c=a.substring(0,g);e=a.substring(d+1);d=a.substring(g+6,d).split(",");g=Number(d[1]);a="";if(f=f[d[0]])for(g=isNaN(g)?f.length:g,g=0>g?f.length+g:Math.min(g,f.length),d=0;d<g;++d)a+=c+f[d]+e;return a.length?a:""}if(-1<e){c=a.slice(e).indexOf(")")+e;a=a.substring(e+8,c).split(",");switch(Number(f[a[0]])){case 0:a=n(a[4],a[1]);break;case 1:a=n(a[2],a[1]);break;case 2:a=n(a[3],a[1]);break;default:a=a[1]}a?(f=a,f=f.trim&&f.trim()||f.replace(/^\s+|\s+$/g,
-"")):f="";return f}return-1<d?(e=a.substring(0,d),a=Number(a.substring(d+1,b)),f=f[e],!isNaN(a)&&f&&(0>a?(c=f[f.length+a],"undefined"===typeof c&&(c=f[0])):(c=f[a],"undefined"===typeof c&&(c=f[f.length-1]))),"undefined"!==typeof c?c:""):"{"+a+"}"}var m=f.format,n=f.pick;a.i18nFormat=function(a,f,n){var e=function(a,b){a=a.slice(b||0);var c=a.indexOf("{"),d=a.indexOf("}");if(-1<c&&d>c)return{statement:a.substring(c+1,d),begin:b+c+1,end:b+d}},d=[],b=0;do{var c=e(a,b);var g=a.substring(b,c&&c.begin-
-1);g.length&&d.push({value:g,type:"constant"});c&&d.push({value:c.statement,type:"statement"});b=c?c.end+1:b+1}while(c);d.forEach(function(a){"statement"===a.type&&(a.value=l(a.value,f))});return m(d.reduce(function(a,b){return a+b.value},""),f,n)};a.Chart.prototype.langFormat=function(f,h){f=f.split(".");for(var g=this.options.lang,e=0;e<f.length;++e)g=g&&g[f[e]];return"string"===typeof g?a.i18nFormat(g,h,this):""}});p(a,"Accessibility/FocusBorder.js",[a["Core/Globals.js"],a["Core/Renderer/SVG/SVGElement.js"],
-a["Core/Renderer/SVG/SVGLabel.js"],a["Core/Utilities.js"]],function(a,f,l,m){function n(a){if(!a.focusBorderDestroyHook){var b=a.destroy;a.destroy=function(){var c,d;null===(d=null===(c=a.focusBorder)||void 0===c?void 0:c.destroy)||void 0===d?void 0:d.call(c);return b.apply(a,arguments)};a.focusBorderDestroyHook=b}}function g(a){for(var c=[],d=1;d<arguments.length;d++)c[d-1]=arguments[d];a.focusBorderUpdateHooks||(a.focusBorderUpdateHooks={},b.forEach(function(b){b+="Setter";var d=a[b]||a._defaultSetter;
-a.focusBorderUpdateHooks[b]=d;a[b]=function(){var b=d.apply(a,arguments);a.addFocusBorder.apply(a,c);return b}}))}function h(a){a.focusBorderUpdateHooks&&(Object.keys(a.focusBorderUpdateHooks).forEach(function(b){var c=a.focusBorderUpdateHooks[b];c===a._defaultSetter?delete a[b]:a[b]=c}),delete a.focusBorderUpdateHooks)}var q=m.addEvent,e=m.extend,d=m.pick,b="x y transform width height r d stroke-width".split(" ");e(f.prototype,{addFocusBorder:function(b,e){this.focusBorder&&this.removeFocusBorder();
-var c=this.getBBox(),f=d(b,3);c.x+=this.translateX?this.translateX:0;c.y+=this.translateY?this.translateY:0;var h=c.x-f,k=c.y-f,m=c.width+2*f,q=c.height+2*f,p=this instanceof l;if("text"===this.element.nodeName||p){var u=!!this.rotation;if(p)var x={x:u?1:0,y:0};else h=x=0,"middle"===this.attr("text-anchor")?(x=a.isFirefox&&this.rotation?.25:.5,h=a.isFirefox&&!this.rotation?.75:.5):this.rotation?x=.25:h=.75,x={x:x,y:h};h=+this.attr("x")-c.width*x.x-f;k=+this.attr("y")-c.height*x.y-f;p&&u&&(p=m,m=q,
-q=p,h=+this.attr("x")-c.height*x.x-f,k=+this.attr("y")-c.width*x.y-f)}this.focusBorder=this.renderer.rect(h,k,m,q,parseInt((e&&e.borderRadius||0).toString(),10)).addClass("highcharts-focus-border").attr({zIndex:99}).add(this.parentGroup);this.renderer.styledMode||this.focusBorder.attr({stroke:e&&e.stroke,"stroke-width":e&&e.strokeWidth});g(this,b,e);n(this)},removeFocusBorder:function(){h(this);this.focusBorderDestroyHook&&(this.destroy=this.focusBorderDestroyHook,delete this.focusBorderDestroyHook);
-this.focusBorder&&(this.focusBorder.destroy(),delete this.focusBorder)}});a.Chart.prototype.renderFocusBorder=function(){var a=this.focusElement,b=this.options.accessibility.keyboardNavigation.focusBorder;a&&(a.removeFocusBorder(),b.enabled&&a.addFocusBorder(b.margin,{stroke:b.style.color,strokeWidth:b.style.lineWidth,borderRadius:b.style.borderRadius}))};a.Chart.prototype.setFocusToElement=function(a,b){var c=this.options.accessibility.keyboardNavigation.focusBorder;(b=b||a.element)&&b.focus&&(b.hcEvents&&
-b.hcEvents.focusin||q(b,"focusin",function(){}),b.focus(),c.hideBrowserFocusOutline&&(b.style.outline="none"));this.focusElement&&this.focusElement.removeFocusBorder();this.focusElement=a;this.renderFocusBorder()}});p(a,"Accessibility/Accessibility.js",[a["Accessibility/Utils/ChartUtilities.js"],a["Core/Globals.js"],a["Accessibility/KeyboardNavigationHandler.js"],a["Core/Series/CartesianSeries.js"],a["Core/Options.js"],a["Core/Series/Point.js"],a["Core/Utilities.js"],a["Accessibility/AccessibilityComponent.js"],
-a["Accessibility/KeyboardNavigation.js"],a["Accessibility/Components/LegendComponent.js"],a["Accessibility/Components/MenuComponent.js"],a["Accessibility/Components/SeriesComponent/SeriesComponent.js"],a["Accessibility/Components/ZoomComponent.js"],a["Accessibility/Components/RangeSelectorComponent.js"],a["Accessibility/Components/InfoRegionsComponent.js"],a["Accessibility/Components/ContainerComponent.js"],a["Accessibility/HighContrastMode.js"],a["Accessibility/HighContrastTheme.js"],a["Accessibility/Options/Options.js"],
-a["Accessibility/Options/LangOptions.js"],a["Accessibility/Options/DeprecatedOptions.js"]],function(a,f,l,m,n,g,h,p,e,d,b,c,k,t,v,w,H,A,D,y,z){function q(a){this.init(a)}var r=f.doc,u=h.addEvent,F=h.extend,B=h.fireEvent,E=h.merge;E(!0,n.defaultOptions,D,{accessibility:{highContrastTheme:A},lang:y});f.A11yChartUtilities=a;f.KeyboardNavigationHandler=l;f.AccessibilityComponent=p;q.prototype={init:function(a){this.chart=a;r.addEventListener&&a.renderer.isSVG?(z(a),this.initComponents(),this.keyboardNavigation=
-new e(a,this.components),this.update()):a.renderTo.setAttribute("aria-hidden",!0)},initComponents:function(){var a=this.chart,e=a.options.accessibility;this.components={container:new w,infoRegions:new v,legend:new d,chartMenu:new b,rangeSelector:new t,series:new c,zoom:new k};e.customComponents&&F(this.components,e.customComponents);var f=this.components;this.getComponentOrder().forEach(function(b){f[b].initBase(a);f[b].init()})},getComponentOrder:function(){if(!this.components)return[];if(!this.components.series)return Object.keys(this.components);
-var a=Object.keys(this.components).filter(function(a){return"series"!==a});return["series"].concat(a)},update:function(){var a=this.components,b=this.chart,c=b.options.accessibility;B(b,"beforeA11yUpdate");b.types=this.getChartTypes();this.getComponentOrder().forEach(function(c){a[c].onChartUpdate();B(b,"afterA11yComponentUpdate",{name:c,component:a[c]})});this.keyboardNavigation.update(c.keyboardNavigation.order);!b.highContrastModeActive&&H.isHighContrastModeActive()&&H.setHighContrastTheme(b);
-B(b,"afterA11yUpdate",{accessibility:this})},destroy:function(){var a=this.chart||{},b=this.components;Object.keys(b).forEach(function(a){b[a].destroy();b[a].destroyBase()});this.keyboardNavigation&&this.keyboardNavigation.destroy();a.renderTo&&a.renderTo.setAttribute("aria-hidden",!0);a.focusElement&&a.focusElement.removeFocusBorder()},getChartTypes:function(){var a={};this.chart.series.forEach(function(b){a[b.type]=1});return Object.keys(a)}};f.Chart.prototype.updateA11yEnabled=function(){var a=
-this.accessibility,b=this.options.accessibility;b&&b.enabled?a?a.update():this.accessibility=new q(this):a?(a.destroy&&a.destroy(),delete this.accessibility):this.renderTo.setAttribute("aria-hidden",!0)};u(f.Chart,"render",function(a){this.a11yDirty&&this.renderTo&&(delete this.a11yDirty,this.updateA11yEnabled());var b=this.accessibility;b&&b.getComponentOrder().forEach(function(a){b.components[a].onChartRender()})});u(f.Chart,"update",function(a){if(a=a.options.accessibility)a.customComponents&&
-(this.options.accessibility.customComponents=a.customComponents,delete a.customComponents),E(!0,this.options.accessibility,a),this.accessibility&&this.accessibility.destroy&&(this.accessibility.destroy(),delete this.accessibility);this.a11yDirty=!0});u(g,"update",function(){this.series.chart.accessibility&&(this.series.chart.a11yDirty=!0)});["addSeries","init"].forEach(function(a){u(f.Chart,a,function(){this.a11yDirty=!0})});["update","updatedData","remove"].forEach(function(a){u(m,a,function(){this.chart.accessibility&&
-(this.chart.a11yDirty=!0)})});["afterDrilldown","drillupall"].forEach(function(a){u(f.Chart,a,function(){this.accessibility&&this.accessibility.update()})});u(f.Chart,"destroy",function(){this.accessibility&&this.accessibility.destroy()})});p(a,"masters/modules/accessibility.src.js",[],function(){})});
-//# sourceMappingURL=accessibility.js.map
\ No newline at end of file
+(function (a) {
+  "object" === typeof module && module.exports
+    ? ((a["default"] = a), (module.exports = a))
+    : "function" === typeof define && define.amd
+    ? define("highcharts/modules/accessibility", ["highcharts"], function (p) {
+        a(p);
+        a.Highcharts = p;
+        return a;
+      })
+    : a("undefined" !== typeof Highcharts ? Highcharts : void 0);
+})(function (a) {
+  function p(a, f, l, m) {
+    a.hasOwnProperty(f) || (a[f] = m.apply(null, l));
+  }
+  a = a ? a._modules : {};
+  p(
+    a,
+    "Accessibility/Utils/HTMLUtilities.js",
+    [a["Core/Globals.js"], a["Core/Utilities.js"]],
+    function (a, f) {
+      function u(a) {
+        return a
+          .replace(/&/g, "&amp;")
+          .replace(/</g, "&lt;")
+          .replace(/>/g, "&gt;")
+          .replace(/"/g, "&quot;")
+          .replace(/'/g, "&#x27;")
+          .replace(/\//g, "&#x2F;");
+      }
+      var m = a.doc,
+        n = a.win,
+        g = f.merge;
+      return {
+        addClass: function (a, g) {
+          a.classList
+            ? a.classList.add(g)
+            : 0 > a.className.indexOf(g) && (a.className += g);
+        },
+        escapeStringForHTML: u,
+        getElement: function (a) {
+          return m.getElementById(a);
+        },
+        getFakeMouseEvent: function (a) {
+          if ("function" === typeof n.MouseEvent) return new n.MouseEvent(a);
+          if (m.createEvent) {
+            var g = m.createEvent("MouseEvent");
+            if (g.initMouseEvent)
+              return (
+                g.initMouseEvent(
+                  a,
+                  !0,
+                  !0,
+                  n,
+                  "click" === a ? 1 : 0,
+                  0,
+                  0,
+                  0,
+                  0,
+                  !1,
+                  !1,
+                  !1,
+                  !1,
+                  0,
+                  null
+                ),
+                g
+              );
+          }
+          return { type: a };
+        },
+        removeElement: function (a) {
+          a && a.parentNode && a.parentNode.removeChild(a);
+        },
+        reverseChildNodes: function (a) {
+          for (var g = a.childNodes.length; g--; )
+            a.appendChild(a.childNodes[g]);
+        },
+        setElAttrs: function (a, g) {
+          Object.keys(g).forEach(function (e) {
+            var d = g[e];
+            null === d
+              ? a.removeAttribute(e)
+              : ((d = u("" + d)), a.setAttribute(e, d));
+          });
+        },
+        stripHTMLTagsFromString: function (a) {
+          return "string" === typeof a ? a.replace(/<\/?[^>]+(>|$)/g, "") : a;
+        },
+        visuallyHideElement: function (a) {
+          g(!0, a.style, {
+            position: "absolute",
+            width: "1px",
+            height: "1px",
+            overflow: "hidden",
+            whiteSpace: "nowrap",
+            clip: "rect(1px, 1px, 1px, 1px)",
+            marginTop: "-3px",
+            "-ms-filter": "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)",
+            filter: "alpha(opacity=1)",
+            opacity: "0.01",
+          });
+        },
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/Utils/ChartUtilities.js",
+    [a["Accessibility/Utils/HTMLUtilities.js"], a["Core/Utilities.js"]],
+    function (a, f) {
+      function u(d) {
+        var b, c;
+        if (null === (b = d.points) || void 0 === b ? 0 : b.length)
+          return (
+            (d = q(d.points, function (c) {
+              return !!c.graphic;
+            })),
+            null === (c = null === d || void 0 === d ? void 0 : d.graphic) ||
+            void 0 === c
+              ? void 0
+              : c.element
+          );
+      }
+      function m(d) {
+        var b = u(d);
+        return (
+          (b && b.parentNode) ||
+          (d.graph && d.graph.element) ||
+          (d.group && d.group.element)
+        );
+      }
+      function n(d, b) {
+        b.setAttribute("aria-hidden", !1);
+        b !== d.renderTo &&
+          b.parentNode &&
+          (Array.prototype.forEach.call(b.parentNode.childNodes, function (c) {
+            c.hasAttribute("aria-hidden") || c.setAttribute("aria-hidden", !0);
+          }),
+          n(d, b.parentNode));
+      }
+      var g = a.stripHTMLTagsFromString,
+        h = f.defined,
+        q = f.find,
+        e = f.fireEvent;
+      return {
+        getChartTitle: function (d) {
+          return g(
+            d.options.title.text ||
+              d.langFormat("accessibility.defaultChartTitle", { chart: d })
+          );
+        },
+        getAxisDescription: function (d) {
+          return g(
+            d &&
+              ((d.userOptions &&
+                d.userOptions.accessibility &&
+                d.userOptions.accessibility.description) ||
+                (d.axisTitle && d.axisTitle.textStr) ||
+                d.options.id ||
+                (d.categories && "categories") ||
+                (d.dateTime && "Time") ||
+                "values")
+          );
+        },
+        getPointFromXY: function (d, b, c) {
+          for (var k = d.length, t; k--; )
+            if (
+              (t = q(d[k].points || [], function (v) {
+                return v.x === b && v.y === c;
+              }))
+            )
+              return t;
+        },
+        getSeriesFirstPointElement: u,
+        getSeriesFromName: function (d, b) {
+          return b
+            ? (d.series || []).filter(function (c) {
+                return c.name === b;
+              })
+            : d.series;
+        },
+        getSeriesA11yElement: m,
+        unhideChartElementFromAT: n,
+        hideSeriesFromAT: function (d) {
+          (d = m(d)) && d.setAttribute("aria-hidden", !0);
+        },
+        scrollToPoint: function (d) {
+          var b = d.series.xAxis,
+            c = d.series.yAxis,
+            k = (null === b || void 0 === b ? 0 : b.scrollbar) ? b : c;
+          if (
+            (b = null === k || void 0 === k ? void 0 : k.scrollbar) &&
+            h(b.to) &&
+            h(b.from)
+          ) {
+            c = b.to - b.from;
+            if (h(k.dataMin) && h(k.dataMax)) {
+              var t = k.toPixels(k.dataMin),
+                v = k.toPixels(k.dataMax);
+              d =
+                (k.toPixels(d["xAxis" === k.coll ? "x" : "y"] || 0) - t) /
+                (v - t);
+            } else d = 0;
+            b.updatePosition(d - c / 2, d + c / 2);
+            e(b, "changed", {
+              from: b.from,
+              to: b.to,
+              trigger: "scrollbar",
+              DOMEvent: null,
+            });
+          }
+        },
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/KeyboardNavigationHandler.js",
+    [a["Core/Utilities.js"]],
+    function (a) {
+      function f(a, f) {
+        this.chart = a;
+        this.keyCodeMap = f.keyCodeMap || [];
+        this.validate = f.validate;
+        this.init = f.init;
+        this.terminate = f.terminate;
+        this.response = { success: 1, prev: 2, next: 3, noHandler: 4, fail: 5 };
+      }
+      var u = a.find;
+      f.prototype = {
+        run: function (a) {
+          var f = a.which || a.keyCode,
+            g = this.response.noHandler,
+            h = u(this.keyCodeMap, function (a) {
+              return -1 < a[0].indexOf(f);
+            });
+          h
+            ? (g = h[1].call(this, f, a))
+            : 9 === f && (g = this.response[a.shiftKey ? "prev" : "next"]);
+          return g;
+        },
+      };
+      return f;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Utils/DOMElementProvider.js",
+    [
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l) {
+      var u = a.doc,
+        n = f.removeElement;
+      a = l.extend;
+      f = function () {
+        this.elements = [];
+      };
+      a(f.prototype, {
+        createElement: function () {
+          var a = u.createElement.apply(u, arguments);
+          this.elements.push(a);
+          return a;
+        },
+        destroyCreatedElements: function () {
+          this.elements.forEach(function (a) {
+            n(a);
+          });
+          this.elements = [];
+        },
+      });
+      return f;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Utils/EventProvider.js",
+    [a["Core/Globals.js"], a["Core/Utilities.js"]],
+    function (a, f) {
+      var u = f.addEvent;
+      f = f.extend;
+      var m = function () {
+        this.eventRemovers = [];
+      };
+      f(m.prototype, {
+        addEvent: function () {
+          var f = u.apply(a, arguments);
+          this.eventRemovers.push(f);
+          return f;
+        },
+        removeAddedEvents: function () {
+          this.eventRemovers.forEach(function (a) {
+            a();
+          });
+          this.eventRemovers = [];
+        },
+      });
+      return m;
+    }
+  );
+  p(
+    a,
+    "Accessibility/AccessibilityComponent.js",
+    [
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Utils/DOMElementProvider.js"],
+      a["Accessibility/Utils/EventProvider.js"],
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m, n, g) {
+      function h() {}
+      var q = a.unhideChartElementFromAT,
+        e = m.doc,
+        d = m.win,
+        b = n.removeElement,
+        c = n.getFakeMouseEvent;
+      a = g.extend;
+      var k = g.fireEvent,
+        t = g.merge;
+      h.prototype = {
+        initBase: function (c) {
+          this.chart = c;
+          this.eventProvider = new l();
+          this.domElementProvider = new f();
+          this.keyCodes = {
+            left: 37,
+            right: 39,
+            up: 38,
+            down: 40,
+            enter: 13,
+            space: 32,
+            esc: 27,
+            tab: 9,
+          };
+        },
+        addEvent: function () {
+          return this.eventProvider.addEvent.apply(
+            this.eventProvider,
+            arguments
+          );
+        },
+        createElement: function () {
+          return this.domElementProvider.createElement.apply(
+            this.domElementProvider,
+            arguments
+          );
+        },
+        fireEventOnWrappedOrUnwrappedElement: function (c, b) {
+          var v = b.type;
+          e.createEvent && (c.dispatchEvent || c.fireEvent)
+            ? c.dispatchEvent
+              ? c.dispatchEvent(b)
+              : c.fireEvent(v, b)
+            : k(c, v, b);
+        },
+        fakeClickEvent: function (b) {
+          if (b) {
+            var v = c("click");
+            this.fireEventOnWrappedOrUnwrappedElement(b, v);
+          }
+        },
+        addProxyGroup: function (c) {
+          this.createOrUpdateProxyContainer();
+          var b = this.createElement("div");
+          Object.keys(c || {}).forEach(function (v) {
+            null !== c[v] && b.setAttribute(v, c[v]);
+          });
+          this.chart.a11yProxyContainer.appendChild(b);
+          return b;
+        },
+        createOrUpdateProxyContainer: function () {
+          var c = this.chart,
+            b = c.renderer.box;
+          c.a11yProxyContainer =
+            c.a11yProxyContainer || this.createProxyContainerElement();
+          b.nextSibling !== c.a11yProxyContainer &&
+            c.container.insertBefore(c.a11yProxyContainer, b.nextSibling);
+        },
+        createProxyContainerElement: function () {
+          var c = e.createElement("div");
+          c.className = "highcharts-a11y-proxy-container";
+          return c;
+        },
+        createProxyButton: function (c, b, a, d, k) {
+          var v = c.element,
+            e = this.createElement("button"),
+            w = t({ "aria-label": v.getAttribute("aria-label") }, a);
+          Object.keys(w).forEach(function (c) {
+            null !== w[c] && e.setAttribute(c, w[c]);
+          });
+          e.className = "highcharts-a11y-proxy-button";
+          k && this.addEvent(e, "click", k);
+          this.setProxyButtonStyle(e);
+          this.updateProxyButtonPosition(e, d || c);
+          this.proxyMouseEventsForButton(v, e);
+          b.appendChild(e);
+          w["aria-hidden"] || q(this.chart, e);
+          return e;
+        },
+        getElementPosition: function (c) {
+          var b = c.element;
+          return (c = this.chart.renderTo) && b && b.getBoundingClientRect
+            ? ((b = b.getBoundingClientRect()),
+              (c = c.getBoundingClientRect()),
+              {
+                x: b.left - c.left,
+                y: b.top - c.top,
+                width: b.right - b.left,
+                height: b.bottom - b.top,
+              })
+            : { x: 0, y: 0, width: 1, height: 1 };
+        },
+        setProxyButtonStyle: function (c) {
+          t(!0, c.style, {
+            "border-width": 0,
+            "background-color": "transparent",
+            cursor: "pointer",
+            outline: "none",
+            opacity: 0.001,
+            filter: "alpha(opacity=1)",
+            "-ms-filter": "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)",
+            zIndex: 999,
+            overflow: "hidden",
+            padding: 0,
+            margin: 0,
+            display: "block",
+            position: "absolute",
+          });
+        },
+        updateProxyButtonPosition: function (c, b) {
+          b = this.getElementPosition(b);
+          t(!0, c.style, {
+            width: (b.width || 1) + "px",
+            height: (b.height || 1) + "px",
+            left: (b.x || 0) + "px",
+            top: (b.y || 0) + "px",
+          });
+        },
+        proxyMouseEventsForButton: function (c, b) {
+          var a = this;
+          "click touchstart touchend touchcancel touchmove mouseover mouseenter mouseleave mouseout"
+            .split(" ")
+            .forEach(function (d) {
+              var t = 0 === d.indexOf("touch");
+              a.addEvent(b, d, function (b) {
+                var d = t ? a.cloneTouchEvent(b) : a.cloneMouseEvent(b);
+                c && a.fireEventOnWrappedOrUnwrappedElement(c, d);
+                b.stopPropagation();
+                b.preventDefault();
+              });
+            });
+        },
+        cloneMouseEvent: function (b) {
+          if ("function" === typeof d.MouseEvent)
+            return new d.MouseEvent(b.type, b);
+          if (e.createEvent) {
+            var a = e.createEvent("MouseEvent");
+            if (a.initMouseEvent)
+              return (
+                a.initMouseEvent(
+                  b.type,
+                  b.bubbles,
+                  b.cancelable,
+                  b.view || d,
+                  b.detail,
+                  b.screenX,
+                  b.screenY,
+                  b.clientX,
+                  b.clientY,
+                  b.ctrlKey,
+                  b.altKey,
+                  b.shiftKey,
+                  b.metaKey,
+                  b.button,
+                  b.relatedTarget
+                ),
+                a
+              );
+          }
+          return c(b.type);
+        },
+        cloneTouchEvent: function (b) {
+          var c = function (b) {
+            for (var c = [], a = 0; a < b.length; ++a) {
+              var d = b.item(a);
+              d && c.push(d);
+            }
+            return c;
+          };
+          if ("function" === typeof d.TouchEvent)
+            return (
+              (c = new d.TouchEvent(b.type, {
+                touches: c(b.touches),
+                targetTouches: c(b.targetTouches),
+                changedTouches: c(b.changedTouches),
+                ctrlKey: b.ctrlKey,
+                shiftKey: b.shiftKey,
+                altKey: b.altKey,
+                metaKey: b.metaKey,
+                bubbles: b.bubbles,
+                cancelable: b.cancelable,
+                composed: b.composed,
+                detail: b.detail,
+                view: b.view,
+              })),
+              b.defaultPrevented && c.preventDefault(),
+              c
+            );
+          c = this.cloneMouseEvent(b);
+          c.touches = b.touches;
+          c.changedTouches = b.changedTouches;
+          c.targetTouches = b.targetTouches;
+          return c;
+        },
+        destroyBase: function () {
+          b(this.chart.a11yProxyContainer);
+          this.domElementProvider.destroyCreatedElements();
+          this.eventProvider.removeAddedEvents();
+        },
+      };
+      a(h.prototype, {
+        init: function () {},
+        getKeyboardNavigation: function () {},
+        onChartUpdate: function () {},
+        onChartRender: function () {},
+        destroy: function () {},
+      });
+      return h;
+    }
+  );
+  p(
+    a,
+    "Accessibility/KeyboardNavigation.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Accessibility/Utils/EventProvider.js"],
+    ],
+    function (a, f, l, m) {
+      function n(b, c) {
+        this.init(b, c);
+      }
+      var g = a.doc,
+        h = a.win,
+        q = f.addEvent,
+        e = f.fireEvent,
+        d = l.getElement;
+      q(g, "keydown", function (b) {
+        27 === (b.which || b.keyCode) &&
+          a.charts &&
+          a.charts.forEach(function (b) {
+            b && b.dismissPopupContent && b.dismissPopupContent();
+          });
+      });
+      a.Chart.prototype.dismissPopupContent = function () {
+        var b = this;
+        e(this, "dismissPopupContent", {}, function () {
+          b.tooltip && b.tooltip.hide(0);
+          b.hideExportMenu();
+        });
+      };
+      n.prototype = {
+        init: function (b, c) {
+          var a = this,
+            d = (this.eventProvider = new m());
+          this.chart = b;
+          this.components = c;
+          this.modules = [];
+          this.currentModuleIx = 0;
+          this.update();
+          d.addEvent(this.tabindexContainer, "keydown", function (b) {
+            return a.onKeydown(b);
+          });
+          d.addEvent(this.tabindexContainer, "focus", function (b) {
+            return a.onFocus(b);
+          });
+          ["mouseup", "touchend"].forEach(function (b) {
+            return d.addEvent(g, b, function () {
+              return a.onMouseUp();
+            });
+          });
+          ["mousedown", "touchstart"].forEach(function (c) {
+            return d.addEvent(b.renderTo, c, function () {
+              a.isClickingChart = !0;
+            });
+          });
+          d.addEvent(b.renderTo, "mouseover", function () {
+            a.pointerIsOverChart = !0;
+          });
+          d.addEvent(b.renderTo, "mouseout", function () {
+            a.pointerIsOverChart = !1;
+          });
+          this.modules.length && this.modules[0].init(1);
+        },
+        update: function (b) {
+          var c = this.chart.options.accessibility;
+          c = c && c.keyboardNavigation;
+          var a = this.components;
+          this.updateContainerTabindex();
+          c && c.enabled && b && b.length
+            ? ((this.modules = b.reduce(function (b, c) {
+                c = a[c].getKeyboardNavigation();
+                return b.concat(c);
+              }, [])),
+              this.updateExitAnchor())
+            : ((this.modules = []),
+              (this.currentModuleIx = 0),
+              this.removeExitAnchor());
+        },
+        onFocus: function (b) {
+          var c,
+            a = this.chart;
+          b = b.relatedTarget && a.container.contains(b.relatedTarget);
+          this.isClickingChart ||
+            b ||
+            (null === (c = this.modules[0]) || void 0 === c
+              ? void 0
+              : c.init(1));
+        },
+        onMouseUp: function () {
+          delete this.isClickingChart;
+          if (!this.keyboardReset && !this.pointerIsOverChart) {
+            var b = this.chart,
+              c = this.modules && this.modules[this.currentModuleIx || 0];
+            c && c.terminate && c.terminate();
+            b.focusElement && b.focusElement.removeFocusBorder();
+            this.currentModuleIx = 0;
+            this.keyboardReset = !0;
+          }
+        },
+        onKeydown: function (b) {
+          b = b || h.event;
+          var c,
+            a =
+              this.modules &&
+              this.modules.length &&
+              this.modules[this.currentModuleIx];
+          this.keyboardReset = !1;
+          if (a) {
+            var d = a.run(b);
+            d === a.response.success
+              ? (c = !0)
+              : d === a.response.prev
+              ? (c = this.prev())
+              : d === a.response.next && (c = this.next());
+            c && (b.preventDefault(), b.stopPropagation());
+          }
+        },
+        prev: function () {
+          return this.move(-1);
+        },
+        next: function () {
+          return this.move(1);
+        },
+        move: function (b) {
+          var c = this.modules && this.modules[this.currentModuleIx];
+          c && c.terminate && c.terminate(b);
+          this.chart.focusElement &&
+            this.chart.focusElement.removeFocusBorder();
+          this.currentModuleIx += b;
+          if ((c = this.modules && this.modules[this.currentModuleIx])) {
+            if (c.validate && !c.validate()) return this.move(b);
+            if (c.init) return c.init(b), !0;
+          }
+          this.currentModuleIx = 0;
+          0 < b
+            ? ((this.exiting = !0), this.exitAnchor.focus())
+            : this.tabindexContainer.focus();
+          return !1;
+        },
+        updateExitAnchor: function () {
+          var b = d("highcharts-end-of-chart-marker-" + this.chart.index);
+          this.removeExitAnchor();
+          b
+            ? (this.makeElementAnExitAnchor(b), (this.exitAnchor = b))
+            : this.createExitAnchor();
+        },
+        updateContainerTabindex: function () {
+          var b = this.chart.options.accessibility;
+          b = b && b.keyboardNavigation;
+          b = !(b && !1 === b.enabled);
+          var c = this.chart,
+            a = c.container;
+          c.renderTo.hasAttribute("tabindex") &&
+            (a.removeAttribute("tabindex"), (a = c.renderTo));
+          this.tabindexContainer = a;
+          var d = a.getAttribute("tabindex");
+          b && !d
+            ? a.setAttribute("tabindex", "0")
+            : b || c.container.removeAttribute("tabindex");
+        },
+        makeElementAnExitAnchor: function (b) {
+          var c = this.tabindexContainer.getAttribute("tabindex") || 0;
+          b.setAttribute("class", "highcharts-exit-anchor");
+          b.setAttribute("tabindex", c);
+          b.setAttribute("aria-hidden", !1);
+          this.addExitAnchorEventsToEl(b);
+        },
+        createExitAnchor: function () {
+          var b = this.chart,
+            c = (this.exitAnchor = g.createElement("div"));
+          b.renderTo.appendChild(c);
+          this.makeElementAnExitAnchor(c);
+        },
+        removeExitAnchor: function () {
+          this.exitAnchor &&
+            this.exitAnchor.parentNode &&
+            (this.exitAnchor.parentNode.removeChild(this.exitAnchor),
+            delete this.exitAnchor);
+        },
+        addExitAnchorEventsToEl: function (b) {
+          var c = this.chart,
+            a = this;
+          this.eventProvider.addEvent(b, "focus", function (b) {
+            b = b || h.event;
+            (b.relatedTarget && c.container.contains(b.relatedTarget)) ||
+            a.exiting
+              ? (a.exiting = !1)
+              : (a.tabindexContainer.focus(),
+                b.preventDefault(),
+                a.modules &&
+                  a.modules.length &&
+                  ((a.currentModuleIx = a.modules.length - 1),
+                  (b = a.modules[a.currentModuleIx]) &&
+                  b.validate &&
+                  !b.validate()
+                    ? a.prev()
+                    : b && b.init(-1)));
+          });
+        },
+        destroy: function () {
+          this.removeExitAnchor();
+          this.eventProvider.removeAddedEvents();
+          this.chart.container.removeAttribute("tabindex");
+        },
+      };
+      return n;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/LegendComponent.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Legend.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+    ],
+    function (a, f, l, m, n, g) {
+      function h(b) {
+        var c = b.legend && b.legend.allItems,
+          a = b.options.legend.accessibility || {};
+        return !(
+          !c ||
+          !c.length ||
+          (b.colorAxis && b.colorAxis.length) ||
+          !1 === a.enabled
+        );
+      }
+      var q = l.addEvent,
+        e = l.extend,
+        d = l.find,
+        b = l.fireEvent,
+        c = g.stripHTMLTagsFromString,
+        k = g.removeElement;
+      a.Chart.prototype.highlightLegendItem = function (c) {
+        var a = this.legend.allItems,
+          d = this.highlightedLegendItemIx;
+        if (a[c]) {
+          a[d] && b(a[d].legendGroup.element, "mouseout");
+          d = this.legend;
+          var k = d.allItems[c].pageIx,
+            t = d.currentPage;
+          "undefined" !== typeof k && k + 1 !== t && d.scroll(1 + k - t);
+          this.setFocusToElement(a[c].legendItem, a[c].a11yProxyElement);
+          b(a[c].legendGroup.element, "mouseover");
+          return !0;
+        }
+        return !1;
+      };
+      q(f, "afterColorizeItem", function (b) {
+        var c = b.item;
+        this.chart.options.accessibility.enabled &&
+          c &&
+          c.a11yProxyElement &&
+          c.a11yProxyElement.setAttribute(
+            "aria-pressed",
+            b.visible ? "false" : "true"
+          );
+      });
+      a = function () {};
+      a.prototype = new m();
+      e(a.prototype, {
+        init: function () {
+          var b = this;
+          this.proxyElementsList = [];
+          this.recreateProxies();
+          this.addEvent(f, "afterScroll", function () {
+            this.chart === b.chart &&
+              (b.updateProxiesPositions(),
+              b.updateLegendItemProxyVisibility(),
+              this.chart.highlightLegendItem(b.highlightedLegendItemIx));
+          });
+          this.addEvent(f, "afterPositionItem", function (c) {
+            this.chart === b.chart &&
+              this.chart.renderer &&
+              b.updateProxyPositionForItem(c.item);
+          });
+        },
+        updateLegendItemProxyVisibility: function () {
+          var b = this.chart.legend,
+            c = b.currentPage || 1,
+            a = b.clipHeight || 0;
+          (b.allItems || []).forEach(function (d) {
+            var k = d.pageIx || 0,
+              t = d._legendItemPos ? d._legendItemPos[1] : 0,
+              e = d.legendItem ? Math.round(d.legendItem.getBBox().height) : 0;
+            k = t + e - b.pages[k] > a || k !== c - 1;
+            d.a11yProxyElement &&
+              (d.a11yProxyElement.style.visibility = k ? "hidden" : "visible");
+          });
+        },
+        onChartRender: function () {
+          h(this.chart) ? this.updateProxiesPositions() : this.removeProxies();
+        },
+        updateProxiesPositions: function () {
+          for (var b = 0, c = this.proxyElementsList; b < c.length; b++) {
+            var a = c[b];
+            this.updateProxyButtonPosition(a.element, a.posElement);
+          }
+        },
+        updateProxyPositionForItem: function (b) {
+          var c = d(this.proxyElementsList, function (c) {
+            return c.item === b;
+          });
+          c && this.updateProxyButtonPosition(c.element, c.posElement);
+        },
+        recreateProxies: function () {
+          this.removeProxies();
+          h(this.chart) &&
+            (this.addLegendProxyGroup(),
+            this.proxyLegendItems(),
+            this.updateLegendItemProxyVisibility());
+        },
+        removeProxies: function () {
+          k(this.legendProxyGroup);
+          this.proxyElementsList = [];
+        },
+        addLegendProxyGroup: function () {
+          var b = this.chart.options.accessibility,
+            c = this.chart.langFormat("accessibility.legend.legendLabel", {});
+          this.legendProxyGroup = this.addProxyGroup({
+            "aria-label": c,
+            role: "all" === b.landmarkVerbosity ? "region" : null,
+          });
+        },
+        proxyLegendItems: function () {
+          var b = this;
+          ((this.chart.legend && this.chart.legend.allItems) || []).forEach(
+            function (c) {
+              c.legendItem && c.legendItem.element && b.proxyLegendItem(c);
+            }
+          );
+        },
+        proxyLegendItem: function (b) {
+          if (b.legendItem && b.legendGroup) {
+            var a = this.chart.langFormat("accessibility.legend.legendItem", {
+                chart: this.chart,
+                itemName: c(b.name),
+              }),
+              d = b.legendGroup.div ? b.legendItem : b.legendGroup;
+            b.a11yProxyElement = this.createProxyButton(
+              b.legendItem,
+              this.legendProxyGroup,
+              { tabindex: -1, "aria-pressed": !b.visible, "aria-label": a },
+              d
+            );
+            this.proxyElementsList.push({
+              item: b,
+              element: b.a11yProxyElement,
+              posElement: d,
+            });
+          }
+        },
+        getKeyboardNavigation: function () {
+          var b = this.keyCodes,
+            c = this;
+          return new n(this.chart, {
+            keyCodeMap: [
+              [
+                [b.left, b.right, b.up, b.down],
+                function (b) {
+                  return c.onKbdArrowKey(this, b);
+                },
+              ],
+              [
+                [b.enter, b.space],
+                function () {
+                  return c.onKbdClick(this);
+                },
+              ],
+            ],
+            validate: function () {
+              return c.shouldHaveLegendNavigation();
+            },
+            init: function (b) {
+              return c.onKbdNavigationInit(b);
+            },
+          });
+        },
+        onKbdArrowKey: function (b, c) {
+          var a = this.keyCodes,
+            d = b.response,
+            k = this.chart,
+            e = k.options.accessibility,
+            t = k.legend.allItems.length;
+          c = c === a.left || c === a.up ? -1 : 1;
+          return k.highlightLegendItem(this.highlightedLegendItemIx + c)
+            ? ((this.highlightedLegendItemIx += c), d.success)
+            : 1 < t && e.keyboardNavigation.wrapAround
+            ? (b.init(c), d.success)
+            : d[0 < c ? "next" : "prev"];
+        },
+        onKbdClick: function (c) {
+          var a = this.chart.legend.allItems[this.highlightedLegendItemIx];
+          a && a.a11yProxyElement && b(a.a11yProxyElement, "click");
+          return c.response.success;
+        },
+        shouldHaveLegendNavigation: function () {
+          var b = this.chart,
+            c = b.colorAxis && b.colorAxis.length,
+            a = (b.options.legend || {}).accessibility || {};
+          return !!(
+            b.legend &&
+            b.legend.allItems &&
+            b.legend.display &&
+            !c &&
+            a.enabled &&
+            a.keyboardNavigation &&
+            a.keyboardNavigation.enabled
+          );
+        },
+        onKbdNavigationInit: function (b) {
+          var c = this.chart,
+            a = c.legend.allItems.length - 1;
+          b = 0 < b ? 0 : a;
+          c.highlightLegendItem(b);
+          this.highlightedLegendItemIx = b;
+        },
+      });
+      return a;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/MenuComponent.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+    ],
+    function (a, f, l, m, n, g) {
+      function h(b) {
+        return b.exportSVGElements && b.exportSVGElements[0];
+      }
+      f = f.extend;
+      var q = n.unhideChartElementFromAT,
+        e = g.removeElement,
+        d = g.getFakeMouseEvent;
+      a.Chart.prototype.showExportMenu = function () {
+        var b = h(this);
+        if (b && ((b = b.element), b.onclick)) b.onclick(d("click"));
+      };
+      a.Chart.prototype.hideExportMenu = function () {
+        var b = this.exportDivElements;
+        b &&
+          this.exportContextMenu &&
+          (b.forEach(function (b) {
+            if ("highcharts-menu-item" === b.className && b.onmouseout)
+              b.onmouseout(d("mouseout"));
+          }),
+          (this.highlightedExportItemIx = 0),
+          this.exportContextMenu.hideMenu(),
+          this.container.focus());
+      };
+      a.Chart.prototype.highlightExportItem = function (b) {
+        var c = this.exportDivElements && this.exportDivElements[b],
+          a =
+            this.exportDivElements &&
+            this.exportDivElements[this.highlightedExportItemIx];
+        if (c && "LI" === c.tagName && (!c.children || !c.children.length)) {
+          var e = !!(this.renderTo.getElementsByTagName("g")[0] || {}).focus;
+          c.focus && e && c.focus();
+          if (a && a.onmouseout) a.onmouseout(d("mouseout"));
+          if (c.onmouseover) c.onmouseover(d("mouseover"));
+          this.highlightedExportItemIx = b;
+          return !0;
+        }
+        return !1;
+      };
+      a.Chart.prototype.highlightLastExportItem = function () {
+        var b;
+        if (this.exportDivElements)
+          for (b = this.exportDivElements.length; b--; )
+            if (this.highlightExportItem(b)) return !0;
+        return !1;
+      };
+      a = function () {};
+      a.prototype = new l();
+      f(a.prototype, {
+        init: function () {
+          var b = this.chart,
+            c = this;
+          this.addEvent(b, "exportMenuShown", function () {
+            c.onMenuShown();
+          });
+          this.addEvent(b, "exportMenuHidden", function () {
+            c.onMenuHidden();
+          });
+        },
+        onMenuHidden: function () {
+          var b = this.chart.exportContextMenu;
+          b && b.setAttribute("aria-hidden", "true");
+          this.isExportMenuShown = !1;
+          this.setExportButtonExpandedState("false");
+        },
+        onMenuShown: function () {
+          var b = this.chart,
+            c = b.exportContextMenu;
+          c && (this.addAccessibleContextMenuAttribs(), q(b, c));
+          this.isExportMenuShown = !0;
+          this.setExportButtonExpandedState("true");
+        },
+        setExportButtonExpandedState: function (b) {
+          var c = this.exportButtonProxy;
+          c && c.setAttribute("aria-expanded", b);
+        },
+        onChartRender: function () {
+          var b = this.chart,
+            c = b.options.accessibility;
+          e(this.exportProxyGroup);
+          var a = b.options.exporting,
+            d = h(b);
+          a &&
+            !1 !== a.enabled &&
+            a.accessibility &&
+            a.accessibility.enabled &&
+            d &&
+            d.element &&
+            ((this.exportProxyGroup = this.addProxyGroup(
+              "all" === c.landmarkVerbosity
+                ? {
+                    "aria-label": b.langFormat(
+                      "accessibility.exporting.exportRegionLabel",
+                      { chart: b }
+                    ),
+                    role: "region",
+                  }
+                : {}
+            )),
+            (c = h(this.chart)),
+            (this.exportButtonProxy = this.createProxyButton(
+              c,
+              this.exportProxyGroup,
+              {
+                "aria-label": b.langFormat(
+                  "accessibility.exporting.menuButtonLabel",
+                  { chart: b }
+                ),
+                "aria-expanded": "false",
+              }
+            )));
+        },
+        addAccessibleContextMenuAttribs: function () {
+          var b = this.chart,
+            c = b.exportDivElements;
+          c &&
+            c.length &&
+            (c.forEach(function (b) {
+              "LI" !== b.tagName || (b.children && b.children.length)
+                ? b.setAttribute("aria-hidden", "true")
+                : b.setAttribute("tabindex", -1);
+            }),
+            (c = c[0].parentNode),
+            c.removeAttribute("aria-hidden"),
+            c.setAttribute(
+              "aria-label",
+              b.langFormat("accessibility.exporting.chartMenuLabel", {
+                chart: b,
+              })
+            ));
+        },
+        getKeyboardNavigation: function () {
+          var b = this.keyCodes,
+            c = this.chart,
+            a = this;
+          return new m(c, {
+            keyCodeMap: [
+              [
+                [b.left, b.up],
+                function () {
+                  return a.onKbdPrevious(this);
+                },
+              ],
+              [
+                [b.right, b.down],
+                function () {
+                  return a.onKbdNext(this);
+                },
+              ],
+              [
+                [b.enter, b.space],
+                function () {
+                  return a.onKbdClick(this);
+                },
+              ],
+            ],
+            validate: function () {
+              return (
+                c.exportChart &&
+                !1 !== c.options.exporting.enabled &&
+                !1 !== c.options.exporting.accessibility.enabled
+              );
+            },
+            init: function () {
+              var b = a.exportButtonProxy,
+                d = c.exportingGroup;
+              d && b && c.setFocusToElement(d, b);
+            },
+            terminate: function () {
+              c.hideExportMenu();
+            },
+          });
+        },
+        onKbdPrevious: function (b) {
+          var c = this.chart,
+            a = c.options.accessibility;
+          b = b.response;
+          for (var d = c.highlightedExportItemIx || 0; d--; )
+            if (c.highlightExportItem(d)) return b.success;
+          return a.keyboardNavigation.wrapAround
+            ? (c.highlightLastExportItem(), b.success)
+            : b.prev;
+        },
+        onKbdNext: function (b) {
+          var c = this.chart,
+            a = c.options.accessibility;
+          b = b.response;
+          for (
+            var d = (c.highlightedExportItemIx || 0) + 1;
+            d < c.exportDivElements.length;
+            ++d
+          )
+            if (c.highlightExportItem(d)) return b.success;
+          return a.keyboardNavigation.wrapAround
+            ? (c.highlightExportItem(0), b.success)
+            : b.next;
+        },
+        onKbdClick: function (b) {
+          var c = this.chart,
+            a = c.exportDivElements[c.highlightedExportItemIx],
+            d = h(c).element;
+          this.isExportMenuShown
+            ? this.fakeClickEvent(a)
+            : (this.fakeClickEvent(d), c.highlightExportItem(0));
+          return b.response.success;
+        },
+      });
+      return a;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js",
+    [
+      a["Core/Series/Series.js"],
+      a["Core/Series/CartesianSeries.js"],
+      a["Core/Chart/Chart.js"],
+      a["Core/Series/Point.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Accessibility/Utils/EventProvider.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+    ],
+    function (a, f, l, m, n, g, h, q) {
+      function e(b) {
+        var c = b.index,
+          a = b.series.points,
+          d = a.length;
+        if (a[c] !== b)
+          for (; d--; ) {
+            if (a[d] === b) return d;
+          }
+        else return c;
+      }
+      function d(b) {
+        var c =
+            b.chart.options.accessibility.keyboardNavigation.seriesNavigation,
+          a = b.options.accessibility || {},
+          d = a.keyboardNavigation;
+        return (
+          (d && !1 === d.enabled) ||
+          !1 === a.enabled ||
+          !1 === b.options.enableMouseTracking ||
+          !b.visible ||
+          (c.pointNavigationEnabledThreshold &&
+            c.pointNavigationEnabledThreshold <= b.points.length)
+        );
+      }
+      function b(b) {
+        var c = b.series.chart.options.accessibility;
+        return (
+          (b.isNull && c.keyboardNavigation.seriesNavigation.skipNullPoints) ||
+          !1 === b.visible ||
+          d(b.series)
+        );
+      }
+      function c(b, c, a, d) {
+        var r = Infinity,
+          e = c.points.length,
+          k = function (b) {
+            return !(w(b.plotX) && w(b.plotY));
+          };
+        if (!k(b)) {
+          for (; e--; ) {
+            var g = c.points[e];
+            if (
+              !k(g) &&
+              ((g =
+                (b.plotX - g.plotX) * (b.plotX - g.plotX) * (a || 1) +
+                (b.plotY - g.plotY) * (b.plotY - g.plotY) * (d || 1)),
+              g < r)
+            ) {
+              r = g;
+              var h = e;
+            }
+          }
+          return w(h) ? c.points[h] : void 0;
+        }
+      }
+      function k(b) {
+        var c = !1;
+        delete b.highlightedPoint;
+        return (c = b.series.reduce(function (b, c) {
+          return b || c.highlightFirstValidPoint();
+        }, !1));
+      }
+      function t(b, c) {
+        this.keyCodes = c;
+        this.chart = b;
+      }
+      var v = a.seriesTypes,
+        w = n.defined;
+      a = n.extend;
+      var u = q.getPointFromXY,
+        A = q.getSeriesFromName,
+        p = q.scrollToPoint;
+      f.prototype.keyboardMoveVertical = !0;
+      ["column", "pie"].forEach(function (b) {
+        v[b] && (v[b].prototype.keyboardMoveVertical = !1);
+      });
+      m.prototype.highlight = function () {
+        var b = this.series.chart;
+        if (this.isNull) b.tooltip && b.tooltip.hide(0);
+        else this.onMouseOver();
+        p(this);
+        this.graphic && b.setFocusToElement(this.graphic);
+        b.highlightedPoint = this;
+        return this;
+      };
+      l.prototype.highlightAdjacentPoint = function (c) {
+        var a = this.series,
+          k = this.highlightedPoint,
+          r = (k && e(k)) || 0,
+          g = k && k.series.points,
+          h = this.series && this.series[this.series.length - 1];
+        h = h && h.points && h.points[h.points.length - 1];
+        if (!a[0] || !a[0].points) return !1;
+        if (k) {
+          if (
+            ((a = a[k.series.index + (c ? 1 : -1)]),
+            (r = g[r + (c ? 1 : -1)]),
+            !r && a && (r = a.points[c ? 0 : a.points.length - 1]),
+            !r)
+          )
+            return !1;
+        } else r = c ? a[0].points[0] : h;
+        return b(r)
+          ? ((a = r.series),
+            d(a)
+              ? (this.highlightedPoint = c
+                  ? a.points[a.points.length - 1]
+                  : a.points[0])
+              : (this.highlightedPoint = r),
+            this.highlightAdjacentPoint(c))
+          : r.highlight();
+      };
+      f.prototype.highlightFirstValidPoint = function () {
+        var c = this.chart.highlightedPoint,
+          a = (c && c.series) === this ? e(c) : 0;
+        c = this.points;
+        var d = c.length;
+        if (c && d) {
+          for (var r = a; r < d; ++r) if (!b(c[r])) return c[r].highlight();
+          for (; 0 <= a; --a) if (!b(c[a])) return c[a].highlight();
+        }
+        return !1;
+      };
+      l.prototype.highlightAdjacentSeries = function (b) {
+        var a,
+          k = this.highlightedPoint;
+        var r =
+          (a = this.series && this.series[this.series.length - 1]) &&
+          a.points &&
+          a.points[a.points.length - 1];
+        if (!this.highlightedPoint)
+          return (
+            (a = b ? this.series && this.series[0] : a),
+            (r = b ? a && a.points && a.points[0] : r) ? r.highlight() : !1
+          );
+        a = this.series[k.series.index + (b ? -1 : 1)];
+        if (!a) return !1;
+        r = c(k, a, 4);
+        if (!r) return !1;
+        if (d(a))
+          return (
+            r.highlight(),
+            (b = this.highlightAdjacentSeries(b)),
+            b ? b : (k.highlight(), !1)
+          );
+        r.highlight();
+        return r.series.highlightFirstValidPoint();
+      };
+      l.prototype.highlightAdjacentPointVertical = function (c) {
+        var a = this.highlightedPoint,
+          k = Infinity,
+          r;
+        if (!w(a.plotX) || !w(a.plotY)) return !1;
+        this.series.forEach(function (e) {
+          d(e) ||
+            e.points.forEach(function (d) {
+              if (w(d.plotY) && w(d.plotX) && d !== a) {
+                var g = d.plotY - a.plotY,
+                  h = Math.abs(d.plotX - a.plotX);
+                h = Math.abs(g) * Math.abs(g) + h * h * 4;
+                e.yAxis && e.yAxis.reversed && (g *= -1);
+                !((0 >= g && c) || (0 <= g && !c) || 5 > h || b(d)) &&
+                  h < k &&
+                  ((k = h), (r = d));
+              }
+            });
+        });
+        return r ? r.highlight() : !1;
+      };
+      a(t.prototype, {
+        init: function () {
+          var b = this,
+            c = this.chart,
+            a = (this.eventProvider = new h());
+          a.addEvent(f, "destroy", function () {
+            return b.onSeriesDestroy(this);
+          });
+          a.addEvent(c, "afterDrilldown", function () {
+            k(this);
+            this.focusElement && this.focusElement.removeFocusBorder();
+          });
+          a.addEvent(c, "drilldown", function (c) {
+            c = c.point;
+            var a = c.series;
+            b.lastDrilledDownPoint = {
+              x: c.x,
+              y: c.y,
+              seriesName: a ? a.name : "",
+            };
+          });
+          a.addEvent(c, "drillupall", function () {
+            setTimeout(function () {
+              b.onDrillupAll();
+            }, 10);
+          });
+        },
+        onDrillupAll: function () {
+          var b = this.lastDrilledDownPoint,
+            c = this.chart,
+            a = b && A(c, b.seriesName),
+            d;
+          b && a && w(b.x) && w(b.y) && (d = u(a, b.x, b.y));
+          c.container && c.container.focus();
+          d && d.highlight && d.highlight();
+          c.focusElement && c.focusElement.removeFocusBorder();
+        },
+        getKeyboardNavigationHandler: function () {
+          var b = this,
+            c = this.keyCodes,
+            a = this.chart,
+            d = a.inverted;
+          return new g(a, {
+            keyCodeMap: [
+              [
+                d ? [c.up, c.down] : [c.left, c.right],
+                function (c) {
+                  return b.onKbdSideways(this, c);
+                },
+              ],
+              [
+                d ? [c.left, c.right] : [c.up, c.down],
+                function (c) {
+                  return b.onKbdVertical(this, c);
+                },
+              ],
+              [
+                [c.enter, c.space],
+                function () {
+                  a.highlightedPoint &&
+                    a.highlightedPoint.firePointEvent("click");
+                  return this.response.success;
+                },
+              ],
+            ],
+            init: function (c) {
+              return b.onHandlerInit(this, c);
+            },
+            terminate: function () {
+              return b.onHandlerTerminate();
+            },
+          });
+        },
+        onKbdSideways: function (b, c) {
+          var a = this.keyCodes;
+          return this.attemptHighlightAdjacentPoint(
+            b,
+            c === a.right || c === a.down
+          );
+        },
+        onKbdVertical: function (b, c) {
+          var a = this.chart,
+            d = this.keyCodes;
+          c = c === d.down || c === d.right;
+          d = a.options.accessibility.keyboardNavigation.seriesNavigation;
+          if (d.mode && "serialize" === d.mode)
+            return this.attemptHighlightAdjacentPoint(b, c);
+          a[
+            a.highlightedPoint && a.highlightedPoint.series.keyboardMoveVertical
+              ? "highlightAdjacentPointVertical"
+              : "highlightAdjacentSeries"
+          ](c);
+          return b.response.success;
+        },
+        onHandlerInit: function (b, c) {
+          var a = this.chart;
+          if (0 < c) k(a);
+          else {
+            c = a.series.length;
+            for (
+              var d;
+              c-- &&
+              !((a.highlightedPoint =
+                a.series[c].points[a.series[c].points.length - 1]),
+              (d = a.series[c].highlightFirstValidPoint()));
+
+            );
+          }
+          return b.response.success;
+        },
+        onHandlerTerminate: function () {
+          var b,
+            c,
+            a = this.chart,
+            d = a.highlightedPoint;
+          null === (b = a.tooltip) || void 0 === b ? void 0 : b.hide(0);
+          null === (c = null === d || void 0 === d ? void 0 : d.onMouseOut) ||
+          void 0 === c
+            ? void 0
+            : c.call(d);
+          delete a.highlightedPoint;
+        },
+        attemptHighlightAdjacentPoint: function (b, c) {
+          var a = this.chart,
+            d = a.options.accessibility.keyboardNavigation.wrapAround;
+          return a.highlightAdjacentPoint(c)
+            ? b.response.success
+            : d
+            ? b.init(c ? 1 : -1)
+            : b.response[c ? "next" : "prev"];
+        },
+        onSeriesDestroy: function (b) {
+          var c = this.chart;
+          c.highlightedPoint &&
+            c.highlightedPoint.series === b &&
+            (delete c.highlightedPoint,
+            c.focusElement && c.focusElement.removeFocusBorder());
+        },
+        destroy: function () {
+          this.eventProvider.removeAddedEvents();
+        },
+      });
+      return t;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/AnnotationsA11y.js",
+    [a["Accessibility/Utils/HTMLUtilities.js"]],
+    function (a) {
+      function f(a) {
+        return (a.annotations || []).reduce(function (a, d) {
+          var b;
+          !1 !==
+            (null === (b = d.options) || void 0 === b ? void 0 : b.visible) &&
+            (a = a.concat(d.labels));
+          return a;
+        }, []);
+      }
+      function l(a) {
+        var e,
+          d,
+          b,
+          c,
+          k =
+            null ===
+              (d =
+                null === (e = a.options) || void 0 === e
+                  ? void 0
+                  : e.accessibility) || void 0 === d
+              ? void 0
+              : d.description;
+        return k
+          ? k
+          : (null ===
+              (c =
+                null === (b = a.graphic) || void 0 === b ? void 0 : b.text) ||
+            void 0 === c
+              ? void 0
+              : c.textStr) || "";
+      }
+      function m(a) {
+        var e,
+          d,
+          b =
+            null ===
+              (d =
+                null === (e = a.options) || void 0 === e
+                  ? void 0
+                  : e.accessibility) || void 0 === d
+              ? void 0
+              : d.description;
+        if (b) return b;
+        e = a.chart;
+        d = l(a);
+        b = a.points
+          .filter(function (b) {
+            return !!b.graphic;
+          })
+          .map(function (b) {
+            var c, a;
+            if (
+              !(a =
+                null ===
+                  (c = null === b || void 0 === b ? void 0 : b.accessibility) ||
+                void 0 === c
+                  ? void 0
+                  : c.valueDescription)
+            ) {
+              var d, e;
+              a =
+                (null ===
+                  (e =
+                    null ===
+                      (d = null === b || void 0 === b ? void 0 : b.graphic) ||
+                    void 0 === d
+                      ? void 0
+                      : d.element) || void 0 === e
+                  ? void 0
+                  : e.getAttribute("aria-label")) || "";
+            }
+            b = (null === b || void 0 === b ? void 0 : b.series.name) || "";
+            return (b ? b + ", " : "") + "data point " + a;
+          })
+          .filter(function (b) {
+            return !!b;
+          });
+        var c = b.length;
+        a =
+          "accessibility.screenReaderSection.annotations.description" +
+          (1 < c ? "MultiplePoints" : c ? "SinglePoint" : "NoPoints");
+        d = {
+          annotationText: d,
+          numPoints: c,
+          annotationPoint: b[0],
+          additionalAnnotationPoints: b.slice(1),
+        };
+        return e.langFormat(a, d);
+      }
+      function n(a) {
+        return f(a).map(function (a) {
+          return (a = g(h(m(a)))) ? "<li>" + a + "</li>" : "";
+        });
+      }
+      var g = a.escapeStringForHTML,
+        h = a.stripHTMLTagsFromString;
+      return {
+        getAnnotationsInfoHTML: function (a) {
+          var e = a.annotations;
+          return e && e.length ? "<ul>" + n(a).join(" ") + "</ul>" : "";
+        },
+        getAnnotationLabelDescription: m,
+        getAnnotationListItems: n,
+        getPointAnnotationTexts: function (a) {
+          var e = f(a.series.chart).filter(function (d) {
+            return -1 < d.points.indexOf(a);
+          });
+          return e.length
+            ? e.map(function (a) {
+                return "" + l(a);
+              })
+            : [];
+        },
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/SeriesComponent/SeriesDescriber.js",
+    [
+      a["Accessibility/Components/AnnotationsA11y.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Core/Tooltip.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m, n) {
+      function g(b) {
+        var c = b.index;
+        return b.series && b.series.data && G(c)
+          ? K(b.series.data, function (b) {
+              return !!(
+                b &&
+                "undefined" !== typeof b.index &&
+                b.index > c &&
+                b.graphic &&
+                b.graphic.element
+              );
+            }) || null
+          : null;
+      }
+      function h(b) {
+        var c =
+          b.chart.options.accessibility.series.pointDescriptionEnabledThreshold;
+        return !!(!1 !== c && b.points && b.points.length >= c);
+      }
+      function q(b) {
+        var c = b.options.accessibility || {};
+        return !h(b) && !c.exposeAsGroupOnly;
+      }
+      function e(b) {
+        var c =
+          b.chart.options.accessibility.keyboardNavigation.seriesNavigation;
+        return !(
+          !b.points ||
+          !(
+            b.points.length < c.pointNavigationEnabledThreshold ||
+            !1 === c.pointNavigationEnabledThreshold
+          )
+        );
+      }
+      function d(b, c) {
+        var a = b.series.chart,
+          d = a.options.accessibility.point || {};
+        b = b.series.tooltipOptions || {};
+        a = a.options.lang;
+        return L(c)
+          ? M(
+              c,
+              d.valueDecimals || b.valueDecimals || -1,
+              a.decimalPoint,
+              a.accessibility.thousandsSep || a.thousandsSep
+            )
+          : c;
+      }
+      function b(b) {
+        var c = (b.options.accessibility || {}).description;
+        return (
+          (c &&
+            b.chart.langFormat("accessibility.series.description", {
+              description: c,
+              series: b,
+            })) ||
+          ""
+        );
+      }
+      function c(b, c) {
+        return b.chart.langFormat("accessibility.series." + c + "Description", {
+          name: x(b[c]),
+          series: b,
+        });
+      }
+      function k(b) {
+        var c = b.series,
+          a = c.chart,
+          d = a.options.accessibility.point || {};
+        if (c.xAxis && c.xAxis.dateTime)
+          return (
+            (c = m.prototype.getXDateFormat.call(
+              { getDateFormat: m.prototype.getDateFormat, chart: a },
+              b,
+              a.options.tooltip,
+              c.xAxis
+            )),
+            (d = (d.dateFormatter && d.dateFormatter(b)) || d.dateFormat || c),
+            a.time.dateFormat(d, b.x, void 0)
+          );
+      }
+      function t(b) {
+        var c = k(b),
+          a =
+            (b.series.xAxis || {}).categories &&
+            G(b.category) &&
+            ("" + b.category).replace("<br/>", " "),
+          d = b.id && 0 > b.id.indexOf("highcharts-"),
+          e = "x, " + b.x;
+        return b.name || c || a || (d ? b.id : e);
+      }
+      function v(b, c, a) {
+        var e = c || "",
+          k = a || "";
+        return b.series.pointArrayMap.reduce(function (c, a) {
+          c += c.length ? ", " : "";
+          var r = d(b, C(b[a], b.options[a]));
+          return c + (a + ": " + e + r + k);
+        }, "");
+      }
+      function w(b) {
+        var c = b.series,
+          a = c.chart.options.accessibility.point || {},
+          e = c.tooltipOptions || {},
+          k = a.valuePrefix || e.valuePrefix || "";
+        a = a.valueSuffix || e.valueSuffix || "";
+        e = d(b, b["undefined" !== typeof b.value ? "value" : "y"]);
+        return b.isNull
+          ? c.chart.langFormat("accessibility.series.nullPointValue", {
+              point: b,
+            })
+          : c.pointArrayMap
+          ? v(b, k, a)
+          : k + e + a;
+      }
+      function u(b) {
+        var c = b.series,
+          a = c.chart,
+          d = a.options.accessibility.point.valueDescriptionFormat,
+          e = (c = C(
+            c.xAxis &&
+              c.xAxis.options.accessibility &&
+              c.xAxis.options.accessibility.enabled,
+            !a.angular
+          ))
+            ? t(b)
+            : "";
+        b = {
+          point: b,
+          index: G(b.index) ? b.index + 1 : "",
+          xDescription: e,
+          value: w(b),
+          separator: c ? ", " : "",
+        };
+        return N(d, b, a);
+      }
+      function A(b) {
+        var c = b.series,
+          a = c.chart,
+          d = u(b),
+          e =
+            b.options &&
+            b.options.accessibility &&
+            b.options.accessibility.description;
+        e = e ? " " + e : "";
+        c = 1 < a.series.length && c.name ? " " + c.name + "." : "";
+        a = b.series.chart;
+        var k = z(b),
+          r = { point: b, annotations: k };
+        a = k.length
+          ? a.langFormat("accessibility.series.pointAnnotationsDescription", r)
+          : "";
+        b.accessibility = b.accessibility || {};
+        b.accessibility.valueDescription = d;
+        return d + e + c + (a ? " " + a : "");
+      }
+      function p(b) {
+        var c = q(b),
+          a = e(b);
+        (c || a) &&
+          b.points.forEach(function (b) {
+            var a;
+            if (
+              !(a = b.graphic && b.graphic.element) &&
+              ((a = b.series && b.series.is("sunburst")), (a = b.isNull && !a))
+            ) {
+              var d = b.series,
+                e = g(b);
+              d = (a = e && e.graphic) ? a.parentGroup : d.graph || d.group;
+              e = e
+                ? { x: C(b.plotX, e.plotX, 0), y: C(b.plotY, e.plotY, 0) }
+                : { x: C(b.plotX, 0), y: C(b.plotY, 0) };
+              e = b.series.chart.renderer.rect(e.x, e.y, 1, 1);
+              e.attr({
+                class: "highcharts-a11y-dummy-point",
+                fill: "none",
+                opacity: 0,
+                "fill-opacity": 0,
+                "stroke-opacity": 0,
+              });
+              d && d.element
+                ? ((b.graphic = e),
+                  (b.hasDummyGraphic = !0),
+                  e.add(d),
+                  d.element.insertBefore(e.element, a ? a.element : null),
+                  (a = e.element))
+                : (a = void 0);
+            }
+            a &&
+              (a.setAttribute("tabindex", "-1"),
+              (a.style.outline = "0"),
+              c
+                ? ((e = b.series),
+                  (d = e.chart.options.accessibility.point || {}),
+                  (e = e.options.accessibility || {}),
+                  (b = B(
+                    I(
+                      (e.pointDescriptionFormatter &&
+                        e.pointDescriptionFormatter(b)) ||
+                        (d.descriptionFormatter && d.descriptionFormatter(b)) ||
+                        A(b)
+                    )
+                  )),
+                  a.setAttribute("role", "img"),
+                  a.setAttribute("aria-label", b))
+                : a.setAttribute("aria-hidden", !0));
+          });
+      }
+      function y(a) {
+        var d = a.chart,
+          e = d.types || [],
+          k = b(a),
+          r = function (b) {
+            return d[b] && 1 < d[b].length && a[b];
+          },
+          g = c(a, "xAxis"),
+          h = c(a, "yAxis"),
+          f = {
+            name: a.name || "",
+            ix: a.index + 1,
+            numSeries: d.series && d.series.length,
+            numPoints: a.points && a.points.length,
+            series: a,
+          };
+        e = 1 < e.length ? "Combination" : "";
+        return (
+          (d.langFormat("accessibility.series.summary." + a.type + e, f) ||
+            d.langFormat("accessibility.series.summary.default" + e, f)) +
+          (k ? " " + k : "") +
+          (r("yAxis") ? " " + h : "") +
+          (r("xAxis") ? " " + g : "")
+        );
+      }
+      var z = a.getPointAnnotationTexts,
+        x = f.getAxisDescription,
+        r = f.getSeriesFirstPointElement,
+        J = f.getSeriesA11yElement,
+        F = f.unhideChartElementFromAT,
+        B = l.escapeStringForHTML,
+        E = l.reverseChildNodes,
+        I = l.stripHTMLTagsFromString,
+        K = n.find,
+        N = n.format,
+        L = n.isNumber,
+        M = n.numberFormat,
+        C = n.pick,
+        G = n.defined;
+      return {
+        describeSeries: function (b) {
+          var c = b.chart,
+            a = r(b),
+            d = J(b),
+            e = c.is3d && c.is3d();
+          if (d) {
+            d.lastChild !== a || e || E(d);
+            p(b);
+            F(c, d);
+            e = b.chart;
+            c = e.options.chart || {};
+            a = 1 < e.series.length;
+            e = e.options.accessibility.series.describeSingleSeries;
+            var k = (b.options.accessibility || {}).exposeAsGroupOnly;
+            (c.options3d && c.options3d.enabled && a) || !(a || e || k || h(b))
+              ? d.setAttribute("aria-label", "")
+              : ((c = b.chart.options.accessibility),
+                (a = c.landmarkVerbosity),
+                (b.options.accessibility || {}).exposeAsGroupOnly
+                  ? d.setAttribute("role", "img")
+                  : "all" === a && d.setAttribute("role", "region"),
+                d.setAttribute("tabindex", "-1"),
+                (d.style.outline = "0"),
+                d.setAttribute(
+                  "aria-label",
+                  B(
+                    I(
+                      (c.series.descriptionFormatter &&
+                        c.series.descriptionFormatter(b)) ||
+                        y(b)
+                    )
+                  )
+                ));
+          }
+        },
+        defaultPointDescriptionFormatter: A,
+        defaultSeriesDescriptionFormatter: y,
+        getPointA11yTimeDescription: k,
+        getPointXDescription: t,
+        getPointValue: w,
+        getPointValueDescription: u,
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/Utils/Announcer.js",
+    [
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/DOMElementProvider.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+    ],
+    function (a, f, l) {
+      var m = l.visuallyHideElement;
+      l = (function () {
+        function a(a, h) {
+          this.chart = a;
+          this.domElementProvider = new f();
+          this.announceRegion = this.addAnnounceRegion(h);
+        }
+        a.prototype.destroy = function () {
+          this.domElementProvider.destroyCreatedElements();
+        };
+        a.prototype.announce = function (a) {
+          var g = this;
+          this.announceRegion.innerHTML = a;
+          this.clearAnnouncementRegionTimer &&
+            clearTimeout(this.clearAnnouncementRegionTimer);
+          this.clearAnnouncementRegionTimer = setTimeout(function () {
+            g.announceRegion.innerHTML = "";
+            delete g.clearAnnouncementRegionTimer;
+          }, 1e3);
+        };
+        a.prototype.addAnnounceRegion = function (a) {
+          var g = this.chart.renderTo,
+            f = this.domElementProvider.createElement("div");
+          f.setAttribute("aria-hidden", !1);
+          f.setAttribute("aria-live", a);
+          m(f);
+          g.insertBefore(f, g.firstChild);
+          return f;
+        };
+        return a;
+      })();
+      return (a.Announcer = l);
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/SeriesComponent/NewDataAnnouncer.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Series/CartesianSeries.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Components/SeriesComponent/SeriesDescriber.js"],
+      a["Accessibility/Utils/Announcer.js"],
+      a["Accessibility/Utils/EventProvider.js"],
+    ],
+    function (a, f, l, m, n, g, h) {
+      function q(b) {
+        var c = b.series.data.filter(function (c) {
+          return b.x === c.x && b.y === c.y;
+        });
+        return 1 === c.length ? c[0] : b;
+      }
+      function e(b, c) {
+        var a = (b || []).concat(c || []).reduce(function (b, c) {
+          b[c.name + c.index] = c;
+          return b;
+        }, {});
+        return Object.keys(a).map(function (b) {
+          return a[b];
+        });
+      }
+      var d = l.extend,
+        b = l.defined,
+        c = m.getChartTitle,
+        k = n.defaultPointDescriptionFormatter,
+        t = n.defaultSeriesDescriptionFormatter;
+      l = function (b) {
+        this.chart = b;
+      };
+      d(l.prototype, {
+        init: function () {
+          var b = this.chart,
+            c = b.options.accessibility.announceNewData.interruptUser
+              ? "assertive"
+              : "polite";
+          this.lastAnnouncementTime = 0;
+          this.dirty = { allSeries: {} };
+          this.eventProvider = new h();
+          this.announcer = new g(b, c);
+          this.addEventListeners();
+        },
+        destroy: function () {
+          this.eventProvider.removeAddedEvents();
+          this.announcer.destroy();
+        },
+        addEventListeners: function () {
+          var b = this,
+            c = this.chart,
+            a = this.eventProvider;
+          a.addEvent(c, "afterDrilldown", function () {
+            b.lastAnnouncementTime = 0;
+          });
+          a.addEvent(f, "updatedData", function () {
+            b.onSeriesUpdatedData(this);
+          });
+          a.addEvent(c, "afterAddSeries", function (c) {
+            b.onSeriesAdded(c.series);
+          });
+          a.addEvent(f, "addPoint", function (c) {
+            b.onPointAdded(c.point);
+          });
+          a.addEvent(c, "redraw", function () {
+            b.announceDirtyData();
+          });
+        },
+        onSeriesUpdatedData: function (b) {
+          var c = this.chart;
+          b.chart === c &&
+            c.options.accessibility.announceNewData.enabled &&
+            ((this.dirty.hasDirty = !0),
+            (this.dirty.allSeries[b.name + b.index] = b));
+        },
+        onSeriesAdded: function (c) {
+          this.chart.options.accessibility.announceNewData.enabled &&
+            ((this.dirty.hasDirty = !0),
+            (this.dirty.allSeries[c.name + c.index] = c),
+            (this.dirty.newSeries = b(this.dirty.newSeries) ? void 0 : c));
+        },
+        onPointAdded: function (c) {
+          var a = c.series.chart;
+          this.chart === a &&
+            a.options.accessibility.announceNewData.enabled &&
+            (this.dirty.newPoint = b(this.dirty.newPoint) ? void 0 : c);
+        },
+        announceDirtyData: function () {
+          var b = this;
+          if (
+            this.chart.options.accessibility.announceNewData &&
+            this.dirty.hasDirty
+          ) {
+            var c = this.dirty.newPoint;
+            c && (c = q(c));
+            this.queueAnnouncement(
+              Object.keys(this.dirty.allSeries).map(function (c) {
+                return b.dirty.allSeries[c];
+              }),
+              this.dirty.newSeries,
+              c
+            );
+            this.dirty = { allSeries: {} };
+          }
+        },
+        queueAnnouncement: function (b, c, a) {
+          var d = this,
+            k = this.chart.options.accessibility.announceNewData;
+          if (k.enabled) {
+            var g = +new Date();
+            k = Math.max(
+              0,
+              k.minAnnounceInterval - (g - this.lastAnnouncementTime)
+            );
+            b = e(this.queuedAnnouncement && this.queuedAnnouncement.series, b);
+            if ((c = this.buildAnnouncementMessage(b, c, a)))
+              this.queuedAnnouncement &&
+                clearTimeout(this.queuedAnnouncementTimer),
+                (this.queuedAnnouncement = { time: g, message: c, series: b }),
+                (this.queuedAnnouncementTimer = setTimeout(function () {
+                  d &&
+                    d.announcer &&
+                    ((d.lastAnnouncementTime = +new Date()),
+                    d.announcer.announce(d.queuedAnnouncement.message),
+                    delete d.queuedAnnouncement,
+                    delete d.queuedAnnouncementTimer);
+                }, k));
+          }
+        },
+        buildAnnouncementMessage: function (b, d, e) {
+          var g = this.chart,
+            h = g.options.accessibility.announceNewData;
+          if (
+            h.announcementFormatter &&
+            ((b = h.announcementFormatter(b, d, e)), !1 !== b)
+          )
+            return b.length ? b : null;
+          b = a.charts && 1 < a.charts.length ? "Multiple" : "Single";
+          b = d
+            ? "newSeriesAnnounce" + b
+            : e
+            ? "newPointAnnounce" + b
+            : "newDataAnnounce";
+          h = c(g);
+          return g.langFormat("accessibility.announceNewData." + b, {
+            chartTitle: h,
+            seriesDesc: d ? t(d) : null,
+            pointDesc: e ? k(e) : null,
+            point: e,
+            series: d,
+          });
+        },
+      });
+      return l;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/SeriesComponent/ForcedMarkers.js",
+    [a["Core/Series/CartesianSeries.js"], a["Core/Utilities.js"]],
+    function (a, f) {
+      function l(a) {
+        n(!0, a, {
+          marker: { enabled: !0, states: { normal: { opacity: 0 } } },
+        });
+      }
+      var m = f.addEvent,
+        n = f.merge;
+      return function () {
+        m(a, "render", function () {
+          var a = this.options,
+            h =
+              !1 !==
+              (this.options.accessibility &&
+                this.options.accessibility.enabled);
+          if ((h = this.chart.options.accessibility.enabled && h))
+            (h = this.chart.options.accessibility),
+              (h =
+                this.points.length <
+                  h.series.pointDescriptionEnabledThreshold ||
+                !1 === h.series.pointDescriptionEnabledThreshold);
+          if (h) {
+            if (
+              (a.marker &&
+                !1 === a.marker.enabled &&
+                ((this.a11yMarkersForced = !0), l(this.options)),
+              this._hasPointMarkers && this.points && this.points.length)
+            )
+              for (a = this.points.length; a--; ) {
+                h = this.points[a];
+                var f = h.options;
+                delete h.hasForcedA11yMarker;
+                f.marker &&
+                  (f.marker.enabled
+                    ? (n(!0, f.marker, {
+                        states: {
+                          normal: {
+                            opacity:
+                              (f.marker.states &&
+                                f.marker.states.normal &&
+                                f.marker.states.normal.opacity) ||
+                              1,
+                          },
+                        },
+                      }),
+                      (h.hasForcedA11yMarker = !1))
+                    : (l(f), (h.hasForcedA11yMarker = !0)));
+              }
+          } else this.a11yMarkersForced && (delete this.a11yMarkersForced, (a = this.resetA11yMarkerOptions) && n(!0, this.options, { marker: { enabled: a.enabled, states: { normal: { opacity: a.states && a.states.normal && a.states.normal.opacity } } } }));
+        });
+        m(a, "afterSetOptions", function (a) {
+          this.resetA11yMarkerOptions = n(
+            a.options.marker || {},
+            this.userOptions.marker || {}
+          );
+        });
+        m(a, "afterRender", function () {
+          if (this.chart.styledMode) {
+            if (this.markerGroup)
+              this.markerGroup[
+                this.a11yMarkersForced ? "addClass" : "removeClass"
+              ]("highcharts-a11y-markers-hidden");
+            this._hasPointMarkers &&
+              this.points &&
+              this.points.length &&
+              this.points.forEach(function (a) {
+                a.graphic &&
+                  (a.graphic[
+                    a.hasForcedA11yMarker ? "addClass" : "removeClass"
+                  ]("highcharts-a11y-marker-hidden"),
+                  a.graphic[
+                    !1 === a.hasForcedA11yMarker ? "addClass" : "removeClass"
+                  ]("highcharts-a11y-marker-visible"));
+              });
+          }
+        });
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/SeriesComponent/SeriesComponent.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js"],
+      a["Accessibility/Components/SeriesComponent/NewDataAnnouncer.js"],
+      a["Accessibility/Components/SeriesComponent/ForcedMarkers.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Components/SeriesComponent/SeriesDescriber.js"],
+      a["Core/Tooltip.js"],
+    ],
+    function (a, f, l, m, n, g, h, q, e) {
+      f = f.extend;
+      var d = h.hideSeriesFromAT,
+        b = q.describeSeries;
+      a.SeriesAccessibilityDescriber = q;
+      g();
+      a = function () {};
+      a.prototype = new l();
+      f(a.prototype, {
+        init: function () {
+          this.newDataAnnouncer = new n(this.chart);
+          this.newDataAnnouncer.init();
+          this.keyboardNavigation = new m(this.chart, this.keyCodes);
+          this.keyboardNavigation.init();
+          this.hideTooltipFromATWhenShown();
+          this.hideSeriesLabelsFromATWhenShown();
+        },
+        hideTooltipFromATWhenShown: function () {
+          var b = this;
+          this.addEvent(e, "refresh", function () {
+            this.chart === b.chart &&
+              this.label &&
+              this.label.element &&
+              this.label.element.setAttribute("aria-hidden", !0);
+          });
+        },
+        hideSeriesLabelsFromATWhenShown: function () {
+          this.addEvent(this.chart, "afterDrawSeriesLabels", function () {
+            this.series.forEach(function (b) {
+              b.labelBySeries && b.labelBySeries.attr("aria-hidden", !0);
+            });
+          });
+        },
+        onChartRender: function () {
+          this.chart.series.forEach(function (c) {
+            !1 !==
+              (c.options.accessibility && c.options.accessibility.enabled) &&
+            c.visible
+              ? b(c)
+              : d(c);
+          });
+        },
+        getKeyboardNavigation: function () {
+          return this.keyboardNavigation.getKeyboardNavigationHandler();
+        },
+        destroy: function () {
+          this.newDataAnnouncer.destroy();
+          this.keyboardNavigation.destroy();
+        },
+      });
+      return a;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/ZoomComponent.js",
+    [
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m, n, g) {
+      var h = f.unhideChartElementFromAT;
+      f = l.noop;
+      var q = m.removeElement,
+        e = m.setElAttrs;
+      m = g.extend;
+      var d = g.pick;
+      l.Axis.prototype.panStep = function (b, c) {
+        var a = c || 3;
+        c = this.getExtremes();
+        var d = ((c.max - c.min) / a) * b;
+        a = c.max + d;
+        d = c.min + d;
+        var e = a - d;
+        0 > b && d < c.dataMin
+          ? ((d = c.dataMin), (a = d + e))
+          : 0 < b && a > c.dataMax && ((a = c.dataMax), (d = a - e));
+        this.setExtremes(d, a);
+      };
+      f.prototype = new a();
+      m(f.prototype, {
+        init: function () {
+          var b = this,
+            c = this.chart;
+          ["afterShowResetZoom", "afterDrilldown", "drillupall"].forEach(
+            function (a) {
+              b.addEvent(c, a, function () {
+                b.updateProxyOverlays();
+              });
+            }
+          );
+        },
+        onChartUpdate: function () {
+          var b = this.chart,
+            c = this;
+          b.mapNavButtons &&
+            b.mapNavButtons.forEach(function (a, d) {
+              h(b, a.element);
+              c.setMapNavButtonAttrs(
+                a.element,
+                "accessibility.zoom.mapZoom" + (d ? "Out" : "In")
+              );
+            });
+        },
+        setMapNavButtonAttrs: function (b, c) {
+          var a = this.chart;
+          c = a.langFormat(c, { chart: a });
+          e(b, { tabindex: -1, role: "button", "aria-label": c });
+        },
+        onChartRender: function () {
+          this.updateProxyOverlays();
+        },
+        updateProxyOverlays: function () {
+          var b = this.chart;
+          q(this.drillUpProxyGroup);
+          q(this.resetZoomProxyGroup);
+          b.resetZoomButton &&
+            this.recreateProxyButtonAndGroup(
+              b.resetZoomButton,
+              "resetZoomProxyButton",
+              "resetZoomProxyGroup",
+              b.langFormat("accessibility.zoom.resetZoomButton", { chart: b })
+            );
+          b.drillUpButton &&
+            this.recreateProxyButtonAndGroup(
+              b.drillUpButton,
+              "drillUpProxyButton",
+              "drillUpProxyGroup",
+              b.langFormat("accessibility.drillUpButton", {
+                chart: b,
+                buttonText: b.getDrilldownBackText(),
+              })
+            );
+        },
+        recreateProxyButtonAndGroup: function (b, c, a, d) {
+          q(this[a]);
+          this[a] = this.addProxyGroup();
+          this[c] = this.createProxyButton(b, this[a], {
+            "aria-label": d,
+            tabindex: -1,
+          });
+        },
+        getMapZoomNavigation: function () {
+          var b = this.keyCodes,
+            a = this.chart,
+            d = this;
+          return new n(a, {
+            keyCodeMap: [
+              [
+                [b.up, b.down, b.left, b.right],
+                function (b) {
+                  return d.onMapKbdArrow(this, b);
+                },
+              ],
+              [
+                [b.tab],
+                function (b, a) {
+                  return d.onMapKbdTab(this, a);
+                },
+              ],
+              [
+                [b.space, b.enter],
+                function () {
+                  return d.onMapKbdClick(this);
+                },
+              ],
+            ],
+            validate: function () {
+              return !!(a.mapZoom && a.mapNavButtons && a.mapNavButtons.length);
+            },
+            init: function (b) {
+              return d.onMapNavInit(b);
+            },
+          });
+        },
+        onMapKbdArrow: function (b, a) {
+          var c = this.keyCodes;
+          this.chart[a === c.up || a === c.down ? "yAxis" : "xAxis"][0].panStep(
+            a === c.left || a === c.up ? -1 : 1
+          );
+          return b.response.success;
+        },
+        onMapKbdTab: function (b, a) {
+          var c = this.chart;
+          b = b.response;
+          var d =
+            ((a = a.shiftKey) && !this.focusedMapNavButtonIx) ||
+            (!a && this.focusedMapNavButtonIx);
+          c.mapNavButtons[this.focusedMapNavButtonIx].setState(0);
+          if (d) return c.mapZoom(), b[a ? "prev" : "next"];
+          this.focusedMapNavButtonIx += a ? -1 : 1;
+          a = c.mapNavButtons[this.focusedMapNavButtonIx];
+          c.setFocusToElement(a.box, a.element);
+          a.setState(2);
+          return b.success;
+        },
+        onMapKbdClick: function (b) {
+          this.fakeClickEvent(
+            this.chart.mapNavButtons[this.focusedMapNavButtonIx].element
+          );
+          return b.response.success;
+        },
+        onMapNavInit: function (b) {
+          var a = this.chart,
+            d = a.mapNavButtons[0],
+            e = a.mapNavButtons[1];
+          d = 0 < b ? d : e;
+          a.setFocusToElement(d.box, d.element);
+          d.setState(2);
+          this.focusedMapNavButtonIx = 0 < b ? 0 : 1;
+        },
+        simpleButtonNavigation: function (b, a, e) {
+          var c = this.keyCodes,
+            k = this,
+            g = this.chart;
+          return new n(g, {
+            keyCodeMap: [
+              [
+                [c.tab, c.up, c.down, c.left, c.right],
+                function (b, a) {
+                  return this.response[
+                    (b === c.tab && a.shiftKey) || b === c.left || b === c.up
+                      ? "prev"
+                      : "next"
+                  ];
+                },
+              ],
+              [
+                [c.space, c.enter],
+                function () {
+                  var b = e(this, g);
+                  return d(b, this.response.success);
+                },
+              ],
+            ],
+            validate: function () {
+              return g[b] && g[b].box && k[a];
+            },
+            init: function () {
+              g.setFocusToElement(g[b].box, k[a]);
+            },
+          });
+        },
+        getKeyboardNavigation: function () {
+          return [
+            this.simpleButtonNavigation(
+              "resetZoomButton",
+              "resetZoomProxyButton",
+              function (b, a) {
+                a.zoomOut();
+              }
+            ),
+            this.simpleButtonNavigation(
+              "drillUpButton",
+              "drillUpProxyButton",
+              function (b, a) {
+                a.drillUp();
+                return b.response.prev;
+              }
+            ),
+            this.getMapZoomNavigation(),
+          ];
+        },
+      });
+      return f;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/RangeSelectorComponent.js",
+    [
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m, n, g) {
+      var h = f.unhideChartElementFromAT,
+        q = m.setElAttrs;
+      f = g.extend;
+      l.Chart.prototype.highlightRangeSelectorButton = function (a) {
+        var d = this.rangeSelector.buttons,
+          b = this.highlightedRangeSelectorItemIx;
+        "undefined" !== typeof b &&
+          d[b] &&
+          d[b].setState(this.oldRangeSelectorItemState || 0);
+        this.highlightedRangeSelectorItemIx = a;
+        return d[a]
+          ? (this.setFocusToElement(d[a].box, d[a].element),
+            (this.oldRangeSelectorItemState = d[a].state),
+            d[a].setState(2),
+            !0)
+          : !1;
+      };
+      l = function () {};
+      l.prototype = new a();
+      f(l.prototype, {
+        onChartUpdate: function () {
+          var a = this.chart,
+            d = this,
+            b = a.rangeSelector;
+          b &&
+            (b.buttons &&
+              b.buttons.length &&
+              b.buttons.forEach(function (b) {
+                h(a, b.element);
+                d.setRangeButtonAttrs(b);
+              }),
+            b.maxInput &&
+              b.minInput &&
+              ["minInput", "maxInput"].forEach(function (c, e) {
+                if ((c = b[c]))
+                  h(a, c),
+                    d.setRangeInputAttrs(
+                      c,
+                      "accessibility.rangeSelector." +
+                        (e ? "max" : "min") +
+                        "InputLabel"
+                    );
+              }));
+        },
+        setRangeButtonAttrs: function (a) {
+          var d = this.chart;
+          d = d.langFormat("accessibility.rangeSelector.buttonText", {
+            chart: d,
+            buttonText: a.text && a.text.textStr,
+          });
+          q(a.element, { tabindex: -1, role: "button", "aria-label": d });
+        },
+        setRangeInputAttrs: function (a, d) {
+          var b = this.chart;
+          q(a, {
+            tabindex: -1,
+            role: "textbox",
+            "aria-label": b.langFormat(d, { chart: b }),
+          });
+        },
+        getRangeSelectorButtonNavigation: function () {
+          var a = this.chart,
+            d = this.keyCodes,
+            b = this;
+          return new n(a, {
+            keyCodeMap: [
+              [
+                [d.left, d.right, d.up, d.down],
+                function (a) {
+                  return b.onButtonNavKbdArrowKey(this, a);
+                },
+              ],
+              [
+                [d.enter, d.space],
+                function () {
+                  return b.onButtonNavKbdClick(this);
+                },
+              ],
+            ],
+            validate: function () {
+              return (
+                a.rangeSelector &&
+                a.rangeSelector.buttons &&
+                a.rangeSelector.buttons.length
+              );
+            },
+            init: function (b) {
+              var c = a.rangeSelector.buttons.length - 1;
+              a.highlightRangeSelectorButton(0 < b ? 0 : c);
+            },
+          });
+        },
+        onButtonNavKbdArrowKey: function (a, d) {
+          var b = a.response,
+            c = this.keyCodes,
+            e = this.chart,
+            g = e.options.accessibility.keyboardNavigation.wrapAround;
+          d = d === c.left || d === c.up ? -1 : 1;
+          return e.highlightRangeSelectorButton(
+            e.highlightedRangeSelectorItemIx + d
+          )
+            ? b.success
+            : g
+            ? (a.init(d), b.success)
+            : b[0 < d ? "next" : "prev"];
+        },
+        onButtonNavKbdClick: function (a) {
+          a = a.response;
+          var d = this.chart;
+          3 !== d.oldRangeSelectorItemState &&
+            this.fakeClickEvent(
+              d.rangeSelector.buttons[d.highlightedRangeSelectorItemIx].element
+            );
+          return a.success;
+        },
+        getRangeSelectorInputNavigation: function () {
+          var a = this.chart,
+            d = this.keyCodes,
+            b = this;
+          return new n(a, {
+            keyCodeMap: [
+              [
+                [d.tab, d.up, d.down],
+                function (a, e) {
+                  return b.onInputKbdMove(
+                    this,
+                    (a === d.tab && e.shiftKey) || a === d.up ? -1 : 1
+                  );
+                },
+              ],
+            ],
+            validate: function () {
+              return (
+                a.rangeSelector &&
+                a.rangeSelector.inputGroup &&
+                "hidden" !==
+                  a.rangeSelector.inputGroup.element.getAttribute(
+                    "visibility"
+                  ) &&
+                !1 !== a.options.rangeSelector.inputEnabled &&
+                a.rangeSelector.minInput &&
+                a.rangeSelector.maxInput
+              );
+            },
+            init: function (a) {
+              b.onInputNavInit(a);
+            },
+            terminate: function () {
+              b.onInputNavTerminate();
+            },
+          });
+        },
+        onInputKbdMove: function (a, d) {
+          var b = this.chart;
+          a = a.response;
+          var c = (b.highlightedInputRangeIx += d);
+          if (1 < c || 0 > c) return a[0 < d ? "next" : "prev"];
+          b.rangeSelector[c ? "maxInput" : "minInput"].focus();
+          return a.success;
+        },
+        onInputNavInit: function (a) {
+          var d = this.chart;
+          a = 0 < a ? 0 : 1;
+          d.highlightedInputRangeIx = a;
+          d.rangeSelector[a ? "maxInput" : "minInput"].focus();
+        },
+        onInputNavTerminate: function () {
+          var a = this.chart.rangeSelector || {};
+          a.maxInput && a.hideInput("max");
+          a.minInput && a.hideInput("min");
+        },
+        getKeyboardNavigation: function () {
+          return [
+            this.getRangeSelectorButtonNavigation(),
+            this.getRangeSelectorInputNavigation(),
+          ];
+        },
+      });
+      return l;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/InfoRegionsComponent.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/Utils/Announcer.js"],
+      a["Accessibility/Components/AnnotationsA11y.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+    ],
+    function (a, f, l, m, n, g, h) {
+      function q(b) {
+        return b
+          .replace(/&lt;(h[1-7]|p|div|ul|ol|li)&gt;/g, "<$1>")
+          .replace(/&lt;&#x2F;(h[1-7]|p|div|ul|ol|li|a|button)&gt;/g, "</$1>")
+          .replace(
+            /&lt;(div|a|button) id=&quot;([a-zA-Z\-0-9#]*?)&quot;&gt;/g,
+            '<$1 id="$2">'
+          );
+      }
+      var e = a.doc,
+        d = f.extend,
+        b = f.format,
+        c = f.pick,
+        k = n.getAnnotationsInfoHTML,
+        t = g.unhideChartElementFromAT,
+        v = g.getChartTitle,
+        w = g.getAxisDescription,
+        p = h.addClass,
+        u = h.setElAttrs,
+        D = h.escapeStringForHTML,
+        y = h.stripHTMLTagsFromString,
+        z = h.getElement,
+        x = h.visuallyHideElement;
+      a.Chart.prototype.getTypeDescription = function (b) {
+        var a = b[0],
+          c = (this.series && this.series[0]) || {};
+        c = {
+          numSeries: this.series.length,
+          numPoints: c.points && c.points.length,
+          chart: this,
+          mapTitle: c.mapTitle,
+        };
+        if (!a)
+          return this.langFormat("accessibility.chartTypes.emptyChart", c);
+        if ("map" === a)
+          return c.mapTitle
+            ? this.langFormat("accessibility.chartTypes.mapTypeDescription", c)
+            : this.langFormat("accessibility.chartTypes.unknownMap", c);
+        if (1 < this.types.length)
+          return this.langFormat(
+            "accessibility.chartTypes.combinationChart",
+            c
+          );
+        b = b[0];
+        a = this.langFormat("accessibility.seriesTypeDescriptions." + b, c);
+        var d = this.series && 2 > this.series.length ? "Single" : "Multiple";
+        return (
+          (this.langFormat("accessibility.chartTypes." + b + d, c) ||
+            this.langFormat("accessibility.chartTypes.default" + d, c)) +
+          (a ? " " + a : "")
+        );
+      };
+      f = function () {};
+      f.prototype = new l();
+      d(f.prototype, {
+        init: function () {
+          var b = this.chart,
+            a = this;
+          this.initRegionsDefinitions();
+          this.addEvent(b, "afterGetTable", function (b) {
+            a.onDataTableCreated(b);
+          });
+          this.addEvent(b, "afterViewData", function (b) {
+            a.dataTableDiv = b;
+            setTimeout(function () {
+              a.focusDataTable();
+            }, 300);
+          });
+          this.announcer = new m(b, "assertive");
+        },
+        initRegionsDefinitions: function () {
+          var b = this;
+          this.screenReaderSections = {
+            before: {
+              element: null,
+              buildContent: function (a) {
+                var c =
+                  a.options.accessibility.screenReaderSection
+                    .beforeChartFormatter;
+                return c ? c(a) : b.defaultBeforeChartFormatter(a);
+              },
+              insertIntoDOM: function (b, a) {
+                a.renderTo.insertBefore(b, a.renderTo.firstChild);
+              },
+              afterInserted: function () {
+                "undefined" !== typeof b.sonifyButtonId &&
+                  b.initSonifyButton(b.sonifyButtonId);
+                "undefined" !== typeof b.dataTableButtonId &&
+                  b.initDataTableButton(b.dataTableButtonId);
+              },
+            },
+            after: {
+              element: null,
+              buildContent: function (a) {
+                var c =
+                  a.options.accessibility.screenReaderSection
+                    .afterChartFormatter;
+                return c ? c(a) : b.defaultAfterChartFormatter();
+              },
+              insertIntoDOM: function (b, a) {
+                a.renderTo.insertBefore(b, a.container.nextSibling);
+              },
+            },
+          };
+        },
+        onChartRender: function () {
+          var b = this;
+          this.linkedDescriptionElement = this.getLinkedDescriptionElement();
+          this.setLinkedDescriptionAttrs();
+          Object.keys(this.screenReaderSections).forEach(function (a) {
+            b.updateScreenReaderSection(a);
+          });
+        },
+        getLinkedDescriptionElement: function () {
+          var a = this.chart.options.accessibility.linkedDescription;
+          if (a) {
+            if ("string" !== typeof a) return a;
+            a = b(a, this.chart);
+            a = e.querySelectorAll(a);
+            if (1 === a.length) return a[0];
+          }
+        },
+        setLinkedDescriptionAttrs: function () {
+          var b = this.linkedDescriptionElement;
+          b &&
+            (b.setAttribute("aria-hidden", "true"),
+            p(b, "highcharts-linked-description"));
+        },
+        updateScreenReaderSection: function (b) {
+          var a = this.chart,
+            c = this.screenReaderSections[b],
+            d = c.buildContent(a),
+            e = (c.element = c.element || this.createElement("div")),
+            g = e.firstChild || this.createElement("div");
+          this.setScreenReaderSectionAttribs(e, b);
+          g.innerHTML = d;
+          e.appendChild(g);
+          c.insertIntoDOM(e, a);
+          x(g);
+          t(a, g);
+          c.afterInserted && c.afterInserted();
+        },
+        setScreenReaderSectionAttribs: function (b, a) {
+          var c = this.chart,
+            d = c.langFormat(
+              "accessibility.screenReaderSection." + a + "RegionLabel",
+              { chart: c }
+            );
+          u(b, {
+            id: "highcharts-screen-reader-region-" + a + "-" + c.index,
+            "aria-label": d,
+          });
+          b.style.position = "relative";
+          "all" === c.options.accessibility.landmarkVerbosity &&
+            d &&
+            b.setAttribute("role", "region");
+        },
+        defaultBeforeChartFormatter: function () {
+          var b,
+            c = this.chart,
+            d = c.options.accessibility.screenReaderSection.beforeChartFormat,
+            e = this.getAxesDescription(),
+            g =
+              c.sonify &&
+              (null === (b = c.options.sonification) || void 0 === b
+                ? void 0
+                : b.enabled);
+          b = "highcharts-a11y-sonify-data-btn-" + c.index;
+          var h = "hc-linkto-highcharts-data-table-" + c.index,
+            f = k(c),
+            t = c.langFormat(
+              "accessibility.screenReaderSection.annotations.heading",
+              { chart: c }
+            );
+          e = {
+            chartTitle: v(c),
+            typeDescription: this.getTypeDescriptionText(),
+            chartSubtitle: this.getSubtitleText(),
+            chartLongdesc: this.getLongdescText(),
+            xAxisDescription: e.xAxis,
+            yAxisDescription: e.yAxis,
+            playAsSoundButton: g ? this.getSonifyButtonText(b) : "",
+            viewTableButton: c.getCSV ? this.getDataTableButtonText(h) : "",
+            annotationsTitle: f ? t : "",
+            annotationsList: f,
+          };
+          c = a.i18nFormat(d, e, c);
+          this.dataTableButtonId = h;
+          this.sonifyButtonId = b;
+          return q(D(c)).replace(/<(\w+)[^>]*?>\s*<\/\1>/g, "");
+        },
+        defaultAfterChartFormatter: function () {
+          var b = this.chart,
+            c = b.options.accessibility.screenReaderSection.afterChartFormat,
+            d = { endOfChartMarker: this.getEndOfChartMarkerText() };
+          b = a.i18nFormat(c, d, b);
+          return q(D(b)).replace(/<(\w+)[^>]*?>\s*<\/\1>/g, "");
+        },
+        getLinkedDescription: function () {
+          var b = this.linkedDescriptionElement;
+          return y((b && b.innerHTML) || "");
+        },
+        getLongdescText: function () {
+          var b = this.chart.options,
+            a = b.caption;
+          a = a && a.text;
+          var c = this.getLinkedDescription();
+          return b.accessibility.description || c || a || "";
+        },
+        getTypeDescriptionText: function () {
+          var b = this.chart;
+          return b.types
+            ? b.options.accessibility.typeDescription ||
+                b.getTypeDescription(b.types)
+            : "";
+        },
+        getDataTableButtonText: function (b) {
+          var a = this.chart;
+          a = a.langFormat("accessibility.table.viewAsDataTableButtonText", {
+            chart: a,
+            chartTitle: v(a),
+          });
+          return '<button id="' + b + '">' + a + "</button>";
+        },
+        getSonifyButtonText: function (b) {
+          var a,
+            c = this.chart;
+          if (
+            !1 ===
+            (null === (a = c.options.sonification) || void 0 === a
+              ? void 0
+              : a.enabled)
+          )
+            return "";
+          a = c.langFormat("accessibility.sonification.playAsSoundButtonText", {
+            chart: c,
+            chartTitle: v(c),
+          });
+          return '<button id="' + b + '">' + a + "</button>";
+        },
+        getSubtitleText: function () {
+          var b = this.chart.options.subtitle;
+          return y((b && b.text) || "");
+        },
+        getEndOfChartMarkerText: function () {
+          var b = this.chart,
+            a = b.langFormat(
+              "accessibility.screenReaderSection.endOfChartMarker",
+              { chart: b }
+            );
+          return (
+            '<div id="highcharts-end-of-chart-marker-' +
+            b.index +
+            '">' +
+            a +
+            "</div>"
+          );
+        },
+        onDataTableCreated: function (b) {
+          var a = this.chart;
+          a.options.accessibility.enabled &&
+            (this.viewDataTableButton &&
+              this.viewDataTableButton.setAttribute("aria-expanded", "true"),
+            (b.html = b.html.replace(
+              "<table ",
+              '<table tabindex="-1" summary="' +
+                a.langFormat("accessibility.table.tableSummary", { chart: a }) +
+                '"'
+            )));
+        },
+        focusDataTable: function () {
+          var b = this.dataTableDiv;
+          (b = b && b.getElementsByTagName("table")[0]) && b.focus && b.focus();
+        },
+        initSonifyButton: function (b) {
+          var a = this,
+            c = (this.sonifyButton = z(b)),
+            d = this.chart,
+            e = function (b) {
+              null === c || void 0 === c
+                ? void 0
+                : c.setAttribute("aria-hidden", "true");
+              null === c || void 0 === c
+                ? void 0
+                : c.setAttribute("aria-label", "");
+              b.preventDefault();
+              b.stopPropagation();
+              b = d.langFormat(
+                "accessibility.sonification.playAsSoundClickAnnouncement",
+                { chart: d }
+              );
+              a.announcer.announce(b);
+              setTimeout(function () {
+                null === c || void 0 === c
+                  ? void 0
+                  : c.removeAttribute("aria-hidden");
+                null === c || void 0 === c
+                  ? void 0
+                  : c.removeAttribute("aria-label");
+                d.sonify && d.sonify();
+              }, 1e3);
+            };
+          c &&
+            d &&
+            (u(c, { tabindex: "-1" }),
+            (c.onclick = function (b) {
+              var a;
+              (
+                (null === (a = d.options.accessibility) || void 0 === a
+                  ? void 0
+                  : a.screenReaderSection.onPlayAsSoundClick) || e
+              ).call(this, b, d);
+            }));
+        },
+        initDataTableButton: function (b) {
+          var a = (this.viewDataTableButton = z(b)),
+            c = this.chart;
+          b = b.replace("hc-linkto-", "");
+          a &&
+            (u(a, { tabindex: "-1", "aria-expanded": !!z(b) }),
+            (a.onclick =
+              c.options.accessibility.screenReaderSection
+                .onViewDataTableClick ||
+              function () {
+                c.viewData();
+              }));
+        },
+        getAxesDescription: function () {
+          var b = this.chart,
+            a = function (a, d) {
+              a = b[a];
+              return (
+                1 < a.length ||
+                (a[0] &&
+                  c(
+                    a[0].options.accessibility &&
+                      a[0].options.accessibility.enabled,
+                    d
+                  ))
+              );
+            },
+            d = !!b.types && 0 > b.types.indexOf("map"),
+            e = !!b.hasCartesianSeries,
+            g = a("xAxis", !b.angular && e && d);
+          a = a("yAxis", e && d);
+          d = {};
+          g && (d.xAxis = this.getAxisDescriptionText("xAxis"));
+          a && (d.yAxis = this.getAxisDescriptionText("yAxis"));
+          return d;
+        },
+        getAxisDescriptionText: function (b) {
+          var a = this,
+            c = this.chart,
+            d = c[b];
+          return c.langFormat(
+            "accessibility.axis." +
+              b +
+              "Description" +
+              (1 < d.length ? "Plural" : "Singular"),
+            {
+              chart: c,
+              names: d.map(function (b) {
+                return w(b);
+              }),
+              ranges: d.map(function (b) {
+                return a.getAxisRangeDescription(b);
+              }),
+              numAxes: d.length,
+            }
+          );
+        },
+        getAxisRangeDescription: function (b) {
+          var a = b.options || {};
+          return a.accessibility &&
+            "undefined" !== typeof a.accessibility.rangeDescription
+            ? a.accessibility.rangeDescription
+            : b.categories
+            ? this.getCategoryAxisRangeDesc(b)
+            : !b.dateTime || (0 !== b.min && 0 !== b.dataMin)
+            ? this.getAxisFromToDescription(b)
+            : this.getAxisTimeLengthDesc(b);
+        },
+        getCategoryAxisRangeDesc: function (b) {
+          var a = this.chart;
+          return b.dataMax && b.dataMin
+            ? a.langFormat("accessibility.axis.rangeCategories", {
+                chart: a,
+                axis: b,
+                numCategories: b.dataMax - b.dataMin + 1,
+              })
+            : "";
+        },
+        getAxisTimeLengthDesc: function (b) {
+          var a = this.chart,
+            c = {},
+            d = "Seconds";
+          c.Seconds = ((b.max || 0) - (b.min || 0)) / 1e3;
+          c.Minutes = c.Seconds / 60;
+          c.Hours = c.Minutes / 60;
+          c.Days = c.Hours / 24;
+          ["Minutes", "Hours", "Days"].forEach(function (b) {
+            2 < c[b] && (d = b);
+          });
+          var e = c[d].toFixed("Seconds" !== d && "Minutes" !== d ? 1 : 0);
+          return a.langFormat("accessibility.axis.timeRange" + d, {
+            chart: a,
+            axis: b,
+            range: e.replace(".0", ""),
+          });
+        },
+        getAxisFromToDescription: function (b) {
+          var a = this.chart,
+            c = a.options.accessibility.screenReaderSection.axisRangeDateFormat,
+            d = function (d) {
+              return b.dateTime ? a.time.dateFormat(c, b[d]) : b[d];
+            };
+          return a.langFormat("accessibility.axis.rangeFromTo", {
+            chart: a,
+            axis: b,
+            rangeFrom: d("min"),
+            rangeTo: d("max"),
+          });
+        },
+        destroy: function () {
+          var b;
+          null === (b = this.announcer) || void 0 === b ? void 0 : b.destroy();
+        },
+      });
+      return f;
+    }
+  );
+  p(
+    a,
+    "Accessibility/Components/ContainerComponent.js",
+    [
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Core/Globals.js"],
+      a["Accessibility/Utils/HTMLUtilities.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m, n) {
+      var g = f.unhideChartElementFromAT,
+        h = f.getChartTitle,
+        q = l.doc,
+        e = m.stripHTMLTagsFromString;
+      f = n.extend;
+      l = function () {};
+      l.prototype = new a();
+      f(l.prototype, {
+        onChartUpdate: function () {
+          this.handleSVGTitleElement();
+          this.setSVGContainerLabel();
+          this.setGraphicContainerAttrs();
+          this.setRenderToAttrs();
+          this.makeCreditsAccessible();
+        },
+        handleSVGTitleElement: function () {
+          var a = this.chart,
+            b = "highcharts-title-" + a.index,
+            c = e(
+              a.langFormat("accessibility.svgContainerTitle", {
+                chartTitle: h(a),
+              })
+            );
+          if (c.length) {
+            var g = (this.svgTitleElement =
+              this.svgTitleElement ||
+              q.createElementNS("http://www.w3.org/2000/svg", "title"));
+            g.textContent = c;
+            g.id = b;
+            a.renderTo.insertBefore(g, a.renderTo.firstChild);
+          }
+        },
+        setSVGContainerLabel: function () {
+          var a = this.chart,
+            b = e(
+              a.langFormat("accessibility.svgContainerLabel", {
+                chartTitle: h(a),
+              })
+            );
+          a.renderer.box &&
+            b.length &&
+            a.renderer.box.setAttribute("aria-label", b);
+        },
+        setGraphicContainerAttrs: function () {
+          var a = this.chart,
+            b = a.langFormat("accessibility.graphicContainerLabel", {
+              chartTitle: h(a),
+            });
+          b.length && a.container.setAttribute("aria-label", b);
+        },
+        setRenderToAttrs: function () {
+          var a = this.chart;
+          "disabled" !== a.options.accessibility.landmarkVerbosity
+            ? a.renderTo.setAttribute("role", "region")
+            : a.renderTo.removeAttribute("role");
+          a.renderTo.setAttribute(
+            "aria-label",
+            a.langFormat("accessibility.chartContainerLabel", {
+              title: h(a),
+              chart: a,
+            })
+          );
+        },
+        makeCreditsAccessible: function () {
+          var a = this.chart,
+            b = a.credits;
+          b &&
+            (b.textStr &&
+              b.element.setAttribute(
+                "aria-label",
+                e(
+                  a.langFormat("accessibility.credits", {
+                    creditsStr: b.textStr,
+                  })
+                )
+              ),
+            g(a, b.element));
+        },
+        destroy: function () {
+          this.chart.renderTo.setAttribute("aria-hidden", !0);
+        },
+      });
+      return l;
+    }
+  );
+  p(
+    a,
+    "Accessibility/HighContrastMode.js",
+    [a["Core/Globals.js"]],
+    function (a) {
+      var f = a.isMS,
+        l = a.win,
+        m = l.document;
+      return {
+        isHighContrastModeActive: function () {
+          var a = /(Edg)/.test(l.navigator.userAgent);
+          if (l.matchMedia && a)
+            return l.matchMedia("(-ms-high-contrast: active)").matches;
+          if (f && l.getComputedStyle) {
+            a = m.createElement("div");
+            a.style.backgroundImage =
+              "url(data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==)";
+            m.body.appendChild(a);
+            var g = (a.currentStyle || l.getComputedStyle(a)).backgroundImage;
+            m.body.removeChild(a);
+            return "none" === g;
+          }
+          return !1;
+        },
+        setHighContrastTheme: function (a) {
+          a.highContrastModeActive = !0;
+          var g = a.options.accessibility.highContrastTheme;
+          a.update(g, !1);
+          a.series.forEach(function (a) {
+            var f = g.plotOptions[a.type] || {};
+            a.update({
+              color: f.color || "windowText",
+              colors: [f.color || "windowText"],
+              borderColor: f.borderColor || "window",
+            });
+            a.points.forEach(function (a) {
+              a.options &&
+                a.options.color &&
+                a.update(
+                  {
+                    color: f.color || "windowText",
+                    borderColor: f.borderColor || "window",
+                  },
+                  !1
+                );
+            });
+          });
+          a.redraw();
+        },
+      };
+    }
+  );
+  p(a, "Accessibility/HighContrastTheme.js", [], function () {
+    return {
+      chart: { backgroundColor: "window" },
+      title: { style: { color: "windowText" } },
+      subtitle: { style: { color: "windowText" } },
+      colorAxis: { minColor: "windowText", maxColor: "windowText", stops: [] },
+      colors: ["windowText"],
+      xAxis: {
+        gridLineColor: "windowText",
+        labels: { style: { color: "windowText" } },
+        lineColor: "windowText",
+        minorGridLineColor: "windowText",
+        tickColor: "windowText",
+        title: { style: { color: "windowText" } },
+      },
+      yAxis: {
+        gridLineColor: "windowText",
+        labels: { style: { color: "windowText" } },
+        lineColor: "windowText",
+        minorGridLineColor: "windowText",
+        tickColor: "windowText",
+        title: { style: { color: "windowText" } },
+      },
+      tooltip: {
+        backgroundColor: "window",
+        borderColor: "windowText",
+        style: { color: "windowText" },
+      },
+      plotOptions: {
+        series: {
+          lineColor: "windowText",
+          fillColor: "window",
+          borderColor: "windowText",
+          edgeColor: "windowText",
+          borderWidth: 1,
+          dataLabels: {
+            connectorColor: "windowText",
+            color: "windowText",
+            style: { color: "windowText", textOutline: "none" },
+          },
+          marker: { lineColor: "windowText", fillColor: "windowText" },
+        },
+        pie: {
+          color: "window",
+          colors: ["window"],
+          borderColor: "windowText",
+          borderWidth: 1,
+        },
+        boxplot: { fillColor: "window" },
+        candlestick: { lineColor: "windowText", fillColor: "window" },
+        errorbar: { fillColor: "window" },
+      },
+      legend: {
+        backgroundColor: "window",
+        itemStyle: { color: "windowText" },
+        itemHoverStyle: { color: "windowText" },
+        itemHiddenStyle: { color: "#555" },
+        title: { style: { color: "windowText" } },
+      },
+      credits: { style: { color: "windowText" } },
+      labels: { style: { color: "windowText" } },
+      drilldown: {
+        activeAxisLabelStyle: { color: "windowText" },
+        activeDataLabelStyle: { color: "windowText" },
+      },
+      navigation: {
+        buttonOptions: {
+          symbolStroke: "windowText",
+          theme: { fill: "window" },
+        },
+      },
+      rangeSelector: {
+        buttonTheme: {
+          fill: "window",
+          stroke: "windowText",
+          style: { color: "windowText" },
+          states: {
+            hover: {
+              fill: "window",
+              stroke: "windowText",
+              style: { color: "windowText" },
+            },
+            select: {
+              fill: "#444",
+              stroke: "windowText",
+              style: { color: "windowText" },
+            },
+          },
+        },
+        inputBoxBorderColor: "windowText",
+        inputStyle: { backgroundColor: "window", color: "windowText" },
+        labelStyle: { color: "windowText" },
+      },
+      navigator: {
+        handles: { backgroundColor: "window", borderColor: "windowText" },
+        outlineColor: "windowText",
+        maskFill: "transparent",
+        series: { color: "windowText", lineColor: "windowText" },
+        xAxis: { gridLineColor: "windowText" },
+      },
+      scrollbar: {
+        barBackgroundColor: "#444",
+        barBorderColor: "windowText",
+        buttonArrowColor: "windowText",
+        buttonBackgroundColor: "window",
+        buttonBorderColor: "windowText",
+        rifleColor: "windowText",
+        trackBackgroundColor: "window",
+        trackBorderColor: "windowText",
+      },
+    };
+  });
+  p(a, "Accessibility/Options/Options.js", [], function () {
+    return {
+      accessibility: {
+        enabled: !0,
+        screenReaderSection: {
+          beforeChartFormat:
+            "<h5>{chartTitle}</h5><div>{typeDescription}</div><div>{chartSubtitle}</div><div>{chartLongdesc}</div><div>{playAsSoundButton}</div><div>{viewTableButton}</div><div>{xAxisDescription}</div><div>{yAxisDescription}</div><div>{annotationsTitle}{annotationsList}</div>",
+          afterChartFormat: "{endOfChartMarker}",
+          axisRangeDateFormat: "%Y-%m-%d %H:%M:%S",
+        },
+        series: {
+          describeSingleSeries: !1,
+          pointDescriptionEnabledThreshold: 200,
+        },
+        point: {
+          valueDescriptionFormat: "{index}. {xDescription}{separator}{value}.",
+        },
+        landmarkVerbosity: "all",
+        linkedDescription:
+          '*[data-highcharts-chart="{index}"] + .highcharts-description',
+        keyboardNavigation: {
+          enabled: !0,
+          focusBorder: {
+            enabled: !0,
+            hideBrowserFocusOutline: !0,
+            style: { color: "#335cad", lineWidth: 2, borderRadius: 3 },
+            margin: 2,
+          },
+          order: ["series", "zoom", "rangeSelector", "legend", "chartMenu"],
+          wrapAround: !0,
+          seriesNavigation: {
+            skipNullPoints: !0,
+            pointNavigationEnabledThreshold: !1,
+          },
+        },
+        announceNewData: {
+          enabled: !1,
+          minAnnounceInterval: 5e3,
+          interruptUser: !1,
+        },
+      },
+      legend: {
+        accessibility: { enabled: !0, keyboardNavigation: { enabled: !0 } },
+      },
+      exporting: { accessibility: { enabled: !0 } },
+    };
+  });
+  p(a, "Accessibility/Options/LangOptions.js", [], function () {
+    return {
+      accessibility: {
+        defaultChartTitle: "Chart",
+        chartContainerLabel: "{title}. Highcharts interactive chart.",
+        svgContainerLabel: "Interactive chart",
+        drillUpButton: "{buttonText}",
+        credits: "Chart credits: {creditsStr}",
+        thousandsSep: ",",
+        svgContainerTitle: "",
+        graphicContainerLabel: "",
+        screenReaderSection: {
+          beforeRegionLabel: "Chart screen reader information.",
+          afterRegionLabel: "",
+          annotations: {
+            heading: "Chart annotations summary",
+            descriptionSinglePoint:
+              "{annotationText}. Related to {annotationPoint}",
+            descriptionMultiplePoints:
+              "{annotationText}. Related to {annotationPoint}{ Also related to, #each(additionalAnnotationPoints)}",
+            descriptionNoPoints: "{annotationText}",
+          },
+          endOfChartMarker: "End of interactive chart.",
+        },
+        sonification: {
+          playAsSoundButtonText: "Play as sound, {chartTitle}",
+          playAsSoundClickAnnouncement: "Play",
+        },
+        legend: {
+          legendLabel: "Toggle series visibility",
+          legendItem: "Hide {itemName}",
+        },
+        zoom: {
+          mapZoomIn: "Zoom chart",
+          mapZoomOut: "Zoom out chart",
+          resetZoomButton: "Reset zoom",
+        },
+        rangeSelector: {
+          minInputLabel: "Select start date.",
+          maxInputLabel: "Select end date.",
+          buttonText: "Select range {buttonText}",
+        },
+        table: {
+          viewAsDataTableButtonText: "View as data table, {chartTitle}",
+          tableSummary: "Table representation of chart.",
+        },
+        announceNewData: {
+          newDataAnnounce: "Updated data for chart {chartTitle}",
+          newSeriesAnnounceSingle: "New data series: {seriesDesc}",
+          newPointAnnounceSingle: "New data point: {pointDesc}",
+          newSeriesAnnounceMultiple:
+            "New data series in chart {chartTitle}: {seriesDesc}",
+          newPointAnnounceMultiple:
+            "New data point in chart {chartTitle}: {pointDesc}",
+        },
+        seriesTypeDescriptions: {
+          boxplot:
+            "Box plot charts are typically used to display groups of statistical data. Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile, and maximum.",
+          arearange:
+            "Arearange charts are line charts displaying a range between a lower and higher value for each point.",
+          areasplinerange:
+            "These charts are line charts displaying a range between a lower and higher value for each point.",
+          bubble:
+            "Bubble charts are scatter charts where each data point also has a size value.",
+          columnrange:
+            "Columnrange charts are column charts displaying a range between a lower and higher value for each point.",
+          errorbar:
+            "Errorbar series are used to display the variability of the data.",
+          funnel:
+            "Funnel charts are used to display reduction of data in stages.",
+          pyramid:
+            "Pyramid charts consist of a single pyramid with item heights corresponding to each point value.",
+          waterfall:
+            "A waterfall chart is a column chart where each column contributes towards a total end value.",
+        },
+        chartTypes: {
+          emptyChart: "Empty chart",
+          mapTypeDescription: "Map of {mapTitle} with {numSeries} data series.",
+          unknownMap: "Map of unspecified region with {numSeries} data series.",
+          combinationChart: "Combination chart with {numSeries} data series.",
+          defaultSingle:
+            "Chart with {numPoints} data {#plural(numPoints, points, point)}.",
+          defaultMultiple: "Chart with {numSeries} data series.",
+          splineSingle:
+            "Line chart with {numPoints} data {#plural(numPoints, points, point)}.",
+          splineMultiple: "Line chart with {numSeries} lines.",
+          lineSingle:
+            "Line chart with {numPoints} data {#plural(numPoints, points, point)}.",
+          lineMultiple: "Line chart with {numSeries} lines.",
+          columnSingle:
+            "Bar chart with {numPoints} {#plural(numPoints, bars, bar)}.",
+          columnMultiple: "Bar chart with {numSeries} data series.",
+          barSingle:
+            "Bar chart with {numPoints} {#plural(numPoints, bars, bar)}.",
+          barMultiple: "Bar chart with {numSeries} data series.",
+          pieSingle:
+            "Pie chart with {numPoints} {#plural(numPoints, slices, slice)}.",
+          pieMultiple: "Pie chart with {numSeries} pies.",
+          scatterSingle:
+            "Scatter chart with {numPoints} {#plural(numPoints, points, point)}.",
+          scatterMultiple: "Scatter chart with {numSeries} data series.",
+          boxplotSingle:
+            "Boxplot with {numPoints} {#plural(numPoints, boxes, box)}.",
+          boxplotMultiple: "Boxplot with {numSeries} data series.",
+          bubbleSingle:
+            "Bubble chart with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
+          bubbleMultiple: "Bubble chart with {numSeries} data series.",
+        },
+        axis: {
+          xAxisDescriptionSingular:
+            "The chart has 1 X axis displaying {names[0]}. {ranges[0]}",
+          xAxisDescriptionPlural:
+            "The chart has {numAxes} X axes displaying {#each(names, -1) }and {names[-1]}.",
+          yAxisDescriptionSingular:
+            "The chart has 1 Y axis displaying {names[0]}. {ranges[0]}",
+          yAxisDescriptionPlural:
+            "The chart has {numAxes} Y axes displaying {#each(names, -1) }and {names[-1]}.",
+          timeRangeDays: "Range: {range} days.",
+          timeRangeHours: "Range: {range} hours.",
+          timeRangeMinutes: "Range: {range} minutes.",
+          timeRangeSeconds: "Range: {range} seconds.",
+          rangeFromTo: "Range: {rangeFrom} to {rangeTo}.",
+          rangeCategories: "Range: {numCategories} categories.",
+        },
+        exporting: {
+          chartMenuLabel: "Chart menu",
+          menuButtonLabel: "View chart menu",
+          exportRegionLabel: "Chart menu",
+        },
+        series: {
+          summary: {
+            default:
+              "{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
+            defaultCombination:
+              "{name}, series {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
+            line: "{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
+            lineCombination:
+              "{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",
+            spline:
+              "{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
+            splineCombination:
+              "{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",
+            column:
+              "{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.",
+            columnCombination:
+              "{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.",
+            bar: "{name}, bar series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bars, bar)}.",
+            barCombination:
+              "{name}, series {ix} of {numSeries}. Bar series with {numPoints} {#plural(numPoints, bars, bar)}.",
+            pie: "{name}, pie {ix} of {numSeries} with {numPoints} {#plural(numPoints, slices, slice)}.",
+            pieCombination:
+              "{name}, series {ix} of {numSeries}. Pie with {numPoints} {#plural(numPoints, slices, slice)}.",
+            scatter:
+              "{name}, scatter plot {ix} of {numSeries} with {numPoints} {#plural(numPoints, points, point)}.",
+            scatterCombination:
+              "{name}, series {ix} of {numSeries}, scatter plot with {numPoints} {#plural(numPoints, points, point)}.",
+            boxplot:
+              "{name}, boxplot {ix} of {numSeries} with {numPoints} {#plural(numPoints, boxes, box)}.",
+            boxplotCombination:
+              "{name}, series {ix} of {numSeries}. Boxplot with {numPoints} {#plural(numPoints, boxes, box)}.",
+            bubble:
+              "{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
+            bubbleCombination:
+              "{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
+            map: "{name}, map {ix} of {numSeries} with {numPoints} {#plural(numPoints, areas, area)}.",
+            mapCombination:
+              "{name}, series {ix} of {numSeries}. Map with {numPoints} {#plural(numPoints, areas, area)}.",
+            mapline:
+              "{name}, line {ix} of {numSeries} with {numPoints} data {#plural(numPoints, points, point)}.",
+            maplineCombination:
+              "{name}, series {ix} of {numSeries}. Line with {numPoints} data {#plural(numPoints, points, point)}.",
+            mapbubble:
+              "{name}, bubble series {ix} of {numSeries} with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
+            mapbubbleCombination:
+              "{name}, series {ix} of {numSeries}. Bubble series with {numPoints} {#plural(numPoints, bubbles, bubble)}.",
+          },
+          description: "{description}",
+          xAxisDescription: "X axis, {name}",
+          yAxisDescription: "Y axis, {name}",
+          nullPointValue: "No value",
+          pointAnnotationsDescription: "{Annotation: #each(annotations). }",
+        },
+      },
+    };
+  });
+  p(
+    a,
+    "Accessibility/Options/DeprecatedOptions.js",
+    [a["Core/Utilities.js"]],
+    function (a) {
+      function f(a, d, b) {
+        for (var c, e = 0; e < d.length - 1; ++e)
+          (c = d[e]), (a = a[c] = q(a[c], {}));
+        a[d[d.length - 1]] = b;
+      }
+      function l(a, d, b, c) {
+        function e(b, a) {
+          return a.reduce(function (b, a) {
+            return b[a];
+          }, b);
+        }
+        var g = e(a.options, d),
+          l = e(a.options, b);
+        Object.keys(c).forEach(function (e) {
+          var k,
+            t = g[e];
+          "undefined" !== typeof t &&
+            (f(l, c[e], t),
+            h(
+              32,
+              !1,
+              a,
+              ((k = {}),
+              (k[d.join(".") + "." + e] = b.join(".") + "." + c[e].join(".")),
+              k)
+            ));
+        });
+      }
+      function m(a) {
+        var d = a.options.chart || {},
+          b = a.options.accessibility || {};
+        ["description", "typeDescription"].forEach(function (c) {
+          var e;
+          d[c] &&
+            ((b[c] = d[c]),
+            h(
+              32,
+              !1,
+              a,
+              ((e = {}), (e["chart." + c] = "use accessibility." + c), e)
+            ));
+        });
+      }
+      function n(a) {
+        a.axes.forEach(function (d) {
+          (d = d.options) &&
+            d.description &&
+            ((d.accessibility = d.accessibility || {}),
+            (d.accessibility.description = d.description),
+            h(32, !1, a, {
+              "axis.description": "use axis.accessibility.description",
+            }));
+        });
+      }
+      function g(a) {
+        var d = {
+          description: ["accessibility", "description"],
+          exposeElementToA11y: ["accessibility", "exposeAsGroupOnly"],
+          pointDescriptionFormatter: [
+            "accessibility",
+            "pointDescriptionFormatter",
+          ],
+          skipKeyboardNavigation: [
+            "accessibility",
+            "keyboardNavigation",
+            "enabled",
+          ],
+        };
+        a.series.forEach(function (b) {
+          Object.keys(d).forEach(function (c) {
+            var e,
+              g = b.options[c];
+            "undefined" !== typeof g &&
+              (f(b.options, d[c], "skipKeyboardNavigation" === c ? !g : g),
+              h(
+                32,
+                !1,
+                a,
+                ((e = {}), (e["series." + c] = "series." + d[c].join(".")), e)
+              ));
+          });
+        });
+      }
+      var h = a.error,
+        q = a.pick;
+      return function (a) {
+        m(a);
+        n(a);
+        a.series && g(a);
+        l(a, ["accessibility"], ["accessibility"], {
+          pointDateFormat: ["point", "dateFormat"],
+          pointDateFormatter: ["point", "dateFormatter"],
+          pointDescriptionFormatter: ["point", "descriptionFormatter"],
+          pointDescriptionThreshold: [
+            "series",
+            "pointDescriptionEnabledThreshold",
+          ],
+          pointNavigationThreshold: [
+            "keyboardNavigation",
+            "seriesNavigation",
+            "pointNavigationEnabledThreshold",
+          ],
+          pointValueDecimals: ["point", "valueDecimals"],
+          pointValuePrefix: ["point", "valuePrefix"],
+          pointValueSuffix: ["point", "valueSuffix"],
+          screenReaderSectionFormatter: [
+            "screenReaderSection",
+            "beforeChartFormatter",
+          ],
+          describeSingleSeries: ["series", "describeSingleSeries"],
+          seriesDescriptionFormatter: ["series", "descriptionFormatter"],
+          onTableAnchorClick: ["screenReaderSection", "onViewDataTableClick"],
+          axisRangeDateFormat: ["screenReaderSection", "axisRangeDateFormat"],
+        });
+        l(
+          a,
+          ["accessibility", "keyboardNavigation"],
+          ["accessibility", "keyboardNavigation", "seriesNavigation"],
+          { skipNullPoints: ["skipNullPoints"], mode: ["mode"] }
+        );
+        l(a, ["lang", "accessibility"], ["lang", "accessibility"], {
+          legendItem: ["legend", "legendItem"],
+          legendLabel: ["legend", "legendLabel"],
+          mapZoomIn: ["zoom", "mapZoomIn"],
+          mapZoomOut: ["zoom", "mapZoomOut"],
+          resetZoomButton: ["zoom", "resetZoomButton"],
+          screenReaderRegionLabel: ["screenReaderSection", "beforeRegionLabel"],
+          rangeSelectorButton: ["rangeSelector", "buttonText"],
+          rangeSelectorMaxInput: ["rangeSelector", "maxInputLabel"],
+          rangeSelectorMinInput: ["rangeSelector", "minInputLabel"],
+          svgContainerEnd: ["screenReaderSection", "endOfChartMarker"],
+          viewAsDataTable: ["table", "viewAsDataTableButtonText"],
+          tableSummary: ["table", "tableSummary"],
+        });
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/A11yI18n.js",
+    [a["Core/Globals.js"], a["Core/Utilities.js"]],
+    function (a, f) {
+      function l(a, f) {
+        var g = a.indexOf("#each("),
+          e = a.indexOf("#plural("),
+          d = a.indexOf("["),
+          b = a.indexOf("]");
+        if (-1 < g) {
+          d = a.slice(g).indexOf(")") + g;
+          var c = a.substring(0, g);
+          e = a.substring(d + 1);
+          d = a.substring(g + 6, d).split(",");
+          g = Number(d[1]);
+          a = "";
+          if ((f = f[d[0]]))
+            for (
+              g = isNaN(g) ? f.length : g,
+                g = 0 > g ? f.length + g : Math.min(g, f.length),
+                d = 0;
+              d < g;
+              ++d
+            )
+              a += c + f[d] + e;
+          return a.length ? a : "";
+        }
+        if (-1 < e) {
+          c = a.slice(e).indexOf(")") + e;
+          a = a.substring(e + 8, c).split(",");
+          switch (Number(f[a[0]])) {
+            case 0:
+              a = n(a[4], a[1]);
+              break;
+            case 1:
+              a = n(a[2], a[1]);
+              break;
+            case 2:
+              a = n(a[3], a[1]);
+              break;
+            default:
+              a = a[1];
+          }
+          a
+            ? ((f = a),
+              (f = (f.trim && f.trim()) || f.replace(/^\s+|\s+$/g, "")))
+            : (f = "");
+          return f;
+        }
+        return -1 < d
+          ? ((e = a.substring(0, d)),
+            (a = Number(a.substring(d + 1, b))),
+            (f = f[e]),
+            !isNaN(a) &&
+              f &&
+              (0 > a
+                ? ((c = f[f.length + a]),
+                  "undefined" === typeof c && (c = f[0]))
+                : ((c = f[a]),
+                  "undefined" === typeof c && (c = f[f.length - 1]))),
+            "undefined" !== typeof c ? c : "")
+          : "{" + a + "}";
+      }
+      var m = f.format,
+        n = f.pick;
+      a.i18nFormat = function (a, f, n) {
+        var e = function (a, b) {
+            a = a.slice(b || 0);
+            var c = a.indexOf("{"),
+              d = a.indexOf("}");
+            if (-1 < c && d > c)
+              return {
+                statement: a.substring(c + 1, d),
+                begin: b + c + 1,
+                end: b + d,
+              };
+          },
+          d = [],
+          b = 0;
+        do {
+          var c = e(a, b);
+          var g = a.substring(b, c && c.begin - 1);
+          g.length && d.push({ value: g, type: "constant" });
+          c && d.push({ value: c.statement, type: "statement" });
+          b = c ? c.end + 1 : b + 1;
+        } while (c);
+        d.forEach(function (a) {
+          "statement" === a.type && (a.value = l(a.value, f));
+        });
+        return m(
+          d.reduce(function (a, b) {
+            return a + b.value;
+          }, ""),
+          f,
+          n
+        );
+      };
+      a.Chart.prototype.langFormat = function (f, h) {
+        f = f.split(".");
+        for (var g = this.options.lang, e = 0; e < f.length; ++e)
+          g = g && g[f[e]];
+        return "string" === typeof g ? a.i18nFormat(g, h, this) : "";
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/FocusBorder.js",
+    [
+      a["Core/Globals.js"],
+      a["Core/Renderer/SVG/SVGElement.js"],
+      a["Core/Renderer/SVG/SVGLabel.js"],
+      a["Core/Utilities.js"],
+    ],
+    function (a, f, l, m) {
+      function n(a) {
+        if (!a.focusBorderDestroyHook) {
+          var b = a.destroy;
+          a.destroy = function () {
+            var c, d;
+            null ===
+              (d =
+                null === (c = a.focusBorder) || void 0 === c
+                  ? void 0
+                  : c.destroy) || void 0 === d
+              ? void 0
+              : d.call(c);
+            return b.apply(a, arguments);
+          };
+          a.focusBorderDestroyHook = b;
+        }
+      }
+      function g(a) {
+        for (var c = [], d = 1; d < arguments.length; d++)
+          c[d - 1] = arguments[d];
+        a.focusBorderUpdateHooks ||
+          ((a.focusBorderUpdateHooks = {}),
+          b.forEach(function (b) {
+            b += "Setter";
+            var d = a[b] || a._defaultSetter;
+            a.focusBorderUpdateHooks[b] = d;
+            a[b] = function () {
+              var b = d.apply(a, arguments);
+              a.addFocusBorder.apply(a, c);
+              return b;
+            };
+          }));
+      }
+      function h(a) {
+        a.focusBorderUpdateHooks &&
+          (Object.keys(a.focusBorderUpdateHooks).forEach(function (b) {
+            var c = a.focusBorderUpdateHooks[b];
+            c === a._defaultSetter ? delete a[b] : (a[b] = c);
+          }),
+          delete a.focusBorderUpdateHooks);
+      }
+      var q = m.addEvent,
+        e = m.extend,
+        d = m.pick,
+        b = "x y transform width height r d stroke-width".split(" ");
+      e(f.prototype, {
+        addFocusBorder: function (b, e) {
+          this.focusBorder && this.removeFocusBorder();
+          var c = this.getBBox(),
+            f = d(b, 3);
+          c.x += this.translateX ? this.translateX : 0;
+          c.y += this.translateY ? this.translateY : 0;
+          var h = c.x - f,
+            k = c.y - f,
+            m = c.width + 2 * f,
+            q = c.height + 2 * f,
+            p = this instanceof l;
+          if ("text" === this.element.nodeName || p) {
+            var u = !!this.rotation;
+            if (p) var x = { x: u ? 1 : 0, y: 0 };
+            else
+              (h = x = 0),
+                "middle" === this.attr("text-anchor")
+                  ? ((x = a.isFirefox && this.rotation ? 0.25 : 0.5),
+                    (h = a.isFirefox && !this.rotation ? 0.75 : 0.5))
+                  : this.rotation
+                  ? (x = 0.25)
+                  : (h = 0.75),
+                (x = { x: x, y: h });
+            h = +this.attr("x") - c.width * x.x - f;
+            k = +this.attr("y") - c.height * x.y - f;
+            p &&
+              u &&
+              ((p = m),
+              (m = q),
+              (q = p),
+              (h = +this.attr("x") - c.height * x.x - f),
+              (k = +this.attr("y") - c.width * x.y - f));
+          }
+          this.focusBorder = this.renderer
+            .rect(
+              h,
+              k,
+              m,
+              q,
+              parseInt(((e && e.borderRadius) || 0).toString(), 10)
+            )
+            .addClass("highcharts-focus-border")
+            .attr({ zIndex: 99 })
+            .add(this.parentGroup);
+          this.renderer.styledMode ||
+            this.focusBorder.attr({
+              stroke: e && e.stroke,
+              "stroke-width": e && e.strokeWidth,
+            });
+          g(this, b, e);
+          n(this);
+        },
+        removeFocusBorder: function () {
+          h(this);
+          this.focusBorderDestroyHook &&
+            ((this.destroy = this.focusBorderDestroyHook),
+            delete this.focusBorderDestroyHook);
+          this.focusBorder &&
+            (this.focusBorder.destroy(), delete this.focusBorder);
+        },
+      });
+      a.Chart.prototype.renderFocusBorder = function () {
+        var a = this.focusElement,
+          b = this.options.accessibility.keyboardNavigation.focusBorder;
+        a &&
+          (a.removeFocusBorder(),
+          b.enabled &&
+            a.addFocusBorder(b.margin, {
+              stroke: b.style.color,
+              strokeWidth: b.style.lineWidth,
+              borderRadius: b.style.borderRadius,
+            }));
+      };
+      a.Chart.prototype.setFocusToElement = function (a, b) {
+        var c = this.options.accessibility.keyboardNavigation.focusBorder;
+        (b = b || a.element) &&
+          b.focus &&
+          ((b.hcEvents && b.hcEvents.focusin) ||
+            q(b, "focusin", function () {}),
+          b.focus(),
+          c.hideBrowserFocusOutline && (b.style.outline = "none"));
+        this.focusElement && this.focusElement.removeFocusBorder();
+        this.focusElement = a;
+        this.renderFocusBorder();
+      };
+    }
+  );
+  p(
+    a,
+    "Accessibility/Accessibility.js",
+    [
+      a["Accessibility/Utils/ChartUtilities.js"],
+      a["Core/Globals.js"],
+      a["Accessibility/KeyboardNavigationHandler.js"],
+      a["Core/Series/CartesianSeries.js"],
+      a["Core/Options.js"],
+      a["Core/Series/Point.js"],
+      a["Core/Utilities.js"],
+      a["Accessibility/AccessibilityComponent.js"],
+      a["Accessibility/KeyboardNavigation.js"],
+      a["Accessibility/Components/LegendComponent.js"],
+      a["Accessibility/Components/MenuComponent.js"],
+      a["Accessibility/Components/SeriesComponent/SeriesComponent.js"],
+      a["Accessibility/Components/ZoomComponent.js"],
+      a["Accessibility/Components/RangeSelectorComponent.js"],
+      a["Accessibility/Components/InfoRegionsComponent.js"],
+      a["Accessibility/Components/ContainerComponent.js"],
+      a["Accessibility/HighContrastMode.js"],
+      a["Accessibility/HighContrastTheme.js"],
+      a["Accessibility/Options/Options.js"],
+      a["Accessibility/Options/LangOptions.js"],
+      a["Accessibility/Options/DeprecatedOptions.js"],
+    ],
+    function (a, f, l, m, n, g, h, p, e, d, b, c, k, t, v, w, H, A, D, y, z) {
+      function q(a) {
+        this.init(a);
+      }
+      var r = f.doc,
+        u = h.addEvent,
+        F = h.extend,
+        B = h.fireEvent,
+        E = h.merge;
+      E(!0, n.defaultOptions, D, {
+        accessibility: { highContrastTheme: A },
+        lang: y,
+      });
+      f.A11yChartUtilities = a;
+      f.KeyboardNavigationHandler = l;
+      f.AccessibilityComponent = p;
+      q.prototype = {
+        init: function (a) {
+          this.chart = a;
+          r.addEventListener && a.renderer.isSVG
+            ? (z(a),
+              this.initComponents(),
+              (this.keyboardNavigation = new e(a, this.components)),
+              this.update())
+            : a.renderTo.setAttribute("aria-hidden", !0);
+        },
+        initComponents: function () {
+          var a = this.chart,
+            e = a.options.accessibility;
+          this.components = {
+            container: new w(),
+            infoRegions: new v(),
+            legend: new d(),
+            chartMenu: new b(),
+            rangeSelector: new t(),
+            series: new c(),
+            zoom: new k(),
+          };
+          e.customComponents && F(this.components, e.customComponents);
+          var f = this.components;
+          this.getComponentOrder().forEach(function (b) {
+            f[b].initBase(a);
+            f[b].init();
+          });
+        },
+        getComponentOrder: function () {
+          if (!this.components) return [];
+          if (!this.components.series) return Object.keys(this.components);
+          var a = Object.keys(this.components).filter(function (a) {
+            return "series" !== a;
+          });
+          return ["series"].concat(a);
+        },
+        update: function () {
+          var a = this.components,
+            b = this.chart,
+            c = b.options.accessibility;
+          B(b, "beforeA11yUpdate");
+          b.types = this.getChartTypes();
+          this.getComponentOrder().forEach(function (c) {
+            a[c].onChartUpdate();
+            B(b, "afterA11yComponentUpdate", { name: c, component: a[c] });
+          });
+          this.keyboardNavigation.update(c.keyboardNavigation.order);
+          !b.highContrastModeActive &&
+            H.isHighContrastModeActive() &&
+            H.setHighContrastTheme(b);
+          B(b, "afterA11yUpdate", { accessibility: this });
+        },
+        destroy: function () {
+          var a = this.chart || {},
+            b = this.components;
+          Object.keys(b).forEach(function (a) {
+            b[a].destroy();
+            b[a].destroyBase();
+          });
+          this.keyboardNavigation && this.keyboardNavigation.destroy();
+          a.renderTo && a.renderTo.setAttribute("aria-hidden", !0);
+          a.focusElement && a.focusElement.removeFocusBorder();
+        },
+        getChartTypes: function () {
+          var a = {};
+          this.chart.series.forEach(function (b) {
+            a[b.type] = 1;
+          });
+          return Object.keys(a);
+        },
+      };
+      f.Chart.prototype.updateA11yEnabled = function () {
+        var a = this.accessibility,
+          b = this.options.accessibility;
+        b && b.enabled
+          ? a
+            ? a.update()
+            : (this.accessibility = new q(this))
+          : a
+          ? (a.destroy && a.destroy(), delete this.accessibility)
+          : this.renderTo.setAttribute("aria-hidden", !0);
+      };
+      u(f.Chart, "render", function (a) {
+        this.a11yDirty &&
+          this.renderTo &&
+          (delete this.a11yDirty, this.updateA11yEnabled());
+        var b = this.accessibility;
+        b &&
+          b.getComponentOrder().forEach(function (a) {
+            b.components[a].onChartRender();
+          });
+      });
+      u(f.Chart, "update", function (a) {
+        if ((a = a.options.accessibility))
+          a.customComponents &&
+            ((this.options.accessibility.customComponents = a.customComponents),
+            delete a.customComponents),
+            E(!0, this.options.accessibility, a),
+            this.accessibility &&
+              this.accessibility.destroy &&
+              (this.accessibility.destroy(), delete this.accessibility);
+        this.a11yDirty = !0;
+      });
+      u(g, "update", function () {
+        this.series.chart.accessibility && (this.series.chart.a11yDirty = !0);
+      });
+      ["addSeries", "init"].forEach(function (a) {
+        u(f.Chart, a, function () {
+          this.a11yDirty = !0;
+        });
+      });
+      ["update", "updatedData", "remove"].forEach(function (a) {
+        u(m, a, function () {
+          this.chart.accessibility && (this.chart.a11yDirty = !0);
+        });
+      });
+      ["afterDrilldown", "drillupall"].forEach(function (a) {
+        u(f.Chart, a, function () {
+          this.accessibility && this.accessibility.update();
+        });
+      });
+      u(f.Chart, "destroy", function () {
+        this.accessibility && this.accessibility.destroy();
+      });
+    }
+  );
+  p(a, "masters/modules/accessibility.src.js", [], function () {});
+});
+//# sourceMappingURL=accessibility.js.map
diff --git a/notemyprogress/js/vue.js b/notemyprogress/js/vue.js
index 919aa1251299c4970b9860571d26c1852141e4ad..5632204c8494f4ae8ceada93ee28f233ee07433b 100644
--- a/notemyprogress/js/vue.js
+++ b/notemyprogress/js/vue.js
@@ -4,10 +4,13 @@
  * Released under the MIT License.
  */
 (function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-  typeof define === 'function' && define.amd ? define(factory) :
-  (global = global || self, global.Vue = factory());
-}(this, function () { 'use strict';
+  typeof exports === "object" && typeof module !== "undefined"
+    ? (module.exports = factory())
+    : typeof define === "function" && define.amd
+    ? define(factory)
+    : ((global = global || self), (global.Vue = factory()));
+})(this, function () {
+  "use strict";
 
   /*  */
 
@@ -15,33 +18,33 @@
 
   // These helpers produce better VM code in JS engines due to their
   // explicitness and function inlining.
-  function isUndef (v) {
-    return v === undefined || v === null
+  function isUndef(v) {
+    return v === undefined || v === null;
   }
 
-  function isDef (v) {
-    return v !== undefined && v !== null
+  function isDef(v) {
+    return v !== undefined && v !== null;
   }
 
-  function isTrue (v) {
-    return v === true
+  function isTrue(v) {
+    return v === true;
   }
 
-  function isFalse (v) {
-    return v === false
+  function isFalse(v) {
+    return v === false;
   }
 
   /**
    * Check if value is primitive.
    */
-  function isPrimitive (value) {
+  function isPrimitive(value) {
     return (
-      typeof value === 'string' ||
-      typeof value === 'number' ||
+      typeof value === "string" ||
+      typeof value === "number" ||
       // $flow-disable-line
-      typeof value === 'symbol' ||
-      typeof value === 'boolean'
-    )
+      typeof value === "symbol" ||
+      typeof value === "boolean"
+    );
   }
 
   /**
@@ -49,8 +52,8 @@
    * Objects from primitive values when we know the value
    * is a JSON-compliant type.
    */
-  function isObject (obj) {
-    return obj !== null && typeof obj === 'object'
+  function isObject(obj) {
+    return obj !== null && typeof obj === "object";
   }
 
   /**
@@ -58,94 +61,95 @@
    */
   var _toString = Object.prototype.toString;
 
-  function toRawType (value) {
-    return _toString.call(value).slice(8, -1)
+  function toRawType(value) {
+    return _toString.call(value).slice(8, -1);
   }
 
   /**
    * Strict object type check. Only returns true
    * for plain JavaScript objects.
    */
-  function isPlainObject (obj) {
-    return _toString.call(obj) === '[object Object]'
+  function isPlainObject(obj) {
+    return _toString.call(obj) === "[object Object]";
   }
 
-  function isRegExp (v) {
-    return _toString.call(v) === '[object RegExp]'
+  function isRegExp(v) {
+    return _toString.call(v) === "[object RegExp]";
   }
 
   /**
    * Check if val is a valid array index.
    */
-  function isValidArrayIndex (val) {
+  function isValidArrayIndex(val) {
     var n = parseFloat(String(val));
-    return n >= 0 && Math.floor(n) === n && isFinite(val)
+    return n >= 0 && Math.floor(n) === n && isFinite(val);
   }
 
-  function isPromise (val) {
+  function isPromise(val) {
     return (
       isDef(val) &&
-      typeof val.then === 'function' &&
-      typeof val.catch === 'function'
-    )
+      typeof val.then === "function" &&
+      typeof val.catch === "function"
+    );
   }
 
   /**
    * Convert a value to a string that is actually rendered.
    */
-  function toString (val) {
+  function toString(val) {
     return val == null
-      ? ''
+      ? ""
       : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
-        ? JSON.stringify(val, null, 2)
-        : String(val)
+      ? JSON.stringify(val, null, 2)
+      : String(val);
   }
 
   /**
    * Convert an input value to a number for persistence.
    * If the conversion fails, return original string.
    */
-  function toNumber (val) {
+  function toNumber(val) {
     var n = parseFloat(val);
-    return isNaN(n) ? val : n
+    return isNaN(n) ? val : n;
   }
 
   /**
    * Make a map and return a function for checking if a key
    * is in that map.
    */
-  function makeMap (
-    str,
-    expectsLowerCase
-  ) {
+  function makeMap(str, expectsLowerCase) {
     var map = Object.create(null);
-    var list = str.split(',');
+    var list = str.split(",");
     for (var i = 0; i < list.length; i++) {
       map[list[i]] = true;
     }
     return expectsLowerCase
-      ? function (val) { return map[val.toLowerCase()]; }
-      : function (val) { return map[val]; }
+      ? function (val) {
+          return map[val.toLowerCase()];
+        }
+      : function (val) {
+          return map[val];
+        };
   }
 
   /**
    * Check if a tag is a built-in tag.
    */
-  var isBuiltInTag = makeMap('slot,component', true);
+  var isBuiltInTag = makeMap("slot,component", true);
 
   /**
    * Check if an attribute is a reserved attribute.
    */
-  var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+  var isReservedAttribute = makeMap("key,ref,slot,slot-scope,is");
 
   /**
    * Remove an item from an array.
    */
-  function remove (arr, item) {
+  function remove(arr, item) {
     if (arr.length) {
       var index = arr.indexOf(item);
       if (index > -1) {
-        return arr.splice(index, 1)
+        return arr.splice(index, 1);
       }
     }
   }
@@ -154,19 +158,19 @@
    * Check whether an object has the property.
    */
   var hasOwnProperty = Object.prototype.hasOwnProperty;
-  function hasOwn (obj, key) {
-    return hasOwnProperty.call(obj, key)
+  function hasOwn(obj, key) {
+    return hasOwnProperty.call(obj, key);
   }
 
   /**
    * Create a cached version of a pure function.
    */
-  function cached (fn) {
+  function cached(fn) {
     var cache = Object.create(null);
-    return (function cachedFn (str) {
+    return function cachedFn(str) {
       var hit = cache[str];
-      return hit || (cache[str] = fn(str))
-    })
+      return hit || (cache[str] = fn(str));
+    };
   }
 
   /**
@@ -174,14 +178,16 @@
    */
   var camelizeRE = /-(\w)/g;
   var camelize = cached(function (str) {
-    return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
+    return str.replace(camelizeRE, function (_, c) {
+      return c ? c.toUpperCase() : "";
+    });
   });
 
   /**
    * Capitalize a string.
    */
   var capitalize = cached(function (str) {
-    return str.charAt(0).toUpperCase() + str.slice(1)
+    return str.charAt(0).toUpperCase() + str.slice(1);
   });
 
   /**
@@ -189,7 +195,7 @@
    */
   var hyphenateRE = /\B([A-Z])/g;
   var hyphenate = cached(function (str) {
-    return str.replace(hyphenateRE, '-$1').toLowerCase()
+    return str.replace(hyphenateRE, "-$1").toLowerCase();
   });
 
   /**
@@ -201,62 +207,60 @@
    */
 
   /* istanbul ignore next */
-  function polyfillBind (fn, ctx) {
-    function boundFn (a) {
+  function polyfillBind(fn, ctx) {
+    function boundFn(a) {
       var l = arguments.length;
       return l
         ? l > 1
           ? fn.apply(ctx, arguments)
           : fn.call(ctx, a)
-        : fn.call(ctx)
+        : fn.call(ctx);
     }
 
     boundFn._length = fn.length;
-    return boundFn
+    return boundFn;
   }
 
-  function nativeBind (fn, ctx) {
-    return fn.bind(ctx)
+  function nativeBind(fn, ctx) {
+    return fn.bind(ctx);
   }
 
-  var bind = Function.prototype.bind
-    ? nativeBind
-    : polyfillBind;
+  var bind = Function.prototype.bind ? nativeBind : polyfillBind;
 
   /**
    * Convert an Array-like object to a real Array.
    */
-  function toArray (list, start) {
+  function toArray(list, start) {
     start = start || 0;
     var i = list.length - start;
     var ret = new Array(i);
     while (i--) {
       ret[i] = list[i + start];
     }
-    return ret
+    return ret;
   }
 
   /**
    * Mix properties into target object.
    */
-  function extend (to, _from) {
+  function extend(to, _from) {
     for (var key in _from) {
       to[key] = _from[key];
     }
-    return to
+    return to;
   }
 
   /**
    * Merge an Array of Objects into a single Object.
    */
-  function toObject (arr) {
+  function toObject(arr) {
     var res = {};
     for (var i = 0; i < arr.length; i++) {
       if (arr[i]) {
         extend(res, arr[i]);
       }
     }
-    return res
+    return res;
   }
 
   /* eslint-disable no-unused-vars */
@@ -266,35 +270,43 @@
    * Stubbing args to make Flow happy without leaving useless transpiled code
    * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
    */
-  function noop (a, b, c) {}
+  function noop(a, b, c) {}
 
   /**
    * Always return false.
    */
-  var no = function (a, b, c) { return false; };
+  var no = function (a, b, c) {
+    return false;
+  };
 
   /* eslint-enable no-unused-vars */
 
   /**
    * Return the same value.
    */
-  var identity = function (_) { return _; };
+  var identity = function (_) {
+    return _;
+  };
 
   /**
    * Generate a string containing static keys from compiler modules.
    */
-  function genStaticKeys (modules) {
-    return modules.reduce(function (keys, m) {
-      return keys.concat(m.staticKeys || [])
-    }, []).join(',')
+  function genStaticKeys(modules) {
+    return modules
+      .reduce(function (keys, m) {
+        return keys.concat(m.staticKeys || []);
+      }, [])
+      .join(",");
   }
 
   /**
    * Check if two values are loosely equal - that is,
    * if they are plain objects, do they have the same shape?
    */
-  function looseEqual (a, b) {
-    if (a === b) { return true }
+  function looseEqual(a, b) {
+    if (a === b) {
+      return true;
+    }
     var isObjectA = isObject(a);
     var isObjectB = isObject(b);
     if (isObjectA && isObjectB) {
@@ -302,29 +314,35 @@
         var isArrayA = Array.isArray(a);
         var isArrayB = Array.isArray(b);
         if (isArrayA && isArrayB) {
-          return a.length === b.length && a.every(function (e, i) {
-            return looseEqual(e, b[i])
-          })
+          return (
+            a.length === b.length &&
+            a.every(function (e, i) {
+              return looseEqual(e, b[i]);
+            })
+          );
         } else if (a instanceof Date && b instanceof Date) {
-          return a.getTime() === b.getTime()
+          return a.getTime() === b.getTime();
         } else if (!isArrayA && !isArrayB) {
           var keysA = Object.keys(a);
           var keysB = Object.keys(b);
-          return keysA.length === keysB.length && keysA.every(function (key) {
-            return looseEqual(a[key], b[key])
-          })
+          return (
+            keysA.length === keysB.length &&
+            keysA.every(function (key) {
+              return looseEqual(a[key], b[key]);
+            })
+          );
         } else {
           /* istanbul ignore next */
-          return false
+          return false;
         }
       } catch (e) {
         /* istanbul ignore next */
-        return false
+        return false;
       }
     } else if (!isObjectA && !isObjectB) {
-      return String(a) === String(b)
+      return String(a) === String(b);
     } else {
-      return false
+      return false;
     }
   }
 
@@ -333,54 +351,50 @@
    * found in the array (if value is a plain object, the array must
    * contain an object of the same shape), or -1 if it is not present.
    */
-  function looseIndexOf (arr, val) {
+  function looseIndexOf(arr, val) {
     for (var i = 0; i < arr.length; i++) {
-      if (looseEqual(arr[i], val)) { return i }
+      if (looseEqual(arr[i], val)) {
+        return i;
+      }
     }
-    return -1
+    return -1;
   }
 
   /**
    * Ensure a function is called only once.
    */
-  function once (fn) {
+  function once(fn) {
     var called = false;
     return function () {
       if (!called) {
         called = true;
         fn.apply(this, arguments);
       }
-    }
+    };
   }
 
-  var SSR_ATTR = 'data-server-rendered';
+  var SSR_ATTR = "data-server-rendered";
 
-  var ASSET_TYPES = [
-    'component',
-    'directive',
-    'filter'
-  ];
+  var ASSET_TYPES = ["component", "directive", "filter"];
 
   var LIFECYCLE_HOOKS = [
-    'beforeCreate',
-    'created',
-    'beforeMount',
-    'mounted',
-    'beforeUpdate',
-    'updated',
-    'beforeDestroy',
-    'destroyed',
-    'activated',
-    'deactivated',
-    'errorCaptured',
-    'serverPrefetch'
+    "beforeCreate",
+    "created",
+    "beforeMount",
+    "mounted",
+    "beforeUpdate",
+    "updated",
+    "beforeDestroy",
+    "destroyed",
+    "activated",
+    "deactivated",
+    "errorCaptured",
+    "serverPrefetch",
   ];
 
   /*  */
 
-
-
-  var config = ({
+  var config = {
     /**
      * Option merge strategies (used in core/util/options)
      */
@@ -395,12 +409,12 @@
     /**
      * Show production mode tip message on boot?
      */
-    productionTip: "development" !== 'production',
+    productionTip: "development" !== "production",
 
     /**
      * Whether to enable devtools
      */
-    devtools: "development" !== 'production',
+    devtools: "development" !== "production",
 
     /**
      * Whether to record perf
@@ -471,8 +485,8 @@
     /**
      * Exposed for legacy reasons
      */
-    _lifecycleHooks: LIFECYCLE_HOOKS
-  });
+    _lifecycleHooks: LIFECYCLE_HOOKS,
+  };
 
   /*  */
 
@@ -481,79 +495,83 @@
    * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
    * skipping \u10000-\uEFFFF due to it freezing up PhantomJS
    */
-  var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
+  var unicodeRegExp =
+    /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
 
   /**
    * Check if a string starts with $ or _
    */
-  function isReserved (str) {
-    var c = (str + '').charCodeAt(0);
-    return c === 0x24 || c === 0x5F
+  function isReserved(str) {
+    var c = (str + "").charCodeAt(0);
+    return c === 0x24 || c === 0x5f;
   }
 
   /**
    * Define a property.
    */
-  function def (obj, key, val, enumerable) {
+  function def(obj, key, val, enumerable) {
     Object.defineProperty(obj, key, {
       value: val,
       enumerable: !!enumerable,
       writable: true,
-      configurable: true
+      configurable: true,
     });
   }
 
   /**
    * Parse simple path.
    */
-  var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
-  function parsePath (path) {
+  var bailRE = new RegExp("[^" + unicodeRegExp.source + ".$_\\d]");
+  function parsePath(path) {
     if (bailRE.test(path)) {
-      return
+      return;
     }
-    var segments = path.split('.');
+    var segments = path.split(".");
     return function (obj) {
       for (var i = 0; i < segments.length; i++) {
-        if (!obj) { return }
+        if (!obj) {
+          return;
+        }
         obj = obj[segments[i]];
       }
-      return obj
-    }
+      return obj;
+    };
   }
 
   /*  */
 
   // can we use __proto__?
-  var hasProto = '__proto__' in {};
+  var hasProto = "__proto__" in {};
 
   // Browser environment sniffing
-  var inBrowser = typeof window !== 'undefined';
-  var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
+  var inBrowser = typeof window !== "undefined";
+  var inWeex = typeof WXEnvironment !== "undefined" && !!WXEnvironment.platform;
   var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
   var UA = inBrowser && window.navigator.userAgent.toLowerCase();
   var isIE = UA && /msie|trident/.test(UA);
-  var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
-  var isEdge = UA && UA.indexOf('edge/') > 0;
-  var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
-  var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
+  var isIE9 = UA && UA.indexOf("msie 9.0") > 0;
+  var isEdge = UA && UA.indexOf("edge/") > 0;
+  var isAndroid =
+    (UA && UA.indexOf("android") > 0) || weexPlatform === "android";
+  var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === "ios";
   var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
   var isPhantomJS = UA && /phantomjs/.test(UA);
   var isFF = UA && UA.match(/firefox\/(\d+)/);
 
   // Firefox has a "watch" function on Object.prototype...
-  var nativeWatch = ({}).watch;
+  var nativeWatch = {}.watch;
 
   var supportsPassive = false;
   if (inBrowser) {
     try {
       var opts = {};
-      Object.defineProperty(opts, 'passive', ({
-        get: function get () {
+      Object.defineProperty(opts, "passive", {
+        get: function get() {
           /* istanbul ignore next */
           supportsPassive = true;
-        }
-      })); // https://github.com/facebook/flow/issues/285
-      window.addEventListener('test-passive', null, opts);
+        },
+      }); // https://github.com/facebook/flow/issues/285
+      window.addEventListener("test-passive", null, opts);
     } catch (e) {}
   }
 
@@ -563,93 +581,101 @@
   var isServerRendering = function () {
     if (_isServer === undefined) {
       /* istanbul ignore if */
-      if (!inBrowser && !inWeex && typeof global !== 'undefined') {
+      if (!inBrowser && !inWeex && typeof global !== "undefined") {
         // detect presence of vue-server-renderer and avoid
         // Webpack shimming the process
-        _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
+        _isServer =
+          global["process"] && global["process"].env.VUE_ENV === "server";
       } else {
         _isServer = false;
       }
     }
-    return _isServer
+    return _isServer;
   };
 
   // detect devtools
   var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
 
   /* istanbul ignore next */
-  function isNative (Ctor) {
-    return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
+  function isNative(Ctor) {
+    return typeof Ctor === "function" && /native code/.test(Ctor.toString());
   }
 
   var hasSymbol =
-    typeof Symbol !== 'undefined' && isNative(Symbol) &&
-    typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
+    typeof Symbol !== "undefined" &&
+    isNative(Symbol) &&
+    typeof Reflect !== "undefined" &&
+    isNative(Reflect.ownKeys);
 
   var _Set;
   /* istanbul ignore if */ // $flow-disable-line
-  if (typeof Set !== 'undefined' && isNative(Set)) {
+  if (typeof Set !== "undefined" && isNative(Set)) {
     // use native Set when available.
     _Set = Set;
   } else {
     // a non-standard Set polyfill that only works with primitive keys.
-    _Set = /*@__PURE__*/(function () {
-      function Set () {
+    _Set = /*@__PURE__*/ (function () {
+      function Set() {
         this.set = Object.create(null);
       }
-      Set.prototype.has = function has (key) {
-        return this.set[key] === true
+      Set.prototype.has = function has(key) {
+        return this.set[key] === true;
       };
-      Set.prototype.add = function add (key) {
+      Set.prototype.add = function add(key) {
         this.set[key] = true;
       };
-      Set.prototype.clear = function clear () {
+      Set.prototype.clear = function clear() {
         this.set = Object.create(null);
       };
 
       return Set;
-    }());
+    })();
   }
 
   /*  */
 
   var warn = noop;
   var tip = noop;
-  var generateComponentTrace = (noop); // work around flow check
-  var formatComponentName = (noop);
+  var generateComponentTrace = noop; // work around flow check
+  var formatComponentName = noop;
 
   {
-    var hasConsole = typeof console !== 'undefined';
+    var hasConsole = typeof console !== "undefined";
     var classifyRE = /(?:^|[-_])(\w)/g;
-    var classify = function (str) { return str
-      .replace(classifyRE, function (c) { return c.toUpperCase(); })
-      .replace(/[-_]/g, ''); };
+    var classify = function (str) {
+      return str
+        .replace(classifyRE, function (c) {
+          return c.toUpperCase();
+        })
+        .replace(/[-_]/g, "");
+    };
 
     warn = function (msg, vm) {
-      var trace = vm ? generateComponentTrace(vm) : '';
+      var trace = vm ? generateComponentTrace(vm) : "";
 
       if (config.warnHandler) {
         config.warnHandler.call(null, msg, vm, trace);
-      } else if (hasConsole && (!config.silent)) {
-        console.error(("[Vue warn]: " + msg + trace));
+      } else if (hasConsole && !config.silent) {
+        console.error("[Vue warn]: " + msg + trace);
       }
     };
 
     tip = function (msg, vm) {
-      if (hasConsole && (!config.silent)) {
-        console.warn("[Vue tip]: " + msg + (
-          vm ? generateComponentTrace(vm) : ''
-        ));
+      if (hasConsole && !config.silent) {
+        console.warn(
+          "[Vue tip]: " + msg + (vm ? generateComponentTrace(vm) : "")
+        );
       }
     };
 
     formatComponentName = function (vm, includeFile) {
       if (vm.$root === vm) {
-        return '<Root>'
+        return "<Root>";
       }
-      var options = typeof vm === 'function' && vm.cid != null
-        ? vm.options
-        : vm._isVue
+      var options =
+        typeof vm === "function" && vm.cid != null
+          ? vm.options
+          : vm._isVue
           ? vm.$options || vm.constructor.options
           : vm;
       var name = options.name || options._componentTag;
@@ -660,19 +686,23 @@
       }
 
       return (
-        (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
-        (file && includeFile !== false ? (" at " + file) : '')
-      )
+        (name ? "<" + classify(name) + ">" : "<Anonymous>") +
+        (file && includeFile !== false ? " at " + file : "")
+      );
     };
 
     var repeat = function (str, n) {
-      var res = '';
+      var res = "";
       while (n) {
-        if (n % 2 === 1) { res += str; }
-        if (n > 1) { str += str; }
+        if (n % 2 === 1) {
+          res += str;
+        }
+        if (n > 1) {
+          str += str;
+        }
         n >>= 1;
       }
-      return res
+      return res;
     };
 
     generateComponentTrace = function (vm) {
@@ -685,7 +715,7 @@
             if (last.constructor === vm.constructor) {
               currentRecursiveSequence++;
               vm = vm.$parent;
-              continue
+              continue;
             } else if (currentRecursiveSequence > 0) {
               tree[tree.length - 1] = [last, currentRecursiveSequence];
               currentRecursiveSequence = 0;
@@ -694,13 +724,25 @@
           tree.push(vm);
           vm = vm.$parent;
         }
-        return '\n\nfound in\n\n' + tree
-          .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
-              ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
-              : formatComponentName(vm))); })
-          .join('\n')
+        return (
+          "\n\nfound in\n\n" +
+          tree
+            .map(function (vm, i) {
+              return (
+                "" +
+                (i === 0 ? "---> " : repeat(" ", 5 + i * 2)) +
+                (Array.isArray(vm)
+                  ? formatComponentName(vm[0]) +
+                    "... (" +
+                    vm[1] +
+                    " recursive calls)"
+                  : formatComponentName(vm))
+              );
+            })
+            .join("\n")
+        );
       } else {
-        return ("\n\n(found in " + (formatComponentName(vm)) + ")")
+        return "\n\n(found in " + formatComponentName(vm) + ")";
       }
     };
   }
@@ -713,33 +755,35 @@
    * A dep is an observable that can have multiple
    * directives subscribing to it.
    */
-  var Dep = function Dep () {
+  var Dep = function Dep() {
     this.id = uid++;
     this.subs = [];
   };
 
-  Dep.prototype.addSub = function addSub (sub) {
+  Dep.prototype.addSub = function addSub(sub) {
     this.subs.push(sub);
   };
 
-  Dep.prototype.removeSub = function removeSub (sub) {
+  Dep.prototype.removeSub = function removeSub(sub) {
     remove(this.subs, sub);
   };
 
-  Dep.prototype.depend = function depend () {
+  Dep.prototype.depend = function depend() {
     if (Dep.target) {
       Dep.target.addDep(this);
     }
   };
 
-  Dep.prototype.notify = function notify () {
+  Dep.prototype.notify = function notify() {
     // stabilize the subscriber list first
     var subs = this.subs.slice();
     if (!config.async) {
       // subs aren't sorted in scheduler if not running async
       // we need to sort them now to make sure they fire in correct
       // order
-      subs.sort(function (a, b) { return a.id - b.id; });
+      subs.sort(function (a, b) {
+        return a.id - b.id;
+      });
     }
     for (var i = 0, l = subs.length; i < l; i++) {
       subs[i].update();
@@ -752,19 +796,19 @@
   Dep.target = null;
   var targetStack = [];
 
-  function pushTarget (target) {
+  function pushTarget(target) {
     targetStack.push(target);
     Dep.target = target;
   }
 
-  function popTarget () {
+  function popTarget() {
     targetStack.pop();
     Dep.target = targetStack[targetStack.length - 1];
   }
 
   /*  */
 
-  var VNode = function VNode (
+  var VNode = function VNode(
     tag,
     data,
     children,
@@ -804,29 +848,29 @@
   // DEPRECATED: alias for componentInstance for backwards compat.
   /* istanbul ignore next */
   prototypeAccessors.child.get = function () {
-    return this.componentInstance
+    return this.componentInstance;
   };
 
-  Object.defineProperties( VNode.prototype, prototypeAccessors );
+  Object.defineProperties(VNode.prototype, prototypeAccessors);
 
   var createEmptyVNode = function (text) {
-    if ( text === void 0 ) text = '';
+    if (text === void 0) text = "";
 
     var node = new VNode();
     node.text = text;
     node.isComment = true;
-    return node
+    return node;
   };
 
-  function createTextVNode (val) {
-    return new VNode(undefined, undefined, undefined, String(val))
+  function createTextVNode(val) {
+    return new VNode(undefined, undefined, undefined, String(val));
   }
 
   // optimized shallow clone
   // used for static nodes and slot nodes because they may be reused across
   // multiple renders, cloning them avoids errors when DOM manipulations rely
   // on their elm reference.
-  function cloneVNode (vnode) {
+  function cloneVNode(vnode) {
     var cloned = new VNode(
       vnode.tag,
       vnode.data,
@@ -849,7 +893,7 @@
     cloned.fnScopeId = vnode.fnScopeId;
     cloned.asyncMeta = vnode.asyncMeta;
     cloned.isCloned = true;
-    return cloned
+    return cloned;
   }
 
   /*
@@ -861,13 +905,13 @@
   var arrayMethods = Object.create(arrayProto);
 
   var methodsToPatch = [
-    'push',
-    'pop',
-    'shift',
-    'unshift',
-    'splice',
-    'sort',
-    'reverse'
+    "push",
+    "pop",
+    "shift",
+    "unshift",
+    "splice",
+    "sort",
+    "reverse",
   ];
 
   /**
@@ -876,26 +920,29 @@
   methodsToPatch.forEach(function (method) {
     // cache original method
     var original = arrayProto[method];
-    def(arrayMethods, method, function mutator () {
-      var args = [], len = arguments.length;
-      while ( len-- ) args[ len ] = arguments[ len ];
+    def(arrayMethods, method, function mutator() {
+      var args = [],
+        len = arguments.length;
+      while (len--) args[len] = arguments[len];
 
       var result = original.apply(this, args);
       var ob = this.__ob__;
       var inserted;
       switch (method) {
-        case 'push':
-        case 'unshift':
+        case "push":
+        case "unshift":
           inserted = args;
-          break
-        case 'splice':
+          break;
+        case "splice":
           inserted = args.slice(2);
-          break
+          break;
+      }
+      if (inserted) {
+        ob.observeArray(inserted);
       }
-      if (inserted) { ob.observeArray(inserted); }
       // notify change
       ob.dep.notify();
-      return result
+      return result;
     });
   });
 
@@ -909,7 +956,7 @@
    */
   var shouldObserve = true;
 
-  function toggleObserving (value) {
+  function toggleObserving(value) {
     shouldObserve = value;
   }
 
@@ -919,11 +966,11 @@
    * object's property keys into getter/setters that
    * collect dependencies and dispatch updates.
    */
-  var Observer = function Observer (value) {
+  var Observer = function Observer(value) {
     this.value = value;
     this.dep = new Dep();
     this.vmCount = 0;
-    def(value, '__ob__', this);
+    def(value, "__ob__", this);
     if (Array.isArray(value)) {
       if (hasProto) {
         protoAugment(value, arrayMethods);
@@ -941,7 +988,7 @@
    * getter/setters. This method should only be called when
    * value type is Object.
    */
-  Observer.prototype.walk = function walk (obj) {
+  Observer.prototype.walk = function walk(obj) {
     var keys = Object.keys(obj);
     for (var i = 0; i < keys.length; i++) {
       defineReactive$$1(obj, keys[i]);
@@ -951,7 +998,7 @@
   /**
    * Observe a list of Array items.
    */
-  Observer.prototype.observeArray = function observeArray (items) {
+  Observer.prototype.observeArray = function observeArray(items) {
     for (var i = 0, l = items.length; i < l; i++) {
       observe(items[i]);
     }
@@ -963,7 +1010,7 @@
    * Augment a target Object or Array by intercepting
    * the prototype chain using __proto__
    */
-  function protoAugment (target, src) {
+  function protoAugment(target, src) {
     /* eslint-disable no-proto */
     target.__proto__ = src;
     /* eslint-enable no-proto */
@@ -974,7 +1021,7 @@
    * hidden properties.
    */
   /* istanbul ignore next */
-  function copyAugment (target, src, keys) {
+  function copyAugment(target, src, keys) {
     for (var i = 0, l = keys.length; i < l; i++) {
       var key = keys[i];
       def(target, key, src[key]);
@@ -986,12 +1033,12 @@
    * returns the new observer if successfully observed,
    * or the existing observer if the value already has one.
    */
-  function observe (value, asRootData) {
+  function observe(value, asRootData) {
     if (!isObject(value) || value instanceof VNode) {
-      return
+      return;
     }
     var ob;
-    if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+    if (hasOwn(value, "__ob__") && value.__ob__ instanceof Observer) {
       ob = value.__ob__;
     } else if (
       shouldObserve &&
@@ -1005,24 +1052,18 @@
     if (asRootData && ob) {
       ob.vmCount++;
     }
-    return ob
+    return ob;
   }
 
   /**
    * Define a reactive property on an Object.
    */
-  function defineReactive$$1 (
-    obj,
-    key,
-    val,
-    customSetter,
-    shallow
-  ) {
+  function defineReactive$$1(obj, key, val, customSetter, shallow) {
     var dep = new Dep();
 
     var property = Object.getOwnPropertyDescriptor(obj, key);
     if (property && property.configurable === false) {
-      return
+      return;
     }
 
     // cater for pre-defined getter/setters
@@ -1036,7 +1077,7 @@
     Object.defineProperty(obj, key, {
       enumerable: true,
       configurable: true,
-      get: function reactiveGetter () {
+      get: function reactiveGetter() {
         var value = getter ? getter.call(obj) : val;
         if (Dep.target) {
           dep.depend();
@@ -1047,20 +1088,22 @@
             }
           }
         }
-        return value
+        return value;
       },
-      set: function reactiveSetter (newVal) {
+      set: function reactiveSetter(newVal) {
         var value = getter ? getter.call(obj) : val;
         /* eslint-disable no-self-compare */
         if (newVal === value || (newVal !== newVal && value !== value)) {
-          return
+          return;
         }
         /* eslint-enable no-self-compare */
         if (customSetter) {
           customSetter();
         }
         // #7981: for accessor properties without setter
-        if (getter && !setter) { return }
+        if (getter && !setter) {
+          return;
+        }
         if (setter) {
           setter.call(obj, newVal);
         } else {
@@ -1068,7 +1111,7 @@
         }
         childOb = !shallow && observe(newVal);
         dep.notify();
-      }
+      },
     });
   }
 
@@ -1077,63 +1120,67 @@
    * triggers change notification if the property doesn't
    * already exist.
    */
-  function set (target, key, val) {
-    if (isUndef(target) || isPrimitive(target)
-    ) {
-      warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
+  function set(target, key, val) {
+    if (isUndef(target) || isPrimitive(target)) {
+      warn(
+        "Cannot set reactive property on undefined, null, or primitive value: " +
+          target
+      );
     }
     if (Array.isArray(target) && isValidArrayIndex(key)) {
       target.length = Math.max(target.length, key);
       target.splice(key, 1, val);
-      return val
+      return val;
     }
     if (key in target && !(key in Object.prototype)) {
       target[key] = val;
-      return val
+      return val;
     }
-    var ob = (target).__ob__;
+    var ob = target.__ob__;
     if (target._isVue || (ob && ob.vmCount)) {
       warn(
-        'Avoid adding reactive properties to a Vue instance or its root $data ' +
-        'at runtime - declare it upfront in the data option.'
+        "Avoid adding reactive properties to a Vue instance or its root $data " +
+          "at runtime - declare it upfront in the data option."
       );
-      return val
+      return val;
     }
     if (!ob) {
       target[key] = val;
-      return val
+      return val;
     }
     defineReactive$$1(ob.value, key, val);
     ob.dep.notify();
-    return val
+    return val;
   }
 
   /**
    * Delete a property and trigger change if necessary.
    */
-  function del (target, key) {
-    if (isUndef(target) || isPrimitive(target)
-    ) {
-      warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
+  function del(target, key) {
+    if (isUndef(target) || isPrimitive(target)) {
+      warn(
+        "Cannot delete reactive property on undefined, null, or primitive value: " +
+          target
+      );
     }
     if (Array.isArray(target) && isValidArrayIndex(key)) {
       target.splice(key, 1);
-      return
+      return;
     }
-    var ob = (target).__ob__;
+    var ob = target.__ob__;
     if (target._isVue || (ob && ob.vmCount)) {
       warn(
-        'Avoid deleting properties on a Vue instance or its root $data ' +
-        '- just set it to null.'
+        "Avoid deleting properties on a Vue instance or its root $data " +
+          "- just set it to null."
       );
-      return
+      return;
     }
     if (!hasOwn(target, key)) {
-      return
+      return;
     }
     delete target[key];
     if (!ob) {
-      return
+      return;
     }
     ob.dep.notify();
   }
@@ -1142,8 +1189,8 @@
    * Collect dependencies on array elements when the array is touched, since
    * we cannot intercept array element access like property getters.
    */
-  function dependArray (value) {
-    for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
+  function dependArray(value) {
+    for (var e = void 0, i = 0, l = value.length; i < l; i++) {
       e = value[i];
       e && e.__ob__ && e.__ob__.dep.depend();
       if (Array.isArray(e)) {
@@ -1168,29 +1215,33 @@
     strats.el = strats.propsData = function (parent, child, vm, key) {
       if (!vm) {
         warn(
-          "option \"" + key + "\" can only be used during instance " +
-          'creation with the `new` keyword.'
+          'option "' +
+            key +
+            '" can only be used during instance ' +
+            "creation with the `new` keyword."
         );
       }
-      return defaultStrat(parent, child)
+      return defaultStrat(parent, child);
     };
   }
 
   /**
    * Helper that recursively merges two data objects together.
    */
-  function mergeData (to, from) {
-    if (!from) { return to }
+  function mergeData(to, from) {
+    if (!from) {
+      return to;
+    }
     var key, toVal, fromVal;
 
-    var keys = hasSymbol
-      ? Reflect.ownKeys(from)
-      : Object.keys(from);
+    var keys = hasSymbol ? Reflect.ownKeys(from) : Object.keys(from);
 
     for (var i = 0; i < keys.length; i++) {
       key = keys[i];
       // in case the object is already observed...
-      if (key === '__ob__') { continue }
+      if (key === "__ob__") {
+        continue;
+      }
       toVal = to[key];
       fromVal = from[key];
       if (!hasOwn(to, key)) {
@@ -1203,103 +1254,90 @@
         mergeData(toVal, fromVal);
       }
     }
-    return to
+    return to;
   }
 
   /**
    * Data
    */
-  function mergeDataOrFn (
-    parentVal,
-    childVal,
-    vm
-  ) {
+  function mergeDataOrFn(parentVal, childVal, vm) {
     if (!vm) {
       // in a Vue.extend merge, both should be functions
       if (!childVal) {
-        return parentVal
+        return parentVal;
       }
       if (!parentVal) {
-        return childVal
+        return childVal;
       }
       // when parentVal & childVal are both present,
       // we need to return a function that returns the
       // merged result of both functions... no need to
       // check if parentVal is a function here because
       // it has to be a function to pass previous merges.
-      return function mergedDataFn () {
+      return function mergedDataFn() {
         return mergeData(
-          typeof childVal === 'function' ? childVal.call(this, this) : childVal,
-          typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
-        )
-      }
+          typeof childVal === "function" ? childVal.call(this, this) : childVal,
+          typeof parentVal === "function"
+            ? parentVal.call(this, this)
+            : parentVal
+        );
+      };
     } else {
-      return function mergedInstanceDataFn () {
+      return function mergedInstanceDataFn() {
         // instance merge
-        var instanceData = typeof childVal === 'function'
-          ? childVal.call(vm, vm)
-          : childVal;
-        var defaultData = typeof parentVal === 'function'
-          ? parentVal.call(vm, vm)
-          : parentVal;
+        var instanceData =
+          typeof childVal === "function" ? childVal.call(vm, vm) : childVal;
+        var defaultData =
+          typeof parentVal === "function" ? parentVal.call(vm, vm) : parentVal;
         if (instanceData) {
-          return mergeData(instanceData, defaultData)
+          return mergeData(instanceData, defaultData);
         } else {
-          return defaultData
+          return defaultData;
         }
-      }
+      };
     }
   }
 
-  strats.data = function (
-    parentVal,
-    childVal,
-    vm
-  ) {
+  strats.data = function (parentVal, childVal, vm) {
     if (!vm) {
-      if (childVal && typeof childVal !== 'function') {
+      if (childVal && typeof childVal !== "function") {
         warn(
           'The "data" option should be a function ' +
-          'that returns a per-instance value in component ' +
-          'definitions.',
+            "that returns a per-instance value in component " +
+            "definitions.",
           vm
         );
 
-        return parentVal
+        return parentVal;
       }
-      return mergeDataOrFn(parentVal, childVal)
+      return mergeDataOrFn(parentVal, childVal);
     }
 
-    return mergeDataOrFn(parentVal, childVal, vm)
+    return mergeDataOrFn(parentVal, childVal, vm);
   };
 
   /**
    * Hooks and props are merged as arrays.
    */
-  function mergeHook (
-    parentVal,
-    childVal
-  ) {
+  function mergeHook(parentVal, childVal) {
     var res = childVal
       ? parentVal
         ? parentVal.concat(childVal)
         : Array.isArray(childVal)
-          ? childVal
-          : [childVal]
+        ? childVal
+        : [childVal]
       : parentVal;
-    return res
-      ? dedupeHooks(res)
-      : res
+    return res ? dedupeHooks(res) : res;
   }
 
-  function dedupeHooks (hooks) {
+  function dedupeHooks(hooks) {
     var res = [];
     for (var i = 0; i < hooks.length; i++) {
       if (res.indexOf(hooks[i]) === -1) {
         res.push(hooks[i]);
       }
     }
-    return res
+    return res;
   }
 
   LIFECYCLE_HOOKS.forEach(function (hook) {
@@ -1313,23 +1351,18 @@
    * a three-way merge between constructor options, instance
    * options and parent options.
    */
-  function mergeAssets (
-    parentVal,
-    childVal,
-    vm,
-    key
-  ) {
+  function mergeAssets(parentVal, childVal, vm, key) {
     var res = Object.create(parentVal || null);
     if (childVal) {
       assertObjectType(key, childVal, vm);
-      return extend(res, childVal)
+      return extend(res, childVal);
     } else {
-      return res
+      return res;
     }
   }
 
   ASSET_TYPES.forEach(function (type) {
-    strats[type + 's'] = mergeAssets;
+    strats[type + "s"] = mergeAssets;
   });
 
   /**
@@ -1338,21 +1371,24 @@
    * Watchers hashes should not overwrite one
    * another, so we merge them as arrays.
    */
-  strats.watch = function (
-    parentVal,
-    childVal,
-    vm,
-    key
-  ) {
+  strats.watch = function (parentVal, childVal, vm, key) {
     // work around Firefox's Object.prototype.watch...
-    if (parentVal === nativeWatch) { parentVal = undefined; }
-    if (childVal === nativeWatch) { childVal = undefined; }
+    if (parentVal === nativeWatch) {
+      parentVal = undefined;
+    }
+    if (childVal === nativeWatch) {
+      childVal = undefined;
+    }
     /* istanbul ignore if */
-    if (!childVal) { return Object.create(parentVal || null) }
+    if (!childVal) {
+      return Object.create(parentVal || null);
+    }
     {
       assertObjectType(key, childVal, vm);
     }
-    if (!parentVal) { return childVal }
+    if (!parentVal) {
+      return childVal;
+    }
     var ret = {};
     extend(ret, parentVal);
     for (var key$1 in childVal) {
@@ -1363,63 +1399,70 @@
       }
       ret[key$1] = parent
         ? parent.concat(child)
-        : Array.isArray(child) ? child : [child];
+        : Array.isArray(child)
+        ? child
+        : [child];
     }
-    return ret
+    return ret;
   };
 
   /**
    * Other object hashes.
    */
   strats.props =
-  strats.methods =
-  strats.inject =
-  strats.computed = function (
-    parentVal,
-    childVal,
-    vm,
-    key
-  ) {
-    if (childVal && "development" !== 'production') {
-      assertObjectType(key, childVal, vm);
-    }
-    if (!parentVal) { return childVal }
-    var ret = Object.create(null);
-    extend(ret, parentVal);
-    if (childVal) { extend(ret, childVal); }
-    return ret
-  };
+    strats.methods =
+    strats.inject =
+    strats.computed =
+      function (parentVal, childVal, vm, key) {
+        if (childVal && "development" !== "production") {
+          assertObjectType(key, childVal, vm);
+        }
+        if (!parentVal) {
+          return childVal;
+        }
+        var ret = Object.create(null);
+        extend(ret, parentVal);
+        if (childVal) {
+          extend(ret, childVal);
+        }
+        return ret;
+      };
   strats.provide = mergeDataOrFn;
 
   /**
    * Default strategy.
    */
   var defaultStrat = function (parentVal, childVal) {
-    return childVal === undefined
-      ? parentVal
-      : childVal
+    return childVal === undefined ? parentVal : childVal;
   };
 
   /**
    * Validate component names
    */
-  function checkComponents (options) {
+  function checkComponents(options) {
     for (var key in options.components) {
       validateComponentName(key);
     }
   }
 
-  function validateComponentName (name) {
-    if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) {
+  function validateComponentName(name) {
+    if (
+      !new RegExp("^[a-zA-Z][\\-\\.0-9_" + unicodeRegExp.source + "]*$").test(
+        name
+      )
+    ) {
       warn(
-        'Invalid component name: "' + name + '". Component names ' +
-        'should conform to valid custom element name in html5 specification.'
+        'Invalid component name: "' +
+          name +
+          '". Component names ' +
+          "should conform to valid custom element name in html5 specification."
       );
     }
     if (isBuiltInTag(name) || config.isReservedTag(name)) {
       warn(
-        'Do not use built-in or reserved HTML elements as component ' +
-        'id: ' + name
+        "Do not use built-in or reserved HTML elements as component " +
+          "id: " +
+          name
       );
     }
   }
@@ -1428,34 +1471,36 @@
    * Ensure all props option syntax are normalized into the
    * Object-based format.
    */
-  function normalizeProps (options, vm) {
+  function normalizeProps(options, vm) {
     var props = options.props;
-    if (!props) { return }
+    if (!props) {
+      return;
+    }
     var res = {};
     var i, val, name;
     if (Array.isArray(props)) {
       i = props.length;
       while (i--) {
         val = props[i];
-        if (typeof val === 'string') {
+        if (typeof val === "string") {
           name = camelize(val);
           res[name] = { type: null };
         } else {
-          warn('props must be strings when using array syntax.');
+          warn("props must be strings when using array syntax.");
         }
       }
     } else if (isPlainObject(props)) {
       for (var key in props) {
         val = props[key];
         name = camelize(key);
-        res[name] = isPlainObject(val)
-          ? val
-          : { type: val };
+        res[name] = isPlainObject(val) ? val : { type: val };
       }
     } else {
       warn(
-        "Invalid value for option \"props\": expected an Array or an Object, " +
-        "but got " + (toRawType(props)) + ".",
+        'Invalid value for option "props": expected an Array or an Object, ' +
+          "but got " +
+          toRawType(props) +
+          ".",
         vm
       );
     }
@@ -1465,10 +1510,12 @@
   /**
    * Normalize all injections into Object-based format
    */
-  function normalizeInject (options, vm) {
+  function normalizeInject(options, vm) {
     var inject = options.inject;
-    if (!inject) { return }
-    var normalized = options.inject = {};
+    if (!inject) {
+      return;
+    }
+    var normalized = (options.inject = {});
     if (Array.isArray(inject)) {
       for (var i = 0; i < inject.length; i++) {
         normalized[inject[i]] = { from: inject[i] };
@@ -1482,8 +1529,10 @@
       }
     } else {
       warn(
-        "Invalid value for option \"inject\": expected an Array or an Object, " +
-        "but got " + (toRawType(inject)) + ".",
+        'Invalid value for option "inject": expected an Array or an Object, ' +
+          "but got " +
+          toRawType(inject) +
+          ".",
         vm
       );
     }
@@ -1492,23 +1541,27 @@
   /**
    * Normalize raw function directives into object format.
    */
-  function normalizeDirectives (options) {
+  function normalizeDirectives(options) {
     var dirs = options.directives;
     if (dirs) {
       for (var key in dirs) {
         var def$$1 = dirs[key];
-        if (typeof def$$1 === 'function') {
+        if (typeof def$$1 === "function") {
           dirs[key] = { bind: def$$1, update: def$$1 };
         }
       }
     }
   }
 
-  function assertObjectType (name, value, vm) {
+  function assertObjectType(name, value, vm) {
     if (!isPlainObject(value)) {
       warn(
-        "Invalid value for option \"" + name + "\": expected an Object, " +
-        "but got " + (toRawType(value)) + ".",
+        'Invalid value for option "' +
+          name +
+          '": expected an Object, ' +
+          "but got " +
+          toRawType(value) +
+          ".",
         vm
       );
     }
@@ -1518,16 +1571,12 @@
    * Merge two option objects into a new one.
    * Core utility used in both instantiation and inheritance.
    */
-  function mergeOptions (
-    parent,
-    child,
-    vm
-  ) {
+  function mergeOptions(parent, child, vm) {
     {
       checkComponents(child);
     }
 
-    if (typeof child === 'function') {
+    if (typeof child === "function") {
       child = child.options;
     }
 
@@ -1560,11 +1609,11 @@
         mergeField(key);
       }
     }
-    function mergeField (key) {
+    function mergeField(key) {
       var strat = strats[key] || defaultStrat;
       options[key] = strat(parent[key], child[key], vm, key);
     }
-    return options
+    return options;
   }
 
   /**
@@ -1572,53 +1621,44 @@
    * This function is used because child instances need access
    * to assets defined in its ancestor chain.
    */
-  function resolveAsset (
-    options,
-    type,
-    id,
-    warnMissing
-  ) {
+  function resolveAsset(options, type, id, warnMissing) {
     /* istanbul ignore if */
-    if (typeof id !== 'string') {
-      return
+    if (typeof id !== "string") {
+      return;
     }
     var assets = options[type];
     // check local registration variations first
-    if (hasOwn(assets, id)) { return assets[id] }
+    if (hasOwn(assets, id)) {
+      return assets[id];
+    }
     var camelizedId = camelize(id);
-    if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
+    if (hasOwn(assets, camelizedId)) {
+      return assets[camelizedId];
+    }
     var PascalCaseId = capitalize(camelizedId);
-    if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
+    if (hasOwn(assets, PascalCaseId)) {
+      return assets[PascalCaseId];
+    }
     // fallback to prototype chain
     var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
     if (warnMissing && !res) {
-      warn(
-        'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
-        options
-      );
+      warn("Failed to resolve " + type.slice(0, -1) + ": " + id, options);
     }
-    return res
+    return res;
   }
 
   /*  */
 
-
-
-  function validateProp (
-    key,
-    propOptions,
-    propsData,
-    vm
-  ) {
+  function validateProp(key, propOptions, propsData, vm) {
     var prop = propOptions[key];
     var absent = !hasOwn(propsData, key);
     var value = propsData[key];
     // boolean casting
     var booleanIndex = getTypeIndex(Boolean, prop.type);
     if (booleanIndex > -1) {
-      if (absent && !hasOwn(prop, 'default')) {
+      if (absent && !hasOwn(prop, "default")) {
         value = false;
-      } else if (value === '' || value === hyphenate(key)) {
+      } else if (value === "" || value === hyphenate(key)) {
         // only cast empty string / same name to boolean if
         // boolean has higher priority
         var stringIndex = getTypeIndex(String, prop.type);
@@ -1640,61 +1680,56 @@
     {
       assertProp(prop, key, value, vm, absent);
     }
-    return value
+    return value;
   }
 
   /**
    * Get the default value of a prop.
    */
-  function getPropDefaultValue (vm, prop, key) {
+  function getPropDefaultValue(vm, prop, key) {
     // no default, return undefined
-    if (!hasOwn(prop, 'default')) {
-      return undefined
+    if (!hasOwn(prop, "default")) {
+      return undefined;
     }
     var def = prop.default;
     // warn against non-factory defaults for Object & Array
     if (isObject(def)) {
       warn(
-        'Invalid default value for prop "' + key + '": ' +
-        'Props with type Object/Array must use a factory function ' +
-        'to return the default value.',
+        'Invalid default value for prop "' +
+          key +
+          '": ' +
+          "Props with type Object/Array must use a factory function " +
+          "to return the default value.",
         vm
       );
     }
     // the raw prop value was also undefined from previous render,
     // return previous default value to avoid unnecessary watcher trigger
-    if (vm && vm.$options.propsData &&
+    if (
+      vm &&
+      vm.$options.propsData &&
       vm.$options.propsData[key] === undefined &&
       vm._props[key] !== undefined
     ) {
-      return vm._props[key]
+      return vm._props[key];
     }
     // call factory function for non-Function types
     // a value is Function if its prototype is function even across different execution context
-    return typeof def === 'function' && getType(prop.type) !== 'Function'
+    return typeof def === "function" && getType(prop.type) !== "Function"
       ? def.call(vm)
-      : def
+      : def;
   }
 
   /**
    * Assert whether a prop is valid.
    */
-  function assertProp (
-    prop,
-    name,
-    value,
-    vm,
-    absent
-  ) {
+  function assertProp(prop, name, value, vm, absent) {
     if (prop.required && absent) {
-      warn(
-        'Missing required prop: "' + name + '"',
-        vm
-      );
-      return
+      warn('Missing required prop: "' + name + '"', vm);
+      return;
     }
     if (value == null && !prop.required) {
-      return
+      return;
     }
     var type = prop.type;
     var valid = !type || type === true;
@@ -1705,23 +1740,22 @@
       }
       for (var i = 0; i < type.length && !valid; i++) {
         var assertedType = assertType(value, type[i]);
-        expectedTypes.push(assertedType.expectedType || '');
+        expectedTypes.push(assertedType.expectedType || "");
         valid = assertedType.valid;
       }
     }
 
     if (!valid) {
-      warn(
-        getInvalidTypeMessage(name, value, expectedTypes),
-        vm
-      );
-      return
+      warn(getInvalidTypeMessage(name, value, expectedTypes), vm);
+      return;
     }
     var validator = prop.validator;
     if (validator) {
       if (!validator(value)) {
         warn(
-          'Invalid prop: custom validator check failed for prop "' + name + '".',
+          'Invalid prop: custom validator check failed for prop "' +
+            name +
+            '".',
           vm
         );
       }
@@ -1730,27 +1764,27 @@
 
   var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
 
-  function assertType (value, type) {
+  function assertType(value, type) {
     var valid;
     var expectedType = getType(type);
     if (simpleCheckRE.test(expectedType)) {
       var t = typeof value;
       valid = t === expectedType.toLowerCase();
       // for primitive wrapper objects
-      if (!valid && t === 'object') {
+      if (!valid && t === "object") {
         valid = value instanceof type;
       }
-    } else if (expectedType === 'Object') {
+    } else if (expectedType === "Object") {
       valid = isPlainObject(value);
-    } else if (expectedType === 'Array') {
+    } else if (expectedType === "Array") {
       valid = Array.isArray(value);
     } else {
       valid = value instanceof type;
     }
     return {
       valid: valid,
-      expectedType: expectedType
-    }
+      expectedType: expectedType,
+    };
   }
 
   /**
@@ -1758,38 +1792,44 @@
    * because a simple equality check will fail when running
    * across different vms / iframes.
    */
-  function getType (fn) {
+  function getType(fn) {
     var match = fn && fn.toString().match(/^\s*function (\w+)/);
-    return match ? match[1] : ''
+    return match ? match[1] : "";
   }
 
-  function isSameType (a, b) {
-    return getType(a) === getType(b)
+  function isSameType(a, b) {
+    return getType(a) === getType(b);
   }
 
-  function getTypeIndex (type, expectedTypes) {
+  function getTypeIndex(type, expectedTypes) {
     if (!Array.isArray(expectedTypes)) {
-      return isSameType(expectedTypes, type) ? 0 : -1
+      return isSameType(expectedTypes, type) ? 0 : -1;
     }
     for (var i = 0, len = expectedTypes.length; i < len; i++) {
       if (isSameType(expectedTypes[i], type)) {
-        return i
+        return i;
       }
     }
-    return -1
+    return -1;
   }
 
-  function getInvalidTypeMessage (name, value, expectedTypes) {
-    var message = "Invalid prop: type check failed for prop \"" + name + "\"." +
-      " Expected " + (expectedTypes.map(capitalize).join(', '));
+  function getInvalidTypeMessage(name, value, expectedTypes) {
+    var message =
+      'Invalid prop: type check failed for prop "' +
+      name +
+      '".' +
+      " Expected " +
+      expectedTypes.map(capitalize).join(", ");
     var expectedType = expectedTypes[0];
     var receivedType = toRawType(value);
     var expectedValue = styleValue(value, expectedType);
     var receivedValue = styleValue(value, receivedType);
     // check if we need to specify expected value
-    if (expectedTypes.length === 1 &&
-        isExplicable(expectedType) &&
-        !isBoolean(expectedType, receivedType)) {
+    if (
+      expectedTypes.length === 1 &&
+      isExplicable(expectedType) &&
+      !isBoolean(expectedType, receivedType)
+    ) {
       message += " with value " + expectedValue;
     }
     message += ", got " + receivedType + " ";
@@ -1797,34 +1837,39 @@
     if (isExplicable(receivedType)) {
       message += "with value " + receivedValue + ".";
     }
-    return message
+    return message;
   }
 
-  function styleValue (value, type) {
-    if (type === 'String') {
-      return ("\"" + value + "\"")
-    } else if (type === 'Number') {
-      return ("" + (Number(value)))
+  function styleValue(value, type) {
+    if (type === "String") {
+      return '"' + value + '"';
+    } else if (type === "Number") {
+      return "" + Number(value);
     } else {
-      return ("" + value)
+      return "" + value;
     }
   }
 
-  function isExplicable (value) {
-    var explicitTypes = ['string', 'number', 'boolean'];
-    return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })
+  function isExplicable(value) {
+    var explicitTypes = ["string", "number", "boolean"];
+    return explicitTypes.some(function (elem) {
+      return value.toLowerCase() === elem;
+    });
   }
 
-  function isBoolean () {
-    var args = [], len = arguments.length;
-    while ( len-- ) args[ len ] = arguments[ len ];
+  function isBoolean() {
+    var args = [],
+      len = arguments.length;
+    while (len--) args[len] = arguments[len];
 
-    return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })
+    return args.some(function (elem) {
+      return elem.toLowerCase() === "boolean";
+    });
   }
 
   /*  */
 
-  function handleError (err, vm, info) {
+  function handleError(err, vm, info) {
     // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
     // See: https://github.com/vuejs/vuex/issues/1505
     pushTarget();
@@ -1837,9 +1882,11 @@
             for (var i = 0; i < hooks.length; i++) {
               try {
                 var capture = hooks[i].call(cur, err, vm, info) === false;
-                if (capture) { return }
+                if (capture) {
+                  return;
+                }
               } catch (e) {
-                globalHandleError(e, cur, 'errorCaptured hook');
+                globalHandleError(e, cur, "errorCaptured hook");
               }
             }
           }
@@ -1851,18 +1898,14 @@
     }
   }
 
-  function invokeWithErrorHandling (
-    handler,
-    context,
-    args,
-    vm,
-    info
-  ) {
+  function invokeWithErrorHandling(handler, context, args, vm, info) {
     var res;
     try {
       res = args ? handler.apply(context, args) : handler.call(context);
       if (res && !res._isVue && isPromise(res) && !res._handled) {
-        res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
+        res.catch(function (e) {
+          return handleError(e, vm, info + " (Promise/async)");
+        });
         // issue #9511
         // avoid catch triggering multiple times when nested calls
         res._handled = true;
@@ -1870,33 +1913,33 @@
     } catch (e) {
       handleError(e, vm, info);
     }
-    return res
+    return res;
   }
 
-  function globalHandleError (err, vm, info) {
+  function globalHandleError(err, vm, info) {
     if (config.errorHandler) {
       try {
-        return config.errorHandler.call(null, err, vm, info)
+        return config.errorHandler.call(null, err, vm, info);
       } catch (e) {
         // if the user intentionally throws the original error in the handler,
         // do not log it twice
         if (e !== err) {
-          logError(e, null, 'config.errorHandler');
+          logError(e, null, "config.errorHandler");
         }
       }
     }
     logError(err, vm, info);
   }
 
-  function logError (err, vm, info) {
+  function logError(err, vm, info) {
     {
-      warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
+      warn("Error in " + info + ': "' + err.toString() + '"', vm);
     }
     /* istanbul ignore else */
-    if ((inBrowser || inWeex) && typeof console !== 'undefined') {
+    if ((inBrowser || inWeex) && typeof console !== "undefined") {
       console.error(err);
     } else {
-      throw err
+      throw err;
     }
   }
 
@@ -1907,7 +1950,7 @@
   var callbacks = [];
   var pending = false;
 
-  function flushCallbacks () {
+  function flushCallbacks() {
     pending = false;
     var copies = callbacks.slice(0);
     callbacks.length = 0;
@@ -1936,7 +1979,7 @@
   // completely stops working after triggering a few times... so, if native
   // Promise is available, we will use it:
   /* istanbul ignore next, $flow-disable-line */
-  if (typeof Promise !== 'undefined' && isNative(Promise)) {
+  if (typeof Promise !== "undefined" && isNative(Promise)) {
     var p = Promise.resolve();
     timerFunc = function () {
       p.then(flushCallbacks);
@@ -1945,14 +1988,18 @@
       // microtask queue but the queue isn't being flushed, until the browser
       // needs to do some other work, e.g. handle a timer. Therefore we can
       // "force" the microtask queue to be flushed by adding an empty timer.
-      if (isIOS) { setTimeout(noop); }
+      if (isIOS) {
+        setTimeout(noop);
+      }
     };
     isUsingMicroTask = true;
-  } else if (!isIE && typeof MutationObserver !== 'undefined' && (
-    isNative(MutationObserver) ||
-    // PhantomJS and iOS 7.x
-    MutationObserver.toString() === '[object MutationObserverConstructor]'
-  )) {
+  } else if (
+    !isIE &&
+    typeof MutationObserver !== "undefined" &&
+    (isNative(MutationObserver) ||
+      // PhantomJS and iOS 7.x
+      MutationObserver.toString() === "[object MutationObserverConstructor]")
+  ) {
     // Use MutationObserver where native Promise is not available,
     // e.g. PhantomJS, iOS7, Android 4.4
     // (#6466 MutationObserver is unreliable in IE11)
@@ -1960,14 +2007,14 @@
     var observer = new MutationObserver(flushCallbacks);
     var textNode = document.createTextNode(String(counter));
     observer.observe(textNode, {
-      characterData: true
+      characterData: true,
     });
     timerFunc = function () {
       counter = (counter + 1) % 2;
       textNode.data = String(counter);
     };
     isUsingMicroTask = true;
-  } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
+  } else if (typeof setImmediate !== "undefined" && isNative(setImmediate)) {
     // Fallback to setImmediate.
     // Technically it leverages the (macro) task queue,
     // but it is still a better choice than setTimeout.
@@ -1981,14 +2028,14 @@
     };
   }
 
-  function nextTick (cb, ctx) {
+  function nextTick(cb, ctx) {
     var _resolve;
     callbacks.push(function () {
       if (cb) {
         try {
           cb.call(ctx);
         } catch (e) {
-          handleError(e, ctx, 'nextTick');
+          handleError(e, ctx, "nextTick");
         }
       } else if (_resolve) {
         _resolve(ctx);
@@ -1999,10 +2046,10 @@
       timerFunc();
     }
     // $flow-disable-line
-    if (!cb && typeof Promise !== 'undefined') {
+    if (!cb && typeof Promise !== "undefined") {
       return new Promise(function (resolve) {
         _resolve = resolve;
-      })
+      });
     }
   }
 
@@ -2021,7 +2068,9 @@
       perf.clearMarks &&
       perf.clearMeasures
     ) {
-      mark = function (tag) { return perf.mark(tag); };
+      mark = function (tag) {
+        return perf.mark(tag);
+      };
       measure = function (name, startTag, endTag) {
         perf.measure(name, startTag, endTag);
         perf.clearMarks(startTag);
@@ -2037,81 +2086,100 @@
 
   {
     var allowedGlobals = makeMap(
-      'Infinity,undefined,NaN,isFinite,isNaN,' +
-      'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
-      'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
-      'require' // for Webpack/Browserify
+      "Infinity,undefined,NaN,isFinite,isNaN," +
+        "parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent," +
+        "Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl," +
+        "require" // for Webpack/Browserify
     );
 
     var warnNonPresent = function (target, key) {
       warn(
-        "Property or method \"" + key + "\" is not defined on the instance but " +
-        'referenced during render. Make sure that this property is reactive, ' +
-        'either in the data option, or for class-based components, by ' +
-        'initializing the property. ' +
-        'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
+        'Property or method "' +
+          key +
+          '" is not defined on the instance but ' +
+          "referenced during render. Make sure that this property is reactive, " +
+          "either in the data option, or for class-based components, by " +
+          "initializing the property. " +
+          "See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.",
         target
       );
     };
 
     var warnReservedPrefix = function (target, key) {
       warn(
-        "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " +
-        'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
-        'prevent conflicts with Vue internals. ' +
-        'See: https://vuejs.org/v2/api/#data',
+        'Property "' +
+          key +
+          '" must be accessed with "$data.' +
+          key +
+          '" because ' +
+          'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
+          "prevent conflicts with Vue internals. " +
+          "See: https://vuejs.org/v2/api/#data",
         target
       );
     };
 
-    var hasProxy =
-      typeof Proxy !== 'undefined' && isNative(Proxy);
+    var hasProxy = typeof Proxy !== "undefined" && isNative(Proxy);
 
     if (hasProxy) {
-      var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
+      var isBuiltInModifier = makeMap(
+        "stop,prevent,self,ctrl,shift,alt,meta,exact"
+      );
       config.keyCodes = new Proxy(config.keyCodes, {
-        set: function set (target, key, value) {
+        set: function set(target, key, value) {
           if (isBuiltInModifier(key)) {
-            warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
-            return false
+            warn(
+              "Avoid overwriting built-in modifier in config.keyCodes: ." + key
+            );
+            return false;
           } else {
             target[key] = value;
-            return true
+            return true;
           }
-        }
+        },
       });
     }
 
     var hasHandler = {
-      has: function has (target, key) {
+      has: function has(target, key) {
         var has = key in target;
-        var isAllowed = allowedGlobals(key) ||
-          (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
+        var isAllowed =
+          allowedGlobals(key) ||
+          (typeof key === "string" &&
+            key.charAt(0) === "_" &&
+            !(key in target.$data));
         if (!has && !isAllowed) {
-          if (key in target.$data) { warnReservedPrefix(target, key); }
-          else { warnNonPresent(target, key); }
+          if (key in target.$data) {
+            warnReservedPrefix(target, key);
+          } else {
+            warnNonPresent(target, key);
+          }
         }
-        return has || !isAllowed
-      }
+        return has || !isAllowed;
+      },
     };
 
     var getHandler = {
-      get: function get (target, key) {
-        if (typeof key === 'string' && !(key in target)) {
-          if (key in target.$data) { warnReservedPrefix(target, key); }
-          else { warnNonPresent(target, key); }
+      get: function get(target, key) {
+        if (typeof key === "string" && !(key in target)) {
+          if (key in target.$data) {
+            warnReservedPrefix(target, key);
+          } else {
+            warnNonPresent(target, key);
+          }
         }
-        return target[key]
-      }
+        return target[key];
+      },
     };
 
-    initProxy = function initProxy (vm) {
+    initProxy = function initProxy(vm) {
       if (hasProxy) {
         // determine which proxy handler to use
         var options = vm.$options;
-        var handlers = options.render && options.render._withStripped
-          ? getHandler
-          : hasHandler;
+        var handlers =
+          options.render && options.render._withStripped
+            ? getHandler
+            : hasHandler;
         vm._renderProxy = new Proxy(vm, handlers);
       } else {
         vm._renderProxy = vm;
@@ -2128,78 +2196,91 @@
    * getters, so that every nested property inside the object
    * is collected as a "deep" dependency.
    */
-  function traverse (val) {
+  function traverse(val) {
     _traverse(val, seenObjects);
     seenObjects.clear();
   }
 
-  function _traverse (val, seen) {
+  function _traverse(val, seen) {
     var i, keys;
     var isA = Array.isArray(val);
-    if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
-      return
+    if (
+      (!isA && !isObject(val)) ||
+      Object.isFrozen(val) ||
+      val instanceof VNode
+    ) {
+      return;
     }
     if (val.__ob__) {
       var depId = val.__ob__.dep.id;
       if (seen.has(depId)) {
-        return
+        return;
       }
       seen.add(depId);
     }
     if (isA) {
       i = val.length;
-      while (i--) { _traverse(val[i], seen); }
+      while (i--) {
+        _traverse(val[i], seen);
+      }
     } else {
       keys = Object.keys(val);
       i = keys.length;
-      while (i--) { _traverse(val[keys[i]], seen); }
+      while (i--) {
+        _traverse(val[keys[i]], seen);
+      }
     }
   }
 
   /*  */
 
   var normalizeEvent = cached(function (name) {
-    var passive = name.charAt(0) === '&';
+    var passive = name.charAt(0) === "&";
     name = passive ? name.slice(1) : name;
-    var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
+    var once$$1 = name.charAt(0) === "~"; // Prefixed last, checked first
     name = once$$1 ? name.slice(1) : name;
-    var capture = name.charAt(0) === '!';
+    var capture = name.charAt(0) === "!";
     name = capture ? name.slice(1) : name;
     return {
       name: name,
       once: once$$1,
       capture: capture,
-      passive: passive
-    }
+      passive: passive,
+    };
   });
 
-  function createFnInvoker (fns, vm) {
-    function invoker () {
+  function createFnInvoker(fns, vm) {
+    function invoker() {
       var arguments$1 = arguments;
 
       var fns = invoker.fns;
       if (Array.isArray(fns)) {
         var cloned = fns.slice();
         for (var i = 0; i < cloned.length; i++) {
-          invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
+          invokeWithErrorHandling(
+            cloned[i],
+            null,
+            arguments$1,
+            vm,
+            "v-on handler"
+          );
         }
       } else {
         // return handler return value for single handlers
-        return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
+        return invokeWithErrorHandling(
+          fns,
+          null,
+          arguments,
+          vm,
+          "v-on handler"
+        );
       }
     }
     invoker.fns = fns;
-    return invoker
+    return invoker;
   }
 
-  function updateListeners (
-    on,
-    oldOn,
-    add,
-    remove$$1,
-    createOnceHandler,
-    vm
-  ) {
+  function updateListeners(on, oldOn, add, remove$$1, createOnceHandler, vm) {
     var name, def$$1, cur, old, event;
     for (name in on) {
       def$$1 = cur = on[name];
@@ -2207,7 +2288,7 @@
       event = normalizeEvent(name);
       if (isUndef(cur)) {
         warn(
-          "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
+          'Invalid handler for event "' + event.name + '": got ' + String(cur),
           vm
         );
       } else if (isUndef(old)) {
@@ -2233,14 +2314,14 @@
 
   /*  */
 
-  function mergeVNodeHook (def, hookKey, hook) {
+  function mergeVNodeHook(def, hookKey, hook) {
     if (def instanceof VNode) {
       def = def.data.hook || (def.data.hook = {});
     }
     var invoker;
     var oldHook = def[hookKey];
 
-    function wrappedHook () {
+    function wrappedHook() {
       hook.apply(this, arguments);
       // important: remove merged hook to ensure it's called only once
       // and prevent memory leak
@@ -2268,17 +2349,13 @@
 
   /*  */
 
-  function extractPropsFromVNodeData (
-    data,
-    Ctor,
-    tag
-  ) {
+  function extractPropsFromVNodeData(data, Ctor, tag) {
     // we are only extracting raw values here.
     // validation and default values are handled in the child
     // component itself.
     var propOptions = Ctor.options.props;
     if (isUndef(propOptions)) {
-      return
+      return;
     }
     var res = {};
     var attrs = data.attrs;
@@ -2290,48 +2367,52 @@
           var keyInLowerCase = key.toLowerCase();
           if (
             key !== keyInLowerCase &&
-            attrs && hasOwn(attrs, keyInLowerCase)
+            attrs &&
+            hasOwn(attrs, keyInLowerCase)
           ) {
             tip(
-              "Prop \"" + keyInLowerCase + "\" is passed to component " +
-              (formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
-              " \"" + key + "\". " +
-              "Note that HTML attributes are case-insensitive and camelCased " +
-              "props need to use their kebab-case equivalents when using in-DOM " +
-              "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
+              'Prop "' +
+                keyInLowerCase +
+                '" is passed to component ' +
+                formatComponentName(tag || Ctor) +
+                ", but the declared prop name is" +
+                ' "' +
+                key +
+                '". ' +
+                "Note that HTML attributes are case-insensitive and camelCased " +
+                "props need to use their kebab-case equivalents when using in-DOM " +
+                'templates. You should probably use "' +
+                altKey +
+                '" instead of "' +
+                key +
+                '".'
             );
           }
         }
         checkProp(res, props, key, altKey, true) ||
-        checkProp(res, attrs, key, altKey, false);
+          checkProp(res, attrs, key, altKey, false);
       }
     }
-    return res
+    return res;
   }
 
-  function checkProp (
-    res,
-    hash,
-    key,
-    altKey,
-    preserve
-  ) {
+  function checkProp(res, hash, key, altKey, preserve) {
     if (isDef(hash)) {
       if (hasOwn(hash, key)) {
         res[key] = hash[key];
         if (!preserve) {
           delete hash[key];
         }
-        return true
+        return true;
       } else if (hasOwn(hash, altKey)) {
         res[key] = hash[altKey];
         if (!preserve) {
           delete hash[altKey];
         }
-        return true
+        return true;
       }
     }
-    return false
+    return false;
   }
 
   /*  */
@@ -2348,46 +2429,48 @@
   // normalization is needed - if any child is an Array, we flatten the whole
   // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
   // because functional components already normalize their own children.
-  function simpleNormalizeChildren (children) {
+  function simpleNormalizeChildren(children) {
     for (var i = 0; i < children.length; i++) {
       if (Array.isArray(children[i])) {
-        return Array.prototype.concat.apply([], children)
+        return Array.prototype.concat.apply([], children);
       }
     }
-    return children
+    return children;
   }
 
   // 2. When the children contains constructs that always generated nested Arrays,
   // e.g. <template>, <slot>, v-for, or when the children is provided by user
   // with hand-written render functions / JSX. In such cases a full normalization
   // is needed to cater to all possible types of children values.
-  function normalizeChildren (children) {
+  function normalizeChildren(children) {
     return isPrimitive(children)
       ? [createTextVNode(children)]
       : Array.isArray(children)
-        ? normalizeArrayChildren(children)
-        : undefined
+      ? normalizeArrayChildren(children)
+      : undefined;
   }
 
-  function isTextNode (node) {
-    return isDef(node) && isDef(node.text) && isFalse(node.isComment)
+  function isTextNode(node) {
+    return isDef(node) && isDef(node.text) && isFalse(node.isComment);
   }
 
-  function normalizeArrayChildren (children, nestedIndex) {
+  function normalizeArrayChildren(children, nestedIndex) {
     var res = [];
     var i, c, lastIndex, last;
     for (i = 0; i < children.length; i++) {
       c = children[i];
-      if (isUndef(c) || typeof c === 'boolean') { continue }
+      if (isUndef(c) || typeof c === "boolean") {
+        continue;
+      }
       lastIndex = res.length - 1;
       last = res[lastIndex];
       //  nested
       if (Array.isArray(c)) {
         if (c.length > 0) {
-          c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
+          c = normalizeArrayChildren(c, (nestedIndex || "") + "_" + i);
           // merge adjacent text nodes
           if (isTextNode(c[0]) && isTextNode(last)) {
-            res[lastIndex] = createTextVNode(last.text + (c[0]).text);
+            res[lastIndex] = createTextVNode(last.text + c[0].text);
             c.shift();
           }
           res.push.apply(res, c);
@@ -2398,7 +2481,7 @@
           // this is necessary for SSR hydration because text nodes are
           // essentially merged when rendered to HTML strings
           res[lastIndex] = createTextVNode(last.text + c);
-        } else if (c !== '') {
+        } else if (c !== "") {
           // convert primitive to vnode
           res.push(createTextVNode(c));
         }
@@ -2408,31 +2491,31 @@
           res[lastIndex] = createTextVNode(last.text + c.text);
         } else {
           // default key for nested array children (likely generated by v-for)
-          if (isTrue(children._isVList) &&
+          if (
+            isTrue(children._isVList) &&
             isDef(c.tag) &&
             isUndef(c.key) &&
-            isDef(nestedIndex)) {
+            isDef(nestedIndex)
+          ) {
             c.key = "__vlist" + nestedIndex + "_" + i + "__";
           }
           res.push(c);
         }
       }
     }
-    return res
+    return res;
   }
 
   /*  */
 
-  function initProvide (vm) {
+  function initProvide(vm) {
     var provide = vm.$options.provide;
     if (provide) {
-      vm._provided = typeof provide === 'function'
-        ? provide.call(vm)
-        : provide;
+      vm._provided = typeof provide === "function" ? provide.call(vm) : provide;
     }
   }
 
-  function initInjections (vm) {
+  function initInjections(vm) {
     var result = resolveInject(vm.$options.inject, vm);
     if (result) {
       toggleObserving(false);
@@ -2442,8 +2525,10 @@
           defineReactive$$1(vm, key, result[key], function () {
             warn(
               "Avoid mutating an injected value directly since the changes will be " +
-              "overwritten whenever the provided component re-renders. " +
-              "injection being mutated: \"" + key + "\"",
+                "overwritten whenever the provided component re-renders. " +
+                'injection being mutated: "' +
+                key +
+                '"',
               vm
             );
           });
@@ -2453,55 +2538,51 @@
     }
   }
 
-  function resolveInject (inject, vm) {
+  function resolveInject(inject, vm) {
     if (inject) {
       // inject is :any because flow is not smart enough to figure out cached
       var result = Object.create(null);
-      var keys = hasSymbol
-        ? Reflect.ownKeys(inject)
-        : Object.keys(inject);
+      var keys = hasSymbol ? Reflect.ownKeys(inject) : Object.keys(inject);
 
       for (var i = 0; i < keys.length; i++) {
         var key = keys[i];
         // #6574 in case the inject object is observed...
-        if (key === '__ob__') { continue }
+        if (key === "__ob__") {
+          continue;
+        }
         var provideKey = inject[key].from;
         var source = vm;
         while (source) {
           if (source._provided && hasOwn(source._provided, provideKey)) {
             result[key] = source._provided[provideKey];
-            break
+            break;
           }
           source = source.$parent;
         }
         if (!source) {
-          if ('default' in inject[key]) {
+          if ("default" in inject[key]) {
             var provideDefault = inject[key].default;
-            result[key] = typeof provideDefault === 'function'
-              ? provideDefault.call(vm)
-              : provideDefault;
+            result[key] =
+              typeof provideDefault === "function"
+                ? provideDefault.call(vm)
+                : provideDefault;
           } else {
-            warn(("Injection \"" + key + "\" not found"), vm);
+            warn('Injection "' + key + '" not found', vm);
           }
         }
       }
-      return result
+      return result;
     }
   }
 
   /*  */
 
-
-
   /**
    * Runtime helper for resolving raw children VNodes into a slot object.
    */
-  function resolveSlots (
-    children,
-    context
-  ) {
+  function resolveSlots(children, context) {
     if (!children || !children.length) {
-      return {}
+      return {};
     }
     var slots = {};
     for (var i = 0, l = children.length; i < l; i++) {
@@ -2513,12 +2594,14 @@
       }
       // named slots should only be respected if the vnode was rendered in the
       // same context.
-      if ((child.context === context || child.fnContext === context) &&
-        data && data.slot != null
+      if (
+        (child.context === context || child.fnContext === context) &&
+        data &&
+        data.slot != null
       ) {
         var name = data.slot;
-        var slot = (slots[name] || (slots[name] = []));
-        if (child.tag === 'template') {
+        var slot = slots[name] || (slots[name] = []);
+        if (child.tag === "template") {
           slot.push.apply(slot, child.children || []);
         } else {
           slot.push(child);
@@ -2533,20 +2616,16 @@
         delete slots[name$1];
       }
     }
-    return slots
+    return slots;
   }
 
-  function isWhitespace (node) {
-    return (node.isComment && !node.asyncFactory) || node.text === ' '
+  function isWhitespace(node) {
+    return (node.isComment && !node.asyncFactory) || node.text === " ";
   }
 
   /*  */
 
-  function normalizeScopedSlots (
-    slots,
-    normalSlots,
-    prevSlots
-  ) {
+  function normalizeScopedSlots(slots, normalSlots, prevSlots) {
     var res;
     var hasNormalSlots = Object.keys(normalSlots).length > 0;
     var isStable = slots ? !!slots.$stable : !hasNormalSlots;
@@ -2555,7 +2634,7 @@
       res = {};
     } else if (slots._normalized) {
       // fast path 1: child component re-render only, parent did not change
-      return slots._normalized
+      return slots._normalized;
     } else if (
       isStable &&
       prevSlots &&
@@ -2566,11 +2645,11 @@
     ) {
       // fast path 2: stable scoped slots w/ no normal slots to proxy,
       // only need to normalize once
-      return prevSlots
+      return prevSlots;
     } else {
       res = {};
       for (var key$1 in slots) {
-        if (slots[key$1] && key$1[0] !== '$') {
+        if (slots[key$1] && key$1[0] !== "$") {
           res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
         }
       }
@@ -2584,25 +2663,25 @@
     // avoriaz seems to mock a non-extensible $scopedSlots object
     // and when that is passed down this would cause an error
     if (slots && Object.isExtensible(slots)) {
-      (slots)._normalized = res;
+      slots._normalized = res;
     }
-    def(res, '$stable', isStable);
-    def(res, '$key', key);
-    def(res, '$hasNormal', hasNormalSlots);
-    return res
+    def(res, "$stable", isStable);
+    def(res, "$key", key);
+    def(res, "$hasNormal", hasNormalSlots);
+    return res;
   }
 
   function normalizeScopedSlot(normalSlots, key, fn) {
     var normalized = function () {
       var res = arguments.length ? fn.apply(null, arguments) : fn({});
-      res = res && typeof res === 'object' && !Array.isArray(res)
-        ? [res] // single vnode
-        : normalizeChildren(res);
-      return res && (
-        res.length === 0 ||
-        (res.length === 1 && res[0].isComment) // #9658
-      ) ? undefined
-        : res
+      res =
+        res && typeof res === "object" && !Array.isArray(res)
+          ? [res] // single vnode
+          : normalizeChildren(res);
+      return res &&
+        (res.length === 0 || (res.length === 1 && res[0].isComment)) // #9658
+        ? undefined
+        : res;
     };
     // this is a slot using the new v-slot syntax without scope. although it is
     // compiled as a scoped slot, render fn users would expect it to be present
@@ -2611,14 +2690,16 @@
       Object.defineProperty(normalSlots, key, {
         get: normalized,
         enumerable: true,
-        configurable: true
+        configurable: true,
       });
     }
-    return normalized
+    return normalized;
   }
 
   function proxyNormalSlot(slots, key) {
-    return function () { return slots[key]; }
+    return function () {
+      return slots[key];
+    };
   }
 
   /*  */
@@ -2626,17 +2707,14 @@
   /**
    * Runtime helper for rendering v-for lists.
    */
-  function renderList (
-    val,
-    render
-  ) {
+  function renderList(val, render) {
     var ret, i, l, keys, key;
-    if (Array.isArray(val) || typeof val === 'string') {
+    if (Array.isArray(val) || typeof val === "string") {
       ret = new Array(val.length);
       for (i = 0, l = val.length; i < l; i++) {
         ret[i] = render(val[i], i);
       }
-    } else if (typeof val === 'number') {
+    } else if (typeof val === "number") {
       ret = new Array(val);
       for (i = 0; i < val; i++) {
         ret[i] = render(i + 1, i);
@@ -2662,8 +2740,8 @@
     if (!isDef(ret)) {
       ret = [];
     }
-    (ret)._isVList = true;
-    return ret
+    ret._isVList = true;
+    return ret;
   }
 
   /*  */
@@ -2671,22 +2749,15 @@
   /**
    * Runtime helper for rendering <slot>
    */
-  function renderSlot (
-    name,
-    fallback,
-    props,
-    bindObject
-  ) {
+  function renderSlot(name, fallback, props, bindObject) {
     var scopedSlotFn = this.$scopedSlots[name];
     var nodes;
-    if (scopedSlotFn) { // scoped slot
+    if (scopedSlotFn) {
+      // scoped slot
       props = props || {};
       if (bindObject) {
         if (!isObject(bindObject)) {
-          warn(
-            'slot v-bind without argument expects an Object',
-            this
-          );
+          warn("slot v-bind without argument expects an Object", this);
         }
         props = extend(extend({}, bindObject), props);
       }
@@ -2697,9 +2768,9 @@
 
     var target = props && props.slot;
     if (target) {
-      return this.$createElement('template', { slot: target }, nodes)
+      return this.$createElement("template", { slot: target }, nodes);
     } else {
-      return nodes
+      return nodes;
     }
   }
 
@@ -2708,17 +2779,17 @@
   /**
    * Runtime helper for resolving filters
    */
-  function resolveFilter (id) {
-    return resolveAsset(this.$options, 'filters', id, true) || identity
+  function resolveFilter(id) {
+    return resolveAsset(this.$options, "filters", id, true) || identity;
   }
 
   /*  */
 
-  function isKeyNotMatch (expect, actual) {
+  function isKeyNotMatch(expect, actual) {
     if (Array.isArray(expect)) {
-      return expect.indexOf(actual) === -1
+      return expect.indexOf(actual) === -1;
     } else {
-      return expect !== actual
+      return expect !== actual;
     }
   }
 
@@ -2727,7 +2798,7 @@
    * exposed as Vue.prototype._k
    * passing in eventKeyName as last argument separately for backwards compat
    */
-  function checkKeyCodes (
+  function checkKeyCodes(
     eventKeyCode,
     key,
     builtInKeyCode,
@@ -2736,11 +2807,11 @@
   ) {
     var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
     if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
-      return isKeyNotMatch(builtInKeyName, eventKeyName)
+      return isKeyNotMatch(builtInKeyName, eventKeyName);
     } else if (mappedKeyCode) {
-      return isKeyNotMatch(mappedKeyCode, eventKeyCode)
+      return isKeyNotMatch(mappedKeyCode, eventKeyCode);
     } else if (eventKeyName) {
-      return hyphenate(eventKeyName) !== key
+      return hyphenate(eventKeyName) !== key;
     }
   }
 
@@ -2749,36 +2820,24 @@
   /**
    * Runtime helper for merging v-bind="object" into a VNode's data.
    */
-  function bindObjectProps (
-    data,
-    tag,
-    value,
-    asProp,
-    isSync
-  ) {
+  function bindObjectProps(data, tag, value, asProp, isSync) {
     if (value) {
       if (!isObject(value)) {
-        warn(
-          'v-bind without argument expects an Object or Array value',
-          this
-        );
+        warn("v-bind without argument expects an Object or Array value", this);
       } else {
         if (Array.isArray(value)) {
           value = toObject(value);
         }
         var hash;
-        var loop = function ( key ) {
-          if (
-            key === 'class' ||
-            key === 'style' ||
-            isReservedAttribute(key)
-          ) {
+        var loop = function (key) {
+          if (key === "class" || key === "style" || isReservedAttribute(key)) {
             hash = data;
           } else {
             var type = data.attrs && data.attrs.type;
-            hash = asProp || config.mustUseProp(tag, type, key)
-              ? data.domProps || (data.domProps = {})
-              : data.attrs || (data.attrs = {});
+            hash =
+              asProp || config.mustUseProp(tag, type, key)
+                ? data.domProps || (data.domProps = {})
+                : data.attrs || (data.attrs = {});
           }
           var camelizedKey = camelize(key);
           var hyphenatedKey = hyphenate(key);
@@ -2787,17 +2846,17 @@
 
             if (isSync) {
               var on = data.on || (data.on = {});
-              on[("update:" + key)] = function ($event) {
+              on["update:" + key] = function ($event) {
                 value[key] = $event;
               };
             }
           }
         };
 
-        for (var key in value) loop( key );
+        for (var key in value) loop(key);
       }
     }
-    return data
+    return data;
   }
 
   /*  */
@@ -2805,16 +2864,13 @@
   /**
    * Runtime helper for rendering static trees.
    */
-  function renderStatic (
-    index,
-    isInFor
-  ) {
+  function renderStatic(index, isInFor) {
     var cached = this._staticTrees || (this._staticTrees = []);
     var tree = cached[index];
     // if has already-rendered static tree and not inside v-for,
     // we can reuse the same tree.
     if (tree && !isInFor) {
-      return tree
+      return tree;
     }
     // otherwise, render a fresh tree.
     tree = cached[index] = this.$options.staticRenderFns[index].call(
@@ -2822,32 +2878,24 @@
       null,
       this // for render fns generated for functional component templates
     );
-    markStatic(tree, ("__static__" + index), false);
-    return tree
+    markStatic(tree, "__static__" + index, false);
+    return tree;
   }
 
   /**
    * Runtime helper for v-once.
    * Effectively it means marking the node as static with a unique key.
    */
-  function markOnce (
-    tree,
-    index,
-    key
-  ) {
-    markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
-    return tree
+  function markOnce(tree, index, key) {
+    markStatic(tree, "__once__" + index + (key ? "_" + key : ""), true);
+    return tree;
   }
 
-  function markStatic (
-    tree,
-    key,
-    isOnce
-  ) {
+  function markStatic(tree, key, isOnce) {
     if (Array.isArray(tree)) {
       for (var i = 0; i < tree.length; i++) {
-        if (tree[i] && typeof tree[i] !== 'string') {
-          markStaticNode(tree[i], (key + "_" + i), isOnce);
+        if (tree[i] && typeof tree[i] !== "string") {
+          markStaticNode(tree[i], key + "_" + i, isOnce);
         }
       }
     } else {
@@ -2855,7 +2903,7 @@
     }
   }
 
-  function markStaticNode (node, key, isOnce) {
+  function markStaticNode(node, key, isOnce) {
     node.isStatic = true;
     node.key = key;
     node.isOnce = isOnce;
@@ -2863,15 +2911,12 @@
 
   /*  */
 
-  function bindObjectListeners (data, value) {
+  function bindObjectListeners(data, value) {
     if (value) {
       if (!isPlainObject(value)) {
-        warn(
-          'v-on without argument expects an Object value',
-          this
-        );
+        warn("v-on without argument expects an Object value", this);
       } else {
-        var on = data.on = data.on ? extend({}, data.on) : {};
+        var on = (data.on = data.on ? extend({}, data.on) : {});
         for (var key in value) {
           var existing = on[key];
           var ours = value[key];
@@ -2879,12 +2924,12 @@
         }
       }
     }
-    return data
+    return data;
   }
 
   /*  */
 
-  function resolveScopedSlots (
+  function resolveScopedSlots(
     fns, // see flow/vnode
     res,
     // the following are added in 2.6
@@ -2905,39 +2950,40 @@
       }
     }
     if (contentHashKey) {
-      (res).$key = contentHashKey;
+      res.$key = contentHashKey;
     }
-    return res
+    return res;
   }
 
   /*  */
 
-  function bindDynamicKeys (baseObj, values) {
+  function bindDynamicKeys(baseObj, values) {
     for (var i = 0; i < values.length; i += 2) {
       var key = values[i];
-      if (typeof key === 'string' && key) {
+      if (typeof key === "string" && key) {
         baseObj[values[i]] = values[i + 1];
-      } else if (key !== '' && key !== null) {
+      } else if (key !== "" && key !== null) {
         // null is a special value for explicitly removing a binding
         warn(
-          ("Invalid value for dynamic directive argument (expected string or null): " + key),
+          "Invalid value for dynamic directive argument (expected string or null): " +
+            key,
           this
         );
       }
     }
-    return baseObj
+    return baseObj;
   }
 
   // helper to dynamically append modifier runtime markers to event names.
   // ensure only append when value is already string, otherwise it will be cast
   // to string and cause the type check to miss.
-  function prependModifier (value, symbol) {
-    return typeof value === 'string' ? symbol + value : value
+  function prependModifier(value, symbol) {
+    return typeof value === "string" ? symbol + value : value;
   }
 
   /*  */
 
-  function installRenderHelpers (target) {
+  function installRenderHelpers(target) {
     target._o = markOnce;
     target._n = toNumber;
     target._s = toString;
@@ -2959,20 +3005,14 @@
 
   /*  */
 
-  function FunctionalRenderContext (
-    data,
-    props,
-    children,
-    parent,
-    Ctor
-  ) {
+  function FunctionalRenderContext(data, props, children, parent, Ctor) {
     var this$1 = this;
 
     var options = Ctor.options;
     // ensure the createElement function in functional components
     // gets a unique context - this is necessary for correct named slot check
     var contextVm;
-    if (hasOwn(parent, '_uid')) {
+    if (hasOwn(parent, "_uid")) {
       contextVm = Object.create(parent);
       // $flow-disable-line
       contextVm._original = parent;
@@ -2997,18 +3037,18 @@
       if (!this$1.$slots) {
         normalizeScopedSlots(
           data.scopedSlots,
-          this$1.$slots = resolveSlots(children, parent)
+          (this$1.$slots = resolveSlots(children, parent))
         );
       }
-      return this$1.$slots
+      return this$1.$slots;
     };
 
-    Object.defineProperty(this, 'scopedSlots', ({
+    Object.defineProperty(this, "scopedSlots", {
       enumerable: true,
-      get: function get () {
-        return normalizeScopedSlots(data.scopedSlots, this.slots())
-      }
-    }));
+      get: function get() {
+        return normalizeScopedSlots(data.scopedSlots, this.slots());
+      },
+    });
 
     // support for compiled functional template
     if (isCompiled) {
@@ -3026,16 +3066,18 @@
           vnode.fnScopeId = options._scopeId;
           vnode.fnContext = parent;
         }
-        return vnode
+        return vnode;
       };
     } else {
-      this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
+      this._c = function (a, b, c, d) {
+        return createElement(contextVm, a, b, c, d, needNormalization);
+      };
     }
   }
 
   installRenderHelpers(FunctionalRenderContext.prototype);
 
-  function createFunctionalComponent (
+  function createFunctionalComponent(
     Ctor,
     propsData,
     data,
@@ -3050,8 +3092,12 @@
         props[key] = validateProp(key, propOptions, propsData || emptyObject);
       }
     } else {
-      if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
-      if (isDef(data.props)) { mergeProps(props, data.props); }
+      if (isDef(data.attrs)) {
+        mergeProps(props, data.attrs);
+      }
+      if (isDef(data.props)) {
+        mergeProps(props, data.props);
+      }
     }
 
     var renderContext = new FunctionalRenderContext(
@@ -3065,18 +3111,36 @@
     var vnode = options.render.call(null, renderContext._c, renderContext);
 
     if (vnode instanceof VNode) {
-      return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)
+      return cloneAndMarkFunctionalResult(
+        vnode,
+        data,
+        renderContext.parent,
+        options,
+        renderContext
+      );
     } else if (Array.isArray(vnode)) {
       var vnodes = normalizeChildren(vnode) || [];
       var res = new Array(vnodes.length);
       for (var i = 0; i < vnodes.length; i++) {
-        res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);
+        res[i] = cloneAndMarkFunctionalResult(
+          vnodes[i],
+          data,
+          renderContext.parent,
+          options,
+          renderContext
+        );
       }
-      return res
+      return res;
     }
   }
 
-  function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
+  function cloneAndMarkFunctionalResult(
+    vnode,
+    data,
+    contextVm,
+    options,
+    renderContext
+  ) {
     // #7817 clone node before setting fnContext, otherwise if the node is reused
     // (e.g. it was from a cached normal slot) the fnContext causes named slots
     // that should not be matched to match.
@@ -3084,15 +3148,16 @@
     clone.fnContext = contextVm;
     clone.fnOptions = options;
     {
-      (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;
+      (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext =
+        renderContext;
     }
     if (data.slot) {
       (clone.data || (clone.data = {})).slot = data.slot;
     }
-    return clone
+    return clone;
   }
 
-  function mergeProps (to, from) {
+  function mergeProps(to, from) {
     for (var key in from) {
       to[camelize(key)] = from[key];
     }
@@ -3108,7 +3173,7 @@
 
   // inline hooks to be invoked on component VNodes during patch
   var componentVNodeHooks = {
-    init: function init (vnode, hydrating) {
+    init: function init(vnode, hydrating) {
       if (
         vnode.componentInstance &&
         !vnode.componentInstance._isDestroyed &&
@@ -3118,17 +3183,17 @@
         var mountedNode = vnode; // work around flow
         componentVNodeHooks.prepatch(mountedNode, mountedNode);
       } else {
-        var child = vnode.componentInstance = createComponentInstanceForVnode(
+        var child = (vnode.componentInstance = createComponentInstanceForVnode(
           vnode,
           activeInstance
-        );
+        ));
         child.$mount(hydrating ? vnode.elm : undefined, hydrating);
       }
     },
 
-    prepatch: function prepatch (oldVnode, vnode) {
+    prepatch: function prepatch(oldVnode, vnode) {
       var options = vnode.componentOptions;
-      var child = vnode.componentInstance = oldVnode.componentInstance;
+      var child = (vnode.componentInstance = oldVnode.componentInstance);
       updateChildComponent(
         child,
         options.propsData, // updated props
@@ -3138,12 +3203,12 @@
       );
     },
 
-    insert: function insert (vnode) {
+    insert: function insert(vnode) {
       var context = vnode.context;
       var componentInstance = vnode.componentInstance;
       if (!componentInstance._isMounted) {
         componentInstance._isMounted = true;
-        callHook(componentInstance, 'mounted');
+        callHook(componentInstance, "mounted");
       }
       if (vnode.data.keepAlive) {
         if (context._isMounted) {
@@ -3159,7 +3224,7 @@
       }
     },
 
-    destroy: function destroy (vnode) {
+    destroy: function destroy(vnode) {
       var componentInstance = vnode.componentInstance;
       if (!componentInstance._isDestroyed) {
         if (!vnode.data.keepAlive) {
@@ -3168,20 +3233,14 @@
           deactivateChildComponent(componentInstance, true /* direct */);
         }
       }
-    }
+    },
   };
 
   var hooksToMerge = Object.keys(componentVNodeHooks);
 
-  function createComponent (
-    Ctor,
-    data,
-    context,
-    children,
-    tag
-  ) {
+  function createComponent(Ctor, data, context, children, tag) {
     if (isUndef(Ctor)) {
-      return
+      return;
     }
 
     var baseCtor = context.$options._base;
@@ -3193,11 +3252,11 @@
 
     // if at this stage it's not a constructor or an async component factory,
     // reject.
-    if (typeof Ctor !== 'function') {
+    if (typeof Ctor !== "function") {
       {
-        warn(("Invalid Component definition: " + (String(Ctor))), context);
+        warn("Invalid Component definition: " + String(Ctor), context);
       }
-      return
+      return;
     }
 
     // async component
@@ -3215,7 +3274,7 @@
           context,
           children,
           tag
-        )
+        );
       }
     }
 
@@ -3235,7 +3294,13 @@
 
     // functional component
     if (isTrue(Ctor.options.functional)) {
-      return createFunctionalComponent(Ctor, propsData, data, context, children)
+      return createFunctionalComponent(
+        Ctor,
+        propsData,
+        data,
+        context,
+        children
+      );
     }
 
     // extract listeners, since these needs to be treated as
@@ -3263,23 +3328,33 @@
     // return a placeholder vnode
     var name = Ctor.options.name || tag;
     var vnode = new VNode(
-      ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
-      data, undefined, undefined, undefined, context,
-      { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
+      "vue-component-" + Ctor.cid + (name ? "-" + name : ""),
+      data,
+      undefined,
+      undefined,
+      undefined,
+      context,
+      {
+        Ctor: Ctor,
+        propsData: propsData,
+        listeners: listeners,
+        tag: tag,
+        children: children,
+      },
       asyncFactory
     );
 
-    return vnode
+    return vnode;
   }
 
-  function createComponentInstanceForVnode (
+  function createComponentInstanceForVnode(
     vnode, // we know it's MountedComponentVNode but flow doesn't
     parent // activeInstance in lifecycle state
   ) {
     var options = {
       _isComponent: true,
       _parentVnode: vnode,
-      parent: parent
+      parent: parent,
     };
     // check inline-template render functions
     var inlineTemplate = vnode.data.inlineTemplate;
@@ -3287,10 +3362,10 @@
       options.render = inlineTemplate.render;
       options.staticRenderFns = inlineTemplate.staticRenderFns;
     }
-    return new vnode.componentOptions.Ctor(options)
+    return new vnode.componentOptions.Ctor(options);
   }
 
-  function installComponentHooks (data) {
+  function installComponentHooks(data) {
     var hooks = data.hook || (data.hook = {});
     for (var i = 0; i < hooksToMerge.length; i++) {
       var key = hooksToMerge[i];
@@ -3302,22 +3377,22 @@
     }
   }
 
-  function mergeHook$1 (f1, f2) {
+  function mergeHook$1(f1, f2) {
     var merged = function (a, b) {
       // flow complains about extra args which is why we use any
       f1(a, b);
       f2(a, b);
     };
     merged._merged = true;
-    return merged
+    return merged;
   }
 
   // transform component v-model info (value and callback) into
   // prop and event handler respectively.
-  function transformModel (options, data) {
-    var prop = (options.model && options.model.prop) || 'value';
-    var event = (options.model && options.model.event) || 'input'
-    ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
+  function transformModel(options, data) {
+    var prop = (options.model && options.model.prop) || "value";
+    var event = (options.model && options.model.event) || "input";
+    (data.attrs || (data.attrs = {}))[prop] = data.model.value;
     var on = data.on || (data.on = {});
     var existing = on[event];
     var callback = data.model.callback;
@@ -3341,7 +3416,7 @@
 
   // wrapper function for providing a more flexible interface
   // without getting yelled at by flow
-  function createElement (
+  function createElement(
     context,
     tag,
     data,
@@ -3357,23 +3432,19 @@
     if (isTrue(alwaysNormalize)) {
       normalizationType = ALWAYS_NORMALIZE;
     }
-    return _createElement(context, tag, data, children, normalizationType)
+    return _createElement(context, tag, data, children, normalizationType);
   }
 
-  function _createElement (
-    context,
-    tag,
-    data,
-    children,
-    normalizationType
-  ) {
-    if (isDef(data) && isDef((data).__ob__)) {
+  function _createElement(context, tag, data, children, normalizationType) {
+    if (isDef(data) && isDef(data.__ob__)) {
       warn(
-        "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
-        'Always create fresh vnode data objects in each render!',
+        "Avoid using observed data object as vnode data: " +
+          JSON.stringify(data) +
+          "\n" +
+          "Always create fresh vnode data objects in each render!",
         context
       );
-      return createEmptyVNode()
+      return createEmptyVNode();
     }
     // object syntax in v-bind
     if (isDef(data) && isDef(data.is)) {
@@ -3381,23 +3452,20 @@
     }
     if (!tag) {
       // in case of component :is set to falsy value
-      return createEmptyVNode()
+      return createEmptyVNode();
     }
     // warn against non-primitive key
-    if (isDef(data) && isDef(data.key) && !isPrimitive(data.key)
-    ) {
+    if (isDef(data) && isDef(data.key) && !isPrimitive(data.key)) {
       {
         warn(
-          'Avoid using non-primitive value as key, ' +
-          'use string/number value instead.',
+          "Avoid using non-primitive value as key, " +
+            "use string/number value instead.",
           context
         );
       }
     }
     // support single function children as default scoped slot
-    if (Array.isArray(children) &&
-      typeof children[0] === 'function'
-    ) {
+    if (Array.isArray(children) && typeof children[0] === "function") {
       data = data || {};
       data.scopedSlots = { default: children[0] };
       children.length = 0;
@@ -3408,51 +3476,61 @@
       children = simpleNormalizeChildren(children);
     }
     var vnode, ns;
-    if (typeof tag === 'string') {
+    if (typeof tag === "string") {
       var Ctor;
       ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
       if (config.isReservedTag(tag)) {
         // platform built-in elements
         if (isDef(data) && isDef(data.nativeOn)) {
           warn(
-            ("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."),
+            "The .native modifier for v-on is only valid on components but it was used on <" +
+              tag +
+              ">.",
             context
           );
         }
         vnode = new VNode(
-          config.parsePlatformTagName(tag), data, children,
-          undefined, undefined, context
+          config.parsePlatformTagName(tag),
+          data,
+          children,
+          undefined,
+          undefined,
+          context
         );
-      } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
+      } else if (
+        (!data || !data.pre) &&
+        isDef((Ctor = resolveAsset(context.$options, "components", tag)))
+      ) {
         // component
         vnode = createComponent(Ctor, data, context, children, tag);
       } else {
         // unknown or unlisted namespaced elements
         // check at runtime because it may get assigned a namespace when its
         // parent normalizes children
-        vnode = new VNode(
-          tag, data, children,
-          undefined, undefined, context
-        );
+        vnode = new VNode(tag, data, children, undefined, undefined, context);
       }
     } else {
       // direct component options / constructor
       vnode = createComponent(tag, data, context, children);
     }
     if (Array.isArray(vnode)) {
-      return vnode
+      return vnode;
     } else if (isDef(vnode)) {
-      if (isDef(ns)) { applyNS(vnode, ns); }
-      if (isDef(data)) { registerDeepBindings(data); }
-      return vnode
+      if (isDef(ns)) {
+        applyNS(vnode, ns);
+      }
+      if (isDef(data)) {
+        registerDeepBindings(data);
+      }
+      return vnode;
     } else {
-      return createEmptyVNode()
+      return createEmptyVNode();
     }
   }
 
-  function applyNS (vnode, ns, force) {
+  function applyNS(vnode, ns, force) {
     vnode.ns = ns;
-    if (vnode.tag === 'foreignObject') {
+    if (vnode.tag === "foreignObject") {
       // use default namespace inside foreignObject
       ns = undefined;
       force = true;
@@ -3460,8 +3538,10 @@
     if (isDef(vnode.children)) {
       for (var i = 0, l = vnode.children.length; i < l; i++) {
         var child = vnode.children[i];
-        if (isDef(child.tag) && (
-          isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
+        if (
+          isDef(child.tag) &&
+          (isUndef(child.ns) || (isTrue(force) && child.tag !== "svg"))
+        ) {
           applyNS(child, ns, force);
         }
       }
@@ -3471,7 +3551,7 @@
   // ref #5318
   // necessary to ensure parent re-render when deep bindings like :style and
   // :class are used on slot nodes
-  function registerDeepBindings (data) {
+  function registerDeepBindings(data) {
     if (isObject(data.style)) {
       traverse(data.style);
     }
@@ -3482,11 +3562,11 @@
 
   /*  */
 
-  function initRender (vm) {
+  function initRender(vm) {
     vm._vnode = null; // the root of the child tree
     vm._staticTrees = null; // v-once cached trees
     var options = vm.$options;
-    var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
+    var parentVnode = (vm.$vnode = options._parentVnode); // the placeholder node in parent tree
     var renderContext = parentVnode && parentVnode.context;
     vm.$slots = resolveSlots(options._renderChildren, renderContext);
     vm.$scopedSlots = emptyObject;
@@ -3494,10 +3574,14 @@
     // so that we get proper render context inside it.
     // args order: tag, data, children, normalizationType, alwaysNormalize
     // internal version is used by render functions compiled from templates
-    vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
+    vm._c = function (a, b, c, d) {
+      return createElement(vm, a, b, c, d, false);
+    };
     // normalization is always applied for the public version, used in
     // user-written render functions.
-    vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
+    vm.$createElement = function (a, b, c, d) {
+      return createElement(vm, a, b, c, d, true);
+    };
 
     // $attrs & $listeners are exposed for easier HOC creation.
     // they need to be reactive so that HOCs using them are always updated
@@ -3505,23 +3589,35 @@
 
     /* istanbul ignore else */
     {
-      defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
-        !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
-      }, true);
-      defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {
-        !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
-      }, true);
+      defineReactive$$1(
+        vm,
+        "$attrs",
+        (parentData && parentData.attrs) || emptyObject,
+        function () {
+          !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
+        },
+        true
+      );
+      defineReactive$$1(
+        vm,
+        "$listeners",
+        options._parentListeners || emptyObject,
+        function () {
+          !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
+        },
+        true
+      );
     }
   }
 
   var currentRenderingInstance = null;
 
-  function renderMixin (Vue) {
+  function renderMixin(Vue) {
     // install runtime convenience helpers
     installRenderHelpers(Vue.prototype);
 
     Vue.prototype.$nextTick = function (fn) {
-      return nextTick(fn, this)
+      return nextTick(fn, this);
     };
 
     Vue.prototype._render = function () {
@@ -3556,7 +3652,11 @@
         /* istanbul ignore else */
         if (vm.$options.renderError) {
           try {
-            vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
+            vnode = vm.$options.renderError.call(
+              vm._renderProxy,
+              vm.$createElement,
+              e
+            );
           } catch (e) {
             handleError(e, vm, "renderError");
             vnode = vm._vnode;
@@ -3575,8 +3675,8 @@
       if (!(vnode instanceof VNode)) {
         if (Array.isArray(vnode)) {
           warn(
-            'Multiple root nodes returned from render function. Render function ' +
-            'should return a single root node.',
+            "Multiple root nodes returned from render function. Render function " +
+              "should return a single root node.",
             vm
           );
         }
@@ -3584,70 +3684,70 @@
       }
       // set parent
       vnode.parent = _parentVnode;
-      return vnode
+      return vnode;
     };
   }
 
   /*  */
 
-  function ensureCtor (comp, base) {
+  function ensureCtor(comp, base) {
     if (
       comp.__esModule ||
-      (hasSymbol && comp[Symbol.toStringTag] === 'Module')
+      (hasSymbol && comp[Symbol.toStringTag] === "Module")
     ) {
       comp = comp.default;
     }
-    return isObject(comp)
-      ? base.extend(comp)
-      : comp
+    return isObject(comp) ? base.extend(comp) : comp;
   }
 
-  function createAsyncPlaceholder (
-    factory,
-    data,
-    context,
-    children,
-    tag
-  ) {
+  function createAsyncPlaceholder(factory, data, context, children, tag) {
     var node = createEmptyVNode();
     node.asyncFactory = factory;
-    node.asyncMeta = { data: data, context: context, children: children, tag: tag };
-    return node
+    node.asyncMeta = {
+      data: data,
+      context: context,
+      children: children,
+      tag: tag,
+    };
+    return node;
   }
 
-  function resolveAsyncComponent (
-    factory,
-    baseCtor
-  ) {
+  function resolveAsyncComponent(factory, baseCtor) {
     if (isTrue(factory.error) && isDef(factory.errorComp)) {
-      return factory.errorComp
+      return factory.errorComp;
     }
 
     if (isDef(factory.resolved)) {
-      return factory.resolved
+      return factory.resolved;
     }
 
     var owner = currentRenderingInstance;
-    if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
+    if (
+      owner &&
+      isDef(factory.owners) &&
+      factory.owners.indexOf(owner) === -1
+    ) {
       // already pending
       factory.owners.push(owner);
     }
 
     if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
-      return factory.loadingComp
+      return factory.loadingComp;
     }
 
     if (owner && !isDef(factory.owners)) {
-      var owners = factory.owners = [owner];
+      var owners = (factory.owners = [owner]);
       var sync = true;
       var timerLoading = null;
-      var timerTimeout = null
+      var timerTimeout = null;
 
-      ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
+      owner.$on("hook:destroyed", function () {
+        return remove(owners, owner);
+      });
 
       var forceRender = function (renderCompleted) {
         for (var i = 0, l = owners.length; i < l; i++) {
-          (owners[i]).$forceUpdate();
+          owners[i].$forceUpdate();
         }
 
         if (renderCompleted) {
@@ -3677,8 +3777,9 @@
 
       var reject = once(function (reason) {
         warn(
-          "Failed to resolve async component: " + (String(factory)) +
-          (reason ? ("\nReason: " + reason) : '')
+          "Failed to resolve async component: " +
+            String(factory) +
+            (reason ? "\nReason: " + reason : "")
         );
         if (isDef(factory.errorComp)) {
           factory.error = true;
@@ -3720,9 +3821,7 @@
             timerTimeout = setTimeout(function () {
               timerTimeout = null;
               if (isUndef(factory.resolved)) {
-                reject(
-                  "timeout (" + (res.timeout) + "ms)"
-                );
+                reject("timeout (" + res.timeout + "ms)");
               }
             }, res.timeout);
           }
@@ -3731,26 +3830,24 @@
 
       sync = false;
       // return in case resolved synchronously
-      return factory.loading
-        ? factory.loadingComp
-        : factory.resolved
+      return factory.loading ? factory.loadingComp : factory.resolved;
     }
   }
 
   /*  */
 
-  function isAsyncPlaceholder (node) {
-    return node.isComment && node.asyncFactory
+  function isAsyncPlaceholder(node) {
+    return node.isComment && node.asyncFactory;
   }
 
   /*  */
 
-  function getFirstComponentChild (children) {
+  function getFirstComponentChild(children) {
     if (Array.isArray(children)) {
       for (var i = 0; i < children.length; i++) {
         var c = children[i];
         if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
-          return c
+          return c;
         }
       }
     }
@@ -3760,7 +3857,7 @@
 
   /*  */
 
-  function initEvents (vm) {
+  function initEvents(vm) {
     vm._events = Object.create(null);
     vm._hasHookEvent = false;
     // init parent attached events
@@ -3772,35 +3869,38 @@
 
   var target;
 
-  function add (event, fn) {
+  function add(event, fn) {
     target.$on(event, fn);
   }
 
-  function remove$1 (event, fn) {
+  function remove$1(event, fn) {
     target.$off(event, fn);
   }
 
-  function createOnceHandler (event, fn) {
+  function createOnceHandler(event, fn) {
     var _target = target;
-    return function onceHandler () {
+    return function onceHandler() {
       var res = fn.apply(null, arguments);
       if (res !== null) {
         _target.$off(event, onceHandler);
       }
-    }
+    };
   }
 
-  function updateComponentListeners (
-    vm,
-    listeners,
-    oldListeners
-  ) {
+  function updateComponentListeners(vm, listeners, oldListeners) {
     target = vm;
-    updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
+    updateListeners(
+      listeners,
+      oldListeners || {},
+      add,
+      remove$1,
+      createOnceHandler,
+      vm
+    );
     target = undefined;
   }
 
-  function eventsMixin (Vue) {
+  function eventsMixin(Vue) {
     var hookRE = /^hook:/;
     Vue.prototype.$on = function (event, fn) {
       var vm = this;
@@ -3816,18 +3916,18 @@
           vm._hasHookEvent = true;
         }
       }
-      return vm
+      return vm;
     };
 
     Vue.prototype.$once = function (event, fn) {
       var vm = this;
-      function on () {
+      function on() {
         vm.$off(event, on);
         fn.apply(vm, arguments);
       }
       on.fn = fn;
       vm.$on(event, on);
-      return vm
+      return vm;
     };
 
     Vue.prototype.$off = function (event, fn) {
@@ -3835,23 +3935,23 @@
       // all
       if (!arguments.length) {
         vm._events = Object.create(null);
-        return vm
+        return vm;
       }
       // array of events
       if (Array.isArray(event)) {
         for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
           vm.$off(event[i$1], fn);
         }
-        return vm
+        return vm;
       }
       // specific event
       var cbs = vm._events[event];
       if (!cbs) {
-        return vm
+        return vm;
       }
       if (!fn) {
         vm._events[event] = null;
-        return vm
+        return vm;
       }
       // specific handler
       var cb;
@@ -3860,10 +3960,10 @@
         cb = cbs[i];
         if (cb === fn || cb.fn === fn) {
           cbs.splice(i, 1);
-          break
+          break;
         }
       }
-      return vm
+      return vm;
     };
 
     Vue.prototype.$emit = function (event) {
@@ -3872,11 +3972,20 @@
         var lowerCaseEvent = event.toLowerCase();
         if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
           tip(
-            "Event \"" + lowerCaseEvent + "\" is emitted in component " +
-            (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
-            "Note that HTML attributes are case-insensitive and you cannot use " +
-            "v-on to listen to camelCase events when using in-DOM templates. " +
-            "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
+            'Event "' +
+              lowerCaseEvent +
+              '" is emitted in component ' +
+              formatComponentName(vm) +
+              ' but the handler is registered for "' +
+              event +
+              '". ' +
+              "Note that HTML attributes are case-insensitive and you cannot use " +
+              "v-on to listen to camelCase events when using in-DOM templates. " +
+              'You should probably use "' +
+              hyphenate(event) +
+              '" instead of "' +
+              event +
+              '".'
           );
         }
       }
@@ -3884,12 +3993,12 @@
       if (cbs) {
         cbs = cbs.length > 1 ? toArray(cbs) : cbs;
         var args = toArray(arguments, 1);
-        var info = "event handler for \"" + event + "\"";
+        var info = 'event handler for "' + event + '"';
         for (var i = 0, l = cbs.length; i < l; i++) {
           invokeWithErrorHandling(cbs[i], vm, args, vm, info);
         }
       }
-      return vm
+      return vm;
     };
   }
 
@@ -3903,10 +4012,10 @@
     activeInstance = vm;
     return function () {
       activeInstance = prevActiveInstance;
-    }
+    };
   }
 
-  function initLifecycle (vm) {
+  function initLifecycle(vm) {
     var options = vm.$options;
 
     // locate first non-abstract parent
@@ -3932,7 +4041,7 @@
     vm._isBeingDestroyed = false;
   }
 
-  function lifecycleMixin (Vue) {
+  function lifecycleMixin(Vue) {
     Vue.prototype._update = function (vnode, hydrating) {
       var vm = this;
       var prevEl = vm.$el;
@@ -3974,9 +4083,9 @@
     Vue.prototype.$destroy = function () {
       var vm = this;
       if (vm._isBeingDestroyed) {
-        return
+        return;
       }
-      callHook(vm, 'beforeDestroy');
+      callHook(vm, "beforeDestroy");
       vm._isBeingDestroyed = true;
       // remove self from parent
       var parent = vm.$parent;
@@ -4001,7 +4110,7 @@
       // invoke destroy hooks on current rendered tree
       vm.__patch__(vm._vnode, null);
       // fire destroyed hook
-      callHook(vm, 'destroyed');
+      callHook(vm, "destroyed");
       // turn off all instance listeners.
       vm.$off();
       // remove __vue__ reference
@@ -4015,33 +4124,32 @@
     };
   }
 
-  function mountComponent (
-    vm,
-    el,
-    hydrating
-  ) {
+  function mountComponent(vm, el, hydrating) {
     vm.$el = el;
     if (!vm.$options.render) {
       vm.$options.render = createEmptyVNode;
       {
         /* istanbul ignore if */
-        if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
-          vm.$options.el || el) {
+        if (
+          (vm.$options.template && vm.$options.template.charAt(0) !== "#") ||
+          vm.$options.el ||
+          el
+        ) {
           warn(
-            'You are using the runtime-only build of Vue where the template ' +
-            'compiler is not available. Either pre-compile the templates into ' +
-            'render functions, or use the compiler-included build.',
+            "You are using the runtime-only build of Vue where the template " +
+              "compiler is not available. Either pre-compile the templates into " +
+              "render functions, or use the compiler-included build.",
             vm
           );
         } else {
           warn(
-            'Failed to mount component: template or render function not defined.',
+            "Failed to mount component: template or render function not defined.",
             vm
           );
         }
       }
     }
-    callHook(vm, 'beforeMount');
+    callHook(vm, "beforeMount");
 
     var updateComponent;
     /* istanbul ignore if */
@@ -4055,12 +4163,12 @@
         mark(startTag);
         var vnode = vm._render();
         mark(endTag);
-        measure(("vue " + name + " render"), startTag, endTag);
+        measure("vue " + name + " render", startTag, endTag);
 
         mark(startTag);
         vm._update(vnode, hydrating);
         mark(endTag);
-        measure(("vue " + name + " patch"), startTag, endTag);
+        measure("vue " + name + " patch", startTag, endTag);
       };
     } else {
       updateComponent = function () {
@@ -4071,25 +4179,31 @@
     // we set this to vm._watcher inside the watcher's constructor
     // since the watcher's initial patch may call $forceUpdate (e.g. inside child
     // component's mounted hook), which relies on vm._watcher being already defined
-    new Watcher(vm, updateComponent, noop, {
-      before: function before () {
-        if (vm._isMounted && !vm._isDestroyed) {
-          callHook(vm, 'beforeUpdate');
-        }
-      }
-    }, true /* isRenderWatcher */);
+    new Watcher(
+      vm,
+      updateComponent,
+      noop,
+      {
+        before: function before() {
+          if (vm._isMounted && !vm._isDestroyed) {
+            callHook(vm, "beforeUpdate");
+          }
+        },
+      },
+      true /* isRenderWatcher */
+    );
     hydrating = false;
 
     // manually mounted instance, call mounted on self
     // mounted is called for render-created child components in its inserted hook
     if (vm.$vnode == null) {
       vm._isMounted = true;
-      callHook(vm, 'mounted');
+      callHook(vm, "mounted");
     }
-    return vm
+    return vm;
   }
 
-  function updateChildComponent (
+  function updateChildComponent(
     vm,
     propsData,
     listeners,
@@ -4118,15 +4232,16 @@
     // update. Dynamic scoped slots may also have changed. In such cases, a forced
     // update is necessary to ensure correctness.
     var needsForceUpdate = !!(
-      renderChildren ||               // has new static slots
-      vm.$options._renderChildren ||  // has old static slots
+      renderChildren || // has new static slots
+      vm.$options._renderChildren || // has old static slots
       hasDynamicScopedSlot
     );
 
     vm.$options._parentVnode = parentVnode;
     vm.$vnode = parentVnode; // update vm's placeholder node without re-render
 
-    if (vm._vnode) { // update child tree's parent
+    if (vm._vnode) {
+      // update child tree's parent
       vm._vnode.parent = parentVnode;
     }
     vm.$options._renderChildren = renderChildren;
@@ -4169,36 +4284,38 @@
     }
   }
 
-  function isInInactiveTree (vm) {
+  function isInInactiveTree(vm) {
     while (vm && (vm = vm.$parent)) {
-      if (vm._inactive) { return true }
+      if (vm._inactive) {
+        return true;
+      }
     }
-    return false
+    return false;
   }
 
-  function activateChildComponent (vm, direct) {
+  function activateChildComponent(vm, direct) {
     if (direct) {
       vm._directInactive = false;
       if (isInInactiveTree(vm)) {
-        return
+        return;
       }
     } else if (vm._directInactive) {
-      return
+      return;
     }
     if (vm._inactive || vm._inactive === null) {
       vm._inactive = false;
       for (var i = 0; i < vm.$children.length; i++) {
         activateChildComponent(vm.$children[i]);
       }
-      callHook(vm, 'activated');
+      callHook(vm, "activated");
     }
   }
 
-  function deactivateChildComponent (vm, direct) {
+  function deactivateChildComponent(vm, direct) {
     if (direct) {
       vm._directInactive = true;
       if (isInInactiveTree(vm)) {
-        return
+        return;
       }
     }
     if (!vm._inactive) {
@@ -4206,11 +4323,11 @@
       for (var i = 0; i < vm.$children.length; i++) {
         deactivateChildComponent(vm.$children[i]);
       }
-      callHook(vm, 'deactivated');
+      callHook(vm, "deactivated");
     }
   }
 
-  function callHook (vm, hook) {
+  function callHook(vm, hook) {
     // #7573 disable dep collection when invoking lifecycle hooks
     pushTarget();
     var handlers = vm.$options[hook];
@@ -4221,7 +4338,7 @@
       }
     }
     if (vm._hasHookEvent) {
-      vm.$emit('hook:' + hook);
+      vm.$emit("hook:" + hook);
     }
     popTarget();
   }
@@ -4241,7 +4358,7 @@
   /**
    * Reset the scheduler's state.
    */
-  function resetSchedulerState () {
+  function resetSchedulerState() {
     index = queue.length = activatedChildren.length = 0;
     has = {};
     {
@@ -4270,21 +4387,23 @@
     var performance = window.performance;
     if (
       performance &&
-      typeof performance.now === 'function' &&
-      getNow() > document.createEvent('Event').timeStamp
+      typeof performance.now === "function" &&
+      getNow() > document.createEvent("Event").timeStamp
     ) {
       // if the event timestamp, although evaluated AFTER the Date.now(), is
       // smaller than it, it means the event is using a hi-res timestamp,
       // and we need to use the hi-res version for event listener timestamps as
       // well.
-      getNow = function () { return performance.now(); };
+      getNow = function () {
+        return performance.now();
+      };
     }
   }
 
   /**
    * Flush both queues and run the watchers.
    */
-  function flushSchedulerQueue () {
+  function flushSchedulerQueue() {
     currentFlushTimestamp = getNow();
     flushing = true;
     var watcher, id;
@@ -4297,7 +4416,9 @@
     //    user watchers are created before the render watcher)
     // 3. If a component is destroyed during a parent component's watcher run,
     //    its watchers can be skipped.
-    queue.sort(function (a, b) { return a.id - b.id; });
+    queue.sort(function (a, b) {
+      return a.id - b.id;
+    });
 
     // do not cache length because more watchers might be pushed
     // as we run existing watchers
@@ -4314,14 +4435,13 @@
         circular[id] = (circular[id] || 0) + 1;
         if (circular[id] > MAX_UPDATE_COUNT) {
           warn(
-            'You may have an infinite update loop ' + (
-              watcher.user
-                ? ("in watcher with expression \"" + (watcher.expression) + "\"")
-                : "in a component render function."
-            ),
+            "You may have an infinite update loop " +
+              (watcher.user
+                ? 'in watcher with expression "' + watcher.expression + '"'
+                : "in a component render function."),
             watcher.vm
           );
-          break
+          break;
         }
       }
     }
@@ -4339,17 +4459,17 @@
     // devtool hook
     /* istanbul ignore if */
     if (devtools && config.devtools) {
-      devtools.emit('flush');
+      devtools.emit("flush");
     }
   }
 
-  function callUpdatedHooks (queue) {
+  function callUpdatedHooks(queue) {
     var i = queue.length;
     while (i--) {
       var watcher = queue[i];
       var vm = watcher.vm;
       if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
-        callHook(vm, 'updated');
+        callHook(vm, "updated");
       }
     }
   }
@@ -4358,14 +4478,14 @@
    * Queue a kept-alive component that was activated during patch.
    * The queue will be processed after the entire tree has been patched.
    */
-  function queueActivatedComponent (vm) {
+  function queueActivatedComponent(vm) {
     // setting _inactive to false here so that a render function can
     // rely on checking whether it's in an inactive tree (e.g. router-view)
     vm._inactive = false;
     activatedChildren.push(vm);
   }
 
-  function callActivatedHooks (queue) {
+  function callActivatedHooks(queue) {
     for (var i = 0; i < queue.length; i++) {
       queue[i]._inactive = true;
       activateChildComponent(queue[i], true /* true */);
@@ -4377,7 +4497,7 @@
    * Jobs with duplicate IDs will be skipped unless it's
    * pushed when the queue is being flushed.
    */
-  function queueWatcher (watcher) {
+  function queueWatcher(watcher) {
     var id = watcher.id;
     if (has[id] == null) {
       has[id] = true;
@@ -4398,7 +4518,7 @@
 
         if (!config.async) {
           flushSchedulerQueue();
-          return
+          return;
         }
         nextTick(flushSchedulerQueue);
       }
@@ -4407,8 +4527,6 @@
 
   /*  */
 
-
-
   var uid$2 = 0;
 
   /**
@@ -4416,13 +4534,7 @@
    * and fires callback when the expression value changes.
    * This is used for both the $watch() api and directives.
    */
-  var Watcher = function Watcher (
-    vm,
-    expOrFn,
-    cb,
-    options,
-    isRenderWatcher
-  ) {
+  var Watcher = function Watcher(vm, expOrFn, cb, options, isRenderWatcher) {
     this.vm = vm;
     if (isRenderWatcher) {
       vm._watcher = this;
@@ -4448,29 +4560,29 @@
     this.newDepIds = new _Set();
     this.expression = expOrFn.toString();
     // parse expression for getter
-    if (typeof expOrFn === 'function') {
+    if (typeof expOrFn === "function") {
       this.getter = expOrFn;
     } else {
       this.getter = parsePath(expOrFn);
       if (!this.getter) {
         this.getter = noop;
         warn(
-          "Failed watching path: \"" + expOrFn + "\" " +
-          'Watcher only accepts simple dot-delimited paths. ' +
-          'For full control, use a function instead.',
+          'Failed watching path: "' +
+            expOrFn +
+            '" ' +
+            "Watcher only accepts simple dot-delimited paths. " +
+            "For full control, use a function instead.",
           vm
         );
       }
     }
-    this.value = this.lazy
-      ? undefined
-      : this.get();
+    this.value = this.lazy ? undefined : this.get();
   };
 
   /**
    * Evaluate the getter, and re-collect dependencies.
    */
-  Watcher.prototype.get = function get () {
+  Watcher.prototype.get = function get() {
     pushTarget(this);
     var value;
     var vm = this.vm;
@@ -4478,9 +4590,9 @@
       value = this.getter.call(vm, vm);
     } catch (e) {
       if (this.user) {
-        handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
+        handleError(e, vm, 'getter for watcher "' + this.expression + '"');
       } else {
-        throw e
+        throw e;
       }
     } finally {
       // "touch" every property so they are all tracked as
@@ -4491,13 +4603,13 @@
       popTarget();
       this.cleanupDeps();
     }
-    return value
+    return value;
   };
 
   /**
    * Add a dependency to this directive.
    */
-  Watcher.prototype.addDep = function addDep (dep) {
+  Watcher.prototype.addDep = function addDep(dep) {
     var id = dep.id;
     if (!this.newDepIds.has(id)) {
       this.newDepIds.add(id);
@@ -4511,7 +4623,7 @@
   /**
    * Clean up for dependency collection.
    */
-  Watcher.prototype.cleanupDeps = function cleanupDeps () {
+  Watcher.prototype.cleanupDeps = function cleanupDeps() {
     var i = this.deps.length;
     while (i--) {
       var dep = this.deps[i];
@@ -4533,7 +4645,7 @@
    * Subscriber interface.
    * Will be called when a dependency changes.
    */
-  Watcher.prototype.update = function update () {
+  Watcher.prototype.update = function update() {
     /* istanbul ignore else */
     if (this.lazy) {
       this.dirty = true;
@@ -4548,7 +4660,7 @@
    * Scheduler job interface.
    * Will be called by the scheduler.
    */
-  Watcher.prototype.run = function run () {
+  Watcher.prototype.run = function run() {
     if (this.active) {
       var value = this.get();
       if (
@@ -4566,7 +4678,11 @@
           try {
             this.cb.call(this.vm, value, oldValue);
           } catch (e) {
-            handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
+            handleError(
+              e,
+              this.vm,
+              'callback for watcher "' + this.expression + '"'
+            );
           }
         } else {
           this.cb.call(this.vm, value, oldValue);
@@ -4579,7 +4695,7 @@
    * Evaluate the value of the watcher.
    * This only gets called for lazy watchers.
    */
-  Watcher.prototype.evaluate = function evaluate () {
+  Watcher.prototype.evaluate = function evaluate() {
     this.value = this.get();
     this.dirty = false;
   };
@@ -4587,7 +4703,7 @@
   /**
    * Depend on all deps collected by this watcher.
    */
-  Watcher.prototype.depend = function depend () {
+  Watcher.prototype.depend = function depend() {
     var i = this.deps.length;
     while (i--) {
       this.deps[i].depend();
@@ -4597,7 +4713,7 @@
   /**
    * Remove self from all dependencies' subscriber list.
    */
-  Watcher.prototype.teardown = function teardown () {
+  Watcher.prototype.teardown = function teardown() {
     if (this.active) {
       // remove self from vm's watcher list
       // this is a somewhat expensive operation so we skip it
@@ -4619,56 +4735,66 @@
     enumerable: true,
     configurable: true,
     get: noop,
-    set: noop
+    set: noop,
   };
 
-  function proxy (target, sourceKey, key) {
-    sharedPropertyDefinition.get = function proxyGetter () {
-      return this[sourceKey][key]
+  function proxy(target, sourceKey, key) {
+    sharedPropertyDefinition.get = function proxyGetter() {
+      return this[sourceKey][key];
     };
-    sharedPropertyDefinition.set = function proxySetter (val) {
+    sharedPropertyDefinition.set = function proxySetter(val) {
       this[sourceKey][key] = val;
     };
     Object.defineProperty(target, key, sharedPropertyDefinition);
   }
 
-  function initState (vm) {
+  function initState(vm) {
     vm._watchers = [];
     var opts = vm.$options;
-    if (opts.props) { initProps(vm, opts.props); }
-    if (opts.methods) { initMethods(vm, opts.methods); }
+    if (opts.props) {
+      initProps(vm, opts.props);
+    }
+    if (opts.methods) {
+      initMethods(vm, opts.methods);
+    }
     if (opts.data) {
       initData(vm);
     } else {
-      observe(vm._data = {}, true /* asRootData */);
+      observe((vm._data = {}), true /* asRootData */);
+    }
+    if (opts.computed) {
+      initComputed(vm, opts.computed);
     }
-    if (opts.computed) { initComputed(vm, opts.computed); }
     if (opts.watch && opts.watch !== nativeWatch) {
       initWatch(vm, opts.watch);
     }
   }
 
-  function initProps (vm, propsOptions) {
+  function initProps(vm, propsOptions) {
     var propsData = vm.$options.propsData || {};
-    var props = vm._props = {};
+    var props = (vm._props = {});
     // cache prop keys so that future props updates can iterate using Array
     // instead of dynamic object key enumeration.
-    var keys = vm.$options._propKeys = [];
+    var keys = (vm.$options._propKeys = []);
     var isRoot = !vm.$parent;
     // root instance props should be converted
     if (!isRoot) {
       toggleObserving(false);
     }
-    var loop = function ( key ) {
+    var loop = function (key) {
       keys.push(key);
       var value = validateProp(key, propsOptions, propsData, vm);
       /* istanbul ignore else */
       {
         var hyphenatedKey = hyphenate(key);
-        if (isReservedAttribute(hyphenatedKey) ||
-            config.isReservedAttr(hyphenatedKey)) {
+        if (
+          isReservedAttribute(hyphenatedKey) ||
+          config.isReservedAttr(hyphenatedKey)
+        ) {
           warn(
-            ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
+            '"' +
+              hyphenatedKey +
+              '" is a reserved attribute and cannot be used as component prop.',
             vm
           );
         }
@@ -4676,9 +4802,11 @@
           if (!isRoot && !isUpdatingChildComponent) {
             warn(
               "Avoid mutating a prop directly since the value will be " +
-              "overwritten whenever the parent component re-renders. " +
-              "Instead, use a data or computed property based on the prop's " +
-              "value. Prop being mutated: \"" + key + "\"",
+                "overwritten whenever the parent component re-renders. " +
+                "Instead, use a data or computed property based on the prop's " +
+                'value. Prop being mutated: "' +
+                key +
+                '"',
               vm
             );
           }
@@ -4692,20 +4820,19 @@
       }
     };
 
-    for (var key in propsOptions) loop( key );
+    for (var key in propsOptions) loop(key);
     toggleObserving(true);
   }
 
-  function initData (vm) {
+  function initData(vm) {
     var data = vm.$options.data;
-    data = vm._data = typeof data === 'function'
-      ? getData(data, vm)
-      : data || {};
+    data = vm._data =
+      typeof data === "function" ? getData(data, vm) : data || {};
     if (!isPlainObject(data)) {
       data = {};
       warn(
-        'data functions should return an object:\n' +
-        'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
+        "data functions should return an object:\n" +
+          "https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",
         vm
       );
     }
@@ -4719,15 +4846,17 @@
       {
         if (methods && hasOwn(methods, key)) {
           warn(
-            ("Method \"" + key + "\" has already been defined as a data property."),
+            'Method "' + key + '" has already been defined as a data property.',
             vm
           );
         }
       }
       if (props && hasOwn(props, key)) {
         warn(
-          "The data property \"" + key + "\" is already declared as a prop. " +
-          "Use prop default value instead.",
+          'The data property "' +
+            key +
+            '" is already declared as a prop. ' +
+            "Use prop default value instead.",
           vm
         );
       } else if (!isReserved(key)) {
@@ -4738,14 +4867,14 @@
     observe(data, true /* asRootData */);
   }
 
-  function getData (data, vm) {
+  function getData(data, vm) {
     // #7573 disable dep collection when invoking data getters
     pushTarget();
     try {
-      return data.call(vm, vm)
+      return data.call(vm, vm);
     } catch (e) {
       handleError(e, vm, "data()");
-      return {}
+      return {};
     } finally {
       popTarget();
     }
@@ -4753,20 +4882,17 @@
 
   var computedWatcherOptions = { lazy: true };
 
-  function initComputed (vm, computed) {
+  function initComputed(vm, computed) {
     // $flow-disable-line
-    var watchers = vm._computedWatchers = Object.create(null);
+    var watchers = (vm._computedWatchers = Object.create(null));
     // computed properties are just getters during SSR
     var isSSR = isServerRendering();
 
     for (var key in computed) {
       var userDef = computed[key];
-      var getter = typeof userDef === 'function' ? userDef : userDef.get;
+      var getter = typeof userDef === "function" ? userDef : userDef.get;
       if (getter == null) {
-        warn(
-          ("Getter is missing for computed property \"" + key + "\"."),
-          vm
-        );
+        warn('Getter is missing for computed property "' + key + '".', vm);
       }
 
       if (!isSSR) {
@@ -4786,21 +4912,23 @@
         defineComputed(vm, key, userDef);
       } else {
         if (key in vm.$data) {
-          warn(("The computed property \"" + key + "\" is already defined in data."), vm);
+          warn(
+            'The computed property "' + key + '" is already defined in data.',
+            vm
+          );
         } else if (vm.$options.props && key in vm.$options.props) {
-          warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
+          warn(
+            'The computed property "' + key + '" is already defined as a prop.',
+            vm
+          );
         }
       }
     }
   }
 
-  function defineComputed (
-    target,
-    key,
-    userDef
-  ) {
+  function defineComputed(target, key, userDef) {
     var shouldCache = !isServerRendering();
-    if (typeof userDef === 'function') {
+    if (typeof userDef === "function") {
       sharedPropertyDefinition.get = shouldCache
         ? createComputedGetter(key)
         : createGetterInvoker(userDef);
@@ -4816,7 +4944,9 @@
     if (sharedPropertyDefinition.set === noop) {
       sharedPropertyDefinition.set = function () {
         warn(
-          ("Computed property \"" + key + "\" was assigned to but it has no setter."),
+          'Computed property "' +
+            key +
+            '" was assigned to but it has no setter.',
           this
         );
       };
@@ -4824,8 +4954,8 @@
     Object.defineProperty(target, key, sharedPropertyDefinition);
   }
 
-  function createComputedGetter (key) {
-    return function computedGetter () {
+  function createComputedGetter(key) {
+    return function computedGetter() {
       var watcher = this._computedWatchers && this._computedWatchers[key];
       if (watcher) {
         if (watcher.dirty) {
@@ -4834,46 +4964,50 @@
         if (Dep.target) {
           watcher.depend();
         }
-        return watcher.value
+        return watcher.value;
       }
-    }
+    };
   }
 
   function createGetterInvoker(fn) {
-    return function computedGetter () {
-      return fn.call(this, this)
-    }
+    return function computedGetter() {
+      return fn.call(this, this);
+    };
   }
 
-  function initMethods (vm, methods) {
+  function initMethods(vm, methods) {
     var props = vm.$options.props;
     for (var key in methods) {
       {
-        if (typeof methods[key] !== 'function') {
+        if (typeof methods[key] !== "function") {
           warn(
-            "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
-            "Did you reference the function correctly?",
+            'Method "' +
+              key +
+              '" has type "' +
+              typeof methods[key] +
+              '" in the component definition. ' +
+              "Did you reference the function correctly?",
             vm
           );
         }
         if (props && hasOwn(props, key)) {
-          warn(
-            ("Method \"" + key + "\" has already been defined as a prop."),
-            vm
-          );
+          warn('Method "' + key + '" has already been defined as a prop.', vm);
         }
-        if ((key in vm) && isReserved(key)) {
+        if (key in vm && isReserved(key)) {
           warn(
-            "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
-            "Avoid defining component methods that start with _ or $."
+            'Method "' +
+              key +
+              '" conflicts with an existing Vue instance method. ' +
+              "Avoid defining component methods that start with _ or $."
           );
         }
       }
-      vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
+      vm[key] =
+        typeof methods[key] !== "function" ? noop : bind(methods[key], vm);
     }
   }
 
-  function initWatch (vm, watch) {
+  function initWatch(vm, watch) {
     for (var key in watch) {
       var handler = watch[key];
       if (Array.isArray(handler)) {
@@ -4886,35 +5020,34 @@
     }
   }
 
-  function createWatcher (
-    vm,
-    expOrFn,
-    handler,
-    options
-  ) {
+  function createWatcher(vm, expOrFn, handler, options) {
     if (isPlainObject(handler)) {
       options = handler;
       handler = handler.handler;
     }
-    if (typeof handler === 'string') {
+    if (typeof handler === "string") {
       handler = vm[handler];
     }
-    return vm.$watch(expOrFn, handler, options)
+    return vm.$watch(expOrFn, handler, options);
   }
 
-  function stateMixin (Vue) {
+  function stateMixin(Vue) {
     // flow somehow has problems with directly declared definition object
     // when using Object.defineProperty, so we have to procedurally build up
     // the object here.
     var dataDef = {};
-    dataDef.get = function () { return this._data };
+    dataDef.get = function () {
+      return this._data;
+    };
     var propsDef = {};
-    propsDef.get = function () { return this._props };
+    propsDef.get = function () {
+      return this._props;
+    };
     {
       dataDef.set = function () {
         warn(
-          'Avoid replacing instance root $data. ' +
-          'Use nested data properties instead.',
+          "Avoid replacing instance root $data. " +
+            "Use nested data properties instead.",
           this
         );
       };
@@ -4922,20 +5055,16 @@
         warn("$props is readonly.", this);
       };
     }
-    Object.defineProperty(Vue.prototype, '$data', dataDef);
-    Object.defineProperty(Vue.prototype, '$props', propsDef);
+    Object.defineProperty(Vue.prototype, "$data", dataDef);
+    Object.defineProperty(Vue.prototype, "$props", propsDef);
 
     Vue.prototype.$set = set;
     Vue.prototype.$delete = del;
 
-    Vue.prototype.$watch = function (
-      expOrFn,
-      cb,
-      options
-    ) {
+    Vue.prototype.$watch = function (expOrFn, cb, options) {
       var vm = this;
       if (isPlainObject(cb)) {
-        return createWatcher(vm, expOrFn, cb, options)
+        return createWatcher(vm, expOrFn, cb, options);
       }
       options = options || {};
       options.user = true;
@@ -4944,12 +5073,16 @@
         try {
           cb.call(vm, watcher.value);
         } catch (error) {
-          handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
+          handleError(
+            error,
+            vm,
+            'callback for immediate watcher "' + watcher.expression + '"'
+          );
         }
       }
-      return function unwatchFn () {
+      return function unwatchFn() {
         watcher.teardown();
-      }
+      };
     };
   }
 
@@ -4957,7 +5090,7 @@
 
   var uid$3 = 0;
 
-  function initMixin (Vue) {
+  function initMixin(Vue) {
     Vue.prototype._init = function (options) {
       var vm = this;
       // a uid
@@ -4966,8 +5099,8 @@
       var startTag, endTag;
       /* istanbul ignore if */
       if (config.performance && mark) {
-        startTag = "vue-perf-start:" + (vm._uid);
-        endTag = "vue-perf-end:" + (vm._uid);
+        startTag = "vue-perf-start:" + vm._uid;
+        endTag = "vue-perf-end:" + vm._uid;
         mark(startTag);
       }
 
@@ -4995,17 +5128,17 @@
       initLifecycle(vm);
       initEvents(vm);
       initRender(vm);
-      callHook(vm, 'beforeCreate');
+      callHook(vm, "beforeCreate");
       initInjections(vm); // resolve injections before data/props
       initState(vm);
       initProvide(vm); // resolve provide after data/props
-      callHook(vm, 'created');
+      callHook(vm, "created");
 
       /* istanbul ignore if */
       if (config.performance && mark) {
         vm._name = formatComponentName(vm, false);
         mark(endTag);
-        measure(("vue " + (vm._name) + " init"), startTag, endTag);
+        measure("vue " + vm._name + " init", startTag, endTag);
       }
 
       if (vm.$options.el) {
@@ -5014,8 +5147,8 @@
     };
   }
 
-  function initInternalComponent (vm, options) {
-    var opts = vm.$options = Object.create(vm.constructor.options);
+  function initInternalComponent(vm, options) {
+    var opts = (vm.$options = Object.create(vm.constructor.options));
     // doing this because it's faster than dynamic enumeration.
     var parentVnode = options._parentVnode;
     opts.parent = options.parent;
@@ -5033,7 +5166,7 @@
     }
   }
 
-  function resolveConstructorOptions (Ctor) {
+  function resolveConstructorOptions(Ctor) {
     var options = Ctor.options;
     if (Ctor.super) {
       var superOptions = resolveConstructorOptions(Ctor.super);
@@ -5054,26 +5187,27 @@
         }
       }
     }
-    return options
+    return options;
   }
 
-  function resolveModifiedOptions (Ctor) {
+  function resolveModifiedOptions(Ctor) {
     var modified;
     var latest = Ctor.options;
     var sealed = Ctor.sealedOptions;
     for (var key in latest) {
       if (latest[key] !== sealed[key]) {
-        if (!modified) { modified = {}; }
+        if (!modified) {
+          modified = {};
+        }
         modified[key] = latest[key];
       }
     }
-    return modified
+    return modified;
   }
 
-  function Vue (options) {
-    if (!(this instanceof Vue)
-    ) {
-      warn('Vue is a constructor and should be called with the `new` keyword');
+  function Vue(options) {
+    if (!(this instanceof Vue)) {
+      warn("Vue is a constructor and should be called with the `new` keyword");
     }
     this._init(options);
   }
@@ -5086,38 +5220,39 @@
 
   /*  */
 
-  function initUse (Vue) {
+  function initUse(Vue) {
     Vue.use = function (plugin) {
-      var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
+      var installedPlugins =
+        this._installedPlugins || (this._installedPlugins = []);
       if (installedPlugins.indexOf(plugin) > -1) {
-        return this
+        return this;
       }
 
       // additional parameters
       var args = toArray(arguments, 1);
       args.unshift(this);
-      if (typeof plugin.install === 'function') {
+      if (typeof plugin.install === "function") {
         plugin.install.apply(plugin, args);
-      } else if (typeof plugin === 'function') {
+      } else if (typeof plugin === "function") {
         plugin.apply(null, args);
       }
       installedPlugins.push(plugin);
-      return this
+      return this;
     };
   }
 
   /*  */
 
-  function initMixin$1 (Vue) {
+  function initMixin$1(Vue) {
     Vue.mixin = function (mixin) {
       this.options = mergeOptions(this.options, mixin);
-      return this
+      return this;
     };
   }
 
   /*  */
 
-  function initExtend (Vue) {
+  function initExtend(Vue) {
     /**
      * Each instance constructor, including Vue, has a unique
      * cid. This enables us to create wrapped "child
@@ -5135,7 +5270,7 @@
       var SuperId = Super.cid;
       var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
       if (cachedCtors[SuperId]) {
-        return cachedCtors[SuperId]
+        return cachedCtors[SuperId];
       }
 
       var name = extendOptions.name || Super.options.name;
@@ -5143,17 +5278,14 @@
         validateComponentName(name);
       }
 
-      var Sub = function VueComponent (options) {
+      var Sub = function VueComponent(options) {
         this._init(options);
       };
       Sub.prototype = Object.create(Super.prototype);
       Sub.prototype.constructor = Sub;
       Sub.cid = cid++;
-      Sub.options = mergeOptions(
-        Super.options,
-        extendOptions
-      );
-      Sub['super'] = Super;
+      Sub.options = mergeOptions(Super.options, extendOptions);
+      Sub["super"] = Super;
 
       // For props and computed properties, we define the proxy getters on
       // the Vue instances at extension time, on the extended prototype. This
@@ -5189,18 +5321,18 @@
 
       // cache constructor
       cachedCtors[SuperId] = Sub;
-      return Sub
+      return Sub;
     };
   }
 
-  function initProps$1 (Comp) {
+  function initProps$1(Comp) {
     var props = Comp.options.props;
     for (var key in props) {
       proxy(Comp.prototype, "_props", key);
     }
   }
 
-  function initComputed$1 (Comp) {
+  function initComputed$1(Comp) {
     var computed = Comp.options.computed;
     for (var key in computed) {
       defineComputed(Comp.prototype, key, computed[key]);
@@ -5209,31 +5341,28 @@
 
   /*  */
 
-  function initAssetRegisters (Vue) {
+  function initAssetRegisters(Vue) {
     /**
      * Create asset registration methods.
      */
     ASSET_TYPES.forEach(function (type) {
-      Vue[type] = function (
-        id,
-        definition
-      ) {
+      Vue[type] = function (id, definition) {
         if (!definition) {
-          return this.options[type + 's'][id]
+          return this.options[type + "s"][id];
         } else {
           /* istanbul ignore if */
-          if (type === 'component') {
+          if (type === "component") {
             validateComponentName(id);
           }
-          if (type === 'component' && isPlainObject(definition)) {
+          if (type === "component" && isPlainObject(definition)) {
             definition.name = definition.name || id;
             definition = this.options._base.extend(definition);
           }
-          if (type === 'directive' && typeof definition === 'function') {
+          if (type === "directive" && typeof definition === "function") {
             definition = { bind: definition, update: definition };
           }
-          this.options[type + 's'][id] = definition;
-          return definition
+          this.options[type + "s"][id] = definition;
+          return definition;
         }
       };
     });
@@ -5241,25 +5370,23 @@
 
   /*  */
 
-
-
-  function getComponentName (opts) {
-    return opts && (opts.Ctor.options.name || opts.tag)
+  function getComponentName(opts) {
+    return opts && (opts.Ctor.options.name || opts.tag);
   }
 
-  function matches (pattern, name) {
+  function matches(pattern, name) {
     if (Array.isArray(pattern)) {
-      return pattern.indexOf(name) > -1
-    } else if (typeof pattern === 'string') {
-      return pattern.split(',').indexOf(name) > -1
+      return pattern.indexOf(name) > -1;
+    } else if (typeof pattern === "string") {
+      return pattern.split(",").indexOf(name) > -1;
     } else if (isRegExp(pattern)) {
-      return pattern.test(name)
+      return pattern.test(name);
     }
     /* istanbul ignore next */
-    return false
+    return false;
   }
 
-  function pruneCache (keepAliveInstance, filter) {
+  function pruneCache(keepAliveInstance, filter) {
     var cache = keepAliveInstance.cache;
     var keys = keepAliveInstance.keys;
     var _vnode = keepAliveInstance._vnode;
@@ -5274,12 +5401,7 @@
     }
   }
 
-  function pruneCacheEntry (
-    cache,
-    key,
-    keys,
-    current
-  ) {
+  function pruneCacheEntry(cache, key, keys, current) {
     var cached$$1 = cache[key];
     if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
       cached$$1.componentInstance.$destroy();
@@ -5291,38 +5413,42 @@
   var patternTypes = [String, RegExp, Array];
 
   var KeepAlive = {
-    name: 'keep-alive',
+    name: "keep-alive",
     abstract: true,
 
     props: {
       include: patternTypes,
       exclude: patternTypes,
-      max: [String, Number]
+      max: [String, Number],
     },
 
-    created: function created () {
+    created: function created() {
       this.cache = Object.create(null);
       this.keys = [];
     },
 
-    destroyed: function destroyed () {
+    destroyed: function destroyed() {
       for (var key in this.cache) {
         pruneCacheEntry(this.cache, key, this.keys);
       }
     },
 
-    mounted: function mounted () {
+    mounted: function mounted() {
       var this$1 = this;
 
-      this.$watch('include', function (val) {
-        pruneCache(this$1, function (name) { return matches(val, name); });
+      this.$watch("include", function (val) {
+        pruneCache(this$1, function (name) {
+          return matches(val, name);
+        });
       });
-      this.$watch('exclude', function (val) {
-        pruneCache(this$1, function (name) { return !matches(val, name); });
+      this.$watch("exclude", function (val) {
+        pruneCache(this$1, function (name) {
+          return !matches(val, name);
+        });
       });
     },
 
-    render: function render () {
+    render: function render() {
       var slot = this.$slots.default;
       var vnode = getFirstComponentChild(slot);
       var componentOptions = vnode && vnode.componentOptions;
@@ -5338,17 +5464,19 @@
           // excluded
           (exclude && name && matches(exclude, name))
         ) {
-          return vnode
+          return vnode;
         }
 
         var ref$1 = this;
         var cache = ref$1.cache;
         var keys = ref$1.keys;
-        var key = vnode.key == null
-          // same constructor may get registered as different local components
-          // so cid alone is not enough (#3269)
-          ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
-          : vnode.key;
+        var key =
+          vnode.key == null
+            ? // same constructor may get registered as different local components
+              // so cid alone is not enough (#3269)
+              componentOptions.Ctor.cid +
+              (componentOptions.tag ? "::" + componentOptions.tag : "")
+            : vnode.key;
         if (cache[key]) {
           vnode.componentInstance = cache[key].componentInstance;
           // make current key freshest
@@ -5365,28 +5493,30 @@
 
         vnode.data.keepAlive = true;
       }
-      return vnode || (slot && slot[0])
-    }
+      return vnode || (slot && slot[0]);
+    },
   };
 
   var builtInComponents = {
-    KeepAlive: KeepAlive
+    KeepAlive: KeepAlive,
   };
 
   /*  */
 
-  function initGlobalAPI (Vue) {
+  function initGlobalAPI(Vue) {
     // config
     var configDef = {};
-    configDef.get = function () { return config; };
+    configDef.get = function () {
+      return config;
+    };
     {
       configDef.set = function () {
         warn(
-          'Do not replace the Vue.config object, set individual fields instead.'
+          "Do not replace the Vue.config object, set individual fields instead."
         );
       };
     }
-    Object.defineProperty(Vue, 'config', configDef);
+    Object.defineProperty(Vue, "config", configDef);
 
     // exposed util methods.
     // NOTE: these are not considered part of the public API - avoid relying on
@@ -5395,7 +5525,7 @@
       warn: warn,
       extend: extend,
       mergeOptions: mergeOptions,
-      defineReactive: defineReactive$$1
+      defineReactive: defineReactive$$1,
     };
 
     Vue.set = set;
@@ -5405,12 +5535,12 @@
     // 2.6 explicit observable API
     Vue.observable = function (obj) {
       observe(obj);
-      return obj
+      return obj;
     };
 
     Vue.options = Object.create(null);
     ASSET_TYPES.forEach(function (type) {
-      Vue.options[type + 's'] = Object.create(null);
+      Vue.options[type + "s"] = Object.create(null);
     });
 
     // this is used to identify the "base" constructor to extend all plain-object
@@ -5427,80 +5557,82 @@
 
   initGlobalAPI(Vue);
 
-  Object.defineProperty(Vue.prototype, '$isServer', {
-    get: isServerRendering
+  Object.defineProperty(Vue.prototype, "$isServer", {
+    get: isServerRendering,
   });
 
-  Object.defineProperty(Vue.prototype, '$ssrContext', {
-    get: function get () {
+  Object.defineProperty(Vue.prototype, "$ssrContext", {
+    get: function get() {
       /* istanbul ignore next */
-      return this.$vnode && this.$vnode.ssrContext
-    }
+      return this.$vnode && this.$vnode.ssrContext;
+    },
   });
 
   // expose FunctionalRenderContext for ssr runtime helper installation
-  Object.defineProperty(Vue, 'FunctionalRenderContext', {
-    value: FunctionalRenderContext
+  Object.defineProperty(Vue, "FunctionalRenderContext", {
+    value: FunctionalRenderContext,
   });
 
-  Vue.version = '2.6.12';
+  Vue.version = "2.6.12";
 
   /*  */
 
   // these are reserved for web because they are directly compiled away
   // during template compilation
-  var isReservedAttr = makeMap('style,class');
+  var isReservedAttr = makeMap("style,class");
 
   // attributes that should be using props for binding
-  var acceptValue = makeMap('input,textarea,option,select,progress');
+  var acceptValue = makeMap("input,textarea,option,select,progress");
   var mustUseProp = function (tag, type, attr) {
     return (
-      (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
-      (attr === 'selected' && tag === 'option') ||
-      (attr === 'checked' && tag === 'input') ||
-      (attr === 'muted' && tag === 'video')
-    )
+      (attr === "value" && acceptValue(tag) && type !== "button") ||
+      (attr === "selected" && tag === "option") ||
+      (attr === "checked" && tag === "input") ||
+      (attr === "muted" && tag === "video")
+    );
   };
 
-  var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');
+  var isEnumeratedAttr = makeMap("contenteditable,draggable,spellcheck");
 
-  var isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');
+  var isValidContentEditableValue = makeMap(
+    "events,caret,typing,plaintext-only"
+  );
 
   var convertEnumeratedValue = function (key, value) {
-    return isFalsyAttrValue(value) || value === 'false'
-      ? 'false'
-      // allow arbitrary string value for contenteditable
-      : key === 'contenteditable' && isValidContentEditableValue(value)
-        ? value
-        : 'true'
+    return isFalsyAttrValue(value) || value === "false"
+      ? "false"
+      : // allow arbitrary string value for contenteditable
+      key === "contenteditable" && isValidContentEditableValue(value)
+      ? value
+      : "true";
   };
 
   var isBooleanAttr = makeMap(
-    'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +
-    'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +
-    'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +
-    'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +
-    'required,reversed,scoped,seamless,selected,sortable,translate,' +
-    'truespeed,typemustmatch,visible'
+    "allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare," +
+      "default,defaultchecked,defaultmuted,defaultselected,defer,disabled," +
+      "enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple," +
+      "muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly," +
+      "required,reversed,scoped,seamless,selected,sortable,translate," +
+      "truespeed,typemustmatch,visible"
   );
 
-  var xlinkNS = 'http://www.w3.org/1999/xlink';
+  var xlinkNS = "http://www.w3.org/1999/xlink";
 
   var isXlink = function (name) {
-    return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'
+    return name.charAt(5) === ":" && name.slice(0, 5) === "xlink";
   };
 
   var getXlinkProp = function (name) {
-    return isXlink(name) ? name.slice(6, name.length) : ''
+    return isXlink(name) ? name.slice(6, name.length) : "";
   };
 
   var isFalsyAttrValue = function (val) {
-    return val == null || val === false
+    return val == null || val === false;
   };
 
   /*  */
 
-  function genClassForVnode (vnode) {
+  function genClassForVnode(vnode) {
     var data = vnode.data;
     var parentNode = vnode;
     var childNode = vnode;
@@ -5510,229 +5642,236 @@
         data = mergeClassData(childNode.data, data);
       }
     }
-    while (isDef(parentNode = parentNode.parent)) {
+    while (isDef((parentNode = parentNode.parent))) {
       if (parentNode && parentNode.data) {
         data = mergeClassData(data, parentNode.data);
       }
     }
-    return renderClass(data.staticClass, data.class)
+    return renderClass(data.staticClass, data.class);
   }
 
-  function mergeClassData (child, parent) {
+  function mergeClassData(child, parent) {
     return {
       staticClass: concat(child.staticClass, parent.staticClass),
-      class: isDef(child.class)
-        ? [child.class, parent.class]
-        : parent.class
-    }
+      class: isDef(child.class) ? [child.class, parent.class] : parent.class,
+    };
   }
 
-  function renderClass (
-    staticClass,
-    dynamicClass
-  ) {
+  function renderClass(staticClass, dynamicClass) {
     if (isDef(staticClass) || isDef(dynamicClass)) {
-      return concat(staticClass, stringifyClass(dynamicClass))
+      return concat(staticClass, stringifyClass(dynamicClass));
     }
     /* istanbul ignore next */
-    return ''
+    return "";
   }
 
-  function concat (a, b) {
-    return a ? b ? (a + ' ' + b) : a : (b || '')
+  function concat(a, b) {
+    return a ? (b ? a + " " + b : a) : b || "";
   }
 
-  function stringifyClass (value) {
+  function stringifyClass(value) {
     if (Array.isArray(value)) {
-      return stringifyArray(value)
+      return stringifyArray(value);
     }
     if (isObject(value)) {
-      return stringifyObject(value)
+      return stringifyObject(value);
     }
-    if (typeof value === 'string') {
-      return value
+    if (typeof value === "string") {
+      return value;
     }
     /* istanbul ignore next */
-    return ''
+    return "";
   }
 
-  function stringifyArray (value) {
-    var res = '';
+  function stringifyArray(value) {
+    var res = "";
     var stringified;
     for (var i = 0, l = value.length; i < l; i++) {
-      if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
-        if (res) { res += ' '; }
+      if (
+        isDef((stringified = stringifyClass(value[i]))) &&
+        stringified !== ""
+      ) {
+        if (res) {
+          res += " ";
+        }
         res += stringified;
       }
     }
-    return res
+    return res;
   }
 
-  function stringifyObject (value) {
-    var res = '';
+  function stringifyObject(value) {
+    var res = "";
     for (var key in value) {
       if (value[key]) {
-        if (res) { res += ' '; }
+        if (res) {
+          res += " ";
+        }
         res += key;
       }
     }
-    return res
+    return res;
   }
 
   /*  */
 
   var namespaceMap = {
-    svg: 'http://www.w3.org/2000/svg',
-    math: 'http://www.w3.org/1998/Math/MathML'
+    svg: "http://www.w3.org/2000/svg",
+    math: "http://www.w3.org/1998/Math/MathML",
   };
 
   var isHTMLTag = makeMap(
-    'html,body,base,head,link,meta,style,title,' +
-    'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +
-    'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +
-    'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +
-    's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +
-    'embed,object,param,source,canvas,script,noscript,del,ins,' +
-    'caption,col,colgroup,table,thead,tbody,td,th,tr,' +
-    'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +
-    'output,progress,select,textarea,' +
-    'details,dialog,menu,menuitem,summary,' +
-    'content,element,shadow,template,blockquote,iframe,tfoot'
+    "html,body,base,head,link,meta,style,title," +
+      "address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section," +
+      "div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul," +
+      "a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby," +
+      "s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video," +
+      "embed,object,param,source,canvas,script,noscript,del,ins," +
+      "caption,col,colgroup,table,thead,tbody,td,th,tr," +
+      "button,datalist,fieldset,form,input,label,legend,meter,optgroup,option," +
+      "output,progress,select,textarea," +
+      "details,dialog,menu,menuitem,summary," +
+      "content,element,shadow,template,blockquote,iframe,tfoot"
   );
 
   // this map is intentionally selective, only covering SVG elements that may
   // contain child elements.
   var isSVG = makeMap(
-    'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +
-    'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +
-    'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',
+    "svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face," +
+      "foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern," +
+      "polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",
     true
   );
 
-  var isPreTag = function (tag) { return tag === 'pre'; };
+  var isPreTag = function (tag) {
+    return tag === "pre";
+  };
 
   var isReservedTag = function (tag) {
-    return isHTMLTag(tag) || isSVG(tag)
+    return isHTMLTag(tag) || isSVG(tag);
   };
 
-  function getTagNamespace (tag) {
+  function getTagNamespace(tag) {
     if (isSVG(tag)) {
-      return 'svg'
+      return "svg";
     }
     // basic support for MathML
     // note it doesn't support other MathML elements being component roots
-    if (tag === 'math') {
-      return 'math'
+    if (tag === "math") {
+      return "math";
     }
   }
 
   var unknownElementCache = Object.create(null);
-  function isUnknownElement (tag) {
+  function isUnknownElement(tag) {
     /* istanbul ignore if */
     if (!inBrowser) {
-      return true
+      return true;
     }
     if (isReservedTag(tag)) {
-      return false
+      return false;
     }
     tag = tag.toLowerCase();
     /* istanbul ignore if */
     if (unknownElementCache[tag] != null) {
-      return unknownElementCache[tag]
+      return unknownElementCache[tag];
     }
     var el = document.createElement(tag);
-    if (tag.indexOf('-') > -1) {
+    if (tag.indexOf("-") > -1) {
       // http://stackoverflow.com/a/28210364/1070244
-      return (unknownElementCache[tag] = (
+      return (unknownElementCache[tag] =
         el.constructor === window.HTMLUnknownElement ||
-        el.constructor === window.HTMLElement
-      ))
+        el.constructor === window.HTMLElement);
     } else {
-      return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))
+      return (unknownElementCache[tag] = /HTMLUnknownElement/.test(
+        el.toString()
+      ));
     }
   }
 
-  var isTextInputType = makeMap('text,number,password,search,email,tel,url');
+  var isTextInputType = makeMap("text,number,password,search,email,tel,url");
 
   /*  */
 
   /**
    * Query an element selector if it's not an element already.
    */
-  function query (el) {
-    if (typeof el === 'string') {
+  function query(el) {
+    if (typeof el === "string") {
       var selected = document.querySelector(el);
       if (!selected) {
-        warn(
-          'Cannot find element: ' + el
-        );
-        return document.createElement('div')
+        warn("Cannot find element: " + el);
+        return document.createElement("div");
       }
-      return selected
+      return selected;
     } else {
-      return el
+      return el;
     }
   }
 
   /*  */
 
-  function createElement$1 (tagName, vnode) {
+  function createElement$1(tagName, vnode) {
     var elm = document.createElement(tagName);
-    if (tagName !== 'select') {
-      return elm
+    if (tagName !== "select") {
+      return elm;
     }
     // false or null will remove the attribute but undefined will not
-    if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {
-      elm.setAttribute('multiple', 'multiple');
+    if (
+      vnode.data &&
+      vnode.data.attrs &&
+      vnode.data.attrs.multiple !== undefined
+    ) {
+      elm.setAttribute("multiple", "multiple");
     }
-    return elm
+    return elm;
   }
 
-  function createElementNS (namespace, tagName) {
-    return document.createElementNS(namespaceMap[namespace], tagName)
+  function createElementNS(namespace, tagName) {
+    return document.createElementNS(namespaceMap[namespace], tagName);
   }
 
-  function createTextNode (text) {
-    return document.createTextNode(text)
+  function createTextNode(text) {
+    return document.createTextNode(text);
   }
 
-  function createComment (text) {
-    return document.createComment(text)
+  function createComment(text) {
+    return document.createComment(text);
   }
 
-  function insertBefore (parentNode, newNode, referenceNode) {
+  function insertBefore(parentNode, newNode, referenceNode) {
     parentNode.insertBefore(newNode, referenceNode);
   }
 
-  function removeChild (node, child) {
+  function removeChild(node, child) {
     node.removeChild(child);
   }
 
-  function appendChild (node, child) {
+  function appendChild(node, child) {
     node.appendChild(child);
   }
 
-  function parentNode (node) {
-    return node.parentNode
+  function parentNode(node) {
+    return node.parentNode;
   }
 
-  function nextSibling (node) {
-    return node.nextSibling
+  function nextSibling(node) {
+    return node.nextSibling;
   }
 
-  function tagName (node) {
-    return node.tagName
+  function tagName(node) {
+    return node.tagName;
   }
 
-  function setTextContent (node, text) {
+  function setTextContent(node, text) {
     node.textContent = text;
   }
 
-  function setStyleScope (node, scopeId) {
-    node.setAttribute(scopeId, '');
+  function setStyleScope(node, scopeId) {
+    node.setAttribute(scopeId, "");
   }
 
-  var nodeOps = /*#__PURE__*/Object.freeze({
+  var nodeOps = /*#__PURE__*/ Object.freeze({
     createElement: createElement$1,
     createElementNS: createElementNS,
     createTextNode: createTextNode,
@@ -5744,29 +5883,31 @@
     nextSibling: nextSibling,
     tagName: tagName,
     setTextContent: setTextContent,
-    setStyleScope: setStyleScope
+    setStyleScope: setStyleScope,
   });
 
   /*  */
 
   var ref = {
-    create: function create (_, vnode) {
+    create: function create(_, vnode) {
       registerRef(vnode);
     },
-    update: function update (oldVnode, vnode) {
+    update: function update(oldVnode, vnode) {
       if (oldVnode.data.ref !== vnode.data.ref) {
         registerRef(oldVnode, true);
         registerRef(vnode);
       }
     },
-    destroy: function destroy (vnode) {
+    destroy: function destroy(vnode) {
       registerRef(vnode, true);
-    }
+    },
   };
 
-  function registerRef (vnode, isRemoval) {
+  function registerRef(vnode, isRemoval) {
     var key = vnode.data.ref;
-    if (!isDef(key)) { return }
+    if (!isDef(key)) {
+      return;
+    }
 
     var vm = vnode.context;
     var ref = vnode.componentInstance || vnode.elm;
@@ -5803,46 +5944,48 @@
    * of making flow understand it is not worth it.
    */
 
-  var emptyNode = new VNode('', {}, []);
+  var emptyNode = new VNode("", {}, []);
 
-  var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
+  var hooks = ["create", "activate", "update", "remove", "destroy"];
 
-  function sameVnode (a, b) {
+  function sameVnode(a, b) {
     return (
-      a.key === b.key && (
-        (
-          a.tag === b.tag &&
-          a.isComment === b.isComment &&
-          isDef(a.data) === isDef(b.data) &&
-          sameInputType(a, b)
-        ) || (
-          isTrue(a.isAsyncPlaceholder) &&
+      a.key === b.key &&
+      ((a.tag === b.tag &&
+        a.isComment === b.isComment &&
+        isDef(a.data) === isDef(b.data) &&
+        sameInputType(a, b)) ||
+        (isTrue(a.isAsyncPlaceholder) &&
           a.asyncFactory === b.asyncFactory &&
-          isUndef(b.asyncFactory.error)
-        )
-      )
-    )
+          isUndef(b.asyncFactory.error)))
+    );
   }
 
-  function sameInputType (a, b) {
-    if (a.tag !== 'input') { return true }
+  function sameInputType(a, b) {
+    if (a.tag !== "input") {
+      return true;
+    }
     var i;
-    var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
-    var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
-    return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
+    var typeA = isDef((i = a.data)) && isDef((i = i.attrs)) && i.type;
+    var typeB = isDef((i = b.data)) && isDef((i = i.attrs)) && i.type;
+    return (
+      typeA === typeB || (isTextInputType(typeA) && isTextInputType(typeB))
+    );
   }
 
-  function createKeyToOldIdx (children, beginIdx, endIdx) {
+  function createKeyToOldIdx(children, beginIdx, endIdx) {
     var i, key;
     var map = {};
     for (i = beginIdx; i <= endIdx; ++i) {
       key = children[i].key;
-      if (isDef(key)) { map[key] = i; }
+      if (isDef(key)) {
+        map[key] = i;
+      }
     }
-    return map
+    return map;
   }
 
-  function createPatchFunction (backend) {
+  function createPatchFunction(backend) {
     var i, j;
     var cbs = {};
 
@@ -5858,21 +6001,27 @@
       }
     }
 
-    function emptyNodeAt (elm) {
-      return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
+    function emptyNodeAt(elm) {
+      return new VNode(
+        nodeOps.tagName(elm).toLowerCase(),
+        {},
+        [],
+        undefined,
+        elm
+      );
     }
 
-    function createRmCb (childElm, listeners) {
-      function remove$$1 () {
+    function createRmCb(childElm, listeners) {
+      function remove$$1() {
         if (--remove$$1.listeners === 0) {
           removeNode(childElm);
         }
       }
       remove$$1.listeners = listeners;
-      return remove$$1
+      return remove$$1;
     }
 
-    function removeNode (el) {
+    function removeNode(el) {
       var parent = nodeOps.parentNode(el);
       // element may have already been removed due to v-html / v-text
       if (isDef(parent)) {
@@ -5880,7 +6029,7 @@
       }
     }
 
-    function isUnknownElement$$1 (vnode, inVPre) {
+    function isUnknownElement$$1(vnode, inVPre) {
       return (
         !inVPre &&
         !vnode.ns &&
@@ -5889,16 +6038,16 @@
           config.ignoredElements.some(function (ignore) {
             return isRegExp(ignore)
               ? ignore.test(vnode.tag)
-              : ignore === vnode.tag
+              : ignore === vnode.tag;
           })
         ) &&
         config.isUnknownElement(vnode.tag)
-      )
+      );
     }
 
     var creatingElmInVPre = 0;
 
-    function createElm (
+    function createElm(
       vnode,
       insertedVnodeQueue,
       parentElm,
@@ -5918,7 +6067,7 @@
 
       vnode.isRootInsert = !nested; // for transition enter check
       if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
-        return
+        return;
       }
 
       var data = vnode.data;
@@ -5931,9 +6080,11 @@
           }
           if (isUnknownElement$$1(vnode, creatingElmInVPre)) {
             warn(
-              'Unknown custom element: <' + tag + '> - did you ' +
-              'register the component correctly? For recursive components, ' +
-              'make sure to provide the "name" option.',
+              "Unknown custom element: <" +
+                tag +
+                "> - did you " +
+                "register the component correctly? For recursive components, " +
+                'make sure to provide the "name" option.',
               vnode.context
             );
           }
@@ -5965,11 +6116,11 @@
       }
     }
 
-    function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    function createComponent(vnode, insertedVnodeQueue, parentElm, refElm) {
       var i = vnode.data;
       if (isDef(i)) {
         var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
-        if (isDef(i = i.hook) && isDef(i = i.init)) {
+        if (isDef((i = i.hook)) && isDef((i = i.init))) {
           i(vnode, false /* hydrating */);
         }
         // after calling the init hook, if the vnode is a child component
@@ -5982,14 +6133,17 @@
           if (isTrue(isReactivated)) {
             reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
           }
-          return true
+          return true;
         }
       }
     }
 
-    function initComponent (vnode, insertedVnodeQueue) {
+    function initComponent(vnode, insertedVnodeQueue) {
       if (isDef(vnode.data.pendingInsert)) {
-        insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
+        insertedVnodeQueue.push.apply(
+          insertedVnodeQueue,
+          vnode.data.pendingInsert
+        );
         vnode.data.pendingInsert = null;
       }
       vnode.elm = vnode.componentInstance.$el;
@@ -6005,7 +6159,7 @@
       }
     }
 
-    function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
+    function reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm) {
       var i;
       // hack for #4339: a reactivated component with inner transition
       // does not trigger because the inner node's created hooks are not called
@@ -6014,12 +6168,12 @@
       var innerNode = vnode;
       while (innerNode.componentInstance) {
         innerNode = innerNode.componentInstance._vnode;
-        if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
+        if (isDef((i = innerNode.data)) && isDef((i = i.transition))) {
           for (i = 0; i < cbs.activate.length; ++i) {
             cbs.activate[i](emptyNode, innerNode);
           }
           insertedVnodeQueue.push(innerNode);
-          break
+          break;
         }
       }
       // unlike a newly created component,
@@ -6027,7 +6181,7 @@
       insert(parentElm, vnode.elm, refElm);
     }
 
-    function insert (parent, elm, ref$$1) {
+    function insert(parent, elm, ref$$1) {
       if (isDef(parent)) {
         if (isDef(ref$$1)) {
           if (nodeOps.parentNode(ref$$1) === parent) {
@@ -6039,98 +6193,137 @@
       }
     }
 
-    function createChildren (vnode, children, insertedVnodeQueue) {
+    function createChildren(vnode, children, insertedVnodeQueue) {
       if (Array.isArray(children)) {
         {
           checkDuplicateKeys(children);
         }
         for (var i = 0; i < children.length; ++i) {
-          createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);
+          createElm(
+            children[i],
+            insertedVnodeQueue,
+            vnode.elm,
+            null,
+            true,
+            children,
+            i
+          );
         }
       } else if (isPrimitive(vnode.text)) {
-        nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
+        nodeOps.appendChild(
+          vnode.elm,
+          nodeOps.createTextNode(String(vnode.text))
+        );
       }
     }
 
-    function isPatchable (vnode) {
+    function isPatchable(vnode) {
       while (vnode.componentInstance) {
         vnode = vnode.componentInstance._vnode;
       }
-      return isDef(vnode.tag)
+      return isDef(vnode.tag);
     }
 
-    function invokeCreateHooks (vnode, insertedVnodeQueue) {
+    function invokeCreateHooks(vnode, insertedVnodeQueue) {
       for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
         cbs.create[i$1](emptyNode, vnode);
       }
       i = vnode.data.hook; // Reuse variable
       if (isDef(i)) {
-        if (isDef(i.create)) { i.create(emptyNode, vnode); }
-        if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
+        if (isDef(i.create)) {
+          i.create(emptyNode, vnode);
+        }
+        if (isDef(i.insert)) {
+          insertedVnodeQueue.push(vnode);
+        }
       }
     }
 
     // set scope id attribute for scoped CSS.
     // this is implemented as a special case to avoid the overhead
     // of going through the normal attribute patching process.
-    function setScope (vnode) {
+    function setScope(vnode) {
       var i;
-      if (isDef(i = vnode.fnScopeId)) {
+      if (isDef((i = vnode.fnScopeId))) {
         nodeOps.setStyleScope(vnode.elm, i);
       } else {
         var ancestor = vnode;
         while (ancestor) {
-          if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
+          if (
+            isDef((i = ancestor.context)) &&
+            isDef((i = i.$options._scopeId))
+          ) {
             nodeOps.setStyleScope(vnode.elm, i);
           }
           ancestor = ancestor.parent;
         }
       }
       // for slot content they should also get the scopeId from the host instance.
-      if (isDef(i = activeInstance) &&
+      if (
+        isDef((i = activeInstance)) &&
         i !== vnode.context &&
         i !== vnode.fnContext &&
-        isDef(i = i.$options._scopeId)
+        isDef((i = i.$options._scopeId))
       ) {
         nodeOps.setStyleScope(vnode.elm, i);
       }
     }
 
-    function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
+    function addVnodes(
+      parentElm,
+      refElm,
+      vnodes,
+      startIdx,
+      endIdx,
+      insertedVnodeQueue
+    ) {
       for (; startIdx <= endIdx; ++startIdx) {
-        createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);
+        createElm(
+          vnodes[startIdx],
+          insertedVnodeQueue,
+          parentElm,
+          refElm,
+          false,
+          vnodes,
+          startIdx
+        );
       }
     }
 
-    function invokeDestroyHook (vnode) {
+    function invokeDestroyHook(vnode) {
       var i, j;
       var data = vnode.data;
       if (isDef(data)) {
-        if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
-        for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
+        if (isDef((i = data.hook)) && isDef((i = i.destroy))) {
+          i(vnode);
+        }
+        for (i = 0; i < cbs.destroy.length; ++i) {
+          cbs.destroy[i](vnode);
+        }
       }
-      if (isDef(i = vnode.children)) {
+      if (isDef((i = vnode.children))) {
         for (j = 0; j < vnode.children.length; ++j) {
           invokeDestroyHook(vnode.children[j]);
         }
       }
     }
 
-    function removeVnodes (vnodes, startIdx, endIdx) {
+    function removeVnodes(vnodes, startIdx, endIdx) {
       for (; startIdx <= endIdx; ++startIdx) {
         var ch = vnodes[startIdx];
         if (isDef(ch)) {
           if (isDef(ch.tag)) {
             removeAndInvokeRemoveHook(ch);
             invokeDestroyHook(ch);
-          } else { // Text node
+          } else {
+            // Text node
             removeNode(ch.elm);
           }
         }
       }
     }
 
-    function removeAndInvokeRemoveHook (vnode, rm) {
+    function removeAndInvokeRemoveHook(vnode, rm) {
       if (isDef(rm) || isDef(vnode.data)) {
         var i;
         var listeners = cbs.remove.length + 1;
@@ -6143,13 +6336,17 @@
           rm = createRmCb(vnode.elm, listeners);
         }
         // recursively invoke hooks on child component root node
-        if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
+        if (
+          isDef((i = vnode.componentInstance)) &&
+          isDef((i = i._vnode)) &&
+          isDef(i.data)
+        ) {
           removeAndInvokeRemoveHook(i, rm);
         }
         for (i = 0; i < cbs.remove.length; ++i) {
           cbs.remove[i](vnode, rm);
         }
-        if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
+        if (isDef((i = vnode.data.hook)) && isDef((i = i.remove))) {
           i(vnode, rm);
         } else {
           rm();
@@ -6159,7 +6356,13 @@
       }
     }
 
-    function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
+    function updateChildren(
+      parentElm,
+      oldCh,
+      newCh,
+      insertedVnodeQueue,
+      removeOnly
+    ) {
       var oldStartIdx = 0;
       var newStartIdx = 0;
       var oldEndIdx = oldCh.length - 1;
@@ -6185,53 +6388,124 @@
         } else if (isUndef(oldEndVnode)) {
           oldEndVnode = oldCh[--oldEndIdx];
         } else if (sameVnode(oldStartVnode, newStartVnode)) {
-          patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
+          patchVnode(
+            oldStartVnode,
+            newStartVnode,
+            insertedVnodeQueue,
+            newCh,
+            newStartIdx
+          );
           oldStartVnode = oldCh[++oldStartIdx];
           newStartVnode = newCh[++newStartIdx];
         } else if (sameVnode(oldEndVnode, newEndVnode)) {
-          patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);
+          patchVnode(
+            oldEndVnode,
+            newEndVnode,
+            insertedVnodeQueue,
+            newCh,
+            newEndIdx
+          );
           oldEndVnode = oldCh[--oldEndIdx];
           newEndVnode = newCh[--newEndIdx];
-        } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
-          patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);
-          canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
+        } else if (sameVnode(oldStartVnode, newEndVnode)) {
+          // Vnode moved right
+          patchVnode(
+            oldStartVnode,
+            newEndVnode,
+            insertedVnodeQueue,
+            newCh,
+            newEndIdx
+          );
+          canMove &&
+            nodeOps.insertBefore(
+              parentElm,
+              oldStartVnode.elm,
+              nodeOps.nextSibling(oldEndVnode.elm)
+            );
           oldStartVnode = oldCh[++oldStartIdx];
           newEndVnode = newCh[--newEndIdx];
-        } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
-          patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
-          canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
+        } else if (sameVnode(oldEndVnode, newStartVnode)) {
+          // Vnode moved left
+          patchVnode(
+            oldEndVnode,
+            newStartVnode,
+            insertedVnodeQueue,
+            newCh,
+            newStartIdx
+          );
+          canMove &&
+            nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
           oldEndVnode = oldCh[--oldEndIdx];
           newStartVnode = newCh[++newStartIdx];
         } else {
-          if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
+          if (isUndef(oldKeyToIdx)) {
+            oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
+          }
           idxInOld = isDef(newStartVnode.key)
             ? oldKeyToIdx[newStartVnode.key]
             : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);
-          if (isUndef(idxInOld)) { // New element
-            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
+          if (isUndef(idxInOld)) {
+            // New element
+            createElm(
+              newStartVnode,
+              insertedVnodeQueue,
+              parentElm,
+              oldStartVnode.elm,
+              false,
+              newCh,
+              newStartIdx
+            );
           } else {
             vnodeToMove = oldCh[idxInOld];
             if (sameVnode(vnodeToMove, newStartVnode)) {
-              patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);
+              patchVnode(
+                vnodeToMove,
+                newStartVnode,
+                insertedVnodeQueue,
+                newCh,
+                newStartIdx
+              );
               oldCh[idxInOld] = undefined;
-              canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);
+              canMove &&
+                nodeOps.insertBefore(
+                  parentElm,
+                  vnodeToMove.elm,
+                  oldStartVnode.elm
+                );
             } else {
               // same key but different element. treat as new element
-              createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);
+              createElm(
+                newStartVnode,
+                insertedVnodeQueue,
+                parentElm,
+                oldStartVnode.elm,
+                false,
+                newCh,
+                newStartIdx
+              );
             }
           }
           newStartVnode = newCh[++newStartIdx];
         }
       }
       if (oldStartIdx > oldEndIdx) {
-        refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
-        addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
+        refElm = isUndef(newCh[newEndIdx + 1])
+          ? null
+          : newCh[newEndIdx + 1].elm;
+        addVnodes(
+          parentElm,
+          refElm,
+          newCh,
+          newStartIdx,
+          newEndIdx,
+          insertedVnodeQueue
+        );
       } else if (newStartIdx > newEndIdx) {
         removeVnodes(oldCh, oldStartIdx, oldEndIdx);
       }
     }
 
-    function checkDuplicateKeys (children) {
+    function checkDuplicateKeys(children) {
       var seenKeys = {};
       for (var i = 0; i < children.length; i++) {
         var vnode = children[i];
@@ -6239,7 +6513,9 @@
         if (isDef(key)) {
           if (seenKeys[key]) {
             warn(
-              ("Duplicate keys detected: '" + key + "'. This may cause an update error."),
+              "Duplicate keys detected: '" +
+                key +
+                "'. This may cause an update error.",
               vnode.context
             );
           } else {
@@ -6249,14 +6525,16 @@
       }
     }
 
-    function findIdxInOld (node, oldCh, start, end) {
+    function findIdxInOld(node, oldCh, start, end) {
       for (var i = start; i < end; i++) {
         var c = oldCh[i];
-        if (isDef(c) && sameVnode(node, c)) { return i }
+        if (isDef(c) && sameVnode(node, c)) {
+          return i;
+        }
       }
     }
 
-    function patchVnode (
+    function patchVnode(
       oldVnode,
       vnode,
       insertedVnodeQueue,
@@ -6265,7 +6543,7 @@
       removeOnly
     ) {
       if (oldVnode === vnode) {
-        return
+        return;
       }
 
       if (isDef(vnode.elm) && isDef(ownerArray)) {
@@ -6273,7 +6551,7 @@
         vnode = ownerArray[index] = cloneVNode(vnode);
       }
 
-      var elm = vnode.elm = oldVnode.elm;
+      var elm = (vnode.elm = oldVnode.elm);
 
       if (isTrue(oldVnode.isAsyncPlaceholder)) {
         if (isDef(vnode.asyncFactory.resolved)) {
@@ -6281,57 +6559,68 @@
         } else {
           vnode.isAsyncPlaceholder = true;
         }
-        return
+        return;
       }
 
       // reuse element for static trees.
       // note we only do this if the vnode is cloned -
       // if the new node is not cloned it means the render functions have been
       // reset by the hot-reload-api and we need to do a proper re-render.
-      if (isTrue(vnode.isStatic) &&
+      if (
+        isTrue(vnode.isStatic) &&
         isTrue(oldVnode.isStatic) &&
         vnode.key === oldVnode.key &&
         (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
       ) {
         vnode.componentInstance = oldVnode.componentInstance;
-        return
+        return;
       }
 
       var i;
       var data = vnode.data;
-      if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
+      if (isDef(data) && isDef((i = data.hook)) && isDef((i = i.prepatch))) {
         i(oldVnode, vnode);
       }
 
       var oldCh = oldVnode.children;
       var ch = vnode.children;
       if (isDef(data) && isPatchable(vnode)) {
-        for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
-        if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
+        for (i = 0; i < cbs.update.length; ++i) {
+          cbs.update[i](oldVnode, vnode);
+        }
+        if (isDef((i = data.hook)) && isDef((i = i.update))) {
+          i(oldVnode, vnode);
+        }
       }
       if (isUndef(vnode.text)) {
         if (isDef(oldCh) && isDef(ch)) {
-          if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
+          if (oldCh !== ch) {
+            updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly);
+          }
         } else if (isDef(ch)) {
           {
             checkDuplicateKeys(ch);
           }
-          if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
+          if (isDef(oldVnode.text)) {
+            nodeOps.setTextContent(elm, "");
+          }
           addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
         } else if (isDef(oldCh)) {
           removeVnodes(oldCh, 0, oldCh.length - 1);
         } else if (isDef(oldVnode.text)) {
-          nodeOps.setTextContent(elm, '');
+          nodeOps.setTextContent(elm, "");
         }
       } else if (oldVnode.text !== vnode.text) {
         nodeOps.setTextContent(elm, vnode.text);
       }
       if (isDef(data)) {
-        if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
+        if (isDef((i = data.hook)) && isDef((i = i.postpatch))) {
+          i(oldVnode, vnode);
+        }
       }
     }
 
-    function invokeInsertHook (vnode, queue, initial) {
+    function invokeInsertHook(vnode, queue, initial) {
       // delay insert hooks for component root nodes, invoke them after the
       // element is really inserted
       if (isTrue(initial) && isDef(vnode.parent)) {
@@ -6348,10 +6637,10 @@
     // are already rendered on the client or has no need for initialization
     // Note: style is excluded because it relies on initial clone for future
     // deep updates (#7063).
-    var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');
+    var isRenderedModule = makeMap("attrs,class,staticClass,staticStyle,key");
 
     // Note: this is a browser-only function so we can assume elms are DOM nodes.
-    function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {
+    function hydrate(elm, vnode, insertedVnodeQueue, inVPre) {
       var i;
       var tag = vnode.tag;
       var data = vnode.data;
@@ -6361,20 +6650,22 @@
 
       if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
         vnode.isAsyncPlaceholder = true;
-        return true
+        return true;
       }
       // assert node match
       {
         if (!assertNodeMatch(elm, vnode, inVPre)) {
-          return false
+          return false;
         }
       }
       if (isDef(data)) {
-        if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
-        if (isDef(i = vnode.componentInstance)) {
+        if (isDef((i = data.hook)) && isDef((i = i.init))) {
+          i(vnode, true /* hydrating */);
+        }
+        if (isDef((i = vnode.componentInstance))) {
           // child component. it should have hydrated its own tree.
           initComponent(vnode, insertedVnodeQueue);
-          return true
+          return true;
         }
       }
       if (isDef(tag)) {
@@ -6384,27 +6675,32 @@
             createChildren(vnode, children, insertedVnodeQueue);
           } else {
             // v-html and domProps: innerHTML
-            if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {
+            if (
+              isDef((i = data)) &&
+              isDef((i = i.domProps)) &&
+              isDef((i = i.innerHTML))
+            ) {
               if (i !== elm.innerHTML) {
                 /* istanbul ignore if */
-                if (typeof console !== 'undefined' &&
-                  !hydrationBailed
-                ) {
+                if (typeof console !== "undefined" && !hydrationBailed) {
                   hydrationBailed = true;
-                  console.warn('Parent: ', elm);
-                  console.warn('server innerHTML: ', i);
-                  console.warn('client innerHTML: ', elm.innerHTML);
+                  console.warn("Parent: ", elm);
+                  console.warn("server innerHTML: ", i);
+                  console.warn("client innerHTML: ", elm.innerHTML);
                 }
-                return false
+                return false;
               }
             } else {
               // iterate and compare children lists
               var childrenMatch = true;
               var childNode = elm.firstChild;
               for (var i$1 = 0; i$1 < children.length; i$1++) {
-                if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {
+                if (
+                  !childNode ||
+                  !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)
+                ) {
                   childrenMatch = false;
-                  break
+                  break;
                 }
                 childNode = childNode.nextSibling;
               }
@@ -6412,14 +6708,16 @@
               // longer than the virtual children list.
               if (!childrenMatch || childNode) {
                 /* istanbul ignore if */
-                if (typeof console !== 'undefined' &&
-                  !hydrationBailed
-                ) {
+                if (typeof console !== "undefined" && !hydrationBailed) {
                   hydrationBailed = true;
-                  console.warn('Parent: ', elm);
-                  console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
+                  console.warn("Parent: ", elm);
+                  console.warn(
+                    "Mismatching childNodes vs. VNodes: ",
+                    elm.childNodes,
+                    children
+                  );
                 }
-                return false
+                return false;
               }
             }
           }
@@ -6430,35 +6728,39 @@
             if (!isRenderedModule(key)) {
               fullInvoke = true;
               invokeCreateHooks(vnode, insertedVnodeQueue);
-              break
+              break;
             }
           }
-          if (!fullInvoke && data['class']) {
+          if (!fullInvoke && data["class"]) {
             // ensure collecting deps for deep class bindings for future updates
-            traverse(data['class']);
+            traverse(data["class"]);
           }
         }
       } else if (elm.data !== vnode.text) {
         elm.data = vnode.text;
       }
-      return true
+      return true;
     }
 
-    function assertNodeMatch (node, vnode, inVPre) {
+    function assertNodeMatch(node, vnode, inVPre) {
       if (isDef(vnode.tag)) {
-        return vnode.tag.indexOf('vue-component') === 0 || (
-          !isUnknownElement$$1(vnode, inVPre) &&
-          vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
-        )
+        return (
+          vnode.tag.indexOf("vue-component") === 0 ||
+          (!isUnknownElement$$1(vnode, inVPre) &&
+            vnode.tag.toLowerCase() ===
+              (node.tagName && node.tagName.toLowerCase()))
+        );
       } else {
-        return node.nodeType === (vnode.isComment ? 8 : 3)
+        return node.nodeType === (vnode.isComment ? 8 : 3);
       }
     }
 
-    return function patch (oldVnode, vnode, hydrating, removeOnly) {
+    return function patch(oldVnode, vnode, hydrating, removeOnly) {
       if (isUndef(vnode)) {
-        if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
-        return
+        if (isDef(oldVnode)) {
+          invokeDestroyHook(oldVnode);
+        }
+        return;
       }
 
       var isInitialPatch = false;
@@ -6472,7 +6774,14 @@
         var isRealElement = isDef(oldVnode.nodeType);
         if (!isRealElement && sameVnode(oldVnode, vnode)) {
           // patch existing root node
-          patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);
+          patchVnode(
+            oldVnode,
+            vnode,
+            insertedVnodeQueue,
+            null,
+            null,
+            removeOnly
+          );
         } else {
           if (isRealElement) {
             // mounting to a real element
@@ -6485,14 +6794,14 @@
             if (isTrue(hydrating)) {
               if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
                 invokeInsertHook(vnode, insertedVnodeQueue, true);
-                return oldVnode
+                return oldVnode;
               } else {
                 warn(
-                  'The client-side rendered virtual DOM tree is not matching ' +
-                  'server-rendered content. This is likely caused by incorrect ' +
-                  'HTML markup, for example nesting block-level elements inside ' +
-                  '<p>, or missing <tbody>. Bailing hydration and performing ' +
-                  'full client-side render.'
+                  "The client-side rendered virtual DOM tree is not matching " +
+                    "server-rendered content. This is likely caused by incorrect " +
+                    "HTML markup, for example nesting block-level elements inside " +
+                    "<p>, or missing <tbody>. Bailing hydration and performing " +
+                    "full client-side render."
                 );
               }
             }
@@ -6556,8 +6865,8 @@
       }
 
       invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
-      return vnode.elm
-    }
+      return vnode.elm;
+    };
   }
 
   /*  */
@@ -6565,21 +6874,24 @@
   var directives = {
     create: updateDirectives,
     update: updateDirectives,
-    destroy: function unbindDirectives (vnode) {
+    destroy: function unbindDirectives(vnode) {
       updateDirectives(vnode, emptyNode);
-    }
+    },
   };
 
-  function updateDirectives (oldVnode, vnode) {
+  function updateDirectives(oldVnode, vnode) {
     if (oldVnode.data.directives || vnode.data.directives) {
       _update(oldVnode, vnode);
     }
   }
 
-  function _update (oldVnode, vnode) {
+  function _update(oldVnode, vnode) {
     var isCreate = oldVnode === emptyNode;
     var isDestroy = vnode === emptyNode;
-    var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
+    var oldDirs = normalizeDirectives$1(
+      oldVnode.data.directives,
+      oldVnode.context
+    );
     var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
 
     var dirsWithInsert = [];
@@ -6591,7 +6903,7 @@
       dir = newDirs[key];
       if (!oldDir) {
         // new directive, bind
-        callHook$1(dir, 'bind', vnode, oldVnode);
+        callHook$1(dir, "bind", vnode, oldVnode);
         if (dir.def && dir.def.inserted) {
           dirsWithInsert.push(dir);
         }
@@ -6599,7 +6911,7 @@
         // existing directive, update
         dir.oldValue = oldDir.value;
         dir.oldArg = oldDir.arg;
-        callHook$1(dir, 'update', vnode, oldVnode);
+        callHook$1(dir, "update", vnode, oldVnode);
         if (dir.def && dir.def.componentUpdated) {
           dirsWithPostpatch.push(dir);
         }
@@ -6609,20 +6921,20 @@
     if (dirsWithInsert.length) {
       var callInsert = function () {
         for (var i = 0; i < dirsWithInsert.length; i++) {
-          callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
+          callHook$1(dirsWithInsert[i], "inserted", vnode, oldVnode);
         }
       };
       if (isCreate) {
-        mergeVNodeHook(vnode, 'insert', callInsert);
+        mergeVNodeHook(vnode, "insert", callInsert);
       } else {
         callInsert();
       }
     }
 
     if (dirsWithPostpatch.length) {
-      mergeVNodeHook(vnode, 'postpatch', function () {
+      mergeVNodeHook(vnode, "postpatch", function () {
         for (var i = 0; i < dirsWithPostpatch.length; i++) {
-          callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
+          callHook$1(dirsWithPostpatch[i], "componentUpdated", vnode, oldVnode);
         }
       });
     }
@@ -6631,7 +6943,7 @@
       for (key in oldDirs) {
         if (!newDirs[key]) {
           // no longer present, unbind
-          callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
+          callHook$1(oldDirs[key], "unbind", oldVnode, oldVnode, isDestroy);
         }
       }
     }
@@ -6639,14 +6951,11 @@
 
   var emptyModifiers = Object.create(null);
 
-  function normalizeDirectives$1 (
-    dirs,
-    vm
-  ) {
+  function normalizeDirectives$1(dirs, vm) {
     var res = Object.create(null);
     if (!dirs) {
       // $flow-disable-line
-      return res
+      return res;
     }
     var i, dir;
     for (i = 0; i < dirs.length; i++) {
@@ -6656,41 +6965,44 @@
         dir.modifiers = emptyModifiers;
       }
       res[getRawDirName(dir)] = dir;
-      dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
+      dir.def = resolveAsset(vm.$options, "directives", dir.name, true);
     }
     // $flow-disable-line
-    return res
+    return res;
   }
 
-  function getRawDirName (dir) {
-    return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
+  function getRawDirName(dir) {
+    return (
+      dir.rawName || dir.name + "." + Object.keys(dir.modifiers || {}).join(".")
+    );
   }
 
-  function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
+  function callHook$1(dir, hook, vnode, oldVnode, isDestroy) {
     var fn = dir.def && dir.def[hook];
     if (fn) {
       try {
         fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
       } catch (e) {
-        handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
+        handleError(
+          e,
+          vnode.context,
+          "directive " + dir.name + " " + hook + " hook"
+        );
       }
     }
   }
 
-  var baseModules = [
-    ref,
-    directives
-  ];
+  var baseModules = [ref, directives];
 
   /*  */
 
-  function updateAttrs (oldVnode, vnode) {
+  function updateAttrs(oldVnode, vnode) {
     var opts = vnode.componentOptions;
     if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {
-      return
+      return;
     }
     if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {
-      return
+      return;
     }
     var key, cur, old;
     var elm = vnode.elm;
@@ -6712,7 +7024,7 @@
     // #6666: IE/Edge forces progress value down to 1 before setting a max
     /* istanbul ignore if */
     if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {
-      setAttr(elm, 'value', attrs.value);
+      setAttr(elm, "value", attrs.value);
     }
     for (key in oldAttrs) {
       if (isUndef(attrs[key])) {
@@ -6725,8 +7037,8 @@
     }
   }
 
-  function setAttr (el, key, value) {
-    if (el.tagName.indexOf('-') > -1) {
+  function setAttr(el, key, value) {
+    if (el.tagName.indexOf("-") > -1) {
       baseSetAttr(el, key, value);
     } else if (isBooleanAttr(key)) {
       // set attribute for blank value
@@ -6736,9 +7048,8 @@
       } else {
         // technically allowfullscreen is a boolean attribute for <iframe>,
         // but Flash expects a value of "true" when used on <embed> tag
-        value = key === 'allowfullscreen' && el.tagName === 'EMBED'
-          ? 'true'
-          : key;
+        value =
+          key === "allowfullscreen" && el.tagName === "EMBED" ? "true" : key;
         el.setAttribute(key, value);
       }
     } else if (isEnumeratedAttr(key)) {
@@ -6754,7 +7065,7 @@
     }
   }
 
-  function baseSetAttr (el, key, value) {
+  function baseSetAttr(el, key, value) {
     if (isFalsyAttrValue(value)) {
       el.removeAttribute(key);
     } else {
@@ -6763,15 +7074,18 @@
       // immediately.
       /* istanbul ignore if */
       if (
-        isIE && !isIE9 &&
-        el.tagName === 'TEXTAREA' &&
-        key === 'placeholder' && value !== '' && !el.__ieph
+        isIE &&
+        !isIE9 &&
+        el.tagName === "TEXTAREA" &&
+        key === "placeholder" &&
+        value !== "" &&
+        !el.__ieph
       ) {
         var blocker = function (e) {
           e.stopImmediatePropagation();
-          el.removeEventListener('input', blocker);
+          el.removeEventListener("input", blocker);
         };
-        el.addEventListener('input', blocker);
+        el.addEventListener("input", blocker);
         // $flow-disable-line
         el.__ieph = true; /* IE placeholder patched */
       }
@@ -6781,25 +7095,22 @@
 
   var attrs = {
     create: updateAttrs,
-    update: updateAttrs
+    update: updateAttrs,
   };
 
   /*  */
 
-  function updateClass (oldVnode, vnode) {
+  function updateClass(oldVnode, vnode) {
     var el = vnode.elm;
     var data = vnode.data;
     var oldData = oldVnode.data;
     if (
       isUndef(data.staticClass) &&
-      isUndef(data.class) && (
-        isUndef(oldData) || (
-          isUndef(oldData.staticClass) &&
-          isUndef(oldData.class)
-        )
-      )
+      isUndef(data.class) &&
+      (isUndef(oldData) ||
+        (isUndef(oldData.staticClass) && isUndef(oldData.class)))
     ) {
-      return
+      return;
     }
 
     var cls = genClassForVnode(vnode);
@@ -6812,21 +7123,21 @@
 
     // set the class
     if (cls !== el._prevClass) {
-      el.setAttribute('class', cls);
+      el.setAttribute("class", cls);
       el._prevClass = cls;
     }
   }
 
   var klass = {
     create: updateClass,
-    update: updateClass
+    update: updateClass,
   };
 
   /*  */
 
   var validDivisionCharRE = /[\w).+\-_$\]]/;
 
-  function parseFilters (exp) {
+  function parseFilters(exp) {
     var inSingle = false;
     var inDouble = false;
     var inTemplateString = false;
@@ -6841,18 +7152,28 @@
       prev = c;
       c = exp.charCodeAt(i);
       if (inSingle) {
-        if (c === 0x27 && prev !== 0x5C) { inSingle = false; }
+        if (c === 0x27 && prev !== 0x5c) {
+          inSingle = false;
+        }
       } else if (inDouble) {
-        if (c === 0x22 && prev !== 0x5C) { inDouble = false; }
+        if (c === 0x22 && prev !== 0x5c) {
+          inDouble = false;
+        }
       } else if (inTemplateString) {
-        if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }
+        if (c === 0x60 && prev !== 0x5c) {
+          inTemplateString = false;
+        }
       } else if (inRegex) {
-        if (c === 0x2f && prev !== 0x5C) { inRegex = false; }
+        if (c === 0x2f && prev !== 0x5c) {
+          inRegex = false;
+        }
       } else if (
-        c === 0x7C && // pipe
-        exp.charCodeAt(i + 1) !== 0x7C &&
-        exp.charCodeAt(i - 1) !== 0x7C &&
-        !curly && !square && !paren
+        c === 0x7c && // pipe
+        exp.charCodeAt(i + 1) !== 0x7c &&
+        exp.charCodeAt(i - 1) !== 0x7c &&
+        !curly &&
+        !square &&
+        !paren
       ) {
         if (expression === undefined) {
           // first filter, end of expression
@@ -6863,23 +7184,44 @@
         }
       } else {
         switch (c) {
-          case 0x22: inDouble = true; break         // "
-          case 0x27: inSingle = true; break         // '
-          case 0x60: inTemplateString = true; break // `
-          case 0x28: paren++; break                 // (
-          case 0x29: paren--; break                 // )
-          case 0x5B: square++; break                // [
-          case 0x5D: square--; break                // ]
-          case 0x7B: curly++; break                 // {
-          case 0x7D: curly--; break                 // }
-        }
-        if (c === 0x2f) { // /
+          case 0x22:
+            inDouble = true;
+            break; // "
+          case 0x27:
+            inSingle = true;
+            break; // '
+          case 0x60:
+            inTemplateString = true;
+            break; // `
+          case 0x28:
+            paren++;
+            break; // (
+          case 0x29:
+            paren--;
+            break; // )
+          case 0x5b:
+            square++;
+            break; // [
+          case 0x5d:
+            square--;
+            break; // ]
+          case 0x7b:
+            curly++;
+            break; // {
+          case 0x7d:
+            curly--;
+            break; // }
+        }
+        if (c === 0x2f) {
+          // /
           var j = i - 1;
-          var p = (void 0);
+          var p = void 0;
           // find first non-whitespace prev char
           for (; j >= 0; j--) {
             p = exp.charAt(j);
-            if (p !== ' ') { break }
+            if (p !== " ") {
+              break;
+            }
           }
           if (!p || !validDivisionCharRE.test(p)) {
             inRegex = true;
@@ -6894,7 +7236,7 @@
       pushFilter();
     }
 
-    function pushFilter () {
+    function pushFilter() {
       (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());
       lastFilterIndex = i + 1;
     }
@@ -6905,60 +7247,65 @@
       }
     }
 
-    return expression
+    return expression;
   }
 
-  function wrapFilter (exp, filter) {
-    var i = filter.indexOf('(');
+  function wrapFilter(exp, filter) {
+    var i = filter.indexOf("(");
     if (i < 0) {
       // _f: resolveFilter
-      return ("_f(\"" + filter + "\")(" + exp + ")")
+      return '_f("' + filter + '")(' + exp + ")";
     } else {
       var name = filter.slice(0, i);
       var args = filter.slice(i + 1);
-      return ("_f(\"" + name + "\")(" + exp + (args !== ')' ? ',' + args : args))
+      return '_f("' + name + '")(' + exp + (args !== ")" ? "," + args : args);
     }
   }
 
   /*  */
 
-
-
   /* eslint-disable no-unused-vars */
-  function baseWarn (msg, range) {
-    console.error(("[Vue compiler]: " + msg));
+  function baseWarn(msg, range) {
+    console.error("[Vue compiler]: " + msg);
   }
   /* eslint-enable no-unused-vars */
 
-  function pluckModuleFunction (
-    modules,
-    key
-  ) {
+  function pluckModuleFunction(modules, key) {
     return modules
-      ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })
-      : []
+      ? modules
+          .map(function (m) {
+            return m[key];
+          })
+          .filter(function (_) {
+            return _;
+          })
+      : [];
   }
 
-  function addProp (el, name, value, range, dynamic) {
-    (el.props || (el.props = [])).push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));
+  function addProp(el, name, value, range, dynamic) {
+    (el.props || (el.props = [])).push(
+      rangeSetItem({ name: name, value: value, dynamic: dynamic }, range)
+    );
     el.plain = false;
   }
 
-  function addAttr (el, name, value, range, dynamic) {
+  function addAttr(el, name, value, range, dynamic) {
     var attrs = dynamic
-      ? (el.dynamicAttrs || (el.dynamicAttrs = []))
-      : (el.attrs || (el.attrs = []));
-    attrs.push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));
+      ? el.dynamicAttrs || (el.dynamicAttrs = [])
+      : el.attrs || (el.attrs = []);
+    attrs.push(
+      rangeSetItem({ name: name, value: value, dynamic: dynamic }, range)
+    );
     el.plain = false;
   }
 
   // add a raw attr (use this in preTransforms)
-  function addRawAttr (el, name, value, range) {
+  function addRawAttr(el, name, value, range) {
     el.attrsMap[name] = value;
     el.attrsList.push(rangeSetItem({ name: name, value: value }, range));
   }
 
-  function addDirective (
+  function addDirective(
     el,
     name,
     rawName,
@@ -6968,24 +7315,27 @@
     modifiers,
     range
   ) {
-    (el.directives || (el.directives = [])).push(rangeSetItem({
-      name: name,
-      rawName: rawName,
-      value: value,
-      arg: arg,
-      isDynamicArg: isDynamicArg,
-      modifiers: modifiers
-    }, range));
+    (el.directives || (el.directives = [])).push(
+      rangeSetItem(
+        {
+          name: name,
+          rawName: rawName,
+          value: value,
+          arg: arg,
+          isDynamicArg: isDynamicArg,
+          modifiers: modifiers,
+        },
+        range
+      )
+    );
     el.plain = false;
   }
 
-  function prependModifierMarker (symbol, name, dynamic) {
-    return dynamic
-      ? ("_p(" + name + ",\"" + symbol + "\")")
-      : symbol + name // mark the event as captured
+  function prependModifierMarker(symbol, name, dynamic) {
+    return dynamic ? "_p(" + name + ',"' + symbol + '")' : symbol + name; // mark the event as captured
   }
 
-  function addHandler (
+  function addHandler(
     el,
     name,
     value,
@@ -6998,13 +7348,10 @@
     modifiers = modifiers || emptyObject;
     // warn prevent and passive modifier
     /* istanbul ignore if */
-    if (
-      warn &&
-      modifiers.prevent && modifiers.passive
-    ) {
+    if (warn && modifiers.prevent && modifiers.passive) {
       warn(
-        'passive and prevent can\'t be used together. ' +
-        'Passive handler can\'t prevent default event.',
+        "passive and prevent can't be used together. " +
+          "Passive handler can't prevent default event.",
         range
       );
     }
@@ -7015,31 +7362,31 @@
     if (modifiers.right) {
       if (dynamic) {
         name = "(" + name + ")==='click'?'contextmenu':(" + name + ")";
-      } else if (name === 'click') {
-        name = 'contextmenu';
+      } else if (name === "click") {
+        name = "contextmenu";
         delete modifiers.right;
       }
     } else if (modifiers.middle) {
       if (dynamic) {
         name = "(" + name + ")==='click'?'mouseup':(" + name + ")";
-      } else if (name === 'click') {
-        name = 'mouseup';
+      } else if (name === "click") {
+        name = "mouseup";
       }
     }
 
     // check capture modifier
     if (modifiers.capture) {
       delete modifiers.capture;
-      name = prependModifierMarker('!', name, dynamic);
+      name = prependModifierMarker("!", name, dynamic);
     }
     if (modifiers.once) {
       delete modifiers.once;
-      name = prependModifierMarker('~', name, dynamic);
+      name = prependModifierMarker("~", name, dynamic);
     }
     /* istanbul ignore if */
     if (modifiers.passive) {
       delete modifiers.passive;
-      name = prependModifierMarker('&', name, dynamic);
+      name = prependModifierMarker("&", name, dynamic);
     }
 
     var events;
@@ -7050,7 +7397,10 @@
       events = el.events || (el.events = {});
     }
 
-    var newHandler = rangeSetItem({ value: value.trim(), dynamic: dynamic }, range);
+    var newHandler = rangeSetItem(
+      { value: value.trim(), dynamic: dynamic },
+      range
+    );
     if (modifiers !== emptyObject) {
       newHandler.modifiers = modifiers;
     }
@@ -7060,7 +7410,9 @@
     if (Array.isArray(handlers)) {
       important ? handlers.unshift(newHandler) : handlers.push(newHandler);
     } else if (handlers) {
-      events[name] = important ? [newHandler, handlers] : [handlers, newHandler];
+      events[name] = important
+        ? [newHandler, handlers]
+        : [handlers, newHandler];
     } else {
       events[name] = newHandler;
     }
@@ -7068,29 +7420,24 @@
     el.plain = false;
   }
 
-  function getRawBindingAttr (
-    el,
-    name
-  ) {
-    return el.rawAttrsMap[':' + name] ||
-      el.rawAttrsMap['v-bind:' + name] ||
+  function getRawBindingAttr(el, name) {
+    return (
+      el.rawAttrsMap[":" + name] ||
+      el.rawAttrsMap["v-bind:" + name] ||
       el.rawAttrsMap[name]
+    );
   }
 
-  function getBindingAttr (
-    el,
-    name,
-    getStatic
-  ) {
+  function getBindingAttr(el, name, getStatic) {
     var dynamicValue =
-      getAndRemoveAttr(el, ':' + name) ||
-      getAndRemoveAttr(el, 'v-bind:' + name);
+      getAndRemoveAttr(el, ":" + name) ||
+      getAndRemoveAttr(el, "v-bind:" + name);
     if (dynamicValue != null) {
-      return parseFilters(dynamicValue)
+      return parseFilters(dynamicValue);
     } else if (getStatic !== false) {
       var staticValue = getAndRemoveAttr(el, name);
       if (staticValue != null) {
-        return JSON.stringify(staticValue)
+        return JSON.stringify(staticValue);
       }
     }
   }
@@ -7099,45 +7446,35 @@
   // doesn't get processed by processAttrs.
   // By default it does NOT remove it from the map (attrsMap) because the map is
   // needed during codegen.
-  function getAndRemoveAttr (
-    el,
-    name,
-    removeFromMap
-  ) {
+  function getAndRemoveAttr(el, name, removeFromMap) {
     var val;
     if ((val = el.attrsMap[name]) != null) {
       var list = el.attrsList;
       for (var i = 0, l = list.length; i < l; i++) {
         if (list[i].name === name) {
           list.splice(i, 1);
-          break
+          break;
         }
       }
     }
     if (removeFromMap) {
       delete el.attrsMap[name];
     }
-    return val
+    return val;
   }
 
-  function getAndRemoveAttrByRegex (
-    el,
-    name
-  ) {
+  function getAndRemoveAttrByRegex(el, name) {
     var list = el.attrsList;
     for (var i = 0, l = list.length; i < l; i++) {
       var attr = list[i];
       if (name.test(attr.name)) {
         list.splice(i, 1);
-        return attr
+        return attr;
       }
     }
   }
 
-  function rangeSetItem (
-    item,
-    range
-  ) {
+  function rangeSetItem(item, range) {
     if (range) {
       if (range.start != null) {
         item.start = range.start;
@@ -7146,7 +7483,7 @@
         item.end = range.end;
       }
     }
-    return item
+    return item;
   }
 
   /*  */
@@ -7154,22 +7491,24 @@
   /**
    * Cross-platform code generation for component v-model
    */
-  function genComponentModel (
-    el,
-    value,
-    modifiers
-  ) {
+  function genComponentModel(el, value, modifiers) {
     var ref = modifiers || {};
     var number = ref.number;
     var trim = ref.trim;
 
-    var baseValueExpression = '$$v';
+    var baseValueExpression = "$$v";
     var valueExpression = baseValueExpression;
     if (trim) {
       valueExpression =
-        "(typeof " + baseValueExpression + " === 'string'" +
-        "? " + baseValueExpression + ".trim()" +
-        ": " + baseValueExpression + ")";
+        "(typeof " +
+        baseValueExpression +
+        " === 'string'" +
+        "? " +
+        baseValueExpression +
+        ".trim()" +
+        ": " +
+        baseValueExpression +
+        ")";
     }
     if (number) {
       valueExpression = "_n(" + valueExpression + ")";
@@ -7177,24 +7516,21 @@
     var assignment = genAssignmentCode(value, valueExpression);
 
     el.model = {
-      value: ("(" + value + ")"),
+      value: "(" + value + ")",
       expression: JSON.stringify(value),
-      callback: ("function (" + baseValueExpression + ") {" + assignment + "}")
+      callback: "function (" + baseValueExpression + ") {" + assignment + "}",
     };
   }
 
   /**
    * Cross-platform codegen helper for generating v-model value assignment code.
    */
-  function genAssignmentCode (
-    value,
-    assignment
-  ) {
+  function genAssignmentCode(value, assignment) {
     var res = parseModel(value);
     if (res.key === null) {
-      return (value + "=" + assignment)
+      return value + "=" + assignment;
     } else {
-      return ("$set(" + (res.exp) + ", " + (res.key) + ", " + assignment + ")")
+      return "$set(" + res.exp + ", " + res.key + ", " + assignment + ")";
     }
   }
 
@@ -7215,26 +7551,24 @@
 
   var len, str, chr, index$1, expressionPos, expressionEndPos;
 
-
-
-  function parseModel (val) {
+  function parseModel(val) {
     // Fix https://github.com/vuejs/vue/pull/7730
     // allow v-model="obj.val " (trailing whitespace)
     val = val.trim();
     len = val.length;
 
-    if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
-      index$1 = val.lastIndexOf('.');
+    if (val.indexOf("[") < 0 || val.lastIndexOf("]") < len - 1) {
+      index$1 = val.lastIndexOf(".");
       if (index$1 > -1) {
         return {
           exp: val.slice(0, index$1),
-          key: '"' + val.slice(index$1 + 1) + '"'
-        }
+          key: '"' + val.slice(index$1 + 1) + '"',
+        };
       } else {
         return {
           exp: val,
-          key: null
-        }
+          key: null,
+        };
       }
     }
 
@@ -7246,53 +7580,57 @@
       /* istanbul ignore if */
       if (isStringStart(chr)) {
         parseString(chr);
-      } else if (chr === 0x5B) {
+      } else if (chr === 0x5b) {
         parseBracket(chr);
       }
     }
 
     return {
       exp: val.slice(0, expressionPos),
-      key: val.slice(expressionPos + 1, expressionEndPos)
-    }
+      key: val.slice(expressionPos + 1, expressionEndPos),
+    };
   }
 
-  function next () {
-    return str.charCodeAt(++index$1)
+  function next() {
+    return str.charCodeAt(++index$1);
   }
 
-  function eof () {
-    return index$1 >= len
+  function eof() {
+    return index$1 >= len;
   }
 
-  function isStringStart (chr) {
-    return chr === 0x22 || chr === 0x27
+  function isStringStart(chr) {
+    return chr === 0x22 || chr === 0x27;
   }
 
-  function parseBracket (chr) {
+  function parseBracket(chr) {
     var inBracket = 1;
     expressionPos = index$1;
     while (!eof()) {
       chr = next();
       if (isStringStart(chr)) {
         parseString(chr);
-        continue
+        continue;
+      }
+      if (chr === 0x5b) {
+        inBracket++;
+      }
+      if (chr === 0x5d) {
+        inBracket--;
       }
-      if (chr === 0x5B) { inBracket++; }
-      if (chr === 0x5D) { inBracket--; }
       if (inBracket === 0) {
         expressionEndPos = index$1;
-        break
+        break;
       }
     }
   }
 
-  function parseString (chr) {
+  function parseString(chr) {
     var stringQuote = chr;
     while (!eof()) {
       chr = next();
       if (chr === stringQuote) {
-        break
+        break;
       }
     }
   }
@@ -7303,14 +7641,10 @@
 
   // in some cases, the event used has to be determined at runtime
   // so we used some reserved tokens during compile.
-  var RANGE_TOKEN = '__r';
-  var CHECKBOX_RADIO_TOKEN = '__c';
+  var RANGE_TOKEN = "__r";
+  var CHECKBOX_RADIO_TOKEN = "__c";
 
-  function model (
-    el,
-    dir,
-    _warn
-  ) {
+  function model(el, dir, _warn) {
     warn$1 = _warn;
     var value = dir.value;
     var modifiers = dir.modifiers;
@@ -7320,11 +7654,15 @@
     {
       // inputs with type="file" are read only and setting the input's
       // value will throw an error.
-      if (tag === 'input' && type === 'file') {
+      if (tag === "input" && type === "file") {
         warn$1(
-          "<" + (el.tag) + " v-model=\"" + value + "\" type=\"file\">:\n" +
-          "File inputs are read only. Use a v-on:change listener instead.",
-          el.rawAttrsMap['v-model']
+          "<" +
+            el.tag +
+            ' v-model="' +
+            value +
+            '" type="file">:\n' +
+            "File inputs are read only. Use a v-on:change listener instead.",
+          el.rawAttrsMap["v-model"]
         );
       }
     }
@@ -7332,110 +7670,135 @@
     if (el.component) {
       genComponentModel(el, value, modifiers);
       // component v-model doesn't need extra runtime
-      return false
-    } else if (tag === 'select') {
+      return false;
+    } else if (tag === "select") {
       genSelect(el, value, modifiers);
-    } else if (tag === 'input' && type === 'checkbox') {
+    } else if (tag === "input" && type === "checkbox") {
       genCheckboxModel(el, value, modifiers);
-    } else if (tag === 'input' && type === 'radio') {
+    } else if (tag === "input" && type === "radio") {
       genRadioModel(el, value, modifiers);
-    } else if (tag === 'input' || tag === 'textarea') {
+    } else if (tag === "input" || tag === "textarea") {
       genDefaultModel(el, value, modifiers);
     } else if (!config.isReservedTag(tag)) {
       genComponentModel(el, value, modifiers);
       // component v-model doesn't need extra runtime
-      return false
+      return false;
     } else {
       warn$1(
-        "<" + (el.tag) + " v-model=\"" + value + "\">: " +
-        "v-model is not supported on this element type. " +
-        'If you are working with contenteditable, it\'s recommended to ' +
-        'wrap a library dedicated for that purpose inside a custom component.',
-        el.rawAttrsMap['v-model']
+        "<" +
+          el.tag +
+          ' v-model="' +
+          value +
+          '">: ' +
+          "v-model is not supported on this element type. " +
+          "If you are working with contenteditable, it's recommended to " +
+          "wrap a library dedicated for that purpose inside a custom component.",
+        el.rawAttrsMap["v-model"]
       );
     }
 
     // ensure runtime directive metadata
-    return true
+    return true;
   }
 
-  function genCheckboxModel (
-    el,
-    value,
-    modifiers
-  ) {
+  function genCheckboxModel(el, value, modifiers) {
     var number = modifiers && modifiers.number;
-    var valueBinding = getBindingAttr(el, 'value') || 'null';
-    var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';
-    var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';
-    addProp(el, 'checked',
-      "Array.isArray(" + value + ")" +
-      "?_i(" + value + "," + valueBinding + ")>-1" + (
-        trueValueBinding === 'true'
-          ? (":(" + value + ")")
-          : (":_q(" + value + "," + trueValueBinding + ")")
-      )
+    var valueBinding = getBindingAttr(el, "value") || "null";
+    var trueValueBinding = getBindingAttr(el, "true-value") || "true";
+    var falseValueBinding = getBindingAttr(el, "false-value") || "false";
+    addProp(
+      el,
+      "checked",
+      "Array.isArray(" +
+        value +
+        ")" +
+        "?_i(" +
+        value +
+        "," +
+        valueBinding +
+        ")>-1" +
+        (trueValueBinding === "true"
+          ? ":(" + value + ")"
+          : ":_q(" + value + "," + trueValueBinding + ")")
     );
-    addHandler(el, 'change',
-      "var $$a=" + value + "," +
-          '$$el=$event.target,' +
-          "$$c=$$el.checked?(" + trueValueBinding + "):(" + falseValueBinding + ");" +
-      'if(Array.isArray($$a)){' +
-        "var $$v=" + (number ? '_n(' + valueBinding + ')' : valueBinding) + "," +
-            '$$i=_i($$a,$$v);' +
-        "if($$el.checked){$$i<0&&(" + (genAssignmentCode(value, '$$a.concat([$$v])')) + ")}" +
-        "else{$$i>-1&&(" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + ")}" +
-      "}else{" + (genAssignmentCode(value, '$$c')) + "}",
-      null, true
+    addHandler(
+      el,
+      "change",
+      "var $$a=" +
+        value +
+        "," +
+        "$$el=$event.target," +
+        "$$c=$$el.checked?(" +
+        trueValueBinding +
+        "):(" +
+        falseValueBinding +
+        ");" +
+        "if(Array.isArray($$a)){" +
+        "var $$v=" +
+        (number ? "_n(" + valueBinding + ")" : valueBinding) +
+        "," +
+        "$$i=_i($$a,$$v);" +
+        "if($$el.checked){$$i<0&&(" +
+        genAssignmentCode(value, "$$a.concat([$$v])") +
+        ")}" +
+        "else{$$i>-1&&(" +
+        genAssignmentCode(value, "$$a.slice(0,$$i).concat($$a.slice($$i+1))") +
+        ")}" +
+        "}else{" +
+        genAssignmentCode(value, "$$c") +
+        "}",
+      null,
+      true
     );
   }
 
-  function genRadioModel (
-    el,
-    value,
-    modifiers
-  ) {
+  function genRadioModel(el, value, modifiers) {
     var number = modifiers && modifiers.number;
-    var valueBinding = getBindingAttr(el, 'value') || 'null';
-    valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding;
-    addProp(el, 'checked', ("_q(" + value + "," + valueBinding + ")"));
-    addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);
+    var valueBinding = getBindingAttr(el, "value") || "null";
+    valueBinding = number ? "_n(" + valueBinding + ")" : valueBinding;
+    addProp(el, "checked", "_q(" + value + "," + valueBinding + ")");
+    addHandler(
+      el,
+      "change",
+      genAssignmentCode(value, valueBinding),
+      null,
+      true
+    );
   }
 
-  function genSelect (
-    el,
-    value,
-    modifiers
-  ) {
+  function genSelect(el, value, modifiers) {
     var number = modifiers && modifiers.number;
-    var selectedVal = "Array.prototype.filter" +
+    var selectedVal =
+      "Array.prototype.filter" +
       ".call($event.target.options,function(o){return o.selected})" +
-      ".map(function(o){var val = \"_value\" in o ? o._value : o.value;" +
-      "return " + (number ? '_n(val)' : 'val') + "})";
+      '.map(function(o){var val = "_value" in o ? o._value : o.value;' +
+      "return " +
+      (number ? "_n(val)" : "val") +
+      "})";
 
-    var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';
+    var assignment =
+      "$event.target.multiple ? $$selectedVal : $$selectedVal[0]";
     var code = "var $$selectedVal = " + selectedVal + ";";
-    code = code + " " + (genAssignmentCode(value, assignment));
-    addHandler(el, 'change', code, null, true);
+    code = code + " " + genAssignmentCode(value, assignment);
+    addHandler(el, "change", code, null, true);
   }
 
-  function genDefaultModel (
-    el,
-    value,
-    modifiers
-  ) {
+  function genDefaultModel(el, value, modifiers) {
     var type = el.attrsMap.type;
 
     // warn if v-bind:value conflicts with v-model
     // except for inputs with v-bind:type
     {
-      var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value'];
-      var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];
+      var value$1 = el.attrsMap["v-bind:value"] || el.attrsMap[":value"];
+      var typeBinding = el.attrsMap["v-bind:type"] || el.attrsMap[":type"];
       if (value$1 && !typeBinding) {
-        var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value';
+        var binding = el.attrsMap["v-bind:value"] ? "v-bind:value" : ":value";
         warn$1(
-          binding + "=\"" + value$1 + "\" conflicts with v-model on the same element " +
-          'because the latter already expands to a value binding internally',
+          binding +
+            '="' +
+            value$1 +
+            '" conflicts with v-model on the same element ' +
+            "because the latter already expands to a value binding internally",
           el.rawAttrsMap[binding]
         );
       }
@@ -7445,14 +7808,10 @@
     var lazy = ref.lazy;
     var number = ref.number;
     var trim = ref.trim;
-    var needCompositionGuard = !lazy && type !== 'range';
-    var event = lazy
-      ? 'change'
-      : type === 'range'
-        ? RANGE_TOKEN
-        : 'input';
-
-    var valueExpression = '$event.target.value';
+    var needCompositionGuard = !lazy && type !== "range";
+    var event = lazy ? "change" : type === "range" ? RANGE_TOKEN : "input";
+
+    var valueExpression = "$event.target.value";
     if (trim) {
       valueExpression = "$event.target.value.trim()";
     }
@@ -7465,10 +7824,10 @@
       code = "if($event.target.composing)return;" + code;
     }
 
-    addProp(el, 'value', ("(" + value + ")"));
+    addProp(el, "value", "(" + value + ")");
     addHandler(el, event, code, null, true);
     if (trim || number) {
-      addHandler(el, 'blur', '$forceUpdate()');
+      addHandler(el, "blur", "$forceUpdate()");
     }
   }
 
@@ -7478,11 +7837,11 @@
   // it's important to place the event as the first in the array because
   // the whole point is ensuring the v-model callback gets called before
   // user-attached handlers.
-  function normalizeEvents (on) {
+  function normalizeEvents(on) {
     /* istanbul ignore if */
     if (isDef(on[RANGE_TOKEN])) {
       // IE input[type=range] only supports `change` event
-      var event = isIE ? 'change' : 'input';
+      var event = isIE ? "change" : "input";
       on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);
       delete on[RANGE_TOKEN];
     }
@@ -7497,14 +7856,14 @@
 
   var target$1;
 
-  function createOnceHandler$1 (event, handler, capture) {
+  function createOnceHandler$1(event, handler, capture) {
     var _target = target$1; // save current target element in closure
-    return function onceHandler () {
+    return function onceHandler() {
       var res = handler.apply(null, arguments);
       if (res !== null) {
         remove$2(event, onceHandler, capture, _target);
       }
-    }
+    };
   }
 
   // #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp
@@ -7512,12 +7871,7 @@
   // safe to exclude.
   var useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);
 
-  function add$1 (
-    name,
-    handler,
-    capture,
-    passive
-  ) {
+  function add$1(name, handler, capture, passive) {
     // async edge case #6566: inner click event triggers patch, event handler
     // attached to outer element during patch, and triggered again. This
     // happens because browsers fire microtask ticks between event propagation.
@@ -7544,25 +7898,18 @@
           // starting reference
           e.target.ownerDocument !== document
         ) {
-          return original.apply(this, arguments)
+          return original.apply(this, arguments);
         }
       };
     }
     target$1.addEventListener(
       name,
       handler,
-      supportsPassive
-        ? { capture: capture, passive: passive }
-        : capture
+      supportsPassive ? { capture: capture, passive: passive } : capture
     );
   }
 
-  function remove$2 (
-    name,
-    handler,
-    capture,
-    _target
-  ) {
+  function remove$2(name, handler, capture, _target) {
     (_target || target$1).removeEventListener(
       name,
       handler._wrapper || handler,
@@ -7570,30 +7917,37 @@
     );
   }
 
-  function updateDOMListeners (oldVnode, vnode) {
+  function updateDOMListeners(oldVnode, vnode) {
     if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {
-      return
+      return;
     }
     var on = vnode.data.on || {};
     var oldOn = oldVnode.data.on || {};
     target$1 = vnode.elm;
     normalizeEvents(on);
-    updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);
+    updateListeners(
+      on,
+      oldOn,
+      add$1,
+      remove$2,
+      createOnceHandler$1,
+      vnode.context
+    );
     target$1 = undefined;
   }
 
   var events = {
     create: updateDOMListeners,
-    update: updateDOMListeners
+    update: updateDOMListeners,
   };
 
   /*  */
 
   var svgContainer;
 
-  function updateDOMProps (oldVnode, vnode) {
+  function updateDOMProps(oldVnode, vnode) {
     if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {
-      return
+      return;
     }
     var key, cur;
     var elm = vnode.elm;
@@ -7606,7 +7960,7 @@
 
     for (key in oldProps) {
       if (!(key in props)) {
-        elm[key] = '';
+        elm[key] = "";
       }
     }
 
@@ -7615,9 +7969,13 @@
       // ignore children if the node has textContent or innerHTML,
       // as these will throw away existing DOM nodes and cause removal errors
       // on subsequent patches (#3360)
-      if (key === 'textContent' || key === 'innerHTML') {
-        if (vnode.children) { vnode.children.length = 0; }
-        if (cur === oldProps[key]) { continue }
+      if (key === "textContent" || key === "innerHTML") {
+        if (vnode.children) {
+          vnode.children.length = 0;
+        }
+        if (cur === oldProps[key]) {
+          continue;
+        }
         // #6601 work around Chrome version <= 55 bug where single textNode
         // replaced by innerHTML/textContent retains its parentNode property
         if (elm.childNodes.length === 1) {
@@ -7625,18 +7983,22 @@
         }
       }
 
-      if (key === 'value' && elm.tagName !== 'PROGRESS') {
+      if (key === "value" && elm.tagName !== "PROGRESS") {
         // store value as _value as well since
         // non-string values will be stringified
         elm._value = cur;
         // avoid resetting cursor position when value is the same
-        var strCur = isUndef(cur) ? '' : String(cur);
+        var strCur = isUndef(cur) ? "" : String(cur);
         if (shouldUpdateValue(elm, strCur)) {
           elm.value = strCur;
         }
-      } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {
+      } else if (
+        key === "innerHTML" &&
+        isSVG(elm.tagName) &&
+        isUndef(elm.innerHTML)
+      ) {
         // IE doesn't support innerHTML for SVG elements
-        svgContainer = svgContainer || document.createElement('div');
+        svgContainer = svgContainer || document.createElement("div");
         svgContainer.innerHTML = "<svg>" + cur + "</svg>";
         var svg = svgContainer.firstChild;
         while (elm.firstChild) {
@@ -7663,42 +8025,44 @@
 
   // check platforms/web/util/attrs.js acceptValue
 
+  function shouldUpdateValue(elm, checkVal) {
+    return (
+      !elm.composing &&
+      (elm.tagName === "OPTION" ||
+        isNotInFocusAndDirty(elm, checkVal) ||
+        isDirtyWithModifiers(elm, checkVal))
+    );
+  }
 
-  function shouldUpdateValue (elm, checkVal) {
-    return (!elm.composing && (
-      elm.tagName === 'OPTION' ||
-      isNotInFocusAndDirty(elm, checkVal) ||
-      isDirtyWithModifiers(elm, checkVal)
-    ))
-  }
-
-  function isNotInFocusAndDirty (elm, checkVal) {
+  function isNotInFocusAndDirty(elm, checkVal) {
     // return true when textbox (.number and .trim) loses focus and its value is
     // not equal to the updated value
     var notInFocus = true;
     // #6157
     // work around IE bug when accessing document.activeElement in an iframe
-    try { notInFocus = document.activeElement !== elm; } catch (e) {}
-    return notInFocus && elm.value !== checkVal
+    try {
+      notInFocus = document.activeElement !== elm;
+    } catch (e) {}
+    return notInFocus && elm.value !== checkVal;
   }
 
-  function isDirtyWithModifiers (elm, newVal) {
+  function isDirtyWithModifiers(elm, newVal) {
     var value = elm.value;
     var modifiers = elm._vModifiers; // injected by v-model runtime
     if (isDef(modifiers)) {
       if (modifiers.number) {
-        return toNumber(value) !== toNumber(newVal)
+        return toNumber(value) !== toNumber(newVal);
       }
       if (modifiers.trim) {
-        return value.trim() !== newVal.trim()
+        return value.trim() !== newVal.trim();
       }
     }
-    return value !== newVal
+    return value !== newVal;
   }
 
   var domProps = {
     create: updateDOMProps,
-    update: updateDOMProps
+    update: updateDOMProps,
   };
 
   /*  */
@@ -7713,35 +8077,33 @@
         tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
       }
     });
-    return res
+    return res;
   });
 
   // merge static and dynamic style data on the same vnode
-  function normalizeStyleData (data) {
+  function normalizeStyleData(data) {
     var style = normalizeStyleBinding(data.style);
     // static style is pre-processed into an object during compilation
     // and is always a fresh object, so it's safe to merge into it
-    return data.staticStyle
-      ? extend(data.staticStyle, style)
-      : style
+    return data.staticStyle ? extend(data.staticStyle, style) : style;
   }
 
   // normalize possible array / string values into Object
-  function normalizeStyleBinding (bindingStyle) {
+  function normalizeStyleBinding(bindingStyle) {
     if (Array.isArray(bindingStyle)) {
-      return toObject(bindingStyle)
+      return toObject(bindingStyle);
     }
-    if (typeof bindingStyle === 'string') {
-      return parseStyleText(bindingStyle)
+    if (typeof bindingStyle === "string") {
+      return parseStyleText(bindingStyle);
     }
-    return bindingStyle
+    return bindingStyle;
   }
 
   /**
    * parent component style should be after child's
    * so that parent component's style could override it
    */
-  function getStyle (vnode, checkChild) {
+  function getStyle(vnode, checkChild) {
     var res = {};
     var styleData;
 
@@ -7750,7 +8112,8 @@
       while (childNode.componentInstance) {
         childNode = childNode.componentInstance._vnode;
         if (
-          childNode && childNode.data &&
+          childNode &&
+          childNode.data &&
           (styleData = normalizeStyleData(childNode.data))
         ) {
           extend(res, styleData);
@@ -7764,11 +8127,14 @@
 
     var parentNode = vnode;
     while ((parentNode = parentNode.parent)) {
-      if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
+      if (
+        parentNode.data &&
+        (styleData = normalizeStyleData(parentNode.data))
+      ) {
         extend(res, styleData);
       }
     }
-    return res
+    return res;
   }
 
   /*  */
@@ -7780,7 +8146,11 @@
     if (cssVarRE.test(name)) {
       el.style.setProperty(name, val);
     } else if (importantRE.test(val)) {
-      el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');
+      el.style.setProperty(
+        hyphenate(name),
+        val.replace(importantRE, ""),
+        "important"
+      );
     } else {
       var normalizedName = normalize(name);
       if (Array.isArray(val)) {
@@ -7796,32 +8166,35 @@
     }
   };
 
-  var vendorNames = ['Webkit', 'Moz', 'ms'];
+  var vendorNames = ["Webkit", "Moz", "ms"];
 
   var emptyStyle;
   var normalize = cached(function (prop) {
-    emptyStyle = emptyStyle || document.createElement('div').style;
+    emptyStyle = emptyStyle || document.createElement("div").style;
     prop = camelize(prop);
-    if (prop !== 'filter' && (prop in emptyStyle)) {
-      return prop
+    if (prop !== "filter" && prop in emptyStyle) {
+      return prop;
     }
     var capName = prop.charAt(0).toUpperCase() + prop.slice(1);
     for (var i = 0; i < vendorNames.length; i++) {
       var name = vendorNames[i] + capName;
       if (name in emptyStyle) {
-        return name
+        return name;
       }
     }
   });
 
-  function updateStyle (oldVnode, vnode) {
+  function updateStyle(oldVnode, vnode) {
     var data = vnode.data;
     var oldData = oldVnode.data;
 
-    if (isUndef(data.staticStyle) && isUndef(data.style) &&
-      isUndef(oldData.staticStyle) && isUndef(oldData.style)
+    if (
+      isUndef(data.staticStyle) &&
+      isUndef(data.style) &&
+      isUndef(oldData.staticStyle) &&
+      isUndef(oldData.style)
     ) {
-      return
+      return;
     }
 
     var cur, name;
@@ -7845,21 +8218,21 @@
 
     for (name in oldStyle) {
       if (isUndef(newStyle[name])) {
-        setProp(el, name, '');
+        setProp(el, name, "");
       }
     }
     for (name in newStyle) {
       cur = newStyle[name];
       if (cur !== oldStyle[name]) {
         // ie9 setting to null has no effect, must use empty string
-        setProp(el, name, cur == null ? '' : cur);
+        setProp(el, name, cur == null ? "" : cur);
       }
     }
   }
 
   var style = {
     create: updateStyle,
-    update: updateStyle
+    update: updateStyle,
   };
 
   /*  */
@@ -7870,23 +8243,25 @@
    * Add class with compatibility for SVG since classList is not supported on
    * SVG elements in IE
    */
-  function addClass (el, cls) {
+  function addClass(el, cls) {
     /* istanbul ignore if */
     if (!cls || !(cls = cls.trim())) {
-      return
+      return;
     }
 
     /* istanbul ignore else */
     if (el.classList) {
-      if (cls.indexOf(' ') > -1) {
-        cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });
+      if (cls.indexOf(" ") > -1) {
+        cls.split(whitespaceRE).forEach(function (c) {
+          return el.classList.add(c);
+        });
       } else {
         el.classList.add(cls);
       }
     } else {
-      var cur = " " + (el.getAttribute('class') || '') + " ";
-      if (cur.indexOf(' ' + cls + ' ') < 0) {
-        el.setAttribute('class', (cur + cls).trim());
+      var cur = " " + (el.getAttribute("class") || "") + " ";
+      if (cur.indexOf(" " + cls + " ") < 0) {
+        el.setAttribute("class", (cur + cls).trim());
       }
     }
   }
@@ -7895,89 +8270,93 @@
    * Remove class with compatibility for SVG since classList is not supported on
    * SVG elements in IE
    */
-  function removeClass (el, cls) {
+  function removeClass(el, cls) {
     /* istanbul ignore if */
     if (!cls || !(cls = cls.trim())) {
-      return
+      return;
     }
 
     /* istanbul ignore else */
     if (el.classList) {
-      if (cls.indexOf(' ') > -1) {
-        cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });
+      if (cls.indexOf(" ") > -1) {
+        cls.split(whitespaceRE).forEach(function (c) {
+          return el.classList.remove(c);
+        });
       } else {
         el.classList.remove(cls);
       }
       if (!el.classList.length) {
-        el.removeAttribute('class');
+        el.removeAttribute("class");
       }
     } else {
-      var cur = " " + (el.getAttribute('class') || '') + " ";
-      var tar = ' ' + cls + ' ';
+      var cur = " " + (el.getAttribute("class") || "") + " ";
+      var tar = " " + cls + " ";
       while (cur.indexOf(tar) >= 0) {
-        cur = cur.replace(tar, ' ');
+        cur = cur.replace(tar, " ");
       }
       cur = cur.trim();
       if (cur) {
-        el.setAttribute('class', cur);
+        el.setAttribute("class", cur);
       } else {
-        el.removeAttribute('class');
+        el.removeAttribute("class");
       }
     }
   }
 
   /*  */
 
-  function resolveTransition (def$$1) {
+  function resolveTransition(def$$1) {
     if (!def$$1) {
-      return
+      return;
     }
     /* istanbul ignore else */
-    if (typeof def$$1 === 'object') {
+    if (typeof def$$1 === "object") {
       var res = {};
       if (def$$1.css !== false) {
-        extend(res, autoCssTransition(def$$1.name || 'v'));
+        extend(res, autoCssTransition(def$$1.name || "v"));
       }
       extend(res, def$$1);
-      return res
-    } else if (typeof def$$1 === 'string') {
-      return autoCssTransition(def$$1)
+      return res;
+    } else if (typeof def$$1 === "string") {
+      return autoCssTransition(def$$1);
     }
   }
 
   var autoCssTransition = cached(function (name) {
     return {
-      enterClass: (name + "-enter"),
-      enterToClass: (name + "-enter-to"),
-      enterActiveClass: (name + "-enter-active"),
-      leaveClass: (name + "-leave"),
-      leaveToClass: (name + "-leave-to"),
-      leaveActiveClass: (name + "-leave-active")
-    }
+      enterClass: name + "-enter",
+      enterToClass: name + "-enter-to",
+      enterActiveClass: name + "-enter-active",
+      leaveClass: name + "-leave",
+      leaveToClass: name + "-leave-to",
+      leaveActiveClass: name + "-leave-active",
+    };
   });
 
   var hasTransition = inBrowser && !isIE9;
-  var TRANSITION = 'transition';
-  var ANIMATION = 'animation';
+  var TRANSITION = "transition";
+  var ANIMATION = "animation";
 
   // Transition property/event sniffing
-  var transitionProp = 'transition';
-  var transitionEndEvent = 'transitionend';
-  var animationProp = 'animation';
-  var animationEndEvent = 'animationend';
+  var transitionProp = "transition";
+  var transitionEndEvent = "transitionend";
+  var animationProp = "animation";
+  var animationEndEvent = "animationend";
   if (hasTransition) {
     /* istanbul ignore if */
-    if (window.ontransitionend === undefined &&
+    if (
+      window.ontransitionend === undefined &&
       window.onwebkittransitionend !== undefined
     ) {
-      transitionProp = 'WebkitTransition';
-      transitionEndEvent = 'webkitTransitionEnd';
+      transitionProp = "WebkitTransition";
+      transitionEndEvent = "webkitTransitionEnd";
     }
-    if (window.onanimationend === undefined &&
+    if (
+      window.onanimationend === undefined &&
       window.onwebkitanimationend !== undefined
     ) {
-      animationProp = 'WebkitAnimation';
-      animationEndEvent = 'webkitAnimationEnd';
+      animationProp = "WebkitAnimation";
+      animationEndEvent = "webkitAnimationEnd";
     }
   }
 
@@ -7986,39 +8365,40 @@
     ? window.requestAnimationFrame
       ? window.requestAnimationFrame.bind(window)
       : setTimeout
-    : /* istanbul ignore next */ function (fn) { return fn(); };
+    : /* istanbul ignore next */ function (fn) {
+        return fn();
+      };
 
-  function nextFrame (fn) {
+  function nextFrame(fn) {
     raf(function () {
       raf(fn);
     });
   }
 
-  function addTransitionClass (el, cls) {
-    var transitionClasses = el._transitionClasses || (el._transitionClasses = []);
+  function addTransitionClass(el, cls) {
+    var transitionClasses =
+      el._transitionClasses || (el._transitionClasses = []);
     if (transitionClasses.indexOf(cls) < 0) {
       transitionClasses.push(cls);
       addClass(el, cls);
     }
   }
 
-  function removeTransitionClass (el, cls) {
+  function removeTransitionClass(el, cls) {
     if (el._transitionClasses) {
       remove(el._transitionClasses, cls);
     }
     removeClass(el, cls);
   }
 
-  function whenTransitionEnds (
-    el,
-    expectedType,
-    cb
-  ) {
+  function whenTransitionEnds(el, expectedType, cb) {
     var ref = getTransitionInfo(el, expectedType);
     var type = ref.type;
     var timeout = ref.timeout;
     var propCount = ref.propCount;
-    if (!type) { return cb() }
+    if (!type) {
+      return cb();
+    }
     var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;
     var ended = 0;
     var end = function () {
@@ -8042,14 +8422,18 @@
 
   var transformRE = /\b(transform|all)(,|$)/;
 
-  function getTransitionInfo (el, expectedType) {
+  function getTransitionInfo(el, expectedType) {
     var styles = window.getComputedStyle(el);
     // JSDOM may return undefined for transition properties
-    var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');
-    var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');
+    var transitionDelays = (styles[transitionProp + "Delay"] || "").split(", ");
+    var transitionDurations = (styles[transitionProp + "Duration"] || "").split(
+      ", "
+    );
     var transitionTimeout = getTimeout(transitionDelays, transitionDurations);
-    var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');
-    var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');
+    var animationDelays = (styles[animationProp + "Delay"] || "").split(", ");
+    var animationDurations = (styles[animationProp + "Duration"] || "").split(
+      ", "
+    );
     var animationTimeout = getTimeout(animationDelays, animationDurations);
 
     var type;
@@ -8070,11 +8454,12 @@
       }
     } else {
       timeout = Math.max(transitionTimeout, animationTimeout);
-      type = timeout > 0
-        ? transitionTimeout > animationTimeout
-          ? TRANSITION
-          : ANIMATION
-        : null;
+      type =
+        timeout > 0
+          ? transitionTimeout > animationTimeout
+            ? TRANSITION
+            : ANIMATION
+          : null;
       propCount = type
         ? type === TRANSITION
           ? transitionDurations.length
@@ -8083,37 +8468,40 @@
     }
     var hasTransform =
       type === TRANSITION &&
-      transformRE.test(styles[transitionProp + 'Property']);
+      transformRE.test(styles[transitionProp + "Property"]);
     return {
       type: type,
       timeout: timeout,
       propCount: propCount,
-      hasTransform: hasTransform
-    }
+      hasTransform: hasTransform,
+    };
   }
 
-  function getTimeout (delays, durations) {
+  function getTimeout(delays, durations) {
     /* istanbul ignore next */
     while (delays.length < durations.length) {
       delays = delays.concat(delays);
     }
 
-    return Math.max.apply(null, durations.map(function (d, i) {
-      return toMs(d) + toMs(delays[i])
-    }))
+    return Math.max.apply(
+      null,
+      durations.map(function (d, i) {
+        return toMs(d) + toMs(delays[i]);
+      })
+    );
   }
 
   // Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers
   // in a locale-dependent way, using a comma instead of a dot.
   // If comma is not replaced with a dot, the input will be rounded down (i.e. acting
   // as a floor function) causing unexpected behaviors
-  function toMs (s) {
-    return Number(s.slice(0, -1).replace(',', '.')) * 1000
+  function toMs(s) {
+    return Number(s.slice(0, -1).replace(",", ".")) * 1000;
   }
 
   /*  */
 
-  function enter (vnode, toggleDisplay) {
+  function enter(vnode, toggleDisplay) {
     var el = vnode.elm;
 
     // call leave callback now
@@ -8124,12 +8512,12 @@
 
     var data = resolveTransition(vnode.data.transition);
     if (isUndef(data)) {
-      return
+      return;
     }
 
     /* istanbul ignore if */
     if (isDef(el._enterCb) || el.nodeType !== 1) {
-      return
+      return;
     }
 
     var css = data.css;
@@ -8163,47 +8551,38 @@
 
     var isAppear = !context._isMounted || !vnode.isRootInsert;
 
-    if (isAppear && !appear && appear !== '') {
-      return
+    if (isAppear && !appear && appear !== "") {
+      return;
     }
 
-    var startClass = isAppear && appearClass
-      ? appearClass
-      : enterClass;
-    var activeClass = isAppear && appearActiveClass
-      ? appearActiveClass
-      : enterActiveClass;
-    var toClass = isAppear && appearToClass
-      ? appearToClass
-      : enterToClass;
+    var startClass = isAppear && appearClass ? appearClass : enterClass;
+    var activeClass =
+      isAppear && appearActiveClass ? appearActiveClass : enterActiveClass;
+    var toClass = isAppear && appearToClass ? appearToClass : enterToClass;
 
-    var beforeEnterHook = isAppear
-      ? (beforeAppear || beforeEnter)
-      : beforeEnter;
+    var beforeEnterHook = isAppear ? beforeAppear || beforeEnter : beforeEnter;
     var enterHook = isAppear
-      ? (typeof appear === 'function' ? appear : enter)
+      ? typeof appear === "function"
+        ? appear
+        : enter
       : enter;
-    var afterEnterHook = isAppear
-      ? (afterAppear || afterEnter)
-      : afterEnter;
+    var afterEnterHook = isAppear ? afterAppear || afterEnter : afterEnter;
     var enterCancelledHook = isAppear
-      ? (appearCancelled || enterCancelled)
+      ? appearCancelled || enterCancelled
       : enterCancelled;
 
     var explicitEnterDuration = toNumber(
-      isObject(duration)
-        ? duration.enter
-        : duration
+      isObject(duration) ? duration.enter : duration
     );
 
     if (explicitEnterDuration != null) {
-      checkDuration(explicitEnterDuration, 'enter', vnode);
+      checkDuration(explicitEnterDuration, "enter", vnode);
     }
 
     var expectsCSS = css !== false && !isIE9;
     var userWantsControl = getHookArgumentsLength(enterHook);
 
-    var cb = el._enterCb = once(function () {
+    var cb = (el._enterCb = once(function () {
       if (expectsCSS) {
         removeTransitionClass(el, toClass);
         removeTransitionClass(el, activeClass);
@@ -8217,14 +8596,16 @@
         afterEnterHook && afterEnterHook(el);
       }
       el._enterCb = null;
-    });
+    }));
 
     if (!vnode.data.show) {
       // remove pending leave element on enter by injecting an insert hook
-      mergeVNodeHook(vnode, 'insert', function () {
+      mergeVNodeHook(vnode, "insert", function () {
         var parent = el.parentNode;
-        var pendingNode = parent && parent._pending && parent._pending[vnode.key];
-        if (pendingNode &&
+        var pendingNode =
+          parent && parent._pending && parent._pending[vnode.key];
+        if (
+          pendingNode &&
           pendingNode.tag === vnode.tag &&
           pendingNode.elm._leaveCb
         ) {
@@ -8264,7 +8645,7 @@
     }
   }
 
-  function leave (vnode, rm) {
+  function leave(vnode, rm) {
     var el = vnode.elm;
 
     // call enter callback now
@@ -8275,12 +8656,12 @@
 
     var data = resolveTransition(vnode.data.transition);
     if (isUndef(data) || el.nodeType !== 1) {
-      return rm()
+      return rm();
     }
 
     /* istanbul ignore if */
     if (isDef(el._leaveCb)) {
-      return
+      return;
     }
 
     var css = data.css;
@@ -8299,16 +8680,14 @@
     var userWantsControl = getHookArgumentsLength(leave);
 
     var explicitLeaveDuration = toNumber(
-      isObject(duration)
-        ? duration.leave
-        : duration
+      isObject(duration) ? duration.leave : duration
     );
 
     if (isDef(explicitLeaveDuration)) {
-      checkDuration(explicitLeaveDuration, 'leave', vnode);
+      checkDuration(explicitLeaveDuration, "leave", vnode);
     }
 
-    var cb = el._leaveCb = once(function () {
+    var cb = (el._leaveCb = once(function () {
       if (el.parentNode && el.parentNode._pending) {
         el.parentNode._pending[vnode.key] = null;
       }
@@ -8326,7 +8705,7 @@
         afterLeave && afterLeave(el);
       }
       el._leaveCb = null;
-    });
+    }));
 
     if (delayLeave) {
       delayLeave(performLeave);
@@ -8334,14 +8713,15 @@
       performLeave();
     }
 
-    function performLeave () {
+    function performLeave() {
       // the delayed leave may have already been cancelled
       if (cb.cancelled) {
-        return
+        return;
       }
       // record leaving element
       if (!vnode.data.show && el.parentNode) {
-        (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;
+        (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] =
+          vnode;
       }
       beforeLeave && beforeLeave(el);
       if (expectsCSS) {
@@ -8369,24 +8749,30 @@
   }
 
   // only used in dev mode
-  function checkDuration (val, name, vnode) {
-    if (typeof val !== 'number') {
+  function checkDuration(val, name, vnode) {
+    if (typeof val !== "number") {
       warn(
-        "<transition> explicit " + name + " duration is not a valid number - " +
-        "got " + (JSON.stringify(val)) + ".",
+        "<transition> explicit " +
+          name +
+          " duration is not a valid number - " +
+          "got " +
+          JSON.stringify(val) +
+          ".",
         vnode.context
       );
     } else if (isNaN(val)) {
       warn(
-        "<transition> explicit " + name + " duration is NaN - " +
-        'the duration expression might be incorrect.',
+        "<transition> explicit " +
+          name +
+          " duration is NaN - " +
+          "the duration expression might be incorrect.",
         vnode.context
       );
     }
   }
 
-  function isValidDuration (val) {
-    return typeof val === 'number' && !isNaN(val)
+  function isValidDuration(val) {
+    return typeof val === "number" && !isNaN(val);
   }
 
   /**
@@ -8395,50 +8781,43 @@
    * - a wrapped component method (check ._length)
    * - a plain function (.length)
    */
-  function getHookArgumentsLength (fn) {
+  function getHookArgumentsLength(fn) {
     if (isUndef(fn)) {
-      return false
+      return false;
     }
     var invokerFns = fn.fns;
     if (isDef(invokerFns)) {
       // invoker
       return getHookArgumentsLength(
-        Array.isArray(invokerFns)
-          ? invokerFns[0]
-          : invokerFns
-      )
+        Array.isArray(invokerFns) ? invokerFns[0] : invokerFns
+      );
     } else {
-      return (fn._length || fn.length) > 1
+      return (fn._length || fn.length) > 1;
     }
   }
 
-  function _enter (_, vnode) {
+  function _enter(_, vnode) {
     if (vnode.data.show !== true) {
       enter(vnode);
     }
   }
 
-  var transition = inBrowser ? {
-    create: _enter,
-    activate: _enter,
-    remove: function remove$$1 (vnode, rm) {
-      /* istanbul ignore else */
-      if (vnode.data.show !== true) {
-        leave(vnode, rm);
-      } else {
-        rm();
+  var transition = inBrowser
+    ? {
+        create: _enter,
+        activate: _enter,
+        remove: function remove$$1(vnode, rm) {
+          /* istanbul ignore else */
+          if (vnode.data.show !== true) {
+            leave(vnode, rm);
+          } else {
+            rm();
+          }
+        },
       }
-    }
-  } : {};
+    : {};
 
-  var platformModules = [
-    attrs,
-    klass,
-    events,
-    domProps,
-    style,
-    transition
-  ];
+  var platformModules = [attrs, klass, events, domProps, style, transition];
 
   /*  */
 
@@ -8456,36 +8835,36 @@
   /* istanbul ignore if */
   if (isIE9) {
     // http://www.matts411.com/post/internet-explorer-9-oninput/
-    document.addEventListener('selectionchange', function () {
+    document.addEventListener("selectionchange", function () {
       var el = document.activeElement;
       if (el && el.vmodel) {
-        trigger(el, 'input');
+        trigger(el, "input");
       }
     });
   }
 
   var directive = {
-    inserted: function inserted (el, binding, vnode, oldVnode) {
-      if (vnode.tag === 'select') {
+    inserted: function inserted(el, binding, vnode, oldVnode) {
+      if (vnode.tag === "select") {
         // #6903
         if (oldVnode.elm && !oldVnode.elm._vOptions) {
-          mergeVNodeHook(vnode, 'postpatch', function () {
+          mergeVNodeHook(vnode, "postpatch", function () {
             directive.componentUpdated(el, binding, vnode);
           });
         } else {
           setSelected(el, binding, vnode.context);
         }
         el._vOptions = [].map.call(el.options, getValue);
-      } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
+      } else if (vnode.tag === "textarea" || isTextInputType(el.type)) {
         el._vModifiers = binding.modifiers;
         if (!binding.modifiers.lazy) {
-          el.addEventListener('compositionstart', onCompositionStart);
-          el.addEventListener('compositionend', onCompositionEnd);
+          el.addEventListener("compositionstart", onCompositionStart);
+          el.addEventListener("compositionend", onCompositionEnd);
           // Safari < 10.2 & UIWebView doesn't fire compositionend when
           // switching focus before confirming composition choice
           // this also fixes the issue where some browsers e.g. iOS Chrome
           // fires "change" instead of "input" on autocomplete.
-          el.addEventListener('change', onCompositionEnd);
+          el.addEventListener("change", onCompositionEnd);
           /* istanbul ignore if */
           if (isIE9) {
             el.vmodel = true;
@@ -8494,30 +8873,37 @@
       }
     },
 
-    componentUpdated: function componentUpdated (el, binding, vnode) {
-      if (vnode.tag === 'select') {
+    componentUpdated: function componentUpdated(el, binding, vnode) {
+      if (vnode.tag === "select") {
         setSelected(el, binding, vnode.context);
         // in case the options rendered by v-for have changed,
         // it's possible that the value is out-of-sync with the rendered options.
         // detect such cases and filter out values that no longer has a matching
         // option in the DOM.
         var prevOptions = el._vOptions;
-        var curOptions = el._vOptions = [].map.call(el.options, getValue);
-        if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {
+        var curOptions = (el._vOptions = [].map.call(el.options, getValue));
+        if (
+          curOptions.some(function (o, i) {
+            return !looseEqual(o, prevOptions[i]);
+          })
+        ) {
           // trigger change event if
           // no matching option found for at least one value
           var needReset = el.multiple
-            ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })
-            : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);
+            ? binding.value.some(function (v) {
+                return hasNoMatchingOption(v, curOptions);
+              })
+            : binding.value !== binding.oldValue &&
+              hasNoMatchingOption(binding.value, curOptions);
           if (needReset) {
-            trigger(el, 'change');
+            trigger(el, "change");
           }
         }
       }
-    }
+    },
   };
 
-  function setSelected (el, binding, vm) {
+  function setSelected(el, binding, vm) {
     actuallySetSelected(el, binding, vm);
     /* istanbul ignore if */
     if (isIE || isEdge) {
@@ -8527,16 +8913,19 @@
     }
   }
 
-  function actuallySetSelected (el, binding, vm) {
+  function actuallySetSelected(el, binding, vm) {
     var value = binding.value;
     var isMultiple = el.multiple;
     if (isMultiple && !Array.isArray(value)) {
       warn(
-        "<select multiple v-model=\"" + (binding.expression) + "\"> " +
-        "expects an Array value for its binding, but got " + (Object.prototype.toString.call(value).slice(8, -1)),
+        '<select multiple v-model="' +
+          binding.expression +
+          '"> ' +
+          "expects an Array value for its binding, but got " +
+          Object.prototype.toString.call(value).slice(8, -1),
         vm
       );
-      return
+      return;
     }
     var selected, option;
     for (var i = 0, l = el.options.length; i < l; i++) {
@@ -8551,7 +8940,7 @@
           if (el.selectedIndex !== i) {
             el.selectedIndex = i;
           }
-          return
+          return;
         }
       }
     }
@@ -8560,29 +8949,31 @@
     }
   }
 
-  function hasNoMatchingOption (value, options) {
-    return options.every(function (o) { return !looseEqual(o, value); })
+  function hasNoMatchingOption(value, options) {
+    return options.every(function (o) {
+      return !looseEqual(o, value);
+    });
   }
 
-  function getValue (option) {
-    return '_value' in option
-      ? option._value
-      : option.value
+  function getValue(option) {
+    return "_value" in option ? option._value : option.value;
   }
 
-  function onCompositionStart (e) {
+  function onCompositionStart(e) {
     e.target.composing = true;
   }
 
-  function onCompositionEnd (e) {
+  function onCompositionEnd(e) {
     // prevent triggering an input event for no reason
-    if (!e.target.composing) { return }
+    if (!e.target.composing) {
+      return;
+    }
     e.target.composing = false;
-    trigger(e.target, 'input');
+    trigger(e.target, "input");
   }
 
-  function trigger (el, type) {
-    var e = document.createEvent('HTMLEvents');
+  function trigger(el, type) {
+    var e = document.createEvent("HTMLEvents");
     e.initEvent(type, true, true);
     el.dispatchEvent(e);
   }
@@ -8590,36 +8981,38 @@
   /*  */
 
   // recursively search for possible transition defined inside the component root
-  function locateNode (vnode) {
+  function locateNode(vnode) {
     return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
       ? locateNode(vnode.componentInstance._vnode)
-      : vnode
+      : vnode;
   }
 
   var show = {
-    bind: function bind (el, ref, vnode) {
+    bind: function bind(el, ref, vnode) {
       var value = ref.value;
 
       vnode = locateNode(vnode);
       var transition$$1 = vnode.data && vnode.data.transition;
-      var originalDisplay = el.__vOriginalDisplay =
-        el.style.display === 'none' ? '' : el.style.display;
+      var originalDisplay = (el.__vOriginalDisplay =
+        el.style.display === "none" ? "" : el.style.display);
       if (value && transition$$1) {
         vnode.data.show = true;
         enter(vnode, function () {
           el.style.display = originalDisplay;
         });
       } else {
-        el.style.display = value ? originalDisplay : 'none';
+        el.style.display = value ? originalDisplay : "none";
       }
     },
 
-    update: function update (el, ref, vnode) {
+    update: function update(el, ref, vnode) {
       var value = ref.value;
       var oldValue = ref.oldValue;
 
       /* istanbul ignore if */
-      if (!value === !oldValue) { return }
+      if (!value === !oldValue) {
+        return;
+      }
       vnode = locateNode(vnode);
       var transition$$1 = vnode.data && vnode.data.transition;
       if (transition$$1) {
@@ -8630,30 +9023,24 @@
           });
         } else {
           leave(vnode, function () {
-            el.style.display = 'none';
+            el.style.display = "none";
           });
         }
       } else {
-        el.style.display = value ? el.__vOriginalDisplay : 'none';
+        el.style.display = value ? el.__vOriginalDisplay : "none";
       }
     },
 
-    unbind: function unbind (
-      el,
-      binding,
-      vnode,
-      oldVnode,
-      isDestroy
-    ) {
+    unbind: function unbind(el, binding, vnode, oldVnode, isDestroy) {
       if (!isDestroy) {
         el.style.display = el.__vOriginalDisplay;
       }
-    }
+    },
   };
 
   var platformDirectives = {
     model: directive,
-    show: show
+    show: show,
   };
 
   /*  */
@@ -8673,21 +9060,21 @@
     appearClass: String,
     appearActiveClass: String,
     appearToClass: String,
-    duration: [Number, String, Object]
+    duration: [Number, String, Object],
   };
 
   // in case the child is also an abstract component, e.g. <keep-alive>
   // we want to recursively retrieve the real component to be rendered
-  function getRealChild (vnode) {
+  function getRealChild(vnode) {
     var compOptions = vnode && vnode.componentOptions;
     if (compOptions && compOptions.Ctor.options.abstract) {
-      return getRealChild(getFirstComponentChild(compOptions.children))
+      return getRealChild(getFirstComponentChild(compOptions.children));
     } else {
-      return vnode
+      return vnode;
     }
   }
 
-  function extractTransitionData (comp) {
+  function extractTransitionData(comp) {
     var data = {};
     var options = comp.$options;
     // props
@@ -8700,58 +9087,62 @@
     for (var key$1 in listeners) {
       data[camelize(key$1)] = listeners[key$1];
     }
-    return data
+    return data;
   }
 
-  function placeholder (h, rawChild) {
+  function placeholder(h, rawChild) {
     if (/\d-keep-alive$/.test(rawChild.tag)) {
-      return h('keep-alive', {
-        props: rawChild.componentOptions.propsData
-      })
+      return h("keep-alive", {
+        props: rawChild.componentOptions.propsData,
+      });
     }
   }
 
-  function hasParentTransition (vnode) {
+  function hasParentTransition(vnode) {
     while ((vnode = vnode.parent)) {
       if (vnode.data.transition) {
-        return true
+        return true;
       }
     }
   }
 
-  function isSameChild (child, oldChild) {
-    return oldChild.key === child.key && oldChild.tag === child.tag
+  function isSameChild(child, oldChild) {
+    return oldChild.key === child.key && oldChild.tag === child.tag;
   }
 
-  var isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };
+  var isNotTextNode = function (c) {
+    return c.tag || isAsyncPlaceholder(c);
+  };
 
-  var isVShowDirective = function (d) { return d.name === 'show'; };
+  var isVShowDirective = function (d) {
+    return d.name === "show";
+  };
 
   var Transition = {
-    name: 'transition',
+    name: "transition",
     props: transitionProps,
     abstract: true,
 
-    render: function render (h) {
+    render: function render(h) {
       var this$1 = this;
 
       var children = this.$slots.default;
       if (!children) {
-        return
+        return;
       }
 
       // filter out text nodes (possible whitespaces)
       children = children.filter(isNotTextNode);
       /* istanbul ignore if */
       if (!children.length) {
-        return
+        return;
       }
 
       // warn multiple elements
       if (children.length > 1) {
         warn(
-          '<transition> can only be used on a single element. Use ' +
-          '<transition-group> for lists.',
+          "<transition> can only be used on a single element. Use " +
+            "<transition-group> for lists.",
           this.$parent
         );
       }
@@ -8759,12 +9150,8 @@
       var mode = this.mode;
 
       // warn invalid mode
-      if (mode && mode !== 'in-out' && mode !== 'out-in'
-      ) {
-        warn(
-          'invalid <transition> mode: ' + mode,
-          this.$parent
-        );
+      if (mode && mode !== "in-out" && mode !== "out-in") {
+        warn("invalid <transition> mode: " + mode, this.$parent);
       }
 
       var rawChild = children[0];
@@ -8772,7 +9159,7 @@
       // if this is a component root node and the component's
       // parent container node also has transition, skip.
       if (hasParentTransition(this.$vnode)) {
-        return rawChild
+        return rawChild;
       }
 
       // apply transition data to child
@@ -8780,32 +9167,39 @@
       var child = getRealChild(rawChild);
       /* istanbul ignore if */
       if (!child) {
-        return rawChild
+        return rawChild;
       }
 
       if (this._leaving) {
-        return placeholder(h, rawChild)
+        return placeholder(h, rawChild);
       }
 
       // ensure a key that is unique to the vnode type and to this transition
       // component instance. This key will be used to remove pending leaving nodes
       // during entering.
-      var id = "__transition-" + (this._uid) + "-";
-      child.key = child.key == null
-        ? child.isComment
-          ? id + 'comment'
-          : id + child.tag
-        : isPrimitive(child.key)
-          ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
+      var id = "__transition-" + this._uid + "-";
+      child.key =
+        child.key == null
+          ? child.isComment
+            ? id + "comment"
+            : id + child.tag
+          : isPrimitive(child.key)
+          ? String(child.key).indexOf(id) === 0
+            ? child.key
+            : id + child.key
           : child.key;
 
-      var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
+      var data = ((child.data || (child.data = {})).transition =
+        extractTransitionData(this));
       var oldRawChild = this._vnode;
       var oldChild = getRealChild(oldRawChild);
 
       // mark v-show
       // so that the transition module can hand over the control to the directive
-      if (child.data.directives && child.data.directives.some(isVShowDirective)) {
+      if (
+        child.data.directives &&
+        child.data.directives.some(isVShowDirective)
+      ) {
         child.data.show = true;
       }
 
@@ -8815,49 +9209,59 @@
         !isSameChild(child, oldChild) &&
         !isAsyncPlaceholder(oldChild) &&
         // #6687 component root is a comment node
-        !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)
+        !(
+          oldChild.componentInstance &&
+          oldChild.componentInstance._vnode.isComment
+        )
       ) {
         // replace old child transition data with fresh one
         // important for dynamic transitions!
-        var oldData = oldChild.data.transition = extend({}, data);
+        var oldData = (oldChild.data.transition = extend({}, data));
         // handle transition mode
-        if (mode === 'out-in') {
+        if (mode === "out-in") {
           // return placeholder node and queue update when leave finishes
           this._leaving = true;
-          mergeVNodeHook(oldData, 'afterLeave', function () {
+          mergeVNodeHook(oldData, "afterLeave", function () {
             this$1._leaving = false;
             this$1.$forceUpdate();
           });
-          return placeholder(h, rawChild)
-        } else if (mode === 'in-out') {
+          return placeholder(h, rawChild);
+        } else if (mode === "in-out") {
           if (isAsyncPlaceholder(child)) {
-            return oldRawChild
+            return oldRawChild;
           }
           var delayedLeave;
-          var performLeave = function () { delayedLeave(); };
-          mergeVNodeHook(data, 'afterEnter', performLeave);
-          mergeVNodeHook(data, 'enterCancelled', performLeave);
-          mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
+          var performLeave = function () {
+            delayedLeave();
+          };
+          mergeVNodeHook(data, "afterEnter", performLeave);
+          mergeVNodeHook(data, "enterCancelled", performLeave);
+          mergeVNodeHook(oldData, "delayLeave", function (leave) {
+            delayedLeave = leave;
+          });
         }
       }
 
-      return rawChild
-    }
+      return rawChild;
+    },
   };
 
   /*  */
 
-  var props = extend({
-    tag: String,
-    moveClass: String
-  }, transitionProps);
+  var props = extend(
+    {
+      tag: String,
+      moveClass: String,
+    },
+    transitionProps
+  );
 
   delete props.mode;
 
   var TransitionGroup = {
     props: props,
 
-    beforeMount: function beforeMount () {
+    beforeMount: function beforeMount() {
       var this$1 = this;
 
       var update = this._update;
@@ -8876,25 +9280,25 @@
       };
     },
 
-    render: function render (h) {
-      var tag = this.tag || this.$vnode.data.tag || 'span';
+    render: function render(h) {
+      var tag = this.tag || this.$vnode.data.tag || "span";
       var map = Object.create(null);
-      var prevChildren = this.prevChildren = this.children;
+      var prevChildren = (this.prevChildren = this.children);
       var rawChildren = this.$slots.default || [];
-      var children = this.children = [];
+      var children = (this.children = []);
       var transitionData = extractTransitionData(this);
 
       for (var i = 0; i < rawChildren.length; i++) {
         var c = rawChildren[i];
         if (c.tag) {
-          if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
+          if (c.key != null && String(c.key).indexOf("__vlist") !== 0) {
             children.push(c);
-            map[c.key] = c
-            ;(c.data || (c.data = {})).transition = transitionData;
+            map[c.key] = c;
+            (c.data || (c.data = {})).transition = transitionData;
           } else {
             var opts = c.componentOptions;
-            var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;
-            warn(("<transition-group> children must be keyed: <" + name + ">"));
+            var name = opts ? opts.Ctor.options.name || opts.tag || "" : c.tag;
+            warn("<transition-group> children must be keyed: <" + name + ">");
           }
         }
       }
@@ -8916,14 +9320,14 @@
         this.removed = removed;
       }
 
-      return h(tag, null, children)
+      return h(tag, null, children);
     },
 
-    updated: function updated () {
+    updated: function updated() {
       var children = this.prevChildren;
-      var moveClass = this.moveClass || ((this.name || 'v') + '-move');
+      var moveClass = this.moveClass || (this.name || "v") + "-move";
       if (!children.length || !this.hasMove(children[0].elm, moveClass)) {
-        return
+        return;
       }
 
       // we divide the work into three loops to avoid mixing DOM reads and writes
@@ -8942,30 +9346,33 @@
           var el = c.elm;
           var s = el.style;
           addTransitionClass(el, moveClass);
-          s.transform = s.WebkitTransform = s.transitionDuration = '';
-          el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {
-            if (e && e.target !== el) {
-              return
-            }
-            if (!e || /transform$/.test(e.propertyName)) {
-              el.removeEventListener(transitionEndEvent, cb);
-              el._moveCb = null;
-              removeTransitionClass(el, moveClass);
-            }
-          });
+          s.transform = s.WebkitTransform = s.transitionDuration = "";
+          el.addEventListener(
+            transitionEndEvent,
+            (el._moveCb = function cb(e) {
+              if (e && e.target !== el) {
+                return;
+              }
+              if (!e || /transform$/.test(e.propertyName)) {
+                el.removeEventListener(transitionEndEvent, cb);
+                el._moveCb = null;
+                removeTransitionClass(el, moveClass);
+              }
+            })
+          );
         }
       });
     },
 
     methods: {
-      hasMove: function hasMove (el, moveClass) {
+      hasMove: function hasMove(el, moveClass) {
         /* istanbul ignore if */
         if (!hasTransition) {
-          return false
+          return false;
         }
         /* istanbul ignore if */
         if (this._hasMove) {
-          return this._hasMove
+          return this._hasMove;
         }
         // Detect whether an element with the move class applied has
         // CSS transitions. Since the element may be inside an entering
@@ -8974,19 +9381,21 @@
         // is applied.
         var clone = el.cloneNode();
         if (el._transitionClasses) {
-          el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });
+          el._transitionClasses.forEach(function (cls) {
+            removeClass(clone, cls);
+          });
         }
         addClass(clone, moveClass);
-        clone.style.display = 'none';
+        clone.style.display = "none";
         this.$el.appendChild(clone);
         var info = getTransitionInfo(clone);
         this.$el.removeChild(clone);
-        return (this._hasMove = info.hasTransform)
-      }
-    }
+        return (this._hasMove = info.hasTransform);
+      },
+    },
   };
 
-  function callPendingCbs (c) {
+  function callPendingCbs(c) {
     /* istanbul ignore if */
     if (c.elm._moveCb) {
       c.elm._moveCb();
@@ -8997,11 +9406,11 @@
     }
   }
 
-  function recordPosition (c) {
+  function recordPosition(c) {
     c.data.newPos = c.elm.getBoundingClientRect();
   }
 
-  function applyTranslation (c) {
+  function applyTranslation(c) {
     var oldPos = c.data.pos;
     var newPos = c.data.newPos;
     var dx = oldPos.left - newPos.left;
@@ -9010,13 +9419,13 @@
       c.data.moved = true;
       var s = c.elm.style;
       s.transform = s.WebkitTransform = "translate(" + dx + "px," + dy + "px)";
-      s.transitionDuration = '0s';
+      s.transitionDuration = "0s";
     }
   }
 
   var platformComponents = {
     Transition: Transition,
-    TransitionGroup: TransitionGroup
+    TransitionGroup: TransitionGroup,
   };
 
   /*  */
@@ -9036,12 +9445,9 @@
   Vue.prototype.__patch__ = inBrowser ? patch : noop;
 
   // public mount method
-  Vue.prototype.$mount = function (
-    el,
-    hydrating
-  ) {
+  Vue.prototype.$mount = function (el, hydrating) {
     el = el && inBrowser ? query(el) : undefined;
-    return mountComponent(this, el, hydrating)
+    return mountComponent(this, el, hydrating);
   };
 
   // devtools global hook
@@ -9050,21 +9456,19 @@
     setTimeout(function () {
       if (config.devtools) {
         if (devtools) {
-          devtools.emit('init', Vue);
+          devtools.emit("init", Vue);
         } else {
-          console[console.info ? 'info' : 'log'](
-            'Download the Vue Devtools extension for a better development experience:\n' +
-            'https://github.com/vuejs/vue-devtools'
+          console[console.info ? "info" : "log"](
+            "Download the Vue Devtools extension for a better development experience:\n" +
+              "https://github.com/vuejs/vue-devtools"
           );
         }
       }
-      if (config.productionTip !== false &&
-        typeof console !== 'undefined'
-      ) {
-        console[console.info ? 'info' : 'log'](
+      if (config.productionTip !== false && typeof console !== "undefined") {
+        console[console.info ? "info" : "log"](
           "You are running Vue in development mode.\n" +
-          "Make sure to turn on production mode when deploying for production.\n" +
-          "See more tips at https://vuejs.org/guide/deployment.html"
+            "Make sure to turn on production mode when deploying for production.\n" +
+            "See more tips at https://vuejs.org/guide/deployment.html"
         );
       }
     }, 0);
@@ -9076,134 +9480,133 @@
   var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
 
   var buildRegex = cached(function (delimiters) {
-    var open = delimiters[0].replace(regexEscapeRE, '\\$&');
-    var close = delimiters[1].replace(regexEscapeRE, '\\$&');
-    return new RegExp(open + '((?:.|\\n)+?)' + close, 'g')
+    var open = delimiters[0].replace(regexEscapeRE, "\\$&");
+    var close = delimiters[1].replace(regexEscapeRE, "\\$&");
+    return new RegExp(open + "((?:.|\\n)+?)" + close, "g");
   });
 
-
-
-  function parseText (
-    text,
-    delimiters
-  ) {
+  function parseText(text, delimiters) {
     var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;
     if (!tagRE.test(text)) {
-      return
+      return;
     }
     var tokens = [];
     var rawTokens = [];
-    var lastIndex = tagRE.lastIndex = 0;
+    var lastIndex = (tagRE.lastIndex = 0);
     var match, index, tokenValue;
     while ((match = tagRE.exec(text))) {
       index = match.index;
       // push text token
       if (index > lastIndex) {
-        rawTokens.push(tokenValue = text.slice(lastIndex, index));
+        rawTokens.push((tokenValue = text.slice(lastIndex, index)));
         tokens.push(JSON.stringify(tokenValue));
       }
       // tag token
       var exp = parseFilters(match[1].trim());
-      tokens.push(("_s(" + exp + ")"));
-      rawTokens.push({ '@binding': exp });
+      tokens.push("_s(" + exp + ")");
+      rawTokens.push({ "@binding": exp });
       lastIndex = index + match[0].length;
     }
     if (lastIndex < text.length) {
-      rawTokens.push(tokenValue = text.slice(lastIndex));
+      rawTokens.push((tokenValue = text.slice(lastIndex)));
       tokens.push(JSON.stringify(tokenValue));
     }
     return {
-      expression: tokens.join('+'),
-      tokens: rawTokens
-    }
+      expression: tokens.join("+"),
+      tokens: rawTokens,
+    };
   }
 
   /*  */
 
-  function transformNode (el, options) {
+  function transformNode(el, options) {
     var warn = options.warn || baseWarn;
-    var staticClass = getAndRemoveAttr(el, 'class');
+    var staticClass = getAndRemoveAttr(el, "class");
     if (staticClass) {
       var res = parseText(staticClass, options.delimiters);
       if (res) {
         warn(
-          "class=\"" + staticClass + "\": " +
-          'Interpolation inside attributes has been removed. ' +
-          'Use v-bind or the colon shorthand instead. For example, ' +
-          'instead of <div class="{{ val }}">, use <div :class="val">.',
-          el.rawAttrsMap['class']
+          'class="' +
+            staticClass +
+            '": ' +
+            "Interpolation inside attributes has been removed. " +
+            "Use v-bind or the colon shorthand instead. For example, " +
+            'instead of <div class="{{ val }}">, use <div :class="val">.',
+          el.rawAttrsMap["class"]
         );
       }
     }
     if (staticClass) {
       el.staticClass = JSON.stringify(staticClass);
     }
-    var classBinding = getBindingAttr(el, 'class', false /* getStatic */);
+    var classBinding = getBindingAttr(el, "class", false /* getStatic */);
     if (classBinding) {
       el.classBinding = classBinding;
     }
   }
 
-  function genData (el) {
-    var data = '';
+  function genData(el) {
+    var data = "";
     if (el.staticClass) {
-      data += "staticClass:" + (el.staticClass) + ",";
+      data += "staticClass:" + el.staticClass + ",";
     }
     if (el.classBinding) {
-      data += "class:" + (el.classBinding) + ",";
+      data += "class:" + el.classBinding + ",";
     }
-    return data
+    return data;
   }
 
   var klass$1 = {
-    staticKeys: ['staticClass'],
+    staticKeys: ["staticClass"],
     transformNode: transformNode,
-    genData: genData
+    genData: genData,
   };
 
   /*  */
 
-  function transformNode$1 (el, options) {
+  function transformNode$1(el, options) {
     var warn = options.warn || baseWarn;
-    var staticStyle = getAndRemoveAttr(el, 'style');
+    var staticStyle = getAndRemoveAttr(el, "style");
     if (staticStyle) {
       /* istanbul ignore if */
       {
         var res = parseText(staticStyle, options.delimiters);
         if (res) {
           warn(
-            "style=\"" + staticStyle + "\": " +
-            'Interpolation inside attributes has been removed. ' +
-            'Use v-bind or the colon shorthand instead. For example, ' +
-            'instead of <div style="{{ val }}">, use <div :style="val">.',
-            el.rawAttrsMap['style']
+            'style="' +
+              staticStyle +
+              '": ' +
+              "Interpolation inside attributes has been removed. " +
+              "Use v-bind or the colon shorthand instead. For example, " +
+              'instead of <div style="{{ val }}">, use <div :style="val">.',
+            el.rawAttrsMap["style"]
           );
         }
       }
       el.staticStyle = JSON.stringify(parseStyleText(staticStyle));
     }
 
-    var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);
+    var styleBinding = getBindingAttr(el, "style", false /* getStatic */);
     if (styleBinding) {
       el.styleBinding = styleBinding;
     }
   }
 
-  function genData$1 (el) {
-    var data = '';
+  function genData$1(el) {
+    var data = "";
     if (el.staticStyle) {
-      data += "staticStyle:" + (el.staticStyle) + ",";
+      data += "staticStyle:" + el.staticStyle + ",";
     }
     if (el.styleBinding) {
-      data += "style:(" + (el.styleBinding) + "),";
+      data += "style:(" + el.styleBinding + "),";
     }
-    return data
+    return data;
   }
 
   var style$1 = {
-    staticKeys: ['staticStyle'],
+    staticKeys: ["staticStyle"],
     transformNode: transformNode$1,
-    genData: genData$1
+    genData: genData$1,
   };
 
   /*  */
@@ -9211,34 +9614,34 @@
   var decoder;
 
   var he = {
-    decode: function decode (html) {
-      decoder = decoder || document.createElement('div');
+    decode: function decode(html) {
+      decoder = decoder || document.createElement("div");
       decoder.innerHTML = html;
-      return decoder.textContent
-    }
+      return decoder.textContent;
+    },
   };
 
   /*  */
 
   var isUnaryTag = makeMap(
-    'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
-    'link,meta,param,source,track,wbr'
+    "area,base,br,col,embed,frame,hr,img,input,isindex,keygen," +
+      "link,meta,param,source,track,wbr"
   );
 
   // Elements that you can, intentionally, leave open
   // (and which close themselves)
   var canBeLeftOpenTag = makeMap(
-    'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
+    "colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"
   );
 
   // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
   // Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content
   var isNonPhrasingTag = makeMap(
-    'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +
-    'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
-    'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
-    'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
-    'title,tr,track'
+    "address,article,aside,base,blockquote,body,caption,col,colgroup,dd," +
+      "details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form," +
+      "h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta," +
+      "optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead," +
+      "title,tr,track"
   );
 
   /**
@@ -9246,44 +9649,50 @@
    */
 
   // Regular Expressions for parsing tags and attributes
-  var attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
-  var dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
-  var ncname = "[a-zA-Z_][\\-\\.0-9_a-zA-Z" + (unicodeRegExp.source) + "]*";
+  var attribute =
+    /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
+  var dynamicArgAttribute =
+    /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/;
+  var ncname = "[a-zA-Z_][\\-\\.0-9_a-zA-Z" + unicodeRegExp.source + "]*";
   var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
-  var startTagOpen = new RegExp(("^<" + qnameCapture));
+  var startTagOpen = new RegExp("^<" + qnameCapture);
   var startTagClose = /^\s*(\/?)>/;
-  var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>"));
+  var endTag = new RegExp("^<\\/" + qnameCapture + "[^>]*>");
   var doctype = /^<!DOCTYPE [^>]+>/i;
   // #7298: escape - to avoid being passed as HTML comment when inlined in page
   var comment = /^<!\--/;
   var conditionalComment = /^<!\[/;
 
   // Special Elements (can contain anything)
-  var isPlainTextElement = makeMap('script,style,textarea', true);
+  var isPlainTextElement = makeMap("script,style,textarea", true);
   var reCache = {};
 
   var decodingMap = {
-    '&lt;': '<',
-    '&gt;': '>',
-    '&quot;': '"',
-    '&amp;': '&',
-    '&#10;': '\n',
-    '&#9;': '\t',
-    '&#39;': "'"
+    "&lt;": "<",
+    "&gt;": ">",
+    "&quot;": '"',
+    "&amp;": "&",
+    "&#10;": "\n",
+    "&#9;": "\t",
+    "&#39;": "'",
   };
   var encodedAttr = /&(?:lt|gt|quot|amp|#39);/g;
   var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#39|#10|#9);/g;
 
   // #5992
-  var isIgnoreNewlineTag = makeMap('pre,textarea', true);
-  var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\n'; };
+  var isIgnoreNewlineTag = makeMap("pre,textarea", true);
+  var shouldIgnoreFirstNewline = function (tag, html) {
+    return tag && isIgnoreNewlineTag(tag) && html[0] === "\n";
+  };
 
-  function decodeAttr (value, shouldDecodeNewlines) {
+  function decodeAttr(value, shouldDecodeNewlines) {
     var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;
-    return value.replace(re, function (match) { return decodingMap[match]; })
+    return value.replace(re, function (match) {
+      return decodingMap[match];
+    });
   }
 
-  function parseHTML (html, options) {
+  function parseHTML(html, options) {
     var stack = [];
     var expectHTML = options.expectHTML;
     var isUnaryTag$$1 = options.isUnaryTag || no;
@@ -9294,28 +9703,32 @@
       last = html;
       // Make sure we're not in a plaintext content element like script/style
       if (!lastTag || !isPlainTextElement(lastTag)) {
-        var textEnd = html.indexOf('<');
+        var textEnd = html.indexOf("<");
         if (textEnd === 0) {
           // Comment:
           if (comment.test(html)) {
-            var commentEnd = html.indexOf('-->');
+            var commentEnd = html.indexOf("-->");
 
             if (commentEnd >= 0) {
               if (options.shouldKeepComment) {
-                options.comment(html.substring(4, commentEnd), index, index + commentEnd + 3);
+                options.comment(
+                  html.substring(4, commentEnd),
+                  index,
+                  index + commentEnd + 3
+                );
               }
               advance(commentEnd + 3);
-              continue
+              continue;
             }
           }
 
           // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment
           if (conditionalComment.test(html)) {
-            var conditionalEnd = html.indexOf(']>');
+            var conditionalEnd = html.indexOf("]>");
 
             if (conditionalEnd >= 0) {
               advance(conditionalEnd + 2);
-              continue
+              continue;
             }
           }
 
@@ -9323,7 +9736,7 @@
           var doctypeMatch = html.match(doctype);
           if (doctypeMatch) {
             advance(doctypeMatch[0].length);
-            continue
+            continue;
           }
 
           // End tag:
@@ -9332,7 +9745,7 @@
             var curIndex = index;
             advance(endTagMatch[0].length);
             parseEndTag(endTagMatch[1], curIndex, index);
-            continue
+            continue;
           }
 
           // Start tag:
@@ -9342,11 +9755,13 @@
             if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {
               advance(1);
             }
-            continue
+            continue;
           }
         }
 
-        var text = (void 0), rest = (void 0), next = (void 0);
+        var text = void 0,
+          rest = void 0,
+          next = void 0;
         if (textEnd >= 0) {
           rest = html.slice(textEnd);
           while (
@@ -9356,8 +9771,10 @@
             !conditionalComment.test(rest)
           ) {
             // < in plain text, be forgiving and treat it as text
-            next = rest.indexOf('<', 1);
-            if (next < 0) { break }
+            next = rest.indexOf("<", 1);
+            if (next < 0) {
+              break;
+            }
             textEnd += next;
             rest = html.slice(textEnd);
           }
@@ -9378,13 +9795,18 @@
       } else {
         var endTagLength = 0;
         var stackedTag = lastTag.toLowerCase();
-        var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\s\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));
+        var reStackedTag =
+          reCache[stackedTag] ||
+          (reCache[stackedTag] = new RegExp(
+            "([\\s\\S]*?)(</" + stackedTag + "[^>]*>)",
+            "i"
+          ));
         var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {
           endTagLength = endTag.length;
-          if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
+          if (!isPlainTextElement(stackedTag) && stackedTag !== "noscript") {
             text = text
-              .replace(/<!\--([\s\S]*?)-->/g, '$1') // #7298
-              .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1');
+              .replace(/<!\--([\s\S]*?)-->/g, "$1") // #7298
+              .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, "$1");
           }
           if (shouldIgnoreFirstNewline(stackedTag, text)) {
             text = text.slice(1);
@@ -9392,7 +9814,7 @@
           if (options.chars) {
             options.chars(text);
           }
-          return ''
+          return "";
         });
         index += html.length - rest$1.length;
         html = rest$1;
@@ -9402,31 +9824,36 @@
       if (html === last) {
         options.chars && options.chars(html);
         if (!stack.length && options.warn) {
-          options.warn(("Mal-formatted tag at end of template: \"" + html + "\""), { start: index + html.length });
+          options.warn('Mal-formatted tag at end of template: "' + html + '"', {
+            start: index + html.length,
+          });
         }
-        break
+        break;
       }
     }
 
     // Clean up any remaining tags
     parseEndTag();
 
-    function advance (n) {
+    function advance(n) {
       index += n;
       html = html.substring(n);
     }
 
-    function parseStartTag () {
+    function parseStartTag() {
       var start = html.match(startTagOpen);
       if (start) {
         var match = {
           tagName: start[1],
           attrs: [],
-          start: index
+          start: index,
         };
         advance(start[0].length);
         var end, attr;
-        while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) {
+        while (
+          !(end = html.match(startTagClose)) &&
+          (attr = html.match(dynamicArgAttribute) || html.match(attribute))
+        ) {
           attr.start = index;
           advance(attr[0].length);
           attr.end = index;
@@ -9436,17 +9863,17 @@
           match.unarySlash = end[1];
           advance(end[0].length);
           match.end = index;
-          return match
+          return match;
         }
       }
     }
 
-    function handleStartTag (match) {
+    function handleStartTag(match) {
       var tagName = match.tagName;
       var unarySlash = match.unarySlash;
 
       if (expectHTML) {
-        if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
+        if (lastTag === "p" && isNonPhrasingTag(tagName)) {
           parseEndTag(lastTag);
         }
         if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {
@@ -9460,13 +9887,14 @@
       var attrs = new Array(l);
       for (var i = 0; i < l; i++) {
         var args = match.attrs[i];
-        var value = args[3] || args[4] || args[5] || '';
-        var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'
-          ? options.shouldDecodeNewlinesForHref
-          : options.shouldDecodeNewlines;
+        var value = args[3] || args[4] || args[5] || "";
+        var shouldDecodeNewlines =
+          tagName === "a" && args[1] === "href"
+            ? options.shouldDecodeNewlinesForHref
+            : options.shouldDecodeNewlines;
         attrs[i] = {
           name: args[1],
-          value: decodeAttr(value, shouldDecodeNewlines)
+          value: decodeAttr(value, shouldDecodeNewlines),
         };
         if (options.outputSourceRange) {
           attrs[i].start = args.start + args[0].match(/^\s*/).length;
@@ -9475,7 +9903,13 @@
       }
 
       if (!unary) {
-        stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end });
+        stack.push({
+          tag: tagName,
+          lowerCasedTag: tagName.toLowerCase(),
+          attrs: attrs,
+          start: match.start,
+          end: match.end,
+        });
         lastTag = tagName;
       }
 
@@ -9484,17 +9918,21 @@
       }
     }
 
-    function parseEndTag (tagName, start, end) {
+    function parseEndTag(tagName, start, end) {
       var pos, lowerCasedTagName;
-      if (start == null) { start = index; }
-      if (end == null) { end = index; }
+      if (start == null) {
+        start = index;
+      }
+      if (end == null) {
+        end = index;
+      }
 
       // Find the closest opened tag of the same type
       if (tagName) {
         lowerCasedTagName = tagName.toLowerCase();
         for (pos = stack.length - 1; pos >= 0; pos--) {
           if (stack[pos].lowerCasedTag === lowerCasedTagName) {
-            break
+            break;
           }
         }
       } else {
@@ -9505,11 +9943,9 @@
       if (pos >= 0) {
         // Close all the open elements, up the stack
         for (var i = stack.length - 1; i >= pos; i--) {
-          if (i > pos || !tagName &&
-            options.warn
-          ) {
+          if (i > pos || (!tagName && options.warn)) {
             options.warn(
-              ("tag <" + (stack[i].tag) + "> has no matching end tag."),
+              "tag <" + stack[i].tag + "> has no matching end tag.",
               { start: stack[i].start, end: stack[i].end }
             );
           }
@@ -9521,11 +9957,11 @@
         // Remove the open elements from the stack
         stack.length = pos;
         lastTag = pos && stack[pos - 1].tag;
-      } else if (lowerCasedTagName === 'br') {
+      } else if (lowerCasedTagName === "br") {
         if (options.start) {
           options.start(tagName, [], true, start, end);
         }
-      } else if (lowerCasedTagName === 'p') {
+      } else if (lowerCasedTagName === "p") {
         if (options.start) {
           options.start(tagName, [], false, start, end);
         }
@@ -9571,11 +10007,7 @@
   var platformGetTagNamespace;
   var maybeComponent;
 
-  function createASTElement (
-    tag,
-    attrs,
-    parent
-  ) {
+  function createASTElement(tag, attrs, parent) {
     return {
       type: 1,
       tag: tag,
@@ -9583,28 +10015,27 @@
       attrsMap: makeAttrsMap(attrs),
       rawAttrsMap: {},
       parent: parent,
-      children: []
-    }
+      children: [],
+    };
   }
 
   /**
    * Convert HTML string to AST.
    */
-  function parse (
-    template,
-    options
-  ) {
+  function parse(template, options) {
     warn$2 = options.warn || baseWarn;
 
     platformIsPreTag = options.isPreTag || no;
     platformMustUseProp = options.mustUseProp || no;
     platformGetTagNamespace = options.getTagNamespace || no;
     var isReservedTag = options.isReservedTag || no;
-    maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };
+    maybeComponent = function (el) {
+      return !!el.component || !isReservedTag(el.tag);
+    };
 
-    transforms = pluckModuleFunction(options.modules, 'transformNode');
-    preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');
-    postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');
+    transforms = pluckModuleFunction(options.modules, "transformNode");
+    preTransforms = pluckModuleFunction(options.modules, "preTransformNode");
+    postTransforms = pluckModuleFunction(options.modules, "postTransformNode");
 
     delimiters = options.delimiters;
 
@@ -9617,14 +10048,14 @@
     var inPre = false;
     var warned = false;
 
-    function warnOnce (msg, range) {
+    function warnOnce(msg, range) {
       if (!warned) {
         warned = true;
         warn$2(msg, range);
       }
     }
 
-    function closeElement (element) {
+    function closeElement(element) {
       trimEndingWhitespace(element);
       if (!inVPre && !element.processed) {
         element = processElement(element, options);
@@ -9638,13 +10069,13 @@
           }
           addIfCondition(root, {
             exp: element.elseif,
-            block: element
+            block: element,
           });
         } else {
           warnOnce(
             "Component template should contain exactly one root element. " +
-            "If you are using v-if on multiple elements, " +
-            "use v-else-if to chain them instead.",
+              "If you are using v-if on multiple elements, " +
+              "use v-else-if to chain them instead.",
             { start: element.start }
           );
         }
@@ -9657,8 +10088,10 @@
             // scoped slot
             // keep it in the children list so that v-else(-if) conditions can
             // find it as the prev node.
-            var name = element.slotTarget || '"default"'
-            ;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;
+            var name = element.slotTarget || '"default"';
+            (currentParent.scopedSlots || (currentParent.scopedSlots = {}))[
+              name
+            ] = element;
           }
           currentParent.children.push(element);
           element.parent = currentParent;
@@ -9667,7 +10100,9 @@
 
       // final children cleanup
       // filter out scoped slots
-      element.children = element.children.filter(function (c) { return !(c).slotScope; });
+      element.children = element.children.filter(function (c) {
+        return !c.slotScope;
+      });
       // remove trailing whitespace node again
       trimEndingWhitespace(element);
 
@@ -9684,33 +10119,35 @@
       }
     }
 
-    function trimEndingWhitespace (el) {
+    function trimEndingWhitespace(el) {
       // remove trailing whitespace node
       if (!inPre) {
         var lastNode;
         while (
           (lastNode = el.children[el.children.length - 1]) &&
           lastNode.type === 3 &&
-          lastNode.text === ' '
+          lastNode.text === " "
         ) {
           el.children.pop();
         }
       }
     }
 
-    function checkRootConstraints (el) {
-      if (el.tag === 'slot' || el.tag === 'template') {
+    function checkRootConstraints(el) {
+      if (el.tag === "slot" || el.tag === "template") {
         warnOnce(
-          "Cannot use <" + (el.tag) + "> as component root element because it may " +
-          'contain multiple nodes.',
+          "Cannot use <" +
+            el.tag +
+            "> as component root element because it may " +
+            "contain multiple nodes.",
           { start: el.start }
         );
       }
-      if (el.attrsMap.hasOwnProperty('v-for')) {
+      if (el.attrsMap.hasOwnProperty("v-for")) {
         warnOnce(
-          'Cannot use v-for on stateful component root element because ' +
-          'it renders multiple elements.',
-          el.rawAttrsMap['v-for']
+          "Cannot use v-for on stateful component root element because " +
+            "it renders multiple elements.",
+          el.rawAttrsMap["v-for"]
         );
       }
     }
@@ -9724,14 +10161,15 @@
       shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,
       shouldKeepComment: options.comments,
       outputSourceRange: options.outputSourceRange,
-      start: function start (tag, attrs, unary, start$1, end) {
+      start: function start(tag, attrs, unary, start$1, end) {
         // check namespace.
         // inherit parent ns if there is one
-        var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
+        var ns =
+          (currentParent && currentParent.ns) || platformGetTagNamespace(tag);
 
         // handle IE svg bug
         /* istanbul ignore if */
-        if (isIE && ns === 'svg') {
+        if (isIE && ns === "svg") {
           attrs = guardIESVGBug(attrs);
         }
 
@@ -9744,19 +10182,23 @@
           if (options.outputSourceRange) {
             element.start = start$1;
             element.end = end;
-            element.rawAttrsMap = element.attrsList.reduce(function (cumulated, attr) {
+            element.rawAttrsMap = element.attrsList.reduce(function (
+              cumulated,
+              attr
+            ) {
               cumulated[attr.name] = attr;
-              return cumulated
-            }, {});
+              return cumulated;
+            },
+            {});
           }
           attrs.forEach(function (attr) {
             if (invalidAttributeRE.test(attr.name)) {
               warn$2(
                 "Invalid dynamic argument expression: attribute names cannot contain " +
-                "spaces, quotes, <, >, / or =.",
+                  "spaces, quotes, <, >, / or =.",
                 {
                   start: attr.start + attr.name.indexOf("["),
-                  end: attr.start + attr.name.length
+                  end: attr.start + attr.name.length,
                 }
               );
             }
@@ -9766,9 +10208,12 @@
         if (isForbiddenTag(element) && !isServerRendering()) {
           element.forbidden = true;
           warn$2(
-            'Templates should only be responsible for mapping the state to the ' +
-            'UI. Avoid placing tags with side-effects in your templates, such as ' +
-            "<" + tag + ">" + ', as they will not be parsed.',
+            "Templates should only be responsible for mapping the state to the " +
+              "UI. Avoid placing tags with side-effects in your templates, such as " +
+              "<" +
+              tag +
+              ">" +
+              ", as they will not be parsed.",
             { start: element.start }
           );
         }
@@ -9811,7 +10256,7 @@
         }
       },
 
-      end: function end (tag, start, end$1) {
+      end: function end(tag, start, end$1) {
         var element = stack[stack.length - 1];
         // pop stack
         stack.length -= 1;
@@ -9822,66 +10267,71 @@
         closeElement(element);
       },
 
-      chars: function chars (text, start, end) {
+      chars: function chars(text, start, end) {
         if (!currentParent) {
           {
             if (text === template) {
               warnOnce(
-                'Component template requires a root element, rather than just text.',
+                "Component template requires a root element, rather than just text.",
                 { start: start }
               );
             } else if ((text = text.trim())) {
               warnOnce(
-                ("text \"" + text + "\" outside root element will be ignored."),
+                'text "' + text + '" outside root element will be ignored.',
                 { start: start }
               );
             }
           }
-          return
+          return;
         }
         // IE textarea placeholder bug
         /* istanbul ignore if */
-        if (isIE &&
-          currentParent.tag === 'textarea' &&
+        if (
+          isIE &&
+          currentParent.tag === "textarea" &&
           currentParent.attrsMap.placeholder === text
         ) {
-          return
+          return;
         }
         var children = currentParent.children;
         if (inPre || text.trim()) {
           text = isTextTag(currentParent) ? text : decodeHTMLCached(text);
         } else if (!children.length) {
           // remove the whitespace-only node right after an opening tag
-          text = '';
+          text = "";
         } else if (whitespaceOption) {
-          if (whitespaceOption === 'condense') {
+          if (whitespaceOption === "condense") {
             // in condense mode, remove the whitespace node if it contains
             // line break, otherwise condense to a single space
-            text = lineBreakRE.test(text) ? '' : ' ';
+            text = lineBreakRE.test(text) ? "" : " ";
           } else {
-            text = ' ';
+            text = " ";
           }
         } else {
-          text = preserveWhitespace ? ' ' : '';
+          text = preserveWhitespace ? " " : "";
         }
         if (text) {
-          if (!inPre && whitespaceOption === 'condense') {
+          if (!inPre && whitespaceOption === "condense") {
             // condense consecutive whitespaces into single space
-            text = text.replace(whitespaceRE$1, ' ');
+            text = text.replace(whitespaceRE$1, " ");
           }
           var res;
           var child;
-          if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {
+          if (!inVPre && text !== " " && (res = parseText(text, delimiters))) {
             child = {
               type: 2,
               expression: res.expression,
               tokens: res.tokens,
-              text: text
+              text: text,
             };
-          } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {
+          } else if (
+            text !== " " ||
+            !children.length ||
+            children[children.length - 1].text !== " "
+          ) {
             child = {
               type: 3,
-              text: text
+              text: text,
             };
           }
           if (child) {
@@ -9893,14 +10343,14 @@
           }
         }
       },
-      comment: function comment (text, start, end) {
+      comment: function comment(text, start, end) {
         // adding anything as a sibling to the root node is forbidden
         // comments should still be allowed, but ignored
         if (currentParent) {
           var child = {
             type: 3,
             text: text,
-            isComment: true
+            isComment: true,
           };
           if (options.outputSourceRange) {
             child.start = start;
@@ -9908,26 +10358,26 @@
           }
           currentParent.children.push(child);
         }
-      }
+      },
     });
-    return root
+    return root;
   }
 
-  function processPre (el) {
-    if (getAndRemoveAttr(el, 'v-pre') != null) {
+  function processPre(el) {
+    if (getAndRemoveAttr(el, "v-pre") != null) {
       el.pre = true;
     }
   }
 
-  function processRawAttrs (el) {
+  function processRawAttrs(el) {
     var list = el.attrsList;
     var len = list.length;
     if (len) {
-      var attrs = el.attrs = new Array(len);
+      var attrs = (el.attrs = new Array(len));
       for (var i = 0; i < len; i++) {
         attrs[i] = {
           name: list[i].name,
-          value: JSON.stringify(list[i].value)
+          value: JSON.stringify(list[i].value),
         };
         if (list[i].start != null) {
           attrs[i].start = list[i].start;
@@ -9940,19 +10390,13 @@
     }
   }
 
-  function processElement (
-    element,
-    options
-  ) {
+  function processElement(element, options) {
     processKey(element);
 
     // determine whether this is a plain element after
     // removing structural attributes
-    element.plain = (
-      !element.key &&
-      !element.scopedSlots &&
-      !element.attrsList.length
-    );
+    element.plain =
+      !element.key && !element.scopedSlots && !element.attrsList.length;
 
     processRef(element);
     processSlotContent(element);
@@ -9962,27 +10406,32 @@
       element = transforms[i](element, options) || element;
     }
     processAttrs(element);
-    return element
+    return element;
   }
 
-  function processKey (el) {
-    var exp = getBindingAttr(el, 'key');
+  function processKey(el) {
+    var exp = getBindingAttr(el, "key");
     if (exp) {
       {
-        if (el.tag === 'template') {
+        if (el.tag === "template") {
           warn$2(
             "<template> cannot be keyed. Place the key on real elements instead.",
-            getRawBindingAttr(el, 'key')
+            getRawBindingAttr(el, "key")
           );
         }
         if (el.for) {
           var iterator = el.iterator2 || el.iterator1;
           var parent = el.parent;
-          if (iterator && iterator === exp && parent && parent.tag === 'transition-group') {
+          if (
+            iterator &&
+            iterator === exp &&
+            parent &&
+            parent.tag === "transition-group"
+          ) {
             warn$2(
               "Do not use v-for index as key on <transition-group> children, " +
-              "this is the same as not using keys.",
-              getRawBindingAttr(el, 'key'),
+                "this is the same as not using keys.",
+              getRawBindingAttr(el, "key"),
               true /* tip */
             );
           }
@@ -9992,40 +10441,37 @@
     }
   }
 
-  function processRef (el) {
-    var ref = getBindingAttr(el, 'ref');
+  function processRef(el) {
+    var ref = getBindingAttr(el, "ref");
     if (ref) {
       el.ref = ref;
       el.refInFor = checkInFor(el);
     }
   }
 
-  function processFor (el) {
+  function processFor(el) {
     var exp;
-    if ((exp = getAndRemoveAttr(el, 'v-for'))) {
+    if ((exp = getAndRemoveAttr(el, "v-for"))) {
       var res = parseFor(exp);
       if (res) {
         extend(el, res);
       } else {
-        warn$2(
-          ("Invalid v-for expression: " + exp),
-          el.rawAttrsMap['v-for']
-        );
+        warn$2("Invalid v-for expression: " + exp, el.rawAttrsMap["v-for"]);
       }
     }
   }
 
-
-
-  function parseFor (exp) {
+  function parseFor(exp) {
     var inMatch = exp.match(forAliasRE);
-    if (!inMatch) { return }
+    if (!inMatch) {
+      return;
+    }
     var res = {};
     res.for = inMatch[2].trim();
-    var alias = inMatch[1].trim().replace(stripParensRE, '');
+    var alias = inMatch[1].trim().replace(stripParensRE, "");
     var iteratorMatch = alias.match(forIteratorRE);
     if (iteratorMatch) {
-      res.alias = alias.replace(forIteratorRE, '').trim();
+      res.alias = alias.replace(forIteratorRE, "").trim();
       res.iterator1 = iteratorMatch[1].trim();
       if (iteratorMatch[2]) {
         res.iterator2 = iteratorMatch[2].trim();
@@ -10033,54 +10479,60 @@
     } else {
       res.alias = alias;
     }
-    return res
+    return res;
   }
 
-  function processIf (el) {
-    var exp = getAndRemoveAttr(el, 'v-if');
+  function processIf(el) {
+    var exp = getAndRemoveAttr(el, "v-if");
     if (exp) {
       el.if = exp;
       addIfCondition(el, {
         exp: exp,
-        block: el
+        block: el,
       });
     } else {
-      if (getAndRemoveAttr(el, 'v-else') != null) {
+      if (getAndRemoveAttr(el, "v-else") != null) {
         el.else = true;
       }
-      var elseif = getAndRemoveAttr(el, 'v-else-if');
+      var elseif = getAndRemoveAttr(el, "v-else-if");
       if (elseif) {
         el.elseif = elseif;
       }
     }
   }
 
-  function processIfConditions (el, parent) {
+  function processIfConditions(el, parent) {
     var prev = findPrevElement(parent.children);
     if (prev && prev.if) {
       addIfCondition(prev, {
         exp: el.elseif,
-        block: el
+        block: el,
       });
     } else {
       warn$2(
-        "v-" + (el.elseif ? ('else-if="' + el.elseif + '"') : 'else') + " " +
-        "used on element <" + (el.tag) + "> without corresponding v-if.",
-        el.rawAttrsMap[el.elseif ? 'v-else-if' : 'v-else']
+        "v-" +
+          (el.elseif ? 'else-if="' + el.elseif + '"' : "else") +
+          " " +
+          "used on element <" +
+          el.tag +
+          "> without corresponding v-if.",
+        el.rawAttrsMap[el.elseif ? "v-else-if" : "v-else"]
       );
     }
   }
 
-  function findPrevElement (children) {
+  function findPrevElement(children) {
     var i = children.length;
     while (i--) {
       if (children[i].type === 1) {
-        return children[i]
+        return children[i];
       } else {
-        if (children[i].text !== ' ') {
+        if (children[i].text !== " ") {
           warn$2(
-            "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " +
-            "will be ignored.",
+            'text "' +
+              children[i].text.trim() +
+              '" between v-if and v-else(-if) ' +
+              "will be ignored.",
             children[i]
           );
         }
@@ -10089,15 +10541,15 @@
     }
   }
 
-  function addIfCondition (el, condition) {
+  function addIfCondition(el, condition) {
     if (!el.ifConditions) {
       el.ifConditions = [];
     }
     el.ifConditions.push(condition);
   }
 
-  function processOnce (el) {
-    var once$$1 = getAndRemoveAttr(el, 'v-once');
+  function processOnce(el) {
+    var once$$1 = getAndRemoveAttr(el, "v-once");
     if (once$$1 != null) {
       el.once = true;
     }
@@ -10105,30 +10557,32 @@
 
   // handle content being passed to a component as slot,
   // e.g. <template slot="xxx">, <div slot-scope="xxx">
-  function processSlotContent (el) {
+  function processSlotContent(el) {
     var slotScope;
-    if (el.tag === 'template') {
-      slotScope = getAndRemoveAttr(el, 'scope');
+    if (el.tag === "template") {
+      slotScope = getAndRemoveAttr(el, "scope");
       /* istanbul ignore if */
       if (slotScope) {
         warn$2(
-          "the \"scope\" attribute for scoped slots have been deprecated and " +
-          "replaced by \"slot-scope\" since 2.5. The new \"slot-scope\" attribute " +
-          "can also be used on plain elements in addition to <template> to " +
-          "denote scoped slots.",
-          el.rawAttrsMap['scope'],
+          'the "scope" attribute for scoped slots have been deprecated and ' +
+            'replaced by "slot-scope" since 2.5. The new "slot-scope" attribute ' +
+            "can also be used on plain elements in addition to <template> to " +
+            "denote scoped slots.",
+          el.rawAttrsMap["scope"],
           true
         );
       }
-      el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');
-    } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {
+      el.slotScope = slotScope || getAndRemoveAttr(el, "slot-scope");
+    } else if ((slotScope = getAndRemoveAttr(el, "slot-scope"))) {
       /* istanbul ignore if */
-      if (el.attrsMap['v-for']) {
+      if (el.attrsMap["v-for"]) {
         warn$2(
-          "Ambiguous combined usage of slot-scope and v-for on <" + (el.tag) + "> " +
-          "(v-for takes higher priority). Use a wrapper <template> for the " +
-          "scoped slot to make it clearer.",
-          el.rawAttrsMap['slot-scope'],
+          "Ambiguous combined usage of slot-scope and v-for on <" +
+            el.tag +
+            "> " +
+            "(v-for takes higher priority). Use a wrapper <template> for the " +
+            "scoped slot to make it clearer.",
+          el.rawAttrsMap["slot-scope"],
           true
         );
       }
@@ -10136,34 +10590,33 @@
     }
 
     // slot="xxx"
-    var slotTarget = getBindingAttr(el, 'slot');
+    var slotTarget = getBindingAttr(el, "slot");
     if (slotTarget) {
       el.slotTarget = slotTarget === '""' ? '"default"' : slotTarget;
-      el.slotTargetDynamic = !!(el.attrsMap[':slot'] || el.attrsMap['v-bind:slot']);
+      el.slotTargetDynamic = !!(
+        el.attrsMap[":slot"] || el.attrsMap["v-bind:slot"]
+      );
       // preserve slot as an attribute for native shadow DOM compat
       // only for non-scoped slots.
-      if (el.tag !== 'template' && !el.slotScope) {
-        addAttr(el, 'slot', slotTarget, getRawBindingAttr(el, 'slot'));
+      if (el.tag !== "template" && !el.slotScope) {
+        addAttr(el, "slot", slotTarget, getRawBindingAttr(el, "slot"));
       }
     }
 
     // 2.6 v-slot syntax
     {
-      if (el.tag === 'template') {
+      if (el.tag === "template") {
         // v-slot on <template>
         var slotBinding = getAndRemoveAttrByRegex(el, slotRE);
         if (slotBinding) {
           {
             if (el.slotTarget || el.slotScope) {
-              warn$2(
-                "Unexpected mixed usage of different slot syntaxes.",
-                el
-              );
+              warn$2("Unexpected mixed usage of different slot syntaxes.", el);
             }
             if (el.parent && !maybeComponent(el.parent)) {
               warn$2(
                 "<template v-slot> can only appear at the root level inside " +
-                "the receiving component",
+                  "the receiving component",
                 el
               );
             }
@@ -10187,15 +10640,12 @@
               );
             }
             if (el.slotScope || el.slotTarget) {
-              warn$2(
-                "Unexpected mixed usage of different slot syntaxes.",
-                el
-              );
+              warn$2("Unexpected mixed usage of different slot syntaxes.", el);
             }
             if (el.scopedSlots) {
               warn$2(
                 "To avoid scope ambiguity, the default slot should also use " +
-                "<template> syntax when there are other named slots.",
+                  "<template> syntax when there are other named slots.",
                 slotBinding$1
               );
             }
@@ -10205,13 +10655,17 @@
           var ref$1 = getSlotName(slotBinding$1);
           var name$1 = ref$1.name;
           var dynamic$1 = ref$1.dynamic;
-          var slotContainer = slots[name$1] = createASTElement('template', [], el);
+          var slotContainer = (slots[name$1] = createASTElement(
+            "template",
+            [],
+            el
+          ));
           slotContainer.slotTarget = name$1;
           slotContainer.slotTargetDynamic = dynamic$1;
           slotContainer.children = el.children.filter(function (c) {
             if (!c.slotScope) {
               c.parent = slotContainer;
-              return true
+              return true;
             }
           });
           slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;
@@ -10224,51 +10678,48 @@
     }
   }
 
-  function getSlotName (binding) {
-    var name = binding.name.replace(slotRE, '');
+  function getSlotName(binding) {
+    var name = binding.name.replace(slotRE, "");
     if (!name) {
-      if (binding.name[0] !== '#') {
-        name = 'default';
+      if (binding.name[0] !== "#") {
+        name = "default";
       } else {
-        warn$2(
-          "v-slot shorthand syntax requires a slot name.",
-          binding
-        );
+        warn$2("v-slot shorthand syntax requires a slot name.", binding);
       }
     }
     return dynamicArgRE.test(name)
-      // dynamic [name]
-      ? { name: name.slice(1, -1), dynamic: true }
-      // static name
-      : { name: ("\"" + name + "\""), dynamic: false }
+      ? // dynamic [name]
+        { name: name.slice(1, -1), dynamic: true }
+      : // static name
+        { name: '"' + name + '"', dynamic: false };
   }
 
   // handle <slot/> outlets
-  function processSlotOutlet (el) {
-    if (el.tag === 'slot') {
-      el.slotName = getBindingAttr(el, 'name');
+  function processSlotOutlet(el) {
+    if (el.tag === "slot") {
+      el.slotName = getBindingAttr(el, "name");
       if (el.key) {
         warn$2(
           "`key` does not work on <slot> because slots are abstract outlets " +
-          "and can possibly expand into multiple elements. " +
-          "Use the key on a wrapping element instead.",
-          getRawBindingAttr(el, 'key')
+            "and can possibly expand into multiple elements. " +
+            "Use the key on a wrapping element instead.",
+          getRawBindingAttr(el, "key")
         );
       }
     }
   }
 
-  function processComponent (el) {
+  function processComponent(el) {
     var binding;
-    if ((binding = getBindingAttr(el, 'is'))) {
+    if ((binding = getBindingAttr(el, "is"))) {
       el.component = binding;
     }
-    if (getAndRemoveAttr(el, 'inline-template') != null) {
+    if (getAndRemoveAttr(el, "inline-template") != null) {
       el.inlineTemplate = true;
     }
   }
 
-  function processAttrs (el) {
+  function processAttrs(el) {
     var list = el.attrsList;
     var i, l, name, rawName, value, modifiers, syncGen, isDynamic;
     for (i = 0, l = list.length; i < l; i++) {
@@ -10278,29 +10729,32 @@
         // mark element as dynamic
         el.hasBindings = true;
         // modifiers
-        modifiers = parseModifiers(name.replace(dirRE, ''));
+        modifiers = parseModifiers(name.replace(dirRE, ""));
         // support .foo shorthand syntax for the .prop modifier
         if (modifiers) {
-          name = name.replace(modifierRE, '');
+          name = name.replace(modifierRE, "");
         }
-        if (bindRE.test(name)) { // v-bind
-          name = name.replace(bindRE, '');
+        if (bindRE.test(name)) {
+          // v-bind
+          name = name.replace(bindRE, "");
           value = parseFilters(value);
           isDynamic = dynamicArgRE.test(name);
           if (isDynamic) {
             name = name.slice(1, -1);
           }
-          if (
-            value.trim().length === 0
-          ) {
+          if (value.trim().length === 0) {
             warn$2(
-              ("The value for a v-bind expression cannot be empty. Found in \"v-bind:" + name + "\"")
+              'The value for a v-bind expression cannot be empty. Found in "v-bind:' +
+                name +
+                '"'
             );
           }
           if (modifiers) {
             if (modifiers.prop && !isDynamic) {
               name = camelize(name);
-              if (name === 'innerHtml') { name = 'innerHTML'; }
+              if (name === "innerHtml") {
+                name = "innerHTML";
+              }
             }
             if (modifiers.camel && !isDynamic) {
               name = camelize(name);
@@ -10310,7 +10764,7 @@
               if (!isDynamic) {
                 addHandler(
                   el,
-                  ("update:" + (camelize(name))),
+                  "update:" + camelize(name),
                   syncGen,
                   null,
                   false,
@@ -10320,7 +10774,7 @@
                 if (hyphenate(name) !== camelize(name)) {
                   addHandler(
                     el,
-                    ("update:" + (hyphenate(name))),
+                    "update:" + hyphenate(name),
                     syncGen,
                     null,
                     false,
@@ -10332,7 +10786,7 @@
                 // handler w/ dynamic event name
                 addHandler(
                   el,
-                  ("\"update:\"+(" + name + ")"),
+                  '"update:"+(' + name + ")",
                   syncGen,
                   null,
                   false,
@@ -10343,22 +10797,35 @@
               }
             }
           }
-          if ((modifiers && modifiers.prop) || (
-            !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
-          )) {
+          if (
+            (modifiers && modifiers.prop) ||
+            (!el.component &&
+              platformMustUseProp(el.tag, el.attrsMap.type, name))
+          ) {
             addProp(el, name, value, list[i], isDynamic);
           } else {
             addAttr(el, name, value, list[i], isDynamic);
           }
-        } else if (onRE.test(name)) { // v-on
-          name = name.replace(onRE, '');
+        } else if (onRE.test(name)) {
+          // v-on
+          name = name.replace(onRE, "");
           isDynamic = dynamicArgRE.test(name);
           if (isDynamic) {
             name = name.slice(1, -1);
           }
-          addHandler(el, name, value, modifiers, false, warn$2, list[i], isDynamic);
-        } else { // normal directives
-          name = name.replace(dirRE, '');
+          addHandler(
+            el,
+            name,
+            value,
+            modifiers,
+            false,
+            warn$2,
+            list[i],
+            isDynamic
+          );
+        } else {
+          // normal directives
+          name = name.replace(dirRE, "");
           // parse arg
           var argMatch = name.match(argRE);
           var arg = argMatch && argMatch[1];
@@ -10370,8 +10837,17 @@
               isDynamic = true;
             }
           }
-          addDirective(el, name, rawName, value, arg, isDynamic, modifiers, list[i]);
-          if (name === 'model') {
+          addDirective(
+            el,
+            name,
+            rawName,
+            value,
+            arg,
+            isDynamic,
+            modifiers,
+            list[i]
+          );
+          if (name === "model") {
             checkForAliasModel(el, value);
           }
         }
@@ -10381,10 +10857,13 @@
           var res = parseText(value, delimiters);
           if (res) {
             warn$2(
-              name + "=\"" + value + "\": " +
-              'Interpolation inside attributes has been removed. ' +
-              'Use v-bind or the colon shorthand instead. For example, ' +
-              'instead of <div id="{{ val }}">, use <div :id="val">.',
+              name +
+                '="' +
+                value +
+                '": ' +
+                "Interpolation inside attributes has been removed. " +
+                "Use v-bind or the colon shorthand instead. For example, " +
+                'instead of <div id="{{ val }}">, use <div :id="val">.',
               list[i]
             );
           }
@@ -10392,90 +10871,94 @@
         addAttr(el, name, JSON.stringify(value), list[i]);
         // #6887 firefox doesn't update muted state if set via attribute
         // even immediately after element creation
-        if (!el.component &&
-            name === 'muted' &&
-            platformMustUseProp(el.tag, el.attrsMap.type, name)) {
-          addProp(el, name, 'true', list[i]);
+        if (
+          !el.component &&
+          name === "muted" &&
+          platformMustUseProp(el.tag, el.attrsMap.type, name)
+        ) {
+          addProp(el, name, "true", list[i]);
         }
       }
     }
   }
 
-  function checkInFor (el) {
+  function checkInFor(el) {
     var parent = el;
     while (parent) {
       if (parent.for !== undefined) {
-        return true
+        return true;
       }
       parent = parent.parent;
     }
-    return false
+    return false;
   }
 
-  function parseModifiers (name) {
+  function parseModifiers(name) {
     var match = name.match(modifierRE);
     if (match) {
       var ret = {};
-      match.forEach(function (m) { ret[m.slice(1)] = true; });
-      return ret
+      match.forEach(function (m) {
+        ret[m.slice(1)] = true;
+      });
+      return ret;
     }
   }
 
-  function makeAttrsMap (attrs) {
+  function makeAttrsMap(attrs) {
     var map = {};
     for (var i = 0, l = attrs.length; i < l; i++) {
-      if (
-        map[attrs[i].name] && !isIE && !isEdge
-      ) {
-        warn$2('duplicate attribute: ' + attrs[i].name, attrs[i]);
+      if (map[attrs[i].name] && !isIE && !isEdge) {
+        warn$2("duplicate attribute: " + attrs[i].name, attrs[i]);
       }
       map[attrs[i].name] = attrs[i].value;
     }
-    return map
+    return map;
   }
 
   // for script (e.g. type="x/template") or style, do not decode content
-  function isTextTag (el) {
-    return el.tag === 'script' || el.tag === 'style'
+  function isTextTag(el) {
+    return el.tag === "script" || el.tag === "style";
   }
 
-  function isForbiddenTag (el) {
+  function isForbiddenTag(el) {
     return (
-      el.tag === 'style' ||
-      (el.tag === 'script' && (
-        !el.attrsMap.type ||
-        el.attrsMap.type === 'text/javascript'
-      ))
-    )
+      el.tag === "style" ||
+      (el.tag === "script" &&
+        (!el.attrsMap.type || el.attrsMap.type === "text/javascript"))
+    );
   }
 
   var ieNSBug = /^xmlns:NS\d+/;
   var ieNSPrefix = /^NS\d+:/;
 
   /* istanbul ignore next */
-  function guardIESVGBug (attrs) {
+  function guardIESVGBug(attrs) {
     var res = [];
     for (var i = 0; i < attrs.length; i++) {
       var attr = attrs[i];
       if (!ieNSBug.test(attr.name)) {
-        attr.name = attr.name.replace(ieNSPrefix, '');
+        attr.name = attr.name.replace(ieNSPrefix, "");
         res.push(attr);
       }
     }
-    return res
+    return res;
   }
 
-  function checkForAliasModel (el, value) {
+  function checkForAliasModel(el, value) {
     var _el = el;
     while (_el) {
       if (_el.for && _el.alias === value) {
         warn$2(
-          "<" + (el.tag) + " v-model=\"" + value + "\">: " +
-          "You are binding v-model directly to a v-for iteration alias. " +
-          "This will not be able to modify the v-for source array because " +
-          "writing to the alias is like modifying a function local variable. " +
-          "Consider using an array of objects and use v-model on an object property instead.",
-          el.rawAttrsMap['v-model']
+          "<" +
+            el.tag +
+            ' v-model="' +
+            value +
+            '">: ' +
+            "You are binding v-model directly to a v-for iteration alias. " +
+            "This will not be able to modify the v-for source array because " +
+            "writing to the alias is like modifying a function local variable. " +
+            "Consider using an array of objects and use v-model on an object property instead.",
+          el.rawAttrsMap["v-model"]
         );
       }
       _el = _el.parent;
@@ -10484,55 +10967,55 @@
 
   /*  */
 
-  function preTransformNode (el, options) {
-    if (el.tag === 'input') {
+  function preTransformNode(el, options) {
+    if (el.tag === "input") {
       var map = el.attrsMap;
-      if (!map['v-model']) {
-        return
+      if (!map["v-model"]) {
+        return;
       }
 
       var typeBinding;
-      if (map[':type'] || map['v-bind:type']) {
-        typeBinding = getBindingAttr(el, 'type');
+      if (map[":type"] || map["v-bind:type"]) {
+        typeBinding = getBindingAttr(el, "type");
       }
-      if (!map.type && !typeBinding && map['v-bind']) {
-        typeBinding = "(" + (map['v-bind']) + ").type";
+      if (!map.type && !typeBinding && map["v-bind"]) {
+        typeBinding = "(" + map["v-bind"] + ").type";
       }
 
       if (typeBinding) {
-        var ifCondition = getAndRemoveAttr(el, 'v-if', true);
-        var ifConditionExtra = ifCondition ? ("&&(" + ifCondition + ")") : "";
-        var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;
-        var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);
+        var ifCondition = getAndRemoveAttr(el, "v-if", true);
+        var ifConditionExtra = ifCondition ? "&&(" + ifCondition + ")" : "";
+        var hasElse = getAndRemoveAttr(el, "v-else", true) != null;
+        var elseIfCondition = getAndRemoveAttr(el, "v-else-if", true);
         // 1. checkbox
         var branch0 = cloneASTElement(el);
         // process for on the main node
         processFor(branch0);
-        addRawAttr(branch0, 'type', 'checkbox');
+        addRawAttr(branch0, "type", "checkbox");
         processElement(branch0, options);
         branch0.processed = true; // prevent it from double-processed
         branch0.if = "(" + typeBinding + ")==='checkbox'" + ifConditionExtra;
         addIfCondition(branch0, {
           exp: branch0.if,
-          block: branch0
+          block: branch0,
         });
         // 2. add radio else-if condition
         var branch1 = cloneASTElement(el);
-        getAndRemoveAttr(branch1, 'v-for', true);
-        addRawAttr(branch1, 'type', 'radio');
+        getAndRemoveAttr(branch1, "v-for", true);
+        addRawAttr(branch1, "type", "radio");
         processElement(branch1, options);
         addIfCondition(branch0, {
           exp: "(" + typeBinding + ")==='radio'" + ifConditionExtra,
-          block: branch1
+          block: branch1,
         });
         // 3. other
         var branch2 = cloneASTElement(el);
-        getAndRemoveAttr(branch2, 'v-for', true);
-        addRawAttr(branch2, ':type', typeBinding);
+        getAndRemoveAttr(branch2, "v-for", true);
+        addRawAttr(branch2, ":type", typeBinding);
         processElement(branch2, options);
         addIfCondition(branch0, {
           exp: ifCondition,
-          block: branch2
+          block: branch2,
         });
 
         if (hasElse) {
@@ -10541,45 +11024,41 @@
           branch0.elseif = elseIfCondition;
         }
 
-        return branch0
+        return branch0;
       }
     }
   }
 
-  function cloneASTElement (el) {
-    return createASTElement(el.tag, el.attrsList.slice(), el.parent)
+  function cloneASTElement(el) {
+    return createASTElement(el.tag, el.attrsList.slice(), el.parent);
   }
 
   var model$1 = {
-    preTransformNode: preTransformNode
+    preTransformNode: preTransformNode,
   };
 
-  var modules$1 = [
-    klass$1,
-    style$1,
-    model$1
-  ];
+  var modules$1 = [klass$1, style$1, model$1];
 
   /*  */
 
-  function text (el, dir) {
+  function text(el, dir) {
     if (dir.value) {
-      addProp(el, 'textContent', ("_s(" + (dir.value) + ")"), dir);
+      addProp(el, "textContent", "_s(" + dir.value + ")", dir);
     }
   }
 
   /*  */
 
-  function html (el, dir) {
+  function html(el, dir) {
     if (dir.value) {
-      addProp(el, 'innerHTML', ("_s(" + (dir.value) + ")"), dir);
+      addProp(el, "innerHTML", "_s(" + dir.value + ")", dir);
     }
   }
 
   var directives$1 = {
     model: model,
     text: text,
-    html: html
+    html: html,
   };
 
   /*  */
@@ -10594,7 +11073,7 @@
     canBeLeftOpenTag: canBeLeftOpenTag,
     isReservedTag: isReservedTag,
     getTagNamespace: getTagNamespace,
-    staticKeys: genStaticKeys(modules$1)
+    staticKeys: genStaticKeys(modules$1),
   };
 
   /*  */
@@ -10615,9 +11094,11 @@
    *    create fresh nodes for them on each re-render;
    * 2. Completely skip them in the patching process.
    */
-  function optimize (root, options) {
-    if (!root) { return }
-    isStaticKey = genStaticKeysCached(options.staticKeys || '');
+  function optimize(root, options) {
+    if (!root) {
+      return;
+    }
+    isStaticKey = genStaticKeysCached(options.staticKeys || "");
     isPlatformReservedTag = options.isReservedTag || no;
     // first pass: mark all non-static nodes.
     markStatic$1(root);
@@ -10625,14 +11106,14 @@
     markStaticRoots(root, false);
   }
 
-  function genStaticKeys$1 (keys) {
+  function genStaticKeys$1(keys) {
     return makeMap(
-      'type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap' +
-      (keys ? ',' + keys : '')
-    )
+      "type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap" +
+        (keys ? "," + keys : "")
+    );
   }
 
-  function markStatic$1 (node) {
+  function markStatic$1(node) {
     node.static = isStatic(node);
     if (node.type === 1) {
       // do not make component slot content static. this avoids
@@ -10640,10 +11121,10 @@
       // 2. static slot content fails for hot-reloading
       if (
         !isPlatformReservedTag(node.tag) &&
-        node.tag !== 'slot' &&
-        node.attrsMap['inline-template'] == null
+        node.tag !== "slot" &&
+        node.attrsMap["inline-template"] == null
       ) {
-        return
+        return;
       }
       for (var i = 0, l = node.children.length; i < l; i++) {
         var child = node.children[i];
@@ -10664,7 +11145,7 @@
     }
   }
 
-  function markStaticRoots (node, isInFor) {
+  function markStaticRoots(node, isInFor) {
     if (node.type === 1) {
       if (node.static || node.once) {
         node.staticInFor = isInFor;
@@ -10672,12 +11153,13 @@
       // For a node to qualify as a static root, it should have children that
       // are not just static text. Otherwise the cost of hoisting out will
       // outweigh the benefits and it's better off to just always render it fresh.
-      if (node.static && node.children.length && !(
-        node.children.length === 1 &&
-        node.children[0].type === 3
-      )) {
+      if (
+        node.static &&
+        node.children.length &&
+        !(node.children.length === 1 && node.children[0].type === 3)
+      ) {
         node.staticRoot = true;
-        return
+        return;
       } else {
         node.staticRoot = false;
       }
@@ -10694,41 +11176,46 @@
     }
   }
 
-  function isStatic (node) {
-    if (node.type === 2) { // expression
-      return false
+  function isStatic(node) {
+    if (node.type === 2) {
+      // expression
+      return false;
     }
-    if (node.type === 3) { // text
-      return true
+    if (node.type === 3) {
+      // text
+      return true;
     }
-    return !!(node.pre || (
-      !node.hasBindings && // no dynamic bindings
-      !node.if && !node.for && // not v-if or v-for or v-else
-      !isBuiltInTag(node.tag) && // not a built-in
-      isPlatformReservedTag(node.tag) && // not a component
-      !isDirectChildOfTemplateFor(node) &&
-      Object.keys(node).every(isStaticKey)
-    ))
+    return !!(
+      node.pre ||
+      (!node.hasBindings && // no dynamic bindings
+        !node.if &&
+        !node.for && // not v-if or v-for or v-else
+        !isBuiltInTag(node.tag) && // not a built-in
+        isPlatformReservedTag(node.tag) && // not a component
+        !isDirectChildOfTemplateFor(node) &&
+        Object.keys(node).every(isStaticKey))
+    );
   }
 
-  function isDirectChildOfTemplateFor (node) {
+  function isDirectChildOfTemplateFor(node) {
     while (node.parent) {
       node = node.parent;
-      if (node.tag !== 'template') {
-        return false
+      if (node.tag !== "template") {
+        return false;
       }
       if (node.for) {
-        return true
+        return true;
       }
     }
-    return false
+    return false;
   }
 
   /*  */
 
   var fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/;
   var fnInvokeRE = /\([^)]*?\);*$/;
-  var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
+  var simplePathRE =
+    /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
 
   // KeyboardEvent.keyCode aliases
   var keyCodes = {
@@ -10740,34 +11227,36 @@
     left: 37,
     right: 39,
     down: 40,
-    'delete': [8, 46]
+    delete: [8, 46],
   };
 
   // KeyboardEvent.key aliases
   var keyNames = {
     // #7880: IE11 and Edge use `Esc` for Escape key name.
-    esc: ['Esc', 'Escape'],
-    tab: 'Tab',
-    enter: 'Enter',
+    esc: ["Esc", "Escape"],
+    tab: "Tab",
+    enter: "Enter",
     // #9112: IE11 uses `Spacebar` for Space key name.
-    space: [' ', 'Spacebar'],
+    space: [" ", "Spacebar"],
     // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.
-    up: ['Up', 'ArrowUp'],
-    left: ['Left', 'ArrowLeft'],
-    right: ['Right', 'ArrowRight'],
-    down: ['Down', 'ArrowDown'],
+    up: ["Up", "ArrowUp"],
+    left: ["Left", "ArrowLeft"],
+    right: ["Right", "ArrowRight"],
+    down: ["Down", "ArrowDown"],
     // #9112: IE11 uses `Del` for Delete key name.
-    'delete': ['Backspace', 'Delete', 'Del']
+    delete: ["Backspace", "Delete", "Del"],
   };
 
   // #4868: modifiers that prevent the execution of the listener
   // need to explicitly return null so that we can determine whether to remove
   // the listener for .once
-  var genGuard = function (condition) { return ("if(" + condition + ")return null;"); };
+  var genGuard = function (condition) {
+    return "if(" + condition + ")return null;";
+  };
 
   var modifierCode = {
-    stop: '$event.stopPropagation();',
-    prevent: '$event.preventDefault();',
+    stop: "$event.stopPropagation();",
+    prevent: "$event.preventDefault();",
     self: genGuard("$event.target !== $event.currentTarget"),
     ctrl: genGuard("!$event.ctrlKey"),
     shift: genGuard("!$event.shiftKey"),
@@ -10775,14 +11264,11 @@
     meta: genGuard("!$event.metaKey"),
     left: genGuard("'button' in $event && $event.button !== 0"),
     middle: genGuard("'button' in $event && $event.button !== 1"),
-    right: genGuard("'button' in $event && $event.button !== 2")
+    right: genGuard("'button' in $event && $event.button !== 2"),
   };
 
-  function genHandlers (
-    events,
-    isNative
-  ) {
-    var prefix = isNative ? 'nativeOn:' : 'on:';
+  function genHandlers(events, isNative) {
+    var prefix = isNative ? "nativeOn:" : "on:";
     var staticHandlers = "";
     var dynamicHandlers = "";
     for (var name in events) {
@@ -10790,38 +11276,59 @@
       if (events[name] && events[name].dynamic) {
         dynamicHandlers += name + "," + handlerCode + ",";
       } else {
-        staticHandlers += "\"" + name + "\":" + handlerCode + ",";
+        staticHandlers += '"' + name + '":' + handlerCode + ",";
       }
     }
-    staticHandlers = "{" + (staticHandlers.slice(0, -1)) + "}";
+    staticHandlers = "{" + staticHandlers.slice(0, -1) + "}";
     if (dynamicHandlers) {
-      return prefix + "_d(" + staticHandlers + ",[" + (dynamicHandlers.slice(0, -1)) + "])"
+      return (
+        prefix +
+        "_d(" +
+        staticHandlers +
+        ",[" +
+        dynamicHandlers.slice(0, -1) +
+        "])"
+      );
     } else {
-      return prefix + staticHandlers
+      return prefix + staticHandlers;
     }
   }
 
-  function genHandler (handler) {
+  function genHandler(handler) {
     if (!handler) {
-      return 'function(){}'
+      return "function(){}";
     }
 
     if (Array.isArray(handler)) {
-      return ("[" + (handler.map(function (handler) { return genHandler(handler); }).join(',')) + "]")
+      return (
+        "[" +
+        handler
+          .map(function (handler) {
+            return genHandler(handler);
+          })
+          .join(",") +
+        "]"
+      );
     }
 
     var isMethodPath = simplePathRE.test(handler.value);
     var isFunctionExpression = fnExpRE.test(handler.value);
-    var isFunctionInvocation = simplePathRE.test(handler.value.replace(fnInvokeRE, ''));
+    var isFunctionInvocation = simplePathRE.test(
+      handler.value.replace(fnInvokeRE, "")
+    );
 
     if (!handler.modifiers) {
       if (isMethodPath || isFunctionExpression) {
-        return handler.value
+        return handler.value;
       }
-      return ("function($event){" + (isFunctionInvocation ? ("return " + (handler.value)) : handler.value) + "}") // inline statement
+      return (
+        "function($event){" +
+        (isFunctionInvocation ? "return " + handler.value : handler.value) +
+        "}"
+      ); // inline statement
     } else {
-      var code = '';
-      var genModifierCode = '';
+      var code = "";
+      var genModifierCode = "";
       var keys = [];
       for (var key in handler.modifiers) {
         if (modifierCode[key]) {
@@ -10830,13 +11337,17 @@
           if (keyCodes[key]) {
             keys.push(key);
           }
-        } else if (key === 'exact') {
-          var modifiers = (handler.modifiers);
+        } else if (key === "exact") {
+          var modifiers = handler.modifiers;
           genModifierCode += genGuard(
-            ['ctrl', 'shift', 'alt', 'meta']
-              .filter(function (keyModifier) { return !modifiers[keyModifier]; })
-              .map(function (keyModifier) { return ("$event." + keyModifier + "Key"); })
-              .join('||')
+            ["ctrl", "shift", "alt", "meta"]
+              .filter(function (keyModifier) {
+                return !modifiers[keyModifier];
+              })
+              .map(function (keyModifier) {
+                return "$event." + keyModifier + "Key";
+              })
+              .join("||")
           );
         } else {
           keys.push(key);
@@ -10850,57 +11361,74 @@
         code += genModifierCode;
       }
       var handlerCode = isMethodPath
-        ? ("return " + (handler.value) + "($event)")
+        ? "return " + handler.value + "($event)"
         : isFunctionExpression
-          ? ("return (" + (handler.value) + ")($event)")
-          : isFunctionInvocation
-            ? ("return " + (handler.value))
-            : handler.value;
-      return ("function($event){" + code + handlerCode + "}")
+        ? "return (" + handler.value + ")($event)"
+        : isFunctionInvocation
+        ? "return " + handler.value
+        : handler.value;
+      return "function($event){" + code + handlerCode + "}";
     }
   }
 
-  function genKeyFilter (keys) {
+  function genKeyFilter(keys) {
     return (
       // make sure the key filters only apply to KeyboardEvents
       // #9441: can't use 'keyCode' in $event because Chrome autofill fires fake
       // key events that do not have keyCode property...
       "if(!$event.type.indexOf('key')&&" +
-      (keys.map(genFilterCode).join('&&')) + ")return null;"
-    )
+      keys.map(genFilterCode).join("&&") +
+      ")return null;"
+    );
   }
 
-  function genFilterCode (key) {
+  function genFilterCode(key) {
     var keyVal = parseInt(key, 10);
     if (keyVal) {
-      return ("$event.keyCode!==" + keyVal)
+      return "$event.keyCode!==" + keyVal;
     }
     var keyCode = keyCodes[key];
     var keyName = keyNames[key];
     return (
       "_k($event.keyCode," +
-      (JSON.stringify(key)) + "," +
-      (JSON.stringify(keyCode)) + "," +
+      JSON.stringify(key) +
+      "," +
+      JSON.stringify(keyCode) +
+      "," +
       "$event.key," +
-      "" + (JSON.stringify(keyName)) +
+      "" +
+      JSON.stringify(keyName) +
       ")"
-    )
+    );
   }
 
   /*  */
 
-  function on (el, dir) {
+  function on(el, dir) {
     if (dir.modifiers) {
       warn("v-on without argument does not support modifiers.");
     }
-    el.wrapListeners = function (code) { return ("_g(" + code + "," + (dir.value) + ")"); };
+    el.wrapListeners = function (code) {
+      return "_g(" + code + "," + dir.value + ")";
+    };
   }
 
   /*  */
 
-  function bind$1 (el, dir) {
+  function bind$1(el, dir) {
     el.wrapData = function (code) {
-      return ("_b(" + code + ",'" + (el.tag) + "'," + (dir.value) + "," + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + ")")
+      return (
+        "_b(" +
+        code +
+        ",'" +
+        el.tag +
+        "'," +
+        dir.value +
+        "," +
+        (dir.modifiers && dir.modifiers.prop ? "true" : "false") +
+        (dir.modifiers && dir.modifiers.sync ? ",true" : "") +
+        ")"
+      );
     };
   }
 
@@ -10909,59 +11437,52 @@
   var baseDirectives = {
     on: on,
     bind: bind$1,
-    cloak: noop
+    cloak: noop,
   };
 
   /*  */
 
-
-
-
-
-  var CodegenState = function CodegenState (options) {
+  var CodegenState = function CodegenState(options) {
     this.options = options;
     this.warn = options.warn || baseWarn;
-    this.transforms = pluckModuleFunction(options.modules, 'transformCode');
-    this.dataGenFns = pluckModuleFunction(options.modules, 'genData');
+    this.transforms = pluckModuleFunction(options.modules, "transformCode");
+    this.dataGenFns = pluckModuleFunction(options.modules, "genData");
     this.directives = extend(extend({}, baseDirectives), options.directives);
     var isReservedTag = options.isReservedTag || no;
-    this.maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };
+    this.maybeComponent = function (el) {
+      return !!el.component || !isReservedTag(el.tag);
+    };
     this.onceId = 0;
     this.staticRenderFns = [];
     this.pre = false;
   };
 
-
-
-  function generate (
-    ast,
-    options
-  ) {
+  function generate(ast, options) {
     var state = new CodegenState(options);
     var code = ast ? genElement(ast, state) : '_c("div")';
     return {
-      render: ("with(this){return " + code + "}"),
-      staticRenderFns: state.staticRenderFns
-    }
+      render: "with(this){return " + code + "}",
+      staticRenderFns: state.staticRenderFns,
+    };
   }
 
-  function genElement (el, state) {
+  function genElement(el, state) {
     if (el.parent) {
       el.pre = el.pre || el.parent.pre;
     }
 
     if (el.staticRoot && !el.staticProcessed) {
-      return genStatic(el, state)
+      return genStatic(el, state);
     } else if (el.once && !el.onceProcessed) {
-      return genOnce(el, state)
+      return genOnce(el, state);
     } else if (el.for && !el.forProcessed) {
-      return genFor(el, state)
+      return genFor(el, state);
     } else if (el.if && !el.ifProcessed) {
-      return genIf(el, state)
-    } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
-      return genChildren(el, state) || 'void 0'
-    } else if (el.tag === 'slot') {
-      return genSlot(el, state)
+      return genIf(el, state);
+    } else if (el.tag === "template" && !el.slotTarget && !state.pre) {
+      return genChildren(el, state) || "void 0";
+    } else if (el.tag === "slot") {
+      return genSlot(el, state);
     } else {
       // component or element
       var code;
@@ -10974,18 +11495,24 @@
         }
 
         var children = el.inlineTemplate ? null : genChildren(el, state, true);
-        code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")";
+        code =
+          "_c('" +
+          el.tag +
+          "'" +
+          (data ? "," + data : "") +
+          (children ? "," + children : "") +
+          ")";
       }
       // module transforms
       for (var i = 0; i < state.transforms.length; i++) {
         code = state.transforms[i](el, code);
       }
-      return code
+      return code;
     }
   }
 
   // hoist static sub-trees out
-  function genStatic (el, state) {
+  function genStatic(el, state) {
     el.staticProcessed = true;
     // Some elements (templates) need to behave differently inside of a v-pre
     // node.  All pre nodes are static roots, so we can use this as a location to
@@ -10994,123 +11521,143 @@
     if (el.pre) {
       state.pre = el.pre;
     }
-    state.staticRenderFns.push(("with(this){return " + (genElement(el, state)) + "}"));
+    state.staticRenderFns.push(
+      "with(this){return " + genElement(el, state) + "}"
+    );
     state.pre = originalPreState;
-    return ("_m(" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + ")")
+    return (
+      "_m(" +
+      (state.staticRenderFns.length - 1) +
+      (el.staticInFor ? ",true" : "") +
+      ")"
+    );
   }
 
   // v-once
-  function genOnce (el, state) {
+  function genOnce(el, state) {
     el.onceProcessed = true;
     if (el.if && !el.ifProcessed) {
-      return genIf(el, state)
+      return genIf(el, state);
     } else if (el.staticInFor) {
-      var key = '';
+      var key = "";
       var parent = el.parent;
       while (parent) {
         if (parent.for) {
           key = parent.key;
-          break
+          break;
         }
         parent = parent.parent;
       }
       if (!key) {
         state.warn(
           "v-once can only be used inside v-for that is keyed. ",
-          el.rawAttrsMap['v-once']
+          el.rawAttrsMap["v-once"]
         );
-        return genElement(el, state)
+        return genElement(el, state);
       }
-      return ("_o(" + (genElement(el, state)) + "," + (state.onceId++) + "," + key + ")")
+      return (
+        "_o(" + genElement(el, state) + "," + state.onceId++ + "," + key + ")"
+      );
     } else {
-      return genStatic(el, state)
+      return genStatic(el, state);
     }
   }
 
-  function genIf (
-    el,
-    state,
-    altGen,
-    altEmpty
-  ) {
+  function genIf(el, state, altGen, altEmpty) {
     el.ifProcessed = true; // avoid recursion
-    return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)
+    return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty);
   }
 
-  function genIfConditions (
-    conditions,
-    state,
-    altGen,
-    altEmpty
-  ) {
+  function genIfConditions(conditions, state, altGen, altEmpty) {
     if (!conditions.length) {
-      return altEmpty || '_e()'
+      return altEmpty || "_e()";
     }
 
     var condition = conditions.shift();
     if (condition.exp) {
-      return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty)))
+      return (
+        "(" +
+        condition.exp +
+        ")?" +
+        genTernaryExp(condition.block) +
+        ":" +
+        genIfConditions(conditions, state, altGen, altEmpty)
+      );
     } else {
-      return ("" + (genTernaryExp(condition.block)))
+      return "" + genTernaryExp(condition.block);
     }
 
     // v-if with v-once should generate code like (a)?_m(0):_m(1)
-    function genTernaryExp (el) {
+    function genTernaryExp(el) {
       return altGen
         ? altGen(el, state)
         : el.once
-          ? genOnce(el, state)
-          : genElement(el, state)
+        ? genOnce(el, state)
+        : genElement(el, state);
     }
   }
 
-  function genFor (
-    el,
-    state,
-    altGen,
-    altHelper
-  ) {
+  function genFor(el, state, altGen, altHelper) {
     var exp = el.for;
     var alias = el.alias;
-    var iterator1 = el.iterator1 ? ("," + (el.iterator1)) : '';
-    var iterator2 = el.iterator2 ? ("," + (el.iterator2)) : '';
+    var iterator1 = el.iterator1 ? "," + el.iterator1 : "";
+    var iterator2 = el.iterator2 ? "," + el.iterator2 : "";
 
-    if (state.maybeComponent(el) &&
-      el.tag !== 'slot' &&
-      el.tag !== 'template' &&
+    if (
+      state.maybeComponent(el) &&
+      el.tag !== "slot" &&
+      el.tag !== "template" &&
       !el.key
     ) {
       state.warn(
-        "<" + (el.tag) + " v-for=\"" + alias + " in " + exp + "\">: component lists rendered with " +
-        "v-for should have explicit keys. " +
-        "See https://vuejs.org/guide/list.html#key for more info.",
-        el.rawAttrsMap['v-for'],
+        "<" +
+          el.tag +
+          ' v-for="' +
+          alias +
+          " in " +
+          exp +
+          '">: component lists rendered with ' +
+          "v-for should have explicit keys. " +
+          "See https://vuejs.org/guide/list.html#key for more info.",
+        el.rawAttrsMap["v-for"],
         true /* tip */
       );
     }
 
     el.forProcessed = true; // avoid recursion
-    return (altHelper || '_l') + "((" + exp + ")," +
-      "function(" + alias + iterator1 + iterator2 + "){" +
-        "return " + ((altGen || genElement)(el, state)) +
-      '})'
+    return (
+      (altHelper || "_l") +
+      "((" +
+      exp +
+      ")," +
+      "function(" +
+      alias +
+      iterator1 +
+      iterator2 +
+      "){" +
+      "return " +
+      (altGen || genElement)(el, state) +
+      "})"
+    );
   }
 
-  function genData$2 (el, state) {
-    var data = '{';
+  function genData$2(el, state) {
+    var data = "{";
 
     // directives first.
     // directives may mutate the el's other properties before they are generated.
     var dirs = genDirectives(el, state);
-    if (dirs) { data += dirs + ','; }
+    if (dirs) {
+      data += dirs + ",";
+    }
 
     // key
     if (el.key) {
-      data += "key:" + (el.key) + ",";
+      data += "key:" + el.key + ",";
     }
     // ref
     if (el.ref) {
-      data += "ref:" + (el.ref) + ",";
+      data += "ref:" + el.ref + ",";
     }
     if (el.refInFor) {
       data += "refInFor:true,";
@@ -11121,7 +11668,7 @@
     }
     // record original tag name for components using "is" attribute
     if (el.component) {
-      data += "tag:\"" + (el.tag) + "\",";
+      data += 'tag:"' + el.tag + '",';
     }
     // module data generation functions
     for (var i = 0; i < state.dataGenFns.length; i++) {
@@ -11129,31 +11676,38 @@
     }
     // attributes
     if (el.attrs) {
-      data += "attrs:" + (genProps(el.attrs)) + ",";
+      data += "attrs:" + genProps(el.attrs) + ",";
     }
     // DOM props
     if (el.props) {
-      data += "domProps:" + (genProps(el.props)) + ",";
+      data += "domProps:" + genProps(el.props) + ",";
     }
     // event handlers
     if (el.events) {
-      data += (genHandlers(el.events, false)) + ",";
+      data += genHandlers(el.events, false) + ",";
     }
     if (el.nativeEvents) {
-      data += (genHandlers(el.nativeEvents, true)) + ",";
+      data += genHandlers(el.nativeEvents, true) + ",";
     }
     // slot target
     // only for non-scoped slots
     if (el.slotTarget && !el.slotScope) {
-      data += "slot:" + (el.slotTarget) + ",";
+      data += "slot:" + el.slotTarget + ",";
     }
     // scoped slots
     if (el.scopedSlots) {
-      data += (genScopedSlots(el, el.scopedSlots, state)) + ",";
+      data += genScopedSlots(el, el.scopedSlots, state) + ",";
     }
     // component v-model
     if (el.model) {
-      data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},";
+      data +=
+        "model:{value:" +
+        el.model.value +
+        ",callback:" +
+        el.model.callback +
+        ",expression:" +
+        el.model.expression +
+        "},";
     }
     // inline-template
     if (el.inlineTemplate) {
@@ -11162,12 +11716,13 @@
         data += inlineTemplate + ",";
       }
     }
-    data = data.replace(/,$/, '') + '}';
+    data = data.replace(/,$/, "") + "}";
     // v-bind dynamic argument wrap
     // v-bind with dynamic arguments must be applied using the same v-bind object
     // merge helper so that class/style/mustUseProp attrs are handled correctly.
     if (el.dynamicAttrs) {
-      data = "_b(" + data + ",\"" + (el.tag) + "\"," + (genProps(el.dynamicAttrs)) + ")";
+      data =
+        "_b(" + data + ',"' + el.tag + '",' + genProps(el.dynamicAttrs) + ")";
     }
     // v-bind data wrap
     if (el.wrapData) {
@@ -11177,13 +11732,15 @@
     if (el.wrapListeners) {
       data = el.wrapListeners(data);
     }
-    return data
+    return data;
   }
 
-  function genDirectives (el, state) {
+  function genDirectives(el, state) {
     var dirs = el.directives;
-    if (!dirs) { return }
-    var res = 'directives:[';
+    if (!dirs) {
+      return;
+    }
+    var res = "directives:[";
     var hasRuntime = false;
     var i, l, dir, needRuntime;
     for (i = 0, l = dirs.length; i < l; i++) {
@@ -11197,46 +11754,70 @@
       }
       if (needRuntime) {
         hasRuntime = true;
-        res += "{name:\"" + (dir.name) + "\",rawName:\"" + (dir.rawName) + "\"" + (dir.value ? (",value:(" + (dir.value) + "),expression:" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (",arg:" + (dir.isDynamicArg ? dir.arg : ("\"" + (dir.arg) + "\""))) : '') + (dir.modifiers ? (",modifiers:" + (JSON.stringify(dir.modifiers))) : '') + "},";
+        res +=
+          '{name:"' +
+          dir.name +
+          '",rawName:"' +
+          dir.rawName +
+          '"' +
+          (dir.value
+            ? ",value:(" +
+              dir.value +
+              "),expression:" +
+              JSON.stringify(dir.value)
+            : "") +
+          (dir.arg
+            ? ",arg:" + (dir.isDynamicArg ? dir.arg : '"' + dir.arg + '"')
+            : "") +
+          (dir.modifiers ? ",modifiers:" + JSON.stringify(dir.modifiers) : "") +
+          "},";
       }
     }
     if (hasRuntime) {
-      return res.slice(0, -1) + ']'
+      return res.slice(0, -1) + "]";
     }
   }
 
-  function genInlineTemplate (el, state) {
+  function genInlineTemplate(el, state) {
     var ast = el.children[0];
     if (el.children.length !== 1 || ast.type !== 1) {
       state.warn(
-        'Inline-template components must have exactly one child element.',
+        "Inline-template components must have exactly one child element.",
         { start: el.start }
       );
     }
     if (ast && ast.type === 1) {
       var inlineRenderFns = generate(ast, state.options);
-      return ("inlineTemplate:{render:function(){" + (inlineRenderFns.render) + "},staticRenderFns:[" + (inlineRenderFns.staticRenderFns.map(function (code) { return ("function(){" + code + "}"); }).join(',')) + "]}")
+      return (
+        "inlineTemplate:{render:function(){" +
+        inlineRenderFns.render +
+        "},staticRenderFns:[" +
+        inlineRenderFns.staticRenderFns
+          .map(function (code) {
+            return "function(){" + code + "}";
+          })
+          .join(",") +
+        "]}"
+      );
     }
   }
 
-  function genScopedSlots (
-    el,
-    slots,
-    state
-  ) {
+  function genScopedSlots(el, slots, state) {
     // by default scoped slots are considered "stable", this allows child
     // components with only scoped slots to skip forced updates from parent.
     // but in some cases we have to bail-out of this optimization
     // for example if the slot contains dynamic names, has v-if or v-for on them...
-    var needsForceUpdate = el.for || Object.keys(slots).some(function (key) {
-      var slot = slots[key];
-      return (
-        slot.slotTargetDynamic ||
-        slot.if ||
-        slot.for ||
-        containsSlotChild(slot) // is passing down slot from parent which may be dynamic
-      )
-    });
+    var needsForceUpdate =
+      el.for ||
+      Object.keys(slots).some(function (key) {
+        var slot = slots[key];
+        return (
+          slot.slotTargetDynamic ||
+          slot.if ||
+          slot.for ||
+          containsSlotChild(slot) // is passing down slot from parent which may be dynamic
+        );
+      });
 
     // #9534: if a component with scoped slots is inside a conditional branch,
     // it's possible for the same component to be reused but with different
@@ -11257,7 +11838,7 @@
           parent.for
         ) {
           needsForceUpdate = true;
-          break
+          break;
         }
         if (parent.if) {
           needsKey = true;
@@ -11267,82 +11848,113 @@
     }
 
     var generatedSlots = Object.keys(slots)
-      .map(function (key) { return genScopedSlot(slots[key], state); })
-      .join(',');
+      .map(function (key) {
+        return genScopedSlot(slots[key], state);
+      })
+      .join(",");
 
-    return ("scopedSlots:_u([" + generatedSlots + "]" + (needsForceUpdate ? ",null,true" : "") + (!needsForceUpdate && needsKey ? (",null,false," + (hash(generatedSlots))) : "") + ")")
+    return (
+      "scopedSlots:_u([" +
+      generatedSlots +
+      "]" +
+      (needsForceUpdate ? ",null,true" : "") +
+      (!needsForceUpdate && needsKey
+        ? ",null,false," + hash(generatedSlots)
+        : "") +
+      ")"
+    );
   }
 
   function hash(str) {
     var hash = 5381;
     var i = str.length;
-    while(i) {
+    while (i) {
       hash = (hash * 33) ^ str.charCodeAt(--i);
     }
-    return hash >>> 0
+    return hash >>> 0;
   }
 
-  function containsSlotChild (el) {
+  function containsSlotChild(el) {
     if (el.type === 1) {
-      if (el.tag === 'slot') {
-        return true
+      if (el.tag === "slot") {
+        return true;
       }
-      return el.children.some(containsSlotChild)
+      return el.children.some(containsSlotChild);
     }
-    return false
+    return false;
   }
 
-  function genScopedSlot (
-    el,
-    state
-  ) {
-    var isLegacySyntax = el.attrsMap['slot-scope'];
+  function genScopedSlot(el, state) {
+    var isLegacySyntax = el.attrsMap["slot-scope"];
     if (el.if && !el.ifProcessed && !isLegacySyntax) {
-      return genIf(el, state, genScopedSlot, "null")
+      return genIf(el, state, genScopedSlot, "null");
     }
     if (el.for && !el.forProcessed) {
-      return genFor(el, state, genScopedSlot)
-    }
-    var slotScope = el.slotScope === emptySlotScopeToken
-      ? ""
-      : String(el.slotScope);
-    var fn = "function(" + slotScope + "){" +
-      "return " + (el.tag === 'template'
+      return genFor(el, state, genScopedSlot);
+    }
+    var slotScope =
+      el.slotScope === emptySlotScopeToken ? "" : String(el.slotScope);
+    var fn =
+      "function(" +
+      slotScope +
+      "){" +
+      "return " +
+      (el.tag === "template"
         ? el.if && isLegacySyntax
-          ? ("(" + (el.if) + ")?" + (genChildren(el, state) || 'undefined') + ":undefined")
-          : genChildren(el, state) || 'undefined'
-        : genElement(el, state)) + "}";
+          ? "(" +
+            el.if +
+            ")?" +
+            (genChildren(el, state) || "undefined") +
+            ":undefined"
+          : genChildren(el, state) || "undefined"
+        : genElement(el, state)) +
+      "}";
     // reverse proxy v-slot without scope on this.$slots
     var reverseProxy = slotScope ? "" : ",proxy:true";
-    return ("{key:" + (el.slotTarget || "\"default\"") + ",fn:" + fn + reverseProxy + "}")
+    return (
+      "{key:" +
+      (el.slotTarget || '"default"') +
+      ",fn:" +
+      fn +
+      reverseProxy +
+      "}"
+    );
   }
 
-  function genChildren (
-    el,
-    state,
-    checkSkip,
-    altGenElement,
-    altGenNode
-  ) {
+  function genChildren(el, state, checkSkip, altGenElement, altGenNode) {
     var children = el.children;
     if (children.length) {
       var el$1 = children[0];
       // optimize single v-for
-      if (children.length === 1 &&
+      if (
+        children.length === 1 &&
         el$1.for &&
-        el$1.tag !== 'template' &&
-        el$1.tag !== 'slot'
+        el$1.tag !== "template" &&
+        el$1.tag !== "slot"
       ) {
         var normalizationType = checkSkip
-          ? state.maybeComponent(el$1) ? ",1" : ",0"
+          ? state.maybeComponent(el$1)
+            ? ",1"
+            : ",0"
           : "";
-        return ("" + ((altGenElement || genElement)(el$1, state)) + normalizationType)
+        return (
+          "" + (altGenElement || genElement)(el$1, state) + normalizationType
+        );
       }
       var normalizationType$1 = checkSkip
         ? getNormalizationType(children, state.maybeComponent)
         : 0;
       var gen = altGenNode || genNode;
-      return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]" + (normalizationType$1 ? ("," + normalizationType$1) : ''))
+      return (
+        "[" +
+        children
+          .map(function (c) {
+            return gen(c, state);
+          })
+          .join(",") +
+        "]" +
+        (normalizationType$1 ? "," + normalizationType$1 : "")
+      );
     }
   }
 
@@ -11350,66 +11962,82 @@
   // 0: no normalization needed
   // 1: simple normalization needed (possible 1-level deep nested array)
   // 2: full normalization needed
-  function getNormalizationType (
-    children,
-    maybeComponent
-  ) {
+  function getNormalizationType(children, maybeComponent) {
     var res = 0;
     for (var i = 0; i < children.length; i++) {
       var el = children[i];
       if (el.type !== 1) {
-        continue
+        continue;
       }
-      if (needsNormalization(el) ||
-          (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
+      if (
+        needsNormalization(el) ||
+        (el.ifConditions &&
+          el.ifConditions.some(function (c) {
+            return needsNormalization(c.block);
+          }))
+      ) {
         res = 2;
-        break
+        break;
       }
-      if (maybeComponent(el) ||
-          (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {
+      if (
+        maybeComponent(el) ||
+        (el.ifConditions &&
+          el.ifConditions.some(function (c) {
+            return maybeComponent(c.block);
+          }))
+      ) {
         res = 1;
       }
     }
-    return res
+    return res;
   }
 
-  function needsNormalization (el) {
-    return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
+  function needsNormalization(el) {
+    return el.for !== undefined || el.tag === "template" || el.tag === "slot";
   }
 
-  function genNode (node, state) {
+  function genNode(node, state) {
     if (node.type === 1) {
-      return genElement(node, state)
+      return genElement(node, state);
     } else if (node.type === 3 && node.isComment) {
-      return genComment(node)
+      return genComment(node);
     } else {
-      return genText(node)
+      return genText(node);
     }
   }
 
-  function genText (text) {
-    return ("_v(" + (text.type === 2
-      ? text.expression // no need for () because already wrapped in _s()
-      : transformSpecialNewlines(JSON.stringify(text.text))) + ")")
+  function genText(text) {
+    return (
+      "_v(" +
+      (text.type === 2
+        ? text.expression // no need for () because already wrapped in _s()
+        : transformSpecialNewlines(JSON.stringify(text.text))) +
+      ")"
+    );
   }
 
-  function genComment (comment) {
-    return ("_e(" + (JSON.stringify(comment.text)) + ")")
+  function genComment(comment) {
+    return "_e(" + JSON.stringify(comment.text) + ")";
   }
 
-  function genSlot (el, state) {
+  function genSlot(el, state) {
     var slotName = el.slotName || '"default"';
     var children = genChildren(el, state);
-    var res = "_t(" + slotName + (children ? ("," + children) : '');
-    var attrs = el.attrs || el.dynamicAttrs
-      ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({
-          // slot props are camelized
-          name: camelize(attr.name),
-          value: attr.value,
-          dynamic: attr.dynamic
-        }); }))
-      : null;
-    var bind$$1 = el.attrsMap['v-bind'];
+    var res = "_t(" + slotName + (children ? "," + children : "");
+    var attrs =
+      el.attrs || el.dynamicAttrs
+        ? genProps(
+            (el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) {
+              return {
+                // slot props are camelized
+                name: camelize(attr.name),
+                value: attr.value,
+                dynamic: attr.dynamic,
+              };
+            })
+          )
+        : null;
+    var bind$$1 = el.attrsMap["v-bind"];
     if ((attrs || bind$$1) && !children) {
       res += ",null";
     }
@@ -11417,90 +12045,103 @@
       res += "," + attrs;
     }
     if (bind$$1) {
-      res += (attrs ? '' : ',null') + "," + bind$$1;
+      res += (attrs ? "" : ",null") + "," + bind$$1;
     }
-    return res + ')'
+    return res + ")";
   }
 
   // componentName is el.component, take it as argument to shun flow's pessimistic refinement
-  function genComponent (
-    componentName,
-    el,
-    state
-  ) {
+  function genComponent(componentName, el, state) {
     var children = el.inlineTemplate ? null : genChildren(el, state, true);
-    return ("_c(" + componentName + "," + (genData$2(el, state)) + (children ? ("," + children) : '') + ")")
+    return (
+      "_c(" +
+      componentName +
+      "," +
+      genData$2(el, state) +
+      (children ? "," + children : "") +
+      ")"
+    );
   }
 
-  function genProps (props) {
+  function genProps(props) {
     var staticProps = "";
     var dynamicProps = "";
     for (var i = 0; i < props.length; i++) {
       var prop = props[i];
       var value = transformSpecialNewlines(prop.value);
       if (prop.dynamic) {
-        dynamicProps += (prop.name) + "," + value + ",";
+        dynamicProps += prop.name + "," + value + ",";
       } else {
-        staticProps += "\"" + (prop.name) + "\":" + value + ",";
+        staticProps += '"' + prop.name + '":' + value + ",";
       }
     }
-    staticProps = "{" + (staticProps.slice(0, -1)) + "}";
+    staticProps = "{" + staticProps.slice(0, -1) + "}";
     if (dynamicProps) {
-      return ("_d(" + staticProps + ",[" + (dynamicProps.slice(0, -1)) + "])")
+      return "_d(" + staticProps + ",[" + dynamicProps.slice(0, -1) + "])";
     } else {
-      return staticProps
+      return staticProps;
     }
   }
 
   // #3895, #4268
-  function transformSpecialNewlines (text) {
-    return text
-      .replace(/\u2028/g, '\\u2028')
-      .replace(/\u2029/g, '\\u2029')
+  function transformSpecialNewlines(text) {
+    return text.replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
   }
 
   /*  */
 
-
-
   // these keywords should not appear inside expressions, but operators like
   // typeof, instanceof and in are allowed
-  var prohibitedKeywordRE = new RegExp('\\b' + (
-    'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
-    'super,throw,while,yield,delete,export,import,return,switch,default,' +
-    'extends,finally,continue,debugger,function,arguments'
-  ).split(',').join('\\b|\\b') + '\\b');
+  var prohibitedKeywordRE = new RegExp(
+    "\\b" +
+      (
+        "do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const," +
+        "super,throw,while,yield,delete,export,import,return,switch,default," +
+        "extends,finally,continue,debugger,function,arguments"
+      )
+        .split(",")
+        .join("\\b|\\b") +
+      "\\b"
+  );
 
   // these unary operators should not be used as property/method names
-  var unaryOperatorsRE = new RegExp('\\b' + (
-    'delete,typeof,void'
-  ).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)');
+  var unaryOperatorsRE = new RegExp(
+    "\\b" +
+      "delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b") +
+      "\\s*\\([^\\)]*\\)"
+  );
 
   // strip strings in expressions
-  var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
+  var stripStringRE =
+    /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
 
   // detect problematic expressions in a template
-  function detectErrors (ast, warn) {
+  function detectErrors(ast, warn) {
     if (ast) {
       checkNode(ast, warn);
     }
   }
 
-  function checkNode (node, warn) {
+  function checkNode(node, warn) {
     if (node.type === 1) {
       for (var name in node.attrsMap) {
         if (dirRE.test(name)) {
           var value = node.attrsMap[name];
           if (value) {
             var range = node.rawAttrsMap[name];
-            if (name === 'v-for') {
-              checkFor(node, ("v-for=\"" + value + "\""), warn, range);
-            } else if (name === 'v-slot' || name[0] === '#') {
-              checkFunctionParameterExpression(value, (name + "=\"" + value + "\""), warn, range);
+            if (name === "v-for") {
+              checkFor(node, 'v-for="' + value + '"', warn, range);
+            } else if (name === "v-slot" || name[0] === "#") {
+              checkFunctionParameterExpression(
+                value,
+                name + '="' + value + '"',
+                warn,
+                range
+              );
             } else if (onRE.test(name)) {
-              checkEvent(value, (name + "=\"" + value + "\""), warn, range);
+              checkEvent(value, name + '="' + value + '"', warn, range);
             } else {
-              checkExpression(value, (name + "=\"" + value + "\""), warn, range);
+              checkExpression(value, name + '="' + value + '"', warn, range);
             }
           }
         }
@@ -11515,72 +12156,89 @@
     }
   }
 
-  function checkEvent (exp, text, warn, range) {
-    var stripped = exp.replace(stripStringRE, '');
+  function checkEvent(exp, text, warn, range) {
+    var stripped = exp.replace(stripStringRE, "");
     var keywordMatch = stripped.match(unaryOperatorsRE);
-    if (keywordMatch && stripped.charAt(keywordMatch.index - 1) !== '$') {
+    if (keywordMatch && stripped.charAt(keywordMatch.index - 1) !== "$") {
       warn(
         "avoid using JavaScript unary operator as property name: " +
-        "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim()),
+          '"' +
+          keywordMatch[0] +
+          '" in expression ' +
+          text.trim(),
         range
       );
     }
     checkExpression(exp, text, warn, range);
   }
 
-  function checkFor (node, text, warn, range) {
-    checkExpression(node.for || '', text, warn, range);
-    checkIdentifier(node.alias, 'v-for alias', text, warn, range);
-    checkIdentifier(node.iterator1, 'v-for iterator', text, warn, range);
-    checkIdentifier(node.iterator2, 'v-for iterator', text, warn, range);
+  function checkFor(node, text, warn, range) {
+    checkExpression(node.for || "", text, warn, range);
+    checkIdentifier(node.alias, "v-for alias", text, warn, range);
+    checkIdentifier(node.iterator1, "v-for iterator", text, warn, range);
+    checkIdentifier(node.iterator2, "v-for iterator", text, warn, range);
   }
 
-  function checkIdentifier (
-    ident,
-    type,
-    text,
-    warn,
-    range
-  ) {
-    if (typeof ident === 'string') {
+  function checkIdentifier(ident, type, text, warn, range) {
+    if (typeof ident === "string") {
       try {
-        new Function(("var " + ident + "=_"));
+        new Function("var " + ident + "=_");
       } catch (e) {
-        warn(("invalid " + type + " \"" + ident + "\" in expression: " + (text.trim())), range);
+        warn(
+          "invalid " + type + ' "' + ident + '" in expression: ' + text.trim(),
+          range
+        );
       }
     }
   }
 
-  function checkExpression (exp, text, warn, range) {
+  function checkExpression(exp, text, warn, range) {
     try {
-      new Function(("return " + exp));
+      new Function("return " + exp);
     } catch (e) {
-      var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);
+      var keywordMatch = exp
+        .replace(stripStringRE, "")
+        .match(prohibitedKeywordRE);
       if (keywordMatch) {
         warn(
           "avoid using JavaScript keyword as property name: " +
-          "\"" + (keywordMatch[0]) + "\"\n  Raw expression: " + (text.trim()),
+            '"' +
+            keywordMatch[0] +
+            '"\n  Raw expression: ' +
+            text.trim(),
           range
         );
       } else {
         warn(
-          "invalid expression: " + (e.message) + " in\n\n" +
-          "    " + exp + "\n\n" +
-          "  Raw expression: " + (text.trim()) + "\n",
+          "invalid expression: " +
+            e.message +
+            " in\n\n" +
+            "    " +
+            exp +
+            "\n\n" +
+            "  Raw expression: " +
+            text.trim() +
+            "\n",
           range
         );
       }
     }
   }
 
-  function checkFunctionParameterExpression (exp, text, warn, range) {
+  function checkFunctionParameterExpression(exp, text, warn, range) {
     try {
-      new Function(exp, '');
+      new Function(exp, "");
     } catch (e) {
       warn(
-        "invalid function parameter expression: " + (e.message) + " in\n\n" +
-        "    " + exp + "\n\n" +
-        "  Raw expression: " + (text.trim()) + "\n",
+        "invalid function parameter expression: " +
+          e.message +
+          " in\n\n" +
+          "    " +
+          exp +
+          "\n\n" +
+          "  Raw expression: " +
+          text.trim() +
+          "\n",
         range
       );
     }
@@ -11590,13 +12248,9 @@
 
   var range = 2;
 
-  function generateCodeFrame (
-    source,
-    start,
-    end
-  ) {
-    if ( start === void 0 ) start = 0;
-    if ( end === void 0 ) end = source.length;
+  function generateCodeFrame(source, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = source.length;
 
     var lines = source.split(/\r?\n/);
     var count = 0;
@@ -11605,8 +12259,16 @@
       count += lines[i].length + 1;
       if (count >= start) {
         for (var j = i - range; j <= i + range || end > count; j++) {
-          if (j < 0 || j >= lines.length) { continue }
-          res.push(("" + (j + 1) + (repeat$1(" ", 3 - String(j + 1).length)) + "|  " + (lines[j])));
+          if (j < 0 || j >= lines.length) {
+            continue;
+          }
+          res.push(
+            "" +
+              (j + 1) +
+              repeat$1(" ", 3 - String(j + 1).length) +
+              "|  " +
+              lines[j]
+          );
           var lineLength = lines[j].length;
           if (j === i) {
             // push underline
@@ -11621,46 +12283,45 @@
             count += lineLength + 1;
           }
         }
-        break
+        break;
       }
     }
-    return res.join('\n')
+    return res.join("\n");
   }
 
-  function repeat$1 (str, n) {
-    var result = '';
+  function repeat$1(str, n) {
+    var result = "";
     if (n > 0) {
-      while (true) { // eslint-disable-line
-        if (n & 1) { result += str; }
+      while (true) {
+        // eslint-disable-line
+        if (n & 1) {
+          result += str;
+        }
         n >>>= 1;
-        if (n <= 0) { break }
+        if (n <= 0) {
+          break;
+        }
         str += str;
       }
     }
-    return result
+    return result;
   }
 
   /*  */
 
-
-
-  function createFunction (code, errors) {
+  function createFunction(code, errors) {
     try {
-      return new Function(code)
+      return new Function(code);
     } catch (err) {
       errors.push({ err: err, code: code });
-      return noop
+      return noop;
     }
   }
 
-  function createCompileToFunctionFn (compile) {
+  function createCompileToFunctionFn(compile) {
     var cache = Object.create(null);
 
-    return function compileToFunctions (
-      template,
-      options,
-      vm
-    ) {
+    return function compileToFunctions(template, options, vm) {
       options = extend({}, options);
       var warn$$1 = options.warn || warn;
       delete options.warn;
@@ -11669,15 +12330,15 @@
       {
         // detect possible CSP restriction
         try {
-          new Function('return 1');
+          new Function("return 1");
         } catch (e) {
           if (e.toString().match(/unsafe-eval|CSP/)) {
             warn$$1(
-              'It seems you are using the standalone build of Vue.js in an ' +
-              'environment with Content Security Policy that prohibits unsafe-eval. ' +
-              'The template compiler cannot work in this environment. Consider ' +
-              'relaxing the policy to allow unsafe-eval or pre-compiling your ' +
-              'templates into render functions.'
+              "It seems you are using the standalone build of Vue.js in an " +
+                "environment with Content Security Policy that prohibits unsafe-eval. " +
+                "The template compiler cannot work in this environment. Consider " +
+                "relaxing the policy to allow unsafe-eval or pre-compiling your " +
+                "templates into render functions."
             );
           }
         }
@@ -11688,7 +12349,7 @@
         ? String(options.delimiters) + template
         : template;
       if (cache[key]) {
-        return cache[key]
+        return cache[key];
       }
 
       // compile
@@ -11700,24 +12361,37 @@
           if (options.outputSourceRange) {
             compiled.errors.forEach(function (e) {
               warn$$1(
-                "Error compiling template:\n\n" + (e.msg) + "\n\n" +
-                generateCodeFrame(template, e.start, e.end),
+                "Error compiling template:\n\n" +
+                  e.msg +
+                  "\n\n" +
+                  generateCodeFrame(template, e.start, e.end),
                 vm
               );
             });
           } else {
             warn$$1(
-              "Error compiling template:\n\n" + template + "\n\n" +
-              compiled.errors.map(function (e) { return ("- " + e); }).join('\n') + '\n',
+              "Error compiling template:\n\n" +
+                template +
+                "\n\n" +
+                compiled.errors
+                  .map(function (e) {
+                    return "- " + e;
+                  })
+                  .join("\n") +
+                "\n",
               vm
             );
           }
         }
         if (compiled.tips && compiled.tips.length) {
           if (options.outputSourceRange) {
-            compiled.tips.forEach(function (e) { return tip(e.msg, vm); });
+            compiled.tips.forEach(function (e) {
+              return tip(e.msg, vm);
+            });
           } else {
-            compiled.tips.forEach(function (msg) { return tip(msg, vm); });
+            compiled.tips.forEach(function (msg) {
+              return tip(msg, vm);
+            });
           }
         }
       }
@@ -11727,7 +12401,7 @@
       var fnGenErrors = [];
       res.render = createFunction(compiled.render, fnGenErrors);
       res.staticRenderFns = compiled.staticRenderFns.map(function (code) {
-        return createFunction(code, fnGenErrors)
+        return createFunction(code, fnGenErrors);
       });
 
       // check function generation errors.
@@ -11735,32 +12409,34 @@
       // mostly for codegen development use
       /* istanbul ignore if */
       {
-        if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {
+        if (
+          (!compiled.errors || !compiled.errors.length) &&
+          fnGenErrors.length
+        ) {
           warn$$1(
             "Failed to generate render function:\n\n" +
-            fnGenErrors.map(function (ref) {
-              var err = ref.err;
-              var code = ref.code;
-
-              return ((err.toString()) + " in\n\n" + code + "\n");
-          }).join('\n'),
+              fnGenErrors
+                .map(function (ref) {
+                  var err = ref.err;
+                  var code = ref.code;
+
+                  return err.toString() + " in\n\n" + code + "\n";
+                })
+                .join("\n"),
             vm
           );
         }
       }
 
-      return (cache[key] = res)
-    }
+      return (cache[key] = res);
+    };
   }
 
   /*  */
 
-  function createCompilerCreator (baseCompile) {
-    return function createCompiler (baseOptions) {
-      function compile (
-        template,
-        options
-      ) {
+  function createCompilerCreator(baseCompile) {
+    return function createCompiler(baseOptions) {
+      function compile(template, options) {
         var finalOptions = Object.create(baseOptions);
         var errors = [];
         var tips = [];
@@ -11789,8 +12465,9 @@
           }
           // merge custom modules
           if (options.modules) {
-            finalOptions.modules =
-              (baseOptions.modules || []).concat(options.modules);
+            finalOptions.modules = (baseOptions.modules || []).concat(
+              options.modules
+            );
           }
           // merge custom directives
           if (options.directives) {
@@ -11801,7 +12478,7 @@
           }
           // copy other options
           for (var key in options) {
-            if (key !== 'modules' && key !== 'directives') {
+            if (key !== "modules" && key !== "directives") {
               finalOptions[key] = options[key];
             }
           }
@@ -11815,14 +12492,14 @@
         }
         compiled.errors = errors;
         compiled.tips = tips;
-        return compiled
+        return compiled;
       }
 
       return {
         compile: compile,
-        compileToFunctions: createCompileToFunctionFn(compile)
-      }
-    }
+        compileToFunctions: createCompileToFunctionFn(compile),
+      };
+    };
   }
 
   /*  */
@@ -11830,7 +12507,7 @@
   // `createCompilerCreator` allows creating compilers that use alternative
   // parser/optimizer/codegen, e.g the SSR optimizing compiler.
   // Here we just export a default compiler using the default parts.
-  var createCompiler = createCompilerCreator(function baseCompile (
+  var createCompiler = createCompilerCreator(function baseCompile(
     template,
     options
   ) {
@@ -11842,8 +12519,8 @@
     return {
       ast: ast,
       render: code.render,
-      staticRenderFns: code.staticRenderFns
-    }
+      staticRenderFns: code.staticRenderFns,
+    };
   });
 
   /*  */
@@ -11856,10 +12533,10 @@
 
   // check whether current browser encodes a char inside attribute values
   var div;
-  function getShouldDecode (href) {
-    div = div || document.createElement('div');
-    div.innerHTML = href ? "<a href=\"\n\"/>" : "<div a=\"\n\"/>";
-    return div.innerHTML.indexOf('&#10;') > 0
+  function getShouldDecode(href) {
+    div = div || document.createElement("div");
+    div.innerHTML = href ? '<a href="\n"/>' : '<div a="\n"/>';
+    return div.innerHTML.indexOf("&#10;") > 0;
   }
 
   // #3663: IE encodes newlines inside attribute values while other browsers don't
@@ -11871,14 +12548,11 @@
 
   var idToTemplate = cached(function (id) {
     var el = query(id);
-    return el && el.innerHTML
+    return el && el.innerHTML;
   });
 
   var mount = Vue.prototype.$mount;
-  Vue.prototype.$mount = function (
-    el,
-    hydrating
-  ) {
+  Vue.prototype.$mount = function (el, hydrating) {
     el = el && query(el);
 
     /* istanbul ignore if */
@@ -11886,7 +12560,7 @@
       warn(
         "Do not mount Vue to <html> or <body> - mount to normal elements instead."
       );
-      return this
+      return this;
     }
 
     var options = this.$options;
@@ -11894,13 +12568,13 @@
     if (!options.render) {
       var template = options.template;
       if (template) {
-        if (typeof template === 'string') {
-          if (template.charAt(0) === '#') {
+        if (typeof template === "string") {
+          if (template.charAt(0) === "#") {
             template = idToTemplate(template);
             /* istanbul ignore if */
             if (!template) {
               warn(
-                ("Template element not found or is empty: " + (options.template)),
+                "Template element not found or is empty: " + options.template,
                 this
               );
             }
@@ -11909,9 +12583,9 @@
           template = template.innerHTML;
         } else {
           {
-            warn('invalid template option:' + template, this);
+            warn("invalid template option:" + template, this);
           }
-          return this
+          return this;
         }
       } else if (el) {
         template = getOuterHTML(el);
@@ -11919,16 +12593,20 @@
       if (template) {
         /* istanbul ignore if */
         if (config.performance && mark) {
-          mark('compile');
+          mark("compile");
         }
 
-        var ref = compileToFunctions(template, {
-          outputSourceRange: "development" !== 'production',
-          shouldDecodeNewlines: shouldDecodeNewlines,
-          shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,
-          delimiters: options.delimiters,
-          comments: options.comments
-        }, this);
+        var ref = compileToFunctions(
+          template,
+          {
+            outputSourceRange: "development" !== "production",
+            shouldDecodeNewlines: shouldDecodeNewlines,
+            shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,
+            delimiters: options.delimiters,
+            comments: options.comments,
+          },
+          this
+        );
         var render = ref.render;
         var staticRenderFns = ref.staticRenderFns;
         options.render = render;
@@ -11936,30 +12614,29 @@
 
         /* istanbul ignore if */
         if (config.performance && mark) {
-          mark('compile end');
-          measure(("vue " + (this._name) + " compile"), 'compile', 'compile end');
+          mark("compile end");
+          measure("vue " + this._name + " compile", "compile", "compile end");
         }
       }
     }
-    return mount.call(this, el, hydrating)
+    return mount.call(this, el, hydrating);
   };
 
   /**
    * Get outerHTML of elements, taking care
    * of SVG elements in IE as well.
    */
-  function getOuterHTML (el) {
+  function getOuterHTML(el) {
     if (el.outerHTML) {
-      return el.outerHTML
+      return el.outerHTML;
     } else {
-      var container = document.createElement('div');
+      var container = document.createElement("div");
       container.appendChild(el.cloneNode(true));
-      return container.innerHTML
+      return container.innerHTML;
     }
   }
 
   Vue.compile = compileToFunctions;
 
   return Vue;
-
-}));
+});
diff --git a/notemyprogress/lang/en/local_notemyprogress.php b/notemyprogress/lang/en/local_notemyprogress.php
index f1c2e8ceaa951e6fc3f9306450c95ce71cbca924..09b1db563af55074186c091963095889b4d907ff 100644
--- a/notemyprogress/lang/en/local_notemyprogress.php
+++ b/notemyprogress/lang/en/local_notemyprogress.php
@@ -775,6 +775,7 @@ $string['fml_settings_bddname_label'] = 'Name of the database';
 $string['fml_settings_bddname_description'] = 'This parameter designates the name of the MongoDB database in which the information will be stored.';
 $string['fml_settings_bddname_default'] = 'Empty';
 
+<<<<<<< HEAD
 //Planning
 /* Global */
 $string['pagination'] = "Week:";
@@ -1093,4 +1094,78 @@ $string['group_allstudent'] = "All students";
 /* Admin Settings */
 $string['nmp_use_navbar_menu'] = 'Activate new menu';
 $string['nmp_use_navbar_menu_desc'] = 'Display the plugin menu in the top navigation bar, otherwise it will include the menu in the navigation block.';
+=======
+/* Gamification */
+$string['EnableGame']="Disable/Enable :";
+$string['studentRanking1']="Do you want to appear in the Ranking Board ?";
+$string['studentRanking2']=" /!\ All the registered in this course having accepted you will see. Accepting is final:";
+$string['studentRanking3']="Accept";
+$string['gamification_denied'] = 'gamification has been desactivated by your teacher';
+$string['tg_colon'] = '{$a->a}: {$a->b}';
+$string['tg_section_title'] = 'Course gamification settings';
+$string['tg_section_help_title'] = 'Course gamification settings';
+$string['tg_section_help_description'] = 'You can give the option of gamification to the students of the course.';
+$string['tg_save_warning_title'] = "Are you sure you want to save the changes?";
+$string['tg_save_warning_content'] = "If you change the settings for the gamification when the course has already started, data may be lost...";
+$string['tg_confirm_ok'] = "Save";
+$string['tg_confirm_cancel'] = "Cancel";
+$string['tg_save'] = "Save configuration";
+$string['tg_section_preview'] = 'Preview';
+$string['tg_section_experience'] = 'Experience points';
+$string['tg_section_information'] = 'Information';
+$string['tg_section_ranking'] = 'Ranking/Report';
+$string['tg_section_settings'] = 'Settings';
+
+$string['tg_section_points'] = 'points';
+$string['tg_section_description'] = 'Description';
+$string['tg_section_no_description'] = 'No description';
+$string['tg_section_no_name'] = 'No name';
+
+$string['tg_section_preview_next_level'] = 'to the next level';
+$string['tg_section_ranking_ranking_text'] = 'Ranking';
+$string['tg_section_ranking_level'] = 'Level';
+$string['tg_section_ranking_student'] = 'Student';
+$string['tg_section_ranking_total'] = 'Total';
+$string['tg_section_ranking_progress'] = 'Progress %';
+
+$string['tg_section_settings_appearance'] = 'Appearance';
+$string['tg_section_settings_appearance_title'] = 'Title';
+$string['tg_section_settings_levels'] = 'Level settings';
+$string['tg_section_settings_levels_quantity'] = 'Levels';
+$string['tg_section_settings_levels_base_points'] = 'Base Points';
+$string['tg_section_settings_levels_calculated'] = 'Automatic';
+$string['tg_section_settings_levels_manually'] = 'Manually';
+$string['tg_section_settings_levels_name'] = 'Name';
+$string['tg_section_settings_levels_required'] = 'Points required';
+$string['tg_section_settings_rules'] = 'Rules setting';
+$string['tg_section_settings_add_rule'] = 'Add new rule';
+$string['tg_section_settings_earn'] = 'For this event win:';
+$string['tg_section_settings_select_event'] = 'Select an event';
+$string['gm_Chart_Title']='Spreading chart';
+$string['gm_Chart_Y']='Students';
+
+$string['tg_timenow'] = 'Just now';
+$string['tg_timeseconds'] = '{$a}s ago';
+$string['tg_timeminutes'] = '{$a}m ago';
+$string['tg_timehours'] = '{$a}h ago';
+$string['tg_timedays'] = '{$a}d ago';
+$string['tg_timeweeks'] = '{$a}w ago';
+$string['tg_timewithinayearformat'] = '%b %e';
+$string['tg_timeolderyearformat'] = '%b %Y';
+
+/* General Errors */
+$string['fml_api_error_network'] = "An error has occurred in communication with the server.";
+$string['fml_api_invalid_data'] = 'Incorrect data';
+$string['fml_api_json_decode_error'] = 'Error Decoding sent data';
+$string['fml_api_invalid_token_error'] = 'The token sent in the transaction is invalid, please refresh the page';
+$string['fml_api_invalid_transaction'] = 'The request is incorrect';
+$string['fml_api_invalid_profile'] = 'You cannot do this action, your profile is incorrect';
+$string['fml_api_save_successful'] = 'The data has been successfully saved on the server';
+$string['fml_api_cancel_action'] = 'You have canceled the action';
+$string['overview']='Overview : ';
+$string['game_point_error']='Points are required';
+$string['game_event_error']='Event is required';
+$string['game_name_error']='Name required';
+
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
 
diff --git a/notemyprogress/lang/es/local_notemyprogress.php b/notemyprogress/lang/es/local_notemyprogress.php
index 79899c07d9190a6bfcf527c1b858de22117a74cd..400b3415a3483f77d728561b9965dcc694f295fb 100644
--- a/notemyprogress/lang/es/local_notemyprogress.php
+++ b/notemyprogress/lang/es/local_notemyprogress.php
@@ -714,6 +714,7 @@ $string['fml_settings_bddport_default'] = '27017';
 $string['fml_settings_bddname_label'] = 'Nombre de la base de datos';
 $string['fml_settings_bddname_description'] = 'Este parámetro designa el nombre de la base de datos MongoDB en la que se guardará la información.';
 $string['fml_settings_bddname_default'] = 'Vacío';
+<<<<<<< HEAD
 
 //Planning
 /* Global */
@@ -1094,3 +1095,76 @@ $string['group_allstudent'] = 'Todos los estudiantes';
 /* Admin Settings */
 $string['nmp_use_navbar_menu'] = 'Habilitar nuevo menú';
 $string['nmp_use_navbar_menu_desc'] = 'Despliega el menú del plugin en la barra de navegación superior, del contrario incluirá el menú en el bloque de navegación.';
+=======
+/* Gamification */
+$string['EnableGame']="Desactivar/Activar :";
+$string['studentRanking1']="¿Quieres aparecer en el ranking ? ";
+$string['studentRanking2']="/!\ Te verán todos los inscritos en este curso que hayan aceptado. Aceptar es definitivo: ";
+$string['studentRanking3']="Acceptar";
+$string['gamification_denied'] = 'La gamificación ha sido desactivada por su maestro';
+$string['tg_colon'] = '{$a->a}: {$a->b}';
+$string['tg_section_title'] = 'Configuración de gamificación del curso';
+$string['tg_section_help_title'] = 'Configuración de gamificación del curso';
+$string['tg_section_help_description'] = 'Puede dar la opción de gamificación a los estudiantes del curso.';
+$string['tg_save_warning_title'] = "¿Estás seguro de que quieres guardar los cambios?";
+$string['tg_save_warning_content'] = "Si cambia la configuración de la gamificación cuando el curso ya ha comenzado, los datos pueden perderse ...";
+$string['tg_confirm_ok'] = "Guardar";
+$string['tg_confirm_cancel'] = "Cancelar";
+$string['tg_save'] = "Guardar configuración";
+$string['tg_section_preview'] = 'Avance';
+$string['tg_section_experience'] = 'Puntos de experiencia';
+$string['tg_section_information'] = 'Información';
+$string['tg_section_ranking'] = 'Clasificación/informe';
+$string['tg_section_settings'] = 'Ajustes';
+
+$string['tg_section_points'] = 'puntos';
+$string['tg_section_description'] = 'Descripción';
+$string['tg_section_no_description'] = 'Sin descripción';
+$string['tg_section_no_name'] = 'Sin nombre';
+
+$string['tg_section_preview_next_level'] = 'al siguiente nivel';
+$string['tg_section_ranking_ranking_text'] = 'Clasificación';
+$string['tg_section_ranking_level'] = 'Nivel';
+$string['tg_section_ranking_student'] = 'Alumna';
+$string['tg_section_ranking_total'] = 'Total';
+$string['tg_section_ranking_progress'] = 'Progreso %';
+
+$string['tg_section_settings_appearance'] = 'Apariencia';
+$string['tg_section_settings_appearance_title'] = 'Título';
+$string['tg_section_settings_levels'] = 'Configuración de nivel';
+$string['tg_section_settings_levels_quantity'] = 'Nivel';
+$string['tg_section_settings_levels_base_points'] = 'Puntos base';
+$string['tg_section_settings_levels_calculated'] = 'automático';
+$string['tg_section_settings_levels_manually'] = 'A mano';
+$string['tg_section_settings_levels_name'] = 'Nombre';
+$string['tg_section_settings_levels_required'] = 'Se requieren puntos';
+$string['tg_section_settings_rules'] = 'Establecimiento de reglas';
+$string['tg_section_settings_add_rule'] = 'Agregar nueva regla';
+$string['tg_section_settings_earn'] = 'Para este evento, gane:';
+$string['tg_section_settings_select_event'] = 'Seleccione un evento';
+$string['gm_Chart_Title']='Tabla de esparcimiento';
+$string['gm_Chart_Y']='Alumno';
+
+$string['tg_timenow'] = 'Justo ahora';
+$string['tg_timeseconds'] = '{$a}s atrás';
+$string['tg_timeminutes'] = '{$a}m atrás';
+$string['tg_timehours'] = '{$a}h atrás';
+$string['tg_timedays'] = '{$a}d atrás';
+$string['tg_timeweeks'] = '{$a}w atrás';
+$string['tg_timewithinayearformat'] = '%b %e';
+$string['tg_timeolderyearformat'] = '%b %Y';
+
+/* General Errors */
+$string['fml_api_error_network'] = "Se ha producido un error en la comunicación con el servidor.";
+$string['fml_api_invalid_data'] = 'Datos Incorrectos';
+$string['fml_api_json_decode_error'] = 'Error en decodificación de datos enviados';
+$string['fml_api_invalid_token_error'] = 'El token enviado en la transacción no es válido, actualice la página';
+$string['fml_api_invalid_transaction'] = 'La solicitud es incorrecta';
+$string['fml_api_invalid_profile'] = 'No puedes hacer esta acción, tu perfil es incorrecto';
+$string['fml_api_save_successful'] = 'Los datos se han guardado correctamente en el servidor';
+$string['fml_api_cancel_action'] = 'Has cancelado la acción';
+$string['overview']='Visión de conjunto : ';
+$string['game_point_error']='Los puntos son requeridos';
+$string['game_event_error']='El evento es requerido';
+$string['game_name_error']='Se requiere el nombre';
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
diff --git a/notemyprogress/lang/fr/local_notemyprogress.php b/notemyprogress/lang/fr/local_notemyprogress.php
index bda740ecf1def50b47f641564576156088fe5cde..2bec6abd81ca5e228d815eef004c39b4dd62987d 100644
--- a/notemyprogress/lang/fr/local_notemyprogress.php
+++ b/notemyprogress/lang/fr/local_notemyprogress.php
@@ -718,6 +718,7 @@ $string['fml_settings_bddport_default'] = '27017';
 
 $string['fml_settings_bddname_label'] = 'Nom de la base de données';
 $string['fml_settings_bddname_description'] = 'Ce paramètre désigne le nom de la base de données MongoDB dans laquelle vont être enregistrées les informations.';
+<<<<<<< HEAD
 $string['fml_settings_bddname_default'] = 'Vide';
 
 //Planning
@@ -1093,3 +1094,77 @@ $string['group_allstudent'] = "Tous les étudiants";
 /* Admin Settings */
 $string['nmp_use_navbar_menu'] = 'Activer le nouveau menu';
 $string['nmp_use_navbar_menu_desc'] = 'Afficher le menu du plugin dans la barre de navigation supérieure, sinon il inclura le menu dans le bloc de navigation.';
+=======
+
+/* Gamification */
+$string['EnableGame']="Désactiver/Activer :";
+$string['studentRanking1']="Voulez vous apparaitre dans le ranking board ? ";
+$string['studentRanking2']= "/!\ Tout les inscrits à ce cours ayant accepté vous verrons. Accepter est définitif:";
+$string['studentRanking3']="Accepter";
+$string['gamification_denied'] = 'La gamification a été désactivée par votre professeur';
+$string['tg_colon'] = '{$a->a}: {$a->b}';
+$string['tg_section_title'] = 'Gamification :';
+$string['tg_section_help_title'] = 'Paramètres de gamification des cours';
+$string['tg_section_help_description'] = 'Vous pouvez donner la possibilité de gamification aux étudiants du cours.';
+$string['tg_save_warning_title'] = "Êtes-vous sûr de vouloir enregistrer les modifications?";
+$string['tg_save_warning_content'] = "Si vous modifiez les paramètres de la gamification au début du cours, les données peuvent être perdues ...";
+$string['tg_confirm_ok'] = "Sauver";
+$string['tg_confirm_cancel'] = "Annuler";
+$string['tg_save'] = "Enregistrer la configuration";
+$string['tg_section_preview'] = 'Point de vue étudiant';
+$string['tg_section_experience'] = 'Points d\'experience';
+$string['tg_section_information'] = 'Information';
+$string['tg_section_ranking'] = 'Classement / rapport';
+$string['tg_section_settings'] = 'Réglages';
+
+$string['tg_section_points'] = 'points';
+$string['tg_section_description'] = 'Description';
+$string['tg_section_no_description'] = 'Pas de description';
+$string['tg_section_no_name'] = 'Sans nom';
+
+$string['tg_section_preview_next_level'] = 'au niveau supérieur';
+$string['tg_section_ranking_ranking_text'] = 'Classement';
+$string['tg_section_ranking_level'] = 'Niveau';
+$string['tg_section_ranking_student'] = 'Élève';
+$string['tg_section_ranking_total'] = 'Total';
+$string['tg_section_ranking_progress'] ='Progréssion %';
+
+$string['tg_section_settings_appearance'] = 'Apparence';
+$string['tg_section_settings_appearance_title'] = 'Titre';
+$string['tg_section_settings_levels'] = 'Paramètres de niveau';
+$string['tg_section_settings_levels_quantity'] = 'Niveaux';
+$string['tg_section_settings_levels_base_points'] = 'Points de base';
+$string['tg_section_settings_levels_calculated'] = 'Automatique';
+$string['tg_section_settings_levels_manually'] = 'Manuellement';
+$string['tg_section_settings_levels_name'] = 'Nom';
+$string['tg_section_settings_levels_required'] = 'Points requis';
+$string['tg_section_settings_rules'] = 'Liste des régles';
+$string['tg_section_settings_add_rule'] = 'Nouvelle règle';
+$string['tg_section_settings_earn'] = 'Pour cet événement, victoire:';
+$string['tg_section_settings_select_event'] = 'Sélectionnez un événement';
+$string['gm_Chart_Title']='Graphique de répartion';
+$string['gm_Chart_Y']='Etudiants';
+
+$string['tg_timenow'] = 'Juste maintenant';
+$string['tg_timeseconds'] = 'il y a {$a}s ';
+$string['tg_timeminutes'] = 'il y a {$a}m ';
+$string['tg_timehours'] = 'il y a {$a}h ';
+$string['tg_timedays'] = 'il y a {$a}d ';
+$string['tg_timeweeks'] = 'il y a {$a}w ';
+$string['tg_timewithinayearformat'] = '%b %e';
+$string['tg_timeolderyearformat'] = '%b %Y';
+
+/* General Errors */
+$string['fml_api_error_network'] = "Une erreur s'est produite dans la communication avec le serveur.";
+$string['fml_api_invalid_data'] = 'Données incorrectes';
+$string['fml_api_json_decode_error'] = 'Décodage d erreur de données envoyées';
+$string['fml_api_invalid_token_error'] = 'Le jeton envoyé dans la transaction n\'est pas valide, veuillez actualiser la page';
+$string['fml_api_invalid_transaction'] = 'La demande est incorrecte';
+$string['fml_api_invalid_profile'] = 'Vous ne pouvez pas faire cette action, votre profil est incorrect';
+$string['fml_api_save_successful'] = 'Les données ont été enregistrées avec succès sur le serveur';
+$string['fml_api_cancel_action'] = 'Vous avez annulé l\'action';
+$string['overview']='Vue d\'ensemble : ';
+$string['game_point_error']='Veuillez saisir les points';
+$string['game_event_error']='Veuillez saisir l\'évènement';
+$string['game_name_error']='Le nom est requis';
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
diff --git a/notemyprogress/lib.php b/notemyprogress/lib.php
index bae1b722ef8c9a293c1e90ede045de5e435aaa92..b398bb158ce96de7b8248683955bbf1c5855bb94 100644
--- a/notemyprogress/lib.php
+++ b/notemyprogress/lib.php
@@ -107,13 +107,19 @@ function local_notemyprogress_render_navbar_output(\renderer_base $renderer)
         array_push($items, local_notemyprogress_new_menu_item(s($text), $url));
     }
 
+<<<<<<< HEAD
     //ADD
     if (has_capability('local/notemyprogress:logs', $context) && $configuration_is_set) {
+=======
+    //ADD menu items
+    if(has_capability('local/notemyprogress:logs', $context) && $configuration_is_set){
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
         $text = get_string('menu_logs', 'local_notemyprogress');
         $url = new moodle_url('/local/notemyprogress/logs.php?courseid=' . $COURSE->id);
         array_push($items, local_notemyprogress_new_menu_item(s($text), $url));
     }
 
+<<<<<<< HEAD
     if (has_capability('local/notemyprogress:teacher_planning', $context) && $configuration_is_set) {
         $text = get_string('menu_planning', 'local_notemyprogress');
         $url = new moodle_url('/local/notemyprogress/metareflexion.php?courseid=' . $COURSE->id);
@@ -128,6 +134,19 @@ function local_notemyprogress_render_navbar_output(\renderer_base $renderer)
 
 
 
+=======
+    if(has_capability('local/notemyprogress:teacher_gamification', $context) && $configuration_is_set){
+        $text = 'Gamification';
+        $url = new moodle_url('/local/notemyprogress/gamification.php?courseid='.$COURSE->id);
+        array_push($items, local_notemyprogress_new_menu_item(s($text), $url));
+    }
+    if(has_capability('local/notemyprogress:student_gamification', $context) && !is_siteadmin() && $configuration_is_set){
+        $text = 'Gamification';
+        $url = new moodle_url('/local/notemyprogress/student_gamification.php?courseid='.$COURSE->id);
+        array_push($items, local_notemyprogress_new_menu_item(s($text), $url));
+    }
+
+>>>>>>> 42271d072b5508617432803ceb2659d2d3067682
     $params = [
         "title" => get_string('menu_main_title', 'local_notemyprogress'),
         "items" => $items
diff --git a/notemyprogress/locallib.php b/notemyprogress/locallib.php
index 8c78722ebc231653fa3640e3dff1e7a4fdf1e06f..680c1a3ab9db09a36003e13184969201369e667a 100644
--- a/notemyprogress/locallib.php
+++ b/notemyprogress/locallib.php
@@ -124,3 +124,119 @@ function local_notemyprogress_add_selected_property($groups, $groupid = null){
     }
     return $groups;
 }
+
+////////////////////////////////////
+//    Gamification function      ///
+////////////////////////////////////
+function local_notemyprogress_generate_token($courseid, $userid, $profile){
+    $key = local_notemyprogress_get_token_signature();
+    $payload = array(
+        "uid" => $userid,
+        "cid" => $courseid,
+        "pro" => $profile,
+    );
+    $time = local_notemyprogress_get_token_time_valid();
+    if ($time) {
+        $date = new DateTime();
+        $date = $date->format('U');
+        $payload['exp'] = intval($date) + $time;
+    }
+    return \local_notemyprogress\jwt\JWT::encode($payload, $key);
+}
+function local_notemyprogress_get_token_signature() {
+    $key = get_config("local_notemyprogress", "token_signature");
+    if (empty($key)) {
+        $key = "m73YvSn2mhFVeXtut5UY";  // default signature
+    }
+    return $key;
+}
+
+function local_notemyprogress_get_token_time_valid() {
+    return intval(get_config("local_notemyprogress", "token_time_valid"));
+}
+
+function local_notemyprogress_validate_token($token){
+    try {
+        global $DB;
+        $key = local_notemyprogress_get_token_signature();
+
+        $token = validate_param($token, PARAM_TEXT);
+
+        $decoded = \local_notemyprogress\jwt\JWT::decode($token, $key, array('HS256'));
+
+        $userid = validate_param($decoded->uid, PARAM_INT);
+        $courseid = validate_param($decoded->cid, PARAM_INT);
+
+        $COURSE = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
+        $USER = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST);
+
+        require_login($COURSE, false);
+        $context = context_course::instance($courseid);
+        require_capability('local/notemyprogress:ajax', $context);
+
+        $result = new stdClass();
+        $result->courseid = $COURSE->id;
+        $result->userid = $USER->id;
+        $result->profile = $decoded->pro;
+
+        return $result;
+    } catch (Exception $e) {
+        $message = get_string('fml_api_invalid_token_error', 'local_notemyprogress');
+        local_notemyprogress_ajax_response(null, $message, false, 403);
+    }
+    function local_notemyprogress_save_gamification_config($courseid, $userid, $rules, $levels, $settings, $url,$enable){
+            // \local_notemyprogress\logs::create(
+            //     "setgamification",
+            //     "configweeks",
+            //     "saved",
+            //     "weeks_settings",
+            //     $url,
+            //     4,
+            //     $userid,
+            //     $courseid
+            // );
+            $logs = new \local_notemyprogress\logs($courseid, $userid);
+            $logs->addLogsNMP("Saved", "section", "CONFIGURATION_GAMIFICATION", "configuration_gamification", $url, "GamificationSaved");
+        
+            $configLevels = new \local_notemyprogress\configgamification($courseid, $userid);
+            $configLevels->save_levels($levels, $settings, $rules);
+            $configLevels->save_enable($enable);
+            $message = get_string('fml_api_save_successful', 'local_notemyprogress');
+            local_notemyprogress_ajax_response(true, $message);
+        }
+
+        function local_notemyprogress_validate_action_and_profile($action, $profile){
+            $message = "";
+        
+            // Validate action
+            try {
+                $action = validate_param($action, PARAM_ALPHA);
+            } catch (Exception $e) {
+                $message = get_string('fml_api_invalid_transaction', 'local_notemyprogress');
+            }
+        
+            // Validate profile
+            if ($profile == "teacher") {
+                if ($action != "saveconfigweek" && $action != "changegroup" && $action != "worksessions" &&
+                    $action != "assignments"    && $action != "sendmail"    && $action != "quiz"         &&
+                    $action != "wordcloud"      && $action != "dropoutdata" && $action != "downloadlogs" &&
+                    $action != "saveinteraction" && $action != "saveconfiggamification") {
+                    $message = get_string('fml_api_invalid_transaction', 'local_notemyprogress');
+                }
+            } elseif ($profile == "student") {
+                if ($action != "studentsessions" && $action != "studentassigns" &&
+                    $action != "studenttimes" && $action != "saveinteraction") {
+                    $message = get_string('fml_api_invalid_transaction', 'local_notemyprogress');
+                }
+            } else {
+                $message = get_string('fml_api_invalid_profile', 'local_notemyprogress');
+            }
+        
+            if ($message != "") {
+                local_notemyprogress_ajax_response(null, $message, false, 400);
+            }
+        
+            return $action;
+        }
+}
+
diff --git a/notemyprogress/pix/badge.png b/notemyprogress/pix/badge.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8967018c82681ff21d40c98ba76980a64c70ca6
Binary files /dev/null and b/notemyprogress/pix/badge.png differ
diff --git a/notemyprogress/pix/rankImage.jpg b/notemyprogress/pix/rankImage.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d76465c8405a7cbe5825e39e070d0709e5d4b493
Binary files /dev/null and b/notemyprogress/pix/rankImage.jpg differ
diff --git a/notemyprogress/prueba.php b/notemyprogress/prueba.php
index f20ae14939f78114f144ac7374c4086c3e2918ce..5c3f44e44f9e2fb696965e09136be37c3ecc701e 100644
--- a/notemyprogress/prueba.php
+++ b/notemyprogress/prueba.php
@@ -47,7 +47,7 @@ $content = [
 
 
 
-$PAGE->requires->js_call_amd('local_notemyprogress/prueba','init', ['content' => $content]);
+$PAGE->requires->js_call_amd('local_notemyprogress/prueba', 'init', ['content' => $content]);
 echo $OUTPUT->header();
 echo $OUTPUT->render_from_template('local_notemyprogress/prueba', ['content' => $content]);
-echo $OUTPUT->footer();
\ No newline at end of file
+echo $OUTPUT->footer();
diff --git a/notemyprogress/student_gamification.php b/notemyprogress/student_gamification.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ebb905fc2ae58fef0871d6bb6171302f16129ea
--- /dev/null
+++ b/notemyprogress/student_gamification.php
@@ -0,0 +1,109 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * local notemyprogress
+ *
+ * @package     local_notemyprogress
+ * @copyright   2020 Edisson Sigua <edissonf.sigua@gmail.com>, Bryan Aguilar <bryan.aguilar6174@gmail.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+require_once('locallib.php');
+global $DB, $COURSE, $USER, $PAGE, $OUTPUT;
+
+$courseid = required_param('courseid', PARAM_INT);
+$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
+$context = context_course::instance($course->id);
+
+$url = '/local/notemyprogress/student_gamification.php';
+local_notemyprogress_set_page($course, $url);
+
+require_capability('local/notemyprogress:usepluggin', $context);
+require_capability('local/notemyprogress:student_gamification', $context);
+
+$configgamification = new \local_notemyprogress\configgamification($COURSE, $USER);
+$es = new \local_notemyprogress\event_strategy($COURSE, $USER);
+
+$userid=$es->get_user_info()->uid;
+
+$selectRankable = "SELECT rankable from {notemyprogress_xp} where courseid=? AND userid=? ";
+$rankable = $DB->get_record_sql($selectRankable, array("courseid="=>($courseid),"timecreated="=>$userid));
+if($rankable->rankable =='1'){
+    $rankableSend = "true";
+}
+$content = [
+    'strings' =>[
+        'title' => get_string('tg_section_title', 'local_notemyprogress'),
+        'help_title' => get_string('tg_section_help_title', 'local_notemyprogress'),
+        'help_description' => get_string('tg_section_help_description', 'local_notemyprogress'),
+        'helplabel' => get_string("helplabel","local_notemyprogress"),
+        'error_network' => get_string('fml_api_error_network', 'local_notemyprogress'),
+        'save_successful' => get_string('fml_api_save_successful', 'local_notemyprogress'),
+        'cancel_action' => get_string('fml_api_cancel_action', 'local_notemyprogress'),
+        'save_warning_title' => get_string('tg_save_warning_title', 'local_notemyprogress'),
+        'save_warning_content' => get_string('tg_save_warning_content', 'local_notemyprogress'),
+        'confirm_ok' => get_string('tg_confirm_ok', 'local_notemyprogress'),
+        'confirm_cancel' => get_string('tg_confirm_cancel', 'local_notemyprogress'),
+        'exitbutton' => get_string("exitbutton","local_notemyprogress"),
+        'save' => get_string("tg_save","local_notemyprogress"),
+        'experience' => get_string("tg_section_experience","local_notemyprogress"),
+        'information' => get_string("tg_section_information","local_notemyprogress"),
+        'ranking' => get_string("tg_section_ranking","local_notemyprogress"),
+        'points' => get_string("tg_section_points","local_notemyprogress"),
+        'no_description' => get_string("tg_section_no_description","local_notemyprogress"),
+        'description' => get_string("tg_section_description","local_notemyprogress"),
+        'to_next_level' => get_string("tg_section_preview_next_level","local_notemyprogress"),
+        'ranking_text' => get_string("tg_section_ranking_ranking_text","local_notemyprogress"),
+        'level' => get_string("tg_section_ranking_level","local_notemyprogress"),
+        'student' => get_string("tg_section_ranking_student","local_notemyprogress"),
+        'total' => get_string("tg_section_ranking_total","local_notemyprogress"),
+        'progress' => get_string("tg_section_ranking_progress","local_notemyprogress"),
+        'rankable'=> $rankableSend,
+        'studentRanking1'=>get_string("studentRanking1","local_notemyprogress"),
+        'studentRanking2'=>get_string("studentRanking2","local_notemyprogress"),
+        'studentRanking3'=>get_string("studentRanking3","local_notemyprogress"),
+        'overview'=>get_string("overview","local_notemyprogress"),
+    ],
+    'levels_data' => $configgamification->get_levels_data(),
+    'indicators' => $es->get_user_info(),
+    'ranking' => $es->get_ranking(1),
+    
+];
+
+$templatecontext = [
+    'image' => $OUTPUT->image_url('badge', 'local_notemyprogress'),
+    'rankImage' => $OUTPUT->image_url('rankImage', 'local_notemyprogress')
+];
+
+$maxTimeSql = "SELECT MAX(timecreated) as maximum from {notemyprogress_gamification} where courseid=? ";
+$timecrated = $DB->get_record_sql($maxTimeSql, array("courseid="=>($courseid)));
+
+$sql = "SELECT enablegamification from {notemyprogress_gamification} where courseid=? AND timecreated=? ";
+$value = $DB->get_record_sql($sql, array("courseid="=>($courseid),"timecreated="=>$timecrated->maximum));
+
+$PAGE->requires->js_call_amd('local_notemyprogress/student_gamification','init', ['content' => $content]);
+echo $OUTPUT->header();
+if ($value->enablegamification == 0){
+    // echo " non available gamification value : ";
+    // echo $value->enablegamification;
+    // echo " timecrated :";
+    // echo $timecrated->maximum; 
+    echo  get_string("gamification_denied","local_notemyprogress");
+}else{
+   echo $OUTPUT->render_from_template('local_notemyprogress/student_gamification', $templatecontext); 
+}
+
+echo $OUTPUT->footer();
\ No newline at end of file
diff --git a/notemyprogress/templates/gamification.mustache b/notemyprogress/templates/gamification.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..c40a8ac215b5265c43df7a50cc3a46dba30f9185
--- /dev/null
+++ b/notemyprogress/templates/gamification.mustache
@@ -0,0 +1,257 @@
+<v-app id="gamification" class="notemyprogress">
+    <v-main>
+        <pageheader :pagetitle="strings.title"
+                    :helptitle="strings.helplabel"
+                    :exitbutton="strings.exitbutton"
+                    :helpcontents="get_help_content()"
+                    :token="token"
+                    @open_help_section_modal="openHelpSectionModalEvent">
+        </pageheader>
+        <template>
+            <v-container pa-8>
+                <!-- Server message -->
+                <v-row class="justify-center" v-if="notifications.length > 0">
+                    <v-col cols="8">
+                        <v-alert v-for="(value, index, key) in notifications" 
+                                 :type="value.type" 
+                                 class="text-center" dense text dismissible>
+                            <span v-text="value.message"></span>
+                        </v-alert>
+                    </v-col>
+                </v-row>
+                        <v-card 
+                            class="align-center text-center flex"
+                            height="100"
+                            elevation ="1">
+                            <h4 v-text="strings.enable"><h4>
+                            <v-switch
+                                v-model ="swDisableEnable"
+                                inset
+                                color="red darken-3"
+                                class="pt-800 px-800 justify-center"
+                                @Change = disableEnable(swDisableEnable);
+                            ></v-switch>
+                        </v-card>
+                    <v-row>
+                        <v-col>
+                            <v-tabs v-model="tab" background-color="transparent">
+                                <v-tab v-text="strings.settings_level"></v-tab>
+                                <v-tab v-text="strings.preview"></v-tab>
+                                <v-tab v-text="strings.settings"></v-tab>
+                            </v-tabs>
+                            <v-tabs-items v-model="tab">
+                                <v-tab-item> <!-- Level and settings  -->
+                                    <v-row class="pt-8 px-8 justify-center">
+                                        <v-row>
+                                        <v-col cols="6" sm="4" md="3" lg="5">
+                                            <v-text-field
+                                                    type="number"
+                                                    readonly
+                                                    :label="strings.quantity"
+                                                    v-model="levelsData.length"
+                                                    append-outer-icon="mdi-plus-circle"
+                                                    prepend-icon="mdi-minus-circle"
+                                                    @click:append-outer="addLevel()"
+                                                    @click:prepend="removeLevel()"
+                                            ></v-text-field>
+                                        </v-col>
+                                        <v-col cols="6" sm="4" md="3" lg="2">
+                                            <v-text-field :label="strings.base_points" v-model="pointsBase" type="number">
+                                            </v-text-field>
+                                        </v-col>
+                                        <v-col cols="12" sm="4" md="4" lg="3">
+                                            <v-btn-toggle v-model="setPointsOption" tile group>
+                                                <v-btn value="calculated" v-text="strings.calculated"></v-btn>
+                                                <v-btn value="manually" v-text="strings.manually"></v-btn>
+                                            </v-btn-toggle>
+                                        </v-col>
+                                    </v-row>
+                                    </v-row>
+                                    <v-row class="pb-5 px-8">
+                                        <v-row v-for="(level, index) in levelsData" cols="12" sm="6" md="4" lg="3">
+                                            <v-card class="pt-5 align-center text-center">
+                                                <v-col :content="level.lvl" bottom offset-x="20" offset-y="20">
+                                                    <v-avatar size="100">
+                                                        <v-img src="{{{image}}}"></v-img>
+                                                    </v-avatar>
+                                                </v-col>
+                                                <v-card-text class="text--primary text-center">
+                                                    <v-text-field :label="strings.name" :rules="[v => !!v || strings.nameError]" required v-model="level.nam" type="text">
+                                                    </v-text-field>
+                                                    <v-text-field :label="strings.description" v-model="level.des" type="text">
+                                                    </v-text-field>
+                                                    <v-text-field :disabled="setPointsOption === 'calculated'" :label="strings.levels_required" v-model="calculatePoints(index)" type="number">
+                                                    </v-text-field>
+                                                </v-card-text>
+                                            </v-card>
+                                        </v-row>
+                                    </v-row>
+                                    <v-row class="pb-10 justify-center">
+                                            <v-btn @click="save_changes('levelsEdit')" v-text="strings.save" class="white--text" color="#118AB2"></v-btn>
+                                    </v-row>
+                                </v-tab-item>
+                                <v-tab-item> <!-- Student preview tab -->
+                                    <v-row class="justify-center">
+                                        <v-col cols="12" sm="11" md="7" lg="6" class="d-flex py-10">
+                                            <v-card class="align-center text-center flex">
+                                                <h4 class="py-5" v-text="settings.tit"></h4>
+                                                <p v-if="levelsData[0].nam" v-text="levelsData[0].nam"></p>
+                                                <v-badge
+                                                        :content="levelsData[0].lvl"
+                                                        bottom
+                                                        offset-x="20"
+                                                        offset-y="20"
+                                                >
+                                                    <v-avatar size="100">
+                                                        <v-img src="{{{image}}}"></v-img>
+                                                    </v-avatar>
+                                                </v-badge>
+                                                <v-card-text class="py-5">
+                                                    <small class="d-inline" v-text="levelsData[1].points"></small>
+                                                    <sup>xp</sup>
+                                                    <small v-text="strings.to_next_level"></small>
+                                                    <v-progress-linear
+                                                            color="#118AB2"
+                                                            :value="0"
+                                                            height="8"
+                                                    >
+                                                    </v-progress-linear>
+                                                    <p v-if="levelsData[0].des" class="pt-5" v-text="levelsData[0].des"></p>
+                                                    <h3 :class="[ !levelsData[0].des ? 'pt-5' : 'pt-0']"
+                                                        v-text="levelsData[0].points +' '+strings.points"></h3>
+                                                </v-card-text>
+                                                <v-card-actions>
+                                                    <p class="py-0 px-2" v-text="settings.des"></p>
+                                                </v-card-actions>
+                                            </v-card>
+                                        </v-col>
+                                    </v-row> <!-- Change the preview -->
+                                    <v-row class="pt-5 px-8 justify-center">
+                                        <v-col cols="12" md="12">
+                                            <h4 v-text="strings.appearance"></h4>
+                                        </v-col>
+                                        <v-col cols="12" md="12" class="">
+                                            <v-row class="justify-center">
+                                                <v-col cols="12" xs="10" md="6">
+                                                    <v-text-field :label="strings.appearance_title" v-model="settings.tit"></v-text-field>
+                                                </v-col>
+                                            </v-row>
+                                            <v-row class="justify-center">
+                                                <v-col cols="12" xs="10" md="6">
+                                                    <v-textarea :label="strings.description" auto-grow v-model="settings.des"></v-textarea>
+                                                </v-col>
+                                            </v-row>
+                                        </v-col>
+                                    </v-row>
+                                    <v-row class="pb-10 justify-center">
+                                        <v-btn @click="save_changes('studentSideEdit')" v-text="strings.save" class="white--text" color="#118AB2"></v-btn>
+                                    </v-row>
+                                </v-tab-item>
+                                <v-tab-item>
+                                    <v-row class="pt-5 px-8 justify-center justify-sm-space-between ">
+                                        <v-col cols="12" sm="6" md="5" lg="5">
+                                            <h4 v-text="strings.rules"></h4>
+                                        </v-col>
+                                        <v-col cols="6" sm="5" md="4" lg="4">
+                                            <v-btn
+                                                    block v-text="strings.add_rule"
+                                                    @click="addRule()"
+                                                    class="white--text"
+                                                    color="#118AB2">
+                                            </v-btn>
+                                        </v-col>
+                                    </v-row>
+                                    <v-row class="pt-5 pb-5 px-8">
+                                        <v-col v-for="(rule, index) in rulesData" cols="12" md="12">
+                                            <v-card class="align-center text-center">
+                                                <v-card-text class="text--primary text-center">
+                                                    <v-row class="align-center justify-space-around">
+                                                        <v-col cols="12" sm="4" md="3">
+                                                            <v-text-field
+                                                                    v-model="rule.points"
+                                                                    :label="strings.earn"
+                                                                    :rules="[v => !!v || strings.pointError]"
+                                                                    :suffix="strings.points"
+                                                                    type="number">
+                                                            </v-text-field>
+                                                        </v-col>
+                                                        <v-col cols="12" sm="6" md="7">
+                                                            <v-select
+                                                                    v-model="rule.rule"
+                                                                    attach
+                                                                    :menu-props="{ top: true, offsetY: true }"
+                                                                    :items="events"
+                                                                    item-text='name'
+                                                                    item-value='event'
+                                                                    :label="strings.select_event"
+                                                                    :rules="[v => !!v || strings.eventError]"
+                                                                    required>
+                                                            </v-select>
+                                                        </v-col>
+                                                        <v-col cols="12" sm="2" md="1">
+                                                            <v-btn :disabled="rulesData.length < 3" icon @click="removeRule(index)">
+                                                                <v-icon>mdi-delete</v-icon>
+                                                            </v-btn>
+                                                        </v-col>
+                                                    </v-row>
+                                                </v-card-text>
+                                            </v-card>
+                                        </v-col>
+
+                                    </v-row>
+                                    <v-row class="pb-10 justify-center">
+                                        <v-btn @click="save_changes('rulesEdit')" v-text="strings.save" class="white--text" color="#118AB2"></v-btn>
+                                    </v-row>
+                                </v-tab-item>
+                            </v-tabs-items>
+                        </v-col>
+
+                        <v-col>
+                            <v-row class="py-5 px-8">
+                                <v-col cols="12" md="12">
+                                    <v-data-table
+                                            :headers="table_headers()"
+                                            :items="ranking"
+                                            item-key="id"
+                                            :items-per-page="7"
+                                    >
+                                        <template v-slot:item.level="{ item }">
+                                            <v-badge
+                                                    inline
+                                                    bordered
+                                                    :content="item.level"
+                                            >
+                                                <v-avatar size="30">
+                                                    <img src="{{{image}}}">
+                                                </v-avatar>
+                                            </v-badge>
+                                        </template>
+                                        <template v-slot:item.progress_percentage="{ item }">
+                                            <v-progress-linear
+                                                    color="#118AB2"
+                                                    :value="item.progress_percentage"
+                                                    height="8"
+                                            >
+                                            </v-progress-linear>
+                                        </template>
+                                        <template v-slot:item.total="{ item }">
+                                            <p class="d-inline" v-text="item.total"></p>
+                                            <sup>xp</sup>
+                                        </template>
+                                    </v-data-table>
+                                </v-col>
+                            </v-row>
+                            <v-row>
+                                <chart
+                                    :container="'week_resourcess'"
+                                    :chart="chart_spread()"
+                                    :lang="strings.chart"
+                                ></chart>
+                            </v-row>
+                        </v-col>
+                     </v-row>
+                
+               </v-container> 
+        </template>
+    </v-main>
+</v-app>
\ No newline at end of file
diff --git a/notemyprogress/templates/student_gamification.mustache b/notemyprogress/templates/student_gamification.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..e464216de1cc646ed7a5d23197bbb90db37e66a2
--- /dev/null
+++ b/notemyprogress/templates/student_gamification.mustache
@@ -0,0 +1,161 @@
+<v-app id="student_gamification" class="notemyprogress">
+    <v-main>
+        <pageheader :pagetitle="strings.title"
+                    :helptitle="strings.helplabel"
+                    :exitbutton="strings.exitbutton"
+                    :helpcontents="get_help_content()"
+                    :token="token"
+                    @open_help_section_modal="openHelpSectionModalEvent">
+        </pageheader>
+        <template>
+            <v-card>
+                <v-row>
+                    <v-col cols=12 lg="6">
+                        <v-row class="justify-center">
+                            <v-col cols="12" sm="11" md="7" lg="6" class="d-flex py-10">
+                                <v-card class="align-center text-center flex">
+                                    <h4 class="py-5" v-text="settings.tit"></h4>
+                                    <p v-if="levelInfo.nam" v-text="levelInfo.nam"></p>
+                                    <v-badge
+                                            :content="indicators.level"
+                                            bottom
+                                            offset-x="20"
+                                            offset-y="20">
+                                        <v-avatar size="100">
+                                            <v-img src="{{{image}}}"></v-img>
+                                        </v-avatar>
+                                    </v-badge>
+                                    <v-card-text>
+                                        <small class="d-inline" v-text="indicators.pointsToNext"></small>
+                                        <sup>xp</sup>
+                                        <small v-text="strings.to_next_level"></small>
+                                        <v-progress-linear
+                                                color="#118AB2"
+                                                :value="indicators.progress" 
+                                                height="8"
+                                        >
+                                        </v-progress-linear>
+                                        <p v-if="levelInfo.des" class="pt-5" v-text="levelInfo.des"></p>
+                                        <h3 :class="[ !levelInfo.des ? 'pt-5' : 'pt-0']"
+                                            v-text="indicators.points +' '+strings.points"></h3>
+                                        <v-row class="justify-center text-left" v-for="action in activity" >
+                                            <v-col cols="5">
+                                                <small v-text="action.description"></small>
+                                            </v-col>
+                                            <v-col cols="3">
+                                                <small v-text="action.timeago"></small>
+                                            </v-col>
+                                            <v-col cols="3" sm="2">
+                                                <small v-text="action.points + ' '+strings.points"></small>
+                                            </v-col>
+                                        </v-row>
+                                    </v-card-text>
+                                    <v-card-actions>
+                                        <p class="py-0 px-2" v-text="settings.des"></p>
+                                    </v-card-actions>
+                                </v-card>
+                            </v-col>
+                        </v-row>
+                        <v-col>
+                            <h4 v-text=strings.overview></h4>
+                            <v-row class="py-5 px-8">
+                                <v-col v-for="(level, index) in levelsData" cols="12" sm="6" md="3" class="d-flex">
+                                    <v-card class="pt-5 align-center text-center flex">
+                                        <v-badge
+                                                :content="level.lvl"
+                                                bottom
+                                                offset-x="20"
+                                                offset-y="20"
+                                        >
+                                            <v-avatar size="100">
+                                                <v-img src="{{{image}}}"></v-img>
+                                            </v-avatar>
+                                        </v-badge>
+                                        <v-card-text class="text--primary text-center">
+                                            <h6 v-if="level.nam" v-text="level.nam"></h6>
+                                            <p v-if="level.des" class="pt-4 text-left" v-text="level.des"></p>
+                                            <p class="mb-0 pb-0" v-text="level.points+' '+strings.points"></p>
+                                        </v-card-text>
+                                    </v-card>
+                                </v-col>
+                            </v-row>
+                        </v-col>                                    
+                    </v-col>
+                    <v-col cols=12 lg="6">
+                        <v-row v-if="strings.rankable"class="py-5 px-8">
+                            <v-col cols="12" md="12">
+                                <v-data-table
+                                        :headers="table_headers()"
+                                        :items="ranking"
+                                        item-key="id"
+                                        :items-per-page="7"
+                                >
+                                    <template v-slot:item.level="{ item }">
+                                        <v-badge
+                                                inline
+                                                bordered
+                                                :content="item.level"
+                                        >
+                                            <v-avatar size="30">
+                                                <v-img src="{{{image}}}"></v-img>
+                                            </v-avatar>
+                                        </v-badge>
+                                    </template>
+                                    <template v-slot:item.progress_percentage="{ item }">
+                                        <v-progress-linear
+                                                color="#118AB2"
+                                                :value="item.progress_percentage"
+                                                height="8"
+                                        >
+                                        </v-progress-linear>
+                                    </template>
+                                    <template v-slot:item.total="{ item }">
+                                        <p class="d-inline" v-text="item.total"></p>
+                                        <sup>xp</sup>
+                                    </template>
+                                </v-data-table>
+
+
+
+                            </v-col>
+                        </v-row>
+                        <v-row v-else>
+                            <v-card
+                              class="mx-auto"
+                              max-width="90%"
+                              outlined
+                            >
+                              <v-list-item three-line>
+                                <v-list-item-content>
+                                  <v-list-item-title class="text-h5 mb-1" v-text=strings.studentRanking1>
+                                  </v-list-item-title>
+                                  <v-list-item-subtitle v-text=strings.studentRanking2></v-list-item-subtitle>
+                                </v-list-item-content>
+  
+                                <v-list-item-avatar
+                                  tile
+                                  size="80"
+                                  color="red"
+                                  
+                                ><v-img src="{{{rankImage}}}"></v-img></v-list-item-avatar>
+                              </v-list-item>
+  
+                              <v-card-actions>
+                                <v-btn
+                                  outlined
+                                  rounded
+                                  text
+                                  @click=activateRanking()
+                                  v-text=strings.studentRanking3
+                                >
+                                </v-btn>
+                              </v-card-actions>
+                            </v-card>
+                        </v-row>
+                    </v-col>
+                </v-row>
+            </v-card>
+            
+        </template>
+    </v-main>
+</v-app>
\ No newline at end of file