纯js实现 斗地主 有帮助三连吧!!!

不多哔哔直接 上干货 需要5个js文件支持 都放在下方了

<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" >
    <title></title>
    <script src="script/konva.min.js"></script>
    <script src="script/GrawGame.js" ></script>
    <script src="script/GameEntity.js" ></script>
    <script src="script/veriable.js" ></script>
    <script src="script/PlayGame.js" ></script>
    <style>
        body {
            position: fixed;
            width: 100%;
            height: 390px;
            padding: 0;
            margin: 0;
            overflow: hidden;
        }
        .ButtonDiv{
            width: 90px;
            height: 20px;
            text-align: center;
            border-radius: 5px;
            padding: 5px;
            cursor: pointer;
            position:absolute;
        }
        #CallLandLord{
            top: 230px;
            left: calc(50% - 120px);
            background-color: aqua;
        }
        #RobLandLord{
            top: 230px;
            left: calc(50%);
            background-color: rgb(244, 158, 11);
        }
        #ButtonDiv{
            display: none;
        }
        @media screen and (orientation: portrait) {
            body {
                position: absolute;
                width: 100vh;
                height: 390px;
                top: 0;
                left: 100vw;
                -webkit-transform: rotate(90deg);
                -moz-transform: rotate(90deg);
                -ms-transform: rotate(90deg);
                transform: rotate(90deg);
                transform-origin: 0% 0%;
            }
        }
        @media screen and (orientation: landscape) {
            body {
                position: absolute;
                top: 0;
                left: 0;
                width: 100vw;
                height: 390px;
            }
        }
</style>
</head>
<body >
    <div id="bodyPlayer" style="margin: 0 auto; max-width: 844px; width: 100%; height: 390px; border: solid 1px;"></div>
    <div style="width: 300px; text-align: center;
    position: absolute; top: 3%; 
    left: calc(50% - 150px);" id="txtInfo"> 信息 </div>
    <div id="ButtonDiv">
        <div id="CallLandLord" class="ButtonDiv" > 不叫 </div>
        <div id="RobLandLord" class="ButtonDiv" > 叫地主 </div>
    </div>
    <script>

    </script>
</body>

</html>

js文件1

 


/**
 * 实体类;有些实体其中的行为,
 * 可能没有严格符合面向对象规范,
 * 原因在于对象与过程之间的界限难以区分
 */

// 玩家
class Player{
    constructor(BoardList, name, color){
        this.Color = color
        // Board对象
        this.BoardList = BoardList
        this.name = name
        this.GroupBoard = null
    }
    // 通过ID获取牌
    GetBoardOfID(id){
        if(this.BoardList.length>0){
            for(let i=0;i<this.BoardList.length;i++){
                if(this.BoardList[i].id == id)
                    return i
            }
        }
        return -1
    }
    // 根据ID删除节点
    DeleteIDOfBoard(id){
        if(this.BoardList.length<1) return
        let index_ = this.GetBoardOfID(id)
        this.BoardList.splice(index_, 1)
    }
    // 将手中的牌按照顺序排列
    BoardListSort(){
        BoardSort(this.BoardList)
    }
    // 提示出牌
    AutoSendBoard(){
        // 提示出牌需要满足几个条件,
        // 首先上家没有出牌时,那么按照最大的类型出牌(炸弹除外),如Y2>Y1
        // 如果上家有出牌,那么需要判断当前牌组之中是否有相对应类型的牌
        // 玩家需要自己维护自己所有的牌总量(机器人由程序维护),如一手牌组当中有几个飞机几个顺子
        
    }

    // 将当前的牌聚类为一个个的牌组合;返回牌组合数组
    // 如:987654333 return: Y5,Y3,Y2
    ClusterType(){

    }
}

// 牌对象
// type ♥,♠,♦,♣
class Board{
    constructor(surface, type, id){
        this.surface = surface
        this.type = type
        this.id = type + id
        this.DrawBoardFront = CreateBorad(width/2-30, height/2-45, this)
        this.DrawBoardFront._id = id
        // id必须是要唯一的
        this.DrawBoardBack = BoardBack(width/2-30, height/2-45, this)
        this.DrawBoardBack._id = '0'+id
    }

}

// 组合牌
class BoardCombin{
    constructor(BoardList, Type, Value, length){
        this.BoardList = BoardList
        this.Type = Type
        this.Value = Value
        this.Length = length
    }
}

// 这里可以优化,使用有限状态机会更好,逻辑更清晰
// 判定出牌边界,类型一致,牌的数量一致,不小于桌面价值量
// 单:    1;     Y1
// 对:    2;     Y2  *
// 三带:  3~5;   Y3 
// 顺:    5~12;  Y4
// 连对:   6~16;  Y5  *
// 飞机:   6~16;  Y6
// 四带二: 6~8;   Y7  *
// 炸弹:   4      Y8  *
// 王炸:   2      Y8  *
// 牌组分类器
class BoardType{
    constructor(BoardList, Boards){
        this.Boards = BoardList
        this.BoardList = new Array()
        if(Boards!=null) 
            this.BoardList = Boards
        // 将牌对象划为简单的字面量
        this.BoardListValue = new Array();
        for(let i=0;i<BoardList.length;i++){
            this.BoardList.push( BoardList[i].surface )
            this.BoardListValue.push(BoardMarkMap.get(BoardList[i].surface))
        }
    }
    // 获取出牌的类型,判定牌是否严格属于哪一类型
    GetType(){
        var length = this.BoardList.length;
        // 单牌
        if(length === 1){
            return this.FiltrateSign(this.BoardList)
        }
        // 对子,王炸
        if(length === 2){
            return this.FiltrateTow(this.BoardList)
        }
        // 三带,炸弹
        if(length>=3 && length<=5){
            return this.FiltrateThree(this.BoardList)
        }
        // 飞机,连对,顺子,四带二
        if(length>=5 && length<=16){
            return this.FiltrateLine(this.BoardList)
        }
        
    }
    // 单牌过滤
    FiltrateSign(BoardList_){
        var value_ = BoardMarkMap.get(BoardList_[0])
        return new BoardCombin(this.Boards, "Y1", value_, 1)
    }
    // 双牌过滤=》王炸
    FiltrateTow(BoardList_){
        if(BoardList_[0]===BoardList_[1]){
            var value_ = BoardMarkMap.get(BoardList_[0])
            return new BoardCombin(this.Boards, "Y2", value_, 2)
        } else{
            return this.FiltrateKingMax(BoardList_)
        }
    }
    // 三带过滤=》顺子=》炸弹
    FiltrateThree(BoardList_){
        var temp = BoardList_.join('')
        // 其中任一一张牌出现三次以上
        var reg = /(\d|J|Q|K|A)\1{2}/
        var index = temp.search(reg)
        if(!reg.test(temp)) {
            // 如果没有匹配到三带,那么有可能是顺子
            if(temp.length===5) 
                return this.FiltrateLine(BoardList_)
            return null
        };
        
        var value_ = BoardMarkMap.get(BoardList_[index])
        // 判断是三不带|三带一|三带对
        temp = temp.replace(reg, '')
        if(temp.length==0)
            return new BoardCombin(this.Boards, "Y3", value_, 3)
        if(temp.length==1 && temp!=BoardList_[index])
            return new BoardCombin(this.Boards, "Y3", value_, 4)
        else if(temp.length==1){
            return this.FiltrateBomb(BoardList_);
        }
        if(temp.length==2 && temp[0] == temp[1])
            return new BoardCombin(this.Boards, "Y3", value_, 5)
        return null
    }
    // 顺子过滤=》连对=》飞机=》四带二
    FiltrateLine(BoardList_){
        var temp = BoardList_.join('')
        // 如果牌组数量大于5,那么更有可能是连对或者飞机,四带二
        if(temp.length>5){
            var tempData = null;
            // 过滤连对,过滤四带二,只有偶数才可
            if(temp.length%2===0)
            {
                tempData = this.FiltrateLineTwo(BoardList_)
                if(tempData != null) return tempData
                var tempData = this.FiltrateFour(BoardList_)
                if(tempData != null) return tempData
            }
            // 飞机过滤
            tempData = this.FiltrateAir(BoardList_)
            if(tempData != null) return tempData
        }
        // 如果出现2,小鬼,大鬼那么就不是顺子
        var reg = /(2|C|G)/
        if(reg.test(temp)) return null;
        var value_ = this.BoardListValue[0]
        for(var i=1; i<BoardList_.length; i++){
            // 顺子必须是连续的,即每个数之间相差要等于1
            if(this.BoardListValue[i-1]-this.BoardListValue[i]!=1)
                return null;
        }
        return new BoardCombin(this.Boards,'Y4', value_, BoardList_.length)
    }
    // 飞机过滤
    // 飞机可带两张单牌,或者两个对子,亦或者不带
    FiltrateAir(BoardList_){
        var temp = BoardList_.join('')
        // 其中任多张牌出现三次
        var reg = /(0|[3-9]|J|Q|K|A)\1{2}/g // 三带
        var tempList_1 = temp.match(reg)
        if(tempList_1==null) return null
        var recode = 0
        // 飞机至少要是两个连起来的三带
        for(var i=1; i<tempList_1.length; i++){
            var i1 = BoardMarkMap.get(tempList_1[i][0])
            var i2 = BoardMarkMap.get(tempList_1[i-1][0])
            if(i2-i1==1){
                temp = temp.replace(tempList_1[i],'')
                temp = temp.replace(tempList_1[i-1],'')
            }else
                recode++
        }
        var len = tempList_1.length-recode
        if(len<2) return null
        // 返回牌组对象
        var value_ = BoardMarkMap.get(tempList_1[0][0])
        // 三不带
        if(temp.length===0)
            return new BoardCombin(this.Boards, 'Y6', value_, BoardList_.length)
        // 判断剩余的牌,剩余的牌有可能是单牌也可能是对子
        var reg_Two = /(\d|J|Q|K|A|2)\1{1}/g // 对子
        var tempList_2 = temp.match(reg_Two)
        // 飞机带对子,每个飞机可以带一个对子所以必须数量一致
        if(tempList_2!=null && tempList_2.length!=len && temp.length!=len)
            return null
        if(tempList_2==null && temp.length!=len)
            return null
        return new BoardCombin(this.Boards, 'Y6', value_, BoardList_.length)
    }
    // 四带二,四可带两张or两对
    FiltrateFour(BoardList_){
        if(BoardList_.length>8) return null
        // 因为四带二是由炸弹组成,匹配四张牌
        var temp = BoardList_.join('')
        // 其中任一一张牌出现四次
        var reg = /(\d|J|Q|K|A)\1{3}/
        var index = temp.search(reg)
        if(index==-1) return null
        // 将四张一样的牌剔除掉
        temp = temp.replace(reg,'')
        var reg_Two = /(\d|J|Q|K|A|C|G)\1{1}/g
        // 匹配剩余的牌;
        var temp_list2 = temp.match(reg_Two)
        if(temp.length==4 && temp_list2.length!=2) 
            return null 
        if(temp.length==2 && temp_list2.length==0)
            return null
        // 获取四带二的价值面
        var value_ = BoardMarkMap.get(BoardList_[index])
        return new BoardCombin(this.Boards, 'Y7', value_, BoardList_.length)
    }
    // 连对
    FiltrateLineTwo(BoardList_){
        var temp = BoardList_.join('')
        // 连对边缘判断,包含2,小鬼,大鬼就不是连对,且连对为偶数
        if((/(2|C|G)/).test(temp) || temp.length%2!=0) 
            return null;
        var reg = /(\d|J|Q|K)\1{1}/g
        if(temp.replace(reg,'')!=='')
            return null;
        var tempList = temp.match(reg)
        if(tempList.length>=3){
            // 判断连续的对子是否为顺序的
            for(let j=1; j<tempList.length; j++){
                var tempData_1 = BoardMarkMap.get(tempList[j][0])
                var tempData_2 = BoardMarkMap.get(tempList[j-1][0])
                if(tempData_2-tempData_1!==1)
                    return null;
            }
        }
        var value_ = BoardMarkMap.get(tempList[0][0])
        return new BoardCombin(this.Boards, 'Y5', value_, BoardList_.length)
    }
    // 炸弹
    FiltrateBomb(BoardList_){
        var temp = BoardList_.join('')
        // 其中任一一张牌出现四次
        var reg = /(\d|J|Q|K)\1{3}/
        if(!reg.test(temp)) return null
        var value_1 = BoardMarkMap.get(BoardList_[0])
        return new BoardCombin(this.Boards, 'Y8', value_1, 4)
    }
    // 王炸
    FiltrateKingMax(BoardList_){
        if(BoardList_[0]==="G" && BoardList_[1]==="C"){
            var value_1 = BoardMarkMap.get(BoardList_[0])
            var value_2 = BoardMarkMap.get(BoardList_[1])
            return new BoardCombin(this.Boards, "Y8", value_1+value_2, 2)
        }
        return null
    }

    // 将牌变为所有该类型
    GetAllType(type, value_){
        switch(type){
            case 'Y1':
                return this.FiltrateSign_All(value_)
        }
    }

    // 返回最小的一张单牌
    FiltrateSign_All(value_){
        for(let i=this.BoardListValue.length; i>0; i--){
            if(this.BoardListValue[i-1]>value_)
                return [this.Boards[i-1]]
        }
        return null
    }

}

// 玩家出牌记录器
class BoardPlayer{
    constructor(BoardList, PlayerIndex){
        if(BoardList instanceof Map)
            BoardList = Array.from(BoardList.values())
        // 先将牌面进行排序
        BoardSort(BoardList)
        let Boards = new BoardType(BoardList)
        // 再将牌变为合法的规则牌
        this.CurrentBoardCombin = Boards.GetType()
        this.CurrentBoards = Boards.Boards
        this.PlayerIndex = PlayerIndex
    }
    Show(){
        let typeShow = this.CurrentBoardCombin
        if(typeShow==null) 
        {
            TxtInfo.innerText = '无效牌'
            return null
        }
        TxtInfo.innerText = BoardTypeMap.get(typeShow.Type)+'-'+typeShow.Value
        return typeShow
    }
}

// 已出牌池
class BoardPond{
    constructor(){
        this.CurrentBoardPond = new Array()
    }
    // 出牌,将牌置入出牌池
    SetAddBoard(BoardPlayer){
        this.CurrentBoardPond.unshift(BoardPlayer)
    }
    // 获取牌顶的类型
    GetCurrentBoard(){
        return this.CurrentBoardPond[0].CurrentBoardCombin
    }
}
/**
 * 游戏的画面及动作绘制
 */

//------------------- 绘制各种图形和动作

// 绘制牌
function CreateBorad(x, y, Board){
    var group = new Konva.Group()
    var text = Board.surface
    var color = 'black'
    var width_ = 25
    var x_ = x+5
    if(text=='G'){
        color = 'red'
    }
    if(text=='C'||text=='G') {
        width_ = 14
        text='Joke'
    }
    if(text=='0') {
        text = '10' 
        x_ = x+8
    }
    var type = Board.type
    var rect = new Konva.Rect({
      x: x,
      y: y,
      stroke: '#555',
      fill: 'white',
      strokeWidth: 1,
      shadowColor: 'black',
      shadowBlur: 0,
      shadowOffset: { x: 5, y: 5 },
      shadowOpacity: 0.3,
      width: BoardWidth,
      height: BoardHight,
    });
    group.add(rect)
    if(type=='♠' || type=='♣') 
        color = 'black'
    else if(type=='♥' || type=='♦') 
        color = 'red'
    var BoardTxt = new Konva.Text({
      x: x+5,
      y: y+5,
      text: text,
      fontSize: 18,
      width: width_,
      fill: color
    });
    group.add(BoardTxt)
    if(text!='Joke')
    {
        group.add(new Konva.Text({
            x: x_,
            y: y+20,
            text: type,
            fontSize: 20,
            fill: color
          }))
        group.add(new Konva.Text({
            x: x+BoardWidth*0.33,
            y: y+25,
            text: type,
            fontSize: BoardWidth*0.666+5,
            fill: color
        }))
    }else{
        // 绘制大符号
        group.add(new Konva.Text({
            x: x+BoardWidth*0.266,
            y: y+30,
            text: type,
            fontSize: 25,
            fill: color
        }))
    }
    
    return group;
}

// 选中牌动画绘制;IsPass:是否绕过该判断,直接对牌进行操作,一般用于牌的初始化
function GoOrOut(node, Board, IsPass=false){
    // console.log(node)
    if(!IsLockClick && !IsPass) return
    let id = 0
    let BoardNode = null
    // 有可能是直接操作的对象
    if(node.target){
        id = node.target.parent._id
        BoardNode = node.target.parent
    }else{
        id = node._id
        BoardNode = node
    }
    
    let tempI = 20
    if(!TempBorad.has(id)){
        TempBorad.set(id, Board)
    }else{
        tempI = -20
        TempBorad.delete(id)
    }
    var tween = new Konva.Tween({
        node: BoardNode,
        duration: 0.005,
        y: BoardNode.attrs.y-tempI,
    });
    tween.play();
}

// 取消选中的牌,将牌归位
function RestoreBoard(){
    return new Promise((a, b)=>{
        IsLockClick = true
        let TempBorad_ = Array.from(TempBorad)
        for(let i=0;i<TempBorad_.length;i++){
            // console.log(TempBorad_[i])
            GoOrOut(TempBorad_[i][1].DrawBoardFront, TempBorad_[i][1], true)
        }
        IsLockClick = false
        a()
    })
    
}

// 绘制牌的反面
function BoardBack(x, y){
    var group = new Konva.Group()
    var rect = new Konva.Rect({
        x: x,
        y: y,
        stroke: '#555',
        fill: 'white',
        strokeWidth: 1,
        shadowColor: 'black',
        shadowBlur: 0,
        shadowOffset: { x: 5, y: 5 },
        shadowOpacity: 0.3,
        width: BoardWidth,
        height: BoardHight,
    })
    group.add(rect)
    
    for(var i=0; i<10; i++){
        let tempPoints = new Array()
        for(var j=0; j<10; j++){
            if(j%2==0){
                tempPoints.push(x+ i*BoardWidth/10+BoardWidth/10)
            }else{
                tempPoints.push(x+ i*BoardWidth/10)
            }
            tempPoints.push(y+BoardHight/9*j)
        }
        var redLine = new Konva.Line({
            points: tempPoints,
            stroke: 'block',
            strokeWidth: 1,
            lineCap: 'round',
            lineJoin: 'round'
          });
        group.add(redLine)
    }
    
    return group
}

// 旋转牌并移动角度并移动位置
// 动画执行到百分之多少就开始停止阻塞
function RotateBoard(node, rotation, duration, x, y, stopblock){
    return new Promise((a, b)=>{
        if(stopblock==null||stopblock==undefined||stopblock>1) 
            stopblock = 1
        if(stopblock<0) 
            stopblock = 0
        var temp = CalcXAndY(x, y, node.children[0].attrs.x, node.children[0].attrs.y)
        let oldX = temp.x
        let oldY = temp.y
        var tween = new Konva.Tween({
            node: node,
            duration: duration,
            x: oldX,
            y: oldY,
            rotation: rotation
        });
        tween.play();
        setTimeout(() => {
            a()
        }, duration*1000*stopblock);
    })
}

// 绘制倒计时的秒表
function DrawTime(){
    var simpleText = new Konva.Text({
        x: width / 2 - 40,
        y: height / 2 - 50,
        id: 'Time',
        text: EveryTime,
        fontSize: 40,
        fontFamily: 'Calibri',
        stroke: 'black',
        fill: 'white',
        padding: 5,
        align: 'center'
    });
    return simpleText
}

// 绘制地主和农民的标签
function ClassTitle(){
    let x1 = width*0.05+3
    let y1 = 5
    let x2 = width*0.95 - BoardWidth +3
    let y2 = 5
    let myx = (width)/2 - 18 
    let myy = height-20
    BoardLayer.add(
        Draw(x1, y1, 
            Loandlords_Paly_==1?'地主':'农民', 
            Loandlords_Paly_==1?'blue':'black',  'white'))
    BoardLayer.add(
        Draw(x2, y2, 
            Loandlords_Paly_==2?'地主':'农民', 
            Loandlords_Paly_==2?'blue':'black', 'white'))
    BoardLayer.add(
        Draw(myx, myy, 
            Loandlords_Paly_==0?'地主':'农民', 
            Loandlords_Paly_==0?'blue':'black', 'white'))

    function Draw( x, y, text, bgcolor, txtcolor){
        var tooltip = new Konva.Label({
            x: x,
            y: y,
            opacity: 0.75
          });
          tooltip.add(
            new Konva.Tag({
              fill: bgcolor,
              lineJoin: 'round',
              shadowColor: 'black',
              shadowBlur: 10,
              shadowOffsetX: 10,
              shadowOffsetY: 10,
              shadowOpacity: 0.5
            })
          );
      
          tooltip.add(
            new Konva.Text({
              text: text,
              fontFamily: 'Calibri',
              fontSize: 15,
              padding: 3,
              fill: txtcolor
            })
          );
          return tooltip
    }
}

// 绘制桌子
function DrawTable(){
    var play0Rect = new Konva.Rect({
        x: (width/2)-(((20-1)*25+BoardWidth)/2)-10,
        y: (height)-height*0.05-BoardHight - 10,
        width: ((20-1)*25+BoardWidth)+20,
        height: BoardHight + 20,
        cornerRadius: [10, 10, 10, 10],
        fill: PlayerList[0].Color,
    });
    var play1Rect = new Konva.Rect({
        x: 30,
        y: 20,
        width: BoardWidth+30,
        height: 18*17,
        cornerRadius: [10, 10, 10, 10],
        fill: PlayerList[1].Color
    });
    var play2Rect = new Konva.Rect({
        x: width - (BoardWidth+60),
        y: 20,
        width: BoardWidth+30,
        height: 18*17,
        cornerRadius: [10, 10, 10, 10],
        fill: PlayerList[2].Color,
    });
    Tab_ = new Konva.Rect({
        x: ((width/2) - 600/2),
        y: ((height/2) - 200/2 - 40),
        width: 600,
        height: 200,
        cornerRadius: [10, 10, 10, 10],
        fill: 'DarkGreen',
    });
    BoardLayer.add(play0Rect);
    BoardLayer.add(play1Rect);
    BoardLayer.add(play2Rect);
    BoardLayer.add(Tab_);
}

// 绘制桌子颜色
function DrawTabColor(pIndex){
    var tween = new Konva.Tween({
        node: Tab_,
        duration: 1,
        fill: PlayerList[pIndex].Color
    });
    tween.play()
}

//-------------------


// 计算X和目标X,Y和目标Y相距多少
function CalcXAndY(x1, y1, x2, y2){
    let tempX = x1-x2
    let tempY = y1-y2
    return { x: tempX, y: tempY }
}

// 发牌动画
function DrawSendBoard(){
    return new Promise(async (a, b)=>{
        // 发牌给玩家
        var GroupWidth = (width/2)-((16*25+BoardWidth)/2)
        var BaseY = (height)-height*0.05-BoardHight

        // 发牌给上家
        var BaseX_1 = width*0.05
        var BaseY_1 = BoardHight*0.3

        // 发牌给下家
        var BaseX_2 = width*0.95 - BoardWidth
        var BaseY_2 = BoardHight*0.3

        var i = 0
        for(let i=0; i<17; i++){
            await RotateBoard(PlayerList[1].BoardList[i].DrawBoardBack, 0, 0.25, BaseX_1, BaseY_1+i*10, 0.05)
            RotateBoard(PlayerList[1].BoardList[i].DrawBoardFront, 0, 0.25, BaseX_1, BaseY_1+i*10, 0)
            RotateBoard(PlayerList[2].BoardList[i].DrawBoardBack, 0, 0.25, BaseX_2, BaseY_2+i*10, 0.05) 
            RotateBoard(PlayerList[2].BoardList[i].DrawBoardFront, 0, 0.25, BaseX_2, BaseY_2+i*10, 0) 
            RotateBoard(PlayerList[0].BoardList[i].DrawBoardFront, 0, 0.25, i*25+GroupWidth, BaseY, 0.05)
        }
        a()
    })
}

// 将牌整理到合适位置
function InitLocationBoard(player){
    return new Promise(async (a,b)=>{
        if(player.name=='玩家一'){
            player.BoardListSort()
            IsLockClick = false
            let len = player.BoardList.length
            let width_ = (width/2)-(((len-1)*25+BoardWidth)/2)
            var BaseY = (height)-height*0.05-BoardHight
            for(let i=0; i<player.BoardList.length; i++){
                player.BoardList[i].DrawBoardFront.remove()
                let tempDraw = player.BoardList[i].DrawBoardFront
                MyBoardGroup.add(tempDraw)
                if(tempDraw)
                    await RotateBoard(tempDraw, 0, 0.1, i*25+width_, BaseY, 0.2)
            }
        }
        a()
    })
    
}

// 玩家出牌信息绘制区
function PlayerMessage(player, BoardCombin){
    let Group_ = player.Group
    let Boards = BoardCombin.CurrentBoards
    let len = Boards.length
    let x, y;
    // 玩家一出牌动画
    function PalyerMySend(){
        return new Promise(async (result, reject)=>{
            Group_.destroyChildren()
            x = (width/2)-(((len-1)*25+BoardWidth)/2)
            y = 270-BoardHight
            for(let i = 0; i<len; i++){
                let node = Boards[i].DrawBoardFront
                // 注销事件
                node.off('mouseenter.select')
                node.off('mousedown.click')
                node.remove()
                Group_.add(node)
                await RotateBoard(node, 0, 0.2, i*25+x, y, 0)
                player.DeleteIDOfBoard(Boards[i].id)
            }
            result()
        })
    }
    // 玩家二或三出牌动画
    function PalyerTwoOrThreeSend(player, BoardCombin){
        return new Promise(async (result, reject)=>{
            Group_.destroyChildren()
            if(player.name=='玩家二')
                x = ((width/2) - 600/2)
            else
                x = ((width/2) + 600/2 - BoardWidth)

            y = ((height/2) - 200/2 - 40)
            for(let i = 0; i<len; i++){
                let node1 = Boards[i].DrawBoardFront
                let node2 = Boards[i].DrawBoardBack
                node1.remove()
                node2.remove()
                Group_.add(node1)
                Group_.add(node2)
                RotateBoard(node1, 0, 0.2, i*25+x, y, 0)
                await RotateBoard(node2, 0, 0.2, i*25+x, y, 0)
                player.DeleteIDOfBoard(Boards[i].id)
                node1.show()
                node2.hide()
            }
            BoardLayer.draw()
            result()
        })
    }
    return new Promise(async (result, reject)=>{
        if(BoardCombin==null){
            // 画不要
            result()
            return
        }
        if(player.name=='玩家一'){
            await PalyerMySend(player, BoardCombin)
        }else{
            await PalyerTwoOrThreeSend(player, BoardCombin)
        }
        await InitLocationBoard(player)
        result()
    })
}




js算法文件

