whole_func_string: function createBound(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
        var isBind = bitmask & 1,
            isBindKey = bitmask & 2,
            isCurry = bitmask & 4,
            isCurryBound = bitmask & 8,
            isPartial = bitmask & 16,
            isPartialRight = bitmask & 32,
            key = func;
  
        if (!isBindKey && !isFunction(func)) {
          throw new TypeError;
        }
        if (isPartial && !partialArgs.length) {
          bitmask &= ~16;
          isPartial = partialArgs = false;
        }
        if (isPartialRight && !partialRightArgs.length) {
          bitmask &= ~32;
          isPartialRight = partialRightArgs = false;
        }
        var bindData = func && func.__bindData__;
        if (bindData) {
          if (isBind && !(bindData[1] & 1)) {
            bindData[4] = thisArg;
          }
          if (!isBind && bindData[1] & 1) {
            bitmask |= 8;
          }
          if (isCurry && !(bindData[1] & 4)) {
            bindData[5] = arity;
          }
          if (isPartial) {
            push.apply(bindData[2] || (bindData[2] = []), partialArgs);
          }
          if (isPartialRight) {
            push.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
          }
          bindData[1] |= bitmask;
          return createBound.apply(null, bindData);
        }
        // use `Function#bind` if it exists and is fast
        // (in V8 `Function#bind` is slower except when partially applied)
        if (isBind && !(isBindKey || isCurry || isPartialRight) &&
            (support.fastBind || (nativeBind && isPartial))) {
          if (isPartial) {
            var args = [thisArg];
            push.apply(args, partialArgs);
          }
          var bound = isPartial
            ? nativeBind.apply(func, args)
            : nativeBind.call(func, thisArg);
        }
        else {
          bound = function() {
            // `Function#bind` spec
            // http://es5.github.io/#x15.3.4.5
            var args = arguments,
                thisBinding = isBind ? thisArg : this;
  
            if (isCurry || isPartial || isPartialRight) {
              args = nativeSlice.call(args);
              if (isPartial) {
                unshift.apply(args, partialArgs);
              }
              if (isPartialRight) {
                push.apply(args, partialRightArgs);
              }
              if (isCurry && args.length < arity) {
                bitmask |= 16 & ~32;
                return createBound(func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity);
              }
            }
            if (isBindKey) {
              func = thisBinding[key];
            }
            if (this instanceof bound) {
              // ensure `new bound` is an instance of `func`
              thisBinding = createObject(func.prototype);
  
              // mimic the constructor's `return` behavior
              // http://es5.github.io/#x13.2.2
              var result = func.apply(thisBinding, args);
              return isObject(result) ? result : thisBinding;
            }
            return func.apply(thisBinding, args);
          };
        }
        setBindData(bound, nativeSlice.call(arguments));
        return bound;
      }
func_code_string: function createBound(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
        var isBind = bitmask & 1,
            isBindKey = bitmask & 2,
            isCurry = bitmask & 4,
            isCurryBound = bitmask & 8,
            isPartial = bitmask & 16,
            isPartialRight = bitmask & 32,
            key = func;
  
        if (!isBindKey && !isFunction(func)) {
          throw new TypeError;
        }
        if (isPartial && !partialArgs.length) {
          bitmask &= ~16;
          isPartial = partialArgs = false;
        }
        if (isPartialRight && !partialRightArgs.length) {
          bitmask &= ~32;
          isPartialRight = partialRightArgs = false;
        }
        var bindData = func && func.__bindData__;
        if (bindData) {
          if (isBind && !(bindData[1] & 1)) {
            bindData[4] = thisArg;
          }
          if (!isBind && bindData[1] & 1) {
            bitmask |= 8;
          }
          if (isCurry && !(bindData[1] & 4)) {
            bindData[5] = arity;
          }
          if (isPartial) {
            push.apply(bindData[2] || (bindData[2] = []), partialArgs);
          }
          if (isPartialRight) {
            push.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
          }
          bindData[1] |= bitmask;
          return createBound.apply(null, bindData);
        }
        // use `Function#bind` if it exists and is fast
        // (in V8 `Function#bind` is slower except when partially applied)
        if (isBind && !(isBindKey || isCurry || isPartialRight) &&
            (support.fastBind || (nativeBind && isPartial))) {
          if (isPartial) {
            var args = [thisArg];
            push.apply(args, partialArgs);
          }
          var bound = isPartial
            ? nativeBind.apply(func, args)
            : nativeBind.call(func, thisArg);
        }
        else {
          bound = function() {
            // `Function#bind` spec
            // http://es5.github.io/#x15.3.4.5
            var args = arguments,
                thisBinding = isBind ? thisArg : this;
  
            if (isCurry || isPartial || isPartialRight) {
              args = nativeSlice.call(args);
              if (isPartial) {
                unshift.apply(args, partialArgs);
              }
              if (isPartialRight) {
                push.apply(args, partialRightArgs);
              }
              if (isCurry && args.length < arity) {
                bitmask |= 16 & ~32;
                return createBound(func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity);
              }
            }
            if (isBindKey) {
              func = thisBinding[key];
            }
            if (this instanceof bound) {
              // ensure `new bound` is an instance of `func`
              thisBinding = createObject(func.prototype);
  
              // mimic the constructor's `return` behavior
              // http://es5.github.io/#x13.2.2
              var result = func.apply(thisBinding, args);
              return isObject(result) ? result : thisBinding;
            }
            return func.apply(thisBinding, args);
          };
        }
        setBindData(bound, nativeSlice.call(arguments));
        return bound;
      }
func_documentation_string: Creates a function that, when called, either curries or invokes `func`
  with an optional `this` binding and partially applied arguments.
  
  @private
  @param {Function|string} func The function or method name to reference.
  @param {number} bitmask The bitmask of method flags to compose.
  The bitmask may be composed of the following flags:
  1 - `_.bind`
  2 - `_.bindKey`
  4 - `_.curry`
  8 - `_.curry` (bound)
  16 - `_.partial`
  32 - `_.partialRight`
  @param {Array} [partialArgs] An array of arguments to prepend to those
  provided to the new function.
  @param {Array} [partialRightArgs] An array of arguments to append to those
  provided to the new function.
  @param {*} [thisArg] The `this` binding of `func`.
  @param {number} [arity] The arity of `func`.
  @returns {Function} Returns the new bound function.