text: /*!
   * CanJS - 2.3.28
   * http://canjs.com/
   * Copyright (c) 2016 Bitovi
   * Thu, 08 Dec 2016 20:53:50 GMT
   * Licensed MIT
   */
  
  /*can@2.3.28#view/callbacks/callbacks*/
  steal('can/util', 'can/view', function (can) {
      var attr = can.view.attr = function (attributeName, attrHandler) {
          if (attrHandler) {
              if (typeof attributeName === 'string') {
                  attributes[attributeName] = attrHandler;
              } else {
                  regExpAttributes.push({
                      match: attributeName,
                      handler: attrHandler
                  });
              }
          } else {
              var cb = attributes[attributeName];
              if (!cb) {
                  for (var i = 0, len = regExpAttributes.length; i < len; i++) {
                      var attrMatcher = regExpAttributes[i];
                      if (attrMatcher.match.test(attributeName)) {
                          cb = attrMatcher.handler;
                          break;
                      }
                  }
              }
              return cb;
          }
      };
      var attributes = {}, regExpAttributes = [], automaticCustomElementCharacters = /[-\:]/;
      var tag = can.view.tag = function (tagName, tagHandler) {
          if (tagHandler) {
              if (typeof tags[tagName.toLowerCase()] !== 'undefined') {
                  can.dev.warn('Custom tag: ' + tagName.toLowerCase() + ' is already defined');
              }
              if (!automaticCustomElementCharacters.test(tagName) && tagName !== 'content') {
                  can.dev.warn('Custom tag: ' + tagName.toLowerCase() + ' is missing a hyphen');
              }
              if (can.global.html5) {
                  can.global.html5.elements += ' ' + tagName;
                  can.global.html5.shivDocument();
              }
              tags[tagName.toLowerCase()] = tagHandler;
          } else {
              var cb = tags[tagName.toLowerCase()];
              if (!cb && automaticCustomElementCharacters.test(tagName)) {
                  cb = function () {
                  };
              }
              return cb;
          }
      };
      var tags = {};
      can.view.callbacks = {
          _tags: tags,
          _attributes: attributes,
          _regExpAttributes: regExpAttributes,
          tag: tag,
          attr: attr,
          tagHandler: function (el, tagName, tagData) {
              var helperTagCallback = tagData.options.get('tags.' + tagName, { proxyMethods: false }), tagCallback = helperTagCallback || tags[tagName];
              var scope = tagData.scope, res;
              if (tagCallback) {
                  res = can.__notObserve(tagCallback)(el, tagData);
              } else {
                  res = scope;
              }
              if (!tagCallback) {
                  can.dev.warn('can/view/scanner.js: No custom element found for ' + tagName);
              }
              if (res && tagData.subtemplate) {
                  if (scope !== res) {
                      scope = scope.add(res);
                  }
                  var result = tagData.subtemplate(scope, tagData.options);
                  var frag = typeof result === 'string' ? can.view.frag(result) : result;
                  can.appendChild(el, frag);
              }
          }
      };
      return can.view.callbacks;
  });