/*作者:斌斌20一枝花*/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Konva=e()}(this,function(){"use strict";

var e=Math.PI/180;var t=function(t){var e=t.toLowerCase(),i=/(chrome)[ /]([\w.]+)/.exec(e)||/(webkit)[ /]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ /]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[],n=!!t.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i),r=!!t.match(/IEMobile/i);return{browser:i[1]||"",version:i[2]||"0",isIE:function(t){var e=t.indexOf("msie ");if(0<e)return parseInt(t.substring(e+5,t.indexOf(".",e)),10);if(0<t.indexOf("trident/")){var i=t.indexOf("rv:");return parseInt(t.substring(i+3,t.indexOf(".",i)),10)}var n=t.indexOf("edge/");return 0<n&&parseInt(t.substring(n+5,t.indexOf(".",n)),10)}(e),mobile:n,ieMobile:r}},n="undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope?self:{},O={_global:n,version:"4.0.0",isBrowser:"undefined"!=typeof window&&("[object Window]"==={}.toString.call(window)||"[object global]"==={}.toString.call(window)),isUnminified:/param/.test(function(t){}.toString()),dblClickWindow:400,getAngle:function(t){return O.angleDeg?t*e:t},enableTrace:!1,_pointerEventsEnabled:!1,hitOnDragEnabled:!1,captureTouchEventsEnabled:!1,listenClickTap:!1,inDblClickWindow:!1,pixelRatio:void 0,dragDistance:3,angleDeg:!0,showWarnings:!0,dragButtons:[0,1],isDragging:function(){return O.DD.isDragging},isDragReady:function(){return!!O.DD.node},UA:t(n.navigator&&n.navigator.userAgent||""),document:n.document,_injectGlobal:function(t){n.Konva=t},_parseUA:t},h={},i=function(t){h[t.prototype.getClassName()]=t,O[t.prototype.getClassName()]=t},a=function(){function r(){}return r.toCollection=function(t){var e,i=new r,n=t.length;for(e=0;e<n;e++)i.push(t[e]);return i},r._mapMethod=function(n){r.prototype[n]=function(){var t,e=this.length,i=[].slice.call(arguments);for(t=0;t<e;t++)this[t][n].apply(this[t],i);return this}},r.mapMethods=function(t){var e=t.prototype;for(var i in e)r._mapMethod(i)},r}();a.prototype=[],a.prototype.each=function(t){for(var e=0;e<this.length;e++)t(this[e],e)},a.prototype.toArray=function(){var t,e=[],i=this.length;for(t=0;t<i;t++)e.push(this[t]);return e};var d=function(){function t(t){void 0===t&&(t=[1,0,0,1,0,0]),this.m=t&&t.slice()||[1,0,0,1,0,0]}return t.prototype.copy=function(){return new t(this.m)},t.prototype.point=function(t){var e=this.m;return{x:e[0]*t.x+e[2]*t.y+e[4],y:e[1]*t.x+e[3]*t.y+e[5]}},t.prototype.translate=function(t,e){return this.m[4]+=this.m[0]*t+this.m[2]*e,this.m[5]+=this.m[1]*t+this.m[3]*e,this},t.prototype.scale=function(t,e){return this.m[0]*=t,this.m[1]*=t,this.m[2]*=e,this.m[3]*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),i=Math.sin(t),n=this.m[0]*e+this.m[2]*i,r=this.m[1]*e+this.m[3]*i,o=this.m[0]*-i+this.m[2]*e,a=this.m[1]*-i+this.m[3]*e;return this.m[0]=n,this.m[1]=r,this.m[2]=o,this.m[3]=a,this},t.prototype.getTranslation=function(){return{x:this.m[4],y:this.m[5]}},t.prototype.skew=function(t,e){var i=this.m[0]+this.m[2]*e,n=this.m[1]+this.m[3]*e,r=this.m[2]+this.m[0]*t,o=this.m[3]+this.m[1]*t;return this.m[0]=i,this.m[1]=n,this.m[2]=r,this.m[3]=o,this},t.prototype.multiply=function(t){var e=this.m[0]*t.m[0]+this.m[2]*t.m[1],i=this.m[1]*t.m[0]+this.m[3]*t.m[1],n=this.m[0]*t.m[2]+this.m[2]*t.m[3],r=this.m[1]*t.m[2]+this.m[3]*t.m[3],o=this.m[0]*t.m[4]+this.m[2]*t.m[5]+this.m[4],a=this.m[1]*t.m[4]+this.m[3]*t.m[5]+this.m[5];return this.m[0]=e,this.m[1]=i,this.m[2]=n,this.m[3]=r,this.m[4]=o,this.m[5]=a,this},t.prototype.invert=function(){var t=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),e=this.m[3]*t,i=-this.m[1]*t,n=-this.m[2]*t,r=this.m[0]*t,o=t*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),a=t*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);return this.m[0]=e,this.m[1]=i,this.m[2]=n,this.m[3]=r,this.m[4]=o,this.m[5]=a,this},t.prototype.getMatrix=function(){return this.m},t.prototype.setAbsolutePosition=function(t,e){var i=this.m[0],n=this.m[1],r=this.m[2],o=this.m[3],a=this.m[4],s=(i*(e-this.m[5])-n*(t-a))/(i*o-n*r),h=(t-a-r*s)/i;return this.translate(h,s)},t}(),r=Math.PI/180,o=180/Math.PI,s="Konva error: ",l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,132,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,255,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,203],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[119,128,144],slategrey:[119,128,144],snow:[255,255,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],transparent:[255,255,255,0],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,5]},c=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/,p=[],I={_isElement:function(t){return!(!t||1!=t.nodeType)},_isFunction:function(t){return!!(t&&t.constructor&&t.call&&t.apply)},_isPlainObject:function(t){return!!t&&t.constructor===Object},_isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},_isNumber:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&!isNaN(t)&&isFinite(t)},_isString:function(t){return"[object String]"===Object.prototype.toString.call(t)},_isBoolean:function(t){return"[object Boolean]"===Object.prototype.toString.call(t)},isObject:function(t){return t instanceof Object},isValidSelector:function(t){if("string"!=typeof t)return!1;var e=t[0];return"#"===e||"."===e||e===e.toUpperCase()},_sign:function(t){return 0===t?0:0<t?1:-1},requestAnimFrame:function(t){p.push(t),1===p.length&&requestAnimationFrame(function(){var t=p;p=[],t.forEach(function(t){t()})})},createCanvasElement:function(){var t=document.createElement("canvas");try{t.style=t.style||{}}catch(t){}return t},createImageElement:function(){return document.createElement("img")},_isInDocument:function(t){for(;t=t.parentNode;)if(t==document)return!0;return!1},_simplifyArray:function(t){var e,i,n=[],r=t.length,o=I;for(e=0;e<r;e++)i=t[e],o._isNumber(i)?i=Math.round(1e3*i)/1e3:o._isString(i)||(i=i.toString()),n.push(i);return n},_urlToImage:function(t,e){var i=new n.Image;i.onload=function(){e(i)},i.src=t},_rgbToHex:function(t,e,i){return((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},_hexToRgb:function(t){t=t.replace("#","");var e=parseInt(t,16);return{r:e>>16&255,g:e>>8&255,b:255&e}},getRandomColor:function(){for(var t=(16777215*Math.random()<<0).toString(16);t.length<6;)t="0"+t;return"#"+t},get:function(t,e){return void 0===t?e:t},getRGB:function(t){var e;return t in l?{r:(e=l[t])[0],g:e[1],b:e[2]}:"#"===t[0]?this._hexToRgb(t.substring(1)):"rgb("===t.substr(0,4)?(e=c.exec(t.replace(/ /g,"")),{r:parseInt(e[1],10),g:parseInt(e[2],10),b:parseInt(e[3],10)}):{r:0,g:0,b:0}},colorToRGBA:function(t){return t=t||"black",I._namedColorToRBA(t)||I._hex3ColorToRGBA(t)||I._hex6ColorToRGBA(t)||I._rgbColorToRGBA(t)||I._rgbaColorToRGBA(t)||I._hslColorToRGBA(t)},_namedColorToRBA:function(t){var e=l[t.toLowerCase()];return e?{r:e[0],g:e[1],b:e[2],a:1}:null},_rgbColorToRGBA:function(t){if(0===t.indexOf("rgb(")){var e=(t=t.match(/rgb\(([^)]+)\)/)[1]).split(/ *, */).map(Number);return{r:e[0],g:e[1],b:e[2],a:1}}},_rgbaColorToRGBA:function(t){if(0===t.indexOf("rgba(")){var e=(t=t.match(/rgba\(([^)]+)\)/)[1]).split(/ *, */).map(Number);return{r:e[0],g:e[1],b:e[2],a:e[3]}}},_hex6ColorToRGBA:function(t){if("#"===t[0]&&7===t.length)return{r:parseInt(t.slice(1,3),16),g:parseInt(t.slice(3,5),16),b:parseInt(t.slice(5,7),16),a:1}},_hex3ColorToRGBA:function(t){if("#"===t[0]&&4===t.length)return{r:parseInt(t[1]+t[1],16),g:parseInt(t[2]+t[2],16),b:parseInt(t[3]+t[3],16),a:1}},_hslColorToRGBA:function(t){if(/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.test(t)){var e=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t),i=(e[0],e.slice(1)),n=Number(i[0])/360,r=Number(i[1])/100,o=Number(i[2])/100,a=void 0,s=void 0,h=void 0;if(0==r)return h=255*o,{r:Math.round(h),g:Math.round(h),b:Math.round(h),a:1};for(var l=2*o-(a=o<.5?o*(1+r):o+r-o*r),d=[0,0,0],c=0;c<3;c++)(s=n+1/3*-(c-1))<0&&s++,1<s&&s--,h=6*s<1?l+6*(a-l)*s:2*s<1?a:3*s<2?l+(a-l)*(2/3-s)*6:l,d[c]=255*h;return{r:Math.round(d[0]),g:Math.round(d[1]),b:Math.round(d[2]),a:1}}},haveIntersection:function(t,e){return!(e.x>t.x+t.width||e.x+e.width<t.x||e.y>t.y+t.height||e.y+e.height<t.y)},cloneObject:function(t){var e={};for(var i in t)this._isPlainObject(t[i])?e[i]=this.cloneObject(t[i]):this._isArray(t[i])?e[i]=this.cloneArray(t[i]):e[i]=t[i];return e},cloneArray:function(t){return t.slice(0)},_degToRad:function(t){return t*r},_radToDeg:function(t){return t*o},_capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},throw:function(t){throw new Error(s+t)},error:function(t){console.error(s+t)},warn:function(t){O.showWarnings&&console.warn("Konva warning: "+t)},extend:function(t,e){function i(){this.constructor=t}i.prototype=e.prototype;var n=t.prototype;for(var r in t.prototype=new i,n)n.hasOwnProperty(r)&&(t.prototype[r]=n[r]);t.__super__=e.prototype,t.super=e},_getControlPoints:function(t,e,i,n,r,o,a){var s=Math.sqrt(Math.pow(i-t,2)+Math.pow(n-e,2)),h=Math.sqrt(Math.pow(r-i,2)+Math.pow(o-n,2)),l=a*s/(s+h),d=a*h/(s+h);return[i-l*(r-t),n-l*(o-e),i+d*(r-t),n+d*(o-e)]},_expandPoints:function(t,e){var i,n,r=t.length,o=[];for(i=2;i<r-2;i+=2)n=I._getControlPoints(t[i-2],t[i-1],t[i],t[i+1],t[i+2],t[i+3],e),o.push(n[0]),o.push(n[1]),o.push(t[i]),o.push(t[i+1]),o.push(n[2]),o.push(n[3]);return o},each:function(t,e){for(var i in t)e(i,t[i])},_inRange:function(t,e,i){return e<=t&&t<i},_getProjectionToSegment:function(t,e,i,n,r,o){var a,s,h,l=(t-i)*(t-i)+(e-n)*(e-n);if(0==l)a=t,s=e,h=(r-i)*(r-i)+(o-n)*(o-n);else{var d=((r-t)*(i-t)+(o-e)*(n-e))/l;h=d<0?((a=t)-r)*(t-r)+((s=e)-o)*(e-o):1<d?((a=i)-r)*(i-r)+((s=n)-o)*(n-o):((a=t+d*(i-t))-r)*(a-r)+((s=e+d*(n-e))-o)*(s-o)}return[a,s,h]},_getProjectionToLine:function(s,h,l){var d=I.cloneObject(s),c=Number.MAX_VALUE;return h.forEach(function(t,e){if(l||e!==h.length-1){var i=h[(e+1)%h.length],n=I._getProjectionToSegment(t.x,t.y,i.x,i.y,s.x,s.y),r=n[0],o=n[1],a=n[2];a<c&&(d.x=r,d.y=o,c=a)}}),d},_prepareArrayForTween:function(t,e,i){var n,r=[],o=[];if(t.length>e.length){var a=e;e=t,t=a}for(n=0;n<t.length;n+=2)r.push({x:t[n],y:t[n+1]});for(n=0;n<e.length;n+=2)o.push({x:e[n],y:e[n+1]});var s=[];return o.forEach(function(t){var e=I._getProjectionToLine(t,r,i);s.push(e.x),s.push(e.y)}),s},_prepareToStringify:function(t){var e;for(var i in t.visitedByCircularReferenceRemoval=!0,t)if(t.hasOwnProperty(i)&&t[i]&&"object"==typeof t[i])if(e=Object.getOwnPropertyDescriptor(t,i),t[i].visitedByCircularReferenceRemoval||I._isElement(t[i])){if(!e.configurable)return null;delete t[i]}else if(null===I._prepareToStringify(t[i])){if(!e.configurable)return null;delete t[i]}return delete t.visitedByCircularReferenceRemoval,t},_assign:function(t,e){for(var i in e)t[i]=e[i];return t},_getFirstPointerId:function(t){return t.touches?t.changedTouches[0].identifier:999}};function u(t){return I._isString(t)?'"'+t+'"':"[object Number]"===Object.prototype.toString.call(t)?t:I._isBoolean(t)?t:Object.prototype.toString.call(t)}function f(t){return 255<t?255:t<0?0:Math.round(t)}function g(){if(O.isUnminified)return function(t,e){return I._isNumber(t)||I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be a number.'),t}}function v(){if(O.isUnminified)return function(t,e){return I._isNumber(t)||"auto"===t||I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be a number or "auto".'),t}}function y(){if(O.isUnminified)return function(t,e){return I._isString(t)||I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be a string.'),t}}function m(){if(O.isUnminified)return function(t,e){return!0===t||!1===t||I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be a boolean.'),t}}var _="get",S="set",b={addGetterSetter:function(t,e,i,n,r){this.addGetter(t,e,i),this.addSetter(t,e,n,r),this.addOverloadedGetterSetter(t,e)},addGetter:function(t,e,i){var n=_+I._capitalize(e);t.prototype[n]=t.prototype[n]||function(){var t=this.attrs[e];return void 0===t?i:t}},addSetter:function(t,e,i,n){var r=S+I._capitalize(e);t.prototype[r]||b.overWriteSetter(t,e,i,n)},overWriteSetter:function(t,e,i,n){var r=S+I._capitalize(e);t.prototype[r]=function(t){return i&&null!=t&&(t=i.call(this,t,e)),this._setAttr(e,t),n&&n.call(this),this}},addComponentsGetterSetter:function(t,n,e,r,o){var i,a,s=e.length,h=I._capitalize,l=_+h(n),d=S+h(n);t.prototype[l]=function(){var t={};for(i=0;i<s;i++)t[a=e[i]]=this.getAttr(n+h(a));return t};var c=function(i){if(O.isUnminified)return function(t,e){return I.isObject(t)||I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be an object with properties '+i),t}}(e);t.prototype[d]=function(t){var e,i=this.attrs[n];for(e in r&&(t=r.call(this,t)),c&&c.call(this,t,n),t)t.hasOwnProperty(e)&&this._setAttr(n+h(e),t[e]);return this._fireChangeEvent(n,i,t),o&&o.call(this),this},this.addOverloadedGetterSetter(t,n)},addOverloadedGetterSetter:function(t,e){var i=I._capitalize(e),n=S+i,r=_+i;t.prototype[e]=function(){return arguments.length?(this[n](arguments[0]),this):this[r]()}},addDeprecatedGetterSetter:function(t,e,i,n){I.error("Adding deprecated "+e);var r=_+I._capitalize(e),o=e+" property is deprecated and will be removed soon. Look at Konva change log for more information.";t.prototype[r]=function(){I.error(o);var t=this.attrs[e];return void 0===t?i:t},this.addSetter(t,e,n,function(){I.error(o)}),this.addOverloadedGetterSetter(t,e)},backCompat:function(a,t){I.each(t,function(t,e){var i=a.prototype[e],n=_+I._capitalize(t),r=S+I._capitalize(t);function o(){i.apply(this,arguments),I.error('"'+t+'" method is deprecated and will be removed soon. Use ""'+e+'" instead.')}a.prototype[t]=o,a.prototype[n]=o,a.prototype[r]=o})},afterSetFilter:function(){this._filterUpToDate=!1}},x=function(t,e){return(x=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])})(t,e)};function w(t,e){function i(){this.constructor=t}x(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}var C=["arc","arcTo","beginPath","bezierCurveTo","clearRect","clip","closePath","createLinearGradient","createPattern","createRadialGradient","drawImage","ellipse","fill","fillText","getImageData","createImageData","lineTo","moveTo","putImageData","quadraticCurveTo","rect","restore","rotate","save","scale","setLineDash","setTransform","stroke","strokeText","transform","translate"],P=function(){function t(t){this.canvas=t,this._context=t._canvas.getContext("2d"),O.enableTrace&&(this.traceArr=[],this._enableTrace())}return t.prototype.fillShape=function(t){t.getFillEnabled()&&this._fill(t)},t.prototype._fill=function(t){},t.prototype.strokeShape=function(t){t.getStrokeEnabled()&&this._stroke(t)},t.prototype._stroke=function(t){},t.prototype.fillStrokeShape=function(t){t.getFillEnabled()&&this._fill(t),t.getStrokeEnabled()&&this._stroke(t)},t.prototype.getTrace=function(t){var e,i,n,r,o=this.traceArr,a=o.length,s="";for(e=0;e<a;e++)(n=(i=o[e]).method)?(r=i.args,s+=n,t?s+="()":I._isArray(r[0])?s+="(["+r.join(",")+"])":s+="("+r.join(",")+")"):(s+=i.property,t||(s+="="+i.val)),s+=";";return s},t.prototype.clearTrace=function(){this.traceArr=[]},t.prototype._trace=function(t){var e=this.traceArr;e.push(t),100<=e.length&&e.shift()},t.prototype.reset=function(){var t=this.getCanvas().getPixelRatio();this.setTransform(1*t,0,0,1*t,0,0)},t.prototype.getCanvas=function(){return this.canvas},t.prototype.clear=function(t){var e=this.getCanvas();t?this.clearRect(t.x||0,t.y||0,t.width||0,t.height||0):this.clearRect(0,0,e.getWidth()/e.pixelRatio,e.getHeight()/e.pixelRatio)},t.prototype._applyLineCap=function(t){var e=t.getLineCap();e&&this.setAttr("lineCap",e)},t.prototype._applyOpacity=function(t){var e=t.getAbsoluteOpacity();1!==e&&this.setAttr("globalAlpha",e)},t.prototype._applyLineJoin=function(t){var e=t.getLineJoin();e&&this.setAttr("lineJoin",e)},t.prototype.setAttr=function(t,e){this._context[t]=e},t.prototype.arc=function(t,e,i,n,r,o){this._context.arc(t,e,i,n,r,o)},t.prototype.arcTo=function(t,e,i,n,r,o){this._context.arc(t,e,i,n,r,o)},t.prototype.beginPath=function(){this._context.beginPath()},t.prototype.bezierCurveTo=function(t,e,i,n,r,o){this._context.bezierCurveTo(t,e,i,n,r,o)},t.prototype.clearRect=function(t,e,i,n){this._context.clearRect(t,e,i,n)},t.prototype.clip=function(){this._context.clip()},t.prototype.closePath=function(){this._context.closePath()},t.prototype.createImageData=function(t,e){var i=arguments;return 2===i.length?this._context.createImageData(t,e):1===i.length?this._context.createImageData(t):void 0},t.prototype.createLinearGradient=function(t,e,i,n){return this._context.createLinearGradient(t,e,i,n)},t.prototype.createPattern=function(t,e){return this._context.createPattern(t,e)},t.prototype.createRadialGradient=function(t,e,i,n,r,o){return this._context.createRadialGradient(t,e,i,n,r,o)},t.prototype.drawImage=function(t,e,i,n,r,o,a,s,h){var l=arguments,d=this._context;3===l.length?d.drawImage(t,e,i):5===l.length?d.drawImage(t,e,i,n,r):9===l.length&&d.drawImage(t,e,i,n,r,o,a,s,h)},t.prototype.ellipse=function(t,e,i,n,r,o,a,s){this._context.ellipse(t,e,i,n,r,o,a,s)},t.prototype.isPointInPath=function(t,e){return this._context.isPointInPath(t,e)},t.prototype.fill=function(){this._context.fill()},t.prototype.fillRect=function(t,e,i,n){this._context.fillRect(t,e,i,n)},t.prototype.strokeRect=function(t,e,i,n){this._context.strokeRect(t,e,i,n)},t.prototype.fillText=function(t,e,i){this._context.fillText(t,e,i)},t.prototype.measureText=function(t){return this._context.measureText(t)},t.prototype.getImageData=function(t,e,i,n){return this._context.getImageData(t,e,i,n)},t.prototype.lineTo=function(t,e){this._context.lineTo(t,e)},t.prototype.moveTo=function(t,e){this._context.moveTo(t,e)},t.prototype.rect=function(t,e,i,n){this._context.rect(t,e,i,n)},t.prototype.putImageData=function(t,e,i){this._context.putImageData(t,e,i)},t.prototype.quadraticCurveTo=function(t,e,i,n){this._context.quadraticCurveTo(t,e,i,n)},t.prototype.restore=function(){this._context.restore()},t.prototype.rotate=function(t){this._context.rotate(t)},t.prototype.save=function(){this._context.save()},t.prototype.scale=function(t,e){this._context.scale(t,e)},t.prototype.setLineDash=function(t){this._context.setLineDash?this._context.setLineDash(t):"mozDash"in this._context?this._context.mozDash=t:"webkitLineDash"in this._context&&(this._context.webkitLineDash=t)},t.prototype.getLineDash=function(){return this._context.getLineDash()},t.prototype.setTransform=function(t,e,i,n,r,o){this._context.setTransform(t,e,i,n,r,o)},t.prototype.stroke=function(){this._context.stroke()},t.prototype.strokeText=function(t,e,i,n){this._context.strokeText(t,e,i,n)},t.prototype.transform=function(t,e,i,n,r,o){this._context.transform(t,e,i,n,r,o)},t.prototype.translate=function(t,e){this._context.translate(t,e)},t.prototype._enableTrace=function(){var t,n,r=this,e=C.length,o=I._simplifyArray,i=this.setAttr,a=function(t){var e,i=r[t];r[t]=function(){return n=o(Array.prototype.slice.call(arguments,0)),e=i.apply(r,arguments),r._trace({method:t,args:n}),e}};for(t=0;t<e;t++)a(C[t]);r.setAttr=function(){i.apply(r,arguments);var t=arguments[0],e=arguments[1];"shadowOffsetX"!==t&&"shadowOffsetY"!==t&&"shadowBlur"!==t||(e/=this.canvas.getPixelRatio()),r._trace({property:t,val:e})}},t.prototype._applyGlobalCompositeOperation=function(t){var e=t.getGlobalCompositeOperation();"source-over"!==e&&this.setAttr("globalCompositeOperation",e)},t}();["fillStyle","strokeStyle","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","lineCap","lineDashOffset","lineJoin","lineWidth","miterLimit","font","textAlign","textBaseline","globalAlpha","globalCompositeOperation","imageSmoothingEnabled"].forEach(function(e){Object.defineProperty(P.prototype,e,{get:function(){return this._context[e]},set:function(t){this._context[e]=t}})});var k,T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._fillColor=function(t){var e=t.fill();this.setAttr("fillStyle",e),t._fillFunc(this)},e.prototype._fillPattern=function(t){var e=t.getFillPatternX(),i=t.getFillPatternY(),n=t.getFillPatternScaleX(),r=t.getFillPatternScaleY(),o=O.getAngle(t.getFillPatternRotation()),a=t.getFillPatternOffsetX(),s=t.getFillPatternOffsetY();(e||i)&&this.translate(e||0,i||0),o&&this.rotate(o),(n||r)&&this.scale(n,r),(a||s)&&this.translate(-1*a,-1*s),this.setAttr("fillStyle",t._getFillPattern()),t._fillFunc(this)},e.prototype._fillLinearGradient=function(t){var e=t._getLinearGradient();e&&(this.setAttr("fillStyle",e),t._fillFunc(this))},e.prototype._fillRadialGradient=function(t){var e=t._getRadialGradient();e&&(this.setAttr("fillStyle",e),t._fillFunc(this))},e.prototype._fill=function(t){var e=t.fill(),i=t.getFillPriority();if(e&&"color"===i)this._fillColor(t);else{var n=t.getFillPatternImage();if(n&&"pattern"===i)this._fillPattern(t);else{var r=t.getFillLinearGradientColorStops();if(r&&"linear-gradient"===i)this._fillLinearGradient(t);else{var o=t.getFillRadialGradientColorStops();o&&"radial-gradient"===i?this._fillRadialGradient(t):e?this._fillColor(t):n?this._fillPattern(t):r?this._fillLinearGradient(t):o&&this._fillRadialGradient(t)}}}},e.prototype._strokeLinearGradient=function(t){var e=t.getStrokeLinearGradientStartPoint(),i=t.getStrokeLinearGradientEndPoint(),n=t.getStrokeLinearGradientColorStops(),r=this.createLinearGradient(e.x,e.y,i.x,i.y);if(n){for(var o=0;o<n.length;o+=2)r.addColorStop(n[o],n[o+1]);this.setAttr("strokeStyle",r)}},e.prototype._stroke=function(t){var e=t.dash(),i=t.getStrokeScaleEnabled();if(t.hasStroke()){if(!i){this.save();var n=this.getCanvas().getPixelRatio();this.setTransform(n,0,0,n,0,0)}this._applyLineCap(t),e&&t.dashEnabled()&&(this.setLineDash(e),this.setAttr("lineDashOffset",t.dashOffset())),this.setAttr("lineWidth",t.strokeWidth()),t.getShadowForStrokeEnabled()||this.setAttr("shadowColor","rgba(0,0,0,0)"),t.getStrokeLinearGradientColorStops()?this._strokeLinearGradient(t):this.setAttr("strokeStyle",t.stroke()),t._strokeFunc(this),i||this.restore()}},e.prototype._applyShadow=function(t){var e=I,i=e.get(t.getShadowRGBA(),"black"),n=e.get(t.getShadowBlur(),5),r=e.get(t.getShadowOffset(),{x:0,y:0}),o=t.getAbsoluteScale(),a=this.canvas.getPixelRatio(),s=o.x*a,h=o.y*a;this.setAttr("shadowColor",i),this.setAttr("shadowBlur",n*Math.min(Math.abs(s),Math.abs(h))),this.setAttr("shadowOffsetX",r.x*s),this.setAttr("shadowOffsetY",r.y*h)},e}(P),M=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._fill=function(t){this.save(),this.setAttr("fillStyle",t.colorKey),t._fillFuncHit(this),this.restore()},e.prototype._stroke=function(t){if(t.hasStroke()&&t.hitStrokeWidth()){var e=t.getStrokeScaleEnabled();if(!e){this.save();var i=this.getCanvas().getPixelRatio();this.setTransform(i,0,0,i,0,0)}this._applyLineCap(t);var n=t.hitStrokeWidth(),r="auto"===n?t.strokeWidth():n;this.setAttr("lineWidth",r),this.setAttr("strokeStyle",t.colorKey),t._strokeFuncHit(this),e||this.restore()}},e}(P);var A=function(){function t(t){this.pixelRatio=1,this.width=0,this.height=0,this.isCache=!1;var e=(t||{}).pixelRatio||O.pixelRatio||function(){if(k)return k;var t=I.createCanvasElement().getContext("2d");return k=(O._global.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}();this.pixelRatio=e,this._canvas=I.createCanvasElement(),this._canvas.style.padding="0",this._canvas.style.margin="0",this._canvas.style.border="0",this._canvas.style.background="transparent",this._canvas.style.position="absolute",this._canvas.style.top="0",this._canvas.style.left="0"}return t.prototype.getContext=function(){return this.context},t.prototype.getPixelRatio=function(){return this.pixelRatio},t.prototype.setPixelRatio=function(t){var e=this.pixelRatio;this.pixelRatio=t,this.setSize(this.getWidth()/e,this.getHeight()/e)},t.prototype.setWidth=function(t){this.width=this._canvas.width=t*this.pixelRatio,this._canvas.style.width=t+"px";var e=this.pixelRatio;this.getContext()._context.scale(e,e)},t.prototype.setHeight=function(t){this.height=this._canvas.height=t*this.pixelRatio,this._canvas.style.height=t+"px";var e=this.pixelRatio;this.getContext()._context.scale(e,e)},t.prototype.getWidth=function(){return this.width},t.prototype.getHeight=function(){return this.height},t.prototype.setSize=function(t,e){this.setWidth(t),this.setHeight(e)},t.prototype.toDataURL=function(t,e){try{return this._canvas.toDataURL(t,e)}catch(t){try{return this._canvas.toDataURL()}catch(t){return I.error("Unable to get data URL. "+t.message),""}}},t}();b.addGetterSetter(A,"pixelRatio",void 0,g());var G=function(i){function t(t){void 0===t&&(t={width:0,height:0});var e=i.call(this,t)||this;return e.context=new T(e),e.setSize(t.width,t.height),e}return w(t,i),t}(A),R=function(i){function t(t){void 0===t&&(t={width:0,height:0});var e=i.call(this,t)||this;return e.hitCanvas=!0,e.context=new M(e),e.setSize(t.width,t.height),e}return w(t,i),t}(A),L={get isDragging(){var e=!1;return L._dragElements.forEach(function(t){t.isDragging&&(e=!0)}),e},justDragged:!1,get node(){var e;return L._dragElements.forEach(function(t){e=t.node}),e},_dragElements:new Map,_drag:function(a){L._dragElements.forEach(function(e,t){var i=e.node,n=i.getStage();n.setPointersPositions(a),void 0===e.pointerId&&(e.pointerId=I._getFirstPointerId(a));var r=n._changedPointerPositions.find(function(t){return t.id===e.pointerId});if(r){if(!e.isDragging){var o=i.dragDistance();if(Math.max(Math.abs(r.x-e.startPointerPos.x),Math.abs(r.y-e.startPointerPos.y))<o)return;if(e.isDragging=!0,i.fire("dragstart",{type:"dragstart",target:i,evt:a},!0),!i.isDragging())return}i._setDragPosition(a,e),i.fire("dragmove",{type:"dragmove",target:i,evt:a},!0)}})},_endDragBefore:function(r){L._dragElements.forEach(function(e,t){var i=e.node.getStage();if(i.setPointersPositions(r),i._changedPointerPositions.find(function(t){return t.id===e.pointerId})){e.isDragging&&(L.justDragged=!0,O.listenClickTap=!1),e.dragStopped=!0,e.isDragging=!1;var n=e.node.getLayer()||e.node instanceof O.Stage&&e.node;n&&n.draw()}})},_endDragAfter:function(i){L._dragElements.forEach(function(t,e){t.dragStopped&&(t.node.fire("dragend",{type:"dragend",target:t.node,evt:i},!0),L._dragElements.delete(e))})}};O.isBrowser&&(window.addEventListener("mouseup",L._endDragBefore,!0),window.addEventListener("touchend",L._endDragBefore,!0),window.addEventListener("mousemove",L._drag),window.addEventListener("touchmove",L._drag),window.addEventListener("mouseup",L._endDragAfter,!1),window.addEventListener("touchend",L._endDragAfter,!1));var D={},E={},F=function(t,e){t&&D[t]===e&&delete D[t]},B=function(t,e){if(t){var i=E[t];if(i){for(var n=0;n<i.length;n++){i[n]._id===e&&i.splice(n,1)}0===i.length&&delete E[t]}}},z="absoluteOpacity",W="absoluteTransform",N="absoluteScale",H="canvas",Y="listening",X="mouseenter",j="mouseleave",U="transform",q="visible",V=["id"],K=["xChange.konva","yChange.konva","scaleXChange.konva","scaleYChange.konva","skewXChange.konva","skewYChange.konva","rotationChange.konva","offsetXChange.konva","offsetYChange.konva","transformsEnabledChange.konva"].join(" "),Q=["scaleXChange.konva","scaleYChange.konva"].join(" "),J=new a,Z=1,$=function(){function s(t){var e=this;this._id=Z++,this.eventListeners={},this.attrs={},this.index=0,this.parent=null,this._cache=new Map,this._lastPos=null,this._filterUpToDate=!1,this._isUnderCache=!1,this.children=J,this._dragEventId=null,this.setAttrs(t),this.on(K,function(){e._clearCache(U),e._clearSelfAndDescendantCache(W)}),this.on(Q,function(){e._clearSelfAndDescendantCache(N)}),this.on("visibleChange.konva",function(){e._clearSelfAndDescendantCache(q)}),this.on("listeningChange.konva",function(){e._clearSelfAndDescendantCache(Y)}),this.on("opacityChange.konva",function(){e._clearSelfAndDescendantCache(z)})}return s.prototype.hasChildren=function(){return!1},s.prototype.getChildren=function(){return J},s.prototype._clearCache=function(t){t?this._cache.delete(t):this._cache.clear()},s.prototype._getCache=function(t,e){var i=this._cache.get(t);return void 0===i&&(i=e.call(this),this._cache.set(t,i)),i},s.prototype._getCanvasCache=function(){return this._cache.get(H)},s.prototype._clearSelfAndDescendantCache=function(e){this._clearCache(e),this._getCanvasCache()||this.children&&this.children.each(function(t){t._clearSelfAndDescendantCache(e)})},s.prototype.clearCache=function(){return this._cache.delete(H),this._clearSelfAndDescendantCache(),this},s.prototype.cache=function(t){var e=t||{},i={};void 0!==e.x&&void 0!==e.y&&void 0!==e.width&&void 0!==e.height||(i=this.getClientRect({skipTransform:!0,relativeTo:this.getParent()}));var n=e.width||i.width,r=e.height||i.height,o=e.pixelRatio,a=void 0===e.x?i.x:e.x,s=void 0===e.y?i.y:e.y,h=e.offset||0,l=e.drawBorder||!1;if(n&&r){a-=h,s-=h;var d=new G({pixelRatio:o,width:n+=2*h,height:r+=2*h}),c=new G({pixelRatio:o,width:n,height:r}),p=new R({pixelRatio:1,width:n,height:r}),u=d.getContext(),f=p.getContext();return p.isCache=!0,this._cache.delete("canvas"),(this._filterUpToDate=!1)===e.imageSmoothingEnabled&&(d.getContext()._context.imageSmoothingEnabled=!1,c.getContext()._context.imageSmoothingEnabled=!1,p.getContext()._context.imageSmoothingEnabled=!1),u.save(),f.save(),u.translate(-a,-s),f.translate(-a,-s),this._isUnderCache=!0,this._clearSelfAndDescendantCache(z),this._clearSelfAndDescendantCache(N),this.drawScene(d,this,!0),this.drawHit(p,this,!0),this._isUnderCache=!1,u.restore(),f.restore(),l&&(u.save(),u.beginPath(),u.rect(0,0,n,r),u.closePath(),u.setAttr("strokeStyle","red"),u.setAttr("lineWidth",5),u.stroke(),u.restore()),this._cache.set(H,{scene:d,filter:c,hit:p,x:a,y:s}),this}I.error("Can not cache the node. Width or height of the node equals 0. Caching is skipped.")},s.prototype.getClientRect=function(t){throw new Error('abstract "getClientRect" method call')},s.prototype._transformedRect=function(t,e){var i,n,r,o,a=[{x:t.x,y:t.y},{x:t.x+t.width,y:t.y},{x:t.x+t.width,y:t.y+t.height},{x:t.x,y:t.y+t.height}],s=this.getAbsoluteTransform(e);return a.forEach(function(t){var e=s.point(t);void 0===i&&(i=r=e.x,n=o=e.y),i=Math.min(i,e.x),n=Math.min(n,e.y),r=Math.max(r,e.x),o=Math.max(o,e.y)}),{x:i,y:n,width:r-i,height:o-n}},s.prototype._drawCachedSceneCanvas=function(t){t.save(),t._applyOpacity(this),t._applyGlobalCompositeOperation(this);var e=this._getCanvasCache();t.translate(e.x,e.y);var i=this._getCachedSceneCanvas(),n=i.pixelRatio;t.drawImage(i._canvas,0,0,i.width/n,i.height/n),t.restore()},s.prototype._drawCachedHitCanvas=function(t){var e=this._getCanvasCache(),i=e.hit;t.save(),t._applyGlobalCompositeOperation(this),t.translate(e.x,e.y),t.drawImage(i._canvas,0,0),t.restore()},s.prototype._getCachedSceneCanvas=function(){var t,e,i,n,r=this.filters(),o=this._getCanvasCache(),a=o.scene,s=o.filter,h=s.getContext();if(r){if(!this._filterUpToDate){var l=a.pixelRatio;try{for(t=r.length,h.clear(),h.drawImage(a._canvas,0,0,a.getWidth()/l,a.getHeight()/l),e=h.getImageData(0,0,s.getWidth(),s.getHeight()),i=0;i<t;i++)"function"==typeof(n=r[i])?(n.call(this,e),h.putImageData(e,0,0)):I.error("Filter should be type of function, but got "+typeof n+" insted. Please check correct filters")}catch(t){I.error("Unable to apply filter. "+t.message)}this._filterUpToDate=!0}return s}return a},s.prototype.on=function(t,e){if(3===arguments.length)return this._delegate.apply(this,arguments);var i,n,r,o,a=t.split(" "),s=a.length;for(i=0;i<s;i++)r=(n=a[i].split("."))[0],o=n[1]||"",this.eventListeners[r]||(this.eventListeners[r]=[]),this.eventListeners[r].push({name:o,handler:e});return this},s.prototype.off=function(t,e){var i,n,r,o,a,s=(t||"").split(" "),h=s.length;if(!t)for(n in this.eventListeners)this._off(n);for(i=0;i<h;i++)if(o=(r=s[i].split("."))[0],a=r[1],o)this.eventListeners[o]&&this._off(o,a,e);else for(n in this.eventListeners)this._off(n,a,e);return this},s.prototype.dispatchEvent=function(t){var e={target:this,type:t.type,evt:t};return this.fire(t.type,e),this},s.prototype.addEventListener=function(t,e){return this.on(t,function(t){e.call(this,t.evt)}),this},s.prototype.removeEventListener=function(t){return this.off(t),this},s.prototype._delegate=function(t,n,r){var o=this;this.on(t,function(t){for(var e=t.target.findAncestors(n,!0,o),i=0;i<e.length;i++)(t=I.cloneObject(t)).currentTarget=e[i],r.call(e[i],t)})},s.prototype.remove=function(){return this.isDragging()&&this.stopDrag(),L._dragElements.delete(this._id),this._remove(),this},s.prototype._remove=function(){this._clearSelfAndDescendantCache("stage"),this._clearSelfAndDescendantCache(W),this._clearSelfAndDescendantCache(q),this._clearSelfAndDescendantCache(Y),this._clearSelfAndDescendantCache(z);var t=this.getParent();t&&t.children&&(t.children.splice(this.index,1),t._setChildrenIndices(),this.parent=null)},s.prototype.destroy=function(){F(this.id(),this);for(var t=(this.name()||"").split(/\s/g),e=0;e<t.length;e++){var i=t[e];B(i,this._id)}return this.remove(),this},s.prototype.getAttr=function(t){var e="get"+I._capitalize(t);return I._isFunction(this[e])?this[e]():this.attrs[t]},s.prototype.getAncestors=function(){for(var t=this.getParent(),e=new a;t;)e.push(t),t=t.getParent();return e},s.prototype.getAttrs=function(){return this.attrs||{}},s.prototype.setAttrs=function(t){var e,i;if(!t)return this;for(e in t)"children"!==e&&(i="set"+I._capitalize(e),I._isFunction(this[i])?this[i](t[e]):this._setAttr(e,t[e]));return this},s.prototype.isListening=function(){return this._getCache(Y,this._isListening)},s.prototype._isListening=function(){var t=this.listening(),e=this.getParent();return"inherit"===t?!e||e.isListening():t},s.prototype.isVisible=function(){return this._getCache(q,this._isVisible)},s.prototype._isVisible=function(t){var e=this.visible(),i=this.getParent();return"inherit"===e?!i||i===t||i._isVisible(t):e},s.prototype.shouldDrawHit=function(){var t=this.getLayer();return!t&&this.isListening()&&this.isVisible()||t&&t.hitGraphEnabled()&&this.isListening()&&this.isVisible()},s.prototype.show=function(){return this.visible(!0),this},s.prototype.hide=function(){return this.visible(!1),this},s.prototype.getZIndex=function(){return this.index||0},s.prototype.getAbsoluteZIndex=function(){var i,n,r,o,a=this.getDepth(),s=this,h=0;return"Stage"!==s.nodeType&&function t(e){for(i=[],n=e.length,r=0;r<n;r++)o=e[r],h++,"Shape"!==o.nodeType&&(i=i.concat(o.getChildren().toArray())),o._id===s._id&&(r=n);0<i.length&&i[0].getDepth()<=a&&t(i)}(s.getStage().getChildren()),h},s.prototype.getDepth=function(){for(var t=0,e=this.parent;e;)t++,e=e.parent;return t},s.prototype.setPosition=function(t){return this.x(t.x),this.y(t.y),this},s.prototype.getPosition=function(){return{x:this.x(),y:this.y()}},s.prototype.getAbsolutePosition=function(t){var e=this.getAbsoluteTransform(t).getMatrix(),i=new d,n=this.offset();return i.m=e.slice(),i.translate(n.x,n.y),i.getTranslation()},s.prototype.setAbsolutePosition=function(t){var e,i=this._clearTransform();return this.attrs.x=i.x,this.attrs.y=i.y,delete i.x,delete i.y,(e=this.getAbsoluteTransform()).invert(),e.translate(t.x,t.y),t={x:this.attrs.x+e.getTranslation().x,y:this.attrs.y+e.getTranslation().y},this.setPosition({x:t.x,y:t.y}),this._setTransform(i),this},s.prototype._setTransform=function(t){var e;for(e in t)this.attrs[e]=t[e];this._clearCache(U),this._clearSelfAndDescendantCache(W)},s.prototype._clearTransform=function(){var t={x:this.x(),y:this.y(),rotation:this.rotation(),scaleX:this.scaleX(),scaleY:this.scaleY(),offsetX:this.offsetX(),offsetY:this.offsetY(),skewX:this.skewX(),skewY:this.skewY()};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scaleX=1,this.attrs.scaleY=1,this.attrs.offsetX=0,this.attrs.offsetY=0,this.attrs.skewX=0,this.attrs.skewY=0,this._clearCache(U),this._clearSelfAndDescendantCache(W),t},s.prototype.move=function(t){var e=t.x,i=t.y,n=this.x(),r=this.y();return void 0!==e&&(n+=e),void 0!==i&&(r+=i),this.setPosition({x:n,y:r}),this},s.prototype._eachAncestorReverse=function(t,e){var i,n,r=[],o=this.getParent();if(e&&e._id===this._id)t(this);else{for(r.unshift(this);o&&(!e||o._id!==e._id);)r.unshift(o),o=o.parent;for(i=r.length,n=0;n<i;n++)t(r[n])}},s.prototype.rotate=function(t){return this.rotation(this.rotation()+t),this},s.prototype.moveToTop=function(){if(!this.parent)return I.warn("Node has no parent. moveToTop function is ignored."),!1;var t=this.index;return this.parent.children.splice(t,1),this.parent.children.push(this),this.parent._setChildrenIndices(),!0},s.prototype.moveUp=function(){if(!this.parent)return I.warn("Node has no parent. moveUp function is ignored."),!1;var t=this.index;return t<this.parent.getChildren().length-1&&(this.parent.children.splice(t,1),this.parent.children.splice(t+1,0,this),this.parent._setChildrenIndices(),!0)},s.prototype.moveDown=function(){if(!this.parent)return I.warn("Node has no parent. moveDown function is ignored."),!1;var t=this.index;return 0<t&&(this.parent.children.splice(t,1),this.parent.children.splice(t-1,0,this),this.parent._setChildrenIndices(),!0)},s.prototype.moveToBottom=function(){if(!this.parent)return I.warn("Node has no parent. moveToBottom function is ignored."),!1;var t=this.index;return 0<t&&(this.parent.children.splice(t,1),this.parent.children.unshift(this),this.parent._setChildrenIndices(),!0)},s.prototype.setZIndex=function(t){if(!this.parent)return I.warn("Node has no parent. zIndex parameter is ignored."),this;(t<0||t>=this.parent.children.length)&&I.warn("Unexpected value "+t+" for zIndex property. zIndex is just index of a node in children of its parent. Expected value is from 0 to "+(this.parent.children.length-1)+".");var e=this.index;return this.parent.children.splice(e,1),this.parent.children.splice(t,0,this),this.parent._setChildrenIndices(),this},s.prototype.getAbsoluteOpacity=function(){return this._getCache(z,this._getAbsoluteOpacity)},s.prototype._getAbsoluteOpacity=function(){var t=this.opacity(),e=this.getParent();return e&&!e._isUnderCache&&(t*=e.getAbsoluteOpacity()),t},s.prototype.moveTo=function(t){return this.getParent()!==t&&(this._remove(),t.add(this)),this},s.prototype.toObject=function(){var t,e,i,n={},r=this.getAttrs();for(t in n.attrs={},r)e=r[t],I.isObject(e)&&!I._isPlainObject(e)&&!I._isArray(e)||(i="function"==typeof this[t]&&this[t],delete r[t],(i?i.call(this):null)!==(r[t]=e)&&(n.attrs[t]=e));return n.className=this.getClassName(),I._prepareToStringify(n)},s.prototype.toJSON=function(){return JSON.stringify(this.toObject())},s.prototype.getParent=function(){return this.parent},s.prototype.findAncestors=function(t,e,i){var n=[];e&&this._isMatch(t)&&n.push(this);for(var r=this.parent;r;){if(r===i)return n;r._isMatch(t)&&n.push(r),r=r.parent}return n},s.prototype.isAncestorOf=function(t){return!1},s.prototype.findAncestor=function(t,e,i){return this.findAncestors(t,e,i)[0]},s.prototype._isMatch=function(t){if(!t)return!1;if("function"==typeof t)return t(this);var e,i,n=t.replace(/ /g,"").split(","),r=n.length;for(e=0;e<r;e++)if(i=n[e],I.isValidSelector(i)||(I.warn('Selector "'+i+'" is invalid. Allowed selectors examples are "#foo", ".bar" or "Group".'),I.warn('If you have a custom shape with such className, please change it to start with upper letter like "Triangle".'),I.warn("Konva is awesome, right?")),"#"===i.charAt(0)){if(this.id()===i.slice(1))return!0}else if("."===i.charAt(0)){if(this.hasName(i.slice(1)))return!0}else if(this.className===t||this.nodeType===t)return!0;return!1},s.prototype.getLayer=function(){var t=this.getParent();return t?t.getLayer():null},s.prototype.getStage=function(){return this._getCache("stage",this._getStage)},s.prototype._getStage=function(){var t=this.getParent();return t?t.getStage():void 0},s.prototype.fire=function(t,e,i){return(e=e||{}).target=e.target||this,i?this._fireAndBubble(t,e):this._fire(t,e),this},s.prototype.getAbsoluteTransform=function(t){return t?this._getAbsoluteTransform(t):this._getCache(W,this._getAbsoluteTransform)},s.prototype._getAbsoluteTransform=function(t){var i=new d;return this._eachAncestorReverse(function(t){var e=t.getTransformsEnabled();"all"===e?i.multiply(t.getTransform()):"position"===e&&i.translate(t.getX()-t.getOffsetX(),t.getY()-t.getOffsetY())},t),i},s.prototype.getAbsoluteScale=function(t){return t?this._getAbsoluteScale(t):this._getCache(N,this._getAbsoluteScale)},s.prototype._getAbsoluteScale=function(t){for(var e=this;e;)e._isUnderCache&&(t=e),e=e.getParent();var i=1,n=1;return this._eachAncestorReverse(function(t){i*=t.scaleX(),n*=t.scaleY()},t),{x:i,y:n}},s.prototype.getTransform=function(){return this._getCache(U,this._getTransform)},s.prototype._getTransform=function(){var t=new d,e=this.x(),i=this.y(),n=O.getAngle(this.rotation()),r=this.scaleX(),o=this.scaleY(),a=this.skewX(),s=this.skewY(),h=this.offsetX(),l=this.offsetY();return 0===e&&0===i||t.translate(e,i),0!==n&&t.rotate(n),0===a&&0===s||t.skew(a,s),1===r&&1===o||t.scale(r,o),0===h&&0===l||t.translate(-1*h,-1*l),t},s.prototype.clone=function(t){var e,i,n,r,o,a=I.cloneObject(this.attrs);for(var s in V){delete a[V[s]]}for(e in t)a[e]=t[e];var h=new this.constructor(a);for(e in this.eventListeners)for(n=(i=this.eventListeners[e]).length,r=0;r<n;r++)(o=i[r]).name.indexOf("konva")<0&&(h.eventListeners[e]||(h.eventListeners[e]=[]),h.eventListeners[e].push(o));return h},s.prototype._toKonvaCanvas=function(t){t=t||{};var e=this.getClientRect(),i=this.getStage(),n=void 0!==t.x?t.x:e.x,r=void 0!==t.y?t.y:e.y,o=t.pixelRatio||1,a=new G({width:t.width||e.width||(i?i.width():0),height:t.height||e.height||(i?i.height():0),pixelRatio:o}),s=a.getContext();return s.save(),(n||r)&&s.translate(-1*n,-1*r),this.drawScene(a),s.restore(),a},s.prototype.toCanvas=function(t){return this._toKonvaCanvas(t)._canvas},s.prototype.toDataURL=function(t){var e=(t=t||{}).mimeType||null,i=t.quality||null,n=this._toKonvaCanvas(t).toDataURL(e,i);return t.callback&&t.callback(n),n},s.prototype.toImage=function(t){if(!t||!t.callback)throw"callback required for toImage method config argument";var e=t.callback;delete t.callback,I._urlToImage(this.toDataURL(t),function(t){e(t)})},s.prototype.setSize=function(t){return this.width(t.width),this.height(t.height),this},s.prototype.getSize=function(){return{width:this.width(),height:this.height()}},s.prototype.getClassName=function(){return this.className||this.nodeType},s.prototype.getType=function(){return this.nodeType},s.prototype.getDragDistance=function(){return void 0!==this.attrs.dragDistance?this.attrs.dragDistance:this.parent?this.parent.getDragDistance():O.dragDistance},s.prototype._off=function(t,e,i){var n,r,o,a=this.eventListeners[t];for(n=0;n<a.length;n++)if(r=a[n].name,o=a[n].handler,!("konva"===r&&"konva"!==e||e&&r!==e||i&&i!==o)){if(a.splice(n,1),0===a.length){delete this.eventListeners[t];break}n--}},s.prototype._fireChangeEvent=function(t,e,i){this._fire(t+"Change",{oldVal:e,newVal:i})},s.prototype.setId=function(t){var e=this.id();return F(e,this),function(t,e){e&&(D[e]=t)}(this,t),this._setAttr("id",t),this},s.prototype.setName=function(t){var e,i,n,r,o=(this.name()||"").split(/\s/g),a=(t||"").split(/\s/g);for(i=0;i<o.length;i++)e=o[i],-1===a.indexOf(e)&&e&&B(e,this._id);for(i=0;i<a.length;i++)e=a[i],-1===o.indexOf(e)&&e&&(n=this,(r=e)&&(E[r]||(E[r]=[]),E[r].push(n)));return this._setAttr("name",t),this},s.prototype.addName=function(t){if(!this.hasName(t)){var e=this.name(),i=e?e+" "+t:t;this.setName(i)}return this},s.prototype.hasName=function(t){if(!t)return!1;var e=this.name();return!!e&&-1!==(e||"").split(/\s/g).indexOf(t)},s.prototype.removeName=function(t){var e=(this.name()||"").split(/\s/g),i=e.indexOf(t);return-1!==i&&(e.splice(i,1),this.setName(e.join(" "))),this},s.prototype.setAttr=function(t,e){var i=this["set"+I._capitalize(t)];return I._isFunction(i)?i.call(this,e):this._setAttr(t,e),this},s.prototype._setAttr=function(t,e){var i=this.attrs[t];(i!==e||I.isObject(e))&&(null==e?delete this.attrs[t]:this.attrs[t]=e,this._fireChangeEvent(t,i,e))},s.prototype._setComponentAttr=function(t,e,i){var n;void 0!==i&&((n=this.attrs[t])||(this.attrs[t]=this.getAttr(t)),this.attrs[t][e]=i,this._fireChangeEvent(t,n,i))},s.prototype._fireAndBubble=function(t,e,i){if(e&&"Shape"===this.nodeType&&(e.target=this),!((t===X||t===j)&&(i&&(this===i||this.isAncestorOf&&this.isAncestorOf(i))||"Stage"===this.nodeType&&!i))){this._fire(t,e);var n=(t===X||t===j)&&i&&i.isAncestorOf&&i.isAncestorOf(this)&&!i.isAncestorOf(this.parent);(e&&!e.cancelBubble||!e)&&this.parent&&this.parent.isListening()&&!n&&(i&&i.parent?this._fireAndBubble.call(this.parent,t,e,i.parent):this._fireAndBubble.call(this.parent,t,e))}},s.prototype._fire=function(t,e){var i,n=this.eventListeners[t];if(n)for((e=e||{}).currentTarget=this,e.type=t,i=0;i<n.length;i++)n[i].handler.call(this,e)},s.prototype.draw=function(){return this.drawScene(),this.drawHit(),this},s.prototype.startDrag=function(t){var e=t?t.pointerId:void 0,i=this.getStage()._getPointerById(e),n=this.getAbsolutePosition();i&&L._dragElements.set(this._id,{node:this,startPointerPos:i,offset:{x:i.x-n.x,y:i.y-n.y},isDragging:!1,pointerId:e,dragStopped:!1})},s.prototype._setDragPosition=function(t,e){var i=this.getStage()._getPointerById(e.pointerId),n=this.dragBoundFunc();if(i){var r={x:i.x-e.offset.x,y:i.y-e.offset.y};void 0!==n&&(r=n.call(this,r,t)),this._lastPos&&this._lastPos.x===r.x&&this._lastPos.y===r.y||(this.setAbsolutePosition(r),this.getLayer()?this.getLayer().batchDraw():this.getStage()&&this.getStage().batchDraw()),this._lastPos=r}},s.prototype.stopDrag=function(){var t={};L._dragElements.get(this._id).dragStopped=!0,L._endDragBefore(t),L._endDragAfter(t)},s.prototype.setDraggable=function(t){this._setAttr("draggable",t),this._dragChange()},s.prototype.isDragging=function(){var t=L._dragElements.get(this._id);return!!t&&t.isDragging},s.prototype._listenDrag=function(){this._dragCleanup(),this.on("mousedown.konva touchstart.konva",function(t){(!(void 0!==t.evt.button)||0<=O.dragButtons.indexOf(t.evt.button))&&(this.isDragging()||this.startDrag(t))})},s.prototype._dragChange=function(){this.attrs.draggable?this._listenDrag():(this._dragCleanup(),this.getStage()&&L._dragElements.has(this._id)&&this.stopDrag())},s.prototype._dragCleanup=function(){this.off("mousedown.konva"),this.off("touchstart.konva")},s.create=function(t,e){return I._isString(t)&&(t=JSON.parse(t)),this._createNode(t,e)},s._createNode=function(t,e){var i,n,r,o=s.prototype.getClassName.call(t),a=t.children;if(e&&(t.attrs.container=e),h[o]||(I.warn('Can not find a node with class name "'+o+'". Fallback to "Shape".'),o="Shape"),i=new h[o](t.attrs),a)for(n=a.length,r=0;r<n;r++)i.add(s._createNode(a[r]));return i},s}();$.prototype.nodeType="Node",$.prototype._attrsAffectingSize=[],b.addGetterSetter($,"zIndex"),b.addGetterSetter($,"absolutePosition"),b.addGetterSetter($,"position"),b.addGetterSetter($,"x",0,g()),b.addGetterSetter($,"y",0,g()),b.addGetterSetter($,"globalCompositeOperation","source-over",y()),b.addGetterSetter($,"opacity",1,g()),b.addGetterSetter($,"name","",y()),b.addGetterSetter($,"id","",y()),b.addGetterSetter($,"rotation",0,g()),b.addComponentsGetterSetter($,"scale",["x","y"]),b.addGetterSetter($,"scaleX",1,g()),b.addGetterSetter($,"scaleY",1,g()),b.addComponentsGetterSetter($,"skew",["x","y"]),b.addGetterSetter($,"skewX",0,g()),b.addGetterSetter($,"skewY",0,g()),b.addComponentsGetterSetter($,"offset",["x","y"]),b.addGetterSetter($,"offsetX",0,g()),b.addGetterSetter($,"offsetY",0,g()),b.addGetterSetter($,"dragDistance",null,g()),b.addGetterSetter($,"width",0,g()),b.addGetterSetter($,"height",0,g()),b.addGetterSetter($,"listening","inherit",function(t){return!0===t||!1===t||"inherit"===t||I.warn(t+' is a not valid value for "listening" attribute. The value may be true, false or "inherit".'),t}),b.addGetterSetter($,"preventDefault",!0,m()),b.addGetterSetter($,"filters",null,function(t){return this._filterUpToDate=!1,t}),b.addGetterSetter($,"visible","inherit",function(t){return!0===t||!1===t||"inherit"===t||I.warn(t+' is a not valid value for "visible" attribute. The value may be true, false or "inherit".'),t}),b.addGetterSetter($,"transformsEnabled","all",y()),b.addGetterSetter($,"size"),b.addGetterSetter($,"dragBoundFunc"),b.addGetterSetter($,"draggable",!1,m()),b.backCompat($,{rotateDeg:"rotate",setRotationDeg:"setRotation",getRotationDeg:"getRotation"}),a.mapMethods($);var tt=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.children=new a,t}return w(t,e),t.prototype.getChildren=function(e){if(!e)return this.children;var i=new a;return this.children.each(function(t){e(t)&&i.push(t)}),i},t.prototype.hasChildren=function(){return 0<this.getChildren().length},t.prototype.removeChildren=function(){for(var t,e=0;e<this.children.length;e++)(t=this.children[e]).parent=null,t.index=0,t.remove();return this.children=new a,this},t.prototype.destroyChildren=function(){for(var t,e=0;e<this.children.length;e++)(t=this.children[e]).parent=null,t.index=0,t.destroy();return this.children=new a,this},t.prototype.add=function(t){if(1<arguments.length){for(var e=0;e<arguments.length;e++)this.add(arguments[e]);return this}if(t.getParent())return t.moveTo(this),this;var i=this.children;return this._validateAdd(t),t.index=i.length,t.parent=this,i.push(t),this._fire("add",{child:t}),this},t.prototype.destroy=function(){return this.hasChildren()&&this.destroyChildren(),e.prototype.destroy.call(this),this},t.prototype.find=function(t){return this._generalFind(t,!1)},t.prototype.get=function(t){return I.warn("collection.get() method is deprecated. Please use collection.find() instead."),this.find(t)},t.prototype.findOne=function(t){var e=this._generalFind(t,!0);return 0<e.length?e[0]:void 0},t.prototype._generalFind=function(i,n){var r=[];return this._descendants(function(t){var e=t._isMatch(i);return e&&r.push(t),!(!e||!n)}),a.toCollection(r)},t.prototype._descendants=function(t){for(var e=0;e<this.children.length;e++){var i=this.children[e];if(t(i))return!0;if(i.hasChildren()&&i._descendants(t))return!0}return!1},t.prototype.toObject=function(){var t=$.prototype.toObject.call(this);t.children=[];for(var e=this.getChildren(),i=e.length,n=0;n<i;n++){var r=e[n];t.children.push(r.toObject())}return t},t.prototype._getDescendants=function(t){for(var e=[],i=t.length,n=0;n<i;n++){var r=t[n];this.isAncestorOf(r)&&e.push(r)}return e},t.prototype.isAncestorOf=function(t){for(var e=t.getParent();e;){if(e._id===this._id)return!0;e=e.getParent()}return!1},t.prototype.clone=function(t){var e=$.prototype.clone.call(this,t);return this.getChildren().each(function(t){e.add(t.clone())}),e},t.prototype.getAllIntersections=function(e){var i=[];return this.find("Shape").each(function(t){t.isVisible()&&t.intersects(e)&&i.push(t)}),i},t.prototype._setChildrenIndices=function(){this.children.each(function(t,e){t.index=e})},t.prototype.drawScene=function(t,e,i){var n=this.getLayer(),r=t||n&&n.getCanvas(),o=r&&r.getContext(),a=this._getCanvasCache(),s=a&&a.scene;return(this.isVisible()||i)&&(!i&&s?(o.save(),n._applyTransform(this,o,e),this._drawCachedSceneCanvas(o),o.restore()):this._drawChildren(r,"drawScene",e,!1,i,i)),this},t.prototype.drawHit=function(t,e,i){var n=this.getLayer(),r=t||n&&n.hitCanvas,o=r&&r.getContext(),a=this._getCanvasCache(),s=a&&a.hit;return(this.shouldDrawHit(r)||i)&&(!i&&s?(o.save(),n._applyTransform(this,o,e),this._drawCachedHitCanvas(o),o.restore()):this._drawChildren(r,"drawHit",e,!1,i,i)),this},t.prototype._drawChildren=function(e,i,n,r,o,t){var a,s,h=this.getLayer(),l=e&&e.getContext(),d=this.clipWidth(),c=this.clipHeight(),p=this.clipFunc(),u=d&&c||p;if(u&&h){l.save();var f=this.getAbsoluteTransform(n),g=f.getMatrix();l.transform(g[0],g[1],g[2],g[3],g[4],g[5]),l.beginPath(),p?p.call(this,l,this):(a=this.clipX(),s=this.clipY(),l.rect(a,s,d,c)),l.clip(),g=f.copy().invert().getMatrix(),l.transform(g[0],g[1],g[2],g[3],g[4],g[5])}var v="source-over"!==this.globalCompositeOperation()&&!t;v&&h&&(l.save(),l._applyGlobalCompositeOperation(this)),this.children.each(function(t){t[i](e,n,r,o)}),v&&h&&l.restore(),u&&h&&l.restore()},t.prototype.shouldDrawHit=function(t){if(t&&t.isCache)return!0;var e=this.getLayer(),i=!1;L._dragElements.forEach(function(t){t.isDragging&&t.node.getLayer()===e&&(i=!0)});var n=!O.hitOnDragEnabled&&i;return e&&e.hitGraphEnabled()&&this.isVisible()&&!n},t.prototype.getClientRect=function(i){var n,r,o,a,t=(i=i||{}).skipTransform,e=i.relativeTo,s={x:1/0,y:1/0,width:0,height:0},h=this;this.children.each(function(t){if(t.visible()){var e=t.getClientRect({relativeTo:h,skipShadow:i.skipShadow,skipStroke:i.skipStroke});0===e.width&&0===e.height||(a=void 0===n?(n=e.x,r=e.y,o=e.x+e.width,e.y+e.height):(n=Math.min(n,e.x),r=Math.min(r,e.y),o=Math.max(o,e.x+e.width),Math.max(a,e.y+e.height)))}});for(var l=this.find("Shape"),d=!1,c=0;c<l.length;c++){if(l[c]._isVisible(this)){d=!0;break}}return s=d?{x:n,y:r,width:o-n,height:a-r}:{x:0,y:0,width:0,height:0},t?s:this._transformedRect(s,e)},t}($);b.addComponentsGetterSetter(tt,"clip",["x","y","width","height"]),b.addGetterSetter(tt,"clipX",void 0,g()),b.addGetterSetter(tt,"clipY",void 0,g()),b.addGetterSetter(tt,"clipWidth",void 0,g()),b.addGetterSetter(tt,"clipHeight",void 0,g()),b.addGetterSetter(tt,"clipFunc"),a.mapMethods(tt);var et=new Map;function it(t){return et.get(t)}function nt(t){return{evt:t,pointerId:t.pointerId}}function rt(t,e){return et.get(t)===e}function ot(t,e){at(t),e.getStage()&&(et.set(t,e),e._fire("gotpointercapture",nt(new PointerEvent("gotpointercapture"))))}function at(t,e){var i=et.get(t);if(i){var n=i.getStage();n&&n.content,et.delete(t),i._fire("lostpointercapture",nt(new PointerEvent("lostpointercapture")))}}var st="mouseout",ht="mouseleave",lt="mouseover",dt="mouseenter",ct="mousemove",pt="mousedown",ut="mouseup",ft="pointermove",gt="pointerdown",vt="pointerup",yt="contextmenu",mt="dblclick",_t="touchstart",St="touchend",bt="touchmove",xt="wheel",wt="_",Ct=[dt,pt,ct,ut,st,_t,bt,St,lt,xt,yt,gt,ft,vt,"pointercancel","lostpointercapture"],Pt=Ct.length;function kt(e,i){e.content.addEventListener(i,function(t){e[wt+i](t)},!1)}var Tt=[];function Mt(t){return void 0===t&&(t={}),(t.clipFunc||t.clipWidth||t.clipHeight)&&I.warn("Stage does not support clipping. Please use clip for Layers or Groups."),t}var At=function(n){function t(t){var e=n.call(this,Mt(t))||this;return e._pointerPositions=[],e._changedPointerPositions=[],e._buildDOM(),e._bindContentEvents(),Tt.push(e),e.on("widthChange.konva heightChange.konva",e._resizeDOM),e.on("visibleChange.konva",e._checkVisibility),e.on("clipWidthChange.konva clipHeightChange.konva clipFuncChange.konva",function(){Mt(e.attrs)}),e._checkVisibility(),e}return w(t,n),t.prototype._validateAdd=function(t){var e="Layer"===t.getType(),i="FastLayer"===t.getType();e||i||I.throw("You may only add layers to the stage.")},t.prototype._checkVisibility=function(){var t=this.visible()?"":"none";this.content.style.display=t},t.prototype.setContainer=function(t){if("string"==typeof t){if("."===t.charAt(0)){var e=t.slice(1);t=document.getElementsByClassName(e)[0]}else{var i;i="#"!==t.charAt(0)?t:t.slice(1),t=document.getElementById(i)}if(!t)throw"Can not find container in document with id "+i}return this._setAttr("container",t),this.content&&(this.content.parentElement&&this.content.parentElement.removeChild(this.content),t.appendChild(this.content)),this},t.prototype.shouldDrawHit=function(){return!0},t.prototype.clear=function(){var t,e=this.children,i=e.length;for(t=0;t<i;t++)e[t].clear();return this},t.prototype.clone=function(t){return t||(t={}),t.container=document.createElement("div"),tt.prototype.clone.call(this,t)},t.prototype.destroy=function(){n.prototype.destroy.call(this);var t=this.content;t&&I._isInDocument(t)&&this.container().removeChild(t);var e=Tt.indexOf(this);return-1<e&&Tt.splice(e,1),this},t.prototype.getPointerPosition=function(){var t=this._pointerPositions[0];return t||I.warn("Pointer position is missing and not registered by the stage. Looks like it is outside of the stage container. You can set it manually from event: stage.setPointersPositions(event);"),{x:t.x,y:t.y}},t.prototype._getPointerById=function(e){return this._pointerPositions.find(function(t){return t.id===e})},t.prototype.getPointersPositions=function(){return this._pointerPositions},t.prototype.getStage=function(){return this},t.prototype.getContent=function(){return this.content},t.prototype._toKonvaCanvas=function(i){var n=(i=i||{}).x||0,r=i.y||0,t=new G({width:i.width||this.width(),height:i.height||this.height(),pixelRatio:i.pixelRatio||1}),o=t.getContext()._context,e=this.children;return(n||r)&&o.translate(-1*n,-1*r),e.each(function(t){if(t.isVisible()){var e=t._toKonvaCanvas(i);o.drawImage(e._canvas,n,r,e.getWidth()/e.getPixelRatio(),e.getHeight()/e.getPixelRatio())}}),t},t.prototype.getIntersection=function(t,e){var i,n,r=this.children;for(i=r.length-1;0<=i;i--)if(n=r[i].getIntersection(t,e))return n;return null},t.prototype._resizeDOM=function(){if(this.content){var t,e,i=this.width(),n=this.height(),r=this.getChildren(),o=r.length;for(this.content.style.width=i+"px",this.content.style.height=n+"px",this.bufferCanvas.setSize(i,n),this.bufferHitCanvas.setSize(i,n),t=0;t<o;t++)(e=r[t]).setSize({width:i,height:n}),e.draw()}},t.prototype.add=function(t){if(1<arguments.length){for(var e=0;e<arguments.length;e++)this.add(arguments[e]);return this}n.prototype.add.call(this,t);var i=this.children.length;return 5<i&&I.warn("The stage has "+i+" layers. Recommended maximin number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group."),t._setCanvasSize(this.width(),this.height()),t.draw(),O.isBrowser&&this.content.appendChild(t.canvas._canvas),this},t.prototype.getParent=function(){return null},t.prototype.getLayer=function(){return null},t.prototype.hasPointerCapture=function(t){return rt(t,this)},t.prototype.setPointerCapture=function(t){ot(t,this)},t.prototype.releaseCapture=function(t){at(t)},t.prototype.getLayers=function(){return this.getChildren()},t.prototype._bindContentEvents=function(){if(O.isBrowser)for(var t=0;t<Pt;t++)kt(this,Ct[t])},t.prototype._mouseenter=function(t){this.setPointersPositions(t),this._fire(dt,{evt:t,target:this,currentTarget:this})},t.prototype._mouseover=function(t){this.setPointersPositions(t),this._fire("contentMouseover",{evt:t}),this._fire(lt,{evt:t,target:this,currentTarget:this})},t.prototype._mouseout=function(t){this.setPointersPositions(t);var e=this.targetShape;e&&!L.isDragging?(e._fireAndBubble(st,{evt:t}),e._fireAndBubble(ht,{evt:t}),this.targetShape=null):L.isDragging||(this._fire(ht,{evt:t,target:this,currentTarget:this}),this._fire(st,{evt:t,target:this,currentTarget:this})),this.pointerPos=void 0,this._pointerPositions=[],this._fire("contentMouseout",{evt:t})},t.prototype._mousemove=function(t){if(O.UA.ieMobile)return this._touchmove(t);this.setPointersPositions(t);var e,i=I._getFirstPointerId(t);if(!L.isDragging){if((e=this.getIntersection(this.getPointerPosition()))&&e.isListening()){var n=!this.targetShape||this.targetShape!==e;!L.isDragging&&n?(this.targetShape&&(this.targetShape._fireAndBubble(st,{evt:t,pointerId:i},e),this.targetShape._fireAndBubble(ht,{evt:t,pointerId:i},e)),e._fireAndBubble(lt,{evt:t,pointerId:i},this.targetShape),e._fireAndBubble(dt,{evt:t,pointerId:i},this.targetShape),this.targetShape=e):e._fireAndBubble(ct,{evt:t,pointerId:i})}else this.targetShape&&!L.isDragging&&(this.targetShape._fireAndBubble(st,{evt:t,pointerId:i}),this.targetShape._fireAndBubble(ht,{evt:t,pointerId:i}),this._fire(lt,{evt:t,target:this,currentTarget:this,pointerId:i}),this.targetShape=null),this._fire(ct,{evt:t,target:this,currentTarget:this,pointerId:i});this._fire("contentMousemove",{evt:t})}t.cancelable&&t.preventDefault()},t.prototype._mousedown=function(t){if(O.UA.ieMobile)return this._touchstart(t);this.setPointersPositions(t);var e=I._getFirstPointerId(t),i=this.getIntersection(this.getPointerPosition());O.listenClickTap=!0,i&&i.isListening()?(this.clickStartShape=i)._fireAndBubble(pt,{evt:t,pointerId:e}):this._fire(pt,{evt:t,target:this,currentTarget:this,pointerId:e}),this._fire("contentMousedown",{evt:t})},t.prototype._mouseup=function(t){if(O.UA.ieMobile)return this._touchend(t);this.setPointersPositions(t);var e=I._getFirstPointerId(t),i=this.getIntersection(this.getPointerPosition()),n=this.clickStartShape,r=this.clickEndShape,o=!1;O.inDblClickWindow?(o=!0,clearTimeout(this.dblTimeout)):L.justDragged?L&&(L.justDragged=!1):(O.inDblClickWindow=!0,clearTimeout(this.dblTimeout)),this.dblTimeout=setTimeout(function(){O.inDblClickWindow=!1},O.dblClickWindow),i&&i.isListening()?((this.clickEndShape=i)._fireAndBubble(ut,{evt:t,pointerId:e}),O.listenClickTap&&n&&n._id===i._id&&(i._fireAndBubble("click",{evt:t,pointerId:e}),o&&r&&r===i&&i._fireAndBubble(mt,{evt:t,pointerId:e}))):(this._fire(ut,{evt:t,target:this,currentTarget:this,pointerId:e}),O.listenClickTap&&this._fire("click",{evt:t,target:this,currentTarget:this,pointerId:e}),o&&this._fire(mt,{evt:t,target:this,currentTarget:this,pointerId:e})),this._fire("contentMouseup",{evt:t}),O.listenClickTap&&(this._fire("contentClick",{evt:t}),o&&this._fire("contentDblclick",{evt:t})),O.listenClickTap=!1,t.cancelable&&t.preventDefault()},t.prototype._contextmenu=function(t){this.setPointersPositions(t);var e=this.getIntersection(this.getPointerPosition());e&&e.isListening()?e._fireAndBubble(yt,{evt:t}):this._fire(yt,{evt:t,target:this,currentTarget:this}),this._fire("contentContextmenu",{evt:t})},t.prototype._touchstart=function(i){var n=this;this.setPointersPositions(i);var r=!1;this._changedPointerPositions.forEach(function(t){var e=n.getIntersection(t);O.listenClickTap=!0,e&&e.isListening()&&(O.captureTouchEventsEnabled&&e.setPointerCapture(t.id),(n.tapStartShape=e)._fireAndBubble(_t,{evt:i,pointerId:t.id},n),r=!0,e.isListening()&&e.preventDefault()&&i.cancelable&&i.preventDefault())}),r||this._fire(_t,{evt:i,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),this._fire("contentTouchstart",{evt:i})},t.prototype._touchmove=function(i){var n=this;if(this.setPointersPositions(i),!L.isDragging||O.hitOnDragEnabled){var r=!1,o={};this._changedPointerPositions.forEach(function(t){var e=it(t.id)||n.getIntersection(t);e&&e.isListening()&&(o[e._id]||(o[e._id]=!0,e._fireAndBubble(bt,{evt:i,pointerId:t.id}),r=!0,e.isListening()&&e.preventDefault()&&i.cancelable&&i.preventDefault()))}),r||this._fire(bt,{evt:i,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),this._fire("contentTouchmove",{evt:i})}L.isDragging&&L.node.preventDefault()&&i.cancelable&&i.preventDefault()},t.prototype._touchend=function(i){var n=this;this.setPointersPositions(i);var r=this.clickEndShape,o=!1;O.inDblClickWindow?o=!0:O.inDblClickWindow=!0,clearTimeout(this.dblTimeout),this.dblTimeout=setTimeout(function(){O.inDblClickWindow=!1},O.dblClickWindow);var a=!1,s={};this._changedPointerPositions.forEach(function(t){var e=it(t.id)||n.getIntersection(t);e&&e.releaseCapture(t.id),e&&e.isListening()&&(s[e._id]||(s[e._id]=!0,(n.clickEndShape=e)._fireAndBubble(St,{evt:i,pointerId:t.id}),a=!0,O.listenClickTap&&n.tapStartShape&&e._id===n.tapStartShape._id&&(e._fireAndBubble("tap",{evt:i,pointerId:t.id}),o&&r&&r===e&&e._fireAndBubble("dbltap",{evt:i,pointerId:t.id})),e.isListening()&&e.preventDefault()&&i.cancelable&&i.preventDefault()))}),a||this._fire(St,{evt:i,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),O.listenClickTap&&this._fire("tap",{evt:i,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),o&&this._fire("dbltap",{evt:i,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),this._fire("contentTouchend",{evt:i}),O.listenClickTap&&(this._fire("contentTap",{evt:i}),o&&this._fire("contentDbltap",{evt:i})),O.listenClickTap=!1},t.prototype._wheel=function(t){this.setPointersPositions(t);var e=this.getIntersection(this.getPointerPosition());e&&e.isListening()?e._fireAndBubble(xt,{evt:t}):this._fire(xt,{evt:t,target:this,currentTarget:this}),this._fire("contentWheel",{evt:t})},t.prototype._pointerdown=function(t){if(O._pointerEventsEnabled){this.setPointersPositions(t);var e=it(t.pointerId)||this.getIntersection(this.getPointerPosition());e&&e._fireAndBubble(gt,nt(t))}},t.prototype._pointermove=function(t){if(O._pointerEventsEnabled){this.setPointersPositions(t);var e=it(t.pointerId)||this.getIntersection(this.getPointerPosition());e&&e._fireAndBubble(ft,nt(t))}},t.prototype._pointerup=function(t){if(O._pointerEventsEnabled){this.setPointersPositions(t);var e=it(t.pointerId)||this.getIntersection(this.getPointerPosition());e&&e._fireAndBubble(vt,nt(t)),at(t.pointerId)}},t.prototype._pointercancel=function(t){if(O._pointerEventsEnabled){this.setPointersPositions(t);var e=it(t.pointerId)||this.getIntersection(this.getPointerPosition());e&&e._fireAndBubble(vt,nt(t)),at(t.pointerId)}},t.prototype._lostpointercapture=function(t){at(t.pointerId)},t.prototype.setPointersPositions=function(t){var e=this,i=this._getContentPosition(),n=null,r=null;if(void 0!==(t=t||window.event).touches){if(this._pointerPositions=[],this._changedPointerPositions=[],a.prototype.each.call(t.touches,function(t){e._pointerPositions.push({id:t.identifier,x:t.clientX-i.left,y:t.clientY-i.top})}),a.prototype.each.call(t.changedTouches||t.touches,function(t){e._changedPointerPositions.push({id:t.identifier,x:t.clientX-i.left,y:t.clientY-i.top})}),0<t.touches.length){var o=t.touches[0];n=o.clientX-i.left,r=o.clientY-i.top}}else n=t.clientX-i.left,r=t.clientY-i.top,this.pointerPos={x:n,y:r},this._pointerPositions=[{x:n,y:r,id:I._getFirstPointerId(t)}],this._changedPointerPositions=[{x:n,y:r,id:I._getFirstPointerId(t)}]},t.prototype._setPointerPosition=function(t){I.warn('Method _setPointerPosition is deprecated. Use "stage.setPointersPositions(event)" instead.'),this.setPointersPositions(t)},t.prototype._getContentPosition=function(){var t=this.content.getBoundingClientRect?this.content.getBoundingClientRect():{top:0,left:0};return{top:t.top,left:t.left}},t.prototype._buildDOM=function(){if(this.bufferCanvas=new G,this.bufferHitCanvas=new R({pixelRatio:1}),O.isBrowser){var t=this.container();if(!t)throw"Stage has no container. A container is required.";t.innerHTML="",this.content=document.createElement("div"),this.content.style.position="relative",this.content.style.userSelect="none",this.content.className="konvajs-content",this.content.setAttribute("role","presentation"),t.appendChild(this.content),this._resizeDOM()}},t.prototype.cache=function(){return I.warn("Cache function is not allowed for stage. You may use cache only for layers, groups and shapes."),this},t.prototype.clearCache=function(){return this},t.prototype.batchDraw=function(){return this.children.each(function(t){t.batchDraw()}),this},t}(tt);At.prototype.nodeType="Stage",i(At),b.addGetterSetter(At,"container");var Gt=function(i){function t(t){var e=i.call(this,t)||this;return e.canvas=new G,e._waitingForDraw=!1,e.on("visibleChange",e._checkVisibility),e._checkVisibility(),e.on("imageSmoothingEnabledChange",e._checkSmooth),e._checkSmooth(),e}return w(t,i),t.prototype.createPNGStream=function(){return this.canvas._canvas.createPNGStream()},t.prototype.getCanvas=function(){return this.canvas},t.prototype.getHitCanvas=function(){return this.hitCanvas},t.prototype.getContext=function(){return this.getCanvas().getContext()},t.prototype.clear=function(t){return this.getContext().clear(t),this},t.prototype.setZIndex=function(t){i.prototype.setZIndex.call(this,t);var e=this.getStage();return e&&(e.content.removeChild(this.getCanvas()._canvas),t<e.getChildren().length-1?e.content.insertBefore(this.getCanvas()._canvas,e.getChildren()[t+1].getCanvas()._canvas):e.content.appendChild(this.getCanvas()._canvas)),this},t.prototype.moveToTop=function(){$.prototype.moveToTop.call(this);var t=this.getStage();return t&&(t.content.removeChild(this.getCanvas()._canvas),t.content.appendChild(this.getCanvas()._canvas)),!0},t.prototype.moveUp=function(){if(!$.prototype.moveUp.call(this))return!1;var t=this.getStage();return!!t&&(t.content.removeChild(this.getCanvas()._canvas),this.index<t.getChildren().length-1?t.content.insertBefore(this.getCanvas()._canvas,t.getChildren()[this.index+1].getCanvas()._canvas):t.content.appendChild(this.getCanvas()._canvas),!0)},t.prototype.moveDown=function(){if($.prototype.moveDown.call(this)){var t=this.getStage();if(t){var e=t.getChildren();t.content.removeChild(this.getCanvas()._canvas),t.content.insertBefore(this.getCanvas()._canvas,e[this.index+1].getCanvas()._canvas)}return!0}return!1},t.prototype.moveToBottom=function(){if($.prototype.moveToBottom.call(this)){var t=this.getStage();if(t){var e=t.getChildren();t.content.removeChild(this.getCanvas()._canvas),t.content.insertBefore(this.getCanvas()._canvas,e[1].getCanvas()._canvas)}return!0}return!1},t.prototype.getLayer=function(){return this},t.prototype.hitGraphEnabled=function(){return!0},t.prototype.remove=function(){var t=this.getCanvas()._canvas;return $.prototype.remove.call(this),t&&t.parentNode&&I._isInDocument(t)&&t.parentNode.removeChild(t),this},t.prototype.getStage=function(){return this.parent},t.prototype.setSize=function(t){var e=t.width,i=t.height;return this.canvas.setSize(e,i),this},t.prototype._toKonvaCanvas=function(t){return(t=t||{}).width=t.width||this.getWidth(),t.height=t.height||this.getHeight(),t.x=void 0!==t.x?t.x:this.x(),t.y=void 0!==t.y?t.y:this.y(),$.prototype._toKonvaCanvas.call(this,t)},t.prototype._checkVisibility=function(){var t=this.visible();this.canvas._canvas.style.display=t?"block":"none"},t.prototype._checkSmooth=function(){this.getContext()._context.imageSmoothingEnabled=this.imageSmoothingEnabled()},t.prototype.getWidth=function(){if(this.parent)return this.parent.width()},t.prototype.setWidth=function(){I.warn('Can not change width of layer. Use "stage.width(value)" function instead.')},t.prototype.getHeight=function(){if(this.parent)return this.parent.height()},t.prototype.setHeight=function(){I.warn('Can not change height of layer. Use "stage.height(value)" function instead.')},t.prototype.getIntersection=function(t,e){return null},t.prototype.batchDraw=function(){var t=this;return this._waitingForDraw||(this._waitingForDraw=!0,I.requestAnimFrame(function(){t.draw(),t._waitingForDraw=!1})),this},t.prototype._applyTransform=function(t,e,i){var n=t.getAbsoluteTransform(i).getMatrix();e.transform(n[0],n[1],n[2],n[3],n[4],n[5])},t}(tt);Gt.prototype.nodeType="BaseLayer",b.addGetterSetter(Gt,"imageSmoothingEnabled",!0),b.addGetterSetter(Gt,"clearBeforeDraw",!0),a.mapMethods(Gt);var Rt,Lt="hasShadow",Ot="shadowRGBA",It="patternImage",Dt="linearGradient",Et="radialGradient";function Ft(){return Rt||(Rt=I.createCanvasElement().getContext("2d"))}var Bt={};function zt(){this._clearCache(Lt)}function Wt(){this._clearCache(Ot)}function Nt(){this._clearCache(It)}function Ht(){this._clearCache(Dt)}function Yt(){this._clearCache(Et)}var Xt=function(n){function t(t){for(var e,i=n.call(this,t)||this;!(e=I.getRandomColor())||e in Bt;);return i.colorKey=e,(Bt[e]=i).on("shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",zt),i.on("shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",Wt),i.on("fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva",Nt),i.on("fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva",Ht),i.on("fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva",Yt),i}return w(t,n),t.prototype.getContext=function(){return this.getLayer().getContext()},t.prototype.getCanvas=function(){return this.getLayer().getCanvas()},t.prototype.getSceneFunc=function(){return this.attrs.sceneFunc||this._sceneFunc},t.prototype.getHitFunc=function(){return this.attrs.hitFunc||this._hitFunc},t.prototype.hasShadow=function(){return this._getCache(Lt,this._hasShadow)},t.prototype._hasShadow=function(){return this.shadowEnabled()&&0!==this.shadowOpacity()&&!!(this.shadowColor()||this.shadowBlur()||this.shadowOffsetX()||this.shadowOffsetY())},t.prototype._getFillPattern=function(){return this._getCache(It,this.__getFillPattern)},t.prototype.__getFillPattern=function(){if(this.fillPatternImage())return Ft().createPattern(this.fillPatternImage(),this.fillPatternRepeat()||"repeat")},t.prototype._getLinearGradient=function(){return this._getCache(Dt,this.__getLinearGradient)},t.prototype.__getLinearGradient=function(){var t=this.fillLinearGradientColorStops();if(t){for(var e=Ft(),i=this.fillLinearGradientStartPoint(),n=this.fillLinearGradientEndPoint(),r=e.createLinearGradient(i.x,i.y,n.x,n.y),o=0;o<t.length;o+=2)r.addColorStop(t[o],t[o+1]);return r}},t.prototype._getRadialGradient=function(){return this._getCache(Et,this.__getRadialGradient)},t.prototype.__getRadialGradient=function(){var t=this.fillRadialGradientColorStops();if(t){for(var e=Ft(),i=this.fillRadialGradientStartPoint(),n=this.fillRadialGradientEndPoint(),r=e.createRadialGradient(i.x,i.y,this.fillRadialGradientStartRadius(),n.x,n.y,this.fillRadialGradientEndRadius()),o=0;o<t.length;o+=2)r.addColorStop(t[o],t[o+1]);return r}},t.prototype.getShadowRGBA=function(){return this._getCache(Ot,this._getShadowRGBA)},t.prototype._getShadowRGBA=function(){if(this.hasShadow()){var t=I.colorToRGBA(this.shadowColor());return"rgba("+t.r+","+t.g+","+t.b+","+t.a*(this.shadowOpacity()||1)+")"}},t.prototype.hasFill=function(){return!!(this.fill()||this.fillPatternImage()||this.fillLinearGradientColorStops()||this.fillRadialGradientColorStops())},t.prototype.hasStroke=function(){return this.strokeEnabled()&&this.strokeWidth()&&!(!this.stroke()&&!this.strokeLinearGradientColorStops())},t.prototype.intersects=function(t){var e=this.getStage().bufferHitCanvas;return e.getContext().clear(),this.drawHit(e),0<e.context.getImageData(Math.round(t.x),Math.round(t.y),1,1).data[3]},t.prototype.destroy=function(){return $.prototype.destroy.call(this),delete Bt[this.colorKey],delete this.colorKey,this},t.prototype._useBufferCanvas=function(t){return!(t&&!this.hasShadow()||!this.perfectDrawEnabled()||1===this.getAbsoluteOpacity()||!this.hasFill()||!this.hasStroke()||!this.getStage())},t.prototype.setStrokeHitEnabled=function(t){t?this.hitStrokeWidth("auto"):this.hitStrokeWidth(0)},t.prototype.getStrokeHitEnabled=function(){return 0!==this.hitStrokeWidth()},t.prototype.getSelfRect=function(){var t=this.size();return{x:this._centroid?Math.round(-t.width/2):0,y:this._centroid?Math.round(-t.height/2):0,width:t.width,height:t.height}},t.prototype.getClientRect=function(t){var e=(t=t||{}).skipTransform,i=t.relativeTo,n=this.getSelfRect(),r=!t.skipStroke&&this.hasStroke()&&this.strokeWidth()||0,o=n.width+r,a=n.height+r,s=!t.skipShadow&&this.hasShadow(),h=s?this.shadowOffsetX():0,l=s?this.shadowOffsetY():0,d=o+Math.abs(h),c=a+Math.abs(l),p=s&&this.shadowBlur()||0,u=d+2*p,f=c+2*p,g=0;Math.round(r/2)!==r/2&&(g=1);var v={width:u+g,height:f+g,x:-Math.round(r/2+p)+Math.min(h,0)+n.x,y:-Math.round(r/2+p)+Math.min(l,0)+n.y};return e?v:this._transformedRect(v,i)},t.prototype.drawScene=function(t,e,i,n){var r,o,a=this.getLayer(),s=t||a.getCanvas(),h=s.getContext(),l=this._getCanvasCache(),d=this.sceneFunc(),c=this.hasShadow(),p=this.hasStroke();if(!this.isVisible()&&!i)return this;if(l)return h.save(),a._applyTransform(this,h,e),this._drawCachedSceneCanvas(h),h.restore(),this;if(!d)return this;if(h.save(),this._useBufferCanvas(i)&&!n){if((o=(r=this.getStage().bufferCanvas).getContext()).clear(),o.save(),o._applyLineJoin(this),!i)if(a)a._applyTransform(this,o,e);else{var u=this.getAbsoluteTransform(e).getMatrix();h.transform(u[0],u[1],u[2],u[3],u[4],u[5])}d.call(this,o,this),o.restore();var f=r.pixelRatio;c&&!s.hitCanvas?(h.save(),h._applyShadow(this),h._applyOpacity(this),h._applyGlobalCompositeOperation(this),h.drawImage(r._canvas,0,0,r.width/f,r.height/f),h.restore()):(h._applyOpacity(this),h._applyGlobalCompositeOperation(this),h.drawImage(r._canvas,0,0,r.width/f,r.height/f))}else{if(h._applyLineJoin(this),!i)if(a)a._applyTransform(this,h,e);else{var g=this.getAbsoluteTransform(e).getMatrix();h.transform(g[0],g[1],g[2],g[3],g[4],g[5])}c&&p&&!s.hitCanvas?(h.save(),i||(h._applyOpacity(this),h._applyGlobalCompositeOperation(this)),h._applyShadow(this),d.call(this,h,this),h.restore(),this.hasFill()&&this.shadowForStrokeEnabled()&&d.call(this,h,this)):c&&!s.hitCanvas?(h.save(),i||(h._applyOpacity(this),h._applyGlobalCompositeOperation(this)),h._applyShadow(this),d.call(this,h,this),h.restore()):(i||(h._applyOpacity(this),h._applyGlobalCompositeOperation(this)),d.call(this,h,this))}return h.restore(),this},t.prototype.drawHit=function(t,e,i){var n=this.getLayer(),r=t||n.hitCanvas,o=r&&r.getContext(),a=this.hitFunc()||this.sceneFunc(),s=this._getCanvasCache(),h=s&&s.hit;if(this.colorKey||(console.log(this),I.warn("Looks like your canvas has a destroyed shape in it. Do not reuse shape after you destroyed it. See the shape in logs above. If you want to reuse shape you should call remove() instead of destroy()")),!this.shouldDrawHit()&&!i)return this;if(h)return o.save(),n._applyTransform(this,o,e),this._drawCachedHitCanvas(o),o.restore(),this;if(!a)return this;if(o.save(),o._applyLineJoin(this),!i)if(n)n._applyTransform(this,o,e);else{var l=this.getAbsoluteTransform(e).getMatrix();o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}return a.call(this,o,this),o.restore(),this},t.prototype.drawHitFromCache=function(t){void 0===t&&(t=0);var e,i,n,r,o,a=this._getCanvasCache(),s=this._getCachedSceneCanvas(),h=a.hit,l=h.getContext(),d=h.getWidth(),c=h.getHeight();l.clear(),l.drawImage(s._canvas,0,0,d,c);try{for(n=(i=(e=l.getImageData(0,0,d,c)).data).length,r=I._hexToRgb(this.colorKey),o=0;o<n;o+=4)t<i[o+3]?(i[o]=r.r,i[o+1]=r.g,i[o+2]=r.b,i[o+3]=255):i[o+3]=0;l.putImageData(e,0,0)}catch(t){I.error("Unable to draw hit graph from cached scene canvas. "+t.message)}return this},t.prototype.hasPointerCapture=function(t){return rt(t,this)},t.prototype.setPointerCapture=function(t){ot(t,this)},t.prototype.releaseCapture=function(t){at(t)},t}($);Xt.prototype._fillFunc=function(t){t.fill()},Xt.prototype._strokeFunc=function(t){t.stroke()},Xt.prototype._fillFuncHit=function(t){t.fill()},Xt.prototype._strokeFuncHit=function(t){t.stroke()},Xt.prototype._centroid=!1,Xt.prototype.nodeType="Shape",i(Xt),b.addGetterSetter(Xt,"stroke",void 0,y()),b.addGetterSetter(Xt,"strokeWidth",2,g()),b.addGetterSetter(Xt,"hitStrokeWidth","auto",v()),b.addGetterSetter(Xt,"strokeHitEnabled",!0,m()),b.addGetterSetter(Xt,"perfectDrawEnabled",!0,m()),b.addGetterSetter(Xt,"shadowForStrokeEnabled",!0,m()),b.addGetterSetter(Xt,"lineJoin"),b.addGetterSetter(Xt,"lineCap"),b.addGetterSetter(Xt,"sceneFunc"),b.addGetterSetter(Xt,"hitFunc"),b.addGetterSetter(Xt,"dash"),b.addGetterSetter(Xt,"dashOffset",0,g()),b.addGetterSetter(Xt,"shadowColor",void 0,y()),b.addGetterSetter(Xt,"shadowBlur",0,g()),b.addGetterSetter(Xt,"shadowOpacity",1,g()),b.addComponentsGetterSetter(Xt,"shadowOffset",["x","y"]),b.addGetterSetter(Xt,"shadowOffsetX",0,g()),b.addGetterSetter(Xt,"shadowOffsetY",0,g()),b.addGetterSetter(Xt,"fillPatternImage"),b.addGetterSetter(Xt,"fill",void 0,y()),b.addGetterSetter(Xt,"fillPatternX",0,g()),b.addGetterSetter(Xt,"fillPatternY",0,g()),b.addGetterSetter(Xt,"fillLinearGradientColorStops"),b.addGetterSetter(Xt,"strokeLinearGradientColorStops"),b.addGetterSetter(Xt,"fillRadialGradientStartRadius",0),b.addGetterSetter(Xt,"fillRadialGradientEndRadius",0),b.addGetterSetter(Xt,"fillRadialGradientColorStops"),b.addGetterSetter(Xt,"fillPatternRepeat","repeat"),b.addGetterSetter(Xt,"fillEnabled",!0),b.addGetterSetter(Xt,"strokeEnabled",!0),b.addGetterSetter(Xt,"shadowEnabled",!0),b.addGetterSetter(Xt,"dashEnabled",!0),b.addGetterSetter(Xt,"strokeScaleEnabled",!0),b.addGetterSetter(Xt,"fillPriority","color"),b.addComponentsGetterSetter(Xt,"fillPatternOffset",["x","y"]),b.addGetterSetter(Xt,"fillPatternOffsetX",0,g()),b.addGetterSetter(Xt,"fillPatternOffsetY",0,g()),b.addComponentsGetterSetter(Xt,"fillPatternScale",["x","y"]),b.addGetterSetter(Xt,"fillPatternScaleX",1,g()),b.addGetterSetter(Xt,"fillPatternScaleY",1,g()),b.addComponentsGetterSetter(Xt,"fillLinearGradientStartPoint",["x","y"]),b.addComponentsGetterSetter(Xt,"strokeLinearGradientStartPoint",["x","y"]),b.addGetterSetter(Xt,"fillLinearGradientStartPointX",0),b.addGetterSetter(Xt,"strokeLinearGradientStartPointX",0),b.addGetterSetter(Xt,"fillLinearGradientStartPointY",0),b.addGetterSetter(Xt,"strokeLinearGradientStartPointY",0),b.addComponentsGetterSetter(Xt,"fillLinearGradientEndPoint",["x","y"]),b.addComponentsGetterSetter(Xt,"strokeLinearGradientEndPoint",["x","y"]),b.addGetterSetter(Xt,"fillLinearGradientEndPointX",0),b.addGetterSetter(Xt,"strokeLinearGradientEndPointX",0),b.addGetterSetter(Xt,"fillLinearGradientEndPointY",0),b.addGetterSetter(Xt,"strokeLinearGradientEndPointY",0),b.addComponentsGetterSetter(Xt,"fillRadialGradientStartPoint",["x","y"]),b.addGetterSetter(Xt,"fillRadialGradientStartPointX",0),b.addGetterSetter(Xt,"fillRadialGradientStartPointY",0),b.addComponentsGetterSetter(Xt,"fillRadialGradientEndPoint",["x","y"]),b.addGetterSetter(Xt,"fillRadialGradientEndPointX",0),b.addGetterSetter(Xt,"fillRadialGradientEndPointY",0),b.addGetterSetter(Xt,"fillPatternRotation",0),b.backCompat(Xt,{dashArray:"dash",getDashArray:"getDash",setDashArray:"getDash",drawFunc:"sceneFunc",getDrawFunc:"getSceneFunc",setDrawFunc:"setSceneFunc",drawHitFunc:"hitFunc",getDrawHitFunc:"getHitFunc",setDrawHitFunc:"setHitFunc"}),a.mapMethods(Xt);var jt=[{x:0,y:0},{x:-1,y:-1},{x:1,y:-1},{x:1,y:1},{x:-1,y:1}],Ut=jt.length,qt=function(n){function t(){var t=null!==n&&n.apply(this,arguments)||this;return t.hitCanvas=new R({pixelRatio:1}),t}return w(t,n),t.prototype._setCanvasSize=function(t,e){this.canvas.setSize(t,e),this.hitCanvas.setSize(t,e),this._checkSmooth()},t.prototype._validateAdd=function(t){var e=t.getType();"Group"!==e&&"Shape"!==e&&I.throw("You may only add groups and shapes to a layer.")},t.prototype.getIntersection=function(t,e){var i,n,r,o;if(!this.hitGraphEnabled()||!this.isVisible())return null;for(var a=1,s=!1;;){for(n=0;n<Ut;n++){if(r=jt[n],(o=(i=this._getIntersection({x:t.x+r.x*a,y:t.y+r.y*a})).shape)&&e)return o.findAncestor(e,!0);if(o)return o;if(s=!!i.antialiased,!i.antialiased)break}if(!s)return null;a+=1}},t.prototype._getIntersection=function(t){var e,i,n=this.hitCanvas.pixelRatio,r=this.hitCanvas.context.getImageData(Math.round(t.x*n),Math.round(t.y*n),1,1).data,o=r[3];return 255===o?(e=I._rgbToHex(r[0],r[1],r[2]),(i=Bt["#"+e])?{shape:i}:{antialiased:!0}):0<o?{antialiased:!0}:{}},t.prototype.drawScene=function(t,e){var i=this.getLayer(),n=t||i&&i.getCanvas();return this._fire("beforeDraw",{node:this}),this.clearBeforeDraw()&&n.getContext().clear(),tt.prototype.drawScene.call(this,n,e),this._fire("draw",{node:this}),this},t.prototype.drawHit=function(t,e){var i=this.getLayer(),n=t||i&&i.hitCanvas;return i&&i.clearBeforeDraw()&&i.getHitCanvas().getContext().clear(),tt.prototype.drawHit.call(this,n,e),this},t.prototype.clear=function(t){return Gt.prototype.clear.call(this,t),this.getHitCanvas().getContext().clear(t),this},t.prototype.enableHitGraph=function(){return this.hitGraphEnabled(!0),this},t.prototype.disableHitGraph=function(){return this.hitGraphEnabled(!1),this},t.prototype.toggleHitCanvas=function(){if(this.parent){var t=this.parent;!!this.hitCanvas._canvas.parentNode?t.content.removeChild(this.hitCanvas._canvas):t.content.appendChild(this.hitCanvas._canvas)}},t.prototype.setSize=function(t){var e=t.width,i=t.height;return n.prototype.setSize.call(this,{width:e,height:i}),this.hitCanvas.setSize(e,i),this},t}(Gt);qt.prototype.nodeType="Layer",i(qt),b.addGetterSetter(qt,"hitGraphEnabled",!0,m()),a.mapMethods(qt);var Vt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._validateAdd=function(t){"Shape"!==t.getType()&&I.throw("You may only add shapes to a fast layer.")},e.prototype._setCanvasSize=function(t,e){this.canvas.setSize(t,e),this._checkSmooth()},e.prototype.hitGraphEnabled=function(){return!1},e.prototype.drawScene=function(t){var e=this.getLayer(),i=t||e&&e.getCanvas();return this.clearBeforeDraw()&&i.getContext().clear(),tt.prototype.drawScene.call(this,i),this},e.prototype.draw=function(){return this.drawScene(),this},e}(Gt);Vt.prototype.nodeType="FastLayer",i(Vt),a.mapMethods(Vt);var Kt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._validateAdd=function(t){var e=t.getType();"Group"!==e&&"Shape"!==e&&I.throw("You may only add groups and shapes to groups.")},e}(tt);Kt.prototype.nodeType="Group",i(Kt),a.mapMethods(Kt);var Qt=n.performance&&n.performance.now?function(){return n.performance.now()}:function(){return(new Date).getTime()},Jt=function(){function n(t,e){this.id=n.animIdCounter++,this.frame={time:0,timeDiff:0,lastTime:Qt(),frameRate:0},this.func=t,this.setLayers(e)}return n.prototype.setLayers=function(t){var e=[];return e=t?0<t.length?t:[t]:[],this.layers=e,this},n.prototype.getLayers=function(){return this.layers},n.prototype.addLayer=function(t){var e,i=this.layers,n=i.length;for(e=0;e<n;e++)if(i[e]._id===t._id)return!1;return this.layers.push(t),!0},n.prototype.isRunning=function(){var t,e=n.animations,i=e.length;for(t=0;t<i;t++)if(e[t].id===this.id)return!0;return!1},n.prototype.start=function(){return this.stop(),this.frame.timeDiff=0,this.frame.lastTime=Qt(),n._addAnimation(this),this},n.prototype.stop=function(){return n._removeAnimation(this),this},n.prototype._updateFrameObject=function(t){this.frame.timeDiff=t-this.frame.lastTime,this.frame.lastTime=t,this.frame.time+=this.frame.timeDiff,this.frame.frameRate=1e3/this.frame.timeDiff},n._addAnimation=function(t){this.animations.push(t),this._handleAnimation()},n._removeAnimation=function(t){var e,i=t.id,n=this.animations,r=n.length;for(e=0;e<r;e++)if(n[e].id===i){this.animations.splice(e,1);break}},n._runFrames=function(){var t,e,i,n,r,o,a,s,h={},l=this.animations;for(n=0;n<l.length;n++)if(e=(t=l[n]).layers,i=t.func,t._updateFrameObject(Qt()),o=e.length,!i||!1!==i.call(t,t.frame))for(r=0;r<o;r++)void 0!==(a=e[r])._id&&(h[a._id]=a);for(s in h)h.hasOwnProperty(s)&&h[s].draw()},n._animationLoop=function(){var t=n;t.animations.length?(t._runFrames(),requestAnimationFrame(t._animationLoop)):t.animRunning=!1},n._handleAnimation=function(){this.animRunning||(this.animRunning=!0,requestAnimationFrame(this._animationLoop))},n.animations=[],n.animIdCounter=0,n.animRunning=!1,n}(),Zt={node:1,duration:1,easing:1,onFinish:1,yoyo:1},$t=0,te=["fill","stroke","shadowColor"],ee=function(){function t(t,e,i,n,r,o,a){this.prop=t,this.propFunc=e,this.begin=n,this._pos=n,this.duration=o,this._change=0,this.prevPos=0,this.yoyo=a,this._time=0,this._position=0,this._startTime=0,this._finish=0,this.func=i,this._change=r-this.begin,this.pause()}return t.prototype.fire=function(t){var e=this[t];e&&e()},t.prototype.setTime=function(t){t>this.duration?this.yoyo?(this._time=this.duration,this.reverse()):this.finish():t<0?this.yoyo?(this._time=0,this.play()):this.reset():(this._time=t,this.update())},t.prototype.getTime=function(){return this._time},t.prototype.setPosition=function(t){this.prevPos=this._pos,this.propFunc(t),this._pos=t},t.prototype.getPosition=function(t){return void 0===t&&(t=this._time),this.func(t,this.begin,this._change,this.duration)},t.prototype.play=function(){this.state=2,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onPlay")},t.prototype.reverse=function(){this.state=3,this._time=this.duration-this._time,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onReverse")},t.prototype.seek=function(t){this.pause(),this._time=t,this.update(),this.fire("onSeek")},t.prototype.reset=function(){this.pause(),this._time=0,this.update(),this.fire("onReset")},t.prototype.finish=function(){this.pause(),this._time=this.duration,this.update(),this.fire("onFinish")},t.prototype.update=function(){this.setPosition(this.getPosition(this._time))},t.prototype.onEnterFrame=function(){var t=this.getTimer()-this._startTime;2===this.state?this.setTime(t):3===this.state&&this.setTime(this.duration-t)},t.prototype.pause=function(){this.state=1,this.fire("onPause")},t.prototype.getTimer=function(){return(new Date).getTime()},t}(),ie=function(){function u(t){var e,i,n=this,r=t.node,o=r._id,a=t.easing||ne.Linear,s=!!t.yoyo;e=void 0===t.duration?.3:0===t.duration?.001:t.duration,this.node=r,this._id=$t++;var h=r.getLayer()||(r instanceof O.Stage?r.getLayers():null);for(i in h||I.error("Tween constructor have `node` that is not in a layer. Please add node into layer first."),this.anim=new Jt(function(){n.tween.onEnterFrame()},h),this.tween=new ee(i,function(t){n._tweenFunc(t)},a,0,1,1e3*e,s),this._addListeners(),u.attrs[o]||(u.attrs[o]={}),u.attrs[o][this._id]||(u.attrs[o][this._id]={}),u.tweens[o]||(u.tweens[o]={}),t)void 0===Zt[i]&&this._addAttr(i,t[i]);this.reset(),this.onFinish=t.onFinish,this.onReset=t.onReset}return u.prototype._addAttr=function(t,e){var i,n,r,o,a,s,h,l,d=this.node,c=d._id;if((r=u.tweens[c][t])&&delete u.attrs[c][r][t],i=d.getAttr(t),I._isArray(e))if(n=[],a=Math.max(e.length,i.length),"points"===t&&e.length!==i.length&&(e.length>i.length?(h=i,i=I._prepareArrayForTween(i,e,d.closed())):(s=e,e=I._prepareArrayForTween(e,i,d.closed()))),0===t.indexOf("fill"))for(o=0;o<a;o++)if(o%2==0)n.push(e[o]-i[o]);else{var p=I.colorToRGBA(i[o]);l=I.colorToRGBA(e[o]),i[o]=p,n.push({r:l.r-p.r,g:l.g-p.g,b:l.b-p.b,a:l.a-p.a})}else for(o=0;o<a;o++)n.push(e[o]-i[o]);else n=-1!==te.indexOf(t)?(i=I.colorToRGBA(i),{r:(l=I.colorToRGBA(e)).r-i.r,g:l.g-i.g,b:l.b-i.b,a:l.a-i.a}):e-i;u.attrs[c][this._id][t]={start:i,diff:n,end:e,trueEnd:s,trueStart:h},u.tweens[c][t]=this._id},u.prototype._tweenFunc=function(t){var e,i,n,r,o,a,s,h,l=this.node,d=u.attrs[l._id][this._id];for(e in d){if(n=(i=d[e]).start,r=i.diff,h=i.end,I._isArray(n))if(o=[],s=Math.max(n.length,h.length),0===e.indexOf("fill"))for(a=0;a<s;a++)a%2==0?o.push((n[a]||0)+r[a]*t):o.push("rgba("+Math.round(n[a].r+r[a].r*t)+","+Math.round(n[a].g+r[a].g*t)+","+Math.round(n[a].b+r[a].b*t)+","+(n[a].a+r[a].a*t)+")");else for(a=0;a<s;a++)o.push((n[a]||0)+r[a]*t);else o=-1!==te.indexOf(e)?"rgba("+Math.round(n.r+r.r*t)+","+Math.round(n.g+r.g*t)+","+Math.round(n.b+r.b*t)+","+(n.a+r.a*t)+")":n+r*t;l.setAttr(e,o)}},u.prototype._addListeners=function(){var i=this;this.tween.onPlay=function(){i.anim.start()},this.tween.onReverse=function(){i.anim.start()},this.tween.onPause=function(){i.anim.stop()},this.tween.onFinish=function(){var t=i.node,e=u.attrs[t._id][i._id];e.points&&e.points.trueEnd&&t.setAttr("points",e.points.trueEnd),i.onFinish&&i.onFinish.call(i)},this.tween.onReset=function(){var t=i.node,e=u.attrs[t._id][i._id];e.points&&e.points.trueStart&&t.points(e.points.trueStart),i.onReset&&i.onReset()}},u.prototype.play=function(){return this.tween.play(),this},u.prototype.reverse=function(){return this.tween.reverse(),this},u.prototype.reset=function(){return this.tween.reset(),this},u.prototype.seek=function(t){return this.tween.seek(1e3*t),this},u.prototype.pause=function(){return this.tween.pause(),this},u.prototype.finish=function(){return this.tween.finish(),this},u.prototype.destroy=function(){var t,e=this.node._id,i=this._id,n=u.tweens[e];for(t in this.pause(),n)delete u.tweens[e][t];delete u.attrs[e][i]},u.attrs={},u.tweens={},u}();$.prototype.to=function(t){var e=t.onFinish;t.node=this,t.onFinish=function(){this.destroy(),e&&e()},new ie(t).play()};var ne={BackEaseIn:function(t,e,i,n){return i*(t/=n)*t*(2.70158*t-1.70158)+e},BackEaseOut:function(t,e,i,n){return i*((t=t/n-1)*t*(2.70158*t+1.70158)+1)+e},BackEaseInOut:function(t,e,i,n){var r=1.70158;return(t/=n/2)<1?i/2*(t*t*((1+(r*=1.525))*t-r))+e:i/2*((t-=2)*t*((1+(r*=1.525))*t+r)+2)+e},ElasticEaseIn:function(t,e,i,n,r,o){var a=0;return 0===t?e:1==(t/=n)?e+i:(o||(o=.3*n),a=!r||r<Math.abs(i)?(r=i,o/4):o/(2*Math.PI)*Math.asin(i/r),-r*Math.pow(2,10*(t-=1))*Math.sin((t*n-a)*(2*Math.PI)/o)+e)},ElasticEaseOut:function(t,e,i,n,r,o){var a=0;return 0===t?e:1==(t/=n)?e+i:(o||(o=.3*n),a=!r||r<Math.abs(i)?(r=i,o/4):o/(2*Math.PI)*Math.asin(i/r),r*Math.pow(2,-10*t)*Math.sin((t*n-a)*(2*Math.PI)/o)+i+e)},ElasticEaseInOut:function(t,e,i,n,r,o){var a=0;return 0===t?e:2==(t/=n/2)?e+i:(o||(o=n*(.3*1.5)),a=!r||r<Math.abs(i)?(r=i,o/4):o/(2*Math.PI)*Math.asin(i/r),t<1?r*Math.pow(2,10*(t-=1))*Math.sin((t*n-a)*(2*Math.PI)/o)*-.5+e:r*Math.pow(2,-10*(t-=1))*Math.sin((t*n-a)*(2*Math.PI)/o)*.5+i+e)},BounceEaseOut:function(t,e,i,n){return(t/=n)<1/2.75?i*(7.5625*t*t)+e:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+e:i*(7.5625*(t-=2.625/2.75)*t+.984375)+e},BounceEaseIn:function(t,e,i,n){return i-ne.BounceEaseOut(n-t,0,i,n)+e},BounceEaseInOut:function(t,e,i,n){return t<n/2?.5*ne.BounceEaseIn(2*t,0,i,n)+e:.5*ne.BounceEaseOut(2*t-n,0,i,n)+.5*i+e},EaseIn:function(t,e,i,n){return i*(t/=n)*t+e},EaseOut:function(t,e,i,n){return-i*(t/=n)*(t-2)+e},EaseInOut:function(t,e,i,n){return(t/=n/2)<1?i/2*t*t+e:-i/2*(--t*(t-2)-1)+e},StrongEaseIn:function(t,e,i,n){return i*(t/=n)*t*t*t*t+e},StrongEaseOut:function(t,e,i,n){return i*((t=t/n-1)*t*t*t*t+1)+e},StrongEaseInOut:function(t,e,i,n){return(t/=n/2)<1?i/2*t*t*t*t*t+e:i/2*((t-=2)*t*t*t*t+2)+e},Linear:function(t,e,i,n){return i*t/n+e}},re=I._assign(O,{Collection:a,Util:I,Node:$,ids:D,names:E,Container:tt,Stage:At,stages:Tt,Layer:qt,FastLayer:Vt,Group:Kt,DD:L,Shape:Xt,shapes:Bt,Animation:Jt,Tween:ie,Easings:ne,Context:P,Canvas:A}),oe=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e=O.getAngle(this.angle()),i=this.clockwise();t.beginPath(),t.arc(0,0,this.outerRadius(),0,e,i),t.arc(0,0,this.innerRadius(),e,0,!i),t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.outerRadius()},e.prototype.getHeight=function(){return 2*this.outerRadius()},e.prototype.setWidth=function(t){this.outerRadius(t/2)},e.prototype.setHeight=function(t){this.outerRadius(t/2)},e}(Xt);oe.prototype._centroid=!0,oe.prototype.className="Arc",oe.prototype._attrsAffectingSize=["innerRadius","outerRadius"],i(oe),b.addGetterSetter(oe,"innerRadius",0,g()),b.addGetterSetter(oe,"outerRadius",0,g()),b.addGetterSetter(oe,"angle",0,g()),b.addGetterSetter(oe,"clockwise",!1,m()),a.mapMethods(oe);var ae=function(i){function t(t){var e=i.call(this,t)||this;return e.on("pointsChange.konva tensionChange.konva closedChange.konva bezierChange.konva",function(){this._clearCache("tensionPoints")}),e}return w(t,i),t.prototype._sceneFunc=function(t){var e,i,n,r=this.points(),o=r.length,a=this.tension(),s=this.closed(),h=this.bezier();if(o){if(t.beginPath(),t.moveTo(r[0],r[1]),0!==a&&4<o){for(i=(e=this.getTensionPoints()).length,n=s?0:4,s||t.quadraticCurveTo(e[0],e[1],e[2],e[3]);n<i-2;)t.bezierCurveTo(e[n++],e[n++],e[n++],e[n++],e[n++],e[n++]);s||t.quadraticCurveTo(e[i-2],e[i-1],r[o-2],r[o-1])}else if(h)for(n=2;n<o;)t.bezierCurveTo(r[n++],r[n++],r[n++],r[n++],r[n++],r[n++]);else for(n=2;n<o;n+=2)t.lineTo(r[n],r[n+1]);s?(t.closePath(),t.fillStrokeShape(this)):t.strokeShape(this)}},t.prototype.getTensionPoints=function(){return this._getCache("tensionPoints",this._getTensionPoints)},t.prototype._getTensionPoints=function(){return this.closed()?this._getTensionPointsClosed():I._expandPoints(this.points(),this.tension())},t.prototype._getTensionPointsClosed=function(){var t=this.points(),e=t.length,i=this.tension(),n=I._getControlPoints(t[e-2],t[e-1],t[0],t[1],t[2],t[3],i),r=I._getControlPoints(t[e-4],t[e-3],t[e-2],t[e-1],t[0],t[1],i),o=I._expandPoints(t,i);return[n[2],n[3]].concat(o).concat([r[0],r[1],t[e-2],t[e-1],r[2],r[3],n[0],n[1],t[0],t[1]])},t.prototype.getWidth=function(){return this.getSelfRect().width},t.prototype.getHeight=function(){return this.getSelfRect().height},t.prototype.getSelfRect=function(){for(var t,e,i,n=(t=0!==this.tension()?this._getTensionPoints():this.points())[0],r=t[0],o=t[1],a=t[1],s=0;s<t.length/2;s++)e=t[2*s],i=t[2*s+1],n=Math.min(n,e),r=Math.max(r,e),o=Math.min(o,i),a=Math.max(a,i);return{x:Math.round(n),y:Math.round(o),width:Math.round(r-n),height:Math.round(a-o)}},t}(Xt);ae.prototype.className="Line",ae.prototype._attrsAffectingSize=["points","bezier","tension"],i(ae),b.addGetterSetter(ae,"closed",!1),b.addGetterSetter(ae,"bezier",!1),b.addGetterSetter(ae,"tension",0,g()),b.addGetterSetter(ae,"points",[],function(){if(O.isUnminified)return function(t,e){return I._isArray(t)?t.forEach(function(t){I._isNumber(t)||I.warn('"'+e+'" attribute has non numeric element '+t+". Make sure that all elements are numbers.")}):I.warn(u(t)+' is a not valid value for "'+e+'" attribute. The value should be a array of numbers.'),t}}()),a.mapMethods(ae);var se=function(p){function t(){return null!==p&&p.apply(this,arguments)||this}return w(t,p),t.prototype._sceneFunc=function(t){p.prototype._sceneFunc.call(this,t);var e=2*Math.PI,i=this.points(),n=i,r=0!==this.tension()&&4<i.length;r&&(n=this.getTensionPoints());var o,a,s=i.length;a=r?(o=i[s-2]-n[s-2],i[s-1]-n[s-1]):(o=i[s-2]-i[s-4],i[s-1]-i[s-3]);var h=(Math.atan2(a,o)+e)%e,l=this.pointerLength(),d=this.pointerWidth();t.save(),t.beginPath(),t.translate(i[s-2],i[s-1]),t.rotate(h),t.moveTo(0,0),t.lineTo(-l,d/2),t.lineTo(-l,-d/2),t.closePath(),t.restore(),this.pointerAtBeginning()&&(t.save(),t.translate(i[0],i[1]),a=r?(o=n[0]-i[0],n[1]-i[1]):(o=i[2]-i[0],i[3]-i[1]),t.rotate((Math.atan2(-a,-o)+e)%e),t.moveTo(0,0),t.lineTo(-l,d/2),t.lineTo(-l,-d/2),t.closePath(),t.restore());var c=this.dashEnabled();c&&(this.attrs.dashEnabled=!1,t.setLineDash([])),t.fillStrokeShape(this),c&&(this.attrs.dashEnabled=!0)},t}(ae);se.prototype.className="Arrow",i(se),b.addGetterSetter(se,"pointerLength",10,g()),b.addGetterSetter(se,"pointerWidth",10,g()),b.addGetterSetter(se,"pointerAtBeginning",!1),a.mapMethods(se);var he=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){t.beginPath(),t.arc(0,0,this.radius(),0,2*Math.PI,!1),t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.radius()},e.prototype.getHeight=function(){return 2*this.radius()},e.prototype.setWidth=function(t){this.radius()!==t/2&&this.radius(t/2)},e.prototype.setHeight=function(t){this.radius()!==t/2&&this.radius(t/2)},e}(Xt);he.prototype._centroid=!0,he.prototype.className="Circle",he.prototype._attrsAffectingSize=["radius"],i(he),b.addGetterSetter(he,"radius",0,g()),a.mapMethods(he);var le=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e=this.radiusX(),i=this.radiusY();t.beginPath(),t.save(),e!==i&&t.scale(1,i/e),t.arc(0,0,e,0,2*Math.PI,!1),t.restore(),t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.radiusX()},e.prototype.getHeight=function(){return 2*this.radiusY()},e.prototype.setWidth=function(t){this.radiusX(t/2)},e.prototype.setHeight=function(t){this.radiusY(t/2)},e}(Xt);le.prototype.className="Ellipse",le.prototype._centroid=!0,le.prototype._attrsAffectingSize=["radiusX","radiusY"],i(le),b.addComponentsGetterSetter(le,"radius",["x","y"]),b.addGetterSetter(le,"radiusX",0,g()),b.addGetterSetter(le,"radiusY",0,g()),a.mapMethods(le);var de=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return w(n,t),n.prototype._useBufferCanvas=function(){return!(!this.hasShadow()&&1===this.getAbsoluteOpacity()||!this.hasStroke()||!this.getStage())},n.prototype._sceneFunc=function(t){var e,i,n,r=this.width(),o=this.height(),a=this.image();a&&(e=this.cropWidth(),i=this.cropHeight(),n=e&&i?[a,this.cropX(),this.cropY(),e,i,0,0,r,o]:[a,0,0,r,o]),(this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,r,o),t.closePath(),t.fillStrokeShape(this)),a&&t.drawImage.apply(t,n)},n.prototype._hitFunc=function(t){var e=this.width(),i=this.height();t.beginPath(),t.rect(0,0,e,i),t.closePath(),t.fillStrokeShape(this)},n.prototype.getWidth=function(){var t=this.image();return this.attrs.width||(t?t.width:0)},n.prototype.getHeight=function(){var t=this.image();return this.attrs.height||(t?t.height:0)},n.fromURL=function(t,e){var i=I.createImageElement();i.onload=function(){var t=new n({image:i});e(t)},i.crossOrigin="Anonymous",i.src=t},n}(Xt);de.prototype.className="Image",i(de),b.addGetterSetter(de,"image"),b.addComponentsGetterSetter(de,"crop",["x","y","width","height"]),b.addGetterSetter(de,"cropX",0,g()),b.addGetterSetter(de,"cropY",0,g()),b.addGetterSetter(de,"cropWidth",0,g()),b.addGetterSetter(de,"cropHeight",0,g()),a.mapMethods(de);var ce=["fontFamily","fontSize","fontStyle","padding","lineHeight","text","width"],pe="right",ue="down",fe="left",ge=ce.length,ve=function(i){function t(t){var e=i.call(this,t)||this;return e.on("add.konva",function(t){this._addListeners(t.child),this._sync()}),e}return w(t,i),t.prototype.getText=function(){return this.find("Text")[0]},t.prototype.getTag=function(){return this.find("Tag")[0]},t.prototype._addListeners=function(t){var e,i=this,n=function(){i._sync()};for(e=0;e<ge;e++)t.on(ce[e]+"Change.konva",n)},t.prototype.getWidth=function(){return this.getText().width()},t.prototype.getHeight=function(){return this.getText().height()},t.prototype._sync=function(){var t,e,i,n,r,o,a,s=this.getText(),h=this.getTag();if(s&&h){switch(t=s.width(),e=s.height(),i=h.pointerDirection(),n=h.pointerWidth(),a=h.pointerHeight(),o=r=0,i){case"up":r=t/2,o=-1*a;break;case pe:r=t+n,o=e/2;break;case ue:r=t/2,o=e+a;break;case fe:r=-1*n,o=e/2}h.setAttrs({x:-1*r,y:-1*o,width:t,height:e}),s.setAttrs({x:-1*r,y:-1*o})}},t}(Kt);ve.prototype.className="Label",i(ve),a.mapMethods(ve);var ye=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e=this.width(),i=this.height(),n=this.pointerDirection(),r=this.pointerWidth(),o=this.pointerHeight(),a=Math.min(this.cornerRadius(),e/2,i/2);t.beginPath(),a?t.moveTo(a,0):t.moveTo(0,0),"up"===n&&(t.lineTo((e-r)/2,0),t.lineTo(e/2,-1*o),t.lineTo((e+r)/2,0)),a?(t.lineTo(e-a,0),t.arc(e-a,a,a,3*Math.PI/2,0,!1)):t.lineTo(e,0),n===pe&&(t.lineTo(e,(i-o)/2),t.lineTo(e+r,i/2),t.lineTo(e,(i+o)/2)),a?(t.lineTo(e,i-a),t.arc(e-a,i-a,a,0,Math.PI/2,!1)):t.lineTo(e,i),n===ue&&(t.lineTo((e+r)/2,i),t.lineTo(e/2,i+o),t.lineTo((e-r)/2,i)),a?(t.lineTo(a,i),t.arc(a,i-a,a,Math.PI/2,Math.PI,!1)):t.lineTo(0,i),n===fe&&(t.lineTo(0,(i+o)/2),t.lineTo(-1*r,i/2),t.lineTo(0,(i-o)/2)),a&&(t.lineTo(0,a),t.arc(a,a,a,Math.PI,3*Math.PI/2,!1)),t.closePath(),t.fillStrokeShape(this)},e.prototype.getSelfRect=function(){var t=0,e=0,i=this.pointerWidth(),n=this.pointerHeight(),r=this.pointerDirection(),o=this.width(),a=this.height();return"up"===r?(e-=n,a+=n):r===ue?a+=n:r===fe?(t-=1.5*i,o+=i):r===pe&&(o+=1.5*i),{x:t,y:e,width:o,height:a}},e}(Xt);ye.prototype.className="Tag",i(ye),b.addGetterSetter(ye,"pointerDirection","none"),b.addGetterSetter(ye,"pointerWidth",0,g()),b.addGetterSetter(ye,"pointerHeight",0,g()),b.addGetterSetter(ye,"cornerRadius",0,g()),a.mapMethods(ye);var me=function(n){function u(t){var e=n.call(this,t)||this;e.dataArray=[],e.pathLength=0,e.dataArray=u.parsePathData(e.data());for(var i=e.pathLength=0;i<e.dataArray.length;++i)e.pathLength+=e.dataArray[i].pathLength;return e.on("dataChange.konva",function(){this.dataArray=u.parsePathData(this.data());for(var t=this.pathLength=0;t<this.dataArray.length;++t)this.pathLength+=this.dataArray[t].pathLength}),e}return w(u,n),u.prototype._sceneFunc=function(t){var e=this.dataArray;t.beginPath();for(var i=0;i<e.length;i++){var n=e[i].command,r=e[i].points;switch(n){case"L":t.lineTo(r[0],r[1]);break;case"M":t.moveTo(r[0],r[1]);break;case"C":t.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5]);break;case"Q":t.quadraticCurveTo(r[0],r[1],r[2],r[3]);break;case"A":var o=r[0],a=r[1],s=r[2],h=r[3],l=r[4],d=r[5],c=r[6],p=r[7],u=h<s?s:h,f=h<s?1:s/h,g=h<s?h/s:1;t.translate(o,a),t.rotate(c),t.scale(f,g),t.arc(0,0,u,l,l+d,1-p),t.scale(1/f,1/g),t.rotate(-c),t.translate(-o,-a);break;case"z":t.closePath()}}t.fillStrokeShape(this)},u.prototype.getSelfRect=function(){var e=[];this.dataArray.forEach(function(t){e=e.concat(t.points)});for(var t,i,n=e[0],r=e[0],o=e[1],a=e[1],s=0;s<e.length/2;s++)t=e[2*s],i=e[2*s+1],isNaN(t)||(n=Math.min(n,t),r=Math.max(r,t)),isNaN(i)||(o=Math.min(o,i),a=Math.max(a,i));return{x:Math.round(n),y:Math.round(o),width:Math.round(r-n),height:Math.round(a-o)}},u.prototype.getLength=function(){return this.pathLength},u.prototype.getPointAtLength=function(t){var e,i=0,n=this.dataArray.length;if(!n)return null;for(;i<n&&t>this.dataArray[i].pathLength;)t-=this.dataArray[i].pathLength,++i;if(i===n)return{x:(e=this.dataArray[i-1].points.slice(-2))[0],y:e[1]};if(t<.01)return{x:(e=this.dataArray[i].points.slice(0,2))[0],y:e[1]};var r=this.dataArray[i],o=r.points;switch(r.command){case"L":return u.getPointOnLine(t,r.start.x,r.start.y,o[0],o[1]);case"C":return u.getPointOnCubicBezier(t/r.pathLength,r.start.x,r.start.y,o[0],o[1],o[2],o[3],o[4],o[5]);case"Q":return u.getPointOnQuadraticBezier(t/r.pathLength,r.start.x,r.start.y,o[0],o[1],o[2],o[3]);case"A":var a=o[0],s=o[1],h=o[2],l=o[3],d=o[4],c=o[5],p=o[6];return d+=c*t/r.pathLength,u.getPointOnEllipticalArc(a,s,h,l,d,p)}return null},u.getLineLength=function(t,e,i,n){return Math.sqrt((i-t)*(i-t)+(n-e)*(n-e))},u.getPointOnLine=function(t,e,i,n,r,o,a){void 0===o&&(o=e),void 0===a&&(a=i);var s=(r-i)/(n-e+1e-8),h=Math.sqrt(t*t/(1+s*s));n<e&&(h*=-1);var l,d=s*h;if(n===e)l={x:o,y:a+d};else if((a-i)/(o-e+1e-8)==s)l={x:o+h,y:a+d};else{var c,p,u=this.getLineLength(e,i,n,r);if(u<1e-8)return;var f=(o-e)*(n-e)+(a-i)*(r-i);c=e+(f/=u*u)*(n-e),p=i+f*(r-i);var g=this.getLineLength(o,a,c,p),v=Math.sqrt(t*t-g*g);h=Math.sqrt(v*v/(1+s*s)),n<e&&(h*=-1),l={x:c+h,y:p+(d=s*h)}}return l},u.getPointOnCubicBezier=function(t,e,i,n,r,o,a,s,h){function l(t){return t*t*t}function d(t){return 3*t*t*(1-t)}function c(t){return 3*t*(1-t)*(1-t)}function p(t){return(1-t)*(1-t)*(1-t)}return{x:s*l(t)+o*d(t)+n*c(t)+e*p(t),y:h*l(t)+a*d(t)+r*c(t)+i*p(t)}},u.getPointOnQuadraticBezier=function(t,e,i,n,r,o,a){function s(t){return t*t}function h(t){return 2*t*(1-t)}function l(t){return(1-t)*(1-t)}return{x:o*s(t)+n*h(t)+e*l(t),y:a*s(t)+r*h(t)+i*l(t)}},u.getPointOnEllipticalArc=function(t,e,i,n,r,o){var a=Math.cos(o),s=Math.sin(o),h=i*Math.cos(r),l=n*Math.sin(r);return{x:t+(h*a-l*s),y:e+(h*s+l*a)}},u.parsePathData=function(t){if(!t)return[];var e=t,i=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"];e=e.replace(new RegExp(" ","g"),",");for(var n=0;n<i.length;n++)e=e.replace(new RegExp(i[n],"g"),"|"+i[n]);var r,o=e.split("|"),a=[],s=[],h=0,l=0,d=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi;for(n=1;n<o.length;n++){var c=o[n],p=c.charAt(0);for(c=c.slice(1),s.length=0;r=d.exec(c);)s.push(r[0]);for(var u=[],f=0,g=s.length;f<g;f++){var v=parseFloat(s[f]);isNaN(v)?u.push(0):u.push(v)}for(;0<u.length&&!isNaN(u[0]);){var y,m,_,S,b,x,w,C,P,k,T=null,M=[],A=h,G=l;switch(p){case"l":h+=u.shift(),l+=u.shift(),T="L",M.push(h,l);break;case"L":h=u.shift(),l=u.shift(),M.push(h,l);break;case"m":var R=u.shift(),L=u.shift();if(h+=R,l+=L,T="M",2<a.length&&"z"===a[a.length-1].command)for(var O=a.length-2;0<=O;O--)if("M"===a[O].command){h=a[O].points[0]+R,l=a[O].points[1]+L;break}M.push(h,l),p="l";break;case"M":h=u.shift(),l=u.shift(),T="M",M.push(h,l),p="L";break;case"h":h+=u.shift(),T="L",M.push(h,l);break;case"H":h=u.shift(),T="L",M.push(h,l);break;case"v":l+=u.shift(),T="L",M.push(h,l);break;case"V":l=u.shift(),T="L",M.push(h,l);break;case"C":M.push(u.shift(),u.shift(),u.shift(),u.shift()),h=u.shift(),l=u.shift(),M.push(h,l);break;case"c":M.push(h+u.shift(),l+u.shift(),h+u.shift(),l+u.shift()),h+=u.shift(),l+=u.shift(),T="C",M.push(h,l);break;case"S":m=h,_=l,"C"===(y=a[a.length-1]).command&&(m=h+(h-y.points[2]),_=l+(l-y.points[3])),M.push(m,_,u.shift(),u.shift()),h=u.shift(),l=u.shift(),T="C",M.push(h,l);break;case"s":m=h,_=l,"C"===(y=a[a.length-1]).command&&(m=h+(h-y.points[2]),_=l+(l-y.points[3])),M.push(m,_,h+u.shift(),l+u.shift()),h+=u.shift(),l+=u.shift(),T="C",M.push(h,l);break;case"Q":M.push(u.shift(),u.shift()),h=u.shift(),l=u.shift(),M.push(h,l);break;case"q":M.push(h+u.shift(),l+u.shift()),h+=u.shift(),l+=u.shift(),T="Q",M.push(h,l);break;case"T":m=h,_=l,"Q"===(y=a[a.length-1]).command&&(m=h+(h-y.points[0]),_=l+(l-y.points[1])),h=u.shift(),l=u.shift(),T="Q",M.push(m,_,h,l);break;case"t":m=h,_=l,"Q"===(y=a[a.length-1]).command&&(m=h+(h-y.points[0]),_=l+(l-y.points[1])),h+=u.shift(),l+=u.shift(),T="Q",M.push(m,_,h,l);break;case"A":S=u.shift(),b=u.shift(),x=u.shift(),w=u.shift(),C=u.shift(),P=h,k=l,h=u.shift(),l=u.shift(),T="A",M=this.convertEndpointToCenterParameterization(P,k,h,l,w,C,S,b,x);break;case"a":S=u.shift(),b=u.shift(),x=u.shift(),w=u.shift(),C=u.shift(),P=h,k=l,h+=u.shift(),l+=u.shift(),T="A",M=this.convertEndpointToCenterParameterization(P,k,h,l,w,C,S,b,x)}a.push({command:T||p,points:M,start:{x:A,y:G},pathLength:this.calcLength(A,G,T||p,M)})}"z"!==p&&"Z"!==p||a.push({command:"z",points:[],start:void 0,pathLength:0})}return a},u.calcLength=function(t,e,i,n){var r,o,a,s,h=u;switch(i){case"L":return h.getLineLength(t,e,n[0],n[1]);case"C":for(r=0,o=h.getPointOnCubicBezier(0,t,e,n[0],n[1],n[2],n[3],n[4],n[5]),s=.01;s<=1;s+=.01)a=h.getPointOnCubicBezier(s,t,e,n[0],n[1],n[2],n[3],n[4],n[5]),r+=h.getLineLength(o.x,o.y,a.x,a.y),o=a;return r;case"Q":for(r=0,o=h.getPointOnQuadraticBezier(0,t,e,n[0],n[1],n[2],n[3]),s=.01;s<=1;s+=.01)a=h.getPointOnQuadraticBezier(s,t,e,n[0],n[1],n[2],n[3]),r+=h.getLineLength(o.x,o.y,a.x,a.y),o=a;return r;case"A":r=0;var l=n[4],d=n[5],c=n[4]+d,p=Math.PI/180;if(Math.abs(l-c)<p&&(p=Math.abs(l-c)),o=h.getPointOnEllipticalArc(n[0],n[1],n[2],n[3],l,0),d<0)for(s=l-p;c<s;s-=p)a=h.getPointOnEllipticalArc(n[0],n[1],n[2],n[3],s,0),r+=h.getLineLength(o.x,o.y,a.x,a.y),o=a;else for(s=l+p;s<c;s+=p)a=h.getPointOnEllipticalArc(n[0],n[1],n[2],n[3],s,0),r+=h.getLineLength(o.x,o.y,a.x,a.y),o=a;return a=h.getPointOnEllipticalArc(n[0],n[1],n[2],n[3],c,0),r+=h.getLineLength(o.x,o.y,a.x,a.y)}return 0},u.convertEndpointToCenterParameterization=function(t,e,i,n,r,o,a,s,h){var l=h*(Math.PI/180),d=Math.cos(l)*(t-i)/2+Math.sin(l)*(e-n)/2,c=-1*Math.sin(l)*(t-i)/2+Math.cos(l)*(e-n)/2,p=d*d/(a*a)+c*c/(s*s);1<p&&(a*=Math.sqrt(p),s*=Math.sqrt(p));var u=Math.sqrt((a*a*(s*s)-a*a*(c*c)-s*s*(d*d))/(a*a*(c*c)+s*s*(d*d)));r===o&&(u*=-1),isNaN(u)&&(u=0);var f=u*a*c/s,g=u*-s*d/a,v=(t+i)/2+Math.cos(l)*f-Math.sin(l)*g,y=(e+n)/2+Math.sin(l)*f+Math.cos(l)*g,m=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},_=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(m(t)*m(e))},S=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(_(t,e))},b=S([1,0],[(d-f)/a,(c-g)/s]),x=[(d-f)/a,(c-g)/s],w=[(-1*d-f)/a,(-1*c-g)/s],C=S(x,w);return _(x,w)<=-1&&(C=Math.PI),1<=_(x,w)&&(C=0),0===o&&0<C&&(C-=2*Math.PI),1===o&&C<0&&(C+=2*Math.PI),[v,y,a,s,b,C,l,o]},u}(Xt);me.prototype.className="Path",me.prototype._attrsAffectingSize=["data"],i(me),b.addGetterSetter(me,"data"),a.mapMethods(me);var _e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e=this.cornerRadius(),i=this.width(),n=this.height();if(t.beginPath(),e){var r=0,o=0,a=0,s=0;"number"==typeof e?r=o=a=s=Math.min(e,i/2,n/2):(r=Math.min(e[0],i/2,n/2),o=Math.min(e[1],i/2,n/2),s=Math.min(e[2],i/2,n/2),a=Math.min(e[3],i/2,n/2)),t.moveTo(r,0),t.lineTo(i-o,0),t.arc(i-o,o,o,3*Math.PI/2,0,!1),t.lineTo(i,n-s),t.arc(i-s,n-s,s,0,Math.PI/2,!1),t.lineTo(a,n),t.arc(a,n-a,a,Math.PI/2,Math.PI,!1),t.lineTo(0,r),t.arc(r,r,r,Math.PI,3*Math.PI/2,!1)}else t.rect(0,0,i,n);t.closePath(),t.fillStrokeShape(this)},e}(Xt);_e.prototype.className="Rect",i(_e),b.addGetterSetter(_e,"cornerRadius",0),a.mapMethods(_e);var Se=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e,i,n,r=this.sides(),o=this.radius();for(t.beginPath(),t.moveTo(0,0-o),e=1;e<r;e++)i=o*Math.sin(2*e*Math.PI/r),n=-1*o*Math.cos(2*e*Math.PI/r),t.lineTo(i,n);t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.radius()},e.prototype.getHeight=function(){return 2*this.radius()},e.prototype.setWidth=function(t){this.radius(t/2)},e.prototype.setHeight=function(t){this.radius(t/2)},e}(Xt);Se.prototype.className="RegularPolygon",Se.prototype._centroid=!0,Se.prototype._attrsAffectingSize=["radius"],i(Se),b.addGetterSetter(Se,"radius",0,g()),b.addGetterSetter(Se,"sides",0,g()),a.mapMethods(Se);var be=2*Math.PI,xe=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){t.beginPath(),t.arc(0,0,this.innerRadius(),0,be,!1),t.moveTo(this.outerRadius(),0),t.arc(0,0,this.outerRadius(),be,0,!0),t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.outerRadius()},e.prototype.getHeight=function(){return 2*this.outerRadius()},e.prototype.setWidth=function(t){this.outerRadius(t/2)},e.prototype.setHeight=function(t){this.outerRadius(t/2)},e}(Xt);xe.prototype.className="Ring",xe.prototype._centroid=!0,xe.prototype._attrsAffectingSize=["innerRadius","outerRadius"],i(xe),b.addGetterSetter(xe,"innerRadius",0,g()),b.addGetterSetter(xe,"outerRadius",0,g()),a.mapMethods(xe);var we=function(i){function t(t){var e=i.call(this,t)||this;return e._updated=!0,e.anim=new Jt(function(){var t=e._updated;return e._updated=!1,t}),e.on("animationChange.konva",function(){this.frameIndex(0)}),e.on("frameIndexChange.konva",function(){this._updated=!0}),e.on("frameRateChange.konva",function(){this.anim.isRunning()&&(clearInterval(this.interval),this._setInterval())}),e}return w(t,i),t.prototype._sceneFunc=function(t){var e=this.animation(),i=this.frameIndex(),n=4*i,r=this.animations()[e],o=this.frameOffsets(),a=r[0+n],s=r[1+n],h=r[2+n],l=r[3+n],d=this.image();if((this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,h,l),t.closePath(),t.fillStrokeShape(this)),d)if(o){var c=o[e],p=2*i;t.drawImage(d,a,s,h,l,c[0+p],c[1+p],h,l)}else t.drawImage(d,a,s,h,l,0,0,h,l)},t.prototype._hitFunc=function(t){var e=this.animation(),i=this.frameIndex(),n=4*i,r=this.animations()[e],o=this.frameOffsets(),a=r[2+n],s=r[3+n];if(t.beginPath(),o){var h=o[e],l=2*i;t.rect(h[0+l],h[1+l],a,s)}else t.rect(0,0,a,s);t.closePath(),t.fillShape(this)},t.prototype._useBufferCanvas=function(){return(this.hasShadow()||1!==this.getAbsoluteOpacity())&&this.hasStroke()},t.prototype._setInterval=function(){var t=this;this.interval=setInterval(function(){t._updateIndex()},1e3/this.frameRate())},t.prototype.start=function(){if(!this.isRunning()){var t=this.getLayer();this.anim.setLayers(t),this._setInterval(),this.anim.start()}},t.prototype.stop=function(){this.anim.stop(),clearInterval(this.interval)},t.prototype.isRunning=function(){return this.anim.isRunning()},t.prototype._updateIndex=function(){var t=this.frameIndex(),e=this.animation();t<this.animations()[e].length/4-1?this.frameIndex(t+1):this.frameIndex(0)},t}(Xt);we.prototype.className="Sprite",i(we),b.addGetterSetter(we,"animation"),b.addGetterSetter(we,"animations"),b.addGetterSetter(we,"frameOffsets"),b.addGetterSetter(we,"image"),b.addGetterSetter(we,"frameIndex",0,g()),b.addGetterSetter(we,"frameRate",17,g()),b.backCompat(we,{index:"frameIndex",getIndex:"getFrameIndex",setIndex:"setFrameIndex"}),a.mapMethods(we);var Ce=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){var e=this.innerRadius(),i=this.outerRadius(),n=this.numPoints();t.beginPath(),t.moveTo(0,0-i);for(var r=1;r<2*n;r++){var o=r%2==0?i:e,a=o*Math.sin(r*Math.PI/n),s=-1*o*Math.cos(r*Math.PI/n);t.lineTo(a,s)}t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.outerRadius()},e.prototype.getHeight=function(){return 2*this.outerRadius()},e.prototype.setWidth=function(t){this.outerRadius(t/2)},e.prototype.setHeight=function(t){this.outerRadius(t/2)},e}(Xt);Ce.prototype.className="Star",Ce.prototype._centroid=!0,Ce.prototype._attrsAffectingSize=["innerRadius","outerRadius"],i(Ce),b.addGetterSetter(Ce,"numPoints",5,g()),b.addGetterSetter(Ce,"innerRadius",0,g()),b.addGetterSetter(Ce,"outerRadius",0,g()),a.mapMethods(Ce);var Pe,ke="auto",Te="justify",Me=["fontFamily","fontSize","fontStyle","fontVariant","padding","align","verticalAlign","lineHeight","text","width","height","wrap","ellipsis","letterSpacing"],Ae=Me.length;function Ge(){return Pe||(Pe=I.createCanvasElement().getContext("2d"))}var Re=function(n){function t(t){var e=n.call(this,function(t){return(t=t||{}).fillLinearGradientColorStops||t.fillRadialGradientColorStops||t.fillPatternImage||(t.fill=t.fill||"black"),t}(t))||this;e._partialTextX=0;for(var i=e._partialTextY=0;i<Ae;i++)e.on(Me[i]+"Change.konva",e._setTextData);return e._setTextData(),e}return w(t,n),t.prototype._sceneFunc=function(t){var e,i=this.padding(),n=this.fontSize(),r=this.lineHeight()*n,o=this.textArr,a=o.length,s=this.verticalAlign(),h=0,l=this.align(),d=this.getWidth(),c=this.letterSpacing(),p=this.fill(),u=this.textDecoration(),f=-1!==u.indexOf("underline"),g=-1!==u.indexOf("line-through"),v=0,y=(v=r/2,0),m=0;for(t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline","middle"),t.setAttr("textAlign","left"),"middle"===s?h=(this.getHeight()-a*r-2*i)/2:"bottom"===s&&(h=this.getHeight()-a*r-2*i),t.translate(i,h+i),e=0;e<a;e++){y=0,m=0;var _,S,b,x=o[e],w=x.text,C=x.width,P=e!==a-1;if(t.save(),"right"===l?y+=d-C-2*i:"center"===l&&(y+=(d-C-2*i)/2),f&&(t.save(),t.beginPath(),t.moveTo(y,v+m+Math.round(n/2)),S=0===(_=w.split(" ").length-1),b=l===Te&&P&&!S?d-2*i:C,t.lineTo(y+Math.round(b),v+m+Math.round(n/2)),t.lineWidth=n/15,t.strokeStyle=p,t.stroke(),t.restore()),g&&(t.save(),t.beginPath(),t.moveTo(y,v+m),S=0===(_=w.split(" ").length-1),b=l===Te&&P&&!S?d-2*i:C,t.lineTo(y+Math.round(b),v+m),t.lineWidth=n/15,t.strokeStyle=p,t.stroke(),t.restore()),0!==c||l===Te){_=w.split(" ").length-1;for(var k=0;k<w.length;k++){var T=w[k];" "===T&&e!==a-1&&l===Te&&(y+=Math.floor((d-2*i-C)/_)),this._partialTextX=y,this._partialTextY=v+m,this._partialText=T,t.fillStrokeShape(this),y+=Math.round(this.measureSize(T).width)+c}}else this._partialTextX=y,this._partialTextY=v+m,this._partialText=w,t.fillStrokeShape(this);t.restore(),1<a&&(v+=r)}},t.prototype._hitFunc=function(t){var e=this.getWidth(),i=this.getHeight();t.beginPath(),t.rect(0,0,e,i),t.closePath(),t.fillStrokeShape(this)},t.prototype.setText=function(t){var e=I._isString(t)?t:(t||"").toString();return this._setAttr("text",e),this},t.prototype.getWidth=function(){return this.attrs.width===ke||void 0===this.attrs.width?this.getTextWidth()+2*this.padding():this.attrs.width},t.prototype.getHeight=function(){return this.attrs.height===ke||void 0===this.attrs.height?this.fontSize()*this.textArr.length*this.lineHeight()+2*this.padding():this.attrs.height},t.prototype.getTextWidth=function(){return this.textWidth},t.prototype.getTextHeight=function(){return I.warn("text.getTextHeight() method is deprecated. Use text.height() - for full height and text.fontSize() - for one line height."),this.textHeight},t.prototype.measureSize=function(t){var e,i=Ge(),n=this.fontSize();return i.save(),i.font=this._getContextFont(),e=i.measureText(t),i.restore(),{width:e.width,height:n}},t.prototype._getContextFont=function(){return O.UA.isIE?this.fontStyle()+" "+this.fontSize()+"px "+this.fontFamily():this.fontStyle()+" "+this.fontVariant()+" "+this.fontSize()+"px "+this.fontFamily()},t.prototype._addTextLine=function(t){this.align()===Te&&(t=t.trim());var e=this._getTextWidth(t);return this.textArr.push({text:t,width:e})},t.prototype._getTextWidth=function(t){var e=this.letterSpacing(),i=t.length;return Ge().measureText(t).width+(i?e*(i-1):0)},t.prototype._setTextData=function(){var t=this.text().split("\n"),e=+this.fontSize(),i=0,n=this.lineHeight()*e,r=this.attrs.width,o=this.attrs.height,a=r!==ke&&void 0!==r,s=o!==ke&&void 0!==o,h=this.padding(),l=r-2*h,d=o-2*h,c=0,p=this.wrap(),u="none"!==p,f="char"!==p&&u,g=this.ellipsis()&&!u;this.textArr=[],Ge().font=this._getContextFont();for(var v=g?this._getTextWidth("…"):0,y=0,m=t.length;y<m;++y){var _=t[y],S=this._getTextWidth(_);if(a&&l<S)for(;0<_.length;){for(var b=0,x=_.length,w="",C=0;b<x;){var P=b+x>>>1,k=_.slice(0,1+P),T=this._getTextWidth(k)+v;T<=l?(b=1+P,w=k+(g?"…":""),C=T):x=P}if(!w)break;if(f){var M,A=_[w.length];0<(M=(" "===A||"-"===A)&&C<=l?w.length:Math.max(w.lastIndexOf(" "),w.lastIndexOf("-"))+1)&&(b=M,w=w.slice(0,b),C=this._getTextWidth(w))}if(w=w.trimRight(),this._addTextLine(w),i=Math.max(i,C),c+=n,!u||s&&d<c+n)break;if(0<(_=(_=_.slice(b)).trimLeft()).length&&(S=this._getTextWidth(_))<=l){this._addTextLine(_),c+=n,i=Math.max(i,S);break}}else this._addTextLine(_),c+=n,i=Math.max(i,S);if(s&&d<c+n)break}this.textHeight=e,this.textWidth=i},t.prototype.getStrokeScaleEnabled=function(){return!0},t}(Xt);Re.prototype._fillFunc=function(t){t.fillText(this._partialText,this._partialTextX,this._partialTextY)},Re.prototype._strokeFunc=function(t){t.strokeText(this._partialText,this._partialTextX,this._partialTextY)},Re.prototype.className="Text",Re.prototype._attrsAffectingSize=["text","fontSize","padding","wrap","lineHeight"],i(Re),b.overWriteSetter(Re,"width",v()),b.overWriteSetter(Re,"height",v()),b.addGetterSetter(Re,"fontFamily","Arial"),b.addGetterSetter(Re,"fontSize",12,g()),b.addGetterSetter(Re,"fontStyle","normal"),b.addGetterSetter(Re,"fontVariant","normal"),b.addGetterSetter(Re,"padding",0,g()),b.addGetterSetter(Re,"align","left"),b.addGetterSetter(Re,"verticalAlign","top"),b.addGetterSetter(Re,"lineHeight",1,g()),b.addGetterSetter(Re,"wrap","word"),b.addGetterSetter(Re,"ellipsis",!1),b.addGetterSetter(Re,"letterSpacing",0,g()),b.addGetterSetter(Re,"text","",y()),b.addGetterSetter(Re,"textDecoration",""),a.mapMethods(Re);function Le(t){t.fillText(this.partialText,0,0)}function Oe(t){t.strokeText(this.partialText,0,0)}var Ie=function(i){function t(t){var e=i.call(this,t)||this;return e.dummyCanvas=I.createCanvasElement(),e.dataArray=[],e.dataArray=me.parsePathData(e.attrs.data),e.on("dataChange.konva",function(){this.dataArray=me.parsePathData(this.attrs.data),this._setTextData()}),e.on("textChange.konva alignChange.konva letterSpacingChange.konva kerningFuncChange.konva",e._setTextData),t&&t.getKerning&&(I.warn('getKerning TextPath API is deprecated. Please use "kerningFunc" instead.'),e.kerningFunc(t.getKerning)),e._setTextData(),e}return w(t,i),t.prototype._sceneFunc=function(t){t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline",this.textBaseline()),t.setAttr("textAlign","left"),t.save();var e=this.textDecoration(),i=this.fill(),n=this.fontSize(),r=this.glyphInfo;"underline"===e&&t.beginPath();for(var o=0;o<r.length;o++){t.save();var a=r[o].p0;t.translate(a.x,a.y),t.rotate(r[o].rotation),this.partialText=r[o].text,t.fillStrokeShape(this),"underline"===e&&(0===o&&t.moveTo(0,n/2+1),t.lineTo(n,n/2+1)),t.restore()}"underline"===e&&(t.strokeStyle=i,t.lineWidth=n/20,t.stroke()),t.restore()},t.prototype._hitFunc=function(t){t.beginPath();var e=this.glyphInfo;if(1<=e.length){var i=e[0].p0;t.moveTo(i.x,i.y)}for(var n=0;n<e.length;n++){var r=e[n].p1;t.lineTo(r.x,r.y)}t.setAttr("lineWidth",this.fontSize()),t.setAttr("strokeStyle",this.colorKey),t.stroke()},t.prototype.getTextWidth=function(){return this.textWidth},t.prototype.getTextHeight=function(){return I.warn("text.getTextHeight() method is deprecated. Use text.height() - for full height and text.fontSize() - for one line height."),this.textHeight},t.prototype.setText=function(t){return Re.prototype.setText.call(this,t)},t.prototype._getContextFont=function(){return Re.prototype._getContextFont.call(this)},t.prototype._getTextSize=function(t){var e=this.dummyCanvas.getContext("2d");e.save(),e.font=this._getContextFont();var i=e.measureText(t);return e.restore(),{width:i.width,height:parseInt(this.attrs.fontSize,10)}},t.prototype._setTextData=function(){var l=this,t=this._getTextSize(this.attrs.text),d=this.letterSpacing(),c=this.align(),e=this.kerningFunc();this.textWidth=t.width,this.textHeight=t.height;var p=Math.max(this.textWidth+((this.attrs.text||"").length-1)*d,0);this.glyphInfo=[];for(var u=0,i=0;i<l.dataArray.length;i++)0<l.dataArray[i].pathLength&&(u+=l.dataArray[i].pathLength);var n=0;"center"===c&&(n=Math.max(0,u/2-p/2)),"right"===c&&(n=Math.max(0,u-p));for(var f,g,v,r=this.text().split(""),y=this.text().split(" ").length-1,o=-1,m=0,_=function(){m=0;for(var t=l.dataArray,e=o+1;e<t.length;e++){if(0<t[e].pathLength)return t[o=e];"M"===t[e].command&&(f={x:t[e].points[0],y:t[e].points[1]})}return{}},a=function(t){var e=l._getTextSize(t).width+d;" "===t&&"justify"===c&&(e+=(u-p)/y);var i=0,n=0;for(g=void 0;.01<Math.abs(e-i)/e&&n<25;){n++;for(var r=i;void 0===v;)(v=_())&&r+v.pathLength<e&&(r+=v.pathLength,v=void 0);if(v==={}||void 0===f)return;var o=!1;switch(v.command){case"L":me.getLineLength(f.x,f.y,v.points[0],v.points[1])>e?g=me.getPointOnLine(e,f.x,f.y,v.points[0],v.points[1],f.x,f.y):v=void 0;break;case"A":var a=v.points[4],s=v.points[5],h=v.points[4]+s;0===m?m=a+1e-8:i<e?m+=Math.PI/180*s/Math.abs(s):m-=Math.PI/360*s/Math.abs(s),(s<0&&m<h||0<=s&&h<m)&&(m=h,o=!0),g=me.getPointOnEllipticalArc(v.points[0],v.points[1],v.points[2],v.points[3],m,v.points[6]);break;case"C":0===m?m=e>v.pathLength?1e-8:e/v.pathLength:i<e?m+=(e-i)/v.pathLength:m-=(i-e)/v.pathLength,1<m&&(m=1,o=!0),g=me.getPointOnCubicBezier(m,v.start.x,v.start.y,v.points[0],v.points[1],v.points[2],v.points[3],v.points[4],v.points[5]);break;case"Q":0===m?m=e/v.pathLength:i<e?m+=(e-i)/v.pathLength:m-=(i-e)/v.pathLength,1<m&&(m=1,o=!0),g=me.getPointOnQuadraticBezier(m,v.start.x,v.start.y,v.points[0],v.points[1],v.points[2],v.points[3])}void 0!==g&&(i=me.getLineLength(f.x,f.y,g.x,g.y)),o&&(o=!1,v=void 0)}},s=l._getTextSize("C").width+d,h=0;h<n/s&&(a("C"),void 0!==f&&void 0!==g);h++)f=g;for(var S=0;S<r.length&&(a(r[S]),void 0!==f&&void 0!==g);S++){var b=me.getLineLength(f.x,f.y,g.x,g.y),x=0;if(e)try{x=e(r[S-1],r[S])*this.fontSize()}catch(t){x=0}f.x+=x,g.x+=x,this.textWidth+=x;var w=me.getPointOnLine(x+b/2,f.x,f.y,g.x,g.y),C=Math.atan2(g.y-f.y,g.x-f.x);this.glyphInfo.push({transposeX:w.x,transposeY:w.y,text:r[S],rotation:C,p0:f,p1:g}),f=g}},t.prototype.getSelfRect=function(){var e=[];this.glyphInfo.forEach(function(t){e.push(t.p0.x),e.push(t.p0.y),e.push(t.p1.x),e.push(t.p1.y)});for(var t,i,n=e[0],r=e[0],o=e[0],a=e[0],s=0;s<e.length/2;s++)t=e[2*s],i=e[2*s+1],n=Math.min(n,t),r=Math.max(r,t),o=Math.min(o,i),a=Math.max(a,i);var h=this.fontSize();return{x:Math.round(n)-h/2,y:Math.round(o)-h/2,width:Math.round(r-n)+h,height:Math.round(a-o)+h}},t}(Xt);Ie.prototype._fillFunc=Le,Ie.prototype._strokeFunc=Oe,Ie.prototype._fillFuncHit=Le,Ie.prototype._strokeFuncHit=Oe,Ie.prototype.className="TextPath",Ie.prototype._attrsAffectingSize=["text","fontSize","data"],i(Ie),b.addGetterSetter(Ie,"data"),b.addGetterSetter(Ie,"fontFamily","Arial"),b.addGetterSetter(Ie,"fontSize",12,g()),b.addGetterSetter(Ie,"fontStyle","normal"),b.addGetterSetter(Ie,"align","left"),b.addGetterSetter(Ie,"letterSpacing",0,g()),b.addGetterSetter(Ie,"textBaseline","middle"),b.addGetterSetter(Ie,"fontVariant","normal"),b.addGetterSetter(Ie,"text",""),b.addGetterSetter(Ie,"textDecoration",null),b.addGetterSetter(Ie,"kerningFunc",null),a.mapMethods(Ie);var De=["resizeEnabledChange","rotateAnchorOffsetChange","rotateEnabledChange","enabledAnchorsChange","anchorSizeChange","borderEnabledChange","borderStrokeChange","borderStrokeWidthChange","borderDashChange","anchorStrokeChange","anchorStrokeWidthChange","anchorFillChange","anchorCornerRadiusChange","ignoreStrokeChange"].join(" "),Ee="nodeRect",Fe=["widthChange.tr","heightChange.tr","scaleXChange.tr","scaleYChange.tr","skewXChange.tr","skewYChange.tr","rotationChange.tr","offsetXChange.tr","offsetYChange.tr","transformsEnabledChange.tr","strokeWidthChange.tr"].join(" "),Be={"top-left":-45,"top-center":0,"top-right":45,"middle-right":-90,"middle-left":90,"bottom-left":-135,"bottom-center":180,"bottom-right":135};var ze=["top-left","top-center","top-right","middle-right","middle-left","bottom-left","bottom-center","bottom-right"],We=function(i){function t(t){var e=i.call(this,t)||this;return e._transforming=!1,e._createElements(),e._handleMouseMove=e._handleMouseMove.bind(e),e._handleMouseUp=e._handleMouseUp.bind(e),e.update=e.update.bind(e),e.on(De,e.update),e.getNode()&&e.update(),e}return w(t,i),t.prototype.attachTo=function(t){return this.setNode(t),this},t.prototype.setNode=function(t){var e=this;this._node&&this.detach(),this._node=t,this._resetTransformCache();var i=t._attrsAffectingSize.map(function(t){return t+"Change.tr"}).join(" "),n=function(){e._resetTransformCache(),e._transforming||e.update()};return t.on(i,n),t.on(Fe,n),t.on("xChange.tr yChange.tr",function(){return e._resetTransformCache()}),!!this.findOne(".top-left")&&this.update(),this},t.prototype.getNode=function(){return this._node},t.prototype.detach=function(){this.getNode()&&(this.getNode().off(".tr"),this._node=void 0),this._resetTransformCache()},t.prototype._resetTransformCache=function(){this._clearCache(Ee),this._clearCache("transform"),this._clearSelfAndDescendantCache("absoluteTransform")},t.prototype._getNodeRect=function(){return this._getCache(Ee,this.__getNodeRect)},t.prototype.__getNodeRect=function(){var t=this.getNode();if(!t)return{x:-1e8,y:-1e8,width:0,height:0,rotation:0};t.parent&&this.parent&&t.parent!==this.parent&&I.warn("Transformer and attached node have different parents. Konva does not support such case right now. Please move Transformer to the parent of attaching node.");var e=t.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()}),i=O.getAngle(t.rotation()),n=e.x*t.scaleX()-t.offsetX()*t.scaleX(),r=e.y*t.scaleY()-t.offsetY()*t.scaleY();return{x:t.x()+n*Math.cos(i)+r*Math.sin(-i),y:t.y()+r*Math.cos(i)+n*Math.sin(i),width:e.width*t.scaleX(),height:e.height*t.scaleY(),rotation:t.rotation()}},t.prototype.getX=function(){return this._getNodeRect().x},t.prototype.getY=function(){return this._getNodeRect().y},t.prototype.getRotation=function(){return this._getNodeRect().rotation},t.prototype.getWidth=function(){return this._getNodeRect().width},t.prototype.getHeight=function(){return this._getNodeRect().height},t.prototype._createElements=function(){this._createBack(),ze.forEach(function(t){this._createAnchor(t)}.bind(this)),this._createAnchor("rotater")},t.prototype._createAnchor=function(r){var o=this,a=new _e({stroke:"rgb(0, 161, 255)",fill:"white",strokeWidth:1,name:r+" _anchor",dragDistance:0,draggable:!0}),e=this;a.on("mousedown touchstart",function(t){e._handleMouseDown(t)}),a.on("dragstart",function(t){t.cancelBubble=!0}),a.on("dragmove",function(t){t.cancelBubble=!0}),a.on("dragend",function(t){t.cancelBubble=!0}),a.on("mouseenter",function(){var t=O.getAngle(o.rotation()),e=o.getNode().getAbsoluteScale(),i=e.y*e.x<0,n=function(t,e,i){if("rotater"===t)return"crosshair";e+=I._degToRad(Be[t]||0),i&&(e*=-1);var n=(I._radToDeg(e)%360+360)%360;return I._inRange(n,337.5,360)||I._inRange(n,0,22.5)?"ns-resize":I._inRange(n,22.5,67.5)?"nesw-resize":I._inRange(n,67.5,112.5)?"ew-resize":I._inRange(n,112.5,157.5)?"nwse-resize":I._inRange(n,157.5,202.5)?"ns-resize":I._inRange(n,202.5,247.5)?"nesw-resize":I._inRange(n,247.5,292.5)?"ew-resize":I._inRange(n,292.5,337.5)?"nwse-resize":(I.error("Transformer has unknown angle for cursor detection: "+n),"pointer")}(r,t,i);a.getStage().content.style.cursor=n,o._cursorChange=!0}),a.on("mouseout",function(){a.getStage()&&a.getParent()&&(a.getStage().content.style.cursor="",o._cursorChange=!1)}),this.add(a)},t.prototype._createBack=function(){var t=new Xt({name:"back",width:0,height:0,listening:!1,sceneFunc:function(t){var e=this.getParent(),i=e.padding();t.beginPath(),t.rect(-i,-i,this.width()+2*i,this.height()+2*i),t.moveTo(this.width()/2,-i),e.rotateEnabled()&&t.lineTo(this.width()/2,-e.rotateAnchorOffset()*I._sign(this.height())),t.fillStrokeShape(this)}});this.add(t)},t.prototype._handleMouseDown=function(t){this.movingResizer=t.target.name().split(" ")[0];var e=this._getNodeRect(),i=e.width,n=e.height,r=Math.sqrt(Math.pow(i,2)+Math.pow(n,2));this.sin=Math.abs(n/r),this.cos=Math.abs(i/r),window.addEventListener("mousemove",this._handleMouseMove),window.addEventListener("touchmove",this._handleMouseMove),window.addEventListener("mouseup",this._handleMouseUp,!0),window.addEventListener("touchend",this._handleMouseUp,!0),this._transforming=!0,this._fire("transformstart",{evt:t}),this.getNode()._fire("transformstart",{evt:t})},t.prototype._handleMouseMove=function(t){var e,i,n,r=this.findOne("."+this.movingResizer),o=r.getStage().getContent().getBoundingClientRect(),a=o.left,s=o.top,h={x:(void 0!==t.clientX?t.clientX:t.touches[0].clientX)-a,y:(void 0!==t.clientX?t.clientY:t.touches[0].clientY)-s};r.setAbsolutePosition(h);var l=this.keepRatio()||t.shiftKey;if("top-left"===this.movingResizer){if(l){n=Math.sqrt(Math.pow(this.findOne(".bottom-right").x()-r.x(),2)+Math.pow(this.findOne(".bottom-right").y()-r.y(),2));var d=this.findOne(".top-left").x()>this.findOne(".bottom-right").x()?-1:1;e=n*this.cos*d,i=n*this.sin*d,this.findOne(".top-left").x(this.findOne(".bottom-right").x()-e),this.findOne(".top-left").y(this.findOne(".bottom-right").y()-i)}}else if("top-center"===this.movingResizer)this.findOne(".top-left").y(r.y());else if("top-right"===this.movingResizer){if(l){n=Math.sqrt(Math.pow(this.findOne(".bottom-left").x()-r.x(),2)+Math.pow(this.findOne(".bottom-left").y()-r.y(),2));d=this.findOne(".top-right").x()<this.findOne(".top-left").x()?-1:1;e=n*this.cos*d,i=n*this.sin*d,this.findOne(".top-right").x(e),this.findOne(".top-right").y(this.findOne(".bottom-left").y()-i)}var c=r.position();this.findOne(".top-left").y(c.y),this.findOne(".bottom-right").x(c.x)}else if("middle-left"===this.movingResizer)this.findOne(".top-left").x(r.x());else if("middle-right"===this.movingResizer)this.findOne(".bottom-right").x(r.x());else if("bottom-left"===this.movingResizer){if(l){n=Math.sqrt(Math.pow(this.findOne(".top-right").x()-r.x(),2)+Math.pow(this.findOne(".top-right").y()-r.y(),2));d=this.findOne(".top-right").x()<this.findOne(".bottom-left").x()?-1:1;e=n*this.cos*d,i=n*this.sin*d,this.findOne(".bottom-left").x(this.findOne(".top-right").x()-e),this.findOne(".bottom-left").y(i)}c=r.position(),this.findOne(".top-left").x(c.x),this.findOne(".bottom-right").y(c.y)}else if("bottom-center"===this.movingResizer)this.findOne(".bottom-right").y(r.y());else if("bottom-right"===this.movingResizer){if(l){n=Math.sqrt(Math.pow(this.findOne(".bottom-right").x(),2)+Math.pow(this.findOne(".bottom-right").y(),2));d=this.findOne(".top-left").x()>this.findOne(".bottom-right").x()?-1:1;e=n*this.cos*d,i=n*this.sin*d,this.findOne(".bottom-right").x(e),this.findOne(".bottom-right").y(i)}}else if("rotater"===this.movingResizer){var p=this.padding(),u=this._getNodeRect();e=r.x()-u.width/2,i=-r.y()+u.height/2;var f=Math.atan2(-i,e)+Math.PI/2;u.height<0&&(f-=Math.PI);for(var g=O.getAngle(this.rotation()),v=I._radToDeg(g)+I._radToDeg(f),y=O.getAngle(this.getNode().rotation()),m=I._degToRad(v),_=this.rotationSnaps(),S=0;S<_.length;S++){var b=O.getAngle(_[S]);Math.abs(b-I._degToRad(v))%(2*Math.PI)<.1&&(v=I._radToDeg(b),m=I._degToRad(v))}var x=p,w=p;this._fitNodeInto({rotation:O.angleDeg?v:I._degToRad(v),x:u.x+(u.width/2+p)*(Math.cos(y)-Math.cos(m))+(u.height/2+p)*(Math.sin(-y)-Math.sin(-m))-(x*Math.cos(g)+w*Math.sin(-g)),y:u.y+(u.height/2+p)*(Math.cos(y)-Math.cos(m))+(u.width/2+p)*(Math.sin(y)-Math.sin(m))-(w*Math.cos(g)+x*Math.sin(g)),width:u.width+2*p,height:u.height+2*p},t)}else console.error(new Error("Wrong position argument of selection resizer: "+this.movingResizer));if("rotater"!==this.movingResizer){var C=this.findOne(".top-left").getAbsolutePosition(this.getParent());if(this.centeredScaling()||t.altKey){var P=this.findOne(".top-left"),k=this.findOne(".bottom-right"),T=P.x(),M=P.y(),A=this.getWidth()-k.x(),G=this.getHeight()-k.y();k.move({x:-T,y:-M}),P.move({x:A,y:G}),C=P.getAbsolutePosition(this.getParent())}e=C.x,i=C.y;var R=this.findOne(".bottom-right").x()-this.findOne(".top-left").x(),L=this.findOne(".bottom-right").y()-this.findOne(".top-left").y();this._fitNodeInto({x:e+this.offsetX(),y:i+this.offsetY(),width:R,height:L},t)}},t.prototype._handleMouseUp=function(t){this._removeEvents(t)},t.prototype._removeEvents=function(t){if(this._transforming){this._transforming=!1,window.removeEventListener("mousemove",this._handleMouseMove),window.removeEventListener("touchmove",this._handleMouseMove),window.removeEventListener("mouseup",this._handleMouseUp,!0),window.removeEventListener("touchend",this._handleMouseUp,!0),this._fire("transformend",{evt:t});var e=this.getNode();e&&e.fire("transformend",{evt:t})}},t.prototype._fitNodeInto=function(t,e){var i=this.boundBoxFunc();if(i){var n=this._getNodeRect();t=i.call(this,n,t)}var r=this.getNode();void 0!==t.rotation&&this.getNode().rotation(t.rotation);var o=r.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()}),a=this.padding(),s=(t.width-2*a)/o.width,h=(t.height-2*a)/o.height,l=O.getAngle(r.rotation()),d=o.x*s-a-r.offsetX()*s,c=o.y*h-a-r.offsetY()*h;this.getNode().setAttrs({scaleX:s,scaleY:h,x:t.x-(d*Math.cos(l)+c*Math.sin(-l)),y:t.y-(c*Math.cos(l)+d*Math.sin(l))}),this._fire("transform",{evt:e}),this.getNode()._fire("transform",{evt:e}),this.update(),this.getLayer().batchDraw()},t.prototype.forceUpdate=function(){this._resetTransformCache(),this.update()},t.prototype.update=function(){var e=this,t=this._getNodeRect(),i=this.getNode(),n={x:1,y:1};i&&i.getParent()&&(n=i.getParent().getAbsoluteScale());var r={x:1/n.x,y:1/n.y},o=t.width,a=t.height,s=this.enabledAnchors(),h=this.resizeEnabled(),l=this.padding(),d=this.anchorSize();this.find("._anchor").each(function(t){return t.setAttrs({width:d,height:d,offsetX:d/2,offsetY:d/2,stroke:e.anchorStroke(),strokeWidth:e.anchorStrokeWidth(),fill:e.anchorFill(),cornerRadius:e.anchorCornerRadius()})}),this.findOne(".top-left").setAttrs({x:-l,y:-l,scale:r,visible:h&&0<=s.indexOf("top-left")}),this.findOne(".top-center").setAttrs({x:o/2,y:-l,scale:r,visible:h&&0<=s.indexOf("top-center")}),this.findOne(".top-right").setAttrs({x:o+l,y:-l,scale:r,visible:h&&0<=s.indexOf("top-right")}),this.findOne(".middle-left").setAttrs({x:-l,y:a/2,scale:r,visible:h&&0<=s.indexOf("middle-left")}),this.findOne(".middle-right").setAttrs({x:o+l,y:a/2,scale:r,visible:h&&0<=s.indexOf("middle-right")}),this.findOne(".bottom-left").setAttrs({x:-l,y:a+l,scale:r,visible:h&&0<=s.indexOf("bottom-left")}),this.findOne(".bottom-center").setAttrs({x:o/2,y:a+l,scale:r,visible:h&&0<=s.indexOf("bottom-center")}),this.findOne(".bottom-right").setAttrs({x:o+l,y:a+l,scale:r,visible:h&&0<=s.indexOf("bottom-right")});var c=-this.rotateAnchorOffset()*Math.abs(r.y);this.findOne(".rotater").setAttrs({x:o/2,y:c*I._sign(a),scale:r,visible:this.rotateEnabled()}),this.findOne(".back").setAttrs({width:o*n.x,height:a*n.y,scale:r,visible:this.borderEnabled(),stroke:this.borderStroke(),strokeWidth:this.borderStrokeWidth(),dash:this.borderDash()})},t.prototype.isTransforming=function(){return this._transforming},t.prototype.stopTransform=function(){if(this._transforming){this._removeEvents();var t=this.findOne("."+this.movingResizer);t&&t.stopDrag()}},t.prototype.destroy=function(){return this.getStage()&&this._cursorChange&&(this.getStage().content.style.cursor=""),Kt.prototype.destroy.call(this),this.detach(),this._removeEvents(),this},t.prototype.toObject=function(){return $.prototype.toObject.call(this)},t}(Kt);We.prototype.className="Transformer",i(We),b.addGetterSetter(We,"enabledAnchors",ze,function(t){return t instanceof Array||I.warn("enabledAnchors value should be an array"),t instanceof Array&&t.forEach(function(t){-1===ze.indexOf(t)&&I.warn("Unknown anchor name: "+t+". Available names are: "+ze.join(", "))}),t||[]}),b.addGetterSetter(We,"resizeEnabled",!0),b.addGetterSetter(We,"anchorSize",10,g()),b.addGetterSetter(We,"rotateEnabled",!0),b.addGetterSetter(We,"rotationSnaps",[]),b.addGetterSetter(We,"rotateAnchorOffset",50,g()),b.addGetterSetter(We,"borderEnabled",!0),b.addGetterSetter(We,"anchorStroke","rgb(0, 161, 255)"),b.addGetterSetter(We,"anchorStrokeWidth",1,g()),b.addGetterSetter(We,"anchorFill","white"),b.addGetterSetter(We,"anchorCornerRadius",0,g()),b.addGetterSetter(We,"borderStroke","rgb(0, 161, 255)"),b.addGetterSetter(We,"borderStrokeWidth",1,g()),b.addGetterSetter(We,"borderDash"),b.addGetterSetter(We,"keepRatio",!0),b.addGetterSetter(We,"centeredScaling",!1),b.addGetterSetter(We,"ignoreStroke",!1),b.addGetterSetter(We,"padding",0,g()),b.addGetterSetter(We,"node"),b.addGetterSetter(We,"boundBoxFunc"),b.backCompat(We,{lineEnabled:"borderEnabled",rotateHandlerOffset:"rotateAnchorOffset",enabledHandlers:"enabledAnchors"}),a.mapMethods(We);var Ne=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return w(e,t),e.prototype._sceneFunc=function(t){t.beginPath(),t.arc(0,0,this.radius(),0,O.getAngle(this.angle()),this.clockwise()),t.lineTo(0,0),t.closePath(),t.fillStrokeShape(this)},e.prototype.getWidth=function(){return 2*this.radius()},e.prototype.getHeight=function(){return 2*this.radius()},e.prototype.setWidth=function(t){this.radius(t/2)},e.prototype.setHeight=function(t){this.radius(t/2)},e}(Xt);function He(){this.r=0,this.g=0,this.b=0,this.a=0,this.next=null}Ne.prototype.className="Wedge",Ne.prototype._centroid=!0,Ne.prototype._attrsAffectingSize=["radius"],i(Ne),b.addGetterSetter(Ne,"radius",0,g()),b.addGetterSetter(Ne,"angle",0,g()),b.addGetterSetter(Ne,"clockwise",!1),b.backCompat(Ne,{angleDeg:"angle",getAngleDeg:"getAngle",setAngleDeg:"setAngle"}),a.mapMethods(Ne);var Ye=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],Xe=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];b.addGetterSetter($,"blurRadius",0,g(),b.afterSetFilter);b.addGetterSetter($,"brightness",0,g(),b.afterSetFilter);b.addGetterSetter($,"contrast",0,g(),b.afterSetFilter);function je(t,e,i,n,r){var o=i-e,a=r-n;return 0==o?n+a/2:0==a?n:a*((t-e)/o)+n}b.addGetterSetter($,"embossStrength",.5,g(),b.afterSetFilter),b.addGetterSetter($,"embossWhiteLevel",.5,g(),b.afterSetFilter),b.addGetterSetter($,"embossDirection","top-left",null,b.afterSetFilter),b.addGetterSetter($,"embossBlend",!1,null,b.afterSetFilter);b.addGetterSetter($,"enhance",0,g(),b.afterSetFilter);b.addGetterSetter($,"hue",0,g(),b.afterSetFilter),b.addGetterSetter($,"saturation",0,g(),b.afterSetFilter),b.addGetterSetter($,"luminance",0,g(),b.afterSetFilter);b.addGetterSetter($,"hue",0,g(),b.afterSetFilter),b.addGetterSetter($,"saturation",0,g(),b.afterSetFilter),b.addGetterSetter($,"value",0,g(),b.afterSetFilter);function Ue(t,e,i){var n=4*(i*t.width+e),r=[];return r.push(t.data[n++],t.data[n++],t.data[n++],t.data[n++]),r}function qe(t,e){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)+Math.pow(t[2]-e[2],2))}b.addGetterSetter($,"kaleidoscopePower",2,g(),b.afterSetFilter),b.addGetterSetter($,"kaleidoscopeAngle",0,g(),b.afterSetFilter);b.addGetterSetter($,"threshold",0,g(),b.afterSetFilter);b.addGetterSetter($,"noise",.2,g(),b.afterSetFilter);b.addGetterSetter($,"pixelSize",8,g(),b.afterSetFilter);b.addGetterSetter($,"levels",.5,g(),b.afterSetFilter);b.addGetterSetter($,"red",0,function(t){return this._filterUpToDate=!1,255<t?255:t<0?0:Math.round(t)}),b.addGetterSetter($,"green",0,function(t){return this._filterUpToDate=!1,255<t?255:t<0?0:Math.round(t)}),b.addGetterSetter($,"blue",0,f,b.afterSetFilter);b.addGetterSetter($,"red",0,function(t){return this._filterUpToDate=!1,255<t?255:t<0?0:Math.round(t)}),b.addGetterSetter($,"green",0,function(t){return this._filterUpToDate=!1,255<t?255:t<0?0:Math.round(t)}),b.addGetterSetter($,"blue",0,f,b.afterSetFilter),b.addGetterSetter($,"alpha",1,function(t){return this._filterUpToDate=!1,1<t?1:t<0?0:t});return b.addGetterSetter($,"threshold",.5,g(),b.afterSetFilter),re.Util._assign(re,{Arc:oe,Arrow:se,Circle:he,Ellipse:le,Image:de,Label:ve,Tag:ye,Line:ae,Path:me,Rect:_e,RegularPolygon:Se,Ring:xe,Sprite:we,Star:Ce,Text:Re,TextPath:Ie,Transformer:We,Wedge:Ne,Filters:{Blur:function(t){var e=Math.round(this.blurRadius());0<e&&function(t,e){var i,n,r,o,a,s,h,l,d,c,p,u,f,g,v,y,m,_,S,b,x,w,C,P,k=t.data,T=t.width,M=t.height,A=e+e+1,G=T-1,R=M-1,L=e+1,O=L*(L+1)/2,I=new He,D=null,E=I,F=null,B=null,z=Ye[e],W=Xe[e];for(r=1;r<A;r++)E=E.next=new He,r===L&&(D=E);for(E.next=I,h=s=0,n=0;n<M;n++){for(y=m=_=S=l=d=c=p=0,u=L*(b=k[s]),f=L*(x=k[s+1]),g=L*(w=k[s+2]),v=L*(C=k[s+3]),l+=O*b,d+=O*x,c+=O*w,p+=O*C,E=I,r=0;r<L;r++)E.r=b,E.g=x,E.b=w,E.a=C,E=E.next;for(r=1;r<L;r++)o=s+((G<r?G:r)<<2),l+=(E.r=b=k[o])*(P=L-r),d+=(E.g=x=k[o+1])*P,c+=(E.b=w=k[o+2])*P,p+=(E.a=C=k[o+3])*P,y+=b,m+=x,_+=w,S+=C,E=E.next;for(F=I,B=D,i=0;i<T;i++)k[s+3]=C=p*z>>W,0!==C?(C=255/C,k[s]=(l*z>>W)*C,k[s+1]=(d*z>>W)*C,k[s+2]=(c*z>>W)*C):k[s]=k[s+1]=k[s+2]=0,l-=u,d-=f,c-=g,p-=v,u-=F.r,f-=F.g,g-=F.b,v-=F.a,o=h+((o=i+e+1)<G?o:G)<<2,l+=y+=F.r=k[o],d+=m+=F.g=k[o+1],c+=_+=F.b=k[o+2],p+=S+=F.a=k[o+3],F=F.next,u+=b=B.r,f+=x=B.g,g+=w=B.b,v+=C=B.a,y-=b,m-=x,_-=w,S-=C,B=B.next,s+=4;h+=T}for(i=0;i<T;i++){for(m=_=S=y=d=c=p=l=0,u=L*(b=k[s=i<<2]),f=L*(x=k[s+1]),g=L*(w=k[s+2]),v=L*(C=k[s+3]),l+=O*b,d+=O*x,c+=O*w,p+=O*C,E=I,r=0;r<L;r++)E.r=b,E.g=x,E.b=w,E.a=C,E=E.next;for(a=T,r=1;r<=e;r++)s=a+i<<2,l+=(E.r=b=k[s])*(P=L-r),d+=(E.g=x=k[s+1])*P,c+=(E.b=w=k[s+2])*P,p+=(E.a=C=k[s+3])*P,y+=b,m+=x,_+=w,S+=C,E=E.next,r<R&&(a+=T);for(s=i,F=I,B=D,n=0;n<M;n++)k[3+(o=s<<2)]=C=p*z>>W,0<C?(C=255/C,k[o]=(l*z>>W)*C,k[o+1]=(d*z>>W)*C,k[o+2]=(c*z>>W)*C):k[o]=k[o+1]=k[o+2]=0,l-=u,d-=f,c-=g,p-=v,u-=F.r,f-=F.g,g-=F.b,v-=F.a,o=i+((o=n+L)<R?o:R)*T<<2,l+=y+=F.r=k[o],d+=m+=F.g=k[o+1],c+=_+=F.b=k[o+2],p+=S+=F.a=k[o+3],F=F.next,u+=b=B.r,f+=x=B.g,g+=w=B.b,v+=C=B.a,y-=b,m-=x,_-=w,S-=C,B=B.next,s+=T}}(t,e)},Brighten:function(t){var e,i=255*this.brightness(),n=t.data,r=n.length;for(e=0;e<r;e+=4)n[e]+=i,n[e+1]+=i,n[e+2]+=i},Contrast:function(t){var e,i=Math.pow((this.contrast()+100)/100,2),n=t.data,r=n.length,o=150,a=150,s=150;for(e=0;e<r;e+=4)o=n[e],a=n[e+1],s=n[e+2],o/=255,o-=.5,o*=i,o+=.5,a/=255,a-=.5,a*=i,a+=.5,s/=255,s-=.5,s*=i,s+=.5,o=(o*=255)<0?0:255<o?255:o,a=(a*=255)<0?0:255<a?255:a,s=(s*=255)<0?0:255<s?255:s,n[e]=o,n[e+1]=a,n[e+2]=s},Emboss:function(t){var e=10*this.embossStrength(),i=255*this.embossWhiteLevel(),n=this.embossDirection(),r=this.embossBlend(),o=0,a=0,s=t.data,h=t.width,l=t.height,d=4*h,c=l;switch(n){case"top-left":a=o=-1;break;case"top":o=-1,a=0;break;case"top-right":o=-1,a=1;break;case"right":o=0,a=1;break;case"bottom-right":a=o=1;break;case"bottom":o=1,a=0;break;case"bottom-left":a=-(o=1);break;case"left":o=0,a=-1;break;default:I.error("Unknown emboss direction: "+n)}do{var p=(c-1)*d,u=o;c+u<1&&(u=0),l<c+u&&(u=0);var f=(c-1+u)*h*4,g=h;do{var v=p+4*(g-1),y=a;g+y<1&&(y=0),h<g+y&&(y=0);var m=f+4*(g-1+y),_=s[v]-s[m],S=s[1+v]-s[1+m],b=s[2+v]-s[2+m],x=_,w=0<x?x:-x;if(w<(0<S?S:-S)&&(x=S),w<(0<b?b:-b)&&(x=b),x*=e,r){var C=s[v]+x,P=s[1+v]+x,k=s[2+v]+x;s[v]=255<C?255:C<0?0:C,s[1+v]=255<P?255:P<0?0:P,s[2+v]=255<k?255:k<0?0:k}else{var T=i-x;T<0?T=0:255<T&&(T=255),s[v]=s[1+v]=s[2+v]=T}}while(--g)}while(--c)},Enhance:function(t){var e,i,n,r,o=t.data,a=o.length,s=o[0],h=s,l=o[1],d=l,c=o[2],p=c,u=this.enhance();if(0!==u){for(r=0;r<a;r+=4)(e=o[r+0])<s?s=e:h<e&&(h=e),(i=o[r+1])<l?l=i:d<i&&(d=i),(n=o[r+2])<c?c=n:p<n&&(p=n);var f,g,v,y,m,_,S,b,x;for(h===s&&(h=255,s=0),d===l&&(d=255,l=0),p===c&&(p=255,c=0),x=0<u?(g=h+u*(255-h),v=s-u*(s-0),m=d+u*(255-d),_=l-u*(l-0),b=p+u*(255-p),c-u*(c-0)):(g=h+u*(h-(f=.5*(h+s))),v=s+u*(s-f),m=d+u*(d-(y=.5*(d+l))),_=l+u*(l-y),b=p+u*(p-(S=.5*(p+c))),c+u*(c-S)),r=0;r<a;r+=4)o[r+0]=je(o[r+0],s,h,v,g),o[r+1]=je(o[r+1],l,d,_,m),o[r+2]=je(o[r+2],c,p,x,b)}},Grayscale:function(t){var e,i,n=t.data,r=n.length;for(e=0;e<r;e+=4)i=.34*n[e]+.5*n[e+1]+.16*n[e+2],n[e]=i,n[e+1]=i,n[e+2]=i},HSL:function(t){var e,i,n,r,o,a=t.data,s=a.length,h=Math.pow(2,this.saturation()),l=Math.abs(this.hue()+360)%360,d=127*this.luminance(),c=1*h*Math.cos(l*Math.PI/180),p=1*h*Math.sin(l*Math.PI/180),u=.299+.701*c+.167*p,f=.587-.587*c+.33*p,g=.114-.114*c-.497*p,v=.299-.299*c-.328*p,y=.587+.413*c+.035*p,m=.114-.114*c+.293*p,_=.299-.3*c+1.25*p,S=.587-.586*c-1.05*p,b=.114+.886*c-.2*p;for(e=0;e<s;e+=4)i=a[e+0],n=a[e+1],r=a[e+2],o=a[e+3],a[e+0]=u*i+f*n+g*r+d,a[e+1]=v*i+y*n+m*r+d,a[e+2]=_*i+S*n+b*r+d,a[e+3]=o},HSV:function(t){var e,i,n,r,o,a=t.data,s=a.length,h=Math.pow(2,this.value()),l=Math.pow(2,this.saturation()),d=Math.abs(this.hue()+360)%360,c=h*l*Math.cos(d*Math.PI/180),p=h*l*Math.sin(d*Math.PI/180),u=.299*h+.701*c+.167*p,f=.587*h-.587*c+.33*p,g=.114*h-.114*c-.497*p,v=.299*h-.299*c-.328*p,y=.587*h+.413*c+.035*p,m=.114*h-.114*c+.293*p,_=.299*h-.3*c+1.25*p,S=.587*h-.586*c-1.05*p,b=.114*h+.886*c-.2*p;for(e=0;e<s;e+=4)i=a[e+0],n=a[e+1],r=a[e+2],o=a[e+3],a[e+0]=u*i+f*n+g*r,a[e+1]=v*i+y*n+m*r,a[e+2]=_*i+S*n+b*r,a[e+3]=o},Invert:function(t){var e,i=t.data,n=i.length;for(e=0;e<n;e+=4)i[e]=255-i[e],i[e+1]=255-i[e+1],i[e+2]=255-i[e+2]},Kaleidoscope:function(t){var e,i,n,r,o,a,s,h,l,d=t.width,c=t.height,p=Math.round(this.kaleidoscopePower()),u=Math.round(this.kaleidoscopeAngle()),f=Math.floor(d*(u%360)/360);if(!(p<1)){var g=I.createCanvasElement();g.width=d,g.height=c;var v=g.getContext("2d").getImageData(0,0,d,c);!function(t,e,i){var n,r,o,a,s=t.data,h=e.data,l=t.width,d=t.height,c=i.polarCenterX||l/2,p=i.polarCenterY||d/2,u=0,f=0,g=0,v=0,y=Math.sqrt(c*c+p*p);r=l-c,o=d-p,y=y<(a=Math.sqrt(r*r+o*o))?a:y;var m,_,S,b,x=d,w=l,C=360/w*Math.PI/180;for(_=0;_<w;_+=1)for(S=Math.sin(_*C),b=Math.cos(_*C),m=0;m<x;m+=1)r=Math.floor(c+y*m/x*b),u=s[0+(n=4*((o=Math.floor(p+y*m/x*S))*l+r))],f=s[n+1],g=s[n+2],v=s[n+3],h[0+(n=4*(_+m*l))]=u,h[n+1]=f,h[n+2]=g,h[n+3]=v}(t,v,{polarCenterX:d/2,polarCenterY:c/2});for(var y=d/Math.pow(2,p);y<=8;)y*=2,p-=1;var m=y=Math.ceil(y),_=0,S=m,b=1;for(d<f+y&&(_=m,S=0,b=-1),i=0;i<c;i+=1)for(e=_;e!==S;e+=b)h=4*(d*i+Math.round(e+f)%d),r=v.data[h+0],o=v.data[h+1],a=v.data[h+2],s=v.data[h+3],l=4*(d*i+e),v.data[l+0]=r,v.data[l+1]=o,v.data[l+2]=a,v.data[l+3]=s;for(i=0;i<c;i+=1)for(m=Math.floor(y),n=0;n<p;n+=1){for(e=0;e<m+1;e+=1)h=4*(d*i+e),r=v.data[h+0],o=v.data[h+1],a=v.data[h+2],s=v.data[h+3],l=4*(d*i+2*m-e-1),v.data[l+0]=r,v.data[l+1]=o,v.data[l+2]=a,v.data[l+3]=s;m*=2}!function(t,e,i){var n,r,o,a,s,h,l=t.data,d=e.data,c=t.width,p=t.height,u=i.polarCenterX||c/2,f=i.polarCenterY||p/2,g=0,v=0,y=0,m=0,_=Math.sqrt(u*u+f*f);r=c-u,o=p-f,_=_<(h=Math.sqrt(r*r+o*o))?h:_;var S,b,x,w=p,C=c,P=i.polarRotation||0;for(r=0;r<c;r+=1)for(o=0;o<p;o+=1)a=r-u,s=o-f,S=Math.sqrt(a*a+s*s)*w/_,b=(b=(180*Math.atan2(s,a)/Math.PI+360+P)%360)*C/360,x=Math.floor(b),g=l[0+(n=4*(Math.floor(S)*c+x))],v=l[n+1],y=l[n+2],m=l[n+3],d[0+(n=4*(o*c+r))]=g,d[n+1]=v,d[n+2]=y,d[n+3]=m}(v,t,{polarRotation:0})}},Mask:function(t){var e=function(t,e){var i=Ue(t,0,0),n=Ue(t,t.width-1,0),r=Ue(t,0,t.height-1),o=Ue(t,t.width-1,t.height-1),a=e||10;if(qe(i,n)<a&&qe(n,o)<a&&qe(o,r)<a&&qe(r,i)<a){for(var s=function(t){for(var e=[0,0,0],i=0;i<t.length;i++)e[0]+=t[i][0],e[1]+=t[i][1],e[2]+=t[i][2];return e[0]/=t.length,e[1]/=t.length,e[2]/=t.length,e}([n,i,o,r]),h=[],l=0;l<t.width*t.height;l++){var d=qe(s,[t.data[4*l],t.data[4*l+1],t.data[4*l+2]]);h[l]=d<a?0:255}return h}}(t,this.threshold());return e&&function(t,e){for(var i=0;i<t.width*t.height;i++)t.data[4*i+3]=e[i]}(t,e=function(t,e,i){for(var n=[1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9],r=Math.round(Math.sqrt(n.length)),o=Math.floor(r/2),a=[],s=0;s<i;s++)for(var h=0;h<e;h++){for(var l=s*e+h,d=0,c=0;c<r;c++)for(var p=0;p<r;p++){var u=s+c-o,f=h+p-o;if(0<=u&&u<i&&0<=f&&f<e){var g=n[c*r+p];d+=t[u*e+f]*g}}a[l]=d}return a}(e=function(t,e,i){for(var n=[1,1,1,1,1,1,1,1,1],r=Math.round(Math.sqrt(n.length)),o=Math.floor(r/2),a=[],s=0;s<i;s++)for(var h=0;h<e;h++){for(var l=s*e+h,d=0,c=0;c<r;c++)for(var p=0;p<r;p++){var u=s+c-o,f=h+p-o;if(0<=u&&u<i&&0<=f&&f<e){var g=n[c*r+p];d+=t[u*e+f]*g}}a[l]=1020<=d?255:0}return a}(e=function(t,e,i){for(var n=[1,1,1,1,0,1,1,1,1],r=Math.round(Math.sqrt(n.length)),o=Math.floor(r/2),a=[],s=0;s<i;s++)for(var h=0;h<e;h++){for(var l=s*e+h,d=0,c=0;c<r;c++)for(var p=0;p<r;p++){var u=s+c-o,f=h+p-o;if(0<=u&&u<i&&0<=f&&f<e){var g=n[c*r+p];d+=t[u*e+f]*g}}a[l]=2040===d?255:0}return a}(e,t.width,t.height),t.width,t.height),t.width,t.height)),t},Noise:function(t){var e,i=255*this.noise(),n=t.data,r=n.length,o=i/2;for(e=0;e<r;e+=4)n[e+0]+=o-2*o*Math.random(),n[e+1]+=o-2*o*Math.random(),n[e+2]+=o-2*o*Math.random()},Pixelate:function(t){var e,i,n,r,o,a,s,h,l,d,c,p,u,f,g=Math.ceil(this.pixelSize()),v=t.width,y=t.height,m=Math.ceil(v/g),_=Math.ceil(y/g),S=t.data;if(g<=0)I.error("pixelSize value can not be <= 0");else for(p=0;p<m;p+=1)for(u=0;u<_;u+=1){for(l=(h=p*g)+g,c=(d=u*g)+g,f=s=a=o=r=0,e=h;e<l;e+=1)if(!(v<=e))for(i=d;i<c;i+=1)y<=i||(r+=S[0+(n=4*(v*i+e))],o+=S[n+1],a+=S[n+2],s+=S[n+3],f+=1);for(r/=f,o/=f,a/=f,s/=f,e=h;e<l;e+=1)if(!(v<=e))for(i=d;i<c;i+=1)y<=i||(S[0+(n=4*(v*i+e))]=r,S[n+1]=o,S[n+2]=a,S[n+3]=s)}},Posterize:function(t){var e,i=Math.round(254*this.levels())+1,n=t.data,r=n.length,o=255/i;for(e=0;e<r;e+=1)n[e]=Math.floor(n[e]/o)*o},RGB:function(t){var e,i,n=t.data,r=n.length,o=this.red(),a=this.green(),s=this.blue();for(e=0;e<r;e+=4)i=(.34*n[e]+.5*n[e+1]+.16*n[e+2])/255,n[e]=i*o,n[e+1]=i*a,n[e+2]=i*s,n[e+3]=n[e+3]},RGBA:function(t){var e,i,n=t.data,r=n.length,o=this.red(),a=this.green(),s=this.blue(),h=this.alpha();for(e=0;e<r;e+=4)i=1-h,n[e]=o*h+n[e]*i,n[e+1]=a*h+n[e+1]*i,n[e+2]=s*h+n[e+2]*i},Sepia:function(t){var e,i,n,r,o=t.data,a=o.length;for(e=0;e<a;e+=4)i=o[e+0],n=o[e+1],r=o[e+2],o[e+0]=Math.min(255,.393*i+.769*n+.189*r),o[e+1]=Math.min(255,.349*i+.686*n+.168*r),o[e+2]=Math.min(255,.272*i+.534*n+.131*r)},Solarize:function(t){var e=t.data,i=t.width,n=4*i,r=t.height;do{var o=(r-1)*n,a=i;do{var s=o+4*(a-1),h=e[s],l=e[1+s],d=e[2+s];127<h&&(h=255-h),127<l&&(l=255-l),127<d&&(d=255-d),e[s]=h,e[1+s]=l,e[2+s]=d}while(--a)}while(--r)},Threshold:function(t){var e,i=255*this.threshold(),n=t.data,r=n.length;for(e=0;e<r;e+=1)n[e]=n[e]<i?0:255}}})});

 

