function BrushController(zr) {

    if (__DEV__) {
        zrUtil.assert(zr);
    }

    Eventful.call(this);

    /**
     * @type {module:zrender/zrender~ZRender}
     * @private
     */
    this._zr = zr;

    /**
     * @type {module:zrender/container/Group}
     * @readOnly
     */
    this.group = new graphic.Group();

    /**
     * Only for drawing (after enabledBrush).
     *     'line', 'rect', 'polygon' or false
     *     If passing false/null/undefined, disable brush.
     *     If passing 'auto', determined by panel.defaultBrushType
     * @private
     * @type {string}
     */
    this._brushType;

    /**
     * Only for drawing (after enabledBrush).
     *
     * @private
     * @type {Object}
     */
    this._brushOption;

    /**
     * @private
     * @type {Object}
     */
    this._panels;

    /**
     * @private
     * @type {Array.<nubmer>}
     */
    this._track = [];

    /**
     * @private
     * @type {boolean}
     */
    this._dragging;

    /**
     * @private
     * @type {Array}
     */
    this._covers = [];

    /**
     * @private
     * @type {moudule:zrender/container/Group}
     */
    this._creatingCover;

    /**
     * `true` means global panel
     * @private
     * @type {module:zrender/container/Group|boolean}
     */
    this._creatingPanel;

    /**
     * @private
     * @type {boolean}
     */
    this._enableGlobalPan;

    /**
     * @private
     * @type {boolean}
     */
    if (__DEV__) {
        this._mounted;
    }

    /**
     * @private
     * @type {string}
     */
    this._uid = 'brushController_' + baseUID++;

    /**
     * @private
     * @type {Object}
     */
    this._handlers = {};
    each(mouseHandlers, function (handler, eventName) {
        this._handlers[eventName] = zrUtil.bind(handler, this);
    }, this);
}
function BrushController(zr) {

    if (__DEV__) {
        zrUtil.assert(zr);
    }

    Eventful.call(this);

    /**
     * @type {module:zrender/zrender~ZRender}
     * @private
     */
    this._zr = zr;

    /**
     * @type {module:zrender/container/Group}
     * @readOnly
     */
    this.group = new graphic.Group();

    /**
     * Only for drawing (after enabledBrush).
     *     'line', 'rect', 'polygon' or false
     *     If passing false/null/undefined, disable brush.
     *     If passing 'auto', determined by panel.defaultBrushType
     * @private
     * @type {string}
     */
    this._brushType;

    /**
     * Only for drawing (after enabledBrush).
     *
     * @private
     * @type {Object}
     */
    this._brushOption;

    /**
     * @private
     * @type {Object}
     */
    this._panels;

    /**
     * @private
     * @type {Array.<nubmer>}
     */
    this._track = [];

    /**
     * @private
     * @type {boolean}
     */
    this._dragging;

    /**
     * @private
     * @type {Array}
     */
    this._covers = [];

    /**
     * @private
     * @type {moudule:zrender/container/Group}
     */
    this._creatingCover;

    /**
     * `true` means global panel
     * @private
     * @type {module:zrender/container/Group|boolean}
     */
    this._creatingPanel;

    /**
     * @private
     * @type {boolean}
     */
    this._enableGlobalPan;

    /**
     * @private
     * @type {boolean}
     */
    if (__DEV__) {
        this._mounted;
    }

    /**
     * @private
     * @type {string}
     */
    this._uid = 'brushController_' + baseUID++;

    /**
     * @private
     * @type {Object}
     */
    this._handlers = {};
    each(mouseHandlers, function (handler, eventName) {
        this._handlers[eventName] = zrUtil.bind(handler, this);
    }, this);
}
function BrushController ( zr ) { if ( __DEV__ ) { zrUtil . assert ( zr ) ; } Eventful . call ( this ) ; /**
     * @type {module:zrender/zrender~ZRender}
     * @private
     */ this . _zr = zr ; /**
     * @type {module:zrender/container/Group}
     * @readOnly
     */ this . group = new graphic . Group ( ) ; /**
     * Only for drawing (after enabledBrush).
     *     'line', 'rect', 'polygon' or false
     *     If passing false/null/undefined, disable brush.
     *     If passing 'auto', determined by panel.defaultBrushType
     * @private
     * @type {string}
     */ this . _brushType ; /**
     * Only for drawing (after enabledBrush).
     *
     * @private
     * @type {Object}
     */ this . _brushOption ; /**
     * @private
     * @type {Object}
     */ this . _panels ; /**
     * @private
     * @type {Array.<nubmer>}
     */ this . _track = [ ] ; /**
     * @private
     * @type {boolean}
     */ this . _dragging ; /**
     * @private
     * @type {Array}
     */ this . _covers = [ ] ; /**
     * @private
     * @type {moudule:zrender/container/Group}
     */ this . _creatingCover ; /**
     * `true` means global panel
     * @private
     * @type {module:zrender/container/Group|boolean}
     */ this . _creatingPanel ; /**
     * @private
     * @type {boolean}
     */ this . _enableGlobalPan ; /**
     * @private
     * @type {boolean}
     */ if ( __DEV__ ) { this . _mounted ; } /**
     * @private
     * @type {string}
     */ this . _uid = 'brushController_' + baseUID ++ ; /**
     * @private
     * @type {Object}
     */ this . _handlers = { } ; each ( mouseHandlers , function ( handler , eventName ) { this . _handlers [ eventName ] = zrUtil . bind ( handler , this ) ; } , this ) ; }
@alias module:echarts/component/helper/BrushController
@constructor
@mixin {module:zrender/mixin/Eventful}
@event module:echarts/component/helper/BrushController#brush
params:
areas: Array.<Array>, coord relates to container group,
If no container specified, to global.
opt {
isEnd: boolean,
removeOnClick: boolean
}

@param {module:zrender/zrender~ZRender} zr
@alias module : echarts / component / helper / BrushController @constructor @mixin { module : zrender / mixin / Eventful } @event module : echarts / component / helper / BrushController#brush params : areas : Array . <Array > coord relates to container group If no container specified to global . opt { isEnd : boolean removeOnClick : boolean }
The controller for the brush.