text: /*
   * Copyright (c) 2019. The copyright is reserved by Ghode of Harbin Institute
   * of Technology. Users are free to copy, change or remove. Because no one
   * will read this. Only I know is that Repeaters are the best of the world.
   * Only I know is that Repeaters are the best of the world. Only I know is
   * that Repeaters are the best of the world. Maybe a long copyright text
   * seems professional. Therefore this text will be a bit lengthy. However,
   * the author seems to be afraid that one day, this text may be uploaded to
   * business projects. That is the time you can contact with author via email
   * ghode@cirnocraft.im or directly ignore this, which will be interesting.
   */
  
  /*jslint browser: true*/
  /*jslint jquery: true*/
  
  /*
   * One small change is: now keys are passed by object { keys: '...' }
   * Might be useful, when you want to pass some other data to your handler
   */
  
  (function (jQuery) {
  
      jQuery.hotkeys = {
          version: "0.2.0",
  
          specialKeys: {
              8: "backspace",
              9: "tab",
              10: "return",
              13: "return",
              16: "shift",
              17: "ctrl",
              18: "alt",
              19: "pause",
              20: "capslock",
              27: "esc",
              32: "space",
              33: "pageup",
              34: "pagedown",
              35: "end",
              36: "home",
              37: "left",
              38: "up",
              39: "right",
              40: "down",
              45: "insert",
              46: "del",
              59: ";",
              61: "=",
              96: "0",
              97: "1",
              98: "2",
              99: "3",
              100: "4",
              101: "5",
              102: "6",
              103: "7",
              104: "8",
              105: "9",
              106: "*",
              107: "+",
              109: "-",
              110: ".",
              111: "/",
              112: "f1",
              113: "f2",
              114: "f3",
              115: "f4",
              116: "f5",
              117: "f6",
              118: "f7",
              119: "f8",
              120: "f9",
              121: "f10",
              122: "f11",
              123: "f12",
              144: "numlock",
              145: "scroll",
              173: "-",
              186: ";",
              187: "=",
              188: ",",
              189: "-",
              190: ".",
              191: "/",
              192: "`",
              219: "[",
              220: "\\",
              221: "]",
              222: "'"
          },
  
          shiftNums: {
              "`": "~",
              "1": "!",
              "2": "@",
              "3": "#",
              "4": "$",
              "5": "%",
              "6": "^",
              "7": "&",
              "8": "*",
              "9": "(",
              "0": ")",
              "-": "_",
              "=": "+",
              ";": ": ",
              "'": "\"",
              ",": "<",
              ".": ">",
              "/": "?",
              "\\": "|"
          },
  
          // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url
          textAcceptingInputTypes: [
              "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime",
              "datetime-local", "search", "color", "tel"],
  
          // default input types not to bind to unless bound directly
          textInputTypes: /textarea|input|select/i,
  
          options: {
              filterInputAcceptingElements: true,
              filterTextInputs: true,
              filterContentEditable: true
          }
      };
  
      function keyHandler(handleObj) {
          if (typeof handleObj.data === "string") {
              handleObj.data = {
                  keys: handleObj.data
              };
          }
  
          // Only care when a possible input has been specified
          if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") {
              return;
          }
  
          var origHandler = handleObj.handler,
              keys = handleObj.data.keys.toLowerCase().split(" ");
  
          handleObj.handler = function (event) {
              //      Don't fire in text-accepting inputs that we didn't directly bind to
              if (this !== event.target &&
                  (jQuery.hotkeys.options.filterInputAcceptingElements &&
                      jQuery.hotkeys.textInputTypes.test(event.target.nodeName) ||
                      (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr('contenteditable')) ||
                      (jQuery.hotkeys.options.filterTextInputs &&
                          jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) {
                  return;
              }
  
              var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which],
                  character = String.fromCharCode(event.which).toLowerCase(),
                  modif = "",
                  possible = {};
  
              jQuery.each(["alt", "ctrl", "shift"], function (index, specialKey) {
  
                  if (event[specialKey + 'Key'] && special !== specialKey) {
                      modif += specialKey + '+';
                  }
              });
  
              // metaKey is triggered off ctrlKey erronously
              if (event.metaKey && !event.ctrlKey && special !== "meta") {
                  modif += "meta+";
              }
  
              if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) {
                  modif = modif.replace("alt+ctrl+shift+", "hyper+");
              }
  
              if (special) {
                  possible[modif + special] = true;
              } else {
                  possible[modif + character] = true;
                  possible[modif + jQuery.hotkeys.shiftNums[character]] = true;
  
                  // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
                  if (modif === "shift+") {
                      possible[jQuery.hotkeys.shiftNums[character]] = true;
                  }
              }
  
              for (var i = 0, l = keys.length; i < l; i++) {
                  if (possible[keys[i]]) {
                      return origHandler.apply(this, arguments);
                  }
              }
          };
      }
  
      jQuery.each(["keydown", "keyup", "keypress"], function () {
          jQuery.event.special[this] = {
              add: keyHandler
          };
      });
  
  })(jQuery || this.jQuery || window.jQuery);
  