/**
 * 游戏主体逻辑,包括开始游戏,结束游戏等
 * 主要是开始游戏到循环游戏直到游戏结束的状态变化
 * 也包括初始化整个游戏
 */

// 牌面初始化
function InitBoard(){
    // 将牌打乱
    for(let i=53;i>0;i--){
        BoardListGameInit[i].DrawBoardFront.hide()
        BoardListGameInit[i].DrawBoardBack.hide()
        let randomIndex = Math.floor( Math.random()*i+1)
        BoardListGameInit.push(BoardListGameInit[randomIndex])
        BoardListGameInit.splice(randomIndex,1)
    }
    // 地主牌
    for(let i=0; i<6; i++){
        let temp = 3
        if(i==0) temp-=1
        PlayerList[0].BoardList.push(...BoardListGameInit.splice(0, temp))
        PlayerList[1].BoardList.push(...BoardListGameInit.splice(0, temp))
        PlayerList[2].BoardList.push(...BoardListGameInit.splice(0, temp))
    }
    // 将牌排列整齐
    BoardSort(BoardListGameInit)
    PlayerList[0].BoardListSort()
    PlayerList[1].BoardListSort()
    PlayerList[2].BoardListSort()

}

// 按钮闭包
var Button_ = (function(){
    // 注册事件
    let EventListener = new Array()
    // 显示按钮且添加事件
    function ShowButtonAndEvent(text1, text2, buttonLeftEvent, buttonRightEvent){
        // 添加事件之前需要先注销掉之前的事件
        HideButtonAndDeEvent()
        ShowAndHide(true)
        ButtonOne1.innerText = text1
        ButtonOne2.innerText = text2
        ButtonOne1.addEventListener('click',buttonLeftEvent)
        ButtonOne2.addEventListener('click',buttonRightEvent)
        EventListener[0] = buttonLeftEvent
        EventListener[1] = buttonRightEvent
    }
    // 隐藏按钮且删除事件
    function HideButtonAndDeEvent(){
        ShowAndHide(false)
        // 移除事件
        if(EventListener.length>0){
            ButtonOne1.removeEventListener('click',EventListener[0])
            ButtonOne2.removeEventListener('click',EventListener[1])
            EventListener.splice(0,1)
            EventListener.splice(0,1)
        }
    }
    // 隐藏或显示
    function ShowAndHide(IsShow){
        ButtonDiv.style.display = IsShow? 'block':'none'
    }
    return {
        ShowButtonAndEvent: ShowButtonAndEvent,
        HideButtonAndDeEvent: HideButtonAndDeEvent,
        ShowAndHide: ShowAndHide
    }
})()

// 倒计时闭包
var TimeSecond = (function(){
    let i = EveryTime
    // 绘制秒表
    let timeControl = null
    // 是否暂停
    let IsPause = false
    // 动画ID
    let RAFId = null
    function Show(){
        if(!timeControl)
        {
            timeControl = DrawTime()
            BoardLayer.add(timeControl)
        }
        timeControl.show()
        DrawStart()
    }

    let oldTime = new Date()
    let newDate = 0

    // 开始倒计时
    function DrawStart(){
        newDate = new Date()
        if(newDate-oldTime > 1000 && !IsPause){
            // console.log()
            timeControl.text(i<10?'0'+i:i)
            BoardLayer.draw()
            i--
            oldTime = new Date()
        }
        if(i<0){
            Close()
            // 默认当该倒计时结束,那么触发第一个按钮的点击事件
            ButtonOne1.click()
            return
        } 
        RAFId = window.requestAnimationFrame(DrawStart)
    }

    // 关闭且初始化
    function Close(){
        if(RAFId)
            window.cancelAnimationFrame(RAFId)
        i = 20
        IsPause = false
        timeControl.hide()
        BoardLayer.draw()
        RAFId = null
    }
    return {
        timeControl: timeControl,
        Show: Show,
        Close: Close,
        IsPause: IsPause
    }
})()

// 发牌
async function SendBorad(){

    // 玩家牌组
    // 在玩家牌组上面注册一个组合,如果在该组合上面点击,那么将开启选牌
    // 离开该组合将注销
    let IsSelect = false // 是否可以选中牌
    MyBoardGroup = new Konva.Group()
    NotMeBoard_Group = new Konva.Group()
    
    MyBoardGroup.on('mousedown', ()=> { IsSelect=true })
    MyBoardGroup.on('mouseup mouseleave', ()=> { 
        IsSelect=false;
        if(TempBorad!=null)
            new BoardPlayer(TempBorad, 0).Show()
    })


    // 给地主牌注册事件,因为该地主牌有可能是玩家的手牌
    for(let i=0;i<3; i++){
        BoardListGameInit[i].DrawBoardFront.show()
        BoardListGameInit[i].DrawBoardBack.hide()
        // 注册事件
        BoardListGameInit[i].DrawBoardFront.on('mouseenter.select', (node)=>{
            if (IsSelect && Loandlords_Paly_==0)
                GoOrOut(node, BoardListGameInit[i])
        })
        BoardListGameInit[i].DrawBoardFront.on('mousedown.click', (node)=>{
            if(Loandlords_Paly_==0)
                GoOrOut(node, BoardListGameInit[i])
        })
    }

    // 生成具体的牌对象
    for(let i = 0;i<3; i++){
        for(let j=0; j<PlayerList[i].BoardList.length;j++){
            let Board = PlayerList[i].BoardList[j]
            let group = null
            if(i==0){
                group = Board.DrawBoardFront
                group.on('mouseenter.select', (node)=>{
                    if (IsSelect)
                        GoOrOut(node, Board)
                })
                group.on('mousedown.click', (node)=>{
                    GoOrOut(node, Board)
                })
                // console.log(group)
                MyBoardGroup.add(group)
            }else{
                group = Board.DrawBoardBack
                let DrawBoardFront = Board.DrawBoardFront
                DrawBoardFront.hide()
                NotMeBoard_Group.add(group)
                NotMeBoard_Group.add(DrawBoardFront)
            }
            group.show()
        }
    }
    BoardLayer.add(MyBoardGroup)
    BoardLayer.add(NotMeBoard_Group)
    
    // 开始发牌动画
    await DrawSendBoard(BoardLayer)
    StartGame()
}

// 开始玩地主
async function StartGame(){

    // 将地主牌放到左上角
    for(let i = 0;i<3;i++){
        BoardLayer.add(BoardListGameInit[i].DrawBoardFront)
        BoardLayer.add(BoardListGameInit[i].DrawBoardBack)
        RotateBoard(BoardListGameInit[i].DrawBoardFront, 0, 0.2, width*0.15+i*BoardWidth, 0)
        RotateBoard(BoardListGameInit[i].DrawBoardBack, 0, 0.2, width*0.15+i*BoardWidth, 0.2)
    }

    // 叫地主
    setTimeout(() => {
        TimeSecond.Show()
        Loandlords_Paly()
    }, 500);

    // 将决定一个地主出来
    function Loandlords_Paly(){
        // 显示按钮且绑定事件
        Button_.ShowButtonAndEvent('不叫','叫地主', async ()=>{
            Loandlords_Paly_ = Math.floor( Math.random()*2+1)
            // 将倒计时关闭
            TimeSecond.Close()
            Button_.HideButtonAndDeEvent(true)

            // 必须等待动画完成
            await new Promise(async (a,b)=>{
                for(let i = 0; i<3; i++){
                    BoardListGameInit[i].DrawBoardBack.show()
                    PlayerList[Loandlords_Paly_].BoardList.push(BoardListGameInit[i])
                    NotMeBoard_Group.add(BoardListGameInit[i].DrawBoardBack)
                    if(Loandlords_Paly_==1)
                        await RotateBoard(BoardListGameInit[i].DrawBoardBack, 0, 0.2, width*0.05, (BoardHight*0.3)+(17*10)+i*10)
                    else
                        await RotateBoard(BoardListGameInit[i].DrawBoardBack, 0, 0.2, (width*0.95 - BoardWidth), (BoardHight*0.3)+(17*10)+i*10)

                    PlayerList[Loandlords_Paly_].BoardListSort()
                    a()
                }
            })
            StartFunGame()
        }, async ()=>{
            // 将倒计时关闭
            TimeSecond.Close()
            Button_.HideButtonAndDeEvent(true)
            Loandlords_Paly_ = 0
            // 叫地主;那么将地主牌添加到玩家手牌中
            PlayerList[0].BoardList.push(...BoardListGameInit)
            // 整理牌
            await InitLocationBoard(PlayerList[0])
            StartFunGame()
        })
    }
}

// 开始游戏循环
function StartFunGame(){
    // 实例化一个已经出了的牌池
    BoardPond_ = new BoardPond()
    // 绘制地主和农民
    ClassTitle()
    PlayerGroupCreate()
    BoardLayer.draw()
    // 玩家出牌的下标
    let CurrentIndex = Loandlords_Paly_
    // 周期回合数;用以记录当前是否已走完一个周期(即三名玩家)
    let Bout = 0
    // 绑定出牌不出牌事件
    Button_.ShowButtonAndEvent('不出','出牌', async ()=>{
        // 如果当前的回合是玩家,且第一张出牌的也是玩家,
        // 如果玩家还没出牌,那么需要随机出一张牌
        if(!CurrentBorad && CurrentIndex==0){
            console.log('玩家随机出牌')
            // 将牌复原的合适的位置
            await RestoreBoard()
        }
        // 当前已过完一整个周期;那么牌堆处设置为空
        if(Bout==1){
            Bout = 0
            CurrentBorad = null
        }else
            Bout++
        // 将倒计时关闭
        TimeSecond.Close()
        // 下一个回合
        NextGame()
    }, async ()=>{
        let Current_index = NextIndex(CurrentIndex, -1)
        let myBoard
        if(Current_index == 0)
        {
            myBoard = new BoardPlayer(TempBorad, 0)
            TempBorad.clear()
        }
        else // 机器人
        {
            myBoard = new BoardPlayer(RobotBoards, Current_index)
            RobotBoards = null
        }
        
        // 判定是否可以出牌
        if(JudgeBoard(myBoard)){
            // 将倒计时关闭
            TimeSecond.Close()
            Button_.ShowAndHide(false)

            // 将牌顶换为当前牌
            CurrentBorad = myBoard
            // console.log(myBoard)
            BoardPond_.SetAddBoard(myBoard)
            
            await PlayerMessage(PlayerList[Current_index], myBoard)
        }else 
        {
            console.log('不能出牌')
            return
        }
        // 新回合的开始重新设置
        Bout = 0
        NextGame()
    })
    // 游戏回合
    function NextGame(){
        if(PlayEnd()) return
        let CurrentIndex_ = CurrentIndex
        TimeSecond.Show()
        DrawTabColor(CurrentIndex)
        let isRobat = false
        if(CurrentIndex==0){
            IsLockClick = true
            Button_.ShowAndHide(true)
        }else{
            IsLockClick = false
            Button_.ShowAndHide(false)
            isRobat = true
        }
        PlayerList[CurrentIndex].Group.removeChildren()
        CurrentIndex = NextIndex(CurrentIndex)
        if(isRobat){
            setTimeout(() => {
                let _value = 0
                if(CurrentBorad!=null)
                    _value = CurrentBorad.CurrentBoardCombin.Value
                // 机器人出牌
                RobotBoards = new BoardType(PlayerList[CurrentIndex_].BoardList)
                    .GetAllType('Y1', _value)
                if(RobotBoards==null)
                    ButtonOne1.click()
                else
                    ButtonOne2.click()
            }, 1000);
        }
    }
    NextGame()
}

// 游戏结束
function PlayEnd(){
    let isEnd = false
    if(PlayerList[0].BoardList.length==0)
    {
        alert('游戏结束;你赢了')
        isEnd = true
    }
    if(PlayerList[1].BoardList.length==0)
    {
        alert('游戏结束;你上家赢了')
        isEnd = true
    }
    if(PlayerList[2].BoardList.length==0)
    {
        alert('游戏结束;你下家赢了')
        isEnd = true
    }
    if(isEnd){
        IsLockClick = false
        TimeSecond.Close()
        Button_.HideButtonAndDeEvent()
    }
    return isEnd
}

// 下一个玩家
function NextIndex(CurrentIndex_, Line=1){
    CurrentIndex_-=Line
    if(CurrentIndex_<0)
        CurrentIndex_=2
    else if(CurrentIndex_>2)
        CurrentIndex_=0
    return CurrentIndex_
}

// 判定系统,判定是否可以出牌
// 当牌顶为空,且牌顶数量与牌顶的真实价值小于当前出牌真实价值
// 且类型一致
function JudgeBoard(CurrentBoard_){
    if(CurrentBoard_.CurrentBoardCombin==null) return false
    if(CurrentBorad==null) return true
    
    if(CurrentBorad.CurrentBoardCombin.Value < CurrentBoard_.CurrentBoardCombin.Value)
    if(CurrentBorad.CurrentBoardCombin.Type == CurrentBoard_.CurrentBoardCombin.Type)
    if(CurrentBorad.CurrentBoardCombin.Length < CurrentBoard_.CurrentBoardCombin.Length || 
        CurrentBoard_.CurrentBoardCombin.Type != 'Y8')
        return true
    
    return false
}

// 玩家们的手牌绘制区
function PlayerGroupCreate(){
    PlayerList[0].Group = new Konva.Group()
    PlayerList[1].Group = new Konva.Group()
    PlayerList[2].Group = new Konva.Group()
    BoardLayer.add(PlayerList[0].Group)
    BoardLayer.add(PlayerList[1].Group)
    BoardLayer.add(PlayerList[2].Group)
}

// 将牌按照大小进行排序
function BoardSort(BoardList){
    // 先将牌面进行排序
    let len = BoardList.length
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            let value_1 = BoardMarkMap.get(BoardList[j].surface)
            let value_2 = BoardMarkMap.get(BoardList[j+1].surface)
            if (value_1 < value_2) {        // 相邻元素两两对比
                var temp = BoardList[j+1];        // 元素交换
                BoardList[j+1] = BoardList[j];
                BoardList[j] = temp;
            }
        }
    }
}

// 开始加载游戏
window.onload = function(){
    ButtonDiv = document.getElementById('ButtonDiv')
    ButtonOne1 = document.getElementById('CallLandLord')
    ButtonOne2 = document.getElementById('RobLandLord')
    TxtInfo = document.getElementById('txtInfo')
    // 首先必须添加一个场景
    Stage = new Konva.Stage({
        container: '#bodyPlayer',   // id of container <div>
        width: width,
        height: height
    });
    BoardLayer = new Konva.Layer()
    Stage.add(BoardLayer)
    DrawTable()
    InitBoard()
    SendBorad()
    
}

// 执行动画,第一个参数,动画执行函数
function RAF(){
    
}
/**
 * 作者:斌斌20一枝花
 * 变量初始化,记录有关游戏的所有全局变量
 */

//---------------------------------------游戏基本变量

// 牌面映射,字面量=》价值量
var BoardMarkMap = new Map();
BoardMarkMap.set('3', 3)
BoardMarkMap.set('4', 4)
BoardMarkMap.set('5', 5)
BoardMarkMap.set('6', 6)
BoardMarkMap.set('7', 7)
BoardMarkMap.set('8', 8)
BoardMarkMap.set('9', 9)
BoardMarkMap.set('0', 10) // 10
BoardMarkMap.set('J', 11)
BoardMarkMap.set('Q', 12)
BoardMarkMap.set('K', 13)
BoardMarkMap.set('A', 14)
BoardMarkMap.set('2', 15)
BoardMarkMap.set('C', 50) // 小鬼
BoardMarkMap.set('G', 100) // 大鬼

// 牌组合类型映射
var BoardTypeMap = new Map()
BoardTypeMap.set('Y1', '单牌')
BoardTypeMap.set('Y2', '对子')
BoardTypeMap.set('Y3', '三带')
BoardTypeMap.set('Y4', '顺子')
BoardTypeMap.set('Y5', '连对')
BoardTypeMap.set('Y6', '飞机')
BoardTypeMap.set('Y7', '四带二')
BoardTypeMap.set('Y8', '炸弹')
// BoardTypeMap.set('Y9', '王炸')

// 牌的绘制容器管理,可以通过该容器索引到任何一张牌的绘制内容
var BoardDrawMap = new Map()

// keys集合;获取牌的字面量如K,J,Q....
var BoardMarkMapKes = Array.from(BoardMarkMap.keys())

//---------------------------------------游戏结构性逻辑变量(包括绘制的逻辑变量)

// 画布的大小
const width = 844
const height = 390

// 牌有关的全局变量
const BoardWidth = 45
const BoardHight = 80

// 按钮的大小
const ButtonWidth = 120
const ButtonPadding = 20

// 每个回合等待的时间
const EveryTime = 20
// 按钮的容器:控制整体是否显示与否
var ButtonDiv = document.getElementById('ButtonDiv')
// 初始:叫地主=》过牌
var ButtonOne1 = document.getElementById('CallLandLord')
// 初始:不叫=》出牌
var ButtonOne2 = document.getElementById('RobLandLord')
// 头顶信息框
var TxtInfo = document.getElementById('txtInfo')

// 玩家手牌图层
var MyBoardGroup = null
// 机器人手牌图层
var NotMeBoard_Group = null

//---------------------------------------游戏内容逻辑变量
// 牌面绘制映射
var GrawBoard = new Map()
// 牌面选中集合
var TempBorad = new Map()
// 是否锁住点击事件
var IsLockClick = false
// 有几个玩家发完牌
var SendBoard = 0 
// 机器人牌面
var RobotBoards

// 玩家
var PlayerList = new Array()
// 自己,
PlayerList[0] = new Player([],'玩家一', 'SaddleBrown')
// 左边上家
PlayerList[1] = new Player([],'玩家二', 'DarkOliveGreen')
// 右边下家
PlayerList[2] = new Player([],'玩家三', 'MediumSlateBlue')

// 场景
var Stage = null
// 是否已出牌或者叫了地主
var isSelect = false
// 地主索引=》对应的是玩家的下标
var Loandlords_Paly_ = -1

// 图层
var BoardLayer = null
// 当前桌面牌堆;如果为null,则表明当前可以随意出牌
// 不然下一家必须接牌;类型:BoardPond
var CurrentBorad = null
// 牌池
var BoardPond_ = null
// 中间的桌子
var Tab_ = null

// 生成各种牌
var BoardListGameInit = new Array();
for(var i=0;i<15;i++){
    var key = BoardMarkMapKes[i]
    if(key=='C'){
        BoardListGameInit.push(new Board(key, '🧛', i*4))
        continue
    }else if(key=='G'){
        BoardListGameInit.push(new Board(key, '🧙‍♂️', 53))
        continue
    }
    BoardListGameInit.push(new Board(key, '♠', i*4))
    BoardListGameInit.push(new Board(key, '♥', i*4+1))
    BoardListGameInit.push(new Board(key, '♣', i*4+2))
    BoardListGameInit.push(new Board(key, '♦', i*4+3))
}

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斌斌一支❀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值