From 8a7a79cea00b1466aef40c79768bb160b27bb2bf Mon Sep 17 00:00:00 2001 From: RXXXBNUer <1014042554@qq.com> Date: Thu, 6 Nov 2025 18:43:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=AC=E4=BA=94=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bg_highlight_619188fb.js | 1 - .../bg_highlight_f8cee65f.js | 1355 + .../python_skulpt_car/bg_nonehl_8ade5557.js | 1 - .../python_skulpt_car/bg_nonehl_d04ead5f.js | 1203 + boards/default/python_skulpt_car/index.xml | 1211 +- .../python_skulpt_car/inittool_3543dc69.js | 20 + .../python_skulpt_car/inittool_b5e8e605.js | 1 - .../python_skulpt_car/main.bundle.054b4509.js | 35751 ++++++++++++++++ .../main.bundle.054b4509.js.map | 1 + .../python_skulpt_car/main.bundle.64d85e8e.js | 21 - .../python_skulpt_car/others/pyengine.js | 4 +- .../{main.058da4a1.css => main.dc0521d8.css} | 5 + .../styles/main.dc0521d8.css.map | 1 + .../python_pyodide/others/loader.js | 4 +- .../others/skulpt/libs/bg_highlight.js | 4 +- .../others/skulpt/libs/bg_nonehl.js | 4 +- 16 files changed, 39555 insertions(+), 32 deletions(-) delete mode 100644 boards/default/python_skulpt_car/bg_highlight_619188fb.js create mode 100644 boards/default/python_skulpt_car/bg_highlight_f8cee65f.js delete mode 100644 boards/default/python_skulpt_car/bg_nonehl_8ade5557.js create mode 100644 boards/default/python_skulpt_car/bg_nonehl_d04ead5f.js create mode 100644 boards/default/python_skulpt_car/inittool_3543dc69.js delete mode 100644 boards/default/python_skulpt_car/inittool_b5e8e605.js create mode 100644 boards/default/python_skulpt_car/main.bundle.054b4509.js create mode 100644 boards/default/python_skulpt_car/main.bundle.054b4509.js.map delete mode 100644 boards/default/python_skulpt_car/main.bundle.64d85e8e.js rename boards/default/python_skulpt_car/styles/{main.058da4a1.css => main.dc0521d8.css} (99%) create mode 100644 boards/default/python_skulpt_car/styles/main.dc0521d8.css.map diff --git a/boards/default/python_skulpt_car/bg_highlight_619188fb.js b/boards/default/python_skulpt_car/bg_highlight_619188fb.js deleted file mode 100644 index f6b7a120..00000000 --- a/boards/default/python_skulpt_car/bg_highlight_619188fb.js +++ /dev/null @@ -1 +0,0 @@ -var $builtinmodule=function(t){let e={__name__:new Sk.builtin.str("blocklygame")};var i=d3.select(Sk.TurtleGraphics.target).append("svg"),r=[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,2,1,1,1,1,3,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],a=0,n=1,o=2,p=3,c=0,l=1,s=-1,m={10010:[4,0],10001:[3,3],11e3:[0,1],10100:[0,2],11010:[4,1],10101:[3,2],10110:[0,0],10011:[2,0],11001:[4,2],11100:[2,3],11110:[1,1],10111:[1,0],11011:[2,1],11101:[1,2],11111:[2,2],null0:[4,3],null1:[3,0],null2:[3,1],null3:[0,3],null4:[1,3]},u={img:"../common/js/skulpt_mixcar/pic/pegman.png",height:52,width:49,direction:n,type:"animate",x:0,y:0,stepSpeed:150,coin_point:0,marker_num:0,oil:1,traffic_light:22,circulation_num:0,invisible_mark:0},k=50,h=r.length,f=r[0].length,g=0,S={mlevel:0,tiles:"../common/js/skulpt_mixcar/pic/maze_path.png",marker:"../common/js/skulpt_mixcar/pic/marker.png",background:"../common/js/skulpt_mixcar/pic/bg_astro.jpg",wall:"../common/js/skulpt_mixcar/pic/roadblock.png",award:"../common/js/skulpt_mixcar/pic/award.png",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,FINISH:3,AWARD:4,INVIMAKER:24},MAZE_WIDTH:k*f,MAZE_HEIGHT:k*h,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:1,INVIMNUM:0},T=[{mlevel:1,map:[[0,1,1,13,1,1,12,0],[0,1,0,1,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg1.jpg",wall:"",award:"",barrier:"",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:2,map:[[0,1,1,13,1,1,12,0],[0,1,0,5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg2.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:3,map:[[0,1,1,13,24,1,24,0],[0,1,0,Math.random()>.5?1:5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,24,1,1,24,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg2.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:0,INVIMNUM:4},{mlevel:4,map:[[0,1,1,13,24,1,24,0],[20,1,0,Math.random()>.5?1:5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,24,1,1,24,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg3.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER4:13,S_F:9,OIL_STATION:20,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:0,INVIMNUM:4},{mlevel:5,map:[[0,1,1,1,1,1,1,0],[0,1,0,0,0,0,1,0],[0,1,1,2,21,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,1,1,1,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg4.jpg",wall:"",award:"",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,S_F:9,TRAFFIC_LIGHT:21,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:3,y:2},type:0,INVIMNUM:0},{mlevel:6,map:[[0,1,1,13,1,1,12,0],[0,1,0,1,0,0,1,0],[0,1,1,2,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg1.jpg",wall:"",award:"",barrier:"",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,START:2,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:7,map:[[0,1,1,1,1,1,1,0],[0,1,0,0,0,0,1,0],[0,1,1,2,22,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,1,1,1,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg4.jpg",wall:"",award:"",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,S_F:9,LIGHT_GREEN:22,LIGHT_RED:23,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:c,finish:{x:3,y:2},type:0,INVIMNUM:0}],y=function(t,e,i,r){var a=$(Sk.TurtleGraphics.target).find("#pegman");"animate"==u.type?(0==S.type?(a.attr("x",t*k-i*u.width+1),a.attr("y",k*(e+.5)-u.height/2)):(a.attr("x",t*k-i*u.width+1),a.attr("y",k*(e+.5)-u.height/2-8)),r?a.attr("transform","rotate("+r+", "+(t*k+25)+", "+(e*k+25)+")"):a.attr("transform","rotate(0, 0, 0)")):(a.attr("x",t*k+1),a.attr("y",k*(e+.5)-u.height/2));var n=$(Sk.TurtleGraphics.target).find("#clipRect");n.attr("x",t*k+1),n.attr("y",a.attr("y"))},d=function(){i.attr("id","game_stage");var t=Math.max(h,f)*k;i.attr("viewBox","0 -10 "+t+" "+(t+10)),i.append("rect").attr("x",0).attr("y",0).attr("width",S.MAZE_WIDTH).attr("height",S.MAZE_HEIGHT).style("fill","#F1EEE7").style("stroke","#CCB").style("stroke-width","1"),i.append("image").attr("x",0).attr("y",0).attr("width",k*f).attr("height",k*h).attr("xlink:href",S.background);for(var e=function(t,e){return t<0||t>=f||e<0||e>=h||r[e][t]==S.SquareType.WALL||r[e][t]==S.SquareType.OIL_STATION?"0":"1"},a=0,n=0;n.3?"null0":"null"+Math.floor(1+4*Math.random()));var c=m[p][0],l=m[p][1];i.append("clipPath").attr("id","tileClipPath"+a);const t=Sk.TurtleGraphics.target.querySelector("#tileClipPath"+a);d3.select(t).append("rect").attr("x",o*k).attr("y",n*k).attr("width",k).attr("height",k),0==S.type?r[n][o]!=S.SquareType.WALL&&r[n][o]!=S.SquareType.OIL_STATION&&r[n][o]!=S.SquareType.TRAFFIC_LIGHT&&r[n][o]!=S.SquareType.LIGHT_GREEN&&r[n][o]!=S.SquareType.LIGHT_RED&&(i.append("image").attr("x",o*k).attr("y",n*k).attr("width",k).attr("height",k).attr("clip-path","url(#tileClipPath"+a+")").attr("xlink:href",S.tiles),a++):(i.append("image").attr("x",(o-c)*k).attr("y",(n-l)*k).attr("width",250).attr("height",200).attr("clip-path","url(#tileClipPath"+a+")").attr("xlink:href",S.tiles),a++),0==r[n][o]?i.append("image").attr("x",o*k+5).attr("y",n*k+5).attr("width",40).attr("height",40).attr("xlink:href",S.wall):4==r[n][o]?i.append("image").attr("id","coin"+n+o).attr("x",o*k+12.5).attr("y",n*k+12.5).attr("width",25).attr("height",25).attr("xlink:href",S.award):5==r[n][o]?i.append("image").attr("id","barrier"+n+o).attr("x",o*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",S.barrier):10==r[n][o]?(i.append("image").attr("id","marker1").attr("x",o*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",S.markers[0]),g+=1):11==r[n][o]?(i.append("image").attr("id","marker2").attr("x",o*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",S.markers[1]),g+=1):12==r[n][o]?(i.append("image").attr("id","marker3").attr("x",o*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",S.markers[2]),g+=1):13==r[n][o]&&(i.append("image").attr("id","marker4").attr("x",o*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",S.markers[3]),g+=1)}if(1==S.type){i.append("image").attr("id","finish").attr("width",25).attr("height",25).attr("xlink:href",S.marker);for(n=0;n=S.INVIMNUM||"error3":"error2")))},x=function(t,e){var i,c,l=u.direction+t;switch(b(l)){case a:i=r[u.y-1]&&r[u.y-1][u.x],c="look_north";break;case n:i=r[u.y][u.x+1],c="look_east";break;case o:i=r[u.y+1]&&r[u.y+1][u.x],c="look_south";break;case p:i=r[u.y][u.x-1],c="look_west"}return e?[c,i!==S.SquareType.WALL&&void 0!==i&&i!==S.SquareType.BARRIER&&i!==S.SquareType.OIL_STATION&&i!==S.SquareType.TRAFFIC_LIGHT&&i!==S.SquareType.LIGHT_RED&&i!==S.SquareType.LIGHT_GREEN]:i!==S.SquareType.WALL&&void 0!==i&&i!==S.SquareType.BARRIER&&i!==S.SquareType.OIL_STATION&&i!==S.SquareType.TRAFFIC_LIGHT&&i!==S.SquareType.LIGHT_RED&&i!==S.SquareType.LIGHT_GREEN},b=function(t){return(t=Math.round(t)%4)<0&&(t+=4),t},w=function(t){return(t=Math.round(t)%16)<0&&(t+=16),t},I=function(t,e){var i=[(e[0]-t[0])/4,(e[1]-t[1])/4,(e[2]-t[2])/4];y(t[0]+i[0],t[1]+i[1],w(t[2]+i[2])),setTimeout((function(){y(t[0]+2*i[0],t[1]+2*i[1],w(t[2]+2*i[2]))}),u.stepSpeed),setTimeout((function(){y(t[0]+3*i[0],t[1]+3*i[1],w(t[2]+3*i[2]))}),2*u.stepSpeed),setTimeout((function(){y(e[0],e[1],w(e[2]))}),3*u.stepSpeed)},E=function(t){t=Sk.ffi.remapToJs(t),Mixly.Editor.blockEditor.highlightBlock(t)};e.setMap=new Sk.builtin.func((function(t,e,i,a,n){if(Sk.builtin.pyCheckArgs("setMap",arguments,5,5),r=[],"无可用地图"==n&&(n=""),t<3||t>20||e<3||e>20)throw new Sk.builtin.TypeError("错误!超出地图可设置范围,请设置横纵方格数大于等于3,小于等于20");switch(t=Sk.ffi.remapToJs(t),e=Sk.ffi.remapToJs(e),f=t,h=e,S.MAZE_WIDTH=k*f,S.MAZE_HEIGHT=k*h,i=Sk.ffi.remapToJs(i),a=Sk.ffi.remapToJs(a),Sk.ffi.remapToJs(n)){case"bg_default":S.background="../common/js/skulpt_mixcar/pic/bg_default.png";break;case"bg_astro":S.background="../common/js/skulpt_mixcar/pic/bg_astro.jpg";break;case"bg_panda":S.background="../common/js/skulpt_mixcar/pic/bg_panda.jpg"}var o;if(null!=(o=/\((\d+),(\d+)\)/.exec(i))&&(o[1]>t||o[1]<1||o[2]>e||o[2]<1))throw new Sk.builtin.TypeError("错误!起点坐标超出地图范围!");if(null!=(o=/\((\d+),(\d+)\)/.exec(a))&&(o[1]>t||o[1]<1||o[2]>e||o[2]<1))throw new Sk.builtin.TypeError("错误!终点坐标超出地图范围!");for(var p=0;pr[0].length||t<0||e>r.length||e<0)throw new Sk.builtin.TypeError("错误!放置物坐标超过地图范围");switch(i){case"wall":r[e-1][t-1]=S.SquareType.WALL;break;case"coin":r[e-1][t-1]=S.SquareType.AWARD}}));e.initMap=new Sk.builtin.func((function(){d()}));e.Actor=Sk.misceval.buildClass(e,(function(t,e){e.__init__=new Sk.builtin.func((function(t,e,r,n){return new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){switch("无可用角色"==(e=Sk.ffi.remapToJs(e)||"pegman")&&(e="pegman"),e){case"pegman":u.img="../common/js/skulpt_mixcar/pic/pegman.png",u.type="animate";break;case"panda":u.img="../common/js/skulpt_mixcar/pic/panda.png",u.type="animate";break;case"astro":u.img="../common/js/skulpt_mixcar/pic/astro.png",u.type="animate";break;case"robot":u.img="../common/js/skulpt_mixcar/pic/robot.png",u.type="still";break;case"car":u.img="../common/js/skulpt_mixcar/pic/actor_car3.png",u.type="animate"}u.direction=Sk.ffi.remapToJs(r)||a,size=[52,49],u.coin_point=0;var o=/block_id=([\s\S]*)/.exec(n);null!=o&&(n=o[1],E(n)),function(){i.append("clipPath").attr("id","pegmanClipPath");const t=Sk.TurtleGraphics.target.querySelector("#pegmanClipPath");d3.select(t).append("rect").attr("id","clipRect").attr("width",u.width).attr("height",u.height),"animate"==u.type?0==S.type?i.append("image").attr("id","pegman").attr("width",16*u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img):i.append("image").attr("id","pegman").attr("width",21*u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img):i.append("image").attr("id","pegman").attr("width",u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img),y(u.x,u.y,4*u.direction)}(),t(Sk.builtin.none.none$)}),800)})))})),e.moveDirection=new Sk.builtin.func((function(t,e,c){return Sk.builtin.pyCheckArgs("moveDirection",arguments,3,3),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){u.direction=parseInt(Sk.ffi.remapToJs(e));var l=function(t){if(!x(0,null))return!1;var e;switch(b(t)){case a:e="north";break;case n:e="east";break;case o:e="south";break;case p:e="west"}return e}(e);if(0==l)throw S.result=s,layer.alert("挑战失败!请修改后重新尝试",{shade:!1}),new Sk.builtin.TypeError("挑战失败!请修改后重新尝试");if(4==S.mlevel){if(r[u.y][u.x-1]==S.SquareType.OIL_STATION&&0==u.oil)throw S.result=s,i.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/no_oil.png"),layer.alert("挑战失败!小车没有油了",{shade:!1}),new Sk.builtin.TypeError("挑战失败!小车没有油了")}else if(5==S.mlevel)r[u.y][u.x]==S.SquareType.START&&(u.circulation_num+=1);else if(7==S.mlevel&&u.traffic_light==S.SquareType.LIGHT_RED)throw layer.alert("挑战失败:小车在红灯亮时还未停止!",{shade:!1}),new Sk.builtin.TypeError("挑战失败:小车在红灯亮时还未停止!");switch(l){case"north":I([u.x,u.y,4*u.direction],[u.x,u.y-1,4*u.direction]),u.y--;break;case"east":I([u.x,u.y,4*u.direction],[u.x+1,u.y,4*u.direction]),u.x++;break;case"south":I([u.x,u.y,4*u.direction],[u.x,u.y+1,4*u.direction]),u.y++;break;case"west":I([u.x,u.y,4*u.direction],[u.x-1,u.y,4*u.direction]),u.x--}var m,h,f=/block_id=([\s\S]*)/.exec(c);if(null!=f&&(c=f[1],E(c)),m=u.x,h=u.y,r[h][m]==S.SquareType.AWARD&&(setTimeout((function(){$(Sk.TurtleGraphics.target).find("#coin"+h+m).remove()}),3*u.stepSpeed),r[h][m]=S.SquareType.OPEN,u.coin_point+=1),function(t,e){r[e][t]!=S.SquareType.MARKER1&&r[e][t]!=S.SquareType.MARKER2&&r[e][t]!=S.SquareType.MARKER3&&r[e][t]!=S.SquareType.MARKER4||(u.marker_num+=1)}(u.x,u.y),function(t,e){r[e][t]==S.SquareType.INVIMAKER&&(u.invisible_mark+=1)}(u.x,u.y),7==S.mlevel&&(r[u.y][u.x+1]==S.SquareType.LIGHT_RED||r[u.y][u.x+1]==S.SquareType.LIGHT_GREEN)&&(r[u.y][u.x+1]=Math.random()>.5?S.SquareType.LIGHT_RED:S.SquareType.LIGHT_GREEN,u.traffic_light=r[u.y][u.x+1],u.traffic_light==S.SquareType.LIGHT_RED)){const t=Sk.TurtleGraphics.target.querySelector("#lightgreen");d3.select(t).remove(),i.append("image").attr("id","lightred").attr("x",(u.x+1)*k-5).attr("y",u.y*k+5).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/redlight.png")}var g=_();if("error2"==g)throw S.result=s,layer.alert("挑战失败,请检查是否通过所有标记点!",{shade:!1}),new Sk.builtin.TypeError("挑战失败,请检查是否通过所有标记点!");if("error3"==g)throw layer.alert("挑战失败,请修改后重新尝试!",{shade:!1}),new Sk.builtin.TypeError("挑战失败!请修改后重新尝试");t(Sk.builtin.none.none$)}),800)})))})),e.turn=new Sk.builtin.func((function(t,e,i){return Sk.builtin.pyCheckArgs("turn",arguments,3,3),Sk.builtin.pyCheckType("direction","string",Sk.builtin.checkString(e)),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){switch(function(t){return"right"==t?"right":"left"}(e=Sk.ffi.remapToJs(e))){case"left":I([u.x,u.y,4*u.direction],[u.x,u.y,4*u.direction-4]),u.direction=b(u.direction-1);break;case"right":I([u.x,u.y,4*u.direction],[u.x,u.y,4*u.direction+4]),u.direction=b(u.direction+1)}var r=/block_id=([\s\S]*)/.exec(i);null!=r&&(i=r[1],E(i)),t(Sk.builtin.none.none$)}),800)})))})),e.isDone=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("isDone",arguments,2,2),new Sk.misceval.promiseToSuspension(function(t){return new Promise((e=>{setTimeout((()=>{var i=/block_id=([\s\S]*)/.exec(t);null!=i&&(t=i[1],E(t)),E(t);var r=Sk.ffi.remapToPy(_());e(r)}),800)}))}(e).then((t=>Sk.ffi.remapToPy(t))))})),e.isPath=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("isPath",arguments,2,2),Sk.builtin.pyCheckType("direction","string",Sk.builtin.checkString(e)),e=Sk.ffi.remapToJs(e),new Sk.misceval.promiseToSuspension(function(t,e){return new Promise((i=>{setTimeout((()=>{var r="",a=/block_id=([\s\S]*)/.exec(e);switch(null!=a&&(e=a[1],E(e)),E(e),t){case"left":r=x(t=3,null);break;case"right":r=x(t=1,null)}i(Sk.ffi.remapToPy(r))}),800)}))}(e,block_id).then((t=>Sk.ffi.remapToPy(t))))})),e.isBarrier=new Sk.builtin.func((function(t,e,i){return Sk.builtin.pyCheckArgs("isBarrier",arguments,3,3),Sk.builtin.pyCheckType("direction","number",Sk.builtin.checkNumber(e)),e=Sk.ffi.remapToJs(e),new Sk.misceval.promiseToSuspension(function(t,e){return new Promise((i=>{setTimeout((()=>{var c,l=0,s=/block_id=([\s\S]*)/.exec(e);switch(null!=s&&(e=s[1],E(e)),E(e),t){case a:l=r[u.y-1]?r[u.y-1][u.x]:0;break;case n:l=r[u.y][u.x+1]?r[u.y][u.x+1]:0;break;case o:l=r[u.y+1]?r[u.y+1][u.x]:0;break;case p:l=r[u.y][u.x-1]?r[u.y][u.x-1]:0}c=l==S.SquareType.BARRIER,i(Sk.ffi.remapToPy(c))}),800)}))}(e,i).then((t=>Sk.ffi.remapToPy(t))))})),e.randomOil=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("randomOil",arguments,2,2),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){u.oil=Math.random()>.5?1:0,0==u.oil?i.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/none_oil.png"):1==u.oil&&i.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/full_oil.png");var r=/block_id=([\s\S]*)/.exec(e);null!=r&&(e=r[1],E(e)),t(Sk.builtin.none.none$)}),800)})))})),e.isOilFull=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("isOilFull",arguments,2,2),new Sk.misceval.promiseToSuspension(function(t){return new Promise((e=>{setTimeout((()=>{var i=/block_id=([\s\S]*)/.exec(t);null!=i&&(t=i[1],E(t)),E(t),0==u.oil?e(Sk.ffi.remapToPy(!0)):1==u.oil&&e(Sk.ffi.remapToPy(!1))}),800)}))}(e).then((t=>Sk.ffi.remapToPy(t))))})),e.addOil=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("addOil",arguments,2,2),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){i.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/full_oil.png"),u.oil=1;var r=/block_id=([\s\S]*)/.exec(e);null!=r&&(e=r[1],E(e)),t(Sk.builtin.none.none$)}),800)})))})),e.getPoint=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("getPoint",arguments,2,2),new Sk.misceval.promiseToSuspension(function(t){return new Promise((e=>{setTimeout((()=>{var i=/block_id=([\s\S]*)/.exec(t);null!=i&&(t=i[1],E(t)),E(t);var r=u.coin_point;e(Sk.ffi.remapToPy(r))}),800)}))}(e).then((t=>Sk.ffi.remapToPy(t))))})),e.isLightGreen=new Sk.builtin.func((function(t,e){return Sk.builtin.pyCheckArgs("isLightGreen",arguments,2,2),new Sk.misceval.promiseToSuspension(function(t){return new Promise((e=>{setTimeout((()=>{var i=/block_id=([\s\S]*)/.exec(t);null!=i&&(t=i[1],E(t)),E(t),u.traffic_light==S.SquareType.LIGHT_GREEN?e(Sk.ffi.remapToPy(!0)):u.traffic_light==S.SquareType.LIGHT_RED&&e(Sk.ffi.remapToPy(!1))}),800)}))}(e).then((t=>Sk.ffi.remapToPy(t))))})),e.isCirculationRight=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgs("isCirculationRight",arguments,1,1),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){var e=!1;switch(S.mlevel){case 5:e=3==u.circulation_num;break;case 7:if(u.traffic_light==S.SquareType.LIGHT_GREEN)e=!1;else if(u.traffic_light==S.SquareType.LIGHT_RED)for(var i=0;i0.5?1:5, 0, 0, 1, 0], + [0, 1, 1, 9, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 24, 1, 1, 24, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg2.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'../common/js/skulpt_mixcar/pic/barrier.png', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + BARRIER:5, + MARKER4:13, + S_F: 9,//既是起点又是终点 + INVIMAKER: 24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 4 + }, + //第四关 + { mlevel:4, + map:[ + [0, 1, 1, 13, 24, 1, 24, 0], + [20, 1, 0, Math.random()>0.5?1:5, 0, 0, 1, 0], + [0, 1, 1, 9, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 24, 1, 1, 24, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg3.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'../common/js/skulpt_mixcar/pic/barrier.png', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + BARRIER:5, + MARKER4:13, + S_F: 9,//既是起点又是终点 + OIL_STATION:20,//加油站 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 4 + }, + //第五关 + { mlevel:5, + map:[ + [0, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 0, 0, 0, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:[], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + S_F: 9,//既是起点又是终点 + TRAFFIC_LIGHT:21,//红绿灯 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:3,y:2}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + }, + //第六关 + { mlevel:6, + map:[ + [0, 1, 1, 13, 1, 1, 12, 0], + [0, 1, 0, 1, 0, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 10, 1, 1, 11, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + MARKER1:10, + MARKER2:11, + MARKER3:12, + MARKER4:13, + S_F: 9,//既是起点又是终点 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + }, + //第七关 + { mlevel:7, + map:[ + [0, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 0, 0, 0, 0, 1, 0], + [0, 1, 1, 2, 22, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg4.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:[], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + S_F: 9,//既是起点又是终点 + LIGHT_GREEN:22,//红绿灯中的绿灯 + LIGHT_RED:23,//红绿灯中的红灯 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:3,y:2}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + } + ] + + /** + * Display Pegman at the specified location, facing the specified direction. + * @param {number} x Horizontal grid (or fraction thereof). + * @param {number} y Vertical grid (or fraction thereof). + * @param {number} d Direction (0 - 15) or dance (16 - 17). + * @param {number=} opt_angle Optional angle (in degrees) to rotate Pegman. + */ + var displayPegman = function(x, y, d, opt_angle) { + var pegmanIcon = $(Sk.TurtleGraphics.target).find('#pegman'); + if(actor.type=='animate'){ + if(maze.type==0){ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE - d * actor.width+ 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 ); + }else{ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE - d * actor.width + 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 - 8); + } + if (opt_angle) { + pegmanIcon.attr('transform', 'rotate(' + opt_angle + ', ' + + (x * maze_SQUARE_SIZE + maze_SQUARE_SIZE / 2) + ', ' + + (y * maze_SQUARE_SIZE + maze_SQUARE_SIZE / 2) + ')'); + } else { + pegmanIcon.attr('transform', 'rotate(0, 0, 0)'); + } + }else{ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE + 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 ); + } + var clipRect = $(Sk.TurtleGraphics.target).find('#clipRect'); + clipRect.attr('x', x * maze_SQUARE_SIZE + 1); + clipRect.attr('y', pegmanIcon.attr('y')); + }; + + var initPegman=function(){ + // Pegman's clipPath element, whose (x, y) is reset by Maze.displayPegman + svg.append('clipPath').attr('id','pegmanClipPath') + const elem = Sk.TurtleGraphics.target.querySelector("#pegmanClipPath"); + d3.select(elem).append('rect').attr('id','clipRect').attr('width', actor.width).attr('height', actor.height) + + if(actor.type=="animate"){ + if(maze.type==0){ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width * 16).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + }else{ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width * 21).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + } + }else{ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width ).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + } + + displayPegman(actor.x , actor.y , actor.direction*4 ) + } + + var drawMap=function(){ + svg.attr('id','game_stage') + var scale = Math.max(maze_ROWS, maze_COLS) * maze_SQUARE_SIZE; + svg.attr('viewBox', '0 -10 ' + scale + ' ' + (scale+10)); + + // 绘制外框 + svg.append('rect').attr('x', 0).attr('y', 0).attr('width', maze.MAZE_WIDTH).attr('height', maze.MAZE_HEIGHT) + .style('fill','#F1EEE7').style('stroke','#CCB').style('stroke-width','1'); + + // for (var y = 0; y < maze_ROWS; y++) { + // for (var x = 0; x < maze_COLS; x++) { + // //绘制迷宫背景 + // svg.append('image').attr('x', x*maze_SQUARE_SIZE).attr('y', y*maze_SQUARE_SIZE).attr('width', maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + // .attr('xlink:href',maze.background) + // } + // } + svg.append('image').attr('x', 0).attr('y', 0).attr('width', maze_SQUARE_SIZE*maze_COLS).attr('height',maze_SQUARE_SIZE*maze_ROWS) + .attr('xlink:href',maze.background) + //初始化地图 + + var normalize = function(x, y) { + if (x < 0 || x >= maze_COLS || y < 0 || y >= maze_ROWS) { + return '0'; + } + return ((map[y][x] == maze.SquareType.WALL)||(map[y][x] == maze.SquareType.OIL_STATION)) ? '0' : '1'; + }; + // 依次判断格子的类型,并绘制相应格子内的图形 + var tileId = 0; + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + // 标记每个格子的“弯曲状态”. + var tileShape = normalize(x, y) + + normalize(x, y - 1) + // North. + normalize(x + 1, y) + // West. + normalize(x, y + 1) + // South. + normalize(x - 1, y); // East. + // 绘制路径. + if (!tile_SHAPES[tileShape]) { + // Empty square. Use null0 for large areas, with null1-4 for borders. + // Add some randomness to avoid large empty spaces. + if (tileShape == '00000' && Math.random() > 0.3) { + tileShape = 'null0'; + } else { + tileShape = 'null' + Math.floor(1 + Math.random() * 4); + } + } + var left = tile_SHAPES[tileShape][0]; + var top = tile_SHAPES[tileShape][1]; + // Tile's clipPath element. + svg.append('clipPath').attr('id','tileClipPath' + tileId) + const elem = Sk.TurtleGraphics.target.querySelector("#tileClipPath" + tileId); + d3.select(elem).append('rect').attr('x', x * maze_SQUARE_SIZE).attr('y', y * maze_SQUARE_SIZE).attr('width', maze_SQUARE_SIZE).attr('height', maze_SQUARE_SIZE) + if(maze.type==0){//非用户自定义 + // Tile sprite. + if ((map[y][x] != maze.SquareType.WALL) && (map[y][x] != maze.SquareType.OIL_STATION) && (map[y][x] != maze.SquareType.TRAFFIC_LIGHT)&& (map[y][x] != maze.SquareType.LIGHT_GREEN)&& (map[y][x] != maze.SquareType.LIGHT_RED)) { + svg.append('image').attr('x', x * maze_SQUARE_SIZE).attr('y', y * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE ).attr('height',maze_SQUARE_SIZE ) + .attr('clip-path', 'url(#tileClipPath' + tileId + ')').attr('xlink:href',maze.tiles); + tileId++; + } + }else{ + // Tile sprite. + svg.append('image').attr('x',(x - left) * maze_SQUARE_SIZE).attr('y',(y - top) * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE * 5).attr('height',maze_SQUARE_SIZE * 4) + .attr('clip-path', 'url(#tileClipPath' + tileId + ')').attr('xlink:href',maze.tiles) + tileId++; + } + + if(map[y][x]==0){//当地图中此处标记为墙时 + svg.append('image').attr('x',x * maze_SQUARE_SIZE + (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('width',maze_SQUARE_SIZE*0.8 ).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href',maze.wall) + }else if(map[y][x]==4){//当地图中此处标记为金币时 + svg.append('image').attr('id','coin'+y+x).attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.5/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.5/2)).attr('width',maze_SQUARE_SIZE*0.5).attr('height',maze_SQUARE_SIZE*0.5) + .attr('xlink:href',maze.award) + }else if(map[y][x]==5){//当地图中此处标记为障碍时 + svg.append('image').attr('id','barrier'+y+x).attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.barrier) + }else if(map[y][x]==10){//当地图中此处标记为符号1——红标时 + svg.append('image').attr('id','marker1').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[0]) + maze_marker_num+=1 + }else if(map[y][x]==11){//当地图中此处标记为符号2——橘标时 + svg.append('image').attr('id','marker2').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[1]) + maze_marker_num+=1 + }else if(map[y][x]==12){//当地图中此处标记为符号3——蓝标时 + svg.append('image').attr('id','marker3').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[2]) + maze_marker_num+=1 + }else if(map[y][x]==13){//当地图中此处标记为符号4——绿标时 + svg.append('image').attr('id','marker4').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[3]) + maze_marker_num+=1 + } + } + } + + if(maze.type==1){ + // 绘制终点图标 + svg.append('image').attr('id','finish').attr('width', 0.5 * maze_SQUARE_SIZE).attr('height', 0.5*maze_SQUARE_SIZE).attr('xlink:href',maze.marker) + //定位:精灵与终点初始的位置 + // Locate the start and finish squares. + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + if (map[y][x] == maze.SquareType.START) { + actor.x= x; + actor.y= y; + } else if (map[y][x] == maze.SquareType.FINISH) { + // Move the finish icon into position. + var finishIcon = $(Sk.TurtleGraphics.target).find('#finish'); + finishIcon.attr('x', maze_SQUARE_SIZE * (x + 0.5) - + finishIcon.attr('width') / 2); + finishIcon.attr('y', maze_SQUARE_SIZE * (y + 0.6) - + finishIcon.attr('height')); + maze.finish={x:x,y:y} + } + } + } + }else{ + //绘制既是起点、又是终点的坐标 + // Locate the start and finish squares. + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + if (map[y][x] == 9) {//既是起点又是终点 + // 绘制终点图标 + svg.append('image').attr('id','finish').attr('width', maze_SQUARE_SIZE*0.8).attr('height', maze_SQUARE_SIZE*0.8).attr('xlink:href',maze.marker) + actor.x= x; + actor.y= y; + var finishIcon = $(Sk.TurtleGraphics.target).find('#finish'); + finishIcon.attr('x', maze_SQUARE_SIZE * x+5 ); + finishIcon.attr('y', maze_SQUARE_SIZE * y+5); + maze.finish={x:x,y:y} + }else if(map[y][x]==20){//当地图中此处标记为20——加油站时 + svg.append('image').attr('id','station').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('width',maze_SQUARE_SIZE*2*0.8).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/oilstation.png') + }else if(map[y][x]==21){//当地图中此处标记为21——红绿灯时 + svg.append('image').attr('id','trafficlight').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/trafficlight.png') + }else if(map[y][x]==22){//当地图中此处标记为22——红绿灯中的绿灯时 + svg.append('image').attr('id','lightgreen').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/greenlight.png') + }else if(map[y][x]==23){//当地图中此处标记为23——红绿灯中的红灯时 + svg.append('image').attr('id','lightred').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/redlight.png') + }else if(map[y][x]==2){//当地图中此处标记为起点时,画上和“既是起点又是终点”一样的图标 + actor.x= x; + actor.y= y; + svg.append('image').attr('id','start').attr('x', maze_SQUARE_SIZE * x).attr('y',maze_SQUARE_SIZE * y+5).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href',maze.marker) + } + } + } + } + } + + //检查是否已到终点 + var checkFinish=function(){ + maze.result = actor.x != maze.finish.x || actor.y != maze.finish.y ? + ResultType.UNSET : ResultType.SUCCESS; + if(maze.result==ResultType.SUCCESS){ + if(maze.type==1){ + return true + }else{ + if(maze.mlevel==5 || maze.mlevel==7 ||maze.mlevel==6){ + return true + }else{ + if(actor.marker_num==maze_marker_num){ + if(actor.invisible_mark>=maze.INVIMNUM){ + return true + }else{return "error3"} + }else{return "error2"} + } + } + }else{ + return false + } + } + + /** + * Is there a path next to pegman? + * @param {number} direction Direction to look + * (0 = forward, 1 = right, 2 = backward, 3 = left). + * @param {?string} id ID of block that triggered this action. + * Null if called as a helper function in Maze.move(). + * @return {boolean} True if there is a path. + */ + var isPath=function(direction,id){ + var effectiveDirection = actor.direction + direction; + var square; + var command; + switch (constrainDirection4(effectiveDirection)) { + case DirectionType.NORTH: + square = map[actor.y - 1] && map[actor.y - 1][actor.x]; + command = 'look_north'; + break; + case DirectionType.EAST: + square = map[actor.y][actor.x + 1]; + command = 'look_east'; + break; + case DirectionType.SOUTH: + square = map[actor.y + 1] && map[actor.y + 1][actor.x]; + command = 'look_south'; + break; + case DirectionType.WEST: + square = map[actor.y][actor.x - 1]; + command = 'look_west'; + break; + } + if (id) { + return [command , square !== maze.SquareType.WALL && square !== undefined && square !== maze.SquareType.BARRIER && square !== maze.SquareType.OIL_STATION && square !== maze.SquareType.TRAFFIC_LIGHT && square !== maze.SquareType.LIGHT_RED && square !== maze.SquareType.LIGHT_GREEN] + } + return square !== maze.SquareType.WALL && square !== undefined && square !== maze.SquareType.BARRIER && square !== maze.SquareType.OIL_STATION && square !== maze.SquareType.TRAFFIC_LIGHT && square !== maze.SquareType.LIGHT_RED && square !== maze.SquareType.LIGHT_GREEN; + }; + + var constrainDirection4 = function(d) { + d = Math.round(d) % 4; + if (d < 0) { + d += 4; + } + return d; + }; + var constrainDirection16 = function(d) { + d = Math.round(d) % 16; + if (d < 0) { + d += 16; + } + return d; + }; + + /** + * Attempt to move pegman forward or backward. + * @param {number} direction Direction to move . + * @param {string} id ID of block that triggered this action. + * @throws {true} If the end of the maze is reached. + * @throws {false} If Pegman collides with a wall. + */ + var move = function(direction) { + if (!isPath(0, null)) { + return false + } + var command; + switch (constrainDirection4(direction)) { + case DirectionType.NORTH: + command = 'north'; + break; + case DirectionType.EAST: + command = 'east'; + break; + case DirectionType.SOUTH: + command = 'south'; + break; + case DirectionType.WEST: + command = 'west'; + break; + } + return command + }; + + /** + * Turn pegman left or right. + * @param {number} direction Direction to turn (0 = left, 1 = right). + * @param {string} id ID of block that triggered this action. + */ + var turn = function(direction) { + var command; + if (direction=='right') { + // Right turn (clockwise). + command='right' + } else { + // Left turn (counterclockwise). + command='left' + } + return command + }; + + /** + * Schedule the animations for a move or turn. + * @param {!Array.} startPos X, Y starting points. + * @param {!Array.} endPos X, Y ending points. + */ + var schedule = function(startPos, endPos) { + var deltas = [(endPos[0] - startPos[0]) / 4, (endPos[1] - startPos[1]) / 4, (endPos[2] - startPos[2]) / 4]; + displayPegman(startPos[0] + deltas[0], startPos[1] + deltas[1], constrainDirection16(startPos[2] + deltas[2])); + setTimeout(function() { + displayPegman(startPos[0] + deltas[0] * 2, startPos[1] + deltas[1] * 2, constrainDirection16(startPos[2] + deltas[2] * 2)); + }, actor.stepSpeed); + setTimeout(function() { + displayPegman(startPos[0] + deltas[0] * 3, startPos[1] + deltas[1] * 3, constrainDirection16(startPos[2] + deltas[2] * 3)); + }, actor.stepSpeed * 2) + setTimeout(function() { + displayPegman(endPos[0], endPos[1], constrainDirection16(endPos[2])); + }, actor.stepSpeed * 3) + }; + + /** + * 检查精灵在移动的过程中是否吃到了金币 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasCoin=function(x , y) { + if(map[y][x]==maze.SquareType.AWARD){//如果此处是金币 + setTimeout(function() { + $(Sk.TurtleGraphics.target).find('#coin'+y+x).remove() + }, actor.stepSpeed * 3) + map[y][x]=maze.SquareType.OPEN + actor.coin_point+=1 + } + } + + /** + * 检查精灵在移动的过程中是否走到了标记处 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasMarker=function(x , y) { + if((map[y][x]==maze.SquareType.MARKER1)||(map[y][x]==maze.SquareType.MARKER2)||(map[y][x]==maze.SquareType.MARKER3)||(map[y][x]==maze.SquareType.MARKER4)){//如果此处是标记 + actor.marker_num+=1 + } + } + + /** + * 检查精灵在移动的过程中是否走到不可见的标记点(INVIMAKER)处 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasInviMarker=function(x , y) { + if(map[y][x]==maze.SquareType.INVIMAKER){//如果此处是标记 + actor.invisible_mark+=1 + } + } + + //高亮辅助函数 + var highlight = function(id) { + id=Sk.ffi.remapToJs(id) + Mixly.Editor.blockEditor.highlightBlock(id); + }; + + /** + * 设置地图属性. + * + * @param {number} M_x为地图横向方格的数目(范围为3-10),初始默认为8 + * @param {number} M_y为地图竖向方格的数目(范围为3-10),初始默认为8 + * @param {string} startPos X, Y 起点位置的坐标. + * @param {string} endPos X, Y 终点位置的坐标 + * @param {string} bg_pic为地图背景的图片 + */ + var setMap_f=function( M_x , M_y , startPos , endPos , bg_pic) { + Sk.builtin.pyCheckArgs("setMap", arguments, 5, 5); + map=[] + if(bg_pic=='无可用地图'){ + bg_pic="" + } + if((M_x<3) || (M_x>20) || (M_y<3) || (M_y>20)){ + throw new Sk.builtin.TypeError("错误!超出地图可设置范围,请设置横纵方格数大于等于3,小于等于20"); + } + M_x = Sk.ffi.remapToJs(M_x); + M_y = Sk.ffi.remapToJs(M_y); + maze_COLS=M_x; + maze_ROWS=M_y; + maze.MAZE_WIDTH= maze_SQUARE_SIZE * maze_COLS; + maze.MAZE_HEIGHT=maze_SQUARE_SIZE * maze_ROWS; + + startPos =Sk.ffi.remapToJs(startPos) + endPos =Sk.ffi.remapToJs(endPos) + + switch (Sk.ffi.remapToJs(bg_pic)){ + case "bg_default": + maze.background ='../common/js/skulpt_mixcar/pic/bg_default.png';//默认为方格 + break; + case "bg_astro": + maze.background ='../common/js/skulpt_mixcar/pic/bg_astro.jpg';//设置为管道 + break; + case "bg_panda": + maze.background ='../common/js/skulpt_mixcar/pic/bg_panda.jpg';//设置为竹子 + break; + } + + var re=/\((\d+),(\d+)\)/.exec(startPos); + if(re!=null){ + if((re[1]>M_x) || (re[1]<1) || (re[2]>M_y) || (re[2]<1)){ + throw new Sk.builtin.TypeError("错误!起点坐标超出地图范围!"); + } + } + var re=/\((\d+),(\d+)\)/.exec(endPos); + if(re!=null){ + if((re[1]>M_x) || (re[1]<1) || (re[2]>M_y) || (re[2]<1)){ + throw new Sk.builtin.TypeError("错误!终点坐标超出地图范围!"); + } + } + + for (var i=0; i(map[0].length)) || (Pos_x< 0) || (Pos_y>(map.length)) || (Pos_y< 0)){ + throw new Sk.builtin.TypeError("错误!放置物坐标超过地图范围"); + } + + switch(type){ + case "wall"://墙:障碍 + map[Pos_y-1][Pos_x-1]=maze.SquareType.WALL; + break; + case "coin": + map[Pos_y-1][Pos_x-1]=maze.SquareType.AWARD; + break; + } + } + mod.placeItem = new Sk.builtin.func(placeItem_f); + + /** + * 初始化地图 + */ + var initMap_f=function() { + drawMap() + } + mod.initMap = new Sk.builtin.func(initMap_f); + + + var isDone = function(block_id) { + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id) + var isdone= Sk.ffi.remapToPy(checkFinish()); + resolve(isdone); + }, 800); + }) + } + + var isPathCheck=function(direction,block_id) { + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var state=""; + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id); + switch (direction) { + case 'left': + direction= 3 + state=isPath(direction, null) + break; + case 'right': + direction= 1 + state=isPath(direction, null) + break; + }; + resolve(Sk.ffi.remapToPy(state)); + }, 800); + }) + } + + var isBarrierCheck=function(direction,block_id) { + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var state=false; + var square=0; + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id); + switch (direction) { + case DirectionType.NORTH: + if(map[actor.y - 1]){ + square = map[actor.y - 1][actor.x]; + }else{ + square = 0 + } + break; + case DirectionType.EAST: + if(map[actor.y][actor.x + 1]){ + square = map[actor.y][actor.x + 1]; + }else{ + square = 0 + } + break; + case DirectionType.SOUTH: + if(map[actor.y + 1]){ + square = map[actor.y + 1][actor.x]; + }else{ + square = 0 + } + break; + case DirectionType.WEST: + if(map[actor.y][actor.x - 1]){ + square = map[actor.y][actor.x - 1]; + }else{ + square = 0 + } + break; + }; + state= square == maze.SquareType.BARRIER; + resolve(Sk.ffi.remapToPy(state)); + }, 800); + }) + } + + var isOilFullCheck=function(block_id) { + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var state=false; + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id); + if(actor.oil==0){//没油了,返回需要加油为True + resolve(Sk.ffi.remapToPy(true)); + }else if(actor.oil==1){//还有油,返回需要加油为False + resolve(Sk.ffi.remapToPy(false)); + } + }, 800); + }) + } + + var getpoint= function(block_id){ + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id) + var point= actor.coin_point; + resolve(Sk.ffi.remapToPy(point)); + }, 800); + }) + } + + var checkLightGreen=function(block_id){ + return new Promise((resolve) => { + // Do things + setTimeout( () => { + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + highlight(block_id) + if(actor.traffic_light==maze.SquareType.LIGHT_GREEN){//绿灯,返回 true + resolve(Sk.ffi.remapToPy(true)); + }else if(actor.traffic_light==maze.SquareType.LIGHT_RED){//红灯,返回false + resolve(Sk.ffi.remapToPy(false)); + } + }, 800); + }) + } + + mod.Actor = Sk.misceval.buildClass(mod, function($gbl, $loc) { + $loc.__init__ = new Sk.builtin.func(function(self,img , direction ,block_id) { + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + img= Sk.ffi.remapToJs(img) || 'pegman'; + if(img=='无可用角色'){ + img='pegman'; + } + switch (img){ + case "pegman": + actor.img='../common/js/skulpt_mixcar/pic/pegman.png';//默认为方格 + actor.type="animate" + break; + case "panda": + actor.img='../common/js/skulpt_mixcar/pic/panda.png';//设置为管道 + actor.type="animate" + break; + case "astro": + actor.img='../common/js/skulpt_mixcar/pic/astro.png';//设置为竹子 + actor.type="animate" + break; + case "robot": + actor.img='../common/js/skulpt_mixcar/pic/robot.png';//设置为机器人 + actor.type="still" + break; + case "car": + actor.img='../common/js/skulpt_mixcar/pic/actor_car3.png';//设置为小车 + actor.type="animate" + break; + } + + actor.direction = Sk.ffi.remapToJs(direction) || DirectionType.NORTH; + size=[52,49]//[height,width]//size需要根据方格的数目来确定 + actor.coin_point=0 + + //高亮效果 + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + initPegman() + resolve(Sk.builtin.none.none$); + }, 800); + })); + + }); + //向某个方向移动移动 + //暂时只实现了移动一步 + //func: Actor.moveDirection() + $loc.moveDirection=new Sk.builtin.func(function(self,direction,block_id) { + Sk.builtin.pyCheckArgs("moveDirection", arguments, 3,3); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + actor.direction = parseInt(Sk.ffi.remapToJs(direction)); + var command= move(direction) //向某个方向移动 + if(command==false){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败!请修改后重新尝试", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!请修改后重新尝试"); + } + + if(maze.mlevel==4){//如果是第四关,则需要判断是否需要加油的问题 + //如果左侧存在加油站 + // if((map[actor.y - 1][actor.x])==maze.SquareType.OIL_STATION||(map[actor.y + 1][actor.x])==maze.SquareType.OIL_STATION||(map[actor.y ][actor.x-1])==maze.SquareType.OIL_STATION||(map[actor.y ][actor.x+1])==maze.SquareType.OIL_STATION){ + if((map[actor.y][actor.x-1])==maze.SquareType.OIL_STATION){ + if(actor.oil==0){//在加油站处,如果没有油还想继续往前面走 + maze.result=ResultType.FAILURE + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/no_oil.png') + layer.alert("挑战失败!小车没有油了", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!小车没有油了"); + } + } + }else if(maze.mlevel==5){//如果是第五关,则需要记录循环次数;每次经过起点处循环次数+1 + if((map[actor.y][actor.x])==maze.SquareType.START){ + actor.circulation_num+=1; + } + }else if(maze.mlevel==7){//如果是第七关,则需要判断红绿灯是否为绿灯的问题 + if(actor.traffic_light==maze.SquareType.LIGHT_RED){ + layer.alert("挑战失败:小车在红灯亮时还未停止!", { shade: false }); + throw new Sk.builtin.TypeError("挑战失败:小车在红灯亮时还未停止!"); + } + } + + switch (command) { + case 'north': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x, actor.y - 1, actor.direction * 4]); + actor.y--; + break; + case 'east': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x + 1, actor.y, actor.direction * 4]); + actor.x++; + break; + case 'south': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x, actor.y + 1, actor.direction * 4]); + actor.y++; + break; + case 'west': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x - 1, actor.y, actor.direction * 4]); + actor.x--; + break; + } + + //高亮效果 + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + + hasCoin(actor.x,actor.y) + hasMarker(actor.x,actor.y) + hasInviMarker(actor.x,actor.y) + if(maze.mlevel==7){//如果是第七关,则需要随机改变红绿灯的颜色 + if((map[actor.y][actor.x+1])==maze.SquareType.LIGHT_RED || (map[actor.y][actor.x+1])==maze.SquareType.LIGHT_GREEN){ + map[actor.y][actor.x+1]=Math.random()>0.5? maze.SquareType.LIGHT_RED:maze.SquareType.LIGHT_GREEN;//随机刷新红绿灯的状态 + actor.traffic_light=map[actor.y][actor.x+1]; + if(actor.traffic_light==maze.SquareType.LIGHT_RED){//图像变为红灯 + const elem = Sk.TurtleGraphics.target.querySelector("#lightgreen"); + d3.select(elem).remove(); + svg.append('image').attr('id','lightred').attr('x',(actor.x+1) * maze_SQUARE_SIZE-5).attr('y',actor.y * maze_SQUARE_SIZE+5).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/redlight.png') + } + } + } + + var state=checkFinish() + if(state=="error2"){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查是否通过所有标记点!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查是否通过所有标记点!"); + }else if(state=="error3"){ + layer.alert("挑战失败,请修改后重新尝试!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!请修改后重新尝试"); + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + $loc.turn=new Sk.builtin.func(function(self,direction,block_id){ + Sk.builtin.pyCheckArgs("turn", arguments, 3, 3); + Sk.builtin.pyCheckType("direction", "string", Sk.builtin.checkString(direction)); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + direction=Sk.ffi.remapToJs(direction) + var command=turn(direction) + switch (command) { + case 'left': + schedule([actor.x, actor.y, actor.direction * 4], [actor.x, actor.y, actor.direction * 4 - 4]); + actor.direction = constrainDirection4(actor.direction - 1); + break; + case 'right': + schedule([actor.x, actor.y, actor.direction * 4], [actor.x, actor.y, actor.direction * 4 + 4]); + actor.direction = constrainDirection4(actor.direction + 1); + break; + } + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + $loc.isDone=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("isDone", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(isDone(block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + $loc.isPath=new Sk.builtin.func(function(self,direction){ + Sk.builtin.pyCheckArgs("isPath", arguments, 2, 2); + Sk.builtin.pyCheckType("direction", "string", Sk.builtin.checkString(direction)); + direction=Sk.ffi.remapToJs(direction) + return new Sk.misceval.promiseToSuspension(isPathCheck(direction,block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + //判断某个方向是否存在障碍物 + $loc.isBarrier=new Sk.builtin.func(function(self,direction,block_id){ + Sk.builtin.pyCheckArgs("isBarrier", arguments, 3, 3); + Sk.builtin.pyCheckType("direction", "number", Sk.builtin.checkNumber(direction)); + direction=Sk.ffi.remapToJs(direction) + return new Sk.misceval.promiseToSuspension(isBarrierCheck(direction,block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + //随机生成小车油量 + $loc.randomOil=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("randomOil", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + actor.oil=Math.random()>0.5?1:0;//随机初始化汽车的油量 + if(actor.oil==0){//没油(呈现少量油的图片) + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/none_oil.png') + }else if(actor.oil==1){//油量充足(呈现油量充足的图片) + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/full_oil.png') + } + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + //判断是否需要加油 + $loc.isOilFull=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("isOilFull", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(isOilFullCheck(block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + //进加油站加油 + $loc.addOil=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("addOil", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/full_oil.png') + actor.oil=1//油量充足 + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + //获取角色当前的分数 + $loc.getPoint=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("getPoint", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(getpoint(block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + //判断信号灯是否为绿灯? + $loc.isLightGreen=new Sk.builtin.func(function(self,block_id){ + Sk.builtin.pyCheckArgs("isLightGreen", arguments, 2, 2); + return new Sk.misceval.promiseToSuspension(checkLightGreen(block_id).then((r) => Sk.ffi.remapToPy(r))); + }); + //检查循环的次数是否正确 + $loc.isCirculationRight=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isCirculationRight", arguments, 1, 1); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + var mlevel=maze.mlevel;//获取当前关卡序数 + var state=false; + switch (mlevel){ + case 5://第五关 + state=actor.circulation_num==3?true:false; + break; + case 7://第七关 + if(actor.traffic_light==maze.SquareType.LIGHT_GREEN){//如果是绿灯,则怎么都算失败 + state=false; + }else if(actor.traffic_light==maze.SquareType.LIGHT_RED){//如果是红灯 + for (var y = 0; y < maze.map.length; y++) { + for (var x = 0; x < maze.map[0].length; x++) { + if(maze.map[y][x]==maze.SquareType.LIGHT_RED){ + if((actor.x+1)==x|| (actor.y)==y){//如果小车停的位置在红绿灯的左边,则挑战成功 + state=true; + } + } + } + } + } + break; + } + if(state==false){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查循环次数是否正确!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查循环次数是否正确!"); + }else{ + maze.result=ResultType.SUCCESS + resolve(Sk.builtin.none.none$); + } + }, 800); + })) + }); + //检查是否挑战成功 + $loc.isSuccess=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isSuccess", arguments, 1,1); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + var state=checkFinish() + if(state==true){ + setTimeout(function() { + layer.alert("挑战成功!", { shade: false }); + },1000) + resolve(Sk.builtin.none.none$); + }else if(state==false){//没有到达终点就游戏结束,或者超过了终点 + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查是否到达终点!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查是否到达终点!"); + } + })) + }) + + }, "Actor") + + /** + * 初始化为设定好的地图 + * + * @param {number} level 初始化地图,level为地图的等级. + * @param {string} block_id 图形块ID. + */ + var settedMap_f=function(level,block_id) { + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + //高亮效果 + var re=/block_id=([\s\S]*)/.exec(block_id) + if(re!=null){ + block_id=re[1]; + highlight(block_id) + } + level=Sk.ffi.remapToJs(level) + maze=MAZE_setted[level] + map=MAZE_setted[level].map + drawMap() + resolve(Sk.builtin.none.none$); + }, 800); + })); + } + mod.settedMap = new Sk.builtin.func(settedMap_f); + + return mod; +} \ No newline at end of file diff --git a/boards/default/python_skulpt_car/bg_nonehl_8ade5557.js b/boards/default/python_skulpt_car/bg_nonehl_8ade5557.js deleted file mode 100644 index 800905a9..00000000 --- a/boards/default/python_skulpt_car/bg_nonehl_8ade5557.js +++ /dev/null @@ -1 +0,0 @@ -var $builtinmodule=function(t){let r={__name__:new Sk.builtin.str("bg_nonehl")};var e=d3.select(Sk.TurtleGraphics.target).append("svg"),i=[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,2,1,1,1,1,3,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],a=0,n=1,p=2,c=3,l=0,o=1,s=-1,m={10010:[4,0],10001:[3,3],11e3:[0,1],10100:[0,2],11010:[4,1],10101:[3,2],10110:[0,0],10011:[2,0],11001:[4,2],11100:[2,3],11110:[1,1],10111:[1,0],11011:[2,1],11101:[1,2],11111:[2,2],null0:[4,3],null1:[3,0],null2:[3,1],null3:[0,3],null4:[1,3]},u={img:"../common/js/skulpt_mixcar/pic/pegman.png",height:52,width:49,direction:n,type:"animate",x:0,y:0,stepSpeed:150,coin_point:0,marker_num:0,oil:1,traffic_light:22,circulation_num:0,invisible_mark:0},k=50,h=i.length,g=i[0].length,f=0,y={mlevel:0,tiles:"../common/js/skulpt_mixcar/pic/maze_path.png",marker:"../common/js/skulpt_mixcar/pic/marker.png",background:"../common/js/skulpt_mixcar/pic/bg_astro.jpg",wall:"../common/js/skulpt_mixcar/pic/roadblock.png",award:"../common/js/skulpt_mixcar/pic/award.png",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,FINISH:3,AWARD:4,INVIMAKER:24},MAZE_WIDTH:k*g,MAZE_HEIGHT:k*h,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:1,INVIMNUM:0},d=[{mlevel:1,map:[[0,1,1,13,1,1,12,0],[0,1,0,1,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg1.jpg",wall:"",award:"",barrier:"",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:2,map:[[0,1,1,13,1,1,12,0],[0,1,0,5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg2.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:3,map:[[0,1,1,13,24,1,24,0],[0,1,0,Math.random()>.5?1:5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,24,1,1,24,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg2.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:0,INVIMNUM:4},{mlevel:4,map:[[0,1,1,13,24,1,24,0],[20,1,0,Math.random()>.5?1:5,0,0,1,0],[0,1,1,9,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,24,1,1,24,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg3.jpg",wall:"",award:"",barrier:"../common/js/skulpt_mixcar/pic/barrier.png",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,BARRIER:5,MARKER4:13,S_F:9,OIL_STATION:20,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:0,INVIMNUM:4},{mlevel:5,map:[[0,1,1,1,1,1,1,0],[0,1,0,0,0,0,1,0],[0,1,1,2,21,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,1,1,1,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg4.jpg",wall:"",award:"",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,S_F:9,TRAFFIC_LIGHT:21,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:3,y:2},type:0,INVIMNUM:0},{mlevel:6,map:[[0,1,1,13,1,1,12,0],[0,1,0,1,0,0,1,0],[0,1,1,2,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,10,1,1,11,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg1.jpg",wall:"",award:"",barrier:"",markers:["../common/js/skulpt_mixcar/pic/red.png","../common/js/skulpt_mixcar/pic/yellow.png","../common/js/skulpt_mixcar/pic/blue.png","../common/js/skulpt_mixcar/pic/green.png"],SquareType:{WALL:0,OPEN:1,START:2,MARKER1:10,MARKER2:11,MARKER3:12,MARKER4:13,S_F:9,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:0,y:0},type:0,INVIMNUM:0},{mlevel:7,map:[[0,1,1,1,1,1,1,0],[0,1,0,0,0,0,1,0],[0,1,1,2,22,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,0,0,1,0],[0,0,0,1,1,1,1,0],[0,0,0,0,0,0,0,0]],tiles:"../common/js/skulpt_mixcar/pic/tiles_road.png",marker:"../common/js/skulpt_mixcar/pic/Start_final.png",background:"../common/js/skulpt_mixcar/pic/bg4.jpg",wall:"",award:"",barrier:"",markers:[],SquareType:{WALL:0,OPEN:1,START:2,S_F:9,LIGHT_GREEN:22,LIGHT_RED:23,INVIMAKER:24},MAZE_WIDTH:400,MAZE_HEIGHT:400,PATH_WIDTH:16.666666666666668,result:l,finish:{x:3,y:2},type:0,INVIMNUM:0}],T=function(t,r,e,i){var a=$(Sk.TurtleGraphics.target).find("#pegman");"animate"==u.type?(0==y.type?(a.attr("x",t*k-e*u.width+1),a.attr("y",k*(r+.5)-u.height/2)):(a.attr("x",t*k-e*u.width+1),a.attr("y",k*(r+.5)-u.height/2-8)),i?a.attr("transform","rotate("+i+", "+(t*k+25)+", "+(r*k+25)+")"):a.attr("transform","rotate(0, 0, 0)")):(a.attr("x",t*k+1),a.attr("y",k*(r+.5)-u.height/2));var n=$(Sk.TurtleGraphics.target).find("#clipRect");n.attr("x",t*k+1),n.attr("y",a.attr("y"))},S=function(){e.attr("id","game_stage");var t=Math.max(h,g)*k;e.attr("viewBox","0 -10 "+t+" "+(t+10)),e.append("rect").attr("x",0).attr("y",0).attr("width",y.MAZE_WIDTH).attr("height",y.MAZE_HEIGHT).style("fill","#F1EEE7").style("stroke","#CCB").style("stroke-width","1"),e.append("image").attr("x",0).attr("y",0).attr("width",k*g).attr("height",k*h).attr("xlink:href",y.background);for(var r=function(t,r){return t<0||t>=g||r<0||r>=h||i[r][t]==y.SquareType.WALL||i[r][t]==y.SquareType.OIL_STATION?"0":"1"},a=0,n=0;n.3?"null0":"null"+Math.floor(1+4*Math.random()));var l=m[c][0],o=m[c][1];e.append("clipPath").attr("id","tileClipPath"+a);const t=Sk.TurtleGraphics.target.querySelector("#tileClipPath"+a);d3.select(t).append("rect").attr("x",p*k).attr("y",n*k).attr("width",k).attr("height",k),0==y.type?i[n][p]!=y.SquareType.WALL&&i[n][p]!=y.SquareType.OIL_STATION&&i[n][p]!=y.SquareType.TRAFFIC_LIGHT&&i[n][p]!=y.SquareType.LIGHT_GREEN&&i[n][p]!=y.SquareType.LIGHT_RED&&(e.append("image").attr("x",p*k).attr("y",n*k).attr("width",k).attr("height",k).attr("clip-path","url(#tileClipPath"+a+")").attr("xlink:href",y.tiles),a++):(e.append("image").attr("x",(p-l)*k).attr("y",(n-o)*k).attr("width",250).attr("height",200).attr("clip-path","url(#tileClipPath"+a+")").attr("xlink:href",y.tiles),a++),0==i[n][p]?e.append("image").attr("x",p*k+5).attr("y",n*k+5).attr("width",40).attr("height",40).attr("xlink:href",y.wall):4==i[n][p]?e.append("image").attr("id","coin"+n+p).attr("x",p*k+12.5).attr("y",n*k+12.5).attr("width",25).attr("height",25).attr("xlink:href",y.award):5==i[n][p]?e.append("image").attr("id","barrier"+n+p).attr("x",p*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",y.barrier):10==i[n][p]?(e.append("image").attr("id","marker1").attr("x",p*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",y.markers[0]),f+=1):11==i[n][p]?(e.append("image").attr("id","marker2").attr("x",p*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",y.markers[1]),f+=1):12==i[n][p]?(e.append("image").attr("id","marker3").attr("x",p*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",y.markers[2]),f+=1):13==i[n][p]&&(e.append("image").attr("id","marker4").attr("x",p*k+7.5).attr("y",n*k+7.5).attr("width",35).attr("height",35).attr("xlink:href",y.markers[3]),f+=1)}if(1==y.type){e.append("image").attr("id","finish").attr("width",25).attr("height",25).attr("xlink:href",y.marker);for(n=0;n=y.INVIMNUM||"error3":"error2")))},x=function(t,r){var e,l,o=u.direction+t;switch(b(o)){case a:e=i[u.y-1]&&i[u.y-1][u.x],l="look_north";break;case n:e=i[u.y][u.x+1],l="look_east";break;case p:e=i[u.y+1]&&i[u.y+1][u.x],l="look_south";break;case c:e=i[u.y][u.x-1],l="look_west"}return r?[l,e!==y.SquareType.WALL&&void 0!==e&&e!==y.SquareType.BARRIER&&e!==y.SquareType.OIL_STATION&&e!==y.SquareType.TRAFFIC_LIGHT&&e!==y.SquareType.LIGHT_RED&&e!==y.SquareType.LIGHT_GREEN]:e!==y.SquareType.WALL&&void 0!==e&&e!==y.SquareType.BARRIER&&e!==y.SquareType.OIL_STATION&&e!==y.SquareType.TRAFFIC_LIGHT&&e!==y.SquareType.LIGHT_RED&&e!==y.SquareType.LIGHT_GREEN},b=function(t){return(t=Math.round(t)%4)<0&&(t+=4),t},w=function(t){return(t=Math.round(t)%16)<0&&(t+=16),t},I=function(t,r){var e=[(r[0]-t[0])/4,(r[1]-t[1])/4,(r[2]-t[2])/4];T(t[0]+e[0],t[1]+e[1],w(t[2]+e[2])),setTimeout((function(){T(t[0]+2*e[0],t[1]+2*e[1],w(t[2]+2*e[2]))}),u.stepSpeed),setTimeout((function(){T(t[0]+3*e[0],t[1]+3*e[1],w(t[2]+3*e[2]))}),2*u.stepSpeed),setTimeout((function(){T(r[0],r[1],w(r[2]))}),3*u.stepSpeed)};r.setMap=new Sk.builtin.func((function(t,r,e,a,n){if(Sk.builtin.pyCheckArgs("setMap",arguments,5,5),i=[],"无可用地图"==n&&(n=""),t<3||t>20||r<3||r>20)throw new Sk.builtin.TypeError("错误!超出地图可设置范围,请设置横纵方格数大于等于3,小于等于20");switch(t=Sk.ffi.remapToJs(t),r=Sk.ffi.remapToJs(r),g=t,h=r,y.MAZE_WIDTH=k*g,y.MAZE_HEIGHT=k*h,e=Sk.ffi.remapToJs(e),a=Sk.ffi.remapToJs(a),Sk.ffi.remapToJs(n)){case"bg_default":y.background="../common/js/skulpt_mixcar/pic/bg_default.png";break;case"bg_astro":y.background="../common/js/skulpt_mixcar/pic/bg_astro.jpg";break;case"bg_panda":y.background="../common/js/skulpt_mixcar/pic/bg_panda.jpg"}var p;if(null!=(p=/\((\d+),(\d+)\)/.exec(e))&&(p[1]>t||p[1]<1||p[2]>r||p[2]<1))throw new Sk.builtin.TypeError("错误!起点坐标超出地图范围!");if(null!=(p=/\((\d+),(\d+)\)/.exec(a))&&(p[1]>t||p[1]<1||p[2]>r||p[2]<1))throw new Sk.builtin.TypeError("错误!终点坐标超出地图范围!");for(var c=0;ci[0].length||t<0||r>i.length||r<0)throw new Sk.builtin.TypeError("错误!放置物坐标超过地图范围");switch(e){case"wall":i[r-1][t-1]=y.SquareType.WALL;break;case"coin":i[r-1][t-1]=y.SquareType.AWARD}}));r.initMap=new Sk.builtin.func((function(){S()})),r.Actor=Sk.misceval.buildClass(r,(function(t,r){r.__init__=new Sk.builtin.func((function(t,r,i){switch("无可用角色"==(r=Sk.ffi.remapToJs(r)||"pegman")&&(r="pegman"),r){case"pegman":u.img="../common/js/skulpt_mixcar/pic/pegman.png",u.type="animate";break;case"panda":u.img="../common/js/skulpt_mixcar/pic/panda.png",u.type="animate";break;case"astro":u.img="../common/js/skulpt_mixcar/pic/astro.png",u.type="animate";break;case"robot":u.img="../common/js/skulpt_mixcar/pic/robot.png",u.type="still";break;case"car":u.img="../common/js/skulpt_mixcar/pic/actor_car3.png",u.type="animate"}u.direction=Sk.ffi.remapToJs(i)||a,size=[52,49],u.coin_point=0,function(){e.append("clipPath").attr("id","pegmanClipPath");const t=Sk.TurtleGraphics.target.querySelector("#pegmanClipPath");d3.select(t).append("rect").attr("id","clipRect").attr("width",u.width).attr("height",u.height),"animate"==u.type?0==y.type?e.append("image").attr("id","pegman").attr("width",16*u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img):e.append("image").attr("id","pegman").attr("width",21*u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img):e.append("image").attr("id","pegman").attr("width",u.width).attr("height",u.height).attr("clip-path","url(#pegmanClipPath)").attr("xlink:href",u.img),T(u.x,u.y,4*u.direction)}()})),r.moveDirection=new Sk.builtin.func((function(t,r){return Sk.builtin.pyCheckArgs("moveDirection",arguments,2,2),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){u.direction=parseInt(Sk.ffi.remapToJs(r));var l,o,m=function(t){if(!x(0,null))return!1;var r;switch(b(t)){case a:r="north";break;case n:r="east";break;case p:r="south";break;case c:r="west"}return r}(r);if(0==m)throw y.result=s,layer.alert("挑战失败!请修改后重新尝试",{shade:!1}),new Sk.builtin.TypeError("挑战失败!请修改后重新尝试");if(4==y.mlevel){if(i[u.y][u.x-1]==y.SquareType.OIL_STATION&&0==u.oil)throw y.result=s,e.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/no_oil.png"),layer.alert("挑战失败!小车没有油了",{shade:!1}),new Sk.builtin.TypeError("挑战失败!小车没有油了")}else if(5==y.mlevel)i[u.y][u.x]==y.SquareType.START&&(u.circulation_num+=1);else if(7==y.mlevel&&u.traffic_light==y.SquareType.LIGHT_RED)throw layer.alert("挑战失败:小车在红灯亮时还未停止!",{shade:!1}),new Sk.builtin.TypeError("挑战失败:小车在红灯亮时还未停止!");switch(m){case"north":I([u.x,u.y,4*u.direction],[u.x,u.y-1,4*u.direction]),u.y--;break;case"east":I([u.x,u.y,4*u.direction],[u.x+1,u.y,4*u.direction]),u.x++;break;case"south":I([u.x,u.y,4*u.direction],[u.x,u.y+1,4*u.direction]),u.y++;break;case"west":I([u.x,u.y,4*u.direction],[u.x-1,u.y,4*u.direction]),u.x--}if(l=u.x,o=u.y,i[o][l]==y.SquareType.AWARD&&(setTimeout((function(){$(Sk.TurtleGraphics.target).find("#coin"+o+l).remove()}),3*u.stepSpeed),i[o][l]=y.SquareType.OPEN,u.coin_point+=1),function(t,r){i[r][t]!=y.SquareType.MARKER1&&i[r][t]!=y.SquareType.MARKER2&&i[r][t]!=y.SquareType.MARKER3&&i[r][t]!=y.SquareType.MARKER4||(u.marker_num+=1)}(u.x,u.y),function(t,r){i[r][t]==y.SquareType.INVIMAKER&&(u.invisible_mark+=1)}(u.x,u.y),7==y.mlevel&&(i[u.y][u.x+1]==y.SquareType.LIGHT_RED||i[u.y][u.x+1]==y.SquareType.LIGHT_GREEN)&&(i[u.y][u.x+1]=Math.random()>.5?y.SquareType.LIGHT_RED:y.SquareType.LIGHT_GREEN,u.traffic_light=i[u.y][u.x+1],u.traffic_light==y.SquareType.LIGHT_RED)){const t=Sk.TurtleGraphics.target.querySelector("#lightgreen");d3.select(t).remove(),e.append("image").attr("id","lightred").attr("x",(u.x+1)*k-5).attr("y",u.y*k+5).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/redlight.png")}var h=_();if("error2"==h)throw y.result=s,layer.alert("挑战失败,请检查是否通过所有标记点!",{shade:!1}),new Sk.builtin.TypeError("挑战失败,请检查是否通过所有标记点!");if("error3"==h)throw layer.alert("挑战失败,请修改后重新尝试!",{shade:!1}),new Sk.builtin.TypeError("挑战失败!请修改后重新尝试");t(Sk.builtin.none.none$)}),800)})))})),r.turn=new Sk.builtin.func((function(t,r){return Sk.builtin.pyCheckArgs("turn",arguments,2,2),Sk.builtin.pyCheckType("direction","string",Sk.builtin.checkString(r)),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){switch(function(t){return"right"==t?"right":"left"}(r=Sk.ffi.remapToJs(r))){case"left":I([u.x,u.y,4*u.direction],[u.x,u.y,4*u.direction-4]),u.direction=b(u.direction-1);break;case"right":I([u.x,u.y,4*u.direction],[u.x,u.y,4*u.direction+4]),u.direction=b(u.direction+1)}t(Sk.builtin.none.none$)}),800)})))})),r.isDone=new Sk.builtin.func((function(t){Sk.builtin.pyCheckArgs("isDone",arguments,1,1);var r=Sk.ffi.remapToPy(_());return new Sk.ffi.remapToPy(r)})),r.isPath=new Sk.builtin.func((function(t,r){Sk.builtin.pyCheckArgs("isPath",arguments,2,2),Sk.builtin.pyCheckType("direction","string",Sk.builtin.checkString(r));var e="";switch(r=Sk.ffi.remapToJs(r)){case"left":e=x(r=3,null);break;case"right":e=x(r=1,null)}return Sk.ffi.remapToPy(e)})),r.isBarrier=new Sk.builtin.func((function(t,r){Sk.builtin.pyCheckArgs("isBarrier",arguments,2,2),Sk.builtin.pyCheckType("direction","number",Sk.builtin.checkNumber(r));var e,l=0;switch(r=Sk.ffi.remapToJs(r)){case a:l=i[u.y-1]?i[u.y-1][u.x]:0;break;case n:l=i[u.y][u.x+1]?i[u.y][u.x+1]:0;break;case p:l=i[u.y+1]?i[u.y+1][u.x]:0;break;case c:l=i[u.y][u.x-1]?i[u.y][u.x-1]:0}return e=l==y.SquareType.BARRIER,Sk.ffi.remapToPy(e)})),r.randomOil=new Sk.builtin.func((function(t){Sk.builtin.pyCheckArgs("randomOil",arguments,1,1),u.oil=Math.random()>.5?1:0,0==u.oil?e.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/none_oil.png"):1==u.oil&&e.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/full_oil.png")})),r.isOilFull=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgs("isOilFull",arguments,1,1),0==u.oil?Sk.ffi.remapToPy(!0):1==u.oil?Sk.ffi.remapToPy(!1):void 0})),r.addOil=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgs("addOil",arguments,1,1),new Sk.misceval.promiseToSuspension(new Promise((function(t){Sk.setTimeout((function(){e.append("image").attr("id","caroil").attr("x",k).attr("y",175).attr("width",k).attr("height",k).attr("xlink:href","../common/js/skulpt_mixcar/pic/full_oil.png"),u.oil=1,t(Sk.builtin.none.none$)}),800)})))})),r.getPoint=new Sk.builtin.func((function(t){Sk.builtin.pyCheckArgs("getPoint",arguments,1,1);var r=u.coin_point;return Sk.ffi.remapToPy(r)})),r.isLightGreen=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgs("isLightGreen",arguments,1,1),u.traffic_light==y.SquareType.LIGHT_GREEN?Sk.ffi.remapToPy(!0):u.traffic_light==y.SquareType.LIGHT_RED?Sk.ffi.remapToPy(!1):void 0})),r.isCirculationRight=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgs("isCirculationRight",arguments,1,1),new Sk.misceval.promiseToSuspension(new Promise((function(t){var r=!1;switch(y.mlevel){case 5:r=3==u.circulation_num;break;case 7:if(u.traffic_light==y.SquareType.LIGHT_GREEN)r=!1;else if(u.traffic_light==y.SquareType.LIGHT_RED)for(var e=0;e0.5?1:5, 0, 0, 1, 0], + [0, 1, 1, 9, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 24, 1, 1, 24, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg2.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'../common/js/skulpt_mixcar/pic/barrier.png', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + BARRIER:5, + MARKER4:13, + S_F: 9,//既是起点又是终点 + INVIMAKER: 24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 4 + }, + //第四关 + { mlevel:4, + map:[ + [0, 1, 1, 13, 24, 1, 24, 0], + [20, 1, 0, Math.random()>0.5?1:5, 0, 0, 1, 0], + [0, 1, 1, 9, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 24, 1, 1, 24, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg3.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'../common/js/skulpt_mixcar/pic/barrier.png', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + BARRIER:5, + MARKER4:13, + S_F: 9,//既是起点又是终点 + OIL_STATION:20,//加油站 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 4 + }, + //第五关 + { mlevel:5, + map:[ + [0, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 0, 0, 0, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:[], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + S_F: 9,//既是起点又是终点 + TRAFFIC_LIGHT:21,//红绿灯 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:3,y:2}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + }, + //第六关 + { mlevel:6, + map:[ + [0, 1, 1, 13, 1, 1, 12, 0], + [0, 1, 0, 1, 0, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 10, 1, 1, 11, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:['../common/js/skulpt_mixcar/pic/red.png','../common/js/skulpt_mixcar/pic/yellow.png','../common/js/skulpt_mixcar/pic/blue.png','../common/js/skulpt_mixcar/pic/green.png'], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + MARKER1:10, + MARKER2:11, + MARKER3:12, + MARKER4:13, + S_F: 9,//既是起点又是终点 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:0,y:0}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + }, + //第七关 + { mlevel:7, + map:[ + [0, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 0, 0, 0, 0, 1, 0], + [0, 1, 1, 2, 22, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 0, 0, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0]], + tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 + marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 + background: '../common/js/skulpt_mixcar/pic/bg4.jpg',//地图背景图片 + wall:'', + award:'', + barrier:'', + markers:[], + SquareType :{//迷宫中方块的类型 + WALL: 0, + OPEN: 1, + START: 2, + S_F: 9,//既是起点又是终点 + LIGHT_GREEN:22,//红绿灯中的绿灯 + LIGHT_RED:23,//红绿灯中的红灯 + INVIMAKER:24 + }, + //迷宫部分参数指定 + MAZE_WIDTH : maze_SQUARE_SIZE * 8, + MAZE_HEIGHT : maze_SQUARE_SIZE * 8, + PATH_WIDTH : maze_SQUARE_SIZE / 3, + result : ResultType.UNSET, + finish : {x:3,y:2}, + type:0,//类型为非用户自定义的 + INVIMNUM : 0 + } + ] + + /** + * Display Pegman at the specified location, facing the specified direction. + * @param {number} x Horizontal grid (or fraction thereof). + * @param {number} y Vertical grid (or fraction thereof). + * @param {number} d Direction (0 - 15) or dance (16 - 17). + * @param {number=} opt_angle Optional angle (in degrees) to rotate Pegman. + */ + var displayPegman = function(x, y, d, opt_angle) { + var pegmanIcon = $(Sk.TurtleGraphics.target).find('#pegman'); + if(actor.type=='animate'){ + if(maze.type==0){ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE - d * actor.width+ 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 ); + }else{ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE - d * actor.width + 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 - 8); + } + if (opt_angle) { + pegmanIcon.attr('transform', 'rotate(' + opt_angle + ', ' + + (x * maze_SQUARE_SIZE + maze_SQUARE_SIZE / 2) + ', ' + + (y * maze_SQUARE_SIZE + maze_SQUARE_SIZE / 2) + ')'); + } else { + pegmanIcon.attr('transform', 'rotate(0, 0, 0)'); + } + }else{ + pegmanIcon.attr('x', x * maze_SQUARE_SIZE + 1); + pegmanIcon.attr('y', maze_SQUARE_SIZE * (y + 0.5) - actor.height / 2 ); + } + var clipRect = $(Sk.TurtleGraphics.target).find('#clipRect'); + clipRect.attr('x', x * maze_SQUARE_SIZE + 1); + clipRect.attr('y', pegmanIcon.attr('y')); + }; + + var initPegman=function(){ + // Pegman's clipPath element, whose (x, y) is reset by Maze.displayPegman + svg.append('clipPath').attr('id','pegmanClipPath') + const elem = Sk.TurtleGraphics.target.querySelector("#pegmanClipPath"); + d3.select(elem).append('rect').attr('id','clipRect').attr('width', actor.width).attr('height', actor.height) + + if(actor.type=="animate"){ + if(maze.type==0){ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width * 16).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + }else{ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width * 21).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + } + }else{ + //绘制精灵. + svg.append('image').attr('id','pegman').attr('width', actor.width ).attr('height', actor.height).attr('clip-path', 'url(#pegmanClipPath)') + .attr('xlink:href',actor.img) + } + + displayPegman(actor.x , actor.y , actor.direction*4 ) + } + + var drawMap=function(){ + svg.attr('id','game_stage') + var scale = Math.max(maze_ROWS, maze_COLS) * maze_SQUARE_SIZE; + svg.attr('viewBox', '0 -10 ' + scale + ' ' + (scale+10)); + + // 绘制外框 + svg.append('rect').attr('x', 0).attr('y', 0).attr('width', maze.MAZE_WIDTH).attr('height', maze.MAZE_HEIGHT) + .style('fill','#F1EEE7').style('stroke','#CCB').style('stroke-width','1'); + + // for (var y = 0; y < maze_ROWS; y++) { + // for (var x = 0; x < maze_COLS; x++) { + // //绘制迷宫背景 + // svg.append('image').attr('x', x*maze_SQUARE_SIZE).attr('y', y*maze_SQUARE_SIZE).attr('width', maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + // .attr('xlink:href',maze.background) + // } + // } + svg.append('image').attr('x', 0).attr('y', 0).attr('width', maze_SQUARE_SIZE*maze_COLS).attr('height',maze_SQUARE_SIZE*maze_ROWS) + .attr('xlink:href',maze.background) + //初始化地图 + + var normalize = function(x, y) { + if (x < 0 || x >= maze_COLS || y < 0 || y >= maze_ROWS) { + return '0'; + } + return ((map[y][x] == maze.SquareType.WALL)||(map[y][x] == maze.SquareType.OIL_STATION)) ? '0' : '1'; + }; + // 依次判断格子的类型,并绘制相应格子内的图形 + var tileId = 0; + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + // 标记每个格子的“弯曲状态”. + var tileShape = normalize(x, y) + + normalize(x, y - 1) + // North. + normalize(x + 1, y) + // West. + normalize(x, y + 1) + // South. + normalize(x - 1, y); // East. + // 绘制路径. + if (!tile_SHAPES[tileShape]) { + // Empty square. Use null0 for large areas, with null1-4 for borders. + // Add some randomness to avoid large empty spaces. + if (tileShape == '00000' && Math.random() > 0.3) { + tileShape = 'null0'; + } else { + tileShape = 'null' + Math.floor(1 + Math.random() * 4); + } + } + var left = tile_SHAPES[tileShape][0]; + var top = tile_SHAPES[tileShape][1]; + // Tile's clipPath element. + svg.append('clipPath').attr('id','tileClipPath' + tileId) + const elem = Sk.TurtleGraphics.target.querySelector("#tileClipPath" + tileId); + d3.select(elem).append('rect').attr('x', x * maze_SQUARE_SIZE).attr('y', y * maze_SQUARE_SIZE).attr('width', maze_SQUARE_SIZE).attr('height', maze_SQUARE_SIZE) + + if(maze.type==0){//非用户自定义 + // Tile sprite. + if ((map[y][x] != maze.SquareType.WALL) && (map[y][x] != maze.SquareType.OIL_STATION) && (map[y][x] != maze.SquareType.TRAFFIC_LIGHT)&& (map[y][x] != maze.SquareType.LIGHT_GREEN)&& (map[y][x] != maze.SquareType.LIGHT_RED)) { + svg.append('image').attr('x', x * maze_SQUARE_SIZE).attr('y', y * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE ).attr('height',maze_SQUARE_SIZE ) + .attr('clip-path', 'url(#tileClipPath' + tileId + ')').attr('xlink:href',maze.tiles); + tileId++; + } + }else{ + // Tile sprite. + svg.append('image').attr('x',(x - left) * maze_SQUARE_SIZE).attr('y',(y - top) * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE * 5).attr('height',maze_SQUARE_SIZE * 4) + .attr('clip-path', 'url(#tileClipPath' + tileId + ')').attr('xlink:href',maze.tiles) + tileId++; + } + + if(map[y][x]==0){//当地图中此处标记为墙时 + svg.append('image').attr('x',x * maze_SQUARE_SIZE + (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('width',maze_SQUARE_SIZE*0.8 ).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href',maze.wall) + }else if(map[y][x]==4){//当地图中此处标记为金币时 + svg.append('image').attr('id','coin'+y+x).attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.5/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.5/2)).attr('width',maze_SQUARE_SIZE*0.5).attr('height',maze_SQUARE_SIZE*0.5) + .attr('xlink:href',maze.award) + }else if(map[y][x]==5){//当地图中此处标记为障碍时 + svg.append('image').attr('id','barrier'+y+x).attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.barrier) + }else if(map[y][x]==10){//当地图中此处标记为符号1——红标时 + svg.append('image').attr('id','marker1').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[0]) + maze_marker_num+=1 + }else if(map[y][x]==11){//当地图中此处标记为符号2——橘标时 + svg.append('image').attr('id','marker2').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[1]) + maze_marker_num+=1 + }else if(map[y][x]==12){//当地图中此处标记为符号3——蓝标时 + svg.append('image').attr('id','marker3').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[2]) + maze_marker_num+=1 + }else if(map[y][x]==13){//当地图中此处标记为符号4——绿标时 + svg.append('image').attr('id','marker4').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href',maze.markers[3]) + maze_marker_num+=1 + } + } + } + + if(maze.type==1){ + // 绘制终点图标 + svg.append('image').attr('id','finish').attr('width', 0.5 * maze_SQUARE_SIZE).attr('height', 0.5*maze_SQUARE_SIZE).attr('xlink:href',maze.marker) + //定位:精灵与终点初始的位置 + // Locate the start and finish squares. + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + if (map[y][x] == maze.SquareType.START) { + actor.x= x; + actor.y= y; + } else if (map[y][x] == maze.SquareType.FINISH) { + // Move the finish icon into position. + var finishIcon = $(Sk.TurtleGraphics.target).find('#finish'); + finishIcon.attr('x', maze_SQUARE_SIZE * (x + 0.5) - + finishIcon.attr('width') / 2); + finishIcon.attr('y', maze_SQUARE_SIZE * (y + 0.6) - + finishIcon.attr('height')); + maze.finish={x:x,y:y} + } + } + } + }else{ + //绘制既是起点、又是终点的坐标 + // Locate the start and finish squares. + for (var y = 0; y < maze_ROWS; y++) { + for (var x = 0; x < maze_COLS; x++) { + if (map[y][x] == 9) {//既是起点又是终点 + // 绘制终点图标 + svg.append('image').attr('id','finish').attr('width', maze_SQUARE_SIZE*0.8).attr('height', maze_SQUARE_SIZE*0.8).attr('xlink:href',maze.marker) + actor.x= x; + actor.y= y; + var finishIcon = $(Sk.TurtleGraphics.target).find('#finish'); + finishIcon.attr('x', maze_SQUARE_SIZE * x+5 ); + finishIcon.attr('y', maze_SQUARE_SIZE * y+5); + maze.finish={x:x,y:y} + }else if(map[y][x]==20){//当地图中此处标记为20——加油站时 + svg.append('image').attr('id','station').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.8/2)).attr('width',maze_SQUARE_SIZE*2*0.8).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/oilstation.png') + }else if(map[y][x]==21){//当地图中此处标记为21——红绿灯时 + svg.append('image').attr('id','trafficlight').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/trafficlight.png') + }else if(map[y][x]==22){//当地图中此处标记为22——红绿灯中的绿灯时 + svg.append('image').attr('id','lightgreen').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/greenlight.png') + }else if(map[y][x]==23){//当地图中此处标记为23——红绿灯中的红灯时 + svg.append('image').attr('id','lightred').attr('x',x * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('y',y * maze_SQUARE_SIZE+ (maze_SQUARE_SIZE/2 - maze_SQUARE_SIZE*0.7/2)).attr('width',maze_SQUARE_SIZE*0.7).attr('height',maze_SQUARE_SIZE*0.7) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/redlight.png') + }else if(map[y][x]==2){//当地图中此处标记为起点时,画上和“既是起点又是终点”一样的图标 + actor.x= x; + actor.y= y; + svg.append('image').attr('id','start').attr('x', maze_SQUARE_SIZE * x).attr('y',maze_SQUARE_SIZE * y+5).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE*0.8) + .attr('xlink:href',maze.marker) + } + } + } + } + } + + //检查是否已到终点 + var checkFinish=function(){ + maze.result = actor.x != maze.finish.x || actor.y != maze.finish.y ? + ResultType.UNSET : ResultType.SUCCESS; + if(maze.result==ResultType.SUCCESS){ + if(maze.type==1){ + return true + }else{ + if(maze.mlevel==5 || maze.mlevel==7 ||maze.mlevel==6){ + return true + }else{ + if(actor.marker_num==maze_marker_num){ + if(actor.invisible_mark>=maze.INVIMNUM){ + return true + }else{return "error3"} + }else{return "error2"} + } + } + }else{ + return false + } + } + + /** + * Is there a path next to pegman? + * @param {number} direction Direction to look + * (0 = forward, 1 = right, 2 = backward, 3 = left). + * @param {?string} id ID of block that triggered this action. + * Null if called as a helper function in Maze.move(). + * @return {boolean} True if there is a path. + */ + var isPath=function(direction,id){ + var effectiveDirection = actor.direction + direction; + var square; + var command; + switch (constrainDirection4(effectiveDirection)) { + case DirectionType.NORTH: + square = map[actor.y - 1] && map[actor.y - 1][actor.x]; + command = 'look_north'; + break; + case DirectionType.EAST: + square = map[actor.y][actor.x + 1]; + command = 'look_east'; + break; + case DirectionType.SOUTH: + square = map[actor.y + 1] && map[actor.y + 1][actor.x]; + command = 'look_south'; + break; + case DirectionType.WEST: + square = map[actor.y][actor.x - 1]; + command = 'look_west'; + break; + } + if (id) { + return [command , square !== maze.SquareType.WALL && square !== undefined && square !== maze.SquareType.BARRIER && square !== maze.SquareType.OIL_STATION && square !== maze.SquareType.TRAFFIC_LIGHT && square !== maze.SquareType.LIGHT_RED && square !== maze.SquareType.LIGHT_GREEN] + } + return square !== maze.SquareType.WALL && square !== undefined && square !== maze.SquareType.BARRIER && square !== maze.SquareType.OIL_STATION && square !== maze.SquareType.TRAFFIC_LIGHT && square !== maze.SquareType.LIGHT_RED && square !== maze.SquareType.LIGHT_GREEN; + }; + + var constrainDirection4 = function(d) { + d = Math.round(d) % 4; + if (d < 0) { + d += 4; + } + return d; + }; + var constrainDirection16 = function(d) { + d = Math.round(d) % 16; + if (d < 0) { + d += 16; + } + return d; + }; + + /** + * Attempt to move pegman forward or backward. + * @param {number} direction Direction to move . + * @param {string} id ID of block that triggered this action. + * @throws {true} If the end of the maze is reached. + * @throws {false} If Pegman collides with a wall. + */ + var move = function(direction) { + if (!isPath(0, null)) { + return false + } + var command; + switch (constrainDirection4(direction)) { + case DirectionType.NORTH: + command = 'north'; + break; + case DirectionType.EAST: + command = 'east'; + break; + case DirectionType.SOUTH: + command = 'south'; + break; + case DirectionType.WEST: + command = 'west'; + break; + } + return command + }; + + /** + * Turn pegman left or right. + * @param {number} direction Direction to turn (0 = left, 1 = right). + * @param {string} id ID of block that triggered this action. + */ + var turn = function(direction) { + var command; + if (direction=='right') { + // Right turn (clockwise). + command='right' + } else { + // Left turn (counterclockwise). + command='left' + } + return command + }; + + /** + * Schedule the animations for a move or turn. + * @param {!Array.} startPos X, Y starting points. + * @param {!Array.} endPos X, Y ending points. + */ + var schedule = function(startPos, endPos) { + var deltas = [(endPos[0] - startPos[0]) / 4, (endPos[1] - startPos[1]) / 4, (endPos[2] - startPos[2]) / 4]; + displayPegman(startPos[0] + deltas[0], startPos[1] + deltas[1], constrainDirection16(startPos[2] + deltas[2])); + setTimeout(function() { + displayPegman(startPos[0] + deltas[0] * 2, startPos[1] + deltas[1] * 2, constrainDirection16(startPos[2] + deltas[2] * 2)); + }, actor.stepSpeed); + setTimeout(function() { + displayPegman(startPos[0] + deltas[0] * 3, startPos[1] + deltas[1] * 3, constrainDirection16(startPos[2] + deltas[2] * 3)); + }, actor.stepSpeed * 2) + setTimeout(function() { + displayPegman(endPos[0], endPos[1], constrainDirection16(endPos[2])); + }, actor.stepSpeed * 3) + }; + + /** + * 检查精灵在移动的过程中是否吃到了金币 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasCoin=function(x , y) { + if(map[y][x]==maze.SquareType.AWARD){//如果此处是金币 + setTimeout(function() { + $(Sk.TurtleGraphics.target).find('#coin'+y+x).remove() + }, actor.stepSpeed * 3) + map[y][x]=maze.SquareType.OPEN + actor.coin_point+=1 + } + } + + /** + * 检查精灵在移动的过程中是否走到了标记处 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasMarker=function(x , y) { + if((map[y][x]==maze.SquareType.MARKER1)||(map[y][x]==maze.SquareType.MARKER2)||(map[y][x]==maze.SquareType.MARKER3)||(map[y][x]==maze.SquareType.MARKER4)){//如果此处是标记 + actor.marker_num+=1 + } + } + + /** + * 检查精灵在移动的过程中是否走到不可见的标记点(INVIMAKER)处 + * @param {} x 当前精灵的横坐标. + * @param {} y 当前精灵的纵坐标. + */ + var hasInviMarker=function(x , y) { + if(map[y][x]==maze.SquareType.INVIMAKER){//如果此处是标记 + actor.invisible_mark+=1 + } + } + + /** + * 设置地图属性. + * + * @param {number} M_x为地图横向方格的数目(范围为3-10),初始默认为8 + * @param {number} M_y为地图竖向方格的数目(范围为3-10),初始默认为8 + * @param {string} startPos X, Y 起点位置的坐标. + * @param {string} endPos X, Y 终点位置的坐标 + * @param {string} bg_pic为地图背景的图片 + */ + var setMap_f=function( M_x , M_y , startPos , endPos , bg_pic) { + Sk.builtin.pyCheckArgs("setMap", arguments, 5, 5); + map=[] + if(bg_pic=='无可用地图'){ + bg_pic="" + } + if((M_x<3) || (M_x>20) || (M_y<3) || (M_y>20)){ + throw new Sk.builtin.TypeError("错误!超出地图可设置范围,请设置横纵方格数大于等于3,小于等于20"); + } + M_x = Sk.ffi.remapToJs(M_x); + M_y = Sk.ffi.remapToJs(M_y); + maze_COLS=M_x; + maze_ROWS=M_y; + maze.MAZE_WIDTH= maze_SQUARE_SIZE * maze_COLS; + maze.MAZE_HEIGHT=maze_SQUARE_SIZE * maze_ROWS; + + startPos =Sk.ffi.remapToJs(startPos) + endPos =Sk.ffi.remapToJs(endPos) + + switch (Sk.ffi.remapToJs(bg_pic)){ + case "bg_default": + maze.background ='../common/js/skulpt_mixcar/pic/bg_default.png';//默认为方格 + break; + case "bg_astro": + maze.background ='../common/js/skulpt_mixcar/pic/bg_astro.jpg';//设置为管道 + break; + case "bg_panda": + maze.background ='../common/js/skulpt_mixcar/pic/bg_panda.jpg';//设置为竹子 + break; + } + + var re=/\((\d+),(\d+)\)/.exec(startPos); + if(re!=null){ + if((re[1]>M_x) || (re[1]<1) || (re[2]>M_y) || (re[2]<1)){ + throw new Sk.builtin.TypeError("错误!起点坐标超出地图范围!"); + } + } + var re=/\((\d+),(\d+)\)/.exec(endPos); + if(re!=null){ + if((re[1]>M_x) || (re[1]<1) || (re[2]>M_y) || (re[2]<1)){ + throw new Sk.builtin.TypeError("错误!终点坐标超出地图范围!"); + } + } + + for (var i=0; i(map[0].length)) || (Pos_x< 0) || (Pos_y>(map.length)) || (Pos_y< 0)){ + throw new Sk.builtin.TypeError("错误!放置物坐标超过地图范围"); + } + + switch(type){ + case "wall"://墙:障碍 + map[Pos_y-1][Pos_x-1]=maze.SquareType.WALL; + break; + case "coin": + map[Pos_y-1][Pos_x-1]=maze.SquareType.AWARD; + break; + } + } + mod.placeItem = new Sk.builtin.func(placeItem_f); + + /** + * 初始化地图 + */ + var initMap_f=function() { + drawMap() + } + mod.initMap = new Sk.builtin.func(initMap_f); + + + mod.Actor = Sk.misceval.buildClass(mod, function($gbl, $loc) { + $loc.__init__ = new Sk.builtin.func(function(self,img , direction) { + img= Sk.ffi.remapToJs(img) || 'pegman'; + if(img=='无可用角色'){ + img='pegman'; + } + switch (img){ + case "pegman": + actor.img='../common/js/skulpt_mixcar/pic/pegman.png';//默认为方格 + actor.type="animate" + break; + case "panda": + actor.img='../common/js/skulpt_mixcar/pic/panda.png';//设置为管道 + actor.type="animate" + break; + case "astro": + actor.img='../common/js/skulpt_mixcar/pic/astro.png';//设置为竹子 + actor.type="animate" + break; + case "robot": + actor.img='../common/js/skulpt_mixcar/pic/robot.png';//设置为机器人 + actor.type="still" + break; + case "car": + actor.img='../common/js/skulpt_mixcar/pic/actor_car3.png';//设置为小车 + actor.type="animate" + break; + } + + actor.direction = Sk.ffi.remapToJs(direction) || DirectionType.NORTH; + size=[52,49]//[height,width]//size需要根据方格的数目来确定 + actor.coin_point=0 + initPegman() + }); + //向某个方向移动移动 + //暂时只实现了移动一步 + //func: Actor.moveDirection() + $loc.moveDirection=new Sk.builtin.func(function(self,direction) { + Sk.builtin.pyCheckArgs("moveDirection", arguments, 2,2); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + actor.direction = parseInt(Sk.ffi.remapToJs(direction)); + var command= move(direction) //向某个方向移动 + if(command==false){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败!请修改后重新尝试", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!请修改后重新尝试"); + } + + if(maze.mlevel==4){//如果是第四关,则需要判断是否需要加油的问题 + //如果左侧存在加油站 + // if((map[actor.y - 1][actor.x])==maze.SquareType.OIL_STATION||(map[actor.y + 1][actor.x])==maze.SquareType.OIL_STATION||(map[actor.y ][actor.x-1])==maze.SquareType.OIL_STATION||(map[actor.y ][actor.x+1])==maze.SquareType.OIL_STATION){ + if((map[actor.y][actor.x-1])==maze.SquareType.OIL_STATION){ + if(actor.oil==0){//在加油站处,如果没有油还想继续往前面走 + maze.result=ResultType.FAILURE + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/no_oil.png') + layer.alert("挑战失败!小车没有油了", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!小车没有油了"); + } + } + }else if(maze.mlevel==5){//如果是第五关,则需要记录循环次数;每次经过起点处循环次数+1 + if((map[actor.y][actor.x])==maze.SquareType.START){ + actor.circulation_num+=1; + } + }else if(maze.mlevel==7){//如果是第七关,则需要判断红绿灯是否为绿灯的问题 + if(actor.traffic_light==maze.SquareType.LIGHT_RED){ + layer.alert("挑战失败:小车在红灯亮时还未停止!", { shade: false }); + throw new Sk.builtin.TypeError("挑战失败:小车在红灯亮时还未停止!"); + } + } + + switch (command) { + case 'north': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x, actor.y - 1, actor.direction * 4]); + actor.y--; + break; + case 'east': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x + 1, actor.y, actor.direction * 4]); + actor.x++; + break; + case 'south': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x, actor.y + 1, actor.direction * 4]); + actor.y++; + break; + case 'west': + schedule([actor.x, actor.y, actor.direction * 4], + [actor.x - 1, actor.y, actor.direction * 4]); + actor.x--; + break; + } + hasCoin(actor.x,actor.y) + hasMarker(actor.x,actor.y) + hasInviMarker(actor.x,actor.y) + if(maze.mlevel==7){//如果是第七关,则需要随机改变红绿灯的颜色 + if((map[actor.y][actor.x+1])==maze.SquareType.LIGHT_RED || (map[actor.y][actor.x+1])==maze.SquareType.LIGHT_GREEN){ + map[actor.y][actor.x+1]=Math.random()>0.5? maze.SquareType.LIGHT_RED:maze.SquareType.LIGHT_GREEN;//随机刷新红绿灯的状态 + actor.traffic_light=map[actor.y][actor.x+1]; + if(actor.traffic_light==maze.SquareType.LIGHT_RED){//图像变为红灯 + const elem = Sk.TurtleGraphics.target.querySelector("#lightgreen"); + d3.select(elem).remove(); + svg.append('image').attr('id','lightred').attr('x',(actor.x+1) * maze_SQUARE_SIZE-5).attr('y',actor.y * maze_SQUARE_SIZE+5).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/redlight.png') + } + } + } + + var state=checkFinish() + if(state=="error2"){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查是否通过所有标记点!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查是否通过所有标记点!"); + }else if(state=="error3"){ + layer.alert("挑战失败,请修改后重新尝试!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败!请修改后重新尝试"); + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + $loc.turn=new Sk.builtin.func(function(self,direction){ + Sk.builtin.pyCheckArgs("turn", arguments, 2, 2); + Sk.builtin.pyCheckType("direction", "string", Sk.builtin.checkString(direction)); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + direction=Sk.ffi.remapToJs(direction) + var command=turn(direction) + switch (command) { + case 'left': + schedule([actor.x, actor.y, actor.direction * 4], [actor.x, actor.y, actor.direction * 4 - 4]); + actor.direction = constrainDirection4(actor.direction - 1); + break; + case 'right': + schedule([actor.x, actor.y, actor.direction * 4], [actor.x, actor.y, actor.direction * 4 + 4]); + actor.direction = constrainDirection4(actor.direction + 1); + break; + } + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + $loc.isDone=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isDone", arguments, 1, 1); + var isdone= Sk.ffi.remapToPy(checkFinish()); + return new Sk.ffi.remapToPy(isdone); + }); + $loc.isPath=new Sk.builtin.func(function(self,direction){ + Sk.builtin.pyCheckArgs("isPath", arguments, 2, 2); + Sk.builtin.pyCheckType("direction", "string", Sk.builtin.checkString(direction)); + direction=Sk.ffi.remapToJs(direction) + var state="" + switch (direction) { + case 'left': + direction= 3 + state=isPath(direction, null) + break; + case 'right': + direction= 1 + state=isPath(direction, null) + break; + }; + return Sk.ffi.remapToPy(state); + }); + //判断某个方向是否存在障碍物 + $loc.isBarrier=new Sk.builtin.func(function(self,direction){ + Sk.builtin.pyCheckArgs("isBarrier", arguments, 2, 2); + Sk.builtin.pyCheckType("direction", "number", Sk.builtin.checkNumber(direction)); + direction=Sk.ffi.remapToJs(direction) + var state=false; + var square=0; + switch (direction) { + case DirectionType.NORTH: + if(map[actor.y - 1]){ + square = map[actor.y - 1][actor.x]; + }else{ + square = 0 + } + break; + case DirectionType.EAST: + if(map[actor.y][actor.x + 1]){ + square = map[actor.y][actor.x + 1]; + }else{ + square = 0 + } + break; + case DirectionType.SOUTH: + if(map[actor.y + 1]){ + square = map[actor.y + 1][actor.x]; + }else{ + square = 0 + } + break; + case DirectionType.WEST: + if(map[actor.y][actor.x - 1]){ + square = map[actor.y][actor.x - 1]; + }else{ + square = 0 + } + break; + }; + state= square == maze.SquareType.BARRIER; + return Sk.ffi.remapToPy(state); + }); + //随机生成小车油量 + $loc.randomOil=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("randomOil", arguments, 1, 1); + actor.oil=Math.random()>0.5?1:0;//随机初始化汽车的油量 + if(actor.oil==0){//没油(呈现少量油的图片) + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/none_oil.png') + }else if(actor.oil==1){//油量充足(呈现油量充足的图片) + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/full_oil.png') + } + }); + //判断是否需要加油 + $loc.isOilFull=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isOilFull", arguments, 1, 1); + if(actor.oil==0){//没油了,返回需要加油为True + return Sk.ffi.remapToPy(true); + }else if(actor.oil==1){//还有油,返回需要加油为False + return Sk.ffi.remapToPy(false); + } + }); + //进加油站加油 + $loc.addOil=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("addOil", arguments, 1, 1); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + Sk.setTimeout(function() { + svg.append('image').attr('id','caroil').attr('x',maze_SQUARE_SIZE).attr('y',3.5 * maze_SQUARE_SIZE).attr('width',maze_SQUARE_SIZE).attr('height',maze_SQUARE_SIZE) + .attr('xlink:href','../common/js/skulpt_mixcar/pic/full_oil.png') + actor.oil=1//油量充足 + resolve(Sk.builtin.none.none$); + }, 800); + })); + }); + $loc.getPoint=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("getPoint", arguments, 1, 1); + var point= actor.coin_point; + return Sk.ffi.remapToPy(point); + }); + //判断信号灯是否为绿灯? + $loc.isLightGreen=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isLightGreen", arguments, 1, 1); + if(actor.traffic_light==maze.SquareType.LIGHT_GREEN){//绿灯,返回 true + return Sk.ffi.remapToPy(true); + }else if(actor.traffic_light==maze.SquareType.LIGHT_RED){//红灯,返回false + return Sk.ffi.remapToPy(false); + } + }); + //检查循环的次数是否正确 + $loc.isCirculationRight=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isCirculationRight", arguments, 1, 1); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + var mlevel=maze.mlevel;//获取当前关卡序数 + var state=false; + switch (mlevel){ + case 5://第五关 + state=actor.circulation_num==3?true:false; + break; + case 7://第七关 + if(actor.traffic_light==maze.SquareType.LIGHT_GREEN){//如果是绿灯,则怎么都算失败 + state=false; + }else if(actor.traffic_light==maze.SquareType.LIGHT_RED){//如果是红灯 + for (var y = 0; y < maze.map.length; y++) { + for (var x = 0; x < maze.map[0].length; x++) { + if(maze.map[y][x]==maze.SquareType.LIGHT_RED){ + if((actor.x+1)==x|| (actor.y)==y){//如果小车停的位置在红绿灯的左边,则挑战成功 + state=true; + } + } + } + } + } + break; + } + if(state==false){ + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查循环次数是否正确!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查循环次数是否正确!"); + }else{ + maze.result=ResultType.SUCCESS + resolve(Sk.builtin.none.none$); + } + })) + }); + //检查是否挑战成功 + $loc.isSuccess=new Sk.builtin.func(function(self){ + Sk.builtin.pyCheckArgs("isSuccess", arguments, 1,1); + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + var state=checkFinish() + if(state==true){ + setTimeout(function() { + layer.alert("挑战成功!", { shade: false }); + },1000) + resolve(Sk.builtin.none.none$); + }else if(state==false){//没有到达终点就游戏结束,或者超过了终点 + maze.result=ResultType.FAILURE + layer.alert("挑战失败,请检查是否到达终点!", { shade: false }) + throw new Sk.builtin.TypeError("挑战失败,请检查是否到达终点!"); + } + })) + }) + + }, "Actor") + + /** + * 初始化为设定好的地图 + * + * @param {number} level 初始化地图,level为地图的等级. + */ + var settedMap_f=function(level) { + level=Sk.ffi.remapToJs(level) + maze=MAZE_setted[level] + map=MAZE_setted[level].map + drawMap() + } + mod.settedMap = new Sk.builtin.func(settedMap_f); + + return mod; +} \ No newline at end of file diff --git a/boards/default/python_skulpt_car/index.xml b/boards/default/python_skulpt_car/index.xml index 9a56e525..b7bb0448 100644 --- a/boards/default/python_skulpt_car/index.xml +++ b/boards/default/python_skulpt_car/index.xml @@ -1 +1,1210 @@ -promptHelloHelloHello,HelloMixly2100,1,2,3051i90x151100a10.998124.821100101010001100501100110000x2x0,1,2,30,1,2,30,1,2,3xMixlyMixlyHelloMixly65axMixlyMixly0Mixly02MixlyMixlyHello,mixlyHello,mixly50*Hello,mixlyl--mylistHello,mixlymixlymixpyI love mixly!I love mixlyRandom No. is {}int1100input('1+2*3')dirmylist1,2,3,4,5mylist0mylist02mylist00mylist0101mylistmylist2mylistmylist0mylist00mylist00mylist0mylist0mylist0mylistmylistmylistxmytup1,2,3,4,5mytup0mytup02mytupmytupmytupmytup0mytupmytup1mytup2xmydictmydictkeymydictkey0mydictkey0mydictkeymydictkeymydictkey0mydictmydictmydictmydictxmydict{"name":"Mixly","color":"green"}s11,2,3,4,5s1s1s1s2s1s2s10s1Mixlys1s2x0 \ No newline at end of file + + + + + + + + + prompt + + + + + + + Hello + + + + + + + Hello + + + + + + + Hello + + + + + , + + + + + + + + Hello + + + + + Mixly + + + + + + + + + + + + 2 + + + + + + + + 10 + + + + + + + + + + + + + 0,1,2,3 + + + + + 0 + + + + + 5 + + + + + 1 + + + + + + + i + + + + + + + + + + + + + + + + + + + + + 90 + + + + + + + x + + + + + + + 15 + + + + + + + 1 + + + + + 1 + + + + + + + 0 + + + + + 0 + + + + + + + a + + + + + 1 + + + + + + + 0.998 + + + + + + + 1 + + + + + 2 + + + + + + + 4.8 + + + + + 2 + + + + + + + 1 + + + + + 100 + + + + + + + 1010 + + + + + + 1000 + + + + + 1 + + + + + 100 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + 1 + + + + + 1000 + + + + + + + + + + 0 + + + + + x + + + + + 2 + + + + + + + + + + + + x + + + + + 0,1,2,3 + + + + + + + 0,1,2,3 + + + + + 0,1,2,3 + + + + + + + x + + + + + + + Mixly + + + + + Mixly + + + + + Hello + + + + + Mixly + + + + + + + + 65 + + + + + + + a + + + + + + + x + + + + + + + Mixly + + + + + + + + + + + + + + + + + + + Mixly + + + + + 0 + + + + + + + Mixly + + + + + 0 + + + + + 2 + + + + + + + Mixly + + + + + + + Mixly + + + + + + + Hello,mixly + + + + + + + Hello,mixly + + + + + 50 + + + + + * + + + + + + + Hello,mixly + + + + + l + + + + + + + -- + + + + + mylist + + + + + + + Hello,mixly + + + + + mixly + + + + + mixpy + + + + + + + I love mixly! + + + + + + + + + + + + I love mixly + + + + + + + + Random No. is {} + + + + + int + + + 1 + + + + + 100 + + + + + + + + + input('1+2*3') + + + + + + + dir + + + + + + + + + mylist + + + 1,2,3,4,5 + + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 2 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 1 + + + + + 0 + + + + + 1 + + + + + + + mylist + + + + + + + mylist + + + + + 2 + + + + + + + mylist + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + + + mylist + + + + + + + mylist + + + + + + + + x + + + + + + + + mytup + + + 1,2,3,4,5 + + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + 0 + + + + + 2 + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + + + mytup1 + + + + + mytup2 + + + + + + + + x + + + + + + + + + + mydict + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + + + + mydict + + + + + + + mydict + + + + + + + mydict + + + + + + + x + + + + + + + mydict + + + + + + + {"name":"Mixly","color":"green"} + + + + + + + + s1 + + + 1,2,3,4,5 + + + + + + + s1 + + + + + + + s1 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + 0 + + + + + + + s1 + + + + + Mixly + + + + + + + s1 + + + + + s2 + + + + + + + x + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/boards/default/python_skulpt_car/inittool_3543dc69.js b/boards/default/python_skulpt_car/inittool_3543dc69.js new file mode 100644 index 00000000..8e29cbc9 --- /dev/null +++ b/boards/default/python_skulpt_car/inittool_3543dc69.js @@ -0,0 +1,20 @@ +var $builtinmodule = function (name) { + let mod= {__name__: new Sk.builtin.str("blocktool")}; + + var highlight = function(id) { + id=Sk.ffi.remapToJs(id) + Mixly.Editor.blockEditor.highlightBlock(id); + }; + + var highlight_f=function(block_id) { + return new Sk.misceval.promiseToSuspension(new Promise(function(resolve) { + setTimeout( () => { + highlight(block_id) + resolve(Sk.builtin.none.none$); + }, 800); + })); + } + mod.highlight = new Sk.builtin.func(highlight_f); + + return mod; +} \ No newline at end of file diff --git a/boards/default/python_skulpt_car/inittool_b5e8e605.js b/boards/default/python_skulpt_car/inittool_b5e8e605.js deleted file mode 100644 index e5003eca..00000000 --- a/boards/default/python_skulpt_car/inittool_b5e8e605.js +++ /dev/null @@ -1 +0,0 @@ -var $builtinmodule=function(i){let n={__name__:new Sk.builtin.str("blocktool")};return n.highlight=new Sk.builtin.func((function(i){return new Sk.misceval.promiseToSuspension(new Promise((function(n){setTimeout((()=>{var o;o=i,o=Sk.ffi.remapToJs(o),Mixly.Editor.blockEditor.highlightBlock(o),n(Sk.builtin.none.none$)}),800)})))})),n}; \ No newline at end of file diff --git a/boards/default/python_skulpt_car/main.bundle.054b4509.js b/boards/default/python_skulpt_car/main.bundle.054b4509.js new file mode 100644 index 00000000..174c2a4b --- /dev/null +++ b/boards/default/python_skulpt_car/main.bundle.054b4509.js @@ -0,0 +1,35751 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../python/blocks/control.js": +/*!***********************************!*\ + !*** ../python/blocks/control.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ base_setup: () => (/* binding */ base_setup), +/* harmony export */ controls_delay: () => (/* binding */ controls_delay), +/* harmony export */ controls_end_program: () => (/* binding */ controls_end_program), +/* harmony export */ controls_except: () => (/* binding */ controls_except), +/* harmony export */ controls_finally: () => (/* binding */ controls_finally), +/* harmony export */ controls_flow_statements: () => (/* binding */ controls_flow_statements), +/* harmony export */ controls_for: () => (/* binding */ controls_for), +/* harmony export */ controls_forEach: () => (/* binding */ controls_forEach), +/* harmony export */ controls_for_range: () => (/* binding */ controls_for_range), +/* harmony export */ controls_if: () => (/* binding */ controls_if), +/* harmony export */ controls_if_else: () => (/* binding */ controls_if_else), +/* harmony export */ controls_if_elseif: () => (/* binding */ controls_if_elseif), +/* harmony export */ controls_if_if: () => (/* binding */ controls_if_if), +/* harmony export */ controls_lambda: () => (/* binding */ controls_lambda), +/* harmony export */ controls_main: () => (/* binding */ controls_main), +/* harmony export */ controls_pass: () => (/* binding */ controls_pass), +/* harmony export */ controls_range: () => (/* binding */ controls_range), +/* harmony export */ controls_repeat_ext: () => (/* binding */ controls_repeat_ext), +/* harmony export */ controls_thread: () => (/* binding */ controls_thread), +/* harmony export */ controls_try: () => (/* binding */ controls_try), +/* harmony export */ controls_try_finally: () => (/* binding */ controls_try_finally), +/* harmony export */ controls_whileUntil: () => (/* binding */ controls_whileUntil), +/* harmony export */ datetime_fromtimestamp: () => (/* binding */ datetime_fromtimestamp), +/* harmony export */ do_while: () => (/* binding */ do_while), +/* harmony export */ garbage_collection: () => (/* binding */ garbage_collection), +/* harmony export */ gene_unique_identifier: () => (/* binding */ gene_unique_identifier), +/* harmony export */ get_mem_alloc: () => (/* binding */ get_mem_alloc), +/* harmony export */ get_mem_free: () => (/* binding */ get_mem_free), +/* harmony export */ get_unique_identifier: () => (/* binding */ get_unique_identifier) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const LOOPS_HUE = 120; + +const controls_main = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_NAME_MAIN); + this.appendStatementInput('DO') + .appendField(''); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_SETUP); + } +}; + +const base_setup = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETUP); + this.appendStatementInput('DO') + .appendField(''); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_SETUP); + } +}; + +const controls_delay = { + init: function () { + var UNIT = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_mSecond, 'delay'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_uSecond, 'delayMicroseconds'] + ]; + this.setColour(LOOPS_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DELAY) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(UNIT), 'UNIT') + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id9"); + this.wiki = { + 'zh-hans': { + page: ['Arduino AVR', '控制', '延时'] + } + }; + } +}; + +const controls_end_program = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_CONTROL_END_PROGRAM); + this.setPreviousStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_CONTROL_END_TOOLTIP); + } +}; + +const controls_if = { + /** + * Block for if/elseif/else condition. + * @this Blockly.Block + */ + init: function () { + //this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL); + this.setColour(LOOPS_HUE); + this.appendValueInput('IF0') + .setCheck([Boolean, Number]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_MSG_IF); + this.appendStatementInput('DO0') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_MSG_THEN); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#if"); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['controls_if_elseif', + 'controls_if_else'], this)); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_TOOLTIP_1; + } else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_TOOLTIP_2; + } else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_TOOLTIP_3; + } else if (thisBlock.elseifCount_ && thisBlock.elseCount_) { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_TOOLTIP_4; + } + return ''; + }); + this.elseifCount_ = 0; + this.elseCount_ = 0; + }, + /** + * Create XML to represent the number of else-if and else inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + if (!this.elseifCount_ && !this.elseCount_) { + return null; + } + var container = document.createElement('mutation'); + if (this.elseifCount_) { + container.setAttribute('elseif', this.elseifCount_); + } + if (this.elseCount_) { + container.setAttribute('else', 1); + } + return container; + }, + /** + * Parse XML to restore the else-if and else inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var containerBlock = this; + var valueConnections = []; + var statementConnections = []; + // var elseStatementConnection = null; + if (this.elseCount_) { + // if (containerBlock.getInputTargetBlock('ELSE') && containerBlock.getInputTargetBlock('ELSE').previousConnection) + // elseStatementConnection = containerBlock.getInputTargetBlock('ELSE').previousConnection; + this.removeInput('ELSE'); + } + for (var i = this.elseifCount_; i > 0; i--) { + if (containerBlock.getInputTargetBlock('IF' + i) && containerBlock.getInputTargetBlock('IF' + i).previousConnection) + valueConnections[i] = (containerBlock.getInputTargetBlock('IF' + i).previousConnection); + else + valueConnections[i] = null; + this.removeInput('IF' + i); + if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection) + statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection); + else + statementConnections[i] = null; + this.removeInput('DO' + i); + } + this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10); + this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10); + //this.compose(containerBlock); + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck([Boolean, Number]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_MSG_ELSEIF); + this.appendStatementInput('DO' + i) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_MSG_THEN); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_MSG_ELSE); + } + for (var i = valueConnections.length - 2; i > 0; i--) { + if (valueConnections[i]) + valueConnections[i].reconnect(this, 'IF' + i); + } + for (var i = statementConnections.length - 2; i > 0; i--) { + if (statementConnections[i]) + statementConnections[i].reconnect(this, 'DO' + i); + } + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = workspace.newBlock('controls_if_if'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 1; i <= this.elseifCount_; i++) { + var elseifBlock = workspace.newBlock('controls_if_elseif'); + elseifBlock.initSvg(); + connection.connect(elseifBlock.previousConnection); + connection = elseifBlock.nextConnection; + } + if (this.elseCount_) { + var elseBlock = workspace.newBlock('controls_if_else'); + elseBlock.initSvg(); + connection.connect(elseBlock.previousConnection); + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + // Disconnect the else input blocks and remove the inputs. + if (this.elseCount_) { + this.removeInput('ELSE'); + } + this.elseCount_ = 0; + // Disconnect all the elseif input blocks and remove the inputs. + for (var i = this.elseifCount_; i > 0; i--) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + } + this.elseifCount_ = 0; + // Rebuild the block's optional inputs. + var clauseBlock = containerBlock.getInputTargetBlock('STACK'); + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_if_elseif': + this.elseifCount_++; + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); + break; + case 'controls_if_else': + this.elseCount_++; + elseStatementConnection = clauseBlock.statementConnection_; + break; + default: + throw Error('Unknown block type: ' + clauseBlock.type); + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + + this.updateShape_(); + // Reconnect any child blocks. + this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection); + + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var clauseBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 1; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_if_elseif': + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + clauseBlock.valueConnection_ = + inputIf && inputIf.connection.targetConnection; + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + i++; + break; + case 'controls_if_else': + var inputDo = this.getInput('ELSE'); + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + break; + default: + throw 'Unknown block type.'; + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + }, + /** + * Reconstructs the block with all child blocks attached. + */ + rebuildShape_: function () { + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + + if (this.getInput('ELSE')) { + elseStatementConnection = this.getInput('ELSE').connection.targetConnection; + } + var i = 1; + while (this.getInput('IF' + i)) { + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + console.log(inputIf.connection.targetConnection); + valueConnections.push(inputIf.connection.targetConnection); + statementConnections.push(inputDo.connection.targetConnection); + i++; + } + this.updateShape_(); + this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection); + }, + /** + * Modify this block to have the correct number of inputs. + * @this Blockly.Block + * @private + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('ELSE')) { + this.removeInput('ELSE'); + } + var i = 1; + while (this.getInput('IF' + i)) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + i++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck([Number, Boolean]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['CONTROLS_IF_MSG_ELSEIF']); + this.appendStatementInput('DO' + i) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['CONTROLS_IF_MSG_THEN']); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['CONTROLS_IF_MSG_ELSE']); + } + }, + /** + * Reconnects child blocks. + * @param {!Array} valueConnections List of value + * connectsions for if input. + * @param {!Array} statementConnections List of + * statement connections for do input. + * @param {?Blockly.RenderedConnection} elseStatementConnection Statement + * connection for else input. + */ + reconnectChildBlocks_: function (valueConnections, statementConnections, + elseStatementConnection) { + for (var i = 1; i <= this.elseifCount_; i++) { + valueConnections[i] && valueConnections[i].reconnect(this, 'IF' + i); + statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i); + } + elseStatementConnection && elseStatementConnection.reconnect(this, 'ELSE'); + } +}; + + +const controls_range = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYTHON_RANGE) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYTHON_RANGE_STEP); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + + +const controls_forEach = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendValueInput('LIST') + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FOREACH_INPUT); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FOREACH_INPUT_ITEM) + // .appendField(new Blockly.FieldTextInput('i'), 'VAR'); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(function () { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FOR_TOOLTIP.replace('“%1”', ''); + }); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const controls_whileUntil = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendValueInput('BOOL') + .setCheck([Boolean, Number]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_CURRENT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.OPERATORS), 'MODE') + // this.appendDummyInput() + // .appendField(Blockly.Msg.CONTROLS_WHILE_SHI); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var op = thisBlock.getFieldValue('MODE'); + var TOOLTIPS = { + 'WHILE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE, + 'UNTIL': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL + }; + return TOOLTIPS[op]; + }); + } +}; + +const controls_try_finally = { + /** + * Block for if/elseif/else condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TRY); + this.appendStatementInput('try'); + this.appendValueInput('IF1') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_EXCEPT); + this.appendStatementInput('DO1') + .appendField(''); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['controls_except', 'controls_finally'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_CONTROL_TRY_TOOLTIP); + this.elseifCount_ = 1; + this.elseCount_ = 0; + }, + /** + * Create XML to represent the number of else-if and else inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + if (!this.elseifCount_ && !this.elseCount_) { + return null; + } + var container = document.createElement('mutation'); + if (this.elseifCount_) { + container.setAttribute('elseif', this.elseifCount_); + } + if (this.elseCount_) { + container.setAttribute('else', 1); + } + return container; + }, + /** + * Parse XML to restore the else-if and else inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var containerBlock = this; + var valueConnections = []; + var statementConnections = []; + // var elseStatementConnection = null; + if (this.elseCount_) { + // if (containerBlock.getInputTargetBlock('ELSE') && containerBlock.getInputTargetBlock('ELSE').previousConnection) + // elseStatementConnection = containerBlock.getInputTargetBlock('ELSE').previousConnection; + this.removeInput('ELSE'); + } + for (var i = this.elseifCount_; i > 0; i--) { + if (containerBlock.getInputTargetBlock('IF' + i) && containerBlock.getInputTargetBlock('IF' + i).previousConnection) + valueConnections[i] = (containerBlock.getInputTargetBlock('IF' + i).previousConnection); + else + valueConnections[i] = null; + this.removeInput('IF' + i); + if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection) + statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection); + else + statementConnections[i] = null; + this.removeInput('DO' + i); + } + this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10); + this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10); + //this.compose(containerBlock); + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck([Boolean, Number]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_EXCEPT); + this.appendStatementInput('DO' + i) + .appendField(""); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_FINALLY); + } + for (var i = valueConnections.length - 2; i > 0; i--) { + if (valueConnections[i]) + valueConnections[i].reconnect(this, 'IF' + i); + } + for (var i = statementConnections.length - 2; i > 0; i--) { + if (statementConnections[i]) + statementConnections[i].reconnect(this, 'DO' + i); + } + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = workspace.newBlock('controls_try'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 1; i <= this.elseifCount_; i++) { + var elseifBlock = workspace.newBlock('controls_except'); + elseifBlock.initSvg(); + connection.connect(elseifBlock.previousConnection); + connection = elseifBlock.nextConnection; + } + if (this.elseCount_) { + var elseBlock = workspace.newBlock('controls_finally'); + elseBlock.initSvg(); + connection.connect(elseBlock.previousConnection); + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + // Disconnect the else input blocks and remove the inputs. + if (this.elseCount_) { + this.removeInput('ELSE'); + } + this.elseCount_ = 0; + // Disconnect all the elseif input blocks and remove the inputs. + for (var i = this.elseifCount_; i > 0; i--) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + } + this.elseifCount_ = 0; + // Rebuild the block's optional inputs. + var clauseBlock = containerBlock.getInputTargetBlock('STACK'); + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_except': + this.elseifCount_++; + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); + break; + case 'controls_finally': + this.elseCount_++; + elseStatementConnection = clauseBlock.statementConnection_; + break; + default: + throw Error('Unknown block type: ' + clauseBlock.type); + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + + this.updateShape_(); + // Reconnect any child blocks. + this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection); + + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var clauseBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 1; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_except': + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + clauseBlock.valueConnection_ = + inputIf && inputIf.connection.targetConnection; + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + i++; + break; + case 'controls_finally': + var inputDo = this.getInput('ELSE'); + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + break; + default: + throw 'Unknown block type.'; + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + }, + /** + * Reconstructs the block with all child blocks attached. + */ + rebuildShape_: function () { + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + + if (this.getInput('ELSE')) { + elseStatementConnection = this.getInput('ELSE').connection.targetConnection; + } + var i = 1; + while (this.getInput('IF' + i)) { + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + console.log(inputIf.connection.targetConnection); + valueConnections.push(inputIf.connection.targetConnection); + statementConnections.push(inputDo.connection.targetConnection); + i++; + } + this.updateShape_(); + this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection); + }, + /** + * Modify this block to have the correct number of inputs. + * @this Blockly.Block + * @private + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('ELSE')) { + this.removeInput('ELSE'); + } + var i = 1; + while (this.getInput('IF' + i)) { + this.removeInput('IF' + i); + this.removeInput('DO' + i); + i++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput('IF' + i) + .setCheck([Number, Boolean]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_EXCEPT); + this.appendStatementInput('DO' + i) + .appendField(''); + } + if (this.elseCount_) { + this.appendStatementInput('ELSE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_FINALLY); + } + }, + /** + * Reconnects child blocks. + * @param {!Array} valueConnections List of value + * connectsions for if input. + * @param {!Array} statementConnections List of + * statement connections for do input. + * @param {?Blockly.RenderedConnection} elseStatementConnection Statement + * connection for else input. + */ + reconnectChildBlocks_: function (valueConnections, statementConnections, + elseStatementConnection) { + for (var i = 1; i <= this.elseifCount_; i++) { + valueConnections[i] && valueConnections[i].reconnect(this, 'IF' + i); + statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i); + } + elseStatementConnection && elseStatementConnection.reconnect(this, 'ELSE'); + } +}; + +const controls_flow_statements = { + init: function () { + this.setColour(LOOPS_HUE); + var dropdown = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.OPERATORS); + this.appendDummyInput() + .appendField(dropdown, 'FLOW') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FLOW_STATEMENTS_INPUT_OFLOOP); + this.setPreviousStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_FLOW_STATEMENTS_TOOLTIP); + var thisBlock = this; + this.setTooltip(function () { + var op = thisBlock.getFieldValue('FLOW'); + var TOOLTIPS = { + 'BREAK': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK, + 'CONTINUE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE + }; + return TOOLTIPS[op]; + }); + }, + onchange: function () { + if (!this.workspace) { + // Block has been deleted. + return; + } + var legal = false; + // Is the block nested in a control statement? + var block = this; + do { + if (block.type == 'controls_repeat' || + block.type == 'controls_for' || + block.type == 'controls_forEach' || + block.type == 'controls_repeat_ext' || + block.type == 'controls_whileUntil' || + block.type == 'do_while') { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + this.setWarningText(null); + } else { + this.setWarningText(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FLOW_STATEMENTS_WARNING); + } + } +}; + + +const controls_for = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_WITH) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('i'), 'VAR'); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STEP); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FOR_TOOLTIP.replace('%1', + thisBlock.getFieldValue('VAR')); + }); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const controls_for_range = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_WITH) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('i'), 'VAR'); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STEP); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_FOR_RANGE_TOOLTIP.replace('%1', + thisBlock.getFieldValue('VAR')); + }); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + + +controls_whileUntil.OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE, 'WHILE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, 'UNTIL'] +]; + + + +controls_flow_statements.OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK, 'BREAK'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE, 'CONTINUE'] +]; + + + +const controls_if_if = { + /** + * Mutator block for if container. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_IF_TITLE_IF); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_IF_TOOLTIP); + this.contextMenu = false; + } +}; + +const controls_if_elseif = { + /** + * Mutator bolck for else-if condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_ELSEIF_TOOLTIP); + this.contextMenu = false; + } +}; + +const controls_if_else = { + /** + * Mutator block for else condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_ELSE_TITLE_ELSE); + this.setPreviousStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_IF_ELSE_TOOLTIP); + this.contextMenu = false; + } +}; + + + +const controls_try = { + /** + * Mutator block for if container. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField('try'); + this.appendStatementInput('STACK'); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.contextMenu = false; + } +}; + +const controls_except = { + /** + * Mutator bolck for else-if condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_EXCEPT); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.contextMenu = false; + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_CONTROL_EXCEPT_TOOLTIP); + } +}; + +const controls_finally = { + /** + * Mutator block for else condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_FINALLY); + this.setPreviousStatement(true); + this.contextMenu = false; + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_CONTROL_FINALLY_TOOLTIP); + } +}; + + + +const controls_repeat_ext = { + /** + * Block for repeat n times (external number). + * @this Blockly.Block + */ + init: function () { + this.jsonInit({ + "message0": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_REPEAT_TITLE, + "args0": [ + { + "type": "input_value", + "name": "TIMES", + // "check": "Number" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": LOOPS_HUE, + "tooltip": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_REPEAT_TOOLTIP, + "helpUrl": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_REPEAT_HELPURL + }); + this.appendStatementInput('DO'); + } +}; + + + +const controls_lambda = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendValueInput('BOOL') + .appendField('lambda') + //.appendField(new Blockly.FieldDropdown(this.OPERATORS), 'MODE'); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STAT); + this.setOutput(true); + // this.setNextStatement(true); + } +}; + +const controls_pass = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_PASS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_PASS_TOOLTIP); + } +}; + +const controls_thread = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_START) + this.appendValueInput('callback') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PARAMS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_TOOLTIP); + } +}; + +//do-while循环 +const do_while = { + init: function () { + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_REPEAT_TITLE_REPEAT + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DO); + this.appendStatementInput("input_data") + .setCheck(null) + this.appendValueInput("select_data") + .setCheck(null) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_OPERATOR_UNTIL) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE, "true"], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, "false"]]), "type"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(LOOPS_HUE); + this.setTooltip("do-while loop"); + this.setHelpUrl(""); + } +}; + +const garbage_collection = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_OP_GARBAGE_COLLECT); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const get_mem_alloc = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET_MEM_ALLOC); + this.setOutput(true) + } +}; + +const get_mem_free = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET_MEM_FREE); + this.setOutput(true) + } +}; + +const get_unique_identifier = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DEVICE + 'ID'); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET_UNIQUE_IDEN); + } +}; + +// export const base_type = controls_type; +// export const controls_TypeLists = controls_typeLists; + +const datetime_fromtimestamp = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_RTC_TIMESTAMP); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TIMESTAMP_TO_DATA); + this.setInputsInline(true); + this.setOutput(true, Number); + } +}; + + +const gene_unique_identifier = { + init: function () { + this.setColour(LOOPS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET_UNIQUE_IDEN); + this.setOutput(true) + } +}; + +/***/ }), + +/***/ "../python/blocks/dicts.js": +/*!*********************************!*\ + !*** ../python/blocks/dicts.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ dicts_add_change_del: () => (/* binding */ dicts_add_change_del), +/* harmony export */ dicts_add_or_change: () => (/* binding */ dicts_add_or_change), +/* harmony export */ dicts_clear: () => (/* binding */ dicts_clear), +/* harmony export */ dicts_create_with: () => (/* binding */ dicts_create_with), +/* harmony export */ dicts_create_with_container: () => (/* binding */ dicts_create_with_container), +/* harmony export */ dicts_create_with_item: () => (/* binding */ dicts_create_with_item), +/* harmony export */ dicts_create_with_noreturn: () => (/* binding */ dicts_create_with_noreturn), +/* harmony export */ dicts_deldict: () => (/* binding */ dicts_deldict), +/* harmony export */ dicts_delete: () => (/* binding */ dicts_delete), +/* harmony export */ dicts_get: () => (/* binding */ dicts_get), +/* harmony export */ dicts_get_default: () => (/* binding */ dicts_get_default), +/* harmony export */ dicts_items: () => (/* binding */ dicts_items), +/* harmony export */ dicts_keys: () => (/* binding */ dicts_keys), +/* harmony export */ dicts_length: () => (/* binding */ dicts_length), +/* harmony export */ dicts_pop: () => (/* binding */ dicts_pop), +/* harmony export */ dicts_setdefault: () => (/* binding */ dicts_setdefault), +/* harmony export */ dicts_to_json: () => (/* binding */ dicts_to_json), +/* harmony export */ dicts_to_json2: () => (/* binding */ dicts_to_json2), +/* harmony export */ dicts_to_to: () => (/* binding */ dicts_to_to), +/* harmony export */ dicts_todict: () => (/* binding */ dicts_todict), +/* harmony export */ dicts_update: () => (/* binding */ dicts_update), +/* harmony export */ dicts_values: () => (/* binding */ dicts_values), +/* harmony export */ json_to_dicts: () => (/* binding */ json_to_dicts) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Dictionary blocks for Blockly. + * @author acbart@vt.edu (Austin Cory Bart) + */ + + +const DICTS_HUE = 345; + +const dicts_create_with = { + + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + + init: function () { + this.setColour(DICTS_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('mydict'), 'VAR') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldLabel(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_INPUT_WITH), 'TIP') + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['dicts_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_TOOLTIP); + }, + + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('dicts_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('dicts_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } + + var keyNames = []; + for (var i = 0; this.getInput('ADD' + i); i++) { + //this.getInput('VALUE' + i).removeField("KEY"+i); + keyNames.push(this.getFieldValue("KEY" + i)) + this.removeInput('ADD' + i); + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.getField('TIP').setValue(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_EMPTY_TITLE); + } else { + this.getField('TIP').setValue(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_INPUT_WITH); + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ADD' + i) + .setCheck(null) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField( + new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput( + keyNames.length > i + ? keyNames[i] + : (i == 0 ? '"key"' : '"key' + (i + 1) + '"')), + 'KEY' + i) + .appendField(":") + } + } + }, getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + + + +const dicts_create_with_container = { + + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const dicts_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +const dicts_keys = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_KEYS); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_KEYS_TOOLTIP); + this.setOutput(true, 'List'); + } +}; + +const dicts_get = { + init: function () { + this.setColour(DICTS_HUE); + // this.appendDummyInput("") + + // .appendField(Blockly.Msg.DICTS_GET_FROM_DICTS) + + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_GET_IN) + this.appendDummyInput("") + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_GET_TOOLTIP); + } +}; + +const dicts_get_default = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_GET_IN) + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DEFAULT_VALUE); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_GET_DEFAULT_TOOLTIP); + } +}; + +const dicts_add_or_change = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD) + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + this.appendDummyInput() + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_OR_CHANGE_TOOLTIP); + } +}; + + +const dicts_delete = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DELETE_IN) + this.appendDummyInput("") + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DELETE_VALUE); + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DELETE_TOOLTIP); + } +}; + + +const dicts_update = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT2') + .setCheck('Dict') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MAKE_DICT) + this.appendValueInput('DICT') + .setCheck('Dict') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_UPDATE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MID); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_UPDATE_TOOLTIP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const dicts_clear = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_CLEAR); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CLEAR_TOOLTIP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const dicts_items = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_ITEMS); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ITEMS_TOOLTIP); + this.setOutput(true, 'List'); + } +}; + +const dicts_values = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_VALUES); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_VALUES_TOOLTIP); + this.setOutput(true, 'List'); + } +}; + +const dicts_length = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LENGTH) + + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_LENGTH_TOOLTIP); + this.setOutput(true, Number); + } +}; + +const dicts_deldict = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_DELDICT); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DEL_TOOLTIP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const dicts_add_change_del = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + + this['MODE'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_OR_CHANGE, 'INSERT'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_DELETE_VAR, 'DELETE'] + ]; + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput('AT2') + this.appendValueInput('KEY') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE) + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + this.updateAt_(true); + this.setInputsInline(true); + this.setOutput(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + var b = this; + this.setTooltip(function () { + var e = b.getFieldValue("WHERE"), + d = ""; + switch (e) { + case "INSERT": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_TOOLTIP; + break; + case "DELETE": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DELETE_TOOLTIP; + break; + } + //if ("FROM_START" == e || "FROM_END" == e) d += " " + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1", ONE_BASED_INDEXING ? "#1": "#0"); + return d + }) + + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + var isAt = this.getInput('AT2').type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + container.setAttribute('at2', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var isAt = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(isAt); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function (isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT2'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT2').setCheck(Number); + } else { + this.appendDummyInput('AT2'); + } + var menu = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this['MODE'], + function (value) { + var newAt = (value == 'INSERT'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + + this.getInput('AT2') + .appendField(menu, 'WHERE'); + + // this.moveInputBefore('AT2','LIST'); + } +}; + +const dicts_pop = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_DICT_POP) + this.appendValueInput('KEY') + this.appendDummyInput("") + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICT_POP_TOOLTIP); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +const dicts_setdefault = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict'); + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_SET_DEFAULT) + this.appendDummyInput("") + // .appendField(new Blockly.FieldTextInput('"key"'), 'KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DEFAULT_VALUE); + this.appendValueInput('VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_SETDEFAULT_TOOLTIP); + } +}; + +const dicts_create_with_noreturn = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(DICTS_HUE); + this.appendDummyInput("") + // .appendField(new Blockly.FieldTextInput('mydict'), 'VAR') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldLabel(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT), 'TIP') + .appendField(' ') + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, "Dict") + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['dicts_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_CREATE_WITH_TOOLTIP); + }, + + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('dicts_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('dicts_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } + + var keyNames = []; + for (var i = 0; this.getInput('ADD' + i); i++) { + //this.getInput('VALUE' + i).removeField("KEY"+i); + keyNames.push(this.getFieldValue("KEY" + i)) + this.removeInput('ADD' + i); + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.getField('TIP').setValue(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NULL + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT); + } else { + this.getField('TIP').setValue(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT); + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ADD' + i) + .setCheck(null) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField( + new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput( + keyNames.length > i + ? keyNames[i] + : (i == 0 ? '"key"' : '"key' + (i + 1) + '"')), + 'KEY' + i) + .appendField(":") + } + + } + }, getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const dicts_todict = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TODICT); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TODICT); + } +}; + +const dicts_to_json = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_JSON); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_JSON_TOOLTIP); + this.setOutput(true); + } +}; + +const json_to_dicts = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('VAR'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_CONVERT_TO_JSON); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP); + this.setOutput(true); + } +}; + +const dicts_to_to ={ + init:function(){ + this.setColour(DICTS_HUE); + this.appendValueInput('DICT') + .setCheck('Dict'); + this.appendValueInput('VAR1') + .appendField('key1'); + this.appendValueInput('VAR2') + .appendField('index'); + this.appendValueInput('VAR3') + .appendField('key2'); + this.appendValueInput('VAR4') + .appendField('key3'); + this.setInputsInline(true) + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP); + this.setOutput(true); + } +} + +const dicts_to_json2 = { + init: function () { + this.setColour(DICTS_HUE); + this.appendValueInput('DICT'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_JSON); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_JSON_TOOLTIP); + this.setOutput(true); + } +}; + +/***/ }), + +/***/ "../python/blocks/html.js": +/*!********************************!*\ + !*** ../python/blocks/html.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ html_content: () => (/* binding */ html_content), +/* harmony export */ html_content_more: () => (/* binding */ html_content_more), +/* harmony export */ html_document: () => (/* binding */ html_document), +/* harmony export */ html_form: () => (/* binding */ html_form), +/* harmony export */ html_head_body: () => (/* binding */ html_head_body), +/* harmony export */ html_style: () => (/* binding */ html_style), +/* harmony export */ html_style_color: () => (/* binding */ html_style_color), +/* harmony export */ html_style_content: () => (/* binding */ html_style_content), +/* harmony export */ html_text: () => (/* binding */ html_text), +/* harmony export */ html_title: () => (/* binding */ html_title) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const HTML_HUE = '#1ec1e4'; + +const html_document = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_DOCUMENT); + this.appendStatementInput('HEAD') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_HEAD); + this.appendStatementInput('BODY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_BODY); + this.setOutput(true); + } +}; + +const html_title = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_LEVEL) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"]]), 'LEVEL'); + this.appendStatementInput('DO') + .appendField(''); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_head_body = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_HEAD, "head"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_BODY, "body"] + ]), 'LEVEL'); + this.appendStatementInput('DO') + .appendField(''); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_content = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_P, "p"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_SPAN, "span"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_FORM, "form"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_TABLE, "table"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_LINE, "tr"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_CELL, "td"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_OL, "ol"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_UL, "ul"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_LI, "li"] + ]), 'LEVEL') + // this.appendValueInput('style') + // .appendField(Blockly.Msg.MIXLY_AIP_ATTR) + // .setAlign(Blockly.inputs.Align.RIGHT); + this.appendStatementInput('DO') + .appendField(''); + this.setInputsInline(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_content_more = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField('<') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('tag'), "LEVEL") + .appendField('>') + this.appendValueInput('style') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_AIP_ATTR) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT); + this.appendStatementInput('DO') + .appendField(''); + this.setInputsInline(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_style = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_STYLE) + this.appendStatementInput('STYLE'); + this.setOutput(true); + } +}; + +const html_form = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_FORM_CONTENT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_TEXT, "text"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_EMAIL, "email"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_NUMBER, "number"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_PASSWORD, "password"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_CHECKBOX, "checkbox"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_RADIOBUTTON, "radiobutton"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_BUTTON, "button"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR, "colour"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_DATE, "date"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_LOCALTIME, "local time"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_FILE, "file"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_HIDDEN, "hidden"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_IMAGE, "image"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_MONTH, "month"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_RANGE, "range"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_RESET, "reset"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_SEARCH, "search"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_SUBMIT, "submit"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_TELEPHONENUMBER, "telephone number"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_TIME, "time"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_URL, "url"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_WEEK, "week"] + ]), 'LEVEL') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_NAME) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('car'), "NAME") + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_VALUE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('go'), "VALUE") + this.appendValueInput('style') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_AIP_ATTR) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_style_content = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('property'), "KEY") + .appendField(':') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('value'), "VALUE") + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_style_color = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('property'), "KEY") + .appendField(':') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour("#ff0000"), "RGB_LED_COLOR"); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const html_text = { + init: function () { + this.setColour(HTML_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_TEXT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('text'), "TEXT"); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +/***/ }), + +/***/ "../python/blocks/lists.js": +/*!*********************************!*\ + !*** ../python/blocks/lists.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ENUMERATE: () => (/* binding */ ENUMERATE), +/* harmony export */ content_in_lists: () => (/* binding */ content_in_lists), +/* harmony export */ enumerate: () => (/* binding */ enumerate), +/* harmony export */ list_many_input: () => (/* binding */ list_many_input), +/* harmony export */ list_tolist: () => (/* binding */ list_tolist), +/* harmony export */ list_tolist2: () => (/* binding */ list_tolist2), +/* harmony export */ list_trig: () => (/* binding */ list_trig), +/* harmony export */ lists_2d_get_col_row_data: () => (/* binding */ lists_2d_get_col_row_data), +/* harmony export */ lists_2d_get_data_with_col_row: () => (/* binding */ lists_2d_get_data_with_col_row), +/* harmony export */ lists_append_extend: () => (/* binding */ lists_append_extend), +/* harmony export */ lists_change_to: () => (/* binding */ lists_change_to), +/* harmony export */ lists_change_to_general: () => (/* binding */ lists_change_to_general), +/* harmony export */ lists_clear: () => (/* binding */ lists_clear), +/* harmony export */ lists_create_with: () => (/* binding */ lists_create_with), +/* harmony export */ lists_create_with2: () => (/* binding */ lists_create_with2), +/* harmony export */ lists_create_with_container: () => (/* binding */ lists_create_with_container), +/* harmony export */ lists_create_with_item: () => (/* binding */ lists_create_with_item), +/* harmony export */ lists_create_with_noreturn: () => (/* binding */ lists_create_with_noreturn), +/* harmony export */ lists_create_with_text: () => (/* binding */ lists_create_with_text), +/* harmony export */ lists_create_with_text2: () => (/* binding */ lists_create_with_text2), +/* harmony export */ lists_del_general: () => (/* binding */ lists_del_general), +/* harmony export */ lists_find: () => (/* binding */ lists_find), +/* harmony export */ lists_getIndex3: () => (/* binding */ lists_getIndex3), +/* harmony export */ lists_getSublist3: () => (/* binding */ lists_getSublist3), +/* harmony export */ lists_get_index: () => (/* binding */ lists_get_index), +/* harmony export */ lists_get_random_item: () => (/* binding */ lists_get_random_item), +/* harmony export */ lists_get_random_sublist: () => (/* binding */ lists_get_random_sublist), +/* harmony export */ lists_get_sublist: () => (/* binding */ lists_get_sublist), +/* harmony export */ lists_insert_value: () => (/* binding */ lists_insert_value), +/* harmony export */ lists_insert_value2: () => (/* binding */ lists_insert_value2), +/* harmony export */ lists_pop: () => (/* binding */ lists_pop), +/* harmony export */ lists_remove_at: () => (/* binding */ lists_remove_at), +/* harmony export */ lists_remove_at2: () => (/* binding */ lists_remove_at2), +/* harmony export */ lists_reverse: () => (/* binding */ lists_reverse), +/* harmony export */ lists_setIndex3: () => (/* binding */ lists_setIndex3), +/* harmony export */ lists_set_index: () => (/* binding */ lists_set_index), +/* harmony export */ lists_sort: () => (/* binding */ lists_sort) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const LISTS_HUE = 260; //'#70b234'//260; + +const lists_get_index = { + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_HELPURL); + this.setColour(LISTS_HUE); + this.appendValueInput("LIST") + this.appendValueInput("AT") + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START) + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM); + } +} + + +const lists_get_sublist = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(LISTS_HUE); + this.appendValueInput('LIST') + this.appendDummyInput('') + this.appendValueInput('AT1') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START); + this.appendValueInput('AT2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_START); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL); + this.setInputsInline(true); + this.setOutput(true, 'List'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYTHON_LISTS_GET_SUBLIST_TOOLTIP); + } +} + +const lists_2d_get_data_with_col_row = { + init: function () { + this.appendValueInput("LIST") + .setCheck(null); + this.appendValueInput("row") + .setCheck(null) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_RAW); + this.appendValueInput("col") + .setCheck(null) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_COLUMN); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(LISTS_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +const lists_2d_get_col_row_data = { + init: function () { + this.appendValueInput("LIST") + .setCheck(null); + this.appendValueInput("row_start") + .setCheck(null) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_RAW + " ["); + this.appendValueInput("row_end") + .setCheck(null) + .appendField(","); + this.appendValueInput("col_start") + .setCheck(null) + .appendField(") " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_COLUMN + " ["); + this.appendValueInput("col_end") + .setCheck(null) + .appendField(","); + this.appendDummyInput() + .appendField(") " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_ADD_VALUE); + this.setInputsInline(true); + this.setOutput(true, 'List'); + this.setColour(LISTS_HUE); + this.setTooltip(""); + this.setHelpUrl(""); + } +}; + +const lists_create_with = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput("") + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE') + // .appendField(' ') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('mylist'), 'VAR') + .appendField('[') + //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE') + .appendField(']'); + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['lists_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('lists_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_PYTHON_EMPTY_TITLE); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_LISTS_CREATE_WITH_INPUT_WITH); + } + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + + +const lists_create_with_text = { + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput("") + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array']]), 'TYPE') + // .appendField(' ') + // .appendField(Blockly.Msg.blockpy_MIXLY_SPLITBYDOU) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('mylist'), 'VAR') + //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE') + // .appendField(Blockly.Msg.MIXLY_MAKELISTFROM) + // .appendField(this.newQuote_(true)) + .appendField(' = [') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0,0,0'), 'TEXT') + .appendField(']'); + // .appendField(this.newQuote_(false)) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LISTS_CREATE_WITH_TEXT2); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +} + + +const lists_create_with_container = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const lists_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + + +const lists_set_index = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('LIST'); + this.appendValueInput('AT') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_LIST_ASSIGN_AT); + this.appendValueInput('TO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_LIST_VALUE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_SET_INDEX_TOOLTIP); + } +}; + +const lists_append_extend = { + init: function () { + this.setColour(LISTS_HUE); + this['TYPE'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_blockpy_set_add, 'append'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_LIST_EXTEND, 'extend'] + ]; + + this.appendValueInput('LIST') + .setCheck('List') + this.appendValueInput('DATA') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this['TYPE']), 'OP') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_LIST_A_ITEM) + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_LIST_TO_END); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'append': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LIST_APPEND, + 'extend': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_EXTEND_TOOLTIP + + }; + return TOOLTIPS[mode]; + }); + } + +}; + +const lists_get_random_item = { + /** + * Block for get a random item from list. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput("LIST"); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_RANDOM) + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM); + this.setOutput(true); + } +}; + +const lists_get_random_sublist = { + /** + * Block for get a random item from list. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput("LIST"); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_RANDOM) + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_GET_INDEX2 + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_RANDOM_SUBLIST) + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_RANDOM_SUBLIST_TOOLTIP); + this.setOutput(true, 'List'); + } +}; + +const lists_insert_value = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('LIST'); + this.appendValueInput('AT') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_LIST_INSERT_AT); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_LIST_VALUE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_SET_INDEX_TOOLTIP); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT); + } +}; + +const lists_reverse = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + .setCheck('List') //this.appendDummyInput("") + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_LIST_REVERSE) + //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_CLEAR_TOOLTIP); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; +const lists_clear = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_CLEAR) + //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_REVERSE_TOOLTIP); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const lists_remove_at = { + init: function () { + this.setColour(LISTS_HUE); + this['TYPE'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SERIES_INDEX, 'del'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_I2C_VALUE, 'remove'] + ]; + this.appendValueInput('LIST') + .setCheck('List') + this.appendValueInput('DATA') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_LISTS_REMOVE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this['TYPE']), 'OP') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'del': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SET_INDEX_TOOLTIP_DELETE, + 'remove': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LIST_REMOVE + }; + return TOOLTIPS[mode]; + }); + } +}; +const lists_pop = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('LIST'); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_LIST_POP); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM); + } +}; + +const lists_find = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_INDEX, 'INDEX'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_COUNT, 'COUNT'] + ]; + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + .setCheck('List') + this.appendValueInput('data') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_VALUE) + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR') + this.setInputsInline(true); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'INDEX': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LIST_FIND_INDEX, + 'COUNT': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LIST_FIND_COUNT + + }; + return TOOLTIPS[mode]; + }); + } +}; +const list_trig = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_LEN, 'LEN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_SUM, 'SUM'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MAX, 'MAX'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MIN, 'MIN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_AVERAGE, 'AVERAGE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MEDIAN, 'MEDIAN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MODE, 'MODE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_STD_DEV, 'STD_DEV'], + ]; + //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); + this.setColour(LISTS_HUE); + this.setOutput(true, Number); + this.appendValueInput('data') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'LEN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_LENGTH_TOOLTIP, + 'SUM': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_SUM, + 'MAX': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_MAX, + 'MIN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_MIN, + 'AVERAGE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_AVERAGE, + 'MEDIAN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_MEDIAN, + 'MODE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_MODE, + 'STD_DEV': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_STD_DEV + + }; + return TOOLTIPS[mode]; + }); + } +}; + +const lists_sort = { + /** + * Block for sorting a list. + * @this Blockly.Block + */ + init: function () { + this.jsonInit({ + "args0": [ + { + "type": "input_value", + "name": "LIST", + "check": "List" + }, + { + "type": "field_dropdown", + "name": "TYPE", + "options": [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_TYPE_NUMERIC, "NUMERIC"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_TYPE_TEXT, "TEXT"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_TYPE_IGNORECASE, "IGNORE_CASE"] + ] + }, + { + "type": "field_dropdown", + "name": "DIRECTION", + "options": [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_ORDER_ASCENDING, "1"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_ORDER_DESCENDING, "-1"] + ] + }, + ], + "message0": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_TITLE, + "inputsInline": true, + "output": "List", + "colour": LISTS_HUE, + "tooltip": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_TOOLTIP, + "helpUrl": blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SORT_HELPURL + }); + } +}; + +const lists_change_to = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD, 'array'] + ]; + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + .setCheck("List") + // .appendField(Blockly.Msg.blockpy_USE_LIST); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.A_TO_B) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'tuple': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_TUPLE, + 'set': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_SET, + 'array': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_ARRAY + }; + return TOOLTIPS[mode]; + }); + + this.setInputsInline(true); + this.setOutput(true); + } +}; + +const list_many_input = { + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput("") + .appendField('[') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0,0,0'), "CONTENT") + .appendField(']'); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +const lists_create_with_noreturn = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, "List") + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['lists_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('lists_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_PYTHON_EMPTY_TITLE); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_LISTS_CREATE_WITH_INPUT_WITH); + } + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +} + +const lists_change_to_general = { + init: function () { + var OPERATORS = + [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set'] + ]; + this.setColour(LISTS_HUE); + this.appendValueInput('VAR'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.A_TO_B) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + + this.setInputsInline(true); + this.setOutput(true); + } +}; + +const lists_del_general = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('TUP') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.OBJECT_DELETE); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const list_tolist = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOLIST); + this.setOutput(true, 'List'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOLIST); + } +}; + +const lists_create_with2 = lists_create_with +const lists_create_with_text2 = lists_create_with_text +const lists_getIndex3 = lists_get_index +const lists_getSublist3 = lists_get_sublist +const lists_setIndex3 = lists_set_index +const lists_insert_value2 = lists_insert_value +const lists_remove_at2 = lists_remove_at +const list_tolist2 = list_tolist; + + +const ENUMERATE ={ + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_USE_LIST); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_INDEX_SEQUENCE); + // this.appendValueInput('VAR_N') + // .appendField(Blockly.Msg.MIXLY_INDEX+Blockly.Msg.MIXLY_STARTSWITH); + this.setInputsInline(true); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOTO_INDEX_SEQUENC_TOOLTIP); + } +}; + +const enumerate = { + init: function () { + this.setColour(LISTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_USE_LIST); + this.appendValueInput('LIST'); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_INDEX_SEQUENCE) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_INDEX+blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STARTSWITH); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOTO_INDEX_SEQUENC_TOOLTIP); + } +}; + +const content_in_lists = { + init: function () { + this.setColour(LISTS_HUE); + this.appendValueInput("CON") + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ESP32_MIXGO_MUSIC_SHOW_IN); + this.appendValueInput("LIST") + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MID); + this.setInputsInline(true); + this.setOutput(true); + } +} + +/***/ }), + +/***/ "../python/blocks/logic.js": +/*!*********************************!*\ + !*** ../python/blocks/logic.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ logic_boolean: () => (/* binding */ logic_boolean), +/* harmony export */ logic_compare: () => (/* binding */ logic_compare), +/* harmony export */ logic_compare_continous: () => (/* binding */ logic_compare_continous), +/* harmony export */ logic_is: () => (/* binding */ logic_is), +/* harmony export */ logic_is_in: () => (/* binding */ logic_is_in), +/* harmony export */ logic_negate: () => (/* binding */ logic_negate), +/* harmony export */ logic_null: () => (/* binding */ logic_null), +/* harmony export */ logic_operation: () => (/* binding */ logic_operation), +/* harmony export */ logic_tobool: () => (/* binding */ logic_tobool), +/* harmony export */ logic_true_or_false: () => (/* binding */ logic_true_or_false) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const LOGIC_HUE = 210; + +const logic_compare = { + /** + * Block for comparison operator. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = blockly_core__WEBPACK_IMPORTED_MODULE_0__.RTL ? [ + ['=', 'EQ'], + ['\u2260', 'NEQ'], + ['>', 'LT'], + ['\u2265', 'LTE'], + ['<', 'GT'], + ['\u2264', 'GTE'] + ] : [ + ['=', 'EQ'], + ['\u2260', 'NEQ'], + ['<', 'LT'], + ['\u2264', 'LTE'], + ['>', 'GT'], + ['\u2265', 'GTE'] + ]; + //this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true, Boolean); + this.appendValueInput('A'); + this.appendValueInput('B') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var op = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'EQ': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_EQ, + 'NEQ': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_NEQ, + 'LT': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_LT, + 'LTE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_LTE, + 'GT': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_GT, + 'GTE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_COMPARE_TOOLTIP_GTE + }; + return TOOLTIPS[op]; + }); + this.prevBlocks_ = [null, null]; + }, + /** + * Called whenever anything on the workspace changes. + * Prevent mismatched types from being compared. + * @this Blockly.Block + */ + /*onchange: function(e) { + var blockA = this.getInputTargetBlock('A'); + var blockB = this.getInputTargetBlock('B'); + // Disconnect blocks that existed prior to this change if they don't match. + if (blockA && blockB && + !blockA.outputConnection.checkType_(blockB.outputConnection)) { + // Mismatch between two inputs. Disconnect previous and bump it away. + // Ensure that any disconnections are grouped with the causing event. + Blockly.Events.setGroup(e.group); + for (var i = 0; i < this.prevBlocks_.length; i++) { + var block = this.prevBlocks_[i]; + if (block === blockA || block === blockB) { + block.unplug(); + block.bumpNeighbours_(); + } + } + Blockly.Events.setGroup(false); + } + this.prevBlocks_[0] = blockA; + this.prevBlocks_[1] = blockB; + }*/ +}; + +const logic_compare_continous = { + + init: function () { + var OPERATORS1 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.RTL ? [ + ['>', 'LT'], + ['\u2265', 'LTE'], + ['<', 'GT'], + ['\u2264', 'GTE'] + ] : [ + ['<', 'LT'], + ['\u2264', 'LTE'], + ['>', 'GT'], + ['\u2265', 'GTE'] + ]; + var OPERATORS2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.RTL ? [ + ['>', 'LT'], + ['\u2265', 'LTE'], + ['<', 'GT'], + ['\u2264', 'GTE'] + ] : [ + ['<', 'LT'], + ['\u2264', 'LTE'], + ['>', 'GT'], + ['\u2265', 'GTE'] + ]; + //this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true, Boolean); + this.appendValueInput('A'); + this.appendValueInput('B') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS1), 'OP1'); + this.appendValueInput('C') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS2), 'OP2'); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LOGIC_COMPARE_CONTINOUS_TOOLTIP); + + } +}; + +const logic_operation = { + /** + * Block for logical operations: 'and', 'or'. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_AND, 'AND'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_OR, 'OR'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_NOR, 'NOR'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_XOR, 'XOR'] + ]; + //this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true, Boolean); + this.appendValueInput('A') + .setCheck([Boolean, Number]); + this.appendValueInput('B') + .setCheck([Boolean, Number]) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var op = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'AND': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_TOOLTIP_AND, + 'OR': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_TOOLTIP_OR, + 'NOR': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_TOOLTIP_NOR, + 'XOR': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_OPERATION_TOOLTIP_XOR + }; + return TOOLTIPS[op]; + }); + } +}; + +const logic_negate = { + /** + * Block for negation. + * @this Blockly.Block + */ + init: function () { + //this.setHelpUrl(Blockly.Msg.LOGIC_NEGATE_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true, Boolean); + this.appendValueInput('BOOL') + .setCheck([Number, Boolean]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NEGATE_TITLE); + //this.interpolateMsg(Blockly.Msg.LOGIC_NEGATE_TITLE, + // ['BOOL', Boolean, Blockly.inputs.Align.RIGHT], + // Blockly.inputs.Align.RIGHT); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NEGATE_TOOLTIP); + } +}; + +const logic_boolean = { + /** + * Block for boolean data type: true and false. + * @this Blockly.Block + */ + init: function () { + var BOOLEANS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_BOOLEAN_TRUE, 'TRUE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_BOOLEAN_FALSE, 'FALSE'] + ]; + //this.setHelpUrl(Blockly.Msg.LOGIC_BOOLEAN_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true, Boolean); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(BOOLEANS), 'BOOL'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_BOOLEAN_TOOLTIP); + } +}; + +const logic_null = { + /** + * Block for null data type. + * @this Blockly.Block + */ + init: function () { + //this.setHelpUrl(Blockly.Msg.LOGIC_NULL_HELPURL); + this.setColour(LOGIC_HUE); + this.setOutput(true); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NULL); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NULL_TOOLTIP); + } +}; + +const logic_true_or_false = { + init: function () { + this.setColour(LOGIC_HUE); + this.appendValueInput('A'); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_TERNARY_IF_TRUE); + this.appendValueInput('C') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_TERNARY_IF_FALSE); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_LOGIT_TRUEORFALSE); + } +}; + +const logic_is_in = { + init: function () { + var BOOLEANS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_APPEND_TO, 'in'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LOGIC_IS_NOT_IN, 'not in'] + ]; + this.setColour(LOGIC_HUE); + this.appendValueInput('A'); + this.appendValueInput('B') + .setCheck([String, 'List']) + //.appendField(Blockly.Msg.TEXT_APPEND_TO) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(BOOLEANS), 'BOOL'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MICROBIT_LOGIC_IS_IN); + this.setOutput(true, Boolean); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.IN); + } +}; + +const logic_is = { + init: function () { + var BOOLEANS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LOGIC_IS, 'is'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LOGIC_IS_NOT, 'is not'] + ]; + this.setColour(LOGIC_HUE); + this.appendValueInput('A'); + this.appendValueInput('B') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(BOOLEANS), 'BOOL'); + //.appendField(Blockly.Msg.MIXLY_PYTHON_LOGIC_IS); + this.setOutput(true, Boolean); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LOGIC_IS_TOOLTIP); + } +}; + +const logic_tobool = { + init: function () { + this.setColour(LOGIC_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOBOOL); + this.setOutput(true, Boolean); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOBOOL); + } +}; + +/***/ }), + +/***/ "../python/blocks/math.js": +/*!********************************!*\ + !*** ../python/blocks/math.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ base_map: () => (/* binding */ base_map), +/* harmony export */ generate_cartesian_product: () => (/* binding */ generate_cartesian_product), +/* harmony export */ math_arithmetic: () => (/* binding */ math_arithmetic), +/* harmony export */ math_bit: () => (/* binding */ math_bit), +/* harmony export */ math_constant: () => (/* binding */ math_constant), +/* harmony export */ math_constant_mp: () => (/* binding */ math_constant_mp), +/* harmony export */ math_constrain: () => (/* binding */ math_constrain), +/* harmony export */ math_dec: () => (/* binding */ math_dec), +/* harmony export */ math_degree_to_radian: () => (/* binding */ math_degree_to_radian), +/* harmony export */ math_indexer_number: () => (/* binding */ math_indexer_number), +/* harmony export */ math_map: () => (/* binding */ math_map), +/* harmony export */ math_max_min: () => (/* binding */ math_max_min), +/* harmony export */ math_number: () => (/* binding */ math_number), +/* harmony export */ math_number_base_conversion: () => (/* binding */ math_number_base_conversion), +/* harmony export */ math_radian_to_degree: () => (/* binding */ math_radian_to_degree), +/* harmony export */ math_random: () => (/* binding */ math_random), +/* harmony export */ math_random_seed: () => (/* binding */ math_random_seed), +/* harmony export */ math_round: () => (/* binding */ math_round), +/* harmony export */ math_selfcalcu: () => (/* binding */ math_selfcalcu), +/* harmony export */ math_to_int: () => (/* binding */ math_to_int), +/* harmony export */ math_trig: () => (/* binding */ math_trig), +/* harmony export */ text_to_number: () => (/* binding */ text_to_number), +/* harmony export */ text_to_number_skulpt: () => (/* binding */ text_to_number_skulpt), +/* harmony export */ turn_to_int: () => (/* binding */ turn_to_int) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const MATH_HUE = 230; //'#e49f16'; + +blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.math_number_validator = function (text) { + //return window.isNaN(text) ? null : String(text); + // var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\.[a-fA-F0-9]+)?$/; + // return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配 + return String(text);//不再校验 +}; + +blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.math_number_validator_include_blank = function (text) { + if (text === "") { + return ""; + } + var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\.[a-fA-F0-9]+)?$/; + return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配 +}; + +const math_number = { + /** + * Block for numeric value. + * @this Blockly.Block + */ + init: function () { + this.setColour(MATH_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0', + blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.math_number_validator), 'NUM'); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_NUMBER_TOOLTIP); + } +}; + +const math_constant = { + init: function () { + this.setColour(MATH_HUE); + var constant = + [['π', 'pi'], ['e', 'e']]; + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(constant), 'CONSTANT') + + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('CONSTANT'); + var TOOLTIPS = { + 'pi': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_TOOLTIP, + 'e': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + + } +}; + +const math_constant_mp = { + init: function () { + this.setColour(MATH_HUE); + var constant = + [['π', 'pi'], ['e', 'e']]; + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(constant), 'CONSTANT') + + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('CONSTANT'); + var TOOLTIPS = { + 'pi': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_MP_TOOLTIP, + 'e': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_MP_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + + } +}; + +const math_arithmetic = { + /** + * Block for basic arithmetic operator. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['+', 'ADD'], + ['-', 'MINUS'], + ['×', 'MULTIPLY'], + ['÷', 'DIVIDE'], + ['%', 'QUYU'], + ['//', 'ZHENGCHU'], + ['**', 'POWER'] + ]; + //this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL); + this.setColour(MATH_HUE); + this.setOutput(true); + this.appendValueInput('A') + this.appendValueInput('B') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'ADD': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_ADD, + 'MINUS': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS, + 'MULTIPLY': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY, + 'DIVIDE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE, + 'QUYU': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_MODULO_TOOLTIP, + 'ZHENGCHU': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE, + 'POWER': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_POWER + }; + return TOOLTIPS[mode]; + }); + } +}; + +const math_selfcalcu = { + /** + * Block for basic arithmetic operator. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['+=', 'ADD'], + ['-=', 'MINUS'], + ['×=', 'MULTIPLY'], + ['÷=', 'DIVIDE'], + ['%=', 'QUYU'], + ['//=', 'ZHENGCHU'], + ['**=', 'POWER'] + ]; + + this.setColour(MATH_HUE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.appendValueInput('A') + this.appendValueInput('B') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'ADD': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_ADD, + 'MINUS': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS, + 'MULTIPLY': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY, + 'DIVIDE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE, + 'QUYU': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_MODULO_TOOLTIP, + 'ZHENGCHU': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE, + 'POWER': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ARITHMETIC_TOOLTIP_POWER + }; + return TOOLTIPS[mode]; + }); + } +}; + +const math_bit = { + init: function () { + var OPERATORS = [ + ['&', '&'], + ['|', '|'], + ['>>', '>>'], + ['<<', '<<'] + ]; + this.setColour(MATH_HUE); + this.setOutput(true, Number); + this.appendValueInput('A') + .setCheck(Number); + this.appendValueInput('B') + .setCheck(Number) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + this.setTooltip("位运算"); + } +}; + +const math_trig = { + /** + * Block for trigonometry operators. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['sin', 'SIN'], + ['cos', 'COS'], + ['tan', 'TAN'], + ['asin', 'ASIN'], + ['acos', 'ACOS'], + ['atan', 'ATAN'], + ['-', '-'], + ['ln', 'LN'], + ['log10', 'LOG10'], + ['e^', 'EXP'], + ['10^', 'POW10'] + ]; + //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); + this.setColour(MATH_HUE); + this.setOutput(true, Number); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'SIN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_SIN, + 'COS': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_COS, + 'TAN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_TAN, + 'ASIN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_ASIN, + 'ACOS': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_ACOS, + 'ATAN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TRIG_TOOLTIP_ATAN, + 'LN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_LN + }; + return TOOLTIPS[mode]; + }); + } +}; + +const math_dec = { + /** + * Block for trigonometry operators. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BIN, 'bin'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_OCT, 'oct'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_HEX, 'hex'], + ]; + //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); + this.setColour(MATH_HUE); + this.setOutput(true, String); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'bin': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_DEC_TOOLTIP_BIN, + 'oct': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_DEC_TOOLTIP_OCT, + 'hex': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_DEC_TOOLTIP_HEX, + + }; + return TOOLTIPS[mode]; + }); + } +}; + +//取整等 +const math_to_int = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_ROUND, 'round'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_CEIL, 'ceil'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_FLOOR, 'floor'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ABS, 'fabs'], + // [Blockly.Msg.MATH_SQ, 'pow'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SQRT, 'sqrt'] + ]; + this.setColour(MATH_HUE); + this.appendValueInput('A') + .setCheck(Number) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'sqrt': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_ROOT, + 'fabs': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_ABS, + 'sq': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_SQ, + 'round': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_ROUND, + 'ceil': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_CEIL, + 'floor': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SINGLE_TOOLTIP_FLOOR + }; + return TOOLTIPS[mode]; + }); + } +}; +//最大最小值 +const math_max_min = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MAX, 'max'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIN, 'min'], + ]; + + this.setColour(MATH_HUE); + this.appendValueInput('A') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP') + .appendField('('); + this.appendValueInput('B') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(','); + this.appendDummyInput('') + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(')'); + this.setInputsInline(true); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'max': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_MATH_MAX, + 'min': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_MATH_MIN + }; + return TOOLTIPS[mode]; + }); + } +}; + +const math_number_base_conversion = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TWO, 'two'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_EIGHT, 'eight'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_TEN, 'ten'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_SIXTEEN, 'sixteen'] + ]; + this.setColour(MATH_HUE); + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BA) + this.appendValueInput("NUM") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_JinZhi) + .setCheck(Number); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ZHW) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_JinZhi); + this.setFieldValue('ten', 'OP2') + // this.setPreviousStatement(true, null); + // this.setNextStatement(true, null); + this.setOutput(true) + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'two': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Before_two, + 'eight': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Before_eight, + 'ten': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Before_ten, + 'sixteen': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Before_sixteen, + }; + var mode2 = thisBlock.getFieldValue('OP2'); + var TOOLTIPS2 = { + 'two': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Behind_two, + 'eight': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Behind_eight, + 'ten': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Behind_ten, + 'sixteen': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_Behind_sixteen, + }; + return TOOLTIPS[mode] + TOOLTIPS2[mode2]; + }); + } +}; + + +const math_random = { + init: function () { + var INT_FLOAT = [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, 'int'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_FLOAT, 'float']]; + this.setColour(MATH_HUE); + this.setOutput(true, Number); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_RANDOM) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(INT_FLOAT), 'TYPE'); + this.appendValueInput('FROM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_CONTROLS_FOR_INPUT_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_RANDOM_INT_INPUT_TO); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('TYPE'); + var TOOLTIPS = { + 'int': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, + 'float': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_FLOAT_RANDOM + }; + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_RANDOM_INT_TOOLTIP + TOOLTIPS[mode]; + }); + } +}; + + +const math_constrain = { + /** + * Block for constraining a number between two limits. + * @this Blockly.Block + */ + init: function () { + this.setColour(MATH_HUE); + this.setOutput(true, Number); + this.appendValueInput('VALUE') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_CONSTRAIN_INPUT_CONSTRAIN); + this.appendValueInput('LOW') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_CONSTRAIN_INPUT_LOW); + this.appendValueInput('HIGH') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_CONSTRAIN_TOOLTIP); + } +}; + +const math_map = { + init: function () { + this.setColour(MATH_HUE); + this.appendValueInput("NUM", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MAP) + .setCheck(Number); + this.appendValueInput("fromLow", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MAP_FROM) + .setCheck(Number); + this.appendValueInput("fromHigh", Number) + .appendField(",") + .setCheck(Number); + this.appendValueInput("toLow", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MAP_TO) + .setCheck(Number); + this.appendValueInput("toHigh", Number) + .appendField(",") + .setCheck(Number); + this.appendDummyInput("") + .appendField("]"); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_MATH_MAP); + } +}; + +const math_indexer_number = { + /** + * Block for numeric value. + * @this Blockly.Block + */ + init: function () { + this.setColour(MATH_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0', blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.math_number_validator_include_blank), 'NUM'); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_NUMBER_TOOLTIP); + } +}; + +const math_random_seed = { + init: function () { + this.setColour(MATH_HUE); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_RANDOM_SEED); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED); + } +}; + +const math_round = { + + init: function () { + this.setColour(MATH_HUE); + this.setOutput(true, Number); + this.appendValueInput('VALUE') + .setCheck(Number) + this.appendValueInput('VAR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ROUND) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_KEEP); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_DECIMAL); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ROUND_NEW_TOOLTIP); + } +}; + +const text_to_number = { + init: function () { + var TO_INT_FLOAT = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_INT, 'int'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_FLOAT, 'float'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_BITES, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BYTE + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_INT, 'bti']]; + this.setColour(MATH_HUE); + this.appendValueInput('VAR') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(TO_INT_FLOAT), 'TOWHAT'); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('TOWHAT'); + var TOOLTIPS = { + 'int': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOINT, + 'float': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOFLOAT, + 'b': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_TOBYTE + }; + return TOOLTIPS[mode]; + }); + } +}; + +const text_to_number_skulpt = { + init: function () { + var TO_INT_FLOAT = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_INT, 'int'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_FLOAT, 'float']]; + this.setColour(MATH_HUE); + this.appendValueInput('VAR') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(TO_INT_FLOAT), 'TOWHAT'); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('TOWHAT'); + var TOOLTIPS = { + 'int': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_TOINT, + 'float': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_TOFLOAT + }; + return TOOLTIPS[mode]; + }); + } +}; + +const base_map = math_map + +const turn_to_int = { + init: function () { + this.setColour(MATH_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BYTE + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TO_HEX); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOHEX) + } +}; + +const generate_cartesian_product = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(MATH_HUE); + this.itemCount_ = 1; + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['lists_create_with_item'], this)); + this.appendDummyInput('DUMMY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PRODUCT + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GENERATE_CARTESIAN_PRODUCT); + this.appendValueInput('REPEAT') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_EVERY_PER_ELEPER_ELEMENT); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_REPEAT_TITLE_TIMES); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP); + this.updateShape_(); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('lists_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput(`ADD${i}`).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput(`ADD${i}`); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + let i = 0; + while (this.getInput(`ADD${i}`)) { + this.removeInput(`ADD${i}`); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_EMPTY_REMINDER); + } else { + for (let i = 0; i < this.itemCount_; i++) { + this.appendValueInput(`ADD${i}`); + this.moveInputBefore(`ADD${i}`, 'REPEAT'); + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +} + +const math_radian_to_degree = { + init: function () { + this.setColour(MATH_HUE); + this.setOutput(true) + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SET_RADIAN); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TRANS_TO_ANGLE); + this.setInputsInline(true); + } +}; + +const math_degree_to_radian = { + init: function () { + this.setColour(MATH_HUE); + this.setOutput(true) + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SET_DEGREE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TRANS_TO_RADIAN); + this.setInputsInline(true); + } +}; + +/***/ }), + +/***/ "../python/blocks/procedures.js": +/*!**************************************!*\ + !*** ../python/blocks/procedures.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ procedures_callnoreturn: () => (/* binding */ procedures_callnoreturn), +/* harmony export */ procedures_callreturn: () => (/* binding */ procedures_callreturn), +/* harmony export */ procedures_defnoreturn: () => (/* binding */ procedures_defnoreturn), +/* harmony export */ procedures_defreturn: () => (/* binding */ procedures_defreturn), +/* harmony export */ procedures_ifreturn: () => (/* binding */ procedures_ifreturn), +/* harmony export */ procedures_mutatorarg: () => (/* binding */ procedures_mutatorarg), +/* harmony export */ procedures_mutatorcontainer: () => (/* binding */ procedures_mutatorcontainer), +/* harmony export */ procedures_return: () => (/* binding */ procedures_return) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Procedure blocks for Blockly. + * @author fraser@google.com (Neil Fraser) + */ + + + +const procedures_defnoreturn = { + /** + * Block for defining a procedure with no return value. + * @this {Blockly.Block} + */ + init: function () { + var initName = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.findLegalName('', this); + var nameField = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(initName, + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + // .appendField(Blockly.Msg['PROCEDURES_DEFNORETURN_TITLE']) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['procedures_mutatorarg'], this)); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_COMMENT']) { + this.setCommentText(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_COMMENT']); + } + this.setStyle('procedure_blocks'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_TOOLTIP']); + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + /** + * Add or remove the statement block from this function definition. + * @param {boolean} hasStatements True if a statement block is needed. + * @this {Blockly.Block} + */ + setStatements_: function (hasStatements) { + if (this.hasStatements_ === hasStatements) { + return; + } + if (hasStatements) { + this.appendStatementInput('STACK') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_DO']); + if (this.getInput('RETURN')) { + this.moveInputBefore('STACK', 'RETURN'); + } + } else { + this.removeInput('STACK', true); + } + this.hasStatements_ = hasStatements; + }, + /** + * Update the display of parameters for this procedure definition block. + * @private + * @this {Blockly.Block} + */ + updateParams_: function () { + // Merge the arguments into a human-readable list. + var paramString = ''; + if (this.arguments_.length) { + paramString = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_BEFORE_PARAMS'] + + ' ' + this.arguments_.join(', '); + } + // The params field is deterministic based on the mutation, + // no need to fire a change event. + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.disable(); + try { + this.setFieldValue(paramString, 'PARAMS'); + } finally { + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.enable(); + } + }, + /** + * Create XML to represent the argument inputs. + * @param {boolean=} opt_paramIds If true include the IDs of the parameter + * quarks. Used by Procedures.mutateCallers for reconnection. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function (opt_paramIds) { + var container = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + if (opt_paramIds) { + container.setAttribute('name', this.getFieldValue('NAME')); + } + for (var i = 0; i < this.argumentVarModels_.length; i++) { + var parameter = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('arg'); + var argModel = this.argumentVarModels_[i]; + parameter.setAttribute('name', argModel.name); + parameter.setAttribute('varid', argModel.getId()); + if (opt_paramIds && this.paramIds_) { + parameter.setAttribute('paramId', this.paramIds_[i]); + } + container.appendChild(parameter); + } + + // Save whether the statement input is visible. + if (!this.hasStatements_) { + container.setAttribute('statements', 'false'); + } + return container; + }, + /** + * Parse XML to restore the argument inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (xmlElement) { + this.arguments_ = []; + this.argumentVarModels_ = []; + for (var i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + var varName = childNode.getAttribute('name'); + var varId = childNode.getAttribute('varid') || childNode.getAttribute('varId'); + this.arguments_.push(varName); + var variable = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.getOrCreateVariablePackage( + this.workspace, varId, varName, ''); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to create a variable with name ' + varName + ', ignoring.'); + } + } + } + this.updateParams_(); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + + // Show or hide the statement input. + this.setStatements_(xmlElement.getAttribute('statements') !== 'false'); + }, + /** + * Returns the state of this block as a JSON serializable object. + * + * @returns The state of this block, eg the parameters and statements. + */ + saveExtraState: function () { + if (!this.argumentVarModels_.length && this.hasStatements_) { + return null; + } + const state = Object.create(null); + if (this.argumentVarModels_.length) { + state['params'] = []; + for (let i = 0; i < this.argumentVarModels_.length; i++) { + state['params'].push({ + // We don't need to serialize the name, but just in case we decide + // to separate params from variables. + 'name': this.argumentVarModels_[i].name, + 'id': this.argumentVarModels_[i].getId(), + }); + } + } + if (!this.hasStatements_) { + state['hasStatements'] = false; + } + return state; + }, + /** + * Applies the given state to this block. + * + * @param state The state to apply to this block, eg the parameters + * and statements. + */ + loadExtraState: function (state) { + this.arguments_ = []; + this.argumentVarModels_ = []; + if (state['params']) { + for (let i = 0; i < state['params'].length; i++) { + const param = state['params'][i]; + const variable = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.getOrCreateVariablePackage( + this.workspace, + param['id'], + param['name'], + '', + ); + this.arguments_.push(variable.name); + this.argumentVarModels_.push(variable); + } + } + this.updateParams_(); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + this.setStatements_(state['hasStatements'] !== false); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function (workspace) { + /* + * Creates the following XML: + * + * + * + * arg1_name + * etc... + * + * + * + */ + + var containerBlockNode = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer'); + var statementNode = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('statement'); + statementNode.setAttribute('name', 'STACK'); + containerBlockNode.appendChild(statementNode); + + var node = statementNode; + for (var i = 0; i < this.arguments_.length; i++) { + var argBlockNode = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + argBlockNode.setAttribute('type', 'procedures_mutatorarg'); + var fieldNode = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field'); + fieldNode.setAttribute('name', 'NAME'); + var argumentName = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode(this.arguments_[i]); + fieldNode.appendChild(argumentName); + argBlockNode.appendChild(fieldNode); + var nextNode = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('next'); + argBlockNode.appendChild(nextNode); + + node.appendChild(argBlockNode); + node = nextNode; + } + + var containerBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Xml.domToBlock(containerBlockNode, workspace); + + if (this.type == 'procedures_defreturn') { + containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS'); + } else { + containerBlock.removeInput('STATEMENT_INPUT'); + } + + // Initialize procedure's callers with blank IDs. + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function (containerBlock) { + // Parameter list. + this.arguments_ = []; + this.paramIds_ = []; + this.argumentVarModels_ = []; + var paramBlock = containerBlock.getInputTargetBlock('STACK'); + while (paramBlock && !paramBlock.isInsertionMarker()) { + var varName = paramBlock.getFieldValue('NAME'); + this.arguments_.push(varName); + var variable = this.workspace.getVariable(varName, ''); + this.argumentVarModels_.push(variable); + + this.paramIds_.push(paramBlock.id); + paramBlock = paramBlock.nextConnection && + paramBlock.nextConnection.targetBlock(); + } + this.updateParams_(); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + + // Show/hide the statement input. + var hasStatements = containerBlock.getFieldValue('STATEMENTS'); + if (hasStatements !== null) { + hasStatements = hasStatements == 'TRUE'; + if (this.hasStatements_ != hasStatements) { + if (hasStatements) { + this.setStatements_(true); + // Restore the stack, if one was saved. + this.statementConnection_ && this.statementConnection_.reconnect(this, 'STACK'); + this.statementConnection_ = null; + } else { + // Save the stack, then disconnect it. + var stackConnection = this.getInput('STACK').connection; + this.statementConnection_ = stackConnection.targetConnection; + if (this.statementConnection_) { + var stackBlock = stackConnection.targetBlock(); + stackBlock.unplug(); + stackBlock.bumpNeighbours(); + } + this.setStatements_(false); + } + } + } + }, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES NOT have a return value. + * @this {Blockly.Block} + */ + getProcedureDef: function () { + return [this.getFieldValue('NAME'), this.arguments_, false]; + }, + /** + * Return all variables referenced by this block. + * @return {!Array} List of variable names. + * @this {Blockly.Block} + */ + getVars: function () { + return this.arguments_; + }, + /** + * Return all variables referenced by this block. + * @return {!Array} List of variable models. + * @this {Blockly.Block} + */ + getVarModels: function () { + return this.argumentVarModels_; + }, + /** + * Notification that a variable is renaming. + * If the ID matches one of this block's variables, rename it. + * @param {string} oldId ID of variable to rename. + * @param {string} newId ID of new variable. May be the same as oldId, but + * with an updated name. Guaranteed to be the same type as the old + * variable. + * @override + * @this {Blockly.Block} + */ + renameVarById: function (oldId, newId) { + var oldVariable = this.workspace.getVariableById(oldId); + if (oldVariable.type != '') { + // Procedure arguments always have the empty type. + return; + } + var oldName = oldVariable.name; + var newVar = this.workspace.getVariableById(newId); + + var change = false; + for (var i = 0; i < this.argumentVarModels_.length; i++) { + if (this.argumentVarModels_[i].getId() == oldId) { + this.arguments_[i] = newVar.name; + this.argumentVarModels_[i] = newVar; + change = true; + } + } + if (change) { + this.displayRenamedVar_(oldName, newVar.name); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + } + }, + /** + * Notification that a variable is renaming but keeping the same ID. If the + * variable is in use on this block, rerender to show the new name. + * @param {!Blockly.VariableModel} variable The variable being renamed. + * @package + * @override + * @this {Blockly.Block} + */ + updateVarName: function (variable) { + var newName = variable.name; + var change = false; + for (var i = 0; i < this.argumentVarModels_.length; i++) { + if (this.argumentVarModels_[i].getId() == variable.getId()) { + var oldName = this.arguments_[i]; + this.arguments_[i] = newName; + change = true; + } + } + if (change) { + this.displayRenamedVar_(oldName, newName); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.mutateCallers(this); + } + }, + /** + * Update the display to reflect a newly renamed argument. + * @param {string} oldName The old display name of the argument. + * @param {string} newName The new display name of the argument. + * @private + * @this {Blockly.Block} + */ + displayRenamedVar_: function (oldName, newName) { + this.updateParams_(); + const mutator = this.getIcon(blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon.TYPE); + // Update the mutator's variables if the mutator is open. + if (mutator && mutator.bubbleIsVisible()) { + var blocks = mutator.getWorkspace().getAllBlocks(false); + for (var i = 0, block; (block = blocks[i]); i++) { + if (block.type == 'procedures_mutatorarg' && + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, block.getFieldValue('NAME'))) { + block.setFieldValue(newName, 'NAME'); + } + } + } + }, + /** + * Add custom menu options to this block's context menu. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function (options) { + if (this.isInFlyout) { + return; + } + // Add option to create caller. + var option = { enabled: true }; + var name = this.getFieldValue('NAME'); + option.text = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CREATE_DO'].replace('%1', name); + var xmlMutation = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + xmlMutation.setAttribute('name', name); + for (var i = 0; i < this.arguments_.length; i++) { + var xmlArg = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('arg'); + xmlArg.setAttribute('name', this.arguments_[i]); + xmlMutation.appendChild(xmlArg); + } + var xmlBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + xmlBlock.setAttribute('type', this.callType_); + xmlBlock.appendChild(xmlMutation); + option.callback = blockly_core__WEBPACK_IMPORTED_MODULE_0__.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + + // Add options to create getters for each parameter. + if (!this.isCollapsed()) { + for (var i = 0; i < this.argumentVarModels_.length; i++) { + var argOption = { enabled: true }; + var argVar = this.argumentVarModels_[i]; + argOption.text = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['VARIABLES_SET_CREATE_GET'] + .replace('%1', argVar.name); + + var argXmlField = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.generateVariableFieldDom(argVar); + var argXmlBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + argXmlBlock.setAttribute('type', 'variables_get'); + argXmlBlock.appendChild(argXmlField); + argOption.callback = + blockly_core__WEBPACK_IMPORTED_MODULE_0__.ContextMenu.callbackFactory(this, argXmlBlock); + options.push(argOption); + } + } + }, + callType_: 'procedures_callnoreturn' +}; + +const procedures_defreturn = { + /** + * Block for defining a procedure with a return value. + * @this {Blockly.Block} + */ + init: function () { + var initName = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.findLegalName('', this); + var nameField = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(initName, + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + // .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_TITLE']) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.appendValueInput('RETURN') + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['procedures_mutatorarg'], this)); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_COMMENT']) { + this.setCommentText(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_COMMENT']); + } + this.setStyle('procedure_blocks'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_TOOLTIP']); + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + setStatements_: procedures_defnoreturn.setStatements_, + updateParams_: procedures_defnoreturn.updateParams_, + mutationToDom: procedures_defnoreturn.mutationToDom, + domToMutation: procedures_defnoreturn.domToMutation, + decompose: procedures_defnoreturn.decompose, + compose: procedures_defnoreturn.compose, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES have a return value. + * @this {Blockly.Block} + */ + getProcedureDef: function () { + return [this.getFieldValue('NAME'), this.arguments_, true]; + }, + getVars: procedures_defnoreturn.getVars, + getVarModels: procedures_defnoreturn.getVarModels, + renameVarById: procedures_defnoreturn.renameVarById, + updateVarName: procedures_defnoreturn.updateVarName, + displayRenamedVar_: procedures_defnoreturn.displayRenamedVar_, + customContextMenu: procedures_defnoreturn.customContextMenu, + callType_: 'procedures_callreturn' +}; + +const procedures_mutatorcontainer = { + /** + * Mutator block for procedure container. + * @this {Blockly.Block} + */ + init: function () { + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_MUTATORCONTAINER_TITLE']); + this.appendStatementInput('STACK'); + this.appendDummyInput('STATEMENT_INPUT') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_ALLOW_STATEMENTS']) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldCheckbox('TRUE'), 'STATEMENTS'); + this.setStyle('procedure_blocks'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']); + this.contextMenu = false; + }, +}; + +const procedures_mutatorarg = { + /** + * Mutator block for procedure argument. + * @this {Blockly.Block} + */ + init: function () { + var field = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput( + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.DEFAULT_ARG, this.validator_); + // Hack: override showEditor to do just a little bit more work. + // We don't have a good place to hook into the start of a text edit. + field.oldShowEditorFn_ = field.showEditor_; + var newShowEditorFn = function () { + this.createdVariables_ = []; + this.oldShowEditorFn_(); + }; + field.showEditor_ = newShowEditorFn; + + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_BEFORE_PARAMS) + .appendField(field, 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_MUTATORARG_TOOLTIP']); + this.contextMenu = false; + + // Create the default variable when we drag the block in from the flyout. + // Have to do this after installing the field on the block. + field.onFinishEditing_ = this.deleteIntermediateVars_; + // Create an empty list so onFinishEditing_ has something to look at, even + // though the editor was never opened. + field.createdVariables_ = []; + field.onFinishEditing_('x'); + }, + /** + * Obtain a valid name for the procedure argument. Create a variable if + * necessary. + * Merge runs of whitespace. Strip leading and trailing whitespace. + * Beyond this, all names are legal. + * @param {string} varName User-supplied name. + * @return {?string} Valid name, or null if a name was not specified. + * @private + * @this Blockly.FieldTextInput + */ + validator_: function (varName) { + var sourceBlock = this.getSourceBlock(); + + var outerWs = sourceBlock.workspace.getRootWorkspace(); + varName = varName.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); + if (!varName) { + return null; + } + + // Prevents duplicate parameter names in functions + var workspace = sourceBlock.workspace.targetWorkspace || + sourceBlock.workspace; + var blocks = workspace.getAllBlocks(false); + var caselessName = varName.toLowerCase(); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].id == this.getSourceBlock().id) { + continue; + } + // Other blocks values may not be set yet when this is loaded. + var otherVar = blocks[i].getFieldValue('NAME'); + if (otherVar && otherVar.toLowerCase() == caselessName) { + return null; + } + } + + // Don't create variables for arg blocks that + // only exist in the mutator's flyout. + if (sourceBlock.isInFlyout) { + return varName; + } + + var model = outerWs.getVariable(varName, ''); + if (model && model.name != varName) { + // Rename the variable (case change) + outerWs.renameVariableById(model.getId(), varName); + } + if (!model) { + model = outerWs.createVariable(varName, ''); + if (model && this.createdVariables_) { + this.createdVariables_.push(model); + } + } + return varName; + }, + + /** + * Called when focusing away from the text field. + * Deletes all variables that were created as the user typed their intended + * variable name. + * @param {string} newText The new variable name. + * @private + * @this Blockly.FieldTextInput + */ + deleteIntermediateVars_: function (newText) { + var outerWs = this.getSourceBlock().workspace.getRootWorkspace(); + if (!outerWs) { + return; + } + for (var i = 0; i < this.createdVariables_.length; i++) { + var model = this.createdVariables_[i]; + if (model.name != newText) { + outerWs.deleteVariableById(model.getId()); + } + } + } +}; + +const procedures_callnoreturn = { + /** + * Block for calling a procedure with no return value. + * @this {Blockly.Block} + */ + init: function () { + this.appendDummyInput('TOPROW') + .appendField('', 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + // Tooltip is set in renameProcedure. + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CALLNORETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = true; + }, + /** + * Returns the name of the procedure this block calls. + * @return {string} Procedure name. + * @this {Blockly.Block} + */ + getProcedureCall: function () { + // The NAME field is guaranteed to exist, null will never be returned. + return /** @type {string} */ (this.getFieldValue('NAME')); + }, + /** + * Notification that a procedure is renaming. + * If the name matches this block's procedure, rename it. + * @param {string} oldName Previous name of procedure. + * @param {string} newName Renamed procedure. + * @this {Blockly.Block} + */ + renameProcedure: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getProcedureCall())) { + this.setFieldValue(newName, 'NAME'); + var baseMsg = this.outputConnection ? + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CALLRETURN_TOOLTIP'] : + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CALLNORETURN_TOOLTIP']; + this.setTooltip(baseMsg.replace('%1', newName)); + } + }, + /** + * Notification that the procedure's parameters have changed. + * @param {!Array} paramNames New param names, e.g. ['x', 'y', 'z']. + * @param {!Array} paramIds IDs of params (consistent for each + * parameter through the life of a mutator, regardless of param renaming), + * e.g. ['piua', 'f8b_', 'oi.o']. + * @private + * @this {Blockly.Block} + */ + setProcedureParameters_: function (paramNames, paramIds) { + // Data structures: + // this.arguments = ['x', 'y'] + // Existing param names. + // this.quarkConnections_ {piua: null, f8b_: Connection} + // Look-up of paramIds to connections plugged into the call block. + // this.quarkIds_ = ['piua', 'f8b_'] + // Existing param IDs. + // Note that quarkConnections_ may include IDs that no longer exist, but + // which might reappear if a param is reattached in the mutator. + const defBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getDefinition( + this.getProcedureCall(), + this.workspace, + ); + const mutatorIcon = defBlock && defBlock.getIcon(blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon.TYPE); + const mutatorOpen = mutatorIcon && mutatorIcon.bubbleIsVisible(); + if (!mutatorOpen) { + this.quarkConnections_ = {}; + this.quarkIds_ = null; + } else { + // fix #6091 - this call could cause an error when outside if-else + // expanding block while mutating prevents another error (ancient fix) + this.setCollapsed(false); + } + // Test arguments (arrays of strings) for changes. '\n' is not a valid + // argument name character, so it is a valid delimiter here. + if (paramNames.join('\n') === this.arguments_.join('\n')) { + // No change. + this.quarkIds_ = paramIds; + return; + } + if (paramIds.length !== paramNames.length) { + throw Error('paramNames and paramIds must be the same length.'); + } + if (!this.quarkIds_) { + // Initialize tracking for this block. + this.quarkConnections_ = {}; + this.quarkIds_ = []; + } + // Update the quarkConnections_ with existing connections. + for (let i = 0; i < this.arguments_.length; i++) { + const input = this.getInput('ARG' + i); + if (input) { + const connection = input?.connection?.targetConnection; + this.quarkConnections_[this.quarkIds_[i]] = connection; + if ( + mutatorOpen && + connection && + !paramIds.includes(this.quarkIds_[i]) + ) { + // This connection should no longer be attached to this block. + connection.disconnect(); + connection.getSourceBlock().bumpNeighbours(); + } + } + } + // Rebuild the block's arguments. + this.arguments_ = [].concat(paramNames); + // And rebuild the argument model list. + this.argumentVarModels_ = []; + for (var i = 0; i < this.arguments_.length; i++) { + var variable = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.getOrCreateVariablePackage( + this.workspace, null, this.arguments_[i], ''); + this.argumentVarModels_.push(variable); + } + + this.updateShape_(); + this.quarkIds_ = paramIds; + // Reconnect any child blocks. + if (this.quarkIds_) { + for (let i = 0; i < this.arguments_.length; i++) { + const quarkId = this.quarkIds_[i]; // TODO(#6920) + if (quarkId in this.quarkConnections_) { + // TODO(#6920): investigate claimed circular initialisers. + const connection = this.quarkConnections_[quarkId]; + if (!connection?.reconnect(this, 'ARG' + i)) { + // Block no longer exists or has been attached elsewhere. + delete this.quarkConnections_[quarkId]; + } + } + } + } + }, + /** + * Modify this block to have the correct number of arguments. + * @private + * @this {Blockly.Block} + */ + updateShape_: function () { + for (var i = 0; i < this.arguments_.length; i++) { + var field = this.getField('ARGNAME' + i); + if (field) { + // Ensure argument name is up to date. + // The argument name field is deterministic based on the mutation, + // no need to fire a change event. + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.disable(); + try { + field.setValue(this.arguments_[i]); + } finally { + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.enable(); + } + } else { + // Add new input. + field = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldLabel(this.arguments_[i]); + var input = this.appendValueInput('ARG' + i) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(field, 'ARGNAME' + i); + input.init(); + } + } + // Remove deleted inputs. + while (this.getInput('ARG' + i)) { + this.removeInput('ARG' + i); + i++; + } + // Add 'with:' if there are parameters, remove otherwise. + var topRow = this.getInput('TOPROW'); + if (topRow) { + if (this.arguments_.length) { + if (!this.getField('WITH')) { + topRow.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH'); + topRow.init(); + } + } else { + if (this.getField('WITH')) { + topRow.removeField('WITH'); + } + } + } + }, + /** + * Create XML to represent the (non-editable) name and arguments. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function () { + var container = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + container.setAttribute('name', this.getProcedureCall()); + for (var i = 0; i < this.arguments_.length; i++) { + var parameter = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('arg'); + parameter.setAttribute('name', this.arguments_[i]); + container.appendChild(parameter); + } + return container; + }, + /** + * Parse XML to restore the (non-editable) name and parameters. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (xmlElement) { + var name = xmlElement.getAttribute('name'); + this.renameProcedure(this.getProcedureCall(), name); + var args = []; + var paramIds = []; + for (var i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + args.push(childNode.getAttribute('name')); + paramIds.push(childNode.getAttribute('paramId')); + } + } + this.setProcedureParameters_(args, paramIds); + }, + /** + * Returns the state of this block as a JSON serializable object. + * + * @returns The state of this block, ie the params and procedure name. + */ + saveExtraState: function () { + const state = Object.create(null); + state['name'] = this.getProcedureCall(); + if (this.arguments_.length) { + state['params'] = this.arguments_; + } + return state; + }, + /** + * Applies the given state to this block. + * + * @param state The state to apply to this block, ie the params and + * procedure name. + */ + loadExtraState: function (state) { + this.renameProcedure(this.getProcedureCall(), state['name']); + const params = state['params']; + if (params) { + const ids = []; + ids.length = params.length; + ids.fill(null); // TODO(#6920) + this.setProcedureParameters_(params, ids); + } + }, + /** + * Return all variables referenced by this block. + * @return {!Array} List of variable names. + * @this {Blockly.Block} + */ + getVars: function () { + return this.arguments_; + }, + /** + * Return all variables referenced by this block. + * @return {!Array} List of variable models. + * @this {Blockly.Block} + */ + getVarModels: function () { + return this.argumentVarModels_; + }, + /** + * Procedure calls cannot exist without the corresponding procedure + * definition. Enforce this link whenever an event is fired. + * @param {!Blockly.Events.Abstract} event Change event. + * @this {Blockly.Block} + */ + onchange: function (event) { + if (!this.workspace || this.workspace.isFlyout) { + // Block is deleted or is in a flyout. + return; + } + if (!event.recordUndo) { + // Events not generated by user. Skip handling. + return; + } + if (event.type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.BLOCK_CREATE && + event.ids.indexOf(this.id) != -1) { + // Look for the case where a procedure call was created (usually through + // paste) and there is no matching definition. In this case, create + // an empty definition block with the correct signature. + var name = this.getProcedureCall(); + var def = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getDefinition(name, this.workspace); + if (def && (def.type != this.defType_)) { + // The signatures don't match. + def = null; + } + if (!def) { + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(event.group); + /** + * Create matching definition block. + * + * + * + * + * + * test + * + * + */ + var xml = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('xml'); + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', this.defType_); + var xy = this.getRelativeToSurfaceXY(); + var x = xy.x + blockly_core__WEBPACK_IMPORTED_MODULE_0__.SNAP_RADIUS * (this.RTL ? -1 : 1); + var y = xy.y + blockly_core__WEBPACK_IMPORTED_MODULE_0__.SNAP_RADIUS * 2; + block.setAttribute('x', x); + block.setAttribute('y', y); + var mutation = this.mutationToDom(); + block.appendChild(mutation); + var field = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field'); + field.setAttribute('name', 'NAME'); + var callName = this.getProcedureCall(); + if (!callName) { + // Rename if name is empty string. + callName = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.findLegalName('', this); + this.renameProcedure('', callName); + } + field.appendChild(blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode(callName)); + block.appendChild(field); + xml.appendChild(block); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Xml.domToWorkspace(xml, this.workspace); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(false); + } else { + if (JSON.stringify(def.getVars()) != JSON.stringify(this.arguments_)) { + let paramNames = def.arguments_; + let paramIds = []; + for (var i = 0; i < this.arguments_.length; i++) { + var input = this.getInput('ARG' + i); + if (!input) { + continue; + } + var connection = input.connection.targetConnection; + if (!connection) { + paramIds.push(null); + continue; + } + paramIds.push(connection.sourceBlock_.id); + } + this.setProcedureParameters_(paramNames, paramIds); + } + } + } else if (event.type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.BLOCK_DELETE) { + // Look for the case where a procedure definition has been deleted, + // leaving this block (a procedure call) orphaned. In this case, delete + // the orphan. + var name = this.getProcedureCall(); + var def = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getDefinition(name, this.workspace); + if (!def) { + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(event.group); + this.dispose(true); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(false); + } + } else if (event.type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.CHANGE && event.element == 'disabled') { + var name = this.getProcedureCall(); + var def = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getDefinition(name, this.workspace); + if (def && def.id == event.blockId) { + // in most cases the old group should be '' + var oldGroup = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.getGroup(); + if (oldGroup) { + // This should only be possible programmatically and may indicate a problem + // with event grouping. If you see this message please investigate. If the + // use ends up being valid we may need to reorder events in the undo stack. + console.log('Saw an existing group while responding to a definition change'); + } + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(event.group); + if (event.newValue) { + this.previousEnabledState_ = this.isEnabled(); + this.setEnabled(false); + } else { + this.setEnabled(this.previousEnabledState_); + } + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(oldGroup); + } + } + }, + /** + * Add menu option to find the definition block for this call. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function (options) { + if (!this.workspace.isMovable()) { + // If we center on the block and the workspace isn't movable we could + // loose blocks at the edges of the workspace. + return; + } + + var option = { enabled: true }; + option.text = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_HIGHLIGHT_DEF']; + var name = this.getProcedureCall(); + var workspace = this.workspace; + option.callback = function () { + var def = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getDefinition(name, workspace); + if (def) { + workspace.centerOnBlock(def.id); + def.select(); + } + }; + options.push(option); + }, + defType_: 'procedures_defnoreturn' +}; + +const procedures_callreturn = { + /** + * Block for calling a procedure with a return value. + * @this {Blockly.Block} + */ + init: function () { + this.appendDummyInput('TOPROW') + .appendField('', 'NAME'); + this.setOutput(true); + this.setStyle('procedure_blocks'); + // Tooltip is set in domToMutation. + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_CALLRETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = true; + }, + + getProcedureCall: procedures_callnoreturn.getProcedureCall, + renameProcedure: procedures_callnoreturn.renameProcedure, + setProcedureParameters_: + procedures_callnoreturn.setProcedureParameters_, + updateShape_: procedures_callnoreturn.updateShape_, + mutationToDom: procedures_callnoreturn.mutationToDom, + domToMutation: procedures_callnoreturn.domToMutation, + getVars: procedures_callnoreturn.getVars, + getVarModels: procedures_callnoreturn.getVarModels, + onchange: procedures_callnoreturn.onchange, + customContextMenu: + procedures_callnoreturn.customContextMenu, + defType_: 'procedures_defreturn' +}; + +const procedures_ifreturn = { + /** + * Block for conditionally returning a value from a procedure. + * @this {Blockly.Block} + */ + init: function () { + this.appendValueInput('CONDITION') + .setCheck('Boolean') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['CONTROLS_IF_MSG_IF']); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_IFRETURN_TOOLTIP']); + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_IFRETURN_HELPURL']); + this.hasReturnValue_ = true; + }, + /** + * Create XML to represent whether this block has a return value. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function () { + var container = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + container.setAttribute('value', Number(this.hasReturnValue_)); + return container; + }, + /** + * Parse XML to restore whether this block has a return value. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (xmlElement) { + var value = xmlElement.getAttribute('value'); + this.hasReturnValue_ = (value == 1); + if (!this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_RETURN']); + } + }, + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} _e Change event. + * @this {Blockly.Block} + */ + onchange: function () { + if (!this.workspace.isDragging || this.workspace.isDragging()) { + return; // Don't change state at the start of a drag. + } + var legal = false; + // Is the block nested in a procedure? + var block = this; + do { + if (this.FUNCTION_TYPES.indexOf(block.type) != -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + // If needed, toggle whether this block has a return value. + if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.hasReturnValue_ = false; + } else if (block.type == 'procedures_defreturn' && + !this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.hasReturnValue_ = true; + } + this.setWarningText(null); + if (!this.isInFlyout) { + this.setEnabled(true); + } + } else { + this.setWarningText(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_IFRETURN_WARNING']); + if (!this.isInFlyout && !this.getInheritedDisabled()) { + this.setEnabled(false); + } + } + }, + /** + * List of block types that are functions and thus do not need warnings. + * To add a new function type add this to your code: + * procedures_ifreturn.FUNCTION_TYPES.push('custom_func'); + */ + FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'] +}; + +const procedures_return = { + /** + * Block for conditionally returning a value from a procedure. + * @this Blockly.Block + */ + init: function () { + this.setStyle('procedure_blocks'); + // this.appendValueInput('CONDITION') + // .setCheck(Boolean) + // .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_IFRETURN_TOOLTIP); + this.hasReturnValue_ = true; + }, + /** + * Create XML to represent whether this block has a return value. + * @return {!Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('value', Number(this.hasReturnValue_)); + return container; + }, + /** + * Parse XML to restore whether this block has a return value. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var value = xmlElement.getAttribute('value'); + this.hasReturnValue_ = (value == 1); + if (!this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN); + } + }, + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function () { + var legal = false; + // Is the block nested in a procedure? + var block = this; + do { + if (this.FUNCTION_TYPES.indexOf(block.type) != -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + // If needed, toggle whether this block has a return value. + if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN); + this.hasReturnValue_ = false; + } else if (block.type == 'procedures_defreturn' && + !this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN); + this.hasReturnValue_ = true; + } + this.setWarningText(null); + } else { + this.setWarningText(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_IFRETURN_WARNING); + } + }, + /** + * List of block types that are functions and thus do not need warnings. + * To add a new function type add this to your code: + * procedures_ifreturn.FUNCTION_TYPES.push('custom_func'); + */ + FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn', 'method_procedures_defnoreturn', 'method_procedures_defreturn'] +}; + +/***/ }), + +/***/ "../python/blocks/set.js": +/*!*******************************!*\ + !*** ../python/blocks/set.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ set_add_discard: () => (/* binding */ set_add_discard), +/* harmony export */ set_clear: () => (/* binding */ set_clear), +/* harmony export */ set_create_with: () => (/* binding */ set_create_with), +/* harmony export */ set_create_with_container: () => (/* binding */ set_create_with_container), +/* harmony export */ set_create_with_item: () => (/* binding */ set_create_with_item), +/* harmony export */ set_create_with_text_return: () => (/* binding */ set_create_with_text_return), +/* harmony export */ set_length: () => (/* binding */ set_length), +/* harmony export */ set_operate: () => (/* binding */ set_operate), +/* harmony export */ set_operate_update: () => (/* binding */ set_operate_update), +/* harmony export */ set_pop: () => (/* binding */ set_pop), +/* harmony export */ set_sub: () => (/* binding */ set_sub), +/* harmony export */ set_toset: () => (/* binding */ set_toset), +/* harmony export */ set_update: () => (/* binding */ set_update) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const SET_HUE = 100; + +const set_create_with = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(SET_HUE); + this.appendDummyInput("") + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE') + // .appendField(' ') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('s1'), 'VAR') + + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['set_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('set_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('set_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_EMPTY_TITLE); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_INPUT_WITH); + } + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const set_create_with_container = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(SET_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const set_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(SET_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_VARIABLES_NAME); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +const set_length = { + + init: function () { + this.setColour(SET_HUE); + this.appendValueInput('SET'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LENGTH); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_LENGTH_TOOLTIP); + this.setOutput(true, Number); + } +}; + +const set_pop = { + init: function () { + this.setColour(SET_HUE); + this.appendValueInput('SET') + .setCheck('Set') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_GET_AND_REMOVE_LAST); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_POP_TOOLTIP); + this.setInputsInline(true); + this.setOutput(true); + } +}; + +const set_clear = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(SET_HUE); + this.appendValueInput('SET') + .setCheck('Set') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_CLEAR); + + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const set_operate = { + init: function () { + + + this.appendValueInput('SET1') + .setCheck('Set') + var operate = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_union, 'union'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_intersection, 'intersection'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_difference, 'difference'] + ]; + this.setColour(SET_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_and_set) + this.appendValueInput('SET2') + .setCheck('Set') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_get_operate) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(operate), 'OPERATE') + + this.setInputsInline(true); + this.setOutput(true, "set"); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OPERATE'); + var TOOLTIPS = { + 'union': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_UNION, + 'intersection': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_INTERSECTION, + 'difference': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_DIFFERENCE + }; + return TOOLTIPS[mode]; + }); + } +}; + +const set_operate_update = { + init: function () { + + this.appendValueInput('SET1') + .setCheck('Set') + var operate_update = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_union, 'update'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_intersection, 'intersection_update'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_difference, 'difference_update'] + ]; + this.setColour(SET_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_and_set) + this.appendValueInput('SET2') + .setCheck('Set') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_get_operate) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(operate_update), 'OPERATE') + + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_update) + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OPERATE'); + var TOOLTIPS = { + 'update': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_UPDATE, + 'intersection_update': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_INTERSECTION_UPDATE, + 'difference_update': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_DIFFERENCE_UPDATE + }; + return TOOLTIPS[mode]; + }); + } +}; + +const set_add_discard = { + init: function () { + this.appendValueInput('SET') + .setCheck('Set') + var changenum = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_blockpy_set_add, 'add'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_blockpy_set_discard, 'discard']]; + this.setColour(SET_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(changenum), 'OPERATE') + this.appendValueInput('data') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_VARIABLES_NAME) + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OPERATE'); + var TOOLTIPS = { + 'add': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_ADD_TOOLTIP, + 'discard': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_DISCARD_TOOLTIP, + + }; + return TOOLTIPS[mode]; + }); + } +}; + +const set_sub = { + init: function () { + + this.appendValueInput('SET1') + .setCheck('Set') + var sub_super = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_sub, 'issubset'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_super, 'issuperset'] + ]; + this.setColour(SET_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_is_set) + this.appendValueInput('SET2') + .setCheck('Set') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_of) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(sub_super), 'OPERATE') + + + this.setInputsInline(true); + this.setOutput(true, Boolean); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OPERATE'); + var TOOLTIPS = { + 'issubset': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_SUB, + 'issuperset': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SET_SUPER + + }; + return TOOLTIPS[mode]; + }); + } +}; + +const set_update = { + init: function () { + this.appendValueInput('SET') + .setCheck('Set') + this.setColour(SET_HUE); + this.appendValueInput('VAR') + .setCheck([String, 'List']) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_set_add_update); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SET_UPDATE_TOOLTIP); + } +}; + +// export const set_change_to = { +// init: function() { +// var OPERATORS = +// [[Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'], +// [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple'] +// ]; +// this.setColour(SET_HUE); +// this.appendValueInput('VAR') +// .setCheck("Set") +// // .appendField(Blockly.Msg.blockpy_USE_LIST); +// this.appendDummyInput("") +// .appendField(Blockly.Msg.A_TO_B) +// .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); +// this.setInputsInline(true); +// this.setOutput(true); +// var thisBlock = this; +// this.setTooltip(function() { +// var mode = thisBlock.getFieldValue('OP'); +// var TOOLTIPS = { +// 'list': Blockly.Msg.SET_TO_LISTS, +// 'tuple': Blockly.Msg.SET_TO_TUPLE, +// }; +// return TOOLTIPS[mode]; +// }); +// } +// }; + +const set_create_with_text_return = { + init: function () { + this.setColour(SET_HUE); + this.appendDummyInput("") + .appendField('{') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0,0,0'), 'TEXT') + .appendField('}'); + // .appendField(this.newQuote_(false)) + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TOOLTIP_SET_CREATE_WITH_TEXT); + } +} + +const set_toset = { + init: function () { + this.setColour(SET_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOSET); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOSET); + } +}; + +/***/ }), + +/***/ "../python/blocks/storage.js": +/*!***********************************!*\ + !*** ../python/blocks/storage.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ sdcard_mount: () => (/* binding */ sdcard_mount), +/* harmony export */ sdcard_use_spi_init: () => (/* binding */ sdcard_use_spi_init), +/* harmony export */ storage_can_write_ornot: () => (/* binding */ storage_can_write_ornot), +/* harmony export */ storage_change_dir: () => (/* binding */ storage_change_dir), +/* harmony export */ storage_close_file: () => (/* binding */ storage_close_file), +/* harmony export */ storage_delete_file: () => (/* binding */ storage_delete_file), +/* harmony export */ storage_file_seek: () => (/* binding */ storage_file_seek), +/* harmony export */ storage_file_tell: () => (/* binding */ storage_file_tell), +/* harmony export */ storage_file_write: () => (/* binding */ storage_file_write), +/* harmony export */ storage_fileopen: () => (/* binding */ storage_fileopen), +/* harmony export */ storage_fileopen_new: () => (/* binding */ storage_fileopen_new), +/* harmony export */ storage_fileopen_new_encoding: () => (/* binding */ storage_fileopen_new_encoding), +/* harmony export */ storage_get_a_line: () => (/* binding */ storage_get_a_line), +/* harmony export */ storage_get_contents: () => (/* binding */ storage_get_contents), +/* harmony export */ storage_get_contents_without_para: () => (/* binding */ storage_get_contents_without_para), +/* harmony export */ storage_get_current_dir: () => (/* binding */ storage_get_current_dir), +/* harmony export */ storage_get_file_size: () => (/* binding */ storage_get_file_size), +/* harmony export */ storage_get_filename: () => (/* binding */ storage_get_filename), +/* harmony export */ storage_is_file: () => (/* binding */ storage_is_file), +/* harmony export */ storage_list_all_files: () => (/* binding */ storage_list_all_files), +/* harmony export */ storage_make_dir: () => (/* binding */ storage_make_dir), +/* harmony export */ storage_open_file_with_os: () => (/* binding */ storage_open_file_with_os), +/* harmony export */ storage_rename: () => (/* binding */ storage_rename) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const STORAGE_HUE = 0; //'#5d69c5'//0; + +const storage_open_file_with_os = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput('fn') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_STORAGE_OPEN_FILE_WITH_OS + "(For Windows)"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +} + +const storage_fileopen = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILENAME") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE); + //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ADD, 'a'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BIN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ADD, 'ab'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_R_W ,'r+'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BIN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_R_W ,'rb+'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_W_R ,'w+'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BIN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_W_R ,'wb+'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_A_R ,'a+'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_BIN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_A_R ,'ab+'] + ]), 'MODE'); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_AS); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_USE; + var mode1 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE; + var mode3 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_BELONG; + var TOOLTIPS = { + 'r': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, + 'w': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, + 'rb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, + 'wb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE + }; + return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2; + }); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + + +const storage_fileopen_new = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILENAME") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE); + //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb'] + ]), 'MODE'); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_USE; + var mode1 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE; + var mode3 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_BELONG; + var mode4 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PY_STORAGE_FILE_OBJECT; + var TOOLTIPS = { + 'r': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, + 'w': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, + 'rb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, + 'wb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE + }; + return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2 + mode4; + }); + } +}; + +const storage_fileopen_new_encoding = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILENAME") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE); + //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME'); + var code = + [['ANSI', 'ANSI'], ['gbk', 'gbk'], ['utf-8', 'utf-8']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb'] + ]), 'MODE'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TEXT_ENCODE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(code), 'CODE') + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_USE; + var mode1 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE; + var mode3 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_BELONG; + var mode4 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PY_STORAGE_FILE_OBJECT; + var TOOLTIPS = { + 'r': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, + 'w': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, + 'rb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, + 'wb': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE + }; + return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2 + mode4; + }); + } +}; + +const storage_file_write = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput('data') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE); + // .appendField(new Blockly.FieldTextInput('f'), 'FILE'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_STRING + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE); + } +} + +const storage_get_contents_without_para = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck('Variable') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL, 'read'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE, 'readline'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES, 'readlines']]), 'MODE'); + this.setInputsInline(true); + this.setPreviousStatement(false); //in front of the block has something + this.setNextStatement(false); //beyond the ... has something + this.setOutput(true, String); + } +}; + +const storage_get_contents = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck('Variable') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE, 'read'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE, 'readline'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE, 'readlines'] + ]), 'MODE'); + this.appendValueInput("SIZE") + .setCheck(Number); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER); + this.setInputsInline(true); + this.setPreviousStatement(false); //in front of the block has something + this.setNextStatement(false); //beyond the ... has something + this.setOutput(true, String); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER; + var TOOLTIPS = { + 'read': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE, + 'readline': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE, + 'readlines': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE + }; + return mode0 + TOOLTIPS[mode] + 'x' + mode2; + }); + } +}; + +const storage_get_a_line = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE); + this.setNextStatement(true); + this.appendValueInput("SIZE") + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MICROBIT_PYTHON_TYPE); + } +}; + +const storage_can_write_ornot = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_FILE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, Boolean); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT1); + } +}; + +const storage_get_filename = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILENAME); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILENAME); + } +}; + +const storage_close_file = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE); + } +}; + +const storage_list_all_files = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, 'List'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES); + } +}; +blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE +const storage_delete_file = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE, 'remove'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_DIRS, 'removedirs'] + ]), 'MODE'); + this.appendValueInput("FILE") + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE); + } +}; + +const storage_get_file_size = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE); + } +}; + +const storage_file_tell = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_RETURN_FILE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_PRESENT_LOCATION); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_TELL); + } +}; + +const storage_file_seek = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck('Variable') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START, 'start'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT, 'current'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END, 'end'] + ]), 'MODE'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET); + this.appendValueInput("SIZE") + .setCheck(Number); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER); + this.setInputsInline(true); + this.setPreviousStatement(true); //in front of the block has something + this.setNextStatement(true); //beyond the ... has something + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER; + var mode3 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET; + var TOOLTIPS = { + 'start': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START, + 'current': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT, + 'end': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END + }; + return mode0 + " " + TOOLTIPS[mode] + mode3 + 'x' + mode2; + }); + } +}; + +const storage_get_current_dir = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, 'List'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR); + } +}; + +const storage_make_dir = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("PATH") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ESP32_SET); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR, 'mkdir'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MAKEDIRS, 'makedirs'] + ]), 'MODE'); + this.setInputsInline(true); + this.setPreviousStatement(true); //in front of the block has something + this.setNextStatement(true); //beyond the ... has something + this.setOutput(false); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ESP32_SET; + var TOOLTIPS = { + 'mkdir': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR, + 'makedirs': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS + }; + return mode0 + 'x' + mode2 + TOOLTIPS[mode]; + }); + } +}; + +const storage_rename = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME); + this.appendValueInput("NEWFILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_AS); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME); + } +}; + +const storage_change_dir = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR); + } +}; + +const storage_is_file = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_FILE, 'isfile'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_DIR, 'isdir'] + ]), 'MODE'); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, Boolean); + let thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('MODE'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH; + var mode2 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT; + var TOOLTIPS = { + 'isfile': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR, + 'isdir': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS + }; + return mode0 + 'x' + mode2 + TOOLTIPS[mode]; + }); + } +}; + +const sdcard_use_spi_init = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput('SPISUB') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.CONTROLS_FOR_INPUT_WITH + "SPI") + .setCheck("var"); + this.appendValueInput('PINSUB') + .appendField("CS") + this.appendValueInput('SUB') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE) + .setCheck("var"); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETUP + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SET_INDEX_INPUT_TO) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SD_CARD); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + } +}; + +const sdcard_mount = { + init: function () { + this.setColour(STORAGE_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SD_CARD); + this.appendValueInput("DIR") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SDCARD_MOUNT); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(); + } +} + +/***/ }), + +/***/ "../python/blocks/text.js": +/*!********************************!*\ + !*** ../python/blocks/text.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ascii_to_char: () => (/* binding */ ascii_to_char), +/* harmony export */ char_to_ascii: () => (/* binding */ char_to_ascii), +/* harmony export */ number_to_text: () => (/* binding */ number_to_text), +/* harmony export */ os_system: () => (/* binding */ os_system), +/* harmony export */ text: () => (/* binding */ text), +/* harmony export */ text_bytes: () => (/* binding */ text_bytes), +/* harmony export */ text_capital: () => (/* binding */ text_capital), +/* harmony export */ text_center: () => (/* binding */ text_center), +/* harmony export */ text_char: () => (/* binding */ text_char), +/* harmony export */ text_char_at: () => (/* binding */ text_char_at), +/* harmony export */ text_char_at2: () => (/* binding */ text_char_at2), +/* harmony export */ text_char_at3: () => (/* binding */ text_char_at3), +/* harmony export */ text_compareTo: () => (/* binding */ text_compareTo), +/* harmony export */ text_compare_to: () => (/* binding */ text_compare_to), +/* harmony export */ text_create_with_container: () => (/* binding */ text_create_with_container), +/* harmony export */ text_create_with_item: () => (/* binding */ text_create_with_item), +/* harmony export */ text_encode: () => (/* binding */ text_encode), +/* harmony export */ text_equals_starts_ends: () => (/* binding */ text_equals_starts_ends), +/* harmony export */ text_eval: () => (/* binding */ text_eval), +/* harmony export */ text_find: () => (/* binding */ text_find), +/* harmony export */ text_format: () => (/* binding */ text_format), +/* harmony export */ text_format_noreturn: () => (/* binding */ text_format_noreturn), +/* harmony export */ text_join: () => (/* binding */ text_join), +/* harmony export */ text_join_seq: () => (/* binding */ text_join_seq), +/* harmony export */ text_length: () => (/* binding */ text_length), +/* harmony export */ text_random_char: () => (/* binding */ text_random_char), +/* harmony export */ text_replace: () => (/* binding */ text_replace), +/* harmony export */ text_split: () => (/* binding */ text_split), +/* harmony export */ text_strip: () => (/* binding */ text_strip), +/* harmony export */ text_substring: () => (/* binding */ text_substring), +/* harmony export */ text_substring2: () => (/* binding */ text_substring2), +/* harmony export */ text_substring3: () => (/* binding */ text_substring3), +/* harmony export */ text_textarea: () => (/* binding */ text_textarea) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const TEXTS_HUE = 160//'#9ec440'//160; + +const text = { + /** + * Block for text value. + * @this Blockly.Block + */ + init: function () { + //this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL); + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(this.newQuote_(true)) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(''), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TEXT_TOOLTIP); + }, + /** + * Create an image of an open or closed quote. + * @param {boolean} open True if open quote, false if closed. + * @return {!Blockly.FieldImage} The field image of the quote. + * @private + */ + newQuote_: function (open) { + if (open == this.RTL) { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + } else { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + } + return new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldImage(file, 12, 12, '"'); + } +}; + +const text_textarea = { + /** + * Block for text value. + * @this Blockly.Block + */ + init: function () { + //this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL); + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(this.newQuote_(true)) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldMultilineInput('Hello\nMixly'), 'VALUE') + // .appendField(new Blockly.FieldTextInput(''), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_LINES_TOOLTIP); + }, + /** + * Create an image of an open or closed quote. + * @param {boolean} open True if open quote, false if closed. + * @return {!Blockly.FieldImage} The field image of the quote. + * @private + */ + newQuote_: function (open) { + if (open == this.RTL) { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + } else { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + } + return new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldImage(file, 12, 12, '"'); + } +}; + +const text_bytes = { + /** + * Block for text value. + * @this Blockly.Block + */ + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TEXT_BYTES) + .appendField(this.newQuote_(true)) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(''), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TEXT_TOOLTIP); + }, + /** + * Create an image of an open or closed quote. + * @param {boolean} open True if open quote, false if closed. + * @return {!Blockly.FieldImage} The field image of the quote. + * @private + */ + newQuote_: function (open) { + if (open == this.RTL) { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + } else { + var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + } + return new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldImage(file, 12, 12, '"'); + } +}; + +blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.char_validator = function (text) { + if (text.length > 1) { + if (text.charAt(0) === "\\") { + var charAtOne = text.charAt(1); + if (charAtOne === "0" || + charAtOne === "b" || + charAtOne === "f" || + charAtOne === "n" || + charAtOne === "r" || + charAtOne === "t" || + charAtOne === "\\" || + charAtOne === "'") { + return String(text).substring(0, 2); + } else if (charAtOne === "x" && text.charAt(2) === "0" && text.charAt(3) === "B") { + return String(text).substring(0, 4); + } + } + } + return String(text).substring(0, 1); +}; + +const text_char = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(this.newQuote_(true)) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('', blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput.char_validator), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHAR_TOOLTIP); + }, + newQuote_: function (open) { + if (open == true) { + var file = '../../media/quote2.png'; + } else { + var file = '../../media/quote3.png'; + } + return new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldImage(file, 7, 12, '"'); + } +}; + + +const text_join = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput('A') + .setCheck([String, Number]); + this.appendValueInput('B') + .setCheck([String, Number]) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TEXT_JOIN); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_JOIN); + } +}; + +const ascii_to_char = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOCHAR); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_TOCHAR); + } +}; + +const char_to_ascii = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOASCII); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_TOASCII); + } +}; + +const number_to_text = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOSTRING); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOTEXT); + } +}; + +const text_length = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LENGTH); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TEXT_LENGTH); + } +} + + + +const text_char_at2 = { + init: function () { + this.WHERE_OPTIONS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START, "FROM_START"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_END, "FROM_END"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_GET_INDEX_RANDOM + 1 + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2, "RANDOM"] + ]; + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_HELPURL); + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String) + // .appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST) + this.appendValueInput("AT") + .setCheck(Number) + this.appendDummyInput() + //.appendField(Blockly.Msg.MIXLY_MID) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_GET, "MODE"); + // .appendField("", "SPACE"); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TAIL && this.appendDummyInput("TAIL").appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TAIL); + // this.appendDummyInput().appendField(Blockly.Msg.MIXLY_DE); + this.setInputsInline(!0); + this.setOutput(!0); + this.updateAt_(!0); + var b = this; + this.setTooltip(function () { + var a = b.getFieldValue("MODE"), + e = b.getFieldValue("WHERE"), + d = ""; + switch (a + " " + e) { + case "GET FROM_START": + case "GET FROM_END": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM; + break; + case "GET RANDOM": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM; + break; + case "GET_REMOVE FROM_START": + case "GET_REMOVE FROM_END": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM; + break; + case "GET_REMOVE RANDOM": + d = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM; + break; + } + if ("FROM_START" == e || "FROM_END" == e) d += " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1", blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.ONE_BASED_INDEXING ? "#1" : "#0"); + return d + }) + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('WHERE'); + var TOOLTIPS = { + 'FROM_START': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START, + 'FROM_END': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_END, + 'RANDOM': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_GET_INDEX_RANDOM + }; + return blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_STRING + TOOLTIPS[mode] + 'n' + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2; + }); + }, + mutationToDom: function () { + var a = document.createElement("mutation"); + a.setAttribute("statement", !this.outputConnection); + var b = this.getInput("AT").type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + a.setAttribute("at", b); + return a + }, + domToMutation: function (a) { + var b = "true" == a.getAttribute("statement"); + this.updateStatement_(b); + a = "false" != a.getAttribute("at"); + this.updateAt_(a) + }, + updateStatement_: function (a) { + a != !this.outputConnection && (this.unplug(!0, !0), a ? (this.setOutput(!1), this.setPreviousStatement(!0), this.setNextStatement(!0)) : (this.setPreviousStatement(!1), this.setNextStatement(!1), this.setOutput(!0))) + }, + updateAt_: function (a) { + this.removeInput("AT"); + this.removeInput("ORDINAL", !0); + a ? (this.appendValueInput("AT").setCheck(Number), blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2 && this.appendDummyInput("ORDINAL").appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2)) : this.appendDummyInput("AT"); + var b = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.WHERE_OPTIONS, + function (b) { + var e = "FROM_START" == b || "FROM_END" == b; + if (e != a) { + var d = this.sourceBlock_; + d.updateAt_(e); + d.setFieldValue(b, "WHERE"); + return null + } + }); + this.getInput("AT").appendField(b, "WHERE"); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TAIL && this.moveInputBefore("TAIL", null) + } +}; + + +const text_char_at = { + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_HELPURL); + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String); + this.appendValueInput("AT") + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_DEFRETURN_RETURN + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_STRING + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START + 'n' + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2); + } +} + + +const text_random_char = { + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_HELPURL); + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_RANDOM_CHAR); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_RANDOM_CHAR_TOOLTIP); + } +} + + +const text_substring2 = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + this['WHERE_OPTIONS_1'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST'] + ]; + this['WHERE_OPTIONS_2'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST'] + ]; + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String) + //.appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL) + // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + // this.appendDummyInput('TAIL') + // .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); + // } + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + this.setInputsInline(true); + this.setOutput(true, 'List'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg._GET_TEXT_SUBLIST_TOOLTIP); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function (n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck(Number); + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2) { + this.appendDummyInput('ORDINAL' + n) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2); + } + } else { + this.appendDummyInput('AT' + n); + } + var menu = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this['WHERE_OPTIONS_' + n], + function (value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + return undefined; + }); + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + if (this.getInput('ORDINAL1')) { + this.moveInputBefore('ORDINAL1', 'AT2'); + } + } + // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + // this.moveInputBefore('TAIL', null); + // } + } +}; + +const text_substring = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String) + this.appendValueInput('AT1') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START); + this.appendValueInput('AT2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_START); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT2); + this.setInputsInline(true); + this.setOutput(true, ['List', String]); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg._GET_TEXT_SUBLIST_TOOLTIP); + } +} + +const text_equals_starts_ends = { + init: function () { + var TEXT_DOWHAT = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_EQUALS, '==='], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STARTSWITH, 'startswith'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ENDSWITH, 'endswith'] + ]; + this.setColour(TEXTS_HUE); + this.appendValueInput("STR1") + .setCheck(String); + this.appendValueInput("STR2") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(TEXT_DOWHAT), 'DOWHAT') + .setCheck(String); + this.setOutput(true, [Boolean, Number]); + this.setInputsInline(true); + } +} + +const text_compare_to = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("STR1") + .setCheck(String); + this.appendValueInput("STR2") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_COMPARETO) + .setCheck(String); + this.setOutput(true, Number); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_COMPARETO_HELP); + } +} + +const text_capital = { + init: function () { + var TEXT_CAPITAL = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_UPPER, 'upper'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TITLE, 'title'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CAPITALIZE, 'capitalize'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_SWAPCASE, 'swapcase'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_LOWER, 'lower'] + ]; + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(TEXT_CAPITAL), 'CAPITAL') + .setCheck(String); + this.setOutput(true, String); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('CAPITAL'); + var TOOLTIPS = { + 'upper': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_UPPER_TOOLTIP, + 'title': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_TITLE_TOOLTIP, + 'swapcase': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_SWAPCASE_TOOLTIP, + 'capitalize': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_CAPITALIZE_TOOLTIP, + 'lower': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_LOWER_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +} + +const text_center = { + init: function () { + var TEXT_CENTER = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_LJUST, 'ljust'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CENTER, 'center'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_RJUST, 'rjust'] + ]; + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(TEXT_CENTER), 'CENTER') + .setCheck(String); + this.appendValueInput("WID") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_WIDTH) + .setCheck(Number); + this.appendValueInput("Symbol") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_RECT_Fill) + .setCheck(String); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_CENTER_TOOLTIP); + } +} + +const text_find = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .setCheck(String); + this.appendValueInput("STR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MID + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER) + .setCheck(String); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_INDEX); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_FIND_TOOLTIP); + } +} + +const text_join_seq = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_USE_STR) + .setCheck(String); + this.appendValueInput('LIST') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_SEQ) + .setCheck('List', 'Tuple', 'Set', 'Dict'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_GET_STR); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_TOOLTIP); + } +} + +const text_replace = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR") + .setCheck(String); + this.appendValueInput("STR1") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_REPLACE) + .setCheck(String); + this.appendValueInput("STR2") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_SET_INDEX_INPUT_TO) + .setCheck(String); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_REPLACE_TOOLTIP); + } +} + +const text_split = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput("VAR"); + this.appendValueInput("VAL") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LIST_SPLIT_AS); + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LIST_SPLIT); + this.setOutput(true, "List"); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_SPLIT_TOOLTIP); + this.setInputsInline(true); + } +} + +const text_strip = { + init: function () { + var STRIP = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_BOTH, 'strip'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_LEFT, 'lstrip'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_RIGHT, 'rstrip']]; + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_STRIM); + this.appendDummyInput('') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(STRIP), 'TOWHAT'); + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_BLANK); + this.setOutput(true, String); + this.setInputsInline(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('TOWHAT'); + var TOOLTIPS = { + 'strip': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_BOTH_TOOLTIP, + 'lstrip': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_LEFT_TOOLTIP, + 'rstrip': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_RIGHT_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +const text_format = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_FORMAT) + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE') + // .appendField(' ') + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('str'), 'VAR'); + this.itemCount_ = 1; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['text_create_with_item'], this)); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_FORMAT_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('text_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('text_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_BEFORE_PARAMS); + } + } + } + }, + getVars: function () { + if (this.getFieldValue('VAR') != null) { + if ((this.getFieldValue('VAR').indexOf("'") == -1) && (this.getFieldValue('VAR').indexOf('"') == -1)) { + return [this.getFieldValue('VAR')]; + } + return []; + } + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + + } +}; + +const text_create_with_container = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_MUTATORCONTAINER_TITLE); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const text_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_VARIABLES_NAME); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +const text_substring3 = text_substring +const text_compareTo = text_compare_to +const text_char_at3 = text_char_at + +const text_format_noreturn = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(TEXTS_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_FORMAT) + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE') + // .appendField(' ') + this.appendValueInput("VAR") + .setCheck(String); + this.itemCount_ = 1; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['text_create_with_item'], this)); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TEXT_FORMAT_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('text_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('text_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_BEFORE_PARAMS); + } + } + } + } +}; + + + +const text_encode = { + init: function () { + this.setColour(TEXTS_HUE); + var encode_decode = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TEXT_ENCODE, 'encode'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TEXT_DECODE, 'decode']]; + var code = + [['ASCII', 'ASCII'], ['gb2312', 'gb2312'], ['gbk', 'gbk'], ['utf-8', 'utf-8'], ['utf-16', 'utf-16'], ['utf-32', 'utf-32']]; + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(code), 'CODE') + .appendField(' ') + this.appendValueInput("VAR") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(encode_decode), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_STRING); + this.setOutput(true, String); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TEXT_ENCODE_DECODE_TOOLTIP); + + } +}; + + +const text_eval = { + init: function () { + + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_EVAL); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_EVAL_RESULT); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TEXT_EVAL_TOOLTIP); + } +}; + +const os_system = { + init: function () { + this.setColour(TEXTS_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_OS_SYSTEM); + this.setInputsInline(true); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_OS_SYSTEM_TOOLTIP); + } +}; + +/***/ }), + +/***/ "../python/blocks/tuple.js": +/*!*********************************!*\ + !*** ../python/blocks/tuple.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ tuple_change_to: () => (/* binding */ tuple_change_to), +/* harmony export */ tuple_create_llm_params: () => (/* binding */ tuple_create_llm_params), +/* harmony export */ tuple_create_with: () => (/* binding */ tuple_create_with), +/* harmony export */ tuple_create_with_container: () => (/* binding */ tuple_create_with_container), +/* harmony export */ tuple_create_with_item: () => (/* binding */ tuple_create_with_item), +/* harmony export */ tuple_create_with_noreturn: () => (/* binding */ tuple_create_with_noreturn), +/* harmony export */ tuple_create_with_text2: () => (/* binding */ tuple_create_with_text2), +/* harmony export */ tuple_create_with_text_return: () => (/* binding */ tuple_create_with_text_return), +/* harmony export */ tuple_del: () => (/* binding */ tuple_del), +/* harmony export */ tuple_find: () => (/* binding */ tuple_find), +/* harmony export */ tuple_getIndex: () => (/* binding */ tuple_getIndex), +/* harmony export */ tuple_getSublist: () => (/* binding */ tuple_getSublist), +/* harmony export */ tuple_get_random_item: () => (/* binding */ tuple_get_random_item), +/* harmony export */ tuple_get_sublist: () => (/* binding */ tuple_get_sublist), +/* harmony export */ tuple_input: () => (/* binding */ tuple_input), +/* harmony export */ tuple_join: () => (/* binding */ tuple_join), +/* harmony export */ tuple_length: () => (/* binding */ tuple_length), +/* harmony export */ tuple_max: () => (/* binding */ tuple_max), +/* harmony export */ tuple_totuple: () => (/* binding */ tuple_totuple), +/* harmony export */ tuple_trig: () => (/* binding */ tuple_trig) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const TUPLE_HUE = 195; //'#5ec73d'//195; + +const tuple_create_with = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput("") + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE') + // .appendField(' ') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('mytup'), 'VAR'); + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['tuple_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('tuple_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('tuple_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_EMPTY_TITLE); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_INPUT_WITH); + } + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const tuple_create_with_container = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_CONTAINER_TITLE_ADD); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const tuple_create_with_item = { + /** + * Mutator bolck for adding items. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_VARIABLES_NAME); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +const tuple_create_with_text2 = { + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput("") + //don't need to specify the data type in Python + // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array']]), 'TYPE') + // .appendField(' ') + // .appendField(Blockly.Msg.blockpy_MIXLY_TUPLE_CREATE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('mytup'), 'VAR') + //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE') + // .appendField(Blockly.Msg.MIXLY_MAKELISTFROM) + // .appendField(this.newQuote_(true)) + .appendField(' = (') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0,0,0'), 'TEXT') + .appendField(')'); + // .appendField(this.newQuote_(false)) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + // newQuote_: function(open) { + // if (open == this.RTL) { + // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + // } else { + // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + // } + // return new Blockly.FieldImage(file, 12, 12, '"'); + // } +} + +const tuple_create_with_text_return = { + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput("") + .appendField('(') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('0,0,0'), 'TEXT') + .appendField(')'); + // .appendField(this.newQuote_(false)) + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT); + // }, + // getVars: function() { + // return [this.getFieldValue('VAR')]; + // }, + // renameVar: function(oldName, newName) { + // if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) { + // this.setTitleValue(newName, 'VAR'); + // } + } + // newQuote_: function(open) { + // if (open == this.RTL) { + // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg=='; + // } else { + // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC'; + // } + // return new Blockly.FieldImage(file, 12, 12, '"'); + // } +} + +const tuple_getIndex = { + init: function () { + this.setColour(TUPLE_HUE); + this.setOutput(true); + this.appendValueInput('TUP') + .setCheck('Tuple') + this.appendValueInput('AT') + .setCheck(Number) + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_GET_INDEX1); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_GET_INDEX2); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_GET_INDEX_TOOLTIP); + } +}; + +const tuple_length = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput('TUP'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LENGTH); + + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_LENGTH_TOOLTIP); + this.setOutput(true, Number); + } +}; + +const tuple_del = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput('TUP') + .setCheck('Tuple') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_DEL); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_DEL_TOOLTIP); + } +}; + +const tuple_join = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput('TUP1') + .setCheck('Tuple') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_JOIN) + this.appendValueInput('TUP2') + .setCheck('Tuple') + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_JOIN_TOOLTIP); + this.setOutput(true, "Tuple"); + } +}; + + +const tuple_max = { + init: function () { + this.appendValueInput('TUP') + .setCheck('Tuple') + var max_min = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_TUPLE_MAX, 'max'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_TUPLE_MIN, 'min'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_SUM, 'sum']]; + this.setColour(TUPLE_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_GET) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(max_min), 'DIR') + + + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'max': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TUPLE_MAX, + 'min': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TUPLE_MIN, + 'sum': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TUPLE_SUM + }; + return TOOLTIPS[mode]; + }); + } +}; + +const tuple_change_to = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set'] + ]; + this.setColour(TUPLE_HUE); + this.appendValueInput('VAR') + .setCheck("Tuple") + // .appendField(Blockly.Msg.blockpy_USE_LIST); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.A_TO_B) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'list': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_TO_LISTS, + 'set': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_TO_SET, + }; + return TOOLTIPS[mode]; + }); + } +}; + +const tuple_find = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_INDEX, 'INDEX'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_COUNT, 'COUNT'] + ]; + this.setColour(TUPLE_HUE); + this.appendValueInput('VAR') + .setCheck('List') + this.appendValueInput('data') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_VALUE) + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR') + this.setInputsInline(true); + this.setOutput(true, Number); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'INDEX': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TUPLE_FIND_INDEX, + 'COUNT': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TUPLE_FIND_COUNT + + }; + return TOOLTIPS[mode]; + }); + } +}; + +const tuple_trig = { + init: function () { + var OPERATORS = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LIST_LEN, 'LEN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_SUM, 'SUM'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MAX, 'MAX'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MIN, 'MIN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_AVERAGE, 'AVERAGE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MEDIAN, 'MEDIAN'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MODE, 'MODE'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_STD_DEV, 'STD_DEV'], + ]; + //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL); + this.setColour(TUPLE_HUE); + this.setOutput(true, Number); + this.appendValueInput('data') + .setCheck('List') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('OP'); + var TOOLTIPS = { + 'LEN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_LENGTH_TOOLTIP, + 'SUM': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_SUM, + 'MAX': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MAX, + 'MIN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MIN, + 'AVERAGE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_AVERAGE, + 'MEDIAN': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MEDIAN, + 'MODE': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MODE, + 'STD_DEV': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_TOOLTIP_TUPLE_STD_DEV + + }; + return TOOLTIPS[mode]; + }); + } +}; + +const tuple_getSublist = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + this['WHERE_OPTIONS_1'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST'] + ]; + this['WHERE_OPTIONS_2'] = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST'] + ]; + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(TUPLE_HUE); + this.appendValueInput('LIST') + .setCheck('List') + //.appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL) + // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + // this.appendDummyInput('TAIL') + // .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); + // } + this.appendDummyInput('') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + this.setInputsInline(true); + this.setOutput(true, 'List'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYTHON_TUPLE_GET_SUBLIST_TOOLTIP); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this Blockly.Block + */ + updateAt_: function (n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck(Number); + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL) { + this.appendDummyInput('ORDINAL' + n) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL); + } + } else { + this.appendDummyInput('AT' + n); + } + var menu = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this['WHERE_OPTIONS_' + n], + function (value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.sourceBlock_; + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + return undefined; + }); + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + if (this.getInput('ORDINAL1')) { + this.moveInputBefore('ORDINAL1', 'AT2'); + } + } + // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) { + // this.moveInputBefore('TAIL', null); + // } + } +}; + +const tuple_create_with_noreturn = { + /** + * Block for creating a list with any number of elements of any type. + * @this Blockly.Block + */ + init: function () { + this.setColour(TUPLE_HUE); + this.itemCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, "Tuple") + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['tuple_create_with_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_TOOLTIP); + }, + /** + * Create XML to represent list inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('tuple_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('tuple_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_EMPTY_TITLE); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_CREATE_WITH_INPUT_WITH); + } + } + } + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const tuple_get_sublist = { + /** + * Block for getting sublist. + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_HELPURL); + this.setColour(TUPLE_HUE); + this.appendValueInput('LIST') + this.appendDummyInput('') + this.appendValueInput('AT1') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_FROM_START); + this.appendValueInput('AT2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_SUBLIST_END_FROM_START); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_CHARAT_TAIL); + this.setInputsInline(true); + this.setOutput(true, 'Tuple'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYTHON_TUPLE_GET_SUBLIST_TOOLTIP); + } +} + +const tuple_get_random_item = { + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput("TUP"); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + " " + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_RANDOM) + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM); + this.setOutput(true); + } +}; + +const tuple_totuple = { + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOTUPLE); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOTUPLE); + } +}; +function getCurrentTimeTuple() { + var now = new Date(); + var year = now.getFullYear(); + var month = now.getMonth() + 1; // 月份从 0 开始,所以要加 1 + var day = now.getDate(); + var hour = now.getHours(); + var minute = now.getMinutes(); + var second = now.getSeconds(); + + // 返回元组格式的时间字符串 + return year + "," + month + "," + day + "," + hour + "," + minute + "," + second ; +} +const tuple_input = { + init: function () { + this.setColour(TUPLE_HUE); + this.appendDummyInput("") + .appendField('(') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(getCurrentTimeTuple()),"CONTENT") + .appendField(')'); + this.setOutput(true); + } +}; + + +const tuple_create_llm_params= { + init: function () { + this.setColour(TUPLE_HUE); + this.appendValueInput("params") + .appendField('(') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_NAME_OF_PARAMS) + this.appendDummyInput() + .appendField(',') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE_BOOLEAN,"boolean"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE_STRING,"string"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE_NUMBER,"number"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE_INTEGER,"integer"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TYPE_NULL,"null"] + ]),"type") + this.appendValueInput("des") + .appendField(',') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DESCRIPTION) + this.appendDummyInput() + .appendField(')'); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT); + } +}; + +/***/ }), + +/***/ "../python/blocks/utility.js": +/*!***********************************!*\ + !*** ../python/blocks/utility.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ attribute_access: () => (/* binding */ attribute_access), +/* harmony export */ function_call: () => (/* binding */ function_call), +/* harmony export */ function_call_container: () => (/* binding */ function_call_container), +/* harmony export */ function_call_item: () => (/* binding */ function_call_item), +/* harmony export */ raw_block: () => (/* binding */ raw_block), +/* harmony export */ raw_empty: () => (/* binding */ raw_empty), +/* harmony export */ raw_expression: () => (/* binding */ raw_expression), +/* harmony export */ raw_table: () => (/* binding */ raw_table), +/* harmony export */ text_comment: () => (/* binding */ text_comment), +/* harmony export */ text_print_multiple: () => (/* binding */ text_print_multiple), +/* harmony export */ text_print_multiple_container: () => (/* binding */ text_print_multiple_container), +/* harmony export */ text_print_multiple_item: () => (/* binding */ text_print_multiple_item), +/* harmony export */ type_check: () => (/* binding */ type_check) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility blocks for Blockly. + * @author acbart@vt.edu (Austin Cory Bart) + */ + + +const UTILITY_HUE = 160; + +const raw_table = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.appendDummyInput() + .appendField('Tabular Abstraction:'); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTable(''), 'TEXT'); + } +}; + +const raw_block = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.appendDummyInput() + .appendField('Code Block:'); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldMultilineInput(''), 'TEXT'); + } +}; + +const raw_expression = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendField('Code Expression:'); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldMultilineInput(''), 'TEXT'); + this.setOutput(true); + } +}; + +const raw_empty = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.appendValueInput('VALUE') + .appendField(''); + this.setInputsInline(false); + } +}; + +const text_comment = { + // Text value. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendTitle('Comment:') + .appendTitle(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(''), 'TEXT'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip('This comment will be ignored by Python'); + } +}; + +const type_check = { + // Set element at index. + init: function () { + this.setColour(UTILITY_HUE); + this.appendValueInput('VALUE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TYPE_CHECK); + this.setInputsInline(false); + this.setOutput(true, 'Type'); + //this.setPreviousStatement(true); + //this.setNextStatement(true); + } +}; + + +const text_print_multiple = { + /** + * Block for printing multiple things (including nothing) + * @this Blockly.Block + */ + init: function () { + this.setColour(UTILITY_HUE); + this.itemCount_ = 1; + this.updateShape_(); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['text_print_multiple_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_PRINT_TOOLTIP); + }, + /** + * Create XML to represent print inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Block.obtain(workspace, + 'text_print_multiple_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var x = 0; x < this.itemCount_; x++) { + var itemBlock = workspace.newBlock('text_print_multiple_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('PRINT' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + // Store a pointer to any connected child blocks. + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var x = 0; + while (itemBlock) { + var input = this.getInput('PRINT' + x); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + x++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('PRINT' + i)) { + this.removeInput('PRINT' + i); + i++; + } + } + + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField("print"); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('PRINT' + i); + if (i == 0) { + input.appendField("print"); + } + } + } + } +}; + +const text_print_multiple_container = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendField('print'); + this.appendStatementInput('STACK'); + this.setTooltip(''); + this.contextMenu = false; + } +}; +const text_print_multiple_item = { + // Add items. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendField('item'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(''); + this.contextMenu = false; + } +}; + +const function_call = { + /** + * Block for printing multiple things (including nothing) + * @this Blockly.Block + */ + init: function () { + this.setColour(UTILITY_HUE); + this.itemCount_ = 1; + this.hasReturn_ = false; + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput("str"), 'NAME'); + this.updateShape_(); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['function_call_item'], this)); + this.setTooltip("Can be used to call any function"); + }, + /** + * Create XML to represent print inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + container.setAttribute('hasReturn', this.hasReturn_ ? "TRUE" : "FALSE"); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.hasReturn_ = xmlElement.getAttribute('hasReturn') === "TRUE"; + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Block.obtain(workspace, + 'function_call_container'); + containerBlock.initSvg(); + + containerBlock.setFieldValue(this.hasStatements_ ? 'TRUE' : 'FALSE', + 'RETURN'); + + var connection = containerBlock.getInput('STACK').connection; + for (var x = 0; x < this.itemCount_; x++) { + var itemBlock = workspace.newBlock('function_call_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Notification that the procedure's return state has changed. + * @param {boolean} returnState New return state + * @this Blockly.Block + */ + setReturn: function (returnState) { + this.unplug(true, true); + this.setOutput(returnState); + this.setPreviousStatement(!returnState); + this.setNextStatement(!returnState); + if (this.rendered) { + this.render(); + } + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + + this.hasReturn_ = containerBlock.getFieldValue("RETURN") === "TRUE"; + + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ARGUMENT' + i).connection.connect(connections[i]); + } + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + // Store a pointer to any connected child blocks. + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var x = 0; + while (itemBlock) { + var input = this.getInput('ARGUMENT' + x); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + x++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ARGUMENT' + i)) { + this.removeInput('ARGUMENT' + i); + i++; + } + } + + // Rebuild block. + for (var i = 0; i < this.itemCount_; i++) { + this.appendValueInput('ARGUMENT' + i); + } + + // Set whether returns anything + this.setReturn(this.hasReturn_); + } +}; + +const function_call_container = { + // Container. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendField('Arguments'); + this.appendStatementInput('STACK'); + this.appendDummyInput() + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField('has return') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldCheckbox('TRUE'), + 'RETURN'); + this.setTooltip(''); + this.contextMenu = false; + } +}; +const function_call_item = { + // Add items. + init: function () { + this.setColour(UTILITY_HUE); + this.appendDummyInput() + .appendField('argument'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(''); + this.contextMenu = false; + } +}; + +const attribute_access = { + init: function () { + this.appendValueInput("MODULE") + .setCheck(null); + this.appendValueInput("NAME") + .setCheck(null) + .appendField("."); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(230); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + + +/***/ }), + +/***/ "../python/blocks/variables.js": +/*!*************************************!*\ + !*** ../python/blocks/variables.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ controls_type: () => (/* binding */ controls_type), +/* harmony export */ controls_typeLists: () => (/* binding */ controls_typeLists), +/* harmony export */ lists_zip: () => (/* binding */ lists_zip), +/* harmony export */ lists_zip_container: () => (/* binding */ lists_zip_container), +/* harmony export */ lists_zip_item: () => (/* binding */ lists_zip_item), +/* harmony export */ unpack_iterable_object: () => (/* binding */ unpack_iterable_object), +/* harmony export */ variables_change: () => (/* binding */ variables_change), +/* harmony export */ variables_get: () => (/* binding */ variables_get), +/* harmony export */ variables_global: () => (/* binding */ variables_global), +/* harmony export */ variables_set: () => (/* binding */ variables_set) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _others_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../others/names */ "../python/others/names.js"); + + + +const VARIABLES_HUE = 330//'#af5180'//330; + +// ************************************************************************ +// THIS SECTION IS INSERTED INTO BLOCKLY BY BLOCKLYDUINO. +// export const variables_declare = { +// // Variable setter. +// init: function() { +// this.setColour(VARIABLES_HUE); +// this.appendValueInput('VALUE', null) +// .appendField(Blockly.Msg.MIXLY_DECLARE) +// .appendField(new Blockly.FieldTextInput(''), 'VAR') +// //.appendField(Blockly.Msg.MIXLY_AS) +// //.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'number'], [Blockly.Msg.LANG_MATH_STRING, 'string'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean']]), 'TYPE') +// .appendField(Blockly.Msg.MIXLY_VALUE); +// this.setPreviousStatement(true); +// this.setNextStatement(true); +// this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_VARIABLES_DECLARE); +// }, +// getVars: function() { +// return [this.getFieldValue('VAR')]; +// }, +// renameVar: function(oldName, newName) { +// if (Names.equals(oldName, this.getFieldValue('VAR'))) { +// this.setTitleValue(newName, 'VAR'); +// } +// } +// }; +// ************************************************************************ + +const variables_get = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(''), 'VAR') + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.VARIABLES_GET_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (_others_names__WEBPACK_IMPORTED_MODULE_1__["default"].equals(oldName, this.getFieldValue('VAR'))) { + this.setFieldValue(newName, 'VAR'); + } + }/*, + onchange: function() { + var varName = Blockly.Arduino.variableDB_.getName(this.getFieldValue('VAR'),Blockly.Variables.NAME_TYPE); + if(Blockly.Arduino.definitions_['var_declare'+varName]){ + this.setWarningText(null); + }else{ + this.setWarningText(Blockly.Msg.MIXLY_WARNING_NOT_DECLARE); + } + }*/ +}; + +// export const variables_set = { +// init: function() { +// this.setColour(VARIABLES_HUE); +// this.appendValueInput('VALUE') +// .appendField(new Blockly.FieldTextInput(''), 'VAR') +// .appendField(Blockly.Msg.MIXLY_VALUE2); +// this.setPreviousStatement(true); +// this.setNextStatement(true); +// this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP); +// }, +// getVars: function() { +// return [this.getFieldValue('VAR')]; +// }, +// renameVar: function(oldName, newName) { +// if (Names.equals(oldName, this.getFieldValue('VAR'))) { +// this.setFieldValue(newName, 'VAR'); +// } +// }/*, +// onchange: function() { +// var varName = Blockly.Arduino.variableDB_.getName(this.getFieldValue('VAR'),Blockly.Variables.NAME_TYPE); +// if(Blockly.Arduino.definitions_['var_declare'+varName]){ +// this.setWarningText(null); +// }else{ +// this.setWarningText(Blockly.Msg.MIXLY_WARNING_NOT_DECLARE); +// } +// }*/ +// }; +const variables_set = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendValueInput('VALUE') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput(''), 'VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_VALUE2); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.VARIABLES_SET_TOOLTIP); + }, + getVars: function () { + var varValue = this.getFieldValue('VAR'); + if (varValue == null) { + return []; + } + return varValue.split(","); + }, + renameVar: function (oldName, newName) { + if (_others_names__WEBPACK_IMPORTED_MODULE_1__["default"].equals(oldName, this.getFieldValue('VAR'))) { + this.setFieldValue(newName, 'VAR'); + } + } +}; +/** + * Block for basic data type change. + * @this Blockly.Block + */ +const variables_change = { + init: function () { + this.setColour(VARIABLES_HUE); + var DATATYPES = + [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, "int"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_FLOAT, "float"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BOOLEAN, "bool"], + // [Blockly.Msg.MIXLY_MICROPYTHON_TYPE_COMPLEX, "complex"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_STRING, "str"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST, "list"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_TUPLE, "tuple"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT, "dict"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, "set"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BYTE, "bytes"] + ]; + this.appendValueInput('MYVALUE') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(DATATYPES), 'OP'); + // Assign 'this' to a variable for use in the tooltip closure below. + this.setOutput(true); + // this.setInputsInline(true); + + } +}; + + +const variables_global = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_GLOBAL) + .setCheck("var"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_PRINT_TOOLTIP); + } +}; + + +const controls_type = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendValueInput("DATA") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MICROBIT_PYTHON_TYPE); + // this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MICROBIT_PYTHON_TYPE); + } +}; + + +const controls_typeLists = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_CONTORL_GET_TYPE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, "int"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_FLOAT, "float"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_STRING, "str"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST, "list"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_TUPLE, "tuple"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT, "dict"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, "set"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BYTE, "bytes"], + // [Blockly.Msg.MIXLY_MICROBIT_IMAGE,"image"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NULL, "type(None)"]]), "type"); + //整数、浮点数、字符串、列表、元组、字典、集合、图像不太对, unfinished + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('type'); + var mode0 = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MICROBIT_controls_TypeLists; + var TOOLTIPS = { + 'int': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, + 'float': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_FLOAT, + 'str': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_STRING, + 'list': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_LIST, + 'tuple': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_TUPLE, + 'dict': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT, + 'set': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, + 'image': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_IMAGE, + 'bytes': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_BYTE, + 'NoneType': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LOGIC_NULL + }; + return mode0 + TOOLTIPS[mode]; + }); + } +}; + +const lists_zip = { + init: function () { + this.setColour(VARIABLES_HUE); + + this.itemCount_ = 2; + this.updateShape_(); + this.setInputsInline(true); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true, "List") + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['lists_zip_item'], this)); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP_TOOLTIP); + }, + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('lists_zip_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_zip_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i).connection.connect(connections[i]); + } + } + }, + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP); + } + } + } + } +}; + +const lists_zip_container = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const lists_zip_item = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +const unpack_iterable_object = { + init: function () { + this.setColour(VARIABLES_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_VARIABLE_UNPACK) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM, '*'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_TYPE_DICT, '**'] + ]), 'TYPE'); + this.setTooltip(''); + this.setOutput(true); + } +}; + +/***/ }), + +/***/ "../python/generators/control.js": +/*!***************************************!*\ + !*** ../python/generators/control.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Panic_with_status_code: () => (/* binding */ Panic_with_status_code), +/* harmony export */ base_setup: () => (/* binding */ base_setup), +/* harmony export */ controls_delay: () => (/* binding */ controls_delay), +/* harmony export */ controls_flow_statements: () => (/* binding */ controls_flow_statements), +/* harmony export */ controls_for: () => (/* binding */ controls_for), +/* harmony export */ controls_forEach: () => (/* binding */ controls_forEach), +/* harmony export */ controls_for_range: () => (/* binding */ controls_for_range), +/* harmony export */ controls_if: () => (/* binding */ controls_if), +/* harmony export */ controls_interrupts: () => (/* binding */ controls_interrupts), +/* harmony export */ controls_lambda: () => (/* binding */ controls_lambda), +/* harmony export */ controls_main: () => (/* binding */ controls_main), +/* harmony export */ controls_millis: () => (/* binding */ controls_millis), +/* harmony export */ controls_nointerrupts: () => (/* binding */ controls_nointerrupts), +/* harmony export */ controls_pass: () => (/* binding */ controls_pass), +/* harmony export */ controls_range: () => (/* binding */ controls_range), +/* harmony export */ controls_repeat: () => (/* binding */ controls_repeat), +/* harmony export */ controls_repeat_ext: () => (/* binding */ controls_repeat_ext), +/* harmony export */ controls_thread: () => (/* binding */ controls_thread), +/* harmony export */ controls_try_finally: () => (/* binding */ controls_try_finally), +/* harmony export */ controls_whileUntil: () => (/* binding */ controls_whileUntil), +/* harmony export */ datetime_fromtimestamp: () => (/* binding */ datetime_fromtimestamp), +/* harmony export */ do_while: () => (/* binding */ do_while), +/* harmony export */ garbage_collection: () => (/* binding */ garbage_collection), +/* harmony export */ gene_unique_identifier: () => (/* binding */ gene_unique_identifier), +/* harmony export */ get_mem_alloc: () => (/* binding */ get_mem_alloc), +/* harmony export */ get_mem_free: () => (/* binding */ get_mem_free), +/* harmony export */ get_unique_identifier: () => (/* binding */ get_unique_identifier), +/* harmony export */ reset: () => (/* binding */ reset), +/* harmony export */ time_sleep: () => (/* binding */ time_sleep) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_1__); + + + +const controls_main = function (a, generator) { + var d = generator.statementToCode(a, "DO"), + d = generator.addLoopTrap(d, a.id) || generator.PASS; + return "if __name__ == '__main__':\n" + d; +} + +const base_setup = function (_, generator) { + var branch = generator.statementToCode(this, 'DO'); + branch = branch.replace(/(^\s*)|(\s*$)/g, "").replace(/\n {4}/g, '\n');//去除两端空格 + if (branch.endsWith('\n')) { + generator.setups_['setup_setup'] = branch; + } + else { + generator.setups_['setup_setup'] = branch + '\n'; + } + return ''; +} + +// ok +const controls_if = function (a, generator) { + var b = 0, + c = "", + d, + e; + do + e = generator.valueToCode(a, "IF" + b, generator.ORDER_NONE) || "False", d = generator.statementToCode(a, "DO" + b) || generator.PASS, c += (0 == b ? "if " : "elif ") + e + ":\n" + d, ++b; + while (a.getInput("IF" + b)); + a.getInput("ELSE") && (d = generator.statementToCode(a, "ELSE") || generator.PASS, c += "else:\n" + d); + return c +} + +const controls_try_finally = function (_, generator) { + var n = 1; + var argument = generator.valueToCode(this, 'IF' + n, + generator.ORDER_NONE) || 'null'; + var branch = ''; + var t = generator.statementToCode(this, 'try') || ' pass\n'; + var code = 'try:\n' + t; + for (n = 1; n <= this.elseifCount_; n++) { + argument = generator.valueToCode(this, 'IF' + n, + generator.ORDER_NONE) || ''; + if (argument !== '') + argument = ' ' + argument + branch = generator.statementToCode(this, 'DO' + n) || ' pass\n'; + code += 'except' + argument + ': \n' + branch; + } + if (this.elseCount_) { + branch = generator.statementToCode(this, 'ELSE') || ' pass\n'; + code += 'finally:\n' + branch; + } + // code += '}'; + return code; +} + +// ok +const controls_for = function (a, generator) { + var b = generator.variableDB_.getName(a.getFieldValue("VAR"), blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE), + //var b = generator.valueToCode(a, "VAR", generator.ORDER_MEMBER) || "''", + c = generator.valueToCode(a, "FROM", generator.ORDER_NONE) || "0", + d = generator.valueToCode(a, "TO", generator.ORDER_NONE) || "0", + e = generator.valueToCode(a, "STEP", generator.ORDER_NONE) || "1", + f = generator.statementToCode(a, "DO"), + f = generator.addLoopTrap(f, a.id) || generator.PASS, + g = "", + h = function (_, generator) { + return generator.provideFunction_("upRange", + ["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start <= stop:", " yield start", " start += abs(step)"]) + }, + k = function (_, generator) { + return generator.provideFunction_("downRange", ["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start >= stop:", " yield start", " start -= abs(step)"]) + } + a = function (a, b, c) { + return "(" + a + " <= " + b + ") and " + h() + "(" + a + ", " + b + ", " + c + ") or " + k() + "(" + a + ", " + b + ", " + c + ")" + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(c) && blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(d) && + blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(e)) + c = parseFloat(c), d = parseFloat(d), e = Math.abs(parseFloat(e)), 0 === c % 1 && 0 === d % 1 && 0 === e % 1 ? (c <= d ? (d++, a = 0 == c && 1 == e ? d : c + ", " + d, 1 != e && (a += ", " + e)) : (d--, a = c + ", " + d + ", -" + e), a = "range(" + a + ")") : (a = c < d ? h() : k(), a += "(" + c + ", " + d + ", " + e + ")"); + else { + var l = function (a, c) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(a)) + a = parseFloat(a); + else { + var d = generator.variableDB_.getDistinctName(b + c, blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + g += d + " = " + a + "\n"; + a = d + } + return a + }, + c = l(c, "_start"), + d = l(d, "_end"); + l(e, "_inc"); + a = "number" == typeof c && "number" == typeof d ? c < d ? h(c, d, e) : k(c, d, e) : a(c, d, e) + } + return g += "for " + b + " in " + a + ":\n" + f +} + +const controls_for_range = function (block, generator) { + var iter = generator.variableDB_.getName(block.getFieldValue("VAR"), blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE), + from = generator.valueToCode(block, "FROM", generator.ORDER_NONE) || "0", + end = generator.valueToCode(block, "TO", generator.ORDER_NONE) || "0", + step = generator.valueToCode(block, "STEP", generator.ORDER_NONE) || "1", + dostatement = generator.statementToCode(block, "DO"), + pass = generator.addLoopTrap(dostatement, block.id) || generator.PASS; + generator.setups_["mixly_range"] = "def mixly_range(start, stop, step):\n" + + " for i in range(start, stop + 1, step):\n" + + " yield i\n\n"; + return "for " + iter + " in mixly_range(" + from + ", " + end + ", " + step + "):\n" + pass; +} + +const controls_whileUntil = function (a, generator) { + var b = "UNTIL" == a.getFieldValue("MODE"), + c = generator.valueToCode(a, "BOOL", generator.ORDER_NONE) || "False", + d = generator.statementToCode(a, "DO"), + d = generator.addLoopTrap(d, a.id) || generator.PASS; + b && (c = "not " + c); + return "while " + c + ":\n" + d +} + +// export const controls_flow_statements = function (_, generator) { +// // Flow statements: continue, break. +// switch (this.getFieldValue('FLOW')) { +// case 'BREAK': +// return 'break;\n'; +// case 'CONTINUE': +// return 'continue;\n'; +// } +// throw 'Unknown flow statement.'; +// } + +//ok +const controls_flow_statements = function (a) { + switch (a.getFieldValue("FLOW")) { + case "BREAK": + return "break\n"; + case "CONTINUE": + return "continue\n" + } + throw "Unknown flow statement."; +} + +// ok +const controls_delay = function (_, generator) { + var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000' + var code = 'sleep(' + delay_time + ')\n'; + return code; +} + +// ok +const Panic_with_status_code = function (_, generator) { + var status_code = generator.valueToCode(this, 'STATUS_CODE', generator.ORDER_ATOMIC) || '1000' + var code = 'panic(' + status_code + ')\n'; + return code; +} + +// ok +const controls_millis = function (_, generator) { + generator.definitions_.import_time = "import time"; + var code = 'time.time()'; + return [code, generator.ORDER_ATOMIC]; +} + +// ok +const reset = function (_, generator) { + generator.definitions_['import_microbit'] = 'from microbit import *' + return 'reset()\n'; +} +const controls_interrupts = function () { + return 'interrupts();\n'; +} + +const controls_nointerrupts = function () { + return 'noInterrupts();\n'; +} + + +const controls_forEach = function (block, generator) { + // For each loop. + var variable0 = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\'\''; + var argument0 = generator.valueToCode(block, 'LIST', + generator.ORDER_RELATIONAL) || '[]'; + var branch = generator.statementToCode(block, 'DO'); + branch = generator.addLoopTrap(branch, block.id) || + generator.PASS; + var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch; + return code; +} + +const controls_range = function (_, generator) { + var from = generator.valueToCode(this, "FROM", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "TO", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "STEP", generator.ORDER_NONE) || "1"; + var code = "range(" + from + ", " + end + ", " + step + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const controls_lambda = function (a, generator) { + var c = generator.valueToCode(a, "BOOL", generator.ORDER_NONE) || "None", + d = generator.statementToCode(a, "DO") || "pass"; + var code = "lambda " + c + ": " + d; + code = code.replace('\n', '').replace(' ', '') + return [code, generator.ORDER_ATOMIC]; +} + +const time_sleep = function (_, generator) { + generator.definitions_['import_time'] = 'import time'; + var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000' + var code = 'time.sleep(' + delay_time + ')\n'; + return code; +} + +const controls_pass = function () { + return 'pass\n'; +} + +const controls_thread = function (_, generator) { + generator.definitions_['import__thread'] = 'import _thread'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.variableDB_.getName( + generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None", + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.NAME_TYPE + ); + var code = "_thread.start_new_thread(" + callback + ", " + v + ")\n"; + return code; +} + +// do-while循环 +const do_while = function (_, generator) { + var value_select_data = generator.valueToCode(this, 'select_data', generator.ORDER_NONE) || "False"; + var statements_input_data = generator.statementToCode(this, 'input_data') + var dropdown_type = this.getFieldValue('type'); + if (dropdown_type == 'true') { + statements_input_data = statements_input_data + ' if (' + value_select_data + '):\n' + ' break\n'; + } + else { + statements_input_data = statements_input_data + ' if not (' + value_select_data + '):\n' + ' break\n'; + } + statements_input_data = generator.addLoopTrap(statements_input_data, this.id) || generator.PASS; + //var dropdown_type = this.getFieldValue('type'); + var code = 'while True:\n' + statements_input_data; + return code; +} + +// export const base_type = controls_type; +// export const controls_TypeLists = controls_typeLists; + +const controls_repeat_ext = function (a, generator) { + var times = generator.valueToCode(this, 'TIMES', generator.ORDER_ATOMIC); + var d = generator.statementToCode(a, "DO"), + d = generator.addLoopTrap(d, a.id) || generator.PASS; + return 'for _my_variable in range(' + times + '):\n' + d; +} + + +const garbage_collection = function (_, generator) { + generator.definitions_['import_gc'] = 'import gc'; + var code = 'gc.collect()\n' + return code; +} + +const get_mem_alloc = function (_, generator) { + generator.definitions_['import_gc'] = 'import gc'; + var code = 'gc.mem_alloc()'; + return [code, generator.ORDER_ATOMIC]; +} + +const get_mem_free = function (_, generator) { + generator.definitions_['import_gc'] = 'import gc'; + var code = 'gc.mem_free()'; + return [code, generator.ORDER_ATOMIC] +} + +const get_unique_identifier = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var code = 'machine.unique_id()'; + return [code, generator.ORDER_ATOMIC]; +} + +// ok +const controls_repeat = controls_repeat_ext; + +const datetime_fromtimestamp = function(_,generator){ + generator.definitions_['import_datetime'] = 'import datetime'; + var ts = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'datetime.datetime.fromtimestamp(' + ts + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const gene_unique_identifier = function (_, generator) { + var version = mixly__WEBPACK_IMPORTED_MODULE_1__.Boards.getSelectedBoardKey().split(':')[2] + generator.definitions_['import_' + version + 'uuid'] = 'from ' + version + ' import uuid'; + var code = 'uuid()'; + return [code, generator.ORDER_ATOMIC] +} + +/***/ }), + +/***/ "../python/generators/dicts.js": +/*!*************************************!*\ + !*** ../python/generators/dicts.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ dicts_add_change_del: () => (/* binding */ dicts_add_change_del), +/* harmony export */ dicts_add_or_change: () => (/* binding */ dicts_add_or_change), +/* harmony export */ dicts_clear: () => (/* binding */ dicts_clear), +/* harmony export */ dicts_create_with: () => (/* binding */ dicts_create_with), +/* harmony export */ dicts_create_with_noreturn: () => (/* binding */ dicts_create_with_noreturn), +/* harmony export */ dicts_deldict: () => (/* binding */ dicts_deldict), +/* harmony export */ dicts_delete: () => (/* binding */ dicts_delete), +/* harmony export */ dicts_get: () => (/* binding */ dicts_get), +/* harmony export */ dicts_get_default: () => (/* binding */ dicts_get_default), +/* harmony export */ dicts_items: () => (/* binding */ dicts_items), +/* harmony export */ dicts_keys: () => (/* binding */ dicts_keys), +/* harmony export */ dicts_length: () => (/* binding */ dicts_length), +/* harmony export */ dicts_pop: () => (/* binding */ dicts_pop), +/* harmony export */ dicts_setdefault: () => (/* binding */ dicts_setdefault), +/* harmony export */ dicts_to_json: () => (/* binding */ dicts_to_json), +/* harmony export */ dicts_to_json2: () => (/* binding */ dicts_to_json2), +/* harmony export */ dicts_to_to: () => (/* binding */ dicts_to_to), +/* harmony export */ dicts_todict: () => (/* binding */ dicts_todict), +/* harmony export */ dicts_update: () => (/* binding */ dicts_update), +/* harmony export */ dicts_values: () => (/* binding */ dicts_values), +/* harmony export */ json_to_dicts: () => (/* binding */ json_to_dicts) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_1__); +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for dictionary blocks. + * @author acbart@vt.edu (Austin Cory Bart) + */ + + + +const dicts_create_with = function (_, generator) { + // Create a list with any number of elements of any type. + //var dropdown_type = this.getFieldValue('TYPE'); + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + var keyName = this.getFieldValue('KEY' + n); + code[n] = keyName + ":" + (generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value); + } + var code = varName + '= ' + '{' + code.join(', ') + '}\n'; + //var code =''+varName+'['+size+"]"+'='+ '{' + code.join(', ') + '}\n'; + //generator.setups_['setup_lists'+varName] = code; + return code; +} + +const dicts_keys = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.keys()'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_get = function (_, generator) { + var version = mixly__WEBPACK_IMPORTED_MODULE_1__.Boards.getSelectedBoardKey().split(':')[2] + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + if (version=='educore'){ + var code = varName+'.get('+text+')'; + }else{ + var code = varName + "[" + text + "]"; + } + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_get_default = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + // var text=this.getFieldValue('KEY'); + var code = varName + ".get(" + text + ',' + argument + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_add_or_change = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "[" + text + "] = " + argument + '\n'; + return code; +} + +const dicts_delete = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + var code = "del " + varName + "[" + text + "]\n"; + return code; +} + +const dicts_update = function (_, generator) { + var varName2 = generator.valueToCode(this, 'DICT2', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.update(' + varName2 + ')\n'; + return code; +} + +const dicts_clear = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clear()\n'; + return code; +} + +const dicts_items = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.items()'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_values = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.values()'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_length = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'len(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_deldict = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'del ' + varName + '\n'; + return code; +} + +const dicts_add_change_del = function (block, generator) { + var dict = generator.valueToCode(block, 'DICT', + generator.ORDER_MEMBER) || '[]'; + var mode = block.getFieldValue('WHERE'); + var KEY = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + + switch (mode) { + case 'INSERT': + //var at2 = block.getFieldValue('AT2'); + var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ASSIGNMENT) || '0'; + var code = dict + "[" + KEY + "] = " + at2 + '\n' + break; + case 'DELETE': + var code = 'del ' + dict + "[" + KEY + "]\n" + break; + default: + throw 'Unhandled option (lists_setIndex2)'; + } + return code; +} + +const dicts_pop = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + var code = varName + ".pop(" + text + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_setdefault = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + // var text=this.getFieldValue('KEY'); + var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + ".setdefault" + "(" + text + "," + argument + ")\n"; + return code; +} + +const dicts_create_with_noreturn = function (_, generator) { + // Create a list with any number of elements of any type. + // var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + // Blockly.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var code = new Array(this.itemCount_); + var default_value = '0'; + + for (var n = 0; n < this.itemCount_; n++) { + var keyName = this.getFieldValue('KEY' + n); + code[n] = keyName + ": " + (generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value); + } + // if (this.itemCount_!=1){ + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\n';} + // else { + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\n';} + var code = '{' + code.join(', ') + '}'; + + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_todict = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['dict(' + str + ')', generator.ORDER_ATOMIC]; +} + +const dicts_to_json = function (_, generator) { + generator.definitions_['import_json'] = 'import json'; + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'json.dumps(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const json_to_dicts = function (_, generator) { + generator.definitions_['import_json'] = 'import json'; + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || 'null'; + var code = 'json.loads(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_to_to = function (_, generator) { + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var R = generator.valueToCode(this, 'VAR1', generator.ORDER_ASSIGNMENT) || 'null'; + var I = generator.valueToCode(this, 'VAR2', generator.ORDER_ASSIGNMENT) || 'null'; + var L = generator.valueToCode(this, 'VAR3', generator.ORDER_ASSIGNMENT) || 'null'; + var N = generator.valueToCode(this, 'VAR4', generator.ORDER_ASSIGNMENT) || 'null'; + var code = varName + '['+R+']'+'['+I+']'+'['+L+']'+'['+N+']'; + return [code, generator.ORDER_ATOMIC]; +} + +const dicts_to_json2 = function (_, generator) { + generator.definitions_['import_json'] = 'import json'; + generator.definitions_['import_ujson'] = 'import ujson'; + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'ujson.loads(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/html.js": +/*!************************************!*\ + !*** ../python/generators/html.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ html_content: () => (/* binding */ html_content), +/* harmony export */ html_content_more: () => (/* binding */ html_content_more), +/* harmony export */ html_document: () => (/* binding */ html_document), +/* harmony export */ html_form: () => (/* binding */ html_form), +/* harmony export */ html_head_body: () => (/* binding */ html_head_body), +/* harmony export */ html_style: () => (/* binding */ html_style), +/* harmony export */ html_style_content: () => (/* binding */ html_style_content), +/* harmony export */ html_text: () => (/* binding */ html_text), +/* harmony export */ html_title: () => (/* binding */ html_title) +/* harmony export */ }); +const html_document = function (_, generator) { + var head = generator.statementToCode(this, 'HEAD'); + var body = generator.statementToCode(this, 'BODY'); + var code = "'''\n\n\n" + '\t\n' + head + "\n\n" + body + "\n\n'''"; + return [code, generator.ORDER_ATOMIC]; +} + +const html_title = function (_, generator) { + var t = generator.statementToCode(this, 'DO'); + var l = this.getFieldValue('LEVEL'); + var code = "\n" + t + "\n"; + return code; +} + +const html_head_body = function (_, generator) { + var t = generator.statementToCode(this, 'DO'); + var l = this.getFieldValue('LEVEL'); + if (l == 'head') { + var code = "<" + l + '>\n\t\n' + t + "\n"; + } + else { + var code = "<" + l + ">\n" + t + "\n"; + } + return code; +} + +const html_content = function (_, generator) { + var t = generator.statementToCode(this, 'DO'); + // var s = generator.valueToCode(this, 'style'); + var l = this.getFieldValue('LEVEL'); + // var code = "<" + l + " " + s + " >\n" + t + "\n"; + var code = "<" + l + ">\n" + t + "\n"; + return code; +} + +const html_content_more = function (_, generator) { + var t = generator.statementToCode(this, 'DO'); + var s = generator.valueToCode(this, 'style'); + var l = this.getFieldValue('LEVEL'); + var code = "<" + l + " " + s + " >\n" + t + "\n"; + return code; +} + +const html_style = function (_, generator) { + var style = generator.statementToCode(this, 'STYLE'); + var code = 'style="' + style + '"'; + return [code, generator.ORDER_ATOMIC]; +} + +const html_form = function (_, generator) { + var tag = this.getFieldValue('LEVEL'); + var name = this.getFieldValue('NAME'); + var value = this.getFieldValue('VALUE'); + var s = generator.valueToCode(this, 'style') || ""; + var code = ''; + return code; +} + +const html_style_content = function () { + var key = this.getFieldValue('KEY'); + var value = this.getFieldValue('VALUE'); + var code = key + ':' + value + ";"; + return code; +} + +const html_text = function () { + var text = this.getFieldValue('TEXT'); + var code = text + "\n"; + return code; +} + +/***/ }), + +/***/ "../python/generators/lists.js": +/*!*************************************!*\ + !*** ../python/generators/lists.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ content_in_lists: () => (/* binding */ content_in_lists), +/* harmony export */ enumerate: () => (/* binding */ enumerate), +/* harmony export */ list_many_input: () => (/* binding */ list_many_input), +/* harmony export */ list_tolist: () => (/* binding */ list_tolist), +/* harmony export */ list_tolist2: () => (/* binding */ list_tolist2), +/* harmony export */ list_trig: () => (/* binding */ list_trig), +/* harmony export */ lists_2d_get_col_row_data: () => (/* binding */ lists_2d_get_col_row_data), +/* harmony export */ lists_2d_get_data_with_col_row: () => (/* binding */ lists_2d_get_data_with_col_row), +/* harmony export */ lists_append_extend: () => (/* binding */ lists_append_extend), +/* harmony export */ lists_change_to: () => (/* binding */ lists_change_to), +/* harmony export */ lists_change_to_general: () => (/* binding */ lists_change_to_general), +/* harmony export */ lists_clear: () => (/* binding */ lists_clear), +/* harmony export */ lists_create_with: () => (/* binding */ lists_create_with), +/* harmony export */ lists_create_with2: () => (/* binding */ lists_create_with2), +/* harmony export */ lists_create_with_noreturn: () => (/* binding */ lists_create_with_noreturn), +/* harmony export */ lists_create_with_text: () => (/* binding */ lists_create_with_text), +/* harmony export */ lists_create_with_text2: () => (/* binding */ lists_create_with_text2), +/* harmony export */ lists_del_general: () => (/* binding */ lists_del_general), +/* harmony export */ lists_find: () => (/* binding */ lists_find), +/* harmony export */ lists_getIndex3: () => (/* binding */ lists_getIndex3), +/* harmony export */ lists_getSublist3: () => (/* binding */ lists_getSublist3), +/* harmony export */ lists_get_index: () => (/* binding */ lists_get_index), +/* harmony export */ lists_get_random_item: () => (/* binding */ lists_get_random_item), +/* harmony export */ lists_get_random_sublist: () => (/* binding */ lists_get_random_sublist), +/* harmony export */ lists_get_sublist: () => (/* binding */ lists_get_sublist), +/* harmony export */ lists_insert_value: () => (/* binding */ lists_insert_value), +/* harmony export */ lists_insert_value2: () => (/* binding */ lists_insert_value2), +/* harmony export */ lists_pop: () => (/* binding */ lists_pop), +/* harmony export */ lists_remove_at: () => (/* binding */ lists_remove_at), +/* harmony export */ lists_remove_at2: () => (/* binding */ lists_remove_at2), +/* harmony export */ lists_reverse: () => (/* binding */ lists_reverse), +/* harmony export */ lists_setIndex3: () => (/* binding */ lists_setIndex3), +/* harmony export */ lists_set_index: () => (/* binding */ lists_set_index), +/* harmony export */ lists_sort: () => (/* binding */ lists_sort) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const lists_get_sublist = function (_, generator) { + // Get sublist. + var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ADDITIVE); + var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ADDITIVE); + var code = list + '[' + at1 + ' : ' + at2 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_2d_get_data_with_col_row = function (_, generator) { + var value_LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC) || 'mylist'; + var value_row = generator.valueToCode(this, 'row', generator.ORDER_ATOMIC) || 0; + var value_col = generator.valueToCode(this, 'col', generator.ORDER_ATOMIC) || 0; + var code = value_LIST + '[' + value_row + ',' + value_col + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_2d_get_col_row_data = function (_, generator) { + var value_LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC) || 'mylist'; + var value_row_start = generator.valueToCode(this, 'row_start', generator.ORDER_ATOMIC) || 0; + var value_row_end = generator.valueToCode(this, 'row_end', generator.ORDER_ATOMIC) || 1; + var value_col_start = generator.valueToCode(this, 'col_start', generator.ORDER_ATOMIC) || 0; + var value_col_end = generator.valueToCode(this, 'col_end', generator.ORDER_ATOMIC) || 1; + var code = value_LIST + '[' + value_row_start + ' : ' + value_row_end + ',' + value_col_start + ' : ' + value_col_end + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_create_with = function (_, generator) { + // Create a list with any number of elements of any type. + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + //generator.setups_['var_declare'+varName] = varName+' = '+ '[' + code.join(', ') + ']\n'; + var code = varName + ' = ' + '[' + code.join(', ') + ']\n'; + return code; +} + +const lists_create_with_text = function (_, generator) { + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var text = this.getFieldValue('TEXT'); + // generator.setups_['var_declare'+varName] = varName+' = '+ '[' + text + ']\n'; + var code = varName + ' = ' + '[' + text + ']\n'; + return code; +} + +const lists_get_index = function (_, generator) { + // Indexing into a list is the same as indexing into a string. + var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var argument0 = generator.valueToCode(this, 'AT', generator.ORDER_ADDITIVE) || 0; + var code = list + '[' + argument0 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_set_index = function (_, generator) { + // Set element at index. + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var argument0 = generator.valueToCode(this, 'AT', + generator.ORDER_ADDITIVE) || '0'; + var argument2 = generator.valueToCode(this, 'TO', + generator.ORDER_ASSIGNMENT) || '0'; + // Blockly uses one-based indicies. + return varName + '[' + argument0 + '] = ' + argument2 + '\n'; +} + +const lists_append_extend = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'DATA', generator.ORDER_ASSIGNMENT) || '0'; + var op = this.getFieldValue('OP'); + var code = varName + '.' + op + '(' + argument + ')\n'; + return code; +} + +const lists_get_random_item = function (_, generator) { + generator.definitions_['import_random'] = 'import random'; + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var code = 'random.choice(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_get_random_sublist = function (_, generator) { + generator.definitions_['import_random'] = 'import random'; + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var VALUE = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'random.sample(' + varName + ',' + VALUE + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_insert_value = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0'; + var at = generator.valueToCode(this, 'AT', generator.ORDER_ADDITIVE) || '0'; + var VALUE = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.insert(' + at + ', ' + VALUE + ')\n'; + return code; +} + +const lists_reverse = function (_, generator) { + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.reverse()\n'; + return code; +} +const lists_clear = function (_, generator) { + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clear()\n'; + return code; +} + +const lists_find = function (_, generator) { + var op = this.getFieldValue('OP'); + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + if (op == 'INDEX') + var code = varName + '.index(' + argument + ')'; + else if (op == 'COUNT') + var code = varName + '.count(' + argument + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_remove_at = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'DATA', generator.ORDER_ASSIGNMENT) || '0'; + var op = this.getFieldValue('OP'); + var code = ""; + if (op == "del") { + code = 'del ' + varName + '[' + argument + ']\n'; + } else { + code = varName + '.remove' + '(' + argument + ')\n'; + } + return code; +} + +const lists_pop = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var argument = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.pop(' + argument + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const list_trig = function (a, generator) { + var b = a.getFieldValue("OP"), c; + generator.definitions_['import_math'] = "import math"; + a = generator.valueToCode(a, 'data', generator.ORDER_NONE) + switch (b) { + case "LEN": + c = "len(" + a + ")"; + break; + case "SUM": + c = "sum(" + a + ")"; + break; + case "MIN": + c = "min(" + a + ")"; + break; + case "MAX": + c = "max(" + a + ")"; + break; + case 'AVERAGE': + generator.definitions_['import_mixpy_math_mean'] = "from mixpy import math_mean"; + c = 'math_mean(' + a + ')'; + break; + case 'MEDIAN': + generator.definitions_['import_mixpy_math_median'] = "from mixpy import math_median"; + c = 'math_median(' + a + ')'; + break; + case 'MODE': + generator.definitions_['import_mixpy_math_modes'] = "from mixpy import math_modes"; + c = 'math_modes(' + a + ')'; + break; + case 'STD_DEV': + generator.definitions_['import_mixpy_math_standard_deviation'] = "from mixpy import math_standard_deviation"; + c = 'math_standard_deviation(' + a + ')'; + break; + default: + throw 'Unknown operator: ' + b; + } + if (c) + return [c, generator.ORDER_ATOMIC]; + +} + +const lists_sort = function (block, generator) { + // Block for sorting a list. + generator.definitions_['import_mixpy_lists_sort'] = "from mixpy import lists_sort"; + var list = (generator.valueToCode(block, 'LIST', + generator.ORDER_NONE) || '[]'); + var type = block.getFieldValue('TYPE'); + var reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True'; + var code = 'lists_sort(' + list + ', "' + type + '", ' + reverse + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_change_to = function (_, generator) { + var op = this.getFieldValue('OP'); + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = ''; + if (op == 'array') { + generator.definitions_['import_numpy'] = 'import numpy'; + code = 'numpy.array(' + varName + ')'; + } + else { + code = op + '(' + varName + ')'; + } + return [code, generator.ORDER_ATOMIC]; +} + +const list_many_input = function (_, generator) { + var text = this.getFieldValue('CONTENT'); + var code = '[' + text + ']' + return [code, generator.ORDER_ATOMIC]; +} + +const lists_create_with_noreturn = function (_, generator) { + // Create a list with any number of elements of any type. + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = '[' + code.join(', ') + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const lists_change_to_general = lists_change_to; + +const lists_del_general = function (_, generator) { + var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'del ' + varName + '\n'; + return code; +} + +const lists_create_with2 = lists_create_with +const lists_create_with_text2 = lists_create_with_text +const lists_getIndex3 = lists_get_index +const lists_getSublist3 = lists_get_sublist +const lists_setIndex3 = lists_set_index +const lists_insert_value2 = lists_insert_value +const lists_remove_at2 = lists_remove_at + +const list_tolist = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['list(' + str + ')', generator.ORDER_ATOMIC]; +} + +const list_tolist2 = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return [str + '.tolist()', generator.ORDER_ATOMIC]; +} + +const enumerate = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var argument = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'enumerate(' +varName+',start='+ argument + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const content_in_lists = function (_, generator) { + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist'; + var con = generator.valueToCode(this, 'CON', generator.ORDER_ASSIGNMENT) || '0'; + var code = con +' in '+varName; + return [code, generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/logic.js": +/*!*************************************!*\ + !*** ../python/generators/logic.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ logic_boolean: () => (/* binding */ logic_boolean), +/* harmony export */ logic_compare: () => (/* binding */ logic_compare), +/* harmony export */ logic_compare_continous: () => (/* binding */ logic_compare_continous), +/* harmony export */ logic_is: () => (/* binding */ logic_is), +/* harmony export */ logic_is_in: () => (/* binding */ logic_is_in), +/* harmony export */ logic_negate: () => (/* binding */ logic_negate), +/* harmony export */ logic_null: () => (/* binding */ logic_null), +/* harmony export */ logic_operation: () => (/* binding */ logic_operation), +/* harmony export */ logic_tobool: () => (/* binding */ logic_tobool), +/* harmony export */ logic_true_or_false: () => (/* binding */ logic_true_or_false) +/* harmony export */ }); +const logic_compare = function (_, generator) { + // Comparison operator. + var mode = this.getFieldValue('OP'); + var operator = logic_compare.OPERATORS[mode]; + var order = (operator == '==' || operator == '!=') ? + generator.ORDER_EQUALITY : generator.ORDER_RELATIONAL; + var argument0 = generator.valueToCode(this, 'A', order) || '0'; + var argument1 = generator.valueToCode(this, 'B', order) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, order]; +} + +const logic_compare_continous = function (_, generator) { + // Comparison operator. + var mode1 = this.getFieldValue('OP1'); + var operator1 = logic_compare.OPERATORS[mode1]; + var mode2 = this.getFieldValue('OP2'); + var operator2 = logic_compare.OPERATORS[mode2]; + var argument0 = generator.valueToCode(this, 'A', generator.ORDER_RELATIONAL) || '0'; + var argument1 = generator.valueToCode(this, 'B', generator.ORDER_RELATIONAL) || '0'; + var argument2 = generator.valueToCode(this, 'C', generator.ORDER_RELATIONAL) || '0'; + var code = argument0 + ' ' + operator1 + ' ' + argument1 + ' ' + operator2 + ' ' + argument2; + return [code, generator.ORDER_RELATIONAL]; +} + +logic_compare.OPERATORS = { + EQ: '==', + NEQ: '!=', + LT: '<', + LTE: '<=', + GT: '>', + GTE: '>=' +}; + +const logic_operation = function (_, generator) { + // Operations 'and', 'or'. + var operator = this.getFieldValue('OP'); + var order = (operator == '&&') ? generator.ORDER_LOGICAL_AND : + generator.ORDER_LOGICAL_OR; + var argument0 = generator.valueToCode(this, 'A', order) || 'False'; + var argument1 = generator.valueToCode(this, 'B', order) || 'False'; + if (operator == 'AND') { + var code = argument0 + ' and ' + argument1; + } else if (operator == 'OR') { + var code = argument0 + ' or ' + argument1; + } else if (operator == 'NOR') { + // var code = '('+argument0+' and '+argument1+' ) or ((not '+argument0+') and (not '+argument1+'))'; + var code = 'not(' + argument0 + '^' + argument1 + ')'; + } else { + // var code = '((not '+argument0+') and '+argument1+' ) or ( '+argument0+' and (not '+argument1+'))'; + var code = argument0 + '^' + argument1; + } + return [code, order]; +} + +const logic_negate = function (_, generator) { + // Negation. + var order = generator.ORDER_UNARY_PREFIX; + var argument0 = generator.valueToCode(this, 'BOOL', order) || 'False'; + var code = 'not ' + argument0; + return [code, order]; +} + +const logic_boolean = function (_, generator) { + // Boolean values true and false. + var code = (this.getFieldValue('BOOL') == 'TRUE') ? 'True' : 'False'; + return [code, generator.ORDER_ATOMIC]; +} + +const logic_null = function (_, generator) { + var code = 'None'; + return [code, generator.ORDER_ATOMIC]; +} + +const logic_true_or_false = function (_, generator) { + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || 'False'; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || 'False'; + var c = generator.valueToCode(this, 'C', generator.ORDER_ATOMIC) || 'False'; + var code = '(' + b + ' if ' + a + ' else ' + c + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const logic_is_in = function (_, generator) { + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var bool = this.getFieldValue('BOOL'); + var code = a + ' ' + bool + ' ' + b; + return [code, generator.ORDER_ATOMIC]; +} + +const logic_is = function (_, generator) { + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var bool = this.getFieldValue('BOOL'); + var code = a + ' ' + bool + ' ' + b; + return [code, generator.ORDER_ATOMIC]; +} + +const logic_tobool = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['bool(' + str + ')', generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/math.js": +/*!************************************!*\ + !*** ../python/generators/math.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ base_map: () => (/* binding */ base_map), +/* harmony export */ generate_cartesian_product: () => (/* binding */ generate_cartesian_product), +/* harmony export */ math_arithmetic: () => (/* binding */ math_arithmetic), +/* harmony export */ math_bit: () => (/* binding */ math_bit), +/* harmony export */ math_constant: () => (/* binding */ math_constant), +/* harmony export */ math_constant_mp: () => (/* binding */ math_constant_mp), +/* harmony export */ math_constrain: () => (/* binding */ math_constrain), +/* harmony export */ math_dec: () => (/* binding */ math_dec), +/* harmony export */ math_degree_to_radian: () => (/* binding */ math_degree_to_radian), +/* harmony export */ math_indexer_number: () => (/* binding */ math_indexer_number), +/* harmony export */ math_map: () => (/* binding */ math_map), +/* harmony export */ math_max_min: () => (/* binding */ math_max_min), +/* harmony export */ math_number: () => (/* binding */ math_number), +/* harmony export */ math_number_base_conversion: () => (/* binding */ math_number_base_conversion), +/* harmony export */ math_radian_to_degree: () => (/* binding */ math_radian_to_degree), +/* harmony export */ math_random: () => (/* binding */ math_random), +/* harmony export */ math_random_seed: () => (/* binding */ math_random_seed), +/* harmony export */ math_round: () => (/* binding */ math_round), +/* harmony export */ math_selfcalcu: () => (/* binding */ math_selfcalcu), +/* harmony export */ math_single: () => (/* binding */ math_single), +/* harmony export */ math_to_int: () => (/* binding */ math_to_int), +/* harmony export */ math_trig: () => (/* binding */ math_trig), +/* harmony export */ text_to_number: () => (/* binding */ text_to_number), +/* harmony export */ text_to_number_skulpt: () => (/* binding */ text_to_number_skulpt), +/* harmony export */ turn_to_int: () => (/* binding */ turn_to_int) +/* harmony export */ }); +// export const math_number = function() { +// // Numeric value. +// var code = (this.getFieldValue('NUM')); +// // -4.abs() returns -4 in Dart due to strange order of operation choices. +// // -4 is actually an operator and a number. Reflect this in the order. +// var order = code < 0 ? +// generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC; +// return [code, order]; +// } + +// generator.math = {} +// generator.addReservedWords("math,random,Number"); + +const math_number = function (_, generator) { + // a = parseFloat(a.getFieldValue("NUM")); + // var b; + // Infinity == a ? (a = 'float("inf")', b = generator.ORDER_FUNCTION_CALL) : -Infinity == a ? (a = '-float("inf")', b = generator.ORDER_UNARY_SIGN) : b = 0 > a ? generator.ORDER_UNARY_SIGN : generator.ORDER_ATOMIC; + // return [a, b] + + var code = this.getFieldValue('NUM'); + // -4.abs() returns -4 in Dart due to strange order of operation choices. + // -4 is actually an operator and a number. Reflect this in the order. + var order = code < 0 ? + generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC; + return [code, order]; +} + +const math_constant = function (_, generator) { + generator.definitions_.import_math = "import math"; + var name = this.getFieldValue('CONSTANT'); + var code = 'math.' + name; + return [code, generator.ORDER_ATOMIC]; +} + +const math_constant_mp = function (_, generator) { + generator.definitions_.import_math = "import math"; + var name = this.getFieldValue('CONSTANT'); + var code = 'math.' + name; + return [code, generator.ORDER_ATOMIC]; +} + +const math_bit = function (_, generator) { + var operator = this.getFieldValue('OP'); + var order = generator.ORDER_ATOMIC; + var argument0 = generator.valueToCode(this, 'A', order) || '0'; + var argument1 = generator.valueToCode(this, 'B', order) || '0'; + var code = '(' + argument0 + operator + argument1 + ')'; + return [code, order]; +} + +const math_arithmetic = function (a, generator) { + var b = { + ADD: [" + ", generator.ORDER_ADDITIVE], + MINUS: [" - ", generator.ORDER_ADDITIVE], + MULTIPLY: [" * ", generator.ORDER_MULTIPLICATIVE], + DIVIDE: [" / ", generator.ORDER_MULTIPLICATIVE], + QUYU: [' % ', generator.ORDER_MULTIPLICATIVE],//增加取余操作 + ZHENGCHU: [' // ', generator.ORDER_MULTIPLICATIVE],//增加整除操作 + POWER: [" ** ", generator.ORDER_EXPONENTIATION] + }[a.getFieldValue("OP")]; + var c = b[0], + b = b[1], + d = generator.valueToCode(a, "A", b) || "0"; + a = generator.valueToCode(a, "B", b) || "0"; + return [d + c + a, b] +} + +const math_selfcalcu = function (_, generator) { + var argument0 = generator.valueToCode(this, 'A', generator.ORDER_RELATIONAL) || '0'; + var argument1 = generator.valueToCode(this, 'B', generator.ORDER_RELATIONAL) || '0'; + var operator = this.getFieldValue('OP'); + switch (operator) { + case 'ADD': var op = '+='; break; + case 'MINUS': var op = '-='; break; + case 'MULTIPLY': var op = '*='; break; + case 'DIVIDE': var op = '/='; break; + case 'QUYU': var op = '%='; break; + case 'ZHENGCHU': var op = '//='; break; + case 'POWER': var op = '**='; break; + } + var code = argument0 + ' ' + op + ' ' + argument1 + '\n'; + return code; +} + +const math_single = function (a, generator) { + var b = a.getFieldValue("OP"), + c; + if ("NEG" == b) + return c = generator.valueToCode(a, "NUM", generator.ORDER_UNARY_SIGN) || "0", ["-" + c, generator.ORDER_UNARY_SIGN]; + generator.definitions_['import_math'] = "import math"; + a = "SIN" == b || "COS" == b || "TAN" == b ? generator.valueToCode(a, "NUM", generator.ORDER_MULTIPLICATIVE) || "0" : generator.valueToCode(a, "NUM", generator.ORDER_NONE) || "0"; + switch (b) { + case "ABS": + c = "math.fabs(" + a + ")"; + break; + case "ROOT": + c = "math.sqrt(" + + a + ")"; + break; + case "LN": + c = "math.log(" + a + ")"; + break; + case "LOG10": + c = "math.log10(" + a + ")"; + break; + case "EXP": + c = "math.exp(" + a + ")"; + break; + case "POW10": + c = "math.pow(10," + a + ")"; + break; + case "ROUND": + c = "round(" + a + ")"; + break; + case "ROUNDUP": + c = "math.ceil(" + a + ")"; + break; + case "ROUNDDOWN": + c = "math.floor(" + a + ")"; + break; + case "SIN": + c = "math.sin(" + a + ")"; + break; + case "COS": + c = "math.cos(" + a + ")"; + break; + case "TAN": + c = "math.tan(" + a + ")"; + break; + case "++": + c = "++(" + a + ")"; + break; + case "--": + c = "--(" + a + ")"; + break; + case "-": + c = "-(" + a + ")"; + break; + default: + } + if (c) + return [c, generator.ORDER_EXPONENTIATION]; + switch (b) { + case "ASIN": + c = "math.degrees(math.asin(" + a + "))"; + break; + case "ACOS": + c = "math.degrees(math.acos(" + a + "))"; + break; + case "ATAN": + c = "math.degrees(math.atan(" + a + "))"; + break; + } + return [c, generator.ORDER_MULTIPLICATIVE] +} + +const math_trig = math_single; + +const math_dec = function (_, generator) { + var argument0 = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0'; + var operator = this.getFieldValue('OP'); + var code = operator + '(' + argument0 + ')'; + return [code, generator.ORDER_ATOMIC]; + +} + +const math_to_int = function (_, generator) { + var argument0 = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0'; + var operator = this.getFieldValue('OP'); + var code = ""; + if (operator === "round") { + code = operator + '(' + argument0 + ')'; + } else { + code = "math." + operator + '(' + argument0 + ')'; + generator.definitions_.import_math = "import math"; + } + return [code, generator.ORDER_ATOMIC]; +} + +const math_max_min = function (_, generator) { + var a = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0'; + var b = generator.valueToCode(this, 'B', generator.ORDER_NONE) || '0'; + var operator = this.getFieldValue('OP'); + var code = operator + '(' + a + ', ' + b + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const math_random = function (_, generator) { + generator.definitions_.import_random = "import random"; + // Random integer between [X] and [Y]. + var type = this.getFieldValue('TYPE'); + var argument0 = generator.valueToCode(this, 'FROM', + generator.ORDER_NONE) || '0'; + var argument1 = generator.valueToCode(this, 'TO', + generator.ORDER_NONE) || '0'; + if (type == 'int') { + var code = 'random.randint(' + argument0 + ', ' + argument1 + ')'; + } else if (type == 'float') { + var code = 'random.uniform(' + argument0 + ', ' + argument1 + ')'; + } + return [code, generator.ORDER_UNARY_POSTFIX]; +} + +const math_map = function (_, generator) { + var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_NONE); + var value_fl = generator.valueToCode(this, 'fromLow', generator.ORDER_ATOMIC); + var value_fh = generator.valueToCode(this, 'fromHigh', generator.ORDER_ATOMIC); + var value_tl = generator.valueToCode(this, 'toLow', generator.ORDER_ATOMIC); + var value_th = generator.valueToCode(this, 'toHigh', generator.ORDER_ATOMIC); + generator.definitions_['import_mixpy_math_map'] = "from mixpy import math_map"; + var code = 'math_map(' + value_num + ', ' + value_fl + ', ' + value_fh + ', ' + value_tl + ', ' + value_th + ')'; + return [code, generator.ORDER_NONE]; +} + +const math_constrain = function (_, generator) { + // Constrain a number between two limits. + var argument0 = generator.valueToCode(this, 'VALUE', + generator.ORDER_NONE) || '0'; + var argument1 = generator.valueToCode(this, 'LOW', + generator.ORDER_NONE) || '0'; + var argument2 = generator.valueToCode(this, 'HIGH', + generator.ORDER_NONE) || '0'; + var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')'; + return [code, generator.ORDER_UNARY_POSTFIX]; +} + +const math_number_base_conversion = function (a, generator) { + var c1 = a.getFieldValue("OP"); + var d = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0'; + var c2 = a.getFieldValue("OP2"); + generator.definitions_['import_math'] = "import math"; + var param1 = ""; + var param2 = "10"; + if (c1 == "two") { + param2 = '2'; + } else if (c1 == "eight") { + param2 = '8' + } else if (c1 == "ten") { + param2 = '10' + } else if (c1 == "sixteen") { + param2 = '16' + } + + if (c2 == "two") { + param1 = 'bin'; + } else if (c2 == "eight") { + param1 = 'oct' + } else if (c2 == "ten") { + param1 = '' + } else if (c2 == "sixteen") { + param1 = 'hex' + } + if (param1 == "") { + var code = "int(str(" + d + "), " + param2 + ")"; + } else { + var code = param1 + "(int(str(" + d + "), " + param2 + "))"; + + } + return [code, generator.ORDER_ATOMIC]; +} + +const math_random_seed = function (_, generator) { + // Random integer between [X] and [Y]. + generator.definitions_.import_random = "import random"; + var a = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0'; + var code = 'random.seed(' + a + ');' + '\n'; + return code; +} + +const math_indexer_number = function (_, generator) { + var code = this.getFieldValue('NUM'); + // -4.abs() returns -4 in Dart due to strange order of operation choices. + // -4 is actually an operator and a number. Reflect this in the order. + var order = code < 0 ? + generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC; + return [code, order]; +} + +const math_round = function (_, generator) { + var argument0 = generator.valueToCode(this, 'VALUE', + generator.ORDER_NONE) || '0'; + var argument1 = generator.valueToCode(this, 'VAR', + generator.ORDER_NONE) || '0'; + + var code = 'round(' + argument0 + ', ' + argument1 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_to_number = function (_, generator) { + var towhat = this.getFieldValue('TOWHAT'); + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + if (towhat == 'b') return ['' + str + '.encode("utf-8")', generator.ORDER_ATOMIC]; + else if (towhat == 'bti') return ['int.from_bytes(' + str + ',"big")', generator.ORDER_ATOMIC]; + return [towhat + "(" + str + ')', generator.ORDER_ATOMIC]; +} + +const text_to_number_skulpt = function (_, generator) { + var towhat = this.getFieldValue('TOWHAT'); + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + if (towhat == 'b') return ['' + str + '.encode("utf-8")', generator.ORDER_ATOMIC]; + return [towhat + "(" + str + ')', generator.ORDER_ATOMIC]; +} + +const base_map = math_map; + +const turn_to_int = function (_, generator) { + generator.definitions_.import_hexlify = "from ubinascii import hexlify"; + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + return ["hexlify(" + str + ').decode()', generator.ORDER_ATOMIC]; +} + +const generate_cartesian_product = function (_, generator) { + generator.definitions_.import_itertools = 'import itertools'; + let re = generator.valueToCode(this, 'REPEAT', generator.ORDER_ATOMIC); + let items = new Array(this.itemCount_); + for (let n = 0; n < this.itemCount_; n++) { + items[n] = generator.valueToCode(this, `ADD${n}`, generator.ORDER_NONE) || '0'; + } + let code = ''; + if (this.itemCount_) { + code = `itertools.product(${items.join(', ')}, repeat=${re})`; + } + return [code, generator.ORDER_ATOMIC]; +} + +const math_radian_to_degree = function (_, generator) { + generator.definitions_.import_math = "import math"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'math.degrees('+ v + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const math_degree_to_radian = function (_, generator) { + generator.definitions_.import_math = "import math"; + var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = 'math.radians('+ v + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/procedures.js": +/*!******************************************!*\ + !*** ../python/generators/procedures.js ***! + \******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ procedures_callnoreturn: () => (/* binding */ procedures_callnoreturn), +/* harmony export */ procedures_callreturn: () => (/* binding */ procedures_callreturn), +/* harmony export */ procedures_defnoreturn: () => (/* binding */ procedures_defnoreturn), +/* harmony export */ procedures_defreturn: () => (/* binding */ procedures_defreturn), +/* harmony export */ procedures_ifreturn: () => (/* binding */ procedures_ifreturn), +/* harmony export */ procedures_return: () => (/* binding */ procedures_return) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const procedures_defreturn = function (_, generator) { + // Define a procedure with a return value. + var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.NAME_TYPE); + var branch = (this.getInput('STACK') && generator.statementToCode(this, 'STACK')) ?? ' pass\n'; + if (generator.INFINITE_LOOP_TRAP) { + branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + this.id + '\'') + branch; + } + var returnValue = generator.valueToCode(this, 'RETURN', + generator.ORDER_NONE) || ''; + //var type=this.getFieldValue('TYPE'); + if (returnValue) { + returnValue = ' return ' + returnValue + '\n'; + } + //var returnType = returnValue ? type : 'void'; + var args = []; + for (var x = 0; x < this.arguments_.length; x++) { + var varName = generator.variableDB_.getName(this.arguments_[x], blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + args[x] = varName; + } + var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + + branch + returnValue + '\n'; + code = generator.scrub_(this, code); + generator.setups_[funcName] = code; + return null; +} + +const procedures_defnoreturn = function (_, generator) { + // Define a procedure with a return value. + var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.NAME_TYPE); + var branch = (this.getInput('STACK') && generator.statementToCode(this, 'STACK')) ?? ' pass\n'; + if (generator.INFINITE_LOOP_TRAP) { + branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, + '\'' + this.id + '\'') + branch; + } + //var returnType = returnValue ? type : 'void'; + var args = []; + for (var x = 0; x < this.arguments_.length; x++) { + var varName = generator.variableDB_.getName(this.arguments_[x], blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + args[x] = varName; + } + var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + + branch + '\n'; + code = generator.scrub_(this, code); + generator.setups_[funcName] = code; + return null; +} + +const procedures_callreturn = function (_, generator) { + // Call a procedure with a return value. + var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.NAME_TYPE); + var args = []; + for (var x = 0; x < this.arguments_.length; x++) { + args[x] = generator.valueToCode(this, 'ARG' + x, + generator.ORDER_NONE) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, generator.ORDER_UNARY_POSTFIX]; +} + +const procedures_callnoreturn = function (_, generator) { + // Call a procedure with no return value. + var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.NAME_TYPE); + var args = []; + for (var x = 0; x < this.arguments_.length; x++) { + args[x] = generator.valueToCode(this, 'ARG' + x, + generator.ORDER_NONE) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')\n'; + return code; +} + +const procedures_ifreturn = function (_, generator) { + // Conditionally return value from a procedure. + var condition = generator.valueToCode(this, 'CONDITION', + generator.ORDER_NONE) || 'False'; + var code = 'if (' + condition + ') :\n'; + if (this.hasReturnValue_) { + var value = generator.valueToCode(this, 'VALUE', + generator.ORDER_NONE) || 'None'; + code += ' return ' + value; + } else { + code += ' return None'; + } + code += '\n'; + return code; +} + +const procedures_return = function (_, generator) { + // Conditionally return value from a procedure. + var code = "" + if (this.hasReturnValue_) { + var value = generator.valueToCode(this, 'VALUE', + generator.ORDER_NONE) || 'None'; + code += 'return ' + value; + } else { + code += 'return None'; + } + code += '\n'; + return code; +} + +/***/ }), + +/***/ "../python/generators/set.js": +/*!***********************************!*\ + !*** ../python/generators/set.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ set_add_discard: () => (/* binding */ set_add_discard), +/* harmony export */ set_clear: () => (/* binding */ set_clear), +/* harmony export */ set_create_with: () => (/* binding */ set_create_with), +/* harmony export */ set_create_with_text_return: () => (/* binding */ set_create_with_text_return), +/* harmony export */ set_length: () => (/* binding */ set_length), +/* harmony export */ set_operate: () => (/* binding */ set_operate), +/* harmony export */ set_operate_update: () => (/* binding */ set_operate_update), +/* harmony export */ set_pop: () => (/* binding */ set_pop), +/* harmony export */ set_sub: () => (/* binding */ set_sub), +/* harmony export */ set_toset: () => (/* binding */ set_toset), +/* harmony export */ set_update: () => (/* binding */ set_update) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const set_create_with = function (_, generator) { + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + //generator.definitions_['var_declare'+varName] = varName+'= '+ '{' + code.join(', ') + '}\n'; + code = varName + '= ' + '{' + code.join(', ') + '}\n'; + if (this.itemCount_ == 0) { code = varName + ' = ' + 'set()\n' } + return code; +} + +const set_length = function (_, generator) { + var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'len(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const set_pop = function (_, generator) { + var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.pop()'; + return [code, generator.ORDER_ATOMIC]; +} + +const set_clear = function (_, generator) { + var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clear()\n'; + return code; +} + +const set_operate = function (_, generator) { + var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0'; + var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0'; + var operate = this.getFieldValue('OPERATE'); + //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = vars1 + "." + operate + "(" + vars2 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const set_operate_update = function (_, generator) { + var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0'; + var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0'; + var operate = this.getFieldValue('OPERATE'); + //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = vars1 + "." + operate + "(" + vars2 + ')\n'; + return code; +} + +const set_add_discard = function (_, generator) { + var vars1 = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0'; + var operate = this.getFieldValue('OPERATE'); + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = vars1 + "." + operate + "(" + argument + ')\n'; + return code; +} + +const set_sub = function (_, generator) { + var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0'; + var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0'; + var operate = this.getFieldValue('OPERATE'); + //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = vars1 + "." + operate + "(" + vars2 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const set_update = function (_, generator) { + var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'update' + '(' + color + ')\n'; + return code; +} + +// export const set_change_to = function(){ +// var op = this.getFieldValue('OP'); +// var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; +// var code = op + '(' + varName + ')\n'; +// return [code, generator.ORDER_ATOMIC]; +// } + +const set_create_with_text_return = function (_, generator) { + var text = this.getFieldValue('TEXT'); + var code = '{' + text + '}'; + return [code, generator.ORDER_ATOMIC]; +} + +const set_toset = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['set(' + str + ')', generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/storage.js": +/*!***************************************!*\ + !*** ../python/generators/storage.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ sdcard_mount: () => (/* binding */ sdcard_mount), +/* harmony export */ sdcard_use_spi_init: () => (/* binding */ sdcard_use_spi_init), +/* harmony export */ storage_can_write_ornot: () => (/* binding */ storage_can_write_ornot), +/* harmony export */ storage_change_dir: () => (/* binding */ storage_change_dir), +/* harmony export */ storage_close_file: () => (/* binding */ storage_close_file), +/* harmony export */ storage_delete_file: () => (/* binding */ storage_delete_file), +/* harmony export */ storage_file_seek: () => (/* binding */ storage_file_seek), +/* harmony export */ storage_file_tell: () => (/* binding */ storage_file_tell), +/* harmony export */ storage_file_write: () => (/* binding */ storage_file_write), +/* harmony export */ storage_fileopen: () => (/* binding */ storage_fileopen), +/* harmony export */ storage_fileopen_new: () => (/* binding */ storage_fileopen_new), +/* harmony export */ storage_fileopen_new_encoding: () => (/* binding */ storage_fileopen_new_encoding), +/* harmony export */ storage_get_a_line: () => (/* binding */ storage_get_a_line), +/* harmony export */ storage_get_contents: () => (/* binding */ storage_get_contents), +/* harmony export */ storage_get_contents_without_para: () => (/* binding */ storage_get_contents_without_para), +/* harmony export */ storage_get_current_dir: () => (/* binding */ storage_get_current_dir), +/* harmony export */ storage_get_file_size: () => (/* binding */ storage_get_file_size), +/* harmony export */ storage_get_filename: () => (/* binding */ storage_get_filename), +/* harmony export */ storage_is_file: () => (/* binding */ storage_is_file), +/* harmony export */ storage_list_all_files: () => (/* binding */ storage_list_all_files), +/* harmony export */ storage_make_dir: () => (/* binding */ storage_make_dir), +/* harmony export */ storage_open_file_with_os: () => (/* binding */ storage_open_file_with_os), +/* harmony export */ storage_rename: () => (/* binding */ storage_rename) +/* harmony export */ }); +const storage_open_file_with_os = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var fn = generator.valueToCode(this, 'fn', generator.ORDER_ATOMIC); + return "os.startfile(" + fn + ")\n"; +} + +const storage_fileopen = function (_, generator) { + // For each loop. + var variable0 = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var code = variable0 + ' = open(' + fn + ', \'' + mode + '\')\n'; + return code; +} + +const storage_fileopen_new = function (_, generator) { // For each loop. + var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var code = 'open(' + fn + ', \'' + mode + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_fileopen_new_encoding = function (_, generator) { // For each loop. + var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var encode = this.getFieldValue('CODE'); + var code = 'open(' + fn + ', \'' + mode + '\', encoding="' + encode + '")'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_file_write = function (_, generator) { + var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC); + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + return file + ".write(" + data + ")\n"; +} + +const storage_get_contents_without_para = function (_, generator) { + var mode = this.getFieldValue('MODE'); + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = file + '.' + mode + '()'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_get_contents = function (_, generator) { + var mode = this.getFieldValue('MODE'); + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC); + var code = file + '.' + mode + '(' + size + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_get_a_line = function (_, generator) { + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC); + var code = file + ".readline(" + size + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_can_write_ornot = function (_, generator) { + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = file + ".writable()"; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_get_filename = function (_, generator) { + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = file + ".name()"; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_close_file = function (_, generator) { + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = file + ".close()\n"; + return code; +} + +const storage_list_all_files = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var code = 'os.listdir()'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_delete_file = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var mode = this.getFieldValue('MODE'); + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = "os." + mode + "(" + file + ")\n"; + return code; +} + +const storage_get_file_size = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = "os.path.getsize(" + file + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_file_tell = function (_, generator) { + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = file + ".tell()"; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_file_seek = function (_, generator) { + var mode = this.getFieldValue('MODE'); + var mode_num = 0; + if (mode == 'start') { + mode_num = 0; + } + else if (mode == 'current') { + mode_num = 1; + } + else { + mode_num = 2; + } + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC); + var code = file + '.seek(' + size + ',' + mode_num + ')\n'; + return code; +} + +const storage_change_dir = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = "os.chdir(" + file + ")\n"; + return code; +} + +const storage_get_current_dir = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var code = 'os.getcwd()'; + return [code, generator.ORDER_ATOMIC]; +} + +const storage_make_dir = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var mode = this.getFieldValue('MODE'); + var path = generator.valueToCode(this, 'PATH', generator.ORDER_ATOMIC); + var code = 'os.' + mode + '(' + path + ')\n'; + return code; +} + +const storage_rename = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var file1 = generator.valueToCode(this, 'NEWFILE', generator.ORDER_ATOMIC); + var code = "os.rename(" + file + "," + file1 + ")\n"; + return code; +} + +const storage_is_file = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var code = "os." + mode + "(" + file + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const sdcard_use_spi_init = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + generator.definitions_['import_sdcard'] = 'import sdcard'; + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var sv = generator.valueToCode(this, 'SPISUB', generator.ORDER_ATOMIC); + var pv = generator.valueToCode(this, 'PINSUB', generator.ORDER_ATOMIC); + var code = v + ' = sdcard.SDCard(' + sv + ',' + pv + ')\n'; + return code; +} + +const sdcard_mount = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + generator.definitions_['import_sdcard'] = 'import sdcard'; + var sd = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var dir = generator.valueToCode(this, 'DIR', generator.ORDER_ATOMIC); + return "os.mount(" + sd + ',' + dir + ")\n"; +} + +/***/ }), + +/***/ "../python/generators/text.js": +/*!************************************!*\ + !*** ../python/generators/text.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ascii_to_char: () => (/* binding */ ascii_to_char), +/* harmony export */ char_to_ascii: () => (/* binding */ char_to_ascii), +/* harmony export */ number_to_text: () => (/* binding */ number_to_text), +/* harmony export */ os_system: () => (/* binding */ os_system), +/* harmony export */ text: () => (/* binding */ text), +/* harmony export */ text_bytes: () => (/* binding */ text_bytes), +/* harmony export */ text_capital: () => (/* binding */ text_capital), +/* harmony export */ text_center: () => (/* binding */ text_center), +/* harmony export */ text_char: () => (/* binding */ text_char), +/* harmony export */ text_char_at: () => (/* binding */ text_char_at), +/* harmony export */ text_char_at2: () => (/* binding */ text_char_at2), +/* harmony export */ text_char_at3: () => (/* binding */ text_char_at3), +/* harmony export */ text_compareTo: () => (/* binding */ text_compareTo), +/* harmony export */ text_compare_to: () => (/* binding */ text_compare_to), +/* harmony export */ text_encode: () => (/* binding */ text_encode), +/* harmony export */ text_equals_starts_ends: () => (/* binding */ text_equals_starts_ends), +/* harmony export */ text_eval: () => (/* binding */ text_eval), +/* harmony export */ text_find: () => (/* binding */ text_find), +/* harmony export */ text_format: () => (/* binding */ text_format), +/* harmony export */ text_format_noreturn: () => (/* binding */ text_format_noreturn), +/* harmony export */ text_join: () => (/* binding */ text_join), +/* harmony export */ text_join_seq: () => (/* binding */ text_join_seq), +/* harmony export */ text_length: () => (/* binding */ text_length), +/* harmony export */ text_random_char: () => (/* binding */ text_random_char), +/* harmony export */ text_replace: () => (/* binding */ text_replace), +/* harmony export */ text_split: () => (/* binding */ text_split), +/* harmony export */ text_strip: () => (/* binding */ text_strip), +/* harmony export */ text_substring: () => (/* binding */ text_substring), +/* harmony export */ text_substring2: () => (/* binding */ text_substring2), +/* harmony export */ text_substring3: () => (/* binding */ text_substring3), +/* harmony export */ text_textarea: () => (/* binding */ text_textarea) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const text = function (_, generator) { + // Text value. + //var code = 'String('+generator.quote_(this.getFieldValue('TEXT'))+')'; + var code = generator.quote_(this.getFieldValue('TEXT')); + return [code, generator.ORDER_ATOMIC]; +} + +const text_textarea = function (_, generator) { + // Text value. + //var code = 'String('+generator.quote_(this.getFieldValue('TEXT'))+')'; + var code = '"""' + (this.getFieldValue('VALUE')) + '"""'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_bytes = function (_, generator) { + const text = this.getFieldValue('TEXT'); + return [`b'${text}'`, generator.ORDER_ATOMIC]; +} + +const text_char = function (_, generator) { + var code = '\'' + this.getFieldValue('TEXT') + '\''; + return [code, generator.ORDER_ATOMIC]; +} + +const text_join = function (_, generator) { + // Text value. + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC); + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC); + return [a + ' + ' + b, generator.ORDER_ADDITIVE]; +} + +const ascii_to_char = function (_, generator) { + var asciivalue = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['chr(' + asciivalue + ')', generator.ORDER_ATOMIC]; +} + +const char_to_ascii = function (_, generator) { + var charvalue = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || 'a'; + return ['ord(' + charvalue + ')', generator.ORDER_ATOMIC]; +} + +const number_to_text = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'; + return ['str(' + str + ')', generator.ORDER_ATOMIC]; +} + +const text_length = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + return ['len(' + str + ')', generator.ORDER_ATOMIC]; +} + +const text_char_at2 = function (a, generator) { + var c = a.getFieldValue("WHERE") || "FROM_START", + str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + switch (c) { + case "FROM_START": + a = generator.getAdjustedInt(a, "AT"); + return [str + "[" + a + "]", generator.ORDER_ATOMIC]; + case "FROM_END": + a = generator.getAdjustedInt(a, "AT", 1, !0); + return [str + "[" + a + "]", generator.ORDER_ATOMIC]; + case "RANDOM": + generator.definitions_.import_random = "import random"; + return ["random.choice(" + str + ")", generator.ORDER_FUNCTION_CALL]; + } + throw "Unhandled combination (lists_getIndex)."; +} + +const text_char_at = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var at = generator.valueToCode(this, 'AT', generator.ORDER_ATOMIC) || 0; + return [str + "[" + at + "]", generator.ORDER_ATOMIC]; +} + +const text_random_char = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + generator.definitions_.import_random = "import random"; + return ["random.choice(" + str + ")", generator.ORDER_FUNCTION_CALL]; +} + +const text_equals_starts_ends = function (_, generator) { + var str1 = (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '""'); + var str2 = (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '""'); + var dowhat = this.getFieldValue('DOWHAT'); + if (dowhat === '===') + return [str1 + ' == ' + str2, generator.ORDER_ATOMIC]; + return [str1 + '.' + dowhat + '(' + str2 + ')', generator.ORDER_ATOMIC]; +} + +const text_compare_to = function (_, generator) { + var str1 = (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '""'); + var str2 = (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '""'); + return ['cmp(' + str1 + ',' + str2 + ')', generator.ORDER_ATOMIC]; +} + +const text_substring2 = function (block, generator) { + // Get sublist. + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + switch (where1) { + case 'FROM_START': + var at1 = generator.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = generator.getAdjustedInt(block, 'AT1', 0, true); + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + switch (where2) { + case 'FROM_START': + var at2 = generator.getAdjustedInt(block, 'AT2'); + break; + case 'FROM_END': + var at2 = generator.getAdjustedInt(block, 'AT2', 0, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(String(at2))) { + generator.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = '-1'; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + var code = str + '[' + at1 + ' : ' + at2 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_substring = function (_, generator) { + // Get sublist. + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ATOMIC); + var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ATOMIC); + var code = str + '[' + at1 + ' : ' + at2 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_capital = function (_, generator) { + var capital = this.getFieldValue('CAPITAL'); + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + return ['' + str + '.' + capital + '()', generator.ORDER_ATOMIC]; +} + +const text_center = function (_, generator) { + var center = this.getFieldValue('CENTER'); + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var width = generator.valueToCode(this, 'WID', generator.ORDER_ATOMIC); + var symbol = generator.valueToCode(this, 'Symbol', generator.ORDER_ATOMIC); + return ['' + str + '.' + center + '(' + width + ',' + symbol + ')', generator.ORDER_ATOMIC]; +} + +const text_find = function (_, generator) { + var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var str = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC); + return ['' + sentence + '.find(' + str + ')', generator.ORDER_ATOMIC]; +} + +const text_join_seq = function (_, generator) { + var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0'; + return [sentence + '.join(' + varName + ')', generator.ORDER_ATOMIC]; +} + +const text_replace = function (_, generator) { + var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var str1 = generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC); + var str2 = generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC); + return ['' + sentence + '.replace(' + str1 + ',' + str2 + ')', generator.ORDER_ATOMIC]; +} + +const text_split = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var argument = generator.valueToCode(this, 'VAL', generator.ORDER_ATOMIC) || '""'; + var code = str + ".split(" + argument + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const text_strip = function (_, generator) { + var towhat = this.getFieldValue('TOWHAT'); + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = str + "." + towhat + "()"; + return [code, generator.ORDER_ATOMIC]; +} + +const text_format = function (_, generator) { + // Create a list with any number of elements of any type. + var s = this.getFieldValue('VAR'); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = s + '.format(' + code.join(', ') + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_format_noreturn = function (_, generator) { + // Create a list with any number of elements of any type. + var s = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = s + '.format(' + code.join(', ') + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const text_substring3 = text_substring +const text_compareTo = text_compare_to +const text_char_at3 = text_char_at + +const text_encode = function (_, generator) { + var code = this.getFieldValue('DIR'); + var varName = this.getFieldValue('CODE') + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + return [str + '.' + code + '("' + varName + '")', generator.ORDER_ATOMIC]; +} + +const text_eval = function (_, generator) { + var codestr = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "eval" + '(' + codestr + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const os_system = function (_, generator) { + generator.definitions_['import_os'] = 'import os'; + var codestr = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "os.system" + '(' + codestr + ')\n'; + return code; +} + +/***/ }), + +/***/ "../python/generators/tuple.js": +/*!*************************************!*\ + !*** ../python/generators/tuple.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ tuple_change_to: () => (/* binding */ tuple_change_to), +/* harmony export */ tuple_create_llm_params: () => (/* binding */ tuple_create_llm_params), +/* harmony export */ tuple_create_with: () => (/* binding */ tuple_create_with), +/* harmony export */ tuple_create_with_noreturn: () => (/* binding */ tuple_create_with_noreturn), +/* harmony export */ tuple_create_with_text2: () => (/* binding */ tuple_create_with_text2), +/* harmony export */ tuple_create_with_text_return: () => (/* binding */ tuple_create_with_text_return), +/* harmony export */ tuple_del: () => (/* binding */ tuple_del), +/* harmony export */ tuple_find: () => (/* binding */ tuple_find), +/* harmony export */ tuple_getIndex: () => (/* binding */ tuple_getIndex), +/* harmony export */ tuple_getSublist: () => (/* binding */ tuple_getSublist), +/* harmony export */ tuple_get_random_item: () => (/* binding */ tuple_get_random_item), +/* harmony export */ tuple_get_sublist: () => (/* binding */ tuple_get_sublist), +/* harmony export */ tuple_input: () => (/* binding */ tuple_input), +/* harmony export */ tuple_join: () => (/* binding */ tuple_join), +/* harmony export */ tuple_length: () => (/* binding */ tuple_length), +/* harmony export */ tuple_max: () => (/* binding */ tuple_max), +/* harmony export */ tuple_totuple: () => (/* binding */ tuple_totuple), +/* harmony export */ tuple_trig: () => (/* binding */ tuple_trig) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const tuple_create_with = function (_, generator) { + // Create a list with any number of elements of any type. + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + // if (this.itemCount_!=1){ + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\n';} + // else { + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\n';} + if (this.itemCount_ != 1) { + var code = varName + '= ' + '(' + code.join(', ') + ')\n'; + } + else { + var code = varName + '= ' + '(' + code.join(', ') + ',)\n'; + } + return code; +} + +const tuple_create_with_text2 = function (_, generator) { + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + var text = this.getFieldValue('TEXT'); + //generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + text + ')\n'; + var code = varName + '= ' + '(' + text + ')\n'; + return code; +} + +const tuple_create_with_text_return = function (_, generator) { + var text = this.getFieldValue('TEXT'); + var code = '(' + text + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_getIndex = function (_, generator) { + // Indexing into a list is the same as indexing into a string. + var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0'; + var argument0 = generator.valueToCode(this, 'AT', + generator.ORDER_ADDITIVE) || '1'; + if (argument0.match(/^\d+$/)) { + // If the index is a naked number, decrement it right now. + argument0 = parseInt(argument0, 10); + } + // else { + // If the index is dynamic, decrement it in code. + // argument0; + // } + var code = varName + '[' + argument0 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_length = function (_, generator) { + var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'len(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_del = function (_, generator) { + var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'del ' + varName + '\n'; + return code; +} + +const tuple_join = function (_, generator) { + var varName1 = generator.valueToCode(this, 'TUP1', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'TUP2', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName1 + " + " + varName2; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_max = function (_, generator) { + var varname = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0'; + var maxmin = this.getFieldValue('DIR'); + var code = maxmin + "(" + varname + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_change_to = function (_, generator) { + var op = this.getFieldValue('OP'); + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var code = op + '(' + varName + ')\n'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_find = function (_, generator) { + var op = this.getFieldValue('OP'); + var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + if (op == 'INDEX') + var code = varName + '.index(' + argument + ')'; + else if (op == 'COUNT') + var code = varName + '.count(' + argument + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_trig = function (a, generator) { + var b = a.getFieldValue("OP"), c; + generator.definitions_['import_math'] = "import math"; + a = generator.valueToCode(a, 'data', generator.ORDER_NONE) + switch (b) { + case "LEN": + c = "len(" + a + ")"; + break; + case "SUM": + c = "sum(" + a + ")"; + break; + case "MIN": + c = "min(" + a + ")"; + break; + case "MAX": + c = "max(" + a + ")"; + break; + case 'AVERAGE': + // generator.definitions_['from_numbers_import_Number'] = + // 'from numbers import Number'; + var functionName = generator.provideFunction_( + 'math_mean', + // This operation excludes null and values that aren't int or float:', + // math_mean([null, null, "aString", 1, 9]) == 5.0.', + ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' localList = [e for e in myList if type(e) == int or type(e) == float]', + ' if not localList: return', + ' return float(sum(localList)) / len(localList)']); + c = functionName + '(' + a + ')'; + break; + case 'MEDIAN': + // generator.definitions_['from_numbers_import_Number'] = + // 'from numbers import Numberd'; + var functionName = generator.provideFunction_( + 'math_median', + // This operation excludes null values: + // math_median([null, null, 1, 3]) == 2.0. + ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' localList = sorted([e for e in myList if type(e) == int or type(e) == float])', + ' if not localList: return', + ' if len(localList) % 2 == 0:', + ' return (localList[len(localList) // 2 - 1] + ' + + 'localList[len(localList) // 2]) / 2.0', + ' else:', + ' return localList[(len(localList) - 1) // 2]']); + c = functionName + '(' + a + ')'; + break; + case 'MODE': + var functionName = generator.provideFunction_( + 'math_modes', + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. + ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(some_list):', + ' modes = []', + ' # Using a lists of [item, count] to keep count rather than dict', + ' # to avoid "unhashable" errors when the counted item is ' + + 'itself a list or dict.', + ' counts = []', + ' maxCount = 1', + ' for item in some_list:', + ' found = False', + ' for count in counts:', + ' if count[0] == item:', + ' count[1] += 1', + ' maxCount = max(maxCount, count[1])', + ' found = True', + ' if not found:', + ' counts.append([item, 1])', + ' for counted_item, item_count in counts:', + ' if item_count == maxCount:', + ' modes.append(counted_item)', + ' return modes']); + c = functionName + '(' + a + ')'; + break; + case 'STD_DEV': + generator.definitions_['import_math'] = 'import math'; + var functionName = generator.provideFunction_( + 'math_standard_deviation', + ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(numbers):', + ' n = len(numbers)', + ' if n == 0: return', + ' mean = float(sum(numbers)) / n', + ' variance = sum((x - mean) ** 2 for x in numbers) / n', + ' return math.sqrt(variance)']); + c = functionName + '(' + a + ')'; + break; + default: + throw 'Unknown operator: ' + b; + } + if (c) + return [c, generator.ORDER_FUNCTION_CALL]; + +} + +const tuple_getSublist = function (block, generator) { + // Get sublist. + var list = generator.valueToCode(block, 'LIST', + generator.ORDER_MEMBER) || '[]'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + switch (where1) { + case 'FROM_START': + var at1 = generator.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = generator.getAdjustedInt(block, 'AT1', 1, true); + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + switch (where2) { + case 'FROM_START': + var at2 = generator.getAdjustedInt(block, 'AT2', 1); + at2 = at2 - 1; + break; + case 'FROM_END': + var at2 = generator.getAdjustedInt(block, 'AT2', 1, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(String(at2))) { + generator.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = '-1'; + break; + default: + throw 'Unhandled option (lists_getSublist)'; + } + var code = list + '[' + at1 + ' : ' + at2 + ']'; + return [code, generator.ORDER_MEMBER]; +} + +const tuple_create_with_noreturn = function (_, generator) { + // Create a list with any number of elements of any type. + var code = new Array(this.itemCount_); + var default_value = '0'; + + + for (var n = 0; n < this.itemCount_; n++) { + + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + // if (this.itemCount_!=1){ + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\n';} + // else { + // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\n';} + if (this.itemCount_ != 1) { + var code = '(' + code.join(', ') + ')'; + } + else { + var code = '(' + code.join(', ') + ',)'; + } + + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_get_sublist = function (_, generator) { + // Get sublist. + var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || '0'; + var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ADDITIVE) || '0'; + var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ADDITIVE) || '0'; + var code = list + '[' + at1 + ' : ' + at2 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_get_random_item = function (_, generator) { + generator.definitions_['import_random'] = 'import random'; + var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ADDITIVE) || 'mytup'; + var code = 'random.choice(' + varName + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_totuple = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0' + return ['tuple(' + str + ')', generator.ORDER_ATOMIC]; +} + +const tuple_input = function (_, generator) { + var text = this.getFieldValue('CONTENT'); + var code = '(' + text + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const tuple_create_llm_params = function (_, generator) { + var params = generator.valueToCode(this, 'params', generator.ORDER_ATOMIC) || '0' + var des = generator.valueToCode(this, 'des', generator.ORDER_ATOMIC) || '0' + var type = this.getFieldValue('type'); + var code = '(' + params + ',"' + type + '",' + des +')'; + return [code, generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/generators/utility.js": +/*!***************************************!*\ + !*** ../python/generators/utility.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ attribute_access: () => (/* binding */ attribute_access), +/* harmony export */ function_call: () => (/* binding */ function_call), +/* harmony export */ raw_block: () => (/* binding */ raw_block), +/* harmony export */ raw_empty: () => (/* binding */ raw_empty), +/* harmony export */ raw_expression: () => (/* binding */ raw_expression), +/* harmony export */ raw_table: () => (/* binding */ raw_table), +/* harmony export */ type_check: () => (/* binding */ type_check) +/* harmony export */ }); +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for utility blocks. + * @author acbart@vt.edu (Austin Cory Bart) + */ + +const raw_block = function (block) { + var code = block.getFieldValue('TEXT') + "\n"; + return code; +} + +const raw_expression = function (block, generator) { + var code = block.getFieldValue('TEXT'); + return [code, generator.ORDER_ATOMIC]; +} + +const raw_empty = function (block, generator) { + var code = generator.valueToCode(block, 'VALUE', + generator.ORDER_ATOMIC) || ''; + return code + "\n"; +} + +const raw_table = function () { + //var code = block.getFieldValue('TEXT')+"\n"; + return '';//code; +} + +const type_check = function (block, generator) { + var value = generator.valueToCode(block, 'VALUE', + generator.ORDER_MEMBER) || '___'; + var code = 'type(' + value + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const function_call = function (block, generator) { + var name = block.getFieldValue('NAME'); + var hasReturn = block.hasReturn_; + var args = new Array(block.itemCount_); + for (var n = 0; n < block.itemCount_; n++) { + args[n] = generator.valueToCode(block, 'ARGUMENT' + n, + generator.ORDER_NONE) || '___'; + } + var code = name + '(' + args.join(', ') + ')'; + if (hasReturn) { + return [code, generator.ORDER_ATOMIC]; + } + return code + '\n'; +} + +const attribute_access = function (block, generator) { + var value_module = generator.valueToCode(block, 'MODULE', generator.ORDER_ATOMIC); + var value_name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC); + //去除掉两端的括号,如(val()) --> val() + value_name = value_name.substring(1, value_name.length - 1); + // TODO: Assemble JavaScript into code variable. + var code = value_module + '.' + value_name; + // TODO: Change ORDER_NONE to the correct strength. + return [code, generator.ORDER_NONE]; +} + +/***/ }), + +/***/ "../python/generators/variables.js": +/*!*****************************************!*\ + !*** ../python/generators/variables.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ controls_type: () => (/* binding */ controls_type), +/* harmony export */ controls_typeLists: () => (/* binding */ controls_typeLists), +/* harmony export */ lists_zip: () => (/* binding */ lists_zip), +/* harmony export */ unpack_iterable_object: () => (/* binding */ unpack_iterable_object), +/* harmony export */ variables_change: () => (/* binding */ variables_change), +/* harmony export */ variables_get: () => (/* binding */ variables_get), +/* harmony export */ variables_global: () => (/* binding */ variables_global), +/* harmony export */ variables_set: () => (/* binding */ variables_set) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const variables_get = function (_, generator) { + // Variable getter. + var code = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + return [code, generator.ORDER_ATOMIC]; +} + +// export const variables_declare = function() { +// var dropdown_type = this.getFieldValue('TYPE'); +// var argument0; +// //TODO: settype to variable +// argument0 = generator.valueToCode(this, 'VALUE',generator.ORDER_ASSIGNMENT) || 'None'; +// var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), +// Blockly.Variables.NAME_TYPE); + +// if (dropdown_type === 'number') +// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = 0;'; +// else if(dropdown_type === 'string') +// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = \'\';'; +// else if(dropdown_type === 'boolean') +// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = true;'; +// else if(dropdown_type.startsWith('Array')) +// generator.definitions_['var_declare' + varName] = 'let ' + varName + ':' + dropdown_type + ' = [];'; + +// if(generator.setups_['var_declare' + varName] === undefined) { +// generator.setups_['var_declare' + varName] = varName + ' = ' + argument0 + '\n'; +// }else { +// } +// return ''; +// } + +const variables_set = function (_, generator) { + // Variable setter. + if (this.getFieldValue('VAR') == "") { + return " = None\n"; + } + var argument0 = generator.valueToCode(this, 'VALUE', + generator.ORDER_ASSIGNMENT) || 'None'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + return varName + ' = ' + argument0 + '\n'; +} + +const variables_change = function (_, generator) { + // Variable setter. + var operator = this.getFieldValue('OP'); + var varName = generator.valueToCode(this, 'MYVALUE', generator.ORDER_ATOMIC) || 'None'; + if (operator == 'bytes') { var code = operator + '(' + varName + ',"UTF-8")'; } + else { var code = operator + '(' + varName + ')'; } + return [code, generator.ORDER_ATOMIC]; +} + +const variables_global = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || 'None'; + var code = "global " + str + '\n'; + return code; +} + +// ok +const controls_type = function (_, generator) { + var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || 'None' + var code = 'type(' + data + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const controls_typeLists = function (_, generator) { + //generator.definitions_['import_microbit_*'] = 'from microbit import *'; + var type = this.getFieldValue('type'); + // generator.definitions_['func_type' + type] = code; + return [type, generator.ORDER_ATOMIC]; +} + +const lists_zip = function (_, generator) { + var code = new Array(this.itemCount_); + var default_value = '[]'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = 'zip(' + code.join(', ') + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const unpack_iterable_object = function (_, generator) { + const varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '[]'; + const type = this.getFieldValue('TYPE'); + const code = `${type}(${varName})`; + return [code, generator.ORDER_ATOMIC]; +} + +/***/ }), + +/***/ "../python/others/names.js": +/*!*********************************!*\ + !*** ../python/others/names.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _variables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./variables */ "../python/others/variables.js"); +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for handling variables and procedure names. + * @author fraser@google.com (Neil Fraser) + */ + + +/** + * Class for a database of entity names (variables, functions, etc). + * @param {string} reservedWords A comma-separated string of words that are + * illegal for use as names in a language (e.g. 'new,if,this,...'). + * @param {string=} opt_variablePrefix Some languages need a '$' or a namespace + * before all variable names. + * @constructor + */ +class Names { + constructor(reservedWords, opt_variablePrefix) { + this.variablePrefix_ = opt_variablePrefix || ''; + this.reservedDict_ = Object.create(null); + if (reservedWords) { + var splitWords = reservedWords.split(','); + for (var i = 0; i < splitWords.length; i++) { + this.reservedDict_[splitWords[i]] = true; + } + } + this.reset(); + } + /** + * Do the given two entity names refer to the same entity? + * Blockly names are case-insensitive. + * @param {string} name1 First name. + * @param {string} name2 Second name. + * @return {boolean} True if names are the same. + */ + static equals(name1, name2) { + return name1 == name2; + } + /** + * When JavaScript (or most other languages) is generated, variable 'foo' and + * procedure 'foo' would collide. However, Blockly has no such problems since + * variable get 'foo' and procedure call 'foo' are unambiguous. + * Therefore, Blockly keeps a separate type name to disambiguate. + * getName('foo', 'variable') -> 'foo' + * getName('foo', 'procedure') -> 'foo2' + */ + /** + * Empty the database and start from scratch. The reserved words are kept. + */ + reset() { + this.db_ = Object.create(null); + this.dbReverse_ = Object.create(null); + this.variableMap_ = null; + } + /** + * Set the variable map that maps from variable name to variable object. + * @param {!Blockly.VariableMap} map The map to track. + * @package + */ + setVariableMap(map) { + this.variableMap_ = map; + } + /** + * Get the name for a user-defined variable, based on its ID. + * This should only be used for variables of type Variables.NAME_TYPE. + * @param {string} id The ID to look up in the variable map. + * @return {?string} The name of the referenced variable, or null if there was + * no variable map or the variable was not found in the map. + * @private + */ + getNameForUserVariable_(id) { + if (!this.variableMap_) { + /* + console.log('Deprecated call to Names.prototype.getName without ' + + 'defining a variable map. To fix, add the folowing code in your ' + + 'generator\'s init() function:\n' + + 'Blockly.YourGeneratorName.variableDB_.setVariableMap(' + + 'workspace.getVariableMap());'); + */ + return null; + } + var variable = this.variableMap_.getVariableById(id); + if (variable) { + return variable.name; + } + return null; + } + /** + * Convert a Blockly entity name to a legal exportable entity name. + * @param {string} name The Blockly entity name (no constraints). + * @param {string} type The type of entity in Blockly + * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). + * @return {string} An entity name that is legal in the exported language. + */ + getName(name, type) { + if (type == _variables__WEBPACK_IMPORTED_MODULE_0__["default"].NAME_TYPE) { + var varName = this.getNameForUserVariable_(name); + if (varName) { + name = varName; + } + } + var normalized = name + '_' + type; + + var isVarType = type == _variables__WEBPACK_IMPORTED_MODULE_0__["default"].NAME_TYPE || + type == Names.DEVELOPER_VARIABLE_TYPE; + + var prefix = isVarType ? this.variablePrefix_ : ''; + if (normalized in this.db_) { + return prefix + this.db_[normalized]; + } + var safeName = this.getDistinctName(name, type); + this.db_[normalized] = safeName.substr(prefix.length); + return safeName; + } + /** + * Convert a Blockly entity name to a legal exportable entity name. + * Ensure that this is a new name not overlapping any previously defined name. + * Also check against list of reserved words for the current language and + * ensure name doesn't collide. + * @param {string} name The Blockly entity name (no constraints). + * @param {string} type The type of entity in Blockly + * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). + * @return {string} An entity name that is legal in the exported language. + */ + getDistinctName(name, type) { + var safeName = this.safeName_(name); + var i = ''; + while (this.dbReverse_[safeName + i] || + (safeName + i) in this.reservedDict_) { + // Collision with existing name. Create a unique name. + i = i ? i + 1 : 2; + } + safeName += i; + this.dbReverse_[safeName] = true; + var isVarType = type == _variables__WEBPACK_IMPORTED_MODULE_0__["default"].NAME_TYPE || + type == Names.DEVELOPER_VARIABLE_TYPE; + var prefix = isVarType ? this.variablePrefix_ : ''; + return prefix + safeName; + } + /** + * Given a proposed entity name, generate a name that conforms to the + * [_A-Za-z][_A-Za-z0-9]* format that most languages consider legal for + * variables. + * @param {string} name Potentially illegal entity name. + * @return {string} Safe entity name. + * @private + */ + safeName_(name) { + if (!name) { + name = 'unnamed'; + } else { + // Unfortunately names in non-latin characters will look like + // _E9_9F_B3_E4_B9_90 which is pretty meaningless. + // https://github.com/google/blockly/issues/1654 + name = encodeURI(name.replace(/ /g, '_')).replace(/[^,\w]/g, '_'); + // Most languages don't allow names with leading numbers. + if ('0123456789'.indexOf(name[0]) != -1) { + name = 'my_' + name; + } + } + return name; + } +} + +/** + * Constant to separate developer variable names from user-defined variable + * names when running generators. + * A developer variable will be declared as a global in the generated code, but + * will never be shown to the user in the workspace or stored in the variable + * map. + */ +Names.DEVELOPER_VARIABLE_TYPE = 'DEVELOPER_VARIABLE'; + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Names); + +/***/ }), + +/***/ "../python/others/procedures.js": +/*!**************************************!*\ + !*** ../python/others/procedures.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for handling procedures. + * @author fraser@google.com (Neil Fraser) + */ + + +const Procedures = {}; + +/** + * Constant to separate procedure names from variables and generated functions + * when running generators. + * @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME + */ +Procedures.NAME_TYPE = blockly_core__WEBPACK_IMPORTED_MODULE_0__.PROCEDURE_CATEGORY_NAME; + +/** + * Find all user-created procedure definitions in a workspace. + * @param {!Blockly.Workspace} root Root workspace. + * @return {!Array.>} Pair of arrays, the + * first contains procedures without return variables, the second with. + * Each procedure is defined by a three-element list of name, parameter + * list, and return value boolean. + */ +Procedures.allProcedures = function (root) { + var blocks = root.getAllBlocks(false); + var proceduresReturn = []; + var proceduresNoReturn = []; + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureDef) { + var tuple = blocks[i].getProcedureDef(); + if (tuple) { + if (tuple[2]) { + proceduresReturn.push(tuple); + } else { + proceduresNoReturn.push(tuple); + } + } + } + } + proceduresNoReturn.sort(Procedures.procTupleComparator_); + proceduresReturn.sort(Procedures.procTupleComparator_); + return [proceduresNoReturn, proceduresReturn]; +}; + +/** + * Comparison function for case-insensitive sorting of the first element of + * a tuple. + * @param {!Array} ta First tuple. + * @param {!Array} tb Second tuple. + * @return {number} -1, 0, or 1 to signify greater than, equality, or less than. + * @private + */ +Procedures.procTupleComparator_ = function (ta, tb) { + return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase()); +}; + +/** + * Ensure two identically-named procedures don't exist. + * Take the proposed procedure name, and return a legal name i.e. one that + * is not empty and doesn't collide with other procedures. + * @param {string} name Proposed procedure name. + * @param {!Blockly.Block} block Block to disambiguate. + * @return {string} Non-colliding name. + */ +Procedures.findLegalName = function (name, block) { + if (block.isInFlyout) { + // Flyouts can have multiple procedures called 'do something'. + return name; + } + name = name || blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['UNNAMED_KEY'] || 'unnamed'; + while (!Procedures.isLegalName_(name, block.workspace, block)) { + // Collision with another procedure. + var r = name.match(/^(.*?)(\d+)$/); + if (!r) { + name += '2'; + } else { + name = r[1] + (parseInt(r[2], 10) + 1); + } + } + return name; +}; + +/** + * Does this procedure have a legal name? Illegal names include names of + * procedures already defined. + * @param {string} name The questionable name. + * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. + * @param {Blockly.Block=} opt_exclude Optional block to exclude from + * comparisons (one doesn't want to collide with oneself). + * @return {boolean} True if the name is legal. + * @private + */ +Procedures.isLegalName_ = function (name, workspace, opt_exclude) { + return !Procedures.isNameUsed(name, workspace, opt_exclude); +}; + +/** + * Return if the given name is already a procedure name. + * @param {string} name The questionable name. + * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. + * @param {Blockly.Block=} opt_exclude Optional block to exclude from + * comparisons (one doesn't want to collide with oneself). + * @return {boolean} True if the name is used, otherwise return false. + */ +Procedures.isNameUsed = function (name, workspace, opt_exclude) { + var blocks = workspace.getAllBlocks(false); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i] == opt_exclude) { + continue; + } + if (blocks[i].getProcedureDef) { + var procName = blocks[i].getProcedureDef(); + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(procName[0], name)) { + return true; + } + } + } + return false; +}; + +/** + * Rename a procedure. Called by the editable field. + * @param {string} name The proposed new name. + * @return {string} The accepted name. + * @this {Blockly.Field} + */ +Procedures.rename = function (name) { + // Strip leading and trailing whitespace. Beyond this, all names are legal. + name = name.trim(); + + var legalName = Procedures.findLegalName(name, this.getSourceBlock()); + var oldName = this.getValue(); + if (oldName != name && oldName != legalName) { + // Rename any callers. + var blocks = this.getSourceBlock().workspace.getAllBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].renameProcedure) { + blocks[i].renameProcedure(oldName, legalName); + } + } + } + return legalName; +}; + +/** + * Construct the blocks required by the flyout for the procedure category. + * @param {!Blockly.Workspace} workspace The workspace containing procedures. + * @return {!Array.} Array of XML block elements. + */ +Procedures.flyoutCategory = function (workspace) { + var xmlList = []; + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['procedures_defnoreturn']) { + // + // do something + // + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_defnoreturn'); + block.setAttribute('gap', 16); + var nameField = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field'); + nameField.setAttribute('name', 'NAME'); + nameField.appendChild(blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode( + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFNORETURN_PROCEDURE'])); + block.appendChild(nameField); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['procedures_defreturn']) { + // + // do something + // + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_defreturn'); + block.setAttribute('gap', 16); + var nameField = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field'); + nameField.setAttribute('name', 'NAME'); + nameField.appendChild(blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode( + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg['PROCEDURES_DEFRETURN_PROCEDURE'])); + block.appendChild(nameField); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['procedures_return']) { + // + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_return'); + block.setAttribute('gap', 16); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['procedures_ifreturn']) { + // + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'procedures_ifreturn'); + block.setAttribute('gap', 16); + xmlList.push(block); + } + if (xmlList.length) { + // Add slightly larger gap between system blocks and user calls. + xmlList[xmlList.length - 1].setAttribute('gap', 24); + } + + function populateProcedures(procedureList, templateName) { + for (var i = 0; i < procedureList.length; i++) { + var name = procedureList[i][0]; + var args = procedureList[i][1]; + // + // + // + // + // + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', templateName); + block.setAttribute('gap', 16); + var mutation = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + mutation.setAttribute('name', name); + block.appendChild(mutation); + for (var j = 0; j < args.length; j++) { + var arg = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('arg'); + arg.setAttribute('name', args[j]); + mutation.appendChild(arg); + } + xmlList.push(block); + } + } + + var tuple = Procedures.allProcedures(workspace); + populateProcedures(tuple[0], 'procedures_callnoreturn'); + populateProcedures(tuple[1], 'procedures_callreturn'); + return xmlList; +}; + +/** + * Find all the callers of a named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to find callers in. + * @return {!Array.} Array of caller blocks. + */ +Procedures.getCallers = function (name, workspace) { + var callers = []; + var blocks = workspace.getAllBlocks(false); + // Iterate through every block and check the name. + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureCall) { + var procName = blocks[i].getProcedureCall(); + // Procedure name may be null if the block is only half-built. + if (procName && blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(procName, name)) { + callers.push(blocks[i]); + } + } + } + return callers; +}; + +/** + * When a procedure definition changes its parameters, find and edit all its + * callers. + * @param {!Blockly.Block} defBlock Procedure definition block. + */ +Procedures.mutateCallers = function (defBlock) { + const oldRecordUndo = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.getRecordUndo(); + const procedureBlock = defBlock; + const name = procedureBlock.getProcedureDef()[0]; + const xmlElement = defBlock.mutationToDom(true); + const callers = blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures.getCallers(name, defBlock.workspace); + for (let i = 0, caller; (caller = callers[i]); i++) { + const oldMutationDom = caller.mutationToDom(); + const oldMutation = oldMutationDom && blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.domToText(oldMutationDom); + if (caller.domToMutation) { + caller.domToMutation(xmlElement); + } + const newMutationDom = caller.mutationToDom(); + const newMutation = newMutationDom && blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.domToText(newMutationDom); + if (oldMutation !== newMutation) { + // Fire a mutation on every caller block. But don't record this as an + // undo action since it is deterministically tied to the procedure's + // definition mutation. + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setRecordUndo(false); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.fire( + new (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.get(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.BLOCK_CHANGE))( + caller, + 'mutation', + null, + oldMutation, + newMutation, + ), + ); + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setRecordUndo(oldRecordUndo); + } + } +}; + +/** + * Find the definition block for the named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to search. + * @return {Blockly.Block} The procedure definition block, or null not found. + */ +Procedures.getDefinition = function (name, workspace) { + // Assume that a procedure definition is a top block. + var blocks = workspace.getTopBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].getProcedureDef) { + var tuple = blocks[i].getProcedureDef(); + if (tuple && blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(tuple[0], name)) { + return blocks[i]; + } + } + } + return null; +}; + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Procedures); + +/***/ }), + +/***/ "../python/others/variables.js": +/*!*************************************!*\ + !*** ../python/others/variables.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Visual Blocks Editor + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Utility functions for handling variables. + * @author fraser@google.com (Neil Fraser) + */ + + + +const Variables = {}; + +/** + * Category to separate variable names from procedures and generated functions. + */ +Variables.NAME_TYPE = 'VARIABLE'; + +/** + * Find all user-created variables. + * @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace. + * @return {!Array.} Array of variable names. + */ +Variables.allVariables = function (root) { + var blocks; + if (root.getDescendants) { + // Root is Block. + blocks = root.getDescendants(); + } else if (root.getAllBlocks) { + // Root is Workspace. + blocks = root.getAllBlocks(); + } else { + throw 'Not Block or Workspace: ' + root; + } + var variableHash = Object.create(null); + // Iterate through every block and add each variable to the hash. + for (var x = 0; x < blocks.length; x++) { + var blockVariables = blocks[x].getVars(); + for (var y = 0; y < blockVariables.length; y++) { + var varName = blockVariables[y]; + // Variable name may be null if the block is only half-built. + if (varName) { + variableHash[varName] = varName; + } + } + } + // Flatten the hash into a list. + var variableList = []; + for (var name in variableHash) { + variableList.push(variableHash[name]); + } + return variableList; +}; + +/** + * Find all instances of the specified variable and rename them. + * @param {string} oldName Variable to rename. + * @param {string} newName New variable name. + * @param {!Blockly.Workspace} workspace Workspace rename variables in. + */ +Variables.renameVariable = function (oldName, newName, workspace) { + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(true); + var blocks = workspace.getAllBlocks(); + // Iterate through every block. + for (var i = 0; i < blocks.length; i++) { + blocks[i].renameVar(oldName, newName); + } + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Events.setGroup(false); +}; + +/** + * Construct the blocks required by the flyout for the variable category. + * @param {!Blockly.Workspace} workspace The workspace contianing variables. + * @return {!Array.} Array of XML block elements. + */ +Variables.flyoutCategory = function (workspace) { + var variableList = Variables.allVariables(workspace); + //variableList.sort(goog.string.caseInsensitiveCompare); + // In addition to the user's variables, we also want to display the default + // variable name at the top. We also don't want this duplicated if the + // user has created a variable of the same name. + // alert(variableList) + // goog.array.remove(variableList, Blockly.Msg.VARIABLES_DEFAULT_NAME); + // variableList.unshift(Blockly.Msg.VARIABLES_DEFAULT_NAME); + + var xmlList = []; + + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_global'); + xmlList.push(block); + + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_set']) { + //增加variables_declare模块 + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_set'); + xmlList.push(block); + }//change tyep + /* + if (Blockly.Blocks['variables_change']) { + //增加variables_declare模块 + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_change'); + xmlList.push(block); + }*/ + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_change']) { + //增加variables_declare模块 + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_change'); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['controls_type']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'controls_type'); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['controls_typeLists']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'controls_typeLists'); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['lists_zip']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'lists_zip'); + block.setAttribute('inline', 'false'); + var mutation = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('mutation'); + mutation.setAttribute('items', 2); + block.appendChild(mutation); + for (let i = 0; i < 2; i++) { + let add = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('value'); + add.setAttribute('name', `ADD${i}`); + // let childBlock = Blockly.utils.xml.createElement('block'); + // childBlock.setAttribute('type', 'list_many_input'); + // let field = Blockly.utils.xml.createElement('field'); + // let value = Blockly.utils.xml.createTextNode('0,1,2,3'); + // field.setAttribute('name', 'CONTENT'); + // field.appendChild(value); + // childBlock.appendChild(field); + // add.appendChild(childBlock); + block.appendChild(add); + } + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['unpack_iterable_object']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'unpack_iterable_object'); + xmlList.push(block); + } + for (var i = 0; i < variableList.length; i++) { + // alert(variableList) + // if(i==0&& !(Blockly.Python.setups_['variables_set'+''])){ + // continue; + // } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_set']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_set'); + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_get']) { + block.setAttribute('gap', 8); + } + var field = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field', null, variableList[i]); + field.setAttribute('name', 'VAR'); + var name = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode(variableList[i]); + field.appendChild(name); + block.appendChild(field); + xmlList.push(block); + } + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_get']) { + var block = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('block'); + block.setAttribute('type', 'variables_get'); + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks['variables_set']) { + block.setAttribute('gap', 24); + } + var field = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createElement('field', null, variableList[i]); + field.setAttribute('name', 'VAR'); + var name = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.xml.createTextNode(variableList[i]); + field.appendChild(name); + block.appendChild(field); + xmlList.push(block); + } + } + return xmlList; +}; + +/** +* Return a new variable name that is not yet being used. This will try to +* generate single letter variable names in the range 'i' to 'z' to start with. +* If no unique name is located it will try 'i' to 'z', 'a' to 'h', +* then 'i2' to 'z2' etc. Skip 'l'. + * @param {!Blockly.Workspace} workspace The workspace to be unique in. +* @return {string} New variable name. +*/ +Variables.generateUniqueName = function (workspace) { + var variableList = Variables.allVariables(workspace); + var newName = ''; + if (variableList.length) { + var nameSuffix = 1; + var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'. + var letterIndex = 0; + var potName = letters.charAt(letterIndex); + while (!newName) { + var inUse = false; + for (var i = 0; i < variableList.length; i++) { + if (variableList[i] == potName) { + // This potential name is already used. + inUse = true; + break; + } + } + if (inUse) { + // Try the next potential name. + letterIndex++; + if (letterIndex == letters.length) { + // Reached the end of the character sequence so back to 'i'. + // a new suffix. + letterIndex = 0; + nameSuffix++; + } + potName = letters.charAt(letterIndex); + if (nameSuffix > 1) { + potName += nameSuffix; + } + } else { + // We can use the current potential name. + newName = potName; + } + } + } else { + newName = 'i'; + } + return newName; +}; + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Variables); + +/***/ }), + +/***/ "../python/python_generator.js": +/*!*************************************!*\ + !*** ../python/python_generator.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Python: () => (/* binding */ Python) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _others_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./others/names */ "../python/others/names.js"); +/* +Overrides for generic Python code generation. +*/ + + + +/** + * Python code generator. + * @type {!Blockly.Generator} + */ +const Python = new blockly_core__WEBPACK_IMPORTED_MODULE_0__.Generator('Python'); +Python.INDENT = " "; + +/** + * List of illegal variable names. + * This is not intended to be a security feature. Blockly is 100% client-side, + * so bypassing this list is trivial. This is intended to prevent users from + * accidentally clobbering a built-in object or function. + * @private + */ +Python.addReservedWords( + // import keyword + // print(','.join(sorted(keyword.kwlist))) + // https://docs.python.org/3/reference/lexical_analysis.html#keywords + // https://docs.python.org/2/reference/lexical_analysis.html#keywords + 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' + + 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,' + + 'or,pass,print,raise,return,try,while,with,yield,' + + // https://docs.python.org/3/library/constants.html + // https://docs.python.org/2/library/constants.html + 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' + + // >>> print(','.join(sorted(dir(__builtins__)))) + // https://docs.python.org/3/library/functions.html + // https://docs.python.org/2/library/functions.html + 'ArithmeticError,AssertionError,AttributeError,BaseException,' + + 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' + + 'ChildProcessError,ConnectionAbortedError,ConnectionError,' + + 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,' + + 'Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,' + + 'FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,' + + 'ImportWarning,IndentationError,IndexError,InterruptedError,' + + 'IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,' + + 'ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,' + + 'NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,' + + 'PermissionError,ProcessLookupError,RecursionError,ReferenceError,' + + 'ResourceWarning,RuntimeError,RuntimeWarning,StandardError,' + + 'StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,' + + 'SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,' + + 'UnicodeDecodeError,UnicodeEncodeError,UnicodeError,' + + 'UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,' + + 'ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,' + + '__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,' + + 'basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,' + + 'coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,' + + 'enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,' + + 'getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,' + + 'issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,' + + 'next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,' + + 'reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,' + + 'sum,super,tuple,type,unichr,unicode,vars,xrange,zip' +); + +/** + * Order of operation ENUMs. + * http://docs.python.org/reference/expressions.html#summary + */ +Python.ORDER_ATOMIC = 0; // 0 "" ... +Python.ORDER_COLLECTION = 1; // tuples, lists, dictionaries +Python.ORDER_STRING_CONVERSION = 1; // `expression...` +Python.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] . +Python.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr +Python.ORDER_MEMBER = 2.1; // . [] +Python.ORDER_FUNCTION_CALL = 2.2; // () +Python.ORDER_EXPONENTIATION = 3; // ** +Python.ORDER_UNARY_SIGN = 4; // + - +Python.ORDER_BITWISE_NOT = 4; // ~ +Python.ORDER_MULTIPLICATIVE = 5; // * / // % +Python.ORDER_ADDITIVE = 6; // + - +Python.ORDER_BITWISE_SHIFT = 7; // << >> +Python.ORDER_BITWISE_AND = 8; // & +Python.ORDER_BITWISE_XOR = 9; // ^ +Python.ORDER_BITWISE_OR = 10; // | +Python.ORDER_RELATIONAL = 11; // in, not in, is, is not, +// <, <=, >, >=, <>, !=, == +Python.ORDER_EQUALITY = 11; // == != === !== +Python.ORDER_LOGICAL_NOT = 12; // not +Python.ORDER_LOGICAL_AND = 13; // and +Python.ORDER_LOGICAL_OR = 14; // or +Python.ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |= +Python.ORDER_CONDITIONAL = 15; // if else +Python.ORDER_LAMBDA = 16; // lambda +Python.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Python.ORDER_OVERRIDES = [ + // (foo()).bar -> foo().bar + // (foo())[0] -> foo()[0] + [Python.ORDER_FUNCTION_CALL, Python.ORDER_MEMBER], + // (foo())() -> foo()() + [Python.ORDER_FUNCTION_CALL, Python.ORDER_FUNCTION_CALL], + // (foo.bar).baz -> foo.bar.baz + // (foo.bar)[0] -> foo.bar[0] + // (foo[0]).bar -> foo[0].bar + // (foo[0])[1] -> foo[0][1] + [Python.ORDER_MEMBER, Python.ORDER_MEMBER], + // (foo.bar)() -> foo.bar() + // (foo[0])() -> foo[0]() + [Python.ORDER_MEMBER, Python.ORDER_FUNCTION_CALL], + + // not (not foo) -> not not foo + // [Python.ORDER_LOGICAL_NOT, Python.ORDER_LOGICAL_NOT], + // a and (b and c) -> a and b and c + // [Python.ORDER_LOGICAL_AND, Python.ORDER_LOGICAL_AND], + // a or (b or c) -> a or b or c + // [Python.ORDER_LOGICAL_OR, Python.ORDER_LOGICAL_OR] +]; + +Python.init = function () { + /** + * Empty loops or conditionals are not allowed in Python. + */ + Python.PASS = this.INDENT + 'pass\n'; + // Create a dictionary of definitions to be printed before the code. + Python.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Python.functionNames_ = Object.create(null); + Python.setups_ = Object.create(null); + Python.loops_ = Object.create(null); + Python.codeEnd_ = Object.create(null); + + if (!Python.variableDB_) { + Python.variableDB_ = new _others_names__WEBPACK_IMPORTED_MODULE_1__["default"](Python.RESERVED_WORDS_); + } else { + Python.variableDB_.reset(); + } +} + +Python.finish = function (code) { + // Convert the definitions dictionary into a list. + if (code !== "") { + code = code.replace(/\n/g, '\n'); + code = code.replace(/\n\s+$/, '\n'); + } + var imports = []; + var definitions_var = []; //变量定义 + var definitions_fun = []; //函数定义 + for (var name in this.definitions_) { + var def = this.definitions_[name]; + if (name.indexOf('import') === 0) { + imports.push(def); + } else if (name.indexOf('var_declare') === 0) { + definitions_var.push(def); + } else { + definitions_fun.push(def); + } + } + if (imports.length) { + imports.push('\n\n'); + } + if (definitions_var.length) { + definitions_var.push('\n\n'); + } + if (definitions_fun.length) { + definitions_fun.push('\n\n'); + } + var functions = []; + for (var name in Python.functions_) { + functions.push(Python.functions_[name]); + } + if (functions.length) { + functions.push('\n\n'); + } + var setups = []; + for (var name in Python.setups_) { + setups.push(Python.setups_[name]); + } + if (setups.length) { + setups.push('\n\n'); + } + var loops = []; + for (var name in Python.loops_) { + loops.push(Python.loops_[name]); + } + var codeEnd = []; + for (var name in Python.codeEnd_) { + codeEnd.push(Python.codeEnd_[name]); + } + if (codeEnd.length !== 0) { + codeEnd.push('\n'); + } + if (loops.length > 0) { + return imports.join('\n') + definitions_var.join('\n') + definitions_fun.join('\n') + + functions.join('\n') + setups.join('') + code + 'while True:\n' + loops.join('') + codeEnd.join('\n'); + } + return imports.join('\n') + definitions_var.join('\n') + definitions_fun.join('\n') + + functions.join('\n') + setups.join('') + code + codeEnd.join('\n'); +} + + +/** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Python.scrubNakedValue = function (line) { + return line + '\n'; +} + +/** + * Encode a string as a properly escaped Python string, complete with quotes. + * @param {string} string Text to encode. + * @return {string} Python string. + * @private + */ +Python.quote_ = function (string) { + // Can't use goog.string.quote since % must also be escaped. + // string = string.replace(/\\/g, '\\\\') + // .replace(/\n/g, '\\\n'); + + // Follow the CPython behaviour of repr() for a non-byte string. + var quote = '\''; + if (string.indexOf('\'') !== -1) { + if (string.indexOf('"') === -1) { + quote = '"'; + } else { + string = string.replace(/'/g, '\\\''); + } + } + return quote + string + quote; +} + +/** + * Encode a string as a properly escaped multiline Python string, complete + * with quotes. + * @param {string} string Text to encode. + * @return {string} Python string. + * @private + */ +Python.multiline_quote_ = function (string) { + // Can't use goog.string.quote since % must also be escaped. + string = string.replace(/'''/g, '\\\'\\\'\\\''); + return '\'\'\'' + string + '\'\'\''; +} + +/** + * Common tasks for generating Python from blocks. + * Handles comments for the specified block and any connected value blocks. + * Calls any statements following this block. + * @param {!Blockly.Block} block The current block. + * @param {string} code The Python code created for this block. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} Python code with comments and subsequent blocks added. + * @private + */ +Python.scrub_ = function (block, code, opt_thisOnly) { + var commentCode = ''; + // Only collect comments for blocks that aren't inline. + if (!block.outputConnection || !block.outputConnection.targetConnection) { + // Collect comment for this block. + var comment = block.getCommentText(); + if (comment) { + comment = blockly_core__WEBPACK_IMPORTED_MODULE_0__.utils.string.wrap(comment, + Python.COMMENT_WRAP - 3); + commentCode += Python.prefixLines(comment + '\n', '# '); + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == blockly_core__WEBPACK_IMPORTED_MODULE_0__.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + var comment = Python.allNestedComments(childBlock); + if (comment) { + commentCode += Python.prefixLines(comment, '# '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Python.blockToCode(nextBlock); + return commentCode + code + nextCode; +} + +/** + * Gets a property and adjusts the value, taking into account indexing, and + * casts to an integer. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @return {string|number} + */ +Python.getAdjustedInt = function (block, atId, opt_delta, opt_negate) { + var delta = opt_delta || 0; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + var atOrder = delta ? Python.ORDER_ADDITIVE : + Python.ORDER_NONE; + var at = Python.valueToCode(block, atId, atOrder) || defaultAtIndex; + + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseInt(at, 10) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = 'int(' + at + ' + ' + delta + ')'; + } else if (delta < 0) { + at = 'int(' + at + ' - ' + -delta + ')'; + } else { + at = 'int(' + at + ')'; + } + if (opt_negate) { + at = '-' + at; + } + } + return at; +} + +/***/ }), + +/***/ "../python_skulpt/blocks/data.js": +/*!***************************************!*\ + !*** ../python_skulpt/blocks/data.js ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ array_create: () => (/* binding */ array_create), +/* harmony export */ array_toarray: () => (/* binding */ array_toarray), +/* harmony export */ dataframe_create: () => (/* binding */ dataframe_create), +/* harmony export */ dataframe_create_from_index: () => (/* binding */ dataframe_create_from_index), +/* harmony export */ dataframe_create_from_one_index: () => (/* binding */ dataframe_create_from_one_index), +/* harmony export */ dataframe_get: () => (/* binding */ dataframe_get), +/* harmony export */ numpy_trig: () => (/* binding */ numpy_trig), +/* harmony export */ pandas_readcsv: () => (/* binding */ pandas_readcsv), +/* harmony export */ pl_axes: () => (/* binding */ pl_axes), +/* harmony export */ pl_bar: () => (/* binding */ pl_bar), +/* harmony export */ pl_hist: () => (/* binding */ pl_hist), +/* harmony export */ pl_label: () => (/* binding */ pl_label), +/* harmony export */ pl_legend: () => (/* binding */ pl_legend), +/* harmony export */ pl_pie: () => (/* binding */ pl_pie), +/* harmony export */ pl_plot: () => (/* binding */ pl_plot), +/* harmony export */ pl_plot_bar: () => (/* binding */ pl_plot_bar), +/* harmony export */ pl_plot_easy: () => (/* binding */ pl_plot_easy), +/* harmony export */ pl_plot_scatter: () => (/* binding */ pl_plot_scatter), +/* harmony export */ pl_plot_xy: () => (/* binding */ pl_plot_xy), +/* harmony export */ pl_savefig: () => (/* binding */ pl_savefig), +/* harmony export */ pl_show: () => (/* binding */ pl_show), +/* harmony export */ pl_subplot: () => (/* binding */ pl_subplot), +/* harmony export */ pl_text: () => (/* binding */ pl_text), +/* harmony export */ pl_ticks: () => (/* binding */ pl_ticks), +/* harmony export */ pl_title: () => (/* binding */ pl_title), +/* harmony export */ plot_axes: () => (/* binding */ plot_axes), +/* harmony export */ plot_bar: () => (/* binding */ plot_bar), +/* harmony export */ plot_hist: () => (/* binding */ plot_hist), +/* harmony export */ plot_label: () => (/* binding */ plot_label), +/* harmony export */ plot_legend: () => (/* binding */ plot_legend), +/* harmony export */ plot_pie: () => (/* binding */ plot_pie), +/* harmony export */ plot_plot: () => (/* binding */ plot_plot), +/* harmony export */ plot_plot_bar: () => (/* binding */ plot_plot_bar), +/* harmony export */ plot_plot_easy: () => (/* binding */ plot_plot_easy), +/* harmony export */ plot_plot_scatter: () => (/* binding */ plot_plot_scatter), +/* harmony export */ plot_plot_xy: () => (/* binding */ plot_plot_xy), +/* harmony export */ plot_savefig: () => (/* binding */ plot_savefig), +/* harmony export */ plot_show: () => (/* binding */ plot_show), +/* harmony export */ plot_subplot: () => (/* binding */ plot_subplot), +/* harmony export */ plot_text: () => (/* binding */ plot_text), +/* harmony export */ plot_ticks: () => (/* binding */ plot_ticks), +/* harmony export */ plot_title: () => (/* binding */ plot_title), +/* harmony export */ series_create: () => (/* binding */ series_create), +/* harmony export */ series_create_from_index: () => (/* binding */ series_create_from_index), +/* harmony export */ series_create_from_text: () => (/* binding */ series_create_from_text), +/* harmony export */ series_get_num: () => (/* binding */ series_get_num), +/* harmony export */ series_index_value: () => (/* binding */ series_index_value) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const DATA_HUE = 170//'#5ec73d'//195; + +const series_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const series_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('ser1'), 'VAR') + this.appendValueInput('SER') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_via) + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const dataframe_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_via) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const dataframe_create_from_one_index = { + init: function () { + this.setColour(DATA_HUE); + var column_raw = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_RAW, 'index'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_COLUMN, 'columns']]; + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_via) + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(column_raw), 'COLUMN_RAW') + this.appendValueInput('INDEX') + .setCheck([String, 'List']) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_set_index) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const dataframe_create_from_index = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('df1'), 'VAR') + this.appendValueInput('SER') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_series_via) + this.appendValueInput('INDEX_COLUMN') + .setCheck([String, 'List']) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_set_index_column) + this.appendValueInput('INDEX_RAW') + .setCheck([String, 'List']) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_set_index_raw) + this.setPreviousStatement(true); + this.setNextStatement(true); + //this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_dataframe_create_index_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + + + +const series_create_from_text = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('ser1'), 'VAR') + + .appendField(' = [') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('1,2,3'), 'TEXT') + .appendField(']'); + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SERIES_CREATE_FROM_TEXT); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + + +const series_index_value = { + /** + * Block for list length. + * @this Blockly.Block + */ + init: function () { + this.setColour(DATA_HUE); + var index_value = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SERIES_INDEX, 'index'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_VALUE, 'value']]; + this.appendValueInput('SERIES') + .setCheck('Series') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SERIES_INDEX_VALUE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(index_value), 'INDEX_VALUE') + + this.setOutput(true, 'List'); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('INDEX_VALUE'); + var TOOLTIPS = { + 'index': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.SERIES_INDEX_TOOLTIP, + 'value': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_VALUE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + + } +}; + +const series_get_num = { + init: function () { + this.setColour(DATA_HUE); + //this.setOutput(true, Number); + this.setOutput(true); + this.appendValueInput('SER') + .setCheck('Series') + this.appendValueInput('AT') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_GET_INDEX1); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_LISTS_GET_INDEX2); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TUPLE_GET_INDEX_TOOLTIP); + } +}; + + +const pl_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const pl_plot = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_BLUE, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_GREEN, 'g'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_RED, 'r'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_CYAN, 'c'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_MAGENTA, 'm'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_YELLOW, 'y'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLACK, 'k'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const pl_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const pl_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const pl_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const pl_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const pl_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_X, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + + +const array_create = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('FROM') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SPLITBYDOU) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_DATA_ARRAY_CREATE_FROM); + this.appendValueInput('TO') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_DATA_ARRAY_CREATE_TO); + this.appendValueInput('STEP') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STEP); + this.setInputsInline(true); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +const pl_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +const pl_plot_scatter = { + init: function () { + this.setColour(DATA_HUE); + var color_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_BLUE, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_GREEN, 'g'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_RED, 'r'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_CYAN, 'c'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_MAGENTA, 'm'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_YELLOW, 'y'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLACK, 'k'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_SCATTER) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(color_type), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +const pl_plot_xy = { + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'] + , [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_BLUE, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_GREEN, 'g'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_RED, 'r'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_CYAN, 'c'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_MAGENTA, 'm'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_YELLOW, 'y'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLACK, 'k'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +const pl_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_BAR) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +const pl_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + + +const pl_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_HIST) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const pl_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_X, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETTING) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + + +const numpy_trig = { + /** + * Block for trigonometry operators. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = [ + ['sin', 'sin'], + ['cos', 'cos'], + ['tan', 'tan'], + ['arcsin', 'arcsin'], + ['arccos', 'arccos'], + ['arctan', 'arctan'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_ROUND, 'round'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_CEIL, 'ceil'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_TO_FLOOR, 'floor'] + ]; + this.setColour(DATA_HUE); + this.setOutput(true); + this.setInputsInline(true); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_NUMPY_TRIG) + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(OPERATORS), 'OP'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_NUMPY_TRIG_TOOLTIP); + + } +}; + +const pl_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +const pandas_readcsv = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILENAME") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXPY_PANDAS_READ_CSV); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PANDAS_READCSV_HEADER_Y, '0'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PANDAS_READCSV_HEADER_N, 'None']]), 'MODE'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PANDAS_READCSV_TITLE); + this.setOutput(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PANDAS_READCSV_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } +}; + +const dataframe_get = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('DICT') + .setCheck('Dict') + this.appendValueInput('KEY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_DATAFRAME_GET) + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_DATAFRAME_GET_INDEX) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_COLUMN, 'column'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DATAFRAME_RAW, 'raw']]), 'MODE') + + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_DATAFRAME_GET_TOOLTIP); + } +}; + +const pl_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +const pl_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_LEFT, 'right'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETTING) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_HOR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_VER) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; + +const array_toarray = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOARRAY); + this.setOutput(true, 'List'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TOOLTIP_TOARRAY); + } +}; + + + + + + + +const plot_plot_easy = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('SER') + .setCheck('Series') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const plot_plot = {//将XX绘制为折线图,删去尚不支持的点型 + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_BLUE, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_GREEN, 'g'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_RED, 'r'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_CYAN, 'c'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_MAGENTA, 'm'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_YELLOW, 'y'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLACK, 'k'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + + this.appendValueInput('SER') + .setCheck('Series') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(color_type), 'COLOR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const plot_show = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_SHOW); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const plot_axes = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_AXES); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const plot_legend = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_LEGEND); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const plot_title = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_TITLE); + this.appendValueInput('TITLE') + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const plot_label = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_X, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_SET_LABEL) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('LABEL') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_LABEL) + .setCheck(String); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + // var thisBlock = this; + // this.setTooltip(function() { + // var mode = thisBlock.getFieldValue('DIR'); + // var TOOLTIPS = { + // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + // }; + // return TOOLTIPS[mode]; + // }); + } +}; + +const plot_plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var plot_bar = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DISPLAY_DRAW) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(plot_bar), 'DIR'); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'plot': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP, + 'bar': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +const plot_plot_scatter = {//散点图,删去尚不支持的点型;修改了颜色的选择方式 + init: function () { + this.setColour(DATA_HUE); + var dot_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_SCATTER) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('S') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT'); + // this.appendDummyInput("") + // .appendField(Blockly.Msg.HTML_COLOUR) + // .appendField(new Blockly.FieldDropdown(color_type), 'COLOR'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(""); + } +}; + +const plot_plot_xy = {//折线图,删去尚不支持的点型 + init: function () { + this.setColour(DATA_HUE); + var line_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, ""]]; + var color_type = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_BLUE, 'b'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_GREEN, 'g'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_RGB_RED, 'r'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_CYAN, 'c'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_MAGENTA, 'm'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_YELLOW, 'y'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLACK, 'k'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_WHITE, 'w'] + ]; + var dot_type = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'] + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'], + // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_'] + ]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_DOT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(dot_type), 'DOT') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_PYLAB_PLOT_LINE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(line_type), 'LINE') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(color_type), 'COLOR') + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +const plot_bar = { + init: function () { + this.setColour(DATA_HUE); + var align = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.AILGN_EDGE, 'edge']]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_BAR) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_X); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_Y); + this.appendValueInput('WIDTH') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_WIDTH); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_BAR_ALIGN) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(align), 'ALIGN') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.HTML_COLOUR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#0000ff'), 'COLOR'); + this.appendValueInput('TAG') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + +const plot_pie = { + init: function () { + this.setColour(DATA_HUE); + var shadow = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']]; + var autopct = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']]; + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.COLOUR_BLEND_RATIO); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.appendValueInput('EXPLODE') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_EXPLODE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_AUTOPCT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(autopct), 'autopct') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PIE_SHADOW) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(shadow), 'SHADOW') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP); + } +}; + + +const plot_hist = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_HIST) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SD_DATA); + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const plot_ticks = { + init: function () { + this.setColour(DATA_HUE); + var xylabel = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_X, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_Y, 'y']]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETTING) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(xylabel), 'DIR'); + this.appendValueInput('A') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_I2C_VALUE) + this.appendValueInput('B') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TAG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PYLAB_TICKS_TOOLTIP); + } +}; + +const plot_subplot = { + init: function () { + this.setColour(DATA_HUE); + this.appendValueInput('VET') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_VERTICLE); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_HORIZEN); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_SUBPLOT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP); + } +}; + +const plot_savefig = { + init: function () { + this.setColour(DATA_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_SAVEFIG_TOOLTIP); + } +}; + +const plot_text = { + init: function () { + this.setColour(DATA_HUE); + var halign = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_LEFT, 'right'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_TRIM_RIGHT, 'left']]; + var valign = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_BOTTOM, 'top']]; + this.appendValueInput('VET') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SETTING) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_X); + this.appendValueInput('HOR') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_Y); + this.appendValueInput('NUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TAG); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_HOR) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(halign), 'HALIGN'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_VER) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(valign), 'VALIGN'); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_TEXT_TOOLTIP); + } +}; + +/***/ }), + +/***/ "../python_skulpt/blocks/inout.js": +/*!****************************************!*\ + !*** ../python_skulpt/blocks/inout.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ inout_input: () => (/* binding */ inout_input), +/* harmony export */ inout_print: () => (/* binding */ inout_print), +/* harmony export */ inout_print_container: () => (/* binding */ inout_print_container), +/* harmony export */ inout_print_end: () => (/* binding */ inout_print_end), +/* harmony export */ inout_print_inline: () => (/* binding */ inout_print_inline), +/* harmony export */ inout_print_item: () => (/* binding */ inout_print_item), +/* harmony export */ inout_print_many: () => (/* binding */ inout_print_many), +/* harmony export */ inout_type_input: () => (/* binding */ inout_type_input) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const INOUT_HUE = 20; + +const inout_input = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_inout_raw_input) + .setCheck(String); + this.setOutput(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.INOUT_input_TOOLTIP); + } +} + +const inout_print = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SERIAL_PRINTLN); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.BLOCKPY_PRINT_TOOLTIP); + } +}; + +const inout_print_inline = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SERIAL_PRINT); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TEXT_PRINT_TOOLTIP); + } +}; + +const inout_print_end = { + init: function () { + this.setColour(INOUT_HUE); + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SERIAL_PRINT); + this.appendValueInput("END") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_ENDSWITH); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP); + } +}; + +const inout_type_input = { + init: function () { + + var input_type = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_STRING, 'str'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_INT, 'int'] + , [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LANG_MATH_FLOAT, 'float']]; + this.setColour(INOUT_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(input_type), 'DIR') + this.appendValueInput("VAR") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PROCEDURES_MUTATORCONTAINER_TITLE) + .setCheck(String); + + this.setInputsInline(true); + this.setOutput(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'str': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP, + 'int': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP, + 'float': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + } +}; + +const inout_print_many = { + + init: function () { + this.setColour(INOUT_HUE); + + this.itemCount_ = 2; + this.updateShape_(); + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setInputsInline(true); + this.setMutator(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.icons.MutatorIcon(['inout_print_item'], this)); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP); + }, + + mutationToDom: function () { + var container = document.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + + domToMutation: function (xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + + decompose: function (workspace) { + var containerBlock = + workspace.newBlock('inout_print_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('inout_print_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + + compose: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + var i = 0; + while (itemBlock) { + connections[i] = itemBlock.valueConnection_; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + i++; + } + this.itemCount_ = i; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + if (connections[i]) { + this.getInput('ADD' + i) + .connection.connect(connections[i]); + } + } + }, + + saveConnections: function (containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + + updateShape_: function () { + // Delete everything. + if (this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else { + var i = 0; + while (this.getInput('ADD' + i)) { + this.removeInput('ADD' + i); + i++; + } + } + // Rebuild block. + if (this.itemCount_ == 0) { + this.appendDummyInput('EMPTY') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_PRINT_EMPTY); + } else { + for (var i = 0; i < this.itemCount_; i++) { + var input = this.appendValueInput('ADD' + i); + if (i == 0) { + input.appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SERIAL_PRINTLN); + } + } + } + } +}; +const inout_print_container = { + init: function () { + this.setColour(INOUT_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SERIAL_PRINTLN); + this.appendStatementInput('STACK'); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP); + this.contextMenu = false; + } +}; + +const inout_print_item = { + init: function () { + this.setColour(INOUT_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.LISTS_CREATE_WITH_ITEM_TITLE); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_ITEM_TOOLTIP); + this.contextMenu = false; + } +}; + +/***/ }), + +/***/ "../python_skulpt/blocks/system.js": +/*!*****************************************!*\ + !*** ../python_skulpt/blocks/system.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Panic_with_status_code: () => (/* binding */ Panic_with_status_code), +/* harmony export */ base_delay: () => (/* binding */ base_delay), +/* harmony export */ controls_millis: () => (/* binding */ controls_millis), +/* harmony export */ controls_mstimer2: () => (/* binding */ controls_mstimer2), +/* harmony export */ controls_mstimer2_start: () => (/* binding */ controls_mstimer2_start), +/* harmony export */ controls_mstimer2_stop: () => (/* binding */ controls_mstimer2_stop), +/* harmony export */ reset: () => (/* binding */ reset), +/* harmony export */ time_localtime: () => (/* binding */ time_localtime), +/* harmony export */ time_sleep: () => (/* binding */ time_sleep) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const SYSTEM_HUE = 120; + +const base_delay = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DELAY + '(' + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MILLIS + ')') + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +const controls_millis = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_time_time); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS); + } +}; + +const time_localtime = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME) + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_ALL, "all"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_YEAR, "0"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MONTH, "1"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DATE, "2"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_HOUR, "3"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MINUTE, "4"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_SECOND, "5"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INWEEK, "6"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INYEAR, "7"], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DST, "8"] + ]), "op"); + this.setOutput(true); + this.setInputsInline(true); + } +}; + +const Panic_with_status_code = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("STATUS_CODE", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_Panic_with_status_code) + .setCheck(Number); + this.setPreviousStatement(true, null); + // this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +const reset = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_Reset_micro); + this.setPreviousStatement(true); + // this.setNextStatement(true); + } +}; + +const controls_mstimer2 = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput('TIME') + .setCheck(Number) + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField('MsTimer2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MSTIMER2_EVERY); + this.appendDummyInput() + .appendField('ms'); + this.appendStatementInput('DO') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MSTIMER2_DO); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const controls_mstimer2_start = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MSTIMER2_START); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const controls_mstimer2_stop = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendDummyInput() + .appendField('MsTimer2') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_STOP); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const time_sleep = { + init: function () { + this.setColour(SYSTEM_HUE); + this.appendValueInput("DELAY_TIME", Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_DELAY) + .setCheck(Number); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SECOND) + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_CONTROL_DELAY); + } +}; + +/***/ }), + +/***/ "../python_skulpt/blocks/turtle.js": +/*!*****************************************!*\ + !*** ../python_skulpt/blocks/turtle.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ turtle_bgcolor: () => (/* binding */ turtle_bgcolor), +/* harmony export */ turtle_bgcolor_hex: () => (/* binding */ turtle_bgcolor_hex), +/* harmony export */ turtle_bgcolor_hex_new: () => (/* binding */ turtle_bgcolor_hex_new), +/* harmony export */ turtle_circle: () => (/* binding */ turtle_circle), +/* harmony export */ turtle_circle_advanced: () => (/* binding */ turtle_circle_advanced), +/* harmony export */ turtle_clear: () => (/* binding */ turtle_clear), +/* harmony export */ turtle_clone: () => (/* binding */ turtle_clone), +/* harmony export */ turtle_color: () => (/* binding */ turtle_color), +/* harmony export */ turtle_color_hex: () => (/* binding */ turtle_color_hex), +/* harmony export */ turtle_color_seclet: () => (/* binding */ turtle_color_seclet), +/* harmony export */ turtle_create: () => (/* binding */ turtle_create), +/* harmony export */ turtle_done: () => (/* binding */ turtle_done), +/* harmony export */ turtle_exitonclick: () => (/* binding */ turtle_exitonclick), +/* harmony export */ turtle_fill: () => (/* binding */ turtle_fill), +/* harmony export */ turtle_fillcolor: () => (/* binding */ turtle_fillcolor), +/* harmony export */ turtle_fillcolor_hex: () => (/* binding */ turtle_fillcolor_hex), +/* harmony export */ turtle_fillcolor_hex_new: () => (/* binding */ turtle_fillcolor_hex_new), +/* harmony export */ turtle_getscreen: () => (/* binding */ turtle_getscreen), +/* harmony export */ turtle_goto: () => (/* binding */ turtle_goto), +/* harmony export */ turtle_listen: () => (/* binding */ turtle_listen), +/* harmony export */ turtle_move: () => (/* binding */ turtle_move), +/* harmony export */ turtle_numinput: () => (/* binding */ turtle_numinput), +/* harmony export */ turtle_onclick: () => (/* binding */ turtle_onclick), +/* harmony export */ turtle_onkey: () => (/* binding */ turtle_onkey), +/* harmony export */ turtle_ontimer: () => (/* binding */ turtle_ontimer), +/* harmony export */ turtle_pencolor: () => (/* binding */ turtle_pencolor), +/* harmony export */ turtle_pencolor_hex: () => (/* binding */ turtle_pencolor_hex), +/* harmony export */ turtle_pencolor_hex_new: () => (/* binding */ turtle_pencolor_hex_new), +/* harmony export */ turtle_penup: () => (/* binding */ turtle_penup), +/* harmony export */ turtle_pos_shape: () => (/* binding */ turtle_pos_shape), +/* harmony export */ turtle_rotate: () => (/* binding */ turtle_rotate), +/* harmony export */ turtle_screen_delay: () => (/* binding */ turtle_screen_delay), +/* harmony export */ turtle_screen_savefig: () => (/* binding */ turtle_screen_savefig), +/* harmony export */ turtle_setheading: () => (/* binding */ turtle_setheading), +/* harmony export */ turtle_setxy: () => (/* binding */ turtle_setxy), +/* harmony export */ turtle_shape: () => (/* binding */ turtle_shape), +/* harmony export */ turtle_shapesize: () => (/* binding */ turtle_shapesize), +/* harmony export */ turtle_size: () => (/* binding */ turtle_size), +/* harmony export */ turtle_size_speed: () => (/* binding */ turtle_size_speed), +/* harmony export */ turtle_speed: () => (/* binding */ turtle_speed), +/* harmony export */ turtle_stamp: () => (/* binding */ turtle_stamp), +/* harmony export */ turtle_textinput: () => (/* binding */ turtle_textinput), +/* harmony export */ turtle_visible: () => (/* binding */ turtle_visible), +/* harmony export */ turtle_write: () => (/* binding */ turtle_write), +/* harmony export */ turtle_write_format: () => (/* binding */ turtle_write_format), +/* harmony export */ turtle_write_format_skulpt: () => (/* binding */ turtle_write_format_skulpt) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const TURTLE_HUE = 180; + +const turtle_create = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_create) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('tina'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_create_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const turtle_done = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_TURTLE_DONE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_exitonclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_TURTLE_EXITONCLICK); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_move = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_forward, 'forward'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_backward, 'backward']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_MOVE_BY) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(front_back), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_MOVE_BY_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'forward': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD, + 'backward': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_rotate = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var front_back = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_left, 'left'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_right, 'right']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_rotate) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(front_back), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MICROBIT_JS_BY_ANGLE); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'left': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_LEFT, + 'right': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_RIGHT + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_setheading = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_setheading); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_setheading_degree); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_screen_delay = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_SCREEN_DELAY); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MILLIS); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SCREEN_DELAY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_goto = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_goto); + this.appendValueInput('val') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_goto_y); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_goto_position); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_setxy = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var set_xy = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_X, 'x'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.PYLAB_LABEL_Y, 'y']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(set_xy), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_SETXY); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_SETXY_TOOLTIP); + } +}; + +const turtle_pos_shape = { + + init: function () { + this.setColour(TURTLE_HUE); + var pos_shape = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_POS, 'pos'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_SHAPE, 'shape'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_HEADING, 'heading'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_WIDTH, 'width'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_GET_SHAPESIZE, 'shapesize'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SPEED, 'speed']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_POS_SHAPE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(pos_shape), 'DIR') + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pos': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_POS, + 'shape': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SHAPE, + 'heading': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_HEADING, + 'width': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_WIDTH, + 'speed': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_GET_SPEED, + 'shapesize': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_GET_SHAPESIZE_TOOLTIP + }; + return TOOLTIPS[mode]; + }); + this.setOutput(true); + this.setInputsInline(true); + + } +}; + + +const turtle_clear = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var clear_reset = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_LCD_STAT_CLEAR, 'clear'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_reset, 'reset'] + , [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_home, 'home']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(clear_reset), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'clear': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_CLEAR, + 'reset': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_RESET, + 'home': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_HOME + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_penup = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var penup_down = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_penup, 'penup'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pendown, 'pendown']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(penup_down), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'penup': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_PENUP, + 'pendown': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_PENDOWN + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_fill = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var fill = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_beginfill, 'begin'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_endfill, 'end']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(fill), 'DIR') + + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'begin': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_BEGINFILL, + 'end': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_ENDFILL + }; + return TOOLTIPS[mode]; + }); + } +}; + + +const turtle_size_speed = { + init: function () { + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('tina'), 'TUR') + var size_speed = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_size, 'pensize'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_SPEED, 'speed']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_set) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(size_speed), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_set_num); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'pensize': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SIZE, + 'speed': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SPEED + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_size = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_set_size); + + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SIZE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + + +const turtle_speed = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendValueInput('data') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_set_speed); + + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SPEED); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_circle = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var circle_dot = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_circle, 'circle'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_dot, 'dot']]; + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_draw) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(circle_dot), 'DIR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_radius); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'circle': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE, + 'dot': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_DOT + }; + return TOOLTIPS[mode]; + }); + } +}; + +const turtle_circle_advanced = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + // .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_DRAW_CIRCLE) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_radius); + this.appendValueInput('data') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_angle); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE); + } +}; + +const turtle_visible = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var visible = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_hide, 'hideturtle'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_show, 'showturtle']]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(visible), 'DIR') + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + var thisBlock = this; + this.setTooltip(function () { + var mode = thisBlock.getFieldValue('DIR'); + var TOOLTIPS = { + 'hideturtle': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_HIDE, + 'showturtle': blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_TURTEL_SHOW + }; + return TOOLTIPS[mode]; + }); + } +}; + + +const turtle_bgcolor = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_bgcolor) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_pencolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pencolor) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_fillcolor = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_fillcolor) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#ff0000'), 'FIELDNAME'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_clone = { + + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_CLONE); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_CLONE_TOOLTIP); + this.setOutput(true); + } +}; + +const turtle_bgcolor_hex_new = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_bgcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_pencolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pencolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_fillcolor_hex_new = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_color = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pencolor) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#ff0000'), 'FIELDNAME'); + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_fillcolor) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour('#ff0000'), 'FIELDNAME2'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_color_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR1') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pencolor); + this.appendValueInput('VAR2') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_fillcolor); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_bgcolor_hex = { + init: function () { + + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_bgcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_pencolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_pencolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_fillcolor_hex = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_fillcolor_hex); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_shape = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + var shape = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_arrow, 'arrow'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_turtle, 'turtle'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_circle, 'circle'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_square, 'square'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_triangle, 'triangle'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape_classic, 'classic'] + ]; + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_shape) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(shape), 'DIR'); + + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_SHAPE_TOOLTIP); + } +}; + +const turtle_shapesize = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_SHAPESIZE); + this.appendValueInput('WID') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_SHAPESIZE_WID); + this.appendValueInput('LEN') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_SHAPESIZE_LEN); + this.appendValueInput('OUTLINE') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_SHAPESIZE_OUTLINE); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TOOLTIP_SHAPESIZE); + } +}; + +const turtle_numinput = { + init: function () { + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_NUMINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.appendValueInput('DEFAULT') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.DICTS_DEFAULT_VALUE); + this.appendValueInput('MIN') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MIN); + this.appendValueInput('MAX') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MATH_ONLIST_OPERATOR_MAX); + this.setInputsInline(true); + this.setOutput(true, Number); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_NUMINPUT_TOOLTIP); + } +}; + +const turtle_textinput = { + init: function () { + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT) + this.setColour(TURTLE_HUE); + this.appendValueInput('TITLE') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE); + this.appendValueInput('PROMPT') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT); + this.setInputsInline(true); + this.setOutput(true, String); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_TEXTINPUT_TOOLTIP); + } +}; + +const turtle_write = { + init: function () { + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_write); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +const turtle_write_format = { + init: function () { + var move = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD_ITALIC, 'bold","italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + +const turtle_write_format_skulpt = { + init: function () { + var move = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']]; + var align = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']]; + var fonttype = + [[blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic']]; + this.appendValueInput('TUR') + .setCheck('Turtle') + this.setColour(TURTLE_HUE); + this.appendValueInput('VAR') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.blockpy_turtle_write); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_MOVE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(move), 'MOVE'); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_ALIGN) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(align), 'ALIGN'); + this.appendValueInput('FONTNAME') + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NAME); + this.appendValueInput('FONTNUM') + .setCheck(Number) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_NUM); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(fonttype), 'FONTTYPE'); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_WRITE_TOOLTIP); + } +}; + + +const turtle_color_seclet = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendDummyInput("") + .setAlign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.inputs.Align.RIGHT) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldColour("ff0000"), "COLOR"); + this.setInputsInline(true); + this.setOutput(true, String); + } +}; + +const turtle_getscreen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput("") + + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_GETSCREEN) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldTextInput('screen'), 'VAR') + + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_GETSCREEN_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('VAR')]; + }, + renameVar: function (oldName, newName) { + if (blockly_core__WEBPACK_IMPORTED_MODULE_0__.Names.equals(oldName, this.getFieldValue('VAR'))) { + this.setTitleValue(newName, 'VAR'); + } + } + +} + +const turtle_onkey = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONKEY); + this.appendValueInput('callback') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONKEY_TOOLTIP); + } +}; + +const turtle_onclick = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONCLICK); + this.appendValueInput('callback') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONCLICK_TOOLTIP); + } +}; + +const turtle_ontimer = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput('VAR') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONTIMER); + this.appendDummyInput("") + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_mSecond); + this.appendValueInput('callback') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_EVENT_ONTIMER_TOOLTIP); + } +}; + +const turtle_listen = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_TURTEL_SCREEN_LISTEN); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +const turtle_screen_savefig = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + this.appendValueInput("FILE") + .setCheck(String) + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_PL_SAVEFIG); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setOutput(false); + this.setTooltip(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.mixpy_TURTLE_SAVEFIG_TOOLTIP); + } +}; + +const turtle_stamp = { + init: function () { + this.setColour(TURTLE_HUE); + this.appendValueInput('TUR') + .setCheck('Turtle') + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.TURTLE_STAMP); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + } +}; + +/***/ }), + +/***/ "../python_skulpt/generators/data.js": +/*!*******************************************!*\ + !*** ../python_skulpt/generators/data.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ array_create: () => (/* binding */ array_create), +/* harmony export */ array_toarray: () => (/* binding */ array_toarray), +/* harmony export */ dataframe_create: () => (/* binding */ dataframe_create), +/* harmony export */ dataframe_create_from_index: () => (/* binding */ dataframe_create_from_index), +/* harmony export */ dataframe_create_from_one_index: () => (/* binding */ dataframe_create_from_one_index), +/* harmony export */ dataframe_get: () => (/* binding */ dataframe_get), +/* harmony export */ numpy_trig: () => (/* binding */ numpy_trig), +/* harmony export */ pandas_readcsv: () => (/* binding */ pandas_readcsv), +/* harmony export */ pl_axes: () => (/* binding */ pl_axes), +/* harmony export */ pl_bar: () => (/* binding */ pl_bar), +/* harmony export */ pl_hist: () => (/* binding */ pl_hist), +/* harmony export */ pl_label: () => (/* binding */ pl_label), +/* harmony export */ pl_legend: () => (/* binding */ pl_legend), +/* harmony export */ pl_pie: () => (/* binding */ pl_pie), +/* harmony export */ pl_plot: () => (/* binding */ pl_plot), +/* harmony export */ pl_plot_bar: () => (/* binding */ pl_plot_bar), +/* harmony export */ pl_plot_easy: () => (/* binding */ pl_plot_easy), +/* harmony export */ pl_plot_scatter: () => (/* binding */ pl_plot_scatter), +/* harmony export */ pl_plot_xy: () => (/* binding */ pl_plot_xy), +/* harmony export */ pl_savefig: () => (/* binding */ pl_savefig), +/* harmony export */ pl_show: () => (/* binding */ pl_show), +/* harmony export */ pl_subplot: () => (/* binding */ pl_subplot), +/* harmony export */ pl_text: () => (/* binding */ pl_text), +/* harmony export */ pl_ticks: () => (/* binding */ pl_ticks), +/* harmony export */ pl_title: () => (/* binding */ pl_title), +/* harmony export */ plot_axes: () => (/* binding */ plot_axes), +/* harmony export */ plot_bar: () => (/* binding */ plot_bar), +/* harmony export */ plot_hist: () => (/* binding */ plot_hist), +/* harmony export */ plot_label: () => (/* binding */ plot_label), +/* harmony export */ plot_legend: () => (/* binding */ plot_legend), +/* harmony export */ plot_pie: () => (/* binding */ plot_pie), +/* harmony export */ plot_plot: () => (/* binding */ plot_plot), +/* harmony export */ plot_plot_bar: () => (/* binding */ plot_plot_bar), +/* harmony export */ plot_plot_easy: () => (/* binding */ plot_plot_easy), +/* harmony export */ plot_plot_scatter: () => (/* binding */ plot_plot_scatter), +/* harmony export */ plot_plot_xy: () => (/* binding */ plot_plot_xy), +/* harmony export */ plot_savefig: () => (/* binding */ plot_savefig), +/* harmony export */ plot_show: () => (/* binding */ plot_show), +/* harmony export */ plot_subplot: () => (/* binding */ plot_subplot), +/* harmony export */ plot_text: () => (/* binding */ plot_text), +/* harmony export */ plot_ticks: () => (/* binding */ plot_ticks), +/* harmony export */ plot_title: () => (/* binding */ plot_title), +/* harmony export */ series_create: () => (/* binding */ series_create), +/* harmony export */ series_create_from_index: () => (/* binding */ series_create_from_index), +/* harmony export */ series_create_from_text: () => (/* binding */ series_create_from_text), +/* harmony export */ series_get_num: () => (/* binding */ series_get_num), +/* harmony export */ series_index_value: () => (/* binding */ series_index_value) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const series_create = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.Series(' + varName1 + ')\n'; + return code; +} + +const series_create_from_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.Series(' + varName1 + ',' + 'index=' + varName2 + ')\n'; + return code; +} + +const dataframe_create = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ')\n'; + return code; +} + +const dataframe_create_from_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX_COLUMN', generator.ORDER_ATOMIC) || '\'\''; + var varName3 = generator.valueToCode(this, 'INDEX_RAW', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + 'columns=' + varName2 + ',index=' + varName3 + ')\n'; + return code; +} + +const dataframe_create_from_one_index = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var name = this.getFieldValue('COLUMN_RAW'); + var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\'\''; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + name + '=' + varName2 + ')\n'; + return code; +} + +const series_create_from_text = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var text = this.getFieldValue('TEXT'); + var code = varName + ' = ' + 'pandas.Series([' + text + '])\n'; + return code; +} + +const series_index_value = function (_, generator) { + generator.definitions_.import_pandas = "import pandas"; + var varName = generator.valueToCode(this, 'SERIES', generator.ORDER_ASSIGNMENT) || '0'; + var name = this.getFieldValue('INDEX_VALUE'); + var code = varName + '.' + name; + return [code, generator.ORDER_ATOMIC]; +} + +const series_get_num = function (_, generator) { + // Indexing into a list is the same as indexing into a string. + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var argument0 = generator.valueToCode(this, 'AT', + generator.ORDER_ADDITIVE) || '1'; + var code = varName + '[' + argument0 + ']'; + return [code, generator.ORDER_ATOMIC]; +} + +const pl_show = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var code = 'pylab.show()\n'; + return code; +} + +const pl_axes = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var code = 'pylab.axes(aspect=1)\n'; + return code; +} + +const pl_plot_easy = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'pylab.plot(' + varName + ")\n"; + return code; +} + +const pl_plot = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'pylab.plot(' + varName + ",'" + dot + line + color + "')\n"; + return code; +} + +const pl_legend = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + generator.definitions_.import_matplotlib_font_manager = "import matplotlib.font_manager"; + var code = 'pylab.legend(' + 'prop=matplotlib.font_manager.FontProperties("' + "STSong" + '")' + ')\n'; + return code; +} + +const pl_title = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var code = 'pylab.title(' + a + ', fontproperties = "' + "STSong" + '")\n'; + return code; +} + +const pl_label = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC); + var code = 'pylab.' + direction + 'label(' + a + ', fontproperties = "' + "STSong" + '")\n'; + return code; +} + +const array_create = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "FROM", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "TO", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "STEP", generator.ORDER_NONE) || "1"; + var code = "numpy.arange(" + from + ", " + end + ", " + step + ")"; + return [code, generator.ORDER_ATOMIC]; +} + +const pl_plot_bar = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.' + direction + '(' + a + ',' + b + ")\n"; + return code; +} + +const pl_plot_scatter = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\'\''; + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.scatter(' + a + ',' + b + ",s=" + s + ",c='" + color + "',marker='" + dot + "',label=" + tag + ")\n"; + return code; +} + +const pl_plot_xy = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.plot(' + a + ',' + b + ",'" + dot + line + color + "'" + ',label=' + tag + ")\n"; + return code; +} + +const pl_bar = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0'; + var color = this.getFieldValue('COLOR') + var align = this.getFieldValue('ALIGN'); + var code = 'pylab.bar(' + a + ',' + b + ',align="' + align + '",color="' + color + '",width=' + width + ',label=' + tag + ")\n"; + return code; +} + +const pl_pie = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\'\''; + var shadow = this.getFieldValue('SHADOW'); + var autopct = this.getFieldValue('autopct'); + if (autopct != 'None') { autopct = "'" + autopct + "'" } + var code = 'pylab.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + ")\n"; + return code; +} + +const pl_hist = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.hist(' + a + ',' + b + ")\n"; + return code; +} + +const pl_ticks = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'pylab.' + direction + 'ticks(' + a + ',' + b + ",fontproperties = '" + "STSong" + "')\n"; + return code; +} + +const numpy_trig = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var argument0 = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0'; + var operator = this.getFieldValue('OP'); + var code = ""; + code = "numpy." + operator + '(' + argument0 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const pl_subplot = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var code = "pylab.subplot(" + from + ", " + end + ", " + step + ")\n"; + return code +} + +const pandas_readcsv = function (_, generator) { + // For each loop. + generator.definitions_.import_pandas = "import pandas"; + var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC); + var mode = this.getFieldValue('MODE'); + var code = 'pandas.read_csv(' + fn + ', header=' + mode + ')\n'; + return [code, generator.ORDER_ATOMIC]; +} + +const dataframe_get = function (_, generator) { + var mode = this.getFieldValue('MODE'); + var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0'; + var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT); + if (mode == "column") { + var code = varName + "[" + text + "]"; + } else if (mode == 'raw') { + var code = varName + ".loc[" + text + "]"; + } + return [code, generator.ORDER_ATOMIC]; +} + +const pl_savefig = function (_, generator) { + generator.definitions_.import_pylab = "import pylab"; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = "pylab.savefig(" + file + ")\n"; + return code; +} + +const pl_text = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var halign = this.getFieldValue('HALIGN'); + var valign = this.getFieldValue('VALIGN'); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var code = "pylab.text(" + from + ", " + end + ", " + step + ", ha='" + halign + "', va='" + valign + "', fontsize=" + fontnum + ")\n"; + return code +} + +const array_toarray = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'; + generator.definitions_['import_numpy'] = 'import numpy'; + var code = 'numpy.array(' + str + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const plot_show = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = 'matplotlib.pyplot.show()\n'; + return code; +} + +const plot_axes = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = 'matplotlib.pyplot.axes(aspect=1)\n'; + return code; +} + +const plot_plot_easy = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'matplotlib.pyplot.plot(' + varName + ")\n"; + return code; +} + +const plot_plot = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0'; + var code = 'matplotlib.pyplot.plot(' + varName + ",'" + dot + line + color + "')\n"; + return code; +} + +const plot_legend = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + generator.definitions_.import_matplotlib_font_manager = "import matplotlib.font_manager"; + var code = 'matplotlib.pyplot.legend(' + 'prop=matplotlib.font_manager.FontProperties("' + "STSong" + '")' + ')\n'; + return code; +} + +const plot_title = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var code = 'matplotlib.pyplot.title(' + a + ')\n'; + return code; +} + +const plot_label = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC); + var code = 'matplotlib.pyplot.' + direction + 'label(' + a + ')\n'; + return code; +} + +const plot_plot_bar = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.' + direction + '(' + a + ',' + b + ")\n"; + return code; +} + +const plot_plot_scatter = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\'\''; + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.scatter(' + a + ',' + b + ",s=" + s + ",color='" + color + "',marker='" + dot + "',label=" + tag + ")\n"; + return code; +} + +const plot_plot_xy = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var line = this.getFieldValue('LINE'); + var color = this.getFieldValue('COLOR'); + var dot = this.getFieldValue('DOT'); + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.plot(' + a + ',' + b + ",'" + dot + line + color + "'" + ',label=' + tag + ")\n"; + return code; +} + +const plot_bar = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\'\''; + var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0'; + var color = this.getFieldValue('COLOR') + var align = this.getFieldValue('ALIGN'); + var code = 'matplotlib.pyplot.bar(' + a + ',' + b + ',align="' + align + '",color="' + color + '",width=' + width + ',label=' + tag + ")\n"; + return code; +} + +const plot_pie = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\'\''; + var shadow = this.getFieldValue('SHADOW'); + var autopct = this.getFieldValue('autopct'); + if (autopct != 'None') { autopct = "'" + autopct + "'" } + var code = 'matplotlib.pyplot.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + ")\n"; + return code; +} + +const plot_hist = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.hist(' + a + ',' + b + ")\n"; + return code; +} + +const plot_ticks = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var direction = this.getFieldValue('DIR'); + var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\'\''; + var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\'\''; + var code = 'matplotlib.pyplot.' + direction + 'ticks(' + a + ',' + b + ",fontproperties = '" + "STSong" + "')\n"; + return code; +} + +const plot_subplot = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var code = "matplotlib.pyplot.subplot(" + from + ", " + end + ", " + step + ")\n"; + return code +} + +const plot_savefig = function (_, generator) { + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var code = "matplotlib.pyplot.savefig('1.png')\n"; + return code; +} + +const plot_text = function (_, generator) { + generator.definitions_.import_numpy = "import numpy"; + generator.definitions_.import_matplotlib_pyplot = "import matplotlib.pyplot"; + var from = generator.valueToCode(this, "VET", generator.ORDER_NONE) || "0"; + var end = generator.valueToCode(this, "HOR", generator.ORDER_NONE) || "0"; + var step = generator.valueToCode(this, "NUM", generator.ORDER_NONE) || "0"; + var halign = this.getFieldValue('HALIGN'); + var valign = this.getFieldValue('VALIGN'); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var code = "matplotlib.pyplot.text(" + from + ", " + end + ", " + step + ", ha='" + halign + "', va='" + valign + "', fontsize=" + fontnum + ")\n"; + return code +} + +/***/ }), + +/***/ "../python_skulpt/generators/inout.js": +/*!********************************************!*\ + !*** ../python_skulpt/generators/inout.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ inout_input: () => (/* binding */ inout_input), +/* harmony export */ inout_print: () => (/* binding */ inout_print), +/* harmony export */ inout_print_end: () => (/* binding */ inout_print_end), +/* harmony export */ inout_print_inline: () => (/* binding */ inout_print_inline), +/* harmony export */ inout_print_many: () => (/* binding */ inout_print_many), +/* harmony export */ inout_type_input: () => (/* binding */ inout_type_input) +/* harmony export */ }); +const inout_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + return ['input(' + str + ')', generator.ORDER_ATOMIC]; +} + +const inout_print = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ")\n"; + return code; +} + +const inout_print_inline = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end ="")\n'; + return code; +} + +const inout_print_end = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var end = generator.valueToCode(this, 'END', generator.ORDER_ATOMIC) || '""'; + var code = "print(" + str + ',end =' + end + ')\n'; + return code; +} + +const inout_type_input = function (_, generator) { + var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""'; + var type = this.getFieldValue('DIR'); + if (type == 'str') { var code = 'input(' + str + ')' } + else if (type == 'int') { var code = 'int(input(' + str + '))' } + else if (type == 'float') { var code = 'float(input(' + str + '))' } + //var code=varname+"." + type + "(" + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const inout_print_many = function (_, generator) { + var code = new Array(this.itemCount_); + var default_value = '0'; + for (var n = 0; n < this.itemCount_; n++) { + code[n] = generator.valueToCode(this, 'ADD' + n, + generator.ORDER_NONE) || default_value; + } + var code = 'print(' + code.join(', ') + ')\n'; + return code; +} + +/***/ }), + +/***/ "../python_skulpt/generators/system.js": +/*!*********************************************!*\ + !*** ../python_skulpt/generators/system.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ controls_end_program: () => (/* binding */ controls_end_program), +/* harmony export */ controls_millis: () => (/* binding */ controls_millis), +/* harmony export */ time_localtime: () => (/* binding */ time_localtime) +/* harmony export */ }); +const controls_millis = function (_, generator) { + generator.definitions_.import_time = "import time"; + var code = 'time.time()'; + return [code, generator.ORDER_ATOMIC]; +} + +const controls_end_program = function () { + return 'exit()\n'; +} + +const time_localtime = function (_, generator) { + generator.definitions_.import_time = "import time"; + var op = this.getFieldValue('op'); + var code = "time.localtime()[" + op + "]"; + switch (op) { + case "all": + var code1 = "time.localtime()"; + return [code1, generator.ORDER_ASSIGNMENT]; + default: + return [code, generator.ORDER_ASSIGNMENT]; + } +} + +/***/ }), + +/***/ "../python_skulpt/generators/turtle.js": +/*!*********************************************!*\ + !*** ../python_skulpt/generators/turtle.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ turtle_bgcolor: () => (/* binding */ turtle_bgcolor), +/* harmony export */ turtle_bgcolor_hex: () => (/* binding */ turtle_bgcolor_hex), +/* harmony export */ turtle_bgcolor_hex_new: () => (/* binding */ turtle_bgcolor_hex_new), +/* harmony export */ turtle_circle: () => (/* binding */ turtle_circle), +/* harmony export */ turtle_circle_advanced: () => (/* binding */ turtle_circle_advanced), +/* harmony export */ turtle_clear: () => (/* binding */ turtle_clear), +/* harmony export */ turtle_clone: () => (/* binding */ turtle_clone), +/* harmony export */ turtle_color: () => (/* binding */ turtle_color), +/* harmony export */ turtle_color_hex: () => (/* binding */ turtle_color_hex), +/* harmony export */ turtle_color_seclet: () => (/* binding */ turtle_color_seclet), +/* harmony export */ turtle_create: () => (/* binding */ turtle_create), +/* harmony export */ turtle_done: () => (/* binding */ turtle_done), +/* harmony export */ turtle_exitonclick: () => (/* binding */ turtle_exitonclick), +/* harmony export */ turtle_fill: () => (/* binding */ turtle_fill), +/* harmony export */ turtle_fillcolor: () => (/* binding */ turtle_fillcolor), +/* harmony export */ turtle_fillcolor_hex: () => (/* binding */ turtle_fillcolor_hex), +/* harmony export */ turtle_fillcolor_hex_new: () => (/* binding */ turtle_fillcolor_hex_new), +/* harmony export */ turtle_getscreen: () => (/* binding */ turtle_getscreen), +/* harmony export */ turtle_goto: () => (/* binding */ turtle_goto), +/* harmony export */ turtle_listen: () => (/* binding */ turtle_listen), +/* harmony export */ turtle_move: () => (/* binding */ turtle_move), +/* harmony export */ turtle_numinput: () => (/* binding */ turtle_numinput), +/* harmony export */ turtle_onclick: () => (/* binding */ turtle_onclick), +/* harmony export */ turtle_onkey: () => (/* binding */ turtle_onkey), +/* harmony export */ turtle_ontimer: () => (/* binding */ turtle_ontimer), +/* harmony export */ turtle_pencolor: () => (/* binding */ turtle_pencolor), +/* harmony export */ turtle_pencolor_hex: () => (/* binding */ turtle_pencolor_hex), +/* harmony export */ turtle_pencolor_hex_new: () => (/* binding */ turtle_pencolor_hex_new), +/* harmony export */ turtle_penup: () => (/* binding */ turtle_penup), +/* harmony export */ turtle_pos_shape: () => (/* binding */ turtle_pos_shape), +/* harmony export */ turtle_rotate: () => (/* binding */ turtle_rotate), +/* harmony export */ turtle_screen_delay: () => (/* binding */ turtle_screen_delay), +/* harmony export */ turtle_screen_savefig: () => (/* binding */ turtle_screen_savefig), +/* harmony export */ turtle_setheading: () => (/* binding */ turtle_setheading), +/* harmony export */ turtle_setxy: () => (/* binding */ turtle_setxy), +/* harmony export */ turtle_shape: () => (/* binding */ turtle_shape), +/* harmony export */ turtle_shapesize: () => (/* binding */ turtle_shapesize), +/* harmony export */ turtle_size: () => (/* binding */ turtle_size), +/* harmony export */ turtle_size_speed: () => (/* binding */ turtle_size_speed), +/* harmony export */ turtle_speed: () => (/* binding */ turtle_speed), +/* harmony export */ turtle_stamp: () => (/* binding */ turtle_stamp), +/* harmony export */ turtle_textinput: () => (/* binding */ turtle_textinput), +/* harmony export */ turtle_visible: () => (/* binding */ turtle_visible), +/* harmony export */ turtle_write: () => (/* binding */ turtle_write), +/* harmony export */ turtle_write_format: () => (/* binding */ turtle_write_format), +/* harmony export */ turtle_write_format_skulpt: () => (/* binding */ turtle_write_format_skulpt) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +const turtle_create = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + //var size=window.parseFloat(this.getFieldValue('SIZE')); + //generator.definitions_['var_declare'+varName] = varName+'= '+ 'turtle.Turtle()\n'; + var code = varName + ' = ' + 'turtle.Turtle()\n'; + return code; + // return ''; +} + +const turtle_done = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.done()\n'; + return code; +} + +const turtle_exitonclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var code = 'turtle.exitonclick()\n'; + return code; +} + +const turtle_move = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +const turtle_rotate = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + direction + "(" + num + ')\n'; + return code; +} + +const turtle_setheading = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.setheading(' + argument + ')\n'; + return code; +} + +const turtle_screen_delay = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.screen.delay(' + argument + ')\n'; + return code; +} + +const turtle_goto = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xnum = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var ynum = generator.valueToCode(this, 'val', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.goto(' + xnum + ',' + ynum + ')\n'; + return code; +} + +const turtle_pos_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var get = this.getFieldValue('DIR'); + var code = varName + '.' + get + '()'; + return [code, generator.ORDER_ATOMIC]; +} + +const turtle_clear = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var clear = this.getFieldValue('DIR'); + var code = varName + "." + clear + "(" + ')\n'; + return code; +} + +const turtle_penup = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "(" + ')\n'; + return code; +} + +const turtle_fill = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var penup = this.getFieldValue('DIR'); + var code = varName + "." + penup + "_fill(" + ')\n'; + return code; +} + +const turtle_size_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = this.getFieldValue('TUR'); + var size = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + size + "(" + num + ')\n'; + return code; +} + +const turtle_size = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.pensize(' + argument + ')\n'; + return code; +} + +const turtle_speed = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.speed(' + argument + ')\n'; + return code; +} + +const turtle_circle = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var circle = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + circle + "(" + num + ')\n'; + return code; +} + +const turtle_setxy = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var xy = this.getFieldValue('DIR'); + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".set" + xy + "(" + num + ')\n'; + return code; +} + +const turtle_circle_advanced = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + ".circle (" + num + ',' + argument + ')\n'; + return code; +} + +const turtle_visible = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var visible = this.getFieldValue('DIR'); + var code = varName + "." + visible + "(" + ')\n'; + return code; +} + +const turtle_bgcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = this.getFieldValue('FIELDNAME'); + var code = "turtle." + 'bgcolor' + '("' + color + '")\n'; + return code; +} + +const turtle_pencolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'pencolor' + '("' + color + '")\n'; + return code; +} + +const turtle_fillcolor = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = this.getFieldValue('FIELDNAME'); + var code = varName + "." + 'fillcolor' + '("' + color + '")\n'; + return code; +} + +const turtle_clone = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.clone()'; + return [code, generator.ORDER_ATOMIC]; +} + +const turtle_bgcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +const turtle_pencolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +const turtle_fillcolor_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +const turtle_bgcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = "turtle." + 'bgcolor' + '(' + color + ')\n'; + return code; +} + +const turtle_pencolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'pencolor' + '(' + color + ')\n'; + return code; +} + +const turtle_fillcolor_hex_new = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'fillcolor' + '(' + color + ')\n'; + return code; +} + +const turtle_color_hex = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC); + var color2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC); + var code = varName + "." + 'color' + '(' + color1 + ',' + color2 + ')\n'; + return code; +} + +const turtle_color = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var color1 = this.getFieldValue('FIELDNAME'); + var color2 = this.getFieldValue('FIELDNAME2'); + var code = varName + "." + 'color' + '("' + color1 + '","' + color2 + '")\n'; + return code; +} + +const turtle_shape = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var direction = this.getFieldValue('DIR'); + + var code = varName + ".shape('" + direction + "')\n"; + return code; +} + +const turtle_shapesize = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var argument1 = generator.valueToCode(this, 'WID', generator.ORDER_ASSIGNMENT) || '0'; + var argument2 = generator.valueToCode(this, 'LEN', generator.ORDER_ASSIGNMENT) || '0'; + var argument3 = generator.valueToCode(this, 'OUTLINE', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + ".shapesize(" + argument1 + ',' + argument2 + ',' + argument3 + ')\n'; + return code; +} + +const turtle_textinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var code = "turtle.textinput" + '(' + title + ',' + prompt + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const turtle_numinput = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC); + var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC); + var data = generator.valueToCode(this, 'DEFAULT', generator.ORDER_ATOMIC); + var min = generator.valueToCode(this, 'MIN', generator.ORDER_ATOMIC); + var max = generator.valueToCode(this, 'MAX', generator.ORDER_ATOMIC); + var code = "turtle.numinput" + '(' + title + ',' + prompt + "," + data + ',minval = ' + min + ',maxval = ' + max + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +const turtle_write = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + "." + 'write' + '(' + write + ')\n'; + return code; +} + +const turtle_write_format = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +const turtle_write_format_skulpt = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var move = this.getFieldValue('MOVE'); + var align = this.getFieldValue('ALIGN'); + var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC); + var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0'; + var fonttype = this.getFieldValue('FONTTYPE'); + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var code = varName + "." + 'write' + '(' + write + ',' + move + ',align="' + align + '",font=(' + fontname + ',' + fontnum + ',"' + fonttype + '"))\n'; + return code; +} + +const turtle_color_seclet = function (_, generator) { + var colour = this.getFieldValue('COLOR'); + var code = '"' + colour + '"' + return [code, generator.ORDER_ATOMIC]; +} + +const turtle_getscreen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var turName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables.NAME_TYPE); + var code = varName + ' = ' + turName + '.getscreen()\n'; + return code; +} + +const turtle_onkey = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onkey(" + callback + ", " + v + ")\n"; + return code; +} + +const turtle_onclick = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".onclick(" + callback + ")\n"; + return code; +} + +const turtle_ontimer = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None"; + var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None"; + var code = varName + ".ontimer(" + callback + ", " + v + ")\n"; + return code; +} + +const turtle_listen = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.listen()\n'; + return code; +} + +const turtle_screen_savefig = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC); + var code = varName + ".getcanvas().postscript(file=" + file + ")\n"; + return code; +} + +const turtle_stamp = function (_, generator) { + generator.definitions_.import_turtle = "import turtle"; + var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0'; + var code = varName + '.stamp()\n'; + return code; +} + +/***/ }), + +/***/ "./blocks/game.js": +/*!************************!*\ + !*** ./blocks/game.js ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Turn: () => (/* binding */ Turn), +/* harmony export */ addOil: () => (/* binding */ addOil), +/* harmony export */ game_get_character_img: () => (/* binding */ game_get_character_img), +/* harmony export */ game_get_local_img: () => (/* binding */ game_get_local_img), +/* harmony export */ game_get_path_img: () => (/* binding */ game_get_path_img), +/* harmony export */ game_init: () => (/* binding */ game_init), +/* harmony export */ get_actor_point: () => (/* binding */ get_actor_point), +/* harmony export */ initSettedMap_1: () => (/* binding */ initSettedMap_1), +/* harmony export */ initSettedMap_2: () => (/* binding */ initSettedMap_2), +/* harmony export */ initSettedMap_3: () => (/* binding */ initSettedMap_3), +/* harmony export */ initSettedMap_4: () => (/* binding */ initSettedMap_4), +/* harmony export */ initSettedMap_5: () => (/* binding */ initSettedMap_5), +/* harmony export */ initSettedMap_6: () => (/* binding */ initSettedMap_6), +/* harmony export */ initSettedMap_7: () => (/* binding */ initSettedMap_7), +/* harmony export */ initialize: () => (/* binding */ initialize), +/* harmony export */ isBarrier: () => (/* binding */ isBarrier), +/* harmony export */ isCirculationRight: () => (/* binding */ isCirculationRight), +/* harmony export */ isDone: () => (/* binding */ isDone), +/* harmony export */ isLightGreen: () => (/* binding */ isLightGreen), +/* harmony export */ isLightRed: () => (/* binding */ isLightRed), +/* harmony export */ isOilFull: () => (/* binding */ isOilFull), +/* harmony export */ isPath: () => (/* binding */ isPath), +/* harmony export */ move_direction_steps: () => (/* binding */ move_direction_steps), +/* harmony export */ place_item: () => (/* binding */ place_item), +/* harmony export */ randomOil: () => (/* binding */ randomOil), +/* harmony export */ set_map: () => (/* binding */ set_map), +/* harmony export */ set_pathtype: () => (/* binding */ set_pathtype) +/* harmony export */ }); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); + + +//初始化地图为第1关 +const initSettedMap_1 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第一关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第2关 +const initSettedMap_2 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第二关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第3关 +const initSettedMap_3 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第三关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第4关 +const initSettedMap_4 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第四关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第5关 +const initSettedMap_5 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第五关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第6关 +const initSettedMap_6 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第六关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +//初始化地图为第7关 +const initSettedMap_7 = { + init: function () { + this.appendDummyInput() + .appendField("初始化地图为第七关") + this.setInputsInline(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +const game_init = { + init: function () { + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + this.appendStatementInput('DO0') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_INIT); + } +}; + + +const move_direction_steps = { + init: function () { + this.appendDummyInput() + .appendField("向") + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([["东", '1'], ["南", '2'], ["西", '3'], ["北", '0']]), "direction"); + this.appendDummyInput() + .appendField("移动"); + this.appendValueInput("times") + .setCheck(Number) + this.appendDummyInput() + .appendField("步"); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +const Turn = { + init: function () { + var Directions = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_Turn_LEFT, 'left'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_Turn_RIGHT, 'right'] + ]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_TURN1) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(Directions), 'Direction') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_TURN2); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const isDone = { + init: function () { + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_ISDONE); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const isPath = { + init: function () { + var Directions = [ + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_ISPATH_LEFT, 'left'], + [blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_ISPATH_RIGHT, 'right'] + ]; + this.appendDummyInput() + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_ISPATH1) + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(Directions), 'Direction') + .appendField(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Msg.MIXLY_GAME_ISPATH2); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +//最新块 +const set_map = { + init: function () { + // this.appendDummyInput() + // .appendField("设置地图:长"); + this.appendValueInput("x") + .setCheck(Number) + .appendField("设置地图,长为:"); + this.appendValueInput("y") + .setCheck(Number) + .appendField("宽为:"); + this.appendValueInput("startPos") + .setCheck(null) + .appendField(",起点坐标"); + this.appendValueInput("endPos") + .setCheck(null) + .appendField("终点坐标"); + this.appendValueInput("background") + .setCheck(null) + .appendField("背景"); + // this.appendDummyInput() + // .appendField(",背景") + // .appendField(new Blockly.FieldDropdown([["背景1","3"],["背景2","4"]]), "bg"); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const game_get_local_img = { + init: function () { + this.imgArr = this.getLocalImg(); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.getLocalImg()), "type"); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + }, + onchange: function () { + let typeValue = this.getFieldValue("type"); + //let newImgArr = this.getLocalImg(); + let newImgArr = this.imgArr; + if (this.haveNewSrc(this.imgArr, newImgArr)) { + this.imgArr = newImgArr; + var typeField = this.getField("type"); + typeField.menuGenerator_ = this.imgArr; + if (this.checkSrc(typeValue, this.imgArr)) { + this.setFieldValue(typeValue, "type"); + } else { + this.setFieldValue(this.imgArr[0][1], "type"); + } + } + }, + haveNewSrc: function (oldArr, newArr) { + if (oldArr.length !== newArr.length) return true; + for (var i = 0; i < oldArr.length; i++) { + if (oldArr[i][0].src !== newArr[i][0].src) { + return true; + } + } + return false; + }, + checkSrc: function (newSrc, srcArr) { + for (var i = 0; i < srcArr.length; i++) { + if (srcArr[i][0].src == newSrc) { + return true; + } + } + return false; + }, + getLocalImg: function () { + let imgArr = []; + try { + var imgDirArr = ["bg_default.png", "bg_astro.png", "bg_panda.jpg"] + for (var i = 0; i < imgDirArr.length; i++) { + var dropdownItem = {}; + dropdownItem.src = "./media/mixpyBuild/maps/" + imgDirArr[i]; + dropdownItem.width = 40; + dropdownItem.height = 45; + if (imgDirArr[i] == "") { + dropdownItem.alt = "无"; + } else { + dropdownItem.alt = "*"; + } + var dropdownArr = []; + dropdownArr.push(dropdownItem); + var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(".")); + dropdownData = '\'' + dropdownData + '\''; + dropdownArr.push(dropdownData); + imgArr.push(dropdownArr); + } + } catch (e) { + console.log(e); + imgArr = [["'无可用地图'", "'无可用地图'"]]; + } + if (imgArr.length > 0) { + return imgArr; + } + return [["'无可用地图'", "'无可用地图'"]]; + } +}; + + +const set_pathtype = { + init: function () { + this.appendValueInput("pathtype") + .setCheck(null) + .appendField("设置路径样式为"); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const game_get_path_img = { + init: function () { + this.imgArr = this.getLocalImg(); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.getLocalImg()), "type"); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + }, + onchange: function () { + let typeValue = this.getFieldValue("type"); + //let newImgArr = this.getLocalImg(); + let newImgArr = this.imgArr; + if (this.haveNewSrc(this.imgArr, newImgArr)) { + this.imgArr = newImgArr; + var typeField = this.getField("type"); + typeField.menuGenerator_ = this.imgArr; + if (this.checkSrc(typeValue, this.imgArr)) { + this.setFieldValue(typeValue, "type"); + } else { + this.setFieldValue(this.imgArr[0][1], "type"); + } + } + }, + haveNewSrc: function (oldArr, newArr) { + if (oldArr.length !== newArr.length) return true; + for (var i = 0; i < oldArr.length; i++) { + if (oldArr[i][0].src !== newArr[i][0].src) { + return true; + } + } + return false; + }, + checkSrc: function (newSrc, srcArr) { + for (var i = 0; i < srcArr.length; i++) { + if (srcArr[i][0].src == newSrc) { + return true; + } + } + return false; + }, + getLocalImg: function () { + let imgArr = []; + try { + var imgDirArr = ["default.png", "bamboo.png", "pipeline.png"] + for (var i = 0; i < imgDirArr.length; i++) { + var dropdownItem = {}; + dropdownItem.src = "./media/mixpyBuild/path/" + imgDirArr[i]; + dropdownItem.width = 40; + dropdownItem.height = 45; + dropdownItem.alt = "*"; + var dropdownArr = []; + dropdownArr.push(dropdownItem); + var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(".")); + dropdownData = '\'' + dropdownData + '\''; + dropdownArr.push(dropdownData); + imgArr.push(dropdownArr); + } + } catch (e) { + console.log(e); + imgArr = [["'无可用路径'", "'无可用路径'"]]; + } + if (imgArr.length > 0) { + return imgArr; + } + return [["'无可用路径'", "'无可用路径'"]]; + } +}; + +const place_item = { + init: function () { + this.setColour(290); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.appendValueInput("posx") + .setCheck(null) + .appendField("在("); + this.appendDummyInput() + .appendField(','); + this.appendValueInput("posy") + .setCheck(null) + .appendField(""); + this.appendDummyInput() + .appendField(')放置') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([["障碍", "'wall'"], ["金币", "'coin'"]]), "item"); + this.setTooltip(''); + } +}; + +const game_get_character_img = { + init: function () { + this.imgArr = this.getLocalImg(); + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown(this.getLocalImg()), "type"); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + }, + onchange: function () { + let typeValue = this.getFieldValue("type"); + //let newImgArr = this.getLocalImg(); + let newImgArr = this.imgArr; + if (this.haveNewSrc(this.imgArr, newImgArr)) { + this.imgArr = newImgArr; + var typeField = this.getField("type"); + typeField.menuGenerator_ = this.imgArr; + if (this.checkSrc(typeValue, this.imgArr)) { + this.setFieldValue(typeValue, "type"); + } else { + this.setFieldValue(this.imgArr[0][1], "type"); + } + } + }, + haveNewSrc: function (oldArr, newArr) { + if (oldArr.length !== newArr.length) return true; + for (var i = 0; i < oldArr.length; i++) { + if (oldArr[i][0].src !== newArr[i][0].src) { + return true; + } + } + return false; + }, + checkSrc: function (newSrc, srcArr) { + for (var i = 0; i < srcArr.length; i++) { + if (srcArr[i][0].src == newSrc) { + return true; + } + } + return false; + }, + getLocalImg: function () { + let imgArr = []; + try { + var imgDirArr = ["pegman.png", "astro.png", "panda.png", "robot.png"] + for (var i = 0; i < imgDirArr.length; i++) { + var dropdownItem = {}; + dropdownItem.src = "./media/mixpyBuild/characters/" + imgDirArr[i]; + dropdownItem.width = 40; + dropdownItem.height = 45; + dropdownItem.alt = "*"; + var dropdownArr = []; + dropdownArr.push(dropdownItem); + var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(".")); + dropdownData = '\'' + dropdownData + '\''; + dropdownArr.push(dropdownData); + imgArr.push(dropdownArr); + } + + + } catch (e) { + console.log(e); + imgArr = [["'无可用角色'", "'无可用角色'"]]; + } + if (imgArr.length > 0) { + return imgArr; + } + return [["'无可用角色'", "'无可用角色'"]]; + } +}; + + +const initialize = { + init: function () { + this.setColour(290); + this.appendValueInput("character") + .setCheck(null) + .appendField("初始化角色为"); + this.appendDummyInput() + // .appendField('初始化角色为') + // .appendField(new Blockly.FieldDropdown([["默认⼩⼈","0"],["熊猫","1"],["宇航员","2"],["机器⼈","3"]]), "character") + .appendField('面朝') + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([["北", "0"], ["南", "2"], ["西", "3"], ["东", "1"]]), "direction"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(''); + } +}; + +const get_actor_point = { + init: function () { + this.setColour(290); + this.appendDummyInput() + .appendField('获取⻆⾊所获分数'); + this.setOutput(true, Number); + this.setTooltip(''); + } +}; + +const isBarrier = { + init: function () { + this.appendDummyInput() + .appendField(new blockly_core__WEBPACK_IMPORTED_MODULE_0__.FieldDropdown([["北", "0"], ["南", "2"], ["西", "3"], ["东", "1"]]), "direction"); + this.appendDummyInput() + .appendField('侧有障碍'); + this.setInputsInline(true); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const randomOil = { + init: function () { + this.appendDummyInput() + .appendField("随机生成小车油量"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +const isOilFull = { + init: function () { + this.appendDummyInput() + .appendField('需要加油'); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const isLightGreen = { + init: function () { + this.appendDummyInput() + .appendField('信号灯为绿灯'); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const isLightRed = { + init: function () { + this.appendDummyInput() + .appendField('信号灯为红灯'); + this.setOutput(true, null); + this.setColour(290); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; + +const addOil = { + init: function () { + this.appendDummyInput() + .appendField("进加油站加油"); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +const isCirculationRight = { + init: function () { + this.appendDummyInput() + .appendField("检查程序循环数目是否正确"); + this.setPreviousStatement(true); + this.setColour(290); + this.setTooltip(''); + } +}; + +/***/ }), + +/***/ "./generators/game.js": +/*!****************************!*\ + !*** ./generators/game.js ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Turn: () => (/* binding */ Turn), +/* harmony export */ addOil: () => (/* binding */ addOil), +/* harmony export */ game_get_character_img: () => (/* binding */ game_get_character_img), +/* harmony export */ game_get_local_img: () => (/* binding */ game_get_local_img), +/* harmony export */ game_get_path_img: () => (/* binding */ game_get_path_img), +/* harmony export */ game_init: () => (/* binding */ game_init), +/* harmony export */ get_actor_point: () => (/* binding */ get_actor_point), +/* harmony export */ initSettedMap_1: () => (/* binding */ initSettedMap_1), +/* harmony export */ initSettedMap_2: () => (/* binding */ initSettedMap_2), +/* harmony export */ initSettedMap_3: () => (/* binding */ initSettedMap_3), +/* harmony export */ initSettedMap_4: () => (/* binding */ initSettedMap_4), +/* harmony export */ initSettedMap_5: () => (/* binding */ initSettedMap_5), +/* harmony export */ initSettedMap_6: () => (/* binding */ initSettedMap_6), +/* harmony export */ initSettedMap_7: () => (/* binding */ initSettedMap_7), +/* harmony export */ initialize: () => (/* binding */ initialize), +/* harmony export */ isBarrier: () => (/* binding */ isBarrier), +/* harmony export */ isCirculationRight: () => (/* binding */ isCirculationRight), +/* harmony export */ isDone: () => (/* binding */ isDone), +/* harmony export */ isLightGreen: () => (/* binding */ isLightGreen), +/* harmony export */ isLightRed: () => (/* binding */ isLightRed), +/* harmony export */ isOilFull: () => (/* binding */ isOilFull), +/* harmony export */ isPath: () => (/* binding */ isPath), +/* harmony export */ move_direction_steps: () => (/* binding */ move_direction_steps), +/* harmony export */ place_item: () => (/* binding */ place_item), +/* harmony export */ randomOil: () => (/* binding */ randomOil), +/* harmony export */ set_map: () => (/* binding */ set_map), +/* harmony export */ set_pathtype: () => (/* binding */ set_pathtype) +/* harmony export */ }); +const game_init = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = generator.statementToCode(block, "DO0") + 'blocklygame.initMap(\'block_id=' + block.id + '\');\n' + + var code_piece = []; + code_piece = code.split("\n"); + for (var i = 0; i < code_piece.length; i++) { + if ((code_piece[i].indexOf(" ") >= 0)) { + code_piece[i] = code_piece[i].replace(" ", ""); + } + } + code = "" + for (var i = 0; i < code_piece.length; i++) { + code += code_piece[i] + '\n' + } + return code; +} + +// export const move_direction = function(block) { +// generator.definitions_.import_blocklygame = "import blocklygame"; +// var Direction = this.getFieldValue('direction'); +// return 'actor.moveDirection('+Direction+',\'block_id=' + block.id + '\');\n'; +// } + +const move_direction_steps = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var times = generator.valueToCode(this, 'times', generator.ORDER_ATOMIC); + var Direction = this.getFieldValue('direction'); + var d = 'actor.moveDirection(' + Direction + ',\'block_id=' + block.id + '\');\n', + d = generator.addLoopTrap(d, block.id) || generator.PASS; + return 'for _my_variable in range(' + times + '):\n\t' + d; +} + +const initSettedMap_1 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(0,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +const initSettedMap_2 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(1,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +const initSettedMap_3 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(2,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +const initSettedMap_4 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(3,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n' + 'actor.randomOil(\'block_id=' + block.id + '\');\n'; +} + +const initSettedMap_5 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(4,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +const initSettedMap_6 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(5,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +const initSettedMap_7 = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'blocklygame.settedMap(6,\'block_id=' + block.id + '\');\n' + 'actor=blocklygame.Actor(\'car\',2);\n'; +} + +// export const move_forward = function(block) { +// generator.definitions_.import_blocklygame = "import blocklygame"; +// return 'actor.moveForward(\'block_id=' + block.id + '\');\n'; +// } + +// export const move_backward = function(block) { +// generator.definitions_.import_blocklygame = "import blocklygame"; +// var code = 'actor.moveBackward(\'block_id=' + block.id + '\');\n'; +// return code; +// } + +const Turn = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var dropdown_Direction = this.getFieldValue('Direction'); + var code = 'actor.turn(\'' + dropdown_Direction + "','block_id=" + block.id + '\');\n'; + return code; +} + +const isDone = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.isDone(\'block_id=' + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const isPath = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var dropdown_Direction = this.getFieldValue('Direction'); + var code = 'actor.isPath(\'' + dropdown_Direction + "','block_id=" + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +// 从这里开始是新的块 +const get_actor_point = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.getPoint(\'block_id=' + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const game_get_local_img = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +const set_map = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var value_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC); + var value_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC); + var startPos = generator.valueToCode(this, 'startPos', generator.ORDER_ATOMIC); + var endPos = generator.valueToCode(this, 'endPos', generator.ORDER_ATOMIC); + var bg_pic = generator.valueToCode(this, 'background', generator.ORDER_ATOMIC); + + return 'blocklygame.setMap(' + value_x + ',' + value_y + ',' + startPos + ',' + endPos + ',' + bg_pic + ",'block_id=" + block.id + '\');\n'; +} + +const game_get_character_img = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +const initialize = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + // var value_character = this.getFieldValue('character'); + var value_direction = this.getFieldValue('direction'); + var value_character = generator.valueToCode(this, 'character', generator.ORDER_ATOMIC); + return 'actor=blocklygame.Actor(' + value_character + ',' + value_direction + ",'block_id=" + block.id + '\');\n'; +} + +const place_item = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var value_posx = generator.valueToCode(this, 'posx', generator.ORDER_ATOMIC); + var value_posy = generator.valueToCode(this, 'posy', generator.ORDER_ATOMIC); + var value_item = this.getFieldValue('item'); + return 'blocklygame.placeItem(' + value_posx + ',' + value_posy + ',' + value_item + ",'block_id=" + block.id + '\');\n'; +} + +const game_get_path_img = function (_, generator) { + var dropdown_type = this.getFieldValue('type'); + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = dropdown_type; + return [code, generator.ORDER_ATOMIC]; +} + +const set_pathtype = function (block, generator) { + generator.definitions_['import_blocklygame'] = 'import blocklygame'; + var path_type = generator.valueToCode(this, 'pathtype', generator.ORDER_ATOMIC); + return 'blocklygame.setPathType(' + path_type + ",'block_id=" + block.id + '\');\n'; + // return 'actor.getPoint();\n'; +} + +const isBarrier = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var dropdown_Direction = this.getFieldValue('direction'); + var code = 'actor.isBarrier(' + dropdown_Direction + ",'block_id=" + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const randomOil = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + return 'actor.randomOil(\'block_id=' + block.id + '\');\n'; +} + +const isOilFull = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.isOilFull(\'block_id=' + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const isLightGreen = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.isLightGreen(\'block_id=' + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const isLightRed = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'not actor.isLightGreen(\'block_id=' + block.id + '\')'; + return [code, generator.ORDER_ATOMIC]; +} + +const addOil = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.addOil(\'block_id=' + block.id + '\');\n'; + return code; +} + +const isCirculationRight = function (block, generator) { + generator.definitions_.import_blocklygame = "import blocklygame"; + var code = 'actor.isCirculationRight(\'block_id=' + block.id + '\');\n'; + return code; +} + +/***/ }), + +/***/ "./others/loader.js": +/*!**************************!*\ + !*** ./others/loader.js ***! + \**************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _nav_ext__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nav-ext */ "./others/nav-ext.js"); + + +_nav_ext__WEBPACK_IMPORTED_MODULE_0__["default"].init(); + +/***/ }), + +/***/ "./others/mixpy-project.js": +/*!*********************************!*\ + !*** ./others/mixpy-project.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ MixpyProject) +/* harmony export */ }); +class MixpyProject { + constructor() { + this.initProject(); + } + + initProject() { + this.fileD = {}; + this.MAINF = 'main.py'; + this.fileD[this.MAINF] = ["", true, 1]; + this.selectFile = this.MAINF; + } + + add(file, filecontent, filetype) { + if (this.exist(file)) { + console.log("Warning:file already in project"); + return; + } + this.fileD[file] = [filecontent, false, filetype]; + } + + delete(file) { + delete this.fileD[file]; + this.selectFile = undefined; + } + + getProject() { + return Object.keys(this.fileD); + } + + getUploadFileList() { + var fileNameList = Object.keys(this.fileD); + var ret = []; + for (var i in fileNameList) { + if (this.fileD[fileNameList[i]][2] === 2) + ret.push(fileNameList[i]); + } + return ret; + } + + getNewFileList() { + var fileNameList = Object.keys(this.fileD); + var ret = []; + for (var i in fileNameList) { + if (this.fileD[fileNameList[i]][2] === 1) + ret.push(fileNameList[i]); + } + return ret; + } + + isSelect(f) { + return this.fileD[f][1]; + } + + select(f) { + // if (this.selectFile !== undefined) { + // this.modify(this.selectFile, mixlyjs.getCodeContent()); + // this.fileD[this.selectFile][1] = false; + // } + this.fileD[f][1] = true; + // this.selectFile = f; + // var suffix = mixlyjs.getFileSuffix(f); + // var textFileSuffix = ["py", "txt", "csv", "xml"]; + // if (textFileSuffix.indexOf(suffix) !== -1) { + // tabClick('arduino'); + // mixlyjs.renderIno(this.fileD[f][0]); + // } else { + // var base64str = 'data:image/' + suffix + ';base64,' + this.fileD[f][0]; + // $('#mixpy_show_image').attr('src', base64str); + // mixlyjs.renderIno(this.fileD[f][0]); + // tabClick('image'); + // var $imageA = $('#mixpy_link_image'); + // $imageA.attr('href', base64str); + // $imageA.attr('download', f); + // } + } + + getFileNum() { + var files = Object.keys(this.fileD); + return files.length; + } + + getFileContent(f) { + return this.fileD[f][0]; + } + + getFileType(f) { + return this.fileD[f][2]; + } + + modify(f, content) { + this.fileD[f][0] = content; + } + + exist(f) { + return f in this.fileD; + } +} + +/***/ }), + +/***/ "./others/nav-ext.js": +/*!***************************!*\ + !*** ./others/nav-ext.js ***! + \***************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _python_shell__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./python-shell */ "./others/python-shell.js"); +/* harmony import */ var _templates_html_level_selector_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../templates/html/level-selector.html */ "./templates/html/level-selector.html"); + + + + + + + +const NavExt = {}; +const LEVELS = [ + ` + + `, + ` + + `, + ` + + `, + ` + + `, + ` + + `, + ` + + `, + ` + + ` +]; +NavExt.$shadow = jquery__WEBPACK_IMPORTED_MODULE_0___default()('
'); +NavExt.count = 0; + +NavExt.init = function () { + _python_shell__WEBPACK_IMPORTED_MODULE_3__["default"].init(); + const nav = mixly__WEBPACK_IMPORTED_MODULE_2__.app.getNav(); + + nav.register({ + icon: 'icon-play-circled', + title: '', + id: 'python-steprun-btn', + displayText: blockly_core__WEBPACK_IMPORTED_MODULE_1__.Msg.MSG['step_run'], + preconditionFn: () => { + return true; + }, + callback: () => { + _python_shell__WEBPACK_IMPORTED_MODULE_3__["default"].steprun().catch(mixly__WEBPACK_IMPORTED_MODULE_2__.Debug.error); + }, + scopeType: mixly__WEBPACK_IMPORTED_MODULE_2__.Nav.Scope.LEFT, + weight: 4 + }); + + nav.register({ + icon: 'icon-play-circled', + title: '', + id: 'python-run-btn', + displayText: blockly_core__WEBPACK_IMPORTED_MODULE_1__.Msg.MSG['run'], + preconditionFn: () => { + return true; + }, + callback: () => { + _python_shell__WEBPACK_IMPORTED_MODULE_3__["default"].run().catch(mixly__WEBPACK_IMPORTED_MODULE_2__.Debug.error); + }, + scopeType: mixly__WEBPACK_IMPORTED_MODULE_2__.Nav.Scope.LEFT, + weight: 5 + }); + + nav.register({ + icon: 'icon-cancel', + title: '', + id: 'python-stop-btn', + displayText: blockly_core__WEBPACK_IMPORTED_MODULE_1__.Msg.MSG['stop'], + preconditionFn: () => { + return true; + }, + callback: () => { + _python_shell__WEBPACK_IMPORTED_MODULE_3__["default"].stop().catch(mixly__WEBPACK_IMPORTED_MODULE_2__.Debug.error); + }, + scopeType: mixly__WEBPACK_IMPORTED_MODULE_2__.Nav.Scope.LEFT, + weight: 6 + }); + + const template = new mixly__WEBPACK_IMPORTED_MODULE_2__.HTMLTemplate(_templates_html_level_selector_html__WEBPACK_IMPORTED_MODULE_4__); + const $selector = jquery__WEBPACK_IMPORTED_MODULE_0___default()(template.render()); + nav.getBoardSelector().before($selector); + $selector.select2({ + width: '90px', + minimumResultsForSearch: Infinity, + dropdownCssClass: `mixly-scrollbar mixly-${template.getId()}`, + dropdownAutoWidth: true, + placeholder: '', + language: mixly__WEBPACK_IMPORTED_MODULE_2__.Msg.nowLang + }); + for (let i = 0; i < LEVELS.length; i++) { + const option = new Option(`关卡 ${i + 1}`, i); + $selector.append(option); + } + $selector.on('select2:select', (event) => { + const { data } = event.params; + const mainWorkspace = mixly__WEBPACK_IMPORTED_MODULE_2__.Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + editor.setValue(LEVELS[parseInt(data.id)], '.mix'); + }); + $selector.on('select2:opening', () => { + NavExt.count += 1; + jquery__WEBPACK_IMPORTED_MODULE_0___default()(document.body).append(NavExt.$shadow); + }); + $selector.on('select2:closing', () => { + NavExt.count -= 1; + !NavExt.count && NavExt.$shadow.detach(); + }); + $selector.trigger('change'); + mixly__WEBPACK_IMPORTED_MODULE_2__.Storage.board('mix', LEVELS[0]); + mixly__WEBPACK_IMPORTED_MODULE_2__.Storage.board('path', ''); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NavExt); + +/***/ }), + +/***/ "./others/py-engine.js": +/*!*****************************!*\ + !*** ./others/py-engine.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ PyEngine) +/* harmony export */ }); +/* harmony import */ var _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./skulpt/skulpt */ "./others/skulpt/skulpt.js"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ "jquery"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./skulpt/pygame-zero */ "./others/skulpt/pygame-zero.js"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _templates_python_mixpy_py__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../templates/python/mixpy.py */ "./templates/python/mixpy.py"); +/* harmony import */ var _others_skulpt_libs_bg_highlight_js_url__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../others/skulpt/libs/bg_highlight.js?url */ "./others/skulpt/libs/bg_highlight.js?url"); +/* harmony import */ var _others_skulpt_libs_inittool_js_url__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../others/skulpt/libs/inittool.js?url */ "./others/skulpt/libs/inittool.js?url"); +/* harmony import */ var _others_skulpt_libs_bg_nonehl_js_url__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../others/skulpt/libs/bg_nonehl.js?url */ "./others/skulpt/libs/bg_nonehl.js?url"); +/* eslint-disable new-cap */ + + + + + + + + + + +// 外部引入的第三方库 +const externalLibs = { + './blocklygame/__init__.js': _others_skulpt_libs_bg_highlight_js_url__WEBPACK_IMPORTED_MODULE_5__, + './blocktool/__init__.js': _others_skulpt_libs_inittool_js_url__WEBPACK_IMPORTED_MODULE_6__, + './bg_nonehl/__init__.js': _others_skulpt_libs_bg_nonehl_js_url__WEBPACK_IMPORTED_MODULE_7__ +}; + +var GLOBAL_VALUE; + +function prettyPrintError(error) { + if (typeof error === "string") { + return error; + } + // A weird skulpt thing? + if (error.tp$str !== undefined) { + return error.tp$str().v; + } + return "" + error.name + ": " + error.message; +} + +class PyEngine { + #events_ = new mixly__WEBPACK_IMPORTED_MODULE_3__.Events(['input', 'output', 'display', 'finished', 'error']); + + constructor(programStatus, mixpyProject) { + this.programStatus = programStatus; + this.mixpyProject = mixpyProject; + /** + * Definable function to be run when execution has fully ended, + * whether it succeeds or fails. + * + */ + this.onExecutionEnd = null; + } + + getEvents() { + return this.#events_; + } + + /** + * Helper function that will attempt to call the defined onExecutionEnd, + * but will do nothing if there is no function defined. + */ + executionEnd_() { + if (this.onExecutionEnd !== null) { + this.onExecutionEnd(); + } + } + + /** + * Initializes the Python Execution engine and the Printer (console). + */ + loadEngine(container) { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].__future__ = _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].python3; + // No connected services + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].connectedServices = {}; + // No time limit + //Sk.execLimit = null; + // Ensure version 3, so we get proper print handling + // Sk.python3 = true; + //输出海龟画图图片 + //如果需要输出pygame_zero场景,需要重新设置 + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].TurtleGraphics = { + target: container, + width: 500, + height: 500 + }; + + _skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__["default"].setContainer(container); + + //数据分析显示图片 + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].MatPlotLibGraphics = { + target: container, + width: 500, + height: 500 + }; + // TODO + //Sk.console = printer.getConfiguration(); + // Definitely use a prompt + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].inputfunTakesPrompt = true; + + // Keeps track of the tracing while the program is executing; destroyed afterwards. + this.executionBuffer = {}; + + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].domOutput = (html) => { + const dom = this.#events_.on('display', html)[0]; + return dom; + }; + + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].configure({ + //设置文本输出 + output: (lineText) => { + this.#events_.run('output', { + content: lineText + }); + }, + // Function to handle loading in new files + read: this.readFile.bind(this), + inputfun: this.skInput.bind(this), + inputfunTakesPrompt: true, + execLimit: Number.POSITIVE_INFINITY, + fileread: this.fileread.bind(this), + filewrite: this.filewrite.bind(this), + __future__: _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].python3, //python3已成默认值,要使用python2需要单独设置 + }); + + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.value = new _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func(function () { + return _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].ffi.remapToPy(GLOBAL_VALUE === undefined ? 5 : GLOBAL_VALUE); + }); + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_value = new _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func(function (v) { + GLOBAL_VALUE = v.v; + }); + + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtinFiles.files['./mixpy.py'] = _templates_python_mixpy_py__WEBPACK_IMPORTED_MODULE_4__; + } + + /** + * Used to access Skulpt built-ins. This is pretty generic, taken + * almost directly from the Skulpt docs. + * + * @param {String} filename - The python filename (e.g., "os" or "pprint") that will be loaded. + * @returns {String} The JavaScript source code of the file (weird, right?) + * @throws Will throw an error if the file isn't found. + */ + readFile(file) { + // console.log("Attempting file: " + Sk.ffi.remapToJs(file)); + // 加载模块 + if (_skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__["default"].matchModelName(file)) { + return _skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__["default"].load(file); + } + if (externalLibs[file] !== undefined) { + return _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].misceval.promiseToSuspension(fetch(externalLibs[file]).then((resp) => resp.text())); + } + if (_skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtinFiles === undefined || _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtinFiles.files[file] === undefined) { + throw "File not found: '" + file + "'"; + } + return _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtinFiles.files[file]; + } + + fileread(filename, mode) { + if (this.mixpyProject.exist(filename)) { + return this.mixpyProject.getFileContent(filename); + } + if (mode.indexOf('w') !== -1) { + this.mixpyProject.add(filename, '', 1); + return ''; + } + return null; + } + + filewrite(fileItem, str) { + var filename = fileItem.name; + this.mixpyProject.modify(filename, str); + this.mixpyProject.select(filename); + } + + skInput(prompt) { + return new Promise((resolve, reject) => { + this.#events_.run('input', { + content: { + prompt + }, + resolve, reject + }); + }); + } + + /** + * Resets the state of the execution engine, including reinitailizing + * the execution buffer (trace, step, etc.), reseting the printer, and + * hiding the trace button. + * + */ + reset() { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].execLimit = Number.POSITIVE_INFINITY; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].TurtleGraphics.reset && _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].TurtleGraphics.reset(); + } + + kill() { + // 新增了sprite相关内容 + // window.SPRITE.kill(); + //点击取消按钮发送数据 + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].execLimit = 0; + this.executionEnd_(); + } + + /** + * "Steps" the execution of the code, meant to be used as a callback to the Skulpt + * environment. + * + * @param {Object} variables - Hash that maps the names of variables (Strings) to their Skulpt representation. + * @param {Number} lineNumber - The corresponding line number in the source code that is being executed. + * @param {Number} columnNumber - The corresponding column number in the source code that is being executed. Think of it as the "X" position to the lineNumber's "Y" position. + * @param {String} filename - The name of the python file being executed (e.g., "__main__.py"). + * @param {String} astType - Unused? TODO: What is this? + * @param {String} ast - String-encoded JSON representation of the AST node associated with this element. + */ + step(variables, lineNumber, + columnNumber, filename) { + if (filename == '.py') { + var currentStep = this.executionBuffer.step; + var globals = this.parseGlobals(variables); + this.executionBuffer.trace.push( + { + 'step': currentStep, + 'filename': filename, + //'block': highlightMap[lineNumber-1], + 'line': lineNumber, + 'column': columnNumber, + 'properties': globals.properties, + 'modules': globals.modules + } + ); + this.executionBuffer.step = currentStep + 1; + this.executionBuffer.last_step = currentStep + 1; + this.executionBuffer.line_number = lineNumber; + } + } + + /** + * Runs the AbstractInterpreter to get some static information about the code, + * in particular the variables' types. This is needed for type checking. + * + * @returns {Object} Maps variable names (as Strings) to types as constructed by the AbstractIntepreter. + */ + analyzeVariables() { + // Get the code + var code = this.main.model.programs['__main__'](); + if (code.trim() == "") { + return {}; + } + + // var analyzer = new AbstractInterpreter(code); + // report = analyzer.report; + // return analyzer.variableTypes; + } + + /** + * Runs the AbstractInterpreter to get some static information about the code, + * including potential semantic errors. It then parses that information to give + * feedback. + * + * @returns {Boolean} Whether the code was successfully analyzed. + */ + analyze() { + this.main.model.execution.status("analyzing"); + + // var feedback = this.main.components.feedback; + + // Get the code + var code = this.main.model.programs['__main__'](); + if (code.trim() == "") { + this.main.components.feedback.emptyProgram("You haven't written any code yet!"); + //this.main.model.feedback.status("semantic"); + return false; + } + + return true; + } + + /** + * Runs the given python code, resetting the console and Trace Table. + * 分步调试代码 + */ + steprun(code) { + // Reset everything + this.reset(); + if (code.indexOf('import blocklygame') !== -1 + || code.indexOf('from blocklygame import') !== -1) { + _skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__["default"].reset(); + jquery__WEBPACK_IMPORTED_MODULE_1___default()(_skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].TurtleGraphics.target).empty(); + } + //如果是第五关、第七关,则需要把检查循环次数的代码加进去 + if (code.indexOf("settedMap(4") != -1 | code.indexOf("settedMap(6") != -1) { + if (code.indexOf("moveDirection") != -1) {//初始化的时候不加这行代码 + code = code + "actor.isCirculationRight()\n" + } + } + + //除了第六关,其他把检查是否成功代码加进去 + if (code.indexOf("settedMap(5)") == -1) { + if (code.indexOf("moveDirection") != -1) {//初始化的时候不加这行代码 + code = code + "actor.isSuccess()\n" + } + } + this.programStatus['running'] = true; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].misceval.asyncToPromise(() => _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].importMainWithBody("", false, code, true)) + .then(() => { + // window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('finished'); + }) + .catch((error) => { + mixly__WEBPACK_IMPORTED_MODULE_3__.Debug.error(error); + // window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('error', error); + var original = prettyPrintError(error); + this.#events_.run('finished'); + //hack for kill program with time limiterror + if (original.indexOf("TimeLimitError") !== -1) { + return; + } + this.executionEnd_(); + }); + } + + /** + * Runs the given python code, resetting the console and Trace Table. + */ + run(code) { + // Reset everything + this.reset(); + if (code.indexOf('import blocklygame') !== -1 + || code.indexOf('from blocklygame import') !== -1) { + _skulpt_pygame_zero__WEBPACK_IMPORTED_MODULE_2__["default"].reset(); + jquery__WEBPACK_IMPORTED_MODULE_1___default()(_skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].TurtleGraphics.target).empty(); + } + if ((code.indexOf("import blocktool") !== -1) || (code.indexOf("import blocklygame") !== -1) || (code.indexOf("from blocklygame import") !== -1)) { + //正则匹配替换block id元素 + var code_piece = []; + code_piece = code.split("\n"); + for (var i = 0; i < code_piece.length; i++) { + if (code_piece[i].indexOf("block_id") >= 0) { + var target = ""; + var re = /,?'block_id=[\s\S]*'/.exec(code_piece[i]); + if (re != null) { + target = re[0]; + code_piece[i] = code_piece[i].replace(target, ""); + } + } + //检查是否是高亮辅助块\toll,如果是,则将此行代码移除 + if ((code_piece[i].indexOf("import blocktool") >= 0) || (code_piece[i].indexOf("blocktool.highlight") >= 0)) { + code_piece[i] = "delete"; + } + //如果使用的是分步调试的blocklygame,要将其换成非分步调试的模块bg_nonehl + if ((code_piece[i].indexOf("blocklygame") >= 0)) { + code_piece[i] = code_piece[i].replace("blocklygame", "bg_nonehl"); + } + } + code = "" + for (var i = 0; i < code_piece.length; i++) { + if (code_piece[i] != "delete") { + code += code_piece[i] + '\n' + } + } + } + //如果是第五关、第七关,则需要把检查循环次数的代码加进去 + if (code.indexOf("settedMap(4") != -1 | code.indexOf("settedMap(6") != -1) { + if (code.indexOf("moveDirection") != -1) {//初始化的时候不加这行代码 + code = code + "actor.isCirculationRight();\n" + } + } + + //除了第六关,其他把检查是否成功代码加进去 + if (code.indexOf("settedMap(5)") == -1) { + if (code.indexOf("moveDirection") != -1) {//初始化的时候不加这行代码 + code = code + "actor.isSuccess();\n" + } + } + this.programStatus['running'] = true; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].misceval.asyncToPromise(() => _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].importMainWithBody("", false, code, true)) + .then(() => { + // window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('finished'); + }) + .catch((error) => { + mixly__WEBPACK_IMPORTED_MODULE_3__.Debug.error(error); + // window.SPRITE.running = false; + this.programStatus['running'] = false; + this.#events_.run('error', error); + var original = prettyPrintError(error); + this.#events_.run('finished'); + //hack for kill program with time limiterror + if (original.indexOf("TimeLimitError") !== -1) { + return; + } + this.executionEnd_(); + }); + } + + setupEnvironment(student_code, traceTable, output, ast, final_values) { + var model = this.main.model; + this._backup_execution = _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].afterSingleExecution; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].afterSingleExecution = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_output = new _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func(function () { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.pyCheckArgs("get_output", arguments, 0, 0); + return _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].ffi.remapToPy(model.execution.output()); + }); + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.reset_output = new _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func(function () { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.pyCheckArgs("reset_output", arguments, 0, 0); + model.execution.output.removeAll(); + }); + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.log = new _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func(function (data) { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.pyCheckArgs("log", arguments, 1, 1); + console.log(data); + }); + //Sk.builtins.trace = Sk.ffi.remapToPy(traceTable); + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins._trace = traceTable; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins._final_values = final_values; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.code = _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].ffi.remapToPy(student_code); + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_success = this.instructor_module.set_success; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_feedback = this.instructor_module.set_feedback; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_finished = this.instructor_module.set_finished; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.count_components = this.instructor_module.count_components; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.no_nonlist_nums = this.instructor_module.no_nonlist_nums; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.only_printing_properties = this.instructor_module.only_printing_properties; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.calls_function = this.instructor_module.calls_function; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_property = this.instructor_module.get_property; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_value_by_name = this.instructor_module.get_value_by_name; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_value_by_type = this.instructor_module.get_value_by_type; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.parse_json = this.instructor_module.parse_json; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].skip_drawing = true; + model.settings.mute_printer(true); + } + + disposeEnvironment() { + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].afterSingleExecution = this._backup_execution; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_output = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.reset_output = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.log = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins._trace = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.trace = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.code = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_success = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_feedback = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.set_finished = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.count_components = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.calls_function = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_property = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_value_by_name = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.get_value_by_type = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.no_nonlist_nums = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.only_printing_properties = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtins.parse_json = undefined; + _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].skip_drawing = false; + GLOBAL_VALUE = undefined; + this.main.model.settings.mute_printer(false); + } + + parseGlobals(variables) { + var result = Array(); + var modules = Array(); + for (var property in variables) { + var value = variables[property]; + if (property !== "__name__" && property !== "__doc__") { + property = property.replace('_$rw$', '') + .replace('_$rn$', ''); + var parsed = this.parseValue(property, value); + if (parsed !== null) { + result.push(parsed); + } else if (value.constructor == _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.module) { + modules.push(value.$d.__name__.v); + } + } + } + return { "properties": result, "modules": modules }; + } + + parseValue(property, value) { + if (value == undefined) { + return { + 'name': property, + 'type': 'Unknown', + "value": 'Undefined' + }; + } + switch (value.constructor) { + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.func: + return { + 'name': property, + 'type': "Function", + "value": (value.func_code.co_varnames !== undefined ? + " Arguments: " + value.func_code.co_varnames.join(", ") : + ' No arguments') + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.module: return null; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.str: + return { + 'name': property, + 'type': "String", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.none: + return { + 'name': property, + 'type': "None", + "value": "None" + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.bool: + return { + 'name': property, + 'type': "Boolean", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.nmber: + return { + 'name': property, + 'type': "int" == value.skType ? "Integer" : "Float", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.int_: + return { + 'name': property, + 'type': "Integer", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.float_: + return { + 'name': property, + 'type': "Float", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.tuple: + return { + 'name': property, + 'type': "Tuple", + "value": value.$r().v + }; + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.list: + if (value.v.length <= 20) { + return { + 'name': property, + 'type': "List", + "value": value.$r().v, + 'exact_value': value + }; + } + return { + 'name': property, + 'type': "List", + "value": "[... " + value.v.length + " elements ...]", + "exact_value": value + }; + + case _skulpt_skulpt__WEBPACK_IMPORTED_MODULE_0__["default"].builtin.dict: + return { + 'name': property, + 'type': "Dictionary", + "value": value.$r().v + }; + case Number: + return { + 'name': property, + 'type': value % 1 === 0 ? "Integer" : "Float", + "value": value + }; + case String: + return { + 'name': property, + 'type': "String", + "value": value + }; + case Boolean: + return { + 'name': property, + 'type': "Boolean", + "value": (value ? "True" : "False") + }; + default: + return { + 'name': property, + 'type': value.tp$name == undefined ? value : value.tp$name, + "value": value.$r == undefined ? value : value.$r().v + }; + } + } +} + +/** + * Skulpt Module for holding the Instructor API. + * + * This module is a little hackish. We need to sit down and reevaluate the best way to + * organize it and whether this particular structure is ideal. I suspect it should be + * it's own proper JS file. + * + * @param {String} name - The name of the module (should always be 'instructor') + * + */ +// var instructor_module = function (name) { +// // Main module object that gets returned at the end. +// var mod = {}; + +// /** +// * Skulpt Exception that represents a Feedback object, to be rendered to the user +// * when the feedback system finds a problem. +// * +// * @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will include a message for the user. +// */ +// Sk.builtin.Feedback = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Feedback)) { +// o = Object.create(Sk.builtin.Feedback.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Feedback", Sk.builtin.Feedback, Sk.builtin.Exception); + +// /** +// * Skulpt Exception that represents a Success object, to be thrown when the user +// * completes their program successfully. +// * +// ** @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will be empty. +// */ +// Sk.builtin.Success = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Success)) { +// o = Object.create(Sk.builtin.Success.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Success", Sk.builtin.Success, Sk.builtin.Exception); + +// /** +// * Skulpt Exception that represents a Finished object, to be thrown when the user +// * completes their program successfully, but isn't in a problem with a "solution". +// * This is useful for open-ended canvases where we still want to capture the students' +// * code in Canvas. +// * +// ** @param {Array} args - A list of optional arguments to pass to the Exception. +// * Usually this will be empty. +// */ +// Sk.builtin.Finished = function (args) { +// var o; +// if (!(this instanceof Sk.builtin.Finished)) { +// o = Object.create(Sk.builtin.Finished.prototype); +// o.constructor.apply(o, arguments); +// return o; +// } +// Sk.builtin.Exception.apply(this, arguments); +// }; +// Sk.abstr.setUpInheritance("Finished", Sk.builtin.Finished, Sk.builtin.Exception); + +// /** +// * A Skulpt function that throws a Feedback exception, allowing us to give feedback +// * to the user through the Feedback panel. This function call is done for aesthetic +// * reasons, so that we are calling a function instead of raising an error. Still, +// * exceptions allow us to break out of the control flow immediately, like a +// * return, so they are a good mechanism to use under the hood. +// * +// * @param {String} message - The message to display to the user. +// */ +// mod.set_feedback = new Sk.builtin.func(function (message) { +// Sk.builtin.pyCheckArgs("set_feedback", arguments, 1, 1); +// Sk.builtin.pyCheckType("message", "string", Sk.builtin.checkString(message)); +// throw new Sk.builtin.Feedback(message.v); +// }); + +// /** +// * A Skulpt function that throws a Success exception. This will terminate the +// * feedback analysis, but reports that the students' code was successful. +// * This function call is done for aesthetic reasons, so that we are calling a +// * function instead of raising an error. Still, exceptions allow us to break +// * out of the control flow immediately, like a return would, so they are a +// * good mechanism to use under the hood. +// */ +// mod.set_success = new Sk.builtin.func(function () { +// Sk.builtin.pyCheckArgs("set_success", arguments, 0, 0); +// throw new Sk.builtin.Success(); +// }); + +// /** +// * A Skulpt function that throws a Finished exception. This will terminate the +// * feedback analysis, but reports that the students' code was successful. +// * This function call is done for aesthetic reasons, so that we are calling a +// * function instead of raising an error. Still, exceptions allow us to break +// * out of the control flow immediately, like a return would, so they are a +// * good mechanism to use under the hood. +// */ +// mod.set_finished = new Sk.builtin.func(function () { +// Sk.builtin.pyCheckArgs("set_finished", arguments, 0, 0); +// throw new Sk.builtin.Finished(); +// }); + +// // Memoization of previous parses - some mild redundancy to save time +// // TODO: There's no evidence this is good, and could be a memory hog on big +// // programs. Someone should investigate this. The assumption is that multiple +// // helper functions might be using parses. But shouldn't we trim old parses? +// // Perhaps a timed cache would work better. +// var parses = {}; + +// /** +// * Given source code as a string, return a flat list of all of the AST elements +// * in the parsed source code. +// * +// * TODO: There's redundancy here, since the source code was previously parsed +// * to run the file and to execute it. We should probably be able to do this just +// * once and shave off time. +// * +// * @param {String} source - Python source code. +// * @returns {Array.} +// */ +// function getParseList(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// return (new NodeVisitor()).recursive_walk(ast); +// } + +// /** +// * Given source code as a string, return a list of all of the AST elements +// * that are Num (aka numeric literals) but that are not inside List elements. +// * +// * @param {String} source - Python source code. +// * @returns {Array.number} The list of JavaScript numeric literals that were found. +// */ +// function getNonListNums(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// var visitor = new NodeVisitor(); +// var insideList = false; +// var nums = []; +// visitor.visit_List = function (node) { +// insideList = true; +// this.generic_visit(node); +// insideList = false; +// } +// visitor.visit_Num = function (node) { +// if (!insideList) { +// nums.push(node.n); +// } +// this.generic_visit(node); +// } +// visitor.visit(ast); +// return nums; +// } + +// /** +// * Given source code as a string, return a list of all of the AST elements +// * that are being printed (using the print function) but are not variables. +// * +// * @param {String} source - Python source code. +// * @returns {Array.} The list of AST elements that were found. +// */ +// function getPrintedNonProperties(source) { +// if (!(source in parses)) { +// var parse = Sk.parse("__main__", source); +// parses[source] = Sk.astFromParse(parse.cst, "__main__", parse.flags); +// } +// var ast = parses[source]; +// var visitor = new NodeVisitor(); +// var nonVariables = []; +// visitor.visit_Call = function (node) { +// var func = node.func; +// var args = node.args; +// if (func._astname == 'Name' && func.id.v == 'print') { +// for (var i = 0; i < args.length; i += 1) { +// if (args[i]._astname != "Name") { +// nonVariables.push(args[i]); +// } +// } +// } +// this.generic_visit(node); +// } +// visitor.visit(ast); +// return nonVariables; +// } + +// /** +// * Skulpt function to iterate through the final state of +// * all the variables in the program, and check to see if they have +// * a given value. +// */ +// mod.get_value_by_name = new Sk.builtin.func(function (name) { +// Sk.builtin.pyCheckArgs("get_value_by_name", arguments, 1, 1); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); +// name = name.v; +// var final_values = Sk.builtins._final_values; +// if (name in final_values) { +// return final_values[name]; +// } +// return Sk.builtin.none.none$; + +// }); +// mod.get_value_by_type = new Sk.builtin.func(function (type) { +// Sk.builtin.pyCheckArgs("get_value_by_type", arguments, 1, 1); + +// var final_values = Sk.builtins._final_values; +// var result = []; +// for (var property in final_values) { +// if (final_values[property].tp$name == type.tp$name) { +// result.push(final_values[property]); +// } +// } +// return Sk.builtin.list(result); +// }); + +// mod.parse_json = new Sk.builtin.func(function (blob) { +// Sk.builtin.pyCheckArgs("parse_json", arguments, 1, 1); +// Sk.builtin.pyCheckType("blob", "string", Sk.builtin.checkString(blob)); +// blob = blob.v; +// return Sk.ffi.remapToPy(JSON.parse(blob)); +// }); +// mod.get_property = new Sk.builtin.func(function (name) { +// Sk.builtin.pyCheckArgs("get_property", arguments, 1, 1); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); +// name = name.v; +// var trace = Sk.builtins._trace; +// if (trace.length <= 0) { +// return Sk.builtin.none.none$; +// } +// var properties = trace[trace.length - 1]["properties"]; +// for (var i = 0, len = properties.length; i < len; i += 1) { +// if (properties[i]['name'] == name) { +// return Sk.ffi.remapToPy(properties[i]) +// } +// } +// return Sk.builtin.none.none$; +// }); + +// mod.calls_function = new Sk.builtin.func(function (source, name) { +// Sk.builtin.pyCheckArgs("calls_function", arguments, 2, 2); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); +// Sk.builtin.pyCheckType("name", "string", Sk.builtin.checkString(name)); + +// source = source.v; +// name = name.v; + +// var ast_list = getParseList(source); + +// var count = 0; +// for (var i = 0, len = ast_list.length; i < len; i = i + 1) { +// if (ast_list[i]._astname == 'Call') { +// if (ast_list[i].func._astname == 'Attribute') { +// count += Sk.ffi.remapToJs(ast_list[i].func.attr) == name | 0; +// } else if (ast_list[i].func._astname == 'Name') { +// count += Sk.ffi.remapToJs(ast_list[i].func.id) == name | 0; +// } +// } +// } + +// return Sk.ffi.remapToPy(count > 0); +// }); + +// mod.count_components = new Sk.builtin.func(function (source, component) { +// Sk.builtin.pyCheckArgs("count_components", arguments, 2, 2); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); +// Sk.builtin.pyCheckType("component", "string", Sk.builtin.checkString(component)); + +// source = source.v; +// component = component.v; + +// var ast_list = getParseList(source); + +// var count = 0; +// for (var i = 0, len = ast_list.length; i < len; i = i + 1) { +// if (ast_list[i]._astname == component) { +// count = count + 1; +// } +// } + +// return Sk.ffi.remapToPy(count); +// }); + +// mod.no_nonlist_nums = new Sk.builtin.func(function (source) { +// Sk.builtin.pyCheckArgs("no_nonlist_nums", arguments, 1, 1); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); + +// source = source.v; + +// var num_list = getNonListNums(source); + +// var count = 0; +// for (var i = 0, len = num_list.length; i < len; i = i + 1) { +// if (num_list[i].v != 0 && num_list[i].v != 1) { +// return Sk.ffi.remapToPy(true); +// } +// } +// return Sk.ffi.remapToPy(false); +// }); +// mod.only_printing_properties = new Sk.builtin.func(function (source) { +// Sk.builtin.pyCheckArgs("only_printing_properties", arguments, 1, 1); +// Sk.builtin.pyCheckType("source", "string", Sk.builtin.checkString(source)); + +// source = source.v; + +// var non_var_list = getPrintedNonProperties(source); +// return Sk.ffi.remapToPy(non_var_list.length == 0); +// }); + +// return mod; +// } + + +/***/ }), + +/***/ "./others/python-shell.js": +/*!********************************!*\ + !*** ./others/python-shell.js ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _mixpy_project__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mixpy-project */ "./others/mixpy-project.js"); +/* harmony import */ var _py_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./py-engine */ "./others/py-engine.js"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _statusbar_image__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./statusbar-image */ "./others/statusbar-image.js"); + + + + + +class PythonShell { + static { + this.pythonShell = null; + + this.init = async function () { + _statusbar_image__WEBPACK_IMPORTED_MODULE_3__["default"].init(); + this.pythonShell = new PythonShell(); + } + + this.steprun = function () { + const mainWorkspace = mixly__WEBPACK_IMPORTED_MODULE_2__.Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); + return this.pythonShell.steprun(code); + } + + this.run = function () { + const mainWorkspace = mixly__WEBPACK_IMPORTED_MODULE_2__.Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); + return this.pythonShell.run(code); + } + + this.stop = function () { + return this.pythonShell.stop(); + } + } + + #statusBarTerminal_ = null; + #statusBarImage_ = null; + #statusBarsManager_ = null; + #cursor_ = { + row: 0, + column: 0 + }; + #prompt_ = ''; + #inputResolve_ = null; + #inputReject_ = null; + #waittingForInput_ = false; + #running_ = false; + #pyEngine_ = null; + #onCursorChangeEvent_ = () => this.#onCursorChange_(); + #commands_ = [ + { + name: 'REPL-Enter', + bindKey: 'Enter', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row === this.#cursor_.row) { + const newPos = this.#statusBarTerminal_.getEndPos(); + let str = this.#statusBarTerminal_.getValueRange(this.#cursor_, newPos); + str = str.replace(this.#prompt_, ''); + this.#inputResolve_?.(str); + this.#inputResolve_ = null; + this.#inputReject_ = null; + this.#statusBarTerminal_.addValue('\n'); + this.#exitInput_(); + return true; + } + return false; + } + }, { + name: 'REPL-ChangeEditor', + bindKey: 'Delete|Ctrl-X|Backspace', + exec: (editor) => { + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + if (cursor.row < this.#cursor_.row || cursor.column <= this.#cursor_.column) { + return true; + } + return false; + } + } + ]; + constructor() { + const mainWorkspace = mixly__WEBPACK_IMPORTED_MODULE_2__.Workspace.getMain(); + this.#statusBarsManager_ = mainWorkspace.getStatusBarsManager(); + this.#statusBarTerminal_ = this.#statusBarsManager_.getStatusBarById('output'); + this.#statusBarImage_ = this.#statusBarsManager_.getStatusBarById('images'); + this.#pyEngine_ = new _py_engine__WEBPACK_IMPORTED_MODULE_1__["default"]({}, new _mixpy_project__WEBPACK_IMPORTED_MODULE_0__["default"]()); + this.#pyEngine_.loadEngine(this.#statusBarImage_.getContent().children()[0]); + this.#addEventsListener_(); + } + + #addEventsListener_() { + const events = this.#pyEngine_.getEvents(); + events.bind('finished', () => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n==${mixly__WEBPACK_IMPORTED_MODULE_2__.Msg.Lang['shell.finish']}==`); + }); + + events.bind('output', (data) => { + this.#statusBarTerminal_.addValue(data.content); + }); + + events.bind('error', (data) => { + this.#running_ = false; + this.#statusBarTerminal_.addValue(`\n${data.toString()}\n`); + }); + + events.bind('input', (data) => { + const prompt = String(data?.content?.prompt); + this.#statusBarTerminal_.addValue(`>>> ${prompt}`); + this.#prompt_ = prompt; + this.#inputResolve_ = data.resolve; + this.#inputReject_ = data.reject; + this.#enterInput_(); + }); + + events.bind('display', (data) => { + this.#statusBarsManager_.changeTo('images'); + this.#statusBarImage_.display(data); + }); + } + + #onCursorChange_() { + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + const cursor = session.selection.getCursor(); + editor.setReadOnly( + cursor.row < this.#cursor_.row || cursor.column < this.#cursor_.column + ); + } + + #enterInput_() { + if (!this.#running_) { + return; + } + this.#waittingForInput_ = true; + this.#cursor_ = this.#statusBarTerminal_.getEndPos(); + const editor = this.#statusBarTerminal_.getEditor(); + editor.setReadOnly(false); + editor.focus(); + const session = editor.getSession(); + session.selection.on('changeCursor', this.#onCursorChangeEvent_); + editor.commands.addCommands(this.#commands_); + } + + #exitInput_() { + this.#waittingForInput_ = false; + const editor = this.#statusBarTerminal_.getEditor(); + const session = editor.getSession(); + session.selection.off('changeCursor', this.#onCursorChangeEvent_); + editor.commands.removeCommands(this.#commands_); + this.#prompt_ = ''; + this.#inputResolve_?.(''); + // this.#inputReject_?.({}); + this.cursor_ = { row: 0, column: 0 }; + editor.setReadOnly(true); + } + + addPrompt(prompt, resolve, reject) { + this.#statusBarTerminal_.addValue(prompt); + this.#prompt_ = prompt; + this.#inputResolve_ = resolve; + this.#inputReject_ = reject; + this.#enterInput_(); + } + + async steprun(code) { + await this.stop(); + this.#statusBarsManager_.changeTo('output'); + this.#statusBarsManager_.show(); + this.#statusBarTerminal_.setValue(`${mixly__WEBPACK_IMPORTED_MODULE_2__.Msg.Lang['shell.running']}...\n`); + this.#running_ = true; + if (code.indexOf('import blocklygame') !== -1 + || code.indexOf('from blocklygame import') !== -1) { + this.#statusBarsManager_.changeTo('images'); + } + this.#pyEngine_.steprun(code); + } + + async run(code) { + await this.stop(); + this.#statusBarsManager_.changeTo('output'); + this.#statusBarsManager_.show(); + this.#statusBarTerminal_.setValue(`${mixly__WEBPACK_IMPORTED_MODULE_2__.Msg.Lang['shell.running']}...\n`); + this.#running_ = true; + if (code.indexOf('import blocklygame') !== -1 + || code.indexOf('from blocklygame import') !== -1) { + this.#statusBarsManager_.changeTo('images'); + } + this.#pyEngine_.run(code); + } + + async stop() { + if (this.#waittingForInput_) { + this.#exitInput_(); + } + if (this.#running_) { + this.#pyEngine_.kill(); + await this.sleep(500); + this.#running_ = false; + } + } + + sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PythonShell); + +/***/ }), + +/***/ "./others/skulpt/pygame-zero.js": +/*!**************************************!*\ + !*** ./others/skulpt/pygame-zero.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _pygame_zero_min_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pygame-zero.min.js */ "./others/skulpt/pygame-zero.min.js"); +/* harmony import */ var _pygame_zero_min_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_pygame_zero_min_js__WEBPACK_IMPORTED_MODULE_0__); + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (window.PyGameZero); + +/***/ }), + +/***/ "./others/skulpt/pygame-zero.min.js": +/*!******************************************!*\ + !*** ./others/skulpt/pygame-zero.min.js ***! + \******************************************/ +/***/ ((module) => { + +(function() { + function Kb(a) { + return a && a.__esModule ? { + d: a.default + } : { + d: a + } + } + function Gc(name) { + var err = new Error("Cannot find module '" + name + "'"); + err.code = "MODULE_NOT_FOUND"; + throw err + } + var Hc = this; + var Lb = {}; + var ma = {}; + var te, Mb, ha = {}; + !function(e, t) { + "object" == typeof ha ? ha = t(function() { + try { + return Gc("poly-decomp") + } catch (e) {} + }()) : "function" == typeof Mb && Mb.amd ? Mb("Matter", ["poly-decomp"], t) : "object" == typeof ha ? (te = t(function() { + try { + return Gc("poly-decomp") + } catch (e) {} + }()), + ha.Matter = te) : e.Matter = t(e.decomp) + }(ha, function(e) { + return function(e) { + var t = {}; + function n(i) { + if (t[i]) + return t[i].exports; + var o = t[i] = { + i: i, + l: !1, + exports: {} + }; + return e[i].call(o.exports, o, o.exports, n), + o.l = !0, + o.exports + } + return n.m = e, + n.c = t, + n.d = function(e, t, i) { + n.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: i + }) + } + , + n.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), + Object.defineProperty(e, "__esModule", { + value: !0 + }) + } + , + n.t = function(e, t) { + if (1 & t && (e = n(e)), + 8 & t) + return e; + if (4 & t && "object" == typeof e && e && e.__esModule) + return e; + var i = Object.create(null); + if (n.r(i), + Object.defineProperty(i, "default", { + enumerable: !0, + value: e + }), + 2 & t && "string" != typeof e) + for (var o in e) + n.d(i, o, function(t) { + return e[t] + } + .bind(null, o)); + return i + } + , + n.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } + : function() { + return e + } + ; + return n.d(t, "a", t), + t + } + , + n.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + } + , + n.p = "", + n(n.s = 24) + }([function(e, t) { + var n = {}; + e.exports = n, + function() { + n._nextId = 0, + n._seed = 0, + n._nowStartTime = +new Date, + n.extend = function(e, t) { + var i, o; + "boolean" == typeof t ? (i = 2, + o = t) : (i = 1, + o = !0); + for (var r = i; r < arguments.length; r++) { + var s = arguments[r]; + if (s) + for (var a in s) + o && s[a] && s[a].constructor === Object ? e[a] && e[a].constructor !== Object ? e[a] = s[a] : (e[a] = e[a] || {}, + n.extend(e[a], o, s[a])) : e[a] = s[a] + } + return e + } + , + n.clone = function(e, t) { + return n.extend({}, t, e) + } + , + n.keys = function(e) { + if (Object.keys) + return Object.keys(e); + var t = []; + for (var n in e) + t.push(n); + return t + } + , + n.values = function(e) { + var t = []; + if (Object.keys) { + for (var n = Object.keys(e), i = 0; i < n.length; i++) + t.push(e[n[i]]); + return t + } + for (var o in e) + t.push(e[o]); + return t + } + , + n.get = function(e, t, n, i) { + t = t.split(".").slice(n, i); + for (var o = 0; o < t.length; o += 1) + e = e[t[o]]; + return e + } + , + n.set = function(e, t, i, o, r) { + var s = t.split(".").slice(o, r); + return n.get(e, t, 0, -1)[s[s.length - 1]] = i, + i + } + , + n.shuffle = function(e) { + for (var t = e.length - 1; t > 0; t--) { + var i = Math.floor(n.random() * (t + 1)) + , o = e[t]; + e[t] = e[i], + e[i] = o + } + return e + } + , + n.choose = function(e) { + return e[Math.floor(n.random() * e.length)] + } + , + n.isElement = function(e) { + return "undefined" != typeof HTMLElement ? e instanceof HTMLElement : !!(e && e.nodeType && e.nodeName) + } + , + n.isArray = function(e) { + return "[object Array]" === Object.prototype.toString.call(e) + } + , + n.isFunction = function(e) { + return "function" == typeof e + } + , + n.isPlainObject = function(e) { + return "object" == typeof e && e.constructor === Object + } + , + n.isString = function(e) { + return "[object String]" === toString.call(e) + } + , + n.clamp = function(e, t, n) { + return e < t ? t : e > n ? n : e + } + , + n.sign = function(e) { + return e < 0 ? -1 : 1 + } + , + n.now = function() { + if ("undefined" != typeof window && window.performance) { + if (window.performance.now) + return window.performance.now(); + if (window.performance.webkitNow) + return window.performance.webkitNow() + } + return new Date - n._nowStartTime + } + , + n.random = function(t, n) { + return n = void 0 !== n ? n : 1, + (t = void 0 !== t ? t : 0) + e() * (n - t) + } + ; + var e = function() { + return n._seed = (9301 * n._seed + 49297) % 233280, + n._seed / 233280 + }; + n.colorToNumber = function(e) { + return 3 == (e = e.replace("#", "")).length && (e = e.charAt(0) + e.charAt(0) + e.charAt(1) + e.charAt(1) + e.charAt(2) + e.charAt(2)), + parseInt(e, 16) + } + , + n.logLevel = 1, + n.log = function() { + console && n.logLevel > 0 && n.logLevel <= 3 && console.log.apply(console, ["matter-js:"].concat(Array.prototype.slice.call(arguments))) + } + , + n.info = function() { + console && n.logLevel > 0 && n.logLevel <= 2 && console.info.apply(console, ["matter-js:"].concat(Array.prototype.slice.call(arguments))) + } + , + n.warn = function() { + console && n.logLevel > 0 && n.logLevel <= 3 && console.warn.apply(console, ["matter-js:"].concat(Array.prototype.slice.call(arguments))) + } + , + n.nextId = function() { + return n._nextId++ + } + , + n.indexOf = function(e, t) { + if (e.indexOf) + return e.indexOf(t); + for (var n = 0; n < e.length; n++) + if (e[n] === t) + return n; + return -1 + } + , + n.map = function(e, t) { + if (e.map) + return e.map(t); + for (var n = [], i = 0; i < e.length; i += 1) + n.push(t(e[i])); + return n + } + , + n.topologicalSort = function(e) { + var t = [] + , i = [] + , o = []; + for (var r in e) + i[r] || o[r] || n._topologicalSort(r, i, o, e, t); + return t + } + , + n._topologicalSort = function(e, t, i, o, r) { + var s = o[e] || []; + i[e] = !0; + for (var a = 0; a < s.length; a += 1) { + var l = s[a]; + i[l] || t[l] || n._topologicalSort(l, t, i, o, r) + } + i[e] = !1, + t[e] = !0, + r.push(e) + } + , + n.chain = function() { + for (var e = [], t = 0; t < arguments.length; t += 1) { + var n = arguments[t]; + n._chained ? e.push.apply(e, n._chained) : e.push(n) + } + var i = function() { + for (var t, n = new Array(arguments.length), i = 0, o = arguments.length; i < o; i++) + n[i] = arguments[i]; + for (i = 0; i < e.length; i += 1) { + var r = e[i].apply(t, n); + void 0 !== r && (t = r) + } + return t + }; + return i._chained = e, + i + } + , + n.chainPathBefore = function(e, t, i) { + return n.set(e, t, n.chain(i, n.get(e, t))) + } + , + n.chainPathAfter = function(e, t, i) { + return n.set(e, t, n.chain(n.get(e, t), i)) + } + }() + } + , function(e, t) { + var n = {}; + e.exports = n, + n.create = function(e) { + var t = { + min: { + x: 0, + y: 0 + }, + max: { + x: 0, + y: 0 + } + }; + return e && n.update(t, e), + t + } + , + n.update = function(e, t, n) { + e.min.x = 1 / 0, + e.max.x = -1 / 0, + e.min.y = 1 / 0, + e.max.y = -1 / 0; + for (var i = 0; i < t.length; i++) { + var o = t[i]; + o.x > e.max.x && (e.max.x = o.x), + o.x < e.min.x && (e.min.x = o.x), + o.y > e.max.y && (e.max.y = o.y), + o.y < e.min.y && (e.min.y = o.y) + } + n && (n.x > 0 ? e.max.x += n.x : e.min.x += n.x, + n.y > 0 ? e.max.y += n.y : e.min.y += n.y) + } + , + n.contains = function(e, t) { + return t.x >= e.min.x && t.x <= e.max.x && t.y >= e.min.y && t.y <= e.max.y + } + , + n.overlaps = function(e, t) { + return e.min.x <= t.max.x && e.max.x >= t.min.x && e.max.y >= t.min.y && e.min.y <= t.max.y + } + , + n.translate = function(e, t) { + e.min.x += t.x, + e.max.x += t.x, + e.min.y += t.y, + e.max.y += t.y + } + , + n.shift = function(e, t) { + var n = e.max.x - e.min.x + , i = e.max.y - e.min.y; + e.min.x = t.x, + e.max.x = t.x + n, + e.min.y = t.y, + e.max.y = t.y + i + } + } + , function(e, t) { + var n = {}; + e.exports = n, + n.create = function(e, t) { + return { + x: e || 0, + y: t || 0 + } + } + , + n.clone = function(e) { + return { + x: e.x, + y: e.y + } + } + , + n.magnitude = function(e) { + return Math.sqrt(e.x * e.x + e.y * e.y) + } + , + n.magnitudeSquared = function(e) { + return e.x * e.x + e.y * e.y + } + , + n.rotate = function(e, t, n) { + var i = Math.cos(t) + , o = Math.sin(t); + n || (n = {}); + var r = e.x * i - e.y * o; + return n.y = e.x * o + e.y * i, + n.x = r, + n + } + , + n.rotateAbout = function(e, t, n, i) { + var o = Math.cos(t) + , r = Math.sin(t); + i || (i = {}); + var s = n.x + ((e.x - n.x) * o - (e.y - n.y) * r); + return i.y = n.y + ((e.x - n.x) * r + (e.y - n.y) * o), + i.x = s, + i + } + , + n.normalise = function(e) { + var t = n.magnitude(e); + return 0 === t ? { + x: 0, + y: 0 + } : { + x: e.x / t, + y: e.y / t + } + } + , + n.dot = function(e, t) { + return e.x * t.x + e.y * t.y + } + , + n.cross = function(e, t) { + return e.x * t.y - e.y * t.x + } + , + n.cross3 = function(e, t, n) { + return (t.x - e.x) * (n.y - e.y) - (t.y - e.y) * (n.x - e.x) + } + , + n.add = function(e, t, n) { + return n || (n = {}), + n.x = e.x + t.x, + n.y = e.y + t.y, + n + } + , + n.sub = function(e, t, n) { + return n || (n = {}), + n.x = e.x - t.x, + n.y = e.y - t.y, + n + } + , + n.mult = function(e, t) { + return { + x: e.x * t, + y: e.y * t + } + } + , + n.div = function(e, t) { + return { + x: e.x / t, + y: e.y / t + } + } + , + n.perp = function(e, t) { + return { + x: (t = !0 === t ? -1 : 1) * -e.y, + y: t * e.x + } + } + , + n.neg = function(e) { + return { + x: -e.x, + y: -e.y + } + } + , + n.angle = function(e, t) { + return Math.atan2(t.y - e.y, t.x - e.x) + } + , + n._temp = [n.create(), n.create(), n.create(), n.create(), n.create(), n.create()] + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(2) + , r = n(0); + i.create = function(e, t) { + for (var n = [], i = 0; i < e.length; i++) { + var o = e[i] + , r = { + x: o.x, + y: o.y, + index: i, + body: t, + isInternal: !1 + }; + n.push(r) + } + return n + } + , + i.fromPath = function(e, t) { + var n = []; + return e.replace(/L?\s*([-\d.e]+)[\s,]*([-\d.e]+)*/gi, function(e, t, i) { + n.push({ + x: parseFloat(t), + y: parseFloat(i) + }) + }), + i.create(n, t) + } + , + i.centre = function(e) { + for (var t, n, r, s = i.area(e, !0), a = { + x: 0, + y: 0 + }, l = 0; l < e.length; l++) + r = (l + 1) % e.length, + t = o.cross(e[l], e[r]), + n = o.mult(o.add(e[l], e[r]), t), + a = o.add(a, n); + return o.div(a, 6 * s) + } + , + i.mean = function(e) { + for (var t = { + x: 0, + y: 0 + }, n = 0; n < e.length; n++) + t.x += e[n].x, + t.y += e[n].y; + return o.div(t, e.length) + } + , + i.area = function(e, t) { + for (var n = 0, i = e.length - 1, o = 0; o < e.length; o++) + n += (e[i].x - e[o].x) * (e[i].y + e[o].y), + i = o; + return t ? n / 2 : Math.abs(n) / 2 + } + , + i.inertia = function(e, t) { + for (var n, i, r = 0, s = 0, a = e, l = 0; l < a.length; l++) + i = (l + 1) % a.length, + r += (n = Math.abs(o.cross(a[i], a[l]))) * (o.dot(a[i], a[i]) + o.dot(a[i], a[l]) + o.dot(a[l], a[l])), + s += n; + return t / 6 * (r / s) + } + , + i.translate = function(e, t, n) { + var i; + if (n) + for (i = 0; i < e.length; i++) + e[i].x += t.x * n, + e[i].y += t.y * n; + else + for (i = 0; i < e.length; i++) + e[i].x += t.x, + e[i].y += t.y; + return e + } + , + i.rotate = function(e, t, n) { + if (0 !== t) { + for (var i = Math.cos(t), o = Math.sin(t), r = 0; r < e.length; r++) { + var s = e[r] + , a = s.x - n.x + , l = s.y - n.y; + s.x = n.x + (a * i - l * o), + s.y = n.y + (a * o + l * i) + } + return e + } + } + , + i.contains = function(e, t) { + for (var n = 0; n < e.length; n++) { + var i = e[n] + , o = e[(n + 1) % e.length]; + if ((t.x - i.x) * (o.y - i.y) + (t.y - i.y) * (i.x - o.x) > 0) + return !1 + } + return !0 + } + , + i.scale = function(e, t, n, r) { + if (1 === t && 1 === n) + return e; + var s, a; + r = r || i.centre(e); + for (var l = 0; l < e.length; l++) + s = e[l], + a = o.sub(s, r), + e[l].x = r.x + a.x * t, + e[l].y = r.y + a.y * n; + return e + } + , + i.chamfer = function(e, t, n, i, s) { + t = "number" == typeof t ? [t] : t || [8], + n = void 0 !== n ? n : -1, + i = i || 2, + s = s || 14; + for (var a = [], l = 0; l < e.length; l++) { + var c = e[l - 1 >= 0 ? l - 1 : e.length - 1] + , d = e[l] + , u = e[(l + 1) % e.length] + , p = t[l < t.length ? l : t.length - 1]; + if (0 !== p) { + var f = o.normalise({ + x: d.y - c.y, + y: c.x - d.x + }) + , v = o.normalise({ + x: u.y - d.y, + y: d.x - u.x + }) + , m = Math.sqrt(2 * Math.pow(p, 2)) + , y = o.mult(r.clone(f), p) + , g = o.normalise(o.mult(o.add(f, v), .5)) + , x = o.sub(d, o.mult(g, m)) + , h = n; + -1 === n && (h = 1.75 * Math.pow(p, .32)), + (h = r.clamp(h, i, s)) % 2 == 1 && (h += 1); + for (var b = Math.acos(o.dot(f, v)) / h, w = 0; w < h; w++) + a.push(o.add(o.rotate(y, b * w), x)) + } else + a.push(d) + } + return a + } + , + i.clockwiseSort = function(e) { + var t = i.mean(e); + return e.sort(function(e, n) { + return o.angle(t, e) - o.angle(t, n) + }), + e + } + , + i.isConvex = function(e) { + var t, n, i, o, r = 0, s = e.length; + if (s < 3) + return null; + for (t = 0; t < s; t++) + if (i = (t + 2) % s, + o = (e[n = (t + 1) % s].x - e[t].x) * (e[i].y - e[n].y), + (o -= (e[n].y - e[t].y) * (e[i].x - e[n].x)) < 0 ? r |= 1 : o > 0 && (r |= 2), + 3 === r) + return !1; + return 0 !== r || null + } + , + i.hull = function(e) { + var t, n, i = [], r = []; + for ((e = e.slice(0)).sort(function(e, t) { + var n = e.x - t.x; + return 0 !== n ? n : e.y - t.y + }), + n = 0; n < e.length; n += 1) { + for (t = e[n]; r.length >= 2 && o.cross3(r[r.length - 2], r[r.length - 1], t) <= 0; ) + r.pop(); + r.push(t) + } + for (n = e.length - 1; n >= 0; n -= 1) { + for (t = e[n]; i.length >= 2 && o.cross3(i[i.length - 2], i[i.length - 1], t) <= 0; ) + i.pop(); + i.push(t) + } + return i.pop(), + r.pop(), + i.concat(r) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(0); + i.on = function(e, t, n) { + for (var i, o = t.split(" "), r = 0; r < o.length; r++) + i = o[r], + e.events = e.events || {}, + e.events[i] = e.events[i] || [], + e.events[i].push(n); + return n + } + , + i.off = function(e, t, n) { + if (t) { + "function" == typeof t && (n = t, + t = o.keys(e.events).join(" ")); + for (var i = t.split(" "), r = 0; r < i.length; r++) { + var s = e.events[i[r]] + , a = []; + if (n && s) + for (var l = 0; l < s.length; l++) + s[l] !== n && a.push(s[l]); + e.events[i[r]] = a + } + } else + e.events = {} + } + , + i.trigger = function(e, t, n) { + var i, r, s, a, l = e.events; + if (l && o.keys(l).length > 0) { + n || (n = {}), + i = t.split(" "); + for (var c = 0; c < i.length; c++) + if (s = l[r = i[c]]) { + (a = o.clone(n, !1)).name = r, + a.source = e; + for (var d = 0; d < s.length; d++) + s[d].apply(e, [a]) + } + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(4) + , r = n(0) + , s = n(1) + , a = n(6); + i.create = function(e) { + return r.extend({ + id: r.nextId(), + type: "composite", + parent: null, + isModified: !1, + bodies: [], + constraints: [], + composites: [], + label: "Composite", + plugin: {} + }, e) + } + , + i.setModified = function(e, t, n, o) { + if (e.isModified = t, + n && e.parent && i.setModified(e.parent, t, n, o), + o) + for (var r = 0; r < e.composites.length; r++) { + var s = e.composites[r]; + i.setModified(s, t, n, o) + } + } + , + i.add = function(e, t) { + var n = [].concat(t); + o.trigger(e, "beforeAdd", { + object: t + }); + for (var s = 0; s < n.length; s++) { + var a = n[s]; + switch (a.type) { + case "body": + if (a.parent !== a) { + r.warn("Composite.add: skipped adding a compound body part (you must add its parent instead)"); + break + } + i.addBody(e, a); + break; + case "constraint": + i.addConstraint(e, a); + break; + case "composite": + i.addComposite(e, a); + break; + case "mouseConstraint": + i.addConstraint(e, a.constraint); + } + } + return o.trigger(e, "afterAdd", { + object: t + }), + e + } + , + i.remove = function(e, t, n) { + var r = [].concat(t); + o.trigger(e, "beforeRemove", { + object: t + }); + for (var s = 0; s < r.length; s++) { + var a = r[s]; + switch (a.type) { + case "body": + i.removeBody(e, a, n); + break; + case "constraint": + i.removeConstraint(e, a, n); + break; + case "composite": + i.removeComposite(e, a, n); + break; + case "mouseConstraint": + i.removeConstraint(e, a.constraint); + } + } + return o.trigger(e, "afterRemove", { + object: t + }), + e + } + , + i.addComposite = function(e, t) { + return e.composites.push(t), + t.parent = e, + i.setModified(e, !0, !0, !1), + e + } + , + i.removeComposite = function(e, t, n) { + var o = r.indexOf(e.composites, t); + if (-1 !== o && (i.removeCompositeAt(e, o), + i.setModified(e, !0, !0, !1)), + n) + for (var s = 0; s < e.composites.length; s++) + i.removeComposite(e.composites[s], t, !0); + return e + } + , + i.removeCompositeAt = function(e, t) { + return e.composites.splice(t, 1), + i.setModified(e, !0, !0, !1), + e + } + , + i.addBody = function(e, t) { + return e.bodies.push(t), + i.setModified(e, !0, !0, !1), + e + } + , + i.removeBody = function(e, t, n) { + var o = r.indexOf(e.bodies, t); + if (-1 !== o && (i.removeBodyAt(e, o), + i.setModified(e, !0, !0, !1)), + n) + for (var s = 0; s < e.composites.length; s++) + i.removeBody(e.composites[s], t, !0); + return e + } + , + i.removeBodyAt = function(e, t) { + return e.bodies.splice(t, 1), + i.setModified(e, !0, !0, !1), + e + } + , + i.addConstraint = function(e, t) { + return e.constraints.push(t), + i.setModified(e, !0, !0, !1), + e + } + , + i.removeConstraint = function(e, t, n) { + var o = r.indexOf(e.constraints, t); + if (-1 !== o && i.removeConstraintAt(e, o), + n) + for (var s = 0; s < e.composites.length; s++) + i.removeConstraint(e.composites[s], t, !0); + return e + } + , + i.removeConstraintAt = function(e, t) { + return e.constraints.splice(t, 1), + i.setModified(e, !0, !0, !1), + e + } + , + i.clear = function(e, t, n) { + if (n) + for (var o = 0; o < e.composites.length; o++) + i.clear(e.composites[o], t, !0); + return t ? e.bodies = e.bodies.filter(function(e) { + return e.isStatic + }) : e.bodies.length = 0, + e.constraints.length = 0, + e.composites.length = 0, + i.setModified(e, !0, !0, !1), + e + } + , + i.allBodies = function(e) { + for (var t = [].concat(e.bodies), n = 0; n < e.composites.length; n++) + t = t.concat(i.allBodies(e.composites[n])); + return t + } + , + i.allConstraints = function(e) { + for (var t = [].concat(e.constraints), n = 0; n < e.composites.length; n++) + t = t.concat(i.allConstraints(e.composites[n])); + return t + } + , + i.allComposites = function(e) { + for (var t = [].concat(e.composites), n = 0; n < e.composites.length; n++) + t = t.concat(i.allComposites(e.composites[n])); + return t + } + , + i.get = function(e, t, n) { + var o, r; + switch (n) { + case "body": + o = i.allBodies(e); + break; + case "constraint": + o = i.allConstraints(e); + break; + case "composite": + o = i.allComposites(e).concat(e); + } + return o ? 0 === (r = o.filter(function(e) { + return e.id.toString() === t.toString() + })).length ? null : r[0] : null + } + , + i.move = function(e, t, n) { + return i.remove(e, t), + i.add(n, t), + e + } + , + i.rebase = function(e) { + for (var t = i.allBodies(e).concat(i.allConstraints(e)).concat(i.allComposites(e)), n = 0; n < t.length; n++) + t[n].id = r.nextId(); + return i.setModified(e, !0, !0, !1), + e + } + , + i.translate = function(e, t, n) { + for (var o = n ? i.allBodies(e) : e.bodies, r = 0; r < o.length; r++) + a.translate(o[r], t); + return i.setModified(e, !0, !0, !1), + e + } + , + i.rotate = function(e, t, n, o) { + for (var r = Math.cos(t), s = Math.sin(t), l = o ? i.allBodies(e) : e.bodies, c = 0; c < l.length; c++) { + var d = l[c] + , u = d.position.x - n.x + , p = d.position.y - n.y; + a.setPosition(d, { + x: n.x + (u * r - p * s), + y: n.y + (u * s + p * r) + }), + a.rotate(d, t) + } + return i.setModified(e, !0, !0, !1), + e + } + , + i.scale = function(e, t, n, o, r) { + for (var s = r ? i.allBodies(e) : e.bodies, l = 0; l < s.length; l++) { + var c = s[l] + , d = c.position.x - o.x + , u = c.position.y - o.y; + a.setPosition(c, { + x: o.x + d * t, + y: o.y + u * n + }), + a.scale(c, t, n) + } + return i.setModified(e, !0, !0, !1), + e + } + , + i.bounds = function(e) { + for (var t = i.allBodies(e), n = [], o = 0; o < t.length; o += 1) { + var r = t[o]; + n.push(r.bounds.min, r.bounds.max) + } + return s.create(n) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(2) + , s = n(7) + , a = (n(10), + n(0)) + , l = n(1) + , c = n(15); + !function() { + i._inertiaScale = 4, + i._nextCollidingGroupId = 1, + i._nextNonCollidingGroupId = -1, + i._nextCategory = 1, + i.create = function(t) { + var n = { + id: a.nextId(), + type: "body", + label: "Body", + parts: [], + plugin: {}, + angle: 0, + vertices: o.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"), + position: { + x: 0, + y: 0 + }, + force: { + x: 0, + y: 0 + }, + torque: 0, + positionImpulse: { + x: 0, + y: 0 + }, + constraintImpulse: { + x: 0, + y: 0, + angle: 0 + }, + totalContacts: 0, + speed: 0, + angularSpeed: 0, + velocity: { + x: 0, + y: 0 + }, + angularVelocity: 0, + isSensor: !1, + isStatic: !1, + isSleeping: !1, + motion: 0, + sleepThreshold: 60, + density: .001, + restitution: 0, + friction: .1, + frictionStatic: .5, + frictionAir: .01, + collisionFilter: { + category: 1, + mask: 4294967295, + group: 0 + }, + slop: .05, + timeScale: 1, + render: { + visible: !0, + opacity: 1, + strokeStyle: null, + fillStyle: null, + lineWidth: null, + sprite: { + xScale: 1, + yScale: 1, + xOffset: 0, + yOffset: 0 + } + }, + events: null, + bounds: null, + chamfer: null, + circleRadius: 0, + positionPrev: null, + anglePrev: 0, + parent: null, + axes: null, + area: 0, + mass: 0, + inertia: 0, + _original: null + } + , i = a.extend(n, t); + return e(i, t), + i + } + , + i.nextGroup = function(e) { + return e ? i._nextNonCollidingGroupId-- : i._nextCollidingGroupId++ + } + , + i.nextCategory = function() { + return i._nextCategory = i._nextCategory << 1, + i._nextCategory + } + ; + var e = function(e, t) { + t = t || {}, + i.set(e, { + bounds: e.bounds || l.create(e.vertices), + positionPrev: e.positionPrev || r.clone(e.position), + anglePrev: e.anglePrev || e.angle, + vertices: e.vertices, + parts: e.parts || [e], + isStatic: e.isStatic, + isSleeping: e.isSleeping, + parent: e.parent || e + }), + o.rotate(e.vertices, e.angle, e.position), + c.rotate(e.axes, e.angle), + l.update(e.bounds, e.vertices, e.velocity), + i.set(e, { + axes: t.axes || e.axes, + area: t.area || e.area, + mass: t.mass || e.mass, + inertia: t.inertia || e.inertia + }); + var n = e.isStatic ? "#14151f" : a.choose(["#f19648", "#f5d259", "#f55a3c", "#063e7b", "#ececd1"]) + , s = e.isStatic ? "#555" : "#ccc" + , d = e.isStatic && null === e.render.fillStyle ? 1 : 0; + e.render.fillStyle = e.render.fillStyle || n, + e.render.strokeStyle = e.render.strokeStyle || s, + e.render.lineWidth = e.render.lineWidth || d, + e.render.sprite.xOffset += -(e.bounds.min.x - e.position.x) / (e.bounds.max.x - e.bounds.min.x), + e.render.sprite.yOffset += -(e.bounds.min.y - e.position.y) / (e.bounds.max.y - e.bounds.min.y) + }; + i.set = function(e, t, n) { + var o; + for (o in "string" == typeof t && (o = t, + (t = {})[o] = n), + t) + if (Object.prototype.hasOwnProperty.call(t, o)) + switch (n = t[o], + o) { + case "isStatic": + i.setStatic(e, n); + break; + case "isSleeping": + s.set(e, n); + break; + case "mass": + i.setMass(e, n); + break; + case "density": + i.setDensity(e, n); + break; + case "inertia": + i.setInertia(e, n); + break; + case "vertices": + i.setVertices(e, n); + break; + case "position": + i.setPosition(e, n); + break; + case "angle": + i.setAngle(e, n); + break; + case "velocity": + i.setVelocity(e, n); + break; + case "angularVelocity": + i.setAngularVelocity(e, n); + break; + case "parts": + i.setParts(e, n); + break; + case "centre": + i.setCentre(e, n); + break; + default: + e[o] = n; + } + } + , + i.setStatic = function(e, t) { + for (var n = 0; n < e.parts.length; n++) { + var i = e.parts[n]; + i.isStatic = t, + t ? (i._original = { + restitution: i.restitution, + friction: i.friction, + mass: i.mass, + inertia: i.inertia, + density: i.density, + inverseMass: i.inverseMass, + inverseInertia: i.inverseInertia + }, + i.restitution = 0, + i.friction = 1, + i.mass = i.inertia = i.density = 1 / 0, + i.inverseMass = i.inverseInertia = 0, + i.positionPrev.x = i.position.x, + i.positionPrev.y = i.position.y, + i.anglePrev = i.angle, + i.angularVelocity = 0, + i.speed = 0, + i.angularSpeed = 0, + i.motion = 0) : i._original && (i.restitution = i._original.restitution, + i.friction = i._original.friction, + i.mass = i._original.mass, + i.inertia = i._original.inertia, + i.density = i._original.density, + i.inverseMass = i._original.inverseMass, + i.inverseInertia = i._original.inverseInertia, + i._original = null) + } + } + , + i.setMass = function(e, t) { + var n = e.inertia / (e.mass / 6); + e.inertia = n * (t / 6), + e.inverseInertia = 1 / e.inertia, + e.mass = t, + e.inverseMass = 1 / e.mass, + e.density = e.mass / e.area + } + , + i.setDensity = function(e, t) { + i.setMass(e, t * e.area), + e.density = t + } + , + i.setInertia = function(e, t) { + e.inertia = t, + e.inverseInertia = 1 / e.inertia + } + , + i.setVertices = function(e, t) { + t[0].body === e ? e.vertices = t : e.vertices = o.create(t, e), + e.axes = c.fromVertices(e.vertices), + e.area = o.area(e.vertices), + i.setMass(e, e.density * e.area); + var n = o.centre(e.vertices); + o.translate(e.vertices, n, -1), + i.setInertia(e, i._inertiaScale * o.inertia(e.vertices, e.mass)), + o.translate(e.vertices, e.position), + l.update(e.bounds, e.vertices, e.velocity) + } + , + i.setParts = function(e, t, n) { + var r; + for (t = t.slice(0), + e.parts.length = 0, + e.parts.push(e), + e.parent = e, + r = 0; r < t.length; r++) { + var s = t[r]; + s !== e && (s.parent = e, + e.parts.push(s)) + } + if (1 !== e.parts.length) { + if (n = void 0 === n || n) { + var a = []; + for (r = 0; r < t.length; r++) + a = a.concat(t[r].vertices); + o.clockwiseSort(a); + var l = o.hull(a) + , c = o.centre(l); + i.setVertices(e, l), + o.translate(e.vertices, c) + } + var d = i._totalProperties(e); + e.area = d.area, + e.parent = e, + e.position.x = d.centre.x, + e.position.y = d.centre.y, + e.positionPrev.x = d.centre.x, + e.positionPrev.y = d.centre.y, + i.setMass(e, d.mass), + i.setInertia(e, d.inertia), + i.setPosition(e, d.centre) + } + } + , + i.setCentre = function(e, t, n) { + n ? (e.positionPrev.x += t.x, + e.positionPrev.y += t.y, + e.position.x += t.x, + e.position.y += t.y) : (e.positionPrev.x = t.x - (e.position.x - e.positionPrev.x), + e.positionPrev.y = t.y - (e.position.y - e.positionPrev.y), + e.position.x = t.x, + e.position.y = t.y) + } + , + i.setPosition = function(e, t) { + var n = r.sub(t, e.position); + e.positionPrev.x += n.x, + e.positionPrev.y += n.y; + for (var i = 0; i < e.parts.length; i++) { + var s = e.parts[i]; + s.position.x += n.x, + s.position.y += n.y, + o.translate(s.vertices, n), + l.update(s.bounds, s.vertices, e.velocity) + } + } + , + i.setAngle = function(e, t) { + var n = t - e.angle; + e.anglePrev += n; + for (var i = 0; i < e.parts.length; i++) { + var s = e.parts[i]; + s.angle += n, + o.rotate(s.vertices, n, e.position), + c.rotate(s.axes, n), + l.update(s.bounds, s.vertices, e.velocity), + i > 0 && r.rotateAbout(s.position, n, e.position, s.position) + } + } + , + i.setVelocity = function(e, t) { + e.positionPrev.x = e.position.x - t.x, + e.positionPrev.y = e.position.y - t.y, + e.velocity.x = t.x, + e.velocity.y = t.y, + e.speed = r.magnitude(e.velocity) + } + , + i.setAngularVelocity = function(e, t) { + e.anglePrev = e.angle - t, + e.angularVelocity = t, + e.angularSpeed = Math.abs(e.angularVelocity) + } + , + i.translate = function(e, t) { + i.setPosition(e, r.add(e.position, t)) + } + , + i.rotate = function(e, t, n) { + if (n) { + var o = Math.cos(t) + , r = Math.sin(t) + , s = e.position.x - n.x + , a = e.position.y - n.y; + i.setPosition(e, { + x: n.x + (s * o - a * r), + y: n.y + (s * r + a * o) + }), + i.setAngle(e, e.angle + t) + } else + i.setAngle(e, e.angle + t) + } + , + i.scale = function(e, t, n, r) { + var s = 0 + , a = 0; + r = r || e.position; + for (var d = 0; d < e.parts.length; d++) { + var u = e.parts[d]; + o.scale(u.vertices, t, n, r), + u.axes = c.fromVertices(u.vertices), + u.area = o.area(u.vertices), + i.setMass(u, e.density * u.area), + o.translate(u.vertices, { + x: -u.position.x, + y: -u.position.y + }), + i.setInertia(u, i._inertiaScale * o.inertia(u.vertices, u.mass)), + o.translate(u.vertices, { + x: u.position.x, + y: u.position.y + }), + d > 0 && (s += u.area, + a += u.inertia), + u.position.x = r.x + (u.position.x - r.x) * t, + u.position.y = r.y + (u.position.y - r.y) * n, + l.update(u.bounds, u.vertices, e.velocity) + } + e.parts.length > 1 && (e.area = s, + e.isStatic || (i.setMass(e, e.density * s), + i.setInertia(e, a))), + e.circleRadius && (t === n ? e.circleRadius *= t : e.circleRadius = null) + } + , + i.update = function(e, t, n, i) { + var s = Math.pow(t * n * e.timeScale, 2) + , a = 1 - e.frictionAir * n * e.timeScale + , d = e.position.x - e.positionPrev.x + , u = e.position.y - e.positionPrev.y; + e.velocity.x = d * a * i + e.force.x / e.mass * s, + e.velocity.y = u * a * i + e.force.y / e.mass * s, + e.positionPrev.x = e.position.x, + e.positionPrev.y = e.position.y, + e.position.x += e.velocity.x, + e.position.y += e.velocity.y, + e.angularVelocity = (e.angle - e.anglePrev) * a * i + e.torque / e.inertia * s, + e.anglePrev = e.angle, + e.angle += e.angularVelocity, + e.speed = r.magnitude(e.velocity), + e.angularSpeed = Math.abs(e.angularVelocity); + for (var p = 0; p < e.parts.length; p++) { + var f = e.parts[p]; + o.translate(f.vertices, e.velocity), + p > 0 && (f.position.x += e.velocity.x, + f.position.y += e.velocity.y), + 0 !== e.angularVelocity && (o.rotate(f.vertices, e.angularVelocity, e.position), + c.rotate(f.axes, e.angularVelocity), + p > 0 && r.rotateAbout(f.position, e.angularVelocity, e.position, f.position)), + l.update(f.bounds, f.vertices, e.velocity) + } + } + , + i.applyForce = function(e, t, n) { + e.force.x += n.x, + e.force.y += n.y; + var i = t.x - e.position.x + , o = t.y - e.position.y; + e.torque += i * n.y - o * n.x + } + , + i._totalProperties = function(e) { + for (var t = { + mass: 0, + area: 0, + inertia: 0, + centre: { + x: 0, + y: 0 + } + }, n = 1 === e.parts.length ? 0 : 1; n < e.parts.length; n++) { + var i = e.parts[n] + , o = i.mass !== 1 / 0 ? i.mass : 1; + t.mass += o, + t.area += i.area, + t.inertia += i.inertia, + t.centre = r.add(t.centre, r.mult(i.position, o)) + } + return t.centre = r.div(t.centre, t.mass), + t + } + }() + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(4); + i._motionWakeThreshold = .18, + i._motionSleepThreshold = .08, + i._minBias = .9, + i.update = function(e, t) { + for (var n = t * t * t, o = 0; o < e.length; o++) { + var r = e[o] + , s = r.speed * r.speed + r.angularSpeed * r.angularSpeed; + if (0 === r.force.x && 0 === r.force.y) { + var a = Math.min(r.motion, s) + , l = Math.max(r.motion, s); + r.motion = i._minBias * a + (1 - i._minBias) * l, + r.sleepThreshold > 0 && r.motion < i._motionSleepThreshold * n ? (r.sleepCounter += 1, + r.sleepCounter >= r.sleepThreshold && i.set(r, !0)) : r.sleepCounter > 0 && (r.sleepCounter -= 1) + } else + i.set(r, !1) + } + } + , + i.afterCollisions = function(e, t) { + for (var n = t * t * t, o = 0; o < e.length; o++) { + var r = e[o]; + if (r.isActive) { + var s = r.collision + , a = s.bodyA.parent + , l = s.bodyB.parent; + if (!(a.isSleeping && l.isSleeping || a.isStatic || l.isStatic) && (a.isSleeping || l.isSleeping)) { + var c = a.isSleeping && !a.isStatic ? a : l + , d = c === a ? l : a; + !c.isStatic && d.motion > i._motionWakeThreshold * n && i.set(c, !1) + } + } + } + } + , + i.set = function(e, t) { + var n = e.isSleeping; + t ? (e.isSleeping = !0, + e.sleepCounter = e.sleepThreshold, + e.positionImpulse.x = 0, + e.positionImpulse.y = 0, + e.positionPrev.x = e.position.x, + e.positionPrev.y = e.position.y, + e.anglePrev = e.angle, + e.speed = 0, + e.angularSpeed = 0, + e.motion = 0, + n || o.trigger(e, "sleepStart")) : (e.isSleeping = !1, + e.sleepCounter = 0, + n && o.trigger(e, "sleepEnd")) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(2) + , s = n(7) + , a = n(1) + , l = n(15) + , c = n(0); + i._warming = .4, + i._torqueDampen = 1, + i._minLength = 1e-6, + i.create = function(e) { + var t = e; + t.bodyA && !t.pointA && (t.pointA = { + x: 0, + y: 0 + }), + t.bodyB && !t.pointB && (t.pointB = { + x: 0, + y: 0 + }); + var n = t.bodyA ? r.add(t.bodyA.position, t.pointA) : t.pointA + , i = t.bodyB ? r.add(t.bodyB.position, t.pointB) : t.pointB + , o = r.magnitude(r.sub(n, i)); + t.length = void 0 !== t.length ? t.length : o, + t.id = t.id || c.nextId(), + t.label = t.label || "Constraint", + t.type = "constraint", + t.stiffness = t.stiffness || (t.length > 0 ? 1 : .7), + t.damping = t.damping || 0, + t.angularStiffness = t.angularStiffness || 0, + t.angleA = t.bodyA ? t.bodyA.angle : t.angleA, + t.angleB = t.bodyB ? t.bodyB.angle : t.angleB, + t.plugin = {}; + var s = { + visible: !0, + lineWidth: 2, + strokeStyle: "#ffffff", + type: "line", + anchors: !0 + }; + return 0 === t.length && t.stiffness > .1 ? (s.type = "pin", + s.anchors = !1) : t.stiffness < .9 && (s.type = "spring"), + t.render = c.extend(s, t.render), + t + } + , + i.preSolveAll = function(e) { + for (var t = 0; t < e.length; t += 1) { + var n = e[t] + , i = n.constraintImpulse; + n.isStatic || 0 === i.x && 0 === i.y && 0 === i.angle || (n.position.x += i.x, + n.position.y += i.y, + n.angle += i.angle) + } + } + , + i.solveAll = function(e, t) { + for (var n = 0; n < e.length; n += 1) { + var o = e[n] + , r = !o.bodyA || o.bodyA && o.bodyA.isStatic + , s = !o.bodyB || o.bodyB && o.bodyB.isStatic; + (r || s) && i.solve(e[n], t) + } + for (n = 0; n < e.length; n += 1) + r = !(o = e[n]).bodyA || o.bodyA && o.bodyA.isStatic, + s = !o.bodyB || o.bodyB && o.bodyB.isStatic, + r || s || i.solve(e[n], t) + } + , + i.solve = function(e, t) { + var n = e.bodyA + , o = e.bodyB + , s = e.pointA + , a = e.pointB; + if (n || o) { + n && !n.isStatic && (r.rotate(s, n.angle - e.angleA, s), + e.angleA = n.angle), + o && !o.isStatic && (r.rotate(a, o.angle - e.angleB, a), + e.angleB = o.angle); + var l = s + , c = a; + if (n && (l = r.add(n.position, s)), + o && (c = r.add(o.position, a)), + l && c) { + var d = r.sub(l, c) + , u = r.magnitude(d); + u < i._minLength && (u = i._minLength); + var p, f, v, m, y, g = (u - e.length) / u, x = e.stiffness < 1 ? e.stiffness * t : e.stiffness, h = r.mult(d, g * x), b = (n ? n.inverseMass : 0) + (o ? o.inverseMass : 0), w = b + ((n ? n.inverseInertia : 0) + (o ? o.inverseInertia : 0)); + if (e.damping) { + var S = r.create(); + v = r.div(d, u), + y = r.sub(o && r.sub(o.position, o.positionPrev) || S, n && r.sub(n.position, n.positionPrev) || S), + m = r.dot(v, y) + } + n && !n.isStatic && (f = n.inverseMass / b, + n.constraintImpulse.x -= h.x * f, + n.constraintImpulse.y -= h.y * f, + n.position.x -= h.x * f, + n.position.y -= h.y * f, + e.damping && (n.positionPrev.x -= e.damping * v.x * m * f, + n.positionPrev.y -= e.damping * v.y * m * f), + p = r.cross(s, h) / w * i._torqueDampen * n.inverseInertia * (1 - e.angularStiffness), + n.constraintImpulse.angle -= p, + n.angle -= p), + o && !o.isStatic && (f = o.inverseMass / b, + o.constraintImpulse.x += h.x * f, + o.constraintImpulse.y += h.y * f, + o.position.x += h.x * f, + o.position.y += h.y * f, + e.damping && (o.positionPrev.x += e.damping * v.x * m * f, + o.positionPrev.y += e.damping * v.y * m * f), + p = r.cross(a, h) / w * i._torqueDampen * o.inverseInertia * (1 - e.angularStiffness), + o.constraintImpulse.angle += p, + o.angle += p) + } + } + } + , + i.postSolveAll = function(e) { + for (var t = 0; t < e.length; t++) { + var n = e[t] + , c = n.constraintImpulse; + if (!(n.isStatic || 0 === c.x && 0 === c.y && 0 === c.angle)) { + s.set(n, !1); + for (var d = 0; d < n.parts.length; d++) { + var u = n.parts[d]; + o.translate(u.vertices, c), + d > 0 && (u.position.x += c.x, + u.position.y += c.y), + 0 !== c.angle && (o.rotate(u.vertices, c.angle, n.position), + l.rotate(u.axes, c.angle), + d > 0 && r.rotateAbout(u.position, c.angle, n.position, u.position)), + a.update(u.bounds, u.vertices, n.velocity) + } + c.angle *= i._warming, + c.x *= i._warming, + c.y *= i._warming + } + } + } + , + i.pointAWorld = function(e) { + return { + x: (e.bodyA ? e.bodyA.position.x : 0) + e.pointA.x, + y: (e.bodyA ? e.bodyA.position.y : 0) + e.pointA.y + } + } + , + i.pointBWorld = function(e) { + return { + x: (e.bodyB ? e.bodyB.position.x : 0) + e.pointB.x, + y: (e.bodyB ? e.bodyB.position.y : 0) + e.pointB.y + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(18); + i.create = function(e, t) { + var n = e.bodyA + , o = e.bodyB + , r = e.parentA + , s = e.parentB + , a = { + id: i.id(n, o), + bodyA: n, + bodyB: o, + contacts: {}, + activeContacts: [], + separation: 0, + isActive: !0, + confirmedActive: !0, + isSensor: n.isSensor || o.isSensor, + timeCreated: t, + timeUpdated: t, + inverseMass: r.inverseMass + s.inverseMass, + friction: Math.min(r.friction, s.friction), + frictionStatic: Math.max(r.frictionStatic, s.frictionStatic), + restitution: Math.max(r.restitution, s.restitution), + slop: Math.max(r.slop, s.slop) + }; + return i.update(a, e, t), + a + } + , + i.update = function(e, t, n) { + var r = e.contacts + , s = t.supports + , a = e.activeContacts + , l = t.parentA + , c = t.parentB; + if (e.collision = t, + e.inverseMass = l.inverseMass + c.inverseMass, + e.friction = Math.min(l.friction, c.friction), + e.frictionStatic = Math.max(l.frictionStatic, c.frictionStatic), + e.restitution = Math.max(l.restitution, c.restitution), + e.slop = Math.max(l.slop, c.slop), + a.length = 0, + t.collided) { + for (var d = 0; d < s.length; d++) { + var u = s[d] + , p = o.id(u) + , f = r[p]; + f ? a.push(f) : a.push(r[p] = o.create(u)) + } + e.separation = t.depth, + i.setActive(e, !0, n) + } else + !0 === e.isActive && i.setActive(e, !1, n) + } + , + i.setActive = function(e, t, n) { + t ? (e.isActive = !0, + e.timeUpdated = n) : (e.isActive = !1, + e.activeContacts.length = 0) + } + , + i.id = function(e, t) { + return e.id < t.id ? "A" + e.id + "B" + t.id : "A" + t.id + "B" + e.id + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(0) + , r = n(5) + , s = n(1) + , a = n(4) + , l = n(11) + , c = n(2) + , d = n(14); + !function() { + var e, t; + "undefined" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function(e) { + window.setTimeout(function() { + e(o.now()) + }, 1e3 / 60) + } + , + t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame), + i.create = function(e) { + var t = { + controller: i, + engine: null, + element: null, + canvas: null, + mouse: null, + frameRequestId: null, + options: { + width: 800, + height: 600, + pixelRatio: 1, + background: "#14151f", + wireframeBackground: "#14151f", + hasBounds: !!e.bounds, + enabled: !0, + wireframes: !0, + showSleeping: !0, + showDebug: !1, + showBroadphase: !1, + showBounds: !1, + showVelocity: !1, + showCollisions: !1, + showSeparations: !1, + showAxes: !1, + showPositions: !1, + showAngleIndicator: !1, + showIds: !1, + showShadows: !1, + showVertexNumbers: !1, + showConvexHulls: !1, + showInternalEdges: !1, + showMousePosition: !1 + } + } + , r = o.extend(t, e); + return r.canvas && (r.canvas.width = r.options.width || r.canvas.width, + r.canvas.height = r.options.height || r.canvas.height), + r.mouse = e.mouse, + r.engine = e.engine, + r.canvas = r.canvas || n(r.options.width, r.options.height), + r.context = r.canvas.getContext("2d"), + r.textures = {}, + r.bounds = r.bounds || { + min: { + x: 0, + y: 0 + }, + max: { + x: r.canvas.width, + y: r.canvas.height + } + }, + 1 !== r.options.pixelRatio && i.setPixelRatio(r, r.options.pixelRatio), + o.isElement(r.element) ? r.element.appendChild(r.canvas) : r.canvas.parentNode || o.log("Render.create: options.element was undefined, render.canvas was created but not appended", "warn"), + r + } + , + i.run = function(t) { + !function n(o) { + t.frameRequestId = e(n), + i.world(t) + }() + } + , + i.stop = function(e) { + t(e.frameRequestId) + } + , + i.setPixelRatio = function(e, t) { + var n = e.options + , i = e.canvas; + "auto" === t && (t = u(i)), + n.pixelRatio = t, + i.setAttribute("data-pixel-ratio", t), + i.width = n.width * t, + i.height = n.height * t, + i.style.width = n.width + "px", + i.style.height = n.height + "px" + } + , + i.lookAt = function(e, t, n, i) { + i = void 0 === i || i, + t = o.isArray(t) ? t : [t], + n = n || { + x: 0, + y: 0 + }; + for (var r = { + min: { + x: 1 / 0, + y: 1 / 0 + }, + max: { + x: -1 / 0, + y: -1 / 0 + } + }, s = 0; s < t.length; s += 1) { + var a = t[s] + , l = a.bounds ? a.bounds.min : a.min || a.position || a + , c = a.bounds ? a.bounds.max : a.max || a.position || a; + l && c && (l.x < r.min.x && (r.min.x = l.x), + c.x > r.max.x && (r.max.x = c.x), + l.y < r.min.y && (r.min.y = l.y), + c.y > r.max.y && (r.max.y = c.y)) + } + var u = r.max.x - r.min.x + 2 * n.x + , p = r.max.y - r.min.y + 2 * n.y + , f = e.canvas.height + , v = e.canvas.width / f + , m = u / p + , y = 1 + , g = 1; + m > v ? g = m / v : y = v / m, + e.options.hasBounds = !0, + e.bounds.min.x = r.min.x, + e.bounds.max.x = r.min.x + u * y, + e.bounds.min.y = r.min.y, + e.bounds.max.y = r.min.y + p * g, + i && (e.bounds.min.x += .5 * u - u * y * .5, + e.bounds.max.x += .5 * u - u * y * .5, + e.bounds.min.y += .5 * p - p * g * .5, + e.bounds.max.y += .5 * p - p * g * .5), + e.bounds.min.x -= n.x, + e.bounds.max.x -= n.x, + e.bounds.min.y -= n.y, + e.bounds.max.y -= n.y, + e.mouse && (d.setScale(e.mouse, { + x: (e.bounds.max.x - e.bounds.min.x) / e.canvas.width, + y: (e.bounds.max.y - e.bounds.min.y) / e.canvas.height + }), + d.setOffset(e.mouse, e.bounds.min)) + } + , + i.startViewTransform = function(e) { + var t = e.bounds.max.x - e.bounds.min.x + , n = e.bounds.max.y - e.bounds.min.y + , i = t / e.options.width + , o = n / e.options.height; + e.context.setTransform(e.options.pixelRatio / i, 0, 0, e.options.pixelRatio / o, 0, 0), + e.context.translate(-e.bounds.min.x, -e.bounds.min.y) + } + , + i.endViewTransform = function(e) { + e.context.setTransform(e.options.pixelRatio, 0, 0, e.options.pixelRatio, 0, 0) + } + , + i.world = function(e) { + var t, n = e.engine, o = n.world, u = e.canvas, p = e.context, v = e.options, m = r.allBodies(o), y = r.allConstraints(o), g = v.wireframes ? v.wireframeBackground : v.background, x = [], h = [], b = { + timestamp: n.timing.timestamp + }; + if (a.trigger(e, "beforeRender", b), + e.currentBackground !== g && f(e, g), + p.globalCompositeOperation = "source-in", + p.fillStyle = "transparent", + p.fillRect(0, 0, u.width, u.height), + p.globalCompositeOperation = "source-over", + v.hasBounds) { + for (t = 0; t < m.length; t++) { + var w = m[t]; + s.overlaps(w.bounds, e.bounds) && x.push(w) + } + for (t = 0; t < y.length; t++) { + var S = y[t] + , A = S.bodyA + , P = S.bodyB + , C = S.pointA + , M = S.pointB; + A && (C = c.add(A.position, S.pointA)), + P && (M = c.add(P.position, S.pointB)), + C && M && (s.contains(e.bounds, C) || s.contains(e.bounds, M)) && h.push(S) + } + i.startViewTransform(e), + e.mouse && (d.setScale(e.mouse, { + x: (e.bounds.max.x - e.bounds.min.x) / e.options.width, + y: (e.bounds.max.y - e.bounds.min.y) / e.options.height + }), + d.setOffset(e.mouse, e.bounds.min)) + } else + h = y, + x = m, + 1 !== e.options.pixelRatio && e.context.setTransform(e.options.pixelRatio, 0, 0, e.options.pixelRatio, 0, 0); + !v.wireframes || n.enableSleeping && v.showSleeping ? i.bodies(e, x, p) : (v.showConvexHulls && i.bodyConvexHulls(e, x, p), + i.bodyWireframes(e, x, p)), + v.showBounds && i.bodyBounds(e, x, p), + (v.showAxes || v.showAngleIndicator) && i.bodyAxes(e, x, p), + v.showPositions && i.bodyPositions(e, x, p), + v.showVelocity && i.bodyVelocity(e, x, p), + v.showIds && i.bodyIds(e, x, p), + v.showSeparations && i.separations(e, n.pairs.list, p), + v.showCollisions && i.collisions(e, n.pairs.list, p), + v.showVertexNumbers && i.vertexNumbers(e, x, p), + v.showMousePosition && i.mousePosition(e, e.mouse, p), + i.constraints(h, p), + v.showBroadphase && n.broadphase.controller === l && i.grid(e, n.broadphase, p), + v.showDebug && i.debug(e, p), + v.hasBounds && i.endViewTransform(e), + a.trigger(e, "afterRender", b) + } + , + i.debug = function(e, t) { + var n = t + , i = e.engine + , o = i.world + , s = i.metrics + , a = e.options + , c = r.allBodies(o); + if (i.timing.timestamp - (e.debugTimestamp || 0) >= 500) { + var d = ""; + s.timing && (d += "fps: " + Math.round(s.timing.fps) + " "), + s.extended && (s.timing && (d += "delta: " + s.timing.delta.toFixed(3) + " ", + d += "correction: " + s.timing.correction.toFixed(3) + " "), + d += "bodies: " + c.length + " ", + i.broadphase.controller === l && (d += "buckets: " + s.buckets + " "), + d += "\n", + d += "collisions: " + s.collisions + " ", + d += "pairs: " + i.pairs.list.length + " ", + d += "broad: " + s.broadEff + " ", + d += "mid: " + s.midEff + " ", + d += "narrow: " + s.narrowEff + " "), + e.debugString = d, + e.debugTimestamp = i.timing.timestamp + } + if (e.debugString) { + n.font = "12px Arial", + a.wireframes ? n.fillStyle = "rgba(255,255,255,0.5)" : n.fillStyle = "rgba(0,0,0,0.5)"; + for (var u = e.debugString.split("\n"), p = 0; p < u.length; p++) + n.fillText(u[p], 50, 50 + 18 * p) + } + } + , + i.constraints = function(e, t) { + for (var n = t, i = 0; i < e.length; i++) { + var r = e[i]; + if (r.render.visible && r.pointA && r.pointB) { + var s, a, l = r.bodyA, d = r.bodyB; + if (s = l ? c.add(l.position, r.pointA) : r.pointA, + "pin" === r.render.type) + n.beginPath(), + n.arc(s.x, s.y, 3, 0, 2 * Math.PI), + n.closePath(); + else { + if (a = d ? c.add(d.position, r.pointB) : r.pointB, + n.beginPath(), + n.moveTo(s.x, s.y), + "spring" === r.render.type) + for (var u, p = c.sub(a, s), f = c.perp(c.normalise(p)), v = Math.ceil(o.clamp(r.length / 5, 12, 20)), m = 1; m < v; m += 1) + u = m % 2 == 0 ? 1 : -1, + n.lineTo(s.x + p.x * (m / v) + f.x * u * 4, s.y + p.y * (m / v) + f.y * u * 4); + n.lineTo(a.x, a.y) + } + r.render.lineWidth && (n.lineWidth = r.render.lineWidth, + n.strokeStyle = r.render.strokeStyle, + n.stroke()), + r.render.anchors && (n.fillStyle = r.render.strokeStyle, + n.beginPath(), + n.arc(s.x, s.y, 3, 0, 2 * Math.PI), + n.arc(a.x, a.y, 3, 0, 2 * Math.PI), + n.closePath(), + n.fill()) + } + } + } + , + i.bodyShadows = function(e, t, n) { + for (var i = n, o = (e.engine, + 0); o < t.length; o++) { + var r = t[o]; + if (r.render.visible) { + if (r.circleRadius) + i.beginPath(), + i.arc(r.position.x, r.position.y, r.circleRadius, 0, 2 * Math.PI), + i.closePath(); + else { + i.beginPath(), + i.moveTo(r.vertices[0].x, r.vertices[0].y); + for (var s = 1; s < r.vertices.length; s++) + i.lineTo(r.vertices[s].x, r.vertices[s].y); + i.closePath() + } + var a = r.position.x - .5 * e.options.width + , l = r.position.y - .2 * e.options.height + , c = Math.abs(a) + Math.abs(l); + i.shadowColor = "rgba(0,0,0,0.15)", + i.shadowOffsetX = .05 * a, + i.shadowOffsetY = .05 * l, + i.shadowBlur = 1 + 12 * Math.min(1, c / 1e3), + i.fill(), + i.shadowColor = null, + i.shadowOffsetX = null, + i.shadowOffsetY = null, + i.shadowBlur = null + } + } + } + , + i.bodies = function(e, t, n) { + var i, o, r, s, a = n, l = (e.engine, + e.options), c = l.showInternalEdges || !l.wireframes; + for (r = 0; r < t.length; r++) + if ((i = t[r]).render.visible) + for (s = i.parts.length > 1 ? 1 : 0; s < i.parts.length; s++) + if ((o = i.parts[s]).render.visible) { + if (l.showSleeping && i.isSleeping ? a.globalAlpha = .5 * o.render.opacity : 1 !== o.render.opacity && (a.globalAlpha = o.render.opacity), + o.render.sprite && o.render.sprite.texture && !l.wireframes) { + var d = o.render.sprite + , u = p(e, d.texture); + a.translate(o.position.x, o.position.y), + a.rotate(o.angle), + a.drawImage(u, u.width * -d.xOffset * d.xScale, u.height * -d.yOffset * d.yScale, u.width * d.xScale, u.height * d.yScale), + a.rotate(-o.angle), + a.translate(-o.position.x, -o.position.y) + } else { + if (o.circleRadius) + a.beginPath(), + a.arc(o.position.x, o.position.y, o.circleRadius, 0, 2 * Math.PI); + else { + a.beginPath(), + a.moveTo(o.vertices[0].x, o.vertices[0].y); + for (var f = 1; f < o.vertices.length; f++) + !o.vertices[f - 1].isInternal || c ? a.lineTo(o.vertices[f].x, o.vertices[f].y) : a.moveTo(o.vertices[f].x, o.vertices[f].y), + o.vertices[f].isInternal && !c && a.moveTo(o.vertices[(f + 1) % o.vertices.length].x, o.vertices[(f + 1) % o.vertices.length].y); + a.lineTo(o.vertices[0].x, o.vertices[0].y), + a.closePath() + } + l.wireframes ? (a.lineWidth = 1, + a.strokeStyle = "#bbb", + a.stroke()) : (a.fillStyle = o.render.fillStyle, + o.render.lineWidth && (a.lineWidth = o.render.lineWidth, + a.strokeStyle = o.render.strokeStyle, + a.stroke()), + a.fill()) + } + a.globalAlpha = 1 + } + } + , + i.bodyWireframes = function(e, t, n) { + var i, o, r, s, a, l = n, c = e.options.showInternalEdges; + for (l.beginPath(), + r = 0; r < t.length; r++) + if ((i = t[r]).render.visible) + for (a = i.parts.length > 1 ? 1 : 0; a < i.parts.length; a++) { + for (o = i.parts[a], + l.moveTo(o.vertices[0].x, o.vertices[0].y), + s = 1; s < o.vertices.length; s++) + !o.vertices[s - 1].isInternal || c ? l.lineTo(o.vertices[s].x, o.vertices[s].y) : l.moveTo(o.vertices[s].x, o.vertices[s].y), + o.vertices[s].isInternal && !c && l.moveTo(o.vertices[(s + 1) % o.vertices.length].x, o.vertices[(s + 1) % o.vertices.length].y); + l.lineTo(o.vertices[0].x, o.vertices[0].y) + } + l.lineWidth = 1, + l.strokeStyle = "#bbb", + l.stroke() + } + , + i.bodyConvexHulls = function(e, t, n) { + var i, o, r, s = n; + for (s.beginPath(), + o = 0; o < t.length; o++) + if ((i = t[o]).render.visible && 1 !== i.parts.length) { + for (s.moveTo(i.vertices[0].x, i.vertices[0].y), + r = 1; r < i.vertices.length; r++) + s.lineTo(i.vertices[r].x, i.vertices[r].y); + s.lineTo(i.vertices[0].x, i.vertices[0].y) + } + s.lineWidth = 1, + s.strokeStyle = "rgba(255,255,255,0.2)", + s.stroke() + } + , + i.vertexNumbers = function(e, t, n) { + var i, o, r, s = n; + for (i = 0; i < t.length; i++) { + var a = t[i].parts; + for (r = a.length > 1 ? 1 : 0; r < a.length; r++) { + var l = a[r]; + for (o = 0; o < l.vertices.length; o++) + s.fillStyle = "rgba(255,255,255,0.2)", + s.fillText(i + "_" + o, l.position.x + .8 * (l.vertices[o].x - l.position.x), l.position.y + .8 * (l.vertices[o].y - l.position.y)) + } + } + } + , + i.mousePosition = function(e, t, n) { + var i = n; + i.fillStyle = "rgba(255,255,255,0.8)", + i.fillText(t.position.x + " " + t.position.y, t.position.x + 5, t.position.y - 5) + } + , + i.bodyBounds = function(e, t, n) { + var i = n + , o = (e.engine, + e.options); + i.beginPath(); + for (var r = 0; r < t.length; r++) { + if (t[r].render.visible) + for (var s = t[r].parts, a = s.length > 1 ? 1 : 0; a < s.length; a++) { + var l = s[a]; + i.rect(l.bounds.min.x, l.bounds.min.y, l.bounds.max.x - l.bounds.min.x, l.bounds.max.y - l.bounds.min.y) + } + } + o.wireframes ? i.strokeStyle = "rgba(255,255,255,0.08)" : i.strokeStyle = "rgba(0,0,0,0.1)", + i.lineWidth = 1, + i.stroke() + } + , + i.bodyAxes = function(e, t, n) { + var i, o, r, s, a = n, l = (e.engine, + e.options); + for (a.beginPath(), + o = 0; o < t.length; o++) { + var c = t[o] + , d = c.parts; + if (c.render.visible) + if (l.showAxes) + for (r = d.length > 1 ? 1 : 0; r < d.length; r++) + for (i = d[r], + s = 0; s < i.axes.length; s++) { + var u = i.axes[s]; + a.moveTo(i.position.x, i.position.y), + a.lineTo(i.position.x + 20 * u.x, i.position.y + 20 * u.y) + } + else + for (r = d.length > 1 ? 1 : 0; r < d.length; r++) + for (i = d[r], + s = 0; s < i.axes.length; s++) + a.moveTo(i.position.x, i.position.y), + a.lineTo((i.vertices[0].x + i.vertices[i.vertices.length - 1].x) / 2, (i.vertices[0].y + i.vertices[i.vertices.length - 1].y) / 2) + } + l.wireframes ? (a.strokeStyle = "indianred", + a.lineWidth = 1) : (a.strokeStyle = "rgba(255, 255, 255, 0.4)", + a.globalCompositeOperation = "overlay", + a.lineWidth = 2), + a.stroke(), + a.globalCompositeOperation = "source-over" + } + , + i.bodyPositions = function(e, t, n) { + var i, o, r, s, a = n, l = (e.engine, + e.options); + for (a.beginPath(), + r = 0; r < t.length; r++) + if ((i = t[r]).render.visible) + for (s = 0; s < i.parts.length; s++) + o = i.parts[s], + a.arc(o.position.x, o.position.y, 3, 0, 2 * Math.PI, !1), + a.closePath(); + for (l.wireframes ? a.fillStyle = "indianred" : a.fillStyle = "rgba(0,0,0,0.5)", + a.fill(), + a.beginPath(), + r = 0; r < t.length; r++) + (i = t[r]).render.visible && (a.arc(i.positionPrev.x, i.positionPrev.y, 2, 0, 2 * Math.PI, !1), + a.closePath()); + a.fillStyle = "rgba(255,165,0,0.8)", + a.fill() + } + , + i.bodyVelocity = function(e, t, n) { + var i = n; + i.beginPath(); + for (var o = 0; o < t.length; o++) { + var r = t[o]; + r.render.visible && (i.moveTo(r.position.x, r.position.y), + i.lineTo(r.position.x + 2 * (r.position.x - r.positionPrev.x), r.position.y + 2 * (r.position.y - r.positionPrev.y))) + } + i.lineWidth = 3, + i.strokeStyle = "cornflowerblue", + i.stroke() + } + , + i.bodyIds = function(e, t, n) { + var i, o, r = n; + for (i = 0; i < t.length; i++) + if (t[i].render.visible) { + var s = t[i].parts; + for (o = s.length > 1 ? 1 : 0; o < s.length; o++) { + var a = s[o]; + r.font = "12px Arial", + r.fillStyle = "rgba(255,255,255,0.5)", + r.fillText(a.id, a.position.x + 10, a.position.y - 10) + } + } + } + , + i.collisions = function(e, t, n) { + var i, o, r, s, a = n, l = e.options; + for (a.beginPath(), + r = 0; r < t.length; r++) + if ((i = t[r]).isActive) + for (o = i.collision, + s = 0; s < i.activeContacts.length; s++) { + var c = i.activeContacts[s].vertex; + a.rect(c.x - 1.5, c.y - 1.5, 3.5, 3.5) + } + for (l.wireframes ? a.fillStyle = "rgba(255,255,255,0.7)" : a.fillStyle = "orange", + a.fill(), + a.beginPath(), + r = 0; r < t.length; r++) + if ((i = t[r]).isActive && (o = i.collision, + i.activeContacts.length > 0)) { + var d = i.activeContacts[0].vertex.x + , u = i.activeContacts[0].vertex.y; + 2 === i.activeContacts.length && (d = (i.activeContacts[0].vertex.x + i.activeContacts[1].vertex.x) / 2, + u = (i.activeContacts[0].vertex.y + i.activeContacts[1].vertex.y) / 2), + o.bodyB === o.supports[0].body || !0 === o.bodyA.isStatic ? a.moveTo(d - 8 * o.normal.x, u - 8 * o.normal.y) : a.moveTo(d + 8 * o.normal.x, u + 8 * o.normal.y), + a.lineTo(d, u) + } + l.wireframes ? a.strokeStyle = "rgba(255,165,0,0.7)" : a.strokeStyle = "orange", + a.lineWidth = 1, + a.stroke() + } + , + i.separations = function(e, t, n) { + var i, o, r, s, a, l = n, c = e.options; + for (l.beginPath(), + a = 0; a < t.length; a++) + if ((i = t[a]).isActive) { + r = (o = i.collision).bodyA; + var d = 1; + (s = o.bodyB).isStatic || r.isStatic || (d = .5), + s.isStatic && (d = 0), + l.moveTo(s.position.x, s.position.y), + l.lineTo(s.position.x - o.penetration.x * d, s.position.y - o.penetration.y * d), + d = 1, + s.isStatic || r.isStatic || (d = .5), + r.isStatic && (d = 0), + l.moveTo(r.position.x, r.position.y), + l.lineTo(r.position.x + o.penetration.x * d, r.position.y + o.penetration.y * d) + } + c.wireframes ? l.strokeStyle = "rgba(255,165,0,0.5)" : l.strokeStyle = "orange", + l.stroke() + } + , + i.grid = function(e, t, n) { + var i = n; + e.options.wireframes ? i.strokeStyle = "rgba(255,180,0,0.1)" : i.strokeStyle = "rgba(255,180,0,0.5)", + i.beginPath(); + for (var r = o.keys(t.buckets), s = 0; s < r.length; s++) { + var a = r[s]; + if (!(t.buckets[a].length < 2)) { + var l = a.split(/C|R/); + i.rect(.5 + parseInt(l[1], 10) * t.bucketWidth, .5 + parseInt(l[2], 10) * t.bucketHeight, t.bucketWidth, t.bucketHeight) + } + } + i.lineWidth = 1, + i.stroke() + } + , + i.inspector = function(e, t) { + e.engine; + var n, i = e.selected, o = e.render, r = o.options; + if (r.hasBounds) { + var s = o.bounds.max.x - o.bounds.min.x + , a = o.bounds.max.y - o.bounds.min.y + , l = s / o.options.width + , c = a / o.options.height; + t.scale(1 / l, 1 / c), + t.translate(-o.bounds.min.x, -o.bounds.min.y) + } + for (var d = 0; d < i.length; d++) { + var u = i[d].data; + switch (t.translate(.5, .5), + t.lineWidth = 1, + t.strokeStyle = "rgba(255,165,0,0.9)", + t.setLineDash([1, 2]), + u.type) { + case "body": + n = u.bounds, + t.beginPath(), + t.rect(Math.floor(n.min.x - 3), Math.floor(n.min.y - 3), Math.floor(n.max.x - n.min.x + 6), Math.floor(n.max.y - n.min.y + 6)), + t.closePath(), + t.stroke(); + break; + case "constraint": + var p = u.pointA; + u.bodyA && (p = u.pointB), + t.beginPath(), + t.arc(p.x, p.y, 10, 0, 2 * Math.PI), + t.closePath(), + t.stroke(); + } + t.setLineDash([]), + t.translate(-.5, -.5) + } + null !== e.selectStart && (t.translate(.5, .5), + t.lineWidth = 1, + t.strokeStyle = "rgba(255,165,0,0.6)", + t.fillStyle = "rgba(255,165,0,0.1)", + n = e.selectBounds, + t.beginPath(), + t.rect(Math.floor(n.min.x), Math.floor(n.min.y), Math.floor(n.max.x - n.min.x), Math.floor(n.max.y - n.min.y)), + t.closePath(), + t.stroke(), + t.fill(), + t.translate(-.5, -.5)), + r.hasBounds && t.setTransform(1, 0, 0, 1, 0, 0) + } + ; + var n = function(e, t) { + var n = document.createElement("canvas"); + return n.width = e, + n.height = t, + n.oncontextmenu = function() { + return !1 + } + , + n.onselectstart = function() { + return !1 + } + , + n + } + , u = function(e) { + var t = e.getContext("2d"); + return (window.devicePixelRatio || 1) / (t.webkitBackingStorePixelRatio || t.mozBackingStorePixelRatio || t.msBackingStorePixelRatio || t.oBackingStorePixelRatio || t.backingStorePixelRatio || 1) + } + , p = function(e, t) { + var n = e.textures[t]; + return n || ((n = e.textures[t] = new Image).src = t, + n) + } + , f = function(e, t) { + var n = t; + /(jpg|gif|png)$/.test(t) && (n = "url(" + t + ")"), + e.canvas.style.background = n, + e.canvas.style.backgroundSize = "contain", + e.currentBackground = t + } + }() + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(9) + , r = n(12) + , s = n(0); + i.create = function(e) { + var t = { + controller: i, + detector: r.collisions, + buckets: {}, + pairs: {}, + pairsList: [], + bucketWidth: 48, + bucketHeight: 48 + }; + return s.extend(t, e) + } + , + i.update = function(e, t, n, o) { + var r, s, a, l, c, d = n.world, u = e.buckets, p = !1, f = n.metrics; + for (f.broadphaseTests = 0, + r = 0; r < t.length; r++) { + var v = t[r]; + if ((!v.isSleeping || o) && !(v.bounds.max.x < d.bounds.min.x || v.bounds.min.x > d.bounds.max.x || v.bounds.max.y < d.bounds.min.y || v.bounds.min.y > d.bounds.max.y)) { + var m = i._getRegion(e, v); + if (!v.region || m.id !== v.region.id || o) { + f.broadphaseTests += 1, + v.region && !o || (v.region = m); + var y = i._regionUnion(m, v.region); + for (s = y.startCol; s <= y.endCol; s++) + for (a = y.startRow; a <= y.endRow; a++) { + l = u[c = i._getBucketId(s, a)]; + var g = s >= m.startCol && s <= m.endCol && a >= m.startRow && a <= m.endRow + , x = s >= v.region.startCol && s <= v.region.endCol && a >= v.region.startRow && a <= v.region.endRow; + !g && x && x && l && i._bucketRemoveBody(e, l, v), + (v.region === m || g && !x || o) && (l || (l = i._createBucket(u, c)), + i._bucketAddBody(e, l, v)) + } + v.region = m, + p = !0 + } + } + } + p && (e.pairsList = i._createActivePairsList(e)) + } + , + i.clear = function(e) { + e.buckets = {}, + e.pairs = {}, + e.pairsList = [] + } + , + i._regionUnion = function(e, t) { + var n = Math.min(e.startCol, t.startCol) + , o = Math.max(e.endCol, t.endCol) + , r = Math.min(e.startRow, t.startRow) + , s = Math.max(e.endRow, t.endRow); + return i._createRegion(n, o, r, s) + } + , + i._getRegion = function(e, t) { + var n = t.bounds + , o = Math.floor(n.min.x / e.bucketWidth) + , r = Math.floor(n.max.x / e.bucketWidth) + , s = Math.floor(n.min.y / e.bucketHeight) + , a = Math.floor(n.max.y / e.bucketHeight); + return i._createRegion(o, r, s, a) + } + , + i._createRegion = function(e, t, n, i) { + return { + id: e + "," + t + "," + n + "," + i, + startCol: e, + endCol: t, + startRow: n, + endRow: i + } + } + , + i._getBucketId = function(e, t) { + return "C" + e + "R" + t + } + , + i._createBucket = function(e, t) { + return e[t] = [] + } + , + i._bucketAddBody = function(e, t, n) { + for (var i = 0; i < t.length; i++) { + var r = t[i]; + if (!(n.id === r.id || n.isStatic && r.isStatic)) { + var s = o.id(n, r) + , a = e.pairs[s]; + a ? a[2] += 1 : e.pairs[s] = [n, r, 1] + } + } + t.push(n) + } + , + i._bucketRemoveBody = function(e, t, n) { + t.splice(s.indexOf(t, n), 1); + for (var i = 0; i < t.length; i++) { + var r = t[i] + , a = o.id(n, r) + , l = e.pairs[a]; + l && (l[2] -= 1) + } + } + , + i._createActivePairsList = function(e) { + var t, n, i = []; + t = s.keys(e.pairs); + for (var o = 0; o < t.length; o++) + (n = e.pairs[t[o]])[2] > 0 ? i.push(n) : delete e.pairs[t[o]]; + return i + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(13) + , r = n(9) + , s = n(1); + i.collisions = function(e, t) { + for (var n = [], a = t.pairs.table, l = t.metrics, c = 0; c < e.length; c++) { + var d = e[c][0] + , u = e[c][1]; + if ((!d.isStatic && !d.isSleeping || !u.isStatic && !u.isSleeping) && i.canCollide(d.collisionFilter, u.collisionFilter) && (l.midphaseTests += 1, + s.overlaps(d.bounds, u.bounds))) + for (var p = d.parts.length > 1 ? 1 : 0; p < d.parts.length; p++) + for (var f = d.parts[p], v = u.parts.length > 1 ? 1 : 0; v < u.parts.length; v++) { + var m = u.parts[v]; + if (f === d && m === u || s.overlaps(f.bounds, m.bounds)) { + var y, g = a[r.id(f, m)]; + y = g && g.isActive ? g.collision : null; + var x = o.collides(f, m, y); + l.narrowphaseTests += 1, + x.reused && (l.narrowReuseCount += 1), + x.collided && (n.push(x), + l.narrowDetections += 1) + } + } + } + return n + } + , + i.canCollide = function(e, t) { + return e.group === t.group && 0 !== e.group ? e.group > 0 : 0 != (e.mask & t.category) && 0 != (t.mask & e.category) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(2); + i.collides = function(e, t, n) { + var s, a, l, c, d = !1; + if (n) { + var u = e.parent + , p = t.parent + , f = u.speed * u.speed + u.angularSpeed * u.angularSpeed + p.speed * p.speed + p.angularSpeed * p.angularSpeed; + d = n && n.collided && f < .2, + c = n + } else + c = { + collided: !1, + bodyA: e, + bodyB: t + }; + if (n && d) { + var v = c.axisBody + , m = v === e ? t : e + , y = [v.axes[n.axisNumber]]; + if (l = i._overlapAxes(v.vertices, m.vertices, y), + c.reused = !0, + l.overlap <= 0) + return c.collided = !1, + c + } else { + if ((s = i._overlapAxes(e.vertices, t.vertices, e.axes)).overlap <= 0) + return c.collided = !1, + c; + if ((a = i._overlapAxes(t.vertices, e.vertices, t.axes)).overlap <= 0) + return c.collided = !1, + c; + s.overlap < a.overlap ? (l = s, + c.axisBody = e) : (l = a, + c.axisBody = t), + c.axisNumber = l.axisNumber + } + c.bodyA = e.id < t.id ? e : t, + c.bodyB = e.id < t.id ? t : e, + c.collided = !0, + c.depth = l.overlap, + c.parentA = c.bodyA.parent, + c.parentB = c.bodyB.parent, + e = c.bodyA, + t = c.bodyB, + r.dot(l.axis, r.sub(t.position, e.position)) < 0 ? c.normal = { + x: l.axis.x, + y: l.axis.y + } : c.normal = { + x: -l.axis.x, + y: -l.axis.y + }, + c.tangent = r.perp(c.normal), + c.penetration = c.penetration || {}, + c.penetration.x = c.normal.x * c.depth, + c.penetration.y = c.normal.y * c.depth; + var g = i._findSupports(e, t, c.normal) + , x = []; + if (o.contains(e.vertices, g[0]) && x.push(g[0]), + o.contains(e.vertices, g[1]) && x.push(g[1]), + x.length < 2) { + var h = i._findSupports(t, e, r.neg(c.normal)); + o.contains(t.vertices, h[0]) && x.push(h[0]), + x.length < 2 && o.contains(t.vertices, h[1]) && x.push(h[1]) + } + return x.length < 1 && (x = [g[0]]), + c.supports = x, + c + } + , + i._overlapAxes = function(e, t, n) { + for (var o, s, a = r._temp[0], l = r._temp[1], c = { + overlap: Number.MAX_VALUE + }, d = 0; d < n.length; d++) { + if (s = n[d], + i._projectToAxis(a, e, s), + i._projectToAxis(l, t, s), + (o = Math.min(a.max - l.min, l.max - a.min)) <= 0) + return c.overlap = o, + c; + o < c.overlap && (c.overlap = o, + c.axis = s, + c.axisNumber = d) + } + return c + } + , + i._projectToAxis = function(e, t, n) { + for (var i = r.dot(t[0], n), o = i, s = 1; s < t.length; s += 1) { + var a = r.dot(t[s], n); + a > o ? o = a : a < i && (i = a) + } + e.min = i, + e.max = o + } + , + i._findSupports = function(e, t, n) { + for (var i, o, s, a, l = Number.MAX_VALUE, c = r._temp[0], d = t.vertices, u = e.position, p = 0; p < d.length; p++) + o = d[p], + c.x = o.x - u.x, + c.y = o.y - u.y, + (i = -r.dot(n, c)) < l && (l = i, + s = o); + return o = d[s.index - 1 >= 0 ? s.index - 1 : d.length - 1], + c.x = o.x - u.x, + c.y = o.y - u.y, + l = -r.dot(n, c), + a = o, + o = d[(s.index + 1) % d.length], + c.x = o.x - u.x, + c.y = o.y - u.y, + (i = -r.dot(n, c)) < l && (a = o), + [s, a] + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(0); + i.create = function(e) { + var t = {}; + return e || o.log("Mouse.create: element was undefined, defaulting to document.body", "warn"), + t.element = e || document.body, + t.absolute = { + x: 0, + y: 0 + }, + t.position = { + x: 0, + y: 0 + }, + t.mousedownPosition = { + x: 0, + y: 0 + }, + t.mouseupPosition = { + x: 0, + y: 0 + }, + t.offset = { + x: 0, + y: 0 + }, + t.scale = { + x: 1, + y: 1 + }, + t.wheelDelta = 0, + t.button = -1, + t.pixelRatio = parseInt(t.element.getAttribute("data-pixel-ratio"), 10) || 1, + t.sourceEvents = { + mousemove: null, + mousedown: null, + mouseup: null, + mousewheel: null + }, + t.mousemove = function(e) { + var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio); + e.changedTouches && (t.button = 0, + e.preventDefault()), + t.absolute.x = n.x, + t.absolute.y = n.y, + t.position.x = t.absolute.x * t.scale.x + t.offset.x, + t.position.y = t.absolute.y * t.scale.y + t.offset.y, + t.sourceEvents.mousemove = e + } + , + t.mousedown = function(e) { + var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio); + e.changedTouches ? (t.button = 0, + e.preventDefault()) : t.button = e.button, + t.absolute.x = n.x, + t.absolute.y = n.y, + t.position.x = t.absolute.x * t.scale.x + t.offset.x, + t.position.y = t.absolute.y * t.scale.y + t.offset.y, + t.mousedownPosition.x = t.position.x, + t.mousedownPosition.y = t.position.y, + t.sourceEvents.mousedown = e + } + , + t.mouseup = function(e) { + var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio); + e.changedTouches && e.preventDefault(), + t.button = -1, + t.absolute.x = n.x, + t.absolute.y = n.y, + t.position.x = t.absolute.x * t.scale.x + t.offset.x, + t.position.y = t.absolute.y * t.scale.y + t.offset.y, + t.mouseupPosition.x = t.position.x, + t.mouseupPosition.y = t.position.y, + t.sourceEvents.mouseup = e + } + , + t.mousewheel = function(e) { + t.wheelDelta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail)), + e.preventDefault() + } + , + i.setElement(t, t.element), + t + } + , + i.setElement = function(e, t) { + e.element = t, + t.addEventListener("mousemove", e.mousemove), + t.addEventListener("mousedown", e.mousedown), + t.addEventListener("mouseup", e.mouseup), + t.addEventListener("mousewheel", e.mousewheel), + t.addEventListener("DOMMouseScroll", e.mousewheel), + t.addEventListener("touchmove", e.mousemove), + t.addEventListener("touchstart", e.mousedown), + t.addEventListener("touchend", e.mouseup) + } + , + i.clearSourceEvents = function(e) { + e.sourceEvents.mousemove = null, + e.sourceEvents.mousedown = null, + e.sourceEvents.mouseup = null, + e.sourceEvents.mousewheel = null, + e.wheelDelta = 0 + } + , + i.setOffset = function(e, t) { + e.offset.x = t.x, + e.offset.y = t.y, + e.position.x = e.absolute.x * e.scale.x + e.offset.x, + e.position.y = e.absolute.y * e.scale.y + e.offset.y + } + , + i.setScale = function(e, t) { + e.scale.x = t.x, + e.scale.y = t.y, + e.position.x = e.absolute.x * e.scale.x + e.offset.x, + e.position.y = e.absolute.y * e.scale.y + e.offset.y + } + , + i._getRelativeMousePosition = function(e, t, n) { + var i, o, r = t.getBoundingClientRect(), s = document.documentElement || document.body.parentNode || document.body, a = void 0 !== window.pageXOffset ? window.pageXOffset : s.scrollLeft, l = void 0 !== window.pageYOffset ? window.pageYOffset : s.scrollTop, c = e.changedTouches; + return c ? (i = c[0].pageX - r.left - a, + o = c[0].pageY - r.top - l) : (i = e.pageX - r.left - a, + o = e.pageY - r.top - l), + { + x: i / (t.clientWidth / (t.width || t.clientWidth) * n), + y: o / (t.clientHeight / (t.height || t.clientHeight) * n) + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(2) + , r = n(0); + i.fromVertices = function(e) { + for (var t = {}, n = 0; n < e.length; n++) { + var i = (n + 1) % e.length + , s = o.normalise({ + x: e[i].y - e[n].y, + y: e[n].x - e[i].x + }) + , a = 0 === s.y ? 1 / 0 : s.x / s.y; + t[a = a.toFixed(3).toString()] = s + } + return r.values(t) + } + , + i.rotate = function(e, t) { + if (0 !== t) + for (var n = Math.cos(t), i = Math.sin(t), o = 0; o < e.length; o++) { + var r, s = e[o]; + r = s.x * n - s.y * i, + s.y = s.x * i + s.y * n, + s.x = r + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(0) + , s = n(6) + , a = n(1) + , l = n(2); + i._decompWarned = !1, + i.rectangle = function(e, t, n, i, a) { + a = a || {}; + var l = { + label: "Rectangle Body", + position: { + x: e, + y: t + }, + vertices: o.fromPath("L 0 0 L " + n + " 0 L " + n + " " + i + " L 0 " + i) + }; + if (a.chamfer) { + var c = a.chamfer; + l.vertices = o.chamfer(l.vertices, c.radius, c.quality, c.qualityMin, c.qualityMax), + delete a.chamfer + } + return s.create(r.extend({}, l, a)) + } + , + i.trapezoid = function(e, t, n, i, a, l) { + l = l || {}; + var c, d = n * (a *= .5), u = d + (1 - 2 * a) * n, p = u + d; + c = a < .5 ? "L 0 0 L " + d + " " + -i + " L " + u + " " + -i + " L " + p + " 0" : "L 0 0 L " + u + " " + -i + " L " + p + " 0"; + var f = { + label: "Trapezoid Body", + position: { + x: e, + y: t + }, + vertices: o.fromPath(c) + }; + if (l.chamfer) { + var v = l.chamfer; + f.vertices = o.chamfer(f.vertices, v.radius, v.quality, v.qualityMin, v.qualityMax), + delete l.chamfer + } + return s.create(r.extend({}, f, l)) + } + , + i.circle = function(e, t, n, o, s) { + o = o || {}; + var a = { + label: "Circle Body", + circleRadius: n + }; + s = s || 25; + var l = Math.ceil(Math.max(10, Math.min(s, n))); + return l % 2 == 1 && (l += 1), + i.polygon(e, t, l, n, r.extend({}, a, o)) + } + , + i.polygon = function(e, t, n, a, l) { + if (l = l || {}, + n < 3) + return i.circle(e, t, a, l); + for (var c = 2 * Math.PI / n, d = "", u = .5 * c, p = 0; p < n; p += 1) { + var f = u + p * c + , v = Math.cos(f) * a + , m = Math.sin(f) * a; + d += "L " + v.toFixed(3) + " " + m.toFixed(3) + " " + } + var y = { + label: "Polygon Body", + position: { + x: e, + y: t + }, + vertices: o.fromPath(d) + }; + if (l.chamfer) { + var g = l.chamfer; + y.vertices = o.chamfer(y.vertices, g.radius, g.quality, g.qualityMin, g.qualityMax), + delete l.chamfer + } + return s.create(r.extend({}, y, l)) + } + , + i.fromVertices = function(e, t, c, d, u, p, f, v) { + var m, y, g, x, h, b, w, S, A, P, C; + try { + m = n(27) + } catch (E) { + m = null + } + for (y = Boolean(m && m.quickDecomp), + d = d || {}, + x = [], + u = void 0 !== u && u, + p = void 0 !== p ? p : .01, + f = void 0 !== f ? f : 10, + v = void 0 !== v ? v : .01, + r.isArray(c[0]) || (c = [c]), + P = 0; P < c.length; P += 1) + if (b = c[P], + !!(h = o.isConvex(b)) || y || i._decompWarned || (r.warn("Could not resolve the expected 'poly-decomp' package for concave vertices in 'Bodies.fromVertices'"), + r.warn("Try 'npm install poly-decomp --save' or as a global e.g. 'window.decomp'"), + i._decompWarned = !0), + h || !y) + b = h ? o.clockwiseSort(b) : o.hull(b), + x.push({ + position: { + x: e, + y: t + }, + vertices: b + }); + else { + var M = b.map(function(e) { + return [e.x, e.y] + }); + m.makeCCW(M), + !1 !== p && m.removeCollinearPoints(M, p), + !1 !== v && m.removeDuplicatePoints && m.removeDuplicatePoints(M, v); + var k = m.quickDecomp(M); + for (w = 0; w < k.length; w++) { + var B = k[w].map(function(e) { + return { + x: e[0], + y: e[1] + } + }); + f > 0 && o.area(B) < f || x.push({ + position: o.centre(B), + vertices: B + }) + } + } + for (w = 0; w < x.length; w++) + x[w] = s.create(r.extend(x[w], d)); + if (u) + for (w = 0; w < x.length; w++) { + var I = x[w]; + for (S = w + 1; S < x.length; S++) { + var _ = x[S]; + if (a.overlaps(I.bounds, _.bounds)) { + var T = I.vertices + , R = _.vertices; + for (A = 0; A < I.vertices.length; A++) + for (C = 0; C < _.vertices.length; C++) { + var L = l.magnitudeSquared(l.sub(T[(A + 1) % T.length], R[C])) + , O = l.magnitudeSquared(l.sub(T[A], R[(C + 1) % R.length])); + L < 5 && O < 5 && (T[A].isInternal = !0, + R[C].isInternal = !0) + } + } + } + } + return x.length > 1 ? (g = s.create(r.extend({ + parts: x.slice(0) + }, d)), + s.setPosition(g, { + x: e, + y: t + }), + g) : x[0] + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(0); + i._registry = {}, + i.register = function(e) { + if (i.isPlugin(e) || o.warn("Plugin.register:", i.toString(e), "does not implement all required fields."), + e.name in i._registry) { + var t = i._registry[e.name] + , n = i.versionParse(e.version).number + , r = i.versionParse(t.version).number; + n > r ? (o.warn("Plugin.register:", i.toString(t), "was upgraded to", i.toString(e)), + i._registry[e.name] = e) : n < r ? o.warn("Plugin.register:", i.toString(t), "can not be downgraded to", i.toString(e)) : e !== t && o.warn("Plugin.register:", i.toString(e), "is already registered to different plugin object") + } else + i._registry[e.name] = e; + return e + } + , + i.resolve = function(e) { + return i._registry[i.dependencyParse(e).name] + } + , + i.toString = function(e) { + return "string" == typeof e ? e : (e.name || "anonymous") + "@" + (e.version || e.range || "0.0.0") + } + , + i.isPlugin = function(e) { + return e && e.name && e.version && e.install + } + , + i.isUsed = function(e, t) { + return e.used.indexOf(t) > -1 + } + , + i.isFor = function(e, t) { + var n = e.for && i.dependencyParse(e.for); + return !e.for || t.name === n.name && i.versionSatisfies(t.version, n.range) + } + , + i.use = function(e, t) { + if (e.uses = (e.uses || []).concat(t || []), + 0 !== e.uses.length) { + for (var n = i.dependencies(e), r = o.topologicalSort(n), s = [], a = 0; a < r.length; a += 1) + if (r[a] !== e.name) { + var l = i.resolve(r[a]); + l ? i.isUsed(e, l.name) || (i.isFor(l, e) || (o.warn("Plugin.use:", i.toString(l), "is for", l.for, "but installed on", i.toString(e) + "."), + l._warned = !0), + l.install ? l.install(e) : (o.warn("Plugin.use:", i.toString(l), "does not specify an install function."), + l._warned = !0), + l._warned ? (s.push("\uD83D\uDD36 " + i.toString(l)), + delete l._warned) : s.push("\u2705 " + i.toString(l)), + e.used.push(l.name)) : s.push("\u274C " + r[a]) + } + s.length > 0 && o.info(s.join(" ")) + } else + o.warn("Plugin.use:", i.toString(e), "does not specify any dependencies to install.") + } + , + i.dependencies = function(e, t) { + var n = i.dependencyParse(e) + , r = n.name; + if (!(r in (t = t || {}))) { + e = i.resolve(e) || e, + t[r] = o.map(e.uses || [], function(t) { + i.isPlugin(t) && i.register(t); + var r = i.dependencyParse(t) + , s = i.resolve(t); + return s && !i.versionSatisfies(s.version, r.range) ? (o.warn("Plugin.dependencies:", i.toString(s), "does not satisfy", i.toString(r), "used by", i.toString(n) + "."), + s._warned = !0, + e._warned = !0) : s || (o.warn("Plugin.dependencies:", i.toString(t), "used by", i.toString(n), "could not be resolved."), + e._warned = !0), + r.name + }); + for (var s = 0; s < t[r].length; s += 1) + i.dependencies(t[r][s], t); + return t + } + } + , + i.dependencyParse = function(e) { + return o.isString(e) ? (/^[\w-]+(@(\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?))?$/.test(e) || o.warn("Plugin.dependencyParse:", e, "is not a valid dependency string."), + { + name: e.split("@")[0], + range: e.split("@")[1] || "*" + }) : { + name: e.name, + range: e.range || e.version + } + } + , + i.versionParse = function(e) { + var t = /^(\*)|(\^|~|>=|>)?\s*((\d+)\.(\d+)\.(\d+))(-[0-9A-Za-z-]+)?$/; + t.test(e) || o.warn("Plugin.versionParse:", e, "is not a valid version or range."); + var n = t.exec(e) + , i = Number(n[4]) + , r = Number(n[5]) + , s = Number(n[6]); + return { + isRange: Boolean(n[1] || n[2]), + version: n[3], + range: e, + operator: n[1] || n[2] || "", + major: i, + minor: r, + patch: s, + parts: [i, r, s], + prerelease: n[7], + number: 1e8 * i + 1e4 * r + s + } + } + , + i.versionSatisfies = function(e, t) { + t = t || "*"; + var n = i.versionParse(t) + , o = i.versionParse(e); + if (n.isRange) { + if ("*" === n.operator || "*" === e) + return !0; + if (">" === n.operator) + return o.number > n.number; + if (">=" === n.operator) + return o.number >= n.number; + if ("~" === n.operator) + return o.major === n.major && o.minor === n.minor && o.patch >= n.patch; + if ("^" === n.operator) + return n.major > 0 ? o.major === n.major && o.number >= n.number : n.minor > 0 ? o.minor === n.minor && o.patch >= n.patch : o.patch === n.patch + } + return e === t || "*" === e + } + } + , function(e, t) { + var n = {}; + e.exports = n, + n.create = function(e) { + return { + id: n.id(e), + vertex: e, + normalImpulse: 0, + tangentImpulse: 0 + } + } + , + n.id = function(e) { + return e.body.id + "_" + e.index + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(5) + , r = (n(8), + n(0)); + i.create = function(e) { + var t = o.create() + , n = { + label: "World", + gravity: { + x: 0, + y: 1, + scale: .001 + }, + bounds: { + min: { + x: -1 / 0, + y: -1 / 0 + }, + max: { + x: 1 / 0, + y: 1 / 0 + } + } + }; + return r.extend(t, n, e) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(9) + , r = n(0); + i._pairMaxIdleLife = 1e3, + i.create = function(e) { + return r.extend({ + table: {}, + list: [], + collisionStart: [], + collisionActive: [], + collisionEnd: [] + }, e) + } + , + i.update = function(e, t, n) { + var i, r, s, a, l = e.list, c = e.table, d = e.collisionStart, u = e.collisionEnd, p = e.collisionActive; + for (d.length = 0, + u.length = 0, + p.length = 0, + a = 0; a < l.length; a++) + l[a].confirmedActive = !1; + for (a = 0; a < t.length; a++) + (i = t[a]).collided && ((s = c[r = o.id(i.bodyA, i.bodyB)]) ? (s.isActive ? p.push(s) : d.push(s), + o.update(s, i, n), + s.confirmedActive = !0) : (s = o.create(i, n), + c[r] = s, + d.push(s), + l.push(s))); + for (a = 0; a < l.length; a++) + (s = l[a]).isActive && !s.confirmedActive && (o.setActive(s, !1, n), + u.push(s)) + } + , + i.removeOld = function(e, t) { + var n, o, r, s, a = e.list, l = e.table, c = []; + for (s = 0; s < a.length; s++) + (o = (n = a[s]).collision).bodyA.isSleeping || o.bodyB.isSleeping ? n.timeUpdated = t : t - n.timeUpdated > i._pairMaxIdleLife && c.push(s); + for (s = 0; s < c.length; s++) + delete l[(n = a[r = c[s] - s]).id], + a.splice(r, 1) + } + , + i.clear = function(e) { + return e.table = {}, + e.list.length = 0, + e.collisionStart.length = 0, + e.collisionActive.length = 0, + e.collisionEnd.length = 0, + e + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(2) + , s = n(0) + , a = n(1); + i._restingThresh = 4, + i._restingThreshTangent = 6, + i._positionDampen = .9, + i._positionWarming = .8, + i._frictionNormalMultiplier = 5, + i.preSolvePosition = function(e) { + var t, n, i; + for (t = 0; t < e.length; t++) + (n = e[t]).isActive && (i = n.activeContacts.length, + n.collision.parentA.totalContacts += i, + n.collision.parentB.totalContacts += i) + } + , + i.solvePosition = function(e, t) { + var n, o, s, a, l, c, d, u, p, f = r._temp[0], v = r._temp[1], m = r._temp[2], y = r._temp[3]; + for (n = 0; n < e.length; n++) + (o = e[n]).isActive && !o.isSensor && (a = (s = o.collision).parentA, + l = s.parentB, + c = s.normal, + d = r.sub(r.add(l.positionImpulse, l.position, f), r.add(a.positionImpulse, r.sub(l.position, s.penetration, v), m), y), + o.separation = r.dot(c, d)); + for (n = 0; n < e.length; n++) + (o = e[n]).isActive && !o.isSensor && (a = (s = o.collision).parentA, + l = s.parentB, + c = s.normal, + p = (o.separation - o.slop) * t, + (a.isStatic || l.isStatic) && (p *= 2), + a.isStatic || a.isSleeping || (u = i._positionDampen / a.totalContacts, + a.positionImpulse.x += c.x * p * u, + a.positionImpulse.y += c.y * p * u), + l.isStatic || l.isSleeping || (u = i._positionDampen / l.totalContacts, + l.positionImpulse.x -= c.x * p * u, + l.positionImpulse.y -= c.y * p * u)) + } + , + i.postSolvePosition = function(e) { + for (var t = 0; t < e.length; t++) { + var n = e[t]; + if (n.totalContacts = 0, + 0 !== n.positionImpulse.x || 0 !== n.positionImpulse.y) { + for (var s = 0; s < n.parts.length; s++) { + var l = n.parts[s]; + o.translate(l.vertices, n.positionImpulse), + a.update(l.bounds, l.vertices, n.velocity), + l.position.x += n.positionImpulse.x, + l.position.y += n.positionImpulse.y + } + n.positionPrev.x += n.positionImpulse.x, + n.positionPrev.y += n.positionImpulse.y, + r.dot(n.positionImpulse, n.velocity) < 0 ? (n.positionImpulse.x = 0, + n.positionImpulse.y = 0) : (n.positionImpulse.x *= i._positionWarming, + n.positionImpulse.y *= i._positionWarming) + } + } + } + , + i.preSolveVelocity = function(e) { + var t, n, i, o, s, a, l, c, d, u, p, f, v, m, y = r._temp[0], g = r._temp[1]; + for (t = 0; t < e.length; t++) + if ((i = e[t]).isActive && !i.isSensor) + for (o = i.activeContacts, + a = (s = i.collision).parentA, + l = s.parentB, + c = s.normal, + d = s.tangent, + n = 0; n < o.length; n++) + p = (u = o[n]).vertex, + f = u.normalImpulse, + v = u.tangentImpulse, + 0 === f && 0 === v || (y.x = c.x * f + d.x * v, + y.y = c.y * f + d.y * v, + a.isStatic || a.isSleeping || (m = r.sub(p, a.position, g), + a.positionPrev.x += y.x * a.inverseMass, + a.positionPrev.y += y.y * a.inverseMass, + a.anglePrev += r.cross(m, y) * a.inverseInertia), + l.isStatic || l.isSleeping || (m = r.sub(p, l.position, g), + l.positionPrev.x -= y.x * l.inverseMass, + l.positionPrev.y -= y.y * l.inverseMass, + l.anglePrev -= r.cross(m, y) * l.inverseInertia)) + } + , + i.solveVelocity = function(e, t) { + for (var n = t * t, o = r._temp[0], a = r._temp[1], l = r._temp[2], c = r._temp[3], d = r._temp[4], u = r._temp[5], p = 0; p < e.length; p++) { + var f = e[p]; + if (f.isActive && !f.isSensor) { + var v = f.collision + , m = v.parentA + , y = v.parentB + , g = v.normal + , x = v.tangent + , h = f.activeContacts + , b = 1 / h.length; + m.velocity.x = m.position.x - m.positionPrev.x, + m.velocity.y = m.position.y - m.positionPrev.y, + y.velocity.x = y.position.x - y.positionPrev.x, + y.velocity.y = y.position.y - y.positionPrev.y, + m.angularVelocity = m.angle - m.anglePrev, + y.angularVelocity = y.angle - y.anglePrev; + for (var w = 0; w < h.length; w++) { + var S = h[w] + , A = S.vertex + , P = r.sub(A, m.position, a) + , C = r.sub(A, y.position, l) + , M = r.add(m.velocity, r.mult(r.perp(P), m.angularVelocity), c) + , k = r.add(y.velocity, r.mult(r.perp(C), y.angularVelocity), d) + , B = r.sub(M, k, u) + , I = r.dot(g, B) + , _ = r.dot(x, B) + , T = Math.abs(_) + , R = s.sign(_) + , L = (1 + f.restitution) * I + , O = s.clamp(f.separation + I, 0, 1) * i._frictionNormalMultiplier + , E = _ + , V = 1 / 0; + T > f.friction * f.frictionStatic * O * n && (V = T, + E = s.clamp(f.friction * R * n, -V, V)); + var F = r.cross(P, g) + , D = r.cross(C, g) + , W = b / (m.inverseMass + y.inverseMass + m.inverseInertia * F * F + y.inverseInertia * D * D); + if (L *= W, + E *= W, + I < 0 && I * I > i._restingThresh * n) + S.normalImpulse = 0; + else { + var q = S.normalImpulse; + S.normalImpulse = Math.min(S.normalImpulse + L, 0), + L = S.normalImpulse - q + } + if (_ * _ > i._restingThreshTangent * n) + S.tangentImpulse = 0; + else { + var j = S.tangentImpulse; + S.tangentImpulse = s.clamp(S.tangentImpulse + E, -V, V), + E = S.tangentImpulse - j + } + o.x = g.x * L + x.x * E, + o.y = g.y * L + x.y * E, + m.isStatic || m.isSleeping || (m.positionPrev.x += o.x * m.inverseMass, + m.positionPrev.y += o.y * m.inverseMass, + m.anglePrev += r.cross(P, o) * m.inverseInertia), + y.isStatic || y.isSleeping || (y.positionPrev.x -= o.x * y.inverseMass, + y.positionPrev.y -= o.y * y.inverseMass, + y.anglePrev -= r.cross(C, o) * y.inverseInertia) + } + } + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(19) + , r = n(7) + , s = n(21) + , a = n(10) + , l = n(20) + , c = n(23) + , d = n(11) + , u = n(4) + , p = n(5) + , f = n(8) + , v = n(0) + , m = n(6); + i.create = function(e, t) { + t = (t = v.isElement(e) ? t : e) || {}, + ((e = v.isElement(e) ? e : null) || t.render) && v.warn("Engine.create: engine.render is deprecated (see docs)"); + var n = { + positionIterations: 6, + velocityIterations: 4, + constraintIterations: 2, + enableSleeping: !1, + events: [], + plugin: {}, + timing: { + timestamp: 0, + timeScale: 1 + }, + broadphase: { + controller: d + } + } + , i = v.extend(n, t); + if (e || i.render) { + var r = { + element: e, + controller: a + }; + i.render = v.extend(r, i.render) + } + return i.render && i.render.controller && (i.render = i.render.controller.create(i.render)), + i.render && (i.render.engine = i), + i.world = t.world || o.create(i.world), + i.pairs = l.create(), + i.broadphase = i.broadphase.controller.create(i.broadphase), + i.metrics = i.metrics || { + extended: !1 + }, + i.metrics = c.create(i.metrics), + i + } + , + i.update = function(e, t, n) { + t = t || 1e3 / 60, + n = n || 1; + var o, a = e.world, d = e.timing, v = e.broadphase, m = []; + d.timestamp += t * d.timeScale; + var y = { + timestamp: d.timestamp + }; + u.trigger(e, "beforeUpdate", y); + var g = p.allBodies(a) + , x = p.allConstraints(a); + for (c.reset(e.metrics), + e.enableSleeping && r.update(g, d.timeScale), + i._bodiesApplyGravity(g, a.gravity), + i._bodiesUpdate(g, t, d.timeScale, n, a.bounds), + f.preSolveAll(g), + o = 0; o < e.constraintIterations; o++) + f.solveAll(x, d.timeScale); + f.postSolveAll(g), + v.controller ? (a.isModified && v.controller.clear(v), + v.controller.update(v, g, e, a.isModified), + m = v.pairsList) : m = g, + a.isModified && p.setModified(a, !1, !1, !0); + var h = v.detector(m, e) + , b = e.pairs + , w = d.timestamp; + for (l.update(b, h, w), + l.removeOld(b, w), + e.enableSleeping && r.afterCollisions(b.list, d.timeScale), + b.collisionStart.length > 0 && u.trigger(e, "collisionStart", { + pairs: b.collisionStart + }), + s.preSolvePosition(b.list), + o = 0; o < e.positionIterations; o++) + s.solvePosition(b.list, d.timeScale); + for (s.postSolvePosition(g), + f.preSolveAll(g), + o = 0; o < e.constraintIterations; o++) + f.solveAll(x, d.timeScale); + for (f.postSolveAll(g), + s.preSolveVelocity(b.list), + o = 0; o < e.velocityIterations; o++) + s.solveVelocity(b.list, d.timeScale); + return b.collisionActive.length > 0 && u.trigger(e, "collisionActive", { + pairs: b.collisionActive + }), + b.collisionEnd.length > 0 && u.trigger(e, "collisionEnd", { + pairs: b.collisionEnd + }), + c.update(e.metrics, e), + i._bodiesClearForces(g), + u.trigger(e, "afterUpdate", y), + e + } + , + i.merge = function(e, t) { + if (v.extend(e, t), + t.world) { + e.world = t.world, + i.clear(e); + for (var n = p.allBodies(e.world), o = 0; o < n.length; o++) { + var s = n[o]; + r.set(s, !1), + s.id = v.nextId() + } + } + } + , + i.clear = function(e) { + var t = e.world; + l.clear(e.pairs); + var n = e.broadphase; + if (n.controller) { + var i = p.allBodies(t); + n.controller.clear(n), + n.controller.update(n, i, e, !0) + } + } + , + i._bodiesClearForces = function(e) { + for (var t = 0; t < e.length; t++) { + var n = e[t]; + n.force.x = 0, + n.force.y = 0, + n.torque = 0 + } + } + , + i._bodiesApplyGravity = function(e, t) { + var n = void 0 !== t.scale ? t.scale : .001; + if ((0 !== t.x || 0 !== t.y) && 0 !== n) + for (var i = 0; i < e.length; i++) { + var o = e[i]; + o.isStatic || o.isSleeping || (o.force.y += o.mass * t.y * n, + o.force.x += o.mass * t.x * n) + } + } + , + i._bodiesUpdate = function(e, t, n, i, o) { + for (var r = 0; r < e.length; r++) { + var s = e[r]; + s.isStatic || s.isSleeping || m.update(s, t, n, i) + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(5) + , r = n(0); + i.create = function(e) { + return r.extend({ + extended: !1, + narrowDetections: 0, + narrowphaseTests: 0, + narrowReuse: 0, + narrowReuseCount: 0, + midphaseTests: 0, + broadphaseTests: 0, + narrowEff: 1e-4, + midEff: 1e-4, + broadEff: 1e-4, + collisions: 0, + buckets: 0, + bodies: 0, + pairs: 0 + }, !1, e) + } + , + i.reset = function(e) { + e.extended && (e.narrowDetections = 0, + e.narrowphaseTests = 0, + e.narrowReuse = 0, + e.narrowReuseCount = 0, + e.midphaseTests = 0, + e.broadphaseTests = 0, + e.narrowEff = 0, + e.midEff = 0, + e.broadEff = 0, + e.collisions = 0, + e.buckets = 0, + e.pairs = 0, + e.bodies = 0) + } + , + i.update = function(e, t) { + if (e.extended) { + var n = t.world + , i = o.allBodies(n); + e.collisions = e.narrowDetections, + e.pairs = t.pairs.list.length, + e.bodies = i.length, + e.midEff = (e.narrowDetections / (e.midphaseTests || 1)).toFixed(2), + e.narrowEff = (e.narrowDetections / (e.narrowphaseTests || 1)).toFixed(2), + e.broadEff = (1 - e.broadphaseTests / (i.length || 1)).toFixed(2), + e.narrowReuse = (e.narrowReuseCount / (e.narrowphaseTests || 1)).toFixed(2) + } + } + } + , function(e, t, n) { + var i = e.exports = n(25); + i.Body = n(6), + i.Composite = n(5), + i.World = n(19), + i.Contact = n(18), + i.Detector = n(12), + i.Grid = n(11), + i.Pairs = n(20), + i.Pair = n(9), + i.Query = n(26), + i.Resolver = n(21), + i.SAT = n(13), + i.Constraint = n(8), + i.MouseConstraint = n(28), + i.Common = n(0), + i.Engine = n(22), + i.Events = n(4), + i.Mouse = n(14), + i.Runner = n(29), + i.Sleeping = n(7), + i.Plugin = n(17), + i.Metrics = n(23), + i.Bodies = n(16), + i.Composites = n(30), + i.Axes = n(15), + i.Bounds = n(1), + i.Svg = n(31), + i.Vector = n(2), + i.Vertices = n(3), + i.Render = n(10), + i.RenderPixi = n(32), + i.World.add = i.Composite.add, + i.World.remove = i.Composite.remove, + i.World.addComposite = i.Composite.addComposite, + i.World.addBody = i.Composite.addBody, + i.World.addConstraint = i.Composite.addConstraint, + i.World.clear = i.Composite.clear, + i.Engine.run = i.Runner.run + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(17) + , r = n(0); + i.name = "matter-js", + i.version = "0.16.1", + i.uses = [], + i.used = [], + i.use = function() { + o.use(i, Array.prototype.slice.call(arguments)) + } + , + i.before = function(e, t) { + return e = e.replace(/^Matter./, ""), + r.chainPathBefore(i, e, t) + } + , + i.after = function(e, t) { + return e = e.replace(/^Matter./, ""), + r.chainPathAfter(i, e, t) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(2) + , r = n(13) + , s = n(1) + , a = n(16) + , l = n(3); + i.collides = function(e, t) { + for (var n = [], i = 0; i < t.length; i++) { + var o = t[i]; + if (s.overlaps(o.bounds, e.bounds)) + for (var a = 1 === o.parts.length ? 0 : 1; a < o.parts.length; a++) { + var l = o.parts[a]; + if (s.overlaps(l.bounds, e.bounds)) { + var c = r.collides(l, e); + if (c.collided) { + n.push(c); + break + } + } + } + } + return n + } + , + i.ray = function(e, t, n, r) { + r = r || 1e-100; + for (var s = o.angle(t, n), l = o.magnitude(o.sub(t, n)), c = .5 * (n.x + t.x), d = .5 * (n.y + t.y), u = a.rectangle(c, d, l, r, { + angle: s + }), p = i.collides(u, e), f = 0; f < p.length; f += 1) { + var v = p[f]; + v.body = v.bodyB = v.bodyA + } + return p + } + , + i.region = function(e, t, n) { + for (var i = [], o = 0; o < e.length; o++) { + var r = e[o] + , a = s.overlaps(r.bounds, t); + (a && !n || !a && n) && i.push(r) + } + return i + } + , + i.point = function(e, t) { + for (var n = [], i = 0; i < e.length; i++) { + var o = e[i]; + if (s.contains(o.bounds, t)) + for (var r = 1 === o.parts.length ? 0 : 1; r < o.parts.length; r++) { + var a = o.parts[r]; + if (s.contains(a.bounds, t) && l.contains(a.vertices, t)) { + n.push(o); + break + } + } + } + return n + } + } + , function(t, n) { + if (void 0 === e) { + var i = new Error("Cannot find module 'undefined'"); + throw i.code = "MODULE_NOT_FOUND", + i + } + t.exports = e + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(3) + , r = n(7) + , s = n(14) + , a = n(4) + , l = n(12) + , c = n(8) + , d = n(5) + , u = n(0) + , p = n(1); + i.create = function(e, t) { + var n = (e ? e.mouse : null) || (t ? t.mouse : null); + n || (e && e.render && e.render.canvas ? n = s.create(e.render.canvas) : t && t.element ? n = s.create(t.element) : (n = s.create(), + u.warn("MouseConstraint.create: options.mouse was undefined, options.element was undefined, may not function as expected"))); + var o = { + type: "mouseConstraint", + mouse: n, + element: null, + body: null, + constraint: c.create({ + label: "Mouse Constraint", + pointA: n.position, + pointB: { + x: 0, + y: 0 + }, + length: .01, + stiffness: .1, + angularStiffness: 1, + render: { + strokeStyle: "#90EE90", + lineWidth: 3 + } + }), + collisionFilter: { + category: 1, + mask: 4294967295, + group: 0 + } + } + , r = u.extend(o, t); + return a.on(e, "beforeUpdate", function() { + var t = d.allBodies(e.world); + i.update(r, t), + i._triggerEvents(r) + }), + r + } + , + i.update = function(e, t) { + var n = e.mouse + , i = e.constraint + , s = e.body; + if (0 === n.button) { + if (i.bodyB) + r.set(i.bodyB, !1), + i.pointA = n.position; + else + for (var c = 0; c < t.length; c++) + if (s = t[c], + p.contains(s.bounds, n.position) && l.canCollide(s.collisionFilter, e.collisionFilter)) + for (var d = s.parts.length > 1 ? 1 : 0; d < s.parts.length; d++) { + var u = s.parts[d]; + if (o.contains(u.vertices, n.position)) { + i.pointA = n.position, + i.bodyB = e.body = s, + i.pointB = { + x: n.position.x - s.position.x, + y: n.position.y - s.position.y + }, + i.angleB = s.angle, + r.set(s, !1), + a.trigger(e, "startdrag", { + mouse: n, + body: s + }); + break + } + } + } else + i.bodyB = e.body = null, + i.pointB = null, + s && a.trigger(e, "enddrag", { + mouse: n, + body: s + }) + } + , + i._triggerEvents = function(e) { + var t = e.mouse + , n = t.sourceEvents; + n.mousemove && a.trigger(e, "mousemove", { + mouse: t + }), + n.mousedown && a.trigger(e, "mousedown", { + mouse: t + }), + n.mouseup && a.trigger(e, "mouseup", { + mouse: t + }), + s.clearSourceEvents(t) + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(4) + , r = n(22) + , s = n(0); + !function() { + var e, t, n; + ("undefined" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame, + t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame), + e) || (e = function(e) { + n = setTimeout(function() { + e(s.now()) + }, 1e3 / 60) + } + , + t = function() { + clearTimeout(n) + } + ); + i.create = function(e) { + var t = s.extend({ + fps: 60, + correction: 1, + deltaSampleSize: 60, + counterTimestamp: 0, + frameCounter: 0, + deltaHistory: [], + timePrev: null, + timeScalePrev: 1, + frameRequestId: null, + isFixed: !1, + enabled: !0 + }, e); + return t.delta = t.delta || 1e3 / t.fps, + t.deltaMin = t.deltaMin || 1e3 / t.fps, + t.deltaMax = t.deltaMax || 1e3 / (.5 * t.fps), + t.fps = 1e3 / t.delta, + t + } + , + i.run = function(t, n) { + return void 0 !== t.positionIterations && (n = t, + t = i.create()), + function o(r) { + t.frameRequestId = e(o), + r && t.enabled && i.tick(t, n, r) + }(), + t + } + , + i.tick = function(e, t, n) { + var i, s = t.timing, a = 1, l = { + timestamp: s.timestamp + }; + o.trigger(e, "beforeTick", l), + o.trigger(t, "beforeTick", l), + e.isFixed ? i = e.delta : (i = n - e.timePrev || e.delta, + e.timePrev = n, + e.deltaHistory.push(i), + e.deltaHistory = e.deltaHistory.slice(-e.deltaSampleSize), + a = (i = (i = (i = Math.min.apply(null, e.deltaHistory)) < e.deltaMin ? e.deltaMin : i) > e.deltaMax ? e.deltaMax : i) / e.delta, + e.delta = i), + 0 !== e.timeScalePrev && (a *= s.timeScale / e.timeScalePrev), + 0 === s.timeScale && (a = 0), + e.timeScalePrev = s.timeScale, + e.correction = a, + e.frameCounter += 1, + n - e.counterTimestamp >= 1e3 && (e.fps = e.frameCounter * ((n - e.counterTimestamp) / 1e3), + e.counterTimestamp = n, + e.frameCounter = 0), + o.trigger(e, "tick", l), + o.trigger(t, "tick", l), + t.world.isModified && t.render && t.render.controller && t.render.controller.clear && t.render.controller.clear(t.render), + o.trigger(e, "beforeUpdate", l), + r.update(t, i, a), + o.trigger(e, "afterUpdate", l), + t.render && t.render.controller && (o.trigger(e, "beforeRender", l), + o.trigger(t, "beforeRender", l), + t.render.controller.world(t.render), + o.trigger(e, "afterRender", l), + o.trigger(t, "afterRender", l)), + o.trigger(e, "afterTick", l), + o.trigger(t, "afterTick", l) + } + , + i.stop = function(e) { + t(e.frameRequestId) + } + , + i.start = function(e, t) { + i.run(e, t) + } + }() + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(5) + , r = n(8) + , s = n(0) + , a = n(6) + , l = n(16); + i.stack = function(e, t, n, i, r, s, l) { + for (var c, d = o.create({ + label: "Stack" + }), u = e, p = t, f = 0, v = 0; v < i; v++) { + for (var m = 0, y = 0; y < n; y++) { + var g = l(u, p, y, v, c, f); + if (g) { + var x = g.bounds.max.y - g.bounds.min.y + , h = g.bounds.max.x - g.bounds.min.x; + x > m && (m = x), + a.translate(g, { + x: .5 * h, + y: .5 * x + }), + u = g.bounds.max.x + r, + o.addBody(d, g), + c = g, + f += 1 + } else + u += r + } + p += m + s, + u = e + } + return d + } + , + i.chain = function(e, t, n, i, a, l) { + for (var c = e.bodies, d = 1; d < c.length; d++) { + var u = c[d - 1] + , p = c[d] + , f = u.bounds.max.y - u.bounds.min.y + , v = u.bounds.max.x - u.bounds.min.x + , m = p.bounds.max.y - p.bounds.min.y + , y = { + bodyA: u, + pointA: { + x: v * t, + y: f * n + }, + bodyB: p, + pointB: { + x: (p.bounds.max.x - p.bounds.min.x) * i, + y: m * a + } + } + , g = s.extend(y, l); + o.addConstraint(e, r.create(g)) + } + return e.label += " Chain", + e + } + , + i.mesh = function(e, t, n, i, a) { + var l, c, d, u, p, f = e.bodies; + for (l = 0; l < n; l++) { + for (c = 1; c < t; c++) + d = f[c - 1 + l * t], + u = f[c + l * t], + o.addConstraint(e, r.create(s.extend({ + bodyA: d, + bodyB: u + }, a))); + if (l > 0) + for (c = 0; c < t; c++) + d = f[c + (l - 1) * t], + u = f[c + l * t], + o.addConstraint(e, r.create(s.extend({ + bodyA: d, + bodyB: u + }, a))), + i && c > 0 && (p = f[c - 1 + (l - 1) * t], + o.addConstraint(e, r.create(s.extend({ + bodyA: p, + bodyB: u + }, a)))), + i && c < t - 1 && (p = f[c + 1 + (l - 1) * t], + o.addConstraint(e, r.create(s.extend({ + bodyA: p, + bodyB: u + }, a)))) + } + return e.label += " Mesh", + e + } + , + i.pyramid = function(e, t, n, o, r, s, l) { + return i.stack(e, t, n, o, r, s, function(t, i, s, c, d, u) { + var p = Math.min(o, Math.ceil(n / 2)) + , f = d ? d.bounds.max.x - d.bounds.min.x : 0; + if (!(c > p || s < (c = p - c) || s > n - 1 - c)) + return 1 === u && a.translate(d, { + x: (s + (n % 2 == 1 ? 1 : -1)) * f, + y: 0 + }), + l(e + (d ? s * f : 0) + s * r, i, s, c, d, u) + }) + } + , + i.newtonsCradle = function(e, t, n, i, s) { + for (var a = o.create({ + label: "Newtons Cradle" + }), c = 0; c < n; c++) { + var d = l.circle(e + c * (1.9 * i), t + s, i, { + inertia: 1 / 0, + restitution: 1, + friction: 0, + frictionAir: 1e-4, + slop: 1 + }) + , u = r.create({ + pointA: { + x: e + c * (1.9 * i), + y: t + }, + bodyB: d + }); + o.addBody(a, d), + o.addConstraint(a, u) + } + return a + } + , + i.car = function(e, t, n, i, s) { + var c = a.nextGroup(!0) + , d = .5 * -n + 20 + , u = .5 * n - 20 + , p = o.create({ + label: "Car" + }) + , f = l.rectangle(e, t, n, i, { + collisionFilter: { + group: c + }, + chamfer: { + radius: .5 * i + }, + density: 2e-4 + }) + , v = l.circle(e + d, t + 0, s, { + collisionFilter: { + group: c + }, + friction: .8 + }) + , m = l.circle(e + u, t + 0, s, { + collisionFilter: { + group: c + }, + friction: .8 + }) + , y = r.create({ + bodyB: f, + pointB: { + x: d, + y: 0 + }, + bodyA: v, + stiffness: 1, + length: 0 + }) + , g = r.create({ + bodyB: f, + pointB: { + x: u, + y: 0 + }, + bodyA: m, + stiffness: 1, + length: 0 + }); + return o.addBody(p, f), + o.addBody(p, v), + o.addBody(p, m), + o.addConstraint(p, y), + o.addConstraint(p, g), + p + } + , + i.softBody = function(e, t, n, o, r, a, c, d, u, p) { + u = s.extend({ + inertia: 1 / 0 + }, u), + p = s.extend({ + stiffness: .2, + render: { + type: "line", + anchors: !1 + } + }, p); + var f = i.stack(e, t, n, o, r, a, function(e, t) { + return l.circle(e, t, d, u) + }); + return i.mesh(f, n, o, c, p), + f.label = "Soft Body", + f + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + n(1); + var o = n(0); + i.pathToVertices = function(e, t) { + "undefined" == typeof window || "SVGPathSeg"in window || o.warn("Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required."); + var n, r, s, a, l, c, d, u, p, f, v, m = [], y = 0, g = 0, x = 0; + t = t || 15; + var h = function(e, t, n) { + var i = n % 2 == 1 && n > 1; + if (!p || e != p.x || t != p.y) { + p && i ? (f = p.x, + v = p.y) : (f = 0, + v = 0); + var o = { + x: f + e, + y: v + t + }; + !i && p || (p = o), + m.push(o), + g = f + e, + x = v + t + } + } + , b = function(e) { + var t = e.pathSegTypeAsLetter.toUpperCase(); + if ("Z" !== t) { + switch (t) { + case "M": + case "L": + case "T": + case "C": + case "S": + case "Q": + g = e.x, + x = e.y; + break; + case "H": + g = e.x; + break; + case "V": + x = e.y; + } + h(g, x, e.pathSegType) + } + }; + for (i._svgPathToAbsolute(e), + s = e.getTotalLength(), + c = [], + n = 0; n < e.pathSegList.numberOfItems; n += 1) + c.push(e.pathSegList.getItem(n)); + for (d = c.concat(); y < s; ) { + if ((l = c[e.getPathSegAtLength(y)]) != u) { + for (; d.length && d[0] != l; ) + b(d.shift()); + u = l + } + switch (l.pathSegTypeAsLetter.toUpperCase()) { + case "C": + case "T": + case "S": + case "Q": + case "A": + a = e.getPointAtLength(y), + h(a.x, a.y, 0); + } + y += t + } + for (n = 0, + r = d.length; n < r; ++n) + b(d[n]); + return m + } + , + i._svgPathToAbsolute = function(e) { + for (var t, n, i, o, r, s, a = e.pathSegList, l = 0, c = 0, d = a.numberOfItems, u = 0; u < d; ++u) { + var p = a.getItem(u) + , f = p.pathSegTypeAsLetter; + if (/[MLHVCSQTA]/.test(f)) + "x"in p && (l = p.x), + "y"in p && (c = p.y); + else + switch ("x1"in p && (i = l + p.x1), + "x2"in p && (r = l + p.x2), + "y1"in p && (o = c + p.y1), + "y2"in p && (s = c + p.y2), + "x"in p && (l += p.x), + "y"in p && (c += p.y), + f) { + case "m": + a.replaceItem(e.createSVGPathSegMovetoAbs(l, c), u); + break; + case "l": + a.replaceItem(e.createSVGPathSegLinetoAbs(l, c), u); + break; + case "h": + a.replaceItem(e.createSVGPathSegLinetoHorizontalAbs(l), u); + break; + case "v": + a.replaceItem(e.createSVGPathSegLinetoVerticalAbs(c), u); + break; + case "c": + a.replaceItem(e.createSVGPathSegCurvetoCubicAbs(l, c, i, o, r, s), u); + break; + case "s": + a.replaceItem(e.createSVGPathSegCurvetoCubicSmoothAbs(l, c, r, s), u); + break; + case "q": + a.replaceItem(e.createSVGPathSegCurvetoQuadraticAbs(l, c, i, o), u); + break; + case "t": + a.replaceItem(e.createSVGPathSegCurvetoQuadraticSmoothAbs(l, c), u); + break; + case "a": + a.replaceItem(e.createSVGPathSegArcAbs(l, c, p.r1, p.r2, p.angle, p.largeArcFlag, p.sweepFlag), u); + break; + case "z": + case "Z": + l = t, + c = n; + } + "M" != f && "m" != f || (t = l, + n = c) + } + } + } + , function(e, t, n) { + var i = {}; + e.exports = i; + var o = n(1) + , r = n(5) + , s = n(0) + , a = n(4) + , l = n(2); + !function() { + var e, t; + "undefined" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function(e) { + window.setTimeout(function() { + e(s.now()) + }, 1e3 / 60) + } + , + t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame), + i.create = function(e) { + s.warn("RenderPixi.create: Matter.RenderPixi is deprecated (see docs)"); + var t = { + controller: i, + engine: null, + element: null, + frameRequestId: null, + canvas: null, + renderer: null, + container: null, + spriteContainer: null, + pixiOptions: null, + options: { + width: 800, + height: 600, + background: "#fafafa", + wireframeBackground: "#222", + hasBounds: !1, + enabled: !0, + wireframes: !0, + showSleeping: !0, + showDebug: !1, + showBroadphase: !1, + showBounds: !1, + showVelocity: !1, + showCollisions: !1, + showAxes: !1, + showPositions: !1, + showAngleIndicator: !1, + showIds: !1, + showShadows: !1 + } + } + , n = s.extend(t, e) + , o = !n.options.wireframes && "transparent" === n.options.background; + return n.pixiOptions = n.pixiOptions || { + view: n.canvas, + transparent: o, + antialias: !0, + backgroundColor: e.background + }, + n.mouse = e.mouse, + n.engine = e.engine, + n.renderer = n.renderer || new PIXI.WebGLRenderer(n.options.width,n.options.height,n.pixiOptions), + n.container = n.container || new PIXI.Container, + n.spriteContainer = n.spriteContainer || new PIXI.Container, + n.canvas = n.canvas || n.renderer.view, + n.bounds = n.bounds || { + min: { + x: 0, + y: 0 + }, + max: { + x: n.options.width, + y: n.options.height + } + }, + a.on(n.engine, "beforeUpdate", function() { + i.clear(n) + }), + n.textures = {}, + n.sprites = {}, + n.primitives = {}, + n.container.addChild(n.spriteContainer), + s.isElement(n.element) ? n.element.appendChild(n.canvas) : s.warn("No \"render.element\" passed, \"render.canvas\" was not inserted into document."), + n.canvas.oncontextmenu = function() { + return !1 + } + , + n.canvas.onselectstart = function() { + return !1 + } + , + n + } + , + i.run = function(t) { + !function n(o) { + t.frameRequestId = e(n), + i.world(t) + }() + } + , + i.stop = function(e) { + t(e.frameRequestId) + } + , + i.clear = function(e) { + for (var t = e.container, n = e.spriteContainer; t.children[0]; ) + t.removeChild(t.children[0]); + for (; n.children[0]; ) + n.removeChild(n.children[0]); + var i = e.sprites["bg-0"]; + e.textures = {}, + e.sprites = {}, + e.primitives = {}, + e.sprites["bg-0"] = i, + i && t.addChildAt(i, 0), + e.container.addChild(e.spriteContainer), + e.currentBackground = null, + t.scale.set(1, 1), + t.position.set(0, 0) + } + , + i.setBackground = function(e, t) { + if (e.currentBackground !== t) { + var n = t.indexOf && -1 !== t.indexOf("#") + , i = e.sprites["bg-0"]; + if (n) { + var o = s.colorToNumber(t); + e.renderer.backgroundColor = o, + i && e.container.removeChild(i) + } else if (!i) { + var r = d(e, t); + (i = e.sprites["bg-0"] = new PIXI.Sprite(r)).position.x = 0, + i.position.y = 0, + e.container.addChildAt(i, 0) + } + e.currentBackground = t + } + } + , + i.world = function(e) { + var t, n = e.engine.world, s = e.renderer, a = e.container, c = e.options, d = r.allBodies(n), u = r.allConstraints(n), p = []; + c.wireframes ? i.setBackground(e, c.wireframeBackground) : i.setBackground(e, c.background); + var f = e.bounds.max.x - e.bounds.min.x + , v = e.bounds.max.y - e.bounds.min.y + , m = f / e.options.width + , y = v / e.options.height; + if (c.hasBounds) { + for (t = 0; t < d.length; t++) { + var g = d[t]; + g.render.sprite.visible = o.overlaps(g.bounds, e.bounds) + } + for (t = 0; t < u.length; t++) { + var x = u[t] + , h = x.bodyA + , b = x.bodyB + , w = x.pointA + , S = x.pointB; + h && (w = l.add(h.position, x.pointA)), + b && (S = l.add(b.position, x.pointB)), + w && S && (o.contains(e.bounds, w) || o.contains(e.bounds, S)) && p.push(x) + } + a.scale.set(1 / m, 1 / y), + a.position.set(-e.bounds.min.x * (1 / m), -e.bounds.min.y * (1 / y)) + } else + p = u; + for (t = 0; t < d.length; t++) + i.body(e, d[t]); + for (t = 0; t < p.length; t++) + i.constraint(e, p[t]); + s.render(a) + } + , + i.constraint = function(e, t) { + e.engine; + var n = t.bodyA + , i = t.bodyB + , o = t.pointA + , r = t.pointB + , a = e.container + , l = t.render + , c = "c-" + t.id + , d = e.primitives[c]; + d || (d = e.primitives[c] = new PIXI.Graphics), + l.visible && t.pointA && t.pointB ? (-1 === s.indexOf(a.children, d) && a.addChild(d), + d.clear(), + d.beginFill(0, 0), + d.lineStyle(l.lineWidth, s.colorToNumber(l.strokeStyle), 1), + n ? d.moveTo(n.position.x + o.x, n.position.y + o.y) : d.moveTo(o.x, o.y), + i ? d.lineTo(i.position.x + r.x, i.position.y + r.y) : d.lineTo(r.x, r.y), + d.endFill()) : d.clear() + } + , + i.body = function(e, t) { + e.engine; + var i = t.render; + if (i.visible) + if (i.sprite && i.sprite.texture) { + var o = "b-" + t.id + , r = e.sprites[o] + , a = e.spriteContainer; + r || (r = e.sprites[o] = n(e, t)), + -1 === s.indexOf(a.children, r) && a.addChild(r), + r.position.x = t.position.x, + r.position.y = t.position.y, + r.rotation = t.angle, + r.scale.x = i.sprite.xScale || 1, + r.scale.y = i.sprite.yScale || 1 + } else { + var l = "b-" + t.id + , d = e.primitives[l] + , u = e.container; + d || ((d = e.primitives[l] = c(e, t)).initialAngle = t.angle), + -1 === s.indexOf(u.children, d) && u.addChild(d), + d.position.x = t.position.x, + d.position.y = t.position.y, + d.rotation = t.angle - d.initialAngle + } + } + ; + var n = function(e, t) { + var n = t.render.sprite.texture + , i = d(e, n) + , o = new PIXI.Sprite(i); + return o.anchor.x = t.render.sprite.xOffset, + o.anchor.y = t.render.sprite.yOffset, + o + } + , c = function(e, t) { + var n, i = t.render, o = e.options, r = new PIXI.Graphics, a = s.colorToNumber(i.fillStyle), l = s.colorToNumber(i.strokeStyle), c = s.colorToNumber(i.strokeStyle), d = s.colorToNumber("#bbb"), u = s.colorToNumber("#CD5C5C"); + r.clear(); + for (var p = t.parts.length > 1 ? 1 : 0; p < t.parts.length; p++) { + n = t.parts[p], + o.wireframes ? (r.beginFill(0, 0), + r.lineStyle(1, d, 1)) : (r.beginFill(a, 1), + r.lineStyle(i.lineWidth, l, 1)), + r.moveTo(n.vertices[0].x - t.position.x, n.vertices[0].y - t.position.y); + for (var f = 1; f < n.vertices.length; f++) + r.lineTo(n.vertices[f].x - t.position.x, n.vertices[f].y - t.position.y); + r.lineTo(n.vertices[0].x - t.position.x, n.vertices[0].y - t.position.y), + r.endFill(), + (o.showAngleIndicator || o.showAxes) && (r.beginFill(0, 0), + o.wireframes ? r.lineStyle(1, u, 1) : r.lineStyle(1, c), + r.moveTo(n.position.x - t.position.x, n.position.y - t.position.y), + r.lineTo((n.vertices[0].x + n.vertices[n.vertices.length - 1].x) / 2 - t.position.x, (n.vertices[0].y + n.vertices[n.vertices.length - 1].y) / 2 - t.position.y), + r.endFill()) + } + return r + } + , d = function(e, t) { + var n = e.textures[t]; + return n || (n = e.textures[t] = PIXI.Texture.fromImage(t)), + n + } + }() + } + ]) + }); + var a = function() { + function e(e) { + this._engine = ha.Engine.create(), + this._pixiObjects = [], + ha.Engine.run(this.engine); + var t = ha.MouseConstraint.create(this.engine, { + mouse: ha.Mouse.create(e.stage) + }); + ha.World.add(this.engine.world, t) + } + return Object.defineProperty(e.prototype, "engine", { + get: function() { + return this._engine + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "pixiObjects", { + get: function() { + return this._pixiObjects + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.update = function() { + this._pixiObjects.forEach(function(e) { + return e.update() + }) + } + , + e.prototype.addToWorld = function() { + for (var e = this, t = [], i = 0; i < arguments.length; i++) + t[i] = arguments[i]; + t.forEach(function(t) { + return ha.World.addBody(e.engine.world, t.body) + }), + this._pixiObjects = this._pixiObjects.concat(t) + } + , + e.prototype.removeFromWorld = function() { + for (var e = this, t = [], i = 0; i < arguments.length; i++) + t[i] = arguments[i]; + t.forEach(function(t) { + return ha.World.remove(e.engine.world, t.body) + }), + this._pixiObjects = this._pixiObjects.filter(function(e) { + return !t.includes(e) + }) + } + , + e + }(); + var b = function() { + function i(i, t, e) { + void 0 === t && (t = {}); + var o = i.x + , s = i.y + , r = i.width + , p = i.height; + i.texture; + this._sprite = i, + this._update = e, + this.physicsOptions = t, + t.isCircle ? this._body = ha.Bodies.circle(o, s, r / 2, t) : this._body = ha.Bodies.rectangle(o, s, r, p, t) + } + return Object.defineProperty(i.prototype, "body", { + get: function() { + return this._body + }, + enumerable: !1, + configurable: !0 + }), + i.prototype.update = function() { + this._update ? this._update({ + position: this._body.position, + rotation: this._body.angle + }) : (this._sprite.position = this._body.position, + this._sprite.rotation = this._body.angle) + } + , + i + }(); + var Nb = {}; + var ue, ve, Fa, Ga; + var Ob = /iPhone/i + , Ic = /iPod/i + , Jc = /iPad/i + , Kc = /\biOS-universal(?:.+)Mac\b/i + , Pb = /\bAndroid(?:.+)Mobile\b/i + , Lc = /Android/i + , Ra = /(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i + , ib = /Silk/i + , wa = /Windows Phone/i + , Mc = /\bWindows(?:.+)ARM\b/i + , Nc = /BlackBerry/i + , Oc = /BB10/i + , Pc = /Opera Mini/i + , Qc = /\b(CriOS|Chrome)(?:.+)Mobile/i + , Rc = /Mobile(?:.+)Firefox\b/i + , Sc = function($) { + return void 0 !== $ && "MacIntel" === $.platform && "number" == typeof $.maxTouchPoints && $.maxTouchPoints > 1 && "undefined" == typeof MSStream + }; + function we($) { + return function(a) { + return a.test($) + } + } + function xe($) { + var a = { + userAgent: "", + platform: "", + maxTouchPoints: 0 + }; + $ || "undefined" == typeof navigator ? "string" == typeof $ ? a.userAgent = $ : $ && $.userAgent && (a = { + userAgent: $.userAgent, + platform: $.platform, + maxTouchPoints: $.maxTouchPoints || 0 + }) : a = { + userAgent: navigator.userAgent, + platform: navigator.platform, + maxTouchPoints: navigator.maxTouchPoints || 0 + }; + var e = a.userAgent + , r = e.split("[FBAN"); + void 0 !== r[1] && (e = r[0]), + void 0 !== (r = e.split("Twitter"))[1] && (e = r[0]); + var o = we(e) + , v = { + apple: { + phone: o(Ob) && !o(wa), + ipod: o(Ic), + tablet: !o(Ob) && (o(Jc) || Sc(a)) && !o(wa), + universal: o(Kc), + device: (o(Ob) || o(Ic) || o(Jc) || o(Kc) || Sc(a)) && !o(wa) + }, + amazon: { + phone: o(Ra), + tablet: !o(Ra) && o(ib), + device: o(Ra) || o(ib) + }, + android: { + phone: !o(wa) && o(Ra) || !o(wa) && o(Pb), + tablet: !o(wa) && !o(Ra) && !o(Pb) && (o(ib) || o(Lc)), + device: !o(wa) && (o(Ra) || o(ib) || o(Pb) || o(Lc)) || o(/\bokhttp\b/i) + }, + windows: { + phone: o(wa), + tablet: o(Mc), + device: o(wa) || o(Mc) + }, + other: { + blackberry: o(Nc), + blackberry10: o(Oc), + opera: o(Pc), + firefox: o(Rc), + chrome: o(Qc), + device: o(Nc) || o(Oc) || o(Pc) || o(Rc) || o(Qc) + }, + any: !1, + phone: !1, + tablet: !1 + }; + return v.any = v.apple.device || v.android.device || v.windows.device || v.other.device, + v.phone = v.apple.phone || v.android.phone || v.windows.phone, + v.tablet = v.apple.tablet || v.android.tablet || v.windows.tablet, + v + } + var Ha = xe(self.navigator); + function ye(e) { + var i = !0; + if (Ha.tablet || Ha.phone) { + var r; + if (Ha.apple.device) + if (r = navigator.userAgent.match(/OS (\d+)_(\d+)?/)) + parseInt(r[1], 10) < 11 && (i = !1); + if (Ha.android.device) + if (r = navigator.userAgent.match(/Android\s([0-9.]*)/)) + parseInt(r[1], 10) < 7 && (i = !1) + } + return i ? e : 4 + } + function ze() { + return !Ha.apple.device + } + var aa = { + MIPMAP_TEXTURES: 1, + ANISOTROPIC_LEVEL: 0, + RESOLUTION: 1, + FILTER_RESOLUTION: 1, + SPRITE_MAX_TEXTURES: ye(32), + SPRITE_BATCH_SIZE: 4096, + RENDER_OPTIONS: { + view: null, + antialias: !1, + autoDensity: !1, + backgroundColor: 0, + backgroundAlpha: 1, + useContextAlpha: !0, + clearBeforeRender: !0, + preserveDrawingBuffer: !1, + width: 800, + height: 600, + legacy: !1 + }, + GC_MODE: 0, + GC_MAX_IDLE: 3600, + GC_MAX_CHECK_COUNT: 600, + WRAP_MODE: 33071, + SCALE_MODE: 1, + PRECISION_VERTEX: "highp", + PRECISION_FRAGMENT: Ha.apple.device ? "highp" : "mediump", + CAN_UPLOAD_SAME_BUFFER: ze(), + CREATE_IMAGE_BITMAP: !1, + ROUND_PIXELS: !1 + }; + var Ae, Be, Ce, De, Ee, Fe, Ge, He, Ie, Je, Ke, Le, Me, Ne, Oe, Pe, Qe, Aa, jb, Qb, K, Ba, kb, Sa, ua, Ca, Rb, $a, Ia, Ja, Tc, xa, qa, _a; + !function(E) { + E[E.WEBGL_LEGACY = 0] = "WEBGL_LEGACY", + E[E.WEBGL = 1] = "WEBGL", + E[E.WEBGL2 = 2] = "WEBGL2" + }(Aa || (Fe = Aa = {}, + Fe)), + function(E) { + E[E.UNKNOWN = 0] = "UNKNOWN", + E[E.WEBGL = 1] = "WEBGL", + E[E.CANVAS = 2] = "CANVAS" + }(jb || (Me = jb = {}, + Me)), + function(E) { + E[E.COLOR = 16384] = "COLOR", + E[E.DEPTH = 256] = "DEPTH", + E[E.STENCIL = 1024] = "STENCIL" + }(Qb || (Ce = Qb = {}, + Ce)), + function(E) { + E[E.NORMAL = 0] = "NORMAL", + E[E.ADD = 1] = "ADD", + E[E.MULTIPLY = 2] = "MULTIPLY", + E[E.SCREEN = 3] = "SCREEN", + E[E.OVERLAY = 4] = "OVERLAY", + E[E.DARKEN = 5] = "DARKEN", + E[E.LIGHTEN = 6] = "LIGHTEN", + E[E.COLOR_DODGE = 7] = "COLOR_DODGE", + E[E.COLOR_BURN = 8] = "COLOR_BURN", + E[E.HARD_LIGHT = 9] = "HARD_LIGHT", + E[E.SOFT_LIGHT = 10] = "SOFT_LIGHT", + E[E.DIFFERENCE = 11] = "DIFFERENCE", + E[E.EXCLUSION = 12] = "EXCLUSION", + E[E.HUE = 13] = "HUE", + E[E.SATURATION = 14] = "SATURATION", + E[E.COLOR = 15] = "COLOR", + E[E.LUMINOSITY = 16] = "LUMINOSITY", + E[E.NORMAL_NPM = 17] = "NORMAL_NPM", + E[E.ADD_NPM = 18] = "ADD_NPM", + E[E.SCREEN_NPM = 19] = "SCREEN_NPM", + E[E.NONE = 20] = "NONE", + E[E.SRC_OVER = 0] = "SRC_OVER", + E[E.SRC_IN = 21] = "SRC_IN", + E[E.SRC_OUT = 22] = "SRC_OUT", + E[E.SRC_ATOP = 23] = "SRC_ATOP", + E[E.DST_OVER = 24] = "DST_OVER", + E[E.DST_IN = 25] = "DST_IN", + E[E.DST_OUT = 26] = "DST_OUT", + E[E.DST_ATOP = 27] = "DST_ATOP", + E[E.ERASE = 26] = "ERASE", + E[E.SUBTRACT = 28] = "SUBTRACT", + E[E.XOR = 29] = "XOR" + }(K || (Be = K = {}, + Be)), + function(E) { + E[E.POINTS = 0] = "POINTS", + E[E.LINES = 1] = "LINES", + E[E.LINE_LOOP = 2] = "LINE_LOOP", + E[E.LINE_STRIP = 3] = "LINE_STRIP", + E[E.TRIANGLES = 4] = "TRIANGLES", + E[E.TRIANGLE_STRIP = 5] = "TRIANGLE_STRIP", + E[E.TRIANGLE_FAN = 6] = "TRIANGLE_FAN" + }(Ba || (Ee = Ba = {}, + Ee)), + function(E) { + E[E.RGBA = 6408] = "RGBA", + E[E.RGB = 6407] = "RGB", + E[E.ALPHA = 6406] = "ALPHA", + E[E.LUMINANCE = 6409] = "LUMINANCE", + E[E.LUMINANCE_ALPHA = 6410] = "LUMINANCE_ALPHA", + E[E.DEPTH_COMPONENT = 6402] = "DEPTH_COMPONENT", + E[E.DEPTH_STENCIL = 34041] = "DEPTH_STENCIL" + }(kb || (Ge = kb = {}, + Ge)), + function(E) { + E[E.TEXTURE_2D = 3553] = "TEXTURE_2D", + E[E.TEXTURE_CUBE_MAP = 34067] = "TEXTURE_CUBE_MAP", + E[E.TEXTURE_2D_ARRAY = 35866] = "TEXTURE_2D_ARRAY", + E[E.TEXTURE_CUBE_MAP_POSITIVE_X = 34069] = "TEXTURE_CUBE_MAP_POSITIVE_X", + E[E.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070] = "TEXTURE_CUBE_MAP_NEGATIVE_X", + E[E.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071] = "TEXTURE_CUBE_MAP_POSITIVE_Y", + E[E.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072] = "TEXTURE_CUBE_MAP_NEGATIVE_Y", + E[E.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073] = "TEXTURE_CUBE_MAP_POSITIVE_Z", + E[E.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074] = "TEXTURE_CUBE_MAP_NEGATIVE_Z" + }(Sa || (Oe = Sa = {}, + Oe)), + function(E) { + E[E.UNSIGNED_BYTE = 5121] = "UNSIGNED_BYTE", + E[E.UNSIGNED_SHORT = 5123] = "UNSIGNED_SHORT", + E[E.UNSIGNED_SHORT_5_6_5 = 33635] = "UNSIGNED_SHORT_5_6_5", + E[E.UNSIGNED_SHORT_4_4_4_4 = 32819] = "UNSIGNED_SHORT_4_4_4_4", + E[E.UNSIGNED_SHORT_5_5_5_1 = 32820] = "UNSIGNED_SHORT_5_5_5_1", + E[E.FLOAT = 5126] = "FLOAT", + E[E.HALF_FLOAT = 36193] = "HALF_FLOAT" + }(ua || (Pe = ua = {}, + Pe)), + function(E) { + E[E.NEAREST = 0] = "NEAREST", + E[E.LINEAR = 1] = "LINEAR" + }(Ca || (Ne = Ca = {}, + Ne)), + function(E) { + E[E.CLAMP = 33071] = "CLAMP", + E[E.REPEAT = 10497] = "REPEAT", + E[E.MIRRORED_REPEAT = 33648] = "MIRRORED_REPEAT" + }(Rb || (Qe = Rb = {}, + Qe)), + function(E) { + E[E.OFF = 0] = "OFF", + E[E.POW2 = 1] = "POW2", + E[E.ON = 2] = "ON", + E[E.ON_MANUAL = 3] = "ON_MANUAL" + }($a || (Je = $a = {}, + Je)), + function(E) { + E[E.NPM = 0] = "NPM", + E[E.UNPACK = 1] = "UNPACK", + E[E.PMA = 2] = "PMA", + E[E.NO_PREMULTIPLIED_ALPHA = 0] = "NO_PREMULTIPLIED_ALPHA", + E[E.PREMULTIPLY_ON_UPLOAD = 1] = "PREMULTIPLY_ON_UPLOAD", + E[E.PREMULTIPLY_ALPHA = 2] = "PREMULTIPLY_ALPHA" + }(Ia || (Ae = Ia = {}, + Ae)), + function(E) { + E[E.NO = 0] = "NO", + E[E.YES = 1] = "YES", + E[E.AUTO = 2] = "AUTO", + E[E.BLEND = 0] = "BLEND", + E[E.CLEAR = 1] = "CLEAR", + E[E.BLIT = 2] = "BLIT" + }(Ja || (De = Ja = {}, + De)), + function(E) { + E[E.AUTO = 0] = "AUTO", + E[E.MANUAL = 1] = "MANUAL" + }(Tc || (He = Tc = {}, + He)), + function(E) { + E.LOW = "lowp", + E.MEDIUM = "mediump", + E.HIGH = "highp" + }(xa || (Le = xa = {}, + Le)), + function(E) { + E[E.NONE = 0] = "NONE", + E[E.SCISSOR = 1] = "SCISSOR", + E[E.STENCIL = 2] = "STENCIL", + E[E.SPRITE = 3] = "SPRITE" + }(qa || (Ie = qa = {}, + Ie)), + function(E) { + E[E.NONE = 0] = "NONE", + E[E.LOW = 2] = "LOW", + E[E.MEDIUM = 4] = "MEDIUM", + E[E.HIGH = 8] = "HIGH" + }(_a || (Ke = _a = {}, + Ke)); + var Re = {} + , Se = Object.prototype.hasOwnProperty + , na = "~"; + function ab() {} + function Te(e, t, r) { + this.fn = e, + this.context = t, + this.once = r || !1 + } + function Uc(e, t, r, n, $) { + if ("function" != typeof r) + throw new TypeError("The listener must be a function"); + var v = new Te(r,n || e,$) + , a = na ? na + t : t; + return e._events[a] ? e._events[a].fn ? e._events[a] = [e._events[a], v] : e._events[a].push(v) : (e._events[a] = v, + e._eventsCount++), + e + } + function lb(e, t) { + 0 == --e._eventsCount ? e._events = new ab : delete e._events[t] + } + function ja() { + this._events = new ab, + this._eventsCount = 0 + } + Object.create && (ab.prototype = Object.create(null), + new ab().__proto__ || (na = !1)), + ja.prototype.eventNames = function() { + var e, t, r = []; + if (0 === this._eventsCount) + return r; + for (t in e = this._events) + Se.call(e, t) && r.push(na ? t.slice(1) : t); + return Object.getOwnPropertySymbols ? r.concat(Object.getOwnPropertySymbols(e)) : r + } + , + ja.prototype.listeners = function(e) { + var t = na ? na + e : e + , r = this._events[t]; + if (!r) + return []; + if (r.fn) + return [r.fn]; + for (var n = 0, $ = r.length, v = new Array($); n < $; n++) + v[n] = r[n].fn; + return v + } + , + ja.prototype.listenerCount = function(e) { + var t = na ? na + e : e + , r = this._events[t]; + return r ? r.fn ? 1 : r.length : 0 + } + , + ja.prototype.emit = function(e, t, r, n, $, v) { + var a = na ? na + e : e; + if (!this._events[a]) + return !1; + var i, J, l = this._events[a], s = arguments.length; + if (l.fn) { + switch (l.once && this.removeListener(e, l.fn, void 0, !0), + s) { + case 1: + return l.fn.call(l.context), + !0; + case 2: + return l.fn.call(l.context, t), + !0; + case 3: + return l.fn.call(l.context, t, r), + !0; + case 4: + return l.fn.call(l.context, t, r, n), + !0; + case 5: + return l.fn.call(l.context, t, r, n, $), + !0; + case 6: + return l.fn.call(l.context, t, r, n, $, v), + !0; + } + for (J = 1, + i = new Array(s - 1); J < s; J++) + i[J - 1] = arguments[J]; + l.fn.apply(l.context, i) + } else { + var o, f = l.length; + for (J = 0; J < f; J++) + switch (l[J].once && this.removeListener(e, l[J].fn, void 0, !0), + s) { + case 1: + l[J].fn.call(l[J].context); + break; + case 2: + l[J].fn.call(l[J].context, t); + break; + case 3: + l[J].fn.call(l[J].context, t, r); + break; + case 4: + l[J].fn.call(l[J].context, t, r, n); + break; + default: + if (!i) + for (o = 1, + i = new Array(s - 1); o < s; o++) + i[o - 1] = arguments[o]; + l[J].fn.apply(l[J].context, i); + } + } + return !0 + } + , + ja.prototype.on = function(e, t, r) { + return Uc(this, e, t, r, !1) + } + , + ja.prototype.once = function(e, t, r) { + return Uc(this, e, t, r, !0) + } + , + ja.prototype.removeListener = function(e, t, r, n) { + var $ = na ? na + e : e; + if (!this._events[$]) + return this; + if (!t) + return lb(this, $), + this; + var v = this._events[$]; + if (v.fn) + v.fn !== t || n && !v.once || r && v.context !== r || lb(this, $); + else { + for (var a = 0, i = [], J = v.length; a < J; a++) + (v[a].fn !== t || n && !v[a].once || r && v[a].context !== r) && i.push(v[a]); + i.length ? this._events[$] = 1 === i.length ? i[0] : i : lb(this, $) + } + return this + } + , + ja.prototype.removeAllListeners = function(e) { + var t; + return e ? (t = na ? na + e : e, + this._events[t] && lb(this, t)) : (this._events = new ab, + this._eventsCount = 0), + this + } + , + ja.prototype.off = ja.prototype.removeListener, + ja.prototype.addListener = ja.prototype.on, + ja.prefixed = na, + ja.EventEmitter = ja, + Re = ja; + var Ue = {}; + function mb(v, r, e) { + e = e || 2; + var $, n, t, a, i, h, x, o = r && r.length, w = o ? r[0] * e : v.length, l = Vc(v, 0, w, e, !0), u = []; + if (!l || l.next === l.prev) + return u; + if (o && (l = Ze(v, r, l, e)), + v.length > 80 * e) { + $ = t = v[0], + n = a = v[1]; + for (var s = e; s < w; s += e) + (i = v[s]) < $ && ($ = i), + (h = v[s + 1]) < n && (n = h), + i > t && (t = i), + h > a && (a = h); + x = 0 !== (x = Math.max(t - $, a - n)) ? 1 / x : 0 + } + return bb(l, u, e, $, n, x), + u + } + function Vc(v, r, e, $, n) { + var t, a; + if (n === Ub(v, r, e, $) > 0) + for (t = r; t < e; t += $) + a = Yc(t, v[t], v[t + 1], a); + else + for (t = e - $; t >= r; t -= $) + a = Yc(t, v[t], v[t + 1], a); + return a && nb(a, a.next) && (db(a), + a = a.next), + a + } + function Da(v, r) { + if (!v) + return v; + r || (r = v); + var e, $ = v; + do { + if (e = !1, + $.steiner || !nb($, $.next) && 0 !== ca($.prev, $, $.next)) + $ = $.next; + else { + if (db($), + ($ = r = $.prev) === $.next) + break; + e = !0 + } + } while (e || $ !== r); + return r + } + function bb(v, r, e, $, n, t, a) { + if (v) { + !a && t && cf(v, $, n, t); + for (var i, h, x = v; v.prev !== v.next; ) + if (i = v.prev, + h = v.next, + t ? We(v, $, n, t) : Ve(v)) + r.push(i.i / e), + r.push(v.i / e), + r.push(h.i / e), + db(v), + v = h.next, + x = h.next; + else if ((v = h) === x) { + a ? 1 === a ? bb(v = Xe(Da(v), r, e), r, e, $, n, t, 2) : 2 === a && Ye(v, r, e, $, n, t) : bb(Da(v), r, e, $, n, t, 1); + break + } + } + } + function Ve(v) { + var r = v.prev + , e = v + , $ = v.next; + if (ca(r, e, $) >= 0) + return !1; + for (var n = v.next.next; n !== v.prev; ) { + if (Ta(r.x, r.y, e.x, e.y, $.x, $.y, n.x, n.y) && ca(n.prev, n, n.next) >= 0) + return !1; + n = n.next + } + return !0 + } + function We(v, r, e, $) { + var n = v.prev + , t = v + , a = v.next; + if (ca(n, t, a) >= 0) + return !1; + for (var i = n.x < t.x ? n.x < a.x ? n.x : a.x : t.x < a.x ? t.x : a.x, h = n.y < t.y ? n.y < a.y ? n.y : a.y : t.y < a.y ? t.y : a.y, x = n.x > t.x ? n.x > a.x ? n.x : a.x : t.x > a.x ? t.x : a.x, o = n.y > t.y ? n.y > a.y ? n.y : a.y : t.y > a.y ? t.y : a.y, w = Sb(i, h, r, e, $), l = Sb(x, o, r, e, $), u = v.prevZ, s = v.nextZ; u && u.z >= w && s && s.z <= l; ) { + if (u !== v.prev && u !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, u.x, u.y) && ca(u.prev, u, u.next) >= 0) + return !1; + if (u = u.prevZ, + s !== v.prev && s !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, s.x, s.y) && ca(s.prev, s, s.next) >= 0) + return !1; + s = s.nextZ + } + for (; u && u.z >= w; ) { + if (u !== v.prev && u !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, u.x, u.y) && ca(u.prev, u, u.next) >= 0) + return !1; + u = u.prevZ + } + for (; s && s.z <= l; ) { + if (s !== v.prev && s !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, s.x, s.y) && ca(s.prev, s, s.next) >= 0) + return !1; + s = s.nextZ + } + return !0 + } + function Xe(v, r, e) { + var $ = v; + do { + var n = $.prev + , t = $.next.next; + !nb(n, t) && Wc(n, $, $.next, t) && cb(n, t) && cb(t, n) && (r.push(n.i / e), + r.push($.i / e), + r.push(t.i / e), + db($), + db($.next), + $ = v = t), + $ = $.next + } while ($ !== v); + return Da($) + } + function Ye(v, r, e, $, n, t) { + var a = v; + do { + for (var i = a.next.next; i !== a.prev; ) { + if (a.i !== i.i && ff(a, i)) { + var h = Xc(a, i); + return a = Da(a, a.next), + h = Da(h, h.next), + bb(a, r, e, $, n, t), + void bb(h, r, e, $, n, t) + } + i = i.next + } + a = a.next + } while (a !== v) + } + function Ze(v, r, e, $) { + var n, t, a, i = []; + for (n = 0, + t = r.length; n < t; n++) + (a = Vc(v, r[n] * $, n < t - 1 ? r[n + 1] * $ : v.length, $, !1)) === a.next && (a.steiner = !0), + i.push(ef(a)); + for (i.sort($e), + n = 0; n < i.length; n++) + _e(i[n], e), + e = Da(e, e.next); + return e + } + function $e(v, r) { + return v.x - r.x + } + function _e(v, r) { + if (r = af(v, r)) { + var e = Xc(r, v); + Da(r, r.next), + Da(e, e.next) + } + } + function af(v, r) { + var e, $ = r, n = v.x, t = v.y, a = -1 / 0; + do { + if (t <= $.y && t >= $.next.y && $.next.y !== $.y) { + var i = $.x + (t - $.y) * ($.next.x - $.x) / ($.next.y - $.y); + if (i <= n && i > a) { + if (a = i, + i === n) { + if (t === $.y) + return $; + if (t === $.next.y) + return $.next + } + e = $.x < $.next.x ? $ : $.next + } + } + $ = $.next + } while ($ !== r); + if (!e) + return null; + if (n === a) + return e; + var h, x = e, o = e.x, w = e.y, l = 1 / 0; + $ = e; + do { + n >= $.x && $.x >= o && n !== $.x && Ta(t < w ? n : a, t, o, w, t < w ? a : n, t, $.x, $.y) && (h = Math.abs(t - $.y) / (n - $.x), + cb($, v) && (h < l || h === l && ($.x > e.x || $.x === e.x && bf(e, $))) && (e = $, + l = h)), + $ = $.next + } while ($ !== x); + return e + } + function bf(v, r) { + return ca(v.prev, v, r.prev) < 0 && ca(r.next, v, v.next) < 0 + } + function cf(v, r, e, $) { + var n = v; + do { + null === n.z && (n.z = Sb(n.x, n.y, r, e, $)), + n.prevZ = n.prev, + n.nextZ = n.next, + n = n.next + } while (n !== v); + n.prevZ.nextZ = null, + n.prevZ = null, + df(n) + } + function df(v) { + var r, e, $, n, t, a, i, h, x = 1; + do { + for (e = v, + v = null, + t = null, + a = 0; e; ) { + for (a++, + $ = e, + i = 0, + r = 0; r < x && (i++, + $ = $.nextZ); r++) + ; + for (h = x; i > 0 || h > 0 && $; ) + 0 !== i && (0 === h || !$ || e.z <= $.z) ? (n = e, + e = e.nextZ, + i--) : (n = $, + $ = $.nextZ, + h--), + t ? t.nextZ = n : v = n, + n.prevZ = t, + t = n; + e = $ + } + t.nextZ = null, + x *= 2 + } while (a > 1); + return v + } + function Sb(v, r, e, $, n) { + return (v = 1431655765 & ((v = 858993459 & ((v = 252645135 & ((v = 16711935 & ((v = 32767 * (v - e) * n) | v << 8)) | v << 4)) | v << 2)) | v << 1)) | (r = 1431655765 & ((r = 858993459 & ((r = 252645135 & ((r = 16711935 & ((r = 32767 * (r - $) * n) | r << 8)) | r << 4)) | r << 2)) | r << 1)) << 1 + } + function ef(v) { + var r = v + , e = v; + do { + (r.x < e.x || r.x === e.x && r.y < e.y) && (e = r), + r = r.next + } while (r !== v); + return e + } + function Ta(v, r, e, $, n, t, a, i) { + return (n - a) * (r - i) - (v - a) * (t - i) >= 0 && (v - a) * ($ - i) - (e - a) * (r - i) >= 0 && (e - a) * (t - i) - (n - a) * ($ - i) >= 0 + } + function ff(v, r) { + return v.next.i !== r.i && v.prev.i !== r.i && !gf(v, r) && (cb(v, r) && cb(r, v) && hf(v, r) && (ca(v.prev, v, r.prev) || ca(v, r.prev, r)) || nb(v, r) && ca(v.prev, v, v.next) > 0 && ca(r.prev, r, r.next) > 0) + } + function ca(v, r, e) { + return (r.y - v.y) * (e.x - r.x) - (r.x - v.x) * (e.y - r.y) + } + function nb(v, r) { + return v.x === r.x && v.y === r.y + } + function Wc(v, r, e, $) { + var n = pb(ca(v, r, e)) + , t = pb(ca(v, r, $)) + , a = pb(ca(e, $, v)) + , i = pb(ca(e, $, r)); + return n !== t && a !== i || !(0 !== n || !ob(v, e, r)) || !(0 !== t || !ob(v, $, r)) || !(0 !== a || !ob(e, v, $)) || !(0 !== i || !ob(e, r, $)) + } + function ob(v, r, e) { + return r.x <= Math.max(v.x, e.x) && r.x >= Math.min(v.x, e.x) && r.y <= Math.max(v.y, e.y) && r.y >= Math.min(v.y, e.y) + } + function pb(v) { + return v > 0 ? 1 : v < 0 ? -1 : 0 + } + function gf(v, r) { + var e = v; + do { + if (e.i !== v.i && e.next.i !== v.i && e.i !== r.i && e.next.i !== r.i && Wc(e, e.next, v, r)) + return !0; + e = e.next + } while (e !== v); + return !1 + } + function cb(v, r) { + return ca(v.prev, v, v.next) < 0 ? ca(v, r, v.next) >= 0 && ca(v, v.prev, r) >= 0 : ca(v, r, v.prev) < 0 || ca(v, v.next, r) < 0 + } + function hf(v, r) { + var e = v + , $ = !1 + , n = (v.x + r.x) / 2 + , t = (v.y + r.y) / 2; + do { + e.y > t != e.next.y > t && e.next.y !== e.y && n < (e.next.x - e.x) * (t - e.y) / (e.next.y - e.y) + e.x && ($ = !$), + e = e.next + } while (e !== v); + return $ + } + function Xc(v, r) { + var e = new Tb(v.i,v.x,v.y) + , $ = new Tb(r.i,r.x,r.y) + , n = v.next + , t = r.prev; + return v.next = r, + r.prev = v, + e.next = n, + n.prev = e, + $.next = e, + e.prev = $, + t.next = $, + $.prev = t, + $ + } + function Yc(v, r, e, $) { + var n = new Tb(v,r,e); + return $ ? (n.next = $.next, + n.prev = $, + $.next.prev = n, + $.next = n) : (n.prev = n, + n.next = n), + n + } + function db(v) { + v.next.prev = v.prev, + v.prev.next = v.next, + v.prevZ && (v.prevZ.nextZ = v.nextZ), + v.nextZ && (v.nextZ.prevZ = v.prevZ) + } + function Tb(v, r, e) { + this.i = v, + this.x = r, + this.y = e, + this.prev = null, + this.next = null, + this.z = null, + this.prevZ = null, + this.nextZ = null, + this.steiner = !1 + } + function Ub(v, r, e, $) { + for (var n = 0, t = r, a = e - $; t < e; t += $) + n += (v[a] - v[t]) * (v[t + 1] + v[a + 1]), + a = t; + return n + } + (Ue = mb).default = mb, + mb.deviation = function(v, r, e, $) { + var n = r && r.length + , t = n ? r[0] * e : v.length + , a = Math.abs(Ub(v, 0, t, e)); + if (n) + for (var i = 0, h = r.length; i < h; i++) { + var x = r[i] * e + , o = i < h - 1 ? r[i + 1] * e : v.length; + a -= Math.abs(Ub(v, x, o, e)) + } + var w = 0; + for (i = 0; i < $.length; i += 3) { + var l = $[i] * e + , u = $[i + 1] * e + , s = $[i + 2] * e; + w += Math.abs((v[l] - v[s]) * (v[u + 1] - v[l + 1]) - (v[l] - v[u]) * (v[s + 1] - v[l + 1])) + } + return 0 === a && 0 === w ? 0 : Math.abs((w - a) / a) + } + , + mb.flatten = function(v) { + for (var r = v[0][0].length, e = { + vertices: [], + holes: [], + dimensions: r + }, $ = 0, n = 0; n < v.length; n++) { + for (var t = 0; t < v[n].length; t++) + for (var a = 0; a < r; a++) + e.vertices.push(v[n][t][a]); + n > 0 && ($ += v[n - 1].length, + e.holes.push($)) + } + return e + } + ; + var jf = function() { + var o = this + , e = { + exports: this + }; + return function(n) { + var r = "object" == typeof o && o && !o.nodeType && o + , t = "object" == typeof e && e && !e.nodeType && e + , i = "object" == typeof Hc && Hc; + i.global !== i && i.window !== i && i.self !== i || (n = i); + var u, f, c = 2147483647, l = 36, s = 1, a = 26, p = 38, h = 700, d = 72, v = 128, g = "-", w = /^xn--/, x = /[^\x20-\x7E]/, b = /[\x2E\u3002\uFF0E\uFF61]/g, C = { + overflow: "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, y = l - s, j = Math.floor, A = String.fromCharCode; + function $(o) { + throw new RangeError(C[o]) + } + function I(o, e) { + for (var n = o.length, r = []; n--; ) + r[n] = e(o[n]); + return r + } + function E(o, e) { + var n = o.split("@") + , r = ""; + return n.length > 1 && (r = n[0] + "@", + o = n[1]), + r + I((o = o.replace(b, ".")).split("."), e).join(".") + } + function F(o) { + for (var e, n, r = [], t = 0, i = o.length; t < i; ) + (e = o.charCodeAt(t++)) >= 55296 && e <= 56319 && t < i ? 56320 == (64512 & (n = o.charCodeAt(t++))) ? r.push(((1023 & e) << 10) + (1023 & n) + 65536) : (r.push(e), + t--) : r.push(e); + return r + } + function O(o) { + return I(o, function(o) { + var e = ""; + return o > 65535 && (e += A((o -= 65536) >>> 10 & 1023 | 55296), + o = 56320 | 1023 & o), + e += A(o) + }).join("") + } + function S(o, e) { + return o + 22 + 75 * (o < 26) - ((0 != e) << 5) + } + function T(o, e, n) { + var r = 0; + for (o = n ? j(o / h) : o >> 1, + o += j(o / e); o > y * a >> 1; r += l) + o = j(o / y); + return j(r + (y + 1) * o / (o + p)) + } + function m(o) { + var e, n, r, t, i, u, f, p, h, w, x, b = [], C = o.length, y = 0, A = v, I = d; + for ((n = o.lastIndexOf(g)) < 0 && (n = 0), + r = 0; r < n; ++r) + o.charCodeAt(r) >= 128 && $("not-basic"), + b.push(o.charCodeAt(r)); + for (t = n > 0 ? n + 1 : 0; t < C; ) { + for (i = y, + u = 1, + f = l; t >= C && $("invalid-input"), + ((p = (x = o.charCodeAt(t++)) - 48 < 10 ? x - 22 : x - 65 < 26 ? x - 65 : x - 97 < 26 ? x - 97 : l) >= l || p > j((c - y) / u)) && $("overflow"), + y += p * u, + !(p < (h = f <= I ? s : f >= I + a ? a : f - I)); f += l) + u > j(c / (w = l - h)) && $("overflow"), + u *= w; + I = T(y - i, e = b.length + 1, 0 == i), + j(y / e) > c - A && $("overflow"), + A += j(y / e), + y %= e, + b.splice(y++, 0, A) + } + return O(b) + } + function L(o) { + var e, n, r, t, i, u, f, p, h, w, x, b, C, y, I, E = []; + for (b = (o = F(o)).length, + e = v, + n = 0, + i = d, + u = 0; u < b; ++u) + (x = o[u]) < 128 && E.push(A(x)); + for (r = t = E.length, + t && E.push(g); r < b; ) { + for (f = c, + u = 0; u < b; ++u) + (x = o[u]) >= e && x < f && (f = x); + for (f - e > j((c - n) / (C = r + 1)) && $("overflow"), + n += (f - e) * C, + e = f, + u = 0; u < b; ++u) + if ((x = o[u]) < e && ++n > c && $("overflow"), + x == e) { + for (p = n, + h = l; !(p < (w = h <= i ? s : h >= i + a ? a : h - i)); h += l) + I = p - w, + y = l - w, + E.push(A(S(w + I % y, 0))), + p = j(I / y); + E.push(A(S(p, 0))), + i = T(n, C, r == t), + n = 0, + ++r + } + ++n, + ++e + } + return E.join("") + } + if (u = { + version: "1.4.1", + ucs2: { + decode: F, + encode: O + }, + decode: m, + encode: L, + toASCII: function(o) { + return E(o, function(o) { + return x.test(o) ? "xn--" + L(o) : o + }) + }, + toUnicode: function(o) { + return E(o, function(o) { + return w.test(o) ? m(o.slice(4).toLowerCase()) : o + }) + } + }, + r && t) { + if (e.exports == r) + t.exports = u; + else + for (f in u) + u.hasOwnProperty(f) && (r[f] = u[f]); + } else + n.punycode = u + }(this), + e.exports + } + .call({}); + var va = {}; + va = { + isString: function(n) { + return "string" == typeof n + }, + isObject: function(n) { + return "object" == typeof n && null !== n + }, + isNull: function(n) { + return null === n + }, + isNullOrUndefined: function(n) { + return null == n + } + }; + var kf, lf, mf = false; + function nf(r, e) { + return Object.prototype.hasOwnProperty.call(r, e) + } + function of() { + if (mf) + return; + mf = true; + kf = {}; + kf = function(r, e, t, a) { + e = e || "&", + t = t || "="; + var n = {}; + if ("string" != typeof r || 0 === r.length) + return n; + var o = /\+/g; + r = r.split(e); + var s = 1e3; + a && "number" == typeof a.maxKeys && (s = a.maxKeys); + var p = r.length; + s > 0 && p > s && (p = s); + for (var $ = 0; $ < p; ++$) { + var y, v, c, i, u = r[$].replace(o, "%20"), f = u.indexOf(t); + f >= 0 ? (y = u.substr(0, f), + v = u.substr(f + 1)) : (y = u, + v = ""), + c = decodeURIComponent(y), + i = decodeURIComponent(v), + nf(n, c) ? lf(n[c]) ? n[c].push(i) : n[c] = [n[c], i] : n[c] = i + } + return n + } + ; + lf = Array.isArray || function(r) { + return "[object Array]" === Object.prototype.toString.call(r) + } + } + var pf, eb, qf, rf, sf = false; + function Zc(r, e) { + if (r.map) + return r.map(e); + for (var t = [], n = 0; n < r.length; n++) + t.push(e(r[n], n)); + return t + } + function tf() { + if (sf) + return; + sf = true; + pf = {}; + eb = function(r) { + switch (typeof r) { + case "string": + return r; + case "boolean": + return r ? "true" : "false"; + case "number": + return isFinite(r) ? r : ""; + default: + return ""; + } + } + ; + pf = function(r, e, t, n) { + return e = e || "&", + t = t || "=", + null === r && (r = void 0), + "object" == typeof r ? Zc(rf(r), function(n) { + var i = encodeURIComponent(eb(n)) + t; + return qf(r[n]) ? Zc(r[n], function(r) { + return i + encodeURIComponent(eb(r)) + }).join(e) : i + encodeURIComponent(eb(r[n])) + }).join(e) : n ? encodeURIComponent(eb(n)) + t + encodeURIComponent(eb(r)) : "" + } + ; + qf = Array.isArray || function(r) { + return "[object Array]" === Object.prototype.toString.call(r) + } + ; + rf = Object.keys || function(r) { + var e = []; + for (var t in r) + Object.prototype.hasOwnProperty.call(r, t) && e.push(t); + return e + } + } + var $c, uf, c = ($c = (of(), + kf)); + var d = (uf = (tf(), + pf)); + var vf = qb; + var wf = Hf; + var xf = Gf; + function sa() { + this.protocol = null, + this.slashes = null, + this.auth = null, + this.host = null, + this.port = null, + this.hostname = null, + this.hash = null, + this.search = null, + this.query = null, + this.pathname = null, + this.path = null, + this.href = null + } + var yf = /^([a-z0-9.+-]+:)/i + , zf = /:[0-9]*$/ + , Af = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/ + , Bf = ["<", ">", "\"", "`", " ", "\r", "\n", "\t"] + , Cf = ["{", "}", "|", "\\", "^", "`"].concat(Bf) + , Vb = ["'"].concat(Cf) + , _c = ["%", "/", "?", ";", "#"].concat(Vb) + , ad = ["/", "?", "#"] + , Df = 255 + , bd = /^[+a-z0-9A-Z_-]{0,63}$/ + , Ef = /^([+a-z0-9A-Z_-]{0,63})(.*)$/ + , Ff = { + javascript: !0, + "javascript:": !0 + } + , Wb = { + javascript: !0, + "javascript:": !0 + } + , Ua = { + http: !0, + https: !0, + ftp: !0, + gopher: !0, + file: !0, + "http:": !0, + "https:": !0, + "ftp:": !0, + "gopher:": !0, + "file:": !0 + }; + function qb(t, h, r) { + if (t && va.isObject(t) && t instanceof sa) + return t; + var s = new sa; + return s.parse(t, h, r), + s + } + function Gf(t) { + return va.isString(t) && (t = qb(t)), + t instanceof sa ? t.format() : sa.prototype.format.call(t) + } + function Hf(t, h) { + return qb(t, !1, !0).resolve(h) + } + sa.prototype.parse = function(t, h, r) { + if (!va.isString(t)) + throw new TypeError("Parameter 'url' must be a string, not " + typeof t); + var s = t.indexOf("?") + , a = -1 !== s && s < t.indexOf("#") ? "?" : "#" + , e = t.split(a); + e[0] = e[0].replace(/\\/g, "/"); + var o = t = e.join(a); + if (o = o.trim(), + !r && 1 === t.split("#").length) { + var $ = Af.exec(o); + if ($) + return this.path = o, + this.href = o, + this.pathname = $[1], + $[2] ? (this.search = $[2], + this.query = h ? $c(this.search.substr(1)) : this.search.substr(1)) : h && (this.search = "", + this.query = {}), + this + } + var n = yf.exec(o); + if (n) { + var i = (n = n[0]).toLowerCase(); + this.protocol = i, + o = o.substr(n.length) + } + if (r || n || o.match(/^\/\/[^@\/]+@[^@\/]+/)) { + var l = "//" === o.substr(0, 2); + !l || n && Wb[n] || (o = o.substr(2), + this.slashes = !0) + } + if (!Wb[n] && (l || n && !Ua[n])) { + for (var p, u, c = -1, v = 0; v < ad.length; v++) { + -1 !== (d = o.indexOf(ad[v])) && (-1 === c || d < c) && (c = d) + } + -1 !== (u = -1 === c ? o.lastIndexOf("@") : o.lastIndexOf("@", c)) && (p = o.slice(0, u), + o = o.slice(u + 1), + this.auth = decodeURIComponent(p)), + c = -1; + for (v = 0; v < _c.length; v++) { + var d; + -1 !== (d = o.indexOf(_c[v])) && (-1 === c || d < c) && (c = d) + } + -1 === c && (c = o.length), + this.host = o.slice(0, c), + o = o.slice(c), + this.parseHost(), + this.hostname = this.hostname || ""; + var f = "[" === this.hostname[0] && "]" === this.hostname[this.hostname.length - 1]; + if (!f) + for (var m = this.hostname.split(/\./), F = (v = 0, + m.length); v < F; v++) { + var Z = m[v]; + if (Z && !Z.match(bd)) { + for (var g = "", y = 0, P = Z.length; y < P; y++) + Z.charCodeAt(y) > 127 ? g += "x" : g += Z[y]; + if (!g.match(bd)) { + var x = m.slice(0, v) + , b = m.slice(v + 1) + , q = Z.match(Ef); + q && (x.push(q[1]), + b.unshift(q[2])), + b.length && (o = "/" + b.join(".") + o), + this.hostname = x.join("."); + break + } + } + } + this.hostname.length > Df ? this.hostname = "" : this.hostname = this.hostname.toLowerCase(), + f || (this.hostname = jf.toASCII(this.hostname)); + var O = this.port ? ":" + this.port : "" + , j = this.hostname || ""; + this.host = j + O, + this.href += this.host, + f && (this.hostname = this.hostname.substr(1, this.hostname.length - 2), + "/" !== o[0] && (o = "/" + o)) + } + if (!Ff[i]) + for (v = 0, + F = Vb.length; v < F; v++) { + var U = Vb[v]; + if (-1 !== o.indexOf(U)) { + var C = encodeURIComponent(U); + C === U && (C = escape(U)), + o = o.split(U).join(C) + } + } + var A = o.indexOf("#"); + -1 !== A && (this.hash = o.substr(A), + o = o.slice(0, A)); + var w = o.indexOf("?"); + if (-1 !== w ? (this.search = o.substr(w), + this.query = o.substr(w + 1), + h && (this.query = $c(this.query)), + o = o.slice(0, w)) : h && (this.search = "", + this.query = {}), + o && (this.pathname = o), + Ua[i] && this.hostname && !this.pathname && (this.pathname = "/"), + this.pathname || this.search) { + O = this.pathname || ""; + var E = this.search || ""; + this.path = O + E + } + return this.href = this.format(), + this + } + , + sa.prototype.format = function() { + var t = this.auth || ""; + t && (t = (t = encodeURIComponent(t)).replace(/%3A/i, ":"), + t += "@"); + var h = this.protocol || "" + , r = this.pathname || "" + , s = this.hash || "" + , a = !1 + , e = ""; + this.host ? a = t + this.host : this.hostname && (a = t + (-1 === this.hostname.indexOf(":") ? this.hostname : "[" + this.hostname + "]"), + this.port && (a += ":" + this.port)), + this.query && va.isObject(this.query) && Object.keys(this.query).length && (e = uf(this.query)); + var o = this.search || e && "?" + e || ""; + return h && ":" !== h.substr(-1) && (h += ":"), + this.slashes || (!h || Ua[h]) && !1 !== a ? (a = "//" + (a || ""), + r && "/" !== r.charAt(0) && (r = "/" + r)) : a || (a = ""), + s && "#" !== s.charAt(0) && (s = "#" + s), + o && "?" !== o.charAt(0) && (o = "?" + o), + h + a + (r = r.replace(/[?#]/g, function(t) { + return encodeURIComponent(t) + })) + (o = o.replace("#", "%23")) + s + } + , + sa.prototype.resolve = function(t) { + return this.resolveObject(qb(t, !1, !0)).format() + } + , + sa.prototype.resolveObject = function(t) { + if (va.isString(t)) { + var h = new sa; + h.parse(t, !1, !0), + t = h + } + for (var r = new sa, s = Object.keys(this), a = 0; a < s.length; a++) { + var e = s[a]; + r[e] = this[e] + } + if (r.hash = t.hash, + "" === t.href) + return r.href = r.format(), + r; + if (t.slashes && !t.protocol) { + for (var o = Object.keys(t), $ = 0; $ < o.length; $++) { + var n = o[$]; + "protocol" !== n && (r[n] = t[n]) + } + return Ua[r.protocol] && r.hostname && !r.pathname && (r.path = r.pathname = "/"), + r.href = r.format(), + r + } + if (t.protocol && t.protocol !== r.protocol) { + if (!Ua[t.protocol]) { + for (var i = Object.keys(t), l = 0; l < i.length; l++) { + var p = i[l]; + r[p] = t[p] + } + return r.href = r.format(), + r + } + if (r.protocol = t.protocol, + t.host || Wb[t.protocol]) + r.pathname = t.pathname; + else { + for (var u = (t.pathname || "").split("/"); u.length && !(t.host = u.shift()); ) + ; + t.host || (t.host = ""), + t.hostname || (t.hostname = ""), + "" !== u[0] && u.unshift(""), + u.length < 2 && u.unshift(""), + r.pathname = u.join("/") + } + if (r.search = t.search, + r.query = t.query, + r.host = t.host || "", + r.auth = t.auth, + r.hostname = t.hostname || t.host, + r.port = t.port, + r.pathname || r.search) { + var c = r.pathname || "" + , v = r.search || ""; + r.path = c + v + } + return r.slashes = r.slashes || t.slashes, + r.href = r.format(), + r + } + var d = r.pathname && "/" === r.pathname.charAt(0) + , f = t.host || t.pathname && "/" === t.pathname.charAt(0) + , m = f || d || r.host && t.pathname + , F = m + , Z = r.pathname && r.pathname.split("/") || [] + , g = (u = t.pathname && t.pathname.split("/") || [], + r.protocol && !Ua[r.protocol]); + if (g && (r.hostname = "", + r.port = null, + r.host && ("" === Z[0] ? Z[0] = r.host : Z.unshift(r.host)), + r.host = "", + t.protocol && (t.hostname = null, + t.port = null, + t.host && ("" === u[0] ? u[0] = t.host : u.unshift(t.host)), + t.host = null), + m = m && ("" === u[0] || "" === Z[0])), + f) + r.host = t.host || "" === t.host ? t.host : r.host, + r.hostname = t.hostname || "" === t.hostname ? t.hostname : r.hostname, + r.search = t.search, + r.query = t.query, + Z = u; + else if (u.length) + Z || (Z = []), + Z.pop(), + Z = Z.concat(u), + r.search = t.search, + r.query = t.query; + else if (!va.isNullOrUndefined(t.search)) { + if (g) + r.hostname = r.host = Z.shift(), + (q = !!(r.host && r.host.indexOf("@") > 0) && r.host.split("@")) && (r.auth = q.shift(), + r.host = r.hostname = q.shift()); + return r.search = t.search, + r.query = t.query, + va.isNull(r.pathname) && va.isNull(r.search) || (r.path = (r.pathname ? r.pathname : "") + (r.search ? r.search : "")), + r.href = r.format(), + r + } + if (!Z.length) + return r.pathname = null, + r.search ? r.path = "/" + r.search : r.path = null, + r.href = r.format(), + r; + for (var y = Z.slice(-1)[0], P = (r.host || t.host || Z.length > 1) && ("." === y || ".." === y) || "" === y, x = 0, b = Z.length; b >= 0; b--) + "." === (y = Z[b]) ? Z.splice(b, 1) : ".." === y ? (Z.splice(b, 1), + x++) : x && (Z.splice(b, 1), + x--); + if (!m && !F) + for (; x--; x) + Z.unshift(".."); + !m || "" === Z[0] || Z[0] && "/" === Z[0].charAt(0) || Z.unshift(""), + P && "/" !== Z.join("/").substr(-1) && Z.push(""); + var q, O = "" === Z[0] || Z[0] && "/" === Z[0].charAt(0); + g && (r.hostname = r.host = O ? "" : Z.length ? Z.shift() : "", + (q = !!(r.host && r.host.indexOf("@") > 0) && r.host.split("@")) && (r.auth = q.shift(), + r.host = r.hostname = q.shift())); + return (m = m || r.host && Z.length) && !O && Z.unshift(""), + Z.length ? r.pathname = Z.join("/") : (r.pathname = null, + r.path = null), + va.isNull(r.pathname) && va.isNull(r.search) || (r.path = (r.pathname ? r.pathname : "") + (r.search ? r.search : "")), + r.auth = t.auth || r.auth, + r.slashes = r.slashes || t.slashes, + r.href = r.format(), + r + } + , + sa.prototype.parseHost = function() { + var t = this.host + , h = zf.exec(t); + h && (":" !== (h = h[0]) && (this.port = h.substr(1)), + t = t.substr(0, t.length - h.length)), + t && (this.hostname = t) + } + ; + var rb = Kb(Re); + var cd = Kb(Ue); + var If = { + parse: vf, + format: xf, + resolve: wf + }; + aa.RETINA_PREFIX = /@([0-9\.]+)x/, + aa.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = !1; + var dd, Jf = !1, ed = "6.0.1"; + function Kf($) { + var e; + if (!Jf) { + if (navigator.userAgent.toLowerCase().indexOf("chrome") > -1) { + var r = ["\n %c %c %c PixiJS " + ed + " - \u2730 " + $ + " \u2730 %c %c http://www.pixijs.com/ %c %c \u2665%c\u2665%c\u2665 \n\n", "background: #ff66a5; padding:5px 0;", "background: #ff66a5; padding:5px 0;", "color: #ff66a5; background: #030307; padding:5px 0;", "background: #ff66a5; padding:5px 0;", "background: #ffc3dc; padding:5px 0;", "background: #ff66a5; padding:5px 0;", "color: #ff2424; background: #fff; padding:5px 0;", "color: #ff2424; background: #fff; padding:5px 0;", "color: #ff2424; background: #fff; padding:5px 0;"]; + (e = self.console).log.apply(e, r) + } else + self.console && self.console.log("PixiJS " + ed + " - " + $ + " - http://www.pixijs.com/"); + Jf = !0 + } + } + function Lf() { + return void 0 === dd && (dd = function() { + var $ = { + stencil: !0, + failIfMajorPerformanceCaveat: aa.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT + }; + try { + if (!self.WebGLRenderingContext) + return !1; + var e = document.createElement("canvas") + , r = e.getContext("webgl", $) || e.getContext("experimental-webgl", $) + , a = !(!r || !r.getContextAttributes().stencil); + if (r) { + var v = r.getExtension("WEBGL_lose_context"); + v && v.loseContext() + } + return r = null, + a + } catch (g) { + return !1 + } + }()), + dd + } + function Xb($, e) { + return void 0 === e && (e = []), + e[0] = ($ >> 16 & 255) / 255, + e[1] = ($ >> 8 & 255) / 255, + e[2] = (255 & $) / 255, + e + } + function Mf($) { + var e = $.toString(16); + return "#" + (e = "000000".substr(0, 6 - e.length) + e) + } + function Nf() { + for (var $ = [], e = [], r = 0; r < 32; r++) + $[r] = r, + e[r] = r; + $[K.NORMAL_NPM] = K.NORMAL, + $[K.ADD_NPM] = K.ADD, + $[K.SCREEN_NPM] = K.SCREEN, + e[K.NORMAL] = K.NORMAL_NPM, + e[K.ADD] = K.ADD_NPM, + e[K.SCREEN] = K.SCREEN_NPM; + var a = []; + return a.push(e), + a.push($), + a + } + var Of = Nf(); + function fd($, e) { + if (1 === e) + return (255 * e << 24) + $; + if (0 === e) + return 0; + var r = $ >> 16 & 255 + , a = $ >> 8 & 255 + , v = 255 & $; + return (255 * e << 24) + ((r = r * e + .5 | 0) << 16) + ((a = a * e + .5 | 0) << 8) + (v = v * e + .5 | 0) + } + var e = { + Float32Array: Float32Array, + Uint32Array: Uint32Array, + Int32Array: Int32Array, + Uint8Array: Uint8Array + }; + function sb($) { + return $ += 0 === $ ? 1 : 0, + --$, + $ |= $ >>> 1, + $ |= $ >>> 2, + $ |= $ >>> 4, + $ |= $ >>> 8, + ($ |= $ >>> 16) + 1 + } + function gd($) { + return !($ & $ - 1 || !$) + } + function hd($) { + var e = ($ > 65535 ? 1 : 0) << 4 + , r = (($ >>>= e) > 255 ? 1 : 0) << 3; + return e |= r, + e |= r = (($ >>>= r) > 15 ? 1 : 0) << 2, + (e |= r = (($ >>>= r) > 3 ? 1 : 0) << 1) | ($ >>>= r) >> 1 + } + function tb($, e, r) { + var a, v = $.length; + if (!(e >= v || 0 === r)) { + var g = v - (r = e + r > v ? v - e : r); + for (a = e; a < g; ++a) + $[a] = $[a + r]; + $.length = g + } + } + var Pf = 0; + function ub() { + return ++Pf + } + var id = {}; + function Va($, e, r) { + if (void 0 === r && (r = 3), + !id[e]) { + var a = new Error().stack; + void 0 === a ? console.warn("PixiJS Deprecation Warning: ", e + "\nDeprecated since v" + $) : (a = a.split("\n").splice(r).join("\n"), + console.groupCollapsed ? (console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s", "color:#614108;background:#fffbe6", "font-weight:normal;color:#614108;background:#fffbe6", e + "\nDeprecated since v" + $), + console.warn(a), + console.groupEnd()) : (console.warn("PixiJS Deprecation Warning: ", e + "\nDeprecated since v" + $), + console.warn(a))), + id[e] = !0 + } + } + var jd = {} + , ya = Object.create(null) + , Ka = Object.create(null); + var f = function() { + function $($, e, r) { + this.canvas = document.createElement("canvas"), + this.context = this.canvas.getContext("2d"), + this.resolution = r || aa.RESOLUTION, + this.resize($, e) + } + return $.prototype.clear = function() { + this.context.setTransform(1, 0, 0, 1, 0, 0), + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height) + } + , + $.prototype.resize = function($, e) { + this.canvas.width = $ * this.resolution, + this.canvas.height = e * this.resolution + } + , + $.prototype.destroy = function() { + this.context = null, + this.canvas = null + } + , + Object.defineProperty($.prototype, "width", { + get: function() { + return this.canvas.width + }, + set: function($) { + this.canvas.width = $ + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty($.prototype, "height", { + get: function() { + return this.canvas.height + }, + set: function($) { + this.canvas.height = $ + }, + enumerable: !1, + configurable: !0 + }), + $ + }(); + var Yb; + function Qf($, e) { + if (void 0 === e && (e = self.location), + 0 === $.indexOf("data:")) + return ""; + e = e || self.location, + Yb || (Yb = document.createElement("a")), + Yb.href = $; + var r = If.parse(Yb.href) + , a = !r.port && "" === e.port || r.port === e.port; + return r.hostname === e.hostname && a && r.protocol === e.protocol ? "" : "anonymous" + } + function kd($, e) { + var r = aa.RETINA_PREFIX.exec($); + return r ? parseFloat(r[1]) : void 0 !== e ? e : 1 + } + var ka = function() { + function t(t) { + this.items = [], + this._name = t, + this._aliasCount = 0 + } + return t.prototype.emit = function(t, e, n, i, r, s, o, u) { + if (arguments.length > 8) + throw new Error("max arguments reached"); + var h = this.name + , p = this.items; + this._aliasCount++; + for (var a = 0, m = p.length; a < m; a++) + p[a][h](t, e, n, i, r, s, o, u); + return p === this.items && this._aliasCount--, + this + } + , + t.prototype.ensureNonAliasedItems = function() { + this._aliasCount > 0 && this.items.length > 1 && (this._aliasCount = 0, + this.items = this.items.slice(0)) + } + , + t.prototype.add = function(t) { + return t[this._name] && (this.ensureNonAliasedItems(), + this.remove(t), + this.items.push(t)), + this + } + , + t.prototype.remove = function(t) { + var e = this.items.indexOf(t); + return -1 !== e && (this.ensureNonAliasedItems(), + this.items.splice(e, 1)), + this + } + , + t.prototype.contains = function(t) { + return -1 !== this.items.indexOf(t) + } + , + t.prototype.removeAll = function() { + return this.ensureNonAliasedItems(), + this.items.length = 0, + this + } + , + t.prototype.destroy = function() { + this.removeAll(), + this.items = null, + this._name = null + } + , + Object.defineProperty(t.prototype, "empty", { + get: function() { + return 0 === this.items.length + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "name", { + get: function() { + return this._name + }, + enumerable: !1, + configurable: !0 + }), + t + }(); + Object.defineProperties(ka.prototype, { + dispatch: { + value: ka.prototype.emit + }, + run: { + value: ka.prototype.emit + } + }); + var Rf, vb; + aa.TARGET_FPMS = .06, + function(t) { + t[t.INTERACTION = 50] = "INTERACTION", + t[t.HIGH = 25] = "HIGH", + t[t.NORMAL = 0] = "NORMAL", + t[t.LOW = -25] = "LOW", + t[t.UTILITY = -50] = "UTILITY" + }(vb || (Rf = vb = {}, + Rf)); + var Zb = function() { + function t(t, e, i, s) { + void 0 === e && (e = null), + void 0 === i && (i = 0), + void 0 === s && (s = !1), + this.next = null, + this.previous = null, + this._destroyed = !1, + this.fn = t, + this.context = e, + this.priority = i, + this.once = s + } + return t.prototype.match = function(t, e) { + return void 0 === e && (e = null), + this.fn === t && this.context === e + } + , + t.prototype.emit = function(t) { + this.fn && (this.context ? this.fn.call(this.context, t) : this.fn(t)); + var e = this.next; + return this.once && this.destroy(!0), + this._destroyed && (this.next = null), + e + } + , + t.prototype.connect = function(t) { + this.previous = t, + t.next && (t.next.previous = this), + this.next = t.next, + t.next = this + } + , + t.prototype.destroy = function(t) { + void 0 === t && (t = !1), + this._destroyed = !0, + this.fn = null, + this.context = null, + this.previous && (this.previous.next = this.next), + this.next && (this.next.previous = this.previous); + var e = this.next; + return this.next = t ? null : e, + this.previous = null, + e + } + , + t + }() + , Ea = function() { + function t() { + var t = this; + this.autoStart = !1, + this.deltaTime = 1, + this.lastTime = -1, + this.speed = 1, + this.started = !1, + this._requestId = null, + this._maxElapsedMS = 100, + this._minElapsedMS = 0, + this._protected = !1, + this._lastFrame = -1, + this._head = new Zb(null,null,1 / 0), + this.deltaMS = 1 / aa.TARGET_FPMS, + this.elapsedMS = 1 / aa.TARGET_FPMS, + this._tick = function(e) { + t._requestId = null, + t.started && (t.update(e), + t.started && null === t._requestId && t._head.next && (t._requestId = requestAnimationFrame(t._tick))) + } + } + return t.prototype._requestIfNeeded = function() { + null === this._requestId && this._head.next && (this.lastTime = performance.now(), + this._lastFrame = this.lastTime, + this._requestId = requestAnimationFrame(this._tick)) + } + , + t.prototype._cancelIfNeeded = function() { + null !== this._requestId && (cancelAnimationFrame(this._requestId), + this._requestId = null) + } + , + t.prototype._startIfPossible = function() { + this.started ? this._requestIfNeeded() : this.autoStart && this.start() + } + , + t.prototype.add = function(t, e, i) { + return void 0 === i && (i = vb.NORMAL), + this._addListener(new Zb(t,e,i)) + } + , + t.prototype.addOnce = function(t, e, i) { + return void 0 === i && (i = vb.NORMAL), + this._addListener(new Zb(t,e,i,!0)) + } + , + t.prototype._addListener = function(t) { + var e = this._head.next + , i = this._head; + if (e) { + for (; e; ) { + if (t.priority > e.priority) { + t.connect(i); + break + } + i = e, + e = e.next + } + t.previous || t.connect(i) + } else + t.connect(i); + return this._startIfPossible(), + this + } + , + t.prototype.remove = function(t, e) { + for (var i = this._head.next; i; ) + i = i.match(t, e) ? i.destroy() : i.next; + return this._head.next || this._cancelIfNeeded(), + this + } + , + Object.defineProperty(t.prototype, "count", { + get: function() { + if (!this._head) + return 0; + for (var t = 0, e = this._head; e = e.next; ) + t++; + return t + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.start = function() { + this.started || (this.started = !0, + this._requestIfNeeded()) + } + , + t.prototype.stop = function() { + this.started && (this.started = !1, + this._cancelIfNeeded()) + } + , + t.prototype.destroy = function() { + if (!this._protected) { + this.stop(); + for (var t = this._head.next; t; ) + t = t.destroy(!0); + this._head.destroy(), + this._head = null + } + } + , + t.prototype.update = function(t) { + var e; + if (void 0 === t && (t = performance.now()), + t > this.lastTime) { + if ((e = this.elapsedMS = t - this.lastTime) > this._maxElapsedMS && (e = this._maxElapsedMS), + e *= this.speed, + this._minElapsedMS) { + var i = t - this._lastFrame | 0; + if (i < this._minElapsedMS) + return; + this._lastFrame = t - i % this._minElapsedMS + } + this.deltaMS = e, + this.deltaTime = this.deltaMS * aa.TARGET_FPMS; + for (var s = this._head, r = s.next; r; ) + r = r.emit(this.deltaTime); + s.next || this._cancelIfNeeded() + } else + this.deltaTime = this.deltaMS = this.elapsedMS = 0; + this.lastTime = t + } + , + Object.defineProperty(t.prototype, "FPS", { + get: function() { + return 1e3 / this.elapsedMS + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "minFPS", { + get: function() { + return 1e3 / this._maxElapsedMS + }, + set: function(t) { + var e = Math.min(this.maxFPS, t) + , i = Math.min(Math.max(0, e) / 1e3, aa.TARGET_FPMS); + this._maxElapsedMS = 1 / i + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "maxFPS", { + get: function() { + return this._minElapsedMS ? Math.round(1e3 / this._minElapsedMS) : 0 + }, + set: function(t) { + if (0 === t) + this._minElapsedMS = 0; + else { + var e = Math.max(this.minFPS, t); + this._minElapsedMS = 1 / (e / 1e3) + } + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "shared", { + get: function() { + if (!t._shared) { + var e = t._shared = new t; + e.autoStart = !0, + e._protected = !0 + } + return t._shared + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "system", { + get: function() { + if (!t._system) { + var e = t._system = new t; + e.autoStart = !0, + e._protected = !0 + } + return t._system + }, + enumerable: !1, + configurable: !0 + }), + t + }() + , g = function() { + function t() {} + return t.init = function(t) { + var e = this; + t = Object.assign({ + autoStart: !0, + sharedTicker: !1 + }, t), + Object.defineProperty(this, "ticker", { + set: function(t) { + this._ticker && this._ticker.remove(this.render, this), + this._ticker = t, + t && t.add(this.render, this, vb.LOW) + }, + get: function() { + return this._ticker + } + }), + this.stop = function() { + e._ticker.stop() + } + , + this.start = function() { + e._ticker.start() + } + , + this._ticker = null, + this.ticker = t.sharedTicker ? Ea.shared : new Ea, + t.autoStart && this.start() + } + , + t.destroy = function() { + if (this._ticker) { + var t = this._ticker; + this.ticker = null, + t.destroy() + } + } + , + t + }(); + var Sf, fa, wb = 2 * Math.PI, Tf = 180 / Math.PI, Uf = Math.PI / 180; + !function(t) { + t[t.POLY = 0] = "POLY", + t[t.RECT = 1] = "RECT", + t[t.CIRC = 2] = "CIRC", + t[t.ELIP = 3] = "ELIP", + t[t.RREC = 4] = "RREC" + }(fa || (Sf = fa = {}, + Sf)); + var da = function() { + function t(t, i, s, o) { + void 0 === t && (t = 0), + void 0 === i && (i = 0), + void 0 === s && (s = 0), + void 0 === o && (o = 0), + this.x = Number(t), + this.y = Number(i), + this.width = Number(s), + this.height = Number(o), + this.type = fa.RECT + } + return Object.defineProperty(t.prototype, "left", { + get: function() { + return this.x + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "right", { + get: function() { + return this.x + this.width + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "top", { + get: function() { + return this.y + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "bottom", { + get: function() { + return this.y + this.height + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "EMPTY", { + get: function() { + return new t(0,0,0,0) + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.clone = function() { + return new t(this.x,this.y,this.width,this.height) + } + , + t.prototype.copyFrom = function(t) { + return this.x = t.x, + this.y = t.y, + this.width = t.width, + this.height = t.height, + this + } + , + t.prototype.copyTo = function(t) { + return t.x = this.x, + t.y = this.y, + t.width = this.width, + t.height = this.height, + t + } + , + t.prototype.contains = function(t, i) { + return !(this.width <= 0 || this.height <= 0) && t >= this.x && t < this.x + this.width && i >= this.y && i < this.y + this.height + } + , + t.prototype.pad = function(t, i) { + return void 0 === t && (t = 0), + void 0 === i && (i = t), + this.x -= t, + this.y -= i, + this.width += 2 * t, + this.height += 2 * i, + this + } + , + t.prototype.fit = function(t) { + var i = Math.max(this.x, t.x) + , s = Math.min(this.x + this.width, t.x + t.width) + , o = Math.max(this.y, t.y) + , h = Math.min(this.y + this.height, t.y + t.height); + return this.x = i, + this.width = Math.max(s - i, 0), + this.y = o, + this.height = Math.max(h - o, 0), + this + } + , + t.prototype.ceil = function(t, i) { + void 0 === t && (t = 1), + void 0 === i && (i = .001); + var s = Math.ceil((this.x + this.width - i) * t) / t + , o = Math.ceil((this.y + this.height - i) * t) / t; + return this.x = Math.floor((this.x + i) * t) / t, + this.y = Math.floor((this.y + i) * t) / t, + this.width = s - this.x, + this.height = o - this.y, + this + } + , + t.prototype.enlarge = function(t) { + var i = Math.min(this.x, t.x) + , s = Math.max(this.x + this.width, t.x + t.width) + , o = Math.min(this.y, t.y) + , h = Math.max(this.y + this.height, t.y + t.height); + return this.x = i, + this.width = s - i, + this.y = o, + this.height = h - o, + this + } + , + t.prototype.toString = function() { + return "[@pixi/math:Rectangle x=" + this.x + " y=" + this.y + " width=" + this.width + " height=" + this.height + "]" + } + , + t + }() + , Vf = function() { + function t(t, i, s) { + void 0 === t && (t = 0), + void 0 === i && (i = 0), + void 0 === s && (s = 0), + this.x = t, + this.y = i, + this.radius = s, + this.type = fa.CIRC + } + return t.prototype.clone = function() { + return new t(this.x,this.y,this.radius) + } + , + t.prototype.contains = function(t, i) { + if (this.radius <= 0) + return !1; + var s = this.radius * this.radius + , o = this.x - t + , h = this.y - i; + return (o *= o) + (h *= h) <= s + } + , + t.prototype.getBounds = function() { + return new da(this.x - this.radius,this.y - this.radius,2 * this.radius,2 * this.radius) + } + , + t.prototype.toString = function() { + return "[@pixi/math:Circle x=" + this.x + " y=" + this.y + " radius=" + this.radius + "]" + } + , + t + }() + , Wf = function() { + function t(t, i, s, o) { + void 0 === t && (t = 0), + void 0 === i && (i = 0), + void 0 === s && (s = 0), + void 0 === o && (o = 0), + this.x = t, + this.y = i, + this.width = s, + this.height = o, + this.type = fa.ELIP + } + return t.prototype.clone = function() { + return new t(this.x,this.y,this.width,this.height) + } + , + t.prototype.contains = function(t, i) { + if (this.width <= 0 || this.height <= 0) + return !1; + var s = (t - this.x) / this.width + , o = (i - this.y) / this.height; + return (s *= s) + (o *= o) <= 1 + } + , + t.prototype.getBounds = function() { + return new da(this.x - this.width,this.y - this.height,this.width,this.height) + } + , + t.prototype.toString = function() { + return "[@pixi/math:Ellipse x=" + this.x + " y=" + this.y + " width=" + this.width + " height=" + this.height + "]" + } + , + t + }() + , $b = function() { + function t() { + for (var t = arguments, i = [], s = 0; s < arguments.length; s++) + i[s] = t[s]; + var o = Array.isArray(i[0]) ? i[0] : i; + if ("number" != typeof o[0]) { + for (var h = [], r = 0, e = o.length; r < e; r++) + h.push(o[r].x, o[r].y); + o = h + } + this.points = o, + this.type = fa.POLY, + this.closeStroke = !0 + } + return t.prototype.clone = function() { + var i = new t(this.points.slice()); + return i.closeStroke = this.closeStroke, + i + } + , + t.prototype.contains = function(t, i) { + for (var s = !1, o = this.points.length / 2, h = 0, r = o - 1; h < o; r = h++) { + var e = this.points[2 * h] + , n = this.points[2 * h + 1] + , a = this.points[2 * r] + , $ = this.points[2 * r + 1]; + n > i != $ > i && t < (i - n) / ($ - n) * (a - e) + e && (s = !s) + } + return s + } + , + t.prototype.toString = function() { + return "[@pixi/math:PolygoncloseStroke=" + this.closeStroke + "points=" + this.points.reduce(function(t, i) { + return t + ", " + i + }, "") + "]" + } + , + t + }() + , Xf = function() { + function t(t, i, s, o, h) { + void 0 === t && (t = 0), + void 0 === i && (i = 0), + void 0 === s && (s = 0), + void 0 === o && (o = 0), + void 0 === h && (h = 20), + this.x = t, + this.y = i, + this.width = s, + this.height = o, + this.radius = h, + this.type = fa.RREC + } + return t.prototype.clone = function() { + return new t(this.x,this.y,this.width,this.height,this.radius) + } + , + t.prototype.contains = function(t, i) { + if (this.width <= 0 || this.height <= 0) + return !1; + if (t >= this.x && t <= this.x + this.width && i >= this.y && i <= this.y + this.height) { + if (i >= this.y + this.radius && i <= this.y + this.height - this.radius || t >= this.x + this.radius && t <= this.x + this.width - this.radius) + return !0; + var s = t - (this.x + this.radius) + , o = i - (this.y + this.radius) + , h = this.radius * this.radius; + if (s * s + o * o <= h) + return !0; + if ((s = t - (this.x + this.width - this.radius)) * s + o * o <= h) + return !0; + if (s * s + (o = i - (this.y + this.height - this.radius)) * o <= h) + return !0; + if ((s = t - (this.x + this.radius)) * s + o * o <= h) + return !0 + } + return !1 + } + , + t.prototype.toString = function() { + return "[@pixi/math:RoundedRectangle x=" + this.x + " y=" + this.y + "width=" + this.width + " height=" + this.height + " radius=" + this.radius + "]" + } + , + t + }() + , ra = function() { + function t(t, i) { + void 0 === t && (t = 0), + void 0 === i && (i = 0), + this.x = t, + this.y = i + } + return t.prototype.clone = function() { + return new t(this.x,this.y) + } + , + t.prototype.copyFrom = function(t) { + return this.set(t.x, t.y), + this + } + , + t.prototype.copyTo = function(t) { + return t.set(this.x, this.y), + t + } + , + t.prototype.equals = function(t) { + return t.x === this.x && t.y === this.y + } + , + t.prototype.set = function(t, i) { + return void 0 === t && (t = 0), + void 0 === i && (i = t), + this.x = t, + this.y = i, + this + } + , + t.prototype.toString = function() { + return "[@pixi/math:Point x=" + this.x + " y=" + this.y + "]" + } + , + t + }() + , xb = function() { + function t(t, i, s, o) { + void 0 === s && (s = 0), + void 0 === o && (o = 0), + this._x = s, + this._y = o, + this.cb = t, + this.scope = i + } + return t.prototype.clone = function(i, s) { + return void 0 === i && (i = this.cb), + void 0 === s && (s = this.scope), + new t(i,s,this._x,this._y) + } + , + t.prototype.set = function(t, i) { + return void 0 === t && (t = 0), + void 0 === i && (i = t), + this._x === t && this._y === i || (this._x = t, + this._y = i, + this.cb.call(this.scope)), + this + } + , + t.prototype.copyFrom = function(t) { + return this._x === t.x && this._y === t.y || (this._x = t.x, + this._y = t.y, + this.cb.call(this.scope)), + this + } + , + t.prototype.copyTo = function(t) { + return t.set(this._x, this._y), + t + } + , + t.prototype.equals = function(t) { + return t.x === this._x && t.y === this._y + } + , + t.prototype.toString = function() { + return "[@pixi/math:ObservablePoint x=0 y=0 scope=" + this.scope + "]" + } + , + Object.defineProperty(t.prototype, "x", { + get: function() { + return this._x + }, + set: function(t) { + this._x !== t && (this._x = t, + this.cb.call(this.scope)) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "y", { + get: function() { + return this._y + }, + set: function(t) { + this._y !== t && (this._y = t, + this.cb.call(this.scope)) + }, + enumerable: !1, + configurable: !0 + }), + t + }() + , la = function() { + function t(t, i, s, o, h, r) { + void 0 === t && (t = 1), + void 0 === i && (i = 0), + void 0 === s && (s = 0), + void 0 === o && (o = 1), + void 0 === h && (h = 0), + void 0 === r && (r = 0), + this.array = null, + this.a = t, + this.b = i, + this.c = s, + this.d = o, + this.tx = h, + this.ty = r + } + return t.prototype.fromArray = function(t) { + this.a = t[0], + this.b = t[1], + this.c = t[3], + this.d = t[4], + this.tx = t[2], + this.ty = t[5] + } + , + t.prototype.set = function(t, i, s, o, h, r) { + return this.a = t, + this.b = i, + this.c = s, + this.d = o, + this.tx = h, + this.ty = r, + this + } + , + t.prototype.toArray = function(t, i) { + this.array || (this.array = new Float32Array(9)); + var s = i || this.array; + return t ? (s[0] = this.a, + s[1] = this.b, + s[2] = 0, + s[3] = this.c, + s[4] = this.d, + s[5] = 0, + s[6] = this.tx, + s[7] = this.ty, + s[8] = 1) : (s[0] = this.a, + s[1] = this.c, + s[2] = this.tx, + s[3] = this.b, + s[4] = this.d, + s[5] = this.ty, + s[6] = 0, + s[7] = 0, + s[8] = 1), + s + } + , + t.prototype.apply = function(t, i) { + i = i || new ra; + var s = t.x + , o = t.y; + return i.x = this.a * s + this.c * o + this.tx, + i.y = this.b * s + this.d * o + this.ty, + i + } + , + t.prototype.applyInverse = function(t, i) { + i = i || new ra; + var s = 1 / (this.a * this.d + this.c * -this.b) + , o = t.x + , h = t.y; + return i.x = this.d * s * o + -this.c * s * h + (this.ty * this.c - this.tx * this.d) * s, + i.y = this.a * s * h + -this.b * s * o + (-this.ty * this.a + this.tx * this.b) * s, + i + } + , + t.prototype.translate = function(t, i) { + return this.tx += t, + this.ty += i, + this + } + , + t.prototype.scale = function(t, i) { + return this.a *= t, + this.d *= i, + this.c *= t, + this.b *= i, + this.tx *= t, + this.ty *= i, + this + } + , + t.prototype.rotate = function(t) { + var i = Math.cos(t) + , s = Math.sin(t) + , o = this.a + , h = this.c + , r = this.tx; + return this.a = o * i - this.b * s, + this.b = o * s + this.b * i, + this.c = h * i - this.d * s, + this.d = h * s + this.d * i, + this.tx = r * i - this.ty * s, + this.ty = r * s + this.ty * i, + this + } + , + t.prototype.append = function(t) { + var i = this.a + , s = this.b + , o = this.c + , h = this.d; + return this.a = t.a * i + t.b * o, + this.b = t.a * s + t.b * h, + this.c = t.c * i + t.d * o, + this.d = t.c * s + t.d * h, + this.tx = t.tx * i + t.ty * o + this.tx, + this.ty = t.tx * s + t.ty * h + this.ty, + this + } + , + t.prototype.setTransform = function(t, i, s, o, h, r, e, n, a) { + return this.a = Math.cos(e + a) * h, + this.b = Math.sin(e + a) * h, + this.c = -Math.sin(e - n) * r, + this.d = Math.cos(e - n) * r, + this.tx = t - (s * this.a + o * this.c), + this.ty = i - (s * this.b + o * this.d), + this + } + , + t.prototype.prepend = function(t) { + var i = this.tx; + if (1 !== t.a || 0 !== t.b || 0 !== t.c || 1 !== t.d) { + var s = this.a + , o = this.c; + this.a = s * t.a + this.b * t.c, + this.b = s * t.b + this.b * t.d, + this.c = o * t.a + this.d * t.c, + this.d = o * t.b + this.d * t.d + } + return this.tx = i * t.a + this.ty * t.c + t.tx, + this.ty = i * t.b + this.ty * t.d + t.ty, + this + } + , + t.prototype.decompose = function(t) { + var i = this.a + , s = this.b + , o = this.c + , h = this.d + , r = t.pivot + , e = -Math.atan2(-o, h) + , n = Math.atan2(s, i) + , a = Math.abs(e + n); + return a < 1e-5 || Math.abs(wb - a) < 1e-5 ? (t.rotation = n, + t.skew.x = t.skew.y = 0) : (t.rotation = 0, + t.skew.x = e, + t.skew.y = n), + t.scale.x = Math.sqrt(i * i + s * s), + t.scale.y = Math.sqrt(o * o + h * h), + t.position.x = this.tx + (r.x * i + r.y * o), + t.position.y = this.ty + (r.x * s + r.y * h), + t + } + , + t.prototype.invert = function() { + var t = this.a + , i = this.b + , s = this.c + , o = this.d + , h = this.tx + , r = t * o - i * s; + return this.a = o / r, + this.b = -i / r, + this.c = -s / r, + this.d = t / r, + this.tx = (s * this.ty - o * h) / r, + this.ty = -(t * this.ty - i * h) / r, + this + } + , + t.prototype.identity = function() { + return this.a = 1, + this.b = 0, + this.c = 0, + this.d = 1, + this.tx = 0, + this.ty = 0, + this + } + , + t.prototype.clone = function() { + var i = new t; + return i.a = this.a, + i.b = this.b, + i.c = this.c, + i.d = this.d, + i.tx = this.tx, + i.ty = this.ty, + i + } + , + t.prototype.copyTo = function(t) { + return t.a = this.a, + t.b = this.b, + t.c = this.c, + t.d = this.d, + t.tx = this.tx, + t.ty = this.ty, + t + } + , + t.prototype.copyFrom = function(t) { + return this.a = t.a, + this.b = t.b, + this.c = t.c, + this.d = t.d, + this.tx = t.tx, + this.ty = t.ty, + this + } + , + t.prototype.toString = function() { + return "[@pixi/math:Matrix a=" + this.a + " b=" + this.b + " c=" + this.c + " d=" + this.d + " tx=" + this.tx + " ty=" + this.ty + "]" + } + , + Object.defineProperty(t, "IDENTITY", { + get: function() { + return new t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "TEMP_MATRIX", { + get: function() { + return new t + }, + enumerable: !1, + configurable: !0 + }), + t + }() + , La = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1] + , Ma = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1] + , Na = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1] + , Oa = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1] + , _b = [] + , ld = [] + , yb = Math.sign; + function Yf() { + for (var t = 0; t < 16; t++) { + var i = []; + _b.push(i); + for (var s = 0; s < 16; s++) + for (var o = yb(La[t] * La[s] + Na[t] * Ma[s]), h = yb(Ma[t] * La[s] + Oa[t] * Ma[s]), r = yb(La[t] * Na[s] + Na[t] * Oa[s]), e = yb(Ma[t] * Na[s] + Oa[t] * Oa[s]), n = 0; n < 16; n++) + if (La[n] === o && Ma[n] === h && Na[n] === r && Oa[n] === e) { + i.push(n); + break + } + } + for (t = 0; t < 16; t++) { + var a = new la; + a.set(La[t], Ma[t], Na[t], Oa[t], 0, 0), + ld.push(a) + } + } + Yf(); + var ea = { + E: 0, + SE: 1, + S: 2, + SW: 3, + W: 4, + NW: 5, + N: 6, + NE: 7, + MIRROR_VERTICAL: 8, + MAIN_DIAGONAL: 10, + MIRROR_HORIZONTAL: 12, + REVERSE_DIAGONAL: 14, + uX: function(t) { + return La[t] + }, + uY: function(t) { + return Ma[t] + }, + vX: function(t) { + return Na[t] + }, + vY: function(t) { + return Oa[t] + }, + inv: function(t) { + return 8 & t ? 15 & t : 7 & -t + }, + add: function(t, i) { + return _b[t][i] + }, + sub: function(t, i) { + return _b[t][ea.inv(i)] + }, + rotate180: function(t) { + return 4 ^ t + }, + isVertical: function(t) { + return 2 == (3 & t) + }, + byDirection: function(t, i) { + return 2 * Math.abs(t) <= Math.abs(i) ? i >= 0 ? ea.S : ea.N : 2 * Math.abs(i) <= Math.abs(t) ? t > 0 ? ea.E : ea.W : i > 0 ? t > 0 ? ea.SE : ea.SW : t > 0 ? ea.NE : ea.NW + }, + matrixAppendRotationInv: function(t, i, s, o) { + void 0 === s && (s = 0), + void 0 === o && (o = 0); + var h = ld[ea.inv(i)]; + h.tx = s, + h.ty = o, + t.append(h) + } + } + , Zf = function() { + function t() { + this.worldTransform = new la, + this.localTransform = new la, + this.position = new xb(this.onChange,this,0,0), + this.scale = new xb(this.onChange,this,1,1), + this.pivot = new xb(this.onChange,this,0,0), + this.skew = new xb(this.updateSkew,this,0,0), + this._rotation = 0, + this._cx = 1, + this._sx = 0, + this._cy = 0, + this._sy = 1, + this._localID = 0, + this._currentLocalID = 0, + this._worldID = 0, + this._parentID = 0 + } + return t.prototype.onChange = function() { + this._localID++ + } + , + t.prototype.updateSkew = function() { + this._cx = Math.cos(this._rotation + this.skew.y), + this._sx = Math.sin(this._rotation + this.skew.y), + this._cy = -Math.sin(this._rotation - this.skew.x), + this._sy = Math.cos(this._rotation - this.skew.x), + this._localID++ + } + , + t.prototype.toString = function() { + return "[@pixi/math:Transform position=(" + this.position.x + ", " + this.position.y + ") rotation=" + this.rotation + " scale=(" + this.scale.x + ", " + this.scale.y + ") skew=(" + this.skew.x + ", " + this.skew.y + ") ]" + } + , + t.prototype.updateLocalTransform = function() { + var t = this.localTransform; + this._localID !== this._currentLocalID && (t.a = this._cx * this.scale.x, + t.b = this._sx * this.scale.x, + t.c = this._cy * this.scale.y, + t.d = this._sy * this.scale.y, + t.tx = this.position.x - (this.pivot.x * t.a + this.pivot.y * t.c), + t.ty = this.position.y - (this.pivot.x * t.b + this.pivot.y * t.d), + this._currentLocalID = this._localID, + this._parentID = -1) + } + , + t.prototype.updateTransform = function(t) { + var i = this.localTransform; + if (this._localID !== this._currentLocalID && (i.a = this._cx * this.scale.x, + i.b = this._sx * this.scale.x, + i.c = this._cy * this.scale.y, + i.d = this._sy * this.scale.y, + i.tx = this.position.x - (this.pivot.x * i.a + this.pivot.y * i.c), + i.ty = this.position.y - (this.pivot.x * i.b + this.pivot.y * i.d), + this._currentLocalID = this._localID, + this._parentID = -1), + this._parentID !== t._worldID) { + var s = t.worldTransform + , o = this.worldTransform; + o.a = i.a * s.a + i.b * s.c, + o.b = i.a * s.b + i.b * s.d, + o.c = i.c * s.a + i.d * s.c, + o.d = i.c * s.b + i.d * s.d, + o.tx = i.tx * s.a + i.ty * s.c + s.tx, + o.ty = i.tx * s.b + i.ty * s.d + s.ty, + this._parentID = t._worldID, + this._worldID++ + } + } + , + t.prototype.setFromMatrix = function(t) { + t.decompose(this), + this._localID++ + } + , + Object.defineProperty(t.prototype, "rotation", { + get: function() { + return this._rotation + }, + set: function(t) { + this._rotation !== t && (this._rotation = t, + this.updateSkew()) + }, + enumerable: !1, + configurable: !0 + }), + t.IDENTITY = new t, + t + }(); + aa.PREFER_ENV = Ha.any ? Aa.WEBGL : Aa.WEBGL2, + aa.STRICT_TEXTURE_CACHE = !1; + var zb = []; + function ac(t, e) { + if (!t) + return null; + var r = ""; + if ("string" == typeof t) { + var i = /\.(\w{3,4})(?:$|\?|#)/i.exec(t); + i && (r = i[1].toLowerCase()) + } + for (var o = zb.length - 1; o >= 0; --o) { + var n = zb[o]; + if (n.test && n.test(t, r)) + return new n(t,e) + } + throw new Error("Unrecognized source type to auto-detect Resource") + } + var $f = function(t, e) { + return ($f = Object.setPrototypeOf || { + __proto__: [] + }instanceof Array && function(t, e) { + t.__proto__ = e + } + || function(t, e) { + for (var r in e) + e.hasOwnProperty(r) && (t[r] = e[r]) + } + )(t, e) + }; + function ba(t, e) { + function r() { + this.constructor = t + } + $f(t, e), + t.prototype = null === e ? Object.create(e) : (r.prototype = e.prototype, + new r) + } + var Wa = function() { + function t(t, e) { + void 0 === t && (t = 0), + void 0 === e && (e = 0), + this._width = t, + this._height = e, + this.destroyed = !1, + this.internal = !1, + this.onResize = new ka("setRealSize"), + this.onUpdate = new ka("update"), + this.onError = new ka("onError") + } + return t.prototype.bind = function(t) { + this.onResize.add(t), + this.onUpdate.add(t), + this.onError.add(t), + (this._width || this._height) && this.onResize.emit(this._width, this._height) + } + , + t.prototype.unbind = function(t) { + this.onResize.remove(t), + this.onUpdate.remove(t), + this.onError.remove(t) + } + , + t.prototype.resize = function(t, e) { + t === this._width && e === this._height || (this._width = t, + this._height = e, + this.onResize.emit(t, e)) + } + , + Object.defineProperty(t.prototype, "valid", { + get: function() { + return !!this._width && !!this._height + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.update = function() { + this.destroyed || this.onUpdate.emit() + } + , + t.prototype.load = function() { + return Promise.resolve(this) + } + , + Object.defineProperty(t.prototype, "width", { + get: function() { + return this._width + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "height", { + get: function() { + return this._height + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.style = function(t, e, r) { + return !1 + } + , + t.prototype.dispose = function() {} + , + t.prototype.destroy = function() { + this.destroyed || (this.destroyed = !0, + this.dispose(), + this.onError.removeAll(), + this.onError = null, + this.onResize.removeAll(), + this.onResize = null, + this.onUpdate.removeAll(), + this.onUpdate = null) + } + , + t.test = function(t, e) { + return !1 + } + , + t + }() + , Ab = function(t) { + function e(e, r) { + var i = this + , o = r || {} + , n = o.width + , s = o.height; + if (!n || !s) + throw new Error("BufferResource width or height invalid"); + return (i = t.call(this, n, s) || this).data = e, + i + } + return ba(e, t), + e.prototype.upload = function(t, e, r) { + var i = t.gl; + return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK), + r.width === e.width && r.height === e.height ? i.texSubImage2D(e.target, 0, 0, 0, e.width, e.height, e.format, e.type, this.data) : (r.width = e.width, + r.height = e.height, + i.texImage2D(e.target, 0, r.internalFormat, e.width, e.height, 0, e.format, r.type, this.data)), + !0 + } + , + e.prototype.dispose = function() { + this.data = null + } + , + e.test = function(t) { + return t instanceof Float32Array || t instanceof Uint8Array || t instanceof Uint32Array + } + , + e + }(Wa) + , _f = { + scaleMode: Ca.NEAREST, + format: kb.RGBA, + alphaMode: Ia.NPM + } + , ia = function(t) { + function e(e, r) { + void 0 === e && (e = null), + void 0 === r && (r = null); + var i = t.call(this) || this + , o = (r = r || {}).alphaMode + , n = r.mipmap + , s = r.anisotropicLevel + , a = r.scaleMode + , u = r.width + , h = r.height + , $ = r.wrapMode + , p = r.format + , l = r.type + , c = r.target + , d = r.resolution + , f = r.resourceOptions; + return !e || e instanceof Wa || ((e = ac(e, f)).internal = !0), + i.width = u || 0, + i.height = h || 0, + i.resolution = d || aa.RESOLUTION, + i.mipmap = void 0 !== n ? n : aa.MIPMAP_TEXTURES, + i.anisotropicLevel = void 0 !== s ? s : aa.ANISOTROPIC_LEVEL, + i.wrapMode = $ || aa.WRAP_MODE, + i.scaleMode = void 0 !== a ? a : aa.SCALE_MODE, + i.format = p || kb.RGBA, + i.type = l || ua.UNSIGNED_BYTE, + i.target = c || Sa.TEXTURE_2D, + i.alphaMode = void 0 !== o ? o : Ia.UNPACK, + i.uid = ub(), + i.touched = 0, + i.isPowerOfTwo = !1, + i._refreshPOT(), + i._glTextures = {}, + i.dirtyId = 0, + i.dirtyStyleId = 0, + i.cacheId = null, + i.valid = u > 0 && h > 0, + i.textureCacheIds = [], + i.destroyed = !1, + i.resource = null, + i._batchEnabled = 0, + i._batchLocation = 0, + i.parentTextureArray = null, + i.setResource(e), + i + } + return ba(e, t), + Object.defineProperty(e.prototype, "realWidth", { + get: function() { + return Math.ceil(this.width * this.resolution - 1e-4) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "realHeight", { + get: function() { + return Math.ceil(this.height * this.resolution - 1e-4) + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.setStyle = function(t, e) { + var r; + return void 0 !== t && t !== this.scaleMode && (this.scaleMode = t, + r = !0), + void 0 !== e && e !== this.mipmap && (this.mipmap = e, + r = !0), + r && this.dirtyStyleId++, + this + } + , + e.prototype.setSize = function(t, e, r) { + return this.resolution = r || this.resolution, + this.width = t, + this.height = e, + this._refreshPOT(), + this.update(), + this + } + , + e.prototype.setRealSize = function(t, e, r) { + return this.resolution = r || this.resolution, + this.width = t / this.resolution, + this.height = e / this.resolution, + this._refreshPOT(), + this.update(), + this + } + , + e.prototype._refreshPOT = function() { + this.isPowerOfTwo = gd(this.realWidth) && gd(this.realHeight) + } + , + e.prototype.setResolution = function(t) { + var e = this.resolution; + return e === t ? this : (this.resolution = t, + this.valid && (this.width = this.width * e / t, + this.height = this.height * e / t, + this.emit("update", this)), + this._refreshPOT(), + this) + } + , + e.prototype.setResource = function(t) { + if (this.resource === t) + return this; + if (this.resource) + throw new Error("Resource can be set only once"); + return t.bind(this), + this.resource = t, + this + } + , + e.prototype.update = function() { + this.valid ? (this.dirtyId++, + this.dirtyStyleId++, + this.emit("update", this)) : this.width > 0 && this.height > 0 && (this.valid = !0, + this.emit("loaded", this), + this.emit("update", this)) + } + , + e.prototype.onError = function(t) { + this.emit("error", this, t) + } + , + e.prototype.destroy = function() { + this.resource && (this.resource.unbind(this), + this.resource.internal && this.resource.destroy(), + this.resource = null), + this.cacheId && (delete Ka[this.cacheId], + delete ya[this.cacheId], + this.cacheId = null), + this.dispose(), + e.removeFromCache(this), + this.textureCacheIds = null, + this.destroyed = !0 + } + , + e.prototype.dispose = function() { + this.emit("dispose", this) + } + , + e.prototype.castToBaseTexture = function() { + return this + } + , + e.from = function(t, r, i) { + void 0 === i && (i = aa.STRICT_TEXTURE_CACHE); + var o = "string" == typeof t + , n = null; + if (o) + n = t; + else { + if (!t._pixiId) { + var s = r && r.pixiIdPrefix || "pixiid"; + t._pixiId = s + "_" + ub() + } + n = t._pixiId + } + var a = Ka[n]; + if (o && i && !a) + throw new Error("The cacheId \"" + n + "\" does not exist in BaseTextureCache."); + return a || ((a = new e(t,r)).cacheId = n, + e.addToCache(a, n)), + a + } + , + e.fromBuffer = function(t, r, i, o) { + t = t || new Float32Array(r * i * 4); + var n = new Ab(t,{ + width: r, + height: i + }) + , s = t instanceof Float32Array ? ua.FLOAT : ua.UNSIGNED_BYTE; + return new e(n,Object.assign(_f, o || { + width: r, + height: i, + type: s + })) + } + , + e.addToCache = function(t, e) { + e && (-1 === t.textureCacheIds.indexOf(e) && t.textureCacheIds.push(e), + Ka[e] && console.warn("BaseTexture added to the cache with an id [" + e + "] that already had an entry"), + Ka[e] = t) + } + , + e.removeFromCache = function(t) { + if ("string" == typeof t) { + var e = Ka[t]; + if (e) { + var r = e.textureCacheIds.indexOf(t); + return r > -1 && e.textureCacheIds.splice(r, 1), + delete Ka[t], + e + } + } else if (t && t.textureCacheIds) { + for (var i = 0; i < t.textureCacheIds.length; ++i) + delete Ka[t.textureCacheIds[i]]; + return t.textureCacheIds.length = 0, + t + } + return null + } + , + e._globalBatch = 0, + e + }(rb.d) + , bc = function(t) { + function e(e, r) { + var i = this + , o = r || {} + , n = o.width + , s = o.height; + (i = t.call(this, n, s) || this).items = [], + i.itemDirtyIds = []; + for (var a = 0; a < e; a++) { + var u = new ia; + i.items.push(u), + i.itemDirtyIds.push(-2) + } + return i.length = e, + i._load = null, + i.baseTexture = null, + i + } + return ba(e, t), + e.prototype.initFromArray = function(t, e) { + for (var r = 0; r < this.length; r++) + t[r] && (t[r].castToBaseTexture ? this.addBaseTextureAt(t[r].castToBaseTexture(), r) : t[r]instanceof Wa ? this.addResourceAt(t[r], r) : this.addResourceAt(ac(t[r], e), r)) + } + , + e.prototype.dispose = function() { + for (var t = 0, e = this.length; t < e; t++) + this.items[t].destroy(); + this.items = null, + this.itemDirtyIds = null, + this._load = null + } + , + e.prototype.addResourceAt = function(t, e) { + if (!this.items[e]) + throw new Error("Index " + e + " is out of bounds"); + return t.valid && !this.valid && this.resize(t.width, t.height), + this.items[e].setResource(t), + this + } + , + e.prototype.bind = function(e) { + if (null !== this.baseTexture) + throw new Error("Only one base texture per TextureArray is allowed"); + t.prototype.bind.call(this, e); + for (var r = 0; r < this.length; r++) + this.items[r].parentTextureArray = e, + this.items[r].on("update", e.update, e) + } + , + e.prototype.unbind = function(e) { + t.prototype.unbind.call(this, e); + for (var r = 0; r < this.length; r++) + this.items[r].parentTextureArray = null, + this.items[r].off("update", e.update, e) + } + , + e.prototype.load = function() { + var t = this; + if (this._load) + return this._load; + var e = this.items.map(function(t) { + return t.resource + }).filter(function(t) { + return t + }).map(function(t) { + return t.load() + }); + return this._load = Promise.all(e).then(function() { + var e = t.items[0] + , r = e.realWidth + , i = e.realHeight; + return t.resize(r, i), + Promise.resolve(t) + }), + this._load + } + , + e + }(Wa) + , md = function(t) { + function e(e, r) { + var i, o, n = this, s = r || {}, a = s.width, u = s.height; + return Array.isArray(e) ? (i = e, + o = e.length) : o = e, + n = t.call(this, o, { + width: a, + height: u + }) || this, + i && n.initFromArray(i, r), + n + } + return ba(e, t), + e.prototype.addBaseTextureAt = function(t, e) { + if (!t.resource) + throw new Error("ArrayResource does not support RenderTexture"); + return this.addResourceAt(t.resource, e), + this + } + , + e.prototype.bind = function(e) { + t.prototype.bind.call(this, e), + e.target = Sa.TEXTURE_2D_ARRAY + } + , + e.prototype.upload = function(t, e, r) { + var i = this.length + , o = this.itemDirtyIds + , n = this.items + , s = t.gl; + r.dirtyId < 0 && s.texImage3D(s.TEXTURE_2D_ARRAY, 0, e.format, this._width, this._height, i, 0, e.format, e.type, null); + for (var a = 0; a < i; a++) { + var u = n[a]; + o[a] < u.dirtyId && (o[a] = u.dirtyId, + u.valid && s.texSubImage3D(s.TEXTURE_2D_ARRAY, 0, 0, 0, a, u.resource.width, u.resource.height, 1, e.format, e.type, u.resource.source)) + } + return !0 + } + , + e + }(bc) + , za = function(t) { + function e(e) { + var r = this + , i = e + , o = i.naturalWidth || i.videoWidth || i.width + , n = i.naturalHeight || i.videoHeight || i.height; + return (r = t.call(this, o, n) || this).source = e, + r.noSubImage = !1, + r + } + return ba(e, t), + e.crossOrigin = function(t, e, r) { + void 0 === r && 0 !== e.indexOf("data:") ? t.crossOrigin = Qf(e) : !1 !== r && (t.crossOrigin = "string" == typeof r ? r : "anonymous") + } + , + e.prototype.upload = function(t, e, r, i) { + var o = t.gl + , n = e.realWidth + , s = e.realHeight; + return i = i || this.source, + o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK), + this.noSubImage || e.target !== o.TEXTURE_2D || r.width !== n || r.height !== s ? (r.width = n, + r.height = s, + o.texImage2D(e.target, 0, e.format, e.format, e.type, i)) : o.texSubImage2D(o.TEXTURE_2D, 0, 0, 0, e.format, e.type, i), + !0 + } + , + e.prototype.update = function() { + if (!this.destroyed) { + var e = this.source + , r = e.naturalWidth || e.videoWidth || e.width + , i = e.naturalHeight || e.videoHeight || e.height; + this.resize(r, i), + t.prototype.update.call(this) + } + } + , + e.prototype.dispose = function() { + this.source = null + } + , + e + }(Wa) + , cc = function(t) { + function e(e) { + return t.call(this, e) || this + } + return ba(e, t), + e.test = function(t) { + var e = self.OffscreenCanvas; + return !!(e && t instanceof e) || self.HTMLCanvasElement && t instanceof HTMLCanvasElement + } + , + e + }(za) + , nd = function(t) { + function e(r, i) { + var o = this + , n = i || {} + , s = n.width + , a = n.height + , u = n.autoLoad + , h = n.linkBaseTexture; + if (r && r.length !== e.SIDES) + throw new Error("Invalid length. Got " + r.length + ", expected 6"); + o = t.call(this, 6, { + width: s, + height: a + }) || this; + for (var $ = 0; $ < e.SIDES; $++) + o.items[$].target = Sa.TEXTURE_CUBE_MAP_POSITIVE_X + $; + return o.linkBaseTexture = !1 !== h, + r && o.initFromArray(r, i), + !1 !== u && o.load(), + o + } + return ba(e, t), + e.prototype.bind = function(e) { + t.prototype.bind.call(this, e), + e.target = Sa.TEXTURE_CUBE_MAP + } + , + e.prototype.addBaseTextureAt = function(t, e, r) { + if (void 0 === r && (r = this.linkBaseTexture), + !this.items[e]) + throw new Error("Index " + e + " is out of bounds"); + if (!this.linkBaseTexture || t.parentTextureArray || Object.keys(t._glTextures).length > 0) { + if (!t.resource) + throw new Error("CubeResource does not support copying of renderTexture."); + this.addResourceAt(t.resource, e) + } else + t.target = Sa.TEXTURE_CUBE_MAP_POSITIVE_X + e, + t.parentTextureArray = this.baseTexture, + this.items[e] = t; + return t.valid && !this.valid && this.resize(t.realWidth, t.realHeight), + this.items[e] = t, + this + } + , + e.prototype.upload = function(t, r, i) { + for (var o = this.itemDirtyIds, n = 0; n < e.SIDES; n++) { + var s = this.items[n]; + o[n] < s.dirtyId && (s.valid && s.resource ? (s.resource.upload(t, s, i), + o[n] = s.dirtyId) : o[n] < -1 && (t.gl.texImage2D(s.target, 0, i.internalFormat, r.realWidth, r.realHeight, 0, r.format, i.type, null), + o[n] = -1)) + } + return !0 + } + , + e.test = function(t) { + return Array.isArray(t) && t.length === e.SIDES + } + , + e.SIDES = 6, + e + }(bc) + , dc = function(t) { + function e(e, r) { + var i = this; + if (r = r || {}, + !(e instanceof HTMLImageElement)) { + var o = new Image; + za.crossOrigin(o, e, r.crossorigin), + o.src = e, + e = o + } + return i = t.call(this, e) || this, + !e.complete && i._width && i._height && (i._width = 0, + i._height = 0), + i.url = e.src, + i._process = null, + i.preserveBitmap = !1, + i.createBitmap = (void 0 !== r.createBitmap ? r.createBitmap : aa.CREATE_IMAGE_BITMAP) && !!self.createImageBitmap, + i.alphaMode = "number" == typeof r.alphaMode ? r.alphaMode : null, + i.bitmap = null, + i._load = null, + !1 !== r.autoLoad && i.load(), + i + } + return ba(e, t), + e.prototype.load = function(t) { + var e = this; + return this._load ? this._load : (void 0 !== t && (this.createBitmap = t), + this._load = new Promise(function(t, r) { + var i = e.source; + e.url = i.src; + var o = function() { + e.destroyed || (i.onload = null, + i.onerror = null, + e.resize(i.width, i.height), + e._load = null, + e.createBitmap ? t(e.process()) : t(e)) + }; + i.complete && i.src ? o() : (i.onload = o, + i.onerror = function(t) { + r(t), + e.onError.emit(t) + } + ) + } + ), + this._load) + } + , + e.prototype.process = function() { + var t = this + , e = this.source; + return null !== this._process ? this._process : null === this.bitmap && self.createImageBitmap ? (this._process = self.createImageBitmap(e, 0, 0, e.width, e.height, { + premultiplyAlpha: this.alphaMode === Ia.UNPACK ? "premultiply" : "none" + }).then(function(e) { + return t.destroyed ? Promise.reject() : (t.bitmap = e, + t.update(), + t._process = null, + Promise.resolve(t)) + }), + this._process) : Promise.resolve(this) + } + , + e.prototype.upload = function(e, r, i) { + if ("number" == typeof this.alphaMode && (r.alphaMode = this.alphaMode), + !this.createBitmap) + return t.prototype.upload.call(this, e, r, i); + if (!this.bitmap && (this.process(), + !this.bitmap)) + return !1; + if (t.prototype.upload.call(this, e, r, i, this.bitmap), + !this.preserveBitmap) { + var o = !0 + , n = r._glTextures; + for (var s in n) { + var a = n[s]; + if (a !== i && a.dirtyId !== r.dirtyId) { + o = !1; + break + } + } + o && (this.bitmap.close && this.bitmap.close(), + this.bitmap = null) + } + return !0 + } + , + e.prototype.dispose = function() { + this.source.onload = null, + this.source.onerror = null, + t.prototype.dispose.call(this), + this.bitmap && (this.bitmap.close(), + this.bitmap = null), + this._process = null, + this._load = null + } + , + e.test = function(t) { + return "string" == typeof t || t instanceof HTMLImageElement + } + , + e + }(za) + , od = function(t) { + function e(e, r) { + var i = this; + return r = r || {}, + (i = t.call(this, document.createElement("canvas")) || this)._width = 0, + i._height = 0, + i.svg = e, + i.scale = r.scale || 1, + i._overrideWidth = r.width, + i._overrideHeight = r.height, + i._resolve = null, + i._crossorigin = r.crossorigin, + i._load = null, + !1 !== r.autoLoad && i.load(), + i + } + return ba(e, t), + e.prototype.load = function() { + var t = this; + return this._load ? this._load : (this._load = new Promise(function(e) { + if (t._resolve = function() { + t.resize(t.source.width, t.source.height), + e(t) + } + , + /^\]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i, + e + }(za) + , pd = function(t) { + function e(r, i) { + var o = this; + if (i = i || {}, + !(r instanceof HTMLVideoElement)) { + var n = document.createElement("video"); + n.setAttribute("preload", "auto"), + n.setAttribute("webkit-playsinline", ""), + n.setAttribute("playsinline", ""), + "string" == typeof r && (r = [r]); + var s = r[0].src || r[0]; + za.crossOrigin(n, s, i.crossorigin); + for (var a = 0; a < r.length; ++a) { + var u = document.createElement("source") + , h = r[a] + , $ = h.src + , p = h.mime + , l = ($ = $ || r[a]).split("?").shift().toLowerCase() + , c = l.substr(l.lastIndexOf(".") + 1); + p = p || e.MIME_TYPES[c] || "video/" + c, + u.src = $, + u.type = p, + n.appendChild(u) + } + r = n + } + return (o = t.call(this, r) || this).noSubImage = !0, + o._autoUpdate = !0, + o._isConnectedToTicker = !1, + o._updateFPS = i.updateFPS || 0, + o._msToNextUpdate = 0, + o.autoPlay = !1 !== i.autoPlay, + o._load = null, + o._resolve = null, + o._onCanPlay = o._onCanPlay.bind(o), + o._onError = o._onError.bind(o), + !1 !== i.autoLoad && o.load(), + o + } + return ba(e, t), + e.prototype.update = function(e) { + if (!this.destroyed) { + var r = Ea.shared.elapsedMS * this.source.playbackRate; + this._msToNextUpdate = Math.floor(this._msToNextUpdate - r), + (!this._updateFPS || this._msToNextUpdate <= 0) && (t.prototype.update.call(this), + this._msToNextUpdate = this._updateFPS ? Math.floor(1e3 / this._updateFPS) : 0) + } + } + , + e.prototype.load = function() { + var t = this; + if (this._load) + return this._load; + var e = this.source; + return (e.readyState === e.HAVE_ENOUGH_DATA || e.readyState === e.HAVE_FUTURE_DATA) && e.width && e.height && (e.complete = !0), + e.addEventListener("play", this._onPlayStart.bind(this)), + e.addEventListener("pause", this._onPlayStop.bind(this)), + this._isSourceReady() ? this._onCanPlay() : (e.addEventListener("canplay", this._onCanPlay), + e.addEventListener("canplaythrough", this._onCanPlay), + e.addEventListener("error", this._onError, !0)), + this._load = new Promise(function(r) { + t.valid ? r(t) : (t._resolve = r, + e.load()) + } + ), + this._load + } + , + e.prototype._onError = function(t) { + this.source.removeEventListener("error", this._onError, !0), + this.onError.emit(t) + } + , + e.prototype._isSourcePlaying = function() { + var t = this.source; + return t.currentTime > 0 && !1 === t.paused && !1 === t.ended && t.readyState > 2 + } + , + e.prototype._isSourceReady = function() { + var t = this.source; + return 3 === t.readyState || 4 === t.readyState + } + , + e.prototype._onPlayStart = function() { + this.valid || this._onCanPlay(), + this.autoUpdate && !this._isConnectedToTicker && (Ea.shared.add(this.update, this), + this._isConnectedToTicker = !0) + } + , + e.prototype._onPlayStop = function() { + this._isConnectedToTicker && (Ea.shared.remove(this.update, this), + this._isConnectedToTicker = !1) + } + , + e.prototype._onCanPlay = function() { + var t = this.source; + t.removeEventListener("canplay", this._onCanPlay), + t.removeEventListener("canplaythrough", this._onCanPlay); + var e = this.valid; + this.resize(t.videoWidth, t.videoHeight), + !e && this._resolve && (this._resolve(this), + this._resolve = null), + this._isSourcePlaying() ? this._onPlayStart() : this.autoPlay && t.play() + } + , + e.prototype.dispose = function() { + this._isConnectedToTicker && Ea.shared.remove(this.update, this); + var e = this.source; + e && (e.removeEventListener("error", this._onError, !0), + e.pause(), + e.src = "", + e.load()), + t.prototype.dispose.call(this) + } + , + Object.defineProperty(e.prototype, "autoUpdate", { + get: function() { + return this._autoUpdate + }, + set: function(t) { + t !== this._autoUpdate && (this._autoUpdate = t, + !this._autoUpdate && this._isConnectedToTicker ? (Ea.shared.remove(this.update, this), + this._isConnectedToTicker = !1) : this._autoUpdate && !this._isConnectedToTicker && this._isSourcePlaying() && (Ea.shared.add(this.update, this), + this._isConnectedToTicker = !0)) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "updateFPS", { + get: function() { + return this._updateFPS + }, + set: function(t) { + t !== this._updateFPS && (this._updateFPS = t) + }, + enumerable: !1, + configurable: !0 + }), + e.test = function(t, r) { + return self.HTMLVideoElement && t instanceof HTMLVideoElement || e.TYPES.indexOf(r) > -1 + } + , + e.TYPES = ["mp4", "m4v", "webm", "ogg", "ogv", "h264", "avi", "mov"], + e.MIME_TYPES = { + ogv: "video/ogg", + mov: "video/quicktime", + m4v: "video/mp4" + }, + e + }(za) + , qd = function(t) { + function e(e) { + return t.call(this, e) || this + } + return ba(e, t), + e.test = function(t) { + return !!self.createImageBitmap && t instanceof ImageBitmap + } + , + e + }(za); + zb.push(dc, qd, cc, pd, od, Ab, nd, md); + var rd = { + __proto__: null, + Resource: Wa, + BaseImageResource: za, + INSTALLED: zb, + autoDetectResource: ac, + AbstractMultiResource: bc, + ArrayResource: md, + BufferResource: Ab, + CanvasResource: cc, + CubeResource: nd, + ImageResource: dc, + SVGResource: od, + VideoResource: pd, + ImageBitmapResource: qd + } + , pa = function() { + function t(t) { + this.renderer = t + } + return t.prototype.destroy = function() { + this.renderer = null + } + , + t + }() + , ag = function(t) { + function e() { + return null !== t && t.apply(this, arguments) || this + } + return ba(e, t), + e.prototype.upload = function(t, e, r) { + var i = t.gl; + return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK), + r.width === e.width && r.height === e.height ? i.texSubImage2D(e.target, 0, 0, 0, e.width, e.height, e.format, e.type, this.data) : (r.width = e.width, + r.height = e.height, + i.texImage2D(e.target, 0, 1 === t.context.webGLVersion ? i.DEPTH_COMPONENT : i.DEPTH_COMPONENT16, e.width, e.height, 0, e.format, e.type, this.data)), + !0 + } + , + e + }(Ab) + , ec = function() { + function t(t, e) { + this.width = Math.ceil(t || 100), + this.height = Math.ceil(e || 100), + this.stencil = !1, + this.depth = !1, + this.dirtyId = 0, + this.dirtyFormat = 0, + this.dirtySize = 0, + this.depthTexture = null, + this.colorTextures = [], + this.glFramebuffers = {}, + this.disposeRunner = new ka("disposeFramebuffer"), + this.multisample = _a.NONE + } + return Object.defineProperty(t.prototype, "colorTexture", { + get: function() { + return this.colorTextures[0] + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.addColorTexture = function(t, e) { + return void 0 === t && (t = 0), + this.colorTextures[t] = e || new ia(null,{ + scaleMode: Ca.NEAREST, + resolution: 1, + mipmap: $a.OFF, + width: this.width, + height: this.height + }), + this.dirtyId++, + this.dirtyFormat++, + this + } + , + t.prototype.addDepthTexture = function(t) { + return this.depthTexture = t || new ia(new ag(null,{ + width: this.width, + height: this.height + }),{ + scaleMode: Ca.NEAREST, + resolution: 1, + width: this.width, + height: this.height, + mipmap: $a.OFF, + format: kb.DEPTH_COMPONENT, + type: ua.UNSIGNED_SHORT + }), + this.dirtyId++, + this.dirtyFormat++, + this + } + , + t.prototype.enableDepth = function() { + return this.depth = !0, + this.dirtyId++, + this.dirtyFormat++, + this + } + , + t.prototype.enableStencil = function() { + return this.stencil = !0, + this.dirtyId++, + this.dirtyFormat++, + this + } + , + t.prototype.resize = function(t, e) { + if (t = Math.ceil(t), + e = Math.ceil(e), + t !== this.width || e !== this.height) { + this.width = t, + this.height = e, + this.dirtyId++, + this.dirtySize++; + for (var r = 0; r < this.colorTextures.length; r++) { + var i = this.colorTextures[r] + , o = i.resolution; + i.setSize(t / o, e / o) + } + if (this.depthTexture) { + o = this.depthTexture.resolution; + this.depthTexture.setSize(t / o, e / o) + } + } + } + , + t.prototype.dispose = function() { + this.disposeRunner.emit(this, !1) + } + , + t.prototype.destroyDepthTexture = function() { + this.depthTexture && (this.depthTexture.destroy(), + this.depthTexture = null, + ++this.dirtyId, + ++this.dirtyFormat) + } + , + t + }() + , sd = function(t) { + function e(e) { + var r = this; + "number" == typeof e && (e = { + width: arguments[0], + height: arguments[1], + scaleMode: arguments[2], + resolution: arguments[3] + }); + r = t.call(this, null, e) || this; + var i = e || {} + , o = i.width + , n = i.height; + return r.mipmap = 0, + r.width = Math.ceil(o) || 100, + r.height = Math.ceil(n) || 100, + r.valid = !0, + r.clearColor = [0, 0, 0, 0], + r.framebuffer = new ec(r.width * r.resolution,r.height * r.resolution).addColorTexture(0, r), + r.maskStack = [], + r.filterStack = [{}], + r + } + return ba(e, t), + e.prototype.resize = function(t, e) { + t = Math.ceil(t), + e = Math.ceil(e), + this.framebuffer.resize(t * this.resolution, e * this.resolution) + } + , + e.prototype.dispose = function() { + this.framebuffer.dispose(), + t.prototype.dispose.call(this) + } + , + e.prototype.destroy = function() { + t.prototype.destroy.call(this), + this.framebuffer.destroyDepthTexture(), + this.framebuffer = null + } + , + e + }(ia) + , td = function() { + function t() { + this.x0 = 0, + this.y0 = 0, + this.x1 = 1, + this.y1 = 0, + this.x2 = 1, + this.y2 = 1, + this.x3 = 0, + this.y3 = 1, + this.uvsFloat32 = new Float32Array(8) + } + return t.prototype.set = function(t, e, r) { + var i = e.width + , o = e.height; + if (r) { + var n = t.width / 2 / i + , s = t.height / 2 / o + , a = t.x / i + n + , u = t.y / o + s; + r = ea.add(r, ea.NW), + this.x0 = a + n * ea.uX(r), + this.y0 = u + s * ea.uY(r), + r = ea.add(r, 2), + this.x1 = a + n * ea.uX(r), + this.y1 = u + s * ea.uY(r), + r = ea.add(r, 2), + this.x2 = a + n * ea.uX(r), + this.y2 = u + s * ea.uY(r), + r = ea.add(r, 2), + this.x3 = a + n * ea.uX(r), + this.y3 = u + s * ea.uY(r) + } else + this.x0 = t.x / i, + this.y0 = t.y / o, + this.x1 = (t.x + t.width) / i, + this.y1 = t.y / o, + this.x2 = (t.x + t.width) / i, + this.y2 = (t.y + t.height) / o, + this.x3 = t.x / i, + this.y3 = (t.y + t.height) / o; + this.uvsFloat32[0] = this.x0, + this.uvsFloat32[1] = this.y0, + this.uvsFloat32[2] = this.x1, + this.uvsFloat32[3] = this.y1, + this.uvsFloat32[4] = this.x2, + this.uvsFloat32[5] = this.y2, + this.uvsFloat32[6] = this.x3, + this.uvsFloat32[7] = this.y3 + } + , + t.prototype.toString = function() { + return "[@pixi/core:TextureUvs x0=" + this.x0 + " y0=" + this.y0 + " x1=" + this.x1 + " y1=" + this.y1 + " x2=" + this.x2 + " y2=" + this.y2 + " x3=" + this.x3 + " y3=" + this.y3 + "]" + } + , + t + }() + , ud = new td + , oa = function(t) { + function e(r, i, o, n, s, a) { + var u = t.call(this) || this; + if (u.noFrame = !1, + i || (u.noFrame = !0, + i = new da(0,0,1,1)), + r instanceof e && (r = r.baseTexture), + u.baseTexture = r, + u._frame = i, + u.trim = n, + u.valid = !1, + u._uvs = ud, + u.uvMatrix = null, + u.orig = o || i, + u._rotate = Number(s || 0), + !0 === s) + u._rotate = 2; + else if (u._rotate % 2 != 0) + throw new Error("attempt to use diamond-shaped UVs. If you are sure, set rotation manually"); + return u.defaultAnchor = a ? new ra(a.x,a.y) : new ra(0,0), + u._updateID = 0, + u.textureCacheIds = [], + r.valid ? u.noFrame ? r.valid && u.onBaseTextureUpdated(r) : u.frame = i : r.once("loaded", u.onBaseTextureUpdated, u), + u.noFrame && r.on("update", u.onBaseTextureUpdated, u), + u + } + return ba(e, t), + e.prototype.update = function() { + this.baseTexture.resource && this.baseTexture.resource.update() + } + , + e.prototype.onBaseTextureUpdated = function(t) { + if (this.noFrame) { + if (!this.baseTexture.valid) + return; + this._frame.width = t.width, + this._frame.height = t.height, + this.valid = !0, + this.updateUvs() + } else + this.frame = this._frame; + this.emit("update", this) + } + , + e.prototype.destroy = function(t) { + if (this.baseTexture) { + if (t) { + var r = this.baseTexture.resource; + r && r.url && ya[r.url] && e.removeFromCache(r.url), + this.baseTexture.destroy() + } + this.baseTexture.off("loaded", this.onBaseTextureUpdated, this), + this.baseTexture.off("update", this.onBaseTextureUpdated, this), + this.baseTexture = null + } + this._frame = null, + this._uvs = null, + this.trim = null, + this.orig = null, + this.valid = !1, + e.removeFromCache(this), + this.textureCacheIds = null + } + , + e.prototype.clone = function() { + return new e(this.baseTexture,this.frame.clone(),this.orig.clone(),this.trim && this.trim.clone(),this.rotate,this.defaultAnchor) + } + , + e.prototype.updateUvs = function() { + this._uvs === ud && (this._uvs = new td), + this._uvs.set(this._frame, this.baseTexture, this.rotate), + this._updateID++ + } + , + e.from = function(t, r, i) { + void 0 === r && (r = {}), + void 0 === i && (i = aa.STRICT_TEXTURE_CACHE); + var o = "string" == typeof t + , n = null; + if (o) + n = t; + else { + if (!t._pixiId) { + var s = r && r.pixiIdPrefix || "pixiid"; + t._pixiId = s + "_" + ub() + } + n = t._pixiId + } + var a = ya[n]; + if (o && i && !a) + throw new Error("The cacheId \"" + n + "\" does not exist in TextureCache."); + return a || (r.resolution || (r.resolution = kd(t)), + (a = new e(new ia(t,r))).baseTexture.cacheId = n, + ia.addToCache(a.baseTexture, n), + e.addToCache(a, n)), + a + } + , + e.fromURL = function(t, r) { + var i = Object.assign({ + autoLoad: !1 + }, null == r ? void 0 : r.resourceOptions) + , o = e.from(t, Object.assign({ + resourceOptions: i + }, r), !1) + , n = o.baseTexture.resource; + return o.baseTexture.valid ? Promise.resolve(o) : n.load().then(function() { + return Promise.resolve(o) + }) + } + , + e.fromBuffer = function(t, r, i, o) { + return new e(ia.fromBuffer(t, r, i, o)) + } + , + e.fromLoader = function(t, r, i, o) { + var n = new ia(t,Object.assign({ + scaleMode: aa.SCALE_MODE, + resolution: kd(r) + }, o)) + , s = n.resource; + s instanceof dc && (s.url = r); + var a = new e(n); + return i || (i = r), + ia.addToCache(a.baseTexture, i), + e.addToCache(a, i), + i !== r && (ia.addToCache(a.baseTexture, r), + e.addToCache(a, r)), + a.baseTexture.valid ? Promise.resolve(a) : new Promise(function(t) { + a.baseTexture.once("loaded", function() { + return t(a) + }) + } + ) + } + , + e.addToCache = function(t, e) { + e && (-1 === t.textureCacheIds.indexOf(e) && t.textureCacheIds.push(e), + ya[e] && console.warn("Texture added to the cache with an id [" + e + "] that already had an entry"), + ya[e] = t) + } + , + e.removeFromCache = function(t) { + if ("string" == typeof t) { + var e = ya[t]; + if (e) { + var r = e.textureCacheIds.indexOf(t); + return r > -1 && e.textureCacheIds.splice(r, 1), + delete ya[t], + e + } + } else if (t && t.textureCacheIds) { + for (var i = 0; i < t.textureCacheIds.length; ++i) + ya[t.textureCacheIds[i]] === t && delete ya[t.textureCacheIds[i]]; + return t.textureCacheIds.length = 0, + t + } + return null + } + , + Object.defineProperty(e.prototype, "resolution", { + get: function() { + return this.baseTexture.resolution + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "frame", { + get: function() { + return this._frame + }, + set: function(t) { + this._frame = t, + this.noFrame = !1; + var e = t.x + , r = t.y + , i = t.width + , o = t.height + , n = e + i > this.baseTexture.width + , s = r + o > this.baseTexture.height; + if (n || s) { + var a = n && s ? "and" : "or" + , u = "X: " + e + " + " + i + " = " + (e + i) + " > " + this.baseTexture.width + , h = "Y: " + r + " + " + o + " = " + (r + o) + " > " + this.baseTexture.height; + throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: " + u + " " + a + " " + h) + } + this.valid = i && o && this.baseTexture.valid, + this.trim || this.rotate || (this.orig = t), + this.valid && this.updateUvs() + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "rotate", { + get: function() { + return this._rotate + }, + set: function(t) { + this._rotate = t, + this.valid && this.updateUvs() + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "width", { + get: function() { + return this.orig.width + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "height", { + get: function() { + return this.orig.height + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.castToBaseTexture = function() { + return this.baseTexture + } + , + e + }(rb.d); + function bg() { + var t = document.createElement("canvas"); + t.width = 16, + t.height = 16; + var e = t.getContext("2d"); + return e.fillStyle = "white", + e.fillRect(0, 0, 16, 16), + new oa(new ia(new cc(t))) + } + function Bb(t) { + t.destroy = function() {} + , + t.on = function() {} + , + t.once = function() {} + , + t.emit = function() {} + } + oa.EMPTY = new oa(new ia()), + Bb(oa.EMPTY), + Bb(oa.EMPTY.baseTexture), + oa.WHITE = bg(), + Bb(oa.WHITE), + Bb(oa.WHITE.baseTexture); + var fc = function(t) { + function e(e, r) { + var i = t.call(this, e, r) || this; + return i.valid = !0, + i.filterFrame = null, + i.filterPoolKey = null, + i.updateUvs(), + i + } + return ba(e, t), + Object.defineProperty(e.prototype, "framebuffer", { + get: function() { + return this.baseTexture.framebuffer + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.resize = function(t, e, r) { + void 0 === r && (r = !0), + t = Math.ceil(t), + e = Math.ceil(e), + this.valid = t > 0 && e > 0, + this._frame.width = this.orig.width = t, + this._frame.height = this.orig.height = e, + r && this.baseTexture.resize(t, e), + this.updateUvs() + } + , + e.prototype.setResolution = function(t) { + var e = this.baseTexture; + e.resolution !== t && (e.setResolution(t), + this.resize(e.width, e.height, !1)) + } + , + e.create = function(t) { + for (var r = arguments, i = [], o = 1; o < arguments.length; o++) + i[o - 1] = r[o]; + return "number" == typeof t && (Va("6.0.0", "Arguments (width, height, scaleMode, resolution) have been deprecated."), + t = { + width: t, + height: i[0], + scaleMode: i[1], + resolution: i[2] + }), + new e(new sd(t)) + } + , + e + }(oa) + , cg = function() { + function t(t) { + this.texturePool = {}, + this.textureOptions = t || {}, + this.enableFullScreen = !1, + this._pixelsWidth = 0, + this._pixelsHeight = 0 + } + return t.prototype.createTexture = function(t, e) { + var r = new sd(Object.assign({ + width: t, + height: e, + resolution: 1 + }, this.textureOptions)); + return new fc(r) + } + , + t.prototype.getOptimalTexture = function(e, r, i) { + void 0 === i && (i = 1); + var o = t.SCREEN_KEY; + e *= i, + r *= i, + this.enableFullScreen && e === this._pixelsWidth && r === this._pixelsHeight || (o = (65535 & (e = sb(e))) << 16 | 65535 & (r = sb(r))), + this.texturePool[o] || (this.texturePool[o] = []); + var n = this.texturePool[o].pop(); + return n || (n = this.createTexture(e, r)), + n.filterPoolKey = o, + n.setResolution(i), + n + } + , + t.prototype.getFilterTexture = function(t, e) { + var r = this.getOptimalTexture(t.width, t.height, e || t.resolution); + return r.filterFrame = t.filterFrame, + r + } + , + t.prototype.returnTexture = function(t) { + var e = t.filterPoolKey; + t.filterFrame = null, + this.texturePool[e].push(t) + } + , + t.prototype.returnFilterTexture = function(t) { + this.returnTexture(t) + } + , + t.prototype.clear = function(t) { + if (t = !1 !== t) + for (var e in this.texturePool) { + var r = this.texturePool[e]; + if (r) + for (var i = 0; i < r.length; i++) + r[i].destroy(!0) + } + this.texturePool = {} + } + , + t.prototype.setScreenSize = function(e) { + if (e.width !== this._pixelsWidth || e.height !== this._pixelsHeight) { + var r = t.SCREEN_KEY + , i = this.texturePool[r]; + if (this.enableFullScreen = e.width > 0 && e.height > 0, + i) + for (var o = 0; o < i.length; o++) + i[o].destroy(!0); + this.texturePool[r] = [], + this._pixelsWidth = e.width, + this._pixelsHeight = e.height + } + } + , + t.SCREEN_KEY = "screen", + t + }() + , vd = function() { + function t(t, e, r, i, o, n, s) { + void 0 === e && (e = 0), + void 0 === r && (r = !1), + void 0 === i && (i = 5126), + this.buffer = t, + this.size = e, + this.normalized = r, + this.type = i, + this.stride = o, + this.start = n, + this.instance = s + } + return t.prototype.destroy = function() { + this.buffer = null + } + , + t.from = function(e, r, i, o, n) { + return new t(e,r,i,o,n) + } + , + t + }() + , dg = 0 + , ta = function() { + function t(t, e, r) { + void 0 === e && (e = !0), + void 0 === r && (r = !1), + this.data = t || new Float32Array(1), + this._glBuffers = {}, + this._updateID = 0, + this.index = r, + this.static = e, + this.id = dg++, + this.disposeRunner = new ka("disposeBuffer") + } + return t.prototype.update = function(t) { + this.data = t || this.data, + this._updateID++ + } + , + t.prototype.dispose = function() { + this.disposeRunner.emit(this, !1) + } + , + t.prototype.destroy = function() { + this.dispose(), + this.data = null + } + , + t.from = function(e) { + return e instanceof Array && (e = new Float32Array(e)), + new t(e) + } + , + t + }(); + function wd(t) { + if (4 === t.BYTES_PER_ELEMENT) + return t instanceof Float32Array ? "Float32Array" : t instanceof Uint32Array ? "Uint32Array" : "Int32Array"; + if (2 === t.BYTES_PER_ELEMENT) { + if (t instanceof Uint16Array) + return "Uint16Array" + } else if (1 === t.BYTES_PER_ELEMENT && t instanceof Uint8Array) + return "Uint8Array"; + return null + } + var eg = { + Float32Array: Float32Array, + Uint32Array: Uint32Array, + Int32Array: Int32Array, + Uint8Array: Uint8Array + }; + function fg(t, e) { + for (var r = 0, i = 0, o = {}, n = 0; n < t.length; n++) + i += e[n], + r += t[n].length; + var s = new ArrayBuffer(4 * r) + , a = null + , u = 0; + for (n = 0; n < t.length; n++) { + var h = e[n] + , $ = t[n] + , p = wd($); + o[p] || (o[p] = new eg[p](s)), + a = o[p]; + for (var l = 0; l < $.length; l++) { + a[(l / h | 0) * i + u + l % h] = $[l] + } + u += h + } + return new Float32Array(s) + } + var xd = { + 5126: 4, + 5123: 2, + 5121: 1 + } + , gg = 0 + , hg = { + Float32Array: Float32Array, + Uint32Array: Uint32Array, + Int32Array: Int32Array, + Uint8Array: Uint8Array, + Uint16Array: Uint16Array + } + , gc = function() { + function t(t, e) { + void 0 === t && (t = []), + void 0 === e && (e = {}), + this.buffers = t, + this.indexBuffer = null, + this.attributes = e, + this.glVertexArrayObjects = {}, + this.id = gg++, + this.instanced = !1, + this.instanceCount = 1, + this.disposeRunner = new ka("disposeGeometry"), + this.refCount = 0 + } + return t.prototype.addAttribute = function(t, e, r, i, o, n, s, a) { + if (void 0 === r && (r = 0), + void 0 === i && (i = !1), + void 0 === a && (a = !1), + !e) + throw new Error("You must pass a buffer when creating an attribute"); + e instanceof ta || (e instanceof Array && (e = new Float32Array(e)), + e = new ta(e)); + var u = t.split("|"); + if (u.length > 1) { + for (var h = 0; h < u.length; h++) + this.addAttribute(u[h], e, r, i, o); + return this + } + var $ = this.buffers.indexOf(e); + return -1 === $ && (this.buffers.push(e), + $ = this.buffers.length - 1), + this.attributes[t] = new vd($,r,i,o,n,s,a), + this.instanced = this.instanced || a, + this + } + , + t.prototype.getAttribute = function(t) { + return this.attributes[t] + } + , + t.prototype.getBuffer = function(t) { + return this.buffers[this.getAttribute(t).buffer] + } + , + t.prototype.addIndex = function(t) { + return t instanceof ta || (t instanceof Array && (t = new Uint16Array(t)), + t = new ta(t)), + t.index = !0, + this.indexBuffer = t, + -1 === this.buffers.indexOf(t) && this.buffers.push(t), + this + } + , + t.prototype.getIndex = function() { + return this.indexBuffer + } + , + t.prototype.interleave = function() { + if (1 === this.buffers.length || 2 === this.buffers.length && this.indexBuffer) + return this; + var t, e = [], r = [], i = new ta; + for (t in this.attributes) { + var o = this.attributes[t] + , n = this.buffers[o.buffer]; + e.push(n.data), + r.push(o.size * xd[o.type] / 4), + o.buffer = 0 + } + for (i.data = fg(e, r), + t = 0; t < this.buffers.length; t++) + this.buffers[t] !== this.indexBuffer && this.buffers[t].destroy(); + return this.buffers = [i], + this.indexBuffer && this.buffers.push(this.indexBuffer), + this + } + , + t.prototype.getSize = function() { + for (var t in this.attributes) { + var e = this.attributes[t]; + return this.buffers[e.buffer].data.length / (e.stride / 4 || e.size) + } + return 0 + } + , + t.prototype.dispose = function() { + this.disposeRunner.emit(this, !1) + } + , + t.prototype.destroy = function() { + this.dispose(), + this.buffers = null, + this.indexBuffer = null, + this.attributes = null + } + , + t.prototype.clone = function() { + for (var e = new t, r = 0; r < this.buffers.length; r++) + e.buffers[r] = new ta(this.buffers[r].data.slice(0)); + for (var r in this.attributes) { + var i = this.attributes[r]; + e.attributes[r] = new vd(i.buffer,i.size,i.normalized,i.type,i.stride,i.start,i.instance) + } + return this.indexBuffer && (e.indexBuffer = e.buffers[this.buffers.indexOf(this.indexBuffer)], + e.indexBuffer.index = !0), + e + } + , + t.merge = function(e) { + for (var r, i = new t, o = [], n = [], s = [], a = 0; a < e.length; a++) { + r = e[a]; + for (var u = 0; u < r.buffers.length; u++) + n[u] = n[u] || 0, + n[u] += r.buffers[u].data.length, + s[u] = 0 + } + for (a = 0; a < r.buffers.length; a++) + o[a] = new hg[wd(r.buffers[a].data)](n[a]), + i.buffers[a] = new ta(o[a]); + for (a = 0; a < e.length; a++) { + r = e[a]; + for (u = 0; u < r.buffers.length; u++) + o[u].set(r.buffers[u].data, s[u]), + s[u] += r.buffers[u].data.length + } + if (i.attributes = r.attributes, + r.indexBuffer) { + i.indexBuffer = i.buffers[r.buffers.indexOf(r.indexBuffer)], + i.indexBuffer.index = !0; + var h = 0 + , $ = 0 + , p = 0 + , l = 0; + for (a = 0; a < r.buffers.length; a++) + if (r.buffers[a] !== r.indexBuffer) { + l = a; + break + } + for (var a in r.attributes) { + var c = r.attributes[a]; + (0 | c.buffer) === l && ($ += c.size * xd[c.type] / 4) + } + for (a = 0; a < e.length; a++) { + var d = e[a].indexBuffer.data; + for (u = 0; u < d.length; u++) + i.indexBuffer.data[u + p] += h; + h += r.buffers[l].data.length / $, + p += d.length + } + } + return i + } + , + t + }() + , ig = function(t) { + function e() { + var e = t.call(this) || this; + return e.addAttribute("aVertexPosition", new Float32Array([0, 0, 1, 0, 1, 1, 0, 1])).addIndex([0, 1, 3, 2]), + e + } + return ba(e, t), + e + }(gc) + , jg = function(t) { + function e() { + var e = t.call(this) || this; + return e.vertices = new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]), + e.uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]), + e.vertexBuffer = new ta(e.vertices), + e.uvBuffer = new ta(e.uvs), + e.addAttribute("aVertexPosition", e.vertexBuffer).addAttribute("aTextureCoord", e.uvBuffer).addIndex([0, 1, 2, 0, 2, 3]), + e + } + return ba(e, t), + e.prototype.map = function(t, e) { + var r = 0 + , i = 0; + return this.uvs[0] = r, + this.uvs[1] = i, + this.uvs[2] = r + e.width / t.width, + this.uvs[3] = i, + this.uvs[4] = r + e.width / t.width, + this.uvs[5] = i + e.height / t.height, + this.uvs[6] = r, + this.uvs[7] = i + e.height / t.height, + r = e.x, + i = e.y, + this.vertices[0] = r, + this.vertices[1] = i, + this.vertices[2] = r + e.width, + this.vertices[3] = i, + this.vertices[4] = r + e.width, + this.vertices[5] = i + e.height, + this.vertices[6] = r, + this.vertices[7] = i + e.height, + this.invalidate(), + this + } + , + e.prototype.invalidate = function() { + return this.vertexBuffer._updateID++, + this.uvBuffer._updateID++, + this + } + , + e + }(gc) + , kg = 0 + , Pa = function() { + function t(t, e) { + this.uniforms = t, + this.group = !0, + this.syncUniforms = {}, + this.dirtyId = 0, + this.id = kg++, + this.static = !!e + } + return t.prototype.update = function() { + this.dirtyId++ + } + , + t.prototype.add = function(e, r, i) { + this.uniforms[e] = new t(r,i) + } + , + t.from = function(e, r) { + return new t(e,r) + } + , + t + }() + , lg = function() { + function t() { + this.renderTexture = null, + this.target = null, + this.legacy = !1, + this.resolution = 1, + this.sourceFrame = new da, + this.destinationFrame = new da, + this.bindingSourceFrame = new da, + this.bindingDestinationFrame = new da, + this.filters = [], + this.transform = null + } + return t.prototype.clear = function() { + this.target = null, + this.filters = null, + this.renderTexture = null + } + , + t + }() + , Cb = [new ra, new ra, new ra, new ra] + , hc = new la + , yd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.defaultFilterStack = [{}], + r.texturePool = new cg, + r.texturePool.setScreenSize(e.view), + r.statePool = [], + r.quad = new ig, + r.quadUv = new jg, + r.tempRect = new da, + r.activeState = {}, + r.globalUniforms = new Pa({ + outputFrame: new da, + inputSize: new Float32Array(4), + inputPixel: new Float32Array(4), + inputClamp: new Float32Array(4), + resolution: 1, + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4) + },!0), + r.forceClear = !1, + r.useMaxPadding = !1, + r + } + return ba(e, t), + e.prototype.push = function(t, e) { + for (var r = this.renderer, i = this.defaultFilterStack, o = this.statePool.pop() || new lg, n = this.renderer.renderTexture, s = e[0].resolution, a = e[0].padding, u = e[0].autoFit, h = e[0].legacy, $ = 1; $ < e.length; $++) { + var p = e[$]; + s = Math.min(s, p.resolution), + a = this.useMaxPadding ? Math.max(a, p.padding) : a + p.padding, + u = u && p.autoFit, + h = h || p.legacy + } + if (1 === i.length && (this.defaultFilterStack[0].renderTexture = n.current), + i.push(o), + o.resolution = s, + o.legacy = h, + o.target = t, + o.sourceFrame.copyFrom(t.filterArea || t.getBounds(!0)), + o.sourceFrame.pad(a), + u) { + var l = this.tempRect.copyFrom(n.sourceFrame); + r.projection.transform && this.transformAABB(hc.copyFrom(r.projection.transform).invert(), l), + o.sourceFrame.fit(l) + } + this.roundFrame(o.sourceFrame, n.current ? n.current.resolution : r.resolution, n.sourceFrame, n.destinationFrame, r.projection.transform), + o.renderTexture = this.getOptimalFilterTexture(o.sourceFrame.width, o.sourceFrame.height, s), + o.filters = e, + o.destinationFrame.width = o.renderTexture.width, + o.destinationFrame.height = o.renderTexture.height; + var c = this.tempRect; + c.x = 0, + c.y = 0, + c.width = o.sourceFrame.width, + c.height = o.sourceFrame.height, + o.renderTexture.filterFrame = o.sourceFrame, + o.bindingSourceFrame.copyFrom(n.sourceFrame), + o.bindingDestinationFrame.copyFrom(n.destinationFrame), + o.transform = r.projection.transform, + r.projection.transform = null, + n.bind(o.renderTexture, o.sourceFrame, c), + r.framebuffer.clear(0, 0, 0, 0) + } + , + e.prototype.pop = function() { + var t = this.defaultFilterStack + , e = t.pop() + , r = e.filters; + this.activeState = e; + var i = this.globalUniforms.uniforms; + i.outputFrame = e.sourceFrame, + i.resolution = e.resolution; + var o = i.inputSize + , n = i.inputPixel + , s = i.inputClamp; + if (o[0] = e.destinationFrame.width, + o[1] = e.destinationFrame.height, + o[2] = 1 / o[0], + o[3] = 1 / o[1], + n[0] = o[0] * e.resolution, + n[1] = o[1] * e.resolution, + n[2] = 1 / n[0], + n[3] = 1 / n[1], + s[0] = .5 * n[2], + s[1] = .5 * n[3], + s[2] = e.sourceFrame.width * o[2] - .5 * n[2], + s[3] = e.sourceFrame.height * o[3] - .5 * n[3], + e.legacy) { + var a = i.filterArea; + a[0] = e.destinationFrame.width, + a[1] = e.destinationFrame.height, + a[2] = e.sourceFrame.x, + a[3] = e.sourceFrame.y, + i.filterClamp = i.inputClamp + } + this.globalUniforms.update(); + var u = t[t.length - 1]; + if (e.renderTexture.framebuffer.multisample > 1 && this.renderer.framebuffer.blit(), + 1 === r.length) + r[0].apply(this, e.renderTexture, u.renderTexture, Ja.BLEND, e), + this.returnFilterTexture(e.renderTexture); + else { + var h = e.renderTexture + , $ = this.getOptimalFilterTexture(h.width, h.height, e.resolution); + $.filterFrame = h.filterFrame; + var p = 0; + for (p = 0; p < r.length - 1; ++p) { + r[p].apply(this, h, $, Ja.CLEAR, e); + var l = h; + h = $, + $ = l + } + r[p].apply(this, h, u.renderTexture, Ja.BLEND, e), + this.returnFilterTexture(h), + this.returnFilterTexture($) + } + e.clear(), + this.statePool.push(e) + } + , + e.prototype.bindAndClear = function(t, e) { + void 0 === e && (e = Ja.CLEAR); + var r = this.renderer + , i = r.renderTexture + , o = r.state; + if (t === this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture ? this.renderer.projection.transform = this.activeState.transform : this.renderer.projection.transform = null, + t && t.filterFrame) { + var n = this.tempRect; + n.x = 0, + n.y = 0, + n.width = t.filterFrame.width, + n.height = t.filterFrame.height, + i.bind(t, t.filterFrame, n) + } else + t !== this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture ? i.bind(t) : this.renderer.renderTexture.bind(t, this.activeState.bindingSourceFrame, this.activeState.bindingDestinationFrame); + var s = 1 & o.stateId || this.forceClear; + (e === Ja.CLEAR || e === Ja.BLIT && s) && this.renderer.framebuffer.clear(0, 0, 0, 0) + } + , + e.prototype.applyFilter = function(t, e, r, i) { + var o = this.renderer; + o.state.set(t.state), + this.bindAndClear(r, i), + t.uniforms.uSampler = e, + t.uniforms.filterGlobals = this.globalUniforms, + o.shader.bind(t), + t.legacy ? (this.quadUv.map(e._frame, e.filterFrame), + o.geometry.bind(this.quadUv), + o.geometry.draw(Ba.TRIANGLES)) : (o.geometry.bind(this.quad), + o.geometry.draw(Ba.TRIANGLE_STRIP)) + } + , + e.prototype.calculateSpriteMatrix = function(t, e) { + var r = this.activeState + , i = r.sourceFrame + , o = r.destinationFrame + , n = e._texture.orig + , s = t.set(o.width, 0, 0, o.height, i.x, i.y) + , a = e.worldTransform.copyTo(la.TEMP_MATRIX); + return a.invert(), + s.prepend(a), + s.scale(1 / n.width, 1 / n.height), + s.translate(e.anchor.x, e.anchor.y), + s + } + , + e.prototype.destroy = function() { + this.texturePool.clear(!1) + } + , + e.prototype.getOptimalFilterTexture = function(t, e, r) { + return void 0 === r && (r = 1), + this.texturePool.getOptimalTexture(t, e, r) + } + , + e.prototype.getFilterTexture = function(t, e) { + if ("number" == typeof t) { + var r = t; + t = e, + e = r + } + t = t || this.activeState.renderTexture; + var i = this.texturePool.getOptimalTexture(t.width, t.height, e || t.resolution); + return i.filterFrame = t.filterFrame, + i + } + , + e.prototype.returnFilterTexture = function(t) { + this.texturePool.returnTexture(t) + } + , + e.prototype.emptyPool = function() { + this.texturePool.clear(!0) + } + , + e.prototype.resize = function() { + this.texturePool.setScreenSize(this.renderer.view) + } + , + e.prototype.transformAABB = function(t, e) { + var r = Cb[0] + , i = Cb[1] + , o = Cb[2] + , n = Cb[3]; + r.set(e.left, e.top), + i.set(e.left, e.bottom), + o.set(e.right, e.top), + n.set(e.right, e.bottom), + t.apply(r, r), + t.apply(i, i), + t.apply(o, o), + t.apply(n, n); + var s = Math.min(r.x, i.x, o.x, n.x) + , a = Math.min(r.y, i.y, o.y, n.y) + , u = Math.max(r.x, i.x, o.x, n.x) + , h = Math.max(r.y, i.y, o.y, n.y); + e.x = s, + e.y = a, + e.width = u - s, + e.height = h - a + } + , + e.prototype.roundFrame = function(t, e, r, i, o) { + if (o) { + var n = o.a + , s = o.b + , a = o.c + , u = o.d; + if (!(0 === s && 0 === a || 0 === n && 0 === u)) + return + } + (o = o ? hc.copyFrom(o) : hc.identity()).translate(-r.x, -r.y).scale(i.width / r.width, i.height / r.height).translate(i.x, i.y), + this.transformAABB(o, t), + t.ceil(e), + this.transformAABB(o.invert(), t) + } + , + e + }(pa) + , zd = function() { + function t(t) { + this.renderer = t + } + return t.prototype.flush = function() {} + , + t.prototype.destroy = function() { + this.renderer = null + } + , + t.prototype.start = function() {} + , + t.prototype.stop = function() { + this.flush() + } + , + t.prototype.render = function(t) {} + , + t + }() + , Ad = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.emptyRenderer = new zd(e), + r.currentRenderer = r.emptyRenderer, + r + } + return ba(e, t), + e.prototype.setObjectRenderer = function(t) { + this.currentRenderer !== t && (this.currentRenderer.stop(), + this.currentRenderer = t, + this.currentRenderer.start()) + } + , + e.prototype.flush = function() { + this.setObjectRenderer(this.emptyRenderer) + } + , + e.prototype.reset = function() { + this.setObjectRenderer(this.emptyRenderer) + } + , + e.prototype.copyBoundTextures = function(t, e) { + for (var r = this.renderer.texture.boundTextures, i = e - 1; i >= 0; --i) + t[i] = r[i] || null, + t[i] && (t[i]._batchLocation = i) + } + , + e.prototype.boundArray = function(t, e, r, i) { + for (var o = t.elements, n = t.ids, s = t.count, a = 0, u = 0; u < s; u++) { + var h = o[u] + , $ = h._batchLocation; + if ($ >= 0 && $ < i && e[$] === h) + n[u] = $; + else + for (; a < i; ) { + var p = e[a]; + if (!p || p._batchEnabled !== r || p._batchLocation !== a) { + n[u] = a, + h._batchLocation = a, + e[a] = h; + break + } + a++ + } + } + } + , + e + }(pa) + , Bd = 0 + , Cd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.webGLVersion = 1, + r.extensions = {}, + r.supports = { + uint32Indices: !1 + }, + r.handleContextLost = r.handleContextLost.bind(r), + r.handleContextRestored = r.handleContextRestored.bind(r), + e.view.addEventListener("webglcontextlost", r.handleContextLost, !1), + e.view.addEventListener("webglcontextrestored", r.handleContextRestored, !1), + r + } + return ba(e, t), + Object.defineProperty(e.prototype, "isLost", { + get: function() { + return !this.gl || this.gl.isContextLost() + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.contextChange = function(t) { + this.gl = t, + this.renderer.gl = t, + this.renderer.CONTEXT_UID = Bd++, + t.isContextLost() && t.getExtension("WEBGL_lose_context") && t.getExtension("WEBGL_lose_context").restoreContext() + } + , + e.prototype.initFromContext = function(t) { + this.gl = t, + this.validateContext(t), + this.renderer.gl = t, + this.renderer.CONTEXT_UID = Bd++, + this.renderer.runners.contextChange.emit(t) + } + , + e.prototype.initFromOptions = function(t) { + var e = this.createContext(this.renderer.view, t); + this.initFromContext(e) + } + , + e.prototype.createContext = function(t, e) { + var r; + if (aa.PREFER_ENV >= Aa.WEBGL2 && (r = t.getContext("webgl2", e)), + r) + this.webGLVersion = 2; + else if (this.webGLVersion = 1, + !(r = t.getContext("webgl", e) || t.getContext("experimental-webgl", e))) + throw new Error("This browser does not support WebGL. Try using the canvas renderer"); + return this.gl = r, + this.getExtensions(), + this.gl + } + , + e.prototype.getExtensions = function() { + var t = this.gl + , e = { + anisotropicFiltering: t.getExtension("EXT_texture_filter_anisotropic"), + floatTextureLinear: t.getExtension("OES_texture_float_linear"), + s3tc: t.getExtension("WEBGL_compressed_texture_s3tc"), + s3tc_sRGB: t.getExtension("WEBGL_compressed_texture_s3tc_srgb"), + etc: t.getExtension("WEBGL_compressed_texture_etc"), + etc1: t.getExtension("WEBGL_compressed_texture_etc1"), + pvrtc: t.getExtension("WEBGL_compressed_texture_pvrtc") || t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"), + atc: t.getExtension("WEBGL_compressed_texture_atc"), + astc: t.getExtension("WEBGL_compressed_texture_astc") + }; + 1 === this.webGLVersion ? Object.assign(this.extensions, e, { + drawBuffers: t.getExtension("WEBGL_draw_buffers"), + depthTexture: t.getExtension("WEBGL_depth_texture"), + loseContext: t.getExtension("WEBGL_lose_context"), + vertexArrayObject: t.getExtension("OES_vertex_array_object") || t.getExtension("MOZ_OES_vertex_array_object") || t.getExtension("WEBKIT_OES_vertex_array_object"), + uint32ElementIndex: t.getExtension("OES_element_index_uint"), + floatTexture: t.getExtension("OES_texture_float"), + floatTextureLinear: t.getExtension("OES_texture_float_linear"), + textureHalfFloat: t.getExtension("OES_texture_half_float"), + textureHalfFloatLinear: t.getExtension("OES_texture_half_float_linear") + }) : 2 === this.webGLVersion && Object.assign(this.extensions, e, { + colorBufferFloat: t.getExtension("EXT_color_buffer_float") + }) + } + , + e.prototype.handleContextLost = function(t) { + t.preventDefault() + } + , + e.prototype.handleContextRestored = function() { + this.renderer.runners.contextChange.emit(this.gl) + } + , + e.prototype.destroy = function() { + var t = this.renderer.view; + t.removeEventListener("webglcontextlost", this.handleContextLost), + t.removeEventListener("webglcontextrestored", this.handleContextRestored), + this.gl.useProgram(null), + this.extensions.loseContext && this.extensions.loseContext.loseContext() + } + , + e.prototype.postrender = function() { + this.renderer.renderingToScreen && this.gl.flush() + } + , + e.prototype.validateContext = function(t) { + var e = t.getContextAttributes() + , r = "WebGL2RenderingContext"in self && t instanceof self.WebGL2RenderingContext; + r && (this.webGLVersion = 2), + e.stencil || console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly"); + var i = r || !!t.getExtension("OES_element_index_uint"); + this.supports.uint32Indices = i, + i || console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly") + } + , + e + }(pa) + , mg = function() { + return function(t) { + this.framebuffer = t, + this.stencil = null, + this.dirtyId = 0, + this.dirtyFormat = 0, + this.dirtySize = 0, + this.multisample = _a.NONE, + this.msaaBuffer = null, + this.blitFramebuffer = null + } + }() + , ng = new da + , Dd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.managedFramebuffers = [], + r.unknownFramebuffer = new ec(10,10), + r.msaaSamples = null, + r + } + return ba(e, t), + e.prototype.contextChange = function() { + var t = this.gl = this.renderer.gl; + if (this.CONTEXT_UID = this.renderer.CONTEXT_UID, + this.current = this.unknownFramebuffer, + this.viewport = new da, + this.hasMRT = !0, + this.writeDepthTexture = !0, + this.disposeAll(!0), + 1 === this.renderer.context.webGLVersion) { + var e = this.renderer.context.extensions.drawBuffers + , r = this.renderer.context.extensions.depthTexture; + aa.PREFER_ENV === Aa.WEBGL_LEGACY && (e = null, + r = null), + e ? t.drawBuffers = function(t) { + return e.drawBuffersWEBGL(t) + } + : (this.hasMRT = !1, + t.drawBuffers = function() {} + ), + r || (this.writeDepthTexture = !1) + } else + this.msaaSamples = t.getInternalformatParameter(t.RENDERBUFFER, t.RGBA8, t.SAMPLES) + } + , + e.prototype.bind = function(t, e) { + var r = this.gl; + if (t) { + var i = t.glFramebuffers[this.CONTEXT_UID] || this.initFramebuffer(t); + this.current !== t && (this.current = t, + r.bindFramebuffer(r.FRAMEBUFFER, i.framebuffer)), + i.dirtyId !== t.dirtyId && (i.dirtyId = t.dirtyId, + i.dirtyFormat !== t.dirtyFormat ? (i.dirtyFormat = t.dirtyFormat, + this.updateFramebuffer(t)) : i.dirtySize !== t.dirtySize && (i.dirtySize = t.dirtySize, + this.resizeFramebuffer(t))); + for (var o = 0; o < t.colorTextures.length; o++) { + var n = t.colorTextures[o]; + this.renderer.texture.unbind(n.parentTextureArray || n) + } + t.depthTexture && this.renderer.texture.unbind(t.depthTexture), + e ? this.setViewport(e.x, e.y, e.width, e.height) : this.setViewport(0, 0, t.width, t.height) + } else + this.current && (this.current = null, + r.bindFramebuffer(r.FRAMEBUFFER, null)), + e ? this.setViewport(e.x, e.y, e.width, e.height) : this.setViewport(0, 0, this.renderer.width, this.renderer.height) + } + , + e.prototype.setViewport = function(t, e, r, i) { + var o = this.viewport; + o.width === r && o.height === i && o.x === t && o.y === e || (o.x = t, + o.y = e, + o.width = r, + o.height = i, + this.gl.viewport(t, e, r, i)) + } + , + Object.defineProperty(e.prototype, "size", { + get: function() { + return this.current ? { + x: 0, + y: 0, + width: this.current.width, + height: this.current.height + } : { + x: 0, + y: 0, + width: this.renderer.width, + height: this.renderer.height + } + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.clear = function(t, e, r, i, o) { + void 0 === o && (o = Qb.COLOR | Qb.DEPTH); + var n = this.gl; + n.clearColor(t, e, r, i), + n.clear(o) + } + , + e.prototype.initFramebuffer = function(t) { + var e = this.gl + , r = new mg(e.createFramebuffer()); + return r.multisample = this.detectSamples(t.multisample), + t.glFramebuffers[this.CONTEXT_UID] = r, + this.managedFramebuffers.push(t), + t.disposeRunner.add(this), + r + } + , + e.prototype.resizeFramebuffer = function(t) { + var e = this.gl + , r = t.glFramebuffers[this.CONTEXT_UID]; + r.stencil && (e.bindRenderbuffer(e.RENDERBUFFER, r.stencil), + e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_STENCIL, t.width, t.height)); + for (var i = t.colorTextures, o = 0; o < i.length; o++) + this.renderer.texture.bind(i[o], 0); + t.depthTexture && this.renderer.texture.bind(t.depthTexture, 0) + } + , + e.prototype.updateFramebuffer = function(t) { + var e = this.gl + , r = t.glFramebuffers[this.CONTEXT_UID] + , i = t.colorTextures.length; + e.drawBuffers || (i = Math.min(i, 1)), + r.multisample > 1 && (r.msaaBuffer = e.createRenderbuffer(), + e.bindRenderbuffer(e.RENDERBUFFER, r.msaaBuffer), + e.renderbufferStorageMultisample(e.RENDERBUFFER, r.multisample, e.RGBA8, t.width, t.height), + e.framebufferRenderbuffer(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.RENDERBUFFER, r.msaaBuffer)); + for (var o = [], n = 0; n < i; n++) + if (!(0 === n && r.multisample > 1)) { + var s = t.colorTextures[n] + , a = s.parentTextureArray || s; + this.renderer.texture.bind(a, 0), + e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0 + n, s.target, a._glTextures[this.CONTEXT_UID].texture, 0), + o.push(e.COLOR_ATTACHMENT0 + n) + } + if ((o.length > 1 && e.drawBuffers(o), + t.depthTexture) && this.writeDepthTexture) { + var u = t.depthTexture; + this.renderer.texture.bind(u, 0), + e.framebufferTexture2D(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.TEXTURE_2D, u._glTextures[this.CONTEXT_UID].texture, 0) + } + r.stencil || !t.stencil && !t.depth || (r.stencil = e.createRenderbuffer(), + e.bindRenderbuffer(e.RENDERBUFFER, r.stencil), + e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_STENCIL, t.width, t.height), + t.depthTexture || e.framebufferRenderbuffer(e.FRAMEBUFFER, e.DEPTH_STENCIL_ATTACHMENT, e.RENDERBUFFER, r.stencil)) + } + , + e.prototype.detectSamples = function(t) { + var e = this.msaaSamples + , r = _a.NONE; + if (t <= 1 || null === e) + return r; + for (var i = 0; i < e.length; i++) + if (e[i] <= t) { + r = e[i]; + break + } + return 1 === r && (r = _a.NONE), + r + } + , + e.prototype.blit = function(t, e, r) { + var i = this.current + , o = this.renderer + , n = this.gl + , s = this.CONTEXT_UID; + if (2 === o.context.webGLVersion && i) { + var a = i.glFramebuffers[s]; + if (a) { + if (!t) { + if (a.multisample <= 1) + return; + a.blitFramebuffer || (a.blitFramebuffer = new ec(i.width,i.height), + a.blitFramebuffer.addColorTexture(0, i.colorTextures[0])), + (t = a.blitFramebuffer).width = i.width, + t.height = i.height + } + e || ((e = ng).width = i.width, + e.height = i.height), + r || (r = e); + var u = e.width === r.width && e.height === r.height; + this.bind(t), + n.bindFramebuffer(n.READ_FRAMEBUFFER, a.framebuffer), + n.blitFramebuffer(e.x, e.y, e.width, e.height, r.x, r.y, r.width, r.height, n.COLOR_BUFFER_BIT, u ? n.NEAREST : n.LINEAR) + } + } + } + , + e.prototype.disposeFramebuffer = function(t, e) { + var r = t.glFramebuffers[this.CONTEXT_UID] + , i = this.gl; + if (r) { + delete t.glFramebuffers[this.CONTEXT_UID]; + var o = this.managedFramebuffers.indexOf(t); + o >= 0 && this.managedFramebuffers.splice(o, 1), + t.disposeRunner.remove(this), + e || (i.deleteFramebuffer(r.framebuffer), + r.stencil && i.deleteRenderbuffer(r.stencil)) + } + } + , + e.prototype.disposeAll = function(t) { + var e = this.managedFramebuffers; + this.managedFramebuffers = []; + for (var r = 0; r < e.length; r++) + this.disposeFramebuffer(e[r], t) + } + , + e.prototype.forceStencil = function() { + var t = this.current; + if (t) { + var e = t.glFramebuffers[this.CONTEXT_UID]; + if (e && !e.stencil) { + t.enableStencil(); + var r = t.width + , i = t.height + , o = this.gl + , n = o.createRenderbuffer(); + o.bindRenderbuffer(o.RENDERBUFFER, n), + o.renderbufferStorage(o.RENDERBUFFER, o.DEPTH_STENCIL, r, i), + e.stencil = n, + o.framebufferRenderbuffer(o.FRAMEBUFFER, o.DEPTH_STENCIL_ATTACHMENT, o.RENDERBUFFER, n) + } + } + } + , + e.prototype.reset = function() { + this.current = this.unknownFramebuffer, + this.viewport = new da + } + , + e + }(pa) + , og = function() { + return function(t) { + this.buffer = t || null, + this.updateID = -1, + this.byteLength = -1, + this.refCount = 0 + } + }() + , ic = { + 5126: 4, + 5123: 2, + 5121: 1 + } + , Ed = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r._activeGeometry = null, + r._activeVao = null, + r.hasVao = !0, + r.hasInstance = !0, + r.canUseUInt32ElementIndex = !1, + r.managedGeometries = {}, + r.managedBuffers = {}, + r + } + return ba(e, t), + e.prototype.contextChange = function() { + this.disposeAll(!0); + var t = this.gl = this.renderer.gl + , e = this.renderer.context; + if (this.CONTEXT_UID = this.renderer.CONTEXT_UID, + 2 !== e.webGLVersion) { + var r = this.renderer.context.extensions.vertexArrayObject; + aa.PREFER_ENV === Aa.WEBGL_LEGACY && (r = null), + r ? (t.createVertexArray = function() { + return r.createVertexArrayOES() + } + , + t.bindVertexArray = function(t) { + return r.bindVertexArrayOES(t) + } + , + t.deleteVertexArray = function(t) { + return r.deleteVertexArrayOES(t) + } + ) : (this.hasVao = !1, + t.createVertexArray = function() { + return null + } + , + t.bindVertexArray = function() { + return null + } + , + t.deleteVertexArray = function() { + return null + } + ) + } + if (2 !== e.webGLVersion) { + var i = t.getExtension("ANGLE_instanced_arrays"); + i ? (t.vertexAttribDivisor = function(t, e) { + return i.vertexAttribDivisorANGLE(t, e) + } + , + t.drawElementsInstanced = function(t, e, r, o, n) { + return i.drawElementsInstancedANGLE(t, e, r, o, n) + } + , + t.drawArraysInstanced = function(t, e, r, o) { + return i.drawArraysInstancedANGLE(t, e, r, o) + } + ) : this.hasInstance = !1 + } + this.canUseUInt32ElementIndex = 2 === e.webGLVersion || !!e.extensions.uint32ElementIndex + } + , + e.prototype.bind = function(t, e) { + e = e || this.renderer.shader.shader; + var r = this.gl + , i = t.glVertexArrayObjects[this.CONTEXT_UID] + , o = !1; + i || (this.managedGeometries[t.id] = t, + t.disposeRunner.add(this), + t.glVertexArrayObjects[this.CONTEXT_UID] = i = {}, + o = !0); + var n = i[e.program.id] || this.initGeometryVao(t, e.program, o); + this._activeGeometry = t, + this._activeVao !== n && (this._activeVao = n, + this.hasVao ? r.bindVertexArray(n) : this.activateVao(t, e.program)), + this.updateBuffers() + } + , + e.prototype.reset = function() { + this.unbind() + } + , + e.prototype.updateBuffers = function() { + for (var t = this._activeGeometry, e = this.gl, r = 0; r < t.buffers.length; r++) { + var i = t.buffers[r] + , o = i._glBuffers[this.CONTEXT_UID]; + if (i._updateID !== o.updateID) { + o.updateID = i._updateID; + var n = i.index ? e.ELEMENT_ARRAY_BUFFER : e.ARRAY_BUFFER; + if (e.bindBuffer(n, o.buffer), + this._boundBuffer = o, + o.byteLength >= i.data.byteLength) + e.bufferSubData(n, 0, i.data); + else { + var s = i.static ? e.STATIC_DRAW : e.DYNAMIC_DRAW; + o.byteLength = i.data.byteLength, + e.bufferData(n, i.data, s) + } + } + } + } + , + e.prototype.checkCompatibility = function(t, e) { + var r = t.attributes + , i = e.attributeData; + for (var o in i) + if (!r[o]) + throw new Error("shader and geometry incompatible, geometry missing the \"" + o + "\" attribute") + } + , + e.prototype.getSignature = function(t, e) { + var r = t.attributes + , i = e.attributeData + , o = ["g", t.id]; + for (var n in r) + i[n] && o.push(n); + return o.join("-") + } + , + e.prototype.initGeometryVao = function(t, e, r) { + void 0 === r && (r = !0), + this.checkCompatibility(t, e); + var i = this.gl + , o = this.CONTEXT_UID + , n = this.getSignature(t, e) + , s = t.glVertexArrayObjects[this.CONTEXT_UID] + , a = s[n]; + if (a) + return s[e.id] = a, + a; + var u = t.buffers + , h = t.attributes + , $ = {} + , p = {}; + for (var l in u) + $[l] = 0, + p[l] = 0; + for (var l in h) + !h[l].size && e.attributeData[l] ? h[l].size = e.attributeData[l].size : h[l].size || console.warn("PIXI Geometry attribute '" + l + "' size cannot be determined (likely the bound shader does not have the attribute)"), + $[h[l].buffer] += h[l].size * ic[h[l].type]; + for (var l in h) { + var c = h[l] + , d = c.size; + void 0 === c.stride && ($[c.buffer] === d * ic[c.type] ? c.stride = 0 : c.stride = $[c.buffer]), + void 0 === c.start && (c.start = p[c.buffer], + p[c.buffer] += d * ic[c.type]) + } + a = i.createVertexArray(), + i.bindVertexArray(a); + for (var f = 0; f < u.length; f++) { + var m = u[f]; + m._glBuffers[o] || (m._glBuffers[o] = new og(i.createBuffer()), + this.managedBuffers[m.id] = m, + m.disposeRunner.add(this)), + r && m._glBuffers[o].refCount++ + } + return this.activateVao(t, e), + this._activeVao = a, + s[e.id] = a, + s[n] = a, + a + } + , + e.prototype.disposeBuffer = function(t, e) { + if (this.managedBuffers[t.id]) { + delete this.managedBuffers[t.id]; + var r = t._glBuffers[this.CONTEXT_UID] + , i = this.gl; + t.disposeRunner.remove(this), + r && (e || i.deleteBuffer(r.buffer), + delete t._glBuffers[this.CONTEXT_UID]) + } + } + , + e.prototype.disposeGeometry = function(t, e) { + if (this.managedGeometries[t.id]) { + delete this.managedGeometries[t.id]; + var r = t.glVertexArrayObjects[this.CONTEXT_UID] + , i = this.gl + , o = t.buffers; + if (t.disposeRunner.remove(this), + r) { + for (var n = 0; n < o.length; n++) { + var s = o[n]._glBuffers[this.CONTEXT_UID]; + s.refCount--, + 0 !== s.refCount || e || this.disposeBuffer(o[n], e) + } + if (!e) + for (var a in r) + if ("g" === a[0]) { + var u = r[a]; + this._activeVao === u && this.unbind(), + i.deleteVertexArray(u) + } + delete t.glVertexArrayObjects[this.CONTEXT_UID] + } + } + } + , + e.prototype.disposeAll = function(t) { + for (var e = Object.keys(this.managedGeometries), r = 0; r < e.length; r++) + this.disposeGeometry(this.managedGeometries[e[r]], t); + e = Object.keys(this.managedBuffers); + for (r = 0; r < e.length; r++) + this.disposeBuffer(this.managedBuffers[e[r]], t) + } + , + e.prototype.activateVao = function(t, e) { + var r = this.gl + , i = this.CONTEXT_UID + , o = t.buffers + , n = t.attributes; + t.indexBuffer && r.bindBuffer(r.ELEMENT_ARRAY_BUFFER, t.indexBuffer._glBuffers[i].buffer); + var s = null; + for (var a in n) { + var u = n[a] + , h = o[u.buffer]._glBuffers[i]; + if (e.attributeData[a]) { + s !== h && (r.bindBuffer(r.ARRAY_BUFFER, h.buffer), + s = h); + var $ = e.attributeData[a].location; + if (r.enableVertexAttribArray($), + r.vertexAttribPointer($, u.size, u.type || r.FLOAT, u.normalized, u.stride, u.start), + u.instance) { + if (!this.hasInstance) + throw new Error("geometry error, GPU Instancing is not supported on this device"); + r.vertexAttribDivisor($, 1) + } + } + } + } + , + e.prototype.draw = function(t, e, r, i) { + var o = this.gl + , n = this._activeGeometry; + if (n.indexBuffer) { + var s = n.indexBuffer.data.BYTES_PER_ELEMENT + , a = 2 === s ? o.UNSIGNED_SHORT : o.UNSIGNED_INT; + 2 === s || 4 === s && this.canUseUInt32ElementIndex ? n.instanced ? o.drawElementsInstanced(t, e || n.indexBuffer.data.length, a, (r || 0) * s, i || 1) : o.drawElements(t, e || n.indexBuffer.data.length, a, (r || 0) * s) : console.warn("unsupported index buffer type: uint32") + } else + n.instanced ? o.drawArraysInstanced(t, r, e || n.getSize(), i || 1) : o.drawArrays(t, r, e || n.getSize()); + return this + } + , + e.prototype.unbind = function() { + this.gl.bindVertexArray(null), + this._activeVao = null, + this._activeGeometry = null + } + , + e + }(pa) + , pg = function() { + function t(t) { + void 0 === t && (t = null), + this.type = qa.NONE, + this.autoDetect = !0, + this.maskObject = t || null, + this.pooled = !1, + this.isMaskData = !0, + this._stencilCounter = 0, + this._scissorCounter = 0, + this._scissorRect = null, + this._target = null + } + return t.prototype.reset = function() { + this.pooled && (this.maskObject = null, + this.type = qa.NONE, + this.autoDetect = !0), + this._target = null + } + , + t.prototype.copyCountersOrReset = function(t) { + t ? (this._stencilCounter = t._stencilCounter, + this._scissorCounter = t._scissorCounter, + this._scissorRect = t._scissorRect) : (this._stencilCounter = 0, + this._scissorCounter = 0, + this._scissorRect = null) + } + , + t + }(); + function Fd(t, e, r) { + var i = t.createShader(e); + return t.shaderSource(i, r), + t.compileShader(i), + i + } + function Gd(t, e, r, i) { + var o = Fd(t, t.VERTEX_SHADER, e) + , n = Fd(t, t.FRAGMENT_SHADER, r) + , s = t.createProgram(); + if (t.attachShader(s, o), + t.attachShader(s, n), + i) + for (var a in i) + t.bindAttribLocation(s, i[a], a); + return t.linkProgram(s), + t.getProgramParameter(s, t.LINK_STATUS) || (t.getShaderParameter(o, t.COMPILE_STATUS) || (console.warn(e), + console.error(t.getShaderInfoLog(o))), + t.getShaderParameter(n, t.COMPILE_STATUS) || (console.warn(r), + console.error(t.getShaderInfoLog(n))), + console.error("Pixi.js Error: Could not initialize shader."), + console.error("gl.VALIDATE_STATUS", t.getProgramParameter(s, t.VALIDATE_STATUS)), + console.error("gl.getError()", t.getError()), + "" !== t.getProgramInfoLog(s) && console.warn("Pixi.js Warning: gl.getProgramInfoLog()", t.getProgramInfoLog(s)), + t.deleteProgram(s), + s = null), + t.deleteShader(o), + t.deleteShader(n), + s + } + function jc(t) { + for (var e = new Array(t), r = 0; r < e.length; r++) + e[r] = !1; + return e + } + function Hd(t, e) { + switch (t) { + case "float": + return 0; + case "vec2": + return new Float32Array(2 * e); + case "vec3": + return new Float32Array(3 * e); + case "vec4": + return new Float32Array(4 * e); + case "int": + case "uint": + case "sampler2D": + case "sampler2DArray": + return 0; + case "ivec2": + return new Int32Array(2 * e); + case "ivec3": + return new Int32Array(3 * e); + case "ivec4": + return new Int32Array(4 * e); + case "uvec2": + return new Uint32Array(2 * e); + case "uvec3": + return new Uint32Array(3 * e); + case "uvec4": + return new Uint32Array(4 * e); + case "bool": + return !1; + case "bvec2": + return jc(2 * e); + case "bvec3": + return jc(3 * e); + case "bvec4": + return jc(4 * e); + case "mat2": + return new Float32Array([1, 0, 0, 1]); + case "mat3": + return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + case "mat4": + return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); + } + return null + } + var Id, Jd = {}, Db = Jd; + function Kd() { + if (Db === Jd || Db && Db.isContextLost()) { + var t = document.createElement("canvas") + , e = void 0; + aa.PREFER_ENV >= Aa.WEBGL2 && (e = t.getContext("webgl2", {})), + e || ((e = t.getContext("webgl", {}) || t.getContext("experimental-webgl", {})) ? e.getExtension("WEBGL_draw_buffers") : e = null), + Db = e + } + return Db + } + function qg() { + if (!Id) { + Id = xa.MEDIUM; + var t = Kd(); + if (t && t.getShaderPrecisionFormat) { + var e = t.getShaderPrecisionFormat(t.FRAGMENT_SHADER, t.HIGH_FLOAT); + Id = e.precision ? xa.HIGH : xa.MEDIUM + } + } + return Id + } + function Ld(t, e, r) { + if ("precision" !== t.substring(0, 9)) { + var i = e; + return e === xa.HIGH && r !== xa.HIGH && (i = xa.MEDIUM), + "precision " + i + " float;\n" + t + } + return r !== xa.HIGH && "precision highp" === t.substring(0, 15) ? t.replace("precision highp", "precision mediump") : t + } + var rg = { + float: 1, + vec2: 2, + vec3: 3, + vec4: 4, + int: 1, + ivec2: 2, + ivec3: 3, + ivec4: 4, + uint: 1, + uvec2: 2, + uvec3: 3, + uvec4: 4, + bool: 1, + bvec2: 2, + bvec3: 3, + bvec4: 4, + mat2: 4, + mat3: 9, + mat4: 16, + sampler2D: 1 + }; + function sg(t) { + return rg[t] + } + var kc = null + , Md = { + FLOAT: "float", + FLOAT_VEC2: "vec2", + FLOAT_VEC3: "vec3", + FLOAT_VEC4: "vec4", + INT: "int", + INT_VEC2: "ivec2", + INT_VEC3: "ivec3", + INT_VEC4: "ivec4", + UNSIGNED_INT: "uint", + UNSIGNED_INT_VEC2: "uvec2", + UNSIGNED_INT_VEC3: "uvec3", + UNSIGNED_INT_VEC4: "uvec4", + BOOL: "bool", + BOOL_VEC2: "bvec2", + BOOL_VEC3: "bvec3", + BOOL_VEC4: "bvec4", + FLOAT_MAT2: "mat2", + FLOAT_MAT3: "mat3", + FLOAT_MAT4: "mat4", + SAMPLER_2D: "sampler2D", + INT_SAMPLER_2D: "sampler2D", + UNSIGNED_INT_SAMPLER_2D: "sampler2D", + SAMPLER_CUBE: "samplerCube", + INT_SAMPLER_CUBE: "samplerCube", + UNSIGNED_INT_SAMPLER_CUBE: "samplerCube", + SAMPLER_2D_ARRAY: "sampler2DArray", + INT_SAMPLER_2D_ARRAY: "sampler2DArray", + UNSIGNED_INT_SAMPLER_2D_ARRAY: "sampler2DArray" + }; + function Nd(t, e) { + if (!kc) { + var r = Object.keys(Md); + kc = {}; + for (var i = 0; i < r.length; ++i) { + var o = r[i]; + kc[t[o]] = Md[o] + } + } + return kc[e] + } + var lc = [{ + test: function(t) { + return "float" === t.type && 1 === t.size + }, + code: function(t) { + return "\n if(uv[\"" + t + "\"] !== ud[\"" + t + "\"].value)\n {\n ud[\"" + t + "\"].value = uv[\"" + t + "\"]\n gl.uniform1f(ud[\"" + t + "\"].location, uv[\"" + t + "\"])\n }\n " + } + }, { + test: function(t) { + return ("sampler2D" === t.type || "samplerCube" === t.type || "sampler2DArray" === t.type) && 1 === t.size && !t.isArray + }, + code: function(t) { + return "t = syncData.textureCount++;\n\n renderer.texture.bind(uv[\"" + t + "\"], t);\n\n if(ud[\"" + t + "\"].value !== t)\n {\n ud[\"" + t + "\"].value = t;\n gl.uniform1i(ud[\"" + t + "\"].location, t);\n; // eslint-disable-line max-len\n }" + } + }, { + test: function(t, e) { + return "mat3" === t.type && 1 === t.size && void 0 !== e.a + }, + code: function(t) { + return "\n gl.uniformMatrix3fv(ud[\"" + t + "\"].location, false, uv[\"" + t + "\"].toArray(true));\n " + } + }, { + test: function(t, e) { + return "vec2" === t.type && 1 === t.size && void 0 !== e.x + }, + code: function(t) { + return "\n cv = ud[\"" + t + "\"].value;\n v = uv[\"" + t + "\"];\n\n if(cv[0] !== v.x || cv[1] !== v.y)\n {\n cv[0] = v.x;\n cv[1] = v.y;\n gl.uniform2f(ud[\"" + t + "\"].location, v.x, v.y);\n }" + } + }, { + test: function(t) { + return "vec2" === t.type && 1 === t.size + }, + code: function(t) { + return "\n cv = ud[\"" + t + "\"].value;\n v = uv[\"" + t + "\"];\n\n if(cv[0] !== v[0] || cv[1] !== v[1])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n gl.uniform2f(ud[\"" + t + "\"].location, v[0], v[1]);\n }\n " + } + }, { + test: function(t, e) { + return "vec4" === t.type && 1 === t.size && void 0 !== e.width + }, + code: function(t) { + return "\n cv = ud[\"" + t + "\"].value;\n v = uv[\"" + t + "\"];\n\n if(cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height)\n {\n cv[0] = v.x;\n cv[1] = v.y;\n cv[2] = v.width;\n cv[3] = v.height;\n gl.uniform4f(ud[\"" + t + "\"].location, v.x, v.y, v.width, v.height)\n }" + } + }, { + test: function(t) { + return "vec4" === t.type && 1 === t.size + }, + code: function(t) { + return "\n cv = ud[\"" + t + "\"].value;\n v = uv[\"" + t + "\"];\n\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n cv[2] = v[2];\n cv[3] = v[3];\n\n gl.uniform4f(ud[\"" + t + "\"].location, v[0], v[1], v[2], v[3])\n }" + } + }] + , tg = { + float: "\n if(cv !== v)\n {\n cv.v = v;\n gl.uniform1f(location, v)\n }", + vec2: "\n if(cv[0] !== v[0] || cv[1] !== v[1])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n gl.uniform2f(location, v[0], v[1])\n }", + vec3: "\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n cv[2] = v[2];\n\n gl.uniform3f(location, v[0], v[1], v[2])\n }", + vec4: "gl.uniform4f(location, v[0], v[1], v[2], v[3])", + int: "gl.uniform1i(location, v)", + ivec2: "gl.uniform2i(location, v[0], v[1])", + ivec3: "gl.uniform3i(location, v[0], v[1], v[2])", + ivec4: "gl.uniform4i(location, v[0], v[1], v[2], v[3])", + uint: "gl.uniform1ui(location, v)", + uvec2: "gl.uniform2ui(location, v[0], v[1])", + uvec3: "gl.uniform3ui(location, v[0], v[1], v[2])", + uvec4: "gl.uniform4ui(location, v[0], v[1], v[2], v[3])", + bool: "gl.uniform1i(location, v)", + bvec2: "gl.uniform2i(location, v[0], v[1])", + bvec3: "gl.uniform3i(location, v[0], v[1], v[2])", + bvec4: "gl.uniform4i(location, v[0], v[1], v[2], v[3])", + mat2: "gl.uniformMatrix2fv(location, false, v)", + mat3: "gl.uniformMatrix3fv(location, false, v)", + mat4: "gl.uniformMatrix4fv(location, false, v)", + sampler2D: "gl.uniform1i(location, v)", + samplerCube: "gl.uniform1i(location, v)", + sampler2DArray: "gl.uniform1i(location, v)" + } + , ug = { + float: "gl.uniform1fv(location, v)", + vec2: "gl.uniform2fv(location, v)", + vec3: "gl.uniform3fv(location, v)", + vec4: "gl.uniform4fv(location, v)", + mat4: "gl.uniformMatrix4fv(location, false, v)", + mat3: "gl.uniformMatrix3fv(location, false, v)", + mat2: "gl.uniformMatrix2fv(location, false, v)", + int: "gl.uniform1iv(location, v)", + ivec2: "gl.uniform2iv(location, v)", + ivec3: "gl.uniform3iv(location, v)", + ivec4: "gl.uniform4iv(location, v)", + uint: "gl.uniform1uiv(location, v)", + uvec2: "gl.uniform2uiv(location, v)", + uvec3: "gl.uniform3uiv(location, v)", + uvec4: "gl.uniform4uiv(location, v)", + bool: "gl.uniform1iv(location, v)", + bvec2: "gl.uniform2iv(location, v)", + bvec3: "gl.uniform3iv(location, v)", + bvec4: "gl.uniform4iv(location, v)", + sampler2D: "gl.uniform1iv(location, v)", + samplerCube: "gl.uniform1iv(location, v)", + sampler2DArray: "gl.uniform1iv(location, v)" + }; + function vg(t, e) { + var r = ["\n var v = null;\n var cv = null\n var t = 0;\n var gl = renderer.gl\n "]; + for (var i in t.uniforms) { + var o = e[i]; + if (o) { + for (var n = t.uniforms[i], s = !1, a = 0; a < lc.length; a++) + if (lc[a].test(o, n)) { + r.push(lc[a].code(i, n)), + s = !0; + break + } + if (!s) { + var u = (1 === o.size ? tg : ug)[o.type].replace("location", "ud[\"" + i + "\"].location"); + r.push("\n cv = ud[\"" + i + "\"].value;\n v = uv[\"" + i + "\"];\n " + u + ";") + } + } else + t.uniforms[i].group && r.push("\n renderer.shader.syncUniformGroup(uv[\"" + i + "\"], syncData);\n ") + } + return new Function("ud","uv","renderer","syncData",r.join("\n")) + } + var mc, wg = ["precision mediump float;", "void main(void){", "float test = 0.1;", "%forloop%", "gl_FragColor = vec4(0.0);", "}"].join("\n"); + function xg(t) { + for (var e = "", r = 0; r < t; ++r) + r > 0 && (e += "\nelse "), + r < t - 1 && (e += "if(test == " + r + ".0){}"); + return e + } + function yg(t, e) { + if (0 === t) + throw new Error("Invalid value of `0` passed to `checkMaxIfStatementsInShader`"); + for (var r = e.createShader(e.FRAGMENT_SHADER); ; ) { + var i = wg.replace(/%forloop%/gi, xg(t)); + if (e.shaderSource(r, i), + e.compileShader(r), + e.getShaderParameter(r, e.COMPILE_STATUS)) + break; + t = t / 2 | 0 + } + return t + } + function zg() { + if ("boolean" == typeof mc) + return mc; + try { + var t = new Function("param1","param2","param3","return param1[param2] === param3;"); + mc = !0 === t({ + a: "b" + }, "a", "b") + } catch (e) { + mc = !1 + } + return mc + } + var Ag = "varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor *= texture2D(uSampler, vTextureCoord);\n}" + , Bg = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n" + , Cg = 0 + , Eb = {} + , nc = function() { + function t(e, r, i) { + void 0 === i && (i = "pixi-shader"), + this.id = Cg++, + this.vertexSrc = e || t.defaultVertexSrc, + this.fragmentSrc = r || t.defaultFragmentSrc, + this.vertexSrc = this.vertexSrc.trim(), + this.fragmentSrc = this.fragmentSrc.trim(), + "#version" !== this.vertexSrc.substring(0, 8) && (i = i.replace(/\s+/g, "-"), + Eb[i] ? (Eb[i]++, + i += "-" + Eb[i]) : Eb[i] = 1, + this.vertexSrc = "#define SHADER_NAME " + i + "\n" + this.vertexSrc, + this.fragmentSrc = "#define SHADER_NAME " + i + "\n" + this.fragmentSrc, + this.vertexSrc = Ld(this.vertexSrc, aa.PRECISION_VERTEX, xa.HIGH), + this.fragmentSrc = Ld(this.fragmentSrc, aa.PRECISION_FRAGMENT, qg())), + this.extractData(this.vertexSrc, this.fragmentSrc), + this.glPrograms = {}, + this.syncUniforms = null + } + return t.prototype.extractData = function(t, e) { + var r = Kd(); + if (r) { + var i = Gd(r, t, e); + this.attributeData = this.getAttributeData(i, r), + this.uniformData = this.getUniformData(i, r), + r.deleteProgram(i) + } else + this.uniformData = {}, + this.attributeData = {} + } + , + t.prototype.getAttributeData = function(t, e) { + for (var r = {}, i = [], o = e.getProgramParameter(t, e.ACTIVE_ATTRIBUTES), n = 0; n < o; n++) { + var s = e.getActiveAttrib(t, n) + , a = Nd(e, s.type) + , u = { + type: a, + name: s.name, + size: sg(a), + location: 0 + }; + r[s.name] = u, + i.push(u) + } + i.sort(function(t, e) { + return t.name > e.name ? 1 : -1 + }); + for (n = 0; n < i.length; n++) + i[n].location = n; + return r + } + , + t.prototype.getUniformData = function(t, e) { + for (var r = {}, i = e.getProgramParameter(t, e.ACTIVE_UNIFORMS), o = 0; o < i; o++) { + var n = e.getActiveUniform(t, o) + , s = n.name.replace(/\[.*?\]$/, "") + , a = n.name.match(/\[.*?\]$/) + , u = Nd(e, n.type); + r[s] = { + type: u, + size: n.size, + isArray: a, + value: Hd(u, n.size) + } + } + return r + } + , + Object.defineProperty(t, "defaultVertexSrc", { + get: function() { + return Bg + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "defaultFragmentSrc", { + get: function() { + return Ag + }, + enumerable: !1, + configurable: !0 + }), + t.from = function(e, r, i) { + var o = e + r + , n = jd[o]; + return n || (jd[o] = n = new t(e,r,i)), + n + } + , + t + }() + , oc = function() { + function t(t, e) { + for (var r in this.program = t, + this.uniformGroup = e ? e instanceof Pa ? e : new Pa(e) : new Pa({}), + t.uniformData) + this.uniformGroup.uniforms[r]instanceof Array && (this.uniformGroup.uniforms[r] = new Float32Array(this.uniformGroup.uniforms[r])) + } + return t.prototype.checkUniformExists = function(t, e) { + if (e.uniforms[t]) + return !0; + for (var r in e.uniforms) { + var i = e.uniforms[r]; + if (i.group && this.checkUniformExists(t, i)) + return !0 + } + return !1 + } + , + t.prototype.destroy = function() { + this.uniformGroup = null + } + , + Object.defineProperty(t.prototype, "uniforms", { + get: function() { + return this.uniformGroup.uniforms + }, + enumerable: !1, + configurable: !0 + }), + t.from = function(e, r, i) { + return new t(nc.from(e, r),i) + } + , + t + }() + , pc = 0 + , qc = 1 + , rc = 2 + , sc = 3 + , tc = 4 + , uc = 5 + , Fb = function() { + function t() { + this.data = 0, + this.blendMode = K.NORMAL, + this.polygonOffset = 0, + this.blend = !0, + this.depthMask = !0 + } + return Object.defineProperty(t.prototype, "blend", { + get: function() { + return !!(this.data & 1 << pc) + }, + set: function(t) { + !!(this.data & 1 << pc) !== t && (this.data ^= 1 << pc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "offsets", { + get: function() { + return !!(this.data & 1 << qc) + }, + set: function(t) { + !!(this.data & 1 << qc) !== t && (this.data ^= 1 << qc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "culling", { + get: function() { + return !!(this.data & 1 << rc) + }, + set: function(t) { + !!(this.data & 1 << rc) !== t && (this.data ^= 1 << rc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "depthTest", { + get: function() { + return !!(this.data & 1 << sc) + }, + set: function(t) { + !!(this.data & 1 << sc) !== t && (this.data ^= 1 << sc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "depthMask", { + get: function() { + return !!(this.data & 1 << uc) + }, + set: function(t) { + !!(this.data & 1 << uc) !== t && (this.data ^= 1 << uc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "clockwiseFrontFace", { + get: function() { + return !!(this.data & 1 << tc) + }, + set: function(t) { + !!(this.data & 1 << tc) !== t && (this.data ^= 1 << tc) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "blendMode", { + get: function() { + return this._blendMode + }, + set: function(t) { + this.blend = t !== K.NONE, + this._blendMode = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "polygonOffset", { + get: function() { + return this._polygonOffset + }, + set: function(t) { + this.offsets = !!t, + this._polygonOffset = t + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.toString = function() { + return "[@pixi/core:State blendMode=" + this.blendMode + " clockwiseFrontFace=" + this.clockwiseFrontFace + " culling=" + this.culling + " depthMask=" + this.depthMask + " polygonOffset=" + this.polygonOffset + "]" + } + , + t.for2d = function() { + var e = new t; + return e.depthTest = !1, + e.blend = !0, + e + } + , + t + }() + , Dg = "attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n" + , Eg = "varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n}\n" + , Fg = function(t) { + function e(r, i, o) { + var n = this + , s = nc.from(r || e.defaultVertexSrc, i || e.defaultFragmentSrc); + return (n = t.call(this, s, o) || this).padding = 0, + n.resolution = aa.FILTER_RESOLUTION, + n.enabled = !0, + n.autoFit = !0, + n.legacy = !!n.program.attributeData.aTextureCoord, + n.state = new Fb, + n + } + return ba(e, t), + e.prototype.apply = function(t, e, r, i, o) { + t.applyFilter(this, e, r, i) + } + , + Object.defineProperty(e.prototype, "blendMode", { + get: function() { + return this.state.blendMode + }, + set: function(t) { + this.state.blendMode = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e, "defaultVertexSrc", { + get: function() { + return Dg + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e, "defaultFragmentSrc", { + get: function() { + return Eg + }, + enumerable: !1, + configurable: !0 + }), + e + }(oc) + , Gg = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n}\n" + , Hg = "varying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform float npmAlpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n float clip = step(3.5,\n step(maskClamp.x, vMaskCoord.x) +\n step(maskClamp.y, vMaskCoord.y) +\n step(vMaskCoord.x, maskClamp.z) +\n step(vMaskCoord.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, vMaskCoord);\n float alphaMul = 1.0 - npmAlpha * (1.0 - masky.a);\n\n original *= (alphaMul * masky.r * alpha * clip);\n\n gl_FragColor = original;\n}\n" + , Od = new la + , Ig = function() { + function t(t, e) { + this._texture = t, + this.mapCoord = new la, + this.uClampFrame = new Float32Array(4), + this.uClampOffset = new Float32Array(2), + this._textureID = -1, + this._updateID = 0, + this.clampOffset = 0, + this.clampMargin = void 0 === e ? .5 : e, + this.isSimple = !1 + } + return Object.defineProperty(t.prototype, "texture", { + get: function() { + return this._texture + }, + set: function(t) { + this._texture = t, + this._textureID = -1 + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.multiplyUvs = function(t, e) { + void 0 === e && (e = t); + for (var r = this.mapCoord, i = 0; i < t.length; i += 2) { + var o = t[i] + , n = t[i + 1]; + e[i] = o * r.a + n * r.c + r.tx, + e[i + 1] = o * r.b + n * r.d + r.ty + } + return e + } + , + t.prototype.update = function(t) { + var e = this._texture; + if (!e || !e.valid) + return !1; + if (!t && this._textureID === e._updateID) + return !1; + this._textureID = e._updateID, + this._updateID++; + var r = e._uvs; + this.mapCoord.set(r.x1 - r.x0, r.y1 - r.y0, r.x3 - r.x0, r.y3 - r.y0, r.x0, r.y0); + var i = e.orig + , o = e.trim; + o && (Od.set(i.width / o.width, 0, 0, i.height / o.height, -o.x / o.width, -o.y / o.height), + this.mapCoord.append(Od)); + var n = e.baseTexture + , s = this.uClampFrame + , a = this.clampMargin / n.resolution + , u = this.clampOffset; + return s[0] = (e._frame.x + a + u) / n.width, + s[1] = (e._frame.y + a + u) / n.height, + s[2] = (e._frame.x + e._frame.width - a + u) / n.width, + s[3] = (e._frame.y + e._frame.height - a + u) / n.height, + this.uClampOffset[0] = u / n.realWidth, + this.uClampOffset[1] = u / n.realHeight, + this.isSimple = e._frame.width === n.width && e._frame.height === n.height && 0 === e.rotate, + !0 + } + , + t + }() + , Jg = function(t) { + function e(e) { + var r = this + , i = new la; + return r = t.call(this, Gg, Hg) || this, + e.renderable = !1, + r.maskSprite = e, + r.maskMatrix = i, + r + } + return ba(e, t), + e.prototype.apply = function(t, e, r, i) { + var o = this.maskSprite + , n = o._texture; + n.valid && (n.uvMatrix || (n.uvMatrix = new Ig(n,0)), + n.uvMatrix.update(), + this.uniforms.npmAlpha = n.baseTexture.alphaMode ? 0 : 1, + this.uniforms.mask = n, + this.uniforms.otherMatrix = t.calculateSpriteMatrix(this.maskMatrix, o).prepend(n.uvMatrix.mapCoord), + this.uniforms.alpha = o.worldAlpha, + this.uniforms.maskClamp = n.uvMatrix.uClampFrame, + t.applyFilter(this, e, r, i)) + } + , + e + }(Fg) + , Pd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.enableScissor = !0, + r.alphaMaskPool = [], + r.maskDataPool = [], + r.maskStack = [], + r.alphaMaskIndex = 0, + r + } + return ba(e, t), + e.prototype.setMaskStack = function(t) { + this.maskStack = t, + this.renderer.scissor.setMaskStack(t), + this.renderer.stencil.setMaskStack(t) + } + , + e.prototype.push = function(t, e) { + var r = e; + if (!r.isMaskData) { + var i = this.maskDataPool.pop() || new pg; + i.pooled = !0, + i.maskObject = e, + r = i + } + switch (r.autoDetect && this.detect(r), + r.copyCountersOrReset(this.maskStack[this.maskStack.length - 1]), + r._target = t, + r.type) { + case qa.SCISSOR: + this.maskStack.push(r), + this.renderer.scissor.push(r); + break; + case qa.STENCIL: + this.maskStack.push(r), + this.renderer.stencil.push(r); + break; + case qa.SPRITE: + r.copyCountersOrReset(null), + this.pushSpriteMask(r), + this.maskStack.push(r); + } + } + , + e.prototype.pop = function(t) { + var e = this.maskStack.pop(); + if (e && e._target === t) { + switch (e.type) { + case qa.SCISSOR: + this.renderer.scissor.pop(); + break; + case qa.STENCIL: + this.renderer.stencil.pop(e.maskObject); + break; + case qa.SPRITE: + this.popSpriteMask(); + } + e.reset(), + e.pooled && this.maskDataPool.push(e) + } + } + , + e.prototype.detect = function(t) { + var e = t.maskObject; + if (e.isSprite) + t.type = qa.SPRITE; + else if (t.type = qa.STENCIL, + this.enableScissor && e.isFastRect && e.isFastRect()) { + var r = e.worldTransform + , i = Math.atan2(r.b, r.a) + , o = Math.atan2(r.d, r.c); + i = Math.round(i * (180 / Math.PI) * 100), + o = ((o = Math.round(o * (180 / Math.PI) * 100) - i) % 18e3 + 18e3) % 18e3, + 0 === (i = (i % 9e3 + 9e3) % 9e3) && 9e3 === o && (t.type = qa.SCISSOR) + } + } + , + e.prototype.pushSpriteMask = function(t) { + var e = t.maskObject + , r = t._target + , i = this.alphaMaskPool[this.alphaMaskIndex]; + i || (i = this.alphaMaskPool[this.alphaMaskIndex] = [new Jg(e)]), + i[0].resolution = this.renderer.resolution, + i[0].maskSprite = e; + var o = r.filterArea; + r.filterArea = e.getBounds(!0), + this.renderer.filter.push(r, i), + r.filterArea = o, + this.alphaMaskIndex++ + } + , + e.prototype.popSpriteMask = function() { + this.renderer.filter.pop(), + this.alphaMaskIndex-- + } + , + e + }(pa) + , Qd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.maskStack = [], + r.glConst = 0, + r + } + return ba(e, t), + e.prototype.getStackLength = function() { + return this.maskStack.length + } + , + e.prototype.setMaskStack = function(t) { + var e = this.renderer.gl + , r = this.getStackLength(); + this.maskStack = t; + var i = this.getStackLength(); + i !== r && (0 === i ? e.disable(this.glConst) : (e.enable(this.glConst), + this._useCurrent())) + } + , + e.prototype._useCurrent = function() {} + , + e.prototype.destroy = function() { + t.prototype.destroy.call(this), + this.maskStack = null + } + , + e + }(pa) + , Rd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.glConst = WebGLRenderingContext.SCISSOR_TEST, + r + } + return ba(e, t), + e.prototype.getStackLength = function() { + var t = this.maskStack[this.maskStack.length - 1]; + return t ? t._scissorCounter : 0 + } + , + e.prototype.push = function(t) { + var e = t.maskObject; + e.renderable = !0; + var r = t._scissorRect + , i = e.getBounds(!0) + , o = this.renderer.gl; + e.renderable = !1, + r ? i.fit(r) : o.enable(o.SCISSOR_TEST), + t._scissorCounter++, + t._scissorRect = i, + this._useCurrent() + } + , + e.prototype.pop = function() { + var t = this.renderer.gl; + this.getStackLength() > 0 ? this._useCurrent() : t.disable(t.SCISSOR_TEST) + } + , + e.prototype._useCurrent = function() { + var t = this.maskStack[this.maskStack.length - 1]._scissorRect + , e = this.renderer.renderTexture.current + , r = this.renderer.projection + , i = r.transform + , o = r.sourceFrame + , n = r.destinationFrame + , s = e ? e.resolution : this.renderer.resolution + , a = n.width / o.width + , u = n.height / o.height + , h = ((t.x - o.x) * a + n.x) * s + , $ = ((t.y - o.y) * u + n.y) * s + , p = t.width * a * s + , l = t.height * u * s; + i && (h += i.tx * s, + $ += i.ty * s), + e || ($ = this.renderer.height - l - $), + this.renderer.gl.scissor(h, $, p, l) + } + , + e + }(Qd) + , Sd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.glConst = WebGLRenderingContext.STENCIL_TEST, + r + } + return ba(e, t), + e.prototype.getStackLength = function() { + var t = this.maskStack[this.maskStack.length - 1]; + return t ? t._stencilCounter : 0 + } + , + e.prototype.push = function(t) { + var e = t.maskObject + , r = this.renderer.gl + , i = t._stencilCounter; + 0 === i && (this.renderer.framebuffer.forceStencil(), + r.enable(r.STENCIL_TEST)), + t._stencilCounter++, + r.colorMask(!1, !1, !1, !1), + r.stencilFunc(r.EQUAL, i, this._getBitwiseMask()), + r.stencilOp(r.KEEP, r.KEEP, r.INCR), + e.renderable = !0, + e.render(this.renderer), + this.renderer.batch.flush(), + this.renderer.framebuffer.blit(), + e.renderable = !1, + this._useCurrent() + } + , + e.prototype.pop = function(t) { + var e = this.renderer.gl; + 0 === this.getStackLength() ? (e.disable(e.STENCIL_TEST), + e.clear(e.STENCIL_BUFFER_BIT), + e.clearStencil(0)) : (e.colorMask(!1, !1, !1, !1), + e.stencilOp(e.KEEP, e.KEEP, e.DECR), + t.renderable = !0, + t.render(this.renderer), + this.renderer.batch.flush(), + t.renderable = !1, + this._useCurrent()) + } + , + e.prototype._useCurrent = function() { + var t = this.renderer.gl; + t.colorMask(!0, !0, !0, !0), + t.stencilFunc(t.EQUAL, this.getStackLength(), this._getBitwiseMask()), + t.stencilOp(t.KEEP, t.KEEP, t.KEEP) + } + , + e.prototype._getBitwiseMask = function() { + return (1 << this.getStackLength()) - 1 + } + , + e + }(Qd) + , Td = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.destinationFrame = null, + r.sourceFrame = null, + r.defaultFrame = null, + r.projectionMatrix = new la, + r.transform = null, + r + } + return ba(e, t), + e.prototype.update = function(t, e, r, i) { + this.destinationFrame = t || this.destinationFrame || this.defaultFrame, + this.sourceFrame = e || this.sourceFrame || t, + this.calculateProjection(this.destinationFrame, this.sourceFrame, r, i), + this.transform && this.projectionMatrix.append(this.transform); + var o = this.renderer; + o.globalUniforms.uniforms.projectionMatrix = this.projectionMatrix, + o.globalUniforms.update(), + o.shader.shader && o.shader.syncUniformGroup(o.shader.shader.uniforms.globals) + } + , + e.prototype.calculateProjection = function(t, e, r, i) { + var o = this.projectionMatrix + , n = i ? -1 : 1; + o.identity(), + o.a = 1 / e.width * 2, + o.d = n * (1 / e.height * 2), + o.tx = -1 - e.x * o.a, + o.ty = -n - e.y * o.d + } + , + e.prototype.setTransform = function(t) {} + , + e + }(pa) + , Qa = new da + , fb = new da + , Ud = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.clearColor = e._backgroundColorRgba, + r.defaultMaskStack = [], + r.current = null, + r.sourceFrame = new da, + r.destinationFrame = new da, + r.viewportFrame = new da, + r + } + return ba(e, t), + e.prototype.bind = function(t, e, r) { + void 0 === t && (t = null); + var i, o, n, s = this.renderer; + this.current = t, + t ? (n = (i = t.baseTexture).resolution, + e || (Qa.width = t.frame.width, + Qa.height = t.frame.height, + e = Qa), + r || (fb.x = t.frame.x, + fb.y = t.frame.y, + fb.width = e.width, + fb.height = e.height, + r = fb), + o = i.framebuffer) : (n = s.resolution, + e || (Qa.width = s.screen.width, + Qa.height = s.screen.height, + e = Qa), + r || ((r = Qa).width = e.width, + r.height = e.height)); + var a = this.viewportFrame; + a.x = r.x * n, + a.y = r.y * n, + a.width = r.width * n, + a.height = r.height * n, + t || (a.y = s.view.height - (a.y + a.height)), + this.renderer.framebuffer.bind(o, a), + this.renderer.projection.update(r, e, n, !o), + t ? this.renderer.mask.setMaskStack(i.maskStack) : this.renderer.mask.setMaskStack(this.defaultMaskStack), + this.sourceFrame.copyFrom(e), + this.destinationFrame.copyFrom(r) + } + , + e.prototype.clear = function(t, e) { + t = this.current ? t || this.current.baseTexture.clearColor : t || this.clearColor; + var r = this.destinationFrame + , i = this.current ? this.current.baseTexture : this.renderer.screen + , o = r.width !== i.width || r.height !== i.height; + if (o) { + var n = this.viewportFrame + , s = n.x + , a = n.y + , u = n.width + , h = n.height; + this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST), + this.renderer.gl.scissor(s, a, u, h) + } + this.renderer.framebuffer.clear(t[0], t[1], t[2], t[3], e), + o && this.renderer.scissor.pop() + } + , + e.prototype.resize = function() { + this.bind(null) + } + , + e.prototype.reset = function() { + this.bind(null) + } + , + e + }(pa) + , h = function() { + return function() {} + }() + , Kg = function() { + function t(t, e) { + this.program = t, + this.uniformData = e, + this.uniformGroups = {} + } + return t.prototype.destroy = function() { + this.uniformData = null, + this.uniformGroups = null, + this.program = null + } + , + t + }() + , Lg = 0 + , Vd = { + textureCount: 0 + } + , Wd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.destroyed = !1, + r.systemCheck(), + r.gl = null, + r.shader = null, + r.program = null, + r.cache = {}, + r.id = Lg++, + r + } + return ba(e, t), + e.prototype.systemCheck = function() { + if (!zg()) + throw new Error("Current environment does not allow unsafe-eval, please use @pixi/unsafe-eval module to enable support.") + } + , + e.prototype.contextChange = function(t) { + this.gl = t, + this.reset() + } + , + e.prototype.bind = function(t, e) { + t.uniforms.globals = this.renderer.globalUniforms; + var r = t.program + , i = r.glPrograms[this.renderer.CONTEXT_UID] || this.generateShader(t); + return this.shader = t, + this.program !== r && (this.program = r, + this.gl.useProgram(i.program)), + e || (Vd.textureCount = 0, + this.syncUniformGroup(t.uniformGroup, Vd)), + i + } + , + e.prototype.setUniforms = function(t) { + var e = this.shader.program + , r = e.glPrograms[this.renderer.CONTEXT_UID]; + e.syncUniforms(r.uniformData, t, this.renderer) + } + , + e.prototype.syncUniformGroup = function(t, e) { + var r = this.getglProgram(); + t.static && t.dirtyId === r.uniformGroups[t.id] || (r.uniformGroups[t.id] = t.dirtyId, + this.syncUniforms(t, r, e)) + } + , + e.prototype.syncUniforms = function(t, e, r) { + (t.syncUniforms[this.shader.program.id] || this.createSyncGroups(t))(e.uniformData, t.uniforms, this.renderer, r) + } + , + e.prototype.createSyncGroups = function(t) { + var e = this.getSignature(t, this.shader.program.uniformData); + return this.cache[e] || (this.cache[e] = vg(t, this.shader.program.uniformData)), + t.syncUniforms[this.shader.program.id] = this.cache[e], + t.syncUniforms[this.shader.program.id] + } + , + e.prototype.getSignature = function(t, e) { + var r = t.uniforms + , i = []; + for (var o in r) + i.push(o), + e[o] && i.push(e[o].type); + return i.join("-") + } + , + e.prototype.getglProgram = function() { + return this.shader ? this.shader.program.glPrograms[this.renderer.CONTEXT_UID] : null + } + , + e.prototype.generateShader = function(t) { + var e = this.gl + , r = t.program + , i = {}; + for (var o in r.attributeData) + i[o] = r.attributeData[o].location; + var n = Gd(e, r.vertexSrc, r.fragmentSrc, i) + , s = {}; + for (var o in r.uniformData) { + var a = r.uniformData[o]; + s[o] = { + location: e.getUniformLocation(n, o), + value: Hd(a.type, a.size) + } + } + var u = new Kg(n,s); + return r.glPrograms[this.renderer.CONTEXT_UID] = u, + u + } + , + e.prototype.reset = function() { + this.program = null, + this.shader = null + } + , + e.prototype.destroy = function() { + this.destroyed = !0 + } + , + e + }(pa); + function Mg(t, e) { + return void 0 === e && (e = []), + e[K.NORMAL] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.ADD] = [t.ONE, t.ONE], + e[K.MULTIPLY] = [t.DST_COLOR, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.SCREEN] = [t.ONE, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.OVERLAY] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.DARKEN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.LIGHTEN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.COLOR_DODGE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.COLOR_BURN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.HARD_LIGHT] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.SOFT_LIGHT] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.DIFFERENCE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.EXCLUSION] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.HUE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.SATURATION] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.COLOR] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.LUMINOSITY] = [t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.NONE] = [0, 0], + e[K.NORMAL_NPM] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.ADD_NPM] = [t.SRC_ALPHA, t.ONE, t.ONE, t.ONE], + e[K.SCREEN_NPM] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA], + e[K.SRC_IN] = [t.DST_ALPHA, t.ZERO], + e[K.SRC_OUT] = [t.ONE_MINUS_DST_ALPHA, t.ZERO], + e[K.SRC_ATOP] = [t.DST_ALPHA, t.ONE_MINUS_SRC_ALPHA], + e[K.DST_OVER] = [t.ONE_MINUS_DST_ALPHA, t.ONE], + e[K.DST_IN] = [t.ZERO, t.SRC_ALPHA], + e[K.DST_OUT] = [t.ZERO, t.ONE_MINUS_SRC_ALPHA], + e[K.DST_ATOP] = [t.ONE_MINUS_DST_ALPHA, t.SRC_ALPHA], + e[K.XOR] = [t.ONE_MINUS_DST_ALPHA, t.ONE_MINUS_SRC_ALPHA], + e[K.SUBTRACT] = [t.ONE, t.ONE, t.ONE, t.ONE, t.FUNC_REVERSE_SUBTRACT, t.FUNC_ADD], + e + } + var Xd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.gl = null, + r.stateId = 0, + r.polygonOffset = 0, + r.blendMode = K.NONE, + r._blendEq = !1, + r.map = [], + r.checks = [], + r.defaultState = new Fb, + r.defaultState.blend = !0, + r + } + return ba(e, t), + e.prototype.contextChange = function(t) { + this.gl = t, + this.blendModes = Mg(t), + this.set(this.defaultState), + this.reset() + } + , + e.prototype.set = function(t) { + if (t = t || this.defaultState, + this.stateId !== t.data) { + for (var e = this.stateId ^ t.data, r = 0; e; ) + 1 & e && this.map[r].call(this, !!(t.data & 1 << r)), + e >>= 1, + r++; + this.stateId = t.data + } + for (r = 0; r < this.checks.length; r++) + this.checks[r](this, t) + } + , + e.prototype.forceState = function(t) { + t = t || this.defaultState; + for (var e = 0; e < this.map.length; e++) + this.map[e].call(this, !!(t.data & 1 << e)); + for (e = 0; e < this.checks.length; e++) + this.checks[e](this, t); + this.stateId = t.data + } + , + e.prototype.setBlend = function(t) { + this.updateCheck(e.checkBlendMode, t), + this.gl[t ? "enable" : "disable"](this.gl.BLEND) + } + , + e.prototype.setOffset = function(t) { + this.updateCheck(e.checkPolygonOffset, t), + this.gl[t ? "enable" : "disable"](this.gl.POLYGON_OFFSET_FILL) + } + , + e.prototype.setDepthTest = function(t) { + this.gl[t ? "enable" : "disable"](this.gl.DEPTH_TEST) + } + , + e.prototype.setDepthMask = function(t) { + this.gl.depthMask(t) + } + , + e.prototype.setCullFace = function(t) { + this.gl[t ? "enable" : "disable"](this.gl.CULL_FACE) + } + , + e.prototype.setFrontFace = function(t) { + this.gl.frontFace(this.gl[t ? "CW" : "CCW"]) + } + , + e.prototype.setBlendMode = function(t) { + if (t !== this.blendMode) { + this.blendMode = t; + var e = this.blendModes[t] + , r = this.gl; + 2 === e.length ? r.blendFunc(e[0], e[1]) : r.blendFuncSeparate(e[0], e[1], e[2], e[3]), + 6 === e.length ? (this._blendEq = !0, + r.blendEquationSeparate(e[4], e[5])) : this._blendEq && (this._blendEq = !1, + r.blendEquationSeparate(r.FUNC_ADD, r.FUNC_ADD)) + } + } + , + e.prototype.setPolygonOffset = function(t, e) { + this.gl.polygonOffset(t, e) + } + , + e.prototype.reset = function() { + this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, !1), + this.forceState(this.defaultState), + this._blendEq = !0, + this.blendMode = -1, + this.setBlendMode(0) + } + , + e.prototype.updateCheck = function(t, e) { + var r = this.checks.indexOf(t); + e && -1 === r ? this.checks.push(t) : e || -1 === r || this.checks.splice(r, 1) + } + , + e.checkBlendMode = function(t, e) { + t.setBlendMode(e.blendMode) + } + , + e.checkPolygonOffset = function(t, e) { + t.setPolygonOffset(1, e.polygonOffset) + } + , + e + }(pa) + , Yd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.count = 0, + r.checkCount = 0, + r.maxIdle = aa.GC_MAX_IDLE, + r.checkCountMax = aa.GC_MAX_CHECK_COUNT, + r.mode = aa.GC_MODE, + r + } + return ba(e, t), + e.prototype.postrender = function() { + this.renderer.renderingToScreen && (this.count++, + this.mode !== Tc.MANUAL && (this.checkCount++, + this.checkCount > this.checkCountMax && (this.checkCount = 0, + this.run()))) + } + , + e.prototype.run = function() { + for (var t = this.renderer.texture, e = t.managedTextures, r = !1, i = 0; i < e.length; i++) { + var o = e[i]; + !o.framebuffer && this.count - o.touched > this.maxIdle && (t.destroyTexture(o, !0), + e[i] = null, + r = !0) + } + if (r) { + var n = 0; + for (i = 0; i < e.length; i++) + null !== e[i] && (e[n++] = e[i]); + e.length = n + } + } + , + e.prototype.unload = function(t) { + var e = this.renderer.texture + , r = t._texture; + r && !r.framebuffer && e.destroyTexture(r); + for (var i = t.children.length - 1; i >= 0; i--) + this.unload(t.children[i]) + } + , + e + }(pa) + , vc = function() { + return function(t) { + this.texture = t, + this.width = -1, + this.height = -1, + this.dirtyId = -1, + this.dirtyStyleId = -1, + this.mipmap = !1, + this.wrapMode = 33071, + this.type = 6408, + this.internalFormat = 5121 + } + }() + , Zd = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.boundTextures = [], + r.currentLocation = -1, + r.managedTextures = [], + r._unknownBoundTextures = !1, + r.unknownTexture = new ia, + r + } + return ba(e, t), + e.prototype.contextChange = function() { + var t = this.gl = this.renderer.gl; + this.CONTEXT_UID = this.renderer.CONTEXT_UID, + this.webGLVersion = this.renderer.context.webGLVersion; + var e = t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS); + this.boundTextures.length = e; + for (var r = 0; r < e; r++) + this.boundTextures[r] = null; + this.emptyTextures = {}; + var i = new vc(t.createTexture()); + t.bindTexture(t.TEXTURE_2D, i.texture), + t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, 1, 1, 0, t.RGBA, t.UNSIGNED_BYTE, new Uint8Array(4)), + this.emptyTextures[t.TEXTURE_2D] = i, + this.emptyTextures[t.TEXTURE_CUBE_MAP] = new vc(t.createTexture()), + t.bindTexture(t.TEXTURE_CUBE_MAP, this.emptyTextures[t.TEXTURE_CUBE_MAP].texture); + for (r = 0; r < 6; r++) + t.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X + r, 0, t.RGBA, 1, 1, 0, t.RGBA, t.UNSIGNED_BYTE, null); + t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MAG_FILTER, t.LINEAR), + t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MIN_FILTER, t.LINEAR); + for (r = 0; r < this.boundTextures.length; r++) + this.bind(null, r) + } + , + e.prototype.bind = function(t, e) { + void 0 === e && (e = 0); + var r = this.gl; + if (t) { + if ((t = t.castToBaseTexture()).parentTextureArray) + return; + if (t.valid) { + t.touched = this.renderer.textureGC.count; + var i = t._glTextures[this.CONTEXT_UID] || this.initTexture(t); + this.boundTextures[e] !== t && (this.currentLocation !== e && (this.currentLocation = e, + r.activeTexture(r.TEXTURE0 + e)), + r.bindTexture(t.target, i.texture)), + i.dirtyId !== t.dirtyId && (this.currentLocation !== e && (this.currentLocation = e, + r.activeTexture(r.TEXTURE0 + e)), + this.updateTexture(t)), + this.boundTextures[e] = t + } + } else + this.currentLocation !== e && (this.currentLocation = e, + r.activeTexture(r.TEXTURE0 + e)), + r.bindTexture(r.TEXTURE_2D, this.emptyTextures[r.TEXTURE_2D].texture), + this.boundTextures[e] = null + } + , + e.prototype.reset = function() { + this._unknownBoundTextures = !0, + this.currentLocation = -1; + for (var t = 0; t < this.boundTextures.length; t++) + this.boundTextures[t] = this.unknownTexture + } + , + e.prototype.unbind = function(t) { + var e = this.gl + , r = this.boundTextures; + if (this._unknownBoundTextures) { + this._unknownBoundTextures = !1; + for (var i = 0; i < r.length; i++) + r[i] === this.unknownTexture && this.bind(null, i) + } + for (i = 0; i < r.length; i++) + r[i] === t && (this.currentLocation !== i && (e.activeTexture(e.TEXTURE0 + i), + this.currentLocation = i), + e.bindTexture(t.target, this.emptyTextures[t.target].texture), + r[i] = null) + } + , + e.prototype.initTexture = function(t) { + var e = new vc(this.gl.createTexture()); + return e.dirtyId = -1, + t._glTextures[this.CONTEXT_UID] = e, + this.managedTextures.push(t), + t.on("dispose", this.destroyTexture, this), + e + } + , + e.prototype.initTextureType = function(t, e) { + if (e.internalFormat = t.format, + e.type = t.type, + 2 === this.webGLVersion) { + var r = this.renderer.gl; + t.type === r.FLOAT && t.format === r.RGBA && (e.internalFormat = r.RGBA32F), + t.type === ua.HALF_FLOAT && (e.type = r.HALF_FLOAT), + e.type === r.HALF_FLOAT && t.format === r.RGBA && (e.internalFormat = r.RGBA16F) + } + } + , + e.prototype.updateTexture = function(t) { + var e = t._glTextures[this.CONTEXT_UID]; + if (e) { + var r = this.renderer; + if (this.initTextureType(t, e), + t.resource && t.resource.upload(r, t, e)) + ; + else { + var i = t.realWidth + , o = t.realHeight + , n = r.gl; + (e.width !== i || e.height !== o || e.dirtyId < 0) && (e.width = i, + e.height = o, + n.texImage2D(t.target, 0, e.internalFormat, i, o, 0, t.format, e.type, null)) + } + t.dirtyStyleId !== e.dirtyStyleId && this.updateTextureStyle(t), + e.dirtyId = t.dirtyId + } + } + , + e.prototype.destroyTexture = function(t, e) { + var r = this.gl; + if ((t = t.castToBaseTexture())._glTextures[this.CONTEXT_UID] && (this.unbind(t), + r.deleteTexture(t._glTextures[this.CONTEXT_UID].texture), + t.off("dispose", this.destroyTexture, this), + delete t._glTextures[this.CONTEXT_UID], + !e)) { + var i = this.managedTextures.indexOf(t); + -1 !== i && tb(this.managedTextures, i, 1) + } + } + , + e.prototype.updateTextureStyle = function(t) { + var e = t._glTextures[this.CONTEXT_UID]; + e && (t.mipmap !== $a.POW2 && 2 === this.webGLVersion || t.isPowerOfTwo ? e.mipmap = t.mipmap >= 1 : e.mipmap = !1, + 2 === this.webGLVersion || t.isPowerOfTwo ? e.wrapMode = t.wrapMode : e.wrapMode = Rb.CLAMP, + t.resource && t.resource.style(this.renderer, t, e) || this.setStyle(t, e), + e.dirtyStyleId = t.dirtyStyleId) + } + , + e.prototype.setStyle = function(t, e) { + var r = this.gl; + if (e.mipmap && t.mipmap !== $a.ON_MANUAL && r.generateMipmap(t.target), + r.texParameteri(t.target, r.TEXTURE_WRAP_S, e.wrapMode), + r.texParameteri(t.target, r.TEXTURE_WRAP_T, e.wrapMode), + e.mipmap) { + r.texParameteri(t.target, r.TEXTURE_MIN_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR_MIPMAP_LINEAR : r.NEAREST_MIPMAP_NEAREST); + var i = this.renderer.context.extensions.anisotropicFiltering; + if (i && t.anisotropicLevel > 0 && t.scaleMode === Ca.LINEAR) { + var o = Math.min(t.anisotropicLevel, r.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)); + r.texParameterf(t.target, i.TEXTURE_MAX_ANISOTROPY_EXT, o) + } + } else + r.texParameteri(t.target, r.TEXTURE_MIN_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR : r.NEAREST); + r.texParameteri(t.target, r.TEXTURE_MAG_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR : r.NEAREST) + } + , + e + }(pa) + , $d = { + __proto__: null, + FilterSystem: yd, + BatchSystem: Ad, + ContextSystem: Cd, + FramebufferSystem: Dd, + GeometrySystem: Ed, + MaskSystem: Pd, + ScissorSystem: Rd, + StencilSystem: Sd, + ProjectionSystem: Td, + RenderTextureSystem: Ud, + ShaderSystem: Wd, + StateSystem: Xd, + TextureGCSystem: Yd, + TextureSystem: Zd + } + , wc = new la + , Ng = function(t) { + function e(e, r) { + void 0 === e && (e = jb.UNKNOWN); + var i = t.call(this) || this; + return r = Object.assign({}, aa.RENDER_OPTIONS, r), + i.options = r, + i.type = e, + i.screen = new da(0,0,r.width,r.height), + i.view = r.view || document.createElement("canvas"), + i.resolution = r.resolution || aa.RESOLUTION, + i.useContextAlpha = r.useContextAlpha, + i.autoDensity = !!r.autoDensity, + i.preserveDrawingBuffer = r.preserveDrawingBuffer, + i.clearBeforeRender = r.clearBeforeRender, + i._backgroundColor = 0, + i._backgroundColorRgba = [0, 0, 0, 1], + i._backgroundColorString = "#000000", + i.backgroundColor = r.backgroundColor || i._backgroundColor, + i.backgroundAlpha = r.backgroundAlpha, + void 0 !== r.transparent && (Va("6.0.0", "Option transparent is deprecated, please use backgroundAlpha instead."), + i.useContextAlpha = r.transparent, + i.backgroundAlpha = r.transparent ? 0 : 1), + i._lastObjectRendered = null, + i.plugins = {}, + i + } + return ba(e, t), + e.prototype.initPlugins = function(t) { + for (var e in t) + this.plugins[e] = new t[e](this) + } + , + Object.defineProperty(e.prototype, "width", { + get: function() { + return this.view.width + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "height", { + get: function() { + return this.view.height + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.resize = function(t, e) { + this.screen.width = t, + this.screen.height = e, + this.view.width = t * this.resolution, + this.view.height = e * this.resolution, + this.autoDensity && (this.view.style.width = t + "px", + this.view.style.height = e + "px"), + this.emit("resize", t, e) + } + , + e.prototype.generateTexture = function(t, e, r, i) { + 0 === (i = i || t.getLocalBounds(null, !0)).width && (i.width = 1), + 0 === i.height && (i.height = 1); + var o = fc.create({ + width: 0 | i.width, + height: 0 | i.height, + scaleMode: e, + resolution: r + }); + return wc.tx = -i.x, + wc.ty = -i.y, + this.render(t, { + renderTexture: o, + clear: !1, + transform: wc, + skipUpdateTransform: !!t.parent + }), + o + } + , + e.prototype.destroy = function(t) { + for (var e in this.plugins) + this.plugins[e].destroy(), + this.plugins[e] = null; + t && this.view.parentNode && this.view.parentNode.removeChild(this.view); + this.plugins = null, + this.type = jb.UNKNOWN, + this.view = null, + this.screen = null, + this._tempDisplayObjectParent = null, + this.options = null, + this._backgroundColorRgba = null, + this._backgroundColorString = null, + this._lastObjectRendered = null + } + , + Object.defineProperty(e.prototype, "backgroundColor", { + get: function() { + return this._backgroundColor + }, + set: function(t) { + this._backgroundColor = t, + this._backgroundColorString = Mf(t), + Xb(t, this._backgroundColorRgba) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "backgroundAlpha", { + get: function() { + return this._backgroundColorRgba[3] + }, + set: function(t) { + this._backgroundColorRgba[3] = t + }, + enumerable: !1, + configurable: !0 + }), + e + }(rb.d) + , i = function(t) { + function e(r) { + var i = t.call(this, jb.WEBGL, r) || this; + return r = i.options, + i.gl = null, + i.CONTEXT_UID = 0, + i.runners = { + destroy: new ka("destroy"), + contextChange: new ka("contextChange"), + reset: new ka("reset"), + update: new ka("update"), + postrender: new ka("postrender"), + prerender: new ka("prerender"), + resize: new ka("resize") + }, + i.globalUniforms = new Pa({ + projectionMatrix: new la + },!0), + i.addSystem(Pd, "mask").addSystem(Cd, "context").addSystem(Xd, "state").addSystem(Wd, "shader").addSystem(Zd, "texture").addSystem(Ed, "geometry").addSystem(Dd, "framebuffer").addSystem(Rd, "scissor").addSystem(Sd, "stencil").addSystem(Td, "projection").addSystem(Yd, "textureGC").addSystem(yd, "filter").addSystem(Ud, "renderTexture").addSystem(Ad, "batch"), + i.initPlugins(e.__plugins), + r.context ? i.context.initFromContext(r.context) : i.context.initFromOptions({ + alpha: !!i.useContextAlpha, + antialias: r.antialias, + premultipliedAlpha: i.useContextAlpha && "notMultiplied" !== i.useContextAlpha, + stencil: !0, + preserveDrawingBuffer: r.preserveDrawingBuffer, + powerPreference: i.options.powerPreference + }), + i.renderingToScreen = !0, + Kf(2 === i.context.webGLVersion ? "WebGL 2" : "WebGL 1"), + i.resize(i.options.width, i.options.height), + i + } + return ba(e, t), + e.create = function(t) { + if (Lf()) + return new e(t); + throw new Error("WebGL unsupported in this browser, use \"pixi.js-legacy\" for fallback canvas2d support.") + } + , + e.prototype.addSystem = function(t, e) { + e || (e = t.name); + var r = new t(this); + if (this[e]) + throw new Error("Whoops! The name \"" + e + "\" is already in use"); + for (var i in this[e] = r, + this.runners) + this.runners[i].add(r); + return this + } + , + e.prototype.render = function(t, e) { + var r, i, o, n; + if (e && (e instanceof fc ? (Va("6.0.0", "Renderer#render arguments changed, use options instead."), + r = e, + i = arguments[2], + o = arguments[3], + n = arguments[4]) : (r = e.renderTexture, + i = e.clear, + o = e.transform, + n = e.skipUpdateTransform)), + this.renderingToScreen = !r, + this.runners.prerender.emit(), + this.emit("prerender"), + this.projection.transform = o, + !this.context.isLost) { + if (r || (this._lastObjectRendered = t), + !n) { + var s = t.enableTempParent(); + t.updateTransform(), + t.disableTempParent(s) + } + this.renderTexture.bind(r), + this.batch.currentRenderer.start(), + (void 0 !== i ? i : this.clearBeforeRender) && this.renderTexture.clear(), + t.render(this), + this.batch.currentRenderer.flush(), + r && r.baseTexture.update(), + this.runners.postrender.emit(), + this.projection.transform = null, + this.emit("postrender") + } + } + , + e.prototype.resize = function(e, r) { + t.prototype.resize.call(this, e, r), + this.runners.resize.emit(e, r) + } + , + e.prototype.reset = function() { + return this.runners.reset.emit(), + this + } + , + e.prototype.clear = function() { + this.renderTexture.bind(), + this.renderTexture.clear() + } + , + e.prototype.destroy = function(e) { + for (var r in this.runners.destroy.emit(), + this.runners) + this.runners[r].destroy(); + t.prototype.destroy.call(this, e), + this.gl = null + } + , + Object.defineProperty(e.prototype, "extract", { + get: function() { + return Va("6.0.0", "Renderer#extract has been deprecated, please use Renderer#plugins.extract instead."), + this.plugins.extract + }, + enumerable: !1, + configurable: !0 + }), + e.registerPlugin = function(t, r) { + e.__plugins = e.__plugins || {}, + e.__plugins[t] = r + } + , + e + }(Ng); + var xc = function() { + return function() { + this.texArray = null, + this.blend = 0, + this.type = Ba.TRIANGLES, + this.start = 0, + this.size = 0, + this.data = null + } + }() + , yc = function() { + function t() { + this.elements = [], + this.ids = [], + this.count = 0 + } + return t.prototype.clear = function() { + for (var t = 0; t < this.count; t++) + this.elements[t] = null; + this.count = 0 + } + , + t + }() + , Og = function() { + function t(t) { + "number" == typeof t ? this.rawBinaryData = new ArrayBuffer(t) : t instanceof Uint8Array ? this.rawBinaryData = t.buffer : this.rawBinaryData = t, + this.uint32View = new Uint32Array(this.rawBinaryData), + this.float32View = new Float32Array(this.rawBinaryData) + } + return Object.defineProperty(t.prototype, "int8View", { + get: function() { + return this._int8View || (this._int8View = new Int8Array(this.rawBinaryData)), + this._int8View + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "uint8View", { + get: function() { + return this._uint8View || (this._uint8View = new Uint8Array(this.rawBinaryData)), + this._uint8View + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "int16View", { + get: function() { + return this._int16View || (this._int16View = new Int16Array(this.rawBinaryData)), + this._int16View + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "uint16View", { + get: function() { + return this._uint16View || (this._uint16View = new Uint16Array(this.rawBinaryData)), + this._uint16View + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t.prototype, "int32View", { + get: function() { + return this._int32View || (this._int32View = new Int32Array(this.rawBinaryData)), + this._int32View + }, + enumerable: !1, + configurable: !0 + }), + t.prototype.view = function(t) { + return this[t + "View"] + } + , + t.prototype.destroy = function() { + this.rawBinaryData = null, + this._int8View = null, + this._uint8View = null, + this._int16View = null, + this._uint16View = null, + this._int32View = null, + this.uint32View = null, + this.float32View = null + } + , + t.sizeOf = function(t) { + switch (t) { + case "int8": + case "uint8": + return 1; + case "int16": + case "uint16": + return 2; + case "int32": + case "uint32": + case "float32": + return 4; + default: + throw new Error(t + " isn't a valid view type"); + } + } + , + t + }() + , Pg = function(t) { + function e(e) { + var r = t.call(this, e) || this; + return r.shaderGenerator = null, + r.geometryClass = null, + r.vertexSize = null, + r.state = Fb.for2d(), + r.size = 4 * aa.SPRITE_BATCH_SIZE, + r._vertexCount = 0, + r._indexCount = 0, + r._bufferedElements = [], + r._bufferedTextures = [], + r._bufferSize = 0, + r._shader = null, + r._packedGeometries = [], + r._packedGeometryPoolSize = 2, + r._flushId = 0, + r._aBuffers = {}, + r._iBuffers = {}, + r.MAX_TEXTURES = 1, + r.renderer.on("prerender", r.onPrerender, r), + e.runners.contextChange.add(r), + r._dcIndex = 0, + r._aIndex = 0, + r._iIndex = 0, + r._attributeBuffer = null, + r._indexBuffer = null, + r._tempBoundTextures = [], + r + } + return ba(e, t), + e.prototype.contextChange = function() { + var t = this.renderer.gl; + aa.PREFER_ENV === Aa.WEBGL_LEGACY ? this.MAX_TEXTURES = 1 : (this.MAX_TEXTURES = Math.min(t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS), aa.SPRITE_MAX_TEXTURES), + this.MAX_TEXTURES = yg(this.MAX_TEXTURES, t)), + this._shader = this.shaderGenerator.generateShader(this.MAX_TEXTURES); + for (var e = 0; e < this._packedGeometryPoolSize; e++) + this._packedGeometries[e] = new this.geometryClass; + this.initFlushBuffers() + } + , + e.prototype.initFlushBuffers = function() { + for (var t = e._drawCallPool, r = e._textureArrayPool, i = this.size / 4, o = Math.floor(i / this.MAX_TEXTURES) + 1; t.length < i; ) + t.push(new xc); + for (; r.length < o; ) + r.push(new yc); + for (var n = 0; n < this.MAX_TEXTURES; n++) + this._tempBoundTextures[n] = null + } + , + e.prototype.onPrerender = function() { + this._flushId = 0 + } + , + e.prototype.render = function(t) { + t._texture.valid && (this._vertexCount + t.vertexData.length / 2 > this.size && this.flush(), + this._vertexCount += t.vertexData.length / 2, + this._indexCount += t.indices.length, + this._bufferedTextures[this._bufferSize] = t._texture.baseTexture, + this._bufferedElements[this._bufferSize++] = t) + } + , + e.prototype.buildTexturesAndDrawCalls = function() { + var t = this._bufferedTextures + , r = this.MAX_TEXTURES + , i = e._textureArrayPool + , o = this.renderer.batch + , n = this._tempBoundTextures + , s = this.renderer.textureGC.count + , a = ++ia._globalBatch + , u = 0 + , h = i[0] + , $ = 0; + o.copyBoundTextures(n, r); + for (var p = 0; p < this._bufferSize; ++p) { + var l = t[p]; + t[p] = null, + l._batchEnabled !== a && (h.count >= r && (o.boundArray(h, n, a, r), + this.buildDrawCalls(h, $, p), + $ = p, + h = i[++u], + ++a), + l._batchEnabled = a, + l.touched = s, + h.elements[h.count++] = l) + } + h.count > 0 && (o.boundArray(h, n, a, r), + this.buildDrawCalls(h, $, this._bufferSize), + ++u, + ++a); + for (p = 0; p < n.length; p++) + n[p] = null; + ia._globalBatch = a + } + , + e.prototype.buildDrawCalls = function(t, r, i) { + var o = this._bufferedElements + , n = this._attributeBuffer + , s = this._indexBuffer + , a = this.vertexSize + , u = e._drawCallPool + , h = this._dcIndex + , $ = this._aIndex + , p = this._iIndex + , l = u[h]; + l.start = this._iIndex, + l.texArray = t; + for (var c = r; c < i; ++c) { + var d = o[c] + , f = d._texture.baseTexture + , m = Of[f.alphaMode ? 1 : 0][d.blendMode]; + o[c] = null, + r < c && l.blend !== m && (l.size = p - l.start, + r = c, + (l = u[++h]).texArray = t, + l.start = p), + this.packInterleavedGeometry(d, n, s, $, p), + $ += d.vertexData.length / 2 * a, + p += d.indices.length, + l.blend = m + } + r < i && (l.size = p - l.start, + ++h), + this._dcIndex = h, + this._aIndex = $, + this._iIndex = p + } + , + e.prototype.bindAndClearTexArray = function(t) { + for (var e = this.renderer.texture, r = 0; r < t.count; r++) + e.bind(t.elements[r], t.ids[r]), + t.elements[r] = null; + t.count = 0 + } + , + e.prototype.updateGeometry = function() { + var t = this._packedGeometries + , e = this._attributeBuffer + , r = this._indexBuffer; + aa.CAN_UPLOAD_SAME_BUFFER ? (t[this._flushId]._buffer.update(e.rawBinaryData), + t[this._flushId]._indexBuffer.update(r), + this.renderer.geometry.updateBuffers()) : (this._packedGeometryPoolSize <= this._flushId && (this._packedGeometryPoolSize++, + t[this._flushId] = new this.geometryClass), + t[this._flushId]._buffer.update(e.rawBinaryData), + t[this._flushId]._indexBuffer.update(r), + this.renderer.geometry.bind(t[this._flushId]), + this.renderer.geometry.updateBuffers(), + this._flushId++) + } + , + e.prototype.drawBatches = function() { + for (var t = this._dcIndex, r = this.renderer, i = r.gl, o = r.state, n = e._drawCallPool, s = null, a = 0; a < t; a++) { + var u = n[a] + , h = u.texArray + , $ = u.type + , p = u.size + , l = u.start + , c = u.blend; + s !== h && (s = h, + this.bindAndClearTexArray(h)), + this.state.blendMode = c, + o.set(this.state), + i.drawElements($, p, i.UNSIGNED_SHORT, 2 * l) + } + } + , + e.prototype.flush = function() { + 0 !== this._vertexCount && (this._attributeBuffer = this.getAttributeBuffer(this._vertexCount), + this._indexBuffer = this.getIndexBuffer(this._indexCount), + this._aIndex = 0, + this._iIndex = 0, + this._dcIndex = 0, + this.buildTexturesAndDrawCalls(), + this.updateGeometry(), + this.drawBatches(), + this._bufferSize = 0, + this._vertexCount = 0, + this._indexCount = 0) + } + , + e.prototype.start = function() { + this.renderer.state.set(this.state), + this.renderer.shader.bind(this._shader), + aa.CAN_UPLOAD_SAME_BUFFER && this.renderer.geometry.bind(this._packedGeometries[this._flushId]) + } + , + e.prototype.stop = function() { + this.flush() + } + , + e.prototype.destroy = function() { + for (var e = 0; e < this._packedGeometryPoolSize; e++) + this._packedGeometries[e] && this._packedGeometries[e].destroy(); + this.renderer.off("prerender", this.onPrerender, this), + this._aBuffers = null, + this._iBuffers = null, + this._packedGeometries = null, + this._attributeBuffer = null, + this._indexBuffer = null, + this._shader && (this._shader.destroy(), + this._shader = null), + t.prototype.destroy.call(this) + } + , + e.prototype.getAttributeBuffer = function(t) { + var e = sb(Math.ceil(t / 8)) + , r = hd(e) + , i = 8 * e; + this._aBuffers.length <= r && (this._iBuffers.length = r + 1); + var o = this._aBuffers[i]; + return o || (this._aBuffers[i] = o = new Og(i * this.vertexSize * 4)), + o + } + , + e.prototype.getIndexBuffer = function(t) { + var e = sb(Math.ceil(t / 12)) + , r = hd(e) + , i = 12 * e; + this._iBuffers.length <= r && (this._iBuffers.length = r + 1); + var o = this._iBuffers[r]; + return o || (this._iBuffers[r] = o = new Uint16Array(i)), + o + } + , + e.prototype.packInterleavedGeometry = function(t, e, r, i, o) { + for (var n = e.uint32View, s = e.float32View, a = i / this.vertexSize, u = t.uvs, h = t.indices, $ = t.vertexData, p = t._texture.baseTexture._batchLocation, l = Math.min(t.worldAlpha, 1), c = l < 1 && t._texture.baseTexture.alphaMode ? fd(t._tintRGB, l) : t._tintRGB + (255 * l << 24), d = 0; d < $.length; d += 2) + s[i++] = $[d], + s[i++] = $[d + 1], + s[i++] = u[d], + s[i++] = u[d + 1], + n[i++] = c, + s[i++] = p; + for (d = 0; d < h.length; d++) + r[o++] = a + h[d] + } + , + e._drawCallPool = [], + e._textureArrayPool = [], + e + }(zd) + , Qg = function() { + function t(t, e) { + if (this.vertexSrc = t, + this.fragTemplate = e, + this.programCache = {}, + this.defaultGroupCache = {}, + e.indexOf("%count%") < 0) + throw new Error("Fragment template must contain \"%count%\"."); + if (e.indexOf("%forloop%") < 0) + throw new Error("Fragment template must contain \"%forloop%\".") + } + return t.prototype.generateShader = function(t) { + if (!this.programCache[t]) { + for (var e = new Int32Array(t), r = 0; r < t; r++) + e[r] = r; + this.defaultGroupCache[t] = Pa.from({ + uSamplers: e + }, !0); + var i = this.fragTemplate; + i = (i = i.replace(/%count%/gi, "" + t)).replace(/%forloop%/gi, this.generateSampleSrc(t)), + this.programCache[t] = new nc(this.vertexSrc,i) + } + var o = { + tint: new Float32Array([1, 1, 1, 1]), + translationMatrix: new la, + default: this.defaultGroupCache[t] + }; + return new oc(this.programCache[t],o) + } + , + t.prototype.generateSampleSrc = function(t) { + var e = ""; + e += "\n", + e += "\n"; + for (var r = 0; r < t; r++) + r > 0 && (e += "\nelse "), + r < t - 1 && (e += "if(vTextureId < " + r + ".5)"), + e += "\n{", + e += "\n\tcolor = texture2D(uSamplers[" + r + "], vTextureCoord);", + e += "\n}"; + return e += "\n", + e += "\n" + } + , + t + }() + , _d = function(t) { + function e(e) { + void 0 === e && (e = !1); + var r = t.call(this) || this; + return r._buffer = new ta(null,e,!1), + r._indexBuffer = new ta(null,e,!0), + r.addAttribute("aVertexPosition", r._buffer, 2, !1, ua.FLOAT).addAttribute("aTextureCoord", r._buffer, 2, !1, ua.FLOAT).addAttribute("aColor", r._buffer, 4, !0, ua.UNSIGNED_BYTE).addAttribute("aTextureId", r._buffer, 1, !0, ua.FLOAT).addIndex(r._indexBuffer), + r + } + return ba(e, t), + e + }(gc) + , ae = "precision highp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform vec4 tint;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = aColor * tint;\n}\n" + , be = "varying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\nuniform sampler2D uSamplers[%count%];\n\nvoid main(void){\n vec4 color;\n %forloop%\n gl_FragColor = color * vColor;\n}\n" + , Rg = function() { + function t() {} + return t.create = function(t) { + var e = Object.assign({ + vertex: ae, + fragment: be, + geometryClass: _d, + vertexSize: 6 + }, t) + , r = e.vertex + , i = e.fragment + , o = e.vertexSize + , n = e.geometryClass; + return function(t) { + function e(e) { + var s = t.call(this, e) || this; + return s.shaderGenerator = new Qg(r,i), + s.geometryClass = n, + s.vertexSize = o, + s + } + return ba(e, t), + e + }(Pg) + } + , + Object.defineProperty(t, "defaultVertexSrc", { + get: function() { + return ae + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(t, "defaultFragmentTemplate", { + get: function() { + return be + }, + enumerable: !1, + configurable: !0 + }), + t + }() + , j = Rg.create() + , Sg = {} + , Tg = function(t) { + Object.defineProperty(Sg, t, { + get: function() { + return Va("6.0.0", "PIXI.systems." + t + " has moved to PIXI." + t), + rd[t] + } + }) + }; + for (var ce in rd) + Tg(ce); + var Ug = {} + , Vg = function(t) { + Object.defineProperty(Ug, t, { + get: function() { + return Va("6.0.0", "PIXI.resources." + t + " has moved to PIXI." + t), + $d[t] + } + }) + }; + for (var ce in $d) + Vg(ce); + aa.SORTABLE_CHILDREN = !1; + var Gb = function() { + function t() { + this.minX = 1 / 0, + this.minY = 1 / 0, + this.maxX = -1 / 0, + this.maxY = -1 / 0, + this.rect = null, + this.updateID = -1 + } + return t.prototype.isEmpty = function() { + return this.minX > this.maxX || this.minY > this.maxY + } + , + t.prototype.clear = function() { + this.minX = 1 / 0, + this.minY = 1 / 0, + this.maxX = -1 / 0, + this.maxY = -1 / 0 + } + , + t.prototype.getRectangle = function(t) { + return this.minX > this.maxX || this.minY > this.maxY ? da.EMPTY : ((t = t || new da(0,0,1,1)).x = this.minX, + t.y = this.minY, + t.width = this.maxX - this.minX, + t.height = this.maxY - this.minY, + t) + } + , + t.prototype.addPoint = function(t) { + this.minX = Math.min(this.minX, t.x), + this.maxX = Math.max(this.maxX, t.x), + this.minY = Math.min(this.minY, t.y), + this.maxY = Math.max(this.maxY, t.y) + } + , + t.prototype.addPointMatrix = function(t, e) { + var i = t.a + , r = t.b + , n = t.c + , s = t.d + , o = t.tx + , a = t.ty + , h = i * e.x + n * e.y + o + , l = r * e.x + s * e.y + a; + this.minX = Math.min(this.minX, h), + this.maxX = Math.max(this.maxX, h), + this.minY = Math.min(this.minY, l), + this.maxY = Math.max(this.maxY, l) + } + , + t.prototype.addQuad = function(t) { + var e = this.minX + , i = this.minY + , r = this.maxX + , n = this.maxY + , s = t[0] + , o = t[1]; + e = s < e ? s : e, + i = o < i ? o : i, + r = s > r ? s : r, + n = o > n ? o : n, + e = (s = t[2]) < e ? s : e, + i = (o = t[3]) < i ? o : i, + r = s > r ? s : r, + n = o > n ? o : n, + e = (s = t[4]) < e ? s : e, + i = (o = t[5]) < i ? o : i, + r = s > r ? s : r, + n = o > n ? o : n, + e = (s = t[6]) < e ? s : e, + i = (o = t[7]) < i ? o : i, + r = s > r ? s : r, + n = o > n ? o : n, + this.minX = e, + this.minY = i, + this.maxX = r, + this.maxY = n + } + , + t.prototype.addFrame = function(t, e, i, r, n) { + this.addFrameMatrix(t.worldTransform, e, i, r, n) + } + , + t.prototype.addFrameMatrix = function(t, e, i, r, n) { + var s = t.a + , o = t.b + , a = t.c + , h = t.d + , l = t.tx + , d = t.ty + , p = this.minX + , m = this.minY + , u = this.maxX + , c = this.maxY + , f = s * e + a * i + l + , y = o * e + h * i + d; + p = f < p ? f : p, + m = y < m ? y : m, + u = f > u ? f : u, + c = y > c ? y : c, + p = (f = s * r + a * i + l) < p ? f : p, + m = (y = o * r + h * i + d) < m ? y : m, + u = f > u ? f : u, + c = y > c ? y : c, + p = (f = s * e + a * n + l) < p ? f : p, + m = (y = o * e + h * n + d) < m ? y : m, + u = f > u ? f : u, + c = y > c ? y : c, + p = (f = s * r + a * n + l) < p ? f : p, + m = (y = o * r + h * n + d) < m ? y : m, + u = f > u ? f : u, + c = y > c ? y : c, + this.minX = p, + this.minY = m, + this.maxX = u, + this.maxY = c + } + , + t.prototype.addVertexData = function(t, e, i) { + for (var r = this.minX, n = this.minY, s = this.maxX, o = this.maxY, a = e; a < i; a += 2) { + var h = t[a] + , l = t[a + 1]; + r = h < r ? h : r, + n = l < n ? l : n, + s = h > s ? h : s, + o = l > o ? l : o + } + this.minX = r, + this.minY = n, + this.maxX = s, + this.maxY = o + } + , + t.prototype.addVertices = function(t, e, i, r) { + this.addVerticesMatrix(t.worldTransform, e, i, r) + } + , + t.prototype.addVerticesMatrix = function(t, e, i, r, n, s) { + void 0 === n && (n = 0), + void 0 === s && (s = n); + for (var o = t.a, a = t.b, h = t.c, l = t.d, d = t.tx, p = t.ty, m = this.minX, u = this.minY, c = this.maxX, f = this.maxY, y = i; y < r; y += 2) { + var x = e[y] + , b = e[y + 1] + , $ = o * x + h * b + d + , v = l * b + a * x + p; + m = Math.min(m, $ - n), + c = Math.max(c, $ + n), + u = Math.min(u, v - s), + f = Math.max(f, v + s) + } + this.minX = m, + this.minY = u, + this.maxX = c, + this.maxY = f + } + , + t.prototype.addBounds = function(t) { + var e = this.minX + , i = this.minY + , r = this.maxX + , n = this.maxY; + this.minX = t.minX < e ? t.minX : e, + this.minY = t.minY < i ? t.minY : i, + this.maxX = t.maxX > r ? t.maxX : r, + this.maxY = t.maxY > n ? t.maxY : n + } + , + t.prototype.addBoundsMask = function(t, e) { + var i = t.minX > e.minX ? t.minX : e.minX + , r = t.minY > e.minY ? t.minY : e.minY + , n = t.maxX < e.maxX ? t.maxX : e.maxX + , s = t.maxY < e.maxY ? t.maxY : e.maxY; + if (i <= n && r <= s) { + var o = this.minX + , a = this.minY + , h = this.maxX + , l = this.maxY; + this.minX = i < o ? i : o, + this.minY = r < a ? r : a, + this.maxX = n > h ? n : h, + this.maxY = s > l ? s : l + } + } + , + t.prototype.addBoundsMatrix = function(t, e) { + this.addFrameMatrix(e, t.minX, t.minY, t.maxX, t.maxY) + } + , + t.prototype.addBoundsArea = function(t, e) { + var i = t.minX > e.x ? t.minX : e.x + , r = t.minY > e.y ? t.minY : e.y + , n = t.maxX < e.x + e.width ? t.maxX : e.x + e.width + , s = t.maxY < e.y + e.height ? t.maxY : e.y + e.height; + if (i <= n && r <= s) { + var o = this.minX + , a = this.minY + , h = this.maxX + , l = this.maxY; + this.minX = i < o ? i : o, + this.minY = r < a ? r : a, + this.maxX = n > h ? n : h, + this.maxY = s > l ? s : l + } + } + , + t.prototype.pad = function(t, e) { + void 0 === t && (t = 0), + void 0 === e && (e = t), + this.isEmpty() || (this.minX -= t, + this.maxX += t, + this.minY -= e, + this.maxY += e) + } + , + t.prototype.addFramePad = function(t, e, i, r, n, s) { + t -= n, + e -= s, + i += n, + r += s, + this.minX = this.minX < t ? this.minX : t, + this.maxX = this.maxX > i ? this.maxX : i, + this.minY = this.minY < e ? this.minY : e, + this.maxY = this.maxY > r ? this.maxY : r + } + , + t + }() + , Wg = function(t, e) { + return (Wg = 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 zc(t, e) { + function i() { + this.constructor = t + } + Wg(t, e), + t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, + new i) + } + var Hb = function(t) { + function e() { + var e = t.call(this) || this; + return e.tempDisplayObjectParent = null, + e.transform = new Zf, + e.alpha = 1, + e.visible = !0, + e.renderable = !0, + e.parent = null, + e.worldAlpha = 1, + e._lastSortedIndex = 0, + e._zIndex = 0, + e.filterArea = null, + e.filters = null, + e._enabledFilters = null, + e._bounds = new Gb, + e._localBounds = null, + e._boundsID = 0, + e._boundsRect = null, + e._localBoundsRect = null, + e._mask = null, + e._destroyed = !1, + e.isSprite = !1, + e.isMask = !1, + e + } + return zc(e, t), + e.mixin = function(t) { + for (var i = Object.keys(t), r = 0; r < i.length; ++r) { + var n = i[r]; + Object.defineProperty(e.prototype, n, Object.getOwnPropertyDescriptor(t, n)) + } + } + , + e.prototype._recursivePostUpdateTransform = function() { + this.parent ? (this.parent._recursivePostUpdateTransform(), + this.transform.updateTransform(this.parent.transform)) : this.transform.updateTransform(this._tempDisplayObjectParent.transform) + } + , + e.prototype.updateTransform = function() { + this._boundsID++, + this.transform.updateTransform(this.parent.transform), + this.worldAlpha = this.alpha * this.parent.worldAlpha + } + , + e.prototype.getBounds = function(t, e) { + return t || (this.parent ? (this._recursivePostUpdateTransform(), + this.updateTransform()) : (this.parent = this._tempDisplayObjectParent, + this.updateTransform(), + this.parent = null)), + this._bounds.updateID !== this._boundsID && (this.calculateBounds(), + this._bounds.updateID = this._boundsID), + e || (this._boundsRect || (this._boundsRect = new da), + e = this._boundsRect), + this._bounds.getRectangle(e) + } + , + e.prototype.getLocalBounds = function(t) { + t || (this._localBoundsRect || (this._localBoundsRect = new da), + t = this._localBoundsRect), + this._localBounds || (this._localBounds = new Gb); + var e = this.transform + , i = this.parent; + this.parent = null, + this.transform = this._tempDisplayObjectParent.transform; + var r = this._bounds + , n = this._boundsID; + this._bounds = this._localBounds; + var s = this.getBounds(!1, t); + return this.parent = i, + this.transform = e, + this._bounds = r, + this._bounds.updateID += this._boundsID - n, + s + } + , + e.prototype.toGlobal = function(t, e, i) { + return void 0 === i && (i = !1), + i || (this._recursivePostUpdateTransform(), + this.parent ? this.displayObjectUpdateTransform() : (this.parent = this._tempDisplayObjectParent, + this.displayObjectUpdateTransform(), + this.parent = null)), + this.worldTransform.apply(t, e) + } + , + e.prototype.toLocal = function(t, e, i, r) { + return e && (t = e.toGlobal(t, i, r)), + r || (this._recursivePostUpdateTransform(), + this.parent ? this.displayObjectUpdateTransform() : (this.parent = this._tempDisplayObjectParent, + this.displayObjectUpdateTransform(), + this.parent = null)), + this.worldTransform.applyInverse(t, i) + } + , + e.prototype.setParent = function(t) { + if (!t || !t.addChild) + throw new Error("setParent: Argument must be a Container"); + return t.addChild(this), + t + } + , + e.prototype.setTransform = function(t, e, i, r, n, s, o, a, h) { + return void 0 === t && (t = 0), + void 0 === e && (e = 0), + void 0 === i && (i = 1), + void 0 === r && (r = 1), + void 0 === n && (n = 0), + void 0 === s && (s = 0), + void 0 === o && (o = 0), + void 0 === a && (a = 0), + void 0 === h && (h = 0), + this.position.x = t, + this.position.y = e, + this.scale.x = i || 1, + this.scale.y = r || 1, + this.rotation = n, + this.skew.x = s, + this.skew.y = o, + this.pivot.x = a, + this.pivot.y = h, + this + } + , + e.prototype.destroy = function(t) { + this.parent && this.parent.removeChild(this), + this.removeAllListeners(), + this.transform = null, + this.parent = null, + this._bounds = null, + this._mask = null, + this.filters = null, + this.filterArea = null, + this.hitArea = null, + this.interactive = !1, + this.interactiveChildren = !1, + this._destroyed = !0 + } + , + Object.defineProperty(e.prototype, "_tempDisplayObjectParent", { + get: function() { + return null === this.tempDisplayObjectParent && (this.tempDisplayObjectParent = new Xg), + this.tempDisplayObjectParent + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.enableTempParent = function() { + var t = this.parent; + return this.parent = this._tempDisplayObjectParent, + t + } + , + e.prototype.disableTempParent = function(t) { + this.parent = t + } + , + Object.defineProperty(e.prototype, "x", { + get: function() { + return this.position.x + }, + set: function(t) { + this.transform.position.x = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "y", { + get: function() { + return this.position.y + }, + set: function(t) { + this.transform.position.y = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "worldTransform", { + get: function() { + return this.transform.worldTransform + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "localTransform", { + get: function() { + return this.transform.localTransform + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "position", { + get: function() { + return this.transform.position + }, + set: function(t) { + this.transform.position.copyFrom(t) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "scale", { + get: function() { + return this.transform.scale + }, + set: function(t) { + this.transform.scale.copyFrom(t) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "pivot", { + get: function() { + return this.transform.pivot + }, + set: function(t) { + this.transform.pivot.copyFrom(t) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "skew", { + get: function() { + return this.transform.skew + }, + set: function(t) { + this.transform.skew.copyFrom(t) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "rotation", { + get: function() { + return this.transform.rotation + }, + set: function(t) { + this.transform.rotation = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "angle", { + get: function() { + return this.transform.rotation * Tf + }, + set: function(t) { + this.transform.rotation = t * Uf + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "zIndex", { + get: function() { + return this._zIndex + }, + set: function(t) { + this._zIndex = t, + this.parent && (this.parent.sortDirty = !0) + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "worldVisible", { + get: function() { + var t = this; + do { + if (!t.visible) + return !1; + t = t.parent + } while (t); + return !0 + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "mask", { + get: function() { + return this._mask + }, + set: function(t) { + var e; + this._mask && ((e = this._mask.maskObject || this._mask).renderable = !0, + e.isMask = !1); + (this._mask = t, + this._mask) && ((e = this._mask.maskObject || this._mask).renderable = !1, + e.isMask = !0) + }, + enumerable: !1, + configurable: !0 + }), + e + }(rb.d) + , Xg = function(t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.sortDirty = null, + e + } + return zc(e, t), + e + }(Hb); + function Yg(t, e) { + return t.zIndex === e.zIndex ? t._lastSortedIndex - e._lastSortedIndex : t.zIndex - e.zIndex + } + Hb.prototype.displayObjectUpdateTransform = Hb.prototype.updateTransform; + var Ac = function(t) { + function e() { + var e = t.call(this) || this; + return e.children = [], + e.sortableChildren = aa.SORTABLE_CHILDREN, + e.sortDirty = !1, + e + } + return zc(e, t), + e.prototype.onChildrenChange = function(t) {} + , + e.prototype.addChild = function() { + for (var t = arguments, e = [], i = 0; i < arguments.length; i++) + e[i] = t[i]; + if (e.length > 1) + for (var r = 0; r < e.length; r++) + this.addChild(e[r]); + else { + var n = e[0]; + n.parent && n.parent.removeChild(n), + n.parent = this, + this.sortDirty = !0, + n.transform._parentID = -1, + this.children.push(n), + this._boundsID++, + this.onChildrenChange(this.children.length - 1), + this.emit("childAdded", n, this, this.children.length - 1), + n.emit("added", this) + } + return e[0] + } + , + e.prototype.addChildAt = function(t, e) { + if (e < 0 || e > this.children.length) + throw new Error(t + "addChildAt: The index " + e + " supplied is out of bounds " + this.children.length); + return t.parent && t.parent.removeChild(t), + t.parent = this, + this.sortDirty = !0, + t.transform._parentID = -1, + this.children.splice(e, 0, t), + this._boundsID++, + this.onChildrenChange(e), + t.emit("added", this), + this.emit("childAdded", t, this, e), + t + } + , + e.prototype.swapChildren = function(t, e) { + if (t !== e) { + var i = this.getChildIndex(t) + , r = this.getChildIndex(e); + this.children[i] = e, + this.children[r] = t, + this.onChildrenChange(i < r ? i : r) + } + } + , + e.prototype.getChildIndex = function(t) { + var e = this.children.indexOf(t); + if (-1 === e) + throw new Error("The supplied DisplayObject must be a child of the caller"); + return e + } + , + e.prototype.setChildIndex = function(t, e) { + if (e < 0 || e >= this.children.length) + throw new Error("The index " + e + " supplied is out of bounds " + this.children.length); + var i = this.getChildIndex(t); + tb(this.children, i, 1), + this.children.splice(e, 0, t), + this.onChildrenChange(e) + } + , + e.prototype.getChildAt = function(t) { + if (t < 0 || t >= this.children.length) + throw new Error("getChildAt: Index (" + t + ") does not exist."); + return this.children[t] + } + , + e.prototype.removeChild = function() { + for (var t = arguments, e = [], i = 0; i < arguments.length; i++) + e[i] = t[i]; + if (e.length > 1) + for (var r = 0; r < e.length; r++) + this.removeChild(e[r]); + else { + var n = e[0] + , s = this.children.indexOf(n); + if (-1 === s) + return null; + n.parent = null, + n.transform._parentID = -1, + tb(this.children, s, 1), + this._boundsID++, + this.onChildrenChange(s), + n.emit("removed", this), + this.emit("childRemoved", n, this, s) + } + return e[0] + } + , + e.prototype.removeChildAt = function(t) { + var e = this.getChildAt(t); + return e.parent = null, + e.transform._parentID = -1, + tb(this.children, t, 1), + this._boundsID++, + this.onChildrenChange(t), + e.emit("removed", this), + this.emit("childRemoved", e, this, t), + e + } + , + e.prototype.removeChildren = function(t, e) { + void 0 === t && (t = 0), + void 0 === e && (e = this.children.length); + var i, r = t, n = e - r; + if (n > 0 && n <= e) { + i = this.children.splice(r, n); + for (var s = 0; s < i.length; ++s) + i[s].parent = null, + i[s].transform && (i[s].transform._parentID = -1); + this._boundsID++, + this.onChildrenChange(t); + for (s = 0; s < i.length; ++s) + i[s].emit("removed", this), + this.emit("childRemoved", i[s], this, s); + return i + } + if (0 === n && 0 === this.children.length) + return []; + throw new RangeError("removeChildren: numeric values are outside the acceptable range.") + } + , + e.prototype.sortChildren = function() { + for (var t = !1, e = 0, i = this.children.length; e < i; ++e) { + var r = this.children[e]; + r._lastSortedIndex = e, + t || 0 === r.zIndex || (t = !0) + } + t && this.children.length > 1 && this.children.sort(Yg), + this.sortDirty = !1 + } + , + e.prototype.updateTransform = function() { + this.sortableChildren && this.sortDirty && this.sortChildren(), + this._boundsID++, + this.transform.updateTransform(this.parent.transform), + this.worldAlpha = this.alpha * this.parent.worldAlpha; + for (var t = 0, e = this.children.length; t < e; ++t) { + var i = this.children[t]; + i.visible && i.updateTransform() + } + } + , + e.prototype.calculateBounds = function() { + this._bounds.clear(), + this._calculateBounds(); + for (var t = 0; t < this.children.length; t++) { + var e = this.children[t]; + if (e.visible && e.renderable) + if (e.calculateBounds(), + e._mask) { + var i = e._mask.maskObject || e._mask; + i.calculateBounds(), + this._bounds.addBoundsMask(e._bounds, i._bounds) + } else + e.filterArea ? this._bounds.addBoundsArea(e._bounds, e.filterArea) : this._bounds.addBounds(e._bounds) + } + this._bounds.updateID = this._boundsID + } + , + e.prototype.getLocalBounds = function(e, i) { + void 0 === i && (i = !1); + var r = t.prototype.getLocalBounds.call(this, e); + if (!i) + for (var n = 0, s = this.children.length; n < s; ++n) { + var o = this.children[n]; + o.visible && o.updateTransform() + } + return r + } + , + e.prototype._calculateBounds = function() {} + , + e.prototype.render = function(t) { + if (this.visible && !(this.worldAlpha <= 0) && this.renderable) + if (this._mask || this.filters && this.filters.length) + this.renderAdvanced(t); + else { + this._render(t); + for (var e = 0, i = this.children.length; e < i; ++e) + this.children[e].render(t) + } + } + , + e.prototype.renderAdvanced = function(t) { + t.batch.flush(); + var e = this.filters + , i = this._mask; + if (e) { + this._enabledFilters || (this._enabledFilters = []), + this._enabledFilters.length = 0; + for (var r = 0; r < e.length; r++) + e[r].enabled && this._enabledFilters.push(e[r]); + this._enabledFilters.length && t.filter.push(this, this._enabledFilters) + } + i && t.mask.push(this, this._mask), + this._render(t); + r = 0; + for (var n = this.children.length; r < n; r++) + this.children[r].render(t); + t.batch.flush(), + i && t.mask.pop(this), + e && this._enabledFilters && this._enabledFilters.length && t.filter.pop() + } + , + e.prototype._render = function(t) {} + , + e.prototype.destroy = function(e) { + t.prototype.destroy.call(this), + this.sortDirty = !1; + var i = "boolean" == typeof e ? e : e && e.children + , r = this.removeChildren(0, this.children.length); + if (i) + for (var n = 0; n < r.length; ++n) + r[n].destroy(e) + } + , + Object.defineProperty(e.prototype, "width", { + get: function() { + return this.scale.x * this.getLocalBounds().width + }, + set: function(t) { + var e = this.getLocalBounds().width; + this.scale.x = 0 !== e ? t / e : 1, + this._width = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "height", { + get: function() { + return this.scale.y * this.getLocalBounds().height + }, + set: function(t) { + var e = this.getLocalBounds().height; + this.scale.y = 0 !== e ? t / e : 1, + this._height = t + }, + enumerable: !1, + configurable: !0 + }), + e + }(Hb); + Ac.prototype.containerUpdateTransform = Ac.prototype.updateTransform; + (function(t) { + t.MITER = "miter", + t.BEVEL = "bevel", + t.ROUND = "round" + } + )(Fa || (ve = Fa = {}, + ve)), + function(t) { + t.BUTT = "butt", + t.ROUND = "round", + t.SQUARE = "square" + }(Ga || (ue = Ga = {}, + ue)); + var gb = { + adaptive: !0, + maxLength: 10, + minSegments: 8, + maxSegments: 2048, + epsilon: 1e-4, + _segmentsCount: function(t, e) { + if (void 0 === e && (e = 20), + !this.adaptive || !t || isNaN(t)) + return e; + var r = Math.ceil(t / this.maxLength); + return r < this.minSegments ? r = this.minSegments : r > this.maxSegments && (r = this.maxSegments), + r + } + } + , de = function() { + function t() { + this.color = 16777215, + this.alpha = 1, + this.texture = oa.WHITE, + this.matrix = null, + this.visible = !1, + this.reset() + } + return t.prototype.clone = function() { + var e = new t; + return e.color = this.color, + e.alpha = this.alpha, + e.texture = this.texture, + e.matrix = this.matrix, + e.visible = this.visible, + e + } + , + t.prototype.reset = function() { + this.color = 16777215, + this.alpha = 1, + this.texture = oa.WHITE, + this.matrix = null, + this.visible = !1 + } + , + t.prototype.destroy = function() { + this.texture = null, + this.matrix = null + } + , + t + }() + , Zg = function(t, e) { + return (Zg = Object.setPrototypeOf || { + __proto__: [] + }instanceof Array && function(t, e) { + t.__proto__ = e + } + || function(t, e) { + for (var r in e) + e.hasOwnProperty(r) && (t[r] = e[r]) + } + )(t, e) + }; + function Bc(t, e) { + function r() { + this.constructor = t + } + Zg(t, e), + t.prototype = null === e ? Object.create(e) : (r.prototype = e.prototype, + new r) + } + var ee = { + build: function(t) { + t.points = t.shape.points.slice() + }, + triangulate: function(t, e) { + var r = t.points + , i = t.holes + , a = e.points + , n = e.indices; + if (r.length >= 6) { + for (var s = [], h = 0; h < i.length; h++) { + var o = i[h]; + s.push(r.length / 2), + r = r.concat(o.points) + } + var l = cd.d(r, s, 2); + if (!l) + return; + var $ = a.length / 2; + for (h = 0; h < l.length; h += 3) + n.push(l[h] + $), + n.push(l[h + 1] + $), + n.push(l[h + 2] + $); + for (h = 0; h < r.length; h++) + a.push(r[h]) + } + } + } + , fe = { + build: function(t) { + var e, r, i = t.shape, a = t.points, n = i.x, s = i.y; + if (a.length = 0, + t.type === fa.CIRC) + e = i.radius, + r = i.radius; + else { + var h = t.shape; + e = h.width, + r = h.height + } + if (0 !== e && 0 !== r) { + var o = Math.floor(30 * Math.sqrt(i.radius)) || Math.floor(15 * Math.sqrt(e + r)); + o /= 2.3; + for (var l = 2 * Math.PI / o, $ = 0; $ < o - .5; $++) + a.push(n + Math.sin(-l * $) * e, s + Math.cos(-l * $) * r); + a.push(a[0], a[1]) + } + }, + triangulate: function(t, e) { + var r = t.points + , i = e.points + , a = e.indices + , n = i.length / 2 + , s = n + , h = t.shape + , o = t.matrix + , l = h.x + , $ = h.y; + i.push(t.matrix ? o.a * l + o.c * $ + o.tx : l, t.matrix ? o.b * l + o.d * $ + o.ty : $); + for (var u = 0; u < r.length; u += 2) + i.push(r[u], r[u + 1]), + a.push(n++, s, n) + } + } + , $g = { + build: function(t) { + var e = t.shape + , r = e.x + , i = e.y + , a = e.width + , n = e.height + , s = t.points; + s.length = 0, + s.push(r, i, r + a, i, r + a, i + n, r, i + n) + }, + triangulate: function(t, e) { + var r = t.points + , i = e.points + , a = i.length / 2; + i.push(r[0], r[1], r[2], r[3], r[6], r[7], r[4], r[5]), + e.indices.push(a, a + 1, a + 2, a + 1, a + 2, a + 3) + } + }; + function Xa(t, e, r) { + return t + (e - t) * r + } + function Ib(t, e, r, i, a, n, s) { + void 0 === s && (s = []); + for (var h = s, o = 0, l = 0, $ = 0, u = 0, p = 0, c = 0, d = 0, v = 0; d <= 20; ++d) + o = Xa(t, r, v = d / 20), + l = Xa(e, i, v), + $ = Xa(r, a, v), + u = Xa(i, n, v), + p = Xa(o, $, v), + c = Xa(l, u, v), + h.push(p, c); + return h + } + var _g = { + build: function(t) { + var e = t.shape + , r = t.points + , i = e.x + , a = e.y + , n = e.width + , s = e.height + , h = Math.max(0, Math.min(e.radius, Math.min(n, s) / 2)); + r.length = 0, + h ? (Ib(i, a + h, i, a, i + h, a, r), + Ib(i + n - h, a, i + n, a, i + n, a + h, r), + Ib(i + n, a + s - h, i + n, a + s, i + n - h, a + s, r), + Ib(i + h, a + s, i, a + s, i, a + s - h, r)) : r.push(i, a, i + n, a, i + n, a + s, i, a + s) + }, + triangulate: function(t, e) { + for (var r = t.points, i = e.points, a = e.indices, n = i.length / 2, s = cd.d(r, null, 2), h = 0, o = s.length; h < o; h += 3) + a.push(s[h] + n), + a.push(s[h + 1] + n), + a.push(s[h + 2] + n); + for (h = 0, + o = r.length; h < o; h++) + i.push(r[h], r[++h]) + } + }; + function ge(t, e, r, i, a, n, s, h) { + var o, l; + s ? (o = i, + l = -r) : (o = -i, + l = r); + var $ = t - r * a + o + , u = e - i * a + l + , p = t + r * n + o + , c = e + i * n + l; + return h.push($, u), + h.push(p, c), + 2 + } + function Ya(t, e, r, i, a, n, s, h) { + var o = r - t + , l = i - e + , $ = Math.atan2(o, l) + , u = Math.atan2(a - t, n - e); + h && $ < u ? $ += 2 * Math.PI : !h && $ > u && (u += 2 * Math.PI); + var p = $ + , c = u - $ + , d = Math.abs(c) + , v = Math.sqrt(o * o + l * l) + , f = 1 + (15 * d * Math.sqrt(v) / Math.PI >> 0) + , y = c / f; + if (p += y, + h) { + s.push(t, e), + s.push(r, i); + for (var g = 1, q = p; g < f; g++, + q += y) + s.push(t, e), + s.push(t + Math.sin(q) * v, e + Math.cos(q) * v); + s.push(t, e), + s.push(a, n) + } else { + s.push(r, i), + s.push(t, e); + for (g = 1, + q = p; g < f; g++, + q += y) + s.push(t + Math.sin(q) * v, e + Math.cos(q) * v), + s.push(t, e); + s.push(a, n), + s.push(t, e) + } + return 2 * f + } + function ah(t, e) { + var r = t.shape + , i = t.points || r.points.slice() + , a = e.closePointEps; + if (0 !== i.length) { + var n = t.lineStyle + , s = new ra(i[0],i[1]) + , h = new ra(i[i.length - 2],i[i.length - 1]) + , o = r.type !== fa.POLY || r.closeStroke + , l = Math.abs(s.x - h.x) < a && Math.abs(s.y - h.y) < a; + if (o) { + i = i.slice(), + l && (i.pop(), + i.pop(), + h.set(i[i.length - 2], i[i.length - 1])); + var $ = .5 * (s.x + h.x) + , u = .5 * (h.y + s.y); + i.unshift($, u), + i.push($, u) + } + var p = e.points + , c = i.length / 2 + , d = i.length + , v = p.length / 2 + , f = n.width / 2 + , y = f * f + , g = n.miterLimit * n.miterLimit + , q = i[0] + , m = i[1] + , Q = i[2] + , x = i[3] + , b = 0 + , _ = 0 + , P = -(m - x) + , S = q - Q + , A = 0 + , w = 0 + , L = Math.sqrt(P * P + S * S); + P /= L, + S /= L, + P *= f, + S *= f; + var E = n.alignment + , C = 2 * (1 - E) + , M = 2 * E; + o || (n.cap === Ga.ROUND ? d += Ya(q - P * (C - M) * .5, m - S * (C - M) * .5, q - P * C, m - S * C, q + P * M, m + S * M, p, !0) + 2 : n.cap === Ga.SQUARE && (d += ge(q, m, P, S, C, M, !0, p))), + p.push(q - P * C, m - S * C), + p.push(q + P * M, m + S * M); + for (var D = 1; D < c - 1; ++D) { + q = i[2 * (D - 1)], + m = i[2 * (D - 1) + 1], + Q = i[2 * D], + x = i[2 * D + 1], + b = i[2 * (D + 1)], + _ = i[2 * (D + 1) + 1], + P = -(m - x), + S = q - Q, + P /= L = Math.sqrt(P * P + S * S), + S /= L, + P *= f, + S *= f, + A = -(x - _), + w = Q - b, + A /= L = Math.sqrt(A * A + w * w), + w /= L, + A *= f, + w *= f; + var I = Q - q + , T = m - x + , R = Q - b + , O = _ - x + , N = T * R - O * I + , B = N < 0; + if (Math.abs(N) < .1) + p.push(Q - P * C, x - S * C), + p.push(Q + P * M, x + S * M); + else { + var U = (-P + q) * (-S + x) - (-P + Q) * (-S + m) + , H = (-A + b) * (-w + x) - (-A + Q) * (-w + _) + , F = (I * H - R * U) / N + , G = (O * U - T * H) / N + , z = (F - Q) * (F - Q) + (G - x) * (G - x) + , j = Q + (F - Q) * C + , W = x + (G - x) * C + , k = Q - (F - Q) * M + , V = x - (G - x) * M + , J = B ? C : M; + z <= Math.min(I * I + T * T, R * R + O * O) + J * J * y ? n.join === Fa.BEVEL || z / y > g ? (B ? (p.push(j, W), + p.push(Q + P * M, x + S * M), + p.push(j, W), + p.push(Q + A * M, x + w * M)) : (p.push(Q - P * C, x - S * C), + p.push(k, V), + p.push(Q - A * C, x - w * C), + p.push(k, V)), + d += 2) : n.join === Fa.ROUND ? B ? (p.push(j, W), + p.push(Q + P * M, x + S * M), + d += Ya(Q, x, Q + P * M, x + S * M, Q + A * M, x + w * M, p, !0) + 4, + p.push(j, W), + p.push(Q + A * M, x + w * M)) : (p.push(Q - P * C, x - S * C), + p.push(k, V), + d += Ya(Q, x, Q - P * C, x - S * C, Q - A * C, x - w * C, p, !1) + 4, + p.push(Q - A * C, x - w * C), + p.push(k, V)) : (p.push(j, W), + p.push(k, V)) : (p.push(Q - P * C, x - S * C), + p.push(Q + P * M, x + S * M), + n.join === Fa.BEVEL || z / y > g || (n.join === Fa.ROUND ? d += B ? Ya(Q, x, Q + P * M, x + S * M, Q + A * M, x + w * M, p, !0) + 2 : Ya(Q, x, Q - P * C, x - S * C, Q - A * C, x - w * C, p, !1) + 2 : (B ? (p.push(k, V), + p.push(k, V)) : (p.push(j, W), + p.push(j, W)), + d += 2)), + p.push(Q - A * C, x - w * C), + p.push(Q + A * M, x + w * M), + d += 2) + } + } + q = i[2 * (c - 2)], + m = i[2 * (c - 2) + 1], + Q = i[2 * (c - 1)], + P = -(m - (x = i[2 * (c - 1) + 1])), + S = q - Q, + P /= L = Math.sqrt(P * P + S * S), + S /= L, + P *= f, + S *= f, + p.push(Q - P * C, x - S * C), + p.push(Q + P * M, x + S * M), + o || (n.cap === Ga.ROUND ? d += Ya(Q - P * (C - M) * .5, x - S * (C - M) * .5, Q - P * C, x - S * C, Q + P * M, x + S * M, p, !1) + 2 : n.cap === Ga.SQUARE && (d += ge(Q, x, P, S, C, M, !1, p))); + var Y = e.indices + , X = gb.epsilon * gb.epsilon; + for (D = v; D < d + v - 2; ++D) + q = p[2 * D], + m = p[2 * D + 1], + Q = p[2 * (D + 1)], + x = p[2 * (D + 1) + 1], + b = p[2 * (D + 2)], + _ = p[2 * (D + 2) + 1], + Math.abs(q * (x - _) + Q * (_ - m) + b * (m - x)) < X || Y.push(D, D + 1, D + 2) + } + } + function bh(t, e) { + var r = 0 + , i = t.shape + , a = t.points || i.points + , n = i.type !== fa.POLY || i.closeStroke; + if (0 !== a.length) { + var s = e.points + , h = e.indices + , o = a.length / 2 + , l = s.length / 2 + , $ = l; + for (s.push(a[0], a[1]), + r = 1; r < o; r++) + s.push(a[2 * r], a[2 * r + 1]), + h.push($, $ + 1), + $++; + n && h.push($, l) + } + } + function he(t, e) { + t.lineStyle.native ? bh(t, e) : ah(t, e) + } + var hb, ie = function() { + function t() {} + return t.curveTo = function(t, e, r, i, a, n) { + var s = n[n.length - 2] + , h = n[n.length - 1] - e + , o = s - t + , l = i - e + , $ = r - t + , u = Math.abs(h * $ - o * l); + if (u < 1e-8 || 0 === a) + return n[n.length - 2] === t && n[n.length - 1] === e || n.push(t, e), + null; + var p = h * h + o * o + , c = l * l + $ * $ + , d = h * l + o * $ + , v = a * Math.sqrt(p) / u + , f = a * Math.sqrt(c) / u + , y = v * d / p + , g = f * d / c + , q = v * $ + f * o + , m = v * l + f * h + , Q = o * (f + y) + , x = h * (f + y) + , b = $ * (v + g) + , _ = l * (v + g); + return { + cx: q + t, + cy: m + e, + radius: a, + startAngle: Math.atan2(x - m, Q - q), + endAngle: Math.atan2(_ - m, b - q), + anticlockwise: o * l > $ * h + } + } + , + t.arc = function(t, e, r, i, a, n, s, h, o) { + for (var l = s - n, $ = gb._segmentsCount(Math.abs(l) * a, 40 * Math.ceil(Math.abs(l) / wb)), u = l / (2 * $), p = 2 * u, c = Math.cos(u), d = Math.sin(u), v = $ - 1, f = v % 1 / v, y = 0; y <= v; ++y) { + var g = u + n + p * (y + f * y) + , q = Math.cos(g) + , m = -Math.sin(g); + o.push((c * q + d * m) * a + r, (c * -m + d * q) * a + i) + } + } + , + t + }(), ch = function() { + function t() {} + return t.curveLength = function(t, e, r, i, a, n, s, h) { + for (var o = 0, l = 0, $ = 0, u = 0, p = 0, c = 0, d = 0, v = 0, f = 0, y = 0, g = 0, q = t, m = e, Q = 1; Q <= 10; ++Q) + y = q - (v = (d = (c = (p = 1 - (l = Q / 10)) * p) * p) * t + 3 * c * l * r + 3 * p * ($ = l * l) * a + (u = $ * l) * s), + g = m - (f = d * e + 3 * c * l * i + 3 * p * $ * n + u * h), + q = v, + m = f, + o += Math.sqrt(y * y + g * g); + return o + } + , + t.curveTo = function(e, r, i, a, n, s, h) { + var o = h[h.length - 2] + , l = h[h.length - 1]; + h.length -= 2; + var $ = gb._segmentsCount(t.curveLength(o, l, e, r, i, a, n, s)) + , u = 0 + , p = 0 + , c = 0 + , d = 0 + , v = 0; + h.push(o, l); + for (var f = 1, y = 0; f <= $; ++f) + c = (p = (u = 1 - (y = f / $)) * u) * u, + v = (d = y * y) * y, + h.push(c * o + 3 * p * y * e + 3 * u * d * i + v * n, c * l + 3 * p * y * r + 3 * u * d * a + v * s) + } + , + t + }(), dh = function() { + function t() {} + return t.curveLength = function(t, e, r, i, a, n) { + var s = t - 2 * r + a + , h = e - 2 * i + n + , o = 2 * r - 2 * t + , l = 2 * i - 2 * e + , $ = 4 * (s * s + h * h) + , u = 4 * (s * o + h * l) + , p = o * o + l * l + , c = 2 * Math.sqrt($ + u + p) + , d = Math.sqrt($) + , v = 2 * $ * d + , f = 2 * Math.sqrt(p) + , y = u / d; + return (v * c + d * u * (c - f) + (4 * p * $ - u * u) * Math.log((2 * d + y + c) / (y + f))) / (4 * v) + } + , + t.curveTo = function(e, r, i, a, n) { + for (var s = n[n.length - 2], h = n[n.length - 1], o = gb._segmentsCount(t.curveLength(s, h, e, r, i, a)), l = 0, $ = 0, u = 1; u <= o; ++u) { + var p = u / o; + l = s + (e - s) * p, + $ = h + (r - h) * p, + n.push(l + (e + (i - e) * p - l) * p, $ + (r + (a - r) * p - $) * p) + } + } + , + t + }(), eh = function() { + function t() { + this.reset() + } + return t.prototype.begin = function(t, e, r) { + this.reset(), + this.style = t, + this.start = e, + this.attribStart = r + } + , + t.prototype.end = function(t, e) { + this.attribSize = e - this.attribStart, + this.size = t - this.start + } + , + t.prototype.reset = function() { + this.style = null, + this.size = 0, + this.start = 0, + this.attribStart = 0, + this.attribSize = 0 + } + , + t + }(), Cc = ((hb = {})[fa.POLY] = ee, + hb[fa.CIRC] = fe, + hb[fa.ELIP] = fe, + hb[fa.RECT] = $g, + hb[fa.RREC] = _g, + hb), je = [], Jb = [], ke = function() { + function t(t, e, r, i) { + void 0 === e && (e = null), + void 0 === r && (r = null), + void 0 === i && (i = null), + this.shape = t, + this.lineStyle = r, + this.fillStyle = e, + this.matrix = i, + this.type = t.type, + this.points = [], + this.holes = [] + } + return t.prototype.clone = function() { + return new t(this.shape,this.fillStyle,this.lineStyle,this.matrix) + } + , + t.prototype.destroy = function() { + this.shape = null, + this.holes.length = 0, + this.holes = null, + this.points.length = 0, + this.points = null, + this.lineStyle = null, + this.fillStyle = null + } + , + t + }(), Za = new ra, fh = new Gb, gh = function(t) { + function e() { + var e = t.call(this) || this; + return e.uvsFloat32 = null, + e.indicesUint16 = null, + e.points = [], + e.colors = [], + e.uvs = [], + e.indices = [], + e.textureIds = [], + e.graphicsData = [], + e.dirty = 0, + e.batchDirty = -1, + e.cacheDirty = -1, + e.clearDirty = 0, + e.drawCalls = [], + e.batches = [], + e.shapeIndex = 0, + e._bounds = new Gb, + e.boundsDirty = -1, + e.boundsPadding = 0, + e.batchable = !1, + e.indicesUint16 = null, + e.uvsFloat32 = null, + e.closePointEps = 1e-4, + e + } + return Bc(e, t), + Object.defineProperty(e.prototype, "bounds", { + get: function() { + return this.boundsDirty !== this.dirty && (this.boundsDirty = this.dirty, + this.calculateBounds()), + this._bounds + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.invalidate = function() { + this.boundsDirty = -1, + this.dirty++, + this.batchDirty++, + this.shapeIndex = 0, + this.points.length = 0, + this.colors.length = 0, + this.uvs.length = 0, + this.indices.length = 0, + this.textureIds.length = 0; + for (var t = 0; t < this.drawCalls.length; t++) + this.drawCalls[t].texArray.clear(), + Jb.push(this.drawCalls[t]); + this.drawCalls.length = 0; + for (t = 0; t < this.batches.length; t++) { + var e = this.batches[t]; + e.reset(), + je.push(e) + } + this.batches.length = 0 + } + , + e.prototype.clear = function() { + return this.graphicsData.length > 0 && (this.invalidate(), + this.clearDirty++, + this.graphicsData.length = 0), + this + } + , + e.prototype.drawShape = function(t, e, r, i) { + void 0 === e && (e = null), + void 0 === r && (r = null), + void 0 === i && (i = null); + var a = new ke(t,e,r,i); + return this.graphicsData.push(a), + this.dirty++, + this + } + , + e.prototype.drawHole = function(t, e) { + if (void 0 === e && (e = null), + !this.graphicsData.length) + return null; + var r = new ke(t,null,null,e) + , i = this.graphicsData[this.graphicsData.length - 1]; + return r.lineStyle = i.lineStyle, + i.holes.push(r), + this.dirty++, + this + } + , + e.prototype.destroy = function() { + t.prototype.destroy.call(this); + for (var e = 0; e < this.graphicsData.length; ++e) + this.graphicsData[e].destroy(); + this.points.length = 0, + this.points = null, + this.colors.length = 0, + this.colors = null, + this.uvs.length = 0, + this.uvs = null, + this.indices.length = 0, + this.indices = null, + this.indexBuffer.destroy(), + this.indexBuffer = null, + this.graphicsData.length = 0, + this.graphicsData = null, + this.drawCalls.length = 0, + this.drawCalls = null, + this.batches.length = 0, + this.batches = null, + this._bounds = null + } + , + e.prototype.containsPoint = function(t) { + for (var e = this.graphicsData, r = 0; r < e.length; ++r) { + var i = e[r]; + if (i.fillStyle.visible && i.shape && (i.matrix ? i.matrix.applyInverse(t, Za) : Za.copyFrom(t), + i.shape.contains(Za.x, Za.y))) { + var a = !1; + if (i.holes) + for (var n = 0; n < i.holes.length; n++) { + if (i.holes[n].shape.contains(Za.x, Za.y)) { + a = !0; + break + } + } + if (!a) + return !0 + } + } + return !1 + } + , + e.prototype.updateBatches = function(t) { + if (this.graphicsData.length) { + if (this.validateBatching()) { + this.cacheDirty = this.dirty; + var e = this.uvs + , r = this.graphicsData + , i = null + , a = null; + this.batches.length > 0 && (a = (i = this.batches[this.batches.length - 1]).style); + for (var n = this.shapeIndex; n < r.length; n++) { + this.shapeIndex++; + var s = r[n] + , h = s.fillStyle + , o = s.lineStyle; + Cc[s.type].build(s), + s.matrix && this.transformPoints(s.points, s.matrix); + for (var l = 0; l < 2; l++) { + var $ = 0 === l ? h : o; + if ($.visible) { + var u = $.texture.baseTexture + , p = this.indices.length + , c = this.points.length / 2; + u.wrapMode = Rb.REPEAT, + 0 === l ? this.processFill(s) : this.processLine(s); + var d = this.points.length / 2 - c; + 0 !== d && (i && !this._compareStyles(a, $) && (i.end(p, c), + i = null), + i || ((i = je.pop() || new eh).begin($, p, c), + this.batches.push(i), + a = $), + this.addUvs(this.points, e, $.texture, c, d, $.matrix)) + } + } + } + var v = this.indices.length + , f = this.points.length / 2; + if (i && i.end(v, f), + 0 !== this.batches.length) { + if (this.indicesUint16 && this.indices.length === this.indicesUint16.length) + this.indicesUint16.set(this.indices); + else { + var y = f > 65535 && t; + this.indicesUint16 = y ? new Uint32Array(this.indices) : new Uint16Array(this.indices) + } + this.batchable = this.isBatchable(), + this.batchable ? this.packBatches() : this.buildDrawCalls() + } else + this.batchable = !0 + } + } else + this.batchable = !0 + } + , + e.prototype._compareStyles = function(t, e) { + return !(!t || !e) && t.texture.baseTexture === e.texture.baseTexture && t.color + t.alpha === e.color + e.alpha && !!t.native == !!e.native + } + , + e.prototype.validateBatching = function() { + if (this.dirty === this.cacheDirty || !this.graphicsData.length) + return !1; + for (var t = 0, e = this.graphicsData.length; t < e; t++) { + var r = this.graphicsData[t] + , i = r.fillStyle + , a = r.lineStyle; + if (i && !i.texture.baseTexture.valid) + return !1; + if (a && !a.texture.baseTexture.valid) + return !1 + } + return !0 + } + , + e.prototype.packBatches = function() { + this.batchDirty++, + this.uvsFloat32 = new Float32Array(this.uvs); + for (var t = this.batches, e = 0, r = t.length; e < r; e++) + for (var i = t[e], a = 0; a < i.size; a++) { + var n = i.start + a; + this.indicesUint16[n] = this.indicesUint16[n] - i.attribStart + } + } + , + e.prototype.isBatchable = function() { + if (this.points.length > 131070) + return !1; + for (var t = this.batches, r = 0; r < t.length; r++) + if (t[r].style.native) + return !1; + return this.points.length < 2 * e.BATCHABLE_SIZE + } + , + e.prototype.buildDrawCalls = function() { + for (var t = ++ia._globalBatch, e = 0; e < this.drawCalls.length; e++) + this.drawCalls[e].texArray.clear(), + Jb.push(this.drawCalls[e]); + this.drawCalls.length = 0; + var r = this.colors + , i = this.textureIds + , a = Jb.pop(); + a || ((a = new xc).texArray = new yc), + a.texArray.count = 0, + a.start = 0, + a.size = 0, + a.type = Ba.TRIANGLES; + var n = 0 + , s = null + , h = 0 + , o = !1 + , l = Ba.TRIANGLES + , $ = 0; + this.drawCalls.push(a); + for (e = 0; e < this.batches.length; e++) { + var u = this.batches[e] + , p = u.style + , c = p.texture.baseTexture; + o !== !!p.native && (l = (o = !!p.native) ? Ba.LINES : Ba.TRIANGLES, + s = null, + n = 8, + t++), + s !== c && (s = c, + c._batchEnabled !== t && (8 === n && (t++, + n = 0, + a.size > 0 && ((a = Jb.pop()) || ((a = new xc).texArray = new yc), + this.drawCalls.push(a)), + a.start = $, + a.size = 0, + a.texArray.count = 0, + a.type = l), + c.touched = 1, + c._batchEnabled = t, + c._batchLocation = n, + c.wrapMode = 10497, + a.texArray.elements[a.texArray.count++] = c, + n++)), + a.size += u.size, + $ += u.size, + h = c._batchLocation, + this.addColors(r, p.color, p.alpha, u.attribSize), + this.addTextureIds(i, h, u.attribSize) + } + ia._globalBatch = t, + this.packAttributes() + } + , + e.prototype.packAttributes = function() { + for (var t = this.points, e = this.uvs, r = this.colors, i = this.textureIds, a = new ArrayBuffer(3 * t.length * 4), n = new Float32Array(a), s = new Uint32Array(a), h = 0, o = 0; o < t.length / 2; o++) + n[h++] = t[2 * o], + n[h++] = t[2 * o + 1], + n[h++] = e[2 * o], + n[h++] = e[2 * o + 1], + s[h++] = r[o], + n[h++] = i[o]; + this._buffer.update(a), + this._indexBuffer.update(this.indicesUint16) + } + , + e.prototype.processFill = function(t) { + t.holes.length ? (this.processHoles(t.holes), + ee.triangulate(t, this)) : Cc[t.type].triangulate(t, this) + } + , + e.prototype.processLine = function(t) { + he(t, this); + for (var e = 0; e < t.holes.length; e++) + he(t.holes[e], this) + } + , + e.prototype.processHoles = function(t) { + for (var e = 0; e < t.length; e++) { + var r = t[e]; + Cc[r.type].build(r), + r.matrix && this.transformPoints(r.points, r.matrix) + } + } + , + e.prototype.calculateBounds = function() { + var t = this._bounds + , e = fh + , r = la.IDENTITY; + this._bounds.clear(), + e.clear(); + for (var i = 0; i < this.graphicsData.length; i++) { + var a = this.graphicsData[i] + , n = a.shape + , s = a.type + , h = a.lineStyle + , o = a.matrix || la.IDENTITY + , l = 0; + if (h && h.visible) { + var $ = h.alignment; + l = h.width, + s === fa.POLY ? l *= .5 + Math.abs(.5 - $) : l *= Math.max(0, $) + } + if (r !== o && (e.isEmpty() || (t.addBoundsMatrix(e, r), + e.clear()), + r = o), + s === fa.RECT || s === fa.RREC) { + var u = n; + e.addFramePad(u.x, u.y, u.x + u.width, u.y + u.height, l, l) + } else if (s === fa.CIRC) { + var p = n; + e.addFramePad(p.x, p.y, p.x, p.y, p.radius + l, p.radius + l) + } else if (s === fa.ELIP) { + var c = n; + e.addFramePad(c.x, c.y, c.x, c.y, c.width + l, c.height + l) + } else { + var d = n; + t.addVerticesMatrix(r, d.points, 0, d.points.length, l, l) + } + } + e.isEmpty() || t.addBoundsMatrix(e, r), + t.pad(this.boundsPadding, this.boundsPadding) + } + , + e.prototype.transformPoints = function(t, e) { + for (var r = 0; r < t.length / 2; r++) { + var i = t[2 * r] + , a = t[2 * r + 1]; + t[2 * r] = e.a * i + e.c * a + e.tx, + t[2 * r + 1] = e.b * i + e.d * a + e.ty + } + } + , + e.prototype.addColors = function(t, e, r, i) { + for (var a = fd((e >> 16) + (65280 & e) + ((255 & e) << 16), r); i-- > 0; ) + t.push(a) + } + , + e.prototype.addTextureIds = function(t, e, r) { + for (; r-- > 0; ) + t.push(e) + } + , + e.prototype.addUvs = function(t, e, r, i, a, n) { + void 0 === n && (n = null); + for (var s = 0, h = e.length, o = r.frame; s < a; ) { + var l = t[2 * (i + s)] + , $ = t[2 * (i + s) + 1]; + if (n) { + var u = n.a * l + n.c * $ + n.tx; + $ = n.b * l + n.d * $ + n.ty, + l = u + } + s++, + e.push(l / o.width, $ / o.height) + } + var p = r.baseTexture; + (o.width < p.width || o.height < p.height) && this.adjustUvs(e, r, h, a) + } + , + e.prototype.adjustUvs = function(t, e, r, i) { + for (var a = e.baseTexture, n = r + 2 * i, s = e.frame, h = s.width / a.width, o = s.height / a.height, l = s.x / s.width, $ = s.y / s.height, u = Math.floor(t[r] + 1e-6), p = Math.floor(t[r + 1] + 1e-6), c = r + 2; c < n; c += 2) + u = Math.min(u, Math.floor(t[c] + 1e-6)), + p = Math.min(p, Math.floor(t[c + 1] + 1e-6)); + l -= u, + $ -= p; + for (c = r; c < n; c += 2) + t[c] = (t[c] + l) * h, + t[c + 1] = (t[c + 1] + $) * o + } + , + e.BATCHABLE_SIZE = 100, + e + }(_d), hh = function(t) { + function e() { + var e = null !== t && t.apply(this, arguments) || this; + return e.width = 0, + e.alignment = .5, + e.native = !1, + e.cap = Ga.BUTT, + e.join = Fa.MITER, + e.miterLimit = 10, + e + } + return Bc(e, t), + e.prototype.clone = function() { + var t = new e; + return t.color = this.color, + t.alpha = this.alpha, + t.texture = this.texture, + t.matrix = this.matrix, + t.visible = this.visible, + t.width = this.width, + t.alignment = this.alignment, + t.native = this.native, + t.cap = this.cap, + t.join = this.join, + t.miterLimit = this.miterLimit, + t + } + , + e.prototype.reset = function() { + t.prototype.reset.call(this), + this.color = 0, + this.alignment = .5, + this.width = 0, + this.native = !1 + } + , + e + }(de), ih = new Float32Array(3), Dc = {}, jh = function(t) { + function e(e) { + void 0 === e && (e = null); + var r = t.call(this) || this; + return r._geometry = e || new gh, + r._geometry.refCount++, + r.shader = null, + r.state = Fb.for2d(), + r._fillStyle = new de, + r._lineStyle = new hh, + r._matrix = null, + r._holeMode = !1, + r.currentPath = null, + r.batches = [], + r.batchTint = -1, + r.batchDirty = -1, + r.vertexData = null, + r.pluginName = "batch", + r._transformID = -1, + r.tint = 16777215, + r.blendMode = K.NORMAL, + r + } + return Bc(e, t), + Object.defineProperty(e.prototype, "geometry", { + get: function() { + return this._geometry + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.clone = function() { + return this.finishPoly(), + new e(this._geometry) + } + , + Object.defineProperty(e.prototype, "blendMode", { + get: function() { + return this.state.blendMode + }, + set: function(t) { + this.state.blendMode = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "tint", { + get: function() { + return this._tint + }, + set: function(t) { + this._tint = t + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "fill", { + get: function() { + return this._fillStyle + }, + enumerable: !1, + configurable: !0 + }), + Object.defineProperty(e.prototype, "line", { + get: function() { + return this._lineStyle + }, + enumerable: !1, + configurable: !0 + }), + e.prototype.lineStyle = function(t, e, r, i, a) { + return void 0 === t && (t = null), + void 0 === e && (e = 0), + void 0 === r && (r = 1), + void 0 === i && (i = .5), + void 0 === a && (a = !1), + "number" == typeof t && (t = { + width: t, + color: e, + alpha: r, + alignment: i, + native: a + }), + this.lineTextureStyle(t) + } + , + e.prototype.lineTextureStyle = function(t) { + t = Object.assign({ + width: 0, + texture: oa.WHITE, + color: t && t.texture ? 16777215 : 0, + alpha: 1, + matrix: null, + alignment: .5, + native: !1, + cap: Ga.BUTT, + join: Fa.MITER, + miterLimit: 10 + }, t), + this.currentPath && this.startPoly(); + var e = t.width > 0 && t.alpha > 0; + return e ? (t.matrix && (t.matrix = t.matrix.clone(), + t.matrix.invert()), + Object.assign(this._lineStyle, { + visible: e + }, t)) : this._lineStyle.reset(), + this + } + , + e.prototype.startPoly = function() { + if (this.currentPath) { + var t = this.currentPath.points + , e = this.currentPath.points.length; + e > 2 && (this.drawShape(this.currentPath), + this.currentPath = new $b, + this.currentPath.closeStroke = !1, + this.currentPath.points.push(t[e - 2], t[e - 1])) + } else + this.currentPath = new $b, + this.currentPath.closeStroke = !1 + } + , + e.prototype.finishPoly = function() { + this.currentPath && (this.currentPath.points.length > 2 ? (this.drawShape(this.currentPath), + this.currentPath = null) : this.currentPath.points.length = 0) + } + , + e.prototype.moveTo = function(t, e) { + return this.startPoly(), + this.currentPath.points[0] = t, + this.currentPath.points[1] = e, + this + } + , + e.prototype.lineTo = function(t, e) { + this.currentPath || this.moveTo(0, 0); + var r = this.currentPath.points + , i = r[r.length - 2] + , a = r[r.length - 1]; + return i === t && a === e || r.push(t, e), + this + } + , + e.prototype._initCurve = function(t, e) { + void 0 === t && (t = 0), + void 0 === e && (e = 0), + this.currentPath ? 0 === this.currentPath.points.length && (this.currentPath.points = [t, e]) : this.moveTo(t, e) + } + , + e.prototype.quadraticCurveTo = function(t, e, r, i) { + this._initCurve(); + var a = this.currentPath.points; + return 0 === a.length && this.moveTo(0, 0), + dh.curveTo(t, e, r, i, a), + this + } + , + e.prototype.bezierCurveTo = function(t, e, r, i, a, n) { + return this._initCurve(), + ch.curveTo(t, e, r, i, a, n, this.currentPath.points), + this + } + , + e.prototype.arcTo = function(t, e, r, i, a) { + this._initCurve(t, e); + var n = this.currentPath.points + , s = ie.curveTo(t, e, r, i, a, n); + if (s) { + var h = s.cx + , o = s.cy + , l = s.radius + , $ = s.startAngle + , u = s.endAngle + , p = s.anticlockwise; + this.arc(h, o, l, $, u, p) + } + return this + } + , + e.prototype.arc = function(t, e, r, i, a, n) { + if (void 0 === n && (n = !1), + i === a) + return this; + if (!n && a <= i ? a += wb : n && i <= a && (i += wb), + 0 === a - i) + return this; + var s = t + Math.cos(i) * r + , h = e + Math.sin(i) * r + , o = this._geometry.closePointEps + , l = this.currentPath ? this.currentPath.points : null; + if (l) { + var $ = Math.abs(l[l.length - 2] - s) + , u = Math.abs(l[l.length - 1] - h); + $ < o && u < o || l.push(s, h) + } else + this.moveTo(s, h), + l = this.currentPath.points; + return ie.arc(s, h, t, e, r, i, a, n, l), + this + } + , + e.prototype.beginFill = function(t, e) { + return void 0 === t && (t = 0), + void 0 === e && (e = 1), + this.beginTextureFill({ + texture: oa.WHITE, + color: t, + alpha: e + }) + } + , + e.prototype.beginTextureFill = function(t) { + t = Object.assign({ + texture: oa.WHITE, + color: 16777215, + alpha: 1, + matrix: null + }, t), + this.currentPath && this.startPoly(); + var e = t.alpha > 0; + return e ? (t.matrix && (t.matrix = t.matrix.clone(), + t.matrix.invert()), + Object.assign(this._fillStyle, { + visible: e + }, t)) : this._fillStyle.reset(), + this + } + , + e.prototype.endFill = function() { + return this.finishPoly(), + this._fillStyle.reset(), + this + } + , + e.prototype.drawRect = function(t, e, r, i) { + return this.drawShape(new da(t,e,r,i)) + } + , + e.prototype.drawRoundedRect = function(t, e, r, i, a) { + return this.drawShape(new Xf(t,e,r,i,a)) + } + , + e.prototype.drawCircle = function(t, e, r) { + return this.drawShape(new Vf(t,e,r)) + } + , + e.prototype.drawEllipse = function(t, e, r, i) { + return this.drawShape(new Wf(t,e,r,i)) + } + , + e.prototype.drawPolygon = function() { + for (var t, e = arguments, r = [], i = 0; i < arguments.length; i++) + r[i] = e[i]; + var a = !0 + , n = r[0]; + n.points ? (a = n.closeStroke, + t = n.points) : t = Array.isArray(r[0]) ? r[0] : r; + var s = new $b(t); + return s.closeStroke = a, + this.drawShape(s), + this + } + , + e.prototype.drawShape = function(t) { + return this._holeMode ? this._geometry.drawHole(t, this._matrix) : this._geometry.drawShape(t, this._fillStyle.clone(), this._lineStyle.clone(), this._matrix), + this + } + , + e.prototype.clear = function() { + return this._geometry.clear(), + this._lineStyle.reset(), + this._fillStyle.reset(), + this._boundsID++, + this._matrix = null, + this._holeMode = !1, + this.currentPath = null, + this + } + , + e.prototype.isFastRect = function() { + var t = this._geometry.graphicsData; + return 1 === t.length && t[0].shape.type === fa.RECT && !(t[0].lineStyle.visible && t[0].lineStyle.width) + } + , + e.prototype._render = function(t) { + this.finishPoly(); + var e = this._geometry + , r = t.context.supports.uint32Indices; + e.updateBatches(r), + e.batchable ? (this.batchDirty !== e.batchDirty && this._populateBatches(), + this._renderBatched(t)) : (t.batch.flush(), + this._renderDirect(t)) + } + , + e.prototype._populateBatches = function() { + var t = this._geometry + , e = this.blendMode + , r = t.batches.length; + this.batchTint = -1, + this._transformID = -1, + this.batchDirty = t.batchDirty, + this.batches.length = r, + this.vertexData = new Float32Array(t.points); + for (var i = 0; i < r; i++) { + var a = t.batches[i] + , n = a.style.color + , s = new Float32Array(this.vertexData.buffer,4 * a.attribStart * 2,2 * a.attribSize) + , h = new Float32Array(t.uvsFloat32.buffer,4 * a.attribStart * 2,2 * a.attribSize) + , o = { + vertexData: s, + blendMode: e, + indices: new Uint16Array(t.indicesUint16.buffer,2 * a.start,a.size), + uvs: h, + _batchRGB: Xb(n), + _tintRGB: n, + _texture: a.style.texture, + alpha: a.style.alpha, + worldAlpha: 1 + }; + this.batches[i] = o + } + } + , + e.prototype._renderBatched = function(t) { + if (this.batches.length) { + t.batch.setObjectRenderer(t.plugins[this.pluginName]), + this.calculateVertices(), + this.calculateTints(); + for (var e = 0, r = this.batches.length; e < r; e++) { + var i = this.batches[e]; + i.worldAlpha = this.worldAlpha * i.alpha, + t.plugins[this.pluginName].render(i) + } + } + } + , + e.prototype._renderDirect = function(t) { + var e = this._resolveDirectShader(t) + , r = this._geometry + , i = this.tint + , a = this.worldAlpha + , n = e.uniforms + , s = r.drawCalls; + n.translationMatrix = this.transform.worldTransform, + n.tint[0] = (i >> 16 & 255) / 255 * a, + n.tint[1] = (i >> 8 & 255) / 255 * a, + n.tint[2] = (255 & i) / 255 * a, + n.tint[3] = a, + t.shader.bind(e), + t.geometry.bind(r, e), + t.state.set(this.state); + for (var h = 0, o = s.length; h < o; h++) + this._renderDrawCallDirect(t, r.drawCalls[h]) + } + , + e.prototype._renderDrawCallDirect = function(t, e) { + for (var r = e.texArray, i = e.type, a = e.size, n = e.start, s = r.count, h = 0; h < s; h++) + t.texture.bind(r.elements[h], h); + t.geometry.draw(i, a, n) + } + , + e.prototype._resolveDirectShader = function(t) { + var e = this.shader + , r = this.pluginName; + if (!e) { + if (!Dc[r]) { + for (var i = t.plugins.batch.MAX_TEXTURES, a = new Int32Array(i), n = 0; n < i; n++) + a[n] = n; + var s = { + tint: new Float32Array([1, 1, 1, 1]), + translationMatrix: new la, + default: Pa.from({ + uSamplers: a + }, !0) + } + , h = t.plugins[r]._shader.program; + Dc[r] = new oc(h,s) + } + e = Dc[r] + } + return e + } + , + e.prototype._calculateBounds = function() { + this.finishPoly(); + var t = this._geometry; + if (t.graphicsData.length) { + var e = t.bounds + , r = e.minX + , i = e.minY + , a = e.maxX + , n = e.maxY; + this._bounds.addFrame(this.transform, r, i, a, n) + } + } + , + e.prototype.containsPoint = function(t) { + return this.worldTransform.applyInverse(t, e._TEMP_POINT), + this._geometry.containsPoint(e._TEMP_POINT) + } + , + e.prototype.calculateTints = function() { + if (this.batchTint !== this.tint) { + this.batchTint = this.tint; + for (var t = Xb(this.tint, ih), e = 0; e < this.batches.length; e++) { + var r = this.batches[e] + , i = r._batchRGB + , a = (t[0] * i[0] * 255 << 16) + (t[1] * i[1] * 255 << 8) + (0 | t[2] * i[2] * 255); + r._tintRGB = (a >> 16) + (65280 & a) + ((255 & a) << 16) + } + } + } + , + e.prototype.calculateVertices = function() { + var t = this.transform._worldID; + if (this._transformID !== t) { + this._transformID = t; + for (var e = this.transform.worldTransform, r = e.a, i = e.b, a = e.c, n = e.d, s = e.tx, h = e.ty, o = this._geometry.points, l = this.vertexData, $ = 0, u = 0; u < o.length; u += 2) { + var p = o[u] + , c = o[u + 1]; + l[$++] = r * p + a * c + s, + l[$++] = n * c + i * p + h + } + } + } + , + e.prototype.closePath = function() { + var t = this.currentPath; + return t && (t.closeStroke = !0), + this + } + , + e.prototype.setMatrix = function(t) { + return this._matrix = t, + this + } + , + e.prototype.beginHole = function() { + return this.finishPoly(), + this._holeMode = !0, + this + } + , + e.prototype.endHole = function() { + return this.finishPoly(), + this._holeMode = !1, + this + } + , + e.prototype.destroy = function(e) { + this._geometry.refCount--, + 0 === this._geometry.refCount && this._geometry.dispose(), + this._matrix = null, + this.currentPath = null, + this._lineStyle.destroy(), + this._lineStyle = null, + this._fillStyle.destroy(), + this._fillStyle = null, + this._geometry = null, + this.shader = null, + this.vertexData = null, + this.batches.length = 0, + this.batches = null, + t.prototype.destroy.call(this, e) + } + , + e._TEMP_POINT = new ra, + e + }(Ac); + var kh = Nb && Nb.__extends || function() { + var t = function(i, r) { + return (t = Object.setPrototypeOf || { + __proto__: [] + }instanceof Array && function(t, i) { + t.__proto__ = i + } + || function(t, i) { + for (var r in i) + Object.prototype.hasOwnProperty.call(i, r) && (t[r] = i[r]) + } + )(i, r) + }; + return function(i, r) { + if ("function" != typeof r && null !== r) + throw new TypeError("Class extends value " + String(r) + " is not a constructor or null"); + function o() { + this.constructor = i + } + t(i, r), + i.prototype = null === r ? Object.create(r) : (o.prototype = r.prototype, + new o) + } + }() + , lh = window.PIXI ? window.PIXI.Graphics : jh + , le = function(t) { + function i(i, r, o) { + void 0 === r && (r = {}); + var s = t.call(this) || this; + s.graphicsOptions = { + x: 0, + y: 0, + width: 100, + height: 100, + fill: 0, + lineWidth: 1, + lineColor: 16777215 + }, + s.graphicsOptions = Object.assign(s.graphicsOptions, i), + s.physicsOptions = r; + var p = s.graphicsOptions.width / 2 + , n = s.graphicsOptions.height / 2; + return s.pivot.x = p, + s.pivot.y = n, + s._update = o, + s.graphicsOptions.radius ? s._body = ha.Bodies.circle(s.graphicsOptions.x, s.graphicsOptions.y, s.graphicsOptions.radius, s.physicsOptions) : s._body = ha.Bodies.rectangle(s.graphicsOptions.x + p, s.graphicsOptions.y + n, s.graphicsOptions.width, s.graphicsOptions.height, s.physicsOptions), + s + } + return kh(i, t), + Object.defineProperty(i.prototype, "body", { + get: function() { + return this._body + }, + enumerable: !1, + configurable: !0 + }), + i.prototype.update = function() { + this._update({ + position: this._body.position, + rotation: this._body.angle + }) + } + , + i + }(lh); + Nb.PhysicsGraphics = le; + var me = ma && ma.__assign || function() { + return (me = Object.assign || function(r) { + for (var n, e = 1, t = arguments.length; e < t; e++) + for (var a in n = arguments[e]) + Object.prototype.hasOwnProperty.call(n, a) && (r[a] = n[a]); + return r + } + ).apply(this, arguments) + } + , ne = ma && ma.__spreadArray || function(r, n) { + for (var e = 0, t = n.length, a = r.length; e < t; e++, + a++) + r[a] = n[e]; + return r + } + ; + function oe(r, n) { + return window[n] ? Promise.resolve(window[n]) : new Promise(function(e, t) { + var a = document.createElement("script"); + a.onload = function() { + e(n && window[n]) + } + , + a.onerror = function(r) { + a.onload = null, + a.onerror = null, + document.body.removeChild(a), + t(r) + } + , + a.src = r, + a.async = !0, + document.body.appendChild(a) + } + ) + } + ma.loadScript = oe; + var mh = function(r) { + r.App && (r.App.destroy({ + removeView: !0 + }), + window.PIXI.loader.destroy(), + r.App = null, + r.timerMap.forEach(function(r, n) { + window.clearInterval(r), + window.clearTimeout(r) + }), + r.timerMap.clear(), + r.soundMap = {}, + r.music.pause(), + r.music = null, + r.music = new Audio, + Object.keys(r.windowListener).map(function(n) { + var e = n.replace("Listener", ""); + window.removeEventListener(e, r.windowListener[n]) + })) + }; + ma.resetPygameZero = mh; + var Ec = { + aqua: "#00FFFF", + black: "#000000", + blue: "#0000FF", + fuchsia: "#FF00FF", + gray: "#808080", + green: "#008000", + lime: "#00FF00", + maroon: "#800000", + navy: "#000080", + olive: "#808000", + orange: "#FFA500", + purple: "#800080", + red: "#FF0000", + silver: "#C0C0C0", + teal: "#008080", + white: "#FFFFFF", + yellow: "#FFFF00" + }; + ma.ColorNameMap = Ec; + var nh = function(r) { + Math.round(r.view.width / 2), + Math.round(r.view.height / 2); + var n = { + transX: function(r, n) { + return void 0 === n && (n = !1), + r + }, + transY: function(r, n) { + return void 0 === n && (n = !1), + r + }, + transPos: function(r, e) { + return void 0 === e && (e = !1), + r ? [n.transX(r[0], e), n.transY(r[1], e)] : r + }, + transColor: function(r) { + return Array.isArray(r) ? window.PIXI.utils.rgb2hex(r) : r.match("#") ? window.PIXI.utils.string2hex(r) : Ec[r] ? window.PIXI.utils.string2hex(Ec[r]) : 16777215 + } + }; + return n + }; + function oh(r, n) { + Array.isArray(n) && (n.x = n[0], + n.y = n[1], + n.width = 0, + n.height = 0), + r.centerX = r.x + r.width / 2, + r.centerY = r.y + r.height / 2, + n.centerX = n.x + n.width / 2, + n.centerY = n.y + n.height / 2, + r.halfWidth = r.width / 2, + r.halfHeight = r.height / 2, + n.halfWidth = n.width / 2, + n.halfHeight = n.height / 2; + var e = r.centerX - n.centerX + , t = r.centerY - n.centerY + , a = r.halfWidth + n.halfWidth + , i = r.halfHeight + n.halfHeight; + return Math.abs(e) < a && Math.abs(t) < i + } + ma.translateTools = nh, + ma.hitTestRectangle = oh; + var Fc = {}; + function ph(r) { + function n(r) { + var n; + return Array.isArray(r) && (n = ne([], r), + r = n[0]), + new Promise(function(e, t) { + window.PIXI.utils.TextureCache[r] ? e(window.PIXI.utils.TextureCache[r]) : window.PIXI.loader.add(n || r).load(function() { + var n = window.PIXI.loader.resources[r].texture; + e(n) + }) + } + ) + } + return /\.json$/.test(r) ? Fc[r] ? n(Fc[r]) : fetch(r).then(function(r) { + return r.json() + }).then(function(e) { + var t = r.replace("index.json", "") + , a = e.map(function(r) { + return t + r + }); + return Fc[r] = a, + n(a) + }) : n(r) + } + ma.textureRecources = ph; + var ga = window.Sk + , qh = function(r) { + return ga.misceval.callsimOrSuspend(ga.builtins.property, new ga.builtin.func(r), new ga.builtin.func(function() {} + )) + }; + function pe(r, n) { + var e = function(e) { + for (var t = [], a = 1; a < arguments.length; a++) + t[a - 1] = arguments[a]; + n || (t = new ga.builtins.tuple(t)); + var i = new ga.builtin.dict(e); + return r(t, i) + }; + return e.co_kwargs = !0, + e + } + ma.defineGetter = qh, + ma.genkwaFunc = pe; + var qe = function(r, n) { + return ga.misceval.callsimOrSuspend(ga.builtins.property, new ga.builtin.func(function(e) { + return "function" == typeof r ? r(e) : ga.ffi.remapToPy(e[r][n]) + } + ), new ga.builtin.func(function(e, t) { + "function" == typeof n ? n(e, t) : e[r][n] = t.v + } + )) + }; + ma.defineProperty = qe; + var rh = function(r, n, e, t) { + return new ga.builtin.func(function(n) { + for (var a = [], i = 1; i < arguments.length; i++) + a[i - 1] = arguments[i]; + return ga.misceval.callsimOrSuspend(ga.misceval.buildClass(r, function(r, i) { + i.__init__ = new ga.builtin.func(function(r) { + r.graph = new window.PIXI.Graphics; + var e = r.graph; + t.apply(void 0, ne([n, e], a)); + var i = r.graph.width / 2 + , o = r.graph.height / 2 + , $ = r.graph.graphicsData[0].shape.x + , s = r.graph.graphicsData[0].shape.y; + r.graph.isCircle ? (r.graph.pivot.set(2 * i, 2 * o), + r.graph.position.set(2 * i, 2 * i)) : (r.graph.pivot.set($ + i, s + o), + r.graph.position.set($ + i, s + o)) + } + ), + i.rotation = qe(function(r) { + return ga.ffi.remapToPy(r.rotation) + }, function(r, n) { + r.physicGraphics ? ha.Body.setAngle(r.physicGraphics._body, n.v) : r.graph.rotation = n.v + }), + i.physicsImpostor = new ga.builtin.func(pe(function(r, n) { + n = ga.ffi.remapToJs(n); + var t = r[0] + , a = r[1] + , i = r[2]; + a = ga.ffi.remapToJs(a || n.is_static) || !1; + var o = !1; + i = ga.ffi.remapToJs(i || n.physicsOptions) || {}; + var $ = t.graph + , s = $.graphicsData + , p = $.width + , c = $.height + , u = $.line + , l = $.rotation + , h = {}; + t.graph.isCircle && (o = !0, + h.radius = s[0].shape.radius), + t.graph.isFilled && (h.fill = s[0].fillStyle.color), + t.physicGraphics = new le(me({ + x: s[0].shape.x, + y: s[0].shape.y, + width: p, + height: c, + lineWidth: u.width, + lineColor: u.color + }, h),me({ + isCircle: o, + isStatic: a + }, i),function(r) { + var n = r.position + , e = r.rotation; + t.graph.position = n, + t.graph.rotation = e + } + ), + ha.Body.setAngle(t.physicGraphics._body, l), + e.addToWorld(t.physicGraphics) + }, !0)) + })) + } + ) + }; + ma.upgradeGraphics = rh; + var sh = {}; + sh = { + scripts: { + start: "parcel build src/main.ts && parcel src/pygame-zero.ts -d ./dist", + server: "node server.js", + build: "parcel build src/main.ts --experimental-scope-hoisting --no-source-maps && parcel build src/pygame-zero.ts --no-source-maps" + }, + name: "skulpt-pygame-zero", + description: "This module provides most of the functions of pygame-zero for skulpt", + version: "0.3.4-alpha2", + main: "dist/main.js", + files: ["lib", "dist", "*.d.ts", "README.md", "README-zh.md"], + devDependencies: { + "alphanum-sort": "^1.0.2", + "ansi-styles": "^3.2.1", + argparse: "^1.0.10", + boolbase: "^1.0.0", + browserslist: "^4.16.3", + "call-bind": "^1.0.2", + "caller-callsite": "^2.0.0", + "caller-path": "^2.0.0", + callsites: "^2.0.0", + "caniuse-api": "^3.0.0", + "caniuse-lite": "^1.0.30001194", + chalk: "^2.4.2", + coa: "^2.0.2", + color: "^3.1.3", + "color-convert": "^1.9.3", + "color-name": "^1.1.3", + "color-string": "^1.5.4", + colorette: "^1.2.2", + cosmiconfig: "^5.2.1", + "css-color-names": "^0.0.4", + "css-declaration-sorter": "^4.0.1", + "css-select": "^2.1.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "^1.0.0-alpha.37", + "css-what": "^3.4.2", + cssesc: "^3.0.0", + "cssnano-preset-default": "^4.0.7", + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "cssnano-util-raw-cache": "^4.0.1", + "cssnano-util-same-parent": "^4.0.1", + csso: "^4.2.0", + "define-properties": "^1.1.3", + "dom-serializer": "^0.2.2", + domelementtype: "^1.3.1", + domutils: "^1.7.0", + "dot-prop": "^5.3.0", + "electron-to-chromium": "^1.3.678", + entities: "^2.2.0", + "error-ex": "^1.3.2", + "es-abstract": "^1.18.0-next.3", + "es-to-primitive": "^1.2.1", + escalade: "^3.1.1", + "escape-string-regexp": "^1.0.5", + esprima: "^4.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + has: "^1.0.3", + "has-bigints": "^1.0.1", + "has-flag": "^3.0.0", + "has-symbols": "^1.0.2", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "html-comment-regex": "^1.1.2", + "import-fresh": "^2.0.0", + "indexes-of": "^1.0.1", + "is-absolute-url": "^2.1.0", + "is-arrayish": "^0.2.1", + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-callable": "^1.2.3", + "is-color-stop": "^1.1.0", + "is-date-object": "^1.0.2", + "is-directory": "^0.3.1", + "is-negative-zero": "^2.0.1", + "is-number-object": "^1.0.4", + "is-obj": "^2.0.0", + "is-regex": "^1.1.2", + "is-resolvable": "^1.1.0", + "is-string": "^1.0.5", + "is-svg": "^3.0.0", + "is-symbol": "^1.0.3", + "js-yaml": "^3.14.1", + "json-parse-better-errors": "^1.0.2", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0", + "matter-js": "^0.16.1", + "mdn-data": "^2.0.4", + minimist: "^1.2.5", + mkdirp: "^0.5.5", + "node-releases": "^1.1.71", + "normalize-url": "^3.3.0", + "nth-check": "^1.0.2", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "object.getownpropertydescriptors": "^2.1.2", + "object.values": "^1.1.3", + "parse-json": "^4.0.0", + postcss: "^7.0.35", + "postcss-calc": "^7.0.5", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-selector-parser": "^3.1.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1", + "postcss-value-parser": "^3.3.1", + q: "^1.5.1", + "resolve-from": "^3.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0", + sax: "^1.2.4", + "simple-swizzle": "^0.2.2", + "source-map": "^0.6.1", + "sprintf-js": "^1.0.3", + stable: "^0.1.8", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + stylehacks: "^4.0.3", + "supports-color": "^6.1.0", + svgo: "^1.3.2", + timsort: "^0.3.0", + typescript: "^4.2.3", + "unbox-primitive": "^1.0.0", + uniq: "^1.0.1", + uniqs: "^2.0.0", + unquote: "^1.1.1", + "util-deprecate": "^1.0.2", + "util.promisify": "^1.0.1", + vendors: "^1.0.4", + "which-boxed-primitive": "^1.0.2" + }, + repository: { + type: "git", + url: "git+https://github.com/lipten/skulpt-pygame-zero.git" + }, + keywords: [], + author: "", + license: "ISC", + bugs: { + url: "https://github.com/lipten/skulpt-pygame-zero/issues" + }, + homepage: "https://github.com/lipten/skulpt-pygame-zero#readme", + _id: "skulpt-pygame-zero@0.2.3-alpha3", + dependencies: { + "@pixi/graphics": "^6.0.1" + } + }; + var th = Kb(sh); + var uh = window.Sk + , re = { + // "./pgzrun/__init__.js": "https://cdn.jsdelivr.net/npm/skulpt-pygame-zero@" + th.d.version + "/dist/pygame-zero.js" + "./pgzrun/__init__.js": "https://cdn.jsdelivr.net/gh/LIAO-wanting/skulpt_pj@main/src/pgzhelper/pygamezero.js" + } + , se = { + usePyGameZero: function(e) { + var n = this; + return function(t) { + return n.matchModelName(t) ? n.load(t) : e.call(this, t) + } + }, + load: function(e) { + return uh.misceval.promiseToSuspension(new Promise(function(n, t) { + oe("https://cdn.bootcdn.net/ajax/libs/pixi.js/5.3.4/pixi.min.js", "PIXI").then(function() { + fetch(re[e]).then(function(e) { + window.PIXI.utils.skipHello(); + var t = e.text(); + n(t) + }) + }) + } + )) + }, + matchModelName: function(e) { + return Object.keys(re).includes(e) + }, + setContainer: function(e) { + this.container = e + }, + reset: function() { + this._handleReset() + }, + _handleReset: function() {}, + _onRunning: function(e) { + this.app = e + }, + _moduleCache: { + App: null, + timerMap: new Map, + soundMap: {}, + music: new Audio, + windowListener: {} + } + }; + Lb.PyGameZero = se, + window.PyGameZero = se; + if (true) { + module.exports = Lb + } else {} +} +)(); + + +/***/ }), + +/***/ "./others/skulpt/skulpt-stdlib.js": +/*!****************************************!*\ + !*** ./others/skulpt/skulpt-stdlib.js ***! + \****************************************/ +/***/ (() => { + +Sk.builtinFiles={"files":{"src/builtin/sys.js":"var $builtinmodule=function(){var b,a=Math.pow,c={},d=[],e=Sk.getSysArgv();for(b=0;b= 0:\n if self.pos + length < newpos:\n newpos = self.pos + length\n r = self.buf[self.pos:newpos]\n self.pos = newpos\n return r\n\n def readlines(self, sizehint = 0):\n \"\"\"Read until EOF using readline() and return a list containing the\n lines thus read.\n\n If the optional sizehint argument is present, instead of reading up\n to EOF, whole lines totalling approximately sizehint bytes (or more\n to accommodate a final whole line).\n \"\"\"\n total = 0\n lines = []\n line = self.readline()\n while line:\n lines.append(line)\n total += len(line)\n if 0 < sizehint <= total:\n break\n line = self.readline()\n return lines\n\n def truncate(self, size=None):\n \"\"\"Truncate the file's size.\n\n If the optional size argument is present, the file is truncated to\n (at most) that size. The size defaults to the current position.\n The current file position is not changed unless the position\n is beyond the new file size.\n\n If the specified size exceeds the file's current size, the\n file remains unchanged.\n \"\"\"\n _complain_ifclosed(self.closed)\n if size is None:\n size = self.pos\n elif size < 0:\n raise IOError(22, \"Negative size not allowed\")\n elif size < self.pos:\n self.pos = size\n self.buf = self.getvalue()[:size]\n self.len = size\n\n def write(self, s):\n \"\"\"Write a string to the file.\n\n There is no return value.\n \"\"\"\n _complain_ifclosed(self.closed)\n if not s: return\n # Force s to be a string or unicode\n if not isinstance(s, str):\n s = str(s)\n spos = self.pos\n slen = self.len\n if spos == slen:\n self.buflist.append(s)\n self.len = self.pos = spos + len(s)\n return\n if spos > slen:\n self.buflist.append('\\0'*(spos - slen))\n slen = spos\n newpos = spos + len(s)\n if spos < slen:\n if self.buflist:\n self.buf += ''.join(self.buflist)\n self.buflist = [self.buf[:spos], s, self.buf[newpos:]]\n self.buf = ''\n if newpos > slen:\n slen = newpos\n else:\n self.buflist.append(s)\n slen = newpos\n self.len = slen\n self.pos = newpos\n\n def writelines(self, iterable):\n \"\"\"Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings. There\n is no return value.\n\n (The name is intended to match readlines(); writelines() does not add\n line separators.)\n \"\"\"\n write = self.write\n for line in iterable:\n write(line)\n\n def flush(self):\n \"\"\"Flush the internal buffer\n \"\"\"\n _complain_ifclosed(self.closed)\n\n def getvalue(self):\n \"\"\"\n Retrieve the entire contents of the \"file\" at any time before\n the StringIO object's close() method is called.\n\n The StringIO object can accept either Unicode or 8-bit strings,\n but mixing the two may take some care. If both are used, 8-bit\n strings that cannot be interpreted as 7-bit ASCII (that use the\n 8th bit) will cause a UnicodeError to be raised when getvalue()\n is called.\n \"\"\"\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += ''.join(self.buflist)\n self.buflist = []\n return self.buf\n","src/lib/UserDict.py":"raise NotImplementedError(\"UserDict is not yet implemented in Skulpt\")\n","src/lib/UserList.py":"raise NotImplementedError(\"UserList is not yet implemented in Skulpt\")\n","src/lib/UserString.py":"raise NotImplementedError(\"UserString is not yet implemented in Skulpt\")\n","src/lib/_LWPCookieJar.py":"raise NotImplementedError(\"_LWPCookieJar is not yet implemented in Skulpt\")\n","src/lib/_MozillaCookieJar.py":"raise NotImplementedError(\"_MozillaCookieJar is not yet implemented in Skulpt\")\n","src/lib/__future__.py":"raise NotImplementedError(\"__future__ is not yet implemented in Skulpt\")\n","src/lib/__phello__.foo.py":"raise NotImplementedError(\"__phello__.foo is not yet implemented in Skulpt\")\n","src/lib/_abcoll.py":"raise NotImplementedError(\"_abcoll is not yet implemented in Skulpt\")\n","src/lib/_strptime.py":"raise NotImplementedError(\"_strptime is not yet implemented in Skulpt\")\n","src/lib/_threading_local.py":"raise NotImplementedError(\"_threading_local is not yet implemented in Skulpt\")\n","src/lib/abc.py":"raise NotImplementedError(\"abc is not yet implemented in Skulpt\")\n","src/lib/aifc.py":"raise NotImplementedError(\"aifc is not yet implemented in Skulpt\")\n","src/lib/antigravity.py":"import webbrowser\n\nwebbrowser.open(\"https://xkcd.com/353/\")\n","src/lib/anydbm.py":"raise NotImplementedError(\"anydbm is not yet implemented in Skulpt\")\n","src/lib/array.js":"$builtinmodule=function(){var a={},b=[\"c\",\"b\",\"B\",\"u\",\"h\",\"H\",\"i\",\"I\",\"l\",\"L\",\"f\",\"d\"];return a.__name__=new Sk.builtin.str(\"array\"),a.array=Sk.misceval.buildClass(a,function(a,c){c.__init__=new Sk.builtin.func(function(a,c,d){if(Sk.builtin.pyCheckArgsLen(\"__init__\",arguments.length,2,3),-1==b.indexOf(Sk.ffi.remapToJs(c)))throw new Sk.builtin.ValueError(\"bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)\");if(d&&!Sk.builtin.checkIterable(d))throw new Sk.builtin.TypeError(\"iteration over non-sequence\");if(a.$d.mp$ass_subscript(new Sk.builtin.str(\"typecode\"),c),a.$d.mp$ass_subscript(new Sk.builtin.str(\"__module__\"),new Sk.builtin.str(\"array\")),a.typecode=c,void 0===d)a.internalIterable=new Sk.builtin.list;else if(d instanceof Sk.builtin.list)a.internalIterable=d;else for(a.internalIterable=new Sk.builtin.list,iter=Sk.abstr.iter(d),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])}),c.__repr__=new Sk.builtin.func(function(a){var b=Sk.ffi.remapToJs(a.typecode),c=\"\";return Sk.ffi.remapToJs(a.internalIterable).length&&(\"c\"==Sk.ffi.remapToJs(a.typecode)?c=\", '\"+Sk.ffi.remapToJs(a.internalIterable).join(\"\")+\"'\":c=\", \"+Sk.ffi.remapToJs(Sk.misceval.callsimArray(a.internalIterable.__repr__,[a.internalIterable]))),new Sk.builtin.str(\"array('\"+b+\"'\"+c+\")\")}),c.__str__=c.__repr__,c.__getattribute__=new Sk.builtin.func(function(a,b){return a.tp$getattr(b)}),c.append=new Sk.builtin.func(function(a,b){return Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,b]),Sk.builtin.none.none$}),c.extend=new Sk.builtin.func(function(a,b){if(Sk.builtin.pyCheckArgsLen(\"__init__\",arguments.length,2,2),!Sk.builtin.checkIterable(b))throw new Sk.builtin.TypeError(\"iteration over non-sequence\");for(iter=Sk.abstr.iter(b),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])})},\"array\",[]),a};","src/lib/ast.py":"raise NotImplementedError(\"ast is not yet implemented in Skulpt\")\n","src/lib/asynchat.py":"raise NotImplementedError(\"asynchat is not yet implemented in Skulpt\")\n","src/lib/asyncore.py":"raise NotImplementedError(\"asyncore is not yet implemented in Skulpt\")\n","src/lib/atexit.py":"raise NotImplementedError(\"atexit is not yet implemented in Skulpt\")\n","src/lib/audiodev.py":"raise NotImplementedError(\"audiodev is not yet implemented in Skulpt\")\n","src/lib/base64.py":"raise NotImplementedError(\"base64 is not yet implemented in Skulpt\")\n","src/lib/bdb.py":"raise NotImplementedError(\"bdb is not yet implemented in Skulpt\")\n","src/lib/binhex.py":"raise NotImplementedError(\"binhex is not yet implemented in Skulpt\")\n","src/lib/bisect.py":"\"\"\"Bisection algorithms.\"\"\"\n\ndef insort_right(a, x, lo=0, hi=None):\n \"\"\"Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the right of the rightmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n \"\"\"\n\n if lo < 0:\n raise ValueError('lo must be non-negative')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n a.insert(lo, x)\n\ndef bisect_right(a, x, lo=0, hi=None):\n \"\"\"Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e <= x, and all e in\n a[i:] have e > x. So if x already appears in the list, a.insert(x) will\n insert just after the rightmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n \"\"\"\n\n if lo < 0:\n raise ValueError('lo must be non-negative')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n return lo\n\ndef insort_left(a, x, lo=0, hi=None):\n \"\"\"Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the left of the leftmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n \"\"\"\n\n if lo < 0:\n raise ValueError('lo must be non-negative')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n a.insert(lo, x)\n\n\ndef bisect_left(a, x, lo=0, hi=None):\n \"\"\"Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e < x, and all e in\n a[i:] have e >= x. So if x already appears in the list, a.insert(x) will\n insert just before the leftmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n \"\"\"\n\n if lo < 0:\n raise ValueError('lo must be non-negative')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n return lo\n\n# Overwrite above definitions with a fast C implementation\ntry:\n from _bisect import *\nexcept ImportError:\n pass\n\n# Create aliases\nbisect = bisect_right\ninsort = insort_right\n","src/lib/bsddb/__init__.py":"raise NotImplementedError(\"bsddb is not yet implemented in Skulpt\")\n","src/lib/cProfile.py":"raise NotImplementedError(\"cProfile is not yet implemented in Skulpt\")\n","src/lib/calendar.py":"raise NotImplementedError(\"calendar is not yet implemented in Skulpt\")\n","src/lib/cgi.py":"raise NotImplementedError(\"cgi is not yet implemented in Skulpt\")\n","src/lib/cgitb.py":"raise NotImplementedError(\"cgitb is not yet implemented in Skulpt\")\n","src/lib/chunk.py":"raise NotImplementedError(\"chunk is not yet implemented in Skulpt\")\n","src/lib/cmd.py":"raise NotImplementedError(\"cmd is not yet implemented in Skulpt\")\n","src/lib/code.py":"raise NotImplementedError(\"code is not yet implemented in Skulpt\")\n","src/lib/codecs.py":"raise NotImplementedError(\"codecs is not yet implemented in Skulpt\")\n","src/lib/codeop.py":"raise NotImplementedError(\"codeop is not yet implemented in Skulpt\")\n","src/lib/collections.js":"function $builtinmodule(){const a={};return Sk.misceval.chain(Sk.importModule(\"keyword\",!1,!0),b=>(a._iskeyword=b.$d.iskeyword,Sk.importModule(\"itertools\",!1,!0)),b=>(a._chain=b.$d.chain,a._starmap=b.$d.starmap,a._repeat=b.$d.repeat,Sk.importModule(\"operator\",!1,!0)),b=>{a._itemgetter=b.$d.itemgetter},()=>collections_mod(a))}function collections_mod(a){function counterNumberSlot(b){return function(c){if(void 0!==c&&!(c instanceof a.Counter))return Sk.builtin.NotImplemented.NotImplemented$;const d=new a.Counter;return b.call(this,d,c),d}}function counterInplaceSlot(a,b){return function(c){if(!(c instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError(\"Counter \"+a+\"= \"+Sk.abstr.typeName(c)+\" is not supported\");return b.call(this,c),this.keep$positive()}}function namedtuple(b,c,d,l,m){function _make(a,b){return a.prototype.tp$new(Sk.misceval.arrayFromIterable(b))}function _asdict(a){const b=[];for(let c=0;c\"'\"+a.$jsstr()+\"'\")+\"]\")}return f}if(b=b.tp$str(),Sk.misceval.isTrue(Sk.misceval.callsimArray(a._iskeyword,[b])))throw new Sk.builtin.ValueError(\"Type names and field names cannot be a keyword: '\"+Sk.misceval.objectRepr(b)+\"'\");const n=b.$jsstr();if(e.test(n)||!g.test(n)||!n)throw new Sk.builtin.ValueError(\"Type names and field names must be valid identifiers: '\"+n+\"'\");let o,p;if(Sk.builtin.checkString(c))o=c.$jsstr().replace(h,\" \").split(j),1==o.length&&\"\"===o[0]&&(o=[]),p=o.map(a=>new Sk.builtin.str(a));else{o=[],p=[];for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext())b=b.tp$str(),p.push(b),o.push(b.$jsstr())}let q=new Set;if(Sk.misceval.isTrue(d))for(i=0;io.length)throw new Sk.builtin.TypeError(\"Got more default values than field names\");for(let a=0,b=p.length-t.length;bo[b]+\"=\"+Sk.misceval.objectRepr(a));return new Sk.builtin.str(Sk.abstr.typeName(this)+\"(\"+a.join(\", \")+\")\")}},proto:Object.assign({__module__:Sk.builtin.checkNone(m)?Sk.globals.__name__:m,__slots__:new Sk.builtin.tuple,_fields:r,_field_defaults:u,_make:new Sk.builtin.classmethod(new Sk.builtin.func(_make)),_asdict:new Sk.builtin.func(_asdict),_replace:new Sk.builtin.func(_replace)},v)})}a.__all__=new Sk.builtin.list([\"deque\",\"defaultdict\",\"namedtuple\",\"Counter\",\"OrderedDict\"].map(a=>new Sk.builtin.str(a))),a.defaultdict=Sk.abstr.buildNativeClass(\"collections.defaultdict\",{constructor:function defaultdict(a,b){this.default_factory=a,Sk.builtin.dict.call(this,b)},base:Sk.builtin.dict,methods:{copy:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__copy__:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__missing__:{$meth(a){if(Sk.builtin.checkNone(this.default_factory))throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(a));else{const b=Sk.misceval.callsimArray(this.default_factory,[]);return this.mp$ass_subscript(a,b),b}},$flags:{OneArg:!0}}},getsets:{default_factory:{$get(){return this.default_factory},$set(a){a=a||Sk.builtin.none.none$,this.default_factory=a}}},slots:{tp$doc:\"defaultdict(default_factory[, ...]) --> dict with default factory\\n\\nThe default factory is called without arguments to produce\\na new value when a key is not present, in __getitem__ only.\\nA defaultdict compares equal to a dict with the same items.\\nAll remaining arguments are treated the same as if they were\\npassed to the dict constructor, including keyword arguments.\\n\",tp$init(a,b){const c=a.shift();if(void 0===c)this.default_factory=Sk.builtin.none.none$;else if(!Sk.builtin.checkCallable(c)&&!Sk.builtin.checkNone(c))throw new Sk.builtin.TypeError(\"first argument must be callable\");else this.default_factory=c;return Sk.builtin.dict.prototype.tp$init.call(this,a,b)},$r(){const a=Sk.misceval.objectRepr(this.default_factory),b=Sk.builtin.dict.prototype.$r.call(this).v;return new Sk.builtin.str(\"defaultdict(\"+a+\", \"+b+\")\")}},proto:{$copy(){const b=[];return Sk.misceval.iterFor(Sk.abstr.iter(this),a=>{b.push(a),b.push(this.mp$subscript(a))}),new a.defaultdict(this.default_factory,b)}}}),a.Counter=Sk.abstr.buildNativeClass(\"Counter\",{constructor:function Counter(){this.$d=new Sk.builtin.dict,Sk.builtin.dict.apply(this)},base:Sk.builtin.dict,methods:{elements:{$flags:{NoArgs:!0},$meth(){const b=a._chain.tp$getattr(new Sk.builtin.str(\"from_iterable\")),c=a._starmap,d=a._repeat,e=Sk.misceval.callsimArray;return e(b,[e(c,[d,e(this.tp$getattr(this.str$items))])])}},most_common:{$flags:{NamedArgs:[\"n\"],Defaults:[Sk.builtin.none.none$]},$meth(a){length=this.sq$length(),Sk.builtin.checkNone(a)?a=length:(a=Sk.misceval.asIndexOrThrow(a),a=a>length?length:0>a?0:a);const b=this.$items().sort((c,a)=>Sk.misceval.richCompareBool(c[1],a[1],\"Lt\")?1:Sk.misceval.richCompareBool(c[1],a[1],\"Gt\")?-1:0);return new Sk.builtin.list(b.slice(0,a).map(a=>new Sk.builtin.tuple(a)))}},update:{$flags:{FastCall:!0},$meth(a,b){return Sk.abstr.checkArgsLen(\"update\",a,0,1),this.counter$update(a,b)}},subtract:{$flags:{FastCall:!0},$meth(a,b){Sk.abstr.checkArgsLen(\"subtract\",a,0,1);const c=a[0];if(void 0!==c)if(c instanceof Sk.builtin.dict)for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),\"Sub\"))}else for(iter=Sk.abstr.iter(c),k=iter.tp$iternext();void 0!==k;k=iter.tp$iternext()){const a=this.mp$subscript(k);this.mp$ass_subscript(k,Sk.abstr.numberBinOp(a,this.$one,\"Sub\"))}b=b||[];for(let c=0;c>> c = Counter('abcdeabcdabcaba') # count elements from a string\\n\\n >>> c.most_common(3) # three most common elements\\n [('a', 5), ('b', 4), ('c', 3)]\\n >>> sorted(c) # list all unique elements\\n ['a', 'b', 'c', 'd', 'e']\\n >>> ''.join(sorted(c.elements())) # list elements with repetitions\\n 'aaaaabbbbcccdde'\\n >>> sum(c.values()) # total of all counts\\n 15\\n\\n >>> c['a'] # count of letter 'a'\\n 5\\n >>> for elem in 'shazam': # update counts from an iterable\\n ... c[elem] += 1 # by adding 1 to each element's count\\n >>> c['a'] # now there are seven 'a'\\n 7\\n >>> del c['b'] # remove all 'b'\\n >>> c['b'] # now there are zero 'b'\\n 0\\n\\n >>> d = Counter('simsalabim') # make another counter\\n >>> c.update(d) # add in the second counter\\n >>> c['a'] # now there are nine 'a'\\n 9\\n\\n >>> c.clear() # empty the counter\\n >>> c\\n Counter()\\n\\n Note: If a count is set to zero or reduced to zero, it will remain\\n in the counter until the entry is deleted or the counter is cleared:\\n\\n >>> c = Counter('aaabbc')\\n >>> c['b'] -= 2 # reduce the count of 'b' by two\\n >>> c.most_common() # 'b' is still in, but its count is zero\\n [('a', 3), ('c', 1), ('b', 0)]\\n\\n\",tp$init(a,b){return Sk.abstr.checkArgsLen(this.tpjs_name,a,0,1),this.counter$update(a,b)},$r(){const a=0{Sk.misceval.richCompareBool(c,this.$zero,\"Gt\")&&a.mp$ass_subscript(b,c)})}),nb$negative:counterNumberSlot(function(a){this.$items().forEach(([b,c])=>{Sk.misceval.richCompareBool(c,this.$zero,\"Lt\")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,\"Sub\"))})}),nb$subtract:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),\"Sub\");Sk.misceval.richCompareBool(e,this.$zero,\"Gt\")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\"Lt\")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,\"Sub\"))})}),nb$add:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),\"Add\");Sk.misceval.richCompareBool(e,this.$zero,\"Gt\")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\"Gt\")&&a.mp$ass_subscript(b,c)})}),nb$inplace_add:counterInplaceSlot(\"+\",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,\"Add\");this.mp$ass_subscript(a,c)})}),nb$inplace_subtract:counterInplaceSlot(\"-\",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,\"Sub\");this.mp$ass_subscript(a,c)})}),nb$or:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,\"Lt\")?e:d;Sk.misceval.richCompareBool(f,this.$zero,\"Gt\")&&a.mp$ass_subscript(c,f)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\"Gt\")&&a.mp$ass_subscript(b,c)})}),nb$and:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,\"Lt\")?d:e;Sk.misceval.richCompareBool(f,this.$zero,\"Gt\")&&a.mp$ass_subscript(c,f)})}),nb$inplace_and:counterInplaceSlot(\"&\",function(a){this.$items().forEach(([b,c])=>{const d=a.mp$subscript(b);Sk.misceval.richCompareBool(d,c,\"Lt\")&&this.mp$ass_subscript(b,d)})}),nb$inplace_or:counterInplaceSlot(\"|\",function(a){a.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.mp$subscript(a),\"Gt\")&&this.mp$ass_subscript(a,b)})}),nb$reflected_and:null,nb$reflected_or:null,nb$reflected_add:null,nb$reflected_subtract:null},proto:{keep$positive(){return this.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.$zero,\"LtE\")&&this.mp$ass_subscript(a)}),this},$zero:new Sk.builtin.int_(0),$one:new Sk.builtin.int_(1),str$items:new Sk.builtin.str(\"items\"),counter$update(a,b){const c=a[0];if(void 0!==c)if(!Sk.builtin.checkMapping(c))for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,this.$one,\"Add\"))}else if(!this.sq$length())this.update$common(a,void 0,\"update\");else for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),\"Add\"))}if(b&&b.length)if(!this.sq$length())this.update$common([],b,\"update\");else for(let a=0;a deque object\\n\\nA list-like sequence optimized for data accesses near its endpoints.\",tp$hash:Sk.builtin.none.none$,tp$new:Sk.generic.new,tp$init(a,b){if([iterable,maxlen]=Sk.abstr.copyKeywordsToNamedArgs(\"deque\",[\"iterable\",\"maxlen\"],a,b),void 0!==maxlen&&!Sk.builtin.checkNone(maxlen))if(maxlen=Sk.misceval.asIndexSized(maxlen,Sk.builtin.OverflowError,\"an integer is required\"),0>maxlen)throw new Sk.builtin.ValueError(\"maxlen must be non-negative\");else this.maxlen=maxlen;this.$clear(),void 0!==iterable&&this.$extend(iterable)},tp$getattr:Sk.generic.getAttr,tp$richcompare(b,c){var d=Math.max;if(this===b&&Sk.misceval.opAllowsEquality(c))return!0;if(!(b instanceof a.deque))return Sk.builtin.NotImplemented.NotImplemented$;const e=b,f=this.v;b=b.v;const g=this.tail-this.head&this.mask,h=e.tail-e.head&e.mask;let j,l=d(g,h);if(g===h)for(l=0;l=g||l>=h)switch(c){case\"Lt\":return gh;case\"GtE\":return g>=h;}return\"Eq\"!==c&&(\"NotEq\"===c||Sk.misceval.richCompareBool(f[this.head+l&this.mask],b[e.head+l&e.mask],c))},tp$iter(){return new c(this)},$r(){const a=[],b=this.tail-this.head&this.mask;if(this.$entered_repr)return new Sk.builtin.str(\"[...]\");this.$entered_repr=!0;for(let c=0;c=a&&c.$clear();for(let e=1;e=b||a<-b)throw new Sk.builtin.IndexError(\"deque index out of range\");const c=(0<=a?this.head:this.tail)+a&this.mask;return this.v[c]},mp$ass_subscript(a,b){a=Sk.misceval.asIndexOrThrow(a);const c=this.tail-this.head&this.mask;if(a>=c||a<-c)throw new Sk.builtin.IndexError(\"deque index out of range\");void 0===b?this.del$item(a):this.set$item(a,b)},nb$inplace_add(a){for(this.maxlen=void 0,it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i);return this},nb$inplace_multiply(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError,\"can't multiply sequence by non-int of type '{tp$name}'\"),0>=a&&this.$clear();const b=this.$copy(),c=this.tail-this.head&this.mask;for(let d=1;d integer -- return number of occurrences of value\"},extend:{$meth(a){return this.$extend(a),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Extend the right side of the deque with elements from the iterable\"},extendleft:{$meth(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$pushLeft(i);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Extend the left side of the deque with elements from the iterable\"},index:{$meth(a,b,c){const d=this.$index(a,b,c);if(void 0!==d)return new Sk.builtin.int_(d);throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+\" is not in deque\")},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"D.index(value, [start, [stop]]) -> integer -- return first index of value.\\nRaises ValueError if the value is not present.\"},insert:{$meth(a,b){a=Sk.misceval.asIndexOrThrow(a,\"integer argument expected, got {tp$name}\");const c=this.tail-this.head&this.mask;if(void 0!==this.maxlen&&c>=this.maxlen)throw new Sk.builtin.IndexError(\"deque already at its maximum size\");a>c&&(a=c),a<=-c&&(a=0);const d=(0<=a?this.head:this.tail)+a&this.mask;let e=this.tail;for(this.tail=this.tail+1&this.mask;e!==d;){const a=e-1&this.mask;this.v[e]=this.v[a],e=a}return this.v[d]=b,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1),Sk.builtin.none.none$},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:\"D.insert(index, object) -- insert object before index\"},pop:{$meth(){return this.$pop()},$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove and return the rightmost element.\"},popleft:{$meth(){return this.$popLeft()},$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove and return the leftmost element.\"},remove:{$meth(a){const b=this.$index(a);if(void 0===b)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+\" is not in deque\");const c=this.head+b&this.mask;for(let b=c;b!==this.tail;){const a=b+1&this.mask;this.v[b]=this.v[a],b=a}this.tail=this.tail-1&this.mask;var d=this.tail-this.head&this.mask;d>>1&&this.$resize(d,this.v.length>>>1)},$flags:{OneArg:!0},$textsig:null,$doc:\"D.remove(value) -- remove first occurrence of value.\"},__reversed__:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.__reversed__() -- return a reverse iterator over the deque\"},reverse:{$meth(){const c=this.head,d=this.tail,e=this.mask,f=this.tail-this.head&this.mask;for(let g=0;g<~~(f/2);g++){const f=d-g-1&e,a=c+g&e,b=this.v[f];this.v[f]=this.v[a],this.v[a]=b}return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.reverse() -- reverse *IN PLACE*\"},rotate:{$meth(a){a=void 0===a?1:Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);const c=this.head,d=this.tail;if(0===a||c===d)return this;if(this.head=c-a&this.mask,this.tail=d-a&this.mask,0a;e--){const f=d-e&this.mask,a=c-e&this.mask;this.v[f]=this.v[a],this.v[a]=void 0}return Sk.builtin.none.none$},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.\"}},getsets:{maxlen:{$get(){return void 0===this.maxlen?Sk.builtin.none.none$:new Sk.builtin.int_(this.maxlen)},$doc:\"maximum size of a deque or None if unbounded\"}},proto:{$clear(){this.head=0,this.tail=0,this.mask=1,this.v=[,,]},$copy(){return new a.deque(this.v.slice(0),this.maxlen,this.head,this.tail,this.mask)},$extend(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i)},set$item(a,b){const c=(0<=a?this.head:this.tail)+a&this.mask;this.v[c]=b},del$item(a){const b=(0<=a?this.head:this.tail)+a&this.mask;for(let c=b;c!==this.tail;){const a=c+1&this.mask;this.v[c]=this.v[a],c=a}const c=this.tail-this.head&this.mask;this.tail=this.tail-1&this.mask,c>>1&&this.$resize(c,this.v.length>>>1)},$push(a){this.v[this.tail]=a,this.tail=this.tail+1&this.mask,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$popLeft(),this},$pushLeft(a){this.head=this.head-1&this.mask,this.v[this.head]=a,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$pop(),this},$pop(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\"pop from an empty deque\");this.tail=this.tail-1&this.mask;const a=this.v[this.tail];this.v[this.tail]=void 0;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$popLeft(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\"pop from an empty deque\");const a=this.v[this.head];this.v[this.head]=void 0,this.head=this.head+1&this.mask;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$resize(a,b){const c=this.head,d=this.mask;if(this.head=0,this.tail=a,this.mask=b-1,0===c)return void(this.v.length=b);const e=Array(b);for(let f=0;f=this.$length)){const a=(0<=this.$index?this.$head:this.$tail)+this.$index&this.$mask;return this.$index++,this.dq[a]}},methods:{__length_hint__:{$meth:function __length_hint__(){return new Sk.builtin.int_(this.$length-this.$index)},$flags:{NoArgs:!0}}}}),d=Sk.abstr.buildIteratorClass(\"_collections._deque_reverse_iterator\",{constructor:function _deque_reverse_iterator(a){this.$index=(a.tail-a.head&a.mask)-1,this.dq=a.v,this.$head=a.head,this.$mask=a.mask},iternext(){if(!(0>this.$index)){const a=this.$head+this.$index&this.$mask;return this.$index--,this.dq[a]}},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef}}),e=new RegExp(/^[0-9].*/),f=new RegExp(/^[0-9_].*/),g=new RegExp(/^\\w*$/),h=/,/g,j=/\\s+/;return namedtuple.co_argcount=2,namedtuple.co_kwonlyargcount=3,namedtuple.$kwdefs=[Sk.builtin.bool.false$,Sk.builtin.none.none$,Sk.builtin.none.none$],namedtuple.co_varnames=[\"typename\",\"field_names\",\"rename\",\"defaults\",\"module\"],a.namedtuple=new Sk.builtin.func(namedtuple),a}","src/lib/colorsys.py":"raise NotImplementedError(\"colorsys is not yet implemented in Skulpt\")\n","src/lib/commands.py":"raise NotImplementedError(\"commands is not yet implemented in Skulpt\")\n","src/lib/compileall.py":"raise NotImplementedError(\"compileall is not yet implemented in Skulpt\")\n","src/lib/compiler/__init__.py":"raise NotImplementedError(\"compiler is not yet implemented in Skulpt\")\n","src/lib/config/__init__.py":"raise NotImplementedError(\"config is not yet implemented in Skulpt\")\n","src/lib/contextlib.py":"raise NotImplementedError(\"contextlib is not yet implemented in Skulpt\")\n","src/lib/cookielib.py":"raise NotImplementedError(\"cookielib is not yet implemented in Skulpt\")\n","src/lib/copy.py":"\"\"\"\nThis file was modified from CPython.\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\n\"\"\"\nimport types\nclass Error(Exception):\n pass\nerror = Error \nclass _EmptyClass:\n pass\ntry:\n long\nexcept NameError:\n long = int\n\ndef copy(x):\n cls = type(x)\n if callable(x):\n return x\n copier = getattr(cls, \"__copy__\", None)\n if copier:\n return copier(x)\n if cls in (type(None), int, float, bool, str, tuple, type, frozenset, long):\n return x\n if (cls == list) or (cls == dict) or (cls == set) or (cls == slice):\n return cls(x)\n try:\n getstate = getattr(x, \"__getstate__\", None)\n setstate = getattr(x, \"__setstate__\", None)\n initargs = getattr(x, \"__getinitargs__\", None)\n except:\n reductor = False\n if getstate or setstate or initargs:\n raise NotImplementedError(\"Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()\")\n reductor = getattr(x, \"__reduce_ex__\", None)\n if reductor:\n rv = reductor(4)\n else:\n reductor = getattr(x, \"__reduce__\", None)\n if reductor:\n rv = reductor()\n elif str(cls)[1:6] == \"class\":\n copier = _copy_inst\n return copier(x)\n else:\n raise Error(\"un(shallow)copyable object of type %s\" % cls)\n if isinstance(rv, str):\n return x\n return _reconstruct(x, rv, 0)\n\ndef _copy_inst(x):\n if hasattr(x, '__copy__'):\n return x.__copy__()\n if hasattr(x, '__getinitargs__'):\n args = x.__getinitargs__()\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n if hasattr(x, '__getstate__'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n if hasattr(y, '__setstate__'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\n\nd = _deepcopy_dispatch = {}\n\ndef deepcopy(x, memo=None, _nil=[]):\n \"\"\"Deep copy operation on arbitrary Python objects.\n See the module's __doc__ string for more info.\n \"\"\"\n if memo is None:\n memo = {}\n idx = id(x)\n y = memo.get(idx, _nil)\n if y is not _nil:\n return y\n cls = type(x)\n try:\n getstate = getattr(x, \"__getstate__\", None)\n setstate = getattr(x, \"__setstate__\", None)\n initargs = getattr(x, \"__getinitargs__\", None)\n except:\n reductor = False\n if getstate or setstate or initargs:\n raise NotImplementedError(\"Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()\")\n copier = _deepcopy_dispatch.get(cls)\n if copier:\n y = copier(x, memo)\n elif str(cls)[1:6] == \"class\":\n copier = _deepcopy_dispatch[\"InstanceType\"]\n y = copier(x, memo)\n else:\n try:\n issc = issubclass(cls, type)\n except TypeError: # cls is not a class (old Boost; see SF #502085)\n issc = 0\n if issc:\n y = _deepcopy_atomic(x, memo)\n else:\n copier = getattr(x, \"__deepcopy__\", None)\n if copier:\n y = copier(memo)\n else:\n reductor = getattr(x, \"__reduce_ex__\", None)\n if reductor:\n rv = reductor(2)\n else:\n reductor = getattr(x, \"__reduce__\", None)\n if reductor:\n rv = reductor()\n else:\n raise Error(\n \"un(deep)copyable object of type %s\" % cls)\n y = _reconstruct(x, rv, 1, memo)\n memo[idx] = y\n _keep_alive(x, memo) # Make sure x lives at least as long as d\n return y\n\ndef _deepcopy_atomic(x, memo):\n return x\nd[type(None)] = _deepcopy_atomic\n# d[type(Ellipsis)] = _deepcopy_atomic\nd[type(NotImplemented)] = _deepcopy_atomic\nd[int] = _deepcopy_atomic\nd[float] = _deepcopy_atomic\nd[bool] = _deepcopy_atomic\nd[complex] = _deepcopy_atomic\n# d[bytes] = _deepcopy_atomic\nd[str] = _deepcopy_atomic\n# try:\n# d[types.CodeType] = _deepcopy_atomic\n# except AttributeError:\n# pass\nd[type] = _deepcopy_atomic\n# d[types.BuiltinFunctionType] = _deepcopy_atomic\nd[types.FunctionType] = _deepcopy_atomic\n# d[weakref.ref] = _deepcopy_atomic\n\ndef _deepcopy_list(x, memo):\n y = []\n memo[id(x)] = y\n for a in x:\n y.append(deepcopy(a, memo))\n return y\nd[list] = _deepcopy_list\n\ndef _deepcopy_set(x, memo):\n result = set([]) # make empty set\n memo[id(x)] = result # register this set in the memo for loop checking\n for a in x: # go through elements of set\n result.add(deepcopy(a, memo)) # add the copied elements into the new set\n return result # return the new set\nd[set] = _deepcopy_set\n\ndef _deepcopy_frozenset(x, memo):\n result = frozenset(_deepcopy_set(x,memo)) \n memo[id(x)] = result \n return result\nd[frozenset] = _deepcopy_frozenset\n\ndef _deepcopy_tuple(x, memo):\n y = [deepcopy(a, memo) for a in x]\n # We're not going to put the tuple in the memo, but it's still important we\n # check for it, in case the tuple contains recursive mutable structures.\n try:\n return memo[id(x)]\n except KeyError:\n pass\n for k, j in zip(x, y):\n if k is not j:\n y = tuple(y)\n break\n else:\n y = x\n return y\nd[tuple] = _deepcopy_tuple\n\ndef _deepcopy_dict(x, memo):\n y = {}\n memo[id(x)] = y\n for key, value in x.items():\n y[deepcopy(key, memo)] = deepcopy(value, memo)\n return y\nd[dict] = _deepcopy_dict\n\n# def _deepcopy_method(x, memo): # Copy instance methods\n# y = type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class);\n# return y\nd[types.MethodType] = _deepcopy_atomic\n\ndef _deepcopy_inst(x, memo):\n if hasattr(x, '__deepcopy__'):\n return x.__deepcopy__(memo)\n if hasattr(x, '__getinitargs__'):\n args = x.__getinitargs__()\n args = deepcopy(args, memo)\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n memo[id(x)] = y\n if hasattr(x, '__getstate__'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n state = deepcopy(state, memo)\n if hasattr(y, '__setstate__'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\nd[\"InstanceType\"] = _deepcopy_inst\n\ndef _keep_alive(x, memo):\n \"\"\"Keeps a reference to the object x in the memo.\n Because we remember objects by their id, we have\n to assure that possibly temporary objects are kept\n alive by referencing them.\n We store a reference at the id of the memo, which should\n normally not be used unless someone tries to deepcopy\n the memo itself...\n \"\"\"\n try:\n memo[id(memo)].append(x)\n except KeyError:\n # aha, this is the first one :-)\n memo[id(memo)]=[x]\n\ndef _reconstruct(x, info, deep, memo=None):\n if isinstance(info, str):\n return x\n assert isinstance(info, tuple)\n if memo is None:\n memo = {}\n n = len(info)\n assert n in (2, 3, 4, 5)\n callable, args = info[:2]\n if n > 2:\n state = info[2]\n else:\n state = None\n if n > 3:\n listiter = info[3]\n else:\n listiter = None\n if n > 4:\n dictiter = info[4]\n else:\n dictiter = None\n if deep:\n args = deepcopy(args, memo)\n y = callable(*args)\n memo[id(x)] = y\n\n if state is not None:\n if deep:\n state = deepcopy(state, memo)\n if hasattr(y, '__setstate__'):\n y.__setstate__(state)\n else:\n if isinstance(state, tuple) and len(state) == 2:\n state, slotstate = state\n else:\n slotstate = None\n if state is not None:\n y.__dict__.update(state)\n if slotstate is not None:\n for key, value in slotstate.items():\n setattr(y, key, value)\n\n if listiter is not None:\n for item in listiter:\n if deep:\n item = deepcopy(item, memo)\n y.append(item)\n if dictiter is not None:\n for key, value in dictiter:\n if deep:\n key = deepcopy(key, memo)\n value = deepcopy(value, memo)\n y[key] = value\n return y\n\ndel d\n\ndel types\n\n# Helper for instance creation without calling __init__\nclass _EmptyClass:\n pass","src/lib/copy_reg.py":"raise NotImplementedError(\"copy_reg is not yet implemented in Skulpt\")\n","src/lib/csv.py":"raise NotImplementedError(\"csv is not yet implemented in Skulpt\")\n","src/lib/ctypes/__init__.py":"raise NotImplementedError(\"ctypes is not yet implemented in Skulpt\")\n","src/lib/ctypes/macholib/__init__.py":"raise NotImplementedError(\"macholib is not yet implemented in Skulpt\")\n","src/lib/curses/__init__.py":"raise NotImplementedError(\"curses is not yet implemented in Skulpt\")\n","src/lib/datetime.py":"\"\"\"Concrete date/time and related types -- prototype implemented in Python.\n\nSee http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage\n\nSee also http://dir.yahoo.com/Reference/calendars/\n\nFor a primer on DST, including many current DST rules, see\nhttp://webexhibits.org/daylightsaving/\n\nFor more about DST than you ever wanted to know, see\nftp://elsie.nci.nih.gov/pub/\n\nSources for time zone and DST data: http://www.twinsun.com/tz/tz-link.htm\n\nThis was originally copied from the sandbox of the CPython CVS repository.\nThanks to Tim Peters for suggesting using it.\n\nThis was then copied from PyPy v5.1.0 into Skulpt by Meredydd Luff, removing\n'from __future__ import division' (and replacing division operators accordingly)\nand pickle support (which requires 'struct', which Skulpt does not currently\n[as of 31/8/2016] have)\n\"\"\"\n\nimport time as _time\nimport math as _math\n\n# Python 2-vs-3 compat hack\nimport sys\nunicode = unicode if sys.version_info < (3,) else str\n\n_SENTINEL = object()\n\ndef _cmp(x, y):\n return 0 if x == y else 1 if x > y else -1\n\ndef _round(x):\n return int(_math.floor(x + 0.5) if x >= 0.0 else _math.ceil(x - 0.5))\n\nMINYEAR = 1\nMAXYEAR = 9999\n_MINYEARFMT = 1900\n\n_MAX_DELTA_DAYS = 999999999\n\n# Utility functions, adapted from Python's Demo/classes/Dates.py, which\n# also assumes the current Gregorian calendar indefinitely extended in\n# both directions. Difference: Dates.py calls January 1 of year 0 day\n# number 1. The code here calls January 1 of year 1 day number 1. This is\n# to match the definition of the \"proleptic Gregorian\" calendar in Dershowitz\n# and Reingold's \"Calendrical Calculations\", where it's the base calendar\n# for all computations. See the book for algorithms for converting between\n# proleptic Gregorian ordinals and many other calendar systems.\n\n_DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\n_DAYS_BEFORE_MONTH = [-1]\ndbm = 0\nfor dim in _DAYS_IN_MONTH[1:]:\n _DAYS_BEFORE_MONTH.append(dbm)\n dbm += dim\ndel dbm, dim\n\ndef _is_leap(year):\n \"year -> 1 if leap year, else 0.\"\n return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)\n\ndef _days_before_year(year):\n \"year -> number of days before January 1st of year.\"\n y = year - 1\n return y*365 + y//4 - y//100 + y//400\n\ndef _days_in_month(year, month):\n \"year, month -> number of days in that month in that year.\"\n assert 1 <= month <= 12, month\n if month == 2 and _is_leap(year):\n return 29\n return _DAYS_IN_MONTH[month]\n\ndef _days_before_month(year, month):\n \"year, month -> number of days in year preceding first day of month.\"\n assert 1 <= month <= 12, 'month must be in 1..12'\n return _DAYS_BEFORE_MONTH[month] + (month > 2 and _is_leap(year))\n\ndef _ymd2ord(year, month, day):\n \"year, month, day -> ordinal, considering 01-Jan-0001 as day 1.\"\n assert 1 <= month <= 12, 'month must be in 1..12'\n dim = _days_in_month(year, month)\n assert 1 <= day <= dim, ('day must be in 1..%d' % dim)\n return (_days_before_year(year) +\n _days_before_month(year, month) +\n day)\n\n_DI400Y = _days_before_year(401) # number of days in 400 years\n_DI100Y = _days_before_year(101) # \" \" \" \" 100 \"\n_DI4Y = _days_before_year(5) # \" \" \" \" 4 \"\n\n# A 4-year cycle has an extra leap day over what we'd get from pasting\n# together 4 single years.\nassert _DI4Y == 4 * 365 + 1\n\n# Similarly, a 400-year cycle has an extra leap day over what we'd get from\n# pasting together 4 100-year cycles.\nassert _DI400Y == 4 * _DI100Y + 1\n\n# OTOH, a 100-year cycle has one fewer leap day than we'd get from\n# pasting together 25 4-year cycles.\nassert _DI100Y == 25 * _DI4Y - 1\n\n_US_PER_US = 1\n_US_PER_MS = 1000\n_US_PER_SECOND = 1000000\n_US_PER_MINUTE = 60000000\n_SECONDS_PER_DAY = 24 * 3600\n_US_PER_HOUR = 3600000000\n_US_PER_DAY = 86400000000\n_US_PER_WEEK = 604800000000\n\ndef _ord2ymd(n):\n \"ordinal -> (year, month, day), considering 01-Jan-0001 as day 1.\"\n\n # n is a 1-based index, starting at 1-Jan-1. The pattern of leap years\n # repeats exactly every 400 years. The basic strategy is to find the\n # closest 400-year boundary at or before n, then work with the offset\n # from that boundary to n. Life is much clearer if we subtract 1 from\n # n first -- then the values of n at 400-year boundaries are exactly\n # those divisible by _DI400Y:\n #\n # D M Y n n-1\n # -- --- ---- ---------- ----------------\n # 31 Dec -400 -_DI400Y -_DI400Y -1\n # 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary\n # ...\n # 30 Dec 000 -1 -2\n # 31 Dec 000 0 -1\n # 1 Jan 001 1 0 400-year boundary\n # 2 Jan 001 2 1\n # 3 Jan 001 3 2\n # ...\n # 31 Dec 400 _DI400Y _DI400Y -1\n # 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary\n n -= 1\n n400, n = divmod(n, _DI400Y)\n year = n400 * 400 + 1 # ..., -399, 1, 401, ...\n\n # Now n is the (non-negative) offset, in days, from January 1 of year, to\n # the desired date. Now compute how many 100-year cycles precede n.\n # Note that it's possible for n100 to equal 4! In that case 4 full\n # 100-year cycles precede the desired day, which implies the desired\n # day is December 31 at the end of a 400-year cycle.\n n100, n = divmod(n, _DI100Y)\n\n # Now compute how many 4-year cycles precede it.\n n4, n = divmod(n, _DI4Y)\n\n # And now how many single years. Again n1 can be 4, and again meaning\n # that the desired day is December 31 at the end of the 4-year cycle.\n n1, n = divmod(n, 365)\n\n year += n100 * 100 + n4 * 4 + n1\n if n1 == 4 or n100 == 4:\n assert n == 0\n return year-1, 12, 31\n\n # Now the year is correct, and n is the offset from January 1. We find\n # the month via an estimate that's either exact or one too large.\n leapyear = n1 == 3 and (n4 != 24 or n100 == 3)\n assert leapyear == _is_leap(year)\n month = (n + 50) >> 5\n preceding = _DAYS_BEFORE_MONTH[month] + (month > 2 and leapyear)\n if preceding > n: # estimate is too large\n month -= 1\n preceding -= _DAYS_IN_MONTH[month] + (month == 2 and leapyear)\n n -= preceding\n assert 0 <= n < _days_in_month(year, month)\n\n # Now the year and month are correct, and n is the offset from the\n # start of that month: we're done!\n return year, month, n+1\n\n# Month and day names. For localized versions, see the calendar module.\n_MONTHNAMES = [None, \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n_DAYNAMES = [None, \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"]\n\n\ndef _build_struct_time(y, m, d, hh, mm, ss, dstflag):\n wday = (_ymd2ord(y, m, d) + 6) % 7\n dnum = _days_before_month(y, m) + d\n return _time.struct_time((y, m, d, hh, mm, ss, wday, dnum, dstflag))\n\ndef _format_time(hh, mm, ss, us):\n # Skip trailing microseconds when us==0.\n result = \"%02d:%02d:%02d\" % (hh, mm, ss)\n if us:\n result += \".%06d\" % us\n return result\n\n# Correctly substitute for %z and %Z escapes in strftime formats.\ndef _wrap_strftime(object, format, timetuple):\n year = timetuple[0]\n if year < _MINYEARFMT:\n raise ValueError(\"year=%d is before %d; the datetime strftime() \"\n \"methods require year >= %d\" %\n (year, _MINYEARFMT, _MINYEARFMT))\n # Don't call utcoffset() or tzname() unless actually needed.\n freplace = None # the string to use for %f\n zreplace = None # the string to use for %z\n Zreplace = None # the string to use for %Z\n\n # Scan format for %z and %Z escapes, replacing as needed.\n newformat = []\n push = newformat.append\n i, n = 0, len(format)\n while i < n:\n ch = format[i]\n i += 1\n if ch == '%':\n if i < n:\n ch = format[i]\n i += 1\n if ch == 'f':\n if freplace is None:\n freplace = '%06d' % getattr(object,\n 'microsecond', 0)\n newformat.append(freplace)\n elif ch == 'z':\n if zreplace is None:\n zreplace = \"\"\n if hasattr(object, \"_utcoffset\"):\n offset = object._utcoffset()\n if offset is not None:\n sign = '+'\n if offset < 0:\n offset = -offset\n sign = '-'\n h, m = divmod(offset, 60)\n zreplace = '%c%02d%02d' % (sign, h, m)\n assert '%' not in zreplace\n newformat.append(zreplace)\n elif ch == 'Z':\n if Zreplace is None:\n Zreplace = \"\"\n if hasattr(object, \"tzname\"):\n s = object.tzname()\n if s is not None:\n # strftime is going to have at this: escape %\n Zreplace = s.replace('%', '%%')\n newformat.append(Zreplace)\n else:\n push('%')\n push(ch)\n else:\n push('%')\n else:\n push(ch)\n newformat = \"\".join(newformat)\n return _time.strftime(newformat, timetuple)\n\n# Just raise TypeError if the arg isn't None or a string.\ndef _check_tzname(name):\n if name is not None and not isinstance(name, str):\n raise TypeError(\"tzinfo.tzname() must return None or string, \"\n \"not '%s'\" % type(name))\n\n# name is the offset-producing method, \"utcoffset\" or \"dst\".\n# offset is what it returned.\n# If offset isn't None or timedelta, raises TypeError.\n# If offset is None, returns None.\n# Else offset is checked for being in range, and a whole # of minutes.\n# If it is, its integer value is returned. Else ValueError is raised.\ndef _check_utc_offset(name, offset):\n assert name in (\"utcoffset\", \"dst\")\n if offset is None:\n return\n if not isinstance(offset, timedelta):\n raise TypeError(\"tzinfo.%s() must return None \"\n \"or timedelta, not '%s'\" % (name, type(offset)))\n days = offset.days\n if days < -1 or days > 0:\n offset = 1440 # trigger out-of-range\n else:\n seconds = days * 86400 + offset.seconds\n minutes, seconds = divmod(seconds, 60)\n if seconds or offset.microseconds:\n raise ValueError(\"tzinfo.%s() must return a whole number \"\n \"of minutes\" % name)\n offset = minutes\n if not -1440 < offset < 1440:\n raise ValueError(\"%s()=%d, must be in -1439..1439\" % (name, offset))\n return offset\n\ndef _check_int_field(value):\n if isinstance(value, int):\n return int(value)\n if not isinstance(value, float):\n try:\n value = value.__int__()\n except AttributeError:\n pass\n else:\n if isinstance(value, int):\n return int(value)\n raise TypeError('__int__ method should return an integer')\n raise TypeError('an integer is required')\n raise TypeError('integer argument expected, got float')\n\ndef _check_date_fields(year, month, day):\n year = _check_int_field(year)\n month = _check_int_field(month)\n day = _check_int_field(day)\n if not MINYEAR <= year <= MAXYEAR:\n raise ValueError('year must be in %d..%d' % (MINYEAR, MAXYEAR), year)\n if not 1 <= month <= 12:\n raise ValueError('month must be in 1..12', month)\n dim = _days_in_month(year, month)\n if not 1 <= day <= dim:\n raise ValueError('day must be in 1..%d' % dim, day)\n return year, month, day\n\ndef _check_time_fields(hour, minute, second, microsecond):\n hour = _check_int_field(hour)\n minute = _check_int_field(minute)\n second = _check_int_field(second)\n microsecond = _check_int_field(microsecond)\n if not 0 <= hour <= 23:\n raise ValueError('hour must be in 0..23', hour)\n if not 0 <= minute <= 59:\n raise ValueError('minute must be in 0..59', minute)\n if not 0 <= second <= 59:\n raise ValueError('second must be in 0..59', second)\n if not 0 <= microsecond <= 999999:\n raise ValueError('microsecond must be in 0..999999', microsecond)\n return hour, minute, second, microsecond\n\ndef _check_tzinfo_arg(tz):\n if tz is not None and not isinstance(tz, tzinfo):\n raise TypeError(\"tzinfo argument must be None or of a tzinfo subclass\")\n\n\n# Notes on comparison: In general, datetime module comparison operators raise\n# TypeError when they don't know how to do a comparison themself. If they\n# returned NotImplemented instead, comparison could (silently) fall back to\n# the default compare-objects-by-comparing-their-memory-addresses strategy,\n# and that's not helpful. There are two exceptions:\n#\n# 1. For date and datetime, if the other object has a \"timetuple\" attr,\n# NotImplemented is returned. This is a hook to allow other kinds of\n# datetime-like objects a chance to intercept the comparison.\n#\n# 2. Else __eq__ and __ne__ return False and True, respectively. This is\n# so opertaions like\n#\n# x == y\n# x != y\n# x in sequence\n# x not in sequence\n# dict[x] = y\n#\n# don't raise annoying TypeErrors just because a datetime object\n# is part of a heterogeneous collection. If there's no known way to\n# compare X to a datetime, saying they're not equal is reasonable.\n\ndef _cmperror(x, y):\n raise TypeError(\"can't compare '%s' to '%s'\" % (\n type(x).__name__, type(y).__name__))\n\ndef _normalize_pair(hi, lo, factor):\n if not 0 <= lo <= factor-1:\n inc, lo = divmod(lo, factor)\n hi += inc\n return hi, lo\n\ndef _normalize_datetime(y, m, d, hh, mm, ss, us, ignore_overflow=False):\n # Normalize all the inputs, and store the normalized values.\n ss, us = _normalize_pair(ss, us, 1000000)\n mm, ss = _normalize_pair(mm, ss, 60)\n hh, mm = _normalize_pair(hh, mm, 60)\n d, hh = _normalize_pair(d, hh, 24)\n y, m, d = _normalize_date(y, m, d, ignore_overflow)\n return y, m, d, hh, mm, ss, us\n\ndef _normalize_date(year, month, day, ignore_overflow=False):\n # That was easy. Now it gets muddy: the proper range for day\n # can't be determined without knowing the correct month and year,\n # but if day is, e.g., plus or minus a million, the current month\n # and year values make no sense (and may also be out of bounds\n # themselves).\n # Saying 12 months == 1 year should be non-controversial.\n if not 1 <= month <= 12:\n year, month = _normalize_pair(year, month-1, 12)\n month += 1\n assert 1 <= month <= 12\n\n # Now only day can be out of bounds (year may also be out of bounds\n # for a datetime object, but we don't care about that here).\n # If day is out of bounds, what to do is arguable, but at least the\n # method here is principled and explainable.\n dim = _days_in_month(year, month)\n if not 1 <= day <= dim:\n # Move day-1 days from the first of the month. First try to\n # get off cheap if we're only one day out of range (adjustments\n # for timezone alone can't be worse than that).\n if day == 0: # move back a day\n month -= 1\n if month > 0:\n day = _days_in_month(year, month)\n else:\n year, month, day = year-1, 12, 31\n elif day == dim + 1: # move forward a day\n month += 1\n day = 1\n if month > 12:\n month = 1\n year += 1\n else:\n ordinal = _ymd2ord(year, month, 1) + (day - 1)\n year, month, day = _ord2ymd(ordinal)\n\n if not ignore_overflow and not MINYEAR <= year <= MAXYEAR:\n raise OverflowError(\"date value out of range\")\n return year, month, day\n\ndef _accum(tag, sofar, num, factor, leftover):\n if isinstance(num, int):\n prod = num * factor\n rsum = sofar + prod\n return rsum, leftover\n if isinstance(num, float):\n fracpart, intpart = _math.modf(num)\n prod = int(intpart) * factor\n rsum = sofar + prod\n if fracpart == 0.0:\n return rsum, leftover\n assert isinstance(factor, int)\n fracpart, intpart = _math.modf(factor * fracpart)\n rsum += int(intpart)\n return rsum, leftover + fracpart\n raise TypeError(\"unsupported type for timedelta %s component: %s\" %\n (tag, type(num)))\n\nclass timedelta(object):\n \"\"\"Represent the difference between two datetime objects.\n\n Supported operators:\n\n - add, subtract timedelta\n - unary plus, minus, abs\n - compare to timedelta\n - multiply, divide by int/long\n\n In addition, datetime supports subtraction of two datetime objects\n returning a timedelta, and addition or subtraction of a datetime\n and a timedelta giving a datetime.\n\n Representation: (days, seconds, microseconds). Why? Because I\n felt like it.\n \"\"\"\n __slots__ = '_days', '_seconds', '_microseconds', '_hashcode'\n\n def __new__(cls, days=_SENTINEL, seconds=_SENTINEL, microseconds=_SENTINEL,\n milliseconds=_SENTINEL, minutes=_SENTINEL, hours=_SENTINEL, weeks=_SENTINEL):\n x = 0\n leftover = 0.0\n if microseconds is not _SENTINEL:\n x, leftover = _accum(\"microseconds\", x, microseconds, _US_PER_US, leftover)\n if milliseconds is not _SENTINEL:\n x, leftover = _accum(\"milliseconds\", x, milliseconds, _US_PER_MS, leftover)\n if seconds is not _SENTINEL:\n x, leftover = _accum(\"seconds\", x, seconds, _US_PER_SECOND, leftover)\n if minutes is not _SENTINEL:\n x, leftover = _accum(\"minutes\", x, minutes, _US_PER_MINUTE, leftover)\n if hours is not _SENTINEL:\n x, leftover = _accum(\"hours\", x, hours, _US_PER_HOUR, leftover)\n if days is not _SENTINEL:\n x, leftover = _accum(\"days\", x, days, _US_PER_DAY, leftover)\n if weeks is not _SENTINEL:\n x, leftover = _accum(\"weeks\", x, weeks, _US_PER_WEEK, leftover)\n if leftover != 0.0:\n x += _round(leftover)\n return cls._from_microseconds(x)\n\n @classmethod\n def _from_microseconds(cls, us):\n s, us = divmod(us, _US_PER_SECOND)\n d, s = divmod(s, _SECONDS_PER_DAY)\n return cls._create(d, s, us, False)\n\n @classmethod\n def _create(cls, d, s, us, normalize):\n if normalize:\n s, us = _normalize_pair(s, us, 1000000)\n d, s = _normalize_pair(d, s, 24*3600)\n\n if not -_MAX_DELTA_DAYS <= d <= _MAX_DELTA_DAYS:\n raise OverflowError(\"days=%d; must have magnitude <= %d\" % (d, _MAX_DELTA_DAYS))\n\n self = object.__new__(cls)\n self._days = d\n self._seconds = s\n self._microseconds = us\n self._hashcode = -1\n return self\n\n def _to_microseconds(self):\n return ((self._days * _SECONDS_PER_DAY + self._seconds) * _US_PER_SECOND +\n self._microseconds)\n\n def __repr__(self):\n module = \"datetime.\" if self.__class__ is timedelta else \"\"\n if self._microseconds:\n return \"%s(%d, %d, %d)\" % (module + self.__class__.__name__,\n self._days,\n self._seconds,\n self._microseconds)\n if self._seconds:\n return \"%s(%d, %d)\" % (module + self.__class__.__name__,\n self._days,\n self._seconds)\n return \"%s(%d)\" % (module + self.__class__.__name__, self._days)\n\n def __str__(self):\n mm, ss = divmod(self._seconds, 60)\n hh, mm = divmod(mm, 60)\n s = \"%d:%02d:%02d\" % (hh, mm, ss)\n if self._days:\n def plural(n):\n return n, abs(n) != 1 and \"s\" or \"\"\n s = (\"%d day%s, \" % plural(self._days)) + s\n if self._microseconds:\n s = s + \".%06d\" % self._microseconds\n return s\n\n def total_seconds(self):\n \"\"\"Total seconds in the duration.\"\"\"\n return self._to_microseconds() / 10.0**6\n\n # Read-only field accessors\n @property\n def days(self):\n \"\"\"days\"\"\"\n return self._days\n\n @property\n def seconds(self):\n \"\"\"seconds\"\"\"\n return self._seconds\n\n @property\n def microseconds(self):\n \"\"\"microseconds\"\"\"\n return self._microseconds\n\n def __add__(self, other):\n if isinstance(other, timedelta):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days + other._days,\n self._seconds + other._seconds,\n self._microseconds + other._microseconds,\n True)\n return NotImplemented\n\n def __sub__(self, other):\n if isinstance(other, timedelta):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days - other._days,\n self._seconds - other._seconds,\n self._microseconds - other._microseconds,\n True)\n return NotImplemented\n\n def __neg__(self):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(-self._days,\n -self._seconds,\n -self._microseconds,\n True)\n\n def __pos__(self):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days,\n self._seconds,\n self._microseconds,\n False)\n\n def __abs__(self):\n if self._days < 0:\n return -self\n else:\n return self\n\n def __mul__(self, other):\n if not isinstance(other, int):\n return NotImplemented\n usec = self._to_microseconds()\n return timedelta._from_microseconds(usec * other)\n\n __rmul__ = __mul__\n\n def __div__(self, other):\n if not isinstance(other, int):\n return NotImplemented\n usec = self._to_microseconds()\n return timedelta._from_microseconds(usec // other)\n\n __floordiv__ = __div__\n\n # Comparisons of timedelta objects with other.\n\n def __eq__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) == 0\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) != 0\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) <= 0\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) < 0\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) >= 0\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) > 0\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, timedelta)\n return _cmp(self._getstate(), other._getstate())\n\n def __hash__(self):\n if self._hashcode == -1:\n self._hashcode = hash(self._getstate())\n return self._hashcode\n\n def __nonzero__(self):\n return (self._days != 0 or\n self._seconds != 0 or\n self._microseconds != 0)\n\ntimedelta.min = timedelta(-_MAX_DELTA_DAYS)\ntimedelta.max = timedelta(_MAX_DELTA_DAYS, 24*3600-1, 1000000-1)\ntimedelta.resolution = timedelta(microseconds=1)\n\nclass date(object):\n \"\"\"Concrete date type.\n\n Constructors:\n\n __new__()\n fromtimestamp()\n today()\n fromordinal()\n\n Operators:\n\n __repr__, __str__\n __cmp__, __hash__\n __add__, __radd__, __sub__ (add/radd only with timedelta arg)\n\n Methods:\n\n timetuple()\n toordinal()\n weekday()\n isoweekday(), isocalendar(), isoformat()\n ctime()\n strftime()\n\n Properties (readonly):\n year, month, day\n \"\"\"\n __slots__ = '_year', '_month', '_day', '_hashcode'\n\n def __new__(cls, year, month=None, day=None):\n \"\"\"Constructor.\n\n Arguments:\n\n year, month, day (required, base 1)\n \"\"\"\n year, month, day = _check_date_fields(year, month, day)\n self = object.__new__(cls)\n self._year = year\n self._month = month\n self._day = day\n self._hashcode = -1\n return self\n\n # Additional constructors\n\n @classmethod\n def fromtimestamp(cls, t):\n \"Construct a date from a POSIX timestamp (like time.time()).\"\n y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t)\n return cls(y, m, d)\n\n @classmethod\n def today(cls):\n \"Construct a date from time.time().\"\n t = _time.time()\n return cls.fromtimestamp(t)\n\n @classmethod\n def fromordinal(cls, n):\n \"\"\"Contruct a date from a proleptic Gregorian ordinal.\n\n January 1 of year 1 is day 1. Only the year, month and day are\n non-zero in the result.\n \"\"\"\n y, m, d = _ord2ymd(n)\n return cls(y, m, d)\n\n # Conversions to string\n\n def __repr__(self):\n \"\"\"Convert to formal string, for repr().\n\n >>> dt = datetime(2010, 1, 1)\n >>> repr(dt)\n 'datetime.datetime(2010, 1, 1, 0, 0)'\n\n >>> dt = datetime(2010, 1, 1, tzinfo=timezone.utc)\n >>> repr(dt)\n 'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)'\n \"\"\"\n module = \"datetime.\" if self.__class__ is date else \"\"\n return \"%s(%d, %d, %d)\" % (module + self.__class__.__name__,\n self._year,\n self._month,\n self._day)\n\n # XXX These shouldn't depend on time.localtime(), because that\n # clips the usable dates to [1970 .. 2038). At least ctime() is\n # easily done without using strftime() -- that's better too because\n # strftime(\"%c\", ...) is locale specific.\n\n def ctime(self):\n \"Return ctime() style string.\"\n weekday = self.toordinal() % 7 or 7\n return \"%s %s %2d 00:00:00 %04d\" % (\n _DAYNAMES[weekday],\n _MONTHNAMES[self._month],\n self._day, self._year)\n\n def strftime(self, format):\n \"Format using strftime().\"\n return _wrap_strftime(self, format, self.timetuple())\n\n def __format__(self, fmt):\n if not isinstance(fmt, (str, unicode)):\n raise ValueError(\"__format__ expects str or unicode, not %s\" %\n fmt.__class__.__name__)\n if len(fmt) != 0:\n return self.strftime(fmt)\n return str(self)\n\n def isoformat(self):\n \"\"\"Return the date formatted according to ISO.\n\n This is 'YYYY-MM-DD'.\n\n References:\n - http://www.w3.org/TR/NOTE-datetime\n - http://www.cl.cam.ac.uk/~mgk25/iso-time.html\n \"\"\"\n return \"%04d-%02d-%02d\" % (self._year, self._month, self._day)\n\n __str__ = isoformat\n\n # Read-only field accessors\n @property\n def year(self):\n \"\"\"year (1-9999)\"\"\"\n return self._year\n\n @property\n def month(self):\n \"\"\"month (1-12)\"\"\"\n return self._month\n\n @property\n def day(self):\n \"\"\"day (1-31)\"\"\"\n return self._day\n\n # Standard conversions, __cmp__, __hash__ (and helpers)\n\n def timetuple(self):\n \"Return local time tuple compatible with time.localtime().\"\n return _build_struct_time(self._year, self._month, self._day,\n 0, 0, 0, -1)\n\n def toordinal(self):\n \"\"\"Return proleptic Gregorian ordinal for the year, month and day.\n\n January 1 of year 1 is day 1. Only the year, month and day values\n contribute to the result.\n \"\"\"\n return _ymd2ord(self._year, self._month, self._day)\n\n def replace(self, year=None, month=None, day=None):\n \"\"\"Return a new date with new values for the specified fields.\"\"\"\n if year is None:\n year = self._year\n if month is None:\n month = self._month\n if day is None:\n day = self._day\n return date(year, month, day)\n\n # Comparisons of date objects with other.\n\n def __eq__(self, other):\n if isinstance(other, date):\n return self._cmp(other) == 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, date):\n return self._cmp(other) != 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, date):\n return self._cmp(other) <= 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, date):\n return self._cmp(other) < 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, date):\n return self._cmp(other) >= 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, date):\n return self._cmp(other) > 0\n elif hasattr(other, \"timetuple\"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, date)\n y, m, d = self._year, self._month, self._day\n y2, m2, d2 = other._year, other._month, other._day\n return _cmp((y, m, d), (y2, m2, d2))\n\n def __hash__(self):\n \"Hash.\"\n if self._hashcode == -1:\n self._hashcode = hash(self._getstate())\n return self._hashcode\n\n # Computations\n\n def _add_timedelta(self, other, factor):\n y, m, d = _normalize_date(\n self._year,\n self._month,\n self._day + other.days * factor)\n return date(y, m, d)\n\n def __add__(self, other):\n \"Add a date to a timedelta.\"\n if isinstance(other, timedelta):\n return self._add_timedelta(other, 1)\n return NotImplemented\n\n __radd__ = __add__\n\n def __sub__(self, other):\n \"\"\"Subtract two dates, or a date and a timedelta.\"\"\"\n if isinstance(other, date):\n days1 = self.toordinal()\n days2 = other.toordinal()\n return timedelta._create(days1 - days2, 0, 0, False)\n if isinstance(other, timedelta):\n return self._add_timedelta(other, -1)\n return NotImplemented\n\n def weekday(self):\n \"Return day of the week, where Monday == 0 ... Sunday == 6.\"\n return (self.toordinal() + 6) % 7\n\n # Day-of-the-week and week-of-the-year, according to ISO\n\n def isoweekday(self):\n \"Return day of the week, where Monday == 1 ... Sunday == 7.\"\n # 1-Jan-0001 is a Monday\n return self.toordinal() % 7 or 7\n\n def isocalendar(self):\n \"\"\"Return a 3-tuple containing ISO year, week number, and weekday.\n\n The first ISO week of the year is the (Mon-Sun) week\n containing the year's first Thursday; everything else derives\n from that.\n\n The first week is 1; Monday is 1 ... Sunday is 7.\n\n ISO calendar algorithm taken from\n http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm\n \"\"\"\n year = self._year\n week1monday = _isoweek1monday(year)\n today = _ymd2ord(self._year, self._month, self._day)\n # Internally, week and day have origin 0\n week, day = divmod(today - week1monday, 7)\n if week < 0:\n year -= 1\n week1monday = _isoweek1monday(year)\n week, day = divmod(today - week1monday, 7)\n elif week >= 52:\n if today >= _isoweek1monday(year+1):\n year += 1\n week = 0\n return year, week+1, day+1\n\n_date_class = date # so functions w/ args named \"date\" can get at the class\n\ndate.min = date(1, 1, 1)\ndate.max = date(9999, 12, 31)\ndate.resolution = timedelta(days=1)\n\nclass tzinfo(object):\n \"\"\"Abstract base class for time zone info classes.\n\n Subclasses must override the name(), utcoffset() and dst() methods.\n \"\"\"\n __slots__ = ()\n\n def tzname(self, dt):\n \"datetime -> string name of time zone.\"\n raise NotImplementedError(\"tzinfo subclass must override tzname()\")\n\n def utcoffset(self, dt):\n \"datetime -> minutes east of UTC (negative for west of UTC)\"\n raise NotImplementedError(\"tzinfo subclass must override utcoffset()\")\n\n def dst(self, dt):\n \"\"\"datetime -> DST offset in minutes east of UTC.\n\n Return 0 if DST not in effect. utcoffset() must include the DST\n offset.\n \"\"\"\n raise NotImplementedError(\"tzinfo subclass must override dst()\")\n\n def fromutc(self, dt):\n \"datetime in UTC -> datetime in local time.\"\n\n if not isinstance(dt, datetime):\n raise TypeError(\"fromutc() requires a datetime argument\")\n if dt.tzinfo is not self:\n raise ValueError(\"dt.tzinfo is not self\")\n\n dtoff = dt.utcoffset()\n if dtoff is None:\n raise ValueError(\"fromutc() requires a non-None utcoffset() \"\n \"result\")\n\n # See the long comment block at the end of this file for an\n # explanation of this algorithm.\n dtdst = dt.dst()\n if dtdst is None:\n raise ValueError(\"fromutc() requires a non-None dst() result\")\n delta = dtoff - dtdst\n if delta:\n dt = dt + delta\n dtdst = dt.dst()\n if dtdst is None:\n raise ValueError(\"fromutc(): dt.dst gave inconsistent \"\n \"results; cannot convert\")\n if dtdst:\n return dt + dtdst\n else:\n return dt\n\n_tzinfo_class = tzinfo\n\nclass time(object):\n \"\"\"Time with time zone.\n\n Constructors:\n\n __new__()\n\n Operators:\n\n __repr__, __str__\n __cmp__, __hash__\n\n Methods:\n\n strftime()\n isoformat()\n utcoffset()\n tzname()\n dst()\n\n Properties (readonly):\n hour, minute, second, microsecond, tzinfo\n \"\"\"\n __slots__ = '_hour', '_minute', '_second', '_microsecond', '_tzinfo', '_hashcode'\n\n def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None):\n \"\"\"Constructor.\n\n Arguments:\n\n hour, minute (required)\n second, microsecond (default to zero)\n tzinfo (default to None)\n \"\"\"\n hour, minute, second, microsecond = _check_time_fields(\n hour, minute, second, microsecond)\n _check_tzinfo_arg(tzinfo)\n self = object.__new__(cls)\n self._hour = hour\n self._minute = minute\n self._second = second\n self._microsecond = microsecond\n self._tzinfo = tzinfo\n self._hashcode = -1\n return self\n\n # Read-only field accessors\n @property\n def hour(self):\n \"\"\"hour (0-23)\"\"\"\n return self._hour\n\n @property\n def minute(self):\n \"\"\"minute (0-59)\"\"\"\n return self._minute\n\n @property\n def second(self):\n \"\"\"second (0-59)\"\"\"\n return self._second\n\n @property\n def microsecond(self):\n \"\"\"microsecond (0-999999)\"\"\"\n return self._microsecond\n\n @property\n def tzinfo(self):\n \"\"\"timezone info object\"\"\"\n return self._tzinfo\n\n # Standard conversions, __hash__ (and helpers)\n\n # Comparisons of time objects with other.\n\n def __eq__(self, other):\n if isinstance(other, time):\n return self._cmp(other) == 0\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, time):\n return self._cmp(other) != 0\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, time):\n return self._cmp(other) <= 0\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, time):\n return self._cmp(other) < 0\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, time):\n return self._cmp(other) >= 0\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, time):\n return self._cmp(other) > 0\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, time)\n mytz = self._tzinfo\n ottz = other._tzinfo\n myoff = otoff = None\n\n if mytz is ottz:\n base_compare = True\n else:\n myoff = self._utcoffset()\n otoff = other._utcoffset()\n base_compare = myoff == otoff\n\n if base_compare:\n return _cmp((self._hour, self._minute, self._second,\n self._microsecond),\n (other._hour, other._minute, other._second,\n other._microsecond))\n if myoff is None or otoff is None:\n raise TypeError(\"can't compare offset-naive and offset-aware times\")\n myhhmm = self._hour * 60 + self._minute - myoff\n othhmm = other._hour * 60 + other._minute - otoff\n return _cmp((myhhmm, self._second, self._microsecond),\n (othhmm, other._second, other._microsecond))\n\n def __hash__(self):\n \"\"\"Hash.\"\"\"\n if self._hashcode == -1:\n tzoff = self._utcoffset()\n if not tzoff: # zero or None\n self._hashcode = hash(self._getstate()[0])\n else:\n h, m = divmod(self.hour * 60 + self.minute - tzoff, 60)\n if 0 <= h < 24:\n self._hashcode = hash(time(h, m, self.second, self.microsecond))\n else:\n self._hashcode = hash((h, m, self.second, self.microsecond))\n return self._hashcode\n\n # Conversion to string\n\n def _tzstr(self, sep=\":\"):\n \"\"\"Return formatted timezone offset (+xx:xx) or None.\"\"\"\n off = self._utcoffset()\n if off is not None:\n if off < 0:\n sign = \"-\"\n off = -off\n else:\n sign = \"+\"\n hh, mm = divmod(off, 60)\n assert 0 <= hh < 24\n off = \"%s%02d%s%02d\" % (sign, hh, sep, mm)\n return off\n\n def __repr__(self):\n \"\"\"Convert to formal string, for repr().\"\"\"\n if self._microsecond != 0:\n s = \", %d, %d\" % (self._second, self._microsecond)\n elif self._second != 0:\n s = \", %d\" % self._second\n else:\n s = \"\"\n module = \"datetime.\" if self.__class__ is time else \"\"\n s= \"%s(%d, %d%s)\" % (module + self.__class__.__name__,\n self._hour, self._minute, s)\n if self._tzinfo is not None:\n assert s[-1:] == \")\"\n s = s[:-1] + \", tzinfo=%r\" % self._tzinfo + \")\"\n return s\n\n def isoformat(self):\n \"\"\"Return the time formatted according to ISO.\n\n This is 'HH:MM:SS.mmmmmm+zz:zz', or 'HH:MM:SS+zz:zz' if\n self.microsecond == 0.\n \"\"\"\n s = _format_time(self._hour, self._minute, self._second,\n self._microsecond)\n tz = self._tzstr()\n if tz:\n s += tz\n return s\n\n __str__ = isoformat\n\n def strftime(self, format):\n \"\"\"Format using strftime(). The date part of the timestamp passed\n to underlying strftime should not be used.\n \"\"\"\n # The year must be >= _MINYEARFMT else Python's strftime implementation\n # can raise a bogus exception.\n timetuple = (1900, 1, 1,\n self._hour, self._minute, self._second,\n 0, 1, -1)\n return _wrap_strftime(self, format, timetuple)\n\n def __format__(self, fmt):\n if not isinstance(fmt, (str, unicode)):\n raise ValueError(\"__format__ expects str or unicode, not %s\" %\n fmt.__class__.__name__)\n if len(fmt) != 0:\n return self.strftime(fmt)\n return str(self)\n\n # Timezone functions\n\n def utcoffset(self):\n \"\"\"Return the timezone offset in minutes east of UTC (negative west of\n UTC).\"\"\"\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(None)\n offset = _check_utc_offset(\"utcoffset\", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _utcoffset(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(None)\n offset = _check_utc_offset(\"utcoffset\", offset)\n return offset\n\n def tzname(self):\n \"\"\"Return the timezone name.\n\n Note that the name is 100% informational -- there's no requirement that\n it mean anything in particular. For example, \"GMT\", \"UTC\", \"-500\",\n \"-5:00\", \"EDT\", \"US/Eastern\", \"America/New York\" are all valid replies.\n \"\"\"\n if self._tzinfo is None:\n return None\n name = self._tzinfo.tzname(None)\n _check_tzname(name)\n return name\n\n def dst(self):\n \"\"\"Return 0 if DST is not in effect, or the DST offset (in minutes\n eastward) if DST is in effect.\n\n This is purely informational; the DST offset has already been added to\n the UTC offset returned by utcoffset() if applicable, so there's no\n need to consult dst() unless you're interested in displaying the DST\n info.\n \"\"\"\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(None)\n offset = _check_utc_offset(\"dst\", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _dst(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(None)\n offset = _check_utc_offset(\"dst\", offset)\n return offset\n\n def replace(self, hour=None, minute=None, second=None, microsecond=None,\n tzinfo=True):\n \"\"\"Return a new time with new values for the specified fields.\"\"\"\n if hour is None:\n hour = self.hour\n if minute is None:\n minute = self.minute\n if second is None:\n second = self.second\n if microsecond is None:\n microsecond = self.microsecond\n if tzinfo is True:\n tzinfo = self.tzinfo\n return time(hour, minute, second, microsecond, tzinfo)\n\n def __nonzero__(self):\n if self.second or self.microsecond:\n return True\n offset = self._utcoffset() or 0\n return self.hour * 60 + self.minute != offset\n\n_time_class = time # so functions w/ args named \"time\" can get at the class\n\ntime.min = time(0, 0, 0)\ntime.max = time(23, 59, 59, 999999)\ntime.resolution = timedelta(microseconds=1)\n\nclass datetime(date):\n \"\"\"datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\n The year, month and day arguments are required. tzinfo may be None, or an\n instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n \"\"\"\n __slots__ = date.__slots__ + time.__slots__\n\n def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0,\n microsecond=0, tzinfo=None):\n year, month, day = _check_date_fields(year, month, day)\n hour, minute, second, microsecond = _check_time_fields(\n hour, minute, second, microsecond)\n _check_tzinfo_arg(tzinfo)\n self = object.__new__(cls)\n self._year = year\n self._month = month\n self._day = day\n self._hour = hour\n self._minute = minute\n self._second = second\n self._microsecond = microsecond\n self._tzinfo = tzinfo\n self._hashcode = -1\n return self\n\n # Read-only field accessors\n @property\n def hour(self):\n \"\"\"hour (0-23)\"\"\"\n return self._hour\n\n @property\n def minute(self):\n \"\"\"minute (0-59)\"\"\"\n return self._minute\n\n @property\n def second(self):\n \"\"\"second (0-59)\"\"\"\n return self._second\n\n @property\n def microsecond(self):\n \"\"\"microsecond (0-999999)\"\"\"\n return self._microsecond\n\n @property\n def tzinfo(self):\n \"\"\"timezone info object\"\"\"\n return self._tzinfo\n\n @classmethod\n def fromtimestamp(cls, timestamp, tz=None):\n \"\"\"Construct a datetime from a POSIX timestamp (like time.time()).\n\n A timezone info object may be passed in as well.\n \"\"\"\n _check_tzinfo_arg(tz)\n converter = _time.localtime if tz is None else _time.gmtime\n self = cls._from_timestamp(converter, timestamp, tz)\n if tz is not None:\n self = tz.fromutc(self)\n return self\n\n @classmethod\n def utcfromtimestamp(cls, t):\n \"Construct a UTC datetime from a POSIX timestamp (like time.time()).\"\n return cls._from_timestamp(_time.gmtime, t, None)\n\n @classmethod\n def _from_timestamp(cls, converter, timestamp, tzinfo):\n t_full = timestamp\n timestamp = int(_math.floor(timestamp))\n frac = t_full - timestamp\n us = _round(frac * 1e6)\n\n # If timestamp is less than one microsecond smaller than a\n # full second, us can be rounded up to 1000000. In this case,\n # roll over to seconds, otherwise, ValueError is raised\n # by the constructor.\n if us == 1000000:\n timestamp += 1\n us = 0\n y, m, d, hh, mm, ss, weekday, jday, dst = converter(timestamp)\n ss = min(ss, 59) # clamp out leap seconds if the platform has them\n return cls(y, m, d, hh, mm, ss, us, tzinfo)\n\n @classmethod\n def now(cls, tz=None):\n \"Construct a datetime from time.time() and optional time zone info.\"\n t = _time.time()\n return cls.fromtimestamp(t, tz)\n\n @classmethod\n def utcnow(cls):\n \"Construct a UTC datetime from time.time().\"\n t = _time.time()\n return cls.utcfromtimestamp(t)\n\n @classmethod\n def combine(cls, date, time):\n \"Construct a datetime from a given date and a given time.\"\n if not isinstance(date, _date_class):\n raise TypeError(\"date argument must be a date instance\")\n if not isinstance(time, _time_class):\n raise TypeError(\"time argument must be a time instance\")\n return cls(date.year, date.month, date.day,\n time.hour, time.minute, time.second, time.microsecond,\n time.tzinfo)\n\n def timetuple(self):\n \"Return local time tuple compatible with time.localtime().\"\n dst = self._dst()\n if dst is None:\n dst = -1\n elif dst:\n dst = 1\n return _build_struct_time(self.year, self.month, self.day,\n self.hour, self.minute, self.second,\n dst)\n\n def utctimetuple(self):\n \"Return UTC time tuple compatible with time.gmtime().\"\n y, m, d = self.year, self.month, self.day\n hh, mm, ss = self.hour, self.minute, self.second\n offset = self._utcoffset()\n if offset: # neither None nor 0\n mm -= offset\n y, m, d, hh, mm, ss, _ = _normalize_datetime(\n y, m, d, hh, mm, ss, 0, ignore_overflow=True)\n return _build_struct_time(y, m, d, hh, mm, ss, 0)\n\n def date(self):\n \"Return the date part.\"\n return date(self._year, self._month, self._day)\n\n def time(self):\n \"Return the time part, with tzinfo None.\"\n return time(self.hour, self.minute, self.second, self.microsecond)\n\n def timetz(self):\n \"Return the time part, with same tzinfo.\"\n return time(self.hour, self.minute, self.second, self.microsecond,\n self._tzinfo)\n\n def replace(self, year=None, month=None, day=None, hour=None,\n minute=None, second=None, microsecond=None, tzinfo=True):\n \"\"\"Return a new datetime with new values for the specified fields.\"\"\"\n if year is None:\n year = self.year\n if month is None:\n month = self.month\n if day is None:\n day = self.day\n if hour is None:\n hour = self.hour\n if minute is None:\n minute = self.minute\n if second is None:\n second = self.second\n if microsecond is None:\n microsecond = self.microsecond\n if tzinfo is True:\n tzinfo = self.tzinfo\n return datetime(year, month, day, hour, minute, second, microsecond,\n tzinfo)\n\n def astimezone(self, tz):\n if not isinstance(tz, tzinfo):\n raise TypeError(\"tz argument must be an instance of tzinfo\")\n\n mytz = self.tzinfo\n if mytz is None:\n raise ValueError(\"astimezone() requires an aware datetime\")\n\n if tz is mytz:\n return self\n\n # Convert self to UTC, and attach the new time zone object.\n myoffset = self.utcoffset()\n if myoffset is None:\n raise ValueError(\"astimezone() requires an aware datetime\")\n utc = (self - myoffset).replace(tzinfo=tz)\n\n # Convert from UTC to tz's local time.\n return tz.fromutc(utc)\n\n # Ways to produce a string.\n\n def ctime(self):\n \"Return ctime() style string.\"\n weekday = self.toordinal() % 7 or 7\n return \"%s %s %2d %02d:%02d:%02d %04d\" % (\n _DAYNAMES[weekday],\n _MONTHNAMES[self._month],\n self._day,\n self._hour, self._minute, self._second,\n self._year)\n\n def isoformat(self, sep='T'):\n \"\"\"Return the time formatted according to ISO.\n\n This is 'YYYY-MM-DD HH:MM:SS.mmmmmm', or 'YYYY-MM-DD HH:MM:SS' if\n self.microsecond == 0.\n\n If self.tzinfo is not None, the UTC offset is also attached, giving\n 'YYYY-MM-DD HH:MM:SS.mmmmmm+HH:MM' or 'YYYY-MM-DD HH:MM:SS+HH:MM'.\n\n Optional argument sep specifies the separator between date and\n time, default 'T'.\n \"\"\"\n s = (\"%04d-%02d-%02d%c\" % (self._year, self._month, self._day, sep) +\n _format_time(self._hour, self._minute, self._second,\n self._microsecond))\n off = self._utcoffset()\n if off is not None:\n if off < 0:\n sign = \"-\"\n off = -off\n else:\n sign = \"+\"\n hh, mm = divmod(off, 60)\n s += \"%s%02d:%02d\" % (sign, hh, mm)\n return s\n\n def __repr__(self):\n \"\"\"Convert to formal string, for repr().\"\"\"\n L = [self._year, self._month, self._day, # These are never zero\n self._hour, self._minute, self._second, self._microsecond]\n if L[-1] == 0:\n del L[-1]\n if L[-1] == 0:\n del L[-1]\n s = \", \".join(map(str, L))\n module = \"datetime.\" if self.__class__ is datetime else \"\"\n s = \"%s(%s)\" % (module + self.__class__.__name__, s)\n if self._tzinfo is not None:\n assert s[-1:] == \")\"\n s = s[:-1] + \", tzinfo=%r\" % self._tzinfo + \")\"\n return s\n\n def __str__(self):\n \"Convert to string, for str().\"\n return self.isoformat(sep=' ')\n\n @classmethod\n def strptime(cls, date_string, format):\n 'string, format -> new datetime parsed from a string (like time.strptime()).'\n from _strptime import _strptime\n # _strptime._strptime returns a two-element tuple. The first\n # element is a time.struct_time object. The second is the\n # microseconds (which are not defined for time.struct_time).\n struct, micros = _strptime(date_string, format)\n return cls(*(struct[0:6] + (micros,)))\n\n def utcoffset(self):\n \"\"\"Return the timezone offset in minutes east of UTC (negative west of\n UTC).\"\"\"\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(self)\n offset = _check_utc_offset(\"utcoffset\", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _utcoffset(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(self)\n offset = _check_utc_offset(\"utcoffset\", offset)\n return offset\n\n def tzname(self):\n \"\"\"Return the timezone name.\n\n Note that the name is 100% informational -- there's no requirement that\n it mean anything in particular. For example, \"GMT\", \"UTC\", \"-500\",\n \"-5:00\", \"EDT\", \"US/Eastern\", \"America/New York\" are all valid replies.\n \"\"\"\n if self._tzinfo is None:\n return None\n name = self._tzinfo.tzname(self)\n _check_tzname(name)\n return name\n\n def dst(self):\n \"\"\"Return 0 if DST is not in effect, or the DST offset (in minutes\n eastward) if DST is in effect.\n\n This is purely informational; the DST offset has already been added to\n the UTC offset returned by utcoffset() if applicable, so there's no\n need to consult dst() unless you're interested in displaying the DST\n info.\n \"\"\"\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(self)\n offset = _check_utc_offset(\"dst\", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _dst(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(self)\n offset = _check_utc_offset(\"dst\", offset)\n return offset\n\n # Comparisons of datetime objects with other.\n\n def __eq__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) == 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) != 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) <= 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) < 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) >= 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) > 0\n elif hasattr(other, \"timetuple\") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, datetime)\n mytz = self._tzinfo\n ottz = other._tzinfo\n myoff = otoff = None\n\n if mytz is ottz:\n base_compare = True\n else:\n if mytz is not None:\n myoff = self._utcoffset()\n if ottz is not None:\n otoff = other._utcoffset()\n base_compare = myoff == otoff\n\n if base_compare:\n return _cmp((self._year, self._month, self._day,\n self._hour, self._minute, self._second,\n self._microsecond),\n (other._year, other._month, other._day,\n other._hour, other._minute, other._second,\n other._microsecond))\n if myoff is None or otoff is None:\n raise TypeError(\"can't compare offset-naive and offset-aware datetimes\")\n # XXX What follows could be done more efficiently...\n diff = self - other # this will take offsets into account\n if diff.days < 0:\n return -1\n return diff and 1 or 0\n\n def _add_timedelta(self, other, factor):\n y, m, d, hh, mm, ss, us = _normalize_datetime(\n self._year,\n self._month,\n self._day + other.days * factor,\n self._hour,\n self._minute,\n self._second + other.seconds * factor,\n self._microsecond + other.microseconds * factor)\n return datetime(y, m, d, hh, mm, ss, us, tzinfo=self._tzinfo)\n\n def __add__(self, other):\n \"Add a datetime and a timedelta.\"\n if not isinstance(other, timedelta):\n return NotImplemented\n return self._add_timedelta(other, 1)\n\n __radd__ = __add__\n\n def __sub__(self, other):\n \"Subtract two datetimes, or a datetime and a timedelta.\"\n if not isinstance(other, datetime):\n if isinstance(other, timedelta):\n return self._add_timedelta(other, -1)\n return NotImplemented\n\n delta_d = self.toordinal() - other.toordinal()\n delta_s = (self._hour - other._hour) * 3600 + \\\n (self._minute - other._minute) * 60 + \\\n (self._second - other._second)\n delta_us = self._microsecond - other._microsecond\n base = timedelta._create(delta_d, delta_s, delta_us, True)\n if self._tzinfo is other._tzinfo:\n return base\n myoff = self._utcoffset()\n otoff = other._utcoffset()\n if myoff == otoff:\n return base\n if myoff is None or otoff is None:\n raise TypeError(\"can't subtract offset-naive and offset-aware datetimes\")\n return base + timedelta(minutes = otoff-myoff)\n\n def __hash__(self):\n if self._hashcode == -1:\n tzoff = self._utcoffset()\n if tzoff is None:\n self._hashcode = hash(self._getstate()[0])\n else:\n days = _ymd2ord(self.year, self.month, self.day)\n seconds = self.hour * 3600 + (self.minute - tzoff) * 60 + self.second\n self._hashcode = hash(timedelta(days, seconds, self.microsecond))\n return self._hashcode\n\n\n\ndatetime.min = datetime(1, 1, 1)\ndatetime.max = datetime(9999, 12, 31, 23, 59, 59, 999999)\ndatetime.resolution = timedelta(microseconds=1)\n\n\ndef _isoweek1monday(year):\n # Helper to calculate the day number of the Monday starting week 1\n # XXX This could be done more efficiently\n THURSDAY = 3\n firstday = _ymd2ord(year, 1, 1)\n firstweekday = (firstday + 6) % 7 # See weekday() above\n week1monday = firstday - firstweekday\n if firstweekday > THURSDAY:\n week1monday += 7\n return week1monday\n\n\"\"\"\nSome time zone algebra. For a datetime x, let\n x.n = x stripped of its timezone -- its naive time.\n x.o = x.utcoffset(), and assuming that doesn't raise an exception or\n return None\n x.d = x.dst(), and assuming that doesn't raise an exception or\n return None\n x.s = x's standard offset, x.o - x.d\n\nNow some derived rules, where k is a duration (timedelta).\n\n1. x.o = x.s + x.d\n This follows from the definition of x.s.\n\n2. If x and y have the same tzinfo member, x.s = y.s.\n This is actually a requirement, an assumption we need to make about\n sane tzinfo classes.\n\n3. The naive UTC time corresponding to x is x.n - x.o.\n This is again a requirement for a sane tzinfo class.\n\n4. (x+k).s = x.s\n This follows from #2, and that datimetimetz+timedelta preserves tzinfo.\n\n5. (x+k).n = x.n + k\n Again follows from how arithmetic is defined.\n\nNow we can explain tz.fromutc(x). Let's assume it's an interesting case\n(meaning that the various tzinfo methods exist, and don't blow up or return\nNone when called).\n\nThe function wants to return a datetime y with timezone tz, equivalent to x.\nx is already in UTC.\n\nBy #3, we want\n\n y.n - y.o = x.n [1]\n\nThe algorithm starts by attaching tz to x.n, and calling that y. So\nx.n = y.n at the start. Then it wants to add a duration k to y, so that [1]\nbecomes true; in effect, we want to solve [2] for k:\n\n (y+k).n - (y+k).o = x.n [2]\n\nBy #1, this is the same as\n\n (y+k).n - ((y+k).s + (y+k).d) = x.n [3]\n\nBy #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.\nSubstituting that into [3],\n\n x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving\n k - (y+k).s - (y+k).d = 0; rearranging,\n k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so\n k = y.s - (y+k).d\n\nOn the RHS, (y+k).d can't be computed directly, but y.s can be, and we\napproximate k by ignoring the (y+k).d term at first. Note that k can't be\nvery large, since all offset-returning methods return a duration of magnitude\nless than 24 hours. For that reason, if y is firmly in std time, (y+k).d must\nbe 0, so ignoring it has no consequence then.\n\nIn any case, the new value is\n\n z = y + y.s [4]\n\nIt's helpful to step back at look at [4] from a higher level: it's simply\nmapping from UTC to tz's standard time.\n\nAt this point, if\n\n z.n - z.o = x.n [5]\n\nwe have an equivalent time, and are almost done. The insecurity here is\nat the start of daylight time. Picture US Eastern for concreteness. The wall\ntime jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good\nsense then. The docs ask that an Eastern tzinfo class consider such a time to\nbe EDT (because it's \"after 2\"), which is a redundant spelling of 1:MM EST\non the day DST starts. We want to return the 1:MM EST spelling because that's\nthe only spelling that makes sense on the local wall clock.\n\nIn fact, if [5] holds at this point, we do have the standard-time spelling,\nbut that takes a bit of proof. We first prove a stronger result. What's the\ndifference between the LHS and RHS of [5]? Let\n\n diff = x.n - (z.n - z.o) [6]\n\nNow\n z.n = by [4]\n (y + y.s).n = by #5\n y.n + y.s = since y.n = x.n\n x.n + y.s = since z and y are have the same tzinfo member,\n y.s = z.s by #2\n x.n + z.s\n\nPlugging that back into [6] gives\n\n diff =\n x.n - ((x.n + z.s) - z.o) = expanding\n x.n - x.n - z.s + z.o = cancelling\n - z.s + z.o = by #2\n z.d\n\nSo diff = z.d.\n\nIf [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time\nspelling we wanted in the endcase described above. We're done. Contrarily,\nif z.d = 0, then we have a UTC equivalent, and are also done.\n\nIf [5] is not true now, diff = z.d != 0, and z.d is the offset we need to\nadd to z (in effect, z is in tz's standard time, and we need to shift the\nlocal clock into tz's daylight time).\n\nLet\n\n z' = z + z.d = z + diff [7]\n\nand we can again ask whether\n\n z'.n - z'.o = x.n [8]\n\nIf so, we're done. If not, the tzinfo class is insane, according to the\nassumptions we've made. This also requires a bit of proof. As before, let's\ncompute the difference between the LHS and RHS of [8] (and skipping some of\nthe justifications for the kinds of substitutions we've done several times\nalready):\n\n diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]\n x.n - (z.n + diff - z'.o) = replacing diff via [6]\n x.n - (z.n + x.n - (z.n - z.o) - z'.o) =\n x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n\n - z.n + z.n - z.o + z'.o = cancel z.n\n - z.o + z'.o = #1 twice\n -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo\n z'.d - z.d\n\nSo z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,\nwe've found the UTC-equivalent so are done. In fact, we stop with [7] and\nreturn z', not bothering to compute z'.d.\n\nHow could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by\na dst() offset, and starting *from* a time already in DST (we know z.d != 0),\nwould have to change the result dst() returns: we start in DST, and moving\na little further into it takes us out of DST.\n\nThere isn't a sane case where this can happen. The closest it gets is at\nthe end of DST, where there's an hour in UTC with no spelling in a hybrid\ntzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During\nthat hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM\nUTC) because the docs insist on that, but 0:MM is taken as being in daylight\ntime (4:MM UTC). There is no local time mapping to 5:MM UTC. The local\nclock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in\nstandard time. Since that's what the local clock *does*, we want to map both\nUTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous\nin local time, but so it goes -- it's the way the local clock works.\n\nWhen x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,\nso z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.\nz' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]\n(correctly) concludes that z' is not UTC-equivalent to x.\n\nBecause we know z.d said z was in daylight time (else [5] would have held and\nwe would have stopped then), and we know z.d != z'.d (else [8] would have held\nand we have stopped then), and there are only 2 possible values dst() can\nreturn in Eastern, it follows that z'.d must be 0 (which it is in the example,\nbut the reasoning doesn't depend on the example -- it depends on there being\ntwo possible dst() outcomes, one zero and the other non-zero). Therefore\nz' must be in standard time, and is the spelling we want in this case.\n\nNote again that z' is not UTC-equivalent as far as the hybrid tzinfo class is\nconcerned (because it takes z' as being in standard time rather than the\ndaylight time we intend here), but returning it gives the real-life \"local\nclock repeats an hour\" behavior when mapping the \"unspellable\" UTC hour into\ntz.\n\nWhen the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with\nthe 1:MM standard time spelling we want.\n\nSo how can this break? One of the assumptions must be violated. Two\npossibilities:\n\n1) [2] effectively says that y.s is invariant across all y belong to a given\n time zone. This isn't true if, for political reasons or continental drift,\n a region decides to change its base offset from UTC.\n\n2) There may be versions of \"double daylight\" time where the tail end of\n the analysis gives up a step too early. I haven't thought about that\n enough to say.\n\nIn any case, it's clear that the default fromutc() is strong enough to handle\n\"almost all\" time zones: so long as the standard offset is invariant, it\ndoesn't matter if daylight time transition points change from year to year, or\nif daylight time is skipped in some years; it doesn't matter how large or\nsmall dst() may get within its bounds; and it doesn't even matter if some\nperverse time zone returns a negative dst()). So a breaking case must be\npretty bizarre, and a tzinfo subclass can override fromutc() if it is.\n\"\"\"\n","src/lib/dbhash.py":"raise NotImplementedError(\"dbhash is not yet implemented in Skulpt\")\n","src/lib/decimal.py":"raise NotImplementedError(\"decimal is not yet implemented in Skulpt\")\n","src/lib/difflib.py":"raise NotImplementedError(\"difflib is not yet implemented in Skulpt\")\n","src/lib/dircache.py":"raise NotImplementedError(\"dircache is not yet implemented in Skulpt\")\n","src/lib/dis.py":"raise NotImplementedError(\"dis is not yet implemented in Skulpt\")\n","src/lib/distutils/__init__.py":"raise NotImplementedError(\"distutils is not yet implemented in Skulpt\")\n","src/lib/distutils/command/__init__.py":"raise NotImplementedError(\"command is not yet implemented in Skulpt\")\n","src/lib/distutils/tests/__init__.py":"raise NotImplementedError(\"tests is not yet implemented in Skulpt\")\n","src/lib/doctest.py":"raise NotImplementedError(\"doctest is not yet implemented in Skulpt\")\n","src/lib/document.js":"var $builtinmodule=function(){var a,b={__name__:new Sk.builtin.str(\"document\")};return b.getElementById=new Sk.builtin.func(function(a){var c=document.getElementById(a.v);return c?Sk.misceval.callsimArray(b.Element,[c]):Sk.builtin.none.none$}),b.createElement=new Sk.builtin.func(function(a){var c=document.createElement(a.v);if(c)return Sk.misceval.callsimArray(b.Element,[c])}),b.getElementsByTagName=new Sk.builtin.func(function(a){for(var c=document.getElementsByTagName(a.v),d=[],e=c.length-1;0<=e;e--)d.push(Sk.misceval.callsimArray(b.Element,[c[e]]));return new Sk.builtin.list(d)}),b.getElementsByClassName=new Sk.builtin.func(function(a){for(var c=document.getElementsByClassName(a.v),d=[],e=0;eb||0>c||b>=a.width||c>=a.height)throw new Sk.builtin.ValueError(\"Pixel index out of range.\")};var i=function(a,b,c){var d;Sk.builtin.pyCheckArgsLen(\"setdelay\",arguments.length,2,3),a.delay=Sk.ffi.remapToJs(b),d=Sk.builtin.asnum$(c),a.updateInterval=d?d:1};b.set_delay=new Sk.builtin.func(i),b.setDelay=new Sk.builtin.func(i);var j=function(a){var b,d=[];for(Sk.builtin.pyCheckArgsLen(\"getpixels\",arguments.length,1,1),b=0;b=a.width?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,0,a.lasty,a.width,2):a.lasty+a.updateInterval>=a.height?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,a.lastx,0,2,a.height):a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,g(b,a.lastx),g(c,a.lasty),e(f(b-a.lastx),1),e(f(c-a.lasty),1)),a.lastx=b,a.lasty=c,0e)throw new Sk.builtin.ValueError(\"r must be non-negative\");if(this===a)return new a.constructor(f,e);else{const b=new this.constructor;return a.constructor.call(b,f,e),b}}var a={};return a.accumulate=Sk.abstr.buildIteratorClass(\"itertools.accumulate\",{constructor:function accumulate(a,b,c){this.iter=a,this.func=b,this.total=c,this.tp$iternext=()=>(this.total=Sk.builtin.checkNone(this.total)?this.iter.tp$iternext():this.total,this.tp$iternext=this.constructor.prototype.tp$iternext,this.total)},iternext(){let a=this.iter.tp$iternext();if(void 0!==a)return this.total=Sk.misceval.callsimArray(this.func,[this.total,a]),this.total},slots:{tp$doc:\"accumulate(iterable[, func, initial]) --> accumulate object\\n\\nReturn series of accumulated sums (or other binary function results).\",tp$new(b,c){Sk.abstr.checkArgsLen(\"accumulate\",b,0,2);let[d,e,f]=Sk.abstr.copyKeywordsToNamedArgs(\"accumulate\",[\"iterable\",\"func\",\"initial\"],b,c,[Sk.builtin.none.none$,Sk.builtin.none.none$]);if(d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func((c,a)=>Sk.abstr.numberBinOp(c,a,\"Add\")):e,this===a.accumulate.prototype)return new a.accumulate(d,e,f);else{const b=new this.constructor;return a.accumulate.call(b,d,e,f),b}}}}),a.chain=Sk.abstr.buildIteratorClass(\"itertools.chain\",{constructor:function chain(a){this.iterables=a,this.current_it=null,this.tp$iternext=()=>(this.tp$iternext=this.constructor.prototype.tp$iternext,this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)?void(this.tp$iternext=()=>void 0):(this.current_it=Sk.abstr.iter(this.current_it),this.tp$iternext())},iternext(){for(let a;void 0===a;)if(a=this.current_it.tp$iternext(),void 0===a){if(this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)return void(this.tp$iternext=()=>void 0);this.current_it=Sk.abstr.iter(this.current_it)}else return a},slots:{tp$doc:\"chain(*iterables) --> chain object\\n\\nReturn a chain object whose .__next__() method returns elements from the\\nfirst iterable until it is exhausted, then elements from the next\\niterable, until all of the iterables are exhausted.\",tp$new(b,c){if(Sk.abstr.checkNoKwargs(\"chain\",c),b=new Sk.builtin.tuple(b.slice(0)).tp$iter(),this===a.chain.prototype)return new a.chain(b);else{const c=new this.constructor;return a.chain.call(c,b),c}}},classmethods:{from_iterable:{$meth(b){const c=Sk.abstr.iter(b);return new a.chain(c)},$flags:{OneArg:!0},$doc:\"chain.from_iterable(iterable) --> chain object\\n\\nAlternate chain() constructor taking a single iterable argument\\nthat evaluates lazily.\",$textsig:null}}}),a.combinations=Sk.abstr.buildIteratorClass(\"itertools.combinations\",{constructor:function combinations(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill().map((a,b)=>b),this.n=a.length,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=a+this.n-this.r){b=!0;break}if(!b)return void(this.r=0);this.indices[a]++;for(let b=a+1;bthis.pool[a]);return new Sk.builtin.tuple(c)},slots:{tp$doc:\"combinations(iterable, r) --> combinations object\\n\\nReturn successive r-length combinations of elements in the iterable.\\n\\ncombinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)\",tp$new(b,c){return combinationsNew.call(this,a.combinations.prototype,b,c)}}}),a.combinations_with_replacement=Sk.abstr.buildIteratorClass(\"itertools.combinations_with_replacement\",{constructor:function combinations_with_replacement(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill(0),this.n=a.length,this.tp$iternext=()=>{if(!this.r||this.n){this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map(a=>this.pool[a]);return new Sk.builtin.tuple(a)}}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=this.n-1){b=!0;break}if(!b)return void(this.r=0);const c=this.indices[a]+1;for(let b=a;bthis.pool[a]);return new Sk.builtin.tuple(d)},slots:{tp$doc:\"combinations_with_replacement(iterable, r) --> combinations_with_replacement object\\n\\nReturn successive r-length combinations of elements in the iterable\\nallowing individual elements to have successive repeats.\\ncombinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC\",tp$new(b,c){return combinationsNew.call(this,a.combinations_with_replacement.prototype,b,c)}}}),a.compress=Sk.abstr.buildIteratorClass(\"itertools.compress\",{constructor:function compress(a,b){this.data=a,this.selectors=b},iternext(){let a=this.data.tp$iternext(),b=this.selectors.tp$iternext();for(;void 0!==a&&void 0!==b;){if(Sk.misceval.isTrue(b))return a;a=this.data.tp$iternext(),b=this.selectors.tp$iternext()}},slots:{tp$doc:\"compress(data, selectors) --> iterator over selected data\\n\\nReturn data elements corresponding to true selector elements.\\nForms a shorter iterator from selected data elements using the\\nselectors to choose the data elements.\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"compress\",[\"data\",\"selectors\"],b,c,[]),d=Sk.abstr.iter(d),e=Sk.abstr.iter(e),this===a.count.prototype)return new a.compress(d,e);else{const b=new this.constructor;return a.compress.call(b,d,e),b}}}}),a.count=Sk.abstr.buildIteratorClass(\"itertools.count\",{constructor:function count(a,b){this.start=a,this.step=b},iternext(){const a=this.start;return this.start=Sk.abstr.numberBinOp(this.start,this.step,\"Add\"),a},slots:{tp$doc:\"count(start=0, step=1) --> count object\\n\\nReturn a count object whose .__next__() method returns consecutive values.\\nEquivalent to:\\n\\n def count(firstval=0, step=1):\\n x = firstval\\n while 1:\\n yield x\\n x += step\\n\",tp$new(b,c){const[d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"count\",[\"start\",\"step\"],b,c,[new Sk.builtin.int_(0),new Sk.builtin.int_(1)]);if(!Sk.builtin.checkNumber(d)&&!Sk.builtin.checkComplex(d))throw new Sk.builtin.TypeError(\"a number is required\");if(!Sk.builtin.checkNumber(e)&&!Sk.builtin.checkComplex(e))throw new Sk.builtin.TypeError(\"a number is required\");if(this===a.count.prototype)return new a.count(d,e);else{const b=new this.constructor;return a.count.call(b,d,e),b}},$r(){const a=Sk.misceval.objectRepr(this.start);let b=Sk.misceval.objectRepr(this.step);return b=\"1\"===b?\"\":\", \"+b,new Sk.builtin.str(Sk.abstr.typeName(this)+\"(\"+a+b+\")\")}}}),a.cycle=Sk.abstr.buildIteratorClass(\"itertools.cycle\",{constructor:function cycle(a){this.iter=a,this.saved=[],this.consumed=!1,this.i=0,this.length},iternext(){let a;if(!this.consumed){if(a=this.iter.tp$iternext(),void 0!==a)return this.saved.push(a),a;if(this.consumed=!0,this.length=this.saved.length,!this.length)return}return a=this.saved[this.i],this.i=(this.i+1)%this.length,a},slots:{tp$doc:\"cycle(iterable) --> cycle object\\n\\nReturn elements from the iterable until it is exhausted.\\nThen repeat the sequence indefinitely.\",tp$new(b,c){Sk.abstr.checkOneArg(\"cycle\",b,c);const d=Sk.abstr.iter(b[0]);if(this===a.cycle.prototype)return new a.cycle(d);else{const b=new this.constructor;return a.cycle.call(b,d),b}}}}),a.dropwhile=Sk.abstr.buildIteratorClass(\"itertools.dropwhile\",{constructor:function dropwhile(a,b){this.predicate=a,this.iter=b,this.passed},iternext(){let a=this.iter.tp$iternext();for(;void 0===this.passed&&void 0!==a;){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(!Sk.misceval.isTrue(b))return this.passed=!0,a;a=this.iter.tp$iternext()}return a},slots:{tp$doc:\"dropwhile(predicate, iterable) --> dropwhile object\\n\\nDrop items from the iterable while predicate(item) is true.\\nAfterwards, return every element until the iterable is exhausted.\",tp$new(b,c){Sk.abstr.checkNoKwargs(\"dropwhile\",c),Sk.abstr.checkArgsLen(\"dropwhile\",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.dropwhile.prototype)return new a.dropwhile(d,e);else{const b=new this.constructor;return a.dropwhile.call(b,d,e),b}}}}),a.filterfalse=Sk.abstr.buildIteratorClass(\"itertools.filterfalse\",{constructor:function filterfalse(a,b){this.predicate=a,this.iter=b},iternext(){let a=this.iter.tp$iternext();if(void 0!==a){for(let b=Sk.misceval.callsimArray(this.predicate,[a]);Sk.misceval.isTrue(b);){if(a=this.iter.tp$iternext(),void 0===a)return;b=Sk.misceval.callsimArray(this.predicate,[a])}return a}},slots:{tp$doc:\"filterfalse(function or None, sequence) --> filterfalse object\\n\\nReturn those items of sequence for which function(item) is false.\\nIf function is None, return the items that are false.\",tp$new(b,c){Sk.abstr.checkNoKwargs(\"filterfalse\",c),Sk.abstr.checkArgsLen(\"filterfalse\",b,2,2);const d=Sk.builtin.checkNone(b[0])?Sk.builtin.bool:b[0],e=Sk.abstr.iter(b[1]);if(this===a.filterfalse.prototype)return new a.filterfalse(d,e);else{const b=new this.constructor;return a.filterfalse.call(b,d,e),b}}}}),a._grouper=Sk.abstr.buildIteratorClass(\"itertools._grouper\",{constructor:function _grouper(a){this.groupby=a,this.tgtkey=a.tgtkey,this.id=a.id},iternext(){const a=Sk.misceval.richCompareBool(this.groupby.currkey,this.tgtkey,\"Eq\");if(this.groupby.id===this.id&&a){let a=this.groupby.currval;return this.groupby.currval=this.groupby.iter.tp$iternext(),void 0!==this.groupby.currval&&(this.groupby.currkey=Sk.misceval.callsimArray(this.groupby.keyf,[this.groupby.currval])),a}}}),a.groupby=Sk.abstr.buildIteratorClass(\"itertools.groupby\",{constructor:function groupby(a,b){this.iter=a,this.keyf=b,this.currval,this.currkey=this.tgtkey=new Sk.builtin.object,this.id},iternext(){this.id={};for(let a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\"Eq\");a;){if(this.currval=this.iter.tp$iternext(),void 0===this.currval)return;this.currkey=Sk.misceval.callsimArray(this.keyf,[this.currval]),a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\"Eq\")}this.tgtkey=this.currkey;const b=new a._grouper(this);return new Sk.builtin.tuple([this.currkey,b])},slots:{tp$doc:\"groupby(iterable, key=None) -> make an iterator that returns consecutive\\nkeys and groups from the iterable. If the key function is not specified or\\nis None, the element itself is used for grouping.\\n\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"groupby\",[\"iterable\",\"key\"],b,c,[Sk.builtin.none.none$]),d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func(a=>a):e,this===a.groupby.prototype)return new a.groupby(d,e);else{const b=new this.constructor;return a.groupby.call(b,d,e),b}}}}),a.islice=Sk.abstr.buildIteratorClass(\"itertools.islice\",{constructor:function islice(a,b,c,d){this.iter=a,this.previt=b,this.stop=c,this.step=d,this.tp$iternext=()=>{if(this.tp$iternext=this.constructor.prototype.tp$iternext,this.previt>=this.stop){for(let a=0;a=this.stop){for(let a=this.previt+1;a islice object\\nislice(iterable, start, stop[, step]) --> islice object\\n\\nReturn an iterator whose next() method returns selected values from an\\niterable. If start is specified, will skip all preceding elements;\\notherwise, start defaults to zero. Step defaults to one. If\\nspecified as another value, step determines how many values are \\nskipped between successive calls. Works like a slice() on a list\\nbut returns an iterator.\",tp$new(b,c){var d=Number.MAX_SAFE_INTEGER;Sk.abstr.checkNoKwargs(\"islice\",c),Sk.abstr.checkArgsLen(\"islice\",b,2,4);const e=Sk.abstr.iter(b[0]);let f=b[1],g=b[2],h=b[3];if(void 0===g?(g=f,f=Sk.builtin.none.none$,h=Sk.builtin.none.none$):void 0===h&&(h=Sk.builtin.none.none$),!(Sk.builtin.checkNone(g)||Sk.misceval.isIndex(g)))throw new Sk.builtin.ValueError(\"Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.\");else if(g=Sk.builtin.checkNone(g)?d:Sk.misceval.asIndexSized(g),0>g||g>d)throw new Sk.builtin.ValueError(\"Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.\");if(!(Sk.builtin.checkNone(f)||Sk.misceval.isIndex(f)))throw new Sk.builtin.ValueError(\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\");else if(f=Sk.builtin.checkNone(f)?0:Sk.misceval.asIndexSized(f),0>f||f>d)throw new Sk.builtin.ValueError(\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\");if(!(Sk.builtin.checkNone(h)||Sk.misceval.isIndex(h)))throw new Sk.builtin.ValueError(\"Step for islice() must be a positive integer or None\");else if(h=Sk.builtin.checkNone(h)?1:Sk.misceval.asIndexSized(h),0>=h||h>d)throw new Sk.builtin.ValueError(\"Step for islice() must be a positive integer or None.\");if(this===a.islice.prototype)return new a.islice(e,f,g,h);else{const b=new this.constructor;return a.islice.call(b,e,f,g,h),b}}}}),a.permutations=Sk.abstr.buildIteratorClass(\"itertools.permutations\",{constructor:function permutations(a,b){this.pool=a,this.r=b;const c=a.length;this.indices=Array(c).fill().map((a,b)=>b),this.cycles=Array(b).fill().map((a,b)=>c-b),this.n=c,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){for(let a=this.r-1;0<=a;a--)if(this.cycles[a]--,0==this.cycles[a])this.indices.push(this.indices.splice(a,1)[0]),this.cycles[a]=this.n-a;else{j=this.cycles[a],[this.indices[a],this.indices[this.n-j]]=[this.indices[this.n-j],this.indices[a]];const b=this.indices.map(a=>this.pool[a]).slice(0,this.r);return new Sk.builtin.tuple(b)}this.r=0},slots:{tp$doc:\"permutations(iterable[, r]) --> permutations object\\n\\nReturn successive r-length permutations of elements in the iterable.\\n\\npermutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)\",tp$new(b,c){let d,e;[d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"permutations\",[\"iterable\",\"r\"],b,c,[Sk.builtin.none.none$]);const f=Sk.misceval.arrayFromIterable(d);if(e=Sk.builtin.checkNone(e)?f.length:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),0>e)throw new Sk.builtin.ValueError(\"r must be non-negative\");if(this===a.permutations.prototype)return new a.permutations(f,e);else{const b=new this.constructor;return a.permutations.call(b,f,e),b}}}}),a.product=Sk.abstr.buildIteratorClass(\"itertools.product\",{constructor:function product(a){this.pools=a,this.n=a.length,this.indices=Array(a.length).fill(0),this.pool_sizes=a.map(a=>a.length),this.tp$iternext=()=>{this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return a.some(a=>void 0===a)?void(this.n=0):new Sk.builtin.tuple(a)}},iternext(){for(let a=this.n-1;0<=a&&a=this.pool_sizes[a]?(this.indices[a]=-1,a--):a++;if(!this.n||this.indices.every(a=>-1===a))return void(this.n=0);else{const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return new Sk.builtin.tuple(a)}},slots:{tp$doc:\"product(*iterables, repeat=1) --> product object\\n\\nCartesian product of input iterables. Equivalent to nested for-loops.\\n\\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\\nThe leftmost iterators are in the outermost for-loop, so the output tuples\\ncycle in a manner similar to an odometer (with the rightmost element changing\\non every iteration).\\n\\nTo compute the product of an iterable with itself, specify the number\\nof repetitions with the optional repeat keyword argument. For example,\\nproduct(A, repeat=4) means the same as product(A, A, A, A).\\n\\nproduct('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\\nproduct((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...\",tp$new(b,c){let[d]=Sk.abstr.copyKeywordsToNamedArgs(\"product\",[\"repeat\"],[],c,[new Sk.builtin.int_(1)]);if(d=Sk.misceval.asIndexSized(d,Sk.builtin.OverFlowError),0>d)throw new Sk.builtin.ValueError(\"repeat argument cannot be negative\");const e=[];for(let a=0;athis.object)},iternext(){return 0 create an iterator which returns the object\\nfor the specified number of times. If not specified, returns the object\\nendlessly.\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"repeat\",[\"object\",\"times\"],b,c,[null]),e=null===e?void 0:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),this===a.repeat.prototype)return new a.repeat(d,e);else{const b=new this.constructor;return a.repeat.call(b,d,e),b}},$r(){return object_repr=Sk.misceval.objectRepr(this.object),times_repr=void 0===this.times?\"\":\", \"+(0<=this.times?this.times:0),new Sk.builtin.str(Sk.abstr.typeName(this)+\"(\"+object_repr+times_repr+\")\")}},methods:{__lenght_hint__:{$meth(){if(void 0===this.times)throw new Sk.builtin.TypeError(\"len() of unsized object\");return new Sk.builtin.int_(this.times)},$flags:{NoArgs:!0},$textsig:null}}}),a.starmap=Sk.abstr.buildIteratorClass(\"itertools.starmap\",{constructor:function starmap(a,b){this.func=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0===a)return;const b=Sk.misceval.arrayFromIterable(a),c=Sk.misceval.callsimArray(this.func,b);return c},slots:{tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"starmap\",[\"func\",\"iterable\"],b,c,[]),e=Sk.abstr.iter(e),d=Sk.builtin.checkNone(d)?Sk.builtin.bool:d,this===a.starmap.prototype)return new a.starmap(d,e);else{const b=new this.constructor;return a.starmap.call(b,d,e),b}}}}),a.takewhile=Sk.abstr.buildIteratorClass(\"itertools.takewhile\",{constructor:function takewhile(a,b){this.predicate=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0!==a){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(Sk.misceval.isTrue(b))return a;this.tp$iternext=()=>void 0}},slots:{tp$doc:\"takewhile(predicate, iterable) --> takewhile object\\n\\nReturn successive entries from an iterable as long as the \\npredicate evaluates to true for each entry.\",tp$new(b,c){Sk.abstr.checkNoKwargs(\"takewhile\",c),Sk.abstr.checkArgsLen(\"takewhile\",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.takewhile.prototype)return new a.takewhile(d,e);else{const b=new this.constructor;return a.takewhile.call(b,d,e),b}}}}),a.tee=new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError(\"tee is not yet implemented in Skulpt\")}),a.zip_longest=Sk.abstr.buildIteratorClass(\"itertools.zip_longest\",{constructor:function zip_longest(a,b){this.iters=a,this.fillvalue=b,this.active=this.iters.length},iternext(){if(!this.active)return;let b;const c=[];for(let d=0;d zip_longest object\\n\\nReturn a zip_longest object whose .__next__() method returns a tuple where\\nthe i-th element comes from the i-th iterable argument. The .__next__()\\nmethod continues until the longest iterable in the argument sequence\\nis exhausted and then it raises StopIteration. When the shorter iterables\\nare exhausted, the fillvalue is substituted in their place. The fillvalue\\ndefaults to None or can be specified by a keyword argument.\\n\",tp$new(b,c){const[d]=Sk.abstr.copyKeywordsToNamedArgs(\"zip_longest\",[\"fillvalue\"],[],c,[Sk.builtin.none.none$]),e=[];for(let a=0;aa?-1:1:0>1/a?-1:1,a},o=18;return Sk.abstr.setUpModuleMethods(\"math\",l,{acos:{$meth:function acos(a){var b=Math.acos;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the arc cosine (measured in radians) of x.\"},acosh:{$meth:function acosh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a-1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the inverse hyperbolic cosine of x.\"},asin:{$meth:function asin(a){var b=Math.asin;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the arc sine (measured in radians) of x.\"},asinh:{$meth:function asinh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a+1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the inverse hyperbolic sine of x.\"},atan:{$meth:function atan(a){var b=Math.atan;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the arc tangent (measured in radians) of x.\"},atan2:{$meth:function atan2(a,b){var c=Math.atan2;return Sk.builtin.pyCheckType(\"y\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(b)),new Sk.builtin.float_(c(Sk.builtin.asnum$(a),Sk.builtin.asnum$(b)))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, y, x, /)\",$doc:\"Return the arc tangent (measured in radians) of y/x.\\n\\nUnlike atan(y/x), the signs of both x and y are considered.\"},atanh:{$meth:function atanh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=(1+a)/(1-a);return new Sk.builtin.float_(e(b)/2)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the inverse hyperbolic tangent of x.\"},ceil:{$meth:function ceil(a){var b=Math.ceil;Sk.builtin.pyCheckType(\"\",\"real number\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);return Sk.__future__.ceil_floor_int?new Sk.builtin.int_(b(c)):new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the ceiling of x as an Integral.\\n\\nThis is the smallest integer >= x.\"},copysign:{$meth:function copysign(a,b){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"y\",\"number\",Sk.builtin.checkNumber(b));const c=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(a),e=n(d),f=n(c);return new Sk.builtin.float_(d*(e*f))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return a float with the magnitude (absolute value) of x but the sign of y.\\n\\nOn platforms that support signed zeros, copysign(1.0, -0.0)\\nreturns -1.0.\\n\"},cos:{$meth:function cos(a){var b=Math.cos;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the cosine of x (measured in radians).\"},cosh:{$meth:function cosh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b+1/b)/2)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the hyperbolic cosine of x.\"},degrees:{$meth:function degrees(b){Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(b));const c=180/a*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Convert angle x from radians to degrees.\"},erf:{$meth:function erf(){throw new Sk.builtin.NotImplementedError(\"math.erf() is not yet implemented in Skulpt\")},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Error function at x.\"},erfc:{$meth:function erfc(){throw new Sk.builtin.NotImplementedError(\"math.erfc() is not yet implemented in Skulpt\")},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Complementary error function at x.\"},exp:{$meth:function exp(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));let b=a.v;if(\"number\"!=typeof b&&(b=a.nb$float().v),b==1/0||b==-Infinity||isNaN(b))return new Sk.builtin.float_(f(b));const c=f(b);if(!isFinite(c))throw new Sk.builtin.OverflowError(\"math range error\");return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return e raised to the power of x.\"},expm1:{$meth:function expm1(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(.7>k(b)){const a=f(b);if(1==a)return new Sk.builtin.float_(b);else{const c=(a-1)*b/e(a);return new Sk.builtin.float_(c)}}else{const a=f(b)-1;return new Sk.builtin.float_(a)}},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return exp(x)-1.\\n\\nThis function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\"},fabs:{$meth:function fabs(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));let b=a.v;return JSBI.__isBigInt(b)&&(b=a.nb$float().v),b=k(b),new Sk.builtin.float_(b)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the absolute value of the float x.\"},factorial:{$meth:function factorial(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));let b=Sk.builtin.asnum$(a);if(a=j(b),a!=b)throw new Sk.builtin.ValueError(\"factorial() only accepts integral values\");if(0>a)throw new Sk.builtin.ValueError(\"factorial() not defined for negative numbers\");let c=1;for(let b=2;b<=a&&b<=o;b++)c*=b;if(a<=o)return new Sk.builtin.int_(c);c=JSBI.BigInt(c);for(let b=19;b<=a;b++)c=JSBI.multiply(c,JSBI.BigInt(b));return new Sk.builtin.int_(c)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Find x!.\\n\\nRaise a ValueError if x is negative or non-integral.\"},floor:{$meth:function floor(a){return Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.__future__.ceil_floor_int?new Sk.builtin.int_(j(Sk.builtin.asnum$(a))):new Sk.builtin.float_(j(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the floor of x as an Integral.\\n\\nThis is the largest integer <= x.\"},fmod:{$meth:function fmod(a,b){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"y\",\"number\",Sk.builtin.checkNumber(b));let c=a.v,d=b.v;if(\"number\"!=typeof c&&(c=a.nb$float().v),\"number\"!=typeof d&&(d=b.nb$float().v),(d==1/0||d==-Infinity)&&isFinite(c))return new Sk.builtin.float_(c);const e=c%d;if(isNaN(e)&&!isNaN(c)&&!isNaN(d))throw new Sk.builtin.ValueError(\"math domain error\");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return fmod(x, y), according to platform C.\\n\\nx % y may differ.\"},frexp:{$meth:function frexp(a){var b=Math.max;Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a),d=[c,0];if(0!==c&&i(c)){const a=k(c);let e=b(-1023,j(h(a))+1),f=a*g(2,-e);for(;.5>f;)f*=2,e--;for(;1<=f;)f*=.5,e++;0>c&&(f=-f),d[0]=f,d[1]=e}return d[0]=new Sk.builtin.float_(d[0]),d[1]=new Sk.builtin.int_(d[1]),new Sk.builtin.tuple(d)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the mantissa and exponent of x, as pair (m, e).\\n\\nm is a float and e is an int, such that x = m * 2.**e.\\nIf x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.\"},fsum:{$meth:function fsum(a){if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object is not iterable\");let b=[];a=Sk.abstr.iter(a);let c,d,e;for(let f=a.tp$iternext();void 0!==f;f=a.tp$iternext()){Sk.builtin.pyCheckType(\"\",\"real number\",Sk.builtin.checkNumber(f)),c=0;let a=f.v;\"number\"!=typeof a&&(a=f.nb$float().v),f=a;for(let a,g=0,h=b.length;gb?-b:b,new Sk.builtin.int_(b)):(d=JSBI.BigInt(d),e=JSBI.BigInt(e),b=_biggcd(d,e),JSBI.lessThan(b,JSBI.__ZERO)&&(b=JSBI.multiply(b,JSBI.BigInt(-1))),new Sk.builtin.int_(b.toString()))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"greatest common divisor of x and y\"},hypot:{$meth:function hypot(a,c){return Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"y\",\"number\",Sk.builtin.checkNumber(c)),a=Sk.builtin.asnum$(a),c=Sk.builtin.asnum$(c),new Sk.builtin.float_(b(a*a+c*c))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return the Euclidean distance, sqrt(x*x + y*y).\"},isclose:{$meth:function isclose(c,d){Sk.abstr.checkArgsLen(\"isclose\",c,2,2),rel_abs_vals=Sk.abstr.copyKeywordsToNamedArgs(\"isclose\",[\"rel_tol\",\"abs_tol\"],[],d,[new Sk.builtin.float_(1e-9),new Sk.builtin.float_(0)]);const e=c[0],a=c[1],b=rel_abs_vals[0],f=rel_abs_vals[1];Sk.builtin.pyCheckType(\"a\",\"number\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\"b\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"rel_tol\",\"number\",Sk.builtin.checkNumber(b)),Sk.builtin.pyCheckType(\"abs_tol\",\"number\",Sk.builtin.checkNumber(f));const g=Sk.builtin.asnum$(e),h=Sk.builtin.asnum$(a),i=Sk.builtin.asnum$(b),j=Sk.builtin.asnum$(f);if(0>i||0>j)throw new Sk.builtin.ValueError(\"tolerances must be non-negative\");if(g==h)return Sk.builtin.bool.true$;if(g==1/0||g==-Infinity||h==1/0||h==-Infinity)return Sk.builtin.bool.false$;const l=k(h-g),m=l<=k(i*h)||l<=k(i*g)||l<=j;return new Sk.builtin.bool(m)},$flags:{FastCall:!0},$textsig:\"($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\",$doc:\"Determine whether two floating point numbers are close in value.\\n\\n rel_tol\\n maximum difference for being considered \\\"close\\\", relative to the\\n magnitude of the input values\\n abs_tol\\n maximum difference for being considered \\\"close\\\", regardless of the\\n magnitude of the input values\\n\\nReturn True if a is close in value to b, and False otherwise.\\n\\nFor the values to be considered close, the difference between them\\nmust be smaller than at least one of the tolerances.\\n\\n-inf, inf and NaN behave similarly to the IEEE 754 Standard. That\\nis, NaN is not close to anything, even itself. inf and -inf are\\nonly close to themselves.\"},isfinite:{$meth:function isfinite(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.true$:isFinite(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return True if x is neither an infinity nor a NaN, and False otherwise.\"},isinf:{$meth:function isinf(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.false$:isFinite(b)||isNaN(b)?Sk.builtin.bool.false$:Sk.builtin.bool.true$},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return True if x is a positive or negative infinity, and False otherwise.\"},isnan:{$meth:function isnan(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return isNaN(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return True if x is a NaN (not a number), and False otherwise.\"},ldexp:{$meth:function ldexp(a,b){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"i\",\"integer\",Sk.builtin.checkInt(b));let c=a.v;\"number\"!=typeof c&&(c=a.nb$float().v);const d=Sk.builtin.asnum$(b);if(c==1/0||c==-Infinity||0==c||isNaN(c))return a;const e=c*g(2,d);if(!isFinite(e))throw new Sk.builtin.OverflowError(\"math range error\");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, i, /)\",$doc:\"Return x * (2**i).\\n\\nThis is essentially the inverse of frexp().\"},lgamma:{$meth:function lgamma(){throw new Sk.builtin.NotImplementedError(\"math.lgamma() is not yet implemented in Skulpt\")},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Natural logarithm of absolute value of Gamma function at x.\"},log:{$meth:function log(a,b){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));let f,g,h=Sk.builtin.asnum$(a);if(0>=h)throw new Sk.builtin.ValueError(\"math domain error\");if(void 0===b?f=d:(Sk.builtin.pyCheckType(\"base\",\"number\",Sk.builtin.checkNumber(b)),f=Sk.builtin.asnum$(b)),0>=f)throw new Sk.builtin.ValueError(\"math domain error\");else if(Sk.builtin.checkFloat(a)||he)throw new Sk.builtin.ValueError(\"math domain error\");else if(Sk.builtin.checkFloat(a)||e=c)throw new Sk.builtin.ValueError(\"math domain error\");else{if(0==c)return new Sk.builtin.float_(c);if(k(c)=c){const a=1+c,b=e(a)-(a-1-c)/a;return new Sk.builtin.float_(b)}else{const a=e(1+c);return new Sk.builtin.float_(a)}}},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the natural logarithm of 1+x (base e).\\n\\nThe result is computed in a way which is accurate for x near zero.\"},log2:{$meth:function log2(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));let b,d=Sk.builtin.asnum$(a);if(0>d)throw new Sk.builtin.ValueError(\"math domain error\");else if(Sk.builtin.checkFloat(a)||de)throw new Sk.builtin.ValueError(\"math domain error\");else{if(1==d)return new Sk.builtin.float_(1);if(i(d)&&i(e)&&0>d&&!c(e))throw new Sk.builtin.ValueError(\"math domain error\");else if(-1==d&&(e==-Infinity||e==1/0))return new Sk.builtin.float_(1)}const f=g(d,e);if(!i(d)||!i(e))return new Sk.builtin.float_(f);if(f==1/0||f==-Infinity)throw new Sk.builtin.OverflowError(\"math range error\");return new Sk.builtin.float_(f)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return x**y (x to the power of y).\"},radians:{$meth:function radians(b){Sk.builtin.pyCheckType(\"deg\",\"number\",Sk.builtin.checkNumber(b));const c=a/180*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Convert angle x from degrees to radians.\"},remainder:{$meth:function remainder(a,b){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"y\",\"number\",Sk.builtin.checkNumber(b));let d=a.v,e=b.v;if(\"number\"!=typeof d&&(d=a.nb$float().v),\"number\"!=typeof e&&(e=b.nb$float().v),isFinite(d)&&isFinite(e)){let a,b,f,c,g;if(0==e)throw new Sk.builtin.ValueError(\"math domain error\");if(a=k(d),b=k(e),c=a%b,f=b-c,cf)g=-f;else{if(c!=f)throw new Sk.builtin.AssertionError;g=c-2*(.5*(a-c)%b)}return new Sk.builtin.float_(n(d)*g)}if(isNaN(d))return a;if(isNaN(e))return b;if(d==1/0||d==-Infinity)throw new Sk.builtin.ValueError(\"math domain error\");if(e!=1/0&&e!=-Infinity)throw new Sk.builtin.AssertionError;return new Sk.builtin.float_(d)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Difference between x and the closest integer multiple of y.\\n\\nReturn x - n*y where n*y is the closest integer multiple of y.\\nIn the case where x is exactly halfway between two multiples of\\ny, the nearest even value of n is used. The result is always exact.\"},sin:{$meth:function sin(a){var b=Math.sin;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the sine of x (measured in radians).\"},sinh:{$meth:function sinh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b-1/b)/2)},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the hyperbolic sine of x.\"},sqrt:{$meth:function sqrt(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);if(0>c)throw new Sk.builtin.ValueError(\"math domain error\");return new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the square root of x.\"},tan:{$meth:function tan(a){var b=Math.tan;return Sk.builtin.pyCheckType(\"rad\",\"number\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the tangent of x (measured in radians).\"},tanh:{$meth:function tanh(a){Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(0===b)return new Sk.builtin.float_(b);const c=g(d,b),e=1/c;return new Sk.builtin.float_((c-e)/2/((c+e)/2))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the hyperbolic tangent of x.\"},trunc:{$meth:function trunc(a){return Sk.builtin.pyCheckType(\"x\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.checkInt(a)?a:new Sk.builtin.int_(0|Sk.builtin.asnum$(a))},$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Truncates the Real x to the nearest Integral toward 0.\\n\\nUses the __trunc__ magic method.\"}}),l};","src/lib/md5.py":"raise NotImplementedError(\"md5 is not yet implemented in Skulpt\")\n","src/lib/mhlib.py":"raise NotImplementedError(\"mhlib is not yet implemented in Skulpt\")\n","src/lib/mimetools.py":"raise NotImplementedError(\"mimetools is not yet implemented in Skulpt\")\n","src/lib/mimetypes.py":"raise NotImplementedError(\"mimetypes is not yet implemented in Skulpt\")\n","src/lib/mimify.py":"raise NotImplementedError(\"mimify is not yet implemented in Skulpt\")\n","src/lib/modulefinder.py":"raise NotImplementedError(\"modulefinder is not yet implemented in Skulpt\")\n","src/lib/multifile.py":"raise NotImplementedError(\"multifile is not yet implemented in Skulpt\")\n","src/lib/multiprocessing/__init__.py":"raise NotImplementedError(\"multiprocessing is not yet implemented in Skulpt\")\n","src/lib/multiprocessing/dummy/__init__.py":"raise NotImplementedError(\"dummy is not yet implemented in Skulpt\")\n","src/lib/mutex.py":"raise NotImplementedError(\"mutex is not yet implemented in Skulpt\")\n","src/lib/netrc.py":"raise NotImplementedError(\"netrc is not yet implemented in Skulpt\")\n","src/lib/new.py":"raise NotImplementedError(\"new is not yet implemented in Skulpt\")\n","src/lib/nntplib.py":"raise NotImplementedError(\"nntplib is not yet implemented in Skulpt\")\n","src/lib/ntpath.py":"raise NotImplementedError(\"ntpath is not yet implemented in Skulpt\")\n","src/lib/nturl2path.py":"raise NotImplementedError(\"nturl2path is not yet implemented in Skulpt\")\n","src/lib/numbers.py":"Number = (int, float, complex)\nIntegral = int\nComplex = complex\n","src/lib/opcode.py":"raise NotImplementedError(\"opcode is not yet implemented in Skulpt\")\n","src/lib/operator.js":"function $builtinmodule(){return operator={__name__:new Sk.builtin.str(\"operator\"),__doc__:new Sk.builtin.str(\"Operator interface.\\n\\nThis module exports a set of functions implemented in javascript corresponding\\nto the intrinsic operators of Python. For example, operator.add(x, y)\\nis equivalent to the expression x+y. The function names are those\\nused for special methods; variants without leading and trailing\\n'__' are also provided for convenience.\"),__all__:new Sk.builtin.list([\"abs\",\"add\",\"and_\",\"attrgetter\",\"concat\",\"contains\",\"countOf\",\"delitem\",\"eq\",\"floordiv\",\"ge\",\"getitem\",\"gt\",\"iadd\",\"iand\",\"iconcat\",\"ifloordiv\",\"ilshift\",\"imatmul\",\"imod\",\"imul\",\"index\",\"indexOf\",\"inv\",\"invert\",\"ior\",\"ipow\",\"irshift\",\"is_\",\"is_not\",\"isub\",\"itemgetter\",\"itruediv\",\"ixor\",\"le\",\"length_hint\",\"lshift\",\"lt\",\"matmul\",\"methodcaller\",\"mod\",\"mul\",\"ne\",\"neg\",\"not_\",\"or_\",\"pos\",\"pow\",\"rshift\",\"setitem\",\"sub\",\"truediv\",\"truth\",\"xor\"].map(a=>new Sk.builtin.str(a)))},operator.itemgetter=Sk.abstr.buildNativeClass(\"operator.itemgetter\",{constructor:function itemgetter(a){this.items=a,this.oneitem=1===a.length,this.item=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){return Sk.abstr.checkNoKwargs(\"itemgetter\",b),Sk.abstr.checkArgsLen(\"itemgetter\",a,1),new operator.itemgetter(a)},tp$call(a,b){Sk.abstr.checkNoKwargs(\"itemgetter\",b),Sk.abstr.checkArgsLen(\"itemgetter\",a,1,1);const c=a[0];return this.oneitem?Sk.abstr.objectGetItem(c,this.item,!0):new Sk.builtin.tuple(this.items.map(a=>Sk.abstr.objectGetItem(c,a)))},tp$doc:\"Return a callable object that fetches the given item(s) from its operand.\\n After f = itemgetter(2), the call f(r) returns r[2].\\n After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\"(...)\");this.in$repr=!0;const a=this.tp$name+\"(\"+this.items.map(a=>Sk.misceval.objectRepr(a)).join(\", \")+\")\";return this.in$repr=!1,a}}}),operator.attrgetter=Sk.abstr.buildNativeClass(\"operator.attrgetter\",{constructor:function attrgetter(a){this.attrs=a,this.oneattr=1===a.length,this.attr=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkNoKwargs(\"attrgetter\",b),Sk.abstr.checkArgsLen(\"attrgetter\",a,1);const c=[];for(let d=0;dnew Sk.builtin.str(a))):c.push([b])}return new operator.attrgetter(c)},tp$call(a,b){Sk.abstr.checkNoKwargs(\"attrgetter\",b),Sk.abstr.checkArgsLen(\"attrgetter\",a,1,1);const c=a[0];if(this.oneattr)return this.attr.reduce((a,b)=>Sk.abstr.gattr(a,b),c);const d=this.attrs.map(a=>a.reduce((a,b)=>Sk.abstr.gattr(a,b),c));return new Sk.builtin.tuple(d)},tp$doc:\"attrgetter(attr, ...) --> attrgetter object\\n\\nReturn a callable object that fetches the given attribute(s) from its operand.\\nAfter f = attrgetter('name'), the call f(r) returns r.name.\\nAfter g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\\nAfter h = attrgetter('name.first', 'name.last'), the call h(r) returns\\n(r.name.first, r.name.last).\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\"(...)\");this.in$repr=!0;const a=this.tp$name+\"(\"+this.items.map(a=>Sk.misceval.objectRepr(a)).join(\", \")+\")\";return this.in$repr=!1,a}}}),operator.methodcaller=Sk.abstr.buildNativeClass(\"operator.methodcaller\",{constructor:function methodcaller(a,b,c){this.$name=a,this.args=b,this.kwargs=c||[],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkArgsLen(\"methodcaller\",a,1);const c=a[0];if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"method name must be a string\");return new operator.methodcaller(c,a.slice(1),b)},tp$call(a,b){Sk.abstr.checkNoKwargs(\"methodcaller\",b),Sk.abstr.checkArgsLen(\"methodcaller\",a,1,1);const c=a[0];return Sk.misceval.chain(Sk.abstr.gattr(c,this.$name,!0),a=>Sk.misceval.callsimOrSuspendArray(a,this.args,this.kwargs))},tp$doc:\"methodcaller(name, ...) --> methodcaller object\\n\\nReturn a callable object that calls the given method on its operand.\\nAfter f = methodcaller('name'), the call f(r) returns r.name().\\nAfter g = methodcaller('name', 'date', foo=1), the call g(r) returns\\nr.name('date', foo=1).\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\"(...)\");this.in$repr=!0;let a=[Sk.misceval.objectRepr(this.$name),...this.args.map(a=>Sk.misceval.objectRepr(a))];for(let b=0;b= b.\"},gt:{$meth:function gt(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\"Gt\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a > b.\"},not_:{$meth:function not_(a){return Sk.abstr.numberUnaryOp(a,\"Not\")},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as not a.\"},truth:{$meth:function truth(a){return Sk.builtin.bool(a)},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Return True if a is true, False otherwise.\"},is_:{$meth:function is_(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\"Is\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a is b.\"},is_not:{$meth:function is_not(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\"IsNot\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a is not b.\"},abs:{$meth:function abs(a){return Sk.builtin.abs(a)},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as abs(a).\"},add:{$meth:function add(c,a){return Sk.abstr.numberBinOp(c,a,\"Add\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a + b.\"},and_:{$meth:function and_(c,a){return Sk.abstr.numberBinOp(c,a,\"BitAnd\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a & b.\"},floordiv:{$meth:function floordiv(c,a){return Sk.abstr.numberBinOp(c,a,\"FloorDiv\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a // b.\"},index:{$meth:function index(b){return new Sk.builtin.int_(Sk.misceval.asIndexOrThrow(b))},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as a.__index__()\"},inv:{$meth:function inv(a){return Sk.abstr.numberUnaryOp(a,\"Invert\")},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as ~a.\"},invert:{$meth:function invert(a){return Sk.abstr.numberUnaryOp(a,\"Invert\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, /)\",$doc:\"Same as ~a.\"},lshift:{$meth:function lshift(c,a){return Sk.abstr.numberBinOp(c,a,\"LShift\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a << b.\"},mod:{$meth:function mod(c,a){return Sk.abstr.numberBinOp(c,a,\"Mod\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a % b.\"},mul:{$meth:function mul(c,a){return Sk.abstr.numberBinOp(c,a,\"Mult\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a * b.\"},matmul:{$meth:function matmul(c,a){return Sk.abstr.numberBinOp(c,a,\"MatMult\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a @ b.\"},neg:{$meth:function neg(a){return Sk.abstr.numberUnaryOp(a,\"USub\")},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as -a.\"},or_:{$meth:function or_(c,a){return Sk.abstr.numberBinOp(c,a,\"BitOr\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a | b.\"},pos:{$meth:function pos(a){return Sk.abstr.numberUnaryOp(a,\"UAdd\")},$flags:{OneArg:!0},$textsig:\"($module, a, /)\",$doc:\"Same as +a.\"},pow:{$meth:function pow(c,a){return Sk.abstr.numberBinOp(c,a,\"Pow\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a ** b.\"},rshift:{$meth:function rshift(c,a){return Sk.abstr.numberBinOp(c,a,\"RShift\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a >> b.\"},sub:{$meth:function sub(c,a){return Sk.abstr.numberBinOp(c,a,\"Sub\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a - b.\"},truediv:{$meth:function div(c,a){return Sk.abstr.numberBinOp(c,a,\"Div\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a / b.\"},xor:{$meth:function xor(c,a){return Sk.abstr.numberBinOp(c,a,\"BitXor\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a ^ b.\"},concat:{$meth:function concat(c,a){return Sk.abstr.sequenceConcat(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a + b, for a and b sequences.\"},contains:{$meth:function contains(c,a){return Sk.builtin.bool(Sk.abstr.sequenceContains(c,a))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as b in a (note reversed operands).\"},countOf:{$meth:function countOf(c,a){return Sk.abstr.sequenceGetCountOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Return the number of times b occurs in a.\"},delitem:{$meth:function delitem(c,a){return Sk.misceval.chain(Sk.abstr.objectDelItem(c,a,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as del a[b].\"},getitem:{$meth:function getitem(c,a){return Sk.abstr.objectGetItem(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a[b].\"},indexOf:{$meth:function indexOf(c,a){return Sk.abstr.sequenceGetIndexOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Return the first index of b in a.\"},setitem:{$meth:function setitem(d,a,b){return Sk.misceval.chain(Sk.abstr.objectSetItem(d,a,b,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:3,MaxArgs:3},$textsig:\"($module, a, b, c, /)\",$doc:\"Same as a[b] = c.\"},length_hint:{$meth:function length_hint(a,b){if(void 0===b)b=new Sk.builtin.int_(0);else if(!Sk.builtin.checkInt(b))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(b)+\"' object cannot be interpreted as an integer\");try{return Sk.builtin.len(a)}catch(a){if(!(a instanceof Sk.builtin.TypeError))throw a}const c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$length_hint);if(void 0!==c){const a=Sk.misceval.callsimArray(c,[]);if(a===Sk.builtin.NotImplemented.NotImplemented$)return b;if(!Sk.builtin.checkInteger(a))throw new Sk.builtin.TypeError(\"__length_hint__ must be an integer, not \"+Sk.abstr.typeName(a));else if(a.nb$isnegative())throw new Sk.builtin.TypeError(\"__length_hint__() should return >= 0\");return a}return b},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($module, obj, default=0, /)\",$doc:\"Return an estimate of the number of items in obj.\\n\\nThis is useful for presizing containers when building from an iterable.\\n\\nIf the object supports len(), the result will be exact.\\nOtherwise, it may over- or under-estimate by an arbitrary amount.\\nThe result will be an integer >= 0.\"},iadd:{$meth:function iadd(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Add\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a += b.\"},iand:{$meth:function iand(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"BitAnd\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a &= b.\"},iconcat:{$meth:function iconcat(c,a){if(void 0!==c.sq$inplace_concat)return c.sq$inplace_concat(a);if(void 0!==c.sq$concat)return c.sq$concat(a);if(!Sk.builtin.checkSequence(c)||!Sk.builtin.checkSequence(a))throw new Sk.builtin.TypeError(Sk.abstr.typeName(c)+\" object can't be concatenated\");return Sk.abstr.numberInplaceBinOp(c,a,\"Add\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a += b, for a and b sequences.\"},ifloordiv:{$meth:function ifloordiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"FloorDiv\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a //= b.\"},ilshift:{$meth:function ilshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"LShift\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a <<= b.\"},imod:{$meth:function imod(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Mod\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a %= b.\"},imul:{$meth:function imul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Mult\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a *= b.\"},imatmul:{$meth:function imatmul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"MatMult\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a @= b.\"},ior:{$meth:function ior(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"BitOr\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a |= b.\"},ipow:{$meth:function ipow(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Pow\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a **= b.\"},irshift:{$meth:function irshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"LRhift\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a >>= b.\"},isub:{$meth:function isub(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Sub\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a -= b.\"},itruediv:{$meth:function idiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"Div\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a /= b.\"},ixor:{$meth:function ixor(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\"BitXor\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, a, b, /)\",$doc:\"Same as a ^= b.\"}}),Object.assign(operator,{__abs__:operator.abs,__add__:operator.add,__and__:operator.and,__concat__:operator.concat,__contains__:operator.contains,__delitem__:operator.delitem,__eq__:operator.eq,__floordiv__:operator.floordiv,__ge__:operator.ge,__getitem__:operator.getitem,__gt__:operator.gt,__iadd__:operator.iadd,__iand__:operator.iand,__iconcat__:operator.iconcat,__ifloordiv__:operator.ifloordiv,__ilshift__:operator.ilshift,__imatmul__:operator.imatmul,__imod__:operator.imod,__imul__:operator.imul,__index__:operator.index,__inv__:operator.inv,__invert__:operator.invert,__ior__:operator.ior,__ipow__:operator.ipow,__irshift__:operator.irshift,__isub__:operator.isub,__itruediv__:operator.itruediv,__ixor__:operator.ixor,__le__:operator.le,__lshift__:operator.lshift,__lt__:operator.lt,__matmul__:operator.matmul,__mod__:operator.mod,__mul__:operator.mul,__ne__:operator.ne,__neg__:operator.neg,__not__:operator.not,__or__:operator.or,__pos__:operator.pos,__pow__:operator.pow,__rshift__:operator.rshift,__setitem__:operator.setitem,__sub__:operator.sub,__truediv__:operator.truediv,__xor__:operator.xor,_abs:Sk.builtins.abs,div:operator.truediv,__div__:operator.truediv}),operator}","src/lib/optparse.py":"raise NotImplementedError(\"optparse is not yet implemented in Skulpt\")\n","src/lib/os.py":"raise NotImplementedError(\"os is not yet implemented in Skulpt\")\n","src/lib/os2emxpath.py":"raise NotImplementedError(\"os2emxpath is not yet implemented in Skulpt\")\n","src/lib/pdb.py":"raise NotImplementedError(\"pdb is not yet implemented in Skulpt\")\n","src/lib/pickle.py":"raise NotImplementedError(\"pickle is not yet implemented in Skulpt\")\n","src/lib/pickletools.py":"raise NotImplementedError(\"pickletools is not yet implemented in Skulpt\")\n","src/lib/pipes.py":"raise NotImplementedError(\"pipes is not yet implemented in Skulpt\")\n","src/lib/pkgutil.py":"raise NotImplementedError(\"pkgutil is not yet implemented in Skulpt\")\n","src/lib/platform.js":"var $builtinmodule=function(){var a={},b=\"undefined\"!=typeof window&&\"undefined\"!=typeof window.navigator;return a.python_implementation=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\"python_implementation\",arguments.length,0,0),new Sk.builtin.str(\"Skulpt\")}),a.node=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\"node\",arguments.length,0,0),new Sk.builtin.str(\"\")}),a.version=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\"version\",arguments.length,0,0),new Sk.builtin.str(\"\")}),a.python_version=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\"python_version\",arguments.length,0,0),a=Sk.__future__.python_version?\"3.2.0\":\"2.7.0\",new Sk.builtin.str(a)}),a.system=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\"system\",arguments.length,0,0),a=b?window.navigator.appCodeName:\"\",new Sk.builtin.str(a)}),a.machine=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\"machine\",arguments.length,0,0),a=b?window.navigator.platform:\"\",new Sk.builtin.str(a)}),a.release=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\"release\",arguments.length,0,0),a=b?window.navigator.appVersion:\"\",new Sk.builtin.str(a)}),a.architecture=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\"architecture\",arguments.length,0,0),new Sk.builtin.tuple([new Sk.builtin.str(\"64bit\"),new Sk.builtin.str(\"\")])}),a.processor=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\"processor\",arguments.length,0,0),new Sk.builtin.str(\"\")}),a};","src/lib/platform.py":"raise NotImplementedError(\"platform is not yet implemented in Skulpt\")\n","src/lib/plistlib.py":"raise NotImplementedError(\"plistlib is not yet implemented in Skulpt\")\n","src/lib/popen2.py":"raise NotImplementedError(\"popen2 is not yet implemented in Skulpt\")\n","src/lib/poplib.py":"raise NotImplementedError(\"poplib is not yet implemented in Skulpt\")\n","src/lib/posixfile.py":"raise NotImplementedError(\"posixfile is not yet implemented in Skulpt\")\n","src/lib/posixpath.py":"raise NotImplementedError(\"posixpath is not yet implemented in Skulpt\")\n","src/lib/pprint.py":"raise NotImplementedError(\"pprint is not yet implemented in Skulpt\")\n","src/lib/processing.js":"var $builtinmodule=function(){var b,c,d,e,f,g,h,a=Math.PI,j={__name__:new Sk.builtin.str(\"processing\")},k=[],l=!0,m=null;return j.processing=null,j.p=null,j.X=new Sk.builtin.int_(0),j.Y=new Sk.builtin.int_(1),j.Z=new Sk.builtin.int_(2),j.R=new Sk.builtin.int_(3),j.G=new Sk.builtin.int_(4),j.B=new Sk.builtin.int_(5),j.A=new Sk.builtin.int_(6),j.U=new Sk.builtin.int_(7),j.V=new Sk.builtin.int_(8),j.NX=new Sk.builtin.int_(9),j.NY=new Sk.builtin.int_(10),j.NZ=new Sk.builtin.int_(11),j.EDGE=new Sk.builtin.int_(12),j.SR=new Sk.builtin.int_(13),j.SG=new Sk.builtin.int_(14),j.SB=new Sk.builtin.int_(15),j.SA=new Sk.builtin.int_(16),j.SW=new Sk.builtin.int_(17),j.TX=new Sk.builtin.int_(18),j.TY=new Sk.builtin.int_(19),j.TZ=new Sk.builtin.int_(20),j.VX=new Sk.builtin.int_(21),j.VY=new Sk.builtin.int_(22),j.VZ=new Sk.builtin.int_(23),j.VW=new Sk.builtin.int_(24),j.AR=new Sk.builtin.int_(25),j.AG=new Sk.builtin.int_(26),j.AB=new Sk.builtin.int_(27),j.DR=new Sk.builtin.int_(3),j.DG=new Sk.builtin.int_(4),j.DB=new Sk.builtin.int_(5),j.DA=new Sk.builtin.int_(6),j.SPR=new Sk.builtin.int_(28),j.SPG=new Sk.builtin.int_(29),j.SPB=new Sk.builtin.int_(30),j.SHINE=new Sk.builtin.int_(31),j.ER=new Sk.builtin.int_(32),j.EG=new Sk.builtin.int_(33),j.EB=new Sk.builtin.int_(34),j.BEEN_LIT=new Sk.builtin.int_(35),j.VERTEX_FIELD_COUNT=new Sk.builtin.int_(36),j.CENTER=new Sk.builtin.int_(3),j.RADIUS=new Sk.builtin.int_(2),j.CORNERS=new Sk.builtin.int_(1),j.CORNER=new Sk.builtin.int_(0),j.DIAMETER=new Sk.builtin.int_(3),j.BASELINE=new Sk.builtin.int_(0),j.TOP=new Sk.builtin.int_(101),j.BOTTOM=new Sk.builtin.int_(102),j.NORMAL=new Sk.builtin.int_(1),j.NORMALIZED=new Sk.builtin.int_(1),j.IMAGE=new Sk.builtin.int_(2),j.MODEL=new Sk.builtin.int_(4),j.SHAPE=new Sk.builtin.int_(5),j.AMBIENT=new Sk.builtin.int_(0),j.DIRECTIONAL=new Sk.builtin.int_(1),j.SPOT=new Sk.builtin.int_(3),j.RGB=new Sk.builtin.int_(1),j.ARGB=new Sk.builtin.int_(2),j.HSB=new Sk.builtin.int_(3),j.ALPHA=new Sk.builtin.int_(4),j.CMYK=new Sk.builtin.int_(5),j.TIFF=new Sk.builtin.int_(0),j.TARGA=new Sk.builtin.int_(1),j.JPEG=new Sk.builtin.int_(2),j.GIF=new Sk.builtin.int_(3),j.MITER=new Sk.builtin.str(\"miter\"),j.BEVEL=new Sk.builtin.str(\"bevel\"),j.ROUND=new Sk.builtin.str(\"round\"),j.SQUARE=new Sk.builtin.str(\"butt\"),j.PROJECT=new Sk.builtin.str(\"square\"),j.P2D=new Sk.builtin.int_(1),j.JAVA2D=new Sk.builtin.int_(1),j.WEBGL=new Sk.builtin.int_(2),j.P3D=new Sk.builtin.int_(2),j.OPENGL=new Sk.builtin.int_(2),j.PDF=new Sk.builtin.int_(0),j.DXF=new Sk.builtin.int_(0),j.OTHER=new Sk.builtin.int_(0),j.WINDOWS=new Sk.builtin.int_(1),j.MAXOSX=new Sk.builtin.int_(2),j.LINUX=new Sk.builtin.int_(3),j.EPSILON=new Sk.builtin.float_(1e-4),j.MAX_FLOAT=new Sk.builtin.float_(34028235e31),j.MIN_FLOAT=new Sk.builtin.float_(-34028235e31),j.MAX_INT=new Sk.builtin.int_(2147483647),j.MIN_INT=new Sk.builtin.int_(-2147483648),j.HALF_PI=new Sk.builtin.float_(a/2),j.THIRD_PI=new Sk.builtin.float_(a/3),j.PI=new Sk.builtin.float_(a),j.TWO_PI=new Sk.builtin.float_(2*a),j.TAU=new Sk.builtin.float_(2*a),j.QUARTER_PI=new Sk.builtin.float_(a/4),j.DEG_TO_RAD=new Sk.builtin.float_(a/180),j.RAD_TO_DEG=new Sk.builtin.float_(180/a),j.WHITESPACE=new Sk.builtin.str(\" \\t\\n\\r\\f\\xA0\"),j.POINT=new Sk.builtin.int_(2),j.POINTS=new Sk.builtin.int_(2),j.LINE=new Sk.builtin.int_(4),j.LINES=new Sk.builtin.int_(4),j.TRIANGLE=new Sk.builtin.int_(8),j.TRIANGLES=new Sk.builtin.int_(9),j.TRIANGLE_FAN=new Sk.builtin.int_(11),j.TRIANGLE_STRIP=new Sk.builtin.int_(10),j.QUAD=new Sk.builtin.int_(16),j.QUADS=new Sk.builtin.int_(16),j.QUAD_STRIP=new Sk.builtin.int_(17),j.POLYGON=new Sk.builtin.int_(20),j.PATH=new Sk.builtin.int_(21),j.RECT=new Sk.builtin.int_(30),j.ELLIPSE=new Sk.builtin.int_(31),j.ARC=new Sk.builtin.int_(32),j.SPHERE=new Sk.builtin.int_(40),j.BOX=new Sk.builtin.int_(41),j.GROUP=new Sk.builtin.int_(0),j.PRIMITIVE=new Sk.builtin.int_(1),j.GEOMETRY=new Sk.builtin.int_(3),j.VERTEX=new Sk.builtin.int_(0),j.BEZIER_VERTEX=new Sk.builtin.int_(1),j.CURVE_VERTEX=new Sk.builtin.int_(2),j.BREAK=new Sk.builtin.int_(3),j.CLOSESHAPE=new Sk.builtin.int_(4),j.REPLACE=new Sk.builtin.int_(0),j.BLEND=new Sk.builtin.int_(1),j.ADD=new Sk.builtin.int_(2),j.SUBTRACT=new Sk.builtin.int_(4),j.LIGHTEST=new Sk.builtin.int_(8),j.DARKEST=new Sk.builtin.int_(16),j.DIFFERENCE=new Sk.builtin.int_(32),j.EXCLUSION=new Sk.builtin.int_(64),j.MULTIPLY=new Sk.builtin.int_(128),j.SCREEN=new Sk.builtin.int_(256),j.OVERLAY=new Sk.builtin.int_(512),j.HARD_LIGHT=new Sk.builtin.int_(1024),j.SOFT_LIGHT=new Sk.builtin.int_(2048),j.DODGE=new Sk.builtin.int_(4096),j.BURN=new Sk.builtin.int_(8192),j.ALPHA_MASK=new Sk.builtin.int_(4278190080),j.RED_MASK=new Sk.builtin.int_(16711680),j.GREEN_MASK=new Sk.builtin.int_(65280),j.BLUE_MASK=new Sk.builtin.int_(255),j.CUSTOM=new Sk.builtin.int_(0),j.ORTHOGRAPHIC=new Sk.builtin.int_(2),j.PERSPECTIVE=new Sk.builtin.int_(3),j.ARROW=new Sk.builtin.str(\"default\"),j.CROSS=new Sk.builtin.str(\"crosshair\"),j.HAND=new Sk.builtin.str(\"pointer\"),j.MOVE=new Sk.builtin.str(\"move\"),j.TEXT=new Sk.builtin.str(\"text\"),j.WAIT=new Sk.builtin.str(\"wait\"),j.NOCURSOR=Sk.builtin.assk$(\"url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto\"),j.DISABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(1),j.ENABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(-1),j.ENABLE_OPENGL_4X_SMOOTH=new Sk.builtin.int_(2),j.ENABLE_NATIVE_FONTS=new Sk.builtin.int_(3),j.DISABLE_DEPTH_TEST=new Sk.builtin.int_(4),j.ENABLE_DEPTH_TEST=new Sk.builtin.int_(-4),j.ENABLE_DEPTH_SORT=new Sk.builtin.int_(5),j.DISABLE_DEPTH_SORT=new Sk.builtin.int_(-5),j.DISABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(6),j.ENABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(-6),j.ENABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(7),j.DISABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(-7),j.HINT_COUNT=new Sk.builtin.int_(10),j.OPEN=new Sk.builtin.int_(1),j.CLOSE=new Sk.builtin.int_(2),j.BLUR=new Sk.builtin.int_(11),j.GRAY=new Sk.builtin.int_(12),j.INVERT=new Sk.builtin.int_(13),j.OPAQUE=new Sk.builtin.int_(14),j.POSTERIZE=new Sk.builtin.int_(15),j.THRESHOLD=new Sk.builtin.int_(16),j.ERODE=new Sk.builtin.int_(17),j.DILATE=new Sk.builtin.int_(18),j.BACKSPACE=new Sk.builtin.int_(8),j.TAB=new Sk.builtin.int_(9),j.ENTER=new Sk.builtin.int_(10),j.RETURN=new Sk.builtin.int_(13),j.ESC=new Sk.builtin.int_(27),j.DELETE=new Sk.builtin.int_(127),j.CODED=new Sk.builtin.int_(65535),j.SHIFT=new Sk.builtin.int_(16),j.CONTROL=new Sk.builtin.int_(17),j.ALT=new Sk.builtin.int_(18),j.CAPSLK=new Sk.builtin.int_(20),j.PGUP=new Sk.builtin.int_(33),j.PGDN=new Sk.builtin.int_(34),j.END=new Sk.builtin.int_(35),j.HOME=new Sk.builtin.int_(36),j.LEFT=new Sk.builtin.int_(37),j.UP=new Sk.builtin.int_(38),j.RIGHT=new Sk.builtin.int_(39),j.DOWN=new Sk.builtin.int_(40),j.F1=new Sk.builtin.int_(112),j.F2=new Sk.builtin.int_(113),j.F3=new Sk.builtin.int_(114),j.F4=new Sk.builtin.int_(115),j.F5=new Sk.builtin.int_(116),j.F6=new Sk.builtin.int_(117),j.F7=new Sk.builtin.int_(118),j.F8=new Sk.builtin.int_(119),j.F9=new Sk.builtin.int_(120),j.F10=new Sk.builtin.int_(121),j.F11=new Sk.builtin.int_(122),j.F12=new Sk.builtin.int_(123),j.NUMLK=new Sk.builtin.int_(144),j.META=new Sk.builtin.int_(157),j.INSERT=new Sk.builtin.int_(155),j.SINCOS_LENGTH=new Sk.builtin.int_(720),j.PRECISIONB=new Sk.builtin.int_(15),j.PRECISIONF=new Sk.builtin.int_(32768),j.PREC_MAXVAL=new Sk.builtin.int_(32767),j.PREC_ALPHA_SHIFT=new Sk.builtin.int_(9),j.PREC_RED_SHIFT=new Sk.builtin.int_(1),j.NORMAL_MODE_AUTO=new Sk.builtin.int_(0),j.NORMAL_MODE_SHAPE=new Sk.builtin.int_(1),j.NORMAL_MODE_VERTEX=new Sk.builtin.int_(2),j.MAX_LIGHTS=new Sk.builtin.int_(8),j.line=new Sk.builtin.func(function(a,b,c,d){j.processing.line(a.v,b.v,c.v,d.v)}),j.ellipse=new Sk.builtin.func(function(a,b,c,d){j.processing.ellipse(a.v,b.v,c.v,d.v)}),j.text=new Sk.builtin.func(function(a,b,c){j.processing.text(a.v,b.v,c.v)}),j.point=new Sk.builtin.func(function(a,b){j.processing.point(a.v,b.v)}),j.arc=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.arc(a.v,b.v,c.v,d.v,e.v,f.v)}),j.quad=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.quad(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.rect=new Sk.builtin.func(function(a,b,c,d,e){\"undefined\"==typeof e?j.processing.rect(a.v,b.v,c.v,d.v):j.processing.rect(a.v,b.v,c.v,d.v,e.v)}),j.triangle=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.triangle(a.v,b.v,c.v,d.v,e.v,f.v)}),j.bezier=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){\"undefined\"==typeof i?j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.alpha=new Sk.builtin.func(function(a,c,d){return\"undefined\"==typeof c?new Sk.builtin.float_(j.processing.alpha(a.v)):\"undefined\"==typeof d?new Sk.builtin.float_(j.processing.alpha(a.v,c.v)):new Sk.builtin.float_(j.processing.alpha(a.v,c.v,d.v))}),j.ambient=new Sk.builtin.func(function(a,c,d){\"undefined\"==typeof c?j.processing.ambient(a.v):\"undefined\"==typeof d?j.processing.ambient(a.v,c.v):j.processing.ambient(a.v,c.v,d.v)}),j.ambientLight=new Sk.builtin.func(function(a,b,c,d,e,f){\"undefined\"==typeof d?j.processing.ambientLight(a.v,b.v,c.v):\"undefined\"==typeof e?j.processing.ambientLight(a.v,b.v,c.v,d.v):\"undefined\"==typeof f?j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v):j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.beginCamera=new Sk.builtin.func(function(){j.processing.beginCamera()}),j.beginShape=new Sk.builtin.func(function(a){\"undefined\"==typeof a&&(a=j.POLYGON),j.processing.beginShape(a.v)}),j.bezierDetail=new Sk.builtin.func(function(a){a=\"undefined\"==typeof a?20:a.v,j.processing.bezierDetail(a)}),j.bezierPoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierPoint(e.v,a.v,b.v,c.v,d.v)}),j.bezierTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierTangent(e.v,a.v,b.v,c.v,d.v)}),j.bezierVertex=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){\"undefined\"==typeof g?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v):\"undefined\"==typeof h?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v):\"undefined\"==typeof i?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.blend=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v)}),j.blendColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.blendColor(a.v,b.v,d.v),e}),j.brightness=new Sk.builtin.func(function(a,c,d){return\"undefined\"==typeof c?new Sk.builtin.float_(j.processing.brightness(a.v)):\"undefined\"==typeof d?new Sk.builtin.float_(j.processing.brightness(a.v,c.v)):new Sk.builtin.float_(j.processing.brightness(a.v,c.v,d.v))}),j.camera=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){\"undefined\"==typeof a?j.processing.camera():j.processing.camera(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.constrain=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.constrain(a.v,b.v,c.v))}),j.copy=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.createFont=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PFont);return e.v=\"undefined\"==typeof c?j.processing.createFont(a.v,b.v):\"undefined\"==typeof d?j.processing.createFont(a.v,b.v,c.v):j.processing.createFont(a.v,b.v,c.v,d.v),e}),j.createGraphics=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PGraphics);return e.v=\"undefined\"==typeof d?j.processing.createGraphics(a.v,b.v,c.v):j.processing.createGraphics(a.v,b.v,c.v,d.v),e}),j.createImage=new Sk.builtin.func(function(a,b,c){var d=Sk.misceval.callsimArray(j.PImage);return d.v=j.processing.createImage(a.v,b.v,c.v),d}),j.cursor=new Sk.builtin.func(function(a,b,c){\"undefined\"==typeof a?j.processing.cursor():\"undefined\"==typeof b?j.processing.cursor(a.v):\"undefined\"==typeof c?j.processing.cursor(a.v,b.v):j.processing.cursor(a.v,b.v,c.v)}),j.curve=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){\"undefined\"==typeof i?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):\"undefined\"==typeof k?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):\"undefined\"==typeof l?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v):\"undefined\"==typeof m?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v):j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.curveDetail=new Sk.builtin.func(function(a){j.processing.curveDetail(a.v)}),j.curvePoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curvePoint(e.v,a.v,b.v,c.v,d.v)}),j.curveTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curveTangent(e.v,a.v,b.v,c.v,d.v)}),j.curveTightness=new Sk.builtin.func(function(a){j.processing.curveTightness(a.v)}),j.curveVertex=new Sk.builtin.func(function(a,b,c){\"undefined\"==typeof c?j.processing.curveVertex(a.v,b.v):j.processing.curveVertex(a.v,b.v,c.v)}),j.day=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.day())}),j.degrees=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.degrees(a.v))}),j.directionalLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.directionalLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.dist=new Sk.builtin.func(function(a,b,c,d,e,f){return\"undefined\"==typeof e?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v)):\"undefined\"==typeof f?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v)):new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v,f.v))}),j.emissive=new Sk.builtin.func(function(a,b,c){\"undefined\"==typeof b?j.processing.emissive(a.v):\"undefined\"==typeof c?j.processing.emissive(a.v,b.v):j.processing.emissive(a.v,b.v,c.v)}),j.endCamera=new Sk.builtin.func(function(){j.processing.endCamera()}),j.endShape=new Sk.builtin.func(function(a){\"undefined\"==typeof a?j.processing.endShape():j.processing.endShape(a.v)}),j.filter=new Sk.builtin.func(function(a,b){\"undefined\"==typeof b?j.processing.filter(a.v):j.processing.filter(a.v,b.v)}),j.frustum=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.frustum(a,b,c,d,e,f)}),j.hint=new Sk.builtin.func(function(a){j.processing.hint(a)}),j.hour=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.hour())}),j.hue=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.hue(a.v))}),j.imageMode=new Sk.builtin.func(function(a){j.processing.imageMode(a.v)}),j.lerp=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.lerp(a.v,b.v,c.v))}),j.lerpColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.lerpColor(a.v,b.v,d.v),e}),j.lightFalloff=new Sk.builtin.func(function(a,b,c){j.processing.lightFalloff(a.v,b.v,c.v)}),j.lights=new Sk.builtin.func(function(){j.processing.lights()}),j.lightSpecular=new Sk.builtin.func(function(a,b,c){j.processing.lightSpecular(a.v,b.v,c.v)}),j.loadBytes=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadBytes(a.v))}),j.loadFont=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PFont);return b.v=j.processing.loadFont(a.v),b}),j.loadShape=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PShapeSVG,[new Sk.builtin.str(\"string\"),a]);return b}),j.loadStrings=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadStrings(a.v))}),j.mag=new Sk.builtin.func(function(d,a,b){return\"undefined\"==typeof b?new Sk.builtin.float_(j.processing.mag(d.v,a.v)):new Sk.builtin.float_(j.processing.mag(d.v,a.v,b.v))}),j.map=new Sk.builtin.func(function(a,b,c,d,e){return new Sk.builtin.float_(j.processing.map(a.v,b.v,c.v,d.v,e.v))}),j.millis=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.millis())}),j.minute=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.minute())}),j.modelX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelX(a.v,b.v,c.v))}),j.modelY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelY(a.v,b.v,c.v))}),j.modelZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelZ(a.v,b.v,c.v))}),j.month=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.month())}),j.noCursor=new Sk.builtin.func(function(){j.processing.noCursor()}),j.noise=new Sk.builtin.func(function(a,b,c){return\"undefined\"==typeof b?new Sk.builtin.float_(j.processing.noise(a.v)):\"undefined\"==typeof c?new Sk.builtin.float_(j.processing.noise(a.v,b.v)):new Sk.builtin.float_(j.processing.noise(a.v,b.v,c.v))}),j.noiseDetail=new Sk.builtin.func(function(a,b){j.processing.noiseDetail(a.v,b.v)}),j.noiseSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.noiseSeed(a.v))}),j.noLights=new Sk.builtin.func(function(){j.processing.noLights()}),j.norm=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.norm(a.v,b.v,c.v))}),j.normal=new Sk.builtin.func(function(a,b,c){j.processing.normal(a.v,b.v,c.v)}),j.noTint=new Sk.builtin.func(function(){j.processing.noTint()}),j.ortho=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.ortho(a.v,b.v,c.v,d.v,e.v,f.v)}),j.perspective=new Sk.builtin.func(function(a,b,c,d){\"undefined\"==typeof a?j.processing.perspective():\"undefined\"==typeof b?j.processing.perspective(a.v):\"undefined\"==typeof c?j.processing.perspective(a.v,b.v):\"undefined\"==typeof d?j.processing.perspective(a.v,b.v,c.v):j.processing.perspective(a.v,b.v,c.v,d.v)}),j.pointLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.pointLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.printCamera=new Sk.builtin.func(function(){j.processing.printCamera()}),j.println=new Sk.builtin.func(function(a){j.processing.println(a.v)}),j.printProjection=new Sk.builtin.func(function(){j.processing.printProjection()}),j.radians=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.radians(a.v))}),j.randomSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.randomSeed(a.v))}),j.random=new Sk.builtin.func(function(a,b){return\"undefined\"==typeof a?new Sk.builtin.float_(j.processing.random()):\"undefined\"==typeof b?new Sk.builtin.float_(j.processing.random(a.v)):new Sk.builtin.float_(j.processing.random(a.v,b.v))}),j.requestImage=new Sk.builtin.func(function(a,b){var c=Sk.misceval.callsimArray(j.PImage);return c.v=\"undefined\"==typeof b?j.processing.requestImage(a.v):j.processing.requestImage(a.v,b.v),c}),j.saturation=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.saturation(a.v))}),j.save=new Sk.builtin.func(function(a){j.processing.save(a.v)}),j.saveFrame=new Sk.builtin.func(function(a){\"undefined\"==typeof a?j.processing.saveFrame():j.processing.saveFrame(a.v)}),j.saveStrings=new Sk.builtin.func(function(a,b){j.processing.saveStrings(a.v,b.v)}),j.screenX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenX(a.v,b.v,c.v))}),j.screenY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenY(a.v,b.v,c.v))}),j.screenZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenZ(a.v,b.v,c.v))}),j.second=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.second())}),j.shape=new Sk.builtin.func(function(a,b,c,d,e){\"undefined\"==typeof b?j.processing.shape(a.v):\"undefined\"==typeof c?j.processing.shape(a.v,b.v):\"undefined\"==typeof d?j.processing.shape(a.v,b.v,c.v):\"undefined\"==typeof e?j.processing.shape(a.v,b.v,c.v,d.v):j.processing.shape(a.v,b.v,c.v,d.v,e.v)}),j.shapeMode=new Sk.builtin.func(function(a){j.processing.shapeMode(a.v)}),j.shininess=new Sk.builtin.func(function(a){j.processing.shininess(a.v)}),j.specular=new Sk.builtin.func(function(a,b,c){\"undefined\"==typeof b?j.processing.specular(a.v):\"undefined\"==typeof c?j.processing.specular(a.v,b.v):j.processing.specular(a.v,b.v,c.v)}),j.spotLight=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.spotLight(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.sq=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.sq(a))}),j.status=new Sk.builtin.func(function(a){j.processing.status(a.v)}),j.textAlign=new Sk.builtin.func(function(a,b){\"undefined\"==typeof b?j.processing.textAlign(a.v):j.processing.textAlign(a.v,b.v)}),j.textAscent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textAscent())}),j.textDescent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textDescent())}),j.textFont=new Sk.builtin.func(function(a,b){\"undefined\"==typeof b?j.processing.textFont(a.v):j.processing.textFont(a.v,b.v)}),j.textLeading=new Sk.builtin.func(function(a){j.processing.textLeading(a.v)}),j.textMode=new Sk.builtin.func(function(a){j.processing.textMode(a.v)}),j.textSize=new Sk.builtin.func(function(a){j.processing.textSize(a.v)}),j.texture=new Sk.builtin.func(function(a){j.processing.texture(a.v)}),j.textureMode=new Sk.builtin.func(function(a){j.processing.textureMode(a.v)}),j.textWidth=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.textWidth(a.v))}),j.tint=new Sk.builtin.func(function(a,b,c,d){\"undefined\"==typeof b?j.processing.tint(a.v):\"undefined\"==typeof c?j.processing.tint(a.v,b.v):\"undefined\"==typeof d?j.processing.tint(a.v,b.v,c.v):j.processing.tint(a.v,b.v,c.v,d.v)}),j.updatePixels=new Sk.builtin.func(function(){j.processing.updatePixels()}),j.vertex=new Sk.builtin.func(function(a,b,c,d,e){\"undefined\"==typeof c?j.processing.vertex(a.v,b.v):\"undefined\"==typeof d?j.processing.vertex(a.v,b.v,c.v):\"undefined\"==typeof e?j.processing.vertex(a.v,b.v,c.v,d.v):j.processing.vertex(a.v,b.v,c.v,d.v,e.v)}),j.year=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.year())}),j.box=new Sk.builtin.func(function(a){j.processing.box(a.v)}),j.sphere=new Sk.builtin.func(function(a){j.processing.sphere(a.v)}),j.sphereDetail=new Sk.builtin.func(function(a,b){\"undefined\"==typeof b?j.processing.sphereDetail(a.v):j.processing.sphereDetail(a.v,b.v)}),j.background=new Sk.builtin.func(function(a,c,d){\"undefined\"!=typeof c&&(c=c.v),\"undefined\"!=typeof d&&(d=d.v),j.processing.background(a.v,c,d)}),j.fill=new Sk.builtin.func(function(a,c,d,e){\"undefined\"!=typeof c&&(c=c.v),\"undefined\"!=typeof d&&(d=d.v),\"undefined\"!=typeof e&&(e=e.v),j.processing.fill(a.v,c,d,e)}),j.stroke=new Sk.builtin.func(function(a,c,d,e){\"undefined\"!=typeof c&&(c=c.v),\"undefined\"!=typeof d&&(d=d.v),\"undefined\"!=typeof e&&(e=e.v),j.processing.stroke(a.v,c,d,e)}),j.noStroke=new Sk.builtin.func(function(){j.processing.noStroke()}),j.colorMode=new Sk.builtin.func(function(a,b,c,d,e){b=\"undefined\"==typeof b?255:b.v,\"undefined\"!=typeof c&&(c=c.v),\"undefined\"!=typeof d&&(d=d.v),\"undefined\"!=typeof e&&(e=e.v),j.processing.colorMode(a.v,b,c,d,e)}),j.noFill=new Sk.builtin.func(function(){j.processing.noFill()}),j.loop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception(\"loop() should be called after run()\");l=!0,j.processing.loop()}),j.noLoop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception(\"noLoop() should be called after run()\");l=!1,j.processing.noLoop()}),j.frameRate=new Sk.builtin.func(function(a){j.processing.frameRate(a.v)}),j.width=new Sk.builtin.int_(0),j.height=new Sk.builtin.int_(0),j.renderMode=j.P2D,j.size=new Sk.builtin.func(function(a,b,c){\"undefined\"==typeof c&&(c=j.P2D),j.processing.size(a.v,b.v,c.v),j.width=new Sk.builtin.int_(j.processing.width),j.height=new Sk.builtin.int_(j.processing.height),j.renderMode=c}),j.exitp=new Sk.builtin.func(function(){j.processing.exit()}),j.mouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseX)}),j.mouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseY)}),j.pmouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseX)}),j.pmouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseY)}),j.rectMode=new Sk.builtin.func(function(a){j.processing.rectMode(a.v)}),j.strokeWeight=new Sk.builtin.func(function(a){j.processing.strokeWeight(a.v)}),j.smooth=new Sk.builtin.func(function(){j.processing.smooth()}),j.noSmooth=new Sk.builtin.func(function(){j.processing.noSmooth()}),j.ellipseMode=new Sk.builtin.func(function(a){j.processing.ellipseMode(a.v)}),j.strokeCap=new Sk.builtin.func(function(a){j.processing.strokeCap(a.v)}),j.strokeJoin=new Sk.builtin.func(function(a){j.processing.strokeJoin(a.v)}),j.rotate=new Sk.builtin.func(function(a){j.processing.rotate(a.v)}),j.rotateX=new Sk.builtin.func(function(a){j.processing.rotateX(a.v)}),j.rotateY=new Sk.builtin.func(function(a){j.processing.rotateY(a.v)}),j.rotateZ=new Sk.builtin.func(function(a){j.processing.rotateZ(a.v)}),j.scale=new Sk.builtin.func(function(a,b,c){b=\"undefined\"==typeof b?1:b.v,c=\"undefined\"==typeof c?1:c.v,j.processing.scale(a.v,b,c)}),j.translate=new Sk.builtin.func(function(a,b,c){b=\"undefined\"==typeof b?1:b.v,c=\"undefined\"==typeof c?1:c.v,j.processing.translate(a.v,b,c)}),j.popMatrix=new Sk.builtin.func(function(){j.processing.popMatrix()}),j.pushMatrix=new Sk.builtin.func(function(){j.processing.pushMatrix()}),j.applyMatrix=new Sk.builtin.func(function(){var a,b=Array.prototype.slice.call(arguments,0,16);for(a=0;a 0):\n self.percDown(i)\n i = i - 1\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapArray[i][0] > self.heapArray[mc][0]:\n tmp = self.heapArray[i]\n self.heapArray[i] = self.heapArray[mc]\n self.heapArray[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i*2 > self.currentSize:\n return -1\n else:\n if i*2 + 1 > self.currentSize:\n return i*2\n else:\n if self.heapArray[i*2][0] < self.heapArray[i*2+1][0]:\n return i*2\n else:\n return i*2+1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapArray[i][0] < self.heapArray[i//2][0]:\n tmp = self.heapArray[i//2]\n self.heapArray[i//2] = self.heapArray[i]\n self.heapArray[i] = tmp\n i = i//2\n \n def add(self,k):\n self.heapArray.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapArray[1][1]\n self.heapArray[1] = self.heapArray[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapArray.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if self.currentSize == 0:\n return True\n else:\n return False\n\n def decreaseKey(self,val,amt):\n # this is a little wierd, but we need to find the heap thing to decrease by\n # looking at its value\n done = False\n i = 1\n myKey = 0\n while not done and i <= self.currentSize:\n if self.heapArray[i][1] == val:\n done = True\n myKey = i\n else:\n i = i + 1\n if myKey > 0:\n self.heapArray[myKey] = (amt,self.heapArray[myKey][1])\n self.percUp(myKey)\n \n def __contains__(self,vtx):\n for pair in self.heapArray:\n if pair[1] == vtx:\n return True\n return False\n \nclass TestBinHeap(unittest.TestCase):\n def setUp(self):\n self.theHeap = PriorityQueue()\n self.theHeap.add((2,'x'))\n self.theHeap.add((3,'y'))\n self.theHeap.add((5,'z'))\n self.theHeap.add((6,'a'))\n self.theHeap.add((4,'d'))\n\n\n def testInsert(self):\n assert self.theHeap.currentSize == 5\n\n def testDelmin(self):\n assert self.theHeap.delMin() == 'x'\n assert self.theHeap.delMin() == 'y'\n \n def testDecKey(self):\n self.theHeap.decreaseKey('d',1)\n assert self.theHeap.delMin() == 'd'\n \nif __name__ == '__main__':\n unittest.main()\n","src/lib/pythonds/trees/__init__.py":"\n# from .binaryTree import BinaryTree\n# from .balance import AVLTree\n# from .bst import BinarySearchTree\n# from .binheap import BinHeap\n\n\n","src/lib/pythonds/trees/balance.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nfrom .bst import BinarySearchTree, TreeNode\n\nclass AVLTree(BinarySearchTree):\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n has_key(k)\n items() \n keys() \n values()\n put(k,v)\n '''\n\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.leftChild)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.rightChild) \n\n def updateBalance(self,node):\n if node.balanceFactor > 1 or node.balanceFactor < -1:\n self.rebalance(node)\n return\n if node.parent != None:\n if node.isLeftChild():\n node.parent.balanceFactor += 1\n elif node.isRightChild():\n node.parent.balanceFactor -= 1\n\n if node.parent.balanceFactor != 0:\n self.updateBalance(node.parent)\n\n def rebalance(self,node):\n if node.balanceFactor < 0:\n if node.rightChild.balanceFactor > 0:\n # Do an LR Rotation\n self.rotateRight(node.rightChild)\n self.rotateLeft(node)\n else:\n # single left\n self.rotateLeft(node)\n elif node.balanceFactor > 0:\n if node.leftChild.balanceFactor < 0:\n # Do an RL Rotation\n self.rotateLeft(node.leftChild)\n self.rotateRight(node)\n else:\n # single right\n self.rotateRight(node)\n\n def rotateLeft(self,rotRoot):\n newRoot = rotRoot.rightChild\n rotRoot.rightChild = newRoot.leftChild\n if newRoot.leftChild != None:\n newRoot.leftChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isLeftChild():\n rotRoot.parent.leftChild = newRoot\n else:\n rotRoot.parent.rightChild = newRoot\n newRoot.leftChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor + 1 - min(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor + 1 + max(rotRoot.balanceFactor, 0)\n\n\n def rotateRight(self,rotRoot):\n newRoot = rotRoot.leftChild\n rotRoot.leftChild = newRoot.rightChild\n if newRoot.rightChild != None:\n newRoot.rightChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isRightChild():\n rotRoot.parent.rightChild = newRoot\n else:\n rotRoot.parent.leftChild = newRoot\n newRoot.rightChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor - 1 - max(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor - 1 + min(rotRoot.balanceFactor, 0)\n \n","src/lib/pythonds/trees/binaryTree.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\nclass BinaryTree:\n \"\"\"\n A recursive implementation of Binary Tree\n Using links and Nodes approach.\n \"\"\" \n def __init__(self,rootObj):\n self.key = rootObj\n self.leftChild = None\n self.rightChild = None\n\n def insertLeft(self,newNode):\n if self.leftChild == None:\n self.leftChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.left = self.leftChild\n self.leftChild = t\n \n def insertRight(self,newNode):\n if self.rightChild == None:\n self.rightChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.right = self.rightChild\n self.rightChild = t\n\n def isLeaf(self):\n return ((not self.leftChild) and (not self.rightChild))\n\n def getRightChild(self):\n return self.rightChild\n\n def getLeftChild(self):\n return self.leftChild\n\n def setRootVal(self,obj):\n self.key = obj\n\n def getRootVal(self,):\n return self.key\n\n def inorder(self):\n if self.leftChild:\n self.leftChild.inorder()\n print(self.key)\n if self.rightChild:\n self.rightChild.inorder()\n\n def postorder(self):\n if self.leftChild:\n self.leftChild.postorder()\n if self.rightChild:\n self.rightChild.postorder()\n print(self.key)\n\n\n def preorder(self):\n print(self.key)\n if self.leftChild:\n self.leftChild.preorder()\n if self.rightChild:\n self.rightChild.preorder()\n\n def printexp(self):\n if self.leftChild:\n print('(')\n self.leftChild.printexp()\n print(self.key)\n if self.rightChild:\n self.rightChild.printexp()\n print(')')\n\n def postordereval(self):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if self.leftChild:\n res1 = self.leftChild.postordereval() #// \\label{peleft}\n if self.rightChild:\n res2 = self.rightChild.postordereval() #// \\label{peright}\n if res1 and res2:\n return opers[self.key](res1,res2) #// \\label{peeval}\n else:\n return self.key\n\ndef inorder(tree):\n if tree != None:\n inorder(tree.getLeftChild())\n print(tree.getRootVal())\n inorder(tree.getRightChild())\n\ndef printexp(tree):\n if tree.leftChild:\n print('(')\n printexp(tree.getLeftChild())\n print(tree.getRootVal())\n if tree.rightChild:\n printexp(tree.getRightChild())\n print(')') \n\ndef printexp(tree):\n sVal = \"\"\n if tree:\n sVal = '(' + printexp(tree.getLeftChild())\n sVal = sVal + str(tree.getRootVal())\n sVal = sVal + printexp(tree.getRightChild()) + ')'\n return sVal\n\ndef postordereval(tree):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if tree:\n res1 = postordereval(tree.getLeftChild()) #// \\label{peleft}\n res2 = postordereval(tree.getRightChild()) #// \\label{peright}\n if res1 and res2:\n return opers[tree.getRootVal()](res1,res2) #// \\label{peeval}\n else:\n return tree.getRootVal()\n\ndef height(tree):\n if tree == None:\n return -1\n else:\n return 1 + max(height(tree.leftChild),height(tree.rightChild))\n\n# t = BinaryTree(7)\n# t.insertLeft(3)\n# t.insertRight(9)\n# inorder(t)\n# import operator\n# x = BinaryTree('*')\n# x.insertLeft('+')\n# l = x.getLeftChild()\n# l.insertLeft(4)\n# l.insertRight(5)\n# x.insertRight(7)\n# print(printexp(x))\n# print(postordereval(x))\n# print(height(x))\n","src/lib/pythonds/trees/binheap.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\n# this heap takes key value pairs, we will assume that the keys are integers\nclass BinHeap:\n def __init__(self):\n self.heapList = [0]\n self.currentSize = 0\n\n\n def buildHeap(self,alist):\n i = len(alist) // 2\n self.currentSize = len(alist)\n self.heapList = [0] + alist[:]\n print(len(self.heapList), i)\n while (i > 0):\n print(self.heapList, i)\n self.percDown(i)\n i = i - 1\n print(self.heapList,i)\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapList[i] > self.heapList[mc]:\n tmp = self.heapList[i]\n self.heapList[i] = self.heapList[mc]\n self.heapList[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i * 2 + 1 > self.currentSize:\n return i * 2\n else:\n if self.heapList[i * 2] < self.heapList[i * 2 + 1]:\n return i * 2\n else:\n return i * 2 + 1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapList[i] < self.heapList[i//2]:\n tmp = self.heapList[i // 2]\n self.heapList[i // 2] = self.heapList[i]\n self.heapList[i] = tmp\n i = i // 2\n \n def insert(self,k):\n self.heapList.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapList[1]\n self.heapList[1] = self.heapList[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapList.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if currentSize == 0:\n return True\n else:\n return False\n","src/lib/pythonds/trees/bst.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nclass BinarySearchTree:\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n items() \n keys() \n values()\n put(k,v)\n in\n del <==> \n '''\n\n def __init__(self):\n self.root = None\n self.size = 0\n \n def put(self,key,val):\n if self.root:\n self._put(key,val,self.root)\n else:\n self.root = TreeNode(key,val)\n self.size = self.size + 1\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n \n def __setitem__(self,k,v):\n self.put(k,v)\n\n def get(self,key):\n if self.root:\n res = self._get(key,self.root)\n if res:\n return res.payload\n else:\n return None\n else:\n return None\n \n def _get(self,key,currentNode):\n if not currentNode:\n return None\n elif currentNode.key == key:\n return currentNode\n elif key < currentNode.key:\n return self._get(key,currentNode.leftChild)\n else:\n return self._get(key,currentNode.rightChild)\n \n \n def __getitem__(self,key):\n res = self.get(key)\n if res:\n return res\n else:\n raise KeyError('Error, key not in tree')\n \n\n def __contains__(self,key):\n if self._get(key,self.root):\n return True\n else:\n return False\n \n def length(self):\n return self.size\n\n def __len__(self):\n return self.size\n\n def __iter__(self):\n return self.root.__iter__()\n \n def delete(self,key):\n if self.size > 1:\n nodeToRemove = self._get(key,self.root)\n if nodeToRemove:\n self.remove(nodeToRemove)\n self.size = self.size-1\n else:\n raise KeyError('Error, key not in tree')\n elif self.size == 1 and self.root.key == key:\n self.root = None\n self.size = self.size - 1\n else:\n raise KeyError('Error, key not in tree')\n\n def __delitem__(self,key):\n self.delete(key)\n \n def remove(self,currentNode):\n if currentNode.isLeaf(): #leaf\n if currentNode == currentNode.parent.leftChild:\n currentNode.parent.leftChild = None\n else:\n currentNode.parent.rightChild = None\n elif currentNode.hasBothChildren(): #interior\n succ = currentNode.findSuccessor()\n succ.spliceOut()\n currentNode.key = succ.key\n currentNode.payload = succ.payload\n else: # this node has one child\n if currentNode.hasLeftChild():\n if currentNode.isLeftChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.leftChild\n elif currentNode.isRightChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.leftChild\n else:\n currentNode.replaceNodeData(currentNode.leftChild.key,\n currentNode.leftChild.payload,\n currentNode.leftChild.leftChild,\n currentNode.leftChild.rightChild)\n else:\n if currentNode.isLeftChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.rightChild\n elif currentNode.isRightChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.rightChild\n else:\n currentNode.replaceNodeData(currentNode.rightChild.key,\n currentNode.rightChild.payload,\n currentNode.rightChild.leftChild,\n currentNode.rightChild.rightChild)\n\n def inorder(self):\n self._inorder(self.root)\n\n def _inorder(self,tree):\n if tree != None:\n self._inorder(tree.leftChild)\n print(tree.key)\n self._inorder(tree.rightChild)\n\n def postorder(self):\n self._postorder(self.root)\n\n def _postorder(self, tree):\n if tree:\n self._postorder(tree.rightChild)\n self._postorder(tree.leftChild)\n print(tree.key) \n\n def preorder(self):\n self._preorder(self,self.root)\n\n def _preorder(self,tree):\n if tree:\n print(tree.key) \n self._preorder(tree.leftChild)\n self._preorder(tree.rightChild)\n\n \nclass TreeNode:\n def __init__(self,key,val,left=None,right=None,parent=None):\n self.key = key\n self.payload = val\n self.leftChild = left\n self.rightChild = right\n self.parent = parent\n self.balanceFactor = 0\n \n def hasLeftChild(self):\n return self.leftChild\n\n def hasRightChild(self):\n return self.rightChild\n \n def isLeftChild(self):\n return self.parent and self.parent.leftChild == self\n\n def isRightChild(self):\n return self.parent and self.parent.rightChild == self\n\n def isRoot(self):\n return not self.parent\n\n def isLeaf(self):\n return not (self.rightChild or self.leftChild)\n\n def hasAnyChildren(self):\n return self.rightChild or self.leftChild\n\n def hasBothChildren(self):\n return self.rightChild and self.leftChild\n \n def replaceNodeData(self,key,value,lc,rc):\n self.key = key\n self.payload = value\n self.leftChild = lc\n self.rightChild = rc\n if self.hasLeftChild():\n self.leftChild.parent = self\n if self.hasRightChild():\n self.rightChild.parent = self\n \n def findSuccessor(self):\n succ = None\n if self.hasRightChild():\n succ = self.rightChild.findMin()\n else:\n if self.parent:\n if self.isLeftChild():\n succ = self.parent\n else:\n self.parent.rightChild = None\n succ = self.parent.findSuccessor()\n self.parent.rightChild = self\n return succ\n\n\n def spliceOut(self):\n if self.isLeaf():\n if self.isLeftChild():\n self.parent.leftChild = None\n else:\n self.parent.rightChild = None\n elif self.hasAnyChildren():\n if self.hasLeftChild():\n if self.isLeftChild():\n self.parent.leftChild = self.leftChild\n else:\n self.parent.rightChild = self.leftChild\n self.leftChild.parent = self.parent\n else:\n if self.isLeftChild():\n self.parent.leftChild = self.rightChild\n else:\n self.parent.rightChild = self.rightChild\n self.rightChild.parent = self.parent\n\n def findMin(self):\n current = self\n while current.hasLeftChild():\n current = current.leftChild\n return current\n\n def __iter__(self):\n \"\"\"The standard inorder traversal of a binary tree.\"\"\"\n if self:\n if self.hasLeftChild():\n for elem in self.leftChild:\n yield elem\n yield self.key\n if self.hasRightChild():\n for elem in self.rightChild:\n yield elem\n\n \n","src/lib/quopri.py":"raise NotImplementedError(\"quopri is not yet implemented in Skulpt\")\n","src/lib/random.js":"var MersenneTwister=function(a){a==null&&(a=new Date().getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=Array(this.N),this.mti=this.N+1,this.init_genrand(a)};MersenneTwister.prototype.init_genrand=function(a){for(this.mt[0]=a>>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(1812433253*((4294901760&a)>>>16)<<16)+1812433253*(65535&a)+this.mti,this.mt[this.mti]>>>=0}},MersenneTwister.prototype.init_by_array=function(a,b){var d,e,f;for(this.init_genrand(19650218),d=1,e=0,f=this.N>b?this.N:b;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1664525*((4294901760&g)>>>16)<<16)+1664525*(65535&g))+a[e]+e,this.mt[d]>>>=0,d++,e++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1),e>=b&&(e=0)}for(f=this.N-1;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1566083941*((4294901760&g)>>>16)<<16)+1566083941*(65535&g))-d,this.mt[d]>>>=0,d++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1)}this.mt[0]=2147483648},MersenneTwister.prototype.genrand_int32=function(){var a,b=[0,this.MATRIX_A];if(this.mti>=this.N){var d;for(this.mti==this.N+1&&this.init_genrand(5489),d=0;d>>1^b[1&a];for(;d>>1^b[1&a];a=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^a>>>1^b[1&a],this.mti=0}return a=this.mt[this.mti++],a^=a>>>11,a^=2636928640&a<<7,a^=4022730752&a<<15,a^=a>>>18,a>>>0},MersenneTwister.prototype.genrand_int31=function(){return this.genrand_int32()>>>1},MersenneTwister.prototype.genrand_real1=function(){return this.genrand_int32()*(1/4294967295)},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)},MersenneTwister.prototype.genrand_real3=function(){return(this.genrand_int32()+.5)*(1/4294967296)},MersenneTwister.prototype.genrand_res53=function(){var d=this.genrand_int32()>>>5,a=this.genrand_int32()>>>6;return(67108864*d+a)*(1/9007199254740992)};var $builtinmodule=function(){var a=Math.log,b=Math.sqrt,d={},e=new MersenneTwister,f=void 0;d.seed=new Sk.builtin.func(function(a){return Sk.builtin.pyCheckArgsLen(\"seed\",arguments.length,0,1),a=Sk.builtin.asnum$(a),e=0d)h=g((f+d+1)/d);else throw new Sk.builtin.ValueError(\"zero step for randrange()\");if(0>=h)throw new Sk.builtin.ValueError(\"empty range for randrange()\");return i=a+d*g(e.genrand_res53()*h),new Sk.builtin.int_(i)};d.randint=new Sk.builtin.func(function(d,e){return Sk.builtin.pyCheckArgsLen(\"randint\",arguments.length,2,2),d=Sk.builtin.asnum$(d),e=Sk.builtin.asnum$(e),h(d,e+1)}),d.randrange=new Sk.builtin.func(function(a,b,d){return Sk.builtin.pyCheckArgsLen(\"randrange\",arguments.length,1,3),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(d),h(a,b,d)}),d.uniform=new Sk.builtin.func(function(d,f){Sk.builtin.pyCheckArgsLen(\"uniform\",arguments.length,2,2),d=Sk.builtin.asnum$(d),f=Sk.builtin.asnum$(f);var g=e.genrand_res53();return c=d+g*(f-d),new Sk.builtin.float_(c)}),d.triangular=new Sk.builtin.func(function(a,d,f){Sk.builtin.pyCheckArgsLen(\"triangular\",arguments.length,2,3),Sk.builtin.pyCheckType(\"low\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"high\",\"number\",Sk.builtin.checkNumber(d));var g,h,i;return a=Sk.builtin.asnum$(a),d=Sk.builtin.asnum$(d),a>d&&(i=a,a=d,d=i),void 0===f||f===Sk.builtin.none.none$?f=(d-a)/2:(Sk.builtin.pyCheckType(\"mode\",\"number\",Sk.builtin.checkNumber(f)),f=Sk.builtin.asnum$(f)),g=e.genrand_res53(),h=g<(f-a)/(d-a)?a+b(g*(d-a)*(f-a)):d-b((1-g)*(d-a)*(d-f)),new Sk.builtin.float_(h)});var i=function(d,g){var k,l,m,n,o,h=Math.sin,i=Math.cos,j=Math.PI;return void 0===f?(k=e.genrand_res53(),l=e.genrand_res53(),m=b(-2*a(k)),n=2*j*l,o=m*i(n),f=m*h(n)):(o=f,f=void 0),d+g*o};return d.gauss=new Sk.builtin.func(function(a,b){return Sk.builtin.pyCheckArgsLen(\"gauss\",arguments.length,2,2),Sk.builtin.pyCheckType(\"mu\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"sigma\",\"number\",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(i(a,b))}),d.normalvariate=d.gauss,d.lognormvariate=new Sk.builtin.func(function(a,b){var d=Math.exp;return Sk.builtin.pyCheckArgsLen(\"lognormvariate\",arguments.length,2,2),Sk.builtin.pyCheckType(\"mu\",\"number\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\"sigma\",\"number\",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(d(i(a,b)))}),d.expovariate=new Sk.builtin.func(function(b){Sk.builtin.pyCheckArgsLen(\"expovariate\",arguments.length,1,1),Sk.builtin.pyCheckType(\"lambd\",\"number\",Sk.builtin.checkNumber(b)),b=Sk.builtin.asnum$(b);var d=e.genrand_res53();return new Sk.builtin.float_(-a(d)/b)}),d.choice=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen(\"choice\",arguments.length,1,1),Sk.builtin.pyCheckType(\"seq\",\"sequence\",Sk.builtin.checkSequence(a)),void 0!==a.sq$length){var b=new Sk.builtin.int_(g(e.genrand_res53()*a.sq$length()));return a.mp$subscript(b)}throw new Sk.builtin.TypeError(\"object has no length\")}),d.shuffle=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen(\"shuffle\",arguments.length,1,1),Sk.builtin.pyCheckType(\"x\",\"sequence\",Sk.builtin.checkSequence(a)),a.constructor===Sk.builtin.list){const h=a.v;for(var b=h.length-1;0=c)););return j.push(new Sk.builtin.str(f.substring(l))),new Sk.builtin.list(j)},_split.co_varnames=[\"pattern\",\"string\",\"maxsplit\",\"flags\"],_split.$defaults=[new Sk.builtin.int_(0),new Sk.builtin.int_(0)],mod.split=new Sk.builtin.func(_split),_findall=function(a,b,c){var d,e,f,g,h,j;if(Sk.builtin.pyCheckArgsLen(\"findall\",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"pattern must be a string\");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"string must be a string\");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError(\"flags must be a number\");if(d=Sk.ffi.unwrapo(a),e=Sk.ffi.unwrapo(b),d=convert(d),f=getFlags(c),g=new RegExp(d,f),d.match(/\\$/)){var k=new RegExp(/\\n$/);e.match(k)&&(e=e.slice(0,-1))}for(h=[],j;null!=(j=g.exec(e));){if(2>j.length)h.push(new Sk.builtin.str(j[0]));else if(2==j.length)h.push(new Sk.builtin.str(j[1]));else{for(var l=[],m=1;m=a.thematch.v.length)throw new Sk.builtin.IndexError(\"Index out of range: \"+b);return a.thematch.v[b]})},mod.MatchObject=Sk.misceval.buildClass(mod,matchobj,\"MatchObject\",[]),mod._findre=function(res,string){res=res.replace(/([^\\\\]){,(?![^\\[]*\\])/g,\"$1{0,\");var matches,sitem,retval,re=eval(res),patt=/\\n$/,str=Sk.ffi.remapToJs(string);if(matches=str.match(patt)?str.slice(0,-1).match(re):str.match(re),retval=new Sk.builtin.list,null==matches)return retval;for(var i=0;ilst.v.length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_search.co_varnames=[\"pattern\",\"string\",\"flags\"],_search.$defaults=[new Sk.builtin.int_(0)],mod.search=new Sk.builtin.func(_search),_match=function(a,b,c){var d,e;if(Sk.builtin.pyCheckArgsLen(\"match\",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"pattern must be a string\");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"string must be a string\");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError(\"flags must be a number\");return(pat=Sk.ffi.remapToJs(a),e=\"/^\"+pat.replace(/\\//g,\"\\\\/\")+\"/\",lst=mod._findre(e,b),1>Sk.ffi.remapToJs(lst).length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_match.co_varnames=[\"pattern\",\"string\",\"flags\"],_match.$defaults=[new Sk.builtin.int_(0)],mod.match=new Sk.builtin.func(_match),regexobj=function(a,b){var c,d,e,f,g,h;b.__init__=new Sk.builtin.func(function(a,b,c){return a.re=b,a.flags=void 0===c?0:c,Sk.builtin.none.none$}),h=new Sk.builtin.func(function(a){var b=\"re.compile('\"+Sk.ffi.remapToJs(a.re)+\"')\";return Sk.ffi.remapToPy(b.substring(0,212))}),b.__str__=h,b.__repr__=h,c=function(a,b,c){var d=Sk.ffi.remapToJs(a),e=null==b?0:Sk.ffi.remapToJs(b),f=null==c?d.length:Sk.ffi.remapToJs(c);return\"^\"==e&&(e=d.indexOf(\"\\n\")+1),null===f&&(f=d.length),Sk.ffi.remapToPy(d.substring(e,f))},d=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\"search\",arguments.length,2,4);var f=c(b,d,e);return _search(a.re,f,a.flags)},d.co_varnames=[\"self\",\"string\",\"pos\",\"endpos\"],d.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.search=new Sk.builtin.func(d),e=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\"match\",arguments.length,2,4);var f=c(b,d,e);return _match(a.re,f,a.flags)},e.co_varnames=[\"self\",\"string\",\"pos\",\"endpos\"],e.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.match=new Sk.builtin.func(e),f=function(a,b,c){if(Sk.builtin.pyCheckArgsLen(\"split\",arguments.length,2,3),void 0===c&&(c=0),!Sk.builtin.checkInt(c))throw new Sk.builtin.TypeError(\"maxsplit must be an integer\");return _split(a.re,b,c,a.flags)},f.co_varnames=[\"self\",\"string\",\"maxsplit\"],f.$defaults=[new Sk.builtin.int_(0)],b.split=new Sk.builtin.func(f),g=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\"findall\",arguments.length,2,4);var f=c(b,d,e);return _findall(a.re,f,a.flags)},g.co_varnames=[\"self\",\"string\",\"pos\",\"endpos\"],g.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.findall=new Sk.builtin.func(g)},mod.RegexObject=Sk.misceval.buildClass(mod,regexobj,\"RegexObject\",[]),mod.compile=new Sk.builtin.func(function(a,b){var c;if(Sk.builtin.pyCheckArgsLen(\"compile\",arguments.length,1,2),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"pattern must be a string\");if(void 0===b&&(b=0),!Sk.builtin.checkNumber(b))throw new Sk.builtin.TypeError(\"flags must be a number\");return c=Sk.misceval.callsimArray(mod.RegexObject,[a,b]),c}),mod.purge=new Sk.builtin.func(function(){}),mod};","src/lib/repr.py":"raise NotImplementedError(\"repr is not yet implemented in Skulpt\")\n","src/lib/rexec.py":"raise NotImplementedError(\"rexec is not yet implemented in Skulpt\")\n","src/lib/rfc822.py":"raise NotImplementedError(\"rfc822 is not yet implemented in Skulpt\")\n","src/lib/rlcompleter.py":"raise NotImplementedError(\"rlcompleter is not yet implemented in Skulpt\")\n","src/lib/robotparser.py":"raise NotImplementedError(\"robotparser is not yet implemented in Skulpt\")\n","src/lib/runpy.py":"raise NotImplementedError(\"runpy is not yet implemented in Skulpt\")\n","src/lib/sched.py":"raise NotImplementedError(\"sched is not yet implemented in Skulpt\")\n","src/lib/sets.py":"raise NotImplementedError(\"sets is not yet implemented in Skulpt\")\n","src/lib/sgmllib.py":"raise NotImplementedError(\"sgmllib is not yet implemented in Skulpt\")\n","src/lib/sha.py":"raise NotImplementedError(\"sha is not yet implemented in Skulpt\")\n","src/lib/shelve.py":"raise NotImplementedError(\"shelve is not yet implemented in Skulpt\")\n","src/lib/shlex.py":"raise NotImplementedError(\"shlex is not yet implemented in Skulpt\")\n","src/lib/shutil.py":"raise NotImplementedError(\"shutil is not yet implemented in Skulpt\")\n","src/lib/signal.js":"var $builtinmodule=function(){var a={SIG_DFL:new Sk.builtin.int_(0),SIG_IGN:new Sk.builtin.int_(1),CTRL_C_EVENT:new Sk.builtin.int_(0),CTRL_BREAK_EVENT:new Sk.builtin.int_(0),NSIG:new Sk.builtin.int_(23),SIGHUP:new Sk.builtin.int_(1),SIGNINT:new Sk.builtin.int_(2),SIGILL:new Sk.builtin.int_(4),SIGFPE:new Sk.builtin.int_(8),SIGKILL:new Sk.builtin.int_(9),SIGSEGV:new Sk.builtin.int_(11),SIGTERM:new Sk.builtin.int_(15),SIGBREAK:new Sk.builtin.int_(21),SIGABRT:new Sk.builtin.int_(22),pause:new Sk.builtin.func(function(){Sk.builtin.pyCheckArgsLen(\"pause\",arguments.length,0,0);var a=new Sk.misceval.Suspension;return a.resume=function(){return Sk.builtin.none.none$},a.data={type:\"Sk.promise\",promise:new Promise(function(a){if(null!=Sk.signals&&Sk.signals.addEventListener){function handleSignal(){Sk.signals.removeEventListener(handleSignal),a()}Sk.signals.addEventListener(handleSignal)}else console.warn(\"signal.pause() not supported\"),Sk.misceval.print_(\"signal.pause() not supported\"),a()})},a}),signal:new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError(\"signal.signal is not supported.\")})};return a};","src/lib/site.py":"raise NotImplementedError(\"site is not yet implemented in Skulpt\")\n","src/lib/smtpd.py":"raise NotImplementedError(\"smtpd is not yet implemented in Skulpt\")\n","src/lib/smtplib.py":"raise NotImplementedError(\"smtplib is not yet implemented in Skulpt\")\n","src/lib/sndhdr.py":"raise NotImplementedError(\"sndhdr is not yet implemented in Skulpt\")\n","src/lib/socket.py":"raise NotImplementedError(\"socket is not yet implemented in Skulpt\")\n","src/lib/sqlite3/__init__.py":"raise NotImplementedError(\"sqlite3 is not yet implemented in Skulpt\")\n","src/lib/sre.py":"raise NotImplementedError(\"sre is not yet implemented in Skulpt\")\n","src/lib/sre_compile.py":"raise NotImplementedError(\"sre_compile is not yet implemented in Skulpt\")\n","src/lib/sre_constants.py":"raise NotImplementedError(\"sre_constants is not yet implemented in Skulpt\")\n","src/lib/sre_parse.py":"raise NotImplementedError(\"sre_parse is not yet implemented in Skulpt\")\n","src/lib/ssl.py":"raise NotImplementedError(\"ssl is not yet implemented in Skulpt\")\n","src/lib/stat.py":"raise NotImplementedError(\"stat is not yet implemented in Skulpt\")\n","src/lib/statvfs.py":"raise NotImplementedError(\"statvfs is not yet implemented in Skulpt\")\n","src/lib/string.js":"var $builtinmodule=function(){var a={};return a.ascii_lowercase=new Sk.builtin.str(\"abcdefghijklmnopqrstuvwxyz\"),a.ascii_uppercase=new Sk.builtin.str(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"),a.ascii_letters=new Sk.builtin.str(a.ascii_lowercase.v+a.ascii_uppercase.v),a.lowercase=new Sk.builtin.str(\"abcdefghijklmnopqrstuvwxyz\"),a.uppercase=new Sk.builtin.str(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"),a.letters=new Sk.builtin.str(a.lowercase.v+a.uppercase.v),a.digits=new Sk.builtin.str(\"0123456789\"),a.hexdigits=new Sk.builtin.str(\"0123456789abcdefABCDEF\"),a.octdigits=new Sk.builtin.str(\"01234567\"),a.punctuation=new Sk.builtin.str(\"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\"),a.whitespace=new Sk.builtin.str(\"\\t\\n\\x0B\\f\\r \"),a.printable=new Sk.builtin.str(a.digits.v+a.letters.v+a.punctuation.v+\" \\t\\n\\r\\x0B\\f\"),a.split=new Sk.builtin.func(function(...a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.split,a)}),a.capitalize=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.capitalize,[a])}),a.join=new Sk.builtin.func(function(a,b){return void 0===b&&(b=new Sk.builtin.str(\" \")),Sk.misceval.callsimArray(Sk.builtin.str.prototype.join,[b,a])}),a.capwords=new Sk.builtin.func(function(b,c){if(Sk.builtin.pyCheckArgsLen(\"capwords\",arguments.length,1,2),!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"s must be a string\");if(void 0===c&&(c=new Sk.builtin.str(\" \")),!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"sep must be a string\");for(var d=Sk.misceval.callsimArray(a.split,[b,c]).v,e=[],f=0;f\n\nimport re, string\n\n__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten']\n\n# Hardcode the recognized whitespace characters to the US-ASCII\n# whitespace characters. The main reason for doing this is that\n# some Unicode spaces (like \\u00a0) are non-breaking whitespaces.\n_whitespace = '\\t\\n\\x0b\\x0c\\r '\n\nclass TextWrapper:\n \"\"\"\n Object for wrapping/filling text. The public interface consists of\n the wrap() and fill() methods; the other methods are just there for\n subclasses to override in order to tweak the default behaviour.\n If you want to completely replace the main wrapping algorithm,\n you'll probably have to override _wrap_chunks().\n Several instance attributes control various aspects of wrapping:\n width (default: 70)\n the maximum width of wrapped lines (unless break_long_words\n is false)\n initial_indent (default: \"\")\n string that will be prepended to the first line of wrapped\n output. Counts towards the line's width.\n subsequent_indent (default: \"\")\n string that will be prepended to all lines save the first\n of wrapped output; also counts towards each line's width.\n expand_tabs (default: true)\n Expand tabs in input text to spaces before further processing.\n Each tab will become 0 .. 'tabsize' spaces, depending on its position\n in its line. If false, each tab is treated as a single character.\n tabsize (default: 8)\n Expand tabs in input text to 0 .. 'tabsize' spaces, unless\n 'expand_tabs' is false.\n replace_whitespace (default: true)\n Replace all whitespace characters in the input text by spaces\n after tab expansion. Note that if expand_tabs is false and\n replace_whitespace is true, every tab will be converted to a\n single space!\n fix_sentence_endings (default: false)\n Ensure that sentence-ending punctuation is always followed\n by two spaces. Off by default because the algorithm is\n (unavoidably) imperfect.\n break_long_words (default: true)\n Break words longer than 'width'. If false, those words will not\n be broken, and some lines might be longer than 'width'.\n break_on_hyphens (default: true)\n Allow breaking hyphenated words. If true, wrapping will occur\n preferably on whitespaces and right after hyphens part of\n compound words.\n drop_whitespace (default: true)\n Drop leading and trailing whitespace from lines.\n max_lines (default: None)\n Truncate wrapped lines.\n placeholder (default: ' [...]')\n Append to the last line of truncated text.\n \"\"\"\n\n unicode_whitespace_trans = {}\n # uspace = ord(' ')\n uspace = ' '\n for x in _whitespace:\n # unicode_whitespace_trans[ord(x)] = uspace\n unicode_whitespace_trans[x] = uspace\n\n # This funky little regex is just the trick for splitting\n # text up into word-wrappable chunks. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!\n # (after stripping out empty strings).\n wordsep_re = re.compile(\n r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W]))') # hyphenated words\n em_dash = re.compile(r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W])|' # hyphenated words\n r'(?!^)-{2,}(?=\\w))') # em-dash\n\n \n # This less funky little regex just split on recognized spaces. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/\n wordsep_simple_re = re.compile(r'(\\s+)')\n\n\n # XXX this is not locale- or charset-aware -- string.lowercase\n # is US-ASCII only (and therefore English-only)\n sentence_end_re = re.compile(r'[a-z]' # lowercase letter\n r'[\\.\\!\\?]' # sentence-ending punct.\n r'[\\\"\\']?' # optional end-of-quote\n r'\\Z') # end of chunk\n sentence_end_re = r'[a-z][\\.\\!\\?][\\\"\\']?'\n\n def __init__(self,\n width=70,\n initial_indent=\"\",\n subsequent_indent=\"\",\n expand_tabs=True,\n replace_whitespace=True,\n fix_sentence_endings=False,\n break_long_words=True,\n drop_whitespace=True,\n break_on_hyphens=True,\n tabsize=8,\n max_lines=None,\n placeholder=' [...]'):\n self.width = width\n self.initial_indent = initial_indent\n self.subsequent_indent = subsequent_indent\n self.expand_tabs = expand_tabs\n self.replace_whitespace = replace_whitespace\n self.fix_sentence_endings = fix_sentence_endings\n self.break_long_words = break_long_words\n self.drop_whitespace = drop_whitespace\n self.break_on_hyphens = break_on_hyphens\n self.tabsize = tabsize\n self.max_lines = max_lines\n self.placeholder = placeholder\n\n\n # -- Private methods -----------------------------------------------\n # (possibly useful for subclasses to override)\n\n def _munge_whitespace(self, text):\n \"\"\"_munge_whitespace(text : string) -> string\n Munge whitespace in text: expand tabs and convert all other\n whitespace characters to spaces. Eg. \" foo\\\\tbar\\\\n\\\\nbaz\"\n becomes \" foo bar baz\".\n \"\"\"\n if self.expand_tabs:\n text = text.expandtabs(self.tabsize)\n if self.replace_whitespace:\n for key, val in self.unicode_whitespace_trans.items():\n text = text.replace(key, val)\n return text\n\n\n def _split(self, text):\n \"\"\"_split(text : string) -> [string]\n Split the text to wrap into indivisible chunks. Chunks are\n not quite the same as words; see _wrap_chunks() for full\n details. As an example, the text\n Look, goof-ball -- use the -b option!\n breaks into the following chunks:\n 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', 'option!'\n if break_on_hyphens is True, or in:\n 'Look,', ' ', 'goof-ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', option!'\n otherwise.\n \"\"\"\n if self.break_on_hyphens is True:\n chunks = self.wordsep_re.split(text)\n if \"--\" in text:\n chunks = [item \n for sublist in [self.em_dash.split(chunk) for chunk in chunks] \n for item in sublist]\n else:\n chunks = self.wordsep_simple_re.split(text)\n chunks = [c for c in chunks if c]\n return chunks\n\n def _fix_sentence_endings(self, chunks):\n \"\"\"_fix_sentence_endings(chunks : [string])\n Correct for sentence endings buried in 'chunks'. Eg. when the\n original text contains \"... foo.\\\\nBar ...\", munge_whitespace()\n and split() will convert that to [..., \"foo.\", \" \", \"Bar\", ...]\n which has one too few spaces; this method simply changes the one\n space to two.\n \"\"\"\n i = 0\n # patsearch = self.sentence_end_re.search\n while i < len(chunks)-1:\n if chunks[i+1] == \" \" and re.search(self.sentence_end_re, chunks[i]) and chunks[i][-1] in \".!?\\\"\\'\":\n chunks[i+1] = \" \"\n i += 2\n else:\n i += 1\n\n def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):\n \"\"\"_handle_long_word(chunks : [string],\n cur_line : [string],\n cur_len : int, width : int)\n Handle a chunk of text (most likely a word, not whitespace) that\n is too long to fit in any line.\n \"\"\"\n # Figure out when indent is larger than the specified width, and make\n # sure at least one character is stripped off on every pass\n if width < 1:\n space_left = 1\n else:\n space_left = width - cur_len\n\n # If we're allowed to break long words, then do so: put as much\n # of the next chunk onto the current line as will fit.\n if self.break_long_words:\n cur_line.append(reversed_chunks[-1][:space_left])\n reversed_chunks[-1] = reversed_chunks[-1][space_left:]\n\n # Otherwise, we have to preserve the long word intact. Only add\n # it to the current line if there's nothing already there --\n # that minimizes how much we violate the width constraint.\n elif not cur_line:\n cur_line.append(reversed_chunks.pop())\n\n # If we're not allowed to break long words, and there's already\n # text on the current line, do nothing. Next time through the\n # main loop of _wrap_chunks(), we'll wind up here again, but\n # cur_len will be zero, so the next line will be entirely\n # devoted to the long word that we can't handle right now.\n\n def _wrap_chunks(self, chunks):\n \"\"\"_wrap_chunks(chunks : [string]) -> [string]\n Wrap a sequence of text chunks and return a list of lines of\n length 'self.width' or less. (If 'break_long_words' is false,\n some lines may be longer than this.) Chunks correspond roughly\n to words and the whitespace between them: each chunk is\n indivisible (modulo 'break_long_words'), but a line break can\n come between any two chunks. Chunks should not have internal\n whitespace; ie. a chunk is either all whitespace or a \"word\".\n Whitespace chunks will be removed from the beginning and end of\n lines, but apart from that whitespace is preserved.\n \"\"\"\n lines = []\n if self.width <= 0:\n raise ValueError(\"invalid width %r (must be > 0)\" % self.width)\n if self.max_lines is not None:\n if self.max_lines > 1:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n if len(indent) + len(self.placeholder.lstrip()) > self.width:\n raise ValueError(\"placeholder too large for max width\")\n\n # Arrange in reverse order so items can be efficiently popped\n # from a stack of chucks.\n chunks.reverse()\n\n while chunks:\n\n # Start the list of chunks that will make up the current line.\n # cur_len is just the length of all the chunks in cur_line.\n cur_line = []\n cur_len = 0\n\n # Figure out which static string will prefix this line.\n if lines:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n\n # Maximum width for this line.\n width = self.width - len(indent)\n\n # First chunk on line is whitespace -- drop it, unless this\n # is the very beginning of the text (ie. no lines started yet).\n if self.drop_whitespace and chunks[-1].strip() == '' and lines:\n del chunks[-1]\n\n while chunks:\n l = len(chunks[-1])\n\n # Can at least squeeze this chunk onto the current line.\n if cur_len + l <= width:\n cur_line.append(chunks.pop())\n cur_len += l\n\n # Nope, this line is full.\n else:\n break\n\n # The current line is full, and the next chunk is too big to\n # fit on *any* line (not just this one).\n if chunks and len(chunks[-1]) > width:\n self._handle_long_word(chunks, cur_line, cur_len, width)\n cur_len = sum(map(len, cur_line))\n\n # If the last chunk on this line is all whitespace, drop it.\n if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n\n if cur_line:\n if (self.max_lines is None or\n len(lines) + 1 < self.max_lines or\n (not chunks or\n self.drop_whitespace and\n len(chunks) == 1 and\n not chunks[0].strip()) and cur_len <= width):\n # Convert current line back to a string and store it in\n # list of all lines (return value).\n lines.append(indent + ''.join(cur_line))\n else:\n while cur_line:\n if (cur_line[-1].strip() and\n cur_len + len(self.placeholder) <= width):\n cur_line.append(self.placeholder)\n lines.append(indent + ''.join(cur_line))\n break\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n else:\n if lines:\n prev_line = lines[-1].rstrip()\n if (len(prev_line) + len(self.placeholder) <=\n self.width):\n lines[-1] = prev_line + self.placeholder\n break\n lines.append(indent + self.placeholder.lstrip())\n break\n\n return lines\n\n def _split_chunks(self, text):\n text = self._munge_whitespace(text)\n return self._split(text)\n\n # -- Public interface ----------------------------------------------\n\n def wrap(self, text):\n \"\"\"wrap(text : string) -> [string]\n Reformat the single paragraph in 'text' so it fits in lines of\n no more than 'self.width' columns, and return a list of wrapped\n lines. Tabs in 'text' are expanded with string.expandtabs(),\n and all other whitespace characters (including newline) are\n converted to space.\n \"\"\"\n chunks = self._split_chunks(text)\n if self.fix_sentence_endings:\n self._fix_sentence_endings(chunks)\n return self._wrap_chunks(chunks)\n\n def fill(self, text):\n \"\"\"fill(text : string) -> string\n Reformat the single paragraph in 'text' to fit in lines of no\n more than 'self.width' columns, and return a new string\n containing the entire wrapped paragraph.\n \"\"\"\n return \"\\n\".join(self.wrap(text))\n\n\n# -- Convenience interface ---------------------------------------------\n\ndef wrap(text, width=70, **kwargs):\n \"\"\"Wrap a single paragraph of text, returning a list of wrapped lines.\n Reformat the single paragraph in 'text' so it fits in lines of no\n more than 'width' columns, and return a list of wrapped lines. By\n default, tabs in 'text' are expanded with string.expandtabs(), and\n all other whitespace characters (including newline) are converted to\n space. See TextWrapper class for available keyword args to customize\n wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.wrap(text)\n\ndef fill(text, width=70, **kwargs):\n \"\"\"Fill a single paragraph of text, returning a new string.\n Reformat the single paragraph in 'text' to fit in lines of no more\n than 'width' columns, and return a new string containing the entire\n wrapped paragraph. As with wrap(), tabs are expanded and other\n whitespace characters converted to space. See TextWrapper class for\n available keyword args to customize wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.fill(text)\n\ndef shorten(text, width, **kwargs):\n \"\"\"Collapse and truncate the given text to fit in the given width.\n The text first has its whitespace collapsed. If it then fits in\n the *width*, it is returned as is. Otherwise, as many words\n as possible are joined and then the placeholder is appended::\n >>> textwrap.shorten(\"Hello world!\", width=12)\n 'Hello world!'\n >>> textwrap.shorten(\"Hello world!\", width=11)\n 'Hello [...]'\n \"\"\"\n w = TextWrapper(width=width, max_lines=1, **kwargs)\n return w.fill(' '.join(text.strip().split()))\n\n\n# -- Loosely related functionality -------------------------------------\n\n# _whitespace_only_re = re.compile('^[ \\t]+$', re.MULTILINE)\n# _leading_whitespace_re = re.compile('(^[ \\t]*)(?:[^ \\t\\n])', re.MULTILINE)\n\ndef dedent(text):\n \"\"\"Remove any common leading whitespace from every line in `text`.\n This can be used to make triple-quoted strings line up with the left\n edge of the display, while still presenting them in the source code\n in indented form.\n Note that tabs and spaces are both treated as whitespace, but they\n are not equal: the lines \" hello\" and \"\\\\thello\" are\n considered to have no common leading whitespace.\n Entirely blank lines are normalized to a newline character.\n \"\"\"\n # Look for the longest leading string of spaces and tabs common to\n # all lines.\n margin = None\n\n indents = re.findall(r'(^[ \\t]*)(?:[^ \\t\\n])',text, re.MULTILINE)\n for indent in indents:\n if margin is None:\n margin = indent\n\n # Current line more deeply indented than previous winner:\n # no change (previous winner is still on top).\n elif indent.startswith(margin):\n pass\n\n # Current line consistent with and no deeper than previous winner:\n # it's the new winner.\n elif margin.startswith(indent):\n margin = indent\n\n # Find the largest common whitespace between current line and previous\n # winner.\n else:\n for i, (x, y) in enumerate(zip(margin, indent)):\n if x != y:\n margin = margin[:i]\n break\n # sanity check (testing/debugging only)\n if 0 and margin:\n for line in text.split(\"\\n\"):\n assert not line or line.startswith(margin), \\\n \"line = %r, margin = %r\" % (line, margin)\n\n if margin:\n lines = [line[len(margin):] \n if line.strip()\n else line.strip() \n for line in text.split(\"\\n\")]\n text = \"\\n\".join(lines)\n return text\n\n\ndef indent(text, prefix, predicate=None):\n \"\"\"Adds 'prefix' to the beginning of selected lines in 'text'.\n If 'predicate' is provided, 'prefix' will only be added to the lines\n where 'predicate(line)' is True. If 'predicate' is not provided,\n it will default to adding 'prefix' to all non-empty lines that do not\n consist solely of whitespace characters.\n \"\"\"\n if predicate is None:\n def predicate(line):\n return line.strip()\n\n def prefixed_lines():\n for line in text.splitlines(True):\n yield (prefix + line if predicate(line) else line)\n return ''.join(prefixed_lines())\n\n\nif __name__ == \"__main__\":\n #print dedent(\"\\tfoo\\n\\tbar\")\n #print dedent(\" \\thello there\\n \\t how are you?\")\n print(dedent(\"Hello there.\\n This is indented.\"))","src/lib/this.py":"raise NotImplementedError(\"this is not yet implemented in Skulpt\")\n","src/lib/threading.py":"raise NotImplementedError(\"threading is not yet implemented in Skulpt\")\n","src/lib/time.js":"var $builtinmodule=function(){function check_struct_time(a){if(!(a instanceof b))throw new Sk.builtin.TypeError(\"Required argument 'struct_time' must be of type: 'struct_time'\");var c,d=a.v.length,e=a.v;for(c=0;c\",function jsReadline(){const b=Sk.misceval.callsimArray(a);return Sk.ffi.remapToJs(b)},\"UTF-8\",function receiveToken(a){b.push(new Sk.builtin.tuple([Sk.ffi.remapToPy(a.type),Sk.ffi.remapToPy(a.string),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.start[0]),Sk.ffi.remapToPy(a.start[1])]),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.end[0]),Sk.ffi.remapToPy(a.end[1])]),Sk.ffi.remapToPy(a.line)]))}),new Sk.builtin.list(b)})};return a};","src/lib/trace.py":"raise NotImplementedError(\"trace is not yet implemented in Skulpt\")\n","src/lib/traceback.py":"raise NotImplementedError(\"traceback is not yet implemented in Skulpt\")\n","src/lib/tty.py":"raise NotImplementedError(\"tty is not yet implemented in Skulpt\")\n","src/lib/turtle.js":"var $builtinmodule=function(){\"use strict\";var e=function getConfiguredTarget(){var e,t;for(e=Sk.TurtleGraphics&&Sk.TurtleGraphics.target||\"turtle\",t=\"string\"==typeof e?document.getElementById(e):e;t.firstChild;)t.removeChild(t.firstChild);return t}();return e.turtleInstance?e.turtleInstance.reset():e.turtleInstance=function generateTurtleModule(e){var t=Math.round,r=Math.max,n=Math.sqrt,a=Math.min,s=Math.abs,o=Math.PI,d=Math.atan2,_=Math.sin,c=Math.cos;function getAsset(e){var t=g.assets,r=\"function\"==typeof t?t(e):t[e];return\"string\"==typeof r?new Promise(function(t,n){var a=new Image;a.onload=function(){g.assets[e]=this,t(a)},a.onerror=function(){n(new Error(\"Missing asset: \"+r))},a.src=r}):new InstantPromise(void 0,r)}function InstantPromise(e,t){this.lastResult=t,this.lastError=e}function FrameManager(){this.reset()}function getFrameManager(){return A||(A=new FrameManager),A}function MouseHandler(){var t=this;for(var r in this._target=getTarget(),this._managers={},this._handlers={mousedown:function(r){t.onEvent(\"mousedown\",r)},mouseup:function(r){t.onEvent(\"mouseup\",r)},mousemove:function(r){t.onEvent(\"mousemove\",r)}},this._handlers)this._target.addEventListener(r,this._handlers[r])}function EventManager(e,t){this._type=e,this._target=t,this._handlers=void 0,getMouseHandler().addManager(e,this)}function Turtle(e){if(getFrameManager().addTurtle(this),this._screen=getScreen(),this._managers={},this._shape=e.v,!v.hasOwnProperty(this._shape))throw new Sk.builtin.ValueError(\"Shape:'\"+this._shape+\"' not in default shape, please check shape again!\");this.reset()}function Screen(){var e,t;this._frames=1,this._delay=void 0,this._bgcolor=\"none\",this._mode=\"standard\",this._managers={},this._keyLogger={},e=(g.worldWidth||g.width||getWidth())/2,t=(g.worldHeight||g.height||getHeight())/2,this.setUpWorld(-e,-t,e,t)}function ensureAnonymous(){return f||(f=Sk.misceval.callsimArray(y.Turtle)),f.instance}function getTarget(){return e}function getScreen(){return p||(p=new Screen),p}function getMouseHandler(){return h||(h=new MouseHandler),h}function getWidth(){return 0|(p&&p._width||g.width||getTarget().clientWidth||T.width)}function getHeight(){return 0|(p&&p._height||g.height||getTarget().clientHeight||T.height)}function createLayer(e,t){var r,n=document.createElement(\"canvas\"),a=getWidth(),s=getHeight(),l=getTarget().firstChild?-s+\"px\":\"0\";return n.width=a,n.height=s,n.style.position=\"relative\",n.style.display=\"block\",n.style.setProperty(\"margin-top\",l),n.style.setProperty(\"z-index\",e),t&&(n.style.display=\"none\"),getTarget().appendChild(n),r=n.getContext(\"2d\"),r.lineCap=\"round\",r.lineJoin=\"round\",applyWorld(getScreen(),r),r}function cancelAnimationFrame(){u&&((window.cancelAnimationFrame||window.mozCancelAnimationFrame)(u),u=void 0),m&&(window.clearTimeout(m),m=void 0)}function applyWorld(e,t){var r=e.llx,n=e.lly,a=e.urx,s=e.ury,l=e.xScale,i=e.yScale;t&&(clearLayer(t),t.restore(),t.save(),t.scale(1/l,1/i),t.translate(-r,-s))}function pushUndo(e){var t,r,n;if(g.allowUndo&&e._bufferSize){for(e._undoBuffer||(e._undoBuffer=[]);e._undoBuffer.length>e._bufferSize;)e._undoBuffer.shift();for(r={},t=[\"x\",\"y\",\"angle\",\"radians\",\"color\",\"fill\",\"down\",\"filling\",\"shown\",\"shape\",\"size\"],n=0;no;o++)if(\"number\"==typeof t[o])t[o]=r(0,a(255,parseInt(t[o])));else throw new Sk.builtin.ValueError(\"bad color sequence\");}else for(o=0;3>o;o++)if(\"number\"!=typeof t[o])throw new Sk.builtin.ValueError(\"bad color sequence\");else if(1>=t[o])t[o]=r(0,a(255,parseInt(255*t[o])));else throw new Sk.builtin.ValueError(\"bad color sequence\");\"number\"==typeof t[o]?(t[3]=r(0,a(1,t[o])),t=\"rgba(\"+t.join(\",\")+\")\"):t=\"rgb(\"+t.slice(0,3).join(\",\")+\")\"}else if(\"string\"==typeof t&&!t.match(/\\s*url\\s*\\(/i))t=t.replace(/\\s+/g,\"\");else return\"black\";return t}function calculateHeading(e,t,r){var n=e._angle||0,a=e._radians||0;return r||(r={}),\"number\"==typeof t&&(e._isRadians?n=a=t%Turtle.RADIANS:e._fullCircle?(n=t%e._fullCircle,a=n/e._fullCircle*Turtle.RADIANS):n=a=0,0>n&&(n+=e._fullCircle,a+=Turtle.RADIANS)),r.angle=n,r.radians=a,r}function pythonToJavascriptFunction(e,t){return function(){var r=Array.prototype.slice.call(arguments),n=r.map(function(e){return Sk.ffi.remapToPy(e)});return\"undefined\"!=typeof t&&n.unshift(t),Sk.misceval.applyAsync(void 0,e,void 0,void 0,void 0,n).catch(Sk.uncaughtException)}}function addModuleMethod(e,t,r,n){var a,s=r.replace(/^\\$/,\"\"),l=s.replace(/_\\$[a-z]+\\$$/i,\"\"),o=e.prototype[r].length,d=e.prototype[r].minArgs,_=e.prototype[r].co_varnames||[],c=e.prototype[r].returnType,u=e.prototype[r].isSk;void 0===d&&(d=o),a=function(){var e,t,a,s,_,m=Array.prototype.slice.call(arguments,0),p=n?n():m.shift().instance;if(m.lengtho)throw _=d===o?\"exactly \"+o:\"between \"+d+\" and \"+o,new Sk.builtin.TypeError(l+\"() takes \"+_+\" positional argument(s) (\"+m.length+\" given)\");for(e=m.length;0<=--e;)void 0!==m[e]&&(m[e]=m[e]instanceof Sk.builtin.func?pythonToJavascriptFunction(m[e]):m[e]instanceof Sk.builtin.method?pythonToJavascriptFunction(m[e].im_func,m[e].im_self):m[e]&&m[e].$d instanceof Sk.builtin.dict&&m[e].instance?m[e].instance:Sk.ffi.remapToJs(m[e]));var g=m.slice(0);for(m=[],e=g.length;0<=e;--e)null!==g[e]&&(m[e]=g[e]);try{t=p[r].apply(p,m)}catch(t){throw window&&window.console&&(window.console.log(\"wrapped method failed\"),window.console.log(t.stack)),t}return t instanceof InstantPromise&&(t=t.lastResult),t instanceof Promise?(t=t.catch(function(t){throw window&&window.console&&(window.console.log(\"promise failed\"),window.console.log(t.stack)),t}),a=new Sk.misceval.Suspension,a.resume=function(){return void 0===s?Sk.builtin.none.none$:Sk.ffi.remapToPy(s)},a.data={type:\"Sk.promise\",promise:t.then(function(e){return s=e,e})},a):void 0===t?Sk.builtin.none.none$:u?t:\"function\"==typeof c?c(t):Sk.ffi.remapToPy(t)},a.co_name=new Sk.builtin.str(l),a.co_varnames=_.slice(),a.$defaults=[];for(var m=d;m<_.length;m++)a.$defaults.push(Sk.builtin.none.none$);n||a.co_varnames.unshift(\"self\"),t[s]=new Sk.builtin.func(a)}function initTurtle(e,t){Sk.builtin.pyCheckArgs(\"__init__\",arguments,2,3,!1,!1),e.instance=new Turtle(t),e.instance.skInstance=e}function focusTurtle(e){return void 0!==e&&(w=!!e,w?getTarget().focus():getTarget().blur()),w}function resetTurtle(){for(cancelAnimationFrame(),getScreen().reset(),getFrameManager().reset();e.firstChild;)e.removeChild(e.firstChild);h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}function stopTurtle(){cancelAnimationFrame(),h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}var u,m,p,g,f,h,y={__name__:new Sk.builtin.str(\"turtle\")},$=0,w=!0,b=1e3/30,v={},k=0,x={},T={target:\"turtle\",width:400,height:400,worldWidth:0,worldHeight:0,animate:!0,bufferSize:0,allowUndo:!0,assets:{}};e.hasAttribute(\"tabindex\")||e.setAttribute(\"tabindex\",0),x.FLOAT=function(e){return new Sk.builtin.float_(e)},x.COLOR=function(e){if(\"string\"==typeof e)return new Sk.builtin.str(e);for(var t=0;3>t;t++)e[t]=Sk.builtin.assk$(e[t]);return 4===e.length&&(e[3]=new Sk.builtin.float_(e[3])),new Sk.builtin.tuple(e)},x.TURTLE_LIST=function(e){for(var t=[],r=0;rt&&(t+=this._fullCircle),this.rotate(e,t-e)},e.getManager=function(e){return this._managers[e]||(this._managers[e]=new EventManager(e,this)),this._managers[e]},e.getPaper=function(){return this._paper||(this._paper=createLayer(2))},e.reset=function(){for(var e in this._x=0,this._y=0,this._radians=0,this._angle=0,this._shown=!0,this._down=!0,this._color=\"black\",this._fill=\"black\",this._size=1,this._filling=!1,this._undoBuffer=[],this._speed=3,this._computed_speed=5,this._colorMode=1,this._state=void 0,this._managers)this._managers[e].reset();this._isRadians=!1,this._fullCircle=360,this._bufferSize=\"number\"==typeof g.bufferSize?g.bufferSize:0,removeLayer(this._paper),this._paper=void 0},e.$degrees=function(e){return e=\"number\"==typeof e?s(e):360,this._isRadians=!1,this._angle=e&&this._fullCircle?this._angle/this._fullCircle*e:this._radians=0,this._fullCircle=e,this.addUpdate(void 0,!1,{angle:this._angle,radians:this._radians})},e.$degrees.minArgs=0,e.$degrees.co_varnames=[\"fullcircle\"],e.$degrees.returnType=x.FLOAT,e.$radians=function(){return this._isRadians||(this._isRadians=!0,this._angle=this._radians,this._fullCircle=Turtle.RADIANS),this._angle},e.$radians.returnType=x.FLOAT,e.$position=e.$pos=function(){return[this.$xcor(),this.$ycor()]},e.$position.returnType=function(e){return new Sk.builtin.tuple([new Sk.builtin.float_(e[0]),new Sk.builtin.float_(e[1])])},e.$towards=function(e,t){var r=getCoordinates(e,t),n=o+d(this._y-r.y,this._x-r.x),a=n*(this._fullCircle/Turtle.RADIANS);return a},e.$towards.co_varnames=[\"x\",\"y\"],e.$towards.minArgs=1,e.$towards.returnType=x.FLOAT,e.$distance=function(e,t){var r=getCoordinates(e,t),a=r.x-this._x,s=r.y-this._y;return n(a*a+s*s)},e.$distance.co_varnames=[\"x\",\"y\"],e.$distance.minArgs=1,e.$distance.returnType=x.FLOAT,e.$heading=function(){return 1e-13>s(this._angle)?0:this._angle},e.$heading.returnType=x.FLOAT,e.$xcor=function(){return 1e-13>s(this._x)?0:this._x},e.$xcor.returnType=x.FLOAT,e.$ycor=function(){return 1e-13>s(this._y)?0:this._y},e.$ycor.returnType=x.FLOAT,e.$forward=e.$fd=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,e)},e.$forward.co_varnames=e.$fd.co_varnames=[\"distance\"],e.$undo=function(){popUndo(this)},e.$undobufferentries=function(){return this._undoBuffer.length},e.$setundobuffer=function(e){this._bufferSize=\"number\"==typeof e?a(s(e),1e3):0},e.$setundobuffer.co_varnames=[\"size\"],e.$backward=e.$back=e.$bk=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,-e)},e.$backward.co_varnames=e.$back.co_varnames=e.$bk.co_varnames=[\"distance\"],e.$goto_$rw$=e.$setpos=e.$setposition=function(e,t){var r=getCoordinates(e,t);return pushUndo(this),this.translate(this._x,this._y,r.x-this._x,r.y-this._y,!0)},e.$goto_$rw$.co_varnames=e.$setpos.co_varnames=e.$setposition.co_varnames=[\"x\",\"y\"],e.$goto_$rw$.minArgs=e.$setpos.minArgs=e.$setposition.minArgs=1,e.$setx=function(e){return this.translate(this._x,this._y,e-this._x,0,!0)},e.$setx.co_varnames=[\"x\"],e.$sety=function(e){return this.translate(this._x,this._y,0,e-this._y,!0)},e.$sety.co_varnames=[\"y\"],e.$home=function(){var e=this,t=this._angle;return pushUndo(this),e.translate(this._x,this._y,-this._x,-this._y,!0).then(function(){return e.queueTurnTo(t,0)}).then(function(){})},e.$right=e.$rt=function(e){return pushUndo(this),this.rotate(this._angle,-e)},e.$right.co_varnames=e.$rt.co_varnames=[\"angle\"],e.$left=e.$lt=function(e){return pushUndo(this),this.rotate(this._angle,e)},e.$left.co_varnames=e.$lt.co_varnames=[\"angle\"],e.$setheading=e.$seth=function(e){return pushUndo(this),this.queueTurnTo(this._angle,e)},e.$setheading.co_varnames=e.$seth.co_varnames=[\"angle\"],e.$circle=function(e,t,r){var n,d,u,m,p,g,f,h,$,b=this,v=this._x,k=this._y,T=this._angle,A={},L=1/getScreen().lineScale,S=!0;for(pushUndo(this),void 0===t&&(t=b._fullCircle),void 0===r&&(d=s(t)/b._fullCircle,r=1+(0|a(11+s(e*L)/6,59)*d)),u=t/r,m=.5*u,p=2*e*_(u*o/b._fullCircle),0>e?(p=-p,u=-u,m=-m,n=T-t):n=T+t,$=getFrameManager().willRenderNext()?Promise.resolve():new InstantPromise,T+=m,g=0;g=e&&(e=getWidth()*e),1>=t&&(t=getHeight()*t),this._width=e,this._height=t,this._xOffset=void 0===r||isNaN(parseInt(r))?0:parseInt(r),this._yOffset=void 0===n||isNaN(parseInt(n))?0:parseInt(n),\"world\"===this._mode?this._setworldcoordinates(this.llx,this.lly,this.urx,this.ury):this._setworldcoordinates(-e/2,-t/2,e/2,t/2)},e.$setup.minArgs=0,e.$setup.co_varnames=[\"width\",\"height\",\"startx\",\"starty\"],e.$register_shape=e.$addshape=function(e,t){return t?void(v[e]=t):getAsset(e).then(function(t){v[e]=t})},e.$register_shape.minArgs=1,e.$getshapes=function(){return Object.keys(v)},e.$tracer=function(e,t){return void 0!==e||void 0!==t?(\"number\"==typeof t&&(this._delay=t,getFrameManager().refreshInterval(t)),\"number\"==typeof e?(this._frames=e,getFrameManager().frameBuffer(e)):void 0):this._frames},e.$tracer.co_varnames=[\"frames\",\"delay\"],e.$tracer.minArgs=0,e.$delay=function(e){return void 0===e?void 0===this._delay?b:this._delay:this.$tracer(void 0,e)},e.$delay.co_varnames=[\"delay\"],e._setworldcoordinates=function(e,t,r,n){var a=this,s=getFrameManager().turtles();return this.setUpWorld(e,t,r,n),this._sprites&&applyWorld(this,this._sprites),this._background&&applyWorld(this,this._background),this.$clear()},e.$setworldcoordinates=function(e,t,r,n){return this._mode=\"world\",this._setworldcoordinates(e,t,r,n)},e.$setworldcoordinates.co_varnames=[\"llx\",\"lly\",\"urx\",\"ury\"],e.minArgs=4,e.$clear=e.$clearscreen=function(){return this.reset(),this.$reset()},e.$update=function(){return getFrameManager().update()},e.$reset=e.$resetscreen=function(){var e=this,t=getFrameManager().turtles();return getFrameManager().addFrame(function(){applyWorld(e,e._sprites),applyWorld(e,e._background);for(var r=0;r 1:\n print('Running %s' % self.cleanName(func))\n try:\n self.setUp()\n self.assertPassed = 0\n self.assertFailed = 0\n func()\n self.tearDown()\n if self.assertFailed == 0:\n self.numPassed += 1\n else:\n self.numFailed += 1\n print('Tests failed in %s ' % self.cleanName(func))\n except Exception as e:\n self.assertFailed += 1\n self.numFailed += 1\n print('Test threw exception in %s (%s)' % (self.cleanName(func), e))\n self.showSummary()\n\n def assertEqual(self, actual, expected, feedback=\"\"):\n res = actual==expected\n if not res and feedback == \"\":\n feedback = \"Expected %s to equal %s\" % (str(actual),str(expected))\n self.appendResult(res, actual ,expected, feedback)\n\n def assertNotEqual(self, actual, expected, feedback=\"\"):\n res = actual != expected\n if not res and feedback == \"\":\n feedback = \"Expected %s to not equal %s\" % (str(actual),str(expected))\n self.appendResult(res, actual, expected, feedback)\n\n def assertTrue(self,x, feedback=\"\"):\n res = bool(x) is True\n if not res and feedback == \"\":\n feedback = \"Expected %s to be True\" % (str(x))\n self.appendResult(res, x, True, feedback)\n\n def assertFalse(self,x, feedback=\"\"):\n res = not bool(x)\n if not res and feedback == \"\":\n feedback = \"Expected %s to be False\" % (str(x))\n self.appendResult(res, x, False, feedback)\n\n def assertIs(self,a,b, feedback=\"\"):\n res = a is b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be the same object as %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNot(self,a,b, feedback=\"\"):\n res = a is not b\n if not res and feedback == \"\":\n feedback = \"Expected %s to not be the same object as %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNone(self,x, feedback=\"\"):\n res = x is None\n if not res and feedback == \"\":\n feedback = \"Expected %s to be None\" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIsNotNone(self,x, feedback=\"\"):\n res = x is not None\n if not res and feedback == \"\":\n feedback = \"Expected %s to not be None\" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIn(self, a, b, feedback=\"\"):\n res = a in b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be in %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIn(self, a, b, feedback=\"\"):\n res = a not in b\n if not res and feedback == \"\":\n feedback = \"Expected %s to not be in %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsInstance(self,a,b, feedback=\"\"):\n res = isinstance(a,b)\n if not res and feedback == \"\":\n feedback = \"Expected %s to be an instance of %s\" % (str(a), str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIsInstance(self,a,b, feedback=\"\"):\n res = not isinstance(a,b)\n if not res and feedback == \"\":\n feedback = \"Expected %s to not be an instance of %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertRegex(self, text, expected_regex, feedback=\"\"):\n \"\"\"Fail the test unless the text matches the regular expression.\"\"\"\n if isinstance(expected_regex, (str, )): #bytes\n assert expected_regex, \"expected_regex must not be empty.\"\n expected_regex = re.compile(expected_regex)\n if not expected_regex.search(text):\n res = False\n feedback = \"Regex didn't match: %r not found in %r\" % (\n repr(expected_regex), text)\n else:\n res = True\n self.appendResult(res, text, expected_regex, feedback)\n\n def assertNotRegex(self, text, unexpected_regex, feedback=\"\"):\n \"\"\"Fail the test if the text matches the regular expression.\"\"\"\n if isinstance(unexpected_regex, (str, )): # bytes\n unexpected_regex = re.compile(unexpected_regex)\n match = unexpected_regex.search(text)\n if match:\n feedback = 'Regex matched: %r matches %r in %r' % (\n text[match.start() : match.end()],\n repr(unexpected_regex),\n text)\n # _formatMessage ensures the longMessage option is respected\n self.appendResult(not bool(match), text, unexpected_regex, feedback)\n\n def assertAlmostEqual(self, a, b, places=7, feedback=\"\", delta=None):\n\n if delta is not None:\n res = abs(a-b) <= delta\n else:\n if places is None:\n places = 7\n res = round(a-b, places) == 0\n \n if not res and feedback == \"\":\n feedback = \"Expected %s to equal %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotAlmostEqual(self, a, b, places=7, feedback=\"\", delta=None):\n\n if delta is not None:\n res = not (a == b) and abs(a - b) > delta\n else:\n if places is None:\n places = 7\n\n res = round(a-b, places) != 0\n\n if not res and feedback == \"\":\n feedback = \"Expected %s to not equal %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreater(self,a,b, feedback=\"\"):\n res = a > b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be greater than %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreaterEqual(self,a,b, feedback=\"\"):\n res = a >= b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be >= %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLess(self, a, b, feedback=\"\"):\n res = a < b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be less than %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLessEqual(self,a,b, feedback=\"\"):\n res = a <= b\n if not res and feedback == \"\":\n feedback = \"Expected %s to be <= %s\" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def appendResult(self,res,actual,expected,feedback):\n if res:\n msg = 'Pass'\n self.assertPassed += 1\n else:\n msg = 'Fail: ' + feedback\n print(msg)\n self.assertFailed += 1\n\n def assertRaises(self, expected_exception, *args, **kwargs):\n context = _AssertRaisesContext(expected_exception, self)\n try:\n return context.handle(args, kwargs)\n finally:\n # bpo-23890: manually break a reference cycle\n context = None\n\n def fail(self, msg=None):\n if msg is None:\n msg = 'Fail'\n else:\n msg = 'Fail: ' + msg\n print(msg)\n self.assertFailed += 1\n\n def showSummary(self):\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\n print(\"Ran %d tests, passed: %d failed: %d\\n\" % (self.numPassed+self.numFailed,\n self.numPassed, self.numFailed))\n\n\n\ndef main(verbosity=1):\n glob = globals() # globals() still needs work\n for name in glob:\n if type(glob[name]) == type and issubclass(glob[name], TestCase):\n try:\n tc = glob[name]()\n tc.verbosity = verbosity\n tc.main()\n except:\n print(\"Uncaught Error in: \", name)\n","src/lib/unittest/gui.py":"import document\nfrom unittest import TestCase\n\nclass TestCaseGui(TestCase):\n def __init__(self):\n TestCase.__init__(self)\n self.divid = document.currentDiv()\n self.mydiv = document.getElementById(self.divid)\n res = document.getElementById(self.divid+'_unit_results')\n if res:\n self.resdiv = res\n res.innerHTML = ''\n else:\n self.resdiv = document.createElement('div')\n self.resdiv.setAttribute('id',self.divid+'_unit_results')\n self.resdiv.setAttribute('class','unittest-results')\n self.mydiv.appendChild(self.resdiv)\n\n\n def main(self):\n t = document.createElement('table')\n self.resTable = t\n self.resdiv.appendChild(self.resTable)\n\n headers = ['Result','Actual Value','Expected Value','Notes']\n row = document.createElement('tr')\n for item in headers:\n head = document.createElement('th')\n head.setAttribute('class','ac-feedback')\n head.innerHTML = item\n head.setCSS('text-align','center')\n row.appendChild(head)\n self.resTable.appendChild(row)\n\n for func in self.tlist:\n try:\n self.setUp()\n func()\n self.tearDown()\n except Exception as e:\n self.appendResult('Error', None, None, e)\n self.numFailed += 1\n self.showSummary()\n\n def appendResult(self,res,actual,expected,param):\n trimActual = False\n if len(str(actual)) > 15:\n trimActual = True\n actualType = type(actual)\n trimExpected = False\n if len(str(expected)) > 15:\n trimExpected = True\n expectedType = type(expected)\n row = document.createElement('tr')\n err = False\n if res == 'Error':\n err = True\n msg = 'Error: %s' % param\n errorData = document.createElement('td')\n errorData.setAttribute('class','ac-feedback')\n errorData.innerHTML = 'ERROR'\n errorData.setCSS('background-color','#de8e96')\n errorData.setCSS('text-align','center')\n row.appendChild(errorData)\n elif res:\n passed = document.createElement('td')\n passed.setAttribute('class','ac-feedback')\n passed.innerHTML = 'Pass'\n passed.setCSS('background-color','#83d382')\n passed.setCSS('text-align','center')\n row.appendChild(passed)\n self.numPassed += 1\n else:\n fail = document.createElement('td')\n fail.setAttribute('class','ac-feedback')\n fail.innerHTML = 'Fail'\n fail.setCSS('background-color','#de8e96')\n fail.setCSS('text-align','center')\n row.appendChild(fail)\n self.numFailed += 1\n\n\n act = document.createElement('td')\n act.setAttribute('class','ac-feedback')\n if trimActual:\n actHTML = str(actual)[:5] + \"...\" + str(actual)[-5:]\n if actualType == str:\n actHTML = repr(actHTML)\n act.innerHTML = actHTML\n else:\n act.innerHTML = repr(actual)\n act.setCSS('text-align','center')\n row.appendChild(act)\n\n expect = document.createElement('td')\n expect.setAttribute('class','ac-feedback')\n\n if trimExpected:\n expectedHTML = str(expected)[:5] + \"...\" + str(expected)[-5:]\n if expectedType == str:\n expectedHTML = repr(expectedHTML)\n expect.innerHTML = expectedHTML\n else:\n expect.innerHTML = repr(expected)\n expect.setCSS('text-align','center')\n row.appendChild(expect)\n inp = document.createElement('td')\n inp.setAttribute('class','ac-feedback')\n\n if err:\n inp.innerHTML = msg\n else:\n inp.innerHTML = param\n inp.setCSS('text-align','center')\n row.appendChild(inp)\n self.resTable.appendChild(row)\n\n\n def showSummary(self):\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\n pTag = document.createElement('p')\n pTag.innerHTML = \"You passed: \" + str(pct) + \"% of the tests\"\n self.resdiv.appendChild(pTag)\n","src/lib/urllib/__init__.js":"var $builtinmodule=function(){return{}};","src/lib/urllib/request/__init__.js":"var $builtinmodule=function(){var a={};return a.Response=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.data$=b.responseText,a.lineList=a.data$.split(\"\\n\"),a.lineList=a.lineList.slice(0,-1);for(var c=0;c\")}),b.__iter__=new Sk.builtin.func(function(a){var b=a.lineList;return Sk.builtin.makeGenerator(function(){return this.$index>=this.$lines.length?void 0:new Sk.builtin.str(this.$lines[this.$index++])},{$obj:a,$index:0,$lines:b})}),b.read=new Sk.builtin.func(function(a,b){if(a.closed)throw new Sk.builtin.ValueError(\"I/O operation on closed file\");var c=a.data$.length;void 0===b&&(b=c);var d=new Sk.builtin.str(a.data$.substr(a.pos$,b));return a.pos$+=b,a.pos$>=c&&(a.pos$=c),d}),b.readline=new Sk.builtin.func(function(a){var b=\"\";return a.currentLine
\"+a+\"
\"},d=\"This page requires a browser that supports WebGL.
Click here to upgrade your browser.\",e=function(a){for(var b=[\"webgl\",\"experimental-webgl\",\"webkit-3d\",\"moz-webgl\"],c=null,d=0;dClick here for more information.\"):c(d)}return h};return a.Context=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){var c=document.getElementById(b.v),d=f(b.v,c);if(!d)throw new Error(\"Your browser does not appear to support WebGL.\");for(var e in a.gl=d,d.__proto__)if(\"number\"==typeof d.__proto__[e])Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),d.__proto__[e]);else if(\"function\"==typeof d.__proto__[e])switch(e){case\"bufferData\":break;case\"clearColor\":break;case\"drawArrays\":break;case\"getAttribLocation\":break;case\"getUniformLocation\":break;case\"shaderSource\":break;case\"uniformMatrix4fv\":break;case\"vertexAttribPointer\":break;case\"viewport\":break;default:(function(b){Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),new Sk.builtin.func(function(){var a=d.__proto__[b];return a.apply(d,arguments)}))})(e);}d.clearColor(100/255,149/255,237/255,1),d.clear(d.COLOR_BUFFER_BIT)}),b.tp$getattr=Sk.generic.getAttr,b.bufferData=new Sk.builtin.func(function(a,b,c,d){a.gl.bufferData(b,c.v,d)}),b.clearColor=new Sk.builtin.func(function(a,b,c,d,e){a.gl.clearColor(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.getAttribLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getAttribLocation(b,c.v)}),b.getUniformLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getUniformLocation(b,c.v)}),b.shaderSource=new Sk.builtin.func(function(a,b,c){a.gl.shaderSource(b,c.v)}),b.drawArrays=new Sk.builtin.func(function(a,b,c,d){a.gl.drawArrays(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d))}),b.vertexAttribPointer=new Sk.builtin.func(function(a,b,c,d,e,f,g){a.gl.vertexAttribPointer(b,Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),e,Sk.builtin.asnum$(f),Sk.builtin.asnum$(g))}),b.viewport=new Sk.builtin.func(function(a,b,c,d,e){a.gl.viewport(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.uniformMatrix4fv=new Sk.builtin.func(function(a,b,c,d){a.gl.uniformMatrix4fv(Sk.builtin.asnum$(b),c,d.v)}),b.setDrawFunc=new Sk.builtin.func(function(a,b){var c=new Date().getTime(),d=setInterval(function(){Sk.misceval.callsimArray(b,[a,new Date().getTime()-c])},1e3/60)})},\"Context\",[]),a.Float32Array=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.v=\"number\"==typeof b?new Float32Array(b):new Float32Array(Sk.ffi.remapToJs(b))}),b.__repr__=new Sk.builtin.func(function(a){for(var b=[],c=0;ce;e++)d.elements[4*e+0]=b.elements[4*e+0]*c.elements[0]+b.elements[4*e+1]*c.elements[4]+b.elements[4*e+2]*c.elements[8]+b.elements[4*e+3]*c.elements[12],d.elements[4*e+1]=b.elements[4*e+0]*c.elements[1]+b.elements[4*e+1]*c.elements[5]+b.elements[4*e+2]*c.elements[9]+b.elements[4*e+3]*c.elements[13],d.elements[4*e+2]=b.elements[4*e+0]*c.elements[2]+b.elements[4*e+1]*c.elements[6]+b.elements[4*e+2]*c.elements[10]+b.elements[4*e+3]*c.elements[14],d.elements[4*e+3]=b.elements[4*e+0]*c.elements[3]+b.elements[4*e+1]*c.elements[7]+b.elements[4*e+2]*c.elements[11]+b.elements[4*e+3]*c.elements[15];return b.elements=d.elements,b}),c.lookAt=new Sk.builtin.func(function(b,c,e,f,g,h,i,j,k,l){var m=[c-g,e-h,f-i],n=d(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);n&&(m[0]/=n,m[1]/=n,m[2]/=n);var o=[j,k,l],p=[];p[0]=o[1]*m[2]-o[2]*m[1],p[1]=-o[0]*m[2]+o[2]*m[0],p[2]=o[0]*m[1]-o[1]*m[0],o[0]=m[1]*p[2]-m[2]*p[1],o[1]=-m[0]*p[2]+m[2]*p[0],o[2]=m[0]*p[1]-m[1]*p[0],n=d(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]),n&&(p[0]/=n,p[1]/=n,p[2]/=n),n=d(o[0]*o[0]+o[1]*o[1]+o[2]*o[2]),n&&(o[0]/=n,o[1]/=n,o[2]/=n);var q=Sk.misceval.callsimArray(a.Mat44);return q.elements[0]=p[0],q.elements[4]=p[1],q.elements[8]=p[2],q.elements[12]=0,q.elements[1]=o[0],q.elements[5]=o[1],q.elements[9]=o[2],q.elements[13]=0,q.elements[2]=m[0],q.elements[6]=m[1],q.elements[10]=m[2],q.elements[14]=0,q.elements[3]=0,q.elements[7]=0,q.elements[11]=0,q.elements[15]=1,q=q.multiply(b),b.elements=q.elements,b.translate(-c,-e,-f),b})},\"Mat44\",[]),a.Mat33=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a){Sk.misceval.callsimArray(b.loadIdentity,[a])}),b.loadIdentity=new Sk.builtin.func(function(a){a.elements=[1,0,0,0,1,0,0,0,1]})},\"Mat33\",[]),a.Vec3=Sk.misceval.buildClass(a,function(b,c){c.__init__=new Sk.builtin.func(function(a,b,c,d){a.x=b,a.y=c,a.z=d}),c.__sub__=new Sk.builtin.func(function(b,c){return Sk.misceval.callsimArray(a.Vec3,[b.x-c.x,b.y-c.y,b.z-c.z])})},\"Vec3\",[]),a.cross=new Sk.builtin.func(function(b,c){return Sk.asserts.assert(b instanceof a.Vec3&&c instanceof a.Vec3),Sk.misceval.callsimArray(a.Vec3,[b.y*c.z-b.z*c.y,b.z*c.x-b.x*c.z,b.x*c.y-b.y*c.x])}),a};","src/lib/webgl/matrix4.js":"var $builtinmodule=function(){var a=Math.PI,b={},c=new Float32Array(3),d=new Float32Array(3),e=new Float32Array(3),f=new Float32Array(4),g=new Float32Array(4),h=new Float32Array(4),i=new Float32Array(16),j=new Float32Array(16),k=new Float32Array(16),l=function(b,c){for(var a=Math.sqrt,d=0,e=c.length,f=0;fe;++e)for(var f=0;4>f;++f)c[4*e+f]=d[4*f+e];return c}),b};","src/lib/webgl/models.js":"var $builtinmodule=function(a){var c={},d=function(a,c){var d=c||gl.ARRAY_BUFFER,e=gl.createBuffer();if(this.target=d,this.buf=e,this.set(a),this.numComponents_=a.numComponents,this.numElements_=a.numElements,this.totalComponents_=this.numComponents_*this.numElements_,a.buffer instanceof Float32Array)this.type_=gl.FLOAT;else if(a.buffer instanceof Uint8Array)this.type_=gl.UNSIGNED_BYTE;else if(a.buffer instanceof Int8Array)this.type_=gl._BYTE;else if(a.buffer instanceof Uint16Array)this.type_=gl.UNSIGNED_SHORT;else if(a.buffer instanceof Int16Array)this.type_=gl.SHORT;else throw\"unhandled type:\"+typeof a.buffer};return d.prototype.set=function(a){gl.bindBuffer(this.target,this.buf),gl.bufferData(this.target,a.buffer,gl.STATIC_DRAW)},d.prototype.type=function(){return this.type_},d.prototype.numComponents=function(){return this.numComponents_},d.prototype.numElements=function(){return this.numElements_},d.prototype.totalComponents=function(){return this.totalComponents_},d.prototype.buffer=function(){return this.buf},d.prototype.stride=function(){return 0},d.prototype.offset=function(){return 0},c.Model=Sk.misceval.buildClass(c,function(c,e){e.__init__=new Sk.builtin.func(function(c,e,f,g){c.buffers={};var h=function(a,e){var f=\"indices\"==a?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;b=c.buffers[a],b?b.set(e):b=new d(e,f),c.buffers[a]=b};for(a in f)h(a,f[a]);var i={},j=0;for(var k in g)i[k]=j++;c.mode=gl.TRIANGLES,c.textures=g.v,c.textureUnits=i,c.shader=e}),e.drawPrep=new Sk.builtin.func(function(a,c){var d=a.shader,e=a.buffers,f=a.textures;for(var g in c=Sk.ffi.remapToJs(c),Sk.misceval.callsimArray(d.use,[d]),e){var h=e[g];if(\"indices\"==g)gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,h.buffer());else{var i=d.attrib[g];i&&i(h)}}for(var j in f){var k=a.textureUnits[j];d.setUniform$impl(d,textuer,k),f[j].bindToUnit(k)}for(var l in c)d.setUniform$impl(d,l,c[l])}),e.draw=new Sk.builtin.func(function(a,c,d){var e=a.shader;for(uniform in c=Sk.ffi.remapToJs(c),c)e.setUniform$impl(e,uniform,c[uniform]);if(d)for(var f in d){var g=a.textureUnits[f];e.setUniform$impl(e,f,g),d[f].bindToUnit(g)}var h=a.buffers;gl.drawElements(a.mode,h.indices.totalComponents(),gl.UNSIGNED_SHORT,0)})},\"Model\",[]),c};","src/lib/webgl/primitives.js":"var $builtinmodule=function(){var a={},b=function(a,b,c){c=c||\"Float32Array\";var d=window[c];b.length?(this.buffer=new d(b),b=this.buffer.length/a,this.cursor=b):(this.buffer=new d(a*b),this.cursor=0),this.numComponents=a,this.numElements=b,this.type=c};return b.prototype.stride=function(){return 0},b.prototype.offset=function(){return 0},b.prototype.getElement=function(a){for(var b=a*this.numComponents,c=[],d=0;do;++o){c=d[o];for(var p=0;4>p;++p){var q=g[c[p]],r=h[o],s=i[p];k.push(q),l.push(r),m.push(s)}var t=4*o;n.push([t+0,t+1,t+2]),n.push([t+0,t+2,t+3])}return{position:k,normal:l,texCoord:m,indices:n}}),a};","src/lib/whichdb.py":"raise NotImplementedError(\"whichdb is not yet implemented in Skulpt\")\n","src/lib/wsgiref/__init__.py":"raise NotImplementedError(\"wsgiref is not yet implemented in Skulpt\")\n","src/lib/xdrlib.py":"raise NotImplementedError(\"xdrlib is not yet implemented in Skulpt\")\n","src/lib/xml/__init__.py":"raise NotImplementedError(\"xml is not yet implemented in Skulpt\")\n","src/lib/xml/dom/__init__.py":"raise NotImplementedError(\"dom is not yet implemented in Skulpt\")\n","src/lib/xml/etree/__init__.py":"raise NotImplementedError(\"etree is not yet implemented in Skulpt\")\n","src/lib/xml/parsers/__init__.py":"raise NotImplementedError(\"parsers is not yet implemented in Skulpt\")\n","src/lib/xml/sax/__init__.py":"raise NotImplementedError(\"sax is not yet implemented in Skulpt\")\n","src/lib/xmllib.py":"raise NotImplementedError(\"xmllib is not yet implemented in Skulpt\")\n","src/lib/xmlrpclib.py":"raise NotImplementedError(\"xmlrpclib is not yet implemented in Skulpt\")\n","src/lib/zipfile.py":"raise NotImplementedError(\"zipfile is not yet implemented in Skulpt\")\n"}} + +/***/ }), + +/***/ "./others/skulpt/skulpt.js": +/*!*********************************!*\ + !*** ./others/skulpt/skulpt.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _skulpt_min_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./skulpt.min.js */ "./others/skulpt/skulpt.min.js"); +/* harmony import */ var _skulpt_min_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_skulpt_min_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _skulpt_stdlib_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./skulpt-stdlib.js */ "./others/skulpt/skulpt-stdlib.js"); +/* harmony import */ var _skulpt_stdlib_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_skulpt_stdlib_js__WEBPACK_IMPORTED_MODULE_1__); + + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (window.Sk); + +/***/ }), + +/***/ "./others/skulpt/skulpt.min.js": +/*!*************************************!*\ + !*** ./others/skulpt/skulpt.min.js ***! + \*************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +(function(){'use strict';var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(m,q,a){m!=Array.prototype&&m!=Object.prototype&&(m[q]=a.value)};$jscomp.getGlobal=function(m){return"undefined"!=typeof window&&window===m?m:"undefined"!=typeof __webpack_require__.g&&null!=__webpack_require__.g?__webpack_require__.g:m};$jscomp.global=$jscomp.getGlobal(this); +$jscomp.polyfill=function(m,q,a,c){if(q){a=$jscomp.global;m=m.split(".");for(c=0;ca&&(a=Math.max(a+b,0));a{Sk.abstr.setUpSlots(a);Sk.abstr.setUpMethods(a);Sk.abstr.setUpGetSets(a)});a(19);a(20);a(21);[Sk.builtin.str,Sk.builtin.none,Sk.builtin.NotImplemented,Sk.builtin.object].forEach(a=>{a=a.prototype;a.__doc__=a.hasOwnProperty("tp$doc")?new Sk.builtin.str(a.tp$doc):Sk.builtin.none.none$}); +a(22);a(23);a(24);a(25);a(26);a(27);a(28);a(29);a(31);a(32);a(33);a(34);a(35);a(36);a(37);a(38);a(39);a(40);a(41);a(42);a(43);a(44);a(45);a(46);a(47);a(48);a(49);a(50);a(51);a(52);a(53);a(54);a(55);a(56);a(57);a(58);a(59);a(60);a(61);a(62);a(63);a(64);a(65)},function(m,q,a){(function(a){var b={build:{githash:"6c99c2196851bb29f0e503afccb01804f089cb60",date:"2021-02-23T18:59:26.986Z"}};b.global="undefined"!==typeof a?a:"undefined"!==typeof self?self:"undefined"!==typeof window?window:{};b.exportSymbol= +function(a,c){a=a.split(".");var e=b.global,f;for(f=0;fd.getHours()?k.am:k.pm;break;case 82:u+=p(k.formats.R,d,k,g);break;case 83:u+=c(d.getSeconds(),C);break;case 84:u+=p(k.formats.T,d,k,g);break;case 85:u+=c(f(d,"sunday"),C);break;case 87:u+=c(f(d,"monday"),C);break;case 88:u+=p(k.formats.X,d,k,g);break;case 89:u+= +d.getFullYear();break;case 90:E&&0===B?u+="GMT":(C=d.toString().match(/\(([\w\s]+)\)/),u+=C&&C[1]||"");break;case 97:u+=k.shortDays[d.getDay()];break;case 98:u+=k.shortMonths[d.getMonth()];break;case 99:u+=p(k.formats.c,d,k,g);break;case 100:u+=c(d.getDate(),C);break;case 101:u+=c(d.getDate(),null==C?" ":C);break;case 104:u+=k.shortMonths[d.getMonth()];break;case 106:C=new Date(d.getFullYear(),0,1);C=Math.ceil((d.getTime()-C.getTime())/864E5);u+=b(C);break;case 107:u+=c(d.getHours(),null==C?" ":C); +break;case 108:u+=c(e(d.getHours()),null==C?" ":C);break;case 109:u+=c(d.getMonth()+1,C);break;case 110:u+="\n";break;case 111:C=d.getDate();u=k.ordinalSuffixes?u+(String(C)+(k.ordinalSuffixes[C-1]||l(C))):u+(String(C)+l(C));break;case 112:u+=12>d.getHours()?k.AM:k.PM;break;case 114:u+=p(k.formats.r,d,k,g);break;case 115:u+=Math.floor(g/1E3);break;case 116:u+="\t";break;case 117:C=d.getDay();u+=0===C?7:C;break;case 118:u+=p(k.formats.v,d,k,g);break;case 119:u+=d.getDay();break;case 120:u+=p(k.formats.x, +d,k,g);break;case 121:u+=(""+d.getFullYear()).slice(2);break;case 122:E&&0===B?u+=N?"+00:00":"+0000":(C=0!==B?B/6E4:-d.getTimezoneOffset(),n=N?":":"",A=Math.abs(C%60),u+=(0>C?"-":"+")+c(Math.floor(Math.abs(C/60)))+n+c(A));break;default:n&&(u+="%"),u+=a[F]}C=null;n=!1}else 37===A?n=!0:u+=a[F]}return u}var y=k||g,B=n||0,E=A||!1,F=0,w,m=function(a,b){if(b){var d=b.getTime();if(E){var c=6E4*(b.getTimezoneOffset()||0);b=new Date(d+c+B);6E4*(b.getTimezoneOffset()||0)!==c&&(b=6E4*(b.getTimezoneOffset()|| +0),b=new Date(d+b+B))}}else d=Date.now(),d>F?(F=d,w=new Date(F),d=F,E&&(w=new Date(F+6E4*(w.getTimezoneOffset()||0)+B))):d=F,b=w;return p(a,b,y,d)};m.localize=function(b){return new a(b||y,B,E)};m.localizeByIdentifier=function(a){var b=d[a];return b?m.localize(b):(h('[WARNING] No locale found with identifier "'+a+'".'),m)};m.timezone=function(b){var d=B,c=E,e=typeof b;if("number"===e||"string"===e)c=!0,"string"===e?(d="-"===b[0]?-1:1,e=parseInt(b.slice(1,3),10),b=parseInt(b.slice(3,5),10),d=d*(60* +e+b)*6E4):"number"===e&&(d=6E4*b);return new a(y,d,c)};m.utc=function(){return new a(y,B,!0)};return m}function c(a,b){if(""===b||9=a||0===b||4<=b)return"th";switch(b){case 1:return"st";case 2:return"nd";case 3:return"rd"}}function h(a){"undefined"!==typeof console&&"function"==typeof console.warn&&console.warn(a)}var d={de_DE:{days:"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),shortDays:"So Mo Di Mi Do Fr Sa".split(" "),months:"Januar Februar M\u00e4rz April Mai Juni Juli August September Oktober November Dezember".split(" "),shortMonths:"Jan Feb M\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "), +AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d.%m.%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},en_CA:{days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "), +AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},en_US:{days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "), +AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%m/%d/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},es_MX:{days:"domingo lunes martes mi\u00e9rcoles jueves viernes s\u00e1bado".split(" "),shortDays:"dom lun mar mi\u00e9 jue vie s\u00e1b".split(" "),months:"enero;febrero;marzo;abril;mayo;junio;julio;agosto;septiembre;octubre;noviembre; diciembre".split(";"),shortMonths:"ene feb mar abr may jun jul ago sep oct nov dic".split(" "),AM:"AM",PM:"PM", +am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},fr_FR:{days:"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),shortDays:"dim. lun. mar. mer. jeu. ven. sam.".split(" "),months:"janvier f\u00e9vrier mars avril mai juin juillet ao\u00fbt septembre octobre novembre d\u00e9cembre".split(" "),shortMonths:"janv. f\u00e9vr. mars avril mai juin juil. ao\u00fbt sept. oct. nov. d\u00e9c.".split(" "),AM:"AM", +PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},it_IT:{days:"domenica luned\u00ec marted\u00ec mercoled\u00ec gioved\u00ec venerd\u00ec sabato".split(" "),shortDays:"dom lun mar mer gio ven sab".split(" "),months:"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),shortMonths:"pr mag giu lug ago set ott nov dic".split(" "),AM:"AM",PM:"PM",am:"am", +pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},nl_NL:{days:"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),shortDays:"zo ma di wo do vr za".split(" "),months:"januari februari maart april mei juni juli augustus september oktober november december".split(" "),shortMonths:"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z", +D:"%d-%m-%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},pt_BR:{days:"domingo segunda ter\u00e7a quarta quinta sexta s\u00e1bado".split(" "),shortDays:"Dom Seg Ter Qua Qui Sex S\u00e1b".split(" "),months:"janeiro fevereiro mar\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),shortMonths:"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d", +R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},ru_RU:{days:"\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 \u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0412\u0442\u043e\u0440\u043d\u0438\u043a \u0421\u0440\u0435\u0434\u0430 \u0427\u0435\u0442\u0432\u0435\u0440\u0433 \u041f\u044f\u0442\u043d\u0438\u0446\u0430 \u0421\u0443\u0431\u0431\u043e\u0442\u0430".split(" "),shortDays:"\u0412\u0441 \u041f\u043d \u0412\u0442 \u0421\u0440 \u0427\u0442 \u041f\u0442 \u0421\u0431".split(" "), +months:"\u042f\u043d\u0432\u0430\u0440\u044c \u0424\u0435\u0432\u0440\u0430\u043b\u044c \u041c\u0430\u0440\u0442 \u0410\u043f\u0440\u0435\u043b\u044c \u041c\u0430\u0439 \u0418\u044e\u043d\u044c \u0418\u044e\u043b\u044c \u0410\u0432\u0433\u0443\u0441\u0442 \u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c \u041e\u043a\u0442\u044f\u0431\u0440\u044c \u041d\u043e\u044f\u0431\u0440\u044c \u0414\u0435\u043a\u0430\u0431\u0440\u044c".split(" "),shortMonths:"\u044f\u043d\u0432 \u0444\u0435\u0432 \u043c\u0430\u0440 \u0430\u043f\u0440 \u043c\u0430\u0439 \u0438\u044e\u043d \u0438\u044e\u043b \u0430\u0432\u0433 \u0441\u0435\u043d \u043e\u043a\u0442 \u043d\u043e\u044f \u0434\u0435\u043a".split(" "), +AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X",D:"%d.%m.%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},tr_TR:{days:"Pazar Pazartesi Sal\u0131 \u00c7ar\u015famba Per\u015fembe Cuma Cumartesi".split(" "),shortDays:"Paz Pzt Sal \u00c7r\u015f Pr\u015f Cum Cts".split(" "),months:"Ocak \u015eubat Mart Nisan May\u0131s Haziran Temmuz A\u011fustos Eyl\u00fcl Ekim Kas\u0131m Aral\u0131k".split(" "),shortMonths:"Oca \u015eub Mar Nis May Haz Tem A\u011fu Eyl Eki Kas Ara".split(" "), +AM:"\u00d6\u00d6",PM:"\u00d6S",am:"\u00d6\u00d6",pm:"\u00d6S",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},zh_CN:{days:"\u661f\u671f\u65e5 \u661f\u671f\u4e00 \u661f\u671f\u4e8c \u661f\u671f\u4e09 \u661f\u671f\u56db \u661f\u671f\u4e94 \u661f\u671f\u516d".split(" "),shortDays:"\u65e5\u4e00\u4e8c\u4e09\u56db\u4e94\u516d".split(""),months:"\u4e00\u6708\u4efd \u4e8c\u6708\u4efd \u4e09\u6708\u4efd \u56db\u6708\u4efd \u4e94\u6708\u4efd \u516d\u6708\u4efd \u4e03\u6708\u4efd \u516b\u6708\u4efd \u4e5d\u6708\u4efd \u5341\u6708\u4efd \u5341\u4e00\u6708\u4efd \u5341\u4e8c\u6708\u4efd".split(" "), +shortMonths:"\u4e00\u6708 \u4e8c\u6708 \u4e09\u6708 \u56db\u6708 \u4e94\u6708 \u516d\u6708 \u4e03\u6708 \u516b\u6708 \u4e5d\u6708 \u5341\u6708 \u5341\u4e00\u6708 \u5341\u4e8c\u6708".split(" "),AM:"\u4e0a\u5348",PM:"\u4e0b\u5348",am:"\u4e0a\u5348",pm:"\u4e0b\u5348",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}}},g=d.en_US,n=new a(g,0,!1);if("undefined"!==typeof m)var k=m.exports=n;else k=function(){return this||(0,eval)("this")}(), +k.strftime=n;"function"!==typeof Date.now&&(Date.now=function(){return+new Date})})()},function(m,q,a){(function(){var a=function(b,c,f){return a.parse(b,c,f)};a.version="0.0.1";(m.exports=a).strptime=a;a.locale={a:"Sun Mon Tue Wed Thu Fri Sat".split(" "),A:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),b:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),B:"January February March April May June July August September October November December".split(" "),f:"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.".split(" "), +c:"%Y-%m-%d %H:%M:%S",P:["am","pm"],r:"%I:%M:%S %p",x:"%m/%d/%y",X:"%H:%M:%S",day:["Yesterday","Today","Tomorrow"],bg:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),Bg:"January February March April May June July August September October November December".split(" "),fg:"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.".split(" "),Date_dBY_year_in_HM:"%#B %-d, %Y at %-H:%M",Date_dBY_year:"%#B %-d, %Y",Date_dBY:"%#B %-d, %Y",Date_AdBY:"%A, %#B %-d, %Y",Date_dBA:"%#B %-d, %A", +Date_df_in_HM:"%#f, %-d at %-H:%M",Date_dfY:"%-d %#f %Y",Date_dB_in_HM:"%#B %-d at %-H:%M",Date_df:"%-d %#f"};(function(a){function b(a,c,e,f,h,l){c=String(c);e=String(e);c=c.replace(/^[#_0\^\-!~]+/,"");f=d[c];if(!f)return a;var k=!1;-1===e.indexOf("!")&&1===c.length&&(-1b||99b||31b||31b||23b||12b||12b||59b||60b||99b||12null!==b&&a(b):a=>a instanceof c;c.powermod=(a,b,l)=>{const e=c.BigInt(1);let d=e;for(b=c.greaterThan(b,c.__ZERO)?b:c.unaryMinus(b);c.greaterThan(b,c.__ZERO);)c.bitwiseAnd(b,e)&&(d=c.remainder(c.multiply(d, +a),l)),b=c.signedRightShift(b,e),a=c.remainder(c.multiply(a,a),l);return d}}else Object.assign(c,{BigInt:Sk.global.BigInt,toNumber:a=>Number(a),toString:a=>a.toString(),__isBigInt:a=>"bigint"===typeof a,unaryMinus:a=>-a,bitwiseNot:a=>~a,bitwiseAnd:(a,c)=>a&c,bitwiseOr:(a,c)=>a|c,bitwiseXor:(a,c)=>a^c,exponentiate:(a,e)=>{const b=c.BigInt(1);let l=b;for(e=e>c.__ZERO?e:-e;e>c.__ZERO;)e&b&&(l*=a),e>>=b,a*=a;return l},powermod:(a,e,f)=>{const b=c.BigInt(1);let h=b;for(e=e>c.__ZERO?e:-e;e>c.__ZERO;)e& +b&&(h=h*a%f),e>>=b,a=a*a%f;return h},multiply:(a,c)=>a*c,divide:(a,c)=>a/c,remainder:(a,c)=>a%c,add:(a,c)=>a+c,subtract:(a,c)=>a-c,leftShift:(a,c)=>a<a>>c,unsignedRightShift:(a,c)=>a>>>c,lessThan:(a,c)=>aa<=c,greaterThan:(a,c)=>a>c,greaterThanOrEqual:(a,c)=>a>=c,equal:(a,c)=>a===c,notEqual:(a,c)=>a!==c});c.__ZERO=c.BigInt(0);c.__MAX_SAFE=c.BigInt(Number.MAX_SAFE_INTEGER);c.__MIN_SAFE=c.BigInt(-Number.MAX_SAFE_INTEGER);c.numberIfSafe=a=>c.lessThan(a, +c.__MAX_SAFE)&&c.greaterThan(a,c.__MIN_SAFE)?c.toNumber(a):a},function(m,q,a){(function(a,b){m.exports=b()})(this,function(){function a(b){"@babel/helpers - typeof";return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},a(b)}function b(a,b){for(var d,c=0;ca.length)&&(b=a.length);for(var d=0,c=Array(b);d=a.length?{done:!0}:{done:!1,value:a[c++]}},e:function(a){throw a;},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +}var e,k=!0,f=!1;return{s:function(){d=a[Symbol.iterator]()},n:function(){var a=d.next();return k=a.done,a},e:function(a){f=!0;e=a},f:function(){try{k||null==d.return||d.return()}finally{if(f)throw e;}}}}var t=Math.imul,y=Math.clz32,B=function(b){function d(a,b){var c;if(!(this instanceof d))throw new TypeError("Cannot call a class as a function");if(a>d.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded");return c=h.call(this,a),c.sign=b,c}var c=Math.abs,g=Math.max;f(d,b);var h=k(d); +return e(d,[{key:"toDebugString",value:function(){var a,b=["BigInt["],d=A(this);try{for(d.s();!(a=d.n()).done;){var c=a.value;b.push((c?(c>>>0).toString(16):c)+", ")}}catch(O){d.e(O)}finally{d.f()}return b.push("]"),b.join("")}},{key:"toString",value:function(){var a=0a||36this.length&&(c=this.length);var e= +65535&a;a>>>=16;var k=0,f=65535&b;b>>>=16;for(var g=0;g>>16;h=d.__imul(p,e);p=d.__imul(p,a);var u=d.__imul(l,e);l=d.__imul(l,a);var y=f+(65535&h);h=b+k+(y>>>16)+(h>>>16)+(65535&p)+(65535&u);f=(p>>>16)+(u>>>16)+(65535&l)+(h>>>16);k=f>>>16;f&=65535;b=l>>>16;this.__setDigit(g,65535&y|h<<16)}if(0!==k||0!==f||0!==b)throw Error("implementation bug");}},{key:"__inplaceAdd",value:function(a,b,d){for(var c,e=0,k=0;k>>16,this.__setHalfDigit(b+k,c);return e}},{key:"__inplaceSub",value:function(a,b,d){var c=0;if(1&b){b>>=1;for(var e=this.__digit(b),k=65535&e,f=0;f>>1;f++){var g=a.__digit(f);e=(e>>>16)-(65535&g)-c;c=1&e>>>16;this.__setDigit(b+f,e<<16|65535&k);e=this.__digit(b+f+1);k=(65535&e)-(g>>>16)-c;c=1&k>>>16}g=a.__digit(f);var h=(e>>>16)-(65535&g)-c;c=1&h>>>16;this.__setDigit(b+f,h<<16|65535&k);if(b+f+1>=this.length)throw new RangeError("out of bounds");0==(1&d)&&(e=this.__digit(b+f+1),k=(65535& +e)-(g>>>16)-c,c=1&k>>>16,this.__setDigit(b+a.length,4294901760&e|65535&k))}else{b>>=1;for(k=0;k>>16,e=(e>>>16)-(g>>>16)-c,c=1&e>>>16,this.__setDigit(b+k,e<<16|65535&f);f=this.__digit(b+k);a=a.__digit(k);e=(65535&f)-(65535&a)-c;c=1&e>>>16;g=0;0==(1&d)&&(g=(f>>>16)-(a>>>16)-c,c=1&g>>>16);this.__setDigit(b+k,g<<16|65535&e)}return c}},{key:"__inplaceRightShift",value:function(a){if(0!==a){for(var b,d=this.__digit(0)>>>a, +c=this.length-1,e=0;e>>a;this.__setDigit(c,d)}}},{key:"__digit",value:function(a){return this[a]}},{key:"__unsignedDigit",value:function(a){return this[a]>>>0}},{key:"__setDigit",value:function(a,b){this[a]=0|b}},{key:"__setDigitGrow",value:function(a,b){this[a]=0|b}},{key:"__halfDigitLength",value:function(){var a=this.length;return 65535>=this.__unsignedDigit(a-1)?2*a-1:2*a}},{key:"__halfDigit",value:function(a){return 65535&this[a>>>1]>>> +((1&a)<<4)}},{key:"__setHalfDigit",value:function(a,b){var d=a>>>1,c=this.__digit(d);this.__setDigit(d,1&a?65535&c|b<<16:4294901760&c|65535&b)}}],[{key:"BigInt",value:function(b){var c=Math.floor,e=Number.isFinite;if("number"==typeof b){if(0===b)return d.__zero();if((0|b)===b)return 0>b?d.__oneDigit(-b,!0):d.__oneDigit(b,!1);if(!e(b)||c(b)!==b)throw new RangeError("The number "+b+" cannot be converted to BigInt because it is not an integer");return d.__fromDouble(b)}if("string"==typeof b){c=d.__fromString(b); +if(null===c)throw new SyntaxError("Cannot convert "+b+" to a BigInt");return c}if("boolean"==typeof b)return!0===b?d.__oneDigit(1,!1):d.__zero();if("object"===a(b)){if(b.constructor===d)return b;b=d.__toPrimitive(b);return d.BigInt(b)}throw new TypeError("Cannot convert "+b+" to a BigInt");}},{key:"toNumber",value:function(a){var b=a.length;if(0===b)return 0;if(1===b){var c=a.__unsignedDigit(0);return a.sign?-c:c}var e=a.__digit(b-1),k=d.__clz32(e);c=32*b-k;if(1024>>12;var h=g-12;b=12<=g?0:e<<20+g;g=20+g;0>>32-h,b=e<>>32-g,g-=32);e=d.__decideRounding(a,g,f,e);if((1===e||0===e&&1==(1&b))&&(b=b+1>>>0,0===b&&(k++,0!=k>>>20&&(k=0,c++,1023= +d.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===a.length&&2===a.__digit(0)){var c=1+(b>>>5);a=new d(c,a.sign&&0!=(1&b));a.__initializeDigits();return a.__setDigit(c-1,1<<(31&b)),a}c=null;var e=a;0!=(1&b)&&(c=a);for(b>>=1;0!==b;b>>=1)e=d.multiply(e,e),0!=(1&b)&&(null===c?c=e:c=d.multiply(c,e));return c}},{key:"multiply",value:function(a,b){if(0===a.length)return a;if(0===b.length)return b;var c=a.length+b.length;32<=a.__clzmsd()+b.__clzmsd()&&c--;c=new d(c,a.sign!==b.sign);c.__initializeDigits(); +for(var e=0;ed.__absoluteCompare(a,b))return d.__zero();var c=a.sign!==b.sign,e=b.__unsignedDigit(0);if(1===b.length&&65535>=e){if(1===e)return c===a.sign?a:d.unaryMinus(a);a=d.__absoluteDivSmall(a,e,null)}else a=d.__absoluteDivLarge(a,b,!0,!1);return a.sign=c,a.__trim()}},{key:"remainder",value:function(a,b){if(0===b.length)throw new RangeError("Division by zero"); +if(0>d.__absoluteCompare(a,b))return a;var c=b.__unsignedDigit(0);if(1===b.length&&65535>=c){if(1===c)return d.__zero();b=d.__absoluteModSmall(a,c);return 0===b?d.__zero():d.__oneDigit(b,a.sign)}b=d.__absoluteDivLarge(a,b,!1,!0);return b.sign=a.sign,b.__trim()}},{key:"add",value:function(a,b){var c=a.sign;return c===b.sign?d.__absoluteAdd(a,b,c):0<=d.__absoluteCompare(a,b)?d.__absoluteSub(a,b,c):d.__absoluteSub(b,a,!c)}},{key:"subtract",value:function(a,b){var c=a.sign;return c===b.sign?0<=d.__absoluteCompare(a, +b)?d.__absoluteSub(a,b,c):d.__absoluteSub(b,a,!c):d.__absoluteAdd(a,b,c)}},{key:"leftShift",value:function(a,b){return 0===b.length||0===a.length?a:b.sign?d.__rightShiftByAbsolute(a,b):d.__leftShiftByAbsolute(a,b)}},{key:"signedRightShift",value:function(a,b){return 0===b.length||0===a.length?a:b.sign?d.__leftShiftByAbsolute(a,b):d.__rightShiftByAbsolute(a,b)}},{key:"unsignedRightShift",value:function(){throw new TypeError("BigInts have no unsigned right shift; use >> instead");}},{key:"lessThan", +value:function(a,b){return 0>d.__compareToBigInt(a,b)}},{key:"lessThanOrEqual",value:function(a,b){return 0>=d.__compareToBigInt(a,b)}},{key:"greaterThan",value:function(a,b){return 0=d.__kMaxLengthBits)return b;var c=a+31>>>5;if(b.lengthd.__kMaxLengthBits)throw new RangeError("BigInt too big");return d.__truncateAndSubFromPowerOfTwo(a,b,!1)}if(a>=d.__kMaxLengthBits)return b;var c=a+31>>>5;if(b.length>> +e?d.__truncateToNBits(a,b):b}},{key:"ADD",value:function(a,b){if(a=d.__toPrimitive(a),b=d.__toPrimitive(b),"string"==typeof a)return"string"!=typeof b&&(b=b.toString()),a+b;if("string"==typeof b)return a.toString()+b;if(a=d.__toNumeric(a),b=d.__toNumeric(b),d.__isBigInt(a)&&d.__isBigInt(b))return d.add(a,b);if("number"==typeof a&&"number"==typeof b)return a+b;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions");}},{key:"LT",value:function(a,b){return d.__compare(a,b, +0)}},{key:"LE",value:function(a,b){return d.__compare(a,b,1)}},{key:"GT",value:function(a,b){return d.__compare(a,b,2)}},{key:"GE",value:function(a,b){return d.__compare(a,b,3)}},{key:"EQ",value:function(b,c){for(;;){if(d.__isBigInt(b))return d.__isBigInt(c)?d.equal(b,c):d.EQ(c,b);if("number"==typeof b){if(d.__isBigInt(c))return d.__equalToNumber(c,b);if("object"!==a(c))return b==c;c=d.__toPrimitive(c)}else if("string"==typeof b){if(d.__isBigInt(c))return b=d.__fromString(b),null!==b&&d.equal(b,c); +if("object"!==a(c))return b==c;c=d.__toPrimitive(c)}else if("boolean"==typeof b){if(d.__isBigInt(c))return d.__equalToNumber(c,+b);if("object"!==a(c))return b==c;c=d.__toPrimitive(c)}else if("symbol"===a(b)){if(d.__isBigInt(c))return!1;if("object"!==a(c))return b==c;c=d.__toPrimitive(c)}else if("object"===a(b)){if("object"===a(c)&&c.constructor!==d)return b==c;b=d.__toPrimitive(b)}else return b==c}}},{key:"NE",value:function(a,b){return!d.EQ(a,b)}},{key:"__zero",value:function(){return new d(0,!1)}}, +{key:"__oneDigit",value:function(a,b){b=new d(1,b);return b.__setDigit(0,a),b}},{key:"__decideRounding",value:function(a,b,d,c){if(0b)b=-b-1;else{if(0===d)return-1;d--;c=a.__digit(d);b=31}b=1<>>20)-1023;var c=(b>>>5)+1;a=new d(c,0>a);var e=1048575&d.__kBitConversionInts[1]|1048576, +k=d.__kBitConversionInts[0];b&=31;if(20>b){var f=20-b;var g=f+32;b=e>>>f;e=e<<32-f|k>>>f;k<<=32-f}else 20===b?(g=32,b=e,e=k):(f=b-20,g=32-f,b=e<>>32-f,e=k<=a&&9<=a)||(159>=a?32==a:131071>=a?160==a||5760==a:196607>=a?(a&=131071,10>=a||40==a||41==a||47==a||95==a||4096==a):65279==a)}},{key:"__fromString",value:function(a){var b=11073741824/h)return null;g=new d((h*g+p>>>d.__kBitsPerCharTableShift)+31>>>5,!1);var l=10>b?b:10,y=10>=d.__kBitsPerCharTableShift;var B=[],n=[],A= +!1;do{for(var w,E=p=0;;){if(f-48>>>0>>0>>0>>0>>d.__kBitsPerCharTableShift+5)}while(!B)}if(k!==e){if(!d.__isWhitespace(f))return null;for(k++;k>>h-k)}if(0!==e){if(c>=a.length)throw Error("implementation bug");a.__setDigit(c++,e)}for(;c< +a.length;c++)a.__setDigit(c,0)}},{key:"__toStringBasePowerOfTwo",value:function(a,b){var c=a.length,e=b-1;e=(85&e>>>1)+(85&e);e=(51&e>>>2)+(51&e);e=(15&e>>>4)+(15&e);--b;var k=a.__digit(c-1),f=d.__clz32(k),g=0|(32*c-f+e-1)/e;if(a.sign&&g++,268435456>>p;for(p=32-p;p>=e;)f[g--]=d.__kConversionChars[h&b],h>>>=e,p-=e}f[g--]=d.__kConversionChars[(h|k<< +p)&b];for(h=k>>>e-p;0!==h;)f[g--]=d.__kConversionChars[h&b],h>>>=e;if(a.sign&&(f[g--]="-"),-1!==g)throw Error("implementation bug");return f.join("")}},{key:"__toStringGeneric",value:function(a,b,c){var e=a.length;if(0===e)return"";if(1===e)return b=a.__unsignedDigit(0).toString(b),!1===c&&a.sign&&(b="-"+b),b;var k=32*e-d.__clz32(a.__digit(e-1));e=d.__kMaxBitsPerChar[b]-1;k*=d.__kBitsPerCharTableMultiplier;e=(0|(k+(e-1))/e)+1>>1;k=d.exponentiate(d.__oneDigit(b,!1),d.__oneDigit(e,!1));var f=k.__unsignedDigit(0); +if(1===k.length&&65535>=f){k=new d(a.length,!1);k.__initializeDigits();var g=0;for(var h=2*a.length-1;0<=h;h--)g=g<<16|a.__halfDigit(h),k.__setHalfDigit(h,0|g/f),g=0|g%f;f=g.toString(b)}else f=d.__absoluteDivLarge(a,k,!0,!0),k=f.quotient,f=f.remainder.__trim(),f=d.__toStringGeneric(f,b,!0);k.__trim();for(b=d.__toStringGeneric(k,b,!0);f.lengtha?d.__absoluteLess(c):0}},{key:"__compareToNumber",value:function(a,b){if(1|b){var e=a.sign,k=0>b;if(e!==k)return d.__unequalSign(e);if(0===a.length){if(k)throw Error("implementation bug");return 0===b?0:-1}if(1b?d.__absoluteGreater(e):ab)return d.__unequalSign(c);if(0===b)throw Error("implementation bug: should be handled elsewhere");if(0===a.length)return-1;d.__kBitConversionDouble[0]=b;b=2047&d.__kBitConversionInts[1]>>>20;if(2047==b)throw Error("implementation bug: handled elsewhere");var e=b-1023;if(0>e)return d.__absoluteGreater(c); +b=a.length;var k=a.__digit(b-1),f=d.__clz32(k),g=32*b-f;e+=1;if(ge)return d.__absoluteGreater(c);e=1048576|1048575&d.__kBitConversionInts[1];var h=d.__kBitConversionInts[0];f=31-f;if(f!==(g-1)%31)throw Error("implementation bug");if(20>f){var p=20-f;f=p+32;g=e>>>p;e=e<<32-p|h>>>p;h<<=32-p}else 20===f?(f=32,g=e,e=h):(p=f-20,f=32-p,g=e<>>32-p,e=h<>>=0,g>>>=0,k>g)return d.__absoluteGreater(c);if(k>>0,e=h,h=0):g=0;k=a.__unsignedDigit(b);if(k>g)return d.__absoluteGreater(c);if(kb&&a.__unsignedDigit(0)===c(b):0===d.__compareToDouble(a,b)}},{key:"__comparisonResultToBool",value:function(a,b){switch(b){case 0:return 0>a;case 1:return 0>=a;case 2:return 0b;case 3:return a>=b}if(d.__isBigInt(a)&&"string"==typeof b)return b=d.__fromString(b),null!==b&&d.__comparisonResultToBool(d.__compareToBigInt(a,b),c);if("string"==typeof a&&d.__isBigInt(b))return a=d.__fromString(a),null!==a&&d.__comparisonResultToBool(d.__compareToBigInt(a,b),c); +if(a=d.__toNumeric(a),b=d.__toNumeric(b),d.__isBigInt(a)){if(d.__isBigInt(b))return d.__comparisonResultToBool(d.__compareToBigInt(a,b),c);if("number"!=typeof b)throw Error("implementation bug");return d.__comparisonResultToBool(d.__compareToNumber(a,b),c)}if("number"!=typeof a)throw Error("implementation bug");if(d.__isBigInt(b))return d.__comparisonResultToBool(d.__compareToNumber(b,a),2^c);if("number"!=typeof b)throw Error("implementation bug");return 0===c?ab:3===c?a>=b: +void 0}},{key:"__absoluteAdd",value:function(a,b,c){if(a.length>>16)+(f>>>16)+(h>>>16);e=f>>>16;c.__setDigit(k,65535&h|f<<16)}for(;k>>16)+(b>>>16),e=h>>> +16,c.__setDigit(k,65535&b|h<<16);return k>>16;f=(f>>>16)-(g>>>16)-e;e=1&f>>>16;c.__setDigit(k,65535&h|f<<16)}for(;k>>16,h=(h>>>16)-e,e=1&h>>>16,c.__setDigit(k,65535&b|h<<16); +return c.__trim()}},{key:"__absoluteAddOne",value:function(a,b){var c=2d?0:a.__unsignedDigit(d)> +b.__unsignedDigit(d)?1:-1}},{key:"__multiplyAccumulate",value:function(a,b,c,e){if(0!==b){for(var k=65535&b,f=b>>>16,g=b=0,h=0,p=0;p>>=16;var B=a.__digit(p),n=65535&B,A=B>>>16;B=d.__imul(n,k);n=d.__imul(n,f);var u=d.__imul(A,k);A=d.__imul(A,f);y+=g+(65535&B);l+=h+b+(y>>>16)+(B>>>16)+(65535&n)+(65535&u);b=l>>>16;g=(n>>>16)+(u>>>16)+(65535&A)+b;b=g>>>16;g&=65535;h=A>>>16;l=65535&y|l<<16;c.__setDigit(e,l)}for(;0!==b||0!==g||0!==h;e++)k=c.__digit(e),a= +(65535&k)+g,k=(k>>>16)+(a>>>16)+h+b,h=g=0,b=k>>>16,k=65535&a|k<<16,c.__setDigit(e,k)}}},{key:"__internalMultiplyAdd",value:function(a,b,c,e,k){for(var f=0,g=0;g>>16;f=d.__imul(h>>>16,b);p=(65535&f)+(p>>>16)+c;c=p>>>16;f>>>=16;k.__setDigit(g,p<<16|65535&l)}if(k.length>e)for(k.__setDigit(e++,c+f);e>>0;var f=0|e/b;e=0|e%b;e=(e<<16|a.__halfDigit(k-1))>>>0;var g=0|e/b;e=0|e%b;c.__setDigit(k>>>1,f<<16|g)}return c}},{key:"__absoluteModSmall",value:function(a,b){var d=0;for(var c=2*a.length-1;0<=c;c--)d=(d<<16|a.__halfDigit(c))>>>0,d=0|d%b;return d}},{key:"__absoluteDivLarge",value:function(a,b,c,e){var k=b.__halfDigitLength(),f=b.length,g=a.__halfDigitLength()-k,h=null;c&&(h=new d(g+2>>>1,!1),h.__initializeDigits()); +var p=new d(k+2>>>1,!1);p.__initializeDigits();var l=d.__clz16(b.__halfDigit(k-1));0>>0;n=0|A/y;A=0|A%y;for(var u=b.__halfDigit(k-2),w=a.__halfDigit(g+k-2);d.__imul(n,u)>>>0>(A<<16|w)>>>0&&(n--,A+=y,!(65535>>1,B|n))}return e?(a.__inplaceRightShift(l),c?{quotient:h,remainder:a}:a):c?h:void 0}},{key:"__clz16",value:function(a){return d.__clz32(a)-16}},{key:"__specialLeftShift",value:function(a,b,c){var e=a.length,k=new d(e+c,!1);if(0===b){for(b=0;b>>32-b;return 0c)throw new RangeError("BigInt too big");b=c>>>5;var e=31&c,k=a.length,f=0!==e&&0!=a.__digit(k-1)>>>32-e,g=k+b+(f?1:0);c=new d(g,a.sign);if(0===e){for(e=0;e>>32-e;if(f)c.__setDigit(k+b,g);else if(0!==g)throw Error("implementation bug");}return c.__trim()}},{key:"__rightShiftByAbsolute", +value:function(a,b){var c=a.length,e=a.sign,k=d.__toShiftAmount(b);if(0>k)return d.__rightShiftByMaximum(e);b=k>>>5;var f=31&k,g=c-b;if(0>=g)return d.__rightShiftByMaximum(e);k=!1;if(e)if(0!=(a.__digit(b)&(1<>>f;h=c-b-1;for(var p=0;p>>f;e.__setDigit(h,g)}return k&& +(e=d.__absoluteAddOne(e,!0,e)),e.__trim()}},{key:"__rightShiftByMaximum",value:function(a){return a?d.__oneDigit(1,!0):d.__zero()}},{key:"__toShiftAmount",value:function(a){if(1d.__kMaxLengthBits?-1:a}},{key:"__toPrimitive",value:function(b){var c=1>>5,e=new d(c,b.sign);--c;for(var k=0;k>> +a);return e.__setDigit(c,b),e.__trim()}},{key:"__truncateAndSubFromPowerOfTwo",value:function(a,b,c){var e=Math.min,k=a+31>>>5;c=new d(k,c);var f=0;--k;var g=0;for(e=e(k,b.length);f>>16;h=-(h>>>16)-g;g=1&h>>>16;c.__setDigit(f,65535&p|h<<16)}for(;f>>16)-(1&g>>>16)<<16):(a=32-a,b=b<>>a,a=1<<32-a,g=(65535&a)-(65535&b)-g,g=(65535&g|(a>>>16)-(b>>>16)-(1&g>>> +16)<<16)&a-1);return c.__setDigit(k,g),c.__trim()}},{key:"__digitPow",value:function(a,b){for(var d=1;0>>=1,a*=a;return d}}]),d}(n(Array));return B.__kMaxLength=33554432,B.__kMaxLengthBits=B.__kMaxLength<<5,B.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],B.__kBitsPerCharTableShift=5,B.__kBitsPerCharTableMultiplier=1<>>0)/b)},B.__imul=t||function(a,b){return 0|a*b},B})},function(m,q,a){(function(a,b){(function(a,c){function e(a){delete t[a]}function f(a){if(y)setTimeout(f,0,a);else{var b=t[a];if(b){y=!0;try{var d=b.callback,k=b.args;switch(k.length){case 0:d(); +break;case 1:d(k[0]);break;case 2:d(k[0],k[1]);break;case 3:d(k[0],k[1],k[2]);break;default:d.apply(c,k)}}finally{e(a),y=!1}}}}function d(){E=function(a){b.nextTick(function(){f(a)})}}function g(){if(a.postMessage&&!a.importScripts){var b=!0,d=a.onmessage;a.onmessage=function(){b=!1};a.postMessage("","*");a.onmessage=d;return b}}function n(){var b="setImmediate$"+Math.random()+"$",d=function(d){d.source===a&&"string"===typeof d.data&&0===d.data.indexOf(b)&&f(+d.data.slice(b.length))};a.addEventListener? +a.addEventListener("message",d,!1):a.attachEvent("onmessage",d);E=function(d){a.postMessage(b+d,"*")}}function k(){var a=new MessageChannel;a.port1.onmessage=function(a){f(a.data)};E=function(b){a.port2.postMessage(b)}}function p(){var a=B.documentElement;E=function(b){var d=B.createElement("script");d.onreadystatechange=function(){f(b);d.onreadystatechange=null;a.removeChild(d);d=null};a.appendChild(d)}}function w(){E=function(a){setTimeout(f,0,a)}}if(!a.setImmediate){var A=1,t={},y=!1,B=a.document, +E,F=Object.getPrototypeOf&&Object.getPrototypeOf(a);F=F&&F.setTimeout?F:a;"[object process]"==={}.toString.call(a.process)?d():g()?n():a.MessageChannel?k():B&&"onreadystatechange"in B.createElement("script")?p():w();F.setImmediate=function(a){"function"!==typeof a&&(a=new Function(""+a));for(var b=Array(arguments.length-1),d=0;d the object's type\ntype(name, bases, dict) -> a new type",tp$call:function(a,b){if(this===Sk.builtin.type){if(1===a.length&&(void 0===b||!b.length))return a[0].ob$type;if(3!==a.length)throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments"); +}let d=this.prototype.tp$new(a,b);if(d.$isSuspension)return Sk.misceval.chain(d,c=>{d=c;if(d.ob$type.$isSubType(this))return d.tp$init(a,b)},()=>d);if(d.ob$type.$isSubType(this)){const c=d.tp$init(a,b);return void 0!==c&&c.$isSuspension?Sk.misceval.chain(c,()=>d):d}return d},tp$new:function(a,c){if(3!==a.length){if(1===a.length&&(void 0===c||!c.length))return a[0].ob$type;throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments");}let d;c=a[0];d=a[1];a=a[2];if("dict"!==a.tp$name)throw new Sk.builtin.TypeError("type() argument 3 must be dict, not "+ +Sk.abstr.typeName(a));if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("type() argument 1 must be str, not "+Sk.abstr.typeName(c));c=c.$jsstr();if("tuple"!==d.tp$name)throw new Sk.builtin.TypeError("type() argument 2 must be tuple, not "+Sk.abstr.typeName(d));d=d.sk$asarray();const e=function(){this.$d=new Sk.builtin.dict};b(c,e,d,this.constructor);Sk.globals&&(e.prototype.__module__=Sk.globals.__name__);e.prototype.__doc__=Sk.builtin.none.none$;void 0===e.$typeLookup(Sk.builtin.str.$dict)&& +(e.prototype.__dict__=new Sk.builtin.getset_descriptor(e,h));a.$items().forEach(([a,b])=>{e.prototype[a.$mangled]=b});e.prototype.hasOwnProperty("__new__")&&(a=e.prototype.__new__,a instanceof Sk.builtin.func&&(e.prototype.__new__=new Sk.builtin.staticmethod(a)));e.$allocateSlots();return e},tp$getattr:function(a,b){var d=this.ob$type;const c=d.$typeLookup(a);let e;if(void 0!==c&&(e=c.tp$descr_get,void 0!==e&&void 0!==c.tp$descr_set))return b=e.call(c,this,d,b);a=this.$typeLookup(a);if(void 0!==a)return d= +a.tp$descr_get,void 0!==d?b=d.call(a,null,this,b):a;if(void 0!==e)return b=e.call(c,this,d,b);if(void 0!==c)return c},tp$setattr:function(a,b,c){if(!this.sk$klass){if(void 0!==b)throw new Sk.builtin.TypeError("can't set attributes of built-in/extension type '"+this.prototype.tp$name+"'");throw new Sk.builtin.TypeError("can't delete attributes on type object '"+this.prototype.tp$name+"'");}const d=this.ob$type.$typeLookup(a);if(void 0!==d){const a=d.tp$descr_set;if(a)return a.call(d,this,b,c)}c=a.$mangled; +if(void 0===b)if(b=this.prototype,b.hasOwnProperty(c))delete b[c],a=Sk.dunderToSkulpt[c],void 0!==a&&(delete this.prototype[a],b.sk$prototypical||this.$allocateGetterSlot(c));else throw new Sk.builtin.AttributeError("type object '"+this.prototype.tp$name+"' has no attribute '"+a.$jsstr()+"'");else this.prototype[c]=b,c in Sk.dunderToSkulpt&&this.$allocateSlot(c,b)},$r:function(){let a=this.prototype.__module__,b="",c="class";a&&Sk.builtin.checkString(a)?b=a.v+".":a=null;a||this.sk$klass||Sk.__future__.class_repr|| +(c="type");return new Sk.builtin.str("<"+c+" '"+b+this.prototype.tp$name+"'>")}},writable:!0},tp$methods:{value:null,writable:!0},tp$getsets:{value:null,writable:!0},sk$type:{value:!0},$isSubType:{value:function(a){return this===a||this.prototype instanceof a||!this.prototype.sk$prototypical&&this.prototype.tp$mro.includes(a)}},$allocateSlot:{value:function(a,b){a=Sk.slots[a];const c=a.$slot_name,d=this.prototype;d.hasOwnProperty(c)&&delete d[c];d[c]=a.$slot_func(b)}},$allocateSlots:{value:function(){const a= +this.prototype;this.prototype.sk$prototypical?Object.keys(a).forEach(b=>{b in Sk.slots&&this.$allocateSlot(b,a[b])}):Object.keys(Sk.slots).forEach(b=>{a.hasOwnProperty(b)?this.$allocateSlot(b,a[b]):this.$allocateGetterSlot(b)})}},$allocateGetterSlot:{value:function(a){const b=Sk.slots[a].$slot_name,c=this.prototype;c.hasOwnProperty(b)||Object.defineProperty(c,b,{configurable:!0,get(){const a=c.tp$mro;for(let c=1;ca.length)throw a= +b.tp$name,new Sk.builtin.TypeError(a+".__new__(): not enough arguments");var e=a.shift();if(void 0===e.sk$type)throw a=b.tp$name,new Sk.builtin.TypeError(a+"__new__(X): X is not a type object ("+Sk.abstr.typeName(e)+")");if(!e.$isSubType(this))throw a=b.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+".__new__("+e+"): "+e+" is not a subtype of "+a);const f=e.prototype.sk$staticNew.prototype;if(f.tp$new!==b.tp$new)throw a=b.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+".__new__("+ +e+") is not safe, use "+f.tp$name+".__new__()");return b.tp$new.call(e.prototype,a,c)},$flags:{FastCall:!0},$textsig:"($type, *args, **kwargs)",$name:"__new__"};Sk.generic.selfIter=function(){return this};Sk.generic.iterNextWithArrayCheckSize=function(){if(this.$seq.length!==this.$orig.get$size()){const a=this.tp$name.split("_")[0];throw new Sk.builtin.RuntimeError(a+" changed size during iteration");}if(!(this.$index>=this.$seq.length))return this.$seq[this.$index++]};Sk.generic.iterNextWithArray= +function(){const a=this.$seq[this.$index++];void 0===a&&(this.tp$iternext=()=>{});return a};Sk.generic.iterLengthHintWithArrayMethodDef={$meth:function(){return new Sk.builtin.int_(this.$seq.length-this.$index)},$flags:{NoArgs:!0}};Sk.generic.iterReverseLengthHintMethodDef={$meth:function(){return new Sk.builtin.int_(this.$index)},$flags:{NoArgs:!0}};Sk.generic.getSetDict={$get(){return this.$d},$set(a){if(void 0===a)this.$d=new Sk.builtin.dict;else if(a instanceof Sk.builtin.dict)this.$d=a;else throw new Sk.builtin.TypeError("__dict__ must be set to a dictionary, not a '"+ +Sk.abstr.typeName(a)+"'");},$doc:"dictionary for instance variables (if defined)",$name:"__dict__"};Sk.generic.seqCompare=function(a,c){if(this===a&&Sk.misceval.opAllowsEquality(c))return!0;if(!(a instanceof this.sk$builtinBase))return Sk.builtin.NotImplemented.NotImplemented$;const b=this.v;a=a.v;let e;if(b.length!==a.length&&("Eq"===c||"NotEq"===c))return"Eq"===c?!1:!0;for(e=0;e= +f||e>=l)switch(c){case "Lt":return fl;case "GtE":return f>=l;default:Sk.asserts.fail()}return"Eq"===c?!1:"NotEq"===c?!0:Sk.misceval.richCompareBool(b[e],a[e],c)}},function(m,q){Sk.builtin.pyCheckArgs=function(a,c,b,e,f,l){c=c.length;void 0===e&&(e=Infinity);f&&--c;l&&--c;if(ce)throw new Sk.builtin.TypeError((b===e?a+"() takes exactly "+b+" arguments":ce)throw new Sk.builtin.TypeError((b===e?a+"() takes exactly "+b+" arguments":c{a[c]=function(a){return this.tp$richcompare(a,b)}})}function l(a){const b=Sk.reflectedNumberSlots; +Object.keys(b).forEach(c=>{if(void 0!==a[c]){const d=b[c],e=d.reflected,f=a[e];void 0!==f?null===f&&delete a[e]:a[e]=d.slot||a[c]}})}function h(a){const b=Sk.sequenceAndMappingSlots;Object.keys(b).forEach(c=>{void 0!==a[c]&&b[c].forEach(b=>{a[b]=a[c]})})}Sk.abstr={};Sk.abstr.typeName=function(a){return null!=a&&void 0!==a.tp$name?a.tp$name:""};const d={Add:"+",Sub:"-",Mult:"*",MatMult:"@",Div:"/",FloorDiv:"//",Mod:"%",DivMod:"divmod()",Pow:"** or pow()",LShift:"<<",RShift:">>",BitAnd:"&", +BitXor:"^",BitOr:"|"},g={UAdd:"+",USub:"-",Invert:"~"};Sk.abstr.numberBinOp=function(a,b,c){var f;if(!(f=e(a,b,c)))throw a=Sk.abstr.typeName(a),b=Sk.abstr.typeName(b),new Sk.builtin.TypeError("unsupported operand type(s) for "+d[c]+": '"+a+"' and '"+b+"'");return f};Sk.exportSymbol("Sk.abstr.numberBinOp",Sk.abstr.numberBinOp);Sk.abstr.numberInplaceBinOp=function(a,c,f){a:{var k=b(a,f);if(void 0!==k&&(k=k.call(a,c),k!==Sk.builtin.NotImplemented.NotImplemented$))break a;k=e(a,c,f)}if(!k)throw a=Sk.abstr.typeName(a), +c=Sk.abstr.typeName(c),new Sk.builtin.TypeError("unsupported operand type(s) for "+d[f]+"=: '"+a+"' and '"+c+"'");return k};Sk.exportSymbol("Sk.abstr.numberInplaceBinOp",Sk.abstr.numberInplaceBinOp);Sk.abstr.numberUnaryOp=function(a,b){if("Not"===b)return Sk.misceval.isTrue(a)?Sk.builtin.bool.false$:Sk.builtin.bool.true$;b:{switch(b){case "USub":var c=a.nb$negative;break b;case "UAdd":c=a.nb$positive;break b;case "Invert":c=a.nb$invert;break b}c=void 0}c=void 0!==c?c.call(a):void 0;if(!c)throw a= +Sk.abstr.typeName(a),new Sk.builtin.TypeError("bad operand type for unary "+g[b]+": '"+a+"'");return c};Sk.exportSymbol("Sk.abstr.numberUnaryOp",Sk.abstr.numberUnaryOp);Sk.abstr.fixSeqIndex_=function(a,b){b=Sk.builtin.asnum$(b);0>b&&a.sq$length&&(b+=a.sq$length());return b};Sk.abstr.sequenceContains=function(a,b,c){if(a.sq$contains)return a.sq$contains(b,c);a=Sk.misceval.iterFor(Sk.abstr.iter(a),function(a){return a===b||Sk.misceval.richCompareBool(a,b,"Eq")?new Sk.misceval.Break(!0):!1},!1);return c? +a:Sk.misceval.retryOptionalSuspensionOrThrow(a)};Sk.abstr.sequenceConcat=function(a,b){if(a.sq$concat)return a.sq$concat(b);throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(a)+"' object can't be concatenated");};Sk.abstr.sequenceGetIndexOf=function(a,b){if(a.index)return Sk.misceval.callsimArray(a.index,[a,b]);let c=0;for(let d=Sk.abstr.iter(a),e=d.tp$iternext();void 0!==e;e=d.tp$iternext()){if(Sk.misceval.richCompareBool(b,e,"Eq"))return new Sk.builtin.int_(c);c+=1}throw new Sk.builtin.ValueError("sequence.index(x): x not in sequence"); +};Sk.abstr.sequenceGetCountOf=function(a,b){if(a.count)return Sk.misceval.callsimArray(a.count,[a,b]);let c=0;for(let d=Sk.abstr.iter(a),e=d.tp$iternext();void 0!==e;e=d.tp$iternext())Sk.misceval.richCompareBool(b,e,"Eq")&&(c+=1);return new Sk.builtin.int_(c)};Sk.abstr.sequenceGetItem=function(a,b,c){"number"===typeof b&&(b=new Sk.builtin.int_(b));return Sk.abstr.objectGetItem(a,b,c)};Sk.abstr.sequenceSetItem=function(a,b,c,d){"number"===typeof b&&(b=new Sk.builtin.int_(b));return Sk.abstr.objectSetItem(a, +b,c,d)};Sk.abstr.sequenceDelItem=function(a,b,c){return Sk.abstr.objectDelItem(a,b,c)};Sk.abstr.sequenceGetSlice=function(a,b,c){return Sk.abstr.objectGetItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceDelSlice=function(a,b,c){return Sk.abstr.objectDelItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceSetSlice=function(a,b,c,d){return Sk.abstr.objectSetItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceUnpack=function(a,b,c,d){if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError("cannot unpack non-iterable "+ +Sk.abstr.typeName(a)+" object");const e=Sk.abstr.iter(a),f=[];let k=0,g;0{f.push(a);if(++k===b)return new Sk.misceval.Break}));return Sk.misceval.chain(g,()=>{if(f.length{if(void 0!==a)throw new Sk.builtin.ValueError("too many values to unpack (expected "+b+")");return f});const a=[];return Sk.misceval.chain(Sk.misceval.iterFor(e, +b=>{a.push(b)}),()=>{const d=a.length+b-c;if(0>d)throw new Sk.builtin.ValueError("not enough values to unpack (expected at least "+c+", got "+(c+d)+")");f.push(new Sk.builtin.list(a.slice(0,d)));f.push(...a.slice(d));return f})})};Sk.abstr.mappingUnpackIntoKeywordArray=function(a,b,c){if(b instanceof Sk.builtin.dict)b.$items().forEach(([b,d])=>{if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError((c.$qualname?c.$qualname+"() ":"")+"keywords must be strings");a.push(b.v);a.push(d)});else{var d= +Sk.abstr.lookupSpecial(b,Sk.builtin.str.$keys);if(void 0===d)throw new Sk.builtin.TypeError("Object is not a mapping");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d),d=>Sk.misceval.iterFor(Sk.abstr.iter(d),d=>{if(!Sk.builtin.checkString(d))throw new Sk.builtin.TypeError((c.$qualname?c.$qualname+"() ":"")+"keywords must be strings");return Sk.misceval.chain(b.mp$subscript(d,!0),b=>{a.push(d.v);a.push(b)})}))}};Sk.abstr.copyKeywordsToNamedArgs=function(a,b,c,d,e){d=d||[];var f=c.length+ +d.length/2;if(f>b.length)throw new Sk.builtin.TypeError(a+"() expected at most "+b.length+" arguments ("+f+" given)");if(d.length||void 0!==e){if(f===b.length&&!d.length)return c;if(0===f&&b.length===(e&&e.length))return e}else return c;c=c.slice(0);for(f=0;fvoid 0===c[b]);if(b.length)throw new Sk.builtin.TypeError(a+"() missing "+b.length+" required positional arguments: "+b.join(", "));}return c};Sk.exportSymbol("Sk.abstr.copyKeywordsToNamedArgs",Sk.abstr.copyKeywordsToNamedArgs);Sk.abstr.checkNoKwargs=function(a,b){if(b&&b.length)throw new Sk.builtin.TypeError(a+"() takes no keyword arguments");};Sk.exportSymbol("Sk.abstr.checkNoKwargs",Sk.abstr.checkNoKwargs); +Sk.abstr.checkNoArgs=function(a,b,c){if(b=b.length+(c?c.length:0))throw new Sk.builtin.TypeError(a+"() takes no arguments ("+b+" given)");};Sk.exportSymbol("Sk.abstr.checkNoArgs",Sk.abstr.checkNoArgs);Sk.abstr.checkOneArg=function(a,b,c){Sk.abstr.checkNoKwargs(a,c);if(1!==b.length)throw new Sk.builtin.TypeError(a+"() takes exactly one argument ("+b.length+" given)");};Sk.exportSymbol("Sk.abstr.checkOneArg",Sk.abstr.checkOneArg);Sk.abstr.checkArgsLen=function(a,b,c,d){b=b.length;void 0===d&&(d=Infinity); +if(bd)throw new Sk.builtin.TypeError((c===d?a+"() takes exactly "+c+" arguments":b{d.$name=b;c[b]=new Sk.builtin.getset_descriptor(a,d)});Object.defineProperty(c,"tp$getsets",{value:null,writable:!0})}};Sk.abstr.setUpMethods=function(a,b){if(void 0!==Sk.builtin.method_descriptor){var c=a.prototype;b=b||c.tp$methods||{};Object.entries(b).forEach(([b,d])=>{d.$name=b;c[b]=new Sk.builtin.method_descriptor(a,d)});Object.defineProperty(c,"tp$methods",{value:null,writable:!0})}};Sk.abstr.setUpClassMethods=function(a,b){if(void 0!==Sk.builtin.classmethod_descriptor){var c= +a.prototype;b=b||c.tp$classmethods||{};Object.entries(b).forEach(([b,d])=>{d.$name=b;c[b]=new Sk.builtin.classmethod_descriptor(a,d)});Object.defineProperty(c,"tp$classmethods",{value:null,writable:!0})}};const n=Object.entries({Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"});Sk.abstr.setUpSlots=function(a,b){function c(b,c){e[b]=new Sk.builtin.wrapper_descriptor(a,Sk.slots[b],c)}function d(a,b){"string"===typeof a?c(a,b):a.forEach(a=>{c(a,b)})}if(void 0!==Sk.builtin.wrapper_descriptor){var e= +a.prototype;b=b||e.tp$slots||{};b.tp$new===Sk.generic.new&&(b.tp$new=Sk.generic.new(a));b.tp$richcompare&&f(b);b.tp$as_number&&l(b);b.tp$as_sequence_or_mapping&&h(b);Object.entries(b).forEach(([a,b])=>{Object.defineProperty(e,a,{value:b,writable:!0})});b.tp$new&&(e.__new__=new Sk.builtin.sk_method(Sk.generic.newMethodDef,a),Object.defineProperty(e,"sk$staticNew",{value:a,writable:!0}));Sk.subSlots.main_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});var g=b.tp$hash;void 0!==g&&("function"===typeof g? +c("__hash__",g):g===Sk.builtin.none.none$?e.__hash__=g:Sk.asserts.fail("invalid tp$hash"));b.tp$as_number&&Sk.subSlots.number_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});b.tp$as_sequence_or_mapping&&Sk.subSlots.sequence_and_mapping_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});Object.defineProperty(e,"tp$slots",{value:null,writable:!0})}};Sk.abstr.buildNativeClass=function(a,b){b=b||{};Sk.asserts.assert(b.hasOwnProperty("constructor"),"A constructor is required to build a native class"); +let c=b.constructor;if(a.includes(".")){var d=a.split(".");a=d.pop();d=d.join(".")}Sk.abstr.setUpInheritance(a,c,b.base,b.meta);Sk.abstr.setUpBuiltinMro(c);const e=c.prototype;Object.defineProperties(e,{tp$slots:{value:b.slots,writable:!0},tp$getsets:{value:b.getsets,writable:!0},tp$methods:{value:b.methods,writable:!0},tp$classmethods:{value:b.classmethods,writable:!0}});Sk.abstr.setUpSlots(c,b.slots||{});Sk.abstr.setUpMethods(c,b.methods);Sk.abstr.setUpGetSets(c,b.getsets);Sk.abstr.setUpClassMethods(c, +b.classmethods);void 0!==d&&(e.__module__=new Sk.builtin.str(d));Object.entries(b.proto||{}).forEach(([a,b])=>{Object.defineProperty(e,a,{value:b,writable:!0,enumerable:!(a.includes("$")||a in Object.prototype)})});Object.entries(b.flags||{}).forEach(([a,b])=>{Object.defineProperty(c,a,{value:b,writable:!0})});void 0!==Sk.builtin.str&&e.hasOwnProperty("tp$doc")&&!e.hasOwnProperty("__doc__")&&(a=e.tp$doc||null,e.__doc__="string"===typeof a?new Sk.builtin.str(a):Sk.builtin.none.none$);return c};Sk.abstr.buildIteratorClass= +function(a,b){Sk.asserts.assert(b.hasOwnProperty("constructor"),"must provide a constructor");b.slots=b.slots||{};b.slots.tp$iter=Sk.generic.selfIter;b.slots.tp$iternext=b.slots.tp$iternext||b.iternext;b.slots.tp$getattr=b.slots.tp$getattr||Sk.generic.getAttr;a=Sk.abstr.buildNativeClass(a,b);Sk.abstr.built$iterators.push(a);return a};Sk.abstr.built$iterators=[];Sk.abstr.setUpModuleMethods=function(a,b,c){Object.entries(c).forEach(([c,d])=>{d.$name=d.$name||c;b[c]=new Sk.builtin.sk_method(d,null,a)})}; +Sk.abstr.superConstructor=function(a,b,c){var d=Array.prototype.slice.call(arguments,2);a.prototype.tp$base.apply(b,d)}},function(m,q){const a=new Map;Sk.builtin.object=Sk.abstr.buildNativeClass("object",{constructor:function(){Sk.asserts.assert(this instanceof Sk.builtin.object,"bad call to object, use 'new'")},base:null,slots:{tp$new(a,b){if(a.length||b&&b.length){if(this.tp$new!==Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError("object.__new__() takes exactly one argument (the type to instantiate)"); +if(this.tp$init===Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+"() takes no arguments");}return new this.constructor},tp$init(a,b){if(a.length||b&&b.length){if(this.tp$init!==Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError("object.__init__() takes exactly one argument (the instance to initialize)");if(this.tp$new===Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+".__init__() takes exactly one argument (the instance to initialize)"); +}},tp$getattr:Sk.generic.getAttr,tp$setattr:Sk.generic.setAttr,$r(){const a=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$module);let b="";a&&Sk.builtin.checkString(a)&&(b=a.v+".");return new Sk.builtin.str("<"+b+Sk.abstr.typeName(this)+" object>")},tp$str(){return this.$r()},tp$hash(){let c=a.get(this);if(void 0!==c)return c;c=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2);a.set(this,c);return c},tp$richcompare(a,b){switch(b){case "Eq":a=this===a||Sk.builtin.NotImplemented.NotImplemented$; +break;case "NotEq":a=this.tp$richcompare(a,"Eq");a!==Sk.builtin.NotImplemented.NotImplemented$&&(a=!Sk.misceval.isTrue(a));break;default:a=Sk.builtin.NotImplemented.NotImplemented$}return a},tp$doc:"The most base type"},getsets:{__class__:{$get(){return this.ob$type},$set(a){if(void 0===a)throw new Sk.builtin.TypeError("can't delete __class__ attribute");if(!Sk.builtin.checkClass(a))throw new Sk.builtin.TypeError("__class__ must be set to a class, not '"+Sk.abstr.typeName(a)+"' object");const b=this.ob$type; +if(!(b.$isSubType(Sk.builtin.module)&&a.$isSubType(Sk.builtin.module)||void 0!==b.sk$klass&&void 0!==a.sk$klass))throw new Sk.builtin.TypeError(" __class__ assignment only supported for heap types or ModuleType subclasses");if(a.prototype.sk$builtinBase!==this.sk$builtinBase)throw new Sk.builtin.TypeError("__class__ assignment: '"+Sk.abstr.typeName(this)+"' object layout differs from '"+a.prototype.tp$name+"'");Object.setPrototypeOf(this,a.prototype)},$doc:"the object's class"}},methods:{__dir__:{$meth:function(){let a= +[];if(this.$d)if(this.$d instanceof Sk.builtin.dict)a=this.$d.sk$asarray();else for(var b in this.$d)a.push(new Sk.builtin.str(b));b=Sk.misceval.callsimArray(Sk.builtin.type.prototype.__dir__,[this.ob$type]);a.push(...b.v);b.v=a;return b},$flags:{NoArgs:!0},$doc:"Default dir() implementation."},__format__:{$meth(a){if(Sk.builtin.checkString(a)){if(a=Sk.ffi.remapToJs(a),""!==a)throw new Sk.builtin.NotImplementedError("format spec is not yet implemented");}else{if(Sk.__future__.exceptions)throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+ +Sk.abstr.typeName(a));throw new Sk.builtin.TypeError("format expects arg 2 to be string or unicode, not "+Sk.abstr.typeName(a));}return this.tp$str()},$flags:{OneArg:!0},$doc:"Default object formatter."}},proto:{valueOf:Object.prototype.valueOf,toString:function(){return this.tp$str().v},hasOwnProperty:Object.prototype.hasOwnProperty,hp$type:void 0,sk$attrError(){return"'"+this.tp$name+"' object"}}});Sk.abstr.setUpInheritance("type",Sk.builtin.type,Sk.builtin.object);Sk.abstr.setUpBuiltinMro(Sk.builtin.type)}, +function(m,q){function a(a,b,c){Sk.abstr.checkNoArgs(this.$name,b,c);a=this.call(a);return void 0===a?Sk.builtin.none.none$:a}function c(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);a=this.call(a,b[0]);return void 0===a?Sk.builtin.none.none$:a}function b(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,1,2);a=this.call(a,...b);return void 0===a?Sk.builtin.none.none$:a}function e(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,2,2);this.call(a, +b[0],b[1]);return Sk.builtin.none.none$}function f(a,b,d){a=c.call(this,a,b,d);return a===Sk.builtin.NotImplemented.NotImplemented$?a:new Sk.builtin.bool(a)}function l(a,b){return function(c,d,e){c=a.call(this,c,d,e);return b(c)}}function h(a){return function(){const b=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimArray(b,[])}}function d(a,b,c,d){return function(e){return function(){var f=e.tp$descr_get?e.tp$descr_get(this):e;f=Sk.misceval.callsimArray(f,[]);if(!b(f))throw new Sk.builtin.TypeError(a+ +" should return "+c+" (returned "+Sk.abstr.typeName(f)+")");return void 0!==d?d(f):f}}}function g(a){return function(b){const c=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimArray(c,[b])}}function n(a,b){let c=this.ob$type.$typeLookup(Sk.builtin.str.$getattribute);if(c instanceof Sk.builtin.wrapper_descriptor)return c.d$wrapped.call(this,a,b);c.tp$descr_get&&(c=c.tp$descr_get(this));const d=Sk.misceval.tryCatch(()=>Sk.misceval.callsimOrSuspendArray(c,[a]),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a; +});return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}function k(a,b,c){return function(d){return function(d,e,f){let g;void 0===e?(g=b,c=null):g=a;let h=this.ob$type.$typeLookup(new Sk.builtin.str(g));if(h instanceof Sk.builtin.wrapper_descriptor)return h.d$wrapped.call(this,d,e);h.tp$descr_get&&(h=h.tp$descr_get(this));if(void 0!==h)d=Sk.misceval.callsimOrSuspendArray(h,void 0===e?[d]:[d,e]);else{if(c)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this)+"' object "+c);throw new Sk.builtin.AttributeError(g); +}return f?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}}}function p(a,b){let c=a.ob$type;for(;c&&void 0!==c.sk$klass;)c=c.prototype.tp$base;if(c&&c.prototype.tp$setattr!==b)throw new Sk.builtin.TypeError("can't apply this "+b.$name+" to "+Sk.abstr.typeName(a)+" object");}Sk.slots=Object.create(null);m=Sk.slots;Sk.slots.__init__={$name:"__init__",$slot_name:"tp$init",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,b, +c);return Sk.misceval.chain(b,a=>{if(!Sk.builtin.checkNone(a)&&void 0!==a)throw new Sk.builtin.TypeError("__init__() should return None, not "+Sk.abstr.typeName(a));})}},$wrapper:function(a,b,c){this.call(a,b,c);return Sk.builtin.none.none$},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Initialize self. See help(type(self)) for accurate signature."};m.__new__={$name:"__new__",$slot_name:"tp$new",$slot_func:function(a){const b=function(b,c){let d=a;a.tp$descr_get&&(d=a.tp$descr_get(null, +this.constructor));return Sk.misceval.callsimOrSuspendArray(d,[this.constructor,...b],c)};b.sk$static_new=!1;return b},$wrapper:null,$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Create and return a new object."};m.__call__={$name:"__call__",$slot_name:"tp$call",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimOrSuspendArray(d,b,c)}},$wrapper:function(a,b,c){a=a.tp$call(b,c);return void 0===a?Sk.builtin.none.none$: +a},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Call self as a function."};m.__repr__={$name:"__repr__",$slot_name:"$r",$slot_func:d("__repr__",Sk.builtin.checkString,"str"),$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return repr(self)."};m.__str__={$name:"__str__",$slot_name:"tp$str",$slot_func:d("__str__",Sk.builtin.checkString,"str"),$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return str(self)."};var w=d("__hash__",Sk.builtin.checkInt,"int",a=>"number"=== +typeof a.v?a.v:a.tp$hash());m.__hash__={$name:"__hash__",$slot_name:"tp$hash",$slot_func:function(a){return a===Sk.builtin.none.none$?Sk.builtin.none.none$:w(a)},$wrapper:l(a,a=>new Sk.builtin.int_(a)),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return hash(self)."};m.__getattribute__={$name:"__getattribute__",$slot_name:"tp$getattr",$slot_func:function(a){return function(a,b){let c=this.ob$type.$typeLookup(Sk.builtin.str.$getattr);if(void 0===c)return n.call(this,a,b);const d=Sk.misceval.chain(n.call(this, +a,b),b=>Sk.misceval.tryCatch(()=>{if(void 0!==b)return b;c.tp$descr_get&&(c=c.tp$descr_get(this));return Sk.misceval.callsimOrSuspendArray(c,[a])},function(a){if(!(a instanceof Sk.builtin.AttributeError))throw a;}));return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}},$wrapper:function(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);b=b[0];if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("attribute name must be string, not '"+Sk.abstr.typeName(b)+"'");c=this.call(a,b);if(void 0===c)throw new Sk.builtin.AttributeError(Sk.abstr.typeName(a)+ +" has no attribute "+b.$jsstr());return c},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."};m.__getattr__={$name:"__getattr__",$slot_name:"tp$getattr",$slot_func:m.__getattribute__.$slot_func,$wrapper:null,$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."};m.__setattr__={$name:"__setattr__",$slot_name:"tp$setattr",$slot_func:k("__setattr__","__delattr__"),$wrapper:function(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name, +b,2,2);p(a,this);this.call(a,b[0],b[1]);return Sk.builtin.none.none$},$textsig:"($self, name, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Implement setattr(self, name, value)."};m.__delattr__={$name:"__delattr__",$slot_name:"tp$setattr",$slot_func:m.__setattr__.$slot_func,$wrapper:function(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);p(a,this);this.call(a,b[0]);return Sk.builtin.none.none$},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Implement delattr(self, name)."};m.__get__={$name:"__get__", +$slot_name:"tp$descr_get",$slot_func:function(a){return function(b,c,d){null===b&&(b=Sk.builtin.none.none$);null==c&&(c=Sk.builtin.none.none$);const e=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(e,[b,c]);return d?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)}},$wrapper:function(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,1,2);c=b[0];b=b[1];c===Sk.builtin.none.none$&&(c=null);b===Sk.builtin.none.none$&&(b=null);if(null===b&&null=== +c)throw new Sk.builtin.TypeError("__get__(None, None) is invalid");return this.call(a,c,b)},$textsig:"($self, instance, owner, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Return an attribute of instance, which is of type owner."};m.__set__={$name:"__set__",$slot_name:"tp$descr_set",$slot_func:k("__set__","__delete__"),$wrapper:e,$textsig:"($self, instance, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Set an attribute of instance to value."};m.__delete__={$name:"__delete__",$slot_name:"tp$descr_set",$slot_func:m.__set__.$slot_func, +$wrapper:c,$textsig:"($self, instance, /)",$flags:{OneArg:!0},$doc:"Delete an attribute of instance."};m.__eq__={$name:"__eq__",$slot_name:"ob$eq",$slot_func:g,$wrapper:f,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self==value."};m.__ge__={$name:"__ge__",$slot_name:"ob$ge",$slot_func:g,$wrapper:f,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self>=value."};m.__gt__={$name:"__gt__",$slot_name:"ob$gt",$slot_func:g,$wrapper:f,$textsig:"($self, value, /)",$flags:{OneArg:!0}, +$doc:"Return self>value."};m.__le__={$name:"__le__",$slot_name:"ob$le",$slot_func:g,$wrapper:f,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<=value."};m.__lt__={$name:"__lt__",$slot_name:"ob$lt",$slot_func:g,$wrapper:f,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return selfSk.misceval.callsimOrSuspendArray(c,[]),a=>{if(!(a instanceof Sk.builtin.StopIteration))throw a;});return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}},$wrapper:function(a,b,c){Sk.abstr.checkNoArgs(this.$name,b,c);return Sk.misceval.chain(a.tp$iternext(!0), +a=>{if(void 0===a)throw new Sk.builtin.StopIteration;return a})},$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Implement next(self)."};m.__len__={$name:"__len__",$slot_name:"sq$length",$slot_func:function(a){return function(b){const c=a.tp$descr_get?a.tp$descr_get(this):a;if(b)return b=Sk.misceval.callsimOrSuspendArray(c,[]),Sk.misceval.chain(b,a=>Sk.misceval.asIndexOrThrow(a));b=Sk.misceval.callsimArray(c,[]);return Sk.misceval.asIndexOrThrow(b)}},$wrapper:l(a,a=>new Sk.builtin.int_(a)),$flags:{NoArgs:!0}, +$textsig:"($self, /)",$doc:"Return len(self)."};m.__contains__={$name:"__contains__",$slot_name:"sq$contains",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,[b]);b=Sk.misceval.chain(b,a=>Sk.misceval.isTrue(a));return b.$isSuspension?c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b):b}},$wrapper:l(c,a=>new Sk.builtin.bool(a)),$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return key in self."};m.__getitem__={$name:"__getitem__", +$slot_name:"mp$subscript",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,[b]);return c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)}},$wrapper:c,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return self[key]."};m.__setitem__={$name:"__setitem__",$slot_name:"mp$ass_subscript",$slot_func:k("__setitem__","__delitem__","does not support item assignment"),$wrapper:e,$textsig:"($self, key, value, /)",$flags:{MinArgs:2, +MaxArgs:2},$doc:"Set self[key] to value."};m.__delitem__={$name:"__delitem__",$slot_name:"mp$ass_subscript",$slot_func:m.__setitem__.$slot_func,$wrapper:c,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Delete self[key]."};m.__add__={$name:"__add__",$slot_name:"nb$add",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self+value."};m.__radd__={$name:"__radd__",$slot_name:"nb$reflected_add",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0}, +$doc:"Return value+self."};m.__iadd__={$name:"__iadd__",$slot_name:"nb$inplace_add",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self+=value."};m.__sub__={$name:"__sub__",$slot_name:"nb$subtract",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self-value."};m.__rsub__={$name:"__rsub__",$slot_name:"nb$reflected_subtract",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value-self."}; +m.__imul__={$name:"__imul__",$slot_name:"nb$inplace_multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self*=value."};m.__mul__={$name:"__mul__",$slot_name:"nb$multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self*value."};m.__rmul__={$name:"__rmul__",$slot_name:"nb$reflected_multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value*self."};m.__isub__={$name:"__isub__", +$slot_name:"nb$inplace_subtract",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self-=value."};m.__mod__={$name:"__mod__",$slot_name:"nb$remainder",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self%value."};m.__rmod__={$name:"__rmod__",$slot_name:"nb$reflected_remainder",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value%self."};m.__imod__={$name:"__imod__",$slot_name:"nb$inplace_remainder", +$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement value%=self."};m.__divmod__={$name:"__divmod__",$slot_name:"nb$divmod",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(self, value)."};m.__rdivmod__={$name:"__rdivmod__",$slot_name:"nb$reflected_divmod",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(value, self)"};m.__pos__={$name:"__pos__",$slot_name:"nb$positive",$slot_func:h, +$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"+self"};m.__neg__={$name:"__neg__",$slot_name:"nb$negative",$slot_func:h,$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"-self"};m.__abs__={$name:"__abs__",$slot_name:"nb$abs",$slot_func:h,$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"abs(self)"};m.__bool__={$name:"__bool__",$slot_name:"nb$bool",$slot_func:d("__bool__",Sk.builtin.checkBool,"bool",a=>0!==a.v),$wrapper:l(a,a=>new Sk.builtin.bool(a)),$textsig:"($self, /)", +$flags:{NoArgs:!0},$doc:"self != 0"};m.__invert__={$name:"__invert__",$slot_name:"nb$invert",$slot_func:h,$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"~self"};m.__lshift__={$name:"__lshift__",$slot_name:"nb$lshift",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<>value."};m.__rrshift__={$name:"__rrshift__",$slot_name:"nb$reflected_rshift",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value>>self."};m.__ilshift__={$name:"__ilshift__",$slot_name:"nb$inplace_lshift",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self<<=value."};m.__irshift__={$name:"__irshift__", +$slot_name:"nb$inplace_rshift",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self=>>value."};m.__and__={$name:"__and__",$slot_name:"nb$and",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self&value."};m.__rand__={$name:"__rand__",$slot_name:"nb$refelcted_and",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value&self."};m.__iand__={$name:"__iand__",$slot_name:"nb$and",$slot_func:g, +$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self&=value."};m.__xor__={$name:"__xor__",$slot_name:"nb$xor",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self^value."};m.__rxor__={$name:"__rxor__",$slot_name:"nb$reflected_xor",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value^self."};m.__ixor__={$name:"__ixor__",$slot_name:"nb$inplace_xor",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)", +$flags:{OneArg:!0},$doc:"Implement self^=value."};m.__or__={$name:"__or__",$slot_name:"nb$or",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self|value."};m.__ror__={$name:"__ror__",$slot_name:"nb$reflected_or",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value|self."};m.__ior__={$name:"__ior__",$slot_name:"nb$inplace_or",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self|=value."}; +m.__int__={$name:"__int__",$slot_name:"nb$int",$slot_func:d("__int__",Sk.builtin.checkInt,"int"),$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"int(self)"};m.__float__={$name:"__float__",$slot_name:"nb$float",$slot_func:d("__float__",Sk.builtin.checkFloat,"float"),$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"float(self)"};m.__floordiv__={$name:"__floordiv__",$slot_name:"nb$floor_divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self//value."}; +m.__rfloordiv__={$name:"__rfloordiv__",$slot_name:"nb$reflected_floor_divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value//self."};m.__ifloordiv__={$name:"__ifloordiv__",$slot_name:"nb$inplace_floor_divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self//=value."};m.__truediv__={$name:"__truediv__",$slot_name:"nb$divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self/value."}; +m.__rtruediv__={$name:"__rtruediv__",$slot_name:"nb$reflected_divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value/self."};m.__itruediv__={$name:"__itruediv__",$slot_name:"nb$inplace_divide",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self/=value."};m.__index__={$name:"__index__",$slot_name:"nb$index",$slot_func:d("__index__",Sk.builtin.checkInt,"int",a=>a.v),$wrapper:l(a,a=>new Sk.builtin.int_(a)),$textsig:"($self, /)", +$flags:{NoArgs:!0},$doc:"Return self converted to an integer, if self is suitable for use as an index into a list."};m.__pow__={$name:"__pow__",$slot_name:"nb$power",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;return void 0==c?Sk.misceval.callsimArray(d,[b]):Sk.misceval.callsimArray(d,[b,c])}},$wrapper:b,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(self, value, mod)."};m.__rpow__={$name:"__rpow__",$slot_name:"nb$reflected_power", +$slot_func:m.__pow__.$slot_func,$wrapper:b,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(value, self, mod)."};m.__ipow__={$name:"__ipow__",$slot_name:"nb$inplace_power",$slot_func:m.__pow__.$slot_func,$wrapper:b,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Implement **="};m.__matmul__={$name:"__matmul__",$slot_name:"nb$matrix_multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self@value."}; +m.__rmatmul__={$name:"__rmatmul__",$slot_name:"nb$reflected_matrix_multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value@self."};m.__imatmul__={$name:"__imatmul__",$slot_name:"nb$inplace_matrix_multiply",$slot_func:g,$wrapper:c,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self@=value."};m.__long__={$name:"__long__",$slot_name:"nb$long",$slot_func:d("__long__",Sk.builtin.checkInt,"int"),$wrapper:a,$textsig:"($self, /)",$flags:{NoArgs:!0}, +$doc:"int(self)"};var A,t={next:{$name:"next",$slot_name:"tp$iternext",$slot_func:m.__next__.$slot_func,$wrapper:m.__next__.$wrapper,$textsig:m.__next__.$textsig,$flags:m.__next__.$flags},__nonzero__:{$name:"__nonzero__",$slot_name:"nb$bool",$slot_func:d("__nonzero__",Sk.builtin.checkInt,"int",a=>0!==a.v),$wrapper:l(a,a=>new Sk.builtin.bool(a)),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"x.__nonzero__() <==> x != 0"},__div__:{$name:"__div__",$slot_name:"nb$divide",$slot_func:g,$wrapper:c,$textsig:"($self, other/)", +$flags:{OneArg:!0},$doc:"x.__div__(y) <==> x/y"},__rdiv__:{$name:"__rdiv__",$slot_name:"nb$reflected_divide",$slot_func:g,$wrapper:c,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"x.__rdiv__(y) <==> x/y"},__idiv__:{$name:"__idiv__",$slot_name:"nb$inplace_divide",$slot_func:g,$wrapper:c,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"implement self /= other"}};Sk.subSlots={main_slots:Object.entries({tp$init:"__init__",tp$call:"__call__",$r:"__repr__",tp$str:"__str__",tp$getattr:"__getattribute__", +tp$setattr:["__setattr__","__delattr__"],ob$eq:"__eq__",ob$ne:"__ne__",ob$lt:"__lt__",ob$le:"__le__",ob$gt:"__gt__",ob$ge:"__ge__",tp$descr_get:"__get__",tp$descr_set:["__set__","__delete__"],tp$iter:"__iter__",tp$iternext:"__next__"}),number_slots:Object.entries({nb$abs:"__abs__",nb$negative:"__neg__",nb$positive:"__pos__",nb$int:"__int__",nb$long:"__long__",nb$float:"__float__",nb$add:"__add__",nb$reflected_add:"__radd__",nb$inplace_add:"__iadd__",nb$subtract:"__sub__",nb$reflected_subtract:"__rsub__", +nb$inplace_subtract:"__isub__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_multiply:"__imul__",nb$floor_divide:"__floordiv__",nb$reflected_floor_divide:"__rfloordiv__",nb$inplace_floor_divide:"__ifloordiv__",nb$invert:"__invert__",nb$remainder:"__mod__",nb$reflected_remainder:"__rmod__",nb$inplace_remainder:"__imod__",nb$divmod:"__divmod__",nb$reflected_divmod:"__rdivmod__",nb$power:"__pow__",nb$reflected_power:"__rpow__",nb$inplace_power:"__ipow__",nb$divide:"__truediv__",nb$reflected_divide:"__rtruediv__", +nb$inplace_divide:"__itruediv__",nb$bool:"__bool__",nb$and:"__and__",nb$reflected_and:"__rand__",nb$inplace_and:"__iand__",nb$or:"__or__",nb$reflected_or:"__ror__",nb$inplace_or:"__ior__",nb$xor:"__xor__",nb$reflected_xor:"__rxor__",nb$inplace_xor:"__ixor__",nb$lshift:"__lshift__",nb$reflected_lshift:"__rlshift__",nb$rshift:"__rshift__",nb$reflected_rshift:"__rrshift__",nb$inplace_lshift:"__ilshift__",nb$inplace_rshift:"__irshift__",nb$matrix_multiply:"__matmul__",nb$reflected_matrix_multiply:"__rmatmul__", +nb$inplace_matrix_multiply:"__imatmul__"}),sequence_and_mapping_slots:Object.entries({sq$length:"__len__",sq$contains:"__contains__",mp$subscript:"__getitem__",mp$ass_subscript:["__setitem__","__delitem__"],nb$add:"__add__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_add:"__iadd__",nb$inplace_multiply:"__imul__"})};Sk.reflectedNumberSlots={nb$add:{reflected:"nb$reflected_add"},nb$subtract:{reflected:"nb$reflected_subtract",slot:function(a){return a instanceof this.constructor? +a.nb$subtract(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$multiply:{reflected:"nb$reflected_multiply"},nb$divide:{reflected:"nb$reflected_divide",slot:function(a){return a instanceof this.constructor?a.nb$divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$floor_divide:{reflected:"nb$reflected_floor_divide",slot:function(a){return a instanceof this.constructor?a.nb$floor_divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$remainder:{reflected:"nb$reflected_remainder",slot:function(a){return a instanceof +this.constructor?a.nb$remainder(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$divmod:{reflected:"nb$reflected_divmod",slot:function(a){return a instanceof this.constructor?a.nb$divmod(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$power:{reflected:"nb$reflected_power",slot:function(a,b){return a instanceof this.constructor?a.nb$power(this,b):Sk.builtin.NotImplemented.NotImplemented$}},nb$and:{reflected:"nb$reflected_and"},nb$or:{reflected:"nb$reflected_or"},nb$xor:{reflected:"nb$reflected_xor"}, +nb$lshift:{reflected:"nb$reflected_lshift",slot:function(a){return a instanceof this.constructor?a.nb$lshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$rshift:{reflected:"nb$reflected_rshift",slot:function(a){return a instanceof this.constructor?a.nb$rshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$matrix_multiply:{reflected:"nb$reflexted_matrix_multiply",slot:function(a){return a instanceof this.constructor?a.nb$matrix_multiply(this):Sk.builtin.NotImplemented.NotImplemented$}}}; +Sk.sequenceAndMappingSlots={sq$concat:["nb$add"],sq$repeat:["nb$multiply","nb$reflected_multiply"],mp$length:["sq$length"],sq$inplace_repeat:["nb$inplace_multiply"],sq$inplace_concat:["nb$inplace_add"]};Sk.dunderToSkulpt={__repr__:"$r",__str__:"tp$str",__init__:"tp$init",__new__:"tp$new",__hash__:"tp$hash",__call__:"tp$call",__iter__:"tp$iter",__next__:"tp$iternext",__eq__:"ob$eq",__ne__:"ob$ne",__lt__:"ob$lt",__le__:"ob$le",__gt__:"ob$gt",__ge__:"ob$ge",__abs__:"nb$abs",__neg__:"nb$negative",__pos__:"nb$positive", +__int__:"nb$int",__float__:"nb$float",__add__:"nb$add",__radd__:"nb$reflected_add",__iadd__:"nb$inplace_add",__sub__:"nb$subtract",__rsub__:"nb$reflected_subtract",__isub__:"nb$inplace_subtract",__mul__:"nb$multiply",__rmul__:"nb$reflected_multiply",__imul__:"nb$inplace_multiply",__truediv__:"nb$divide",__rtruediv__:"nb$reflected_divide",__itruediv__:"nb$inplace_divide",__floordiv__:"nb$floor_divide",__rfloordiv__:"nb$reflected_floor_divide",__ifloordiv__:"nb$inplace_floor_divide",__invert__:"nb$invert", +__mod__:"nb$remainder",__rmod__:"nb$reflected_remainder",__imod__:"nb$inplace_remainder",__divmod__:"nb$divmod",__rdivmod__:"nb$reflected_divmod",__pow__:"nb$power",__rpow__:"nb$reflected_power",__ipow__:"nb$inplace_power",__bool__:"nb$bool",__long__:"nb$long",__lshift__:"nb$lshift",__rlshift__:"nb$reflected_lshift",__ilshift__:"nb$inplace_lshift",__rshift__:"nb$rshift",__rrshift__:"nb$reflected_rshift",__irshift__:"nb$inplace_rshift",__and__:"nb$and",__rand__:"nb$reflected_and",__iand__:"nb$inplace_and", +__or__:"nb$or",__ror__:"nb$reflected_or",__ior__:"nb$inplace_or",__xor__:"nb$xor",__rxor__:"nb$reflected_xor",__ixor__:"nb$inplace_xor",__matmul__:"nb$matrix_multiply",__rmatmul__:"nb$reflected_matrix_multiply",__imatmul__:"nb$inplace_matrix_multiply",__get__:"tp$descr_get",__set__:"tp$descr_set",__delete__:"tp$descr_set",__getattribute__:"tp$getattr",__getattr__:"tp$getattr",__setattr__:"tp$setattr",__delattr__:"tp$setattr",__len__:"sq$length",__contains__:"sq$contains",__getitem__:"mp$subscript", +__setitem__:"mp$ass_subscript",__delitem__:"mp$ass_subscript"};Sk.exportSymbol("Sk.setupDunderMethods",Sk.setupDunderMethods);Sk.setupDunderMethods=function(a){function b(a,b,c){for(let d=0;d"tp$iternext"===a[0]), +k=f.findIndex(a=>"nb$bool"===a[0]),l=Sk.dunderToSkulpt;if(a){l.__bool__="nb$bool";l.__next__="tp$iternext";delete l.__nonzero__;delete l.__div__;delete l.__rdiv__;delete l.__idiv__;delete l.next;for(let a in A)c[a]=A[a];for(let a in t)delete c[a];for(a=0;a")}const f={__doc__:{$get(){return this.d$def.$doc?new Sk.builtin.str(this.d$def.$doc):Sk.builtin.none.none$}},__objclass__:{$get(){return this.d$type}}, +__name__:{$get(){return new Sk.builtin.str(this.d$name)}}};m={__text_signature__:{$get(){return this.d$def.$textsig?new Sk.builtin.str(this.d$def.$textsig):Sk.builtin.none.none$}}};Sk.builtin.getset_descriptor=a("getset_descriptor",void 0,{constructor:function(a,b){this.d$def=b;this.$get=b.$get;this.$set=b.$set;this.d$type=a;this.d$name=b.$name},slots:{tp$descr_get(a,b){if(b=this.d$check(a))return b;if(void 0!==this.$get)return this.$get.call(a);throw new Sk.builtin.AttributeError("getset_descriptor '"+ +this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is not readable");},tp$descr_set(a,b){this.d$set_check(a);if(void 0!==this.$set)return this.$set.call(a,b);throw new Sk.builtin.AttributeError("attribute '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is readonly");}}});Sk.builtin.method_descriptor=a("method_descriptor","method",{constructor:function(a,b){this.d$def=b;this.$meth=b.$meth;this.d$type=a;this.d$name=b.$name||"";this.$flags=a=b.$flags||{};a.FastCall&& +a.NoKwargs?this.tp$call=this.$methodFastCallNoKwargs:a.FastCall?this.tp$call=this.$methodFastCall:a.NoArgs?this.tp$call=this.$methodCallNoArgs:a.OneArg?this.tp$call=this.$methodCallOneArg:a.NamedArgs?this.tp$call=this.$methodCallNamedArgs:void 0!==a.MinArgs?this.tp$call=this.$methodCallMinArgs:(this.func_code=b.$meth,this.tp$call=this.$defaultCall,this.$memoiseFlags=Sk.builtin.func.prototype.$memoiseFlags,this.$resolveArgs=Sk.builtin.func.prototype.$resolveArgs)},slots:{tp$call(a,b){return this.tp$call(a, +b)},tp$descr_get(a,b){let c;return(c=this.d$check(a))?c:new Sk.builtin.sk_method(this.d$def,a)}},getsets:m,proto:{$methodFastCall(a,b){const c=a.shift();this.m$checkself(c);return this.$meth.call(c,a,b)},$methodFastCallNoKwargs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoKwargs(this.d$name,b);return this.$meth.call(c,a)},$methodCallNoArgs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoArgs(this.d$name,a,b);return this.$meth.call(c)},$methodCallOneArg(a,b){const c=a.shift(); +this.m$checkself(c);Sk.abstr.checkOneArg(this.d$name,a,b);return this.$meth.call(c,a[0])},$methodCallNamedArgs(a,b){const c=a.shift();this.m$checkself(c);a=Sk.abstr.copyKeywordsToNamedArgs(this.d$name,this.$flags.NamedArgs,a,b,this.$flags.Defaults);return this.$meth.call(c,...a)},$methodCallMinArgs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoKwargs(this.d$name,b);Sk.abstr.checkArgsLen(this.d$name,a,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth.call(c,...a)},$defaultCall(a, +b){this.m$checkself(a[0]);return Sk.builtin.func.prototype.tp$call.call(this,a,b)},m$checkself(a){if(void 0===a)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");this.d$check(a)}}});Sk.builtin.wrapper_descriptor=a("wrapper_descriptor","slot wrapper",{constructor:function(a,b,c){this.d$def=b;this.d$type=a;this.d$name=c.$name=b.$name;this.d$wrapped=c},slots:{tp$descr_get(a,b){let c;return(c=this.d$check(a))?c:new Sk.builtin.method_wrapper(this, +a)},tp$call(a,b){if(1>a.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const c=a.shift();if(!c.ob$type.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(c)+"'");return this.raw$call(c,a,b)}},proto:{raw$call(a,b,c){this.d$wrapped.$name=this.d$name;return this.d$def.$wrapper.call(this.d$wrapped, +a,b,c)}}});Sk.builtin.method_wrapper=a("method_wrapper",void 0,{constructor:function(a,b){this.m$descr=a;this.m$self=b;this.d$def=a.d$def;this.d$name=a.d$name;this.d$type=a.d$type},slots:{tp$call(a,b){return this.m$descr.raw$call(this.m$self,a,b)},tp$richcompare(a,b){if("Eq"!==b&&"NotEq"!==b||!(a instanceof Sk.builtin.method_wrapper))return Sk.builtin.NotImplemented.NotImplemented$;a=this.m$self===a.m$self&&this.m$descr===a.m$descr;return"Eq"===b?a:!a},$r(){return new Sk.builtin.str("")}},getsets:{__self__:{$get(){return this.m$self}}}});Sk.builtin.classmethod_descriptor=a("classmethod_descriptor","method",{constructor:function(a,b){this.d$def=b;this.$meth=b.$meth;this.d$type=a;this.d$name=b.$name||""},slots:{tp$call(a,b){if(1>a.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const c=a.shift();return this.tp$descr_get(null, +c).tp$call(a,b)},tp$descr_get(a,b,c){if(void 0===b)if(null!==a)b=b||a.ob$type;else throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs an object or a type");if(b.ob$type!==Sk.builtin.type)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs a type not a '"+Sk.abstr.typeName(b)+"' as arg 2");if(!b.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+ +this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(b)+"' object");return new Sk.builtin.sk_method(this.d$def,b)}},getsets:m});[Sk.builtin.method_descriptor,Sk.builtin.getset_descriptor,Sk.builtin.wrapper_descriptor,Sk.builtin.method_wrapper,Sk.builtin.classmethod_descriptor].forEach(a=>{Sk.abstr.setUpSlots(a);Sk.abstr.setUpMethods(a);Sk.abstr.setUpGetSets(a)})},function(m,q){Sk.builtin.sk_method=Sk.abstr.buildNativeClass("builtin_function_or_method",{constructor:function(a, +c,b){this.$meth=a.$meth.bind(c);this.$doc=a.$doc;this.$self=c||null;this.$module=b?new Sk.builtin.str(b):null;this.$name=a.$name||a.$meth.name||"";this.m$def=a;this.$textsig=a.$textsig;this.$flags=a=a.$flags||{};a.FastCall&&a.NoKwargs?this.tp$call=this.$fastCallNoKwargs:a.FastCall?this.tp$call=this.$meth:a.NoArgs?this.tp$call=this.$callNoArgs:a.OneArg?this.tp$call=this.$callOneArg:a.NamedArgs?this.tp$call=this.$callNamedArgs:void 0!==a.MinArgs?this.tp$call=this.$callMinArgs:(this.func_code= +this.$meth,this.tp$call=this.$defaultCallMethod)},proto:{$fastCallNoKwargs(a,c){Sk.abstr.checkNoKwargs(this.$name,c);return this.$meth(a)},$callNoArgs(a,c){Sk.abstr.checkNoArgs(this.$name,a,c);return this.$meth()},$callOneArg(a,c){Sk.abstr.checkOneArg(this.$name,a,c);return this.$meth(a[0])},$callNamedArgs(a,c){a=Sk.abstr.copyKeywordsToNamedArgs(this.$name,this.$flags.NamedArgs,a,c,this.$flags.Defaults);return this.$meth(...a)},$callMinArgs(a,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name, +a,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth(...a)},$defaultCallMethod(a,c){return null!==this.$self?Sk.builtin.func.prototype.tp$call.call(this,[this.$self,...a],c):Sk.builtin.func.prototype.tp$call.call(this,a,c)},$memoiseFlags(){return Sk.builtin.func.prototype.$memoiseFlags.call(this)},$resolveArgs(){return Sk.builtin.func.prototype.$resolveArgs.call(this)}},flags:{sk$acceptable_as_base_class:!1},slots:{tp$getattr:Sk.generic.getAttr,$r(){return null===this.$self?new Sk.builtin.str(""):new Sk.builtin.str("")},tp$call(a,c){return this.tp$call(a,c)},tp$richcompare(a,c){if("Eq"!==c&&"NotEq"!==c||!(a instanceof Sk.builtin.sk_method))return Sk.builtin.NotImplemented.NotImplemented$;a=this.$self===a.$self&&this.m$def.$meth===a.m$def.$meth;return"Eq"===c?a:!a}},getsets:{__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(a){this.$module=a=a||Sk.builtin.none.none$}},__doc__:{$get(){return this.$doc? +new Sk.builtin.str(this.$doc):Sk.builtin.none.none$}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__text_signature__:{$get(){return new Sk.builtin.str(this.$textsig)}},__self__:{$get(){return this.$self||Sk.sysModules.mp$lookup(this.$module)||Sk.builtin.none.none$}}}})},function(m,q){Sk.builtin.none=Sk.abstr.buildNativeClass("NoneType",{constructor:function(){return Sk.builtin.none.none$},slots:{tp$new(a,c){Sk.abstr.checkNoArgs("NoneType",a,c);return Sk.builtin.none.none$},$r(){return new Sk.builtin.str("None")}, +tp$as_number:!0,nb$bool(){return!1}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.none.none$=Object.create(Sk.builtin.none.prototype,{v:{value:null,enumerable:!0}});Sk.builtin.NotImplemented=Sk.abstr.buildNativeClass("NotImplementedType",{constructor:function(){return Sk.builtin.NotImplemented.NotImplemented$},slots:{$r(){return new Sk.builtin.str("NotImplemented")},tp$new(a,c){Sk.abstr.checkNoArgs("NotImplementedType",a,c);return Sk.builtin.NotImplemented.NotImplemented$}},flags:{sk$acceptable_as_base_class:!1}}); +Sk.builtin.NotImplemented.NotImplemented$=Object.create(Sk.builtin.NotImplemented.prototype,{v:{value:null,enumerable:!0}})},function(m,q){const a=/^(?:(.)?([<>=\^]))?([\+\-\s])?(#)?(0)?(\d+)?(,)?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/;Sk.formatting={};let c=function(a,b,c,e){Sk.asserts.assert("string"===typeof b);if(a[6]){var d=parseInt(a[6],10);e=a[2]||(a[5]?"=":e?">":"<");let f=d-(b.length+(c?c.length:0));if(0>=f)return b;d=(a[1]||(a[5]?"0":" ")).repeat(f);switch(e){case "=":if("s"===a[9])throw new Sk.builtin.ValueError("'=' alignment not allowed in string format specifier"); +return c+d+b;case ">":return d+c+b;case "<":return c+b+d;case "^":return a=Math.floor(f/2),d.substring(0,a)+c+b+d.substring(a)}}return c+b},b=function(a,b){return b?"-":"+"===a[3]?"+":" "===a[3]?" ":""},e=function(a,e,d){Sk.asserts.assert(e instanceof Sk.builtin.int_||e instanceof Sk.builtin.lng);if(a[8])throw new Sk.builtin.ValueError("Precision not allowed in integer format");let f=e.str$(d,!1);e=e.nb$isnegative();e=b(a,e);a[4]&&(16===d?e+="0x":8===d?e+="0o":2===d&&(e+="0b"));"X"===a[9]&&(f=f.toUpperCase()); +"n"===a[9]?f=(+f).toLocaleString():a[7]&&(d=f.toString().split("."),d[0]=d[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),f=d.join("."));return c(a,f,e,!0)},f=function(f,h,d){if(!h)return f.str$(10,!0);h=h.match(a);if(!h)throw new Sk.builtin.ValueError("Invalid format specifier");var g=h[9];g||(g=d?"g":"d");if(-1==(d?"fFeEgG%":"bcdoxXnfFeEgG%").indexOf(g))throw new Sk.builtin.ValueError("Unknown format code '"+h[9]+"' for object of type '"+Sk.abstr.typeName(f)+"'");switch(g){case "d":case "n":return e(h, +f,10);case "x":case "X":return e(h,f,16);case "o":return e(h,f,8);case "b":return e(h,f,2);case "c":if(h[3])throw new Sk.builtin.ValueError("Sign not allowed with integer format specifier 'c'");if(h[4])throw new Sk.builtin.ValueError("Alternate form not allowed with integer format specifier 'c'");if(h[7])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");if(h[8])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");return c(h,String.fromCodePoint(Sk.builtin.asnum$(f)),"",!0); +case "f":case "F":case "e":case "E":case "g":case "G":{if(h[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed in float format specifier");d=Sk.builtin.asnum$(f);"string"===typeof d&&(d=Number(d));if(Infinity===d)return c(h,"inf","",!0);if(-Infinity===d)return c(h,"inf","-",!0);if(isNaN(d))return c(h,"nan","",!0);f=!1;0>d&&(d=-d,f=!0);var l=["toExponential","toFixed","toPrecision"]["efg".indexOf(g.toLowerCase())];let a=h[8]?parseInt(h[8],10):6;d=d[l](a);-1!=="EFG".indexOf(g)&&(d=d.toUpperCase()); +if("g"===g.toLowerCase()||!h[9]){if(l=d.match(/\.(\d*[1-9])?(0+)$/)){let [,a,b]=l;d=d.slice(0,a?-b.length:-(b.length+1))}-1!=d.indexOf(".")||h[9]||(d+=".0")}"e"===g.toLowerCase()&&(d=d.replace(/^([-+]?[0-9]*\.?[0-9]+[eE][-+]?)([0-9])?$/,"$10$2"));h[7]&&(g=d.toString().split("."),g[0]=g[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),d=g.join("."));return c(h,d,b(h,f),!0)}case "%":if(h[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed with format specifier '%'");f=Sk.builtin.asnum$(f);"string"=== +typeof f&&(f=Number(f));if(Infinity===f)return c(h,"inf%","",!0);if(-Infinity===f)return c(h,"inf%","-",!0);if(isNaN(f))return c(h,"nan%","",!0);g=!1;0>f&&(f=-f,g=!0);d=h[8]?parseInt(h[8],10):6;f=(100*f).toFixed(d)+"%";return c(h,f,b(h,g),!0);default:throw new Sk.builtin.ValueError("Unknown format code '"+h[9]+"'");}};Sk.formatting.mkNumber__format__=a=>function(b){if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+Sk.abstr.typeName(b));return new Sk.builtin.str(f(this, +b.$jsstr(),a))};Sk.formatting.format=function(a,b){b=b||[];const c={};for(let a=0;ac?Infinity:c;null!=(h=e.exec(a))&&kd)return new Sk.builtin.tuple([new Sk.builtin.str(""),new Sk.builtin.str(""),new Sk.builtin.str(c)])}else if(d=c.indexOf(b),0>d)return new Sk.builtin.tuple([new Sk.builtin.str(c),new Sk.builtin.str(""),new Sk.builtin.str("")]);return new Sk.builtin.tuple([new Sk.builtin.str(c.substring(0,d)),new Sk.builtin.str(b),new Sk.builtin.str(c.substring(d+b.length))])}}function f(a,b){return function(c,d){c=Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError); +if(void 0===d)d=" ";else if(d instanceof Sk.builtin.str&&1===d.sq$length())d=d.v;else throw new Sk.builtin.TypeError("the fill character must be a str of length 1");const e=this.sq$length();let f;if(e>=c)return new Sk.builtin.str(this.v);if(b)return f=d.repeat(Math.floor((c-e)/2)),f=f+this.v+f,(c-e)%2&&(f+=d),new Sk.builtin.str(f);f=d.repeat(c-e);return new Sk.builtin.str(a?f+this.v:this.v+f)}}function l(a,b,c){({start:b,end:c}=Sk.builtin.slice.startEnd$wrt(a,b,c));if(a.$hasAstralCodePoints()){const d= +a.codepoints[b];b=void 0===d?b+a.v.length-a.codepoints.length:d;c=a.codepoints[c];c=void 0===c?a.v.length:c}return{start:b,end:c}}function h(a){return function(b,c,d){b=this.get$tgt(b);({start:c,end:d}=l(this,c,d));if(d=c&&b<=d?b:-1;if(this.codepoints){d=this.sq$length();c=-1;for(let a=0;ae)return Sk.builtin.bool.false$;d=this.v.slice(d,e);if(c instanceof Sk.builtin.tuple){for(let e=Sk.abstr.iter(c),f=e.tp$iternext();void 0!==f;f=e.tp$iternext()){if(!(f instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("tuple for "+a+" must only contain str, not "+Sk.abstr.typeName(f));if(b(d,f.v))return Sk.builtin.bool.true$}return Sk.builtin.bool.false$}return new Sk.builtin.bool(b(d, +c.v))}}var g=/^[0-9!#_]/,n=Object.create(null);Sk.builtin.str=Sk.abstr.buildNativeClass("str",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.str,"bad call to str - use 'new'");if("string"!==typeof a)if(void 0===a)a="";else if(null===a)a="None";else{if(void 0!==a.tp$str)return a.tp$str();if("number"===typeof a)a=Number.isFinite(a)?String(a):String(a).replace("Infinity","inf").replace("NaN","nan");else throw new Sk.builtin.TypeError("could not convert object of type '"+Sk.abstr.typeName(a)+ +"' to str");}var b=n[a];if(void 0!==b)return b;n[a]=this;b=void 0===t[a]?a:a+"_$rw$";this.$mangled=b;this.$savedKeyHash=a.replace(g,"!$&");this.v=a},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.", +tp$new(a,b){b=b||[];if(this!==Sk.builtin.str.prototype)return this.$subtype_new(a,b);if(1>=a.length&&!b.length)return new Sk.builtin.str(a[0]);if(Sk.__future__.python3){const [c,d,e]=Sk.abstr.copyKeywordsToNamedArgs("str",["object","encoding","errors"],a,b);if(void 0===c||void 0===d&&void 0===e)return new Sk.builtin.str(c);Sk.builtin.bytes.check$encodeArgs("str",d,e);if(!Sk.builtin.checkBytes(c))throw new Sk.builtin.TypeError("decoding to str: need a bytes-like object, "+Sk.abstr.typeName(c)+" found"); +return Sk.builtin.bytes.$decode.call(c,d,e)}throw new Sk.builtin.TypeError("str takes at most one argument ("+(a.length+b.length)+" given)");},$r(){let a="'";-1!==this.v.indexOf("'")&&-1===this.v.indexOf('"')&&(a='"');const b=this.v.length;let c=a;for(let f=0;fe||57344<=e)&&!Sk.__future__.python3?c+="\\u"+("000"+e.toString(16)).slice(-4):55296<=e&& +!Sk.__future__.python3?(d=this.v.codePointAt(f),f++,d=d.toString(16),e="0000000"+d.toString(16),c=4d||127<=e&&!Sk.__future__.python3?(d=d.charCodeAt(0).toString(16),2>d.length&&(d="0"+d),c+="\\x"+d):c+=d}return new Sk.builtin.str(c+a)},tp$str(){return this.constructor===Sk.builtin.str?this:new Sk.builtin.str(this.v)},tp$iter(){return new A(this)},tp$richcompare(a,b){if(!(a instanceof Sk.builtin.str))return Sk.builtin.NotImplemented.NotImplemented$; +switch(b){case "Lt":return this.va.v;case "GtE":return this.v>=a.v}},mp$subscript(a){let b;if(Sk.misceval.isIndex(a)){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);b=this.sq$length();0>a&&(a+=b);if(0>a||a>=b)throw new Sk.builtin.IndexError("string index out of range");return this.codepoints?new Sk.builtin.str(this.v.substring(this.codepoints[a],this.codepoints[a+1])): +new Sk.builtin.str(this.v.charAt(a))}if(a instanceof Sk.builtin.slice){let c="";b=this.sq$length();this.codepoints?a.sssiter$(b,a=>{c+=this.v.substring(this.codepoints[a],this.codepoints[a+1])}):a.sssiter$(b,a=>{c+=this.v.charAt(a)});return new Sk.builtin.str(c)}throw new Sk.builtin.TypeError("string indices must be integers, not "+Sk.abstr.typeName(a));},sq$length(){return this.$hasAstralCodePoints()?this.codepoints.length:this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("cannot concatenate 'str' and '"+ +Sk.abstr.typeName(a)+"' objects");return new Sk.builtin.str(this.v+a.v)},sq$repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(a)+"'");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(a*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;let b="";for(let c=0;c' requires string as left operand not "+ +Sk.abstr.typeName(a));return-1!==this.v.indexOf(a.v)},tp$as_number:!0,nb$remainder:function(a){var b;const c=this.sk$builtinBase;a.constructor===Sk.builtin.tuple||a instanceof Sk.builtin.dict||a instanceof Sk.builtin.mappingproxy||(a=new Sk.builtin.tuple([a]));var d=0;var e=this.$jsstr().replace(/%(\([a-zA-Z0-9]+\))?([#0 +\-]+)?(\*|[0-9]+)?(\.(\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrsb%])/g,function(e,f,g,k,h,l,p){var n,B,A,u,y;k=Sk.builtin.asnum$(k);h=Sk.builtin.asnum$(h);void 0!==f&&""!==f||"%"==p||(n= +d++);""===h&&(h=void 0);var t=B=A=u=y=!1;g&&(-1!==g.indexOf("-")?u=!0:-1!==g.indexOf("0")&&(y=!0),-1!==g.indexOf("+")?B=!0:-1!==g.indexOf(" ")&&(A=!0),t=-1!==g.indexOf("#"));h&&(h=parseInt(h.substr(1),10));g=function(a,b){var c;b=Sk.builtin.asnum$(b);var d=!1;if("number"===typeof a){0>a&&(a=-a,d=!0);var e=a.toString(b)}else a instanceof Sk.builtin.float_?(e=a.str$(b,!1),2b){this.codepoints=[];for(a=0;ab&&a++;return!0}}this.codepoints=null;return!1},sk$asarray(){const a=[];if(this.$hasAstralCodePoints()){var b=this.codepoints;for(let c=0;cd)return new Sk.builtin.str(this.v.replace(b,c));let e=0;b=this.v.replace(b,a=>e++b?0:2*(a.length/2-b);b=[];for(0>=d?d=0:b.push(new Sk.builtin.str(this.v.slice(0,a[d-1])));d{if(!(a instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("sequence item "+b.length+": expected str, "+Sk.abstr.typeName(a)+" found");b.push(a.v)}),()=>new Sk.builtin.str(b.join(this.v)))},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Concatenate any number of strings.\n\nThe string whose method is called is inserted in between each given string.\nThe result is returned as a new string.\n\nExample: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'"}, +capitalize:{$meth:function(){return new Sk.builtin.str(this.v.charAt(0).toUpperCase()+this.v.slice(1).toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a capitalized version of the string.\n\nMore specifically, make the first character have upper case and the rest lower\ncase."},title:{$meth:function(){const a=this.v.replace(/[a-z][a-z]*/gi,a=>a[0].toUpperCase()+a.substr(1).toLowerCase());return new Sk.builtin.str(a)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a version of the string where each word is titlecased.\n\nMore specifically, words start with uppercased characters and all remaining\ncased characters have lower case."}, +center:{$meth:f(!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a centered string of length width.\n\nPadding is done using the specified fill character (default is a space)."},count:{$meth:function(a,b,c){a=this.get$tgt(a);({start:b,end:c}=l(this,b,c));if(c int\n\nReturn the number of non-overlapping occurrences of substring sub in\nstring S[start:end]. Optional arguments start and end are\ninterpreted as in slice notation."},expandtabs:{$meth:function(a){if(Sk.builtin.checkInt(a))a=Sk.builtin.asnum$(a);else throw new Sk.builtin.TypeError("an integer is required, got type"+Sk.abstr.typeName(a));const b=Array(a+1).join(" "),c=this.v.replace(/([^\r\n\t]*)\t/g,(c,d)=>d+b.slice(d.length%a)); +return new Sk.builtin.str(c)},$flags:{NamedArgs:["tabsize"],Defaults:[8]},$textsig:"($self, /, tabsize=8)",$doc:"Return a copy where all tab characters are expanded using spaces.\n\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(a,b,c){return new Sk.builtin.int_(this.find$left(a,b,c))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."}, +partition:{$meth:e(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original string\nand two empty strings."},index:{$meth:function(a,b,c){a=this.find$left(a,b,c);if(-1===a)throw new Sk.builtin.ValueError("substring not found"); +return new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found, \nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."},ljust:{$meth:f(!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a left-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."}, +lower:{$meth(){return new Sk.builtin.str(this.v.toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to lowercase."},lstrip:{$meth:b(/^\s+/g,a=>"^["+a+"]+"),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},rfind:{$meth(a,b,c){return new Sk.builtin.int_(this.find$right(a,b,c))},$flags:{MinArgs:1,MaxArgs:3}, +$textsig:null,$doc:"S.rfind(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(a,b,c){a=this.find$right(a,b,c);if(-1===a)throw new Sk.builtin.ValueError("substring not found");return new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."}, +rjust:{$meth:f(!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a right-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."},rstrip:{$meth:b(/\s+$/g,a=>"["+a+"]+$"),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with trailing whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},rpartition:{$meth:e(!0),$flags:{OneArg:!0}, +$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty strings\nand the original string."},splitlines:{$meth:function(a){a=Sk.misceval.isTrue(a);const b=this.v,c=[],d=b.length;var e= +0;for(let g=0;g"^["+a+"]+|["+a+"]+$"),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading and trailing whitespace remove.\n\nIf chars is given and not None, remove characters in chars instead."},swapcase:{$meth(){const a=this.v.replace(/[a-z]/gi,a=>{const b=a.toLowerCase();return b===a?a.toUpperCase():b});return new Sk.builtin.str(a)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Convert uppercase characters to lowercase and lowercase characters to uppercase."}, +upper:{$meth(){return new Sk.builtin.str(this.v.toUpperCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to uppercase."},startswith:{$meth:d("startswith",(a,b)=>0===a.indexOf(b)),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if S starts with the specified prefix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nprefix can also be a tuple of strings to try."}, +endswith:{$meth:d("endswith",(a,b)=>-1!==a.indexOf(b,a.length-b.length)),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if S ends with the specified suffix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nsuffix can also be a tuple of strings to try."},isascii:{$meth(){return new Sk.builtin.bool(/^[\x00-\x7F]*$/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)", +$doc:"Return True if all characters in the string are ASCII, False otherwise.\n\nASCII characters have code points in the range U+0000-U+007F.\nEmpty string is ASCII too."},islower:{$meth:function(){return new Sk.builtin.bool(this.v.length&&/[a-z]/.test(this.v)&&!/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is a lowercase string, False otherwise.\n\nA string is lowercase if all cased characters in the string are lowercase and\nthere is at least one cased character in the string."}, +isupper:{$meth:function(){return new Sk.builtin.bool(this.v.length&&!/[a-z]/.test(this.v)&&/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is an uppercase string, False otherwise.\n\nA string is uppercase if all cased characters in the string are uppercase and\nthere is at least one cased character in the string."},istitle:{$meth:function(){const a=this.v;let b=!1,c=!1,d;for(let e=0;e str\n\nReturn a formatted version of S, using substitutions from args and kwargs.\nThe substitutions are identified by braces ('{' and '}')."}, +__format__:{$meth:Sk.formatting.formatString,$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:"Return a formatted version of the string as described by format_spec."},__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.str(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null}}});Sk.exportSymbol("Sk.builtin.str",Sk.builtin.str);var k=/^[A-Za-z0-9]+$/,p=/([.*+?=|\\\/()\[\]\{\}^$])/g,w=/^[\s\xa0]+/;Sk.builtin.str.$py2decode=new Sk.builtin.method_descriptor(Sk.builtin.str,{$name:"decode", +$meth(a,b){const c=new Sk.builtin.bytes(this.v);return Sk.builtin.bytes.$decode.call(c,a,b)},$flags:{NamedArgs:["encoding","errors"]}});var A=Sk.abstr.buildIteratorClass("str_iterator",{constructor:function(a){this.$index=0;a.$hasAstralCodePoints()?(this.$seq=a.codepoints,this.tp$iternext=()=>{const b=this.$seq[this.$index];if(void 0!==b)return new Sk.builtin.str(a.v.substring(b,this.$seq[++this.$index]))}):(this.$seq=a.v,this.tp$iternext=()=>{const a=this.$seq[this.$index++];if(void 0!==a)return new Sk.builtin.str(a)})}, +iternext(){return this.tp$iternext()},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),t={abstract:!0,as:!0,boolean:!0,break:!0,byte:!0,case:!0,catch:!0,char:!0,class:!0,continue:!0,const:!0,debugger:!0,default:!0,delete:!0,do:!0,double:!0,else:!0,enum:!0,export:!0,extends:!0,false:!0,final:!0,finally:!0,float:!0,for:!0,function:!0,goto:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,int:!0,interface:!0,is:!0,long:!0,namespace:!0, +native:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,short:!0,static:!0,super:!0,switch:!0,synchronized:!0,this:!0,throw:!0,throws:!0,transient:!0,true:!0,try:!0,typeof:!0,use:!0,var:!0,void:!0,volatile:!0,while:!0,with:!0,constructor:!0,__defineGetter__:!0,__defineSetter__:!0,apply:!0,arguments:!0,call:!0,caller:!0,eval:!0,hasOwnProperty:!0,isPrototypeOf:!0,__lookupGetter__:!0,__lookupSetter__:!0,__noSuchMethod__:!0,propertyIsEnumerable:!0,prototype:!0,toSource:!0,toLocaleString:!0, +toString:!0,unwatch:!0,valueOf:!0,watch:!0,length:!0,name:!0};Sk.builtin.str.reservedWords_=t},function(m,q){Sk.builtin.func=Sk.abstr.buildNativeClass("function",{constructor:function(a,c,b,e){Sk.asserts.assert(this instanceof Sk.builtin.func,"builtin func should be called as a class with `new`");this.func_code=a;this.func_globals=c||null;this.$name=a.co_name&&a.co_name.v||a.name||"";this.$d=Sk.builtin.dict?new Sk.builtin.dict:void 0;this.$doc=a.co_docstring||Sk.builtin.none.none$;this.$module= +Sk.globals&&Sk.globals.__name__||Sk.builtin.none.none$;this.$qualname=a.co_qualname&&a.co_qualname.v||this.$name;if(void 0!==e)for(let a in e)b[a]=e[a];this.func_closure=b;this.$memoiseFlags();this.memoised=a.co_fastcall||null;this.tp$call=a.co_fastcall?a.bind(this):Sk.builtin.func.prototype.tp$call.bind(this)},slots:{tp$getattr:Sk.generic.getAttr,tp$descr_get(a,c){return null===a?this:new Sk.builtin.method(this,a)},$r(){return new Sk.builtin.str("")},tp$call(a,c){this.memoised|| +(this.$memoiseFlags(),this.memoised=!0);if(void 0===this.co_argcount&&void 0===this.co_varnames&&!this.co_kwargs&&!this.func_closure){if(c&&0!==c.length)throw new Sk.builtin.TypeError(this.$name+"() takes no keyword arguments");return this.func_code.apply(this.func_globals,a)}a=this.$resolveArgs(a,c);this.func_closure&&a.push(this.func_closure);return this.func_code.apply(this.func_globals,a)}},getsets:{__name__:{$get(){return new Sk.builtin.str(this.$name)},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("__name__ must be set to a string object"); +this.$name=a.$jsstr()}},__qualname__:{$get(){return new Sk.builtin.str(this.$qualname)},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("__qualname__ must be set to a string object");this.$qualname=a.$jsstr()}},__dict__:Sk.generic.getSetDict,__defaults__:{$get(){return new Sk.builtin.tuple(this.$defaults)}},__doc__:{$get(){return this.$doc},$set(a){this.$doc=a||Sk.builtin.none.none$}}},proto:{$memoiseFlags(){this.co_varnames=this.func_code.co_varnames;this.co_argcount=this.func_code.co_argcount; +void 0===this.co_argcount&&this.co_varnames&&(this.co_argcount=this.co_argcount=this.co_varnames.length);this.co_kwonlyargcount=this.func_code.co_kwonlyargcount||0;this.co_varargs=this.func_code.co_varargs;this.co_kwargs=this.func_code.co_kwargs;this.$defaults=this.func_code.$defaults||[];this.$kwdefs=this.func_code.$kwdefs||[]},$resolveArgs:function(a,c){var b=this.co_argcount;void 0===b&&(b=this.co_varnames?this.co_varnames.length:a.length);var e=this.co_varnames||[],f=this.co_kwonlyargcount||0; +let l=b+f;if(!(0!==f||this.co_kwargs||c&&0!==c.length||this.co_varargs)){if(a.length==b)return a;if(0===a.length&&this.$defaults&&this.$defaults.length===b){for(e=0;e!=this.$defaults.length;e++)a[e]=this.$defaults[e];return a}}let h;this.co_kwargs&&(h=[]);var d=a.length;let g=a.length<=b?a:a.slice(0,b);if(this.co_varargs)a=a.length>g.length?a.slice(g.length):[],g[l]=new Sk.builtin.tuple(a);else if(d>b)throw new Sk.builtin.TypeError(this.$name+"() takes "+b+" positional argument"+(1==b?"":"s")+" but "+ +d+(1==d?" was ":" were ")+" given");if(c){if(this.func_code.no_kw)throw new Sk.builtin.TypeError(this.$name+"() takes no keyword arguments");for(a=0;aa.indexOf(".")&&0>a.indexOf("e")&&0>a.indexOf("E"))return a;var b=0;if(0<=a.indexOf("e")){var c=a.substr(0,a.indexOf("e"));b=a.substr(a.indexOf("e")+1)}else 0<=a.indexOf("E")? +(c=a.substr(0,a.indexOf("e")),b=a.substr(a.indexOf("E")+1)):c=a;b=parseInt(b,10);a=c.indexOf(".");if(0>a){if(0<=b){for(;0-b?c.substr(0,c.length+b):0}c=0===a?c.substr(1):ac.length;)c+="0";return c=0>=a?0:c.substr(0,a)};Sk.exportSymbol("Sk.builtin.asnum$nofloat",Sk.builtin.asnum$nofloat);Sk.builtin.round=function(a,c){if(void 0===a)throw new Sk.builtin.TypeError("a float is required");if(!Sk.__future__.dunder_round){if(!Sk.builtin.checkNumber(a))throw new Sk.builtin.TypeError("a float is required"); +if(a.round$)return a.round$(c);throw new Sk.builtin.AttributeError(Sk.abstr.typeName(a)+" instance has no attribute '__float__'");}if(void 0!==c&&!Sk.builtin.checkNone(c)&&!Sk.misceval.isIndex(c))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(c)+"' object cannot be interpreted as an index");a=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$round);if(void 0!==a)return void 0!==c?Sk.misceval.callsimArray(a,[c]):Sk.misceval.callsimArray(a,[]);throw new Sk.builtin.TypeError("a float is required");};Sk.builtin.len= +function(a){if(a.sq$length)a=a.sq$length(!0);else throw new Sk.builtin.TypeError("object of type '"+Sk.abstr.typeName(a)+"' has no len()");return Sk.misceval.chain(a,a=>new Sk.builtin.int_(a))};Sk.builtin.min=function(a,c){let b;const e=a.length;if(!e)throw new Sk.builtin.TypeError("min expected 1 argument, got 0");const [h,d]=Sk.abstr.copyKeywordsToNamedArgs("min",["default","key"],[],c,[null,Sk.builtin.none.none$]);if(1{g=a;if(void 0!==g)return Sk.builtin.checkNone(d)?Sk.misceval.iterFor(b,a=>{Sk.misceval.richCompareBool(a,g,"Lt")&&(g=a)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,[g]),a=>Sk.misceval.iterFor(b,b=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d, +[b]),c=>{Sk.misceval.richCompareBool(c,a,"Lt")&&(g=b,a=c)})))},()=>{if(void 0===g){if(null===h)throw new Sk.builtin.ValueError("min() arg is an empty sequence");g=h}return g})};Sk.builtin.max=function(a,c){let b;const e=a.length;if(!e)throw new Sk.builtin.TypeError("max expected 1 argument, got 0");const [h,d]=Sk.abstr.copyKeywordsToNamedArgs("min",["default","key"],[],c,[null,Sk.builtin.none.none$]);if(1{g=a;if(void 0!==g)return Sk.builtin.checkNone(d)?Sk.misceval.iterFor(b,a=>{Sk.misceval.richCompareBool(a,g,"Gt")&&(g=a)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,[g]),a=>Sk.misceval.iterFor(b,b=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d, +[b]),c=>{Sk.misceval.richCompareBool(c,a,"Gt")&&(g=b,a=c)})))},()=>{if(void 0===g){if(null===h)throw new Sk.builtin.ValueError("min() arg is an empty sequence");g=h}return g})};Sk.builtin.min.co_fastcall=Sk.builtin.max.co_fastcall=1;Sk.builtin.any=function(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),function(a){if(Sk.misceval.isTrue(a))return new Sk.misceval.Break(Sk.builtin.bool.true$)}),a=>a||Sk.builtin.bool.false$)};Sk.builtin.all=function(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a), +function(a){if(!Sk.misceval.isTrue(a))return new Sk.misceval.Break(Sk.builtin.bool.false$)}),a=>a||Sk.builtin.bool.true$)};Sk.builtin.sum=function(a,c){function b(){return Sk.misceval.iterFor(d,a=>{if(a.constructor===Sk.builtin.int_)g=g.nb$add(a);else{if(a.constructor===Sk.builtin.float_)return g=g.nb$float().nb$add(a),new Sk.misceval.Break("float");g=Sk.abstr.numberBinOp(g,a,"Add");return new Sk.misceval.Break("slow")}})}function e(){return Sk.misceval.iterFor(d,a=>{if(a.constructor===Sk.builtin.float_|| +a.constructor===Sk.builtin.int_)g=g.nb$add(a);else return g=Sk.abstr.numberBinOp(g,a,"Add"),new Sk.misceval.Break("slow")})}function h(){return Sk.misceval.iterFor(d,a=>{g=Sk.abstr.numberBinOp(g,a,"Add")})}const d=Sk.abstr.iter(a);if(void 0===c)var g=new Sk.builtin.int_(0);else{if(Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("sum() can't sum strings [use ''.join(seq) instead]");g=c}a=void 0===c||c.constructor===Sk.builtin.int_?b():c.constructor===Sk.builtin.float_?"float":"slow";return Sk.misceval.chain(a, +a=>"float"===a?e():a,a=>{if("slow"===a)return h()},()=>g)};Sk.builtin.zip=function(){var a,c;if(0===arguments.length)return new Sk.builtin.list([]);var f=[];for(c=0;ca||1114112<=a)throw new Sk.builtin.ValueError("chr() arg not in range(0x110000)");}else if(0>a||256<=a)throw new Sk.builtin.ValueError("chr() arg not in range(256)");return new Sk.builtin.str(String.fromCodePoint(a))}; +Sk.builtin.unichr=function(a){if(!Sk.builtin.checkInt(a))throw new Sk.builtin.TypeError("an integer is required");a=Sk.builtin.asnum$(a);try{return new Sk.builtin.str(String.fromCodePoint(a))}catch(e){if(e instanceof RangeError)throw new Sk.builtin.ValueError(e.message);throw e;}};Sk.builtin.int2str_=function(a,c,f){let b;a.constructor===Sk.builtin.int_||a instanceof Sk.builtin.int_||(a=a.nb$index());b=a.v;let e=b.toString(c);e=a.nb$isnegative()?"-"+f+e.slice(1):f+e;2!==c&&!Sk.__future__.python3&& +(a instanceof Sk.builtin.lng||JSBI.__isBigInt(b))&&(e+="L");return new Sk.builtin.str(e)};Sk.builtin.hex=function(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("hex() argument can't be converted to hex");return Sk.builtin.int2str_(a,16,"0x")};Sk.builtin.oct=function(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("oct() argument can't be converted to hex");return Sk.__future__.octal_number_literal?Sk.builtin.int2str_(a,8,"0o"):Sk.builtin.int2str_(a,8,"0")};Sk.builtin.bin= +function(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(a)+"' object can't be interpreted as an index");return Sk.builtin.int2str_(a,2,"0b")};Sk.builtin.dir=function(a){if(void 0!==a)return a=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$dir),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(a,[]),a=>Sk.builtin.sorted(a));throw new Sk.builtin.NotImplementedError("skulpt does not yet support dir with no args");};Sk.builtin.repr=function(a){return a.$r()};Sk.builtin.ascii= +function(a){return Sk.misceval.chain(a.$r(),a=>{let b,c;for(c=0;c=d?(e=d.toString(16),2>e.length&&(e="0"+e),b+="\\x"+e):127d||57344<=d?b+="\\u"+("000"+d.toString(16)).slice(-4):55296<=d?(e=a.v.codePointAt(c),c++,e=e.toString(16),d="0000000"+e.toString(16),b=4a.tp$getattr(c,!0),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;});return Sk.misceval.chain(b,b=>{if(void 0===b){if(void 0!==f)return f;throw new Sk.builtin.AttributeError(a.sk$attrError()+" has no attribute "+Sk.misceval.objectRepr(c));}return b})};Sk.builtin.setattr=function(a,c,f){if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("attribute name must be string"); +return Sk.misceval.chain(a.tp$setattr(c,f,!0),()=>Sk.builtin.none.none$)};Sk.builtin.raw_input=function(a){var b=a?a:"";return Sk.misceval.chain(Sk.importModule("sys",!1,!0),function(a){return Sk.inputfunTakesPrompt?Sk.builtin.file.$readline(a.$d.stdin,null,b):Sk.misceval.chain(void 0,function(){return Sk.misceval.callsimOrSuspendArray(a.$d.stdout.write,[a.$d.stdout,new Sk.builtin.str(b)])},function(){return Sk.misceval.callsimOrSuspendArray(a.$d.stdin.readline,[a.$d.stdin])})})};Sk.builtin.input= +Sk.builtin.raw_input;Sk.builtin.jseval=function(a){a=Sk.global.eval(Sk.ffi.remapToJs(a));return Sk.ffi.remapToPy(a)};Sk.builtin.jsmillis=function(){console.warn("jsmillis is deprecated");return(new Date).valueOf()};Sk.builtin.eval_=function(){throw new Sk.builtin.NotImplementedError("eval is not yet implemented");};Sk.builtin.map=function(a,c){var b=[],e,h;Sk.builtin.pyCheckArgsLen("map",arguments.length,2);if(2{a=new Sk.builtin.list(a);a.list$sort(c,f,l);return a})};Sk.builtin.filter=function(a,c){var b;Sk.builtin.pyCheckArgsLen("filter",arguments.length,2,2);if(!Sk.builtin.checkIterable(c))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(c)+"' object is not iterable");var e=function(){return[]}; +var h=function(a,b){a.push(b);return a};var d=function(a){return new Sk.builtin.list(a)};c.ob$type===Sk.builtin.str?(e=function(){return new Sk.builtin.str("")},h=function(a,b){return a.sq$concat(b)},d=function(a){return a}):c.ob$type===Sk.builtin.tuple&&(d=function(a){return new Sk.builtin.tuple(a)});var g=e();var n=Sk.abstr.iter(c);for(b=n.tp$iternext();void 0!==b;b=n.tp$iternext())e=a===Sk.builtin.none.none$?new Sk.builtin.bool(b):Sk.misceval.callsimArray(a,[b]),Sk.misceval.isTrue(e)&&(g=h(g,b)); +return d(g)};Sk.builtin.hasattr=function(a,c){if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("hasattr(): attribute name must be string");const b=Sk.misceval.tryCatch(()=>a.tp$getattr(c,!0),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;});return Sk.misceval.chain(b,a=>void 0===a?Sk.builtin.bool.false$:Sk.builtin.bool.true$)};Sk.builtin.pow=function(a,c,f){if(void 0===f||Sk.builtin.checkNone(f))return Sk.abstr.numberBinOp(a,c,"Pow");if(!(Sk.builtin.checkInt(a)&&Sk.builtin.checkInt(c)&& +Sk.builtin.checkInt(f))){if(Sk.builtin.checkFloat(a)||Sk.builtin.checkComplex(a))return a.nb$power(c,f);throw new Sk.builtin.TypeError("unsupported operand type(s) for ** or pow(): '"+Sk.abstr.typeName(a)+"', '"+Sk.abstr.typeName(c)+"', '"+Sk.abstr.typeName(f)+"'");}return a.nb$power(c,f)};Sk.builtin.quit=function(a){a=(new Sk.builtin.str(a)).v;throw new Sk.builtin.SystemExit(a);};Sk.builtin.issubclass=function(a,c){if(!Sk.builtin.checkClass(a))throw new Sk.builtin.TypeError("issubclass() arg 1 must be a class"); +var b=Sk.builtin.checkClass(c);if(!(b||c instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError("issubclass() arg 2 must be a class or tuple of classes");if(b)return a.$isSubType(c)?Sk.builtin.bool.true$:Sk.builtin.bool.false$;for(b=0;b"})},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:"Common base class for all exceptions",tp$new(a,c){this.hp$type?(c=new this.constructor,Sk.builtin.BaseException.call(c)): +c=new this.constructor;c.args=new Sk.builtin.tuple(a.slice());return c},tp$init(a,c){Sk.abstr.checkNoKwargs(Sk.abstr.typeName(this),c)},$r(){let a=this.tp$name;a+="("+this.args.v.map(a=>Sk.misceval.objectRepr(a)).join(", ")+")";return new Sk.builtin.str(a)},tp$str(){return 1>=this.args.v.length?new Sk.builtin.str(this.args.v[0]):this.args.$r()}},getsets:{args:{$get(){return this.args}},__dict__:Sk.generic.getSetDict},proto:{toString(){let a=this.tp$name;a+=": "+this.tp$str().v;return a=0!==this.traceback.length? +a+(" on line "+this.traceback[0].lineno):a+" at "}}});Sk.exportSymbol("Sk.builtin.BaseException",Sk.builtin.BaseException);Sk.builtin.Exception=Sk.abstr.buildNativeClass("Exception",{constructor:function(...a){Sk.builtin.BaseException.apply(this,a)},base:Sk.builtin.BaseException});Sk.exportSymbol("Sk.builtin.Exception",Sk.builtin.Exception);Sk.builtin.AssertionError=Sk.abstr.buildNativeClass("AssertionError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception}); +Sk.exportSymbol("Sk.builtin.AssertionError",Sk.builtin.AssertionError);Sk.builtin.AttributeError=Sk.abstr.buildNativeClass("AttributeError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.ImportError=Sk.abstr.buildNativeClass("ImportError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.IndentationError=Sk.abstr.buildNativeClass("IndentationError",{constructor:function(...a){Sk.builtin.Exception.apply(this, +a)},base:Sk.builtin.Exception});Sk.builtin.IndexError=Sk.abstr.buildNativeClass("IndexError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.LookupError=Sk.abstr.buildNativeClass("LookupError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.KeyError=Sk.abstr.buildNativeClass("KeyError",{constructor:function(...a){Sk.builtin.LookupError.apply(this,a)},base:Sk.builtin.LookupError});Sk.builtin.NameError= +Sk.abstr.buildNativeClass("NameError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.UnboundLocalError=Sk.abstr.buildNativeClass("UnboundLocalError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.OverflowError=Sk.abstr.buildNativeClass("OverflowError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.SyntaxError=Sk.abstr.buildNativeClass("SyntaxError", +{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.RuntimeError=Sk.abstr.buildNativeClass("RuntimeError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.RuntimeError",Sk.builtin.RuntimeError);Sk.builtin.SuspensionError=Sk.abstr.buildNativeClass("SuspensionError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.SuspensionError", +Sk.builtin.SuspensionError);Sk.builtin.SystemExit=Sk.abstr.buildNativeClass("SystemExit",{constructor:function(...a){Sk.builtin.BaseException.apply(this,a)},base:Sk.builtin.BaseException});Sk.exportSymbol("Sk.builtin.SystemExit",Sk.builtin.SystemExit);Sk.builtin.TypeError=Sk.abstr.buildNativeClass("TypeError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.TypeError",Sk.builtin.TypeError);Sk.builtin.ValueError=Sk.abstr.buildNativeClass("ValueError", +{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.ValueError",Sk.builtin.ValueError);Sk.builtin.ZeroDivisionError=Sk.abstr.buildNativeClass("ZeroDivisionError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.TimeLimitError=Sk.abstr.buildNativeClass("TimeLimitError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.TimeLimitError", +Sk.builtin.TimeLimitError);Sk.builtin.IOError=Sk.abstr.buildNativeClass("IOError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.IOError",Sk.builtin.IOError);Sk.builtin.NotImplementedError=Sk.abstr.buildNativeClass("NotImplementedError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.NotImplementedError",Sk.builtin.NotImplementedError);Sk.builtin.NegativePowerError= +Sk.abstr.buildNativeClass("NegativePowerError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.NegativePowerError",Sk.builtin.NegativePowerError);Sk.builtin.ExternalError=Sk.abstr.buildNativeClass("ExternalError",{constructor:function(...a){this.nativeError=a[0];if(!Sk.builtin.checkString(this.nativeError)&&(a[0]=this.nativeError.toString(),a[0].startsWith("RangeError: Maximum call")))return a[0]="Maximum call stack size exceeded", +new Sk.builtin.RecursionError(...a);Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.ExternalError",Sk.builtin.ExternalError);Sk.builtin.RecursionError=Sk.abstr.buildNativeClass("RecursionError",{constructor:function(...a){Sk.builtin.RuntimeError.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.RecursionError",Sk.builtin.RecursionError);Sk.builtin.OperationError=Sk.abstr.buildNativeClass("OperationError",{constructor:function(...a){Sk.builtin.Exception.apply(this, +a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.OperationError",Sk.builtin.OperationError);Sk.builtin.SystemError=Sk.abstr.buildNativeClass("SystemError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.SystemError",Sk.builtin.SystemError);Sk.builtin.UnicodeDecodeError=Sk.abstr.buildNativeClass("UnicodeDecodeError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.UnicodeDecodeError", +Sk.builtin.UnicodeDecodeError);Sk.builtin.UnicodeEncodeError=Sk.abstr.buildNativeClass("UnicodeEncodeError",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.UnicodeEncodeError",Sk.builtin.UnicodeEncodeError);Sk.builtin.StopIteration=Sk.abstr.buildNativeClass("StopIteration",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol("Sk.builtin.StopIteration",Sk.builtin.StopIteration); +Sk.builtin.getExcInfo=function(a){return new Sk.builtin.tuple([a.ob$type||Sk.builtin.none.none$,a,Sk.builtin.none.none$])}},function(m,q){Sk.builtin.method=Sk.abstr.buildNativeClass("method",{constructor:function(a,c){Sk.asserts.assert(this instanceof Sk.builtin.method,"bad call to method constructor, use 'new'");this.im_func=a;this.im_self=c;this.im_call=a.tp$call},slots:{$r(){let a=this.im_func.tp$getattr(Sk.builtin.str.$qualname)||this.im_func.tp$getattr(Sk.builtin.str.$name);a=a&&a.v||"?";return new Sk.builtin.str("")},tp$hash(){const a=Sk.abstr.objectHash(this.im_self),c=Sk.abstr.objectHash(this.im_func);return a+c},tp$call(a,c){var b=this.im_call;if(void 0===b)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this.im_func)+"' object is not callable");a=[this.im_self,...a];return b.call(this.im_func,a,c)},tp$new(a,c){Sk.abstr.checkNoKwargs("method",c);Sk.abstr.checkArgsLen("method",a,2,2);c=a[0];a=a[1];if(!Sk.builtin.checkCallable(c))throw new Sk.builtin.TypeError("first argument must be callable"); +if(Sk.builtin.checkNone(a))throw new Sk.builtin.TypeError("self must not be None");return new Sk.builtin.method(c,a)},tp$richcompare(a,c){if("Eq"!=c&&"NotEq"!=c||!(a instanceof Sk.builtin.method))return Sk.builtin.NotImplemented.NotImplemented$;let b;try{b=Sk.misceval.richCompareBool(this.im_self,a.im_self,"Eq",!1)&&this.im_func==a.im_func}catch(e){b=!1}return"Eq"==c?b:!b},tp$descr_get(a,c){return this},tp$getattr(a,c){const b=Sk.abstr.lookupSpecial(this,a);return void 0!==b?b:this.im_func.tp$getattr(a, +c)}},getsets:{__func__:{$get(){return this.im_func}},__self__:{$get(){return this.im_self}},__doc__:{$get(){return this.im_func.tp$getattr(Sk.builtin.str.$doc)}}},flags:{sk$suitable_as_base_class:!1}})},function(m,q){function a(a){if(null!==a&&void 0!==a){if(a.nb$index)return a.nb$index();if("number"===typeof a&&Number.isInteger(a))return a}}function c(b,c){const e=a(b);if(void 0!==e)return e;c=(c||"'{tp$name}' object cannot be interpreted as an integer").replace("{tp$name}",Sk.abstr.typeName(b)); +throw new Sk.builtin.TypeError(c);}Sk.misceval={};Sk.misceval.Suspension=function(a,c,f){this.$isSuspension=!0;void 0!==a&&void 0!==c&&(this.resume=function(){return a(c.resume())});this.child=c;this.optional=void 0!==c&&c.optional;this.data=void 0===f&&void 0!==c?c.data:f};Sk.exportSymbol("Sk.misceval.Suspension",Sk.misceval.Suspension);Sk.misceval.retryOptionalSuspensionOrThrow=function(a,c){for(;a instanceof Sk.misceval.Suspension;){if(!a.optional)throw new Sk.builtin.SuspensionError(c||"Cannot call a function that blocks or suspends here"); +a=a.resume()}return a};Sk.exportSymbol("Sk.misceval.retryOptionalSuspensionOrThrow",Sk.misceval.retryOptionalSuspensionOrThrow);Sk.misceval.isIndex=function(a){return null!==a&&void 0!==a&&(void 0!==a.nb$index||"number"===typeof a&&Number.isInteger(a))};Sk.exportSymbol("Sk.misceval.isIndex",Sk.misceval.isIndex);Sk.misceval.asIndex=a;Sk.misceval.asIndexSized=function(a,e,f){f=c(a,f);if("number"===typeof f)return f;if(null==e)return JSBI.lessThan(f,JSBI.__ZERO)?-Number.MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER; +throw new e("cannot fit '"+Sk.abstr.typeName(a)+"' into an index-sized integer");};Sk.misceval.asIndexOrThrow=c;Sk.misceval.applySlice=function(a,c,f,l){return Sk.abstr.objectGetItem(a,new Sk.builtin.slice(c,f,null),l)};Sk.exportSymbol("Sk.misceval.applySlice",Sk.misceval.applySlice);Sk.misceval.assignSlice=function(a,c,f,l,h){c=new Sk.builtin.slice(c,f);return null===l?Sk.abstr.objectDelItem(a,c):Sk.abstr.objectSetItem(a,c,l,h)};Sk.exportSymbol("Sk.misceval.assignSlice",Sk.misceval.assignSlice); +Sk.misceval.arrayFromArguments=function(a){var b;if(1!=a.length)return a;var c=a[0];c instanceof Sk.builtin.set?c=c.tp$iter().$obj:c instanceof Sk.builtin.dict&&(c=Sk.builtin.dict.prototype.keys.func_code(c));if(c instanceof Sk.builtin.list||c instanceof Sk.builtin.tuple)return c.v;if(Sk.builtin.checkIterable(c)){a=[];c=Sk.abstr.iter(c);for(b=c.tp$iternext();void 0!==b;b=c.tp$iternext())a.push(b);return a}throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(c)+"' object is not iterable");};Sk.exportSymbol("Sk.misceval.arrayFromArguments", +Sk.misceval.arrayFromArguments);Sk.misceval.iterator=Sk.abstr.buildIteratorClass("iterator",{constructor:function(a,c){this.tp$iternext=c?a:function(b){let c=a();return b||!c.$isSuspension?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)}},iternext:function(a){return this.tp$iternext(a)},flags:{sk$acceptable_as_base_class:!1}});Sk.misceval.swappedOp_={Eq:"Eq",NotEq:"NotEq",Lt:"Gt",LtE:"GtE",Gt:"Lt",GtE:"LtE"};Sk.misceval.opSymbols={Eq:"==",NotEq:"!=",Lt:"<",LtE:"<=",Gt:">",GtE:">=",Is:"is",IsNot:"is not", +In_:"in",NotIn:"not in"};Sk.misceval.richCompareBool=function(a,c,f,l){Sk.asserts.assert(a.sk$object&&c.sk$object,"JS object passed to richCompareBool");var b;var d=a.ob$type;var e=c.ob$type,n=e!==d&&void 0===e.sk$baseClass&&e.$isSubType(d);if(!Sk.__future__.python3&&d!==e&&("GtE"===f||"Gt"===f||"LtE"===f||"Lt"===f)){var k=[Sk.builtin.float_,Sk.builtin.int_,Sk.builtin.lng,Sk.builtin.bool],p=[Sk.builtin.dict,Sk.builtin.enumerate,Sk.builtin.filter_,Sk.builtin.list,Sk.builtin.map_,Sk.builtin.str,Sk.builtin.tuple, +Sk.builtin.zip_];const b=k.indexOf(d),g=p.indexOf(d);k=k.indexOf(e);p=p.indexOf(e);if(a===Sk.builtin.none.none$)switch(f){case "Lt":return!0;case "LtE":return!0;case "Gt":return!1;case "GtE":return!1}if(c===Sk.builtin.none.none$)switch(f){case "Lt":return!1;case "LtE":return!1;case "Gt":return!0;case "GtE":return!0}if(-1!==b&&-1!==p)switch(f){case "Lt":return!0;case "LtE":return!0;case "Gt":return!1;case "GtE":return!1}if(-1!==g&&-1!==k)switch(f){case "Lt":return!1;case "LtE":return!1;case "Gt":return!0; +case "GtE":return!0}if(-1!==g&&-1!==p)switch(f){case "Lt":return gp;case "GtE":return g>=p}}if("Is"===f){if(d===e){if(a===c)return!0;if(d===Sk.builtin.float_)return a.v===c.v;if(d===Sk.builtin.int_)return"number"===typeof a.v&&"number"===typeof a.v?a.v===c.v:JSBI.equal(JSBI.BigInt(a.v),JSBI.BigInt(c.v))}return!1}if("IsNot"===f)return d!==e?!0:d===Sk.builtin.float_?a.v!==c.v:d===Sk.builtin.int_?"number"===typeof a.v&&"number"===typeof a.v?a.v!==c.v:JSBI.notEqual(JSBI.BigInt(a.v), +JSBI.BigInt(c.v)):a!==c;if("In"===f)return Sk.misceval.chain(Sk.abstr.sequenceContains(c,a,l),Sk.misceval.isTrue);if("NotIn"===f)return Sk.misceval.chain(Sk.abstr.sequenceContains(c,a,l),function(a){return!Sk.misceval.isTrue(a)});e={Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"};d=e[f];if(n&&(l=e[Sk.misceval.swappedOp_[f]],c[l]!==a[l]&&(b=c[l](a))!==Sk.builtin.NotImplemented.NotImplemented$)||(b=a[d](c))!==Sk.builtin.NotImplemented.NotImplemented$||!n&&(l=e[Sk.misceval.swappedOp_[f]], +(b=c[l](a))!==Sk.builtin.NotImplemented.NotImplemented$))return Sk.misceval.isTrue(b);if(!Sk.__future__.python3){if(n=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$cmp))try{b=Sk.misceval.callsimArray(n,[c]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if("Eq"===f)return 0===b;if("NotEq"===f)return 0!==b;if("Lt"===f)return 0>b;if("Gt"===f)return 0=b;if("GtE"===f)return 0<=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int"); +}catch(w){throw new Sk.builtin.TypeError("comparison did not return an int");}if(n=Sk.abstr.lookupSpecial(c,Sk.builtin.str.$cmp))try{b=Sk.misceval.callsimArray(n,[a]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if("Eq"===f)return 0===b;if("NotEq"===f)return 0!==b;if("Lt"===f)return 0b;if("LtE"===f)return 0<=b;if("GtE"===f)return 0>=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int");}catch(w){throw new Sk.builtin.TypeError("comparison did not return an int"); +}if(a===Sk.builtin.none.none$&&c===Sk.builtin.none.none$){if("Eq"===f)return a.v===c.v;if("NotEq"===f)return a.v!==c.v;if("Gt"===f)return a.v>c.v;if("GtE"===f)return a.v>=c.v;if("Lt"===f)return a.v";throw e;}};Sk.exportSymbol("Sk.misceval.objectRepr",Sk.misceval.objectRepr);Sk.misceval.opAllowsEquality=function(a){switch(a){case "LtE":case "Eq":case "GtE":return!0}return!1};Sk.exportSymbol("Sk.misceval.opAllowsEquality",Sk.misceval.opAllowsEquality);Sk.misceval.isTrue=function(a){return!0=== +a||a===Sk.builtin.bool.true$?!0:!1===a||a===Sk.builtin.bool.false$||null===a||void 0===a?!1:a.nb$bool?a.nb$bool():a.sq$length?0!==a.sq$length():!!a};Sk.exportSymbol("Sk.misceval.isTrue",Sk.misceval.isTrue);Sk.misceval.softspace_=!1;Sk.misceval.print_=function(a){Sk.misceval.softspace_&&("\n"!==a&&Sk.output(" "),Sk.misceval.softspace_=!1);var b=new Sk.builtin.str(a);return Sk.misceval.chain(Sk.importModule("sys",!1,!0),function(a){return Sk.misceval.apply(a.$d.stdout.write,void 0,void 0,void 0,[a.$d.stdout, +b])},function(){var a;(a=0===b.v.length)||(a=b.v[b.v.length-1],a=!("\n"===a||"\t"===a||"\r"===a));if(a||" "===b.v[b.v.length-1])Sk.misceval.softspace_=!0})};Sk.exportSymbol("Sk.misceval.print_",Sk.misceval.print_);Sk.misceval.loadname=function(a,c){c=c[a];if(void 0!==c)return c;c=Sk.builtins[a];if(void 0!==c)return c;throw new Sk.builtin.NameError("name '"+Sk.unfixReserved(a)+"' is not defined");};Sk.exportSymbol("Sk.misceval.loadname",Sk.misceval.loadname);Sk.misceval.call=function(a,c,f,l,h){h= +Array.prototype.slice.call(arguments,4);return Sk.misceval.apply(a,c,f,l,h)};Sk.exportSymbol("Sk.misceval.call",Sk.misceval.call);Sk.misceval.callAsync=function(a,c,f,l,h,d){d=Array.prototype.slice.call(arguments,5);return Sk.misceval.applyAsync(a,c,f,l,h,d)};Sk.exportSymbol("Sk.misceval.callAsync",Sk.misceval.callAsync);Sk.misceval.callOrSuspend=function(a,c,f,l,h){h=Array.prototype.slice.call(arguments,4);return Sk.misceval.applyOrSuspend(a,c,f,l,h)};Sk.exportSymbol("Sk.misceval.callOrSuspend", +Sk.misceval.callOrSuspend);Sk.misceval.callsim=function(a,c){c=Array.prototype.slice.call(arguments,1);return Sk.misceval.apply(a,void 0,void 0,void 0,c)};Sk.exportSymbol("Sk.misceval.callsim",Sk.misceval.callsim);Sk.misceval.callsimArray=function(a,c,f){c=c||[];return Sk.misceval.retryOptionalSuspensionOrThrow(Sk.misceval.callsimOrSuspendArray(a,c,f))};Sk.exportSymbol("Sk.misceval.callsimArray",Sk.misceval.callsimArray);Sk.misceval.callsimAsync=function(a,c,f){f=Array.prototype.slice.call(arguments, +2);return Sk.misceval.applyAsync(a,c,void 0,void 0,void 0,f)};Sk.exportSymbol("Sk.misceval.callsimAsync",Sk.misceval.callsimAsync);Sk.misceval.callsimOrSuspend=function(a,c){c=Array.prototype.slice.call(arguments,1);return Sk.misceval.applyOrSuspend(a,void 0,void 0,void 0,c)};Sk.exportSymbol("Sk.misceval.callsimOrSuspend",Sk.misceval.callsimOrSuspend);Sk.misceval.callsimOrSuspendArray=function(a,c,f){c=c||[];return void 0!==a&&a.tp$call?a.tp$call(c,f):Sk.misceval.applyOrSuspend(a,void 0,void 0,f, +c)};Sk.exportSymbol("Sk.misceval.callsimOrSuspendArray",Sk.misceval.callsimOrSuspendArray);Sk.misceval.apply=function(a,c,f,l,h){a=Sk.misceval.applyOrSuspend(a,c,f,l,h);return a instanceof Sk.misceval.Suspension?Sk.misceval.retryOptionalSuspensionOrThrow(a):a};Sk.exportSymbol("Sk.misceval.apply",Sk.misceval.apply);Sk.misceval.asyncToPromise=function(a,c){return new Promise(function(b,e){try{(function g(a){try{for(var d=function(){try{g(a.resume())}catch(t){e(t)}},f=function(b){try{a.data.result=b, +d()}catch(y){e(y)}},p=function(b){try{a.data.error=b,d()}catch(y){e(y)}};a instanceof Sk.misceval.Suspension;){var l=c&&(c[a.data.type]||c["*"]);if(l){var A=l(a);if(A){A.then(g,e);return}}if("Sk.promise"==a.data.type){a.data.promise.then(f,p);return}if("Sk.yield"==a.data.type){Sk.global.setImmediate(d);return}if("Sk.delay"==a.data.type){Sk.global.setImmediate(d);return}if(a.optional)a=a.resume();else throw new Sk.builtin.SuspensionError("Unhandled non-optional suspension of type '"+a.data.type+"'"); +}b(a)}catch(t){e(t)}})(a())}catch(h){e(h)}})};Sk.exportSymbol("Sk.misceval.asyncToPromise",Sk.misceval.asyncToPromise);Sk.misceval.applyAsync=function(a,c,f,l,h,d){return Sk.misceval.asyncToPromise(function(){return Sk.misceval.applyOrSuspend(c,f,l,h,d)},a)};Sk.exportSymbol("Sk.misceval.applyAsync",Sk.misceval.applyAsync);Sk.misceval.chain=function(a,c){for(var b=1,e=a,h,d;;){if(b==arguments.length)return e;if(e&&e.$isSuspension)break;e=arguments[b](e);b++}d=Array(arguments.length-b);for(h=0;ha[b++]},c,f)};Sk.misceval.arrayFromIterable=function(a,c){if(void 0===a)return[];if(void 0===a.hp$type&&void 0!==a.sk$asarray)return a.sk$asarray();const b=[];a=Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{b.push(a)}),()=>b);return c?a:Sk.misceval.retryOptionalSuspensionOrThrow(a)};Sk.misceval.Break=function(a){if(!(this instanceof Sk.misceval.Break))return new Sk.misceval.Break(a);this.brValue=a};Sk.exportSymbol("Sk.misceval.Break", +Sk.misceval.Break);Sk.misceval.applyOrSuspend=function(a,c,f,l,h){var b;if(null==a||a===Sk.builtin.none.none$)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(a)+"' object is not callable");"function"===typeof a&&void 0===a.tp$call&&(a=new Sk.builtin.func(a));var e=a.tp$call;if(void 0!==e){if(f)for(f=f.tp$iter(),b=f.tp$iternext();void 0!==b;b=f.tp$iternext())h.push(b);if(c)for(f=Sk.abstr.iter(c),b=f.tp$iternext();void 0!==b;b=f.tp$iternext()){if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("Function keywords must be strings"); +l.push(b.v);l.push(Sk.abstr.objectGetItem(c,b,!1))}return e.call(a,h,l,c)}e=a.__call__;if(void 0!==e)return h.unshift(a),Sk.misceval.apply(e,c,f,l,h);throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(a)+"' object is not callable");};Sk.exportSymbol("Sk.misceval.applyOrSuspend",Sk.misceval.applyOrSuspend);Sk.misceval.promiseToSuspension=function(a){var b=new Sk.misceval.Suspension;b.resume=function(){if(b.data.error)throw b.data.error;return b.data.result};b.data={type:"Sk.promise",promise:a};return b}; +Sk.exportSymbol("Sk.misceval.promiseToSuspension",Sk.misceval.promiseToSuspension);Sk.misceval.buildClass=function(a,c,f,l,h){var b=Sk.builtin.type,e={};c(a,e,void 0===h?{}:h);a.__name__&&(e.__module__=a.__name__);a=new Sk.builtin.str(f);l=new Sk.builtin.tuple(l);c=[];for(var n in e)e.hasOwnProperty(n)&&(c.push(new Sk.builtin.str(n)),c.push(e[n]));c=new Sk.builtin.dict(c);return Sk.misceval.callsimArray(b,[a,l,c])};Sk.exportSymbol("Sk.misceval.buildClass",Sk.misceval.buildClass)},function(m,q){Sk.builtin.callable_iter_= +Sk.abstr.buildIteratorClass("callable_iterator",{constructor:function(a,c){if(!Sk.builtin.checkCallable(a))throw new Sk.builtin.TypeError("iter(v, w): v must be callable");this.$callable=a;this.$sentinel=c;this.$flag=!1},iternext(a){if(!0!==this.$flag){if(a)return a=Sk.misceval.callsimOrSuspendArray(this.$callable,[]),Sk.misceval.chain(a,a=>{if(Sk.misceval.richCompareBool(a,this.$sentinel,"Eq",!0))this.$flag=!0;else return a});a=Sk.misceval.callsimArray(this.$callable,[]);if(Sk.misceval.richCompareBool(a, +this.$sentinel,"Eq",!1))this.$flag=!0;else return a}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.seq_iter_=Sk.abstr.buildIteratorClass("iterator",{constructor:function(a){this.$index=0;this.$seq=a},iternext(a){let c;c=Sk.misceval.tryCatch(()=>this.$seq.mp$subscript(new Sk.builtin.int_(this.$index++),a),a=>{if(!(a instanceof Sk.builtin.IndexError||a instanceof Sk.builtin.StopIteration))throw a;});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},methods:{__length_hint__:{$flags:{NoArgs:!0}, +$meth(){if(this.$seq.sq$length)return this.$seq.sq$length()-this.$index;throw new Sk.builtin.NotImplementedError("len is not implemented for "+Sk.abstr.typeName(this.$seq));}}},flags:{sk$acceptable_as_base_class:!1}});Sk.exportSymbol("Sk.builtin.callable_iter_",Sk.builtin.callable_iter_)},function(m,q){Sk.builtin.list=Sk.abstr.buildNativeClass("list",{constructor:function(a){void 0===a?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.list,"bad call to list, use 'new' with an Array of python objects"); +this.v=a;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$doc:"Built-in mutable sequence.\n\nIf no argument is given, the constructor creates a new empty list.\nThe argument must be an iterable if specified.",tp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs("list",c);Sk.abstr.checkArgsLen("list",a,0,1);return Sk.misceval.chain(Sk.misceval.arrayFromIterable(a[0],!0),a=>{this.v=a})},$r(){if(this.in$repr)return new Sk.builtin.str("[...]"); +this.in$repr=!0;const a=this.v.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return new Sk.builtin.str("["+a.join(", ")+"]")},tp$richcompare:Sk.generic.seqCompare,tp$iter(){return new a(this)},sq$length(){return this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.list))throw new Sk.builtin.TypeError("can only concatenate list to list");return new Sk.builtin.list(this.v.concat(a.v))},sq$contains(a){for(let b=this.tp$iter(),c=b.tp$iternext();void 0!==c;c=b.tp$iternext())if(c===a||Sk.misceval.richCompareBool(c, +a,"Eq"))return!0;return!1},sq$repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(a)+"'");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(a*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;const b=[];for(let c=0;c{b.push(this.v[a])});return new Sk.builtin.list(b)}throw new Sk.builtin.TypeError("list indices must be integers or slices, not "+Sk.abstr.typeName(a));},mp$ass_subscript(a,c){void 0===c?this.del$subscript(a):this.ass$subscript(a,c)},sq$inplace_concat(a){return a===this?(this.v.push(...this.v),this):Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.v.push(a)}), +()=>this)},sq$inplace_repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(a)+"'");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);const b=this.v.length;if(0>=a)this.v.length=0;else if(a*b>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;for(let c=1;c{this.v.push(a)}),()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Extend list by appending elements from the iterable."}, +pop:{$meth(a){a=void 0===a?this.v.length-1:Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);a=this.list$inRange(a,"pop index out of range");const b=this.v[a];this.v.splice(a,1);return b},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, index=-1, /)",$doc:"Remove and return item at index (default last).\n\nRaises IndexError if list is empty or index is out of range."},remove:{$meth(a){a=this.list$indexOf(a);if(-1===a)throw new Sk.builtin.ValueError("list.remove(x): x not in list");this.v.splice(a, +1);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:"($self, value, /)",$doc:"Remove first occurrence of value.\n\nRaises ValueError if the value is not present."},sort:{$meth(a,c){if(a.length)throw new Sk.builtin.TypeError("sort() takes no positional arguments");const [b,e]=Sk.abstr.copyKeywordsToNamedArgs("sort",["key","reverse"],a,c,[Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(void 0,b,e)},$flags:{FastCall:!0},$textsig:"($self, /, *, key=None, reverse=False)", +$doc:"Stable sort *IN PLACE*."},index:{$meth(a,c,f){if(void 0!==c&&!Sk.misceval.isIndex(c)||void 0!==f&&!Sk.misceval.isIndex(f))throw new Sk.builtin.TypeError("slice indices must be integers or have an __index__ method");c=this.list$indexOf(a,c,f);if(-1===c)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+" is not in list");return new Sk.builtin.int_(c)},$flags:{MinArgs:1,MaxArgs:3},$textsig:"($self, value, start=0, stop=sys.maxsize, /)",$doc:"Return first index of value.\n\nRaises ValueError if the value is not present."}, +count:{$meth(a){let b=0;const c=this.v.length;for(let e=0;ea&&(a+=this.v.length);if(0<=a&&a{b.push(a)});if(!Sk.builtin.checkIterable(c))throw new Sk.builtin.TypeError("must assign iterable to extended slice"); +a=Sk.misceval.arrayFromIterable(c);if(b.length!==a.length)throw new Sk.builtin.ValueError("attempt to assign sequence of size "+a.length+" to extended slice of size "+b.length);for(c=0;c{this.v.splice(a-b,1);b+=c})}}});Sk.exportSymbol("Sk.builtin.list",Sk.builtin.list);Sk.builtin.list.py2$methods={sort:{$name:"sort",$meth(a,c){const [b,e,h]=Sk.abstr.copyKeywordsToNamedArgs("sort",["cmp","key","reverse"],a,c,[Sk.builtin.none.none$, +Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(b,e,h)},$flags:{FastCall:!0},$textsig:"($self, cmp=None, key=None, reverse=False)",$doc:"Stable sort *IN PLACE*."}};var a=Sk.abstr.buildIteratorClass("list_iterator",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext:Sk.generic.iterNextWithArray,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),c=Sk.abstr.buildIteratorClass("list_reverseiterator",{constructor:function(a){this.$index= +a.v.length-1;this.$seq=a.v},iternext(){const a=this.$seq[this.$index--];if(void 0===a)this.tp$iternext=()=>{};else return a},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(m,q,a){function c(a){var b=a.replace(K,"").replace(G,"_").toLowerCase();b=F[b];return void 0===b?a:b}function b(a,b,c){if(void 0===b)b="utf-8";else if(Sk.builtin.checkString(b))b=b.$jsstr();else throw new Sk.builtin.TypeError(a+"() argument "+("bytesstr".includes(a)? +2:1)+" must be str not "+Sk.abstr.typeName(b));if(void 0===c)c="strict";else if(Sk.builtin.checkString(c))c=c.$jsstr();else throw new Sk.builtin.TypeError(a+"() argument "+("bytesstr".includes(a)?3:2)+" must be str not "+Sk.abstr.typeName(c));return{encoding:b,errors:c}}function e(a,b,d){a=a.$jsstr();b=c(b);if("strict"!==d&&"ignore"!==d&&"replace"!==d)throw new Sk.builtin.NotImplementedError("'"+d+"' error handling not implemented in Skulpt");if("ascii"===b){b=[];for(e in a){const c=a.charCodeAt(e); +if(127=a?"\\x":"\\u";a=a.toString(16);3===a.length&&(a=a.slice(1,3));return a=1===a.length?b+"0"+a:b+a}function l(a,d){({encoding:a, +errors:d}=b("decode",a,d));a=c(a);if("strict"!==d&&"ignore"!==d&&"replace"!==d)throw new Sk.builtin.NotImplementedError("'"+d+"' error handling not implemented in Skulpt");if("ascii"===a){a=this.v;var e="";for(let b=0;b=c&&bc)return new Sk.builtin.tuple([new Sk.builtin.bytes,new Sk.builtin.bytes,this])}else if(c=this.find$subleft(b,0,this.v.length),0>c)return new Sk.builtin.tuple([this,new Sk.builtin.bytes, +new Sk.builtin.bytes]);return new Sk.builtin.tuple([new Sk.builtin.bytes(this.v.subarray(0,c)),new Sk.builtin.bytes(b),new Sk.builtin.bytes(this.v.subarray(c+b.length))])}}function n(a,b){return function(c){var d=void 0===c||c===Sk.builtin.none.none$?new Uint8Array([9,10,11,12,13,32,133]):this.get$raw(c);c=0;var e=this.v.length;if(a)for(;cc&&d.includes(this.v[e-1]);)e--;d=new Uint8Array(e-c);for(e=0;e=a||32===a}function w(a){return 97<=a&&122>=a}function A(a){return 65<=a&&90>=a}function t(a){return 48<=a&&57>=a}function y(a,b){return function(){return 0===this.v.length?b?Sk.builtin.bool.true$:Sk.builtin.bool.false$:this.v.every(b=>a(b))?Sk.builtin.bool.true$:Sk.builtin.bool.false$}}function B(a,b){return function(){let c=!1;for(let d=0;d0<=a&&255>=a),"bad internal call to bytes with array"),this.v=new Uint8Array(a);else if("string"===typeof a){let b;const c=new Uint8Array(a.length),d=a.length;for(let e=0;e bytes\nbytes(string, encoding[, errors]) -> bytes\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\nbytes() -> empty bytes object\n\nConstruct an immutable array of bytes from:\n - an iterable yielding integers in range(256)\n - a text string encoded using the specified encoding\n - any object implementing the buffer API.\n - an integer", +tp$new(a,c){if(this!==Sk.builtin.bytes.prototype)return this.$subtype_new(a,c);c=c||[];if(1>=a.length&&0===+c.length)a=a[0];else{[a,d,c]=Sk.abstr.copyKeywordsToNamedArgs("bytes",[null,"pySource","errors"],a,c);({encoding:d,errors:c}=b("bytes",d,c));if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("encoding or errors without a string argument");return e(a,d,c)}if(void 0===a)return new Sk.builtin.bytes;if(void 0!==(c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$bytes))){var d=Sk.misceval.callsimOrSuspendArray(c, +[]);return Sk.misceval.chain(d,a=>{if(!Sk.builtin.checkBytes(a))throw new Sk.builtin.TypeError("__bytes__ returned non-bytes (type "+Sk.abstr.typeName(a)+")");return a})}if(Sk.misceval.isIndex(a)){d=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(0>d)throw new Sk.builtin.ValueError("negative count");return new Sk.builtin.bytes(d)}if(Sk.builtin.checkBytes(a))return new Sk.builtin.bytes(a.v);if(Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("string argument without an encoding");if(Sk.builtin.checkIterable(a)){let b= +[];d=Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{a=Sk.misceval.asIndexSized(a);if(0>a||255new Sk.builtin.bytes(b))}throw new Sk.builtin.TypeError("cannot convert '"+Sk.abstr.typeName(d)+"' object into bytes");},$r(){let a,b="'";const c=-1!==this.v.indexOf(34);let d="";for(let e=0;ea||10a||13a||126a.length||c[d]>a[d];case "GtE":return d===e&&c.length>=a.length||c[d]>=a[d]}},tp$hash(){return(new Sk.builtin.str(this.$jsstr())).tp$hash()},tp$as_sequence_or_mapping:!0,mp$subscript(a){if(Sk.misceval.isIndex(a)){let b=Sk.misceval.asIndexSized(a, +Sk.builtin.IndexError);if(void 0!==b){0>b&&(b=this.v.length+b);if(0>b||b>=this.v.length)throw new Sk.builtin.IndexError("index out of range");return new Sk.builtin.int_(this.v[b])}}else if(a instanceof Sk.builtin.slice){const b=[];a.sssiter$(this.v.length,a=>{b.push(this.v[a])});return new Sk.builtin.bytes(new Uint8Array(b))}throw new Sk.builtin.TypeError("byte indices must be integers or slices, not "+Sk.abstr.typeName(a));},sq$length(){return this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("can't concat "+ +Sk.abstr.typeName(a)+" to bytes");const b=new Uint8Array(this.v.length+a.v.length);let c;for(c=0;cNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;if(0>= +a)return new Sk.builtin.bytes;a=new Uint8Array(b);let c=0;for(;ca||255b?Infinity:b;a=Sk.builtin.checkNone(a)?null:this.get$raw(a);if(null!==a&&!a.length)throw new Sk.builtin.ValueError("empty separator");return{sep:a,maxsplit:b}},find$left:d(!1), +find$right:d(!0),find$subleft:function(a,b,c){c=c-a.length+1;let d=b;for(;da===this.v[d+b]))return d;d++}return-1},find$subright(a,b,c){let d=c-a.length;for(;d>=b;){if(a.every((a,b)=>a===this.v[d+b]))return d;d--}return-1},$subtype_new(a,b){const c=new this.constructor;a=Sk.builtin.bytes.prototype.tp$new(a,b);c.v=a.v;return c},sk$asarray(){const a=[];this.v.forEach(b=>{a.push(new Sk.builtin.int_(b))});return a}},flags:{str$encode:e,$decode:l,check$encodeArgs:b},methods:{__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.bytes(this.v))}, +$flags:{NoArgs:!0},$textsig:null,$doc:null},capitalize:{$meth(){const a=this.v.length;if(0===a)return new Sk.builtin.bytes(this.v);const b=new Uint8Array(a);let c=this.v[0];b[0]=w(c)?c-32:c;for(let d=1;d copy of B\n\nReturn a copy of B with only its first character capitalized (ASCII)\nand the rest lower-cased."},center:{$meth:k("center",!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:null, +$doc:"B.center(width[, fillchar]) -> copy of B\n\nReturn B centered in a string of length width. Padding is\ndone using the specified fill character (default is a space)."},count:{$meth(a,b,c){a=this.get$tgt(a);({start:b,end:c}=Sk.builtin.slice.startEnd$wrt(this,b,c));let d=0;if("number"===typeof a)for(;ba===this.v[e+b])&&(d++,e+=a.length-1)}return new Sk.builtin.int_(d)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.count(sub[, start[, end]]) -> int\n\nReturn the number of non-overlapping occurrences of subsection sub in\nbytes B[start:end]. Optional arguments start and end are interpreted\nas in slice notation."}, +decode:{$meth:l,$flags:{NamedArgs:["encoding","errors"]},$textsig:"($self, /, encoding='utf-8', errors='strict')",$doc:"Decode the bytes using the codec registered for encoding.\n\n encoding\n The encoding with which to decode the bytes.\n errors\n The error handling scheme to use for the handling of decoding errors.\n The default is 'strict' meaning that decoding errors raise a\n UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n as well as any other name registered with codecs.register_error that\n can handle UnicodeDecodeErrors."}, +endswith:{$meth:h("endswith",(a,b)=>{const c=a.length-b.length;return 0<=c&&b.every((b,d)=>b===a[c+d])}),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if B ends with the specified suffix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nsuffix can also be a tuple of bytes to try."},expandtabs:{$meth(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError,"an integer is required (got type {tp$nam})"); +const b=[];let c=0;for(let e=0;e copy of B\n\nReturn a copy of B where all tab characters are expanded using spaces.\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(a,b,c){return new Sk.builtin.int_(this.find$left(a, +b,c))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},hex:{$meth(){let a="";for(let b=0;b string\n\nCreate a string of hexadecimal numbers from a bytes object.\nExample: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."}, +index:{$meth:function(a,b,c){a=this.find$left(a,b,c);if(-1===a)throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the subsection is not found."},isalnum:{$meth:y(a=>t(a)|| +w(a)||A(a)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalnum() -> bool\n\nReturn True if all characters in B are alphanumeric\nand there is at least one character in B, False otherwise."},isalpha:{$meth:y(a=>65<=a&&90>=a||97<=a&&122>=a),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalpha() -> bool\n\nReturn True if all characters in B are alphabetic\nand there is at least one character in B, False otherwise."},isascii:{$meth:y(a=>0<=a&&127>=a,!0),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isascii() -> bool\n\nReturn True if B is empty or all characters in B are ASCII,\nFalse otherwise."}, +isdigit:{$meth:y(t),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isdigit() -> bool\n\nReturn True if all characters in B are digits\nand there is at least one character in B, False otherwise."},islower:{$meth:B(w,A),$flags:{NoArgs:!0},$textsig:null,$doc:"B.islower() -> bool\n\nReturn True if all cased characters in B are lowercase and there is\nat least one cased character in B, False otherwise."},isspace:{$meth:y(p),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isspace() -> bool\n\nReturn True if all characters in B are whitespace\nand there is at least one character in B, False otherwise."}, +istitle:{$meth:function(){let a=!1,b=!1;for(let c=0;c bool\n\nReturn True if B is a titlecased string and there is at least one\ncharacter in B, i.e. uppercase characters may only follow uncased\ncharacters and lowercase characters only cased ones. Return False\notherwise."}, +isupper:{$meth:B(A,w),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isupper() -> bool\n\nReturn True if all cased characters in B are uppercase and there is\nat least one cased character in B, False otherwise."},join:{$meth(a){const b=[];let c=0;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(!(a instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("sequence item "+c+": expected a bytes-like object, "+Sk.abstr.typeName(a)+" found");c++;b.length&&b.push(...this.v);b.push(...a.v)}), +()=>new Sk.builtin.bytes(new Uint8Array(b)))},$flags:{OneArg:!0},$textsig:"($self, iterable_of_bytes, /)",$doc:"Concatenate any number of bytes objects.\n\nThe bytes whose method is called is inserted in between each pair.\n\nThe result is returned as a new bytes object.\n\nExample: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'."},ljust:{$meth:k("ljust",!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.ljust(width[, fillchar]) -> copy of B\n\nReturn B left justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)."}, +lower:{$meth:E(a=>A(a)?a+32:a),$flags:{NoArgs:!0},$textsig:null,$doc:"B.lower() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to lowercase."},lstrip:{$meth:n(!0,!1),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading ASCII whitespace."},partition:{$meth:g(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original bytes\nobject and two empty bytes objects."}, +replace:{$meth(a,b,c){a=this.get$raw(a);b=this.get$raw(b);c=void 0===c?-1:Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);c=0>c?Infinity:c;const d=[];let e=0;for(var f=0;f int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(a,b,c){a=this.find$right(a,b,c);if(-1===a)throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(a)}, +$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaise ValueError when the subsection is not found."},rjust:{$meth:k("rjust",!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.rjust(width[, fillchar]) -> copy of B\n\nReturn B right justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)"}, +rpartition:{$meth:g(!0),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty bytes\nobjects and the original bytes object."},rsplit:{$meth:function(a,b){({sep:a, +maxsplit:b}=this.get$splitArgs(a,b));const c=[];let d=0,e=this.v.length;if(null!==a){for(;0<=e&&de)break;a=e+1;for(e--;0<=e&&!p(this.v[e]);)e--;c.push(new Sk.builtin.bytes(this.v.subarray(e+1,a)));d++}if(0<=e){for(;p(this.v[e]);)e--;0<=e&&c.push(new Sk.builtin.bytes(this.v.subarray(0, +e+1)))}}return new Sk.builtin.list(c.reverse())},$flags:{NamedArgs:["sep","maxsplit"],Defaults:[Sk.builtin.none.none$,-1]},$textsig:"($self, /, sep=None, maxsplit=-1)",$doc:"Return a list of the sections in the bytes, using sep as the delimiter.\n\n sep\n The delimiter according which to split the bytes.\n None (the default value) means split on ASCII whitespace characters\n (space, tab, return, newline, formfeed, vertical tab).\n maxsplit\n Maximum number of splits to do.\n -1 (the default value) means no limit.\n\nSplitting is done starting at the end of the bytes and working to the front."}, +rstrip:{$meth:n(!1,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip trailing ASCII whitespace."},split:{$meth:function(a,b){({sep:a,maxsplit:b}=this.get$splitArgs(a,b));const c=[],d=this.v.length;let e=0,f=0;if(null!==a){for(;fb.length<=a.length&&b.every((b,c)=>b===a[c])),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if B starts with the specified prefix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nprefix can also be a tuple of bytes to try."},strip:{$meth:n(!0,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading and trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading and trailing ASCII whitespace."}, +swapcase:{$meth:E(a=>A(a)?a+32:w(a)?a-32:a),$flags:{NoArgs:!0},$textsig:null,$doc:"B.swapcase() -> copy of B\n\nReturn a copy of B with uppercase ASCII characters converted\nto lowercase ASCII and vice versa."},title:{$meth(){const a=this.v.length,b=new Uint8Array(a);let c=!1;for(let d=0;d copy of B\n\nReturn a titlecased version of B, i.e. ASCII words start with uppercase\ncharacters, all remaining cased characters have lowercase."}, +upper:{$meth:E(a=>w(a)?a-32:a),$flags:{NoArgs:!0},$textsig:null,$doc:"B.upper() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to uppercase."},zfill:{$meth(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.IndexError);const b=a-this.v.length;if(0>=b)return new Sk.builtin.bytes(this.v);const c=new Uint8Array(a);let d=0,e;if(43===this.v[0]||45===this.v[0])c[0]=this.v[0],d++;c.fill(48,d,d+b);e=d;for(d+=b;d copy of B\n\nPad a numeric string B with zeros on the left, to fill a field\nof the specified width. B is never truncated."}},classmethods:{fromhex:{$meth:function(a){function b(b){for(let c=f;c b'\\\\xb9\\\\x01\\\\xef'."}}});var N=Sk.abstr.buildIteratorClass("bytes_iterator",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext(){const a= +this.$seq[this.$index++];if(void 0!==a)return new Sk.builtin.int_(a)},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.exportSymbol("Sk.builtin.bytes",Sk.builtin.bytes)},function(m,q,a){(function(a){(function(a){function b(){}function c(){}var l=String.fromCharCode,h={}.toString,d=h.call(a.SharedArrayBuffer),g=h(),n=a.Uint8Array,k=n||Array,p=n?ArrayBuffer:k,w=p.isView||function(a){return a&&"length"in a},A=h.call(p.prototype);p=c.prototype; +var t=a.TextEncoder,m=new (n?Uint16Array:k)(32);b.prototype.decode=function(a){if(!w(a)){var b=h.call(a);if(b!==A&&b!==d&&b!==g)throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");a=n?new k(a):a||[]}for(var c=b="",e=0,f=a.length|0,p=f-32|0,B,t,y=0,q=0,O,S=0,V=-1;e>4){case 15:O=a[e=e+1|0]&255;if(2!==O>>6||247>6?q+4|0:24,t=t+256&768;case 13:case 12:O=a[e=e+1|0]&255,y<<=6,y|=(t&31)<<6|O&63,q=q+7|0,e>6&&y>>q&&1114112>y?(t=y,y=y-65536|0,0<=y&&(V=(y>>10)+55296|0,t=(y&1023)+56320|0,31>S?(m[S]=V,S=S+1|0,V=-1):(O=V,V=t,t=O))):(t>>=8,e=e-t-1|0,t=65533),y=q=0,B=e<=p?32:f-e|0;default:m[S]=t;continue;case 11:case 10:case 9:case 8:}m[S]=65533}c+=l(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15],m[16],m[17],m[18],m[19],m[20], +m[21],m[22],m[23],m[24],m[25],m[26],m[27],m[28],m[29],m[30],m[31]);32>S&&(c=c.slice(0,S-32|0));if(e>>31,V=-1,c.length=g)c[e]=g;else{if(2047>=g)c[e]=192|g>>6;else{a:{if(55296<=g)if(56319>=g){var h=a.charCodeAt(d=d+1|0)|0;if(56320<=h&&57343>=h){g=(g<<10)+h-56613888|0;if(65535< +g){c[e]=240|g>>18;c[e=e+1|0]=128|g>>12&63;c[e=e+1|0]=128|g>>6&63;c[e=e+1|0]=128|g&63;continue}break a}g=65533}else 57343>=g&&(g=65533);!f&&d<<1>12;c[e=e+1|0]=128|g>>6&63}c[e=e+1|0]=128|g&63}}return n?c.subarray(0,e):c.slice(0,e)};t||(a.TextDecoder=b,a.TextEncoder=c)})("undefined"==typeof a?"undefined"==typeof self?this:self:a)}).call(this,a(0))},function(m,q){Sk.builtin.tuple=Sk.abstr.buildNativeClass("tuple",{constructor:function(a){void 0=== +a?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.tuple,"bad call to tuple, use 'new' with an Array of python objects");this.v=a;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"Built-in immutable sequence.\n\nIf no argument is given, the constructor returns an empty tuple.\nIf iterable is specified the tuple is initialized from iterable's items.\n\nIf the argument is a tuple, the return value is the same object.", +$r(){if(this.in$repr)return new Sk.builtin.str("(...)");this.in$repr=!0;let a=this.v.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;a=a.join(", ");1===this.v.length&&(a+=",");return new Sk.builtin.str("("+a+")")},tp$new(a,b){if(this!==Sk.builtin.tuple.prototype)return this.$subtype_new(a,b);Sk.abstr.checkNoKwargs("tuple",b);Sk.abstr.checkArgsLen("tuple",a,0,1);a=a[0];return void 0===a?new Sk.builtin.tuple([]):a.constructor===Sk.builtin.tuple?a:Sk.misceval.chain(Sk.misceval.arrayFromIterable(a, +!0),a=>new Sk.builtin.tuple(a))},tp$hash(){let a,b=3430008,e=1000003;const f=this.v.length;for(let c=0;ca&&(a=this.v.length+a);if(0>a||a>=this.v.length)throw new Sk.builtin.IndexError("tuple index out of range");return this.v[a]}if(a instanceof +Sk.builtin.slice){const b=[];a.sssiter$(this.v.length,a=>{b.push(this.v[a])});return new Sk.builtin.tuple(b)}throw new Sk.builtin.TypeError("tuple indices must be integers or slices, not "+Sk.abstr.typeName(a));},sq$length(){return this.v.length},sq$repeat(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(1===a&&this.constructor===Sk.builtin.tuple)return this;const b=[];for(let c=0;c{this.$seq=a.$items();this.$version=a.$version;c&&(this.$seq=this.$seq.reverse());this.tp$iternext=this.constructor.prototype.tp$iternext;return this.tp$iternext()}},iternext:b,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef}, +flags:{sk$acceptable_as_base_class:!1},proto:{next$item:l}})}function l(){if(this.$version!==this.$orig.$version){if(this.$len!==this.$orig.get$size())throw new Sk.builtin.RuntimeError("dict changed size during iteration");throw new Sk.builtin.RuntimeError("dictionary keys changed during iteration");}return this.$seq[this.$index++]}Sk.builtin.dict=Sk.abstr.buildNativeClass("dict",{constructor:function(a){void 0===a&&(a=[]);Sk.asserts.assert(Array.isArray(a)&&0===a.length%2&&this instanceof Sk.builtin.dict, +"bad call to dict constructor");this.size=0;this.entries=Object.create(null);this.buckets={};for(let b=0;b new empty dictionary\ndict(mapping) -> new dictionary initialized from a mapping object's\n (key, value) pairs\ndict(iterable) -> new dictionary initialized as if via:\n d = {}\n for k, v in iterable:\n d[k] = v\ndict(**kwargs) -> new dictionary initialized with the name=value pairs\n in the keyword argument list. For example: dict(one=1, two=2)", +$r(){if(this.in$repr)return new Sk.builtin.str("{...}");this.in$repr=!0;const a=this.$items().map(([a,b])=>Sk.misceval.objectRepr(a)+": "+Sk.misceval.objectRepr(b));this.in$repr=!1;return new Sk.builtin.str("{"+a.join(", ")+"}")},tp$new:Sk.generic.new,tp$init(a,b){return this.update$common(a,b,"dict")},tp$iter(){return new k(this)},tp$richcompare(a,b){let c;if(!(a instanceof Sk.builtin.dict)||"Eq"!==b&&"NotEq"!==b)return Sk.builtin.NotImplemented.NotImplemented$;if(a===this)c=!0;else if(this.size!== +a.size)c=!1;else{let b;c=this.$items().every(([c,d])=>{b=a.mp$lookup(c);return void 0!==b&&(b===d||Sk.misceval.richCompareBool(d,b,"Eq"))})}return"Eq"===b?c:!c},nb$or(a){if(!(a instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;const b=this.dict$copy();b.dict$merge(a);return b},nb$reflected_or(a){if(!(a instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;a=a.dict$copy();a.dict$merge(this);return a},nb$inplace_or(a){return Sk.misceval.chain(this.update$onearg(a), +()=>this)},sq$length(){return this.get$size()},sq$contains(a){return void 0!==this.mp$lookup(a)},mp$subscript(a,b){var c=this.mp$lookup(a);if(void 0!==c)return c;c=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$missing);if(void 0!==c)return a=Sk.misceval.callsimOrSuspendArray(c,[a]),b?a:Sk.misceval.retryOptionalSuspensionOrThrow(a);throw new Sk.builtin.KeyError(a);},mp$ass_subscript(a,b){if(void 0===b){if(void 0===this.pop$item(a))throw new Sk.builtin.KeyError(a);}else this.set$item(a,b)}},methods:{__reversed__:{$meth(){return new A(this)}, +$flags:{NoArgs:!0},$textsig:null,$doc:"Return a reverse iterator over the dict keys."},get:{$meth(a,b){return this.mp$lookup(a)||b||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Return the value for key if key is in the dictionary, else default."},setdefault:{$meth(b,c){let d;const e=a(b);d="string"===typeof e?this.entries[e]:this.get$bucket_item(b,e);if(void 0!==d)return d[1];c=c||Sk.builtin.none.none$;"string"===typeof e?this.entries[e]=[b,c]: +this.set$bucket_item(b,c,e);this.size++;this.$version++;return c},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Insert key with a value of default if key is not in the dictionary.\n\nReturn the value for key if key is in the dictionary, else default."},pop:{$meth(a,b){const c=this.pop$item(a);if(void 0!==c)return c[1];if(void 0!==b)return b;throw new Sk.builtin.KeyError(a);},$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\nIf key is not found, d is returned if given, otherwise KeyError is raised"}, +popitem:{$meth(){const a=this.get$size();if(0===a)throw new Sk.builtin.KeyError("popitem(): dictionary is empty");const [b,c]=this.$items()[a-1];this.pop$item(b);return new Sk.builtin.tuple([b,c])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n2-tuple; but raise KeyError if D is empty."},keys:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return new n(this)}, +$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return new g(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"},update:{$meth(a,b){return Sk.misceval.chain(this.update$common(a,b,"update"),()=>Sk.builtin.none.none$)},$flags:{FastCall:!0},$textsig:null,$doc:"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\nIf E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\nIf E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\nIn either case, this is followed by: for k in F: D[k] = F[k]"}, +clear:{$meth(){this.size=0;this.$version++;this.entries=Object.create(null);this.buckets={}},$flags:{NoArgs:!0},$textsig:null,$doc:"D.clear() -> None. Remove all items from D."},copy:{$meth(){return this.dict$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},classmethods:{fromkeys:{$meth:function(a,b){b=b||Sk.builtin.none.none$;let c=this===Sk.builtin.dict?new this:this.tp$call([],[]);return Sk.misceval.chain(c,d=>{c=d;return Sk.misceval.iterFor(Sk.abstr.iter(a),a=> +c.mp$ass_subscript(a,b,!0))},()=>c)},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($type, iterable, value=None, /)",$doc:"Create a new dictionary with keys from iterable and values set to value."}},proto:{quick$lookup:function(a){a=this.entries[a.$savedKeyHash];if(void 0!==a)return a[1]},mp$lookup:function(b){const c=a(b);b="string"===typeof c?this.entries[c]:this.get$bucket_item(b,c);if(void 0!==b)return b[1]},get$size(){return this.size},sk$asarray(){return Object.values(this.entries).map(a=>a[0])},update$common:function(a, +b,c){Sk.abstr.checkArgsLen(c,a,0,1);a=a[0];let d;void 0!==a&&(d=this.update$onearg(a));return Sk.misceval.chain(d,()=>{if(b)for(let a=0;avoid 0===a)&&delete this.buckets[b],d},set$bucket_item:function(a,b,c){let d=this.buckets[c];a=[a,b];void 0===d?(this.buckets[c]=[a],c="#"+c+"_0"):(b=d.indexOf(void 0), +-1!==b?(c="#"+c+"_"+b,d[b]=a):(c="#"+c+"_"+d.length,d.push(a)));this.entries[c]=a},pop$item:function(b){const c=a(b);"string"===typeof c?(b=this.entries[c],delete this.entries[c]):b=this.pop$bucket_item(b,c);if(void 0!==b)return this.size--,this.$version++,b},dict$merge:function(a){if(a.tp$iter===Sk.builtin.dict.prototype.tp$iter){var b=a.tp$iter();for(let c=b.tp$iternext();void 0!==c;c=b.tp$iternext()){const b=a.mp$subscript(c);this.set$item(c,b)}}else return b=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$keys), +Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,[]),b=>Sk.misceval.iterFor(Sk.abstr.iter(b),b=>Sk.misceval.chain(a.mp$subscript(b,!0),a=>{this.set$item(b,a)})))},dict$merge_seq:function(a){let b=0;return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError("cannot convert dictionary update sequence element #"+b+" to a sequence");a=Sk.misceval.arrayFromIterable(a);if(2!==a.length)throw new Sk.builtin.ValueError("dictionary update sequence element #"+ +b+" has length "+a.length+"; 2 is required");this.set$item(a[0],a[1]);b++})}}});const h={tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,$r(){if(this.in$repr)return new Sk.builtin.str("...");this.in$repr=!0;let a=Sk.misceval.arrayFromIterable(this);a=a.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+a.join(", ")+"])")},tp$richcompare(a,c){if(!(Sk.builtin.checkAnySet(a)||a instanceof d|| +a instanceof n))return Sk.builtin.NotImplemented.NotImplemented$;const e=this.sq$length(),f=a.sq$length();switch(c){case "NotEq":case "Eq":let d;this===a?d=!0:e===f&&(d=b(this,a));return"NotEq"===c?!d:d;case "Lt":return ef&&b(a,this);case "GtE":return e>=f&&b(a,this)}},nb$subtract(a){const b=c(this);return b.difference.$meth.call(b,a)},nb$and(a){const b=c(this);return b.intersection.$meth.call(b,a)},nb$or(a){const b=c(this);return b.union.$meth.call(b, +a)},nb$xor(a){const b=c(this);return b.symmetric_difference.$meth.call(b,a)},sq$length(){return this.dict.get$size()}};var d=e("dict_keys",{sq$contains(a){return void 0!==this.dict.mp$lookup(a)},tp$iter(){return new k(this.dict)}},function(){return new A(this.dict)}),g=e("dict_values",{tp$iter(){return new w(this.dict)}},function(){return new y(this.dict)}),n=e("dict_items",{sq$contains(a){if(!(a instanceof Sk.builtin.tuple&&2===a.sq$length()))return!1;var b=a.mp$subscript(new Sk.builtin.int_(0)); +a=a.mp$subscript(new Sk.builtin.int_(1));b=this.dict.mp$lookup(b);return void 0===b?!1:b===a||Sk.misceval.richCompareBool(b,a,"Eq")},tp$iter(){return new p(this.dict)}},function(){return new t(this.dict)}),k=f("dict_keyiterator",function(){const a=this.next$item();return a&&a[0]}),p=f("dict_itemiterator",function(){const a=this.next$item();return a&&new Sk.builtin.tuple([a[0],a[1]])}),w=f("dict_valueiterator",function(){const a=this.next$item();return a&&a[1]}),A=f("dict_reversekeyiterator",k.prototype.tp$iternext, +!0),t=f("dict_reverseitemiterator",p.prototype.tp$iternext,!0),y=f("dict_reversevalueiterator",w.prototype.tp$iternext,!0);Sk.builtin.dict.py2$methods={has_key:{$name:"has_key",$flags:{OneArg:!0},$meth(a){return new Sk.builtin.bool(this.sq$contains(a))},$doc:"D.has_key(k) -> True if D has a key k, else False"},keys:{$name:"keys",$meth(){return new Sk.builtin.list(this.sk$asarray())},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$name:"items", +$meth(){return new Sk.builtin.list(this.$items().map(([a,b])=>new Sk.builtin.tuple([a,b])))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$name:"values",$meth(){return new Sk.builtin.list(this.$items().map(([,a])=>a))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"}}},function(m,q){function a(a,b){Object.defineProperties(a,{entries:{get:()=>{const a=Object.create(null);Object.entries(b).forEach(([b, +c])=>{b=Sk.unfixReserved(b);b.includes("$")||(b=new Sk.builtin.str(b),a[b.$savedKeyHash]=[b,c])});return a},configurable:!0},size:{get:()=>Object.keys(b).map(a=>Sk.unfixReserved(a)).filter(a=>!a.includes("$")).length,configurable:!0}})}Sk.builtin.mappingproxy=Sk.abstr.buildNativeClass("mappingproxy",{constructor:function(c){Sk.asserts.assert(this instanceof Sk.builtin.mappingproxy,"bad call to mapping proxy, use 'new'");this.mapping=new Sk.builtin.dict([]);void 0!==c&&a(this.mapping,c)},slots:{tp$getattr:Sk.generic.getAttr, +tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$new(a,b){Sk.abstr.checkNoKwargs("mappingproxy",b);Sk.abstr.checkOneArg("mappingproxy",a,b);a=a[0];if(!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError("mappingproxy() argument must be a mapping, not "+Sk.abstr.typeName(a));b=new Sk.builtin.mappingproxy;b.mapping=a;return b},tp$richcompare(a,b){return Sk.misceval.richCompareBool(this.mapping,a,b)},tp$str(){return this.mapping.tp$str()},$r(){return new Sk.builtin.str("mappingproxy("+ +Sk.misceval.objectRepr(this.mapping)+")")},mp$subscript(a,b){return this.mapping.mp$subscript(a,b)},sq$contains(a){return this.mapping.sq$contains(a)},sq$length(){return this.mapping.sq$length()},tp$iter(){return this.mapping.tp$iter()},tp$as_number:!0,nb$or(a){a instanceof Sk.builtin.mappingproxy&&(a=a.mapping);return Sk.abstr.numberBinOp(this.mapping,a,"BitOr")},nb$reflected_or(a){a instanceof Sk.builtin.mappingproxy&&(a=a.mapping);return Sk.abstr.numberBinOp(a,this.mapping,"BitOr")},nb$inplace_or(a){throw new Sk.builtin.TypeError("'|=' is not supported by "+ +Sk.abstr.typeName(this)+"; use '|' instead");}},methods:{get:{$meth(a,b){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$get),a,b)},$flags:{FastCall:!0},$textsig:null,$doc:"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."},keys:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$keys),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$items), +[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$values),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> a set-like object providing a view on D's values"},copy:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$copy),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},proto:{str$get:new Sk.builtin.str("get"), +str$copy:new Sk.builtin.str("copy"),str$keys:new Sk.builtin.str("keys"),str$items:new Sk.builtin.str("items"),str$values:new Sk.builtin.str("values"),mp$lookup(a){return this.mapping.mp$lookup(a)}},flags:{sk$acceptable_as_base_class:!1}})},function(m,q){Sk.builtin.property=Sk.abstr.buildNativeClass("property",{constructor:function(a,c,b,e){this.prop$get=a||Sk.builtin.none.none$;this.prop$set=c||Sk.builtin.none.none$;this.prop$del=b||Sk.builtin.none.none$;this.prop$doc=e||a&&a.$doc||Sk.builtin.none.none$}, +slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(a,c){a=Sk.abstr.copyKeywordsToNamedArgs("property",["fget","fset","fdel","doc"],a,c,Array(4).fill(Sk.builtin.none.none$));this.prop$get=a[0];this.prop$set=a[1];this.prop$del=a[2];Sk.builtin.checkNone(a[3])?Sk.builtin.checkNone(a[0])||(this.prop$doc=a[0].$doc||a[3]):this.prop$doc=a[3]},tp$doc:"Property attribute.\n\n fget\n function to be used for getting an attribute value\n fset\n function to be used for setting an attribute value\n fdel\n function to be used for del'ing an attribute\n doc\n docstring\n\nTypical use is to define a managed attribute x:\n\nclass C(object):\n def getx(self): return self._x\n def setx(self, value): self._x = value\n def delx(self): del self._x\n x = property(getx, setx, delx, 'I'm the 'x' property.')\n\nDecorators make defining new properties or modifying existing ones easy:\n\nclass C(object):\n @property\n def x(self):\n 'I am the 'x' property.'\n return self._x\n @x.setter\n def x(self, value):\n self._x = value\n @x.deleter\n def x(self):\n del self._x", +tp$descr_get(a,c){if(null===a)return this;if(void 0===this.prop$get)throw new Sk.builtin.AttributeError("unreadable attribute");return Sk.misceval.callsimOrSuspendArray(this.prop$get,[a])},tp$descr_set(a,c){let b;b=null==c?this.prop$del:this.prop$set;if(Sk.builtin.checkNone(b))throw new Sk.builtin.AttributeError("can't "+(null==c?"delete":"set")+" attribute");if(!b.tp$call)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(b)+"' is not callable");return null==c?b.tp$call([a]):b.tp$call([a,c])}}, +methods:{getter:{$meth(a){return new Sk.builtin.property(a,this.prop$set,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},setter:{$meth(a){return new Sk.builtin.property(this.prop$get,a,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},deleter:{$meth(a){return new Sk.builtin.property(this.prop$get,this.prop$set,a,this.prop$doc)},$flags:{OneArg:!0}}},getsets:{fget:{$get(){return this.prop$get}},fset:{$get(){return this.prop$set}},fdel:{$get(){return this.prop$del}},__doc__:{$get(){return this.prop$doc}, +$set(a){this.prop$doc=a=a||Sk.builtin.none.none$}}}});Sk.builtin.classmethod=Sk.abstr.buildNativeClass("classmethod",{constructor:function(a){this.cm$callable=a;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs("classmethod",c);Sk.abstr.checkArgsLen("classmethod",a,1,1);this.cm$callable=a[0]},tp$doc:"classmethod(function) -> method\n\nConvert a function to be a class method.\n\nA class method receives the class as implicit first argument,\njust like an instance method receives the instance.\nTo declare a class method, use this idiom:\n\n class C:\n @classmethod\n def f(cls, arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\nIf a class method is called for a derived class, the derived class\nobject is passed as the implied first argument.\n\nClass methods are different than C++ or Java static methods.\nIf you want those, see the staticmethod builtin.", +tp$descr_get(a,c){const b=this.cm$callable;if(void 0===b)throw new Sk.builtin.RuntimeError("uninitialized classmethod object");void 0===c&&(c=a.ob$type);return(a=b.tp$descr_get)?a.call(b,c):new Sk.builtin.method(b,c)}},getsets:{__func__:{$get(){return this.cm$callable}},__dict__:Sk.generic.getSetDict}});Sk.builtin.staticmethod=Sk.abstr.buildNativeClass("staticmethod",{constructor:function(a){this.sm$callable=a;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new, +tp$init(a,c){Sk.abstr.checkNoKwargs("staticmethod",c);Sk.abstr.checkArgsLen("staticmethod",a,1,1);this.sm$callable=a[0]},tp$doc:"staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n class C:\n @staticmethod\n def f(arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.", +tp$descr_get(a,c){if(void 0===this.sm$callable)throw new Sk.builtin.RuntimeError("uninitialized staticmethod object");return this.sm$callable}},getsets:{__func__:{$get(){return this.sm$callable}},__dict__:Sk.generic.getSetDict}})},function(m,q){function a(a,b){return function(c){if(c instanceof Sk.builtin.int_){let e=this.v;c=c.v;if("number"===typeof e&&"number"===typeof c){const b=a(e,c);if(d(b))return new Sk.builtin.int_(b)}e=n(e);c=n(c);return new Sk.builtin.int_(b(e,c))}return Sk.builtin.NotImplemented.NotImplemented$}} +function c(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if("number"===typeof d&&"number"===typeof c)return a(d,c);d=n(d);c=n(c);return b(d,c)}return Sk.builtin.NotImplemented.NotImplemented$}}function b(a,b){return function(){const c=this.v;return"number"===typeof c?new Sk.builtin.int_(a(c)):new Sk.builtin.int_(b(c))}}function e(){return new Sk.builtin.int_(this.v)}function f(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if(0===c)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero"); +if("number"===typeof d&&"number"===typeof c)return new Sk.builtin.int_(a(d,c));d=n(d);c=n(c);return new Sk.builtin.int_(JSBI.numberIfSafe(b(d,c)))}return Sk.builtin.NotImplemented.NotImplemented$}}function l(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if(0===d)return new Sk.builtin.int_(this.v);if("number"===typeof c){if(0>c)throw new Sk.builtin.ValueError("negative shift count");if("number"===typeof d){const b=a(d,c);if(void 0!==b)return new Sk.builtin.int_(b)}c=JSBI.BigInt(c)}else if(JSBI.lessThan(JSBI.BigInt(0)))throw new Sk.builtin.ValueError("negative shift count"); +d=n(d);return new Sk.builtin.int_(b(d,c))}return Sk.builtin.NotImplemented.NotImplemented$}}function h(a,b){return function(c){if(c instanceof Sk.builtin.int_){var d=this.v;c=c.v;if("number"===typeof d&&"number"===typeof c)return d=a(d,c),0>d&&(d+=4294967296),new Sk.builtin.int_(d);d=n(d);c=n(c);return new Sk.builtin.int_(JSBI.numberIfSafe(b(d,c)))}return Sk.builtin.NotImplemented.NotImplemented$}}function d(a){return a<=Number.MAX_SAFE_INTEGER&&a>=-Number.MAX_SAFE_INTEGER}function g(a){return a<= +Number.MAX_SAFE_INTEGER&&a>=-Number.MAX_SAFE_INTEGER?+a:JSBI.BigInt(a)}function n(a){return"number"===typeof a?JSBI.BigInt(a):a}Sk.builtin.int_=Sk.abstr.buildNativeClass("int",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.int_,"bad call to int use 'new'");let b;if("number"===typeof a||JSBI.__isBigInt(a))b=a;else if(void 0===a)b=0;else if("string"===typeof a)b=g(a);else{if(a.nb$int)return a.nb$int();Sk.asserts.fail("bad argument to int constructor")}this.v=b},slots:{tp$as_number:!0, +tp$doc:"int(x=0) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4", +$r(){return new Sk.builtin.str(this.v.toString())},tp$hash(){const a=this.v;return"number"===typeof a?a:JSBI.toNumber(JSBI.remainder(a,JSBI.__MAX_SAFE))},tp$new(a,b){1===a.length+(b?b.length:0)?(b=a[0],a=Sk.builtin.none.none$):(a=Sk.abstr.copyKeywordsToNamedArgs("int",[null,"base"],a,b,[new Sk.builtin.int_(0),Sk.builtin.none.none$]),b=a[0],a=a[1]);a=a!==Sk.builtin.none.none$?Sk.misceval.asIndexOrThrow(a):null;if(b instanceof Sk.builtin.str)null===a&&(a=10),b=new Sk.builtin.int_(Sk.str2number(b.v, +a));else{if(null!==a)throw new Sk.builtin.TypeError("int() can't convert non-string with explicit base");if(b.nb$int)b=b.nb$int();else if(a=Sk.abstr.lookupSpecial(b,Sk.builtin.str.$trunc)){a=Sk.misceval.callsimArray(a,[]);if(!Sk.builtin.checkInt(a))throw new Sk.builtin.TypeError(Sk.builtin.str.$trunc.$jsstr()+" returned non-Integral (type "+Sk.abstr.typeName(b)+")");b=new Sk.builtin.int_(a.v)}else throw new Sk.builtin.TypeError("int() argument must be a string, a bytes-like object or a number, not '"+ +Sk.abstr.typeName(b)+"'");}if(this===Sk.builtin.int_.prototype)return b;a=new this.constructor;a.v=b.v;return a},tp$getattr:Sk.generic.getAttr,ob$eq:c((a,b)=>a==b,JSBI.equal),ob$ne:c((a,b)=>a!=b,JSBI.notEqual),ob$gt:c((a,b)=>a>b,JSBI.greaterThan),ob$ge:c((a,b)=>a>=b,JSBI.greaterThanOrEqual),ob$lt:c((a,b)=>aa<=b,JSBI.lessThanOrEqual),nb$int:e,nb$index(){return this.v},nb$float(){var a=this.v;if("number"===typeof a)return new Sk.builtin.float_(a);a=parseFloat(JSBI.toNumber(a)); +if(Infinity===a||-Infinity===a)throw new Sk.builtin.OverflowError("int too large to convert to float");return new Sk.builtin.float_(a)},nb$isnegative(){const a=this.v;return"number"===typeof a?0>a:JSBI.lessThan(a,JSBI.__ZERO)},nb$ispositive(){const a=this.v;return"number"===typeof a?0>a:JSBI.greaterThanOrEqual(a,JSBI.__ZERO)},nb$bool(){return 0!==this.v},nb$positive:e,nb$negative:b(a=>-a,JSBI.unaryMinus),nb$add:a((a,b)=>a+b,(a,b)=>JSBI.numberIfSafe(JSBI.add(a,b))),nb$subtract:a((a,b)=>a-b,(a,b)=> +JSBI.numberIfSafe(JSBI.subtract(a,b))),nb$multiply:a((a,b)=>a*b,JSBI.multiply),nb$divide(a){return Sk.__future__.division?this.nb$float().nb$divide(a):this.nb$floor_divide(a)},nb$floor_divide:f((a,b)=>Math.floor(a/b),JSBI.divide),nb$remainder:f((a,b)=>a-Math.floor(a/b)*b,JSBI.remainder),nb$divmod(a){const b=this.nb$floor_divide(a);a=this.nb$remainder(a);return b===Sk.builtin.NotImplemented.NotImplemented$||a===Sk.builtin.NotImplemented.NotImplemented$?Sk.builtin.NotImplemented.NotImplemented$:new Sk.builtin.tuple([b, +a])},nb$and:h((a,b)=>a&b,JSBI.bitwiseAnd),nb$or:h((a,b)=>a|b,JSBI.bitwiseOr),nb$xor:h((a,b)=>a^b,JSBI.bitwiseXor),nb$abs:b(Math.abs,a=>JSBI.lessThan(a,JSBI.__ZERO)?JSBI.unaryMinus(a):a),nb$lshift:l((a,b)=>{if(53>b&&(a=2*a*p[b],d(a)))return a},JSBI.leftShift),nb$rshift:l((a,b)=>{const c=a>>b;return 0c?c&Math.pow(2,32-b)-1:c},(a,b)=>JSBI.numberIfSafe(JSBI.signedRightShift(a,b))),nb$invert:b(a=>~a,JSBI.bitwiseNot),nb$power(a,b){let c;void 0!==b&&Sk.builtin.checkNone(b)&&(b=void 0);if(a instanceof +Sk.builtin.int_&&(void 0===b||b instanceof Sk.builtin.int_)){let e=this.v,f=a.v;if("number"===typeof e&&"number"===typeof f){const a=Math.pow(e,f);if(d(a)&&(c=0>f?new Sk.builtin.float_(a):new Sk.builtin.int_(a),void 0===b))return c}if(void 0!==b){if(a.nb$isnegative())throw new Sk.builtin.ValueError("pow() 2nd argument cannot be negative when 3rd argument specified");if(0===b.v)throw new Sk.builtin.ValueError("pow() 3rd argument cannot be 0");return void 0!==c?c.nb$remainder(b):new Sk.builtin.int_(JSBI.powermod(n(e), +n(f),n(b.v)))}return new Sk.builtin.int_(JSBI.exponentiate(n(e),n(f)))}return Sk.builtin.NotImplemented.NotImplemented$},nb$long(){return new Sk.builtin.lng(this.v)}},getsets:{real:{$get:e,$doc:"the real part of a complex number"},imag:{$get(){return new Sk.builtin.int_(0)},$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:"Returns self, the complex conjugate of any int."},bit_length:{$meth(){return new Sk.builtin.int_(Sk.builtin.bin(this).sq$length()- +2)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Number of bits necessary to represent self in binary.\n\n>>> bin(37)\n'0b100101'\n>>> (37).bit_length()\n6"},to_bytes:{$meth(){throw new Sk.builtin.NotImplementedError("Not yet implemented in Skulpt");},$flags:{FastCall:!0},$textsig:"($self, /, length, byteorder, *, signed=False)",$doc:"Return an array of bytes representing an integer.\n\n length\n Length of bytes object to use. An OverflowError is raised if the\n integer is not representable with the given number of bytes.\n byteorder\n The byte order used to represent the integer. If byteorder is 'big',\n the most significant byte is at the beginning of the byte array. If\n byteorder is 'little', the most significant byte is at the end of the\n byte array. To request the native byte order of the host system, use\n `sys.byteorder' as the byte order value.\n signed\n Determines whether two's complement is used to represent the integer.\n If signed is False and a negative integer is given, an OverflowError\n is raised."}, +__trunc__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:"Truncating an Integral returns itself."},__floor__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:"Flooring an Integral returns itself."},__ceil__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:"Ceiling of an Integral returns itself."},__round__:{$meth(a){return this.round$(a)},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"Rounding an Integral returns itself.\nRounding with an ndigits argument also returns an integer."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.int_(this.v)])}, +$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!1),$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:Sk.builtin.none.none$}},proto:{str$(a,b){a=void 0===a||10===a?this.v.toString():this.v.toString(a);b||void 0===b||"-"===a[0]&&(a=a.substring(1));return a},round$(a){a=void 0===a?0:Sk.misceval.asIndexSized(a);var b=this.v,c=Math.pow(10,-a);if(0JSBI.toNumber(e)?b=JSBI.multiply(JSBI.multiply(d,a),c):JSBI.multiply(JSBI.multiply(JSBI.add(d,JSBI.BigInt(1),a),c));return new Sk.builtin.int_(b)}}}});Sk.exportSymbol("Sk.builtin.int_",Sk.builtin.int_);const k=/_(?=[^_])/g;Sk.str2number= +function(a,b){var c=a,e=!1,f;a=a.replace(/^\s+|\s+$/g,"");"-"===a.charAt(0)&&(e=!0,a=a.substring(1));"+"===a.charAt(0)&&(a=a.substring(1));if(null===b||void 0===b)b=10;if((2>b||36= 2 and <= 36");"string"===typeof b&&(b=Number(b));if("0x"===a.substring(0,2).toLowerCase())if(16===b||0===b)a=a.substring(2),b=16;else{if(34>b)throw new Sk.builtin.ValueError("invalid literal for int() with base "+b+": '"+c+"'");}else if("0b"===a.substring(0, +2).toLowerCase())if(2===b||0===b)a=a.substring(2),b=2;else{if(12>b)throw new Sk.builtin.ValueError("invalid literal for int() with base "+b+": '"+c+"'");}else if("0o"===a.substring(0,2).toLowerCase())if(8===b||0===b)a=a.substring(2),b=8;else{if(25>b)throw new Sk.builtin.ValueError("invalid literal for int() with base "+b+": '"+c+"'");}else if("0"===a.charAt(0)){if("0"===a)return 0;if(8===b||0===b)b=8}0===b&&(b=10);if(-1!==a.indexOf("_")){if(-1!==a.indexOf("__"))throw new Sk.builtin.ValueError("invalid literal for int() with base "+ +b+": '"+c+"'");a=10!==b?a.replace(k,""):a.charAt(0)+a.substring(1).replace(k,"")}if(0===a.length)throw new Sk.builtin.ValueError("invalid literal for int() with base "+b+": '"+c+"'");for(f=0;f=g?h=g-48:65<=g&&90>=g?h=g-65+10:97<=g&&122>=g&&(h=g-97+10);if(h>=b)throw new Sk.builtin.ValueError("invalid literal for int() with base "+b+": '"+c+"'");}e&&(a="-"+a);h=parseInt(a,b);if(d(h))return h;c=!1;"-"===a[0]&&(c=!0,a=a.substring(1));b=JSBI.BigInt(b); +e=JSBI.BigInt(1);f=JSBI.BigInt(0);for(g=a.length-1;0<=g;g--)h=a.charCodeAt(g),48<=h&&57>=h?h-=48:65<=h&&90>=h?h=h-65+10:97<=h&&122>=h&&(h=h-97+10),h=JSBI.multiply(JSBI.BigInt(h),e),f=JSBI.add(f,h),e=JSBI.multiply(e,b);c&&(f=JSBI.multiply(f,JSBI.BigInt(-1)));return a=f};Sk.builtin.int_.py2$methods={};Sk.longFromStr=function(a,b){if(Sk.__future__.python3)return new Sk.builtin.int_(g(a));a=Sk.str2number(a,b);return new Sk.builtin.lng(a)};Sk.exportSymbol("Sk.longFromStr",Sk.longFromStr);Sk.builtin.int_.withinThreshold= +d;Sk.builtin.int_.stringToNumberOrBig=g;const p=[.5,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,0x800000000000,281474976710656,562949953421312,0x4000000000000, +0x8000000000000,4503599627370496,9007199254740992];Sk.builtin.lng=Sk.abstr.buildNativeClass("long",{base:Sk.builtin.int_,constructor:function(a){Sk.builtin.int_.call(this,a)},slots:{$r(){return new Sk.builtin.str(this.v.toString()+"L")},tp$as_number:!0,nb$negative(){return new Sk.builtin.lng(w.nb$negative.call(this).v)},nb$positive(){return new Sk.builtin.lng(w.nb$positive.call(this).v)}}});const w=Sk.builtin.int_.prototype},function(m,q){const a=Sk.builtin.int_.prototype;Sk.builtin.bool=Sk.abstr.buildNativeClass("bool", +{constructor:function(a){return Sk.misceval.isTrue(a)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},base:Sk.builtin.int_,slots:{tp$doc:"bool(x) -> bool\n\nReturns True when the argument x is true, False otherwise.\nThe builtins True and False are the only two instances of the class bool.\nThe class bool is a subclass of the class int, and cannot be subclassed.",tp$new(a,b){Sk.abstr.checkNoKwargs("bool",b);Sk.abstr.checkArgsLen("bool",a,0,1);return new Sk.builtin.bool(a[0])},$r(){return this.v?this.str$True: +this.str$False},tp$as_number:!0,nb$and(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v&c.v):a.nb$and.call(this,c)},nb$or(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v|c.v):a.nb$or.call(this,c)},nb$xor(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v^c.v):a.nb$xor.call(this,c)}},flags:{sk$acceptable_as_base_class:!1},methods:{__format__:{$meth(){return this.$r()},$flags:{OneArg:!0}}},proto:{str$False:new Sk.builtin.str("False"),str$True:new Sk.builtin.str("True")}}); +Sk.exportSymbol("Sk.builtin.bool",Sk.builtin.bool);Sk.builtin.bool.true$=Object.create(Sk.builtin.bool.prototype,{v:{value:1,enumerable:!0}});Sk.builtin.bool.false$=Object.create(Sk.builtin.bool.prototype,{v:{value:0,enumerable:!0}})},function(m,q){function a(){return new Sk.builtin.float_(this.v)}function c(a){return function(b){const c=this.v;b=b.v;if("number"!==typeof b)if(JSBI.__isBigInt(b)){if(b=parseFloat(JSBI.toNumber(b)),Infinity==b||-Infinity==b)throw new Sk.builtin.OverflowError("int too large to convert to float"); +}else return Sk.builtin.NotImplemented.NotImplemented$;return a(c,b)}}function b(a){const b=c(a);return function(a,c){if(void 0!==c&&!Sk.builtin.checkNone(c))throw new Sk.builtin.TypeError("pow() 3rd argument not allowed unless all arguments are integers");return b.call(this,a)}}function e(a,b){if(0===b)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return Infinity===a?Infinity===b||-Infinity===a?new Sk.builtin.float_(NaN):0>b?new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(Infinity): +-Infinity===a?Infinity===b||-Infinity===a?new Sk.builtin.float_(NaN):0>b?new Sk.builtin.float_(Infinity):new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(a/b)}function f(a,b){if(Infinity===a||-Infinity===a)return new Sk.builtin.float_(NaN);if(0===b)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return Infinity===b?0>a?new Sk.builtin.float_(-1):new Sk.builtin.float_(0):-Infinity===b?0>a||0!==a?new Sk.builtin.float_(0):new Sk.builtin.float_(-1):new Sk.builtin.float_(Math.floor(a/ +b))}function l(a,b){if(0===b)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");if(0===a)return new Sk.builtin.float_(0);if(Infinity===b)return Infinity===a||-Infinity===this.v?new Sk.builtin.float_(NaN):0a?0c&&(c+=b):0>b&&0!==c&&(c+=b);0===c&&(0>b?c=-0:-Infinity===Infinity/c&&(c=0));return new Sk.builtin.float_(c)}function h(a,b){if(0>a&&0!==b%1)throw new Sk.builtin.ValueError("negative number cannot be raised to a fractional power"); +if(0===a&&0>b)throw new Sk.builtin.ZeroDivisionError("0.0 cannot be raised to a negative power");const c=Math.pow(a,b);if(Infinity===Math.abs(c)&&Infinity!==Math.abs(a)&&Infinity!==Math.abs(b))throw new Sk.builtin.OverflowError("Numerical result out of range");return new Sk.builtin.float_(c)}const d=Object.create(null,{Infinity:{value:314159},"-Infinity":{value:-314159},NaN:{value:0}});Sk.builtin.float_=Sk.abstr.buildNativeClass("float",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.float_, +"bad call to float use 'new'");if("number"===typeof a)this.v=a;else if(void 0===a)this.v=0;else if("string"===typeof a)this.v=parseFloat(a);else{if(a.nb$float)return a.nb$float();Sk.asserts.fail("bad argument to float constructor")}},slots:{tp$gettattr:Sk.generic.getAttr,tp$as_number:!0,tp$doc:"Convert a string or number to a floating point number, if possible.",tp$hash(){const a=this.v;let b=d[a];if(void 0!==b)return b;b=Number.isInteger(a)?this.nb$int().tp$hash():Math.floor(Math.random()*Number.MAX_SAFE_INTEGER- +Number.MAX_SAFE_INTEGER/2);return d[this.v]=b},$r(){return new Sk.builtin.str(this.str$(10,!0))},tp$new(a,b){if(b&&b.length)throw new Sk.builtin.TypeError("float() takes no keyword arguments");if(a&&1a?Math.ceil(a):Math.floor(a);if(!Number.isInteger(a))throw new Sk.builtin.ValueError("cannot convert float "+Sk.misceval.objectRepr(this)+" to integer");return Sk.builtin.int_.withinThreshold(a)?new Sk.builtin.int_(a):new Sk.builtin.int_(JSBI.BigInt(a))},nb$float:a,nb$long(){return new Sk.builtin.lng(this.nb$int().v)},nb$add:c((a,b)=>new Sk.builtin.float_(a+b)),nb$subtract:c((a,b)=>new Sk.builtin.float_(a-b)),nb$reflected_subtract:c((a, +b)=>new Sk.builtin.float_(b-a)),nb$multiply:c((a,b)=>new Sk.builtin.float_(a*b)),nb$divide:c(e),nb$reflected_divide:c((a,b)=>e(b,a)),nb$floor_divide:c(f),nb$reflected_floor_divide:c((a,b)=>f(b,a)),nb$remainder:c(l),nb$reflected_remainder:c((a,b)=>l(b,a)),nb$divmod:c((a,b)=>new Sk.builtin.tuple([f(a,b),l(a,b)])),nb$reflected_divmod:c((a,b)=>new Sk.builtin.tuple([f(b,a),l(b,a)])),nb$power:b(h),nb$reflected_power:b((a,b)=>h(b,a)),nb$abs(){return new Sk.builtin.float_(Math.abs(this.v))},nb$negative(){return new Sk.builtin.float_(-this.v)}, +nb$positive(){return new Sk.builtin.float_(this.v)},nb$bool(){return 0!==this.v},nb$isnegative(){return 0>this.v},nb$ispositive(){return 0<=this.v},ob$eq:c((a,b)=>a==b),ob$ne:c((a,b)=>a!=b),ob$gt:c((a,b)=>a>b),ob$ge:c((a,b)=>a>=b),ob$lt:c((a,b)=>aa<=b)},getsets:{real:{$get:a,$doc:"the real part of a complex number"},imag:{$get(){return new Sk.builtin.float_(0)},$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth:a,$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return self, the complex conjugate of any float."}, +__trunc__:{$meth(){return this.nb$int()},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return the Integral closest to x between 0 and x."},__round__:{$meth(a){return this.round$(a)},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, ndigits=None, /)",$doc:"Return the Integral closest to x, rounding half toward even.\n\nWhen an argument is passed, work like built-in round(x, ndigits)."},is_integer:{$meth(){return new Sk.builtin.bool(Number.isInteger(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)", +$doc:"Return True if the float is an integer."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([this])},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!0),$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:Sk.builtin.none.none$}}});const g=/_[eE]|[eE]_|\._|_\.|[+-]_|__/,n=/_(?=[^_])/g;Sk.builtin.float_.PyFloat_Check=function(a){return void 0===a?!1:Sk.builtin.checkNumber(a)||Sk.builtin.checkFloat(a)||a.ob$type.$isSubType(Sk.builtin.float_)? +!0:!1};Sk.builtin.float_.prototype.toFixed=function(a){a=Sk.builtin.asnum$(a);return this.v.toFixed(a)};Sk.builtin.float_.prototype.round$=function(a){var b=Sk.builtin.asnum$(this);var c=void 0===a?0:Sk.misceval.asIndexSized(a);if(Sk.__future__.bankers_rounding){b*=Math.pow(10,c);var d=Math.round(b);c=(.5===(0c.length?b.toExponential():b.toExponential(11));if(0>c.indexOf("e")&&0<=c.indexOf(".")){for(;"0"== +c.charAt(c.length-1);)c=c.substring(0,c.length-1);"."==c.charAt(c.length-1)&&(c+="0")}c=c.replace(/\.0+e/,"e","i");c=c.replace(/(e[-+])([1-9])$/,"$10$2");c=c.replace(/0+(e.*)/,"$1")}else c=b.toString(a);0===this.v&&-Infinity===1/this.v&&(c="-"+c);0>c.indexOf(".")&&0>c.indexOf("E")&&0>c.indexOf("e")&&(c+=".0");return c};Sk.builtin.float_.py2$methods={}},function(m,q){function a(a){let b=a.v;if("number"===typeof b)return b;a.nb$float&&(b=a.nb$float());if(void 0===b)throw new Sk.builtin.TypeError("a float is required"); +return b.v}function c(a,b,c){if(c===Sk.builtin.complex.prototype)return new Sk.builtin.complex(a,b);c=new c.constructor;Sk.builtin.complex.call(c,a,b);return c}function b(a,b){return function(c){const d=this.real,e=this.imag;var f=c.real;const g=c.v;if("number"===typeof f)c=c.imag;else if("number"===typeof g)f=g,c=0;else if(JSBI.__isBigInt(g)){if(void 0===b){if(f=parseFloat(JSBI.toNumber(g)),Infinity==f||-Infinity==f)throw new Sk.builtin.OverflowError("int too large to convert to float");}else f= +g.toString();c=0}else return Sk.builtin.NotImplemented.NotImplemented$;return a(d,e,f,c)}}function e(a,b,c,d){var e=Math.abs(c);const f=Math.abs(d);if(e>=f){if(0===e)throw new Sk.builtin.ZeroDivisionError("complex division by zero");e=d/c;c+=d*e;d=(a+b*e)/c;a=(b-a*e)/c}else f>=e?(e=c/d,c=c*e+d,Sk.asserts.assert(0!==d),d=(a*e+b)/c,a=(b*e-a)/c):a=d=NaN;return new Sk.builtin.complex(d,a)}function f(a,b,c,d){if(0===c&&0===d){d=1;var e=0}else if(0===a&&0===b){if(0!==d||0>c)throw new Sk.builtin.ZeroDivisionError("complex division by zero"); +e=d=0}else{const f=Math.hypot(a,b);e=Math.pow(f,c);a=Math.atan2(b,a);c*=a;0!==d&&(e/=Math.exp(a*d),c+=d*Math.log(f));d=e*Math.cos(c);e*=Math.sin(c)}return new Sk.builtin.complex(d,e)}function l(a,b,c){let d=1;var e=new Sk.builtin.complex(1,0);for(a=new Sk.builtin.complex(a,b);0=d;)c&d&&(e=new Sk.builtin.complex(e.real*a.real-e.imag*a.imag,e.real*a.imag+a.real*e.imag)),d<<=1,a=new Sk.builtin.complex(a.real*a.real-a.imag*a.imag,2*a.real*a.imag);return e}function h(a,b,c,d,e){e=!1;switch(b){case "e":case "f":case "g":break; +case "E":e=!0;b="e";break;case "F":e=!0;b="f";break;case "r":if(0!==c)throw Error("Bad internall call");c=17;b="g";break;default:throw Error("Bad internall call");}if(isNaN(a))a="nan";else if(Infinity===a)a="inf";else if(-Infinity===a)a="-inf";else{d&h.Py_DTSF_ADD_DOT_0&&(b="g");var f="%"+(d&h.Py_DTSF_ALT?"#":"");null!=c&&(f=f+"."+c);f=new Sk.builtin.str(f+b);a=f.nb$remainder(new Sk.builtin.float_(a));a=a.v}d&h.Py_DTSF_SIGN&&"-"!==a[0]&&(a="+"+a);e&&(a=a.toUpperCase());return a}Sk.builtin.complex= +Sk.abstr.buildNativeClass("complex",{constructor:function(a,b){Sk.asserts.assert(this instanceof Sk.builtin.complex,"bad call to complex constructor, use 'new'");this.real=a;this.imag=b},slots:{tp$as_number:!0,tp$doc:"Create a complex number from a real part and an optional imaginary part.\n\nThis is equivalent to (real + imag*1j) where imag defaults to 0.",tp$hash(){var a=(new Sk.builtin.float_(this.real)).tp$hash();a=1003*(new Sk.builtin.float_(this.imag)).tp$hash()+a;return Sk.builtin.int_.withinThreshold(a)? +a:(new Sk.builtin.int_(JSBI.BigInt(a))).tp$hash()},tp$getattr:Sk.generic.getAttr,tp$new(b,e){b=Sk.abstr.copyKeywordsToNamedArgs("complex",["real","imag"],b,e,[null,null]);{var f=b[1],g;let k=e=!1;var h=b[0];if(null!=h&&h.constructor===Sk.builtin.complex&&null==f)e=h;else if(Sk.builtin.checkString(h)){if(null!=f)throw new Sk.builtin.TypeError("complex() can't take second arg if first is a string");e=Sk.builtin.complex.complex_subtype_from_string(h,this)}else{if(null!=f&&Sk.builtin.checkString(f))throw new Sk.builtin.TypeError("complex() second arg can't be a string"); +null==h?b=null:(b=Sk.abstr.lookupSpecial(h,Sk.builtin.str.$complex),b=void 0!==b?Sk.misceval.callsimArray(b,[]):null);if(null!=b&&b!==Sk.builtin.NotImplemented.NotImplemented$){if(!d(b))throw new Sk.builtin.TypeError("__complex__ should return a complex object");h=b}if(null!=h&&void 0===h.nb$float)throw new Sk.builtin.TypeError("complex() first argument must be a string or a number, not '"+Sk.abstr.typeName(h)+"'");if(null!=f&&void 0===f.nb$float)throw new Sk.builtin.TypeError("complex() second argument must be a number, not '"+ +Sk.abstr.typeName(h)+"'");null==h?h=b=0:d(h)?(b=h.real,h=h.imag,e=!0):(b=a(h),h=0);null==f?f=g=0:d(f)?(g=f.real,f=f.imag,k=!0):(g=a(f),f=0);!0===k&&(b-=f);!0===e&&(g+=h);e=c(b,g,this)}}return e},tp$richcompare(a,c){if("Eq"!==c&&"NotEq"!==c){if(Sk.builtin.checkNumber(a)||d(a))throw new Sk.builtin.TypeError("no ordering relation is defined for complex numbers");return Sk.builtin.NotImplemented.NotImplemented$}return b(function(a,b,d,e){a=a==d&&b==e;return"Eq"===c?a:!a},!0).call(this,a)},$r(){{var a, +b;let e=a="";var c=this.real;var d=this.imag;if(b=0===c)b=1==(c?0>c?-1:1:0>1/c?-1:1);b?(c="",b=h(d,"g",null,0,null)):(c=a=h(c,"g",null,0,null),b=h(d,"g",null,h.Py_DTSF_SIGN,null),0===d&&-Infinity===1/d&&b&&"-"!==b[0]&&(b="-"+b),a="(",e=")");d=new Sk.builtin.str(""+a+c+b+"j"+e)}return d},nb$int(){throw new Sk.builtin.TypeError("can't convert complex to int");},nb$long(){throw new Sk.builtin.TypeError("can't convert complex to long");},nb$float(){throw new Sk.builtin.TypeError("can't convert complex to float"); +},nb$positive(){return new Sk.builtin.complex(this.real,this.imag)},nb$negative(){return new Sk.builtin.complex(-this.real,-this.imag)},nb$bool(){return this.real||this.imag},nb$add:b((a,b,c,d)=>new Sk.builtin.complex(a+c,b+d)),nb$subtract:b((a,b,c,d)=>new Sk.builtin.complex(a-c,b-d)),nb$reflected_subtract:b((a,b,c,d)=>new Sk.builtin.complex(c-a,d-b)),nb$multiply:b((a,b,c,d)=>new Sk.builtin.complex(c*a-d*b,a*d+b*c)),nb$divide:b(e),nb$reflected_divide:b((a,b,c,d)=>e(c,d,a,b)),nb$floor_divide(a){throw new Sk.builtin.TypeError("can't take floor of complex number."); +},nb$reflected_floor_divide(a){throw new Sk.builtin.TypeError("can't take floor of complex number.");},nb$remainder(a){throw new Sk.builtin.TypeError("can't mod complex numbers.");},nb$reflected_remainder(a){throw new Sk.builtin.TypeError("can't mod complex numbers.");},nb$divmod(a){throw new Sk.builtin.TypeError("can't take floor or mod of complex number.");},nb$power(a,b){if(null!=b&&!Sk.builtin.checkNone(b))throw new Sk.builtin.ValueError("complex modulo");return k.call(this,a)},nb$abs(){var a= +this.real;const b=this.imag;if(!Number.isFinite(a)||!Number.isFinite(b))return Infinity===a||-Infinity===a?new Sk.builtin.float_(Math.abs(a)):Infinity===b||-Infinity===b?new Sk.builtin.float_(Math.abs(b)):new Sk.builtin.float_(NaN);a=Math.hypot(a,b);if(!Number.isFinite(a))throw new Sk.builtin.OverflowError("absolute value too large");return new Sk.builtin.float_(a)}},getsets:{real:{$get(){return new Sk.builtin.float_(this.real)},$doc:"the real part of a complex number"},imag:{$get(){return new Sk.builtin.float_(this.imag)}, +$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth(){return new Sk.builtin.complex(this.real,-this.imag)},$flags:{NoArgs:!0},$textsig:null,$doc:"complex.conjugate() -> complex\n\nReturn the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.float_(this.real),new Sk.builtin.float_(this.imag)])},$flags:{NoArgs:!0},$textsig:null,$doc:Sk.builtin.none.none$},__format__:{$meth(a){if(Sk.builtin.checkString(a))throw new Sk.builtin.NotImplementedError("__format__ is not implemented for complex type."); +throw new Sk.builtin.TypeError("__format__ requires str");},$flags:{OneArg:!0},$textsig:null,$doc:"complex.__format__() -> str\n\nConvert to a string according to format_spec."}}});Sk.exportSymbol("Sk.builtin.complex",Sk.builtin.complex);const d=Sk.builtin.checkComplex,g=/_[eE]|[eE]_|\._|_\.|[+-]_|_j|j_/,n=/_(?=[^_])/g;Sk.builtin.complex.complex_subtype_from_string=function(a,b){b=b||Sk.builtin.complex.prototype;var d=0,e=0,f=!1;if(Sk.builtin.checkString(a))a=Sk.ffi.remapToJs(a);else if("string"!== +typeof a)throw new TypeError("provided unsupported string-alike argument");if(-1!==a.indexOf("\x00")||0===a.length||""===a)throw new Sk.builtin.ValueError("complex() arg is a malformed string");var h=0;a=a.replace(/inf|infinity/gi,"Infinity");for(a=a.replace(/nan/gi,"NaN");" "===a[h];)h++;if("("===a[h])for(f=!0,h++;" "===a[h];)h++;if(-1!==a.indexOf("_")){if(g.test(a))throw new Sk.builtin.ValueError("could not convert string to complex: '"+a+"'");a=a.charAt(0)+a.substring(1).replace(n,"")}var k=/^(?:[+-]?(?:(?:(?:\d*\.\d+)|(?:\d+\.?))(?:[eE][+-]?\d+)?|NaN|Infinity))/; +var l=a.substr(h);var p=l.match(k);if(null!==p)if(h+=p[0].length,"j"===a[h]||"J"===a[h])e=parseFloat(p[0]),h++;else if("+"===a[h]||"-"===a[h]){d=parseFloat(p[0]);p=a.substr(h).match(k);null!==p?(e=parseFloat(p[0]),h+=p[0].length):(e="+"===a[h]?1:-1,h++);if("j"!==a[h]&&"J"!==a[h])throw new Sk.builtin.ValueError("complex() arg is malformed string");h++}else d=parseFloat(p[0]);else p=p=l.match(/^([+-]?[jJ])/),null!==p&&(e=1===p[0].length?1:"+"===p[0][0]?1:-1,h+=p[0].length);for(;" "===a[h];)h++;if(f){if(")"!== +a[h])throw new Sk.builtin.ValueError("complex() arg is malformed string");for(h++;" "===a[h];)h++}if(a.length!==h)throw new Sk.builtin.ValueError("complex() arg is malformed string");return c(d,e,b)};const k=b((a,b,c,d)=>{const g=c|0;return 0===d&&c===g?(100g?a=f(a,b,g,0):0a)throw new Sk.builtin.TypeError("length should not be negative");const {start:c,stop:b,step:e}=this.slice$indices(a);return new Sk.builtin.tuple([new Sk.builtin.int_(c),new Sk.builtin.int_(b),new Sk.builtin.int_(e)])},$doc:"S.indices(len) -> (start, stop, stride)\n\nAssuming a sequence of length len, calculate the start and stop\nindices, and the stride length of the extended slice described by\nS. Out of bounds indices are clipped in a manner consistent with the\nhandling of normal slices.", +$textsig:null,$flags:{OneArg:!0}}},proto:{slice$as_indices(a){let c;var b=a?a=>Sk.misceval.asIndexSized(a,null,"slice indices must be integers or None or have an __index__ method"):a=>Sk.misceval.asIndexOrThrow(a,"slice indices must be integers or None or have an __index__ method");if(Sk.builtin.checkNone(this.step))c=1;else if(c=b(this.step),0===c)throw new Sk.builtin.ValueError("slice step cannot be zero");a=Sk.builtin.checkNone(this.start)?null:b(this.start);b=Sk.builtin.checkNone(this.stop)?null: +b(this.stop);return{start:a,stop:b,step:c}},$wrt(a,c,b,e,f){f=f?b=>JSBI.__isBigInt(b)?JSBI.add(b,JSBI.BigInt(a)):b+a:b=>b+a;0c&&(c=f(c),0>c&&(c=0)),null===b?b=a:b>a?b=a:0>b&&(b=f(b))):(null===c?c=a-1:c>=a?c=a-1:0>c&&(c=f(c)),null===b?b=-1:0>b&&(b=f(b),0>b&&(b=-1)));return{start:c,stop:b,step:e}},slice$indices(a,c){let {start:b,stop:e,step:f}=this.slice$as_indices(!0,c);return this.$wrt(a,b,e,f,c)},sssiter$(a,c){let {start:b,stop:e,step:f}=this.slice$indices(a,!0);if(0e;a+=f)c(a)}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.slice.startEnd$wrt=function(a,c,b){a=a.sq$length();void 0===c||Sk.builtin.checkNone(c)?c=0:(c=Sk.misceval.asIndexSized(c,null,"slice indices must be integers or have an __index__ method"),0>c&&(c+=a,0>c&&(c=0)));void 0===b||Sk.builtin.checkNone(b)?b=a:(b=Sk.misceval.asIndexSized(b,null,"slice indices must be integers or have an __index__ method"),0>b?(b+=a,0>b&&(b=0)):b>a&&(b=a));return{start:c,end:b}}},function(m, +q){function a(a){return function(b){return Sk.builtin.checkAnySet(b)?a.call(this,b):Sk.builtin.NotImplemented.NotImplemented$}}function c(a){a instanceof Sk.builtin.set&&a.tp$hash===Sk.builtin.none.none$&&(a=new Sk.builtin.frozenset(Sk.misceval.arrayFromIterable(a)));return a}m={};Sk.builtin.set=Sk.abstr.buildNativeClass("set",{constructor:function(a){void 0===a?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.set,"Bad call to set - must be called with an Array and 'new'"); +const b=[];for(let c=0;c new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.",tp$init(a,b){Sk.abstr.checkNoKwargs("set",b);Sk.abstr.checkArgsLen("set",a,0,1);this.set$clear();return(a=a[0])&&this.set$update(a)},tp$new:Sk.generic.new, +$r(){if(this.in$repr)return new Sk.builtin.str(Sk.abstr.typeName(this)+"(...)");this.in$repr=!0;const a=this.sk$asarray().map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return Sk.__future__.python3?0===a.length?new Sk.builtin.str(Sk.abstr.typeName(this)+"()"):this.ob$type!==Sk.builtin.set?new Sk.builtin.str(Sk.abstr.typeName(this)+"({"+a.join(", ")+"})"):new Sk.builtin.str("{"+a.join(", ")+"}"):new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+a.join(", ")+"])")},tp$iter(){return new b(this)},tp$richcompare(a, +b){if(!Sk.builtin.checkAnySet(a))return Sk.builtin.NotImplemented.NotImplemented$;switch(b){case "NotEq":case "Eq":return a=this===a?!0:this.get$size()!==a.get$size()?!1:Sk.misceval.isTrue(this.set$issubset(a)),"Eq"===b?a:!a;case "LtE":return this===a||Sk.misceval.isTrue(this.set$issubset(a));case "GtE":return this===a||Sk.misceval.isTrue(a.set$issubset(this));case "Lt":return this.get$size()a.get$size()&&Sk.misceval.isTrue(a.set$issubset(this))}}, +nb$subtract:a(function(a){return this.difference.$meth.call(this,a)}),nb$and:a(function(a){return this.intersection.$meth.call(this,a)}),nb$or:a(function(a){return this.union.$meth.call(this,a)}),nb$xor:a(function(a){return this.symmetric_difference.$meth.call(this,a)}),nb$inplace_subtract:a(function(a){a===this&&(a=a.set$copy());return Sk.misceval.chain(this.difference_update.$meth.call(this,a),()=>this)}),nb$inplace_and:a(function(a){return Sk.misceval.chain(this.intersection_update.$meth.call(this, +a),()=>this)}),nb$inplace_or:a(function(a){return Sk.misceval.chain(this.update.$meth.call(this,a),()=>this)}),nb$inplace_xor:a(function(a){a===this&&(a=a.set$copy());return Sk.misceval.chain(this.symmetric_difference_update.$meth.call(this,a),()=>this)}),sq$length(){return this.get$size()},sq$contains(a){a=c(a);return this.v.sq$contains(a)}},methods:{add:{$meth(a){this.set$add(a);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Add an element to a set.\n\nThis has no effect if the element is already present."}, +clear:{$meth(){this.set$clear();return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove all elements from this set."},copy:{$meth(){return this.set$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a shallow copy of a set."},discard:{$meth(a){a=c(a);this.set$discard(a);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Remove an element from a set if it is a member.\n\nIf the element is not a member, do nothing."},difference:{$meth(...a){const b=this.set$copy(); +return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>b.set$difference_update(a)),()=>b)},$flags:{MinArgs:0},$textsig:null,$doc:"Return the difference of two or more sets as a new set.\n\n(i.e. all elements that are in this set but not the others.)"},difference_update:{$meth(...a){return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>this.set$difference_update(a)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:"Remove all elements of another set from this set."},intersection:{$meth(...a){return this.set$intersection_multi(...a)}, +$flags:{MinArgs:0},$textsig:null,$doc:"Return the intersection of two sets as a new set.\n\n(i.e. all elements that are in both sets.)"},intersection_update:{$meth(...a){return Sk.misceval.chain(this.set$intersection_multi(...a),a=>{this.swap$bodies(a);return Sk.builtin.none.none$})},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the intersection of itself and another."},isdisjoint:{$meth(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(this.sq$contains(a))return new Sk.misceval.Break(Sk.builtin.bool.false$)}), +a=>a||Sk.builtin.bool.true$)},$flags:{OneArg:!0},$textsig:null,$doc:"Return True if two sets have a null intersection."},issubset:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a));return Sk.misceval.chain(a,a=>this.set$issubset(a))},$flags:{OneArg:!0},$textsig:null,$doc:"Report whether another set contains this set."},issuperset:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a));return Sk.misceval.chain(a,a=>a.set$issubset(this))},$flags:{OneArg:!0},$textsig:null, +$doc:"Report whether this set contains another set."},pop:{$meth(){if(0===this.get$size())throw new Sk.builtin.KeyError("pop from an empty set");return Sk.misceval.callsimArray(this.v.popitem,[this.v]).v[0]},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return an arbitrary set element.\nRaises KeyError if the set is empty."},remove:{$meth(a){const b=c(a);if(this.v.mp$lookup(b))return this.v.mp$ass_subscript(b),Sk.builtin.none.none$;throw new Sk.builtin.KeyError(a);},$flags:{OneArg:!0},$textsig:null, +$doc:"Remove an element from a set; it must be a member.\n\nIf the element is not a member, raise a KeyError."},symmetric_difference:{$meth(a){let b;return Sk.misceval.chain(this.set$make_basetype(a),a=>{b=a;return b.set$symmetric_diff_update(this)},()=>b)},$flags:{OneArg:!0},$textsig:null,$doc:"Return the symmetric difference of two sets as a new set.\n\n(i.e. all elements that are in exactly one of the sets.)"},symmetric_difference_update:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a)); +return Sk.misceval.chain(a,a=>this.set$symmetric_diff_update(a),()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:null,$doc:"Update a set with the symmetric difference of itself and another."},union:{$meth(...a){const b=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>b.set$update(a)),()=>b)},$flags:{MinArgs:0},$textsig:null,$doc:"Return the union of sets as a new set.\n\n(i.e. all elements that are in either set.)"},update:{$meth(...a){return Sk.misceval.chain(Sk.misceval.iterArray(a, +a=>this.set$update(a)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the union of itself and others."}},proto:Object.assign(m,{sk$asarray(){return this.v.sk$asarray()},get$size(){return this.v.sq$length()},set$add(a){this.v.mp$ass_subscript(a,!0)},set$make_basetype(a){return Sk.misceval.chain(Sk.misceval.arrayFromIterable(a,!0),a=>new this.sk$builtinBase(a))},set$discard(a){return this.v.pop$item(a)},set$clear(){this.v=new Sk.builtin.dict([])},set$copy(){const a= +new this.sk$builtinBase;a.v=this.v.dict$copy();return a},set$difference_update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.set$discard(a)})},set$intersection(a){const b=new this.sk$builtinBase;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.sq$contains(a)&&b.set$add(a)}),()=>b)},set$intersection_multi(...a){if(!a.length)return this.set$copy();let b=this;return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>Sk.misceval.chain(b.set$intersection(a),a=>{b=a})),()=>b)}, +set$issubset(a){const b=this.get$size(),c=a.get$size();if(b>c)return Sk.builtin.bool.false$;for(let b=this.tp$iter(),c=b.tp$iternext();void 0!==c;c=b.tp$iternext())if(!a.sq$contains(c))return Sk.builtin.bool.false$;return Sk.builtin.bool.true$},set$symmetric_diff_update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{void 0===this.set$discard(a)&&this.set$add(a)})},set$update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.set$add(a)})},swap$bodies(a){this.v=a.v}})});Sk.exportSymbol("Sk.builtin.set", +Sk.builtin.set);q=Sk.builtin.set.prototype;Sk.builtin.frozenset=Sk.abstr.buildNativeClass("frozenset",{constructor:function(a){void 0===a&&(a=[]);Sk.asserts.assert(Array.isArray(a)&&this instanceof Sk.builtin.frozenset,"bad call to frozen set - must be called with an Array and 'new'");const b=[];for(let c=0;c empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.", +tp$hash(){let a=1927868237;const b=this.sk$asarray();a*=b.length+1;for(let c=0;ca.length?new Sk.builtin.frozenset(a): +Sk.builtin.frozenset.$emptyset)},$r:q.$r,tp$iter:q.tp$iter,tp$richcompare:q.tp$richcompare,nb$subtract:q.nb$subtract,nb$and:q.nb$and,nb$or:q.nb$or,nb$xor:q.nb$xor,sq$length:q.sq$length,sq$contains:q.sq$contains},methods:{copy:Object.assign({},q.copy.d$def,{$meth(){return this.constructor===this.sk$builtinBase?this:new Sk.builtin.frozenset(this.sk$asarray())}}),difference:q.difference.d$def,intersection:q.intersection.d$def,isdisjoint:q.isdisjoint.d$def,issubset:q.issubset.d$def,issuperset:q.issuperset.d$def, +symmetric_difference:q.symmetric_difference.d$def,union:q.union.d$def},proto:Object.assign({$subtype_new(a,b){const c=new this.constructor;return Sk.misceval.chain(Sk.builtin.frozenset.prototype.tp$new(a),a=>{c.v=a.v;return c})}},m)});Sk.builtin.frozenset.$emptyset=Object.create(Sk.builtin.frozenset.prototype,{v:{value:new Sk.builtin.dict([]),enumerable:!0},in$repr:{value:!1,enumerable:!0}});Sk.exportSymbol("Sk.builtin.frozenset",Sk.builtin.frozenset);var b=Sk.abstr.buildIteratorClass("set_iterator", +{constructor:function(a){this.$index=0;this.$seq=a.sk$asarray();this.$orig=a},iternext:Sk.generic.iterNextWithArrayCheckSize,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(m,q){Sk.builtin.print=function(a,c){let [b,e,f]=Sk.abstr.copyKeywordsToNamedArgs("print",["sep","end","file","flush"],[],c);if(void 0===b||Sk.builtin.checkNone(b))b=" ";else if(Sk.builtin.checkString(b))b=b.$jsstr();else throw new Sk.builtin.TypeError("sep must be None or a string, not "+ +Sk.abstr.typeName(b));if(void 0===e||Sk.builtin.checkNone(e))e="\n";else if(Sk.builtin.checkString(e))e=e.$jsstr();else throw new Sk.builtin.TypeError("end must be None or a string, not "+Sk.abstr.typeName(e));let l;if(void 0!==f&&!Sk.builtin.checkNone(f)&&(l=Sk.abstr.lookupSpecial(f,Sk.builtin.str.$write),void 0===l))throw new Sk.builtin.AttributeError("'"+Sk.abstr.typeName(f)+"' object has no attribute 'write'");const h=new Sk.builtin.str(a.map(a=>(new Sk.builtin.str(a)).toString()).join(b)+e); +if(void 0!==l)Sk.misceval.callsimArray(l,[h]);else return Sk.misceval.chain(Sk.importModule("sys",!1,!0),a=>(l=Sk.abstr.lookupSpecial(a.$d.stdout,Sk.builtin.str.$write))&&Sk.misceval.callsimOrSuspendArray(l,[h]))};Sk.builtin.print.co_fastcall=1},function(m,q){Sk.builtin.module=Sk.abstr.buildNativeClass("module",{constructor:function(){this.$d={}},slots:{tp$doc:"Create a module object.\n\nThe name must be a string; the optional doc argument can have any type.",tp$getattr(a,c){var b=this.$d[a.$mangled]; +if(void 0!==b)return b;b=this.ob$type.$typeLookup(a);if(void 0!==b){const a=b.tp$descr_get;return a?a.call(b,this,this.ob$type,c):b}const e=this.$d.__getattr__;if(void 0!==e)return b=Sk.misceval.tryCatch(()=>Sk.misceval.callsimOrSuspendArray(e,[a]),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;}),c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},tp$setattr:Sk.generic.setAttr,tp$new:Sk.generic.new,tp$init(a,c){const [b,e]=Sk.abstr.copyKeywordsToNamedArgs("module",["name","doc"],a,c,[Sk.builtin.none.none$]); +Sk.builtin.pyCheckType("module","string",b);this.init$dict(b,e)},$r(){let a=this.get$name();if(void 0!==a){var c=this.get$mod_reprf();if(void 0!==c)return Sk.misceval.callsimOrSuspendArray(c,[this])}a=void 0===a?"'?'":a;c=this.from$file();c=void 0===c?this.empty_or$loader():c;return new Sk.builtin.str("")}},getsets:{__dict__:{$get(){return new Sk.builtin.mappingproxy(this.$d)}}},methods:{__dir__:{$meth(){const a=this.tp$getattr(Sk.builtin.str.$dict);if(!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError("__dict__ is not a dictionary"); +const c=a.mp$lookup(Sk.builtin.str.$dir);return void 0!==c?Sk.misceval.callsimOrSuspendArray(c,[]):new Sk.builtin.list(Sk.misceval.arrayFromIterable(a))},$flags:{NoArgs:!0},$doc:"__dir__() -> list\nspecialized dir() implementation"}},proto:{init$dict(a,c){this.$d.__name__=a;this.$d.__doc__=c;this.$d.__package__=Sk.builtin.none.none$;this.$d.__spec__=Sk.builtin.none.none$;this.$d.__loader__=Sk.builtin.none.none$},sk$attrError(){const a=this.get$name();return void 0===a?"module":"module "+a},get$name(){const a= +this.tp$getattr(Sk.builtin.str.$name);return a&&Sk.misceval.objectRepr(a)},from$file(){const a=this.tp$getattr(Sk.builtin.str.$file);return a&&" from "+Sk.misceval.objectRepr(a)},empty_or$loader(){if(this.$js&&this.$js.includes("$builtinmodule"))return" (built-in)";const a=this.tp$getattr(Sk.builtin.str.$loader);return void 0===a||Sk.builtin.checkNone(a)?"":" ("+Sk.misceval.objectRepr(a)+")"},get$mod_reprf(){const a=this.tp$getattr(Sk.builtin.str.$loader);return a&&a.tp$getattr(this.str$mod_repr)}, +str$mod_repr:new Sk.builtin.str("module_repr")}});Sk.exportSymbol("Sk.builtin.module",Sk.builtin.module)},function(m,q){Sk.builtin.structseq_types={};Sk.builtin.make_structseq=function(a,c,b,e){const f=a+"."+c,l=[];a=[];for(let c in b)l.push(c),a.push(b[c]);b={};for(let c=0;c")}},iternext(a,c){var b=this;this.gi$running=!0;void 0===c&&(c=Sk.builtin.none.none$);this.gi$sentvalue=c;c=[this];this.func_closure&& +c.push(this.func_closure);return function l(c){if(c instanceof Sk.misceval.Suspension){if(a)return new Sk.misceval.Suspension(l,c);c=Sk.misceval.retryOptionalSuspensionOrThrow(c)}b.gi$running=!1;Sk.asserts.assert(void 0!==c);if(c!==Sk.builtin.none.none$)return b.gi$resumeat=c[0],c=c[1]}(this.func_code.apply(this.func_globals,c))},methods:{send:{$meth(a){return this.tp$iternext(!0,a)},$flags:{OneArg:!0},$doc:"send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration."}}}); +Sk.exportSymbol("Sk.builtin.generator",Sk.builtin.generator);Sk.builtin.makeGenerator=function(a,c){var b,e=new Sk.builtin.generator(null,null,null);e.tp$iternext=a;for(b in c)c.hasOwnProperty(b)&&(e[b]=c[b]);return e};Sk.exportSymbol("Sk.builtin.makeGenerator",Sk.builtin.makeGenerator)},function(m,q){Sk.builtin.file=function(a,c,b){var e;if(!(this instanceof Sk.builtin.file))return new Sk.builtin.file(a,c,b);this.mode=c;this.name=Sk.ffi.remapToJs(a);this.closed=!1;if("/dev/stdout"===this.name)this.data$= +Sk.builtin.none.none$,this.fileno=1;else if("/dev/stdin"===this.name)this.fileno=0;else if("/dev/stderr"===this.name)this.fileno=2;else{if(Sk.inBrowser)if(this.fileno=10,b=document.getElementById(a.v),null==b)if("w"==c.v||"a"==c.v)this.data$="";else throw new Sk.builtin.IOError("[Errno 2] No such file or directory: '"+a.v+"'");else"textarea"==b.nodeName.toLowerCase()?this.data$=b.value:this.data$=b.textContent;else this.fileno=11,this.data$=Sk.read(a.v);this.lineList=this.data$.split("\n");this.lineList= +this.lineList.slice(0,-1);for(e in this.lineList)this.lineList[e]+="\n";this.currentLine=0}this.pos$=0;Sk.fileopen&&10<=this.fileno&&Sk.fileopen(this);return this};Sk.abstr.setUpInheritance("file",Sk.builtin.file,Sk.builtin.object);Sk.abstr.setUpBuiltinMro(Sk.builtin.file);Sk.builtin.file.prototype.$r=function(){return new Sk.builtin.str("<"+(this.closed?"closed":"open")+"file '"+this.name+"', mode '"+Sk.ffi.remapToJs(this.mode)+"'>")};Sk.builtin.file.prototype.tp$iter=function(){var a={tp$iter:function(){return a}, +$obj:this,$index:this.currentLine,$lines:this.lineList,tp$iternext:function(){if(!(a.$index>=a.$lines.length))return new Sk.builtin.str(a.$lines[a.$index++])}};return a};Sk.abstr.setUpSlots(Sk.builtin.file);Sk.builtin.file.prototype.__enter__=new Sk.builtin.func(function(a){return a});Sk.builtin.file.prototype.__exit__=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.file.prototype.close,[a])});Sk.builtin.file.prototype.close=new Sk.builtin.func(function(a){a.closed=!0;return Sk.builtin.none.none$}); +Sk.builtin.file.prototype.flush=new Sk.builtin.func(function(a){});Sk.builtin.file.prototype.fileno=new Sk.builtin.func(function(a){return this.fileno});Sk.builtin.file.prototype.isatty=new Sk.builtin.func(function(a){return!1});Sk.builtin.file.prototype.read=new Sk.builtin.func(function(a,c){var b=a.data$.length;if(a.closed)throw new Sk.builtin.ValueError("I/O operation on closed file");var e=void 0===c?b:Sk.ffi.remapToJs(c);e=new Sk.builtin.str(a.data$.substr(a.pos$,e));a.pos$=void 0===c?b:a.pos$+ +Sk.ffi.remapToJs(c);a.pos$>=b&&(a.pos$=b);return e});Sk.builtin.file.$readline=function(a,c,b){if(0===a.fileno){a=Sk.ffi.remapToJs(b);a=Sk.inputfun(a?a:"");if(a instanceof Promise||a&&"function"===typeof a.then){var e=new Sk.misceval.Suspension;e.resume=function(){if(e.data.error)throw e.data.error;return new Sk.builtin.str(e.data.result)};e.data={type:"Sk.promise",promise:a};return e}return new Sk.builtin.str(a)}c="";a.currentLine{b=Sk.ffi.remapToJs(a);e[b]=Sk.ffi.remapToJs(c)});return e}if(a instanceof Sk.builtin.list||a instanceof Sk.builtin.tuple){e=[];for(c=0;cb;f+=e)d.push(new Sk.builtin.int_(f));else{a=f=JSBI.BigInt(a);e=JSBI.BigInt(e);b=JSBI.BigInt(b);if(JSBI.greaterThan(e,JSBI.__ZERO))for(;JSBI.lessThan(f,b);)d.push(new Sk.builtin.int_(c(f))),f=JSBI.add(f,e);else for(;JSBI.greaterThan(f,b);)d.push(new Sk.builtin.int_(c(f))),f=JSBI.add(f,e);a=c(a);e=c(e);b=c(b)}return new Sk.builtin.range_(a,b,e,d)}function c(a){return JSBI.lessThan(a,JSBI.__MAX_SAFE)&& +JSBI.greaterThan(a,JSBI.__MIN_SAFE)?JSBI.toNumber(a):a}Sk.builtin.range_=Sk.abstr.buildNativeClass("range",{constructor:function(a,b,c,d){this.start=a;this.stop=b;this.step=c;this.v=d},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"range(stop) -> range object\nrange(start, stop[, step]) -> range object\n\nReturn an object that produces a sequence of integers from start (inclusive)\nto stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\nstart defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\nThese are exactly the valid indices for a list of 4 elements.\nWhen step is given, it specifies the increment (or decrement).", +tp$new(b,c){Sk.abstr.checkNoKwargs("range",c);Sk.abstr.checkArgsLen("range",b,1,3);return a(b[0],b[1],b[2])},$r(){let a="range("+this.start+", "+this.stop;1!=this.step&&(a+=", "+this.step);return new Sk.builtin.str(a+")")},tp$richcompare(a,b){if("Eq"!==b&&"NotEq"!==b||a.ob$type!==Sk.builtin.range_)return Sk.builtin.NotImplemented.NotImplemented$;a=new Sk.builtin.list(a.v);return(new Sk.builtin.list(this.v)).tp$richcompare(a,b)},tp$iter(){return new b(this)},nb$bool(){return 0!==this.v.length},sq$contains(a){const b= +this.v;for(let c=0;ca&&(a=this.v.length+a);if(0>a||a>=this.v.length)throw new Sk.builtin.IndexError("range object index out of range");return this.v[a]}if(a.constructor===Sk.builtin.slice){const b=[],c=this.v;a.sssiter$(c.length,a=>{b.push(c[a])});let {start:d,stop:e,step:f}=a.slice$indices(c.length);d=Sk.misceval.asIndex(c[d])|| +this.start;e=Sk.misceval.asIndex(c[e])||this.stop;f="number"===typeof this.step?f*this.step:JSBI.multiply(this.step,JSBI.BigInt(f));return new Sk.builtin.range_(d,e,f,b)}throw new Sk.builtin.TypeError("range indices must be integers or slices, not "+Sk.abstr.typeName(a));}},getsets:{start:{$get(){return new Sk.builtin.int_(this.start)}},step:{$get(){return new Sk.builtin.int_(this.step)}},stop:{$get(){return new Sk.builtin.int_(this.stop)}}},methods:{__reversed__:{$meth(){return new e(this)},$flags:{NoArgs:!0}, +$textsig:null,$doc:"Return a reverse iterator."},count:{$meth(a){let b=0;for(let c=0;c integer -- return number of occurrences of value"},index:{$meth(a){for(let b=0;b integer -- return index of value.\nRaise ValueError if the value is not present."}},proto:{sk$asarray(){return this.v.slice(0)}},flags:{sk$acceptable_as_base_class:!1}});var b=Sk.abstr.buildIteratorClass("range_iterator",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext(){return this.$seq[this.$index++]},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}), +e=Sk.abstr.buildIteratorClass("range_reverseiterator",{constructor:function(a){this.$seq=a.v;this.$index=this.$seq.length-1},iternext(){return this.$seq[this.$index--]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.range=Sk.builtin.xrange=function(b,c,e){b=a(b,c,e);return new Sk.builtin.list(b.v)}},function(m,q){Sk.builtin.enumerate=Sk.abstr.buildIteratorClass("enumerate",{constructor:function(a,c){if(!(this instanceof Sk.builtin.enumerate))throw TypeError("Failed to construct 'enumerate': Please use the 'new' operator"); +this.$iterable=a;this.$index=c;return this},iternext(a){const c=Sk.misceval.chain(this.$iterable.tp$iternext(a),a=>{if(void 0!==a)return new Sk.builtin.tuple([new Sk.builtin.int_(this.$index++),a])});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:"Return an enumerate object.\n\n iterable\n an object supporting iteration\n\nThe enumerate object yields pairs containing a count (from start, which\ndefaults to zero) and a value yielded by the iterable argument.\n\nenumerate is useful for obtaining an indexed list:\n (0, seq[0]), (1, seq[1]), (2, seq[2]), ...", +tp$new(a,c){let [b,e]=Sk.abstr.copyKeywordsToNamedArgs("enumerate",["iterable","start"],a,c,[new Sk.builtin.int_(0)]);b=Sk.abstr.iter(b);e=Sk.misceval.asIndexOrThrow(e);if(this===Sk.builtin.enumerate.prototype)return new Sk.builtin.enumerate(b,e);a=new this.constructor;Sk.builtin.enumerate.call(a,b,e);return a}}});Sk.exportSymbol("Sk.builtin.enumerate",Sk.builtin.enumerate)},function(m,q){Sk.builtin.filter_=Sk.abstr.buildIteratorClass("filter",{constructor:function(a,c){this.$func=a;this.$iterable= +c},iternext(a){const c=Sk.misceval.iterFor(this.$iterable,a=>Sk.misceval.chain(this.check$filter(a),a=>a?new Sk.misceval.Break(a):void 0));return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:"Return an iterator yielding those items of iterable for which function(item)\nis true. If function is None, return the items that are true.",tp$new(a,c){let [b,e]=Sk.abstr.copyKeywordsToNamedArgs("filter",["predicate","iterable"],a,c,[]);b=Sk.builtin.checkNone(b)?null:b;e=Sk.abstr.iter(e); +if(this===Sk.builtin.filter_.prototype)return new Sk.builtin.filter_(b,e);a=new this.constructor;Sk.builtin.filter_.call(a,b,e);return a}},proto:{check$filter(a){let c;c=null===this.$func?a:Sk.misceval.callsimOrSuspendArray(this.$func,[a]);return Sk.misceval.chain(c,b=>Sk.misceval.isTrue(b)?a:void 0)}}});Sk.exportSymbol("Sk.builtin.filter_",Sk.builtin.filter_)},function(m,q){Sk.builtin.map_=Sk.abstr.buildIteratorClass("map",{constructor:function(a,c){this.$func=a;this.$iters=c},iternext(a){const c= +[],b=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,b=>Sk.misceval.chain(b.tp$iternext(a),a=>{if(void 0===a)return new Sk.misceval.Break(!0);c.push(a)})),a=>a?void 0:Sk.misceval.callsimOrSuspendArray(this.$func,c));return a?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},slots:{tp$doc:"map(func, *iterables) --\x3e map object\n\nMake an iterator that computes the function using arguments from\neach of the iterables. Stops when the shortest iterable is exhausted.",tp$new(a,c){this===Sk.builtin.map_.prototype&& +Sk.abstr.checkNoKwargs("map",c);Sk.abstr.checkArgsLen("map",a,2);c=a[0];const b=[];for(let c=1;cthis.$idx)){var c= +Sk.misceval.tryCatch(()=>Sk.abstr.objectGetItem(this.$seq,new Sk.builtin.int_(this.$idx--),a),a=>{if(a instanceof Sk.builtin.IndexError)this.$idx=-1;else throw a;});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)}},slots:{tp$doc:"Return a reverse iterator over the values of the given sequence.",tp$new(a,c){this===Sk.builtin.reversed.prototype&&Sk.abstr.checkNoKwargs("reversed",c);Sk.abstr.checkArgsLen("reversed",a,1,1);a=a[0];c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$reversed);if(void 0!== +c)return Sk.misceval.callsimArray(c,[]);if(!Sk.builtin.checkSequence(a)||void 0===Sk.abstr.lookupSpecial(a,Sk.builtin.str.$len))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(a)+"' object is not a sequence");if(this===Sk.builtin.reversed.prototype)return new Sk.builtin.reversed(a);c=new this.constructor;Sk.builtin.reversed.call(c,a);return c}},methods:{__length_hint__:{$meth:function(){return 0<=this.$idx?new Sk.builtin.int_(this.$idx):new Sk.builtin.int_(0)},$flags:{NoArgs:!0}}}})},function(m, +q){Sk.builtin.zip_=Sk.abstr.buildIteratorClass("zip",{constructor:function(a){this.$iters=a;0===a.length&&(this.tp$iternext=()=>{})},iternext(a){const c=[],b=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,b=>Sk.misceval.chain(b.tp$iternext(a),a=>{if(void 0===a)return new Sk.misceval.Break(!0);c.push(a)})),a=>a?void 0:new Sk.builtin.tuple(c));return a?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},slots:{tp$doc:"zip(iter1 [,iter2 [...]]) --\x3e zip object\n\nReturn a zip object whose .__next__() method returns a tuple where\nthe i-th element comes from the i-th iterable argument. The .__next__()\nmethod continues until the shortest iterable in the argument sequence\nis exhausted and then it raises StopIteration.", +tp$new(a,c){this===Sk.builtin.zip_.prototype&&Sk.abstr.checkNoKwargs("zip",c);c=[];for(let b=0;b":a.T_RARROW,".":a.T_DOT,"...":a.T_ELLIPSIS,"/":a.T_SLASH,"//":a.T_DOUBLESLASH,"//=":a.T_DOUBLESLASHEQUAL,"/=":a.T_SLASHEQUAL,":":a.T_COLON,";":a.T_SEMI,"<":a.T_LESS,"<<":a.T_LEFTSHIFT,"<<=":a.T_LEFTSHIFTEQUAL,"<=":a.T_LESSEQUAL,"=":a.T_EQUAL,"==":a.T_EQEQUAL,">":a.T_GREATER,">=":a.T_GREATEREQUAL,">>":a.T_RIGHTSHIFT,">>=":a.T_RIGHTSHIFTEQUAL,"@":a.T_AT,"@=":a.T_ATEQUAL,"[":a.T_LSQB,"]":a.T_RSQB,"^":a.T_CIRCUMFLEX,"^=":a.T_CIRCUMFLEXEQUAL,"{":a.T_LBRACE, +"|":a.T_VBAR,"|=":a.T_VBAREQUAL,"}":a.T_RBRACE,"~":a.T_TILDE};var c={};(function(){for(var b in a)c[a[b]]=b})();["tok_name","ISTERMINAL","ISNONTERMINAL","ISEOF"].concat(Object.keys(c).map(function(a){return c[a]}));Sk.token={};Sk.token.tokens=a;Sk.token.tok_name=c;Sk.token.EXACT_TOKEN_TYPES=m;Sk.token.ISTERMINAL=function(b){return b=a.T_NT_OFFSET};Sk.token.ISEOF=function(b){return b==a.T_ENDMARKER};Sk.exportSymbol("Sk.token",Sk.token);Sk.exportSymbol("Sk.token.tokens", +Sk.token.tokens);Sk.exportSymbol("Sk.token.tok_name",Sk.token.tok_name);Sk.exportSymbol("Sk.token.EXACT_TOKEN_TYPES");Sk.exportSymbol("Sk.token.ISTERMINAL",Sk.token.ISTERMINAL);Sk.exportSymbol("Sk.token.ISNONTERMINAL",Sk.token.ISNONTERMINAL);Sk.exportSymbol("Sk.token.ISEOF",Sk.token.ISEOF)},function(m,q){function a(a,b,c,d,e){this.type=a;this.string=b;this.start=c;this.end=d;this.line=e}function c(a){return"("+Array.prototype.slice.call(arguments).join("|")+")"}function b(a){return c.apply(null,arguments)+ +"?"}function e(a,b){for(var c=a.length;c--;)if(a[c]===b)return!0;return!1}function f(){return" FR RF Br BR Fr r B R b bR f rb rB F Rf U rF u RB br fR fr rf Rb".split(" ")}function l(a){a?delete Sk.token.EXACT_TOKEN_TYPES["<>"]:Sk.token.EXACT_TOKEN_TYPES["<>"]=Sk.token.tokens.T_NOTEQUAL;t=Object.keys(Sk.token.EXACT_TOKEN_TYPES).sort();y=c.apply(this,t.reverse().map(function(a){return a&&k.test(a)?a.replace(n,"\\$&"):a}));B=c("\\r?\\n",y)}var h=Sk.token.tokens;const d=Sk.builtin.SyntaxError,g=Sk.builtin.SyntaxError; +a.prototype.exact_type=function(){return this.type==h.T_OP&&this.string in Sk.token.EXACT_TOKEN_TYPES?Sk.token.EXACT_TOKEN_TYPES[this.string]:this.type};var n=/[\\^$.*+?()[\]{}|]/g,k=RegExp(n.source);const p=function(){var a=c("[A-Z]","[a-z]","[\\u{10B99}-\\u{10B9C}\\u{112A9}\\u{115DC}-\\u{115DD}\\u034F\\u115F-\\u1160\\u17B4-\\u17B5\\u2065\\u3164\\uFFA0\\uFFF0-\\uFFF8\\u{E0000}\\u{E0002}-\\u{E001F}\\u{E0080}-\\u{E00FF}\\u{E01F0}-\\u{E0FFF}\\u{112A9}\\u00D7]","[\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u06E5-\\u06E6\\u07F4-\\u07F5\\u0971\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1DFD-\\u1DFF\\u2E2F\\u30FC\\uA67F\\uA69C-\\uA69D\\uA717-\\uA71F\\uA788\\uA7F8-\\uA7F9\\uAB5C-\\uAB5F\\uFF70\\uFF9E-\\uFF9F\\u{16F93}-\\u{16F9F}\\u02D0-\\u02D1\\u0640\\u07FA\\u0E46\\u0EC6\\u1843\\u1AA7\\u1C7B\\u3005\\u3031-\\u3035\\u309D-\\u309E\\u30FC-\\u30FE\\uA015\\uA60C\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3-\\uAAF4\\uFF70\\u{16B42}-\\u{16B43}\\u{16FE0}-\\u{16FE1}\\u02B0-\\u02B8\\u02C0-\\u02C1\\u02E0-\\u02E4\\u037A\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C-\\u2C7D\\uA69C-\\uA69D\\uA770\\uA7F8-\\uA7F9\\uAB5C-\\uAB5F\\uFF9E-\\uFF9F\\u02B2\\u1D62\\u1DA4\\u1DA8\\u2071\\u2C7C\\u2E18-\\u2E19\\u2E2F]", +"[\\u2135-\\u2138\\u{1EE00}-\\u{1EE03}\\u{1EE05}-\\u{1EE1F}\\u{1EE21}-\\u{1EE22}\\u{1EE24}\\u{1EE27}\\u{1EE29}-\\u{1EE32}\\u{1EE34}-\\u{1EE37}\\u{1EE39}\\u{1EE3B}\\u{1EE42}\\u{1EE47}\\u{1EE49}\\u{1EE4B}\\u{1EE4D}-\\u{1EE4F}\\u{1EE51}-\\u{1EE52}\\u{1EE54}\\u{1EE57}\\u{1EE59}\\u{1EE5B}\\u{1EE5D}\\u{1EE5F}\\u{1EE61}-\\u{1EE62}\\u{1EE64}\\u{1EE67}-\\u{1EE6A}\\u{1EE6C}-\\u{1EE72}\\u{1EE74}-\\u{1EE77}\\u{1EE79}-\\u{1EE7C}\\u{1EE7E}\\u{1EE80}-\\u{1EE89}\\u{1EE8B}-\\u{1EE9B}\\u{1EEA1}-\\u{1EEA3}\\u{1EEA5}-\\u{1EEA9}\\u{1EEAB}-\\u{1EEBB}\\u3006\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uF900-\\uFA6D\\uFA70-\\uFAD9\\u{17000}-\\u{187F1}\\u{18800}-\\u{18AF2}\\u{1B170}-\\u{1B2FB}\\u{20000}-\\u{2A6D6}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u{2F800}-\\u{2FA1D}\\uAAC0\\uAAC2\\uFE20-\\uFE2F\\u{10D22}-\\u{10D23}\\u{1135D}\\u00AA\\u00BA\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uFA0E-\\uFA0F\\uFA11\\uFA13-\\uFA14\\uFA1F\\uFA21\\uFA23-\\uFA24\\uFA27-\\uFA29\\u{20000}-\\u{2A6D6}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u115F-\\u1160\\u3164\\uFFA0\\u0673\\u17A3-\\u17A4\\u0E40-\\u0E44\\u0EC0-\\u0EC4\\u19B5-\\u19B7\\u19BA\\uAAB5-\\uAAB6\\uAAB9\\uAABB-\\uAABC]", +"[\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u2170-\\u217F\\u2160-\\u216F]","_","[\\u1885-\\u1886\\u2118\\u212E\\u309B-\\u309C]"),b=c(a,"[\\u104A-\\u104B\\u102B-\\u102C\\u102D-\\u1030\\u1031\\u1032-\\u1036\\u1038\\u103B-\\u103C\\u103D-\\u103E\\u1056-\\u1057\\u1058-\\u1059\\u105E-\\u1060\\u1062\\u1067-\\u1068\\u1071-\\u1074\\u1082\\u1083-\\u1084\\u1085-\\u1086\\u109C\\u109D\\u1037\\u1039-\\u103A\\u1087-\\u108C\\u108D\\u108F\\u109A-\\u109B\\uA9E5\\uAA7B\\uAA7C\\uAA7D\\uA9E6\\uAA70\\u104A-\\u104B]","[\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E-\\u094F\\u0982-\\u0983\\u09BE-\\u09C0\\u09C7-\\u09C8\\u09CB-\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB-\\u0ACC\\u0B02-\\u0B03\\u0B3E\\u0B40\\u0B47-\\u0B48\\u0B4B-\\u0B4C\\u0B57\\u0BBE-\\u0BBF\\u0BC1-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82-\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7-\\u0CC8\\u0CCA-\\u0CCB\\u0CD5-\\u0CD6\\u0D02-\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82-\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2-\\u0DF3\\u0F7F\\u102B-\\u102C\\u1031\\u1038\\u103B-\\u103C\\u1056-\\u1057\\u1062\\u1067-\\u1068\\u1083-\\u1084\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7-\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930-\\u1931\\u1933-\\u1938\\u1A19-\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63-\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B82\\u1BA1\\u1BA6-\\u1BA7\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1C24-\\u1C2B\\u1C34-\\u1C35\\u1CF2-\\u1CF3\\uA823-\\uA824\\uA827\\uA880-\\uA881\\uA8B4-\\uA8C3\\uA952\\uA983\\uA9B4-\\uA9B5\\uA9BA-\\uA9BB\\uA9BD-\\uA9BF\\uAA2F-\\uAA30\\uAA33-\\uAA34\\uAA4D\\uAAEB\\uAAEE-\\uAAEF\\uAAF5\\uABE3-\\uABE4\\uABE6-\\uABE7\\uABE9-\\uABEA\\u{11000}\\u{11002}\\u{11082}\\u{110B0}-\\u{110B2}\\u{110B7}-\\u{110B8}\\u{1112C}\\u{11145}-\\u{11146}\\u{11182}\\u{111B3}-\\u{111B5}\\u{111BF}\\u{1122C}-\\u{1122E}\\u{11232}-\\u{11233}\\u{112E0}-\\u{112E2}\\u{11302}-\\u{11303}\\u{1133E}-\\u{1133F}\\u{11341}-\\u{11344}\\u{11347}-\\u{11348}\\u{1134B}-\\u{1134C}\\u{11357}\\u{11362}-\\u{11363}\\u{11435}-\\u{11437}\\u{11440}-\\u{11441}\\u{11445}\\u{114B0}-\\u{114B2}\\u{114B9}\\u{114BB}-\\u{114BE}\\u{114C1}\\u{115AF}-\\u{115B1}\\u{115B8}-\\u{115BB}\\u{115BE}\\u{11630}-\\u{11632}\\u{1163B}-\\u{1163C}\\u{1163E}\\u{116AC}\\u{116AE}-\\u{116AF}\\u{11720}-\\u{11721}\\u{11726}\\u{1182C}-\\u{1182E}\\u{11838}\\u{11A39}\\u{11A57}-\\u{11A58}\\u{11A97}\\u{11C2F}\\u{11C3E}\\u{11CA9}\\u{11CB1}\\u{11CB4}\\u{11D8A}-\\u{11D8E}\\u{11D93}-\\u{11D94}\\u{11D96}\\u{11EF5}-\\u{11EF6}\\u{16F51}-\\u{16F7E}\\u0F3E-\\u0F3F\\u1087-\\u108C\\u108F\\u109A-\\u109B\\u1B44\\u1BAA\\u1CE1\\u1CF7\\u302E-\\u302F\\uA953\\uA9C0\\uAA7B\\uAA7D\\uABEC\\u{111C0}\\u{11235}\\u{1134D}\\u{116B6}\\u{1D16D}-\\u{1D172}\\u09BE\\u09D7\\u0B3E\\u0B57\\u0BBE\\u0BD7\\u0CC2\\u0CD5-\\u0CD6\\u0D3E\\u0D57\\u0DCF\\u0DDF\\u302E-\\u302F\\u{1133E}\\u{11357}\\u{114B0}\\u{114BD}\\u{115AF}\\u{1D165}\\u{1D16E}-\\u{1D172}]", +"[\\u{1D7CE}-\\u{1D7FF}\\uFF10-\\uFF19]","\\u2040","[\\u00B7\\u0387\\u1369-\\u1371\\u19DA]");if(!1===RegExp().unicode)return new RegExp("^"+a+"+"+b+"*$","u");a=c("[A-Z]","[a-z]","_");b=c(a,"[0-9]");return new RegExp("^"+a+"+"+b+"*$")}();(function(a){return c.apply(null,arguments)+"*"})("\\\\\\r?\\n[ \\f\\t]*");b("#[^\\r\\n]*");m=c("[0-9](?:_?[0-9])*\\.(?:[0-9](?:_?[0-9])*)?","\\.[0-9](?:_?[0-9])*")+b("[eE][-+]?[0-9](?:_?[0-9])*");var w=c(m,"[0-9](?:_?[0-9])*[eE][-+]?[0-9](?:_?[0-9])*"),A=c("[0-9](?:_?[0-9])*[jJ]", +w+"[jJ]");m=c.apply(null,f());q=c(m+"'''",m+'"""');c(m+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*'",m+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*"');var t,y,B;l(!0);Sk.token.setupTokens=l;var E=c(m+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*"+c("'","\\\\\\r?\\n"),m+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*'+c('"',"\\\\\\r?\\n")),F=c("\\\\\\r?\\n|$","#[^\\r\\n]*",q),K={};m=f();for(let a of m)K[a+"'"]="^[^'\\\\]*(?:\\\\.[^'\\\\]*)*'",K[a+'"']='^[^"\\\\]*(?:\\\\.[^"\\\\]*)*"',K[a+"'''"]="^[^'\\\\]*(?:(?:\\\\.|'(?!''))[^'\\\\]*)*'''", +K[a+'"""']='^[^"\\\\]*(?:(?:\\\\.|"(?!""))[^"\\\\]*)*"""';let G=[],U=[];for(let a of m)G.push(a+'"'),G.push(a+"'"),U.push(a+'"""'),U.push(a+"'''");Sk._tokenize=function(b,f,k,n){var l=Sk.__future__.python3?"":"(?:L?)";l=c("0[xX](?:_?[0-9a-fA-F])+"+l,"0[bB](?:_?[01])+"+l,Sk.__future__.silent_octal_literal?"0([oO]?)(?:_?[0-7])+"+l:"0([oO])(?:_?[0-7])+"+l,"(?:0(?:_?0)*|[1-9](?:_?[0-9])*)"+l);l=c(A,w,l);l="[ \\f\\t]*"+c(F,l,B,E,"\\w+");l=new RegExp(l);var m=0,t=0,q=0,y="",u=0,C=null,N=[0],H,R=void 0, +X=void 0,J,T;void 0!==k&&("utf-8-sig"==k&&(k="utf-8"),n(new a(h.T_ENCODING,k,[0,0],[0,0],"")));for(var D=k="";;){try{k=D,D=f()}catch(Q){D=""}m+=1;var x=0,P=D.length;if(y){if(!D)throw new d("EOF in multi-line string",b,X[0],X[1]);R.lastIndex=0;var r=R.exec(D);if(r)x=J=r[0].length,n(new a(h.T_STRING,y+D.substring(0,J),X,[m,J],C+D)),y="",u=0,C=null;else{u&&"\\\n"!==D.substring(D.length-2)&&"\\\r\n"!==D.substring(D.length-3)?(n(new a(h.T_ERRORTOKEN,y+D,X,[m,D.length],C)),y="",C=null):(y+=D,C+=D);continue}}else if(0!= +t||q){if(!D)throw new d("EOF in multi-line statement",b,m,0);q=0}else{if(!D)break;for(H=0;xN[N.length-1]&&(N.push(H),n(new a(h.T_INDENT, +D.substring(x),[m,0],[m,x],D)));for(;H":Sk.token.tokens.T_GREATER,"=":Sk.token.tokens.T_EQUAL,".":Sk.token.tokens.T_DOT,"%":Sk.token.tokens.T_PERCENT,"`":Sk.token.tokens.T_BACKQUOTE,"{":Sk.token.tokens.T_LBRACE,"}":Sk.token.tokens.T_RBRACE,"@":Sk.token.tokens.T_AT,"@=":Sk.token.tokens.T_ATEQUAL, +"==":Sk.token.tokens.T_EQEQUAL,"!=":Sk.token.tokens.T_NOTEQUAL,"<>":Sk.token.tokens.T_NOTEQUAL,"<=":Sk.token.tokens.T_LESSEQUAL,">=":Sk.token.tokens.T_GREATEREQUAL,"~":Sk.token.tokens.T_TILDE,"^":Sk.token.tokens.T_CIRCUMFLEX,"<<":Sk.token.tokens.T_LEFTSHIFT,">>":Sk.token.tokens.T_RIGHTSHIFT,"**":Sk.token.tokens.T_DOUBLESTAR,"+=":Sk.token.tokens.T_PLUSEQUAL,"-=":Sk.token.tokens.T_MINEQUAL,"*=":Sk.token.tokens.T_STAREQUAL,"/=":Sk.token.tokens.T_SLASHEQUAL,"%=":Sk.token.tokens.T_PERCENTEQUAL,"&=":Sk.token.tokens.T_AMPEREQUAL, +"|=":Sk.token.tokens.T_VBAREQUAL,"^=":Sk.token.tokens.T_CIRCUMFLEXEQUAL,"<<=":Sk.token.tokens.T_LEFTSHIFTEQUAL,">>=":Sk.token.tokens.T_RIGHTSHIFTEQUAL,"**=":Sk.token.tokens.T_DOUBLESTAREQUAL,"//":Sk.token.tokens.T_DOUBLESLASH,"//=":Sk.token.tokens.T_DOUBLESLASHEQUAL,"->":Sk.token.tokens.T_RARROW,"...":Sk.token.tokens.T_ELLIPSIS};Sk.ParseTables={sym:{and_expr:257,and_test:258,annassign:259,arglist:260,argument:261,arith_expr:262,assert_stmt:263,async_funcdef:264,async_stmt:265,atom:266,atom_expr:267, +augassign:268,break_stmt:269,classdef:270,comp_for:271,comp_if:272,comp_iter:273,comp_op:274,comparison:275,compound_stmt:276,continue_stmt:277,debugger_stmt:278,decorated:279,decorator:280,decorators:281,del_stmt:282,dictorsetmaker:283,dotted_as_name:284,dotted_as_names:285,dotted_name:286,encoding_decl:287,eval_input:288,except_clause:289,expr:290,expr_stmt:291,exprlist:292,factor:293,file_input:294,flow_stmt:295,for_stmt:296,funcdef:297,global_stmt:298,if_stmt:299,import_as_name:300,import_as_names:301, +import_from:302,import_name:303,import_stmt:304,lambdef:305,lambdef_nocond:306,nonlocal_stmt:307,not_test:308,or_test:309,parameters:310,pass_stmt:311,power:312,print_stmt:313,raise_stmt:314,return_stmt:315,shift_expr:316,simple_stmt:317,single_input:256,sliceop:318,small_stmt:319,star_expr:320,stmt:321,subscript:322,subscriptlist:323,suite:324,term:325,test:326,test_nocond:327,testlist:328,testlist_comp:329,testlist_star_expr:330,tfpdef:331,trailer:332,try_stmt:333,typedargslist:334,varargslist:335, +vfpdef:336,while_stmt:337,with_item:338,with_stmt:339,xor_expr:340,yield_arg:341,yield_expr:342,yield_stmt:343},number2symbol:{256:"single_input",257:"and_expr",258:"and_test",259:"annassign",260:"arglist",261:"argument",262:"arith_expr",263:"assert_stmt",264:"async_funcdef",265:"async_stmt",266:"atom",267:"atom_expr",268:"augassign",269:"break_stmt",270:"classdef",271:"comp_for",272:"comp_if",273:"comp_iter",274:"comp_op",275:"comparison",276:"compound_stmt",277:"continue_stmt",278:"debugger_stmt", +279:"decorated",280:"decorator",281:"decorators",282:"del_stmt",283:"dictorsetmaker",284:"dotted_as_name",285:"dotted_as_names",286:"dotted_name",287:"encoding_decl",288:"eval_input",289:"except_clause",290:"expr",291:"expr_stmt",292:"exprlist",293:"factor",294:"file_input",295:"flow_stmt",296:"for_stmt",297:"funcdef",298:"global_stmt",299:"if_stmt",300:"import_as_name",301:"import_as_names",302:"import_from",303:"import_name",304:"import_stmt",305:"lambdef",306:"lambdef_nocond",307:"nonlocal_stmt", +308:"not_test",309:"or_test",310:"parameters",311:"pass_stmt",312:"power",313:"print_stmt",314:"raise_stmt",315:"return_stmt",316:"shift_expr",317:"simple_stmt",318:"sliceop",319:"small_stmt",320:"star_expr",321:"stmt",322:"subscript",323:"subscriptlist",324:"suite",325:"term",326:"test",327:"test_nocond",328:"testlist",329:"testlist_comp",330:"testlist_star_expr",331:"tfpdef",332:"trailer",333:"try_stmt",334:"typedargslist",335:"varargslist",336:"vfpdef",337:"while_stmt",338:"with_item",339:"with_stmt", +340:"xor_expr",341:"yield_arg",342:"yield_expr",343:"yield_stmt"},dfas:{256:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],257:[[[[44,1]],[[45,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],258:[[[[46,1]],[[47,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1, +35:1,38:1,43:1}],259:[[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],{48:1}],260:[[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],261:[[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],262:[[[[55,1]],[[30,0],[43,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],263:[[[[24,1]],[[49, +2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],{24:1}],264:[[[[10,1]],[[56,2]],[[0,2]]],{10:1}],265:[[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],{10:1}],266:[[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,33:1,35:1,38:1}],267:[[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],268:[[[[67,1],[68,1],[69,1], +[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],{67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:1,75:1,76:1,77:1,78:1,79:1}],269:[[[[39,1]],[[0,1]]],{39:1}],270:[[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],{13:1}],271:[[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],{10:1,34:1}],272:[[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],{37:1}],273:[[[[87,1],[54,1]],[[0,1]]],{10:1,34:1,37:1}],274:[[[[88,1],[89,1], +[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],{8:1,83:1,88:1,89:1,90:1,91:1,92:1,93:1,94:1}],275:[[[[95,1]],[[96,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],276:[[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],{4:1,10:1,13:1,20:1,21:1,34:1,37:1,41:1,42:1}],277:[[[[40,1]],[[0,1]]],{40:1}],278:[[[[17,1]],[[0,1]]],{17:1}],279:[[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],{41:1}],280:[[[[41,1]], +[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],{41:1}],281:[[[[106,1]],[[106,1],[0,1]]],{41:1}],282:[[[[27,1]],[[82,2]],[[0,2]]],{27:1}],283:[[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],284:[[[[105,1]],[[108, +2],[0,1]],[[25,3]],[[0,3]]],{25:1}],285:[[[[109,1]],[[52,0],[0,1]]],{25:1}],286:[[[[25,1]],[[110,0],[0,1]]],{25:1}],287:[[[[25,1]],[[0,1]]],{25:1}],288:[[[[111,1]],[[2,1],[112,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],289:[[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],{113:1}],290:[[[[114,1]],[[115,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],291:[[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111, +4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],292:[[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],{6:1,7:1,9:1,11:1,12:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],293:[[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],294:[[[[2,0],[112,1],[121,0]],[[0,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1, +17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1,112:1}],295:[[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],{5:1,23:1,31:1,39:1,40:1}],296:[[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],{34:1}],297:[[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],{4:1}],298:[[[[26,1]],[[25,2]],[[52,1],[0,2]]],{26:1}],299:[[[[37,1]],[[49,2]], +[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{37:1}],300:[[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],301:[[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],{25:1}],302:[[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],{36:1}],303:[[[[32,1]],[[133,2]],[[0,2]]],{32:1}],304:[[[[134,1],[135,1]],[[0,1]]],{32:1,36:1}],305:[[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],{14:1}],306:[[[[14,1]], +[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],{14:1}],307:[[[[18,1]],[[25,2]],[[52,1],[0,2]]],{18:1}],308:[[[[8,1],[137,2]],[[46,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],309:[[[[138,1]],[[139,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],310:[[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],{35:1}],311:[[[[28,1]],[[0,1]]],{28:1}],312:[[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1, +35:1,38:1}],313:[[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],{16:1}],314:[[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],{5:1}],315:[[[[23,1]],[[111,2],[0,1]],[[0,2]]],{23:1}],316:[[[[143,1]],[[144,0],[142,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],317:[[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1, +15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],318:[[[[48,1]],[[49,2],[0,1]],[[0,2]]],{48:1}],319:[[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],320:[[[[15,1]],[[95,2]],[[0,2]]],{15:1}],321:[[[[1,1],[3,1]],[[0,1]]],{4:1,5:1,6:1,7:1, +8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],322:[[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],323:[[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],324:[[[[1,1],[2,2]], +[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],{2:1,5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],325:[[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],326:[[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],327:[[[[165, +1],[84,1]],[[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],328:[[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],329:[[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],330:[[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1, +22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],331:[[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],{25:1}],332:[[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],{35:1,38:1,110:1}],333:[[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],{20:1}],334:[[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0, +5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],335:[[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]], +[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],336:[[[[25,1]],[[0,1]]],{25:1}],337:[[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{21:1}],338:[[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],339:[[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],{42:1}],340:[[[[172,1]],[[173,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1, +35:1,38:1,43:1}],341:[[[[111,2],[36,1]],[[49,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,36:1,38:1,43:1}],342:[[[[31,1]],[[174,2],[0,1]],[[0,2]]],{31:1}],343:[[[[62,1]],[[0,1]]],{31:1}]},states:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],[[[44,1]],[[45,0],[0,1]]],[[[46,1]],[[47,0],[0,1]]],[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],[[[55,1]],[[30,0],[43,0], +[0,1]]],[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],[[[10,1]],[[56,2]],[[0,2]]],[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],[[[39,1]],[[0,1]]],[[[13,1]],[[25,2]],[[48,3],[35,4]], +[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],[[[87,1],[54,1]],[[0,1]]],[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],[[[95,1]],[[96,0],[0,1]]],[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],[[[40,1]],[[0,1]]],[[[17,1]],[[0,1]]],[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],[[[41,1]],[[105, +2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],[[[106,1]],[[106,1],[0,1]]],[[[27,1]],[[82,2]],[[0,2]]],[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[109,1]],[[52,0],[0,1]]],[[[25,1]],[[110,0],[0,1]]],[[[25,1]],[[0,1]]],[[[111,1]],[[2,1],[112,2]],[[0,2]]], +[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],[[[114,1]],[[115,0],[0,1]]],[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],[[[2,0],[112,1],[121,0]],[[0,1]]],[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],[[[4,1]],[[25, +2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],[[[26,1]],[[25,2]],[[52,1],[0,2]]],[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],[[[32,1]],[[133,2]],[[0,2]]],[[[134,1],[135,1]],[[0,1]]],[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48, +2]],[[0,4]]],[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],[[[18,1]],[[25,2]],[[52,1],[0,2]]],[[[8,1],[137,2]],[[46,2]],[[0,2]]],[[[138,1]],[[139,0],[0,1]]],[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],[[[28,1]],[[0,1]]],[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],[[[23,1]],[[111, +2],[0,1]],[[0,2]]],[[[143,1]],[[144,0],[142,0],[0,1]]],[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],[[[48,1]],[[49,2],[0,1]],[[0,2]]],[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],[[[15,1]],[[95,2]],[[0,2]]],[[[1,1],[3,1]],[[0,1]]],[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],[[[120,1]],[[161,0],[15,0],[162, +0],[41,0],[163,0],[0,1]]],[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],[[[165,1],[84,1]],[[0,1]]],[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]], +[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52, +8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[25,1]],[[0,1]]],[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],[[[172,1]],[[173,0],[0,1]]],[[[111,2], +[36,1]],[[49,2]],[[0,2]]],[[[31,1]],[[174,2],[0,1]],[[0,2]]],[[[62,1]],[[0,1]]]],labels:[[0,"EMPTY"],[317,null],[4,null],[276,null],[1,"def"],[1,"raise"],[1,"True"],[3,null],[1,"not"],[1,"null"],[55,null],[2,null],[25,null],[1,"class"],[1,"lambda"],[16,null],[1,"print"],[1,"debugger"],[1,"nonlocal"],[52,null],[1,"try"],[1,"while"],[31,null],[1,"return"],[1,"assert"],[1,null],[1,"global"],[1,"del"],[1,"pass"],[54,null],[15,null],[1,"yield"],[1,"import"],[1,"False"],[1,"for"],[7,null],[1,"from"],[1, +"if"],[9,null],[1,"break"],[1,"continue"],[49,null],[1,"with"],[14,null],[316,null],[19,null],[308,null],[1,"and"],[11,null],[326,null],[22,null],[261,null],[12,null],[35,null],[271,null],[325,null],[297,null],[339,null],[296,null],[26,null],[283,null],[8,null],[342,null],[329,null],[10,null],[266,null],[332,null],[45,null],[38,null],[40,null],[50,null],[46,null],[41,null],[42,null],[36,null],[43,null],[48,null],[44,null],[37,null],[39,null],[324,null],[260,null],[292,null],[1,"in"],[309,null],[273, +null],[327,null],[272,null],[28,null],[21,null],[27,null],[29,null],[1,"is"],[30,null],[20,null],[290,null],[274,null],[333,null],[299,null],[270,null],[337,null],[279,null],[265,null],[281,null],[264,null],[286,null],[280,null],[320,null],[1,"as"],[284,null],[23,null],[328,null],[0,null],[1,"except"],[340,null],[18,null],[330,null],[268,null],[259,null],[312,null],[293,null],[321,null],[269,null],[277,null],[314,null],[315,null],[343,null],[1,"else"],[310,null],[51,null],[1,"elif"],[300,null],[301, +null],[285,null],[303,null],[302,null],[335,null],[275,null],[258,null],[1,"or"],[334,null],[267,null],[34,null],[262,null],[33,null],[319,null],[13,null],[295,null],[263,null],[291,null],[311,null],[307,null],[313,null],[282,null],[298,null],[304,null],[278,null],[318,null],[322,null],[5,null],[6,null],[47,null],[17,null],[24,null],[305,null],[306,null],[323,null],[289,null],[1,"finally"],[331,null],[336,null],[338,null],[257,null],[32,null],[341,null]],keywords:{False:33,"null":9,True:6,and:47, +as:108,assert:24,"break":39,"class":13,"continue":40,"debugger":17,def:4,del:27,elif:130,"else":127,except:113,"finally":168,"for":34,from:36,global:26,"if":37,"import":32,"in":83,is:92,lambda:14,nonlocal:18,not:8,or:139,pass:28,print:16,raise:5,"return":23,"try":20,"while":21,"with":42,yield:31},tokens:{0:112,1:25,2:11,3:7,4:2,5:159,6:160,7:35,8:61,9:38,10:64,11:48,12:52,13:146,14:43,15:30,16:15,17:162,18:115,19:45,20:94,21:89,22:50,23:110,24:163,25:12,26:59,27:90,28:88,29:91,30:93,31:22,32:173, +33:144,34:142,35:53,36:74,37:78,38:68,39:79,40:69,41:72,42:73,43:75,44:77,45:67,46:71,47:161,48:76,49:41,50:70,51:129,52:19,54:29,55:10},start:256}},function(m,q){function a(a,c){this.filename=a;this.grammar=c;this.p_flags=0;return this}function c(b,c){void 0===c&&(c="file_input");b=new a(b,Sk.ParseTables);"file_input"===c?b.setup(Sk.ParseTables.sym.file_input):Sk.asserts.fail("todo;");return b}a.FUTURE_PRINT_FUNCTION="print_function";a.FUTURE_UNICODE_LITERALS="unicode_literals";a.FUTURE_DIVISION= +"division";a.FUTURE_ABSOLUTE_IMPORT="absolute_import";a.FUTURE_WITH_STATEMENT="with_statement";a.FUTURE_NESTED_SCOPES="nested_scopes";a.FUTURE_GENERATORS="generators";a.CO_FUTURE_PRINT_FUNCTION=65536;a.CO_FUTURE_UNICODE_LITERALS=131072;a.CO_FUTURE_DIVISON=8192;a.CO_FUTURE_ABSOLUTE_IMPORT=16384;a.CO_FUTURE_WITH_STATEMENT=32768;a.prototype.setup=function(a){a=a||this.grammar.start;this.stack=[{dfa:this.grammar.dfas[a],state:0,node:{type:a,value:null,context:null,children:[]}}];this.used_names={}};a.prototype.addtoken= +function(a,c,f){var b,e=this.classify(a,c,f);a:for(;;){var d=this.stack[this.stack.length-1];var g=d.dfa[0];var n=g[d.state];for(b=0;bm);this.shift(a,c,p,f);for(f=p;1===g[f].length&&0===g[f][0][0]&&g[f][0][1]===f;){this.pop();if(0===this.stack.length)return!0;d=this.stack[this.stack.length-1];f=d.state;g=d.dfa[0]}return!1}if(256<=m&&(k=this.grammar.dfas[m],k=k[1],k.hasOwnProperty(e))){this.push(m, +this.grammar.dfas[m],p,f);continue a}}b:{g=[0,d.state];for(d=n.length;d--;)if(n[d][0]===g[0]&&n[d][1]===g[1]){n=!0;break b}n=!1}if(n){if(this.pop(),0===this.stack.length)throw new Sk.builtin.SyntaxError("too much input",this.filename);}else throw a=f[0][0],new Sk.builtin.SyntaxError("bad input",this.filename,a,f);}};a.prototype.classify=function(b,c,f){if(b===Sk.token.tokens.T_NAME){this.used_names[c]=!0;var e=this.grammar.keywords.hasOwnProperty(c)&&this.grammar.keywords[c];"print"===c&&(this.p_flags& +a.CO_FUTURE_PRINT_FUNCTION||!0===Sk.__future__.print_function)&&(e=!1);if(e)return e}e=this.grammar.tokens.hasOwnProperty(b)&&this.grammar.tokens[b];if(!e){c="#"+b;for(let a in Sk.token.tokens)if(Sk.token.tokens[a]==b){c=a;break}throw new Sk.builtin.SyntaxError("bad token "+c,this.filename,f[0][0],f);}return e};a.prototype.shift=function(a,c,f,l){var b=this.stack[this.stack.length-1].dfa,d=this.stack[this.stack.length-1].node;d.children.push({type:a,value:c,lineno:l[0][0],col_offset:l[0][1],children:null}); +this.stack[this.stack.length-1]={dfa:b,state:f,node:d}};a.prototype.push=function(a,c,f,l){a={type:a,value:null,lineno:l[0][0],col_offset:l[0][1],children:[]};this.stack[this.stack.length-1]={dfa:this.stack[this.stack.length-1].dfa,state:f,node:this.stack[this.stack.length-1].node};this.stack.push({dfa:c,state:0,node:a})};a.prototype.pop=function(){var a=this.stack.pop().node;if(a)if(0!==this.stack.length){var c=this.stack[this.stack.length-1].node;c.children.push(a)}else this.rootnode=a,this.rootnode.used_names= +this.used_names};Sk.parse=function(a,e){var b=Sk.token.tokens.T_COMMENT,l=Sk.token.tokens.T_NL,h=Sk.token.tokens.T_OP,d=Sk.token.tokens.T_ENDMARKER,g=Sk.token.tokens.T_ENCODING,n=!1,k=c(a);Sk._tokenize(a,function(a){var b=a.split("\n").reverse().map(function(a){return a+"\n"});return function(){if(0===b.length)throw new Sk.builtin.Exception("EOF");return b.pop()}}(e),"utf-8",function(a){var c=null;a.type!==b&&a.type!==l&&a.type!==g&&(a.type===h&&(c=Sk.OpMap[a.string]),k.addtoken(c||a.type,a.string, +[a.start,a.end,a.line]),a.type===d&&(n=!0))});if(!n)throw new Sk.builtin.SyntaxError("incomplete input",this.filename);return{cst:k.rootnode,flags:k.p_flags}};Sk.parseTreeDump=function(a,c){var b;c=c||"";var e=""+c;if(256<=a.type)for(e+=Sk.ParseTables.number2symbol[a.type]+"\n",b=0;b=c(d)||g+2== +c(d)&&b(d,g+1).type==z.T_COMMA)throw new Sk.builtin.SyntaxError("named arguments must follow bare *",a.c_filename,d.lineno);m=b(d,g+1);m.type==z.T_COMMA?(g+=2,g=N(a,d,g,n,v)):(l=C(a,m),g+=3,ga.c_feature_version)return f(a,v,"Async functions are only supported in Python 3.5 and greater"),null;e(v,r.funcdef);var I=k(b(v,p));if(d(a,I,b(v,p),0))return null;var L=u(a,b(v,p+1));if(!L)return null;if(b(v,p+2).type==z.T_RARROW){l=x(a,b(v,p+3));if(!l)return null;p+=2}if(b(v,p+3).type==z.T_TYPE_COMMENT){m=z.T_NEW_TYPE_COMMENT(b(v,p+3));if(!m)return null;p+=1}var M=t(a,b(v,p+3));if(!M)return null;if(1":return Sk.astnodes.RShift; +case "&":return Sk.astnodes.BitAnd;case "^":return Sk.astnodes.BitXor;case "|":return Sk.astnodes.BitOr;case "*":return"*"===c.value.charAt(1)?Sk.astnodes.Pow:Sk.astnodes.Mult;case "@":if(Sk.__future__.python3)return Sk.astnodes.MatMult;default:Sk.asserts.fail("invalid augassign")}}function W(a,d){Sk.asserts.assert(0=b);Sk.asserts.assert("{"==a.charAt(b-1));Sk.asserts.assert("}"==a.charAt(c)||"!"==a.charAt(c)||":"==a.charAt(c));a=a.substring(b,c);/^\s*$/.test(a)&&f(d,e,"f-string: empty expression not allowed"); +try{let b=Sk.parse("","("+a+")");var g=Sk.astFromParse(b.cst,"",b.flags)}catch(Y){throw Y.traceback&&Y.traceback[0]&&(g=Y.traceback[0],g.lineno=(g.lineno||1)-1+e.lineno,g.filename=d.c_filename),Y;}Sk.asserts.assert(1==g.body.length&&g.body[0].constructor===Sk.astnodes.Expr);return g.body[0].value}function H(a,b,c,d,e,g,h){Sk.asserts.assert("{"==a.charAt(b));b++;var k=b;let n=null,l=0,p=0,m,v,I=()=>f(g,h,"f-string: expecting '}'");for(Sk.asserts.assert(b<=c);b=c&&I(),v=a.charAt(b),b++,"s"!=v&&"r"!=v&&"a"!=v&&f(g,h,"f-string: invalid conversion character: expected 's', 'r', or 'a'"));b>=c&&I();":"==a.charAt(b)&&(b++,b>=c&&I(),[m,b]=ba(a,b,c,d,e+1,g,h));(b>=c||"}"!=a.charAt(b))&&I();b++;return[new Sk.astnodes.FormattedValue(k,v,m,h.lineno,h.col_offset),b]}function ba(a,b,c,d,e,f,g){let h=[],k=a=>{if(-1!==a.indexOf("}")){if(/(^|[^}])}(}})*($|[^}])/.test(a))throw new SyntaxError("f-string: single '}' is not allowed", +g.lineno,g.col_offset);a=a.replace(/}}/g,"}")}h.push(new Sk.astnodes.Str(new Sk.builtin.str(a),g.lineno,g.col_offset,f.end_lineno,g.end_col_offset))};for(;bd&&(n=-1,c=d))}if(-1===n){k(a.substring(b,c));b=c;break}else if(n+1Number.MAX_SAFE_INTEGER&&Math.floor(c)===c&&-1===b.indexOf("e")&& +-1===b.indexOf("E")?Sk.longFromStr(b,0):a?new Sk.builtin.int_(-c):new Sk.builtin.int_(c)}function J(a,d){var f,g;e(d,r.subscript);var h=b(d,0);var k=f=g=null;if(h.type===z.T_DOT)return new Sk.astnodes.Ellipsis;if(1===c(d)&&h.type===r.test)return new Sk.astnodes.Index(x(a,h));h.type===r.test&&(g=x(a,h));h.type===z.T_COLON?1=h.length){if("None"===h)return new Sk.astnodes.NameConstant(Sk.builtin.none.none$,d.lineno,d.col_offset);if("True"===h)return new Sk.astnodes.NameConstant(Sk.builtin.bool.true$,d.lineno,d.col_offset);if("False"===h)return new Sk.astnodes.NameConstant(Sk.builtin.bool.false$,d.lineno,d.col_offset)}a= +k(h,a);return new Sk.astnodes.Name(a,Sk.astnodes.Load,d.lineno,d.col_offset,d.end_lineno,d.end_col_offset);case z.T_STRING:g=[];for(var n=0;n=B&&f(m,v,"Truncated \\xNN escape"),u+=String.fromCharCode(parseInt(L.substr(t+1,2),16)),t+=2):y||"u"!==q?y||"U"!==q?u+="\\"+q:(t+8>=B&&f(m,v,"Truncated \\UXXXXXXXX escape"),u+=String.fromCodePoint(parseInt(L.substr(t+1,8),16)),t+=8):(t+4>=B&&f(m,v,"Truncated \\uXXXX escape"),u+=String.fromCharCode(parseInt(L.substr(t+1,4),16)),t+=4))):y&&1273-h&&b(g,3-h).type==r.comp_for){if(h)return f(a,d,"dict unpacking cannot be used in dict comprehension"), +null;h=g;Sk.asserts.assert(3>11&7;this.__namespaces=c||[]}function c(a,b,c,e,f){this.symFlags={};this.name=b;this.varnames=[];this.children=[];this.blockType=c;this.returnsValue=this.varkeywords=this.varargs=this.generator=this.childHasFree=this.hasFree=this.isNested=!1;this.lineno=f;this.table=a;a.cur&& +(a.cur.nested||"function"===a.cur.blockType)&&(this.isNested=!0);e.scopeId=l++;a.stss[e.scopeId]=this;this.symbols={}}function b(a){this.filename=a;this.top=this.cur=null;this.stack=[];this.curClass=this.global=null;this.tmpname=0;this.stss={}}function e(a,b){var c;for(c=0;c>11&7;return 3==a||2==a}));return this._funcGlobals}; +c.prototype.get_frees=function(){Sk.asserts.assert("function"==this.get_type(),"get_frees only valid for function scopes");this._funcFrees||(this._funcFrees=this._identsMatching(function(a){return 4==(a>>11&7)}));return this._funcFrees};c.prototype.get_methods=function(){var a;Sk.asserts.assert("class"==this.get_type(),"get_methods only valid for class scopes");if(!this._classMethods){var b=[];for(a=0;a>11&7};b.prototype.getStsForAst=function(a){Sk.asserts.assert(void 0!==a.scopeId,"ast wasn't added to st?");a=this.stss[a.scopeId];Sk.asserts.assert(void 0!==a,"unknown sym tab entry");return a};b.prototype.SEQStmt=function(a){var b,c;if(null!==a){Sk.asserts.assert(Sk.isArrayLike(a),"SEQ: nodes isn't array? got "+a.toString());var e=a.length;for(c=0;cd||127<=d&&256>d?b+("\\x"+("0"+d.toString(16)).substr(-2)):256<=d?b+("\\u"+("000"+d.toString(16)).substr(-4)):b+a.charAt(c)}return b+'"'}var l;Sk.gensymcount=0;c.prototype.activateScope=function(){var a=this;l=function(){var b,c=a.blocks[a.curblock];if(null===c._next)for(b=0;b","").replace(" ","_"))}; +var h=Sk.builtin.str.reservedWords_;a.prototype.makeConstant=function(a){var b,c="";for(b=0;b Sk.execLimit) {throw new Sk.builtin.TimeLimitError(Sk.timeoutMsg())}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(a=a+"if ($dateNow - Sk.lastYield > Sk.yieldLimit) {"+("var $susp = $saveSuspension({data: {type: 'Sk.yield'}, resume: function() {}}, '"+this.filename+"',$currLineNo,$currColNo);"),a+="$susp.$blk = $blk;$susp.optional = true;return $susp;}", +this.u.doesSuspend=!0);return a};a.prototype._jumpfalse=function(a,b){a=this._gr("jfalse","(",a,"===false||!Sk.misceval.isTrue(",a,"))");l("if(",a,"){/*test failed */$blk=",b,";continue;}")};a.prototype._jumpundef=function(a,b){l("if(",a,"===undefined){$blk=",b,";continue;}")};a.prototype._jumpnotundef=function(a,b){l("if(",a,"!==undefined){$blk=",b,";continue;}")};a.prototype._jumptrue=function(a,b){a=this._gr("jtrue","(",a,"===true||Sk.misceval.isTrue(",a,"))");l("if(",a,"){/*test passed */$blk=", +b,";continue;}")};a.prototype._jump=function(a){null===this.u.blocks[this.u.curblock]._next&&(l("$blk=",a,";"),this.u.blocks[this.u.curblock]._next=a)};a.prototype._checkSuspension=function(a){if(this.u.canSuspend){var b=this.newBlock("function return or resume suspension");this._jump(b);this.setBlock(b);a=a||{lineno:"$currLineNo",col_offset:"$currColNo"};l("if ($ret && $ret.$isSuspension) { return $saveSuspension($ret,'"+this.filename+"',"+a.lineno+","+a.col_offset+"); }");this.u.doesSuspend=!0; +this.u.tempsToSave=this.u.tempsToSave.concat(this.u.localtemps)}else l("if ($ret && $ret.$isSuspension) { $ret = Sk.misceval.retryOptionalSuspensionOrThrow($ret); }")};a.prototype.cunpackstarstoarray=function(a,b){if(!a||0==a.length)return"[]";let c=!1;for(let d of a){if(b&&c)throw new Sk.builtin.SyntaxError("Extended argument unpacking is not permitted in Python 2");d.constructor===Sk.astnodes.Starred&&(c=!0)}if(c){b=this._gr("unpack","[]");for(let c of a)c.constructor!==Sk.astnodes.Starred?l(b, +".push(",this.vexpr(c),");"):(l("$ret = Sk.misceval.iterFor(Sk.abstr.iter(",this.vexpr(c.value),"), function(e) { ",b,".push(e); });"),this._checkSuspension());return b}return"["+a.map(a=>this.vexpr(a)).join(",")+"]"};a.prototype.ctuplelistorset=function(a,b,c){var d;Sk.asserts.assert("tuple"===c||"list"===c||"set"===c);var e=!1;for(d=0;d=c.length&&(c=this.vexpr(f),"dict"===a?(a=this.vexpr(h),l(b,".mp$ass_subscript(",a,",",c,");")):"list"===a?l(b,".v.push(",c,");"):"set"===a&&l(b,".v.mp$ass_subscript(",c,", true);"),this._jump(g),this.setBlock(g));this._jump(d);this.setBlock(k);return b};a.prototype.cyield=function(a){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'yield' outside function",this.filename,a.lineno);var b="Sk.builtin.none.none$";a.value&&(b=this.vexpr(a.value)); +a=this.newBlock("after yield");l("return [/*resume*/",a,",/*ret*/",b,"];");this.setBlock(a);return"$gen.gi$sentvalue"};a.prototype.ccompare=function(a){var b;Sk.asserts.assert(a.ops.length===a.comparators.length);var c=this.vexpr(a.left);var d=a.ops.length;var e=this.newBlock("done");var f=this._gr("compareres","null");for(b=0;b 0) { throw new Sk.builtin.RuntimeError("super(): no arguments") };'),c="[$gbl.__class__,self]");l("$ret = (",b,".tp$call)?",b,".tp$call(",c,",",d,") : Sk.misceval.applyOrSuspend(", +b,",undefined,undefined,",d,",",c,");");this._checkSuspension(a);return this._gr("call","$ret")};a.prototype.cslice=function(a){Sk.asserts.assert(a instanceof Sk.astnodes.Slice);if(Sk.__future__.python3){var b=a.lower?this.vexpr(a.lower):"Sk.builtin.none.none$";var c=a.upper?this.vexpr(a.upper):"Sk.builtin.none.none$"}else b=a.lower?this.vexpr(a.lower):a.step?"Sk.builtin.none.none$":"new Sk.builtin.int_(0)",c=a.upper?this.vexpr(a.upper):a.step?"Sk.builtin.none.none$":"new Sk.builtin.int_(2147483647)"; +a=a.step?this.vexpr(a.step):"Sk.builtin.none.none$";return this._gr("slice","new Sk.builtins['slice'](",b,",",c,",",a,")")};a.prototype.eslice=function(a){var b;Sk.asserts.assert(a instanceof Array);var c=[];for(b=0;bthis.u.lineno&&(this.u.lineno=a.lineno,this.u.linenoSet=!1);switch(a.constructor){case Sk.astnodes.BoolOp:return this.cboolop(a);case Sk.astnodes.BinOp:return this._gr("binop","Sk.abstr.numberBinOp(",this.vexpr(a.left),",",this.vexpr(a.right),",'",a.op.prototype._astname,"')");case Sk.astnodes.UnaryOp:return this._gr("unaryop", +"Sk.abstr.numberUnaryOp(",this.vexpr(a.operand),",'",a.op.prototype._astname,"')");case Sk.astnodes.Lambda:return this.clambda(a);case Sk.astnodes.IfExp:return this.cifexp(a);case Sk.astnodes.Dict:return this.cdict(a);case Sk.astnodes.ListComp:return this.clistcomp(a);case Sk.astnodes.DictComp:return this.cdictcomp(a);case Sk.astnodes.SetComp:return this.csetcomp(a);case Sk.astnodes.GeneratorExp:return this.cgenexp(a);case Sk.astnodes.Yield:return this.cyield(a);case Sk.astnodes.Compare:return this.ccompare(a); +case Sk.astnodes.Call:return b=this.ccall(a),this.annotateSource(a),b;case Sk.astnodes.Num:if("number"===typeof a.n)return a.n;if(a.n instanceof Sk.builtin.lng)return this.makeConstant("new Sk.builtin.lng('"+a.n.v.toString()+"')");if(a.n instanceof Sk.builtin.int_)return"number"===typeof a.n.v?this.makeConstant("new Sk.builtin.int_("+a.n.v+")"):this.makeConstant("new Sk.builtin.int_('"+a.n.v.toString()+"')");if(a.n instanceof Sk.builtin.float_)return a=0===a.n.v&&-Infinity===1/a.n.v?"-0":a.n.v,this.makeConstant("new Sk.builtin.float_("+ +a+")");if(a.n instanceof Sk.builtin.complex)return this.makeConstant("new Sk.builtin.complex("+(0===a.n.real&&-Infinity===1/a.n.real?"-0":a.n.real)+", "+(0===a.n.imag&&-Infinity===1/a.n.imag?"-0":a.n.imag)+")");Sk.asserts.fail("unhandled Num type");case Sk.astnodes.Bytes:if(Sk.__future__.python3){b=[];a=a.s.$jsstr();for(c=0;c";this.u.blocks[b]._next=null;return b};a.prototype.setBlock=function(a){Sk.asserts.assert(0<=a&&a0) { $err=err; $blk=$exc.pop(); } else { throw err; } }};";h+="var $saveSuspension = function($child, $filename, $lineno, $colno) {var susp = new Sk.misceval.Suspension(); susp.child=$child;susp.resume=function(){"+a.scopename+".$wakingSuspension=susp; return "+a.scopename+"("+(a.ste.generator?"$gen":"")+"); };susp.data=susp.child.data;susp.$blk=$blk;susp.$loc=$loc;susp.$gbl=$gbl;susp.$exc=$exc;susp.$err=$err;susp.$postfinally=$postfinally;susp.$filename=$filename;susp.$lineno=$lineno;susp.$colno=$colno;susp.optional=susp.child.optional;"+ +(f?"susp.$cell=$cell;":"");e={};for(b=0;ba?this.vexpr(a):"undefined"));k&&k.vararg&&(w=k.vararg);k&&k.kwarg&&(K=k.kwarg);if(!Sk.__future__.python3&&k&&k.kwonlyargs&&0!=k.kwonlyargs.length)throw new Sk.builtin.SyntaxError("Keyword-only arguments are not supported in Python 2"); +var G=this.enterScope(c,a,a.lineno,this.canSuspend);f=this.u.ste.generator;var U=this.u.ste.hasFree;var C=this.u.ste.childHasFree;var N=this.newBlock("codeobj entry");this.u.prefixCode="var "+G+"=(function "+this.niceName(c.v)+"$(";var u=[];if(f){if(K)throw new Sk.builtin.SyntaxError(c.v+"(): keyword arguments in generators not supported",this.filename,a.lineno);if(w)throw new Sk.builtin.SyntaxError(c.v+"(): variable number of arguments in generators not supported",this.filename,a.lineno);u.push("$gen")}else{K&& +(u.push("$kwa"),this.u.tempsToSave.push("$kwa"));for(g=0;k&&g0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} }});";h.call(this,G);if(k){for(let a of k.args)d.push(a.arg.v); +for(let a of k.kwonlyargs||[])d.push(a.arg.v);this.u.argnames=d}this.exitScope();0"),null,a.args,function(b){b=this.vexpr(a.body);l("return ",b,";")})};a.prototype.cifexp=function(a){var b=this.newBlock("next of ifexp"),c=this.newBlock("end of ifexp"),d=this._gr("res","null"),e=this.vexpr(a.test);this._jumpfalse(e,b);l(d,"=",this.vexpr(a.body),";");this._jump(c); +this.setBlock(b);l(d,"=",this.vexpr(a.orelse),";");this._jump(c);this.setBlock(c);return d};a.prototype.cgenexpgen=function(a,b,c){var d=this.newBlock("start for "+b),e=this.newBlock("skip for "+b);this.newBlock("if cleanup for "+b);var f=this.newBlock("end for "+b),g=a[b];if(0===b)var h="$loc.$iter0";else{var m=this.vexpr(g.iter);h="$loc."+this.gensym("iter");l(h,"=","Sk.abstr.iter(",m,");")}this._jump(d);this.setBlock(d);this.annotateSource(c);l("$ret = Sk.abstr.iternext(",h,this.u.canSuspend?", true": +", false",");");this._checkSuspension(c);m=this._gr("next","$ret");this._jumpundef(m,f);this.vexpr(g.target,m);var n=g.ifs?g.ifs.length:0;for(h=0;h=a.length&&(this.annotateSource(c),a=this.vexpr(c),l("return [",e,"/*resume*/,",a,"/*ret*/];"),this.setBlock(e));this._jump(d);this.setBlock(f);1===b&&l("return Sk.builtin.none.none$;")};a.prototype.cgenexp=function(a){var b=this.buildcodeobj(a, +new Sk.builtin.str(""),null,null,function(b){this.cgenexpgen(a.generators,0,a.elt)});b=this._gr("gener","Sk.misceval.callsimArray(",b,");");l(b,".gi$locals.$iter0=Sk.abstr.iter(",this.vexpr(a.generators[0].iter),");");return b};a.prototype.cclass=function(a){Sk.asserts.assert(a instanceof Sk.astnodes.ClassDef);var b=this.vseqexpr(a.decorator_list);var c=this.vseqexpr(a.bases);var d=this.enterScope(a.name,a,a.lineno);var e=this.newBlock("class entry");this.u.prefixCode="var "+d+"=(function $"+ +a.name.v+"$class_outer($globals,$locals,$cell){var $gbl=$globals,$loc=$locals;$free=$globals;";this.u.switchCode+="(function $"+a.name.v+"$_closure($cell){";this.u.switchCode+="var $blk="+e+",$exc=[],$ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;";null!==Sk.execLimit&&(this.u.switchCode+="if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.switchCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}"); +this.u.switchCode+="while(true){try{";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+="switch($blk){";this.u.suffixCode="}}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }}}";this.u.suffixCode+="}).call(null, $cell);});";this.u.private_=a.name;this.cbody(a.body, +a.name);l("return;");this.exitScope();l("$ret = Sk.misceval.buildClass($gbl,",d,",",a.name.$r().v,",[",c,"], $cell);");for(let a of b)l("$ret = Sk.misceval.callsimOrSuspendArray(",a,", [$ret]);"),this._checkSuspension();this.nameop(a.name,Sk.astnodes.Store,"$ret")};a.prototype.ccontinue=function(a){var b=this.peekFinallyBlock();if(0==this.u.continueBlocks.length)throw new Sk.builtin.SyntaxError("'continue' outside loop",this.filename,a.lineno);a=this.u.continueBlocks[this.u.continueBlocks.length- +1];Sk.asserts.assert(this.u.breakBlocks.length===this.u.continueBlocks.length);b&&b.breakDepth==this.u.continueBlocks.length?l("$postfinally={isBreak:true,gotoBlock:",a,"};"):this._jump(a)};a.prototype.cbreak=function(a){var b=this.peekFinallyBlock();if(0===this.u.breakBlocks.length)throw new Sk.builtin.SyntaxError("'break' outside loop",this.filename,a.lineno);a=this.u.breakBlocks[this.u.breakBlocks.length-1];b&&b.breakDepth==this.u.breakBlocks.length?l("$postfinally={isBreak:true,gotoBlock:",a, +"};"):this._jump(a)};a.prototype.vstmt=function(a,b){this.u.lineno=a.lineno;this.u.linenoSet=!1;this.u.localtemps=[];if(Sk.debugging&&this.u.canSuspend){var c=this.newBlock("debug breakpoint for line "+a.lineno);l("if (Sk.breakpoints('"+this.filename+"',"+a.lineno+","+a.col_offset+")) {","var $susp = $saveSuspension({data: {type: 'Sk.debug'}, resume: function() {}}, '"+this.filename+"',"+a.lineno+","+a.col_offset+");","$susp.$blk = "+c+";","$susp.optional = true;","return $susp;","}");this._jump(c); +this.setBlock(c);this.u.doesSuspend=!0}this.annotateSource(a);switch(a.constructor){case Sk.astnodes.FunctionDef:this.cfunction(a,b);break;case Sk.astnodes.ClassDef:this.cclass(a);break;case Sk.astnodes.Return:if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'return' outside function",this.filename,a.lineno);c=a.value?this.vexpr(a.value):"Sk.builtin.none.none$";0==this.u.finallyBlocks.length?l("return ",c,";"):(l("$postfinally={returning:",c,"};"),this._jump(this.peekFinallyBlock().blk)); +break;case Sk.astnodes.Delete:this.vseqexpr(a.targets);break;case Sk.astnodes.Assign:var d=a.targets.length;c=this.vexpr(a.value);for(b=0;b"!==a.name.v){var b=a.name.$r().v;b=b.substring(1,b.length-1);l(a.scopename,".co_name=new Sk.builtins['str']('",b,"');");this.stack.length&&"class"==this.u.ste.blockType&&l(a.scopename,".co_qualname=new Sk.builtins['str']('"+this.u.name.v+"."+b+"');")}for(var c in a.consts)a.consts.hasOwnProperty(c)&& +(a.suffixCode+=c+" = "+a.consts[c]+";")};a.prototype.cbody=function(a,b){var c=0;const d=this.maybeCDocstringOfBody(a);null!==d&&(l("$loc.__doc__ = ",d,";"),c=1);for(;c"),a,0,this.canSuspend),c=this.newBlock("module entry");this.u.prefixCode="var "+b+"=(function($forcegbl){";this.u.varDeclsCode="var $gbl = $forcegbl || {}, $blk="+c+",$exc=[],$loc=$gbl,$cell={},$err=undefined;$loc.__file__=new Sk.builtins.str('"+this.filename+"');var $ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;";null!==Sk.execLimit&&(this.u.varDeclsCode+= +"if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.varDeclsCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}");this.u.varDeclsCode+="if ("+b+".$wakingSuspension!==undefined) { $wakeFromSuspension(); }if (Sk.retainGlobals) { if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; } if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; $loc.__file__=new Sk.builtins.str('"+ +this.filename+"');} else { Sk.globals = $gbl; }} else { Sk.globals = $gbl; }";this.u.switchCode="while(true){try{";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+="switch($blk){";this.u.suffixCode="}";this.u.suffixCode+="}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} } });"; +switch(a.constructor){case Sk.astnodes.Module:this.cbody(a.body);l("return $loc;");break;default:Sk.asserts.fail("todo; unhandled case in compilerMod")}this.exitScope();this.result.push(this.outputAllUnits());return b};Sk.compile=function(b,c,e,f){e=Sk.__future__;Sk.__future__=Object.create(Sk.__future__);var d=Sk.parse(c,b),g=Sk.astFromParse(d.cst,c,d.flags);d=d.flags;var h=Sk.symboltable(g,c);b=new a(c,h,d,f,b);c=b.cmod(g);Sk.__future__=e;return{funcname:"$compiledmod",code:"$compiledmod = function() {"+ +b.result.join("")+"\nreturn "+c+";}();"}};Sk.exportSymbol("Sk.compile",Sk.compile);Sk.resetCompiler=function(){Sk.gensymcount=0};Sk.exportSymbol("Sk.resetCompiler",Sk.resetCompiler);Sk.fixReserved=b;Sk.exportSymbol("Sk.fixReserved",Sk.fixReserved);Sk.unfixReserved=function(a){return a.replace(/_\$rw\$$/,"")};Sk.exportSymbol("Sk.unfixReserved",Sk.unfixReserved);Sk.mangleName=e;Sk.exportSymbol("Sk.mangleName",Sk.mangleName);Sk.reservedWords_=h;Sk.exportSymbol("Sk.reservedWords_",Sk.reservedWords_)}, +function(m,q){Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.importSearchPathForName=function(a,c,b){var e=a.replace(/\./g,"/"),f=function(a,b){return Sk.misceval.chain(Sk.misceval.tryCatch(function(){return Sk.read(a)},function(a){}),function(c){if(void 0!==c)return new Sk.misceval.Break({filename:a,code:c,packagePath:b})})};void 0===b&&(b=Sk.realsyspath);return Sk.misceval.iterFor(b.tp$iter(),function(a){return Sk.misceval.chain(f(a.v+"/"+e+c,!1),function(b){return b?b:f(a.v+"/"+ +e+"/__init__"+c,a.v+"/"+e)})})};Sk.importSetUpPath=function(a){if(!Sk.realsyspath){var c=[new Sk.builtin.str("src/builtin"),new Sk.builtin.str("src/lib"),new Sk.builtin.str(".")];for(a=0;ad;++d)a+=" ";c[b-1]="/* "+a+b+" */ "+c[b-1]}return c.join("\n")};e=f(e);Sk.debugout(e)}e+="\n"+a.funcname+";";e=Sk.global.eval(e);k.$d={__name__:new Sk.builtin.str(b),__doc__:Sk.builtin.none.none$,__package__:a.packagePath?new Sk.builtin.str(b):B?new Sk.builtin.str(A+B):q?q:Sk.builtin.none.none$};a.packagePath&&(k.$d.__path__=new Sk.builtin.tuple([new Sk.builtin.str(a.packagePath)]));return e(k.$d)}},function(b){var c;if(void 0===b){if(l&&!p)return; +throw new Sk.builtin.ImportError("No module named "+a);}if(b!==k.$d){for(c in k.$d)b[c]||(b[c]=k.$d[c]);k.$d=b}if(Sk.onAfterImport&&"function"===typeof Sk.onAfterImport)try{Sk.onAfterImport(a)}catch(U){}if(p)return m.tp$setattr(new Sk.builtin.str(y[y.length-1]),k),p;f&&f.tp$setattr(new Sk.builtin.str(a),k);return k})});return h?E:Sk.misceval.retryOptionalSuspensionOrThrow(E)};Sk.importModule=function(a,c,b){return Sk.importModuleInternal_(a,c,void 0,void 0,void 0,!1,b)};Sk.importMain=function(a,c, +b){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,c,"__main__",void 0,void 0,!1,b)};Sk.importMainWithBody=function(a,c,b,e){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,c,"__main__",b,void 0,!1,e)};Sk.importBuiltinWithBody=function(a,c,b,e){return Sk.importModuleInternal_(a,c,"__builtin__."+a,b,void 0, +!1,e)};Sk.builtin.__import__=function(a,c,b,e,f){var l=Sk.globals,h;void 0===f&&(f=Sk.__future__.absolute_import?0:-1);if(0!==f&&c.__package__&&c.__package__!==Sk.builtin.none.none$){if((h=c.__package__.v)&&0=c.length)throw new Sk.builtin.ValueError("Attempted relative import beyond toplevel package");c.length-=f-1;h=c.join(".")}var d=Sk.sysmodules.quick$lookup(new Sk.builtin.str(h))}if(0>1);this.lt(c,a.getitem(l))?f=l:e=l+1}Sk.asserts.assert(e===f);for(l=b;l>e;l--)a.setitem(l,a.getitem(l-1));a.setitem(e,c)}};Sk.builtin.timSort.prototype.count_run=function(a){var c;if(1>=a.len){var b=a.len;var e=!1}else if(b=2,this.lt(a.getitem(a.base+1),a.getitem(a.base)))for(e=!0,c=a.base+2;cc.len)){this.merge_init();for(a=this.merge_compute_minrun(c.len);0f&&(g=f);d+=b;g+=b}else{for(f=b+1;gf&&(g=f);h=b-d;d=b-g;g=h}Sk.asserts.assert(-1<=d>1),e(c.getitem(c.base+b),a)?d=b+1:g=b;Sk.asserts.assert(d==g);return g};Sk.builtin.timSort.prototype.merge_init=function(){this.min_gallop=this.MIN_GALLOP;this.pending=[]};Sk.builtin.timSort.prototype.merge_lo=function(a,c){var b, +e,f;Sk.asserts.assert(0=l)break}else{this.setitem(h,a.popleft());h++;if(1==a.len)return;b++;e=0;if(b>=l)break}for(l+=1;;){this.min_gallop=l-=1=a.len)return;this.setitem(h,c.popleft());h++;if(0===c.len)return;e=this.gallop(a.getitem(a.base),c,0,!1);for(f=c.base;f=l)break}else{h--;this.setitem(h,g);c.len--;if(1==c.len)return;e++;b=0;if(e>=l)break}}for(l+= +1;;){this.min_gallop=l-=1a.base+m-1;f--)h--,this.setitem(h,a.getitem(f));a.len-=b;if(0===a.len)return;h--;this.setitem(h,c.popright());if(1==c.len)return;d=a.getitem(a.base+a.len-1);m=this.gallop(d,c,c.len-1,!1);e=c.len-m;for(f=c.base+c.len-1;f>c.base+m-1;f--)h--,this.setitem(h,c.getitem(f));c.len-=e;if(1>=c.len)return;h--;this.setitem(h,a.popright());if(0===a.len)return;if(ba.base-1;f--)h--,this.setitem(h,a.getitem(f));for(f=c.base+c.len-1;f>c.base-1;f--)h--,this.setitem(h,c.getitem(f))}};Sk.builtin.timSort.prototype.merge_at=function(a){0>a&&(a=this.pending.length+a);var c=this.pending[a];var b=this.pending[a+1];Sk.asserts.assert(0>=1;return a+c};Sk.builtin.listSlice=function(a,c,b){this.list=a;this.base=c;this.len=b};Sk.builtin.listSlice.prototype.copyitems=function(){var a=this.base,c=this.base+this.len;Sk.asserts.assert(0<=a<=c);return new Sk.builtin.listSlice(new Sk.builtin.list(this.list.v.slice(a, +c)),0,this.len)};Sk.builtin.listSlice.prototype.advance=function(a){this.base+=a;this.len-=a;Sk.asserts.assert(this.base<=this.list.sq$length())};Sk.builtin.listSlice.prototype.getitem=function(a){return this.list.v[a]};Sk.builtin.listSlice.prototype.setitem=function(a,c){this.list.v[a]=c};Sk.builtin.listSlice.prototype.popleft=function(){var a=this.list.v[this.base];this.base++;this.len--;return a};Sk.builtin.listSlice.prototype.popright=function(){this.len--;return this.list.v[this.base+this.len]}; +Sk.builtin.listSlice.prototype.reverse=function(){for(var a,c,b=this.list,e=this.base,f=e+this.len-1;e same as super(__class__, )\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n def meth(self, arg):\n super().meth(arg)\nThis works for class methods too:\nclass C(B):\n @classmethod\n def cmeth(cls, arg):\n super().cmeth(arg)\n", +tp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs("super",c);Sk.abstr.checkArgsLen("super",a,1,2);c=a[0];a=a[1];if(!Sk.builtin.checkClass(c))throw new Sk.builtin.TypeError("must be type, not "+Sk.abstr.typeName(c));this.obj=a;this.type=c;null!=this.obj&&(this.obj_type=this.$supercheck(c,this.obj))},$r(){return this.obj?new Sk.builtin.str(", <"+Sk.abstr.typeName(this.obj)+" object>>"):new Sk.builtin.str(", NULL>")},tp$getattr(a,c){let b=this.obj_type;if(null==b)return Sk.generic.getAttr.call(this,a,c);var e=b.prototype.tp$mro;const f=e.length;if(a===Sk.builtin.str.$class)return Sk.generic.getAttr.call(this,a,c);let l;for(l=0;l+1=f)return Sk.generic.getAttr.call(this,a,c);a=a.$mangled;let h;for(;l module\n\nImport a module. Because this function is meant for use by the Python\ninterpreter and not for general use, it is better to use\nimportlib.import_module() to programmatically import a module.\n\nThe globals argument is only used to determine the context;\nthey are not modified. The locals argument is unused. The fromlist\nshould be a list of names to emulate ``from name import ...'', or an\nempty list to emulate ``import name''.\nWhen importing a module from a package, note that __import__('A.B', ...)\nreturns package A when fromlist is empty, but its submodule B when\nfromlist is not empty. The level argument is used to determine whether to\nperform absolute or relative imports: 0 is absolute, while a positive number\nis the number of parent directories to search relative to the current module."}, +abs:{$meth:Sk.builtin.abs,$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the absolute value of the argument."},all:{$meth:Sk.builtin.all,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for all values x in the iterable.\n\nIf the iterable is empty, return True."},any:{$meth:Sk.builtin.any,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for any x in the iterable.\n\nIf the iterable is empty, return False."}, +ascii:{$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."},bin:{$meth:Sk.builtin.bin,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the binary representation of an integer.\n\n >>> bin(2796202)\n '0b1010101010101010101010'"}, +callable:{$meth:Sk.builtin.callable,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return whether the object is callable (i.e., some kind of function).\n\nNote that classes are callable, as are instances of classes with a\n__call__() method."},chr:{$meth:Sk.builtin.chr,$flags:{OneArg:!0},$textsig:"($module, i, /)",$doc:"Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."},delattr:{$meth:Sk.builtin.delattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)", +$doc:"Deletes the named attribute from the given object.\n\ndelattr(x, 'y') is equivalent to ``del x.y''"},dir:{$meth:Sk.builtin.dir,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"dir([object]) -> list of strings\n\nIf called without an argument, return the names in the current scope.\nElse, return an alphabetized list of names comprising (some of) the attributes\nof the given object, and of attributes reachable from it.\nIf the object supplies a method named __dir__, it will be used; otherwise\nthe default dir() logic is used and returns:\n for a module object: the module's attributes.\n for a class object: its attributes, and recursively the attributes\n of its bases.\n for any other object: its attributes, its class's attributes, and\n recursively the attributes of its class's base classes."}, +divmod:{$meth:Sk.builtin.divmod,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return the tuple (x//y, x%y). Invariant: div*y + mod == x."},eval_$rw$:{$name:"eval",$meth:Sk.builtin.eval_,$flags:{MinArgs:1,MaxArgs:3},$textsig:"($module, source, globals=None, locals=None, /)",$doc:"Evaluate the given source in the context of globals and locals.\n\nThe source may be a string representing a Python expression\nor a code object as returned by compile().\nThe globals must be a dictionary and locals can be any mapping,\ndefaulting to the current globals and locals.\nIf only globals is given, locals defaults to it."}, +format:{$meth:Sk.builtin.format,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, value, format_spec='', /)",$doc:"Return value.__format__(format_spec)\n\nformat_spec defaults to the empty string.\nSee the Format Specification Mini-Language section of help('FORMATTING') for\ndetails."},getattr:{$meth:Sk.builtin.getattr,$flags:{MinArgs:2,MaxArgs:3},$textsig:null,$doc:"getattr(object, name[, default]) -> value\n\nGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\nWhen a default argument is given, it is returned when the attribute doesn't\nexist; without it, an exception is raised in that case."}, +globals:{$meth:Sk.builtin.globals,$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return the dictionary containing the current scope's global variables.\n\nNOTE: Updates to this dictionary *will* affect name lookups in the current\nglobal scope and vice-versa."},hasattr:{$meth:Sk.builtin.hasattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)",$doc:"Return whether the object has an attribute with the given name.\n\nThis is done by calling getattr(obj, name) and catching AttributeError."}, +hash:{$meth:Sk.builtin.hash,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the hash value for the given object.\n\nTwo objects that compare equal must also have the same hash value, but the\nreverse is not necessarily true."},hex:{$meth:Sk.builtin.hex,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the hexadecimal representation of an integer.\n\n >>> hex(12648430)\n '0xc0ffee'"},id:{$meth:Sk.builtin.id,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the identity of an object.\n\nThis is guaranteed to be unique among simultaneously existing objects.\n(CPython uses the object's memory address.)"}, +input:{$meth:Sk.builtin.input,$flags:{MinArgs:0,MaxArgs:1},$textsig:"($module, prompt=None, /)",$doc:"Read a string from standard input. The trailing newline is stripped.\n\nThe prompt string, if given, is printed to standard output without a\ntrailing newline before reading input.\n\nIf the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.\nOn *nix systems, readline is used if available."},isinstance:{$meth:Sk.builtin.isinstance,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, class_or_tuple, /)", +$doc:"Return whether an object is an instance of a class or of a subclass thereof.\n\nA tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)\nor ...`` etc."},issubclass:{$meth:Sk.builtin.issubclass,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, cls, class_or_tuple, /)",$doc:"Return whether 'cls' is a derived from another class or is the same class.\n\nA tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)\nor ...`` etc."}, +iter:{$meth:Sk.builtin.iter,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, iterable /)",$doc:"iter(iterable) -> iterator\niter(callable, sentinel) -> iterator\n\nGet an iterator from an object. In the first form, the argument must\nsupply its own iterator, or be a sequence.\nIn the second form, the callable is called until it returns the sentinel."},len:{$meth:Sk.builtin.len,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the number of items in a container."},locals:{$meth:Sk.builtin.locals, +$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return a dictionary containing the current scope's local variables.\n\nNOTE: Whether or not updates to this dictionary will affect name lookups in\nthe local scope and vice-versa is *implementation dependent* and not\ncovered by any backwards compatibility guarantees."},max:{$meth:Sk.builtin.max,$flags:{FastCall:!0},$textsig:null,$doc:"max(iterable, *[, default=obj, key=func]) -> value\nmax(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its biggest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the largest argument."}, +min:{$meth:Sk.builtin.min,$flags:{FastCall:!0},$textsig:null,$doc:"min(iterable, *[, default=obj, key=func]) -> value\nmin(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its smallest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the smallest argument."},next:{$name:"next",$meth:Sk.builtin.next_,$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"next(iterator[, default])\n\nReturn the next item from the iterator. If default is given and the iterator\nis exhausted, it is returned instead of raising StopIteration."}, +oct:{$meth:Sk.builtin.oct,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the octal representation of an integer.\n\n >>> oct(342391)\n '0o1234567'"},open:{$meth:Sk.builtin.open,$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"open(name[, mode[, buffering]]) -> file object\n\nOpen a file using the file() type, returns a file object. This is the\npreferred way to open a file. See file.__doc__ for further information."},ord:{$meth:Sk.builtin.ord,$flags:{OneArg:!0},$textsig:"($module, c, /)", +$doc:"Return the Unicode code point for a one-character string."},pow:{$meth:Sk.builtin.pow,$flags:{MinArgs:2,MaxArgs:3},$textsig:"($module, x, y, z=None, /)",$doc:"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\n\nSome types, such as ints, are able to use a more efficient algorithm when\ninvoked using the three argument form."},print:{$meth:Sk.builtin.print,$flags:{FastCall:!0},$textsig:null,$doc:"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, or to sys.stdout by default.\nOptional keyword arguments:\nfile: a file-like object (stream); defaults to the current sys.stdout.\nsep: string inserted between values, default a space.\nend: string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream."}, +repr:{$meth:Sk.builtin.repr,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the canonical string representation of the object.\n\nFor many object types, including most builtins, eval(repr(obj)) == obj."},round:{$meth:Sk.builtin.round,$flags:{NamedArgs:["number","ndigits"]},$textsig:"($module, /, number, ndigits=None)",$doc:"Round a number to a given precision in decimal digits.\n\nThe return value is an integer if ndigits is omitted or None. Otherwise\nthe return value has the same type as the number. ndigits may be negative."}, +setattr:{$meth:Sk.builtin.setattr,$flags:{MinArgs:3,MaxArgs:3},$textsig:"($module, obj, name, value, /)",$doc:"Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''"},sorted:{$meth:Sk.builtin.sorted,$flags:{NamedArgs:[null,"cmp","key","reverse"],Defaults:[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]},$textsig:"($module, iterable, /, *, key=None, reverse=False)",$doc:"Return a new list containing all items from the iterable in ascending order.\n\nA custom key function can be supplied to customize the sort order, and the\nreverse flag can be set to request the result in descending order."}, +sum:{$meth:Sk.builtin.sum,$flags:{NamedArgs:[null,"start"],Defaults:[new Sk.builtin.int_(0)]},$textsig:"($module, iterable, /, start=0)",$doc:"Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types."},vars:{$meth:Sk.builtin.vars,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"vars([object]) -> dictionary\n\nWithout arguments, equivalent to locals().\nWith an argument, equivalent to object.__dict__."}}); +Sk.setupObjects=function(a){a?(Sk.builtins.filter=Sk.builtin.filter_,Sk.builtins.map=Sk.builtin.map_,Sk.builtins.zip=Sk.builtin.zip_,Sk.builtins.range=Sk.builtin.range_,delete Sk.builtins.xrange,delete Sk.builtins.StandardError,delete Sk.builtins.unicode,delete Sk.builtins.basestring,delete Sk.builtins.long_$rw$,Sk.builtin.int_.prototype.$r=function(){return new Sk.builtin.str(this.v.toString())},delete Sk.builtin.int_.prototype.tp$str,delete Sk.builtin.bool.prototype.tp$str,delete Sk.builtins.raw_input, +delete Sk.builtin.str.prototype.decode,Sk.builtins.bytes=Sk.builtin.bytes,Sk.builtins.ascii=new Sk.builtin.sk_method({$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."}, +null,"builtins")):(Sk.builtins.range=new Sk.builtin.sk_method({$meth:Sk.builtin.range,$name:"range",$flags:{MinArgs:1,MaxArgs:3}},void 0,"builtins"),Sk.builtins.xrange=new Sk.builtin.sk_method({$meth:Sk.builtin.xrange,$name:"xrange",$flags:{MinArgs:1,MaxArgs:3}},null,"builtins"),Sk.builtins.filter=new Sk.builtin.func(Sk.builtin.filter),Sk.builtins.map=new Sk.builtin.func(Sk.builtin.map),Sk.builtins.zip=new Sk.builtin.func(Sk.builtin.zip),Sk.builtins.StandardError=Sk.builtin.Exception,Sk.builtins.unicode= +Sk.builtin.str,Sk.builtins.basestring=Sk.builtin.str,Sk.builtins.long_$rw$=Sk.builtin.lng,Sk.builtin.int_.prototype.$r=function(){const a=this.v;return"number"===typeof a?new Sk.builtin.str(a.toString()):new Sk.builtin.str(a.toString()+"L")},Sk.builtin.int_.prototype.tp$str=function(){return new Sk.builtin.str(this.v.toString())},Sk.builtin.bool.prototype.tp$str=function(){return this.$r()},Sk.builtins.raw_input=new Sk.builtin.func(Sk.builtin.raw_input),Sk.builtin.str.prototype.decode=Sk.builtin.str.$py2decode, +delete Sk.builtins.bytes,delete Sk.builtins.ascii)};Sk.exportSymbol("Sk.setupObjects",Sk.setupObjects);Sk.exportSymbol("Sk.builtins",Sk.builtins)},function(m,q){Sk.builtin.str.$empty=new Sk.builtin.str("");Sk.builtin.str.$emptystr=Sk.builtin.str.$empty;Sk.builtin.str.$utf8=new Sk.builtin.str("utf-8");Sk.builtin.str.$ascii=new Sk.builtin.str("ascii");Sk.builtin.str.$default_factory=new Sk.builtin.str("default_factory");Sk.builtin.str.$imag=new Sk.builtin.str("imag");Sk.builtin.str.$real=new Sk.builtin.str("real"); +Sk.builtin.str.$abs=new Sk.builtin.str("__abs__");Sk.builtin.str.$bytes=new Sk.builtin.str("__bytes__");Sk.builtin.str.$call=new Sk.builtin.str("__call__");Sk.builtin.str.$class=new Sk.builtin.str("__class__");Sk.builtin.str.$cmp=new Sk.builtin.str("__cmp__");Sk.builtin.str.$complex=new Sk.builtin.str("__complex__");Sk.builtin.str.$contains=new Sk.builtin.str("__contains__");Sk.builtin.str.$copy=new Sk.builtin.str("__copy__");Sk.builtin.str.$dict=new Sk.builtin.str("__dict__");Sk.builtin.str.$dir= +new Sk.builtin.str("__dir__");Sk.builtin.str.$doc=new Sk.builtin.str("__doc__");Sk.builtin.str.$enter=new Sk.builtin.str("__enter__");Sk.builtin.str.$eq=new Sk.builtin.str("__eq__");Sk.builtin.str.$exit=new Sk.builtin.str("__exit__");Sk.builtin.str.$index=new Sk.builtin.str("__index__");Sk.builtin.str.$init=new Sk.builtin.str("__init__");Sk.builtin.str.$int_=new Sk.builtin.str("__int__");Sk.builtin.str.$iter=new Sk.builtin.str("__iter__");Sk.builtin.str.$file=new Sk.builtin.str("__file__");Sk.builtin.str.$float_= +new Sk.builtin.str("__float__");Sk.builtin.str.$format=new Sk.builtin.str("__format__");Sk.builtin.str.$ge=new Sk.builtin.str("__ge__");Sk.builtin.str.$getattr=new Sk.builtin.str("__getattr__");Sk.builtin.str.$getattribute=new Sk.builtin.str("__getattribute__");Sk.builtin.str.$getitem=new Sk.builtin.str("__getitem__");Sk.builtin.str.$gt=new Sk.builtin.str("__gt__");Sk.builtin.str.$keys=new Sk.builtin.str("keys");Sk.builtin.str.$le=new Sk.builtin.str("__le__");Sk.builtin.str.$len=new Sk.builtin.str("__len__"); +Sk.builtin.str.$length_hint=new Sk.builtin.str("__length_hint__");Sk.builtin.str.$loader=new Sk.builtin.str("__loader__");Sk.builtin.str.$lt=new Sk.builtin.str("__lt__");Sk.builtin.str.$module=new Sk.builtin.str("__module__");Sk.builtin.str.$missing=new Sk.builtin.str("__missing__");Sk.builtin.str.$name=new Sk.builtin.str("__name__");Sk.builtin.str.$ne=new Sk.builtin.str("__ne__");Sk.builtin.str.$new=new Sk.builtin.str("__new__");Sk.builtin.str.$next=new Sk.builtin.str("__next__");Sk.builtin.str.$path= +new Sk.builtin.str("__path__");Sk.builtin.str.$qualname=new Sk.builtin.str("__qualname__");Sk.builtin.str.$repr=new Sk.builtin.str("__repr__");Sk.builtin.str.$reversed=new Sk.builtin.str("__reversed__");Sk.builtin.str.$round=new Sk.builtin.str("__round__");Sk.builtin.str.$setattr=new Sk.builtin.str("__setattr__");Sk.builtin.str.$setitem=new Sk.builtin.str("__setitem__");Sk.builtin.str.$str=new Sk.builtin.str("__str__");Sk.builtin.str.$trunc=new Sk.builtin.str("__trunc__");Sk.builtin.str.$write=new Sk.builtin.str("write"); +Sk.misceval.op2method_={Eq:Sk.builtin.str.$eq,NotEq:Sk.builtin.str.$ne,Gt:Sk.builtin.str.$gt,GtE:Sk.builtin.str.$ge,Lt:Sk.builtin.str.$lt,LtE:Sk.builtin.str.$le}}]);}).call(this || window) + +/***/ }), + +/***/ "./others/statusbar-image.js": +/*!***********************************!*\ + !*** ./others/statusbar-image.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); +/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _templates_html_statusbar_image_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../templates/html/statusbar-image.html */ "./templates/html/statusbar-image.html"); + + + + + + +class StatusBarImage extends mixly__WEBPACK_IMPORTED_MODULE_2__.PageBase { + static { + mixly__WEBPACK_IMPORTED_MODULE_2__.HTMLTemplate.add( + 'html/statusbar/statusbar-image.html', + new mixly__WEBPACK_IMPORTED_MODULE_2__.HTMLTemplate(_templates_html_statusbar_image_html__WEBPACK_IMPORTED_MODULE_3__) + ); + + this.init = function () { + mixly__WEBPACK_IMPORTED_MODULE_2__.StatusBarsManager.typesRegistry.register(['images'], StatusBarImage); + const mainWorkspace = mixly__WEBPACK_IMPORTED_MODULE_2__.Workspace.getMain(); + const statusBarsManager = mainWorkspace.getStatusBarsManager(); + statusBarsManager.add({ + type: 'images', + id: 'images', + name: blockly_core__WEBPACK_IMPORTED_MODULE_1__.Msg.MIXLY_MICROBIT_IMAGE, + title: blockly_core__WEBPACK_IMPORTED_MODULE_1__.Msg.MIXLY_MICROBIT_IMAGE + }); + statusBarsManager.changeTo('output'); + } + } + + constructor() { + super(); + const $content = jquery__WEBPACK_IMPORTED_MODULE_0___default()(mixly__WEBPACK_IMPORTED_MODULE_2__.HTMLTemplate.get('html/statusbar/statusbar-image.html').render()); + this.setContent($content); + } + + init() { + super.init(); + this.hideCloseBtn(); + } + + clean() { + this.getContent().empty(); + } + + display(data) { + const $content = this.getContent(); + const autoFit = function (node) { + node.style.width = 'auto'; + node.style.height = 'auto'; + node.style.maxWidth = '100%'; + node.style.maxHeight = '100%'; + }; + this.clean(); + let root = data.content; + let canvas = null; + let iframe = null; + switch (data.display_type) { + case 'p5': + root.style.width = '100%'; + root.style.height = '100%'; + root.style.display = 'flex'; + root.style.justifyContent = 'center'; + root.style.alignItems = 'center'; + + // some canvas nodes can be added later so we observe... + new MutationObserver(function (mutationsList) { + mutationsList.forEach((mutation) => + mutation.addedNodes.forEach((node) => { + const elem = node; + if ( + elem.tagName != null && + ['canvas', 'video'].includes(elem.tagName.toLowerCase()) + ) + autoFit(elem); + }) + ); + }).observe(root, { childList: true }); + + root.querySelectorAll('canvas,video').forEach(autoFit); + $content.append(root); + break; + case 'matplotlib': + canvas = root.querySelector('canvas'); + if (canvas) root = canvas; + root.style.width = ''; + root.style.height = ''; + root.style.maxWidth = '100%'; + root.style.maxHeight = '100%'; + $content.append(root); + break; + case 'ocaml-canvas': + root.style.width = ''; + root.style.height = ''; + root.style.maxWidth = '100%'; + root.style.maxHeight = '100%'; + $content.append(root); + break; + case 'turtle': + // Turtle result + root.setAttribute('width', '100%'); + root.setAttribute('height', '100%'); + $content.append(root.outerHTML); + break; + case 'sympy': + $content.append(data.content); + if (typeof window.MathJax === 'undefined') { + // dynamically loading MathJax + console.log('Loading MathJax (Sympy expression needs it).'); + (function () { + let script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = + 'https://cdn.jsdelivr.net/npm/mathjax@3.0.5/es5/tex-mml-chtml.js'; + document.getElementsByTagName('head')[0].appendChild(script); + })(); + } else { + // otherwise, render it + window.MathJax.typeset(); + } + break; + case 'multiple': + /* typically dispached by display() */ + for (let mime of [ + 'image/svg+xml', + 'image/png', + 'text/html', + 'text/plain', + ]) { + if (mime in data.content) { + let content = data.content[mime]; + if (mime === 'image/png') { + content = + ''; + } + $content.append(content); + break; + } + } + break; + case 'tutor': + // hacky but iframe.document.body.style require to wait for + // iframe loading + $content.append(jquery__WEBPACK_IMPORTED_MODULE_0___default()(data.content.replace('overflow-y%3A%20hidden%3B', ''))); + iframe = this.getContent()[0].getElementsByTagName('iframe')[0]; + if (iframe == null) return; + // trick to avoid taking height update into account + iframe.style.maxHeight = iframe.style.minHeight = '100%'; + + // force rendering when visible, + // otherwise, strange things happends + // since PythonTutor check for visibility at some point + new IntersectionObserver((entries, observer) => { + const entry = entries[0]; + if (entry && !entry.isIntersecting) return; + iframe.contentWindow?.postMessage({ type: 'redraw' }, '*'); + observer.disconnect(); + }).observe(iframe); + + break; + default: + console.error( + `Not supported node type '${data.display_type}' in eval.display result processing.` + ); + } + } +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StatusBarImage); + +/***/ }), + +/***/ "./css/color_mixpy_python_skulpt.css": +/*!*******************************************!*\ + !*** ./css/color_mixpy_python_skulpt.css ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }), + +/***/ "./others/skulpt/libs/bg_highlight.js?url": +/*!************************************************!*\ + !*** ./others/skulpt/libs/bg_highlight.js?url ***! + \************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +module.exports = __webpack_require__.p + "bg_highlight_f8cee65f.js"; + +/***/ }), + +/***/ "./others/skulpt/libs/bg_nonehl.js?url": +/*!*********************************************!*\ + !*** ./others/skulpt/libs/bg_nonehl.js?url ***! + \*********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +module.exports = __webpack_require__.p + "bg_nonehl_d04ead5f.js"; + +/***/ }), + +/***/ "./others/skulpt/libs/inittool.js?url": +/*!********************************************!*\ + !*** ./others/skulpt/libs/inittool.js?url ***! + \********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +module.exports = __webpack_require__.p + "inittool_3543dc69.js"; + +/***/ }), + +/***/ "./templates/html/level-selector.html": +/*!********************************************!*\ + !*** ./templates/html/level-selector.html ***! + \********************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = "\r\n"; + +/***/ }), + +/***/ "./templates/html/statusbar-image.html": +/*!*********************************************!*\ + !*** ./templates/html/statusbar-image.html ***! + \*********************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = "\r\n
\r\n
\r\n
"; + +/***/ }), + +/***/ "./templates/python/mixpy.py": +/*!***********************************!*\ + !*** ./templates/python/mixpy.py ***! + \***********************************/ +/***/ ((module) => { + +"use strict"; +module.exports = "import math\r\n\r\ndef math_map(v, al, ah, bl, bh):\r\n return bl + (bh - bl) * (v - al) / (ah - al)\r\n\r\ndef math_mean(myList):\r\n localList = [e for e in myList if type(e) == int or type(e) == float]\r\n if not localList: return\r\n return float(sum(localList)) / len(localList)\r\n\r\ndef math_median(myList):\r\n localList = sorted([e for e in myList if type(e) == int or type(e) == float])\r\n if not localList: return\r\n if len(localList) % 2 == 0:\r\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\r\n else:\r\n return localList[(len(localList) - 1) // 2]\r\n\r\ndef math_modes(some_list):\r\n modes = []\r\n # Using a lists of [item, count] to keep count rather than dict\r\n # to avoid \"unhashable\" errors when the counted item is itself a list or dict.\r\n counts = []\r\n maxCount = 1\r\n for item in some_list:\r\n found = False\r\n for count in counts:\r\n if count[0] == item:\r\n count[1] += 1\r\n maxCount = max(maxCount, count[1])\r\n found = True\r\n if not found:\r\n counts.append([item, 1])\r\n for counted_item, item_count in counts:\r\n if item_count == maxCount:\r\n modes.append(counted_item)\r\n return modes\r\n\r\ndef math_standard_deviation(numbers):\r\n n = len(numbers)\r\n if n == 0: return\r\n mean = float(sum(numbers)) / n\r\n variance = sum((x - mean) ** 2 for x in numbers) / n\r\n return math.sqrt(variance)\r\n\r\ndef lists_sort(my_list, type, reverse):\r\n def try_float(s):\r\n try:\r\n return float(s)\r\n except:\r\n return 0\r\n key_funcs = {\r\n \"NUMERIC\": try_float,\r\n \"TEXT\": str,\r\n \"IGNORE_CASE\": lambda s: str(s).lower()\r\n }\r\n key_func = key_funcs[type]\r\n list_cpy = list(my_list)\r\n return sorted(list_cpy, key=key_func, reverse=reverse)"; + +/***/ }), + +/***/ "jquery": +/*!********************!*\ + !*** external "$" ***! + \********************/ +/***/ ((module) => { + +"use strict"; +module.exports = $; + +/***/ }), + +/***/ "blockly/core": +/*!**************************!*\ + !*** external "Blockly" ***! + \**************************/ +/***/ ((module) => { + +"use strict"; +module.exports = Blockly; + +/***/ }), + +/***/ "mixly": +/*!************************!*\ + !*** external "Mixly" ***! + \************************/ +/***/ ((module) => { + +"use strict"; +module.exports = Mixly; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ var scriptUrl; +/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; +/******/ var document = __webpack_require__.g.document; +/******/ if (!scriptUrl && document) { +/******/ if (document.currentScript) +/******/ scriptUrl = document.currentScript.src; +/******/ if (!scriptUrl) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ if(scripts.length) { +/******/ var i = scripts.length - 1; +/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ } +/******/ } +/******/ } +/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration +/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. +/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); +/******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ __webpack_require__.p = scriptUrl; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!******************!*\ + !*** ./index.js ***! + \******************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! blockly/core */ "blockly/core"); +/* harmony import */ var blockly_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(blockly_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mixly */ "mixly"); +/* harmony import */ var mixly__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(mixly__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _mixly_python_others_variables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mixly/python/others/variables */ "../python/others/variables.js"); +/* harmony import */ var _mixly_python_others_procedures__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mixly/python/others/procedures */ "../python/others/procedures.js"); +/* harmony import */ var _mixly_python_python_generator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mixly/python/python_generator */ "../python/python_generator.js"); +/* harmony import */ var _mixly_python_blocks_variables__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mixly/python/blocks/variables */ "../python/blocks/variables.js"); +/* harmony import */ var _mixly_python_blocks_control__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mixly/python/blocks/control */ "../python/blocks/control.js"); +/* harmony import */ var _mixly_python_blocks_math__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mixly/python/blocks/math */ "../python/blocks/math.js"); +/* harmony import */ var _mixly_python_blocks_text__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mixly/python/blocks/text */ "../python/blocks/text.js"); +/* harmony import */ var _mixly_python_blocks_lists__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mixly/python/blocks/lists */ "../python/blocks/lists.js"); +/* harmony import */ var _mixly_python_blocks_dicts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mixly/python/blocks/dicts */ "../python/blocks/dicts.js"); +/* harmony import */ var _mixly_python_blocks_logic__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mixly/python/blocks/logic */ "../python/blocks/logic.js"); +/* harmony import */ var _mixly_python_blocks_storage__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mixly/python/blocks/storage */ "../python/blocks/storage.js"); +/* harmony import */ var _mixly_python_blocks_procedures__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mixly/python/blocks/procedures */ "../python/blocks/procedures.js"); +/* harmony import */ var _mixly_python_blocks_tuple__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mixly/python/blocks/tuple */ "../python/blocks/tuple.js"); +/* harmony import */ var _mixly_python_blocks_set__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mixly/python/blocks/set */ "../python/blocks/set.js"); +/* harmony import */ var _mixly_python_blocks_html__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mixly/python/blocks/html */ "../python/blocks/html.js"); +/* harmony import */ var _mixly_python_blocks_utility__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mixly/python/blocks/utility */ "../python/blocks/utility.js"); +/* harmony import */ var _mixly_python_skulpt_blocks_data__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mixly/python-skulpt/blocks/data */ "../python_skulpt/blocks/data.js"); +/* harmony import */ var _mixly_python_skulpt_blocks_inout__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mixly/python-skulpt/blocks/inout */ "../python_skulpt/blocks/inout.js"); +/* harmony import */ var _mixly_python_skulpt_blocks_system__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mixly/python-skulpt/blocks/system */ "../python_skulpt/blocks/system.js"); +/* harmony import */ var _mixly_python_skulpt_blocks_turtle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mixly/python-skulpt/blocks/turtle */ "../python_skulpt/blocks/turtle.js"); +/* harmony import */ var _blocks_game__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./blocks/game */ "./blocks/game.js"); +/* harmony import */ var _mixly_python_generators_variables__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mixly/python/generators/variables */ "../python/generators/variables.js"); +/* harmony import */ var _mixly_python_generators_control__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mixly/python/generators/control */ "../python/generators/control.js"); +/* harmony import */ var _mixly_python_generators_math__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mixly/python/generators/math */ "../python/generators/math.js"); +/* harmony import */ var _mixly_python_generators_text__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mixly/python/generators/text */ "../python/generators/text.js"); +/* harmony import */ var _mixly_python_generators_lists__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mixly/python/generators/lists */ "../python/generators/lists.js"); +/* harmony import */ var _mixly_python_generators_dicts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mixly/python/generators/dicts */ "../python/generators/dicts.js"); +/* harmony import */ var _mixly_python_generators_logic__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mixly/python/generators/logic */ "../python/generators/logic.js"); +/* harmony import */ var _mixly_python_generators_storage__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mixly/python/generators/storage */ "../python/generators/storage.js"); +/* harmony import */ var _mixly_python_generators_procedures__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mixly/python/generators/procedures */ "../python/generators/procedures.js"); +/* harmony import */ var _mixly_python_generators_tuple__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mixly/python/generators/tuple */ "../python/generators/tuple.js"); +/* harmony import */ var _mixly_python_generators_set__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mixly/python/generators/set */ "../python/generators/set.js"); +/* harmony import */ var _mixly_python_generators_html__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mixly/python/generators/html */ "../python/generators/html.js"); +/* harmony import */ var _mixly_python_generators_utility__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mixly/python/generators/utility */ "../python/generators/utility.js"); +/* harmony import */ var _mixly_python_skulpt_generators_data__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mixly/python-skulpt/generators/data */ "../python_skulpt/generators/data.js"); +/* harmony import */ var _mixly_python_skulpt_generators_inout__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mixly/python-skulpt/generators/inout */ "../python_skulpt/generators/inout.js"); +/* harmony import */ var _mixly_python_skulpt_generators_system__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mixly/python-skulpt/generators/system */ "../python_skulpt/generators/system.js"); +/* harmony import */ var _mixly_python_skulpt_generators_turtle__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mixly/python-skulpt/generators/turtle */ "../python_skulpt/generators/turtle.js"); +/* harmony import */ var _generators_game__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./generators/game */ "./generators/game.js"); +/* harmony import */ var _others_loader__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./others/loader */ "./others/loader.js"); +/* harmony import */ var _css_color_mixpy_python_skulpt_css__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./css/color_mixpy_python_skulpt.css */ "./css/color_mixpy_python_skulpt.css"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Object.assign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Variables, _mixly_python_others_variables__WEBPACK_IMPORTED_MODULE_2__["default"]); +Object.assign(blockly_core__WEBPACK_IMPORTED_MODULE_0__.Procedures, _mixly_python_others_procedures__WEBPACK_IMPORTED_MODULE_3__["default"]); +blockly_core__WEBPACK_IMPORTED_MODULE_0__.Python = _mixly_python_python_generator__WEBPACK_IMPORTED_MODULE_4__.Python; +blockly_core__WEBPACK_IMPORTED_MODULE_0__.generator = _mixly_python_python_generator__WEBPACK_IMPORTED_MODULE_4__.Python; + +mixly__WEBPACK_IMPORTED_MODULE_1__.Profile.default = {}; + +Object.assign( + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Blocks, + _mixly_python_blocks_variables__WEBPACK_IMPORTED_MODULE_5__, + _mixly_python_blocks_control__WEBPACK_IMPORTED_MODULE_6__, + _mixly_python_blocks_math__WEBPACK_IMPORTED_MODULE_7__, + _mixly_python_blocks_text__WEBPACK_IMPORTED_MODULE_8__, + _mixly_python_blocks_lists__WEBPACK_IMPORTED_MODULE_9__, + _mixly_python_blocks_dicts__WEBPACK_IMPORTED_MODULE_10__, + _mixly_python_blocks_logic__WEBPACK_IMPORTED_MODULE_11__, + _mixly_python_blocks_storage__WEBPACK_IMPORTED_MODULE_12__, + _mixly_python_blocks_procedures__WEBPACK_IMPORTED_MODULE_13__, + _mixly_python_blocks_tuple__WEBPACK_IMPORTED_MODULE_14__, + _mixly_python_blocks_set__WEBPACK_IMPORTED_MODULE_15__, + _mixly_python_blocks_html__WEBPACK_IMPORTED_MODULE_16__, + _mixly_python_blocks_utility__WEBPACK_IMPORTED_MODULE_17__, + _mixly_python_skulpt_blocks_data__WEBPACK_IMPORTED_MODULE_18__, + _mixly_python_skulpt_blocks_inout__WEBPACK_IMPORTED_MODULE_19__, + _mixly_python_skulpt_blocks_system__WEBPACK_IMPORTED_MODULE_20__, + _mixly_python_skulpt_blocks_turtle__WEBPACK_IMPORTED_MODULE_21__, + _blocks_game__WEBPACK_IMPORTED_MODULE_22__, +); + +Object.assign( + blockly_core__WEBPACK_IMPORTED_MODULE_0__.Python.forBlock, + _mixly_python_generators_variables__WEBPACK_IMPORTED_MODULE_23__, + _mixly_python_generators_control__WEBPACK_IMPORTED_MODULE_24__, + _mixly_python_generators_math__WEBPACK_IMPORTED_MODULE_25__, + _mixly_python_generators_text__WEBPACK_IMPORTED_MODULE_26__, + _mixly_python_generators_lists__WEBPACK_IMPORTED_MODULE_27__, + _mixly_python_generators_dicts__WEBPACK_IMPORTED_MODULE_28__, + _mixly_python_generators_logic__WEBPACK_IMPORTED_MODULE_29__, + _mixly_python_generators_storage__WEBPACK_IMPORTED_MODULE_30__, + _mixly_python_generators_procedures__WEBPACK_IMPORTED_MODULE_31__, + _mixly_python_generators_tuple__WEBPACK_IMPORTED_MODULE_32__, + _mixly_python_generators_set__WEBPACK_IMPORTED_MODULE_33__, + _mixly_python_generators_html__WEBPACK_IMPORTED_MODULE_34__, + _mixly_python_generators_utility__WEBPACK_IMPORTED_MODULE_35__, + _mixly_python_skulpt_generators_data__WEBPACK_IMPORTED_MODULE_36__, + _mixly_python_skulpt_generators_inout__WEBPACK_IMPORTED_MODULE_37__, + _mixly_python_skulpt_generators_system__WEBPACK_IMPORTED_MODULE_38__, + _mixly_python_skulpt_generators_turtle__WEBPACK_IMPORTED_MODULE_39__, + _generators_game__WEBPACK_IMPORTED_MODULE_40__ +); +})(); + +/******/ })() +; +//# sourceMappingURL=main.bundle.054b4509.js.map \ No newline at end of file diff --git a/boards/default/python_skulpt_car/main.bundle.054b4509.js.map b/boards/default/python_skulpt_car/main.bundle.054b4509.js.map new file mode 100644 index 00000000..e3bfb022 --- /dev/null +++ b/boards/default/python_skulpt_car/main.bundle.054b4509.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.bundle.054b4509.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,cAAc;AACd,uBAAuB,6CAAW;AAClC,cAAc;AACd,uBAAuB,6CAAW;AAClC,cAAc;AACd,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,kDAAkD,OAAO;AACzD;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,KAAK;AACL;AACA;AACA,eAAe,qCAAqC;AACpD;AACA,eAAe,qCAAqC;AACpD;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,mBAAmB,6CAAW;AAC9B,SAAS;AACT,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,yBAAyB,6CAAW,yCAAyC,6CAAW;AACxF;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,kDAAkD,OAAO;AACzD;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,KAAK;AACL;AACA;AACA,eAAe,qCAAqC;AACpD;AACA,eAAe,qCAAqC;AACpD;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,2BAA2B,uDAAqB;AAChD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV,gCAAgC,6CAAW;AAC3C;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAAW;AAC9B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAAW;AAC9B;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,6CAAW;AAChB,KAAK,6CAAW;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK,6CAAW;AAChB,KAAK,6CAAW;AAChB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA,yBAAyB,6CAAW,gCAAgC,6CAAW;AAC/E;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB,GAAG,6CAAW,oDAAoD,6CAAW;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW,aAAa,6CAAW;AAC5D;AACA;AACA,wBAAwB,6CAAW,+BAA+B,6CAAW;AAC7E;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChiCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD,6BAA6B,oDAAkB,CAAC,6CAAW;AAC3D;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,6CAAW;AACrD,UAAU;AACV,0CAA0C,6CAAW;AACrD,4BAA4B,qBAAqB;AACjD;AACA;AACA,8BAA8B,gDAAc;AAC5C;AACA,4BAA4B,wDAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,gDAAgD,qDAAmB;AACnE;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,uBAAuB,uDAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oDAAkB,CAAC,6CAAW;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,6CAAW,cAAc,6CAAW;AAC9E,UAAU;AACV,0CAA0C,6CAAW;AACrD,4BAA4B,qBAAqB;AACjD;AACA;AACA,8BAA8B,gDAAc;AAC5C;AACA,4BAA4B,wDAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACpwBwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA,yBAAyB,6CAAW;AACpC,sBAAsB,gDAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC,sBAAsB,gDAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChLwC;AACxC;AACA,uBAAuB;AACvB;AACO;AACP;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF;AACA,yBAAyB,6CAAW,0BAA0B,6CAAW;AACzE;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,mBAAmB,6CAAW;AAClE;AACA;AACA;AACA;AACA;AACA,iCAAiC,6CAAW;AAC5C;AACA;AACA;AACA;AACA,gCAAgC,6CAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAW;AACrC,0BAA0B,6CAAW;AACrC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,iCAAiC,6CAAW;AAChF;AACA,yBAAyB,6CAAW,yBAAyB,6CAAW;AACxE,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,0BAA0B,6CAAW;AACrC;AACA;AACA,SAAS;AACT;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,SAAS;AACT;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,2BAA2B,6CAAW;AACtC,0BAA0B,6CAAW;AACrC,wBAAwB,6CAAW;AACnC,2BAA2B,6CAAW;AACtC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,iBAAiB;AACjB;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW,aAAa,6CAAW;AAC5D;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;ACv0BwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAW;AACjC,uBAAuB,6CAAW;AAClC,sBAAsB,6CAAW;AACjC,uBAAuB,6CAAW;AAClC,sBAAsB,6CAAW;AACjC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6BAA6B;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACO;AACP;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA,6BAA6B,uDAAqB;AAClD;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,sBAAsB,6CAAW;AACjC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvQwC;AACxC;AACA,sBAAsB;AACtB;AACA,wDAAsB;AACtB;AACA,yDAAyD,GAAG;AAC5D,uDAAuD;AACvD,wBAAwB;AACxB;AACA;AACA,wDAAsB;AACtB;AACA;AACA;AACA,sDAAsD,GAAG;AACzD,oDAAoD;AACpD;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD,gBAAgB,wDAAsB;AACtC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAW;AACjC,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6CAAW;AACjC,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC,0BAA0B,6CAAW;AACrC,wBAAwB,6CAAW;AACnC,4BAA4B,6CAAW;AACvC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC,0BAA0B,6CAAW;AACrC,wBAAwB,6CAAW;AACnC,4BAA4B,6CAAW;AACvC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,sBAAsB,6CAAW;AACjC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,sBAAsB,6CAAW;AACjC,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,uBAAuB,6CAAW;AAClC,2BAA2B,6CAAW;AACtC;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,uBAAuB,6CAAW;AAClC,2BAA2B,6CAAW;AACtC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA,0BAA0B,6CAAW,yBAAyB,6CAAW;AACzE;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC;AACA,mBAAmB,6CAAW;AAC9B,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB,MAAM,wDAAsB;AAC/E;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,cAAc,6CAAW,wBAAwB,6CAAW,4BAA4B,6CAAW,wBAAwB,6CAAW,kBAAkB,6CAAW;AACnK;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,cAAc,6CAAW,wBAAwB,6CAAW;AAC5D;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW,kBAAkB,6CAAW;AACjE;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA,yBAAyB,6CAAW,iBAAiB,6CAAW;AAChE;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA,oCAAoC,EAAE;AACtC;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,uCAAuC,EAAE;AACzC,uCAAuC,EAAE;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD,4CAA4C,EAAE;AAC9C,2CAA2C,EAAE;AAC7C;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC5rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACa;AACrD;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA,uBAAuB,oDAAU;AACjC,4BAA4B,wDAAsB;AAClD,YAAY,oDAAU;AACtB;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA,YAAY,6CAAW;AACvB,gCAAgC,6CAAW;AAC3C;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,SAAS;AACxB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAW;AACrC;AACA;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA;AACA,UAAU;AACV,YAAY,gDAAc;AAC1B;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA,gBAAgB,UAAU;AAC1B,cAAc;AACd;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB,cAAc;AACd;AACA;AACA;AACA;AACA,mCAAmC,wCAAwC;AAC3E;AACA;AACA;AACA;AACA,+BAA+B,mDAAiB;AAChD;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAU;AAClB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oCAAoC;AAChE;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA,iCAAiC,mDAAS;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAU;AAClB;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,+CAAa;AAC9C;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,+BAA+B,+CAAa;AAC5C;AACA,4BAA4B,+CAAa;AACzC;AACA,+BAA+B,+CAAa;AAC5C;AACA;AACA,2BAA2B,+CAAa;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ,oDAAU;AAClB;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oDAAU;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,gBAAgB;AAChC,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,gCAAgC;AAChD,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oDAAU;AACtB;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,wBAAwB;AACvC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,oDAAU;AACtB;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA,cAAc;AACd;AACA;AACA;AACA,qCAAqC,+CAAa;AAClD;AACA;AACA;AACA,mCAAmC,qBAAqB;AACxD;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,sBAAsB,6CAAW;AACjC,0BAA0B,+CAAa;AACvC;AACA,wBAAwB,4BAA4B;AACpD,yBAAyB,+CAAa;AACtC;AACA;AACA;AACA,uBAAuB,+CAAa;AACpC;AACA;AACA,0BAA0B,qDAAmB;AAC7C;AACA;AACA;AACA;AACA,4BAA4B,oCAAoC;AAChE,kCAAkC;AAClC;AACA,iCAAiC,6CAAW;AAC5C;AACA;AACA,kCAAkC,mDAAiB;AACnD,kCAAkC,+CAAa;AAC/C;AACA;AACA;AACA,oBAAoB,qDAAmB;AACvC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA,uBAAuB,oDAAU;AACjC,4BAA4B,wDAAsB;AAClD,YAAY,oDAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA,YAAY,6CAAW;AACvB,gCAAgC,6CAAW;AAC3C;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,wBAAwB,6CAAW;AACnC;AACA,KAAK;AACL;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA,wBAAwB,wDAAsB;AAC9C,YAAY,oDAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mCAAmC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,QAAQ;AACxB,cAAc;AACd;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC,KAAK;AACL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,cAAc;AACd;AACA;AACA,YAAY,+CAAa;AACzB;AACA;AACA,gBAAgB,6CAAW;AAC3B,gBAAgB,6CAAW;AAC3B;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAU;AACnC;AACA;AACA;AACA,yDAAyD,+CAAa;AACtE;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,2BAA2B,mDAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,wBAAwB,4BAA4B;AACpD;AACA;AACA;AACA;AACA;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA,kBAAkB;AAClB,oBAAoB,gDAAc;AAClC;AACA,cAAc;AACd;AACA,4BAA4B,oDAAkB;AAC9C;AACA,8BAA8B,gDAAc;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,6CAAW;AAClD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,UAAU;AAC1B,cAAc;AACd;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA,wBAAwB,4BAA4B;AACpD,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,wCAAwC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,gBAAgB;AAChC,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,gBAAgB,gCAAgC;AAChD,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,0BAA0B;AACzC,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gDAAc;AACxC;AACA;AACA;AACA;AACA;AACA,sBAAsB,oDAAU;AAChC;AACA;AACA;AACA;AACA;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,+CAAa;AACvC,4BAA4B,+CAAa;AACzC;AACA;AACA,+BAA+B,qDAAmB;AAClD,+BAA+B,qDAAmB;AAClD;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA,+BAA+B,oDAAU;AACzC;AACA;AACA,kCAAkC,+CAAa;AAC/C;AACA;AACA,gBAAgB,6CAAW;AAC3B,gBAAgB,gDAAc;AAC9B,cAAc;AACd;AACA;AACA;AACA,oCAAoC,4BAA4B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,uBAAuB,gDAAc;AAC/C;AACA;AACA;AACA;AACA,sBAAsB,oDAAU;AAChC;AACA,gBAAgB,gDAAc;AAC9B;AACA,gBAAgB,gDAAc;AAC9B;AACA,UAAU,uBAAuB,gDAAc;AAC/C;AACA,sBAAsB,oDAAU;AAChC;AACA;AACA,+BAA+B,gDAAc;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,sBAAsB,6CAAW;AACjC;AACA;AACA;AACA,sBAAsB,oDAAU;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,KAAK;AACL;AACA;AACA,gBAAgB,UAAU;AAC1B,cAAc;AACd;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,0BAA0B;AACzC,cAAc;AACd;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iCAAiC,6CAAW;AAC5C;AACA,cAAc;AACd;AACA;AACA;AACA,iCAAiC,6CAAW;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,gCAAgC,6CAAW;AAC3C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA,KAAK;AACL;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,iCAAiC,6CAAW;AAC5C;AACA,cAAc;AACd;AACA;AACA;AACA,iCAAiC,6CAAW;AAC5C;AACA;AACA;AACA,UAAU;AACV,gCAAgC,6CAAW;AAC3C;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChuCwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,gCAAgC,6CAAW;AAC3C,8BAA8B,6CAAW;AACzC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAW;AACrC,uCAAuC,6CAAW;AAClD,qCAAqC,6CAAW;AAChD;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,iCAAiC,6CAAW;AACrE;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,2BAA2B,6CAAW;AACtC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,6CAAW;AACvC,8BAA8B,6CAAW;AACzC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACO;AACP;AACA;AACA;AACA,2BAA2B;AAC3B,6BAA6B,wDAAsB;AACnD,2BAA2B;AAC3B;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7ZwC;AACxC;AACA,uBAAuB;AACvB;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW,YAAY,6CAAW;AACnD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW,YAAY,6CAAW;AACnD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW,YAAY,6CAAW;AACnD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW,YAAY,6CAAW;AACnD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,qBAAqB,6CAAW;AAChC,qBAAqB,6CAAW;AAChC,sBAAsB,6CAAW;AACjC,sBAAsB,6CAAW;AACjC;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,qBAAqB,6CAAW;AAChC,qBAAqB,6CAAW;AAChC,sBAAsB,6CAAW;AACjC,sBAAsB,6CAAW;AACjC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,qBAAqB,6CAAW;AAChC,qBAAqB,6CAAW;AAChC,sBAAsB,6CAAW;AACjC,sBAAsB,6CAAW;AACjC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW,iCAAiC,6CAAW,8BAA8B,6CAAW;AACxH;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB,GAAG,6CAAW,0CAA0C,6CAAW,mDAAmD,6CAAW;AACnL;AACA,0CAA0C;AAC1C,uCAAuC;AACvC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,0CAA0C;AAC1C,uCAAuC;AACvC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,wBAAwB,6CAAW;AACnC,4BAA4B,6CAAW;AACvC,6BAA6B,6CAAW;AACxC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA,6CAAW;AACJ;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW,2CAA2C,6CAAW;AACzF;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yCAAyC;AACzC,sCAAsC;AACtC;AACA;AACA;AACA,wBAAwB,6CAAW,+CAA+C,6CAAW;AAC7F,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,yBAAyB,6CAAW;AACpC,2BAA2B,6CAAW;AACtC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA,yCAAyC;AACzC,sCAAsC;AACtC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,wBAAwB,6CAAW;AACnC;AACA,0BAA0B,6CAAW;AACrC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW,eAAe,6CAAW;AAC9D,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtgBwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,eAAe,SAAS;AACxB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,uCAAuC;AACvC,UAAU;AACV,uCAAuC;AACvC;AACA,mBAAmB,oDAAkB;AACrC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6DAA2B;AACxD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,eAAe,SAAS;AACxB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,uCAAuC;AACvC,UAAU;AACV,uCAAuC;AACvC;AACA,mBAAmB,oDAAkB;AACrC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,eAAe,SAAS;AACxB,gBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA,uCAAuC;AACvC,UAAU;AACV,uCAAuC;AACvC;AACA,mBAAmB,oDAAkB;AACrC;AACA;AACA;AACA,wDAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB,KAAK,wDAAsB;AAC9E;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,mBAAmB,oDAAkB;AACrC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW,6BAA6B,6CAAW;AAChE;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,QAAQ,6CAAW,mEAAmE,6CAAW;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA,kEAAkE,6CAAW,8CAA8C,6CAAW;AACtI;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8BAA8B,6CAAW;AACzC,4BAA4B,6CAAW;AACvC,0BAA0B,6CAAW;AACrC;AACA,mBAAmB,6CAAW,+BAA+B,6CAAW,qDAAqD,6CAAW;AACxI,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,4CAA4C,qDAAmB;AAC/D;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2DAA2D,6CAAW,8DAA8D,6CAAW;AAC/I,oBAAoB,uDAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,QAAQ,6CAAW;AACnB;AACA;AACA;AACA;AACO;AACP;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,6BAA6B,6CAAW;AAC5E;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW,+BAA+B,6CAAW,8BAA8B,6CAAW,oCAAoC,6CAAW;AACrK;AACA;AACA;AACA;AACO;AACP;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,iDAAiD,qDAAmB;AACpE;AACA,iDAAiD,qDAAmB;AACpE;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6CAAW;AAC3B;AACA,iCAAiC,6CAAW;AAC5C;AACA,UAAU;AACV;AACA;AACA,uBAAuB,uDAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,6BAA6B,6CAAW;AAC5E;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC,8BAA8B,6CAAW;AACzC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW,aAAa,6CAAW;AAC5D;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA,cAAc,6CAAW,4BAA4B,6CAAW,6BAA6B,6CAAW;AACxG;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,0BAA0B,6CAAW;AACrC,0BAA0B,6CAAW;AACrC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACA;AACA;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,gCAAgC,6CAAW;AACpE;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACt+BwC;AACxC;AACA,uBAAuB;AACvB;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,WAAW;AACX,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,YAAY;AACZ;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC,WAAW;AACX,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,6BAA6B,6CAAW,6BAA6B,6CAAW;AACzG;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,2BAA2B,6CAAW;AACtC,0BAA0B,6CAAW;AACrC,wBAAwB,6CAAW;AACnC,2BAA2B,6CAAW;AACtC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,iDAAiD,qDAAmB;AACpE;AACA,iDAAiD,qDAAmB;AACpE;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6CAAW;AAC3B;AACA,iCAAiC,6CAAW;AAC5C;AACA,UAAU;AACV;AACA;AACA,uBAAuB,uDAAqB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF;AACA,yBAAyB,6CAAW,0BAA0B,6CAAW;AACzE;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW,uCAAuC,6CAAW;AACtF,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oDAAkB;AAC/C;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6DAA2B;AACxD;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6DAA2B;AACxD;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA,6BAA6B,+CAAa;AAC1C;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA,4BAA4B,+CAAa;AACzC;AACA,KAAK;AACL;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,oBAAoB;AACnC,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA,6BAA6B,+CAAa;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5bwC;AACJ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,qDAAK;AACjB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,MAAM;AACN;AACO;AACP;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,YAAY,qDAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,uBAAuB,6CAAW;AAClC,wBAAwB,6CAAW;AACnC,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC,4BAA4B,6CAAW;AACvC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1UwC;AACT;AAC/B;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA,+DAA+D,EAAE,UAAU;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,wBAAwB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACO;AACP,kEAAkE,mDAAiB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kDAAgB,OAAO,kDAAgB;AAC/C,QAAQ,kDAAgB;AACxB;AACA;AACA;AACA,oBAAoB,kDAAgB;AACpC;AACA;AACA,yEAAyE,mDAAiB;AAC1F;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP,yEAAyE,mDAAiB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP,yBAAyB;AACzB;AACA;AACO;AACP,2BAA2B;AAC3B;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,QAAQ,oDAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP,kBAAkB,yCAAM;AACxB;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACT;AAC/B;AACO;AACP;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,kCAAkC,wBAAwB;AAC1D,+CAA+C,wBAAwB;AACvE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP,kBAAkB,yCAAM;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AChOO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrEwC;AACxC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACA;AACA;AACA;AACA;AACP;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7QO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,mCAAmC;AACnC,qCAAqC;AACrC,wCAAwC;AACxC,sCAAsC;AACtC,oCAAoC;AACpC,yCAAyC;AACzC,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC,qDAAqD,EAAE;AACvD;AACA;AACA;AACA,oCAAoC,iBAAiB,WAAW,GAAG;AACnE;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;ACjVwC;AACxC;AACO;AACP;AACA;AACA,QAAQ,oDAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD,wEAAwE,mDAAiB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,oDAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,4BAA4B;AAChD,wEAAwE,mDAAiB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,oDAAkB;AAC1B;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,oDAAkB;AAC1B;AACA,oBAAoB,4BAA4B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1GwC;AACxC;AACO;AACP;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA,sEAAsE,wBAAwB;AAC9F,8BAA8B,wBAAwB;AACtD,gCAAgC;AAChC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9FO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wDAAwD;AAC/D;AACA;AACA;AACA;AACA;AACA;AACO,iEAAiE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9KwC;AACxC;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,iBAAiB,KAAK;AACtB;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kDAAgB;AACjC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACP;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzPwC;AACxC;AACO;AACP;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kDAAgB;AACjC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA,cAAc;AACd;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7EwC;AACxC;AACO;AACP;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA,6FAA6F;AAC7F;AACA,6FAA6F;AAC7F;AACA,2GAA2G;AAC3G;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,mDAAiB;AAC5F;AACA;AACA;AACO;AACP;AACA;AACA;AACA,+BAA+B;AAC/B,WAAW;AACX;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,oBAAoB,KAAK,GAAG,QAAQ;AACpC;AACA;;;;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACoC;AACpC;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA,oBAAoB,kDAAS;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kDAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kDAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,KAAK;;;;;;;;;;;;;;;;;AC/LpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iEAA+B;AACtD;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,YAAY,0BAA0B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,gBAAgB;AAC3B,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,oBAAoB;AAC/B,WAAW,gBAAgB;AAC3B;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,oBAAoB;AAC/B,WAAW,gBAAgB;AAC3B;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA;AACA;AACA,gBAAgB,+CAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,YAAY,mBAAmB;AAC/B;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA;AACA;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA,8BAA8B,+CAAa;AAC3C,YAAY,6CAAW;AACvB;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA;AACA;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA,8BAA8B,+CAAa;AAC3C,YAAY,6CAAW;AACvB;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA;AACA,2BAA2B,+CAAa;AACxC;AACA;AACA,4BAA4B,iBAAiB;AAC7C,0BAA0B,+CAAa;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,oBAAoB;AAC/B,YAAY,yBAAyB;AACrC;AACA;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA,0BAA0B,gDAAc;AACxC;AACA;AACA;AACA,oBAAoB,oDAAkB;AACtC,4BAA4B,uBAAuB;AACnD;AACA,8CAA8C,+CAAa;AAC3D;AACA;AACA;AACA;AACA,8CAA8C,+CAAa;AAC3D;AACA;AACA;AACA;AACA,YAAY,gDAAc;AAC1B,YAAY,gDAAc;AAC1B,qBAAqB,gDAAc,KAAK,gDAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gDAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,oBAAoB;AAC/B,YAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA,yBAAyB,+CAAa;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,UAAU;;;;;;;;;;;;;;;;;ACtUzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mCAAmC;AAC9C,YAAY,iBAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,oBAAoB;AAC/B;AACA;AACA,IAAI,gDAAc;AAClB;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA,IAAI,gDAAc;AAClB;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,YAAY,mBAAmB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,+CAAa;AAC7B;AACA;AACA;AACA,QAAQ,gDAAc;AACtB;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,QAAQ,gDAAc;AACtB;AACA,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA,QAAQ,gDAAc;AACtB,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA,QAAQ,gDAAc;AACtB,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA,QAAQ,gDAAc;AACtB,oBAAoB,+CAAa;AACjC;AACA;AACA,uBAAuB,+CAAa;AACpC;AACA;AACA,wBAAwB,OAAO;AAC/B,sBAAsB,+CAAa;AACnC,2CAA2C,EAAE;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gDAAc;AACtB,oBAAoB,+CAAa;AACjC;AACA;AACA;AACA,oBAAoB,yBAAyB;AAC7C;AACA;AACA;AACA;AACA,YAAY,gDAAc;AAC1B,wBAAwB,+CAAa;AACrC;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA,uBAAuB,+CAAa;AACpC;AACA;AACA;AACA;AACA,YAAY,gDAAc;AAC1B,wBAAwB,+CAAa;AACrC;AACA,gBAAgB,gDAAc;AAC9B;AACA;AACA,wBAAwB,+CAAa;AACrC;AACA,uBAAuB,+CAAa;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA,4BAA4B,yBAAyB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,iEAAe,SAAS;;;;;;;;;;;;;;;;;;ACvPxB;AACA;AACA;AACwC;AACL;AACnC;AACA;AACA;AACA,UAAU;AACV;AACO,mBAAmB,mDAAiB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC;AACA,qCAAqC;AACrC,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,8BAA8B;AAC9B,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,qDAAK;AACtC,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,+CAAa;AACnC;AACA;AACA;AACA;AACA;AACA,wBAAwB,4BAA4B;AACpD,2CAA2C,qDAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,UAAU;AACrB,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,kDAAgB;AACxB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxUwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,2BAA2B,6CAAW;AAC/D;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,6CAAW,0BAA0B,6CAAW;AAC9D;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,aAAa,6CAAW,uCAAuC,6CAAW;AAC1E,aAAa,6CAAW,wCAAwC,6CAAW;AAC3E,aAAa,6CAAW;AACxB;AACA,aAAa,6CAAW,yBAAyB,6CAAW;AAC5D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,sBAAsB,6CAAW;AACzD;AACA;AACA,aAAa,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW,0CAA0C,6CAAW;AAClL,aAAa,6CAAW,4CAA4C,6CAAW,8CAA8C,6CAAW,+CAA+C,6CAAW;AAClM,aAAa,6CAAW,+CAA+C,6CAAW,+CAA+C,6CAAW,gDAAgD,6CAAW;AACvM,aAAa,6CAAW,yCAAyC,6CAAW,qCAAqC,6CAAW,iDAAiD,6CAAW;AACxL,aAAa,6CAAW,qCAAqC,6CAAW,sCAAsC,6CAAW,wCAAwC,6CAAW;AAC5K,aAAa,6CAAW,yCAAyC,6CAAW;AAC5E;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,uBAAuB,6CAAW;AAC3D;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,sBAAsB,gDAAc;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,sCAAsC,6CAAW;AAC1E;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA,aAAa,6CAAW,yBAAyB,6CAAW;AAC5D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,sBAAsB,6CAAW;AACzD;AACA;AACA,aAAa,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW,0CAA0C,6CAAW;AAClL,aAAa,6CAAW,4CAA4C,6CAAW,8CAA8C,6CAAW,+CAA+C,6CAAW;AAClM,aAAa,6CAAW,+CAA+C,6CAAW,+CAA+C,6CAAW,gDAAgD,6CAAW;AACvM,aAAa,6CAAW,yCAAyC,6CAAW,qCAAqC,6CAAW,iDAAiD,6CAAW;AACxL,aAAa,6CAAW,qCAAqC,6CAAW,sCAAsC,6CAAW,wCAAwC,6CAAW;AAC5K,aAAa,6CAAW,yCAAyC,6CAAW;AAC5E;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,aAAa,6CAAW,uCAAuC,6CAAW;AAC1E,aAAa,6CAAW,wCAAwC,6CAAW;AAC3E,eAAe,6CAAW;AAC1B;AACA,aAAa,6CAAW,yBAAyB,6CAAW;AAC5D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,sBAAsB,6CAAW;AACzD;AACA;AACA,aAAa,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW,0CAA0C,6CAAW;AAClL,aAAa,6CAAW,4CAA4C,6CAAW,8CAA8C,6CAAW,+CAA+C,6CAAW;AAClM,aAAa,6CAAW,+CAA+C,6CAAW,+CAA+C,6CAAW,gDAAgD,6CAAW;AACvM,aAAa,6CAAW,yCAAyC,6CAAW,qCAAqC,6CAAW,iDAAiD,6CAAW;AACxL,aAAa,6CAAW,qCAAqC,6CAAW,sCAAsC,6CAAW,wCAAwC,6CAAW;AAC5K,aAAa,6CAAW,yCAAyC,6CAAW;AAC5E;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,8CAA8C,6CAAW;AAClF;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,mCAAmC,6CAAW;AACvE;AACA,cAAc,6CAAW,kCAAkC,6CAAW,wCAAwC,6CAAW,wCAAwC,6CAAW;AAC5K;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,uBAAuB,6CAAW;AAC3D;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,6BAA6B,uDAAqB;AAClD,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB,GAAG,6CAAW,uCAAuC,6CAAW;AAClH;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB,GAAG,6CAAW,+BAA+B,6CAAW;AAC1G;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,4BAA4B,6CAAW,mCAAmC,6CAAW;AAC9G;AACA,cAAc,6CAAW,gCAAgC,6CAAW,mCAAmC,6CAAW;AAClH;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO,mBAAmB;AAC1B;AACA;AACA;AACA,aAAa,6CAAW,uCAAuC,6CAAW;AAC1E,aAAa,6CAAW,wCAAwC,6CAAW;AAC3E,aAAa,6CAAW;AACxB;AACA,aAAa,6CAAW,yBAAyB,6CAAW;AAC5D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,sBAAsB,6CAAW;AACzD;AACA;AACA,cAAc,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,uBAAuB,6CAAW;AAC3D;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,sCAAsC,6CAAW;AAC1E;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO,2BAA2B,gBAAgB;AAClD;AACA;AACA;AACA,aAAa,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO,sBAAsB;AAC7B;AACA;AACA;AACA,aAAa,6CAAW,uCAAuC,6CAAW;AAC1E,aAAa,6CAAW,wCAAwC,6CAAW;AAC3E,aAAa,6CAAW;AACxB;AACA,aAAa,6CAAW,yBAAyB,6CAAW;AAC5D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,wBAAwB,6CAAW;AAC3D,aAAa,6CAAW,sBAAsB,6CAAW;AACzD;AACA;AACA,cAAc,6CAAW,yCAAyC,6CAAW,sCAAsC,6CAAW;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,8CAA8C,6CAAW;AAClF;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,mCAAmC,6CAAW;AACvE;AACA,cAAc,6CAAW,kCAAkC,6CAAW,wCAAwC,6CAAW,wCAAwC,6CAAW;AAC5K;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,uBAAuB,6CAAW;AAC3D;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,4BAA4B,6CAAW,mCAAmC,6CAAW;AAC9G;AACA,cAAc,6CAAW,gCAAgC,6CAAW,mCAAmC,6CAAW;AAClH;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACtmCwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,cAAc,6CAAW,4BAA4B,6CAAW;AAChE,mBAAmB,6CAAW;AAC9B;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+CAAa;AACzC;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAW;AACxC,UAAU;AACV,4BAA4B,qBAAqB;AACjD;AACA;AACA,sCAAsC,6CAAW;AACjD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;ACzMwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW,qBAAqB,6CAAW;AACpE;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,6BAA6B,uDAAqB;AAClD,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B,iBAAiB,6CAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7HwC;AACxC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,+BAA+B,6CAAW;AACnE;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6CAAW;AACtC,4BAA4B,6CAAW;AACvC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,yBAAyB,6CAAW;AAC7D;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,uBAAuB,6CAAW;AAC3D;AACA;AACA,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,sBAAsB,6CAAW,0BAA0B,6CAAW,8BAA8B,6CAAW,sCAAsC,6CAAW,4CAA4C,6CAAW;AAChP;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,uBAAuB,6CAAW;AAClC,yBAAyB,6CAAW;AACpC,2BAA2B,6CAAW;AACtC,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC,6BAA6B,6CAAW;AACxC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,kCAAkC,6CAAW;AACtE,mBAAmB,6CAAW;AAC9B;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,kCAAkC,6CAAW;AACtE;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,2BAA2B,6CAAW;AACtC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,sCAAsC,6CAAW;AAC1E;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6BAA6B,wDAAsB;AACnD;AACA,cAAc,6CAAW,mCAAmC,6CAAW;AACvE;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6CAAW;AACtC,yBAAyB,6CAAW;AACpC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,oCAAoC,6CAAW;AACxE;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,6CAAW;AACrC,uBAAuB,6CAAW;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,cAAc,6CAAW,sCAAsC,6CAAW;AAC1E;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,6CAAW;AACzC,8BAA8B,6CAAW;AACzC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,aAAa,6CAAW,wCAAwC,6CAAW;AAC3E,aAAa,6CAAW,0CAA0C,6CAAW;AAC7E,aAAa,6CAAW,8CAA8C,6CAAW;AACjF;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,cAAc,6CAAW,2CAA2C,6CAAW;AAC/E;AACA,cAAc,6CAAW,0CAA0C,6CAAW,8CAA8C,6CAAW;AACvI;AACA,cAAc,6CAAW,kDAAkD,6CAAW,8CAA8C,6CAAW,kDAAkD,6CAAW;AAC5M;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA,cAAc,6CAAW,2CAA2C,6CAAW;AAC/E;AACA,cAAc,6CAAW,0CAA0C,6CAAW,8CAA8C,6CAAW;AACvI;AACA,cAAc,6CAAW,kDAAkD,6CAAW,8CAA8C,6CAAW;AAC/I;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,sBAAsB,gDAAc;AACpC,6BAA6B,qDAAmB;AAChD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,wDAAsB;AACnD;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,YAAY,+CAAa;AACzB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA,wBAAwB,6CAAW;AACnC;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACx3BwC;AACxC;AACO;AACP;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AC7aO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,yBAAyB;AACzB,8BAA8B;AAC9B,gCAAgC;AAChC;AACA;AACA;AACA;AACO;AACP;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC3CO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBwC;AACxC;AACO;AACP;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,QAAQ,mDAAiB;AACzB;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtYwC;AACxC;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,aAAa,6CAAW;AACxB,aAAa,6CAAW;AACxB;AACA;AACA,yBAAyB,6CAAW;AACpC,6BAA6B,uDAAqB;AAClD,yBAAyB,6CAAW;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,6BAA6B,uDAAqB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtiBO;AACP;AACA,6GAA6G;AAC7G;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF;AAChF;AACA;AACO;AACP;AACA;AACA;AACA,kFAAkF;AAClF;AACA;AACA;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C,sDAAsD;AACnK;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACO;AACP;AACA,mEAAmE,0CAA0C;AAC7G;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACO;AACP;AACA;AACA,uFAAuF;AACvF;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4IAA4I;AAC5I;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,kHAAkH;AAClH;AACA;AACO;AACP;AACA;AACA;AACA;AACA,yHAAyH;AACzH;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,oFAAoF;AACpF,gCAAgC;AAChC;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,2DAA2D;AAC3D;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACO;AACP;AACA,4DAA4D;AAC5D;AACA;AACA;AACO;AACP;AACA,wEAAwE;AACxE;AACA;;;;;;;;;;;;;ACzM+B;AAC/B;AACA,gDAAM;;;;;;;;;;;;;;;ACFS;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;AChGuB;AACiB;AASzB;AAC0B;AACmC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6CAAC,gCAAgC,aAAa,WAAW,uBAAuB,WAAW,sBAAsB;AAClI;AACA;AACA;AACA,IAAI,qDAAW;AACf,gBAAgB,sCAAG;AACnB;AACA;AACA;AACA;AACA;AACA,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA,YAAY,qDAAW,iBAAiB,wCAAK;AAC7C,SAAS;AACT,mBAAmB,sCAAG;AACtB;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA,YAAY,qDAAW,aAAa,wCAAK;AACzC,SAAS;AACT,mBAAmB,sCAAG;AACtB;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,qBAAqB,6CAAW;AAChC;AACA;AACA,SAAS;AACT;AACA,YAAY,qDAAW,cAAc,wCAAK;AAC1C,SAAS;AACT,mBAAmB,sCAAG;AACtB;AACA,KAAK;AACL;AACA,yBAAyB,+CAAY,CAAC,gEAAuB;AAC7D,sBAAsB,6CAAC;AACvB;AACA;AACA;AACA;AACA,mDAAmD,iBAAiB;AACpE;AACA;AACA,kBAAkB,sCAAG;AACrB,KAAK;AACL,oBAAoB,mBAAmB;AACvC,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,8BAA8B,4CAAS;AACvC;AACA;AACA,KAAK;AACL;AACA;AACA,QAAQ,6CAAC;AACT,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,IAAI,0CAAO;AACX,IAAI,0CAAO;AACX;AACA;AACA,iEAAe,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;AC7HrB;AACiC;AACV;AACuB;AACR;AACoB;AACe;AACP;AACC;AACnE;AACA;AACA;AACA;AACA,iCAAiC,oEAAgB;AACjD,+BAA+B,gEAAa;AAC5C,+BAA+B,iEAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe;AACf,mBAAmB,yCAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAE,cAAc,sDAAE;AAC1B;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA;AACA,QAAQ,2DAAU;AAClB;AACA;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV;AACA,sEAAsE;AACtE;AACA;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,sDAAE;AAC1B,SAAS;AACT;AACA,QAAQ,sDAAE,sBAAsB,sDAAE;AAClC,mBAAmB,sDAAE;AACrB,SAAS;AACT,QAAQ,sDAAE,0BAA0B,sDAAE;AACtC;AACA,SAAS;AACT;AACA,QAAQ,sDAAE,oCAAoC,uDAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAU;AACtB,mBAAmB,2DAAU;AAC7B;AACA;AACA,mBAAmB,sDAAE;AACrB;AACA,YAAY,sDAAE,+BAA+B,sDAAE;AAC/C;AACA;AACA,eAAe,sDAAE;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV,QAAQ,sDAAE,yBAAyB,sDAAE;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAU;AACtB,YAAY,6CAAC,CAAC,sDAAE;AAChB;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA,QAAQ,sDAAE,+BAA+B,sDAAE;AAC3C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,gBAAgB,wCAAK;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,2DAAU;AACtB,YAAY,6CAAC,CAAC,sDAAE;AAChB;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD,iDAAiD;AACjD;AACA;AACA;AACA,QAAQ,sDAAE,+BAA+B,sDAAE;AAC3C;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,gBAAgB,wCAAK;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iCAAiC,sDAAE;AACnC,QAAQ,sDAAE;AACV,QAAQ,sDAAE,2BAA2B,sDAAE;AACvC,YAAY,sDAAE;AACd,mBAAmB,sDAAE;AACrB,SAAS;AACT,QAAQ,sDAAE,6BAA6B,sDAAE;AACzC,YAAY,sDAAE;AACd;AACA,SAAS;AACT,QAAQ,sDAAE,oBAAoB,sDAAE;AAChC,YAAY,sDAAE;AACd;AACA,SAAS;AACT;AACA,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE,iBAAiB,sDAAE;AAC7B,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV,QAAQ,sDAAE;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8BAA8B,sDAAE;AAClD;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAE;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,QAAQ;AAC1B,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,SAAS;AAC3D;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACv4B2C;AACR;AACI;AACQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,wDAAc;AAC1B;AACA;AACA;AACA;AACA,kCAAkC,4CAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAAS;AACvC;AACA;AACA;AACA,8BAA8B,kDAAQ,GAAG,MAAM,sDAAY;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,sCAAG,sBAAsB;AAC9E,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE,SAAS;AACT;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,sCAAG,uBAAuB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,sCAAG,uBAAuB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAe,WAAW;;;;;;;;;;;;;;;;;AC/MI;AAC9B;AACA,iEAAe,iBAAiB;;;;;;;;;;ACFhC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,SAAS;AACT;AACA;AACA,cAAc;AACd,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,sBAAsB;AAC1D;AACA;AACA;AACA,iJAAiJ;AACjJ;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,cAAc;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,sBAAsB;AAClE;AACA;AACA;AACA;AACA,kGAAkG,OAAO;AACzG;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,cAAc;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE,OAAO;AAC/E;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uBAAuB,cAAc;AACrC,mCAAmC,qEAAqE;AACxG;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C,mCAAmC,qEAAqE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,cAAc;AACnE;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,cAAc;AACpE;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA,4CAA4C,cAAc;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,yBAAyB;AAClF;AACA;AACA;AACA;AACA;AACA,8DAA8D,yBAAyB;AACvF;AACA;AACA;AACA;AACA;AACA,6DAA6D,yBAAyB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2G,cAAc;AACzH;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,qGAAqG,cAAc;AACnH;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,cAAc;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,cAAc;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,oCAAoC,oBAAoB;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,qBAAqB,SAAS,cAAc;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,cAAc;AACrF;AACA;AACA;AACA;AACA;AACA,2CAA2C,cAAc;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kJAAkJ,OAAO;AACzJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,uBAAuB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA,iEAAiE,oBAAoB;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,uBAAuB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA,iEAAiE,oBAAoB;AACrF;AACA;AACA,uCAAuC,uBAAuB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA,mCAAmC,uBAAuB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA,uDAAuD,cAAc;AACrE;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA,+EAA+E,cAAc;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA,+DAA+D,cAAc;AAC7E;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA,+DAA+D,cAAc;AAC7E;AACA,2CAA2C,mBAAmB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA,mCAAmC,6BAA6B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,eAAe;AAChE,qDAAqD,eAAe;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,cAAc;AACxF;AACA;AACA;AACA;AACA,iEAAiE,oBAAoB;AACrF,qFAAqF,oBAAoB;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,iBAAiB;AACjB;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kHAAkH,cAAc;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,SAAS,cAAc;AACtD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA,yEAAyE,OAAO;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA,4CAA4C,uBAAuB;AACnE,gDAAgD,uBAAuB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F,cAAc;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,oCAAoC,iBAAiB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,cAAc;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2IAA2I,cAAc;AACzJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA,uBAAuB,4BAA4B;AACnD;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,cAAc;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA,mEAAmE,oBAAoB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA,mEAAmE,oBAAoB;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA,yEAAyE,oBAAoB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,+BAA+B,OAAO;AACvD,2CAA2C,OAAO;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB,UAAU,OAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iCAAiC;AACxD;AACA,qCAAqC,OAAO;AAC5C;AACA,+BAA+B,uBAAuB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA,wGAAwG,OAAO;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,mCAAmC;AACnC,kCAAkC;AAClC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,eAAe;AACpF;AACA,2BAA2B,eAAe;AAC1C;AACA;AACA,mCAAmC;AACnC,kCAAkC;AAClC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,gCAAgC,cAAc;AAC9C;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,oBAAoB;AACjF;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,8CAA8C,sBAAsB;AACpE;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,kBAAkB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,OAAO;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA,UAAU;AACV;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,OAAO;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,cAAc;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qVAAqV,gCAAgC;AACrX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,sCAAsC,cAAc;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,GAAG;AACtB;AACA;AACA;AACA,uBAAuB;AACvB,8BAA8B;AAC9B;AACA,4BAA4B,qBAAqB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,cAAc;AACvC,4BAA4B,iBAAiB;AAC7C,gCAAgC,OAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,+CAA+C,KAAK;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,OAAO;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA,4CAA4C,OAAO;AACnD;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA,gCAAgC,OAAO;AACvC;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA,mCAAmC,kDAAkD;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,SAAS;AACT;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,KAAK;AACrB;AACA,+BAA+B;AAC/B;AACA;AACA,8BAA8B,KAAK;AACnC,+BAA+B,KAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,eAAe;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA,8DAA8D,OAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,cAAc;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,mCAAmC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2IAA2I,QAAQ;AACnJ;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6KAA6K,cAAc,yBAAyB,cAAc,oBAAoB,qBAAqB,cAAc,yBAAyB,cAAc,yBAAyB,cAAc,yBAAyB,cAAc,oBAAoB,kBAAkB,cAAc,oBAAoB,kBAAkB,cAAc,oBAAoB,kBAAkB,cAAc;AAC1iB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kHAAkH,yCAAyC,cAAc;AACzK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,GAAG;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,GAAG;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,GAAG;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,GAAG;AACxD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,mDAAmD,sBAAsB;AACzE;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,OAAO;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA,4BAA4B,QAAQ;AACpC,4LAA4L,QAAQ;AACpM;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,IAAI;AAC/B;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,aAAa;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,sBAAsB;AACxG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,sBAAsB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iCAAiC;AACjC,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,SAAS,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,yBAAyB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,cAAc;AAChF;AACA,gCAAgC,sBAAsB;AACtD;AACA;AACA;AACA;AACA,wBAAwB,sBAAsB;AAC9C;AACA;AACA,wBAAwB,cAAc;AACtC;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,2NAA2N,cAAc;AACzO;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,QAAQ;AACjF;AACA;AACA;AACA;AACA;AACA,2EAA2E,OAAO;AAClF;AACA;AACA;AACA;AACA;AACA,2BAA2B,OAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,4BAA4B;AAC5D;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,sBAAsB;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,cAAc;AACnF;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,cAAc;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,wEAAwE;AACxE,+CAA+C,0CAA0C;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,kGAAkG,yJAAyJ;AAC3P;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,gDAAgD,4DAA4D,gEAAgE,8CAA8C,8DAA8D,IAAI,6CAA6C;AACzU;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,0HAA0H;AAC1H;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,mEAAmE,wCAAwC,yEAAyE,kCAAkC,kCAAkC,yEAAyE,mBAAmB;AACpV;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,mEAAmE,wCAAwC,2EAA2E,mCAAmC,mCAAmC,2EAA2E,mBAAmB;AAC1V;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,mEAAmE,wCAAwC,oHAAoH,kCAAkC,kCAAkC,sCAAsC,uCAAuC,8GAA8G;AAC9d;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA,mEAAmE,wCAAwC,+GAA+G,mCAAmC,mCAAmC,mCAAmC,mCAAmC,2GAA2G;AACjd;AACA,KAAK;AACL;AACA,yCAAyC,mBAAmB,0CAA0C;AACtG,gEAAgE,uBAAuB,uBAAuB,mDAAmD;AACjK,kFAAkF,uBAAuB,uBAAuB,uBAAuB,2DAA2D;AAClN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2CAA2C;AACpF;AACA;AACA;AACA,2DAA2D,eAAe;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,oCAAoC,wBAAwB;AACnI;AACA,cAAc;AACd,mIAAmI;AACnI;AACA;AACA;AACA,2CAA2C,oBAAoB,qBAAqB,0CAA0C,KAAK;AACnI;AACA,gCAAgC,OAAO;AACvC;AACA,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F;AAC9F;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA,yCAAyC,+BAA+B,oBAAoB,wDAAwD,GAAG;AACvJ,6CAA6C,+BAA+B,kCAAkC,+BAA+B,oBAAoB,sFAAsF,mCAAmC,GAAG;AAC7R;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,qCAAqC;AACrC;AACA;AACA;AACA;AACA,2BAA2B,oEAAoE,OAAO;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAA0D,OAAO;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,6CAA6C,kCAAkC,+BAA+B,2BAA2B,2BAA2B,wCAAwC,uFAAuF,2EAA2E,GAAG,sCAAsC,+DAA+D,GAAG,sBAAsB,2CAA2C,2CAA2C,GAAG;AACxkB,yCAAyC,+BAA+B,oBAAoB,uDAAuD,GAAG;AACtJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL,6CAA6C,+BAA+B,kCAAkC,2BAA2B,4BAA4B,6BAA6B,sBAAsB,uFAAuF,sCAAsC,mEAAmE,GAAG;AAC3Z,sCAAsC,6BAA6B,+BAA+B,yBAAyB,sBAAsB,yBAAyB,yBAAyB,sBAAsB,wMAAwM,2DAA2D,+CAA+C,wDAAwD,wDAAwD,gCAAgC,GAAG;AAC9pB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA,+CAA+C,cAAc;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,GAAG;AAC9D;AACA;AACA;AACA;AACA;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,cAAc;AACpG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,QAAQ;AACxD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA,wBAAwB,+BAA+B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+BAA+B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,gBAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA;AACA;AACA,iIAAiI,cAAc;AAC/I;AACA,mBAAmB,cAAc;AACjC;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,aAAa;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,OAAO;AAC/H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kCAAkC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kTAAkT,cAAc;AAChU;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kCAAkC;AAClC,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA,yBAAyB;AACzB,iFAAiF;AACjF,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,oCAAoC,iCAAiC,+BAA+B,wBAAwB,6BAA6B,kCAAkC,iCAAiC,oBAAoB,+BAA+B,sBAAsB,2BAA2B,oBAAoB,2GAA2G,sCAAsC,8BAA8B,6BAA6B,GAAG;AACniB,yCAAyC,sBAAsB,2BAA2B,uCAAuC,oBAAoB,iBAAiB,mDAAmD,GAAG;AAC5N;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF,OAAO;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ,OAAO;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,sBAAsB;AACzE;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,sBAAsB;AACzE;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,OAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,OAAO;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,OAAO;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,OAAO;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA,KAAK,oBAAoB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,cAAc;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,YAAY;AACjE;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,SAAS;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,6HAA6H,OAAO;AACpI;AACA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yMAAyM,QAAQ;AACjN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,uHAAuH,SAAS;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4IAA4I,QAAQ;AACpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,kBAAkB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2BAA2B;AACvD;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,cAAc;AACjE;AACA;AACA;AACA;AACA;AACA,wCAAwC,oBAAoB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,cAAc;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,OAAO;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,OAAO;AACnE,0CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,2BAA2B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gMAAgM,kBAAkB;AAClN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA,4BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,SAAS;AACtF;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oOAAoO,OAAO;AAC3O;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,uCAAuC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,sBAAsB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,OAAO;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,OAAO;AACjD;AACA;AACA;AACA;AACA,8FAA8F,OAAO;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F,OAAO;AACpG;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,yBAAyB;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kLAAkL,cAAc;AAChM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,OAAO;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,sBAAsB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,sBAAsB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,mCAAmC;AACnC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,IAA4D;AACpE;AACA,MAAM,KAAK,EAIN;AACL;AACA;;;;;;;;;;;ACp6dA,iBAAiB,SAAS,oDAAoD,qBAAqB,wBAAwB,QAAQ,WAAW,qCAAqC,4jBAA4jB,mFAAmF,sDAAsD,uGAAuG,gDAAgD,gDAAgD,sBAAsB,iDAAiD,qFAAqF,kDAAkD,8FAA8F,iDAAiD,yCAAyC,6BAA6B,6OAA6O,+5BAA+5B,g0DAAg0D,aAAa,kgGAAkgG,6hKAA6hK,k3EAAk3E,QAAQ,6EAA6E,+FAA+F,+CAA+C,oMAAoM,mGAAmG,oNAAoN,0DAA0D,8FAA8F,cAAc,sGAAsG,6CAA6C,0CAA0C,gTAAgT,4EAA4E,uBAAuB,6CAA6C,wGAAwG,6CAA6C,6JAA6J,kDAAkD,cAAc,sGAAsG,EAAE,kBAAkB,62IAA62I,WAAW,iPAAiP,8BAA8B,yBAAyB,4BAA4B,8BAA8B,mBAAmB,0FAA0F,sBAAsB,2BAA2B,iCAAiC,mBAAmB,oIAAoI,4CAA4C,+BAA+B,oBAAoB,4DAA4D,oBAAoB,WAAW,YAAY,qBAAqB,0CAA0C,8BAA8B,uBAAuB,yBAAyB,mKAAmK,kBAAkB,uBAAuB,yGAAyG,SAAS,sMAAsM,mBAAmB,kIAAkI,QAAQ,uIAAuI,KAAK,UAAU,6CAA6C,WAAW,4DAA4D,cAAc,iCAAiC,WAAW,sLAAsL,aAAa,WAAW,KAAK,uKAAuK,oHAAoH,qIAAqI,wGAAwG,YAAY,qCAAqC,SAAS,6BAA6B,qIAAqI,gCAAgC,WAAW,kCAAkC,+BAA+B,+HAA+H,WAAW,YAAY,WAAW,0JAA0J,oCAAoC,mCAAmC,8BAA8B,gDAAgD,wDAAwD,6BAA6B,oCAAoC,MAAM,gEAAgE,+EAA+E,sBAAsB,6PAA6P,IAAI,EAAE,yMAAyM,sCAAsC,oDAAoD,+BAA+B,MAAM,QAAQ,oBAAoB,SAAS,WAAW,WAAW,QAAQ,oBAAoB,SAAS,WAAW,cAAc,SAAS,uGAAuG,KAAK,0DAA0D,qCAAqC,SAAS,YAAY,UAAU,iBAAiB,OAAO,4BAA4B,SAAS,oDAAoD,QAAQ,uZAAuZ,kBAAkB,yDAAyD,mIAAmI,4BAA4B,wDAAwD,MAAM,iGAAiG,8DAA8D,QAAQ,QAAQ,WAAW,mDAAmD,uCAAuC,8CAA8C,mDAAmD,+BAA+B,wDAAwD,+BAA+B,UAAU,QAAQ,UAAU,SAAS,uHAAuH,2DAA2D,cAAc,QAAQ,mDAAmD,UAAU,qHAAqH,sIAAsI,0EAA0E,SAAS,QAAQ,YAAY,YAAY,yEAAyE,WAAW,QAAQ,YAAY,YAAY,0CAA0C,aAAa,2FAA2F,WAAW,mBAAmB,6BAA6B,2EAA2E,oDAAoD,WAAW,sBAAsB,6BAA6B,mEAAmE,QAAQ,YAAY,WAAW,MAAM,wDAAwD,gEAAgE,8BAA8B,cAAc,QAAQ,kBAAkB,SAAS,WAAW,OAAO,QAAQ,kDAAkD,SAAS,YAAY,UAAU,+BAA+B,QAAQ,wwDAAwwD,4EAA4E,MAAM,mEAAmE,iEAAiE,oDAAoD,yJAAyJ,2DAA2D,gCAAgC,0EAA0E,EAAE,4CAA4C,gCAAgC,mHAAmH,EAAE,8CAA8C,gCAAgC,0DAA0D,0EAA0E,+BAA+B,+IAA+I,EAAE,yCAAyC,gCAAgC,0DAA0D,0EAA0E,+BAA+B,sGAAsG,EAAE,sDAAsD,6BAA6B,oEAAoE,2BAA2B,EAAE,2DAA2D,6BAA6B,oEAAoE,2BAA2B,EAAE,wCAAwC,gCAAgC,wEAAwE,0EAA0E,+BAA+B,sGAAsG,EAAE,yCAAyC,gCAAgC,wEAAwE,0EAA0E,EAAE,sDAAsD,gCAAgC,0BAA0B,oEAAoE,EAAE,qDAAqD,6BAA6B,uFAAuF,EAAE,8FAA8F,QAAQ,gBAAgB,uCAAuC,4EAA4E,OAAO,sHAAsH,aAAa,0FAA0F,WAAW,mBAAmB,6BAA6B,mEAAmE,kEAAkE,kDAAkD,WAAW,mBAAmB,6BAA6B,2EAA2E,wEAAwE,iBAAiB,WAAW,MAAM,wDAAwD,gEAAgE,8BAA8B,eAAe,UAAU,0BAA0B,+GAA+G,SAAS,uBAAuB,EAAE,wDAAwD,oCAAoC,oDAAoD,uDAAuD,gCAAgC,EAAE,yDAAyD,mCAAmC,2DAA2D,6BAA6B,0CAA0C,2GAA2G,2DAA2D,QAAQ,WAAW,2CAA2C,WAAW,6IAA6I,mGAAmG,qBAAqB,yEAAyE,kBAAkB,gGAAgG,2BAA2B,kBAAkB,2EAA2E,WAAW,qCAAqC,yEAAyE,iDAAiD,yEAAyE,SAAS,uBAAuB,eAAe,yBAAyB,+CAA+C,wBAAwB,WAAW,oBAAoB,UAAU,KAAK,QAAQ,gDAAgD,YAAY,qJAAqJ,UAAU,QAAQ,sDAAsD,UAAU,QAAQ,mFAAmF,+KAA+K,cAAc,QAAQ,8DAA8D,YAAY,WAAW,YAAY,0BAA0B,6EAA6E,IAAI,MAAM,uCAAuC,sCAAsC,0GAA0G,QAAQ,aAAa,iCAAiC,eAAe,oCAAoC,kFAAkF,aAAa,kCAAkC,+FAA+F,2DAA2D,sCAAsC,0EAA0E,QAAQ,mMAAmM,uTAAuT,wBAAwB,wDAAwD,mDAAmD,eAAe,sDAAsD,4EAA4E,mBAAmB,MAAM,6DAA6D,eAAe,iBAAiB,kGAAkG,KAAK,wBAAwB,sBAAsB,wBAAwB,wBAAwB,2BAA2B,sBAAsB,yBAAyB,8GAA8G,WAAW,mBAAmB,MAAM,2CAA2C,2DAA2D,sBAAsB,YAAY,IAAI,kEAAkE,gCAAgC,wNAAwN,2BAA2B,0CAA0C,6CAA6C,2CAA2C,WAAW,sEAAsE,SAAS,cAAc,sIAAsI,qBAAqB,wCAAwC,WAAW,6BAA6B,SAAS,aAAa,qCAAqC,cAAc,8EAA8E,QAAQ,KAAK,qDAAqD,MAAM,iBAAiB,YAAY,IAAI,gBAAgB,IAAI,+CAA+C,SAAS,iBAAiB,gCAAgC,sCAAsC,4EAA4E,+CAA+C,iBAAiB,uBAAuB,gCAAgC,sCAAsC,4EAA4E,+CAA+C,mBAAmB,8DAA8D,WAAW,iCAAiC,YAAY,wBAAwB,qGAAqG,QAAQ,yBAAyB,qDAAqD,YAAY,IAAI,gBAAgB,IAAI,KAAK,8BAA8B,mBAAmB,2EAA2E,UAAU,QAAQ,SAAS,2CAA2C,SAAS,UAAU,uEAAuE,aAAa,SAAS,+CAA+C,SAAS,UAAU,sEAAsE,QAAQ,QAAQ,2CAA2C,SAAS,UAAU,4DAA4D,WAAW,QAAQ,oBAAoB,SAAS,UAAU,0DAA0D,OAAO,QAAQ,oBAAoB,SAAS,UAAU,0DAA0D,QAAQ,SAAS,sCAAsC,QAAQ,YAAY,IAAI,6EAA6E,8BAA8B,SAAS,UAAU,2FAA2F,SAAS,SAAS,6CAA6C,SAAS,UAAU,2FAA2F,aAAa,SAAS,2CAA2C,WAAW,qCAAqC,6BAA6B,SAAS,UAAU,0FAA0F,QAAQ,aAAa,2BAA2B,4CAA4C,gFAAgF,SAAS,oBAAoB,oJAAoJ,SAAS,WAAW,iEAAiE,QAAQ,IAAI,sCAAsC,+GAA+G,wBAAwB,+CAA+C,gBAAgB,oCAAoC,MAAM,EAAE,sBAAsB,wBAAwB,6GAA6G,SAAS,oBAAoB,8EAA8E,MAAM,QAAQ,mBAAmB,SAAS,UAAU,iEAAiE,UAAU,QAAQ,uBAAuB,SAAS,UAAU,gEAAgE,SAAS,SAAS,uBAAuB,8FAA8F,8BAA8B,YAAY,cAAc,EAAE,sBAAsB,wBAAwB,gCAAgC,oCAAoC,mDAAmD,SAAS,UAAU,6EAA6E,eAAe,QAAQ,mBAAmB,SAAS,UAAU,qFAAqF,UAAU,QAAQ,0EAA0E,YAAY,UAAU,KAAK,oCAAoC,gCAAgC,6BAA6B,SAAS,UAAU,0DAA0D,SAAS,SAAS,oEAAoE,8BAA8B,4BAA4B,mEAAmE,KAAK,KAAK,sCAAsC,qCAAqC,iBAAiB,IAAI,KAAK,sCAAsC,qCAAqC,6BAA6B,SAAS,oBAAoB,+GAA+G,UAAU,QAAQ,OAAO,mFAAmF,wDAAwD,QAAQ,SAAS,gDAAgD,SAAS,8EAA8E,YAAY,2CAA2C,WAAW,iCAAiC,eAAe,+CAA+C,YAAY,aAAa,+CAA+C,YAAY,cAAc,EAAE,sBAAsB,wBAAwB,sCAAsC,mFAAmF,UAAU,wHAAwH,sCAAsC,iEAAiE,cAAc,wHAAwH,sCAAsC,6DAA6D,QAAQ,sFAAsF,gCAAgC,0BAA0B,yBAAyB,sCAAsC,4DAA4D,YAAY,sFAAsF,0BAA0B,yDAAyD,sCAAsC,4DAA4D,cAAc,8BAA8B,4EAA4E,iBAAiB,YAAY,IAAI,uBAAuB,SAAS,eAAe,sCAAsC,0FAA0F,2DAA2D,oBAAoB,YAAY,IAAI,6BAA6B,cAAc,2CAA2C,YAAY,IAAI,KAAK,8BAA8B,kBAAkB,WAAW,EAAE,sEAAsE,wCAAwC,kHAAkH,YAAY,iCAAiC,sEAAsE,iCAAiC,UAAU,iBAAiB,iCAAiC,qDAAqD,SAAS,aAAa,0EAA0E,gDAAgD,qFAAqF,YAAY,qBAAqB,0CAA0C,iCAAiC,UAAU,2DAA2D,4FAA4F,+RAA+R,o5BAAo5B,85DAA85D,6MAA6M,40BAA40B,siFAAsiF,yRAAyR,+3CAA+3C,sgTAAsgT,mwXAAmwX,irbAAirb,4EAA4E,8mFAA8mF,09PAA09P,0pYAA0pY,mlPAAmlP,yUAAyU,6DAA6D,wCAAwC,07MAA07M,uEAAuE,soCAAsoC,SAAS,2CAA2C,wDAAwD,mCAAmC,uEAAuE,kDAAkD,kCAAkC,oDAAoD,yDAAyD,+DAA+D,KAAK,uDAAuD,8BAA8B,2DAA2D,wDAAwD,WAAW,uDAAuD,8BAA8B,sDAAsD,mDAAmD,WAAW,uDAAuD,8BAA8B,8CAA8C,yDAAyD,yEAAyE,kBAAkB,6CAA6C,ofAAof,oFAAoF,kQAAkQ,kDAAkD,qBAAqB,kDAAkD,qBAAqB,6CAA6C,0CAA0C,+CAA+C,mBAAmB,mDAAmD,4BAA4B,qDAAqD,qDAAqD,0BAA0B,kDAAkD,eAAe,qDAAqD,4CAA4C,gEAAgE,4CAA4C,6CAA6C,EAAE,yDAAyD,+lGAA+lG,sBAAsB,kDAAkD,qBAAqB,wCAAwC,sDAAsD,iBAAiB,cAAc,+TAA+T,8CAA8C,MAAM,6DAA6D,IAAI,0DAA0D,SAAS,aAAa,yEAAyE,mEAAmE,SAAS,sDAAsD,gBAAgB,wCAAwC,yCAAyC,qBAAqB,sBAAsB,YAAY,EAAE,GAAG,gBAAgB,uEAAuE,uGAAuG,sCAAsC,mBAAmB,qGAAqG,sBAAsB,MAAM,wIAAwI,qEAAqE,kBAAkB,WAAW,sEAAsE,+BAA+B,qFAAqF,gCAAgC,iHAAiH,uBAAuB,oEAAoE,+BAA+B,8OAA8O,8BAA8B,EAAE,sBAAsB,YAAY,kQAAkQ,uFAAuF,iCAAiC,2BAA2B,6BAA6B,SAAS,oDAAoD,qCAAqC,2cAA2c,EAAE,IAAI,wBAAwB,MAAM,kaAAka,qEAAqE,sBAAsB,UAAU,obAAob,0EAA0E,oBAAoB,UAAU,2eAA2e,2EAA2E,kBAAkB,oGAAoG,uEAAuE,kBAAkB,kGAAkG,qHAAqH,uHAAuH,kDAAkD,0JAA0J,+DAA+D,+CAA+C,MAAM,iHAAiH,6BAA6B,SAAS,oDAAoD,QAAQ,+RAA+R,EAAE,GAAG,EAAE,+BAA+B,+CAA+C,2SAA2S,EAAE,mFAAmF,qDAAqD,mMAAmM,EAAE,kBAAkB,2FAA2F,iEAAiE,kBAAkB,+FAA+F,qEAAqE,kBAAkB,6FAA6F,mEAAmE,kBAAkB,uFAAuF,6DAA6D,kBAAkB,uFAAuF,6DAA6D,oBAAoB,uFAAuF,iEAAiE,oBAAoB,2FAA2F,qEAAqE,oBAAoB,yFAAyF,mHAAmH,uJAAuJ,oDAAoD,8FAA8F,EAAE,oBAAoB,mFAAmF,6DAA6D,oBAAoB,mFAAmF,6GAA6G,2EAA2E,4CAA4C,sEAAsE,kDAAkD,+CAA+C,2BAA2B,EAAE,kEAAkE,+CAA+C,UAAU,wiBAAwiB,2CAA2C,mBAAmB,gDAAgD,qBAAqB,+BAA+B,wHAAwH,EAAE,2DAA2D,gbAAgb,gCAAgC,QAAQ,8EAA8E,yCAAyC,0HAA0H,0CAA0C,KAAK,6BAA6B,oCAAoC,SAAS,0EAA0E,uCAAuC,8MAA8M,YAAY,8BAA8B,8FAA8F,QAAQ,8JAA8J,4CAA4C,kJAAkJ,6KAA6K,KAAK,6BAA6B,uCAAuC,2DAA2D,8BAA8B,iSAAiS,YAAY,UAAU,WAAW,gDAAgD,kHAAkH,+CAA+C,cAAc,QAAQ,kQAAkQ,mIAAmI,KAAK,6BAA6B,6BAA6B,eAAe,eAAe,SAAS,yBAAyB,sBAAsB,SAAS,UAAU,uKAAuK,yEAAyE,uCAAuC,sGAAsG,oIAAoI,YAAY,WAAW,eAAe,KAAK,yCAAyC,KAAK,MAAM,4BAA4B,kBAAkB,cAAc,SAAS,wCAAwC,0CAA0C,+BAA+B,QAAQ,yNAAyN,iEAAiE,2GAA2G,wDAAwD,yFAAyF,oBAAoB,wDAAwD,0CAA0C,iCAAiC,YAAY,WAAW,eAAe,KAAK,kCAAkC,KAAK,MAAM,4BAA4B,0BAA0B,YAAY,SAAS,sBAAsB,0CAA0C,+BAA+B,QAAQ,+SAA+S,kFAAkF,iEAAiE,mCAAmC,6BAA6B,YAAY,6DAA6D,KAAK,uBAAuB,EAAE,kCAAkC,0DAA0D,QAAQ,8PAA8P,QAAQ,kLAAkL,KAAK,6BAA6B,mCAAmC,2DAA2D,gCAAgC,yBAAyB,YAAY,mBAAmB,uEAAuE,QAAQ,mSAAmS,gIAAgI,oHAAoH,oHAAoH,oDAAoD,KAAK,6BAA6B,8BAA8B,MAAM,2CAA2C,wCAAwC,+FAA+F,2DAA2D,8BAA8B,gEAAgE,YAAY,MAAM,mBAAmB,oEAAoE,sEAAsE,4DAA4D,QAAQ,+JAA+J,oCAAoC,4BAA4B,kDAAkD,KAAK,6BAA6B,8BAA8B,mEAAmE,oCAAoC,yCAAyC,YAAY,8BAA8B,KAAK,iCAAiC,EAAE,qDAAqD,kDAAkD,0BAA0B,SAAS,QAAQ,gNAAgN,mFAAmF,mCAAmC,4DAA4D,KAAK,6BAA6B,oCAAoC,uEAAuE,sCAAsC,6BAA6B,YAAY,8BAA8B,eAAe,uDAAuD,sBAAsB,EAAE,+CAA+C,+CAA+C,UAAU,QAAQ,qNAAqN,uFAAuF,8EAA8E,gEAAgE,KAAK,6BAA6B,sCAAsC,iEAAiE,iCAAiC,iDAAiD,YAAY,6EAA6E,iCAAiC,2BAA2B,yLAAyL,+DAA+D,kCAAkC,4FAA4F,YAAY,WAAW,uEAAuE,EAAE,EAAE,qEAAqE,+HAA+H,yBAAyB,6BAA6B,8CAA8C,QAAQ,qOAAqO,QAAQ,wOAAwO,KAAK,6BAA6B,kCAAkC,6DAA6D,qCAAqC,wEAAwE,mFAAmF,YAAY,YAAY,4BAA4B,OAAO,YAAY,cAAc,4BAA4B,gCAAgC,YAAY,qCAAqC,wBAAwB,YAAY,mDAAmD,OAAO,wBAAwB,wBAAwB,4BAA4B,sDAAsD,QAAQ,6PAA6P,iPAAiP,8BAA8B,6EAA6E,4BAA4B,yBAAyB,uQAAuQ,mLAAmL,mKAAmK,sLAAsL,gJAAgJ,qKAAqK,0DAA0D,KAAK,6BAA6B,qCAAqC,yEAAyE,uCAAuC,qBAAqB,iBAAiB,sHAAsH,oIAAoI,YAAY,mBAAmB,KAAK,iHAAiH,KAAK,mGAAmG,0DAA0D,+BAA+B,SAAS,QAAQ,iOAAiO,QAAQ,0GAA0G,yCAAyC,2JAA2J,kEAAkE,KAAK,6BAA6B,uCAAuC,+DAA+D,gCAAgC,2HAA2H,wDAAwD,gEAAgE,qEAAqE,YAAY,mBAAmB,eAAe,oFAAoF,gEAAgE,KAAK,gEAAgE,gCAAgC,QAAQ,+wBAA+wB,gGAAgG,sIAAsI,WAAW,YAAY,WAAW,gDAAgD,uCAAuC,sDAAsD,KAAK,6BAA6B,gCAAgC,6DAA6D,iCAAiC,0EAA0E,YAAY,yCAAyC,QAAQ,sLAAsL,QAAQ,kNAAkN,KAAK,6BAA6B,+BAA+B,MAAM,+MAA+M,UAAU,iBAAiB,QAAQ,mFAAmF,uCAAuC,SAAS,UAAU,iBAAiB,+DAA+D,kCAAkC,wBAAwB,YAAY,gCAAgC,qBAAqB,iFAAiF,SAAS,QAAQ,YAAY,QAAQ,0MAA0M,KAAK,6BAA6B,kCAAkC,mEAAmE,oCAAoC,6BAA6B,YAAY,gCAAgC,eAAe,qDAAqD,kCAAkC,6BAA6B,QAAQ,yLAAyL,mFAAmF,mCAAmC,4DAA4D,KAAK,6BAA6B,oCAAoC,uCAAuC,mFAAmF,uEAAuE,sCAAsC,4DAA4D,YAAY,uBAAuB,MAAM,WAAW,YAAY,oBAAoB,KAAK,6CAA6C,qCAAqC,4DAA4D,UAAU,+BAA+B,QAAQ,+hBAA+hB,6GAA6G,YAAY,WAAW,gCAAgC,gEAAgE,KAAK,6BAA6B,sCAAsC,yIAAyI,63EAA63E,oJAAoJ,SAAS,oJAAoJ,eAAe,iCAAiC,MAAM,+CAA+C,MAAM,uBAAuB,gBAAgB,2HAA2H,SAAS,UAAU,yFAAyF,QAAQ,wBAAwB,0FAA0F,mBAAmB,mCAAmC,SAAS,UAAU,kFAAkF,OAAO,uBAAuB,gBAAgB,2HAA2H,SAAS,UAAU,uFAAuF,QAAQ,wBAAwB,0FAA0F,mBAAmB,mCAAmC,SAAS,UAAU,gFAAgF,OAAO,uBAAuB,gBAAgB,2HAA2H,SAAS,UAAU,0FAA0F,QAAQ,0BAA0B,iBAAiB,iNAAiN,SAAS,oBAAoB,gKAAgK,QAAQ,wBAAwB,0FAA0F,oBAAoB,qCAAqC,SAAS,UAAU,mFAAmF,OAAO,uBAAuB,gBAAgB,uEAAuE,6BAA6B,0FAA0F,SAAS,UAAU,uHAAuH,WAAW,6BAA6B,sIAAsI,kEAAkE,sCAAsC,SAAS,oBAAoB,yMAAyM,MAAM,sBAAsB,eAAe,2HAA2H,SAAS,UAAU,qFAAqF,OAAO,uBAAuB,0FAA0F,eAAe,wCAAwC,SAAS,UAAU,0EAA0E,UAAU,0BAA0B,qEAAqE,mCAAmC,gCAAgC,SAAS,UAAU,gFAAgF,MAAM,qBAAqB,0FAA0F,SAAS,UAAU,4DAA4D,OAAO,sBAAsB,2FAA2F,SAAS,UAAU,0EAA0E,MAAM,sBAAsB,mEAAmE,UAAU,8GAA8G,aAAa,yEAAyE,gCAAgC,SAAS,UAAU,0EAA0E,QAAQ,wBAAwB,mEAAmE,6BAA6B,YAAY,aAAa,wCAAwC,KAAK,qBAAqB,iCAAiC,KAAK,eAAe,iCAAiC,SAAS,UAAU,mKAAmK,OAAO,uBAAuB,mEAAmE,UAAU,8EAA8E,SAAS,UAAU,iFAAiF,YAAY,4BAA4B,mEAAmE,2BAA2B,6FAA6F,yFAAyF,QAAQ,YAAY,WAAW,SAAS,sCAAsC,iBAAiB,aAAa,KAAK,sCAAsC,8BAA8B,SAAS,UAAU,0GAA0G,QAAQ,wBAAwB,mMAAmM,SAAS,UAAU,oHAAoH,OAAO,yBAAyB,sIAAsI,gBAAgB,yJAAyJ,YAAY,yFAAyF,gCAAgC,SAAS,oBAAoB,6GAA6G,QAAQ,wBAAwB,eAAe,mEAAmE,qCAAqC,gBAAgB,aAAa,qCAAqC,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,0BAA0B,+FAA+F,SAAS,UAAU,sNAAsN,OAAO,uBAAuB,wHAAwH,SAAS,mBAAmB,UAAU,0BAA0B,WAAW,mBAAmB,2EAA2E,UAAU,6CAA6C,yBAAyB,IAAI,KAAK,qBAAqB,QAAQ,QAAQ,oCAAoC,2BAA2B,+BAA+B,WAAW,IAAI,gCAAgC,SAAS,UAAU,+JAA+J,QAAQ,uBAAuB,4FAA4F,SAAS,UAAU,4DAA4D,MAAM,wBAAwB,mBAAmB,0BAA0B,sBAAsB,kEAAkE,kIAAkI,oDAAoD,uQAAuQ,SAAS,oBAAoB,6EAA6E,QAAQ,0BAA0B,6NAA6N,SAAS,oBAAoB,0FAA0F,UAAU,4BAA4B,0LAA0L,wDAAwD,wRAAwR,kGAAkG,iFAAiF,qCAAqC,4EAA4E,4CAA4C,8BAA8B,SAAS,YAAY,kvBAAkvB,WAAW,2BAA2B,mEAAmE,6BAA6B,6GAA6G,SAAS,UAAU,+GAA+G,QAAQ,wBAAwB,mEAAmE,6BAA6B,wHAAwH,SAAS,UAAU,iHAAiH,QAAQ,wBAAwB,mEAAmE,6BAA6B,6DAA6D,SAAS,UAAU,sGAAsG,QAAQ,0BAA0B,oIAAoI,UAAU,yCAAyC,6BAA6B,iDAAiD,iBAAiB,yEAAyE,gCAAgC,SAAS,oBAAoB,8GAA8G,SAAS,wBAAwB,6FAA6F,SAAS,UAAU,mGAAmG,MAAM,wBAAwB,mEAAmE,+BAA+B,+DAA+D,6KAA6K,kDAAkD,KAAK,iCAAiC,wCAAwC,sBAAsB,gCAAgC,SAAS,oBAAoB,qKAAqK,QAAQ,wBAAwB,iBAAiB,mEAAmE,6BAA6B,8DAA8D,6CAA6C,KAAK,iCAAiC,wCAAwC,SAAS,gCAAgC,SAAS,UAAU,0EAA0E,QAAQ,wBAAwB,qBAAqB,mEAAmE,UAAU,yGAAyG,KAAK,wCAAwC,4CAA4C,iBAAiB,6BAA6B,gCAAgC,KAAK,eAAe,kCAAkC,SAAS,UAAU,6JAA6J,OAAO,uBAAuB,mEAAmE,6BAA6B,8DAA8D,6CAA6C,KAAK,iCAAiC,wCAAwC,eAAe,gCAAgC,SAAS,UAAU,yEAAyE,OAAO,uBAAuB,mEAAmE,2BAA2B,iBAAiB,2FAA2F,kGAAkG,6FAA6F,aAAa,OAAO,4BAA4B,iFAAiF,SAAS,UAAU,2IAA2I,MAAM,wBAAwB,uBAAuB,sIAAsI,gBAAgB,sJAAsJ,KAAK,wCAAwC,iFAAiF,sEAAsE,eAAe,gDAAgD,iFAAiF,gCAAgC,SAAS,oBAAoB,6EAA6E,UAAU,0BAA0B,qEAAqE,mCAAmC,gCAAgC,SAAS,UAAU,gFAAgF,YAAY,8BAA8B,sIAAsI,gBAAgB,+GAA+G,cAAc,+DAA+D,qCAAqC,iBAAiB,KAAK,4CAA4C,mBAAmB,qCAAqC,qBAAqB,qBAAqB,+EAA+E,4DAA4D,gCAAgC,SAAS,oBAAoB,kTAAkT,MAAM,sBAAsB,eAAe,2HAA2H,SAAS,UAAU,mFAAmF,OAAO,uBAAuB,0FAA0F,eAAe,wCAAwC,SAAS,UAAU,wEAAwE,OAAO,uBAAuB,mEAAmE,6BAA6B,8DAA8D,mCAAmC,SAAS,UAAU,oEAAoE,MAAM,sBAAsB,eAAe,2HAA2H,SAAS,UAAU,sFAAsF,OAAO,uBAAuB,mEAAmE,6BAA6B,yCAAyC,qBAAqB,gDAAgD,SAAS,UAAU,2EAA2E,QAAQ,wBAAwB,+IAA+I,SAAS,UAAU,qIAAqI,KAAK,ssDAAssD,iBAAiB,yVAAyV,qrBAAqrB,wEAAwE,mCAAmC,sEAAsE,QAAQ,0CAA0C,qHAAqH,cAAc,qFAAqF,aAAa,gIAAgI,oPAAoP,kEAAkE,gBAAgB,2FAA2F,2BAA2B,yEAAyE,mCAAmC,sEAAsE,QAAQ,0CAA0C,mFAAmF,WAAW,YAAY,WAAW,KAAK,aAAa,kGAAkG,8FAA8F,kCAAkC,cAAc,qFAAqF,aAAa,sEAAsE,kEAAkE,+BAA+B,uYAAuY,kEAAkE,gBAAgB,2FAA2F,2BAA2B,6EAA6E,yCAAyC,2DAA2D,QAAQ,0CAA0C,4CAA4C,aAAa,+FAA+F,iDAAiD,cAAc,yFAAyF,aAAa,wHAAwH,6SAA6S,kEAAkE,gBAAgB,0FAA0F,YAAY,qBAAqB,2EAA2E,qEAAqE,qDAAqD,IAAI,uBAAuB,gEAAgE,SAAS,oBAAoB,yDAAyD,KAAK,uBAAuB,iEAAiE,SAAS,oBAAoB,0DAA0D,KAAK,uBAAuB,gEAAgE,SAAS,oBAAoB,0DAA0D,KAAK,uBAAuB,mEAAmE,SAAS,oBAAoB,0DAA0D,KAAK,uBAAuB,iEAAiE,SAAS,oBAAoB,0DAA0D,KAAK,uBAAuB,gEAAgE,SAAS,oBAAoB,yDAAyD,OAAO,uBAAuB,yCAAyC,SAAS,UAAU,sDAAsD,QAAQ,wBAAwB,0BAA0B,SAAS,UAAU,kFAAkF,MAAM,wBAAwB,gEAAgE,SAAS,oBAAoB,0DAA0D,SAAS,2BAA2B,mEAAmE,SAAS,oBAAoB,8DAA8D,MAAM,sBAAsB,yBAAyB,SAAS,UAAU,uDAAuD,MAAM,wBAAwB,yCAAyC,SAAS,oBAAoB,yDAAyD,OAAO,yBAAyB,4CAA4C,SAAS,oBAAoB,yDAAyD,WAAW,6BAA6B,8CAA8C,SAAS,oBAAoB,0DAA0D,QAAQ,wBAAwB,0DAA0D,SAAS,UAAU,6DAA6D,MAAM,sBAAsB,4CAA4C,SAAS,UAAU,mDAAmD,SAAS,yBAAyB,4CAA4C,SAAS,oBAAoB,mDAAmD,SAAS,2BAA2B,4CAA4C,SAAS,oBAAoB,0DAA0D,MAAM,wBAAwB,yCAAyC,SAAS,oBAAoB,yDAAyD,MAAM,wBAAwB,0CAA0C,SAAS,oBAAoB,yDAAyD,SAAS,2BAA2B,6CAA6C,SAAS,oBAAoB,yDAAyD,MAAM,sBAAsB,0CAA0C,SAAS,UAAU,mDAAmD,MAAM,wBAAwB,2CAA2C,SAAS,oBAAoB,yDAAyD,MAAM,sBAAsB,0CAA0C,SAAS,UAAU,mDAAmD,MAAM,wBAAwB,yCAAyC,SAAS,oBAAoB,0DAA0D,SAAS,2BAA2B,4CAA4C,SAAS,oBAAoB,0DAA0D,MAAM,wBAAwB,yCAAyC,SAAS,oBAAoB,yDAAyD,UAAU,wBAAwB,yCAAyC,SAAS,oBAAoB,yDAAyD,MAAM,wBAAwB,4CAA4C,SAAS,oBAAoB,yDAAyD,SAAS,2BAA2B,oCAAoC,SAAS,oBAAoB,gFAAgF,WAAW,6BAA6B,uDAAuD,SAAS,oBAAoB,mFAAmF,UAAU,4BAA4B,wCAAwC,SAAS,oBAAoB,oFAAoF,UAAU,4BAA4B,mFAAmF,SAAS,oBAAoB,4DAA4D,UAAU,4BAA4B,mCAAmC,SAAS,oBAAoB,wDAAwD,UAAU,4BAA4B,wCAAwC,SAAS,oBAAoB,4EAA4E,UAAU,8BAA8B,qFAAqF,SAAS,oBAAoB,+DAA+D,cAAc,gCAAgC,uCAAuC,4IAA4I,IAAI,yBAAyB,SAAS,gDAAgD,8DAA8D,eAAe,uCAAuC,0DAA0D,iIAAiI,mGAAmG,SAAS,SAAS,SAAS,oBAAoB,0VAA0V,OAAO,yBAAyB,gDAAgD,SAAS,oBAAoB,0DAA0D,OAAO,yBAAyB,mDAAmD,SAAS,oBAAoB,0DAA0D,UAAU,4BAA4B,8DAA8D,8CAA8C,qJAAqJ,gDAAgD,SAAS,oBAAoB,iFAAiF,YAAY,8BAA8B,qDAAqD,SAAS,oBAAoB,2DAA2D,UAAU,4BAA4B,mDAAmD,SAAS,oBAAoB,2DAA2D,OAAO,yBAAyB,gDAAgD,SAAS,oBAAoB,0DAA0D,OAAO,yBAAyB,iDAAiD,SAAS,oBAAoB,0DAA0D,UAAU,4BAA4B,oDAAoD,SAAS,oBAAoB,0DAA0D,MAAM,wBAAwB,kDAAkD,SAAS,oBAAoB,0DAA0D,OAAO,yBAAyB,gDAAgD,SAAS,oBAAoB,2DAA2D,UAAU,4BAA4B,mDAAmD,SAAS,oBAAoB,2DAA2D,OAAO,yBAAyB,gDAAgD,SAAS,oBAAoB,0DAA0D,WAAW,yBAAyB,gDAAgD,SAAS,oBAAoB,0DAA0D,OAAO,yBAAyB,mDAAmD,SAAS,oBAAoB,2DAA2D,0BAA0B,goCAAgoC,WAAW,uzBAAuzB,QAAQ,wEAAwE,8DAA8D,gHAAgH,wCAAwC,yFAAyF,2CAA2C,4FAA4F,kDAAkD,MAAM,mJAAmJ,0CAA0C,MAAM,8HAA8H,2CAA2C,MAAM,4HAA4H,2CAA2C,MAAM,8HAA8H,gDAAgD,uJAAuJ,6CAA6C,8FAA8F,KAAK,suBAAsuB,+BAA+B,4CAA4C,kBAAkB,w8JAAw8J,w+EAAw+E,mCAAmC,kDAAkD,sCAAsC,6CAA6C,+BAA+B,4CAA4C,4BAA4B,kDAAkD,0CAA0C,uDAAuD,mDAAmD,iDAAiD,kGAAkG,uDAAuD,+CAA+C,iEAAiE,kJAAkJ,8CAA8C,+MAA+M,gDAAgD,0IAA0I,2DAA2D,4PAA4P,+CAA+C,2BAA2B,+CAA+C,oEAAoE,iDAAiD,8DAA8D,wDAAwD,8CAA8C,0DAA0D,gDAAgD,iEAAiE,4SAA4S,4DAA4D,yLAAyL,mDAAmD,+GAA+G,kDAAkD,mDAAmD,8NAA8N,2DAA2D,uGAAuG,kDAAkD,kEAAkE,yDAAyD,+KAA+K,qDAAqD,wCAAwC,4KAA4K,yDAAyD,4CAA4C,2HAA2H,oDAAoD,yCAAyC,mDAAmD,+CAA+C,qLAAqL,gEAAgE,4YAA4Y,gDAAgD,8BAA8B,uDAAuD,6CAA6C,yDAAyD,+CAA+C,mDAAmD,iCAAiC,oDAAoD,gGAAgG,uCAAuC,+CAA+C,4CAA4C,wDAAwD,+DAA+D,uDAAuD,mDAAmD,gPAAgP,iDAAiD,6IAA6I,6CAA6C,yBAAyB,6CAA6C,2EAA2E,6CAA6C,8EAA8E,sDAAsD,kCAAkC,yCAAyC,qBAAqB,wCAAwC,gDAAgD,wCAAwC,oDAAoD,8CAA8C,4BAA4B,6CAA6C,6DAA6D,kDAAkD,+GAA+G,iDAAiD,qDAAqD,uCAAuC,0CAA0C,sBAAsB,sDAAsD,wCAAwC,8CAA8C,wDAAwD,6CAA6C,wCAAwC,wCAAwC,8CAA8C,+EAA+E,SAAS,gDAAgD,0DAA0D,4CAA4C,oIAAoI,gDAAgD,oEAAoE,0CAA0C,kDAAkD,0CAA0C,kDAAkD,+CAA+C,+DAA+D,+CAA+C,+DAA+D,+CAA+C,+DAA+D,yCAAyC,iDAAiD,4CAA4C,wBAAwB,8CAA8C,+MAA+M,kDAAkD,kCAAkC,8CAA8C,0DAA0D,4CAA4C,wBAAwB,6CAA6C,6DAA6D,+CAA+C,iCAAiC,0CAA0C,sBAAsB,oDAAoD,4CAA4C,sDAAsD,2QAA2Q,yDAAyD,iDAAiD,+CAA+C,2BAA2B,4CAA4C,0BAA0B,mDAAmD,+BAA+B,4CAA4C,wDAAwD,+CAA+C,2DAA2D,6CAA6C,uMAAuM,mDAAmD,yCAAyC,uGAAuG,+CAA+C,2DAA2D,yCAAyC,uBAAuB,8CAA8C,6EAA6E,kDAAkD,kCAAkC,gDAAgD,gEAAgE,gDAAgD,gEAAgE,gDAAgD,gEAAgE,0CAA0C,kDAAkD,kDAAkD,gQAAgQ,8CAA8C,4BAA4B,8CAA8C,4BAA4B,iDAAiD,6IAA6I,4DAA4D,wDAAwD,uCAAuC,iDAAiD,2CAA2C,yBAAyB,gDAAgD,oFAAoF,8CAA8C,wDAAwD,+CAA+C,yDAAyD,+CAA+C,kFAAkF,gDAAgD,8BAA8B,6CAA6C,2BAA2B,6CAA6C,2BAA2B,4CAA4C,0BAA0B,gDAAgD,8BAA8B,8CAA8C,0DAA0D,+CAA+C,4LAA4L,gDAAgD,4BAA4B,mDAAmD,oNAAoN,wCAAwC,gDAAgD,wCAAwC,sBAAsB,2CAA2C,yBAAyB,mDAAmD,0FAA0F,mDAAmD,mGAAmG,+CAA+C,gIAAgI,iDAAiD,kIAAkI,4CAA4C,wBAAwB,sDAAsD,yKAAyK,0CAA0C,sBAAsB,wCAAwC,+FAA+F,yBAAyB,0CAA0C,iGAAiG,2BAA2B,8CAA8C,4BAA4B,+HAA+H,mLAAmL,yCAAyC,oBAAoB,0CAA0C,gDAAgD,0CAA0C,gDAAgD,2CAA2C,iDAAiD,2CAA2C,iDAAiD,6CAA6C,2BAA2B,iDAAiD,+BAA+B,0CAA0C,sBAAsB,4CAA4C,wBAAwB,gDAAgD,8BAA8B,8CAA8C,4BAA4B,+CAA+C,6BAA6B,2CAA2C,yBAAyB,4CAA4C,0BAA0B,4CAA4C,0BAA0B,4CAA4C,0BAA0B,8CAA8C,4FAA4F,kDAAkD,gGAAgG,6CAA6C,yBAAyB,8CAA8C,0BAA0B,+CAA+C,mDAAmD,QAAQ,WAAW,6CAA6C,+CAA+C,+CAA+C,2BAA2B,+CAA+C,oDAAoD,uCAAuC,yCAAyC,2EAA2E,6BAA6B,gBAAgB,uBAAuB,+GAA+G,iCAAiC,SAAS,sCAAsC,2CAA2C,oEAAoE,0CAA0C,SAAS,0BAA0B,4LAA4L,8DAA8D,qDAAqD,UAAU,yBAAyB,KAAK,iCAAiC,qCAAqC,+FAA+F,kBAAkB,gDAAgD,oWAAoW,EAAE,4GAA4G,gDAAgD,uNAAuN,EAAE,wHAAwH,gDAAgD,uXAAuX,EAAE,oIAAoI,2CAA2C,cAAc,kDAAkD,+OAA+O,EAAE,4IAA4I,0BAA0B,kBAAkB,mDAAmD,qIAAqI,EAAE,wFAAwF,kDAAkD,0CAA0C,oDAAoD,yCAAyC,mDAAmD,kBAAkB,iDAAiD,uMAAuM,kDAAkD,0HAA0H,EAAE,6CAA6C,kCAAkC,UAAU,yCAAyC,eAAe,kDAAkD,gGAAgG,0CAA0C,gCAAgC,yKAAyK,4CAA4C,8BAA8B,kBAAkB,iDAAiD,qJAAqJ,kDAAkD,2IAA2I,wCAAwC,0CAA0C,uBAAuB,8CAA8C,8DAA8D,wCAAwC,mCAAmC,0CAA0C,0CAA0C,0BAA0B,0CAA0C,0CAA0C,0BAA0B,2CAA2C,0CAA0C,2BAA2B,0CAA0C,0CAA0C,0BAA0B,2CAA2C,uCAAuC,8CAA8C,oGAAoG,4CAA4C,0CAA0C,4BAA4B,8CAA8C,gBAAgB,4CAA4C,eAAe,mDAAmD,+CAA+C,0CAA0C,wCAAwC,EAAE,yBAAyB,6CAA6C,iFAAiF,yCAAyC,uCAAuC,EAAE,6BAA6B,iDAAiD,qJAAqJ,8CAA8C,gBAAgB,4CAA4C,cAAc,EAAE,0BAA0B,iDAAiD,6LAA6L,kDAAkD,2HAA2H,8CAA8C,4CAA4C,iDAAiD,oBAAoB,iDAAiD,mBAAmB,gDAAgD,kBAAkB,+CAA+C,wBAAwB,YAAY,4CAA4C,eAAe,YAAY,oDAAoD,0EAA0E,6CAA6C,gBAAgB,8CAA8C,iBAAiB,4CAA4C,qBAAqB,4CAA4C,qBAAqB,gDAAgD,yGAAyG,EAAE,4SAA4S,y1FAAy1F,w8BAAw8B,qmXAAqmX,2EAA2E,uIAAuI,OAAO,8FAA8F,QAAQ,uFAAuF,OAAO,qrBAAqrB,2EAA2E,iHAAiH,OAAO,iEAAiE,QAAQ,gGAAgG,OAAO,ogXAAogX,qMAAqM,mDAAmD,gCAAgC,gBAAgB,YAAY,mDAAmD,+GAA+G,uDAAuD,UAAU,4DAA4D,EAAE,KAAK,qCAAqC,uKAAuK,eAAe,EAAE,KAAK,qCAAqC,wJAAwJ,sBAAsB,oDAAoD,0BAA0B,qBAAqB,MAAM,oDAAoD,gBAAgB,wGAAwG,KAAK,WAAW,iHAAiH,2HAA2H,8FAA8F,oDAAoD,gCAAgC,oDAAoD,2CAA2C,6CAA6C,2CAA2C,oDAAoD,+CAA+C,oDAAoD,0DAA0D,2CAA2C,8BAA8B,+BAA+B,gCAAgC,uCAAuC,6KAA6K,0CAA0C,2GAA2G,EAAE,kBAAkB,WAAW,mBAAmB,UAAU,2GAA2G,qEAAqE,iGAAiG,8FAA8F,qGAAqG,iGAAiG,sBAAsB,2BAA2B,oEAAoE,yEAAyE,4DAA4D,4CAA4C,0HAA0H,kDAAkD,mJAAmJ,8CAA8C,0GAA0G,wBAAwB,4CAA4C,mDAAmD,0MAA0M,UAAU,8TAA8T,EAAE,oBAAoB,8CAA8C,yHAAyH,iDAAiD,wRAAwR,6EAA6E,eAAe,oSAAoS,gDAAgD,8JAA8J,wBAAwB,sCAAsC,2CAA2C,6JAA6J,8DAA8D,yBAAyB,yDAAyD,4CAA4C,uKAAuK,YAAY,qBAAqB,IAAI,MAAM,wCAAwC,kBAAkB,sFAAsF,gEAAgE,IAAI,MAAM,2EAA2E,wBAAwB,gEAAgE,6DAA6D,6BAA6B,6CAA6C,2BAA2B,uRAAuR,WAAW,+FAA+F,0EAA0E,8BAA8B,KAAK,qDAAqD,uFAAuF,qCAAqC,kHAAkH,UAAU,mCAAmC,WAAW,oHAAoH,oEAAoE,uBAAuB,QAAQ,sBAAsB,YAAY,oGAAoG,0BAA0B,sBAAsB,qJAAqJ,0FAA0F,8GAA8G,2GAA2G,8JAA8J,mKAAmK,EAAE,yEAAyE,oMAAoM,gBAAgB,uJAAuJ,0FAA0F,2GAA2G,wGAAwG,yBAAyB,8BAA8B,WAAW,oBAAoB,EAAE,+CAA+C,qDAAqD,KAAK,iBAAiB,WAAW,qCAAqC,gCAAgC,wCAAwC,8BAA8B,sKAAsK,iDAAiD,4DAA4D,2CAA2C,4BAA4B,+BAA+B,4CAA4C,0HAA0H,uBAAuB,EAAE,0GAA0G,2BAA2B,uBAAuB,MAAM,+EAA+E,0HAA0H,YAAY,iBAAiB,8DAA8D,cAAc,yBAAyB,QAAQ,sJAAsJ,0FAA0F,2GAA2G,wKAAwK,kKAAkK,QAAQ,qJAAqJ,0FAA0F,2GAA2G,iNAAiN,8JAA8J,gBAAgB,+CAA+C,2DAA2D,oCAAoC,qDAAqD,4CAA4C,6CAA6C,iGAAiG,mGAAmG,qBAAqB,2DAA2D,eAAe,+BAA+B,uKAAuK,0DAA0D,eAAe,8BAA8B,oKAAoK,uKAAuK,gCAAgC,0IAA0I,4DAA4D,eAAe,gCAAgC,oJAAoJ,uHAAuH,MAAM,uJAAuJ,2GAA2G,2DAA2D,4CAA4C,OAAO,wwCAAwwC,OAAO,qeAAqe,0DAA0D,iCAAiC,2BAA2B,6BAA6B,SAAS,oDAAoD,kDAAkD,wBAAwB,iDAAiD,0CAA0C,6GAA6G,EAAE,GAAG,wCAAwC,8EAA8E,GAAG,UAAU,+xCAA+xC,SAAS,gmBAAgmB,eAAe,EAAE,sMAAsM,kEAAkE,+CAA+C,yEAAyE,2CAA2C,+GAA+G,+CAA+C,kJAAkJ,iIAAiI,6DAA6D,WAAW,KAAK,wDAAwD,UAAU,mEAAmE,KAAK,8kFAA8kF,KAAK,81DAA81D,ksBAAksB,ikDAAikD,y2BAAy2B,GAAG,wqFAAwqF,iwCAAiwC,u9EAAu9E,03TAA03T,8BAA8B,wHAAwH,yBAAyB,QAAQ,IAAI,4GAA4G,SAAS,wBAAwB,mBAAmB,4CAA4C,uBAAuB,sCAAsC,2BAA2B,QAAQ,wHAAwH,oEAAoE,6BAA6B,yDAAyD,sDAAsD,gBAAgB,iDAAiD,yBAAyB,wCAAwC,4GAA4G,0BAA0B,IAAI,0BAA0B,uBAAuB,EAAE,sCAAsC,SAAS,aAAa,kCAAkC,wcAAwc,2BAA2B,eAAe,MAAM,sEAAsE,2BAA2B,iBAAiB,gCAAgC,sBAAsB,0LAA0L,8VAA8V,0CAA0C,qBAAqB,4GAA4G,8KAA8K,gDAAgD,+EAA+E,OAAO,qCAAqC,uDAAuD,4XAA4X,EAAE,sDAAsD,yDAAyD,iBAAiB,uGAAuG,0CAA0C,mMAAmM,yBAAyB,yBAAyB,0BAA0B,GAAG,8CAA8C,wFAAwF,2CAA2C,qFAAqF,EAAE,oKAAoK,wFAAwF,4FAA4F,8JAA8J,yDAAyD,sDAAsD,6GAA6G,8CAA8C,kKAAkK,8EAA8E,QAAQ,wHAAwH,0DAA0D,MAAM,uJAAuJ,+JAA+J,iDAAiD,kFAAkF,0DAA0D,uQAAuQ,gFAAgF,wCAAwC,KAAK,kPAAkP,OAAO,gCAAgC,WAAW,gCAAgC,+DAA+D,iFAAiF,sFAAsF,+GAA+G,kDAAkD,qHAAqH,0CAA0C,qGAAqG,KAAK,uDAAuD,OAAO,yCAAyC,wEAAwE,WAAW,sDAAsD,oCAAoC,2BAA2B,oCAAoC,6QAA6Q,yBAAyB,GAAG,UAAU,gVAAgV,eAAe,qCAAqC,QAAQ,kHAAkH,aAAa,6BAA6B,SAAS,GAAG,mGAAmG,2GAA2G,qBAAqB,kDAAkD,qDAAqD,gBAAgB,oBAAoB,sBAAsB,sBAAsB,oCAAoC,SAAS,+BAA+B,6BAA6B,mCAAmC,wBAAwB,aAAa,2BAA2B,iCAAiC,wBAAwB,WAAW,uDAAuD,iBAAiB,sBAAsB,2BAA2B,qBAAqB,yBAAyB,uBAAuB,4BAA4B,mEAAmE,2BAA2B,uFAAuF,mBAAmB,+EAA+E,+JAA+J,aAAa,kBAAkB,QAAQ,kGAAkG,mBAAmB,+GAA+G,2BAA2B,4DAA4D,qBAAqB,SAAS,qBAAqB,2BAA2B,2BAA2B,iCAAiC,oBAAoB,kEAAkE,qBAAqB,sEAAsE,0BAA0B,+GAA+G,kTAAkT,gCAAgC,oHAAoH,yBAAyB,0DAA0D,4EAA4E,qBAAqB,UAAU,+BAA+B,sCAAsC,mCAAmC,uBAAuB,QAAQ,gHAAgH,WAAW,0BAA0B,oDAAoD,6HAA6H,MAAM,oBAAoB,MAAM,8DAA8D,mEAAmE,8BAA8B,MAAM,4EAA4E,QAAQ,wBAAwB,4EAA4E,2BAA2B,6LAA6L,yBAAyB,sFAAsF,MAAM,yGAAyG,uCAAuC,qCAAqC,KAAK,4GAA4G,YAAY,WAAW,+BAA+B,kCAAkC,aAAa,sBAAsB,yDAAyD,sJAAsJ,0BAA0B,4CAA4C,yBAAyB,qBAAqB,8JAA8J,uBAAuB,qBAAqB,kJAAkJ,oBAAoB,yCAAyC,mBAAmB,uDAAuD,WAAW,4BAA4B,qDAAqD,WAAW,qKAAqK,aAAa,qCAAqC,kBAAkB,+BAA+B,mCAAmC,IAAI,QAAQ,KAAK,kCAAkC,yLAAyL,2BAA2B,oCAAoC,mEAAmE,EAAE,SAAS,IAAI,+EAA+E,yBAAyB,gBAAgB,EAAE,gCAAgC,kBAAkB,6BAA6B,kBAAkB,GAAG,yBAAyB,2EAA2E,2EAA2E,QAAQ,IAAI,yFAAyF,yBAAyB,+BAA+B,EAAE,6BAA6B,0EAA0E,SAAS,qBAAqB,UAAU,oKAAoK,EAAE,UAAU,EAAE,gGAAgG,mBAAmB,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,8EAA8E,gCAAgC,MAAM,8DAA8D,YAAY,QAAQ,IAAI,+DAA+D,8DAA8D,aAAa,IAAI,uFAAuF,oDAAoD,6DAA6D,wHAAwH,oFAAoF,qBAAqB,SAAS,iCAAiC,kCAAkC,eAAe,uMAAuM,yCAAyC,kBAAkB,gEAAgE,2BAA2B,EAAE,iIAAiI,kCAAkC,uMAAuM,+BAA+B,mFAAmF,iLAAiL,eAAe,OAAO,2QAA2Q,iBAAiB,oBAAoB,KAAK,6BAA6B,IAAI,kBAAkB,SAAS,4GAA4G,iGAAiG,qGAAqG,mDAAmD,4DAA4D,SAAS,+CAA+C,aAAa,EAAE,yFAAyF,wEAAwE,YAAY,WAAW,4CAA4C,+DAA+D,yBAAyB,0GAA0G,wBAAwB,sEAAsE,uBAAuB,yEAAyE,aAAa,6BAA6B,gDAAgD,sBAAsB,uEAAuE,mBAAmB,wCAAwC,uBAAuB,SAAS,IAAI,kHAAkH,iFAAiF,gCAAgC,qBAAqB,qDAAqD,YAAY,IAAI,gCAAgC,gFAAgF,2BAA2B,iBAAiB,WAAW,4BAA4B,+BAA+B,imBAAimB,qDAAqD,qEAAqE,yBAAyB,6CAA6C,8BAA8B,IAAI,mCAAmC,SAAS,wCAAwC,+DAA+D,4CAA4C,sBAAsB,wDAAwD,SAAS,wCAAwC,gEAAgE,MAAM,aAAa,2BAA2B,qCAAqC,qCAAqC,aAAa,KAAK,MAAM,aAAa,kBAAkB,cAAc,EAAE,6FAA6F,gEAAgE,sBAAsB,qBAAqB,yBAAyB,sBAAsB,oBAAoB,gDAAgD,OAAO,0BAA0B,sHAAsH,0BAA0B,SAAS,2JAA2J,qBAAqB,oBAAoB,2BAA2B,iGAAiG,+BAA+B,+FAA+F,qBAAqB,yFAAyF,oCAAoC,0FAA0F,kEAAkE,mBAAmB,QAAQ,WAAW,iBAAiB,sBAAsB,WAAW,0DAA0D,IAAI,EAAE,GAAG,sCAAsC,wBAAwB,8BAA8B,OAAO,mEAAmE,qFAAqF,kEAAkE,yFAAyF,OAAO,qDAAqD,mDAAmD,OAAO,sIAAsI,oBAAoB,kBAAkB,4BAA4B,qEAAqE,qCAAqC,mBAAmB,sBAAsB,uBAAuB,kHAAkH,0BAA0B,uFAAuF,uBAAuB,uBAAuB,uBAAuB,WAAW,iBAAiB,IAAI,4BAA4B,qBAAqB,wBAAwB,UAAU,EAAE,yGAAyG,wDAAwD,6BAA6B,kBAAkB,8BAA8B,kBAAkB,GAAG,oCAAoC,kBAAkB,kCAAkC,wBAAwB,iCAAiC,4CAA4C,mCAAmC,8BAA8B,6BAA6B,2EAA2E,6CAA6C,8CAA8C,IAAI,uBAAuB,WAAW,kCAAkC,gQAAgQ,qBAAqB,cAAc,mCAAmC,WAAW,oDAAoD,oBAAoB,EAAE,0BAA0B,WAAW,2CAA2C,sCAAsC,EAAE,iCAAiC,sBAAsB,kCAAkC,6BAA6B,yEAAyE,0BAA0B,yFAAyF,uBAAuB,iDAAiD,oBAAoB,4SAA4S,oJAAoJ,wBAAwB,sLAAsL,wCAAwC,EAAE,kHAAkH,mHAAmH,6DAA6D,kCAAkC,oCAAoC,uFAAuF,0BAA0B,+FAA+F,SAAS,mHAAmH,sDAAsD,kBAAkB,kHAAkH,0CAA0C,kDAAkD,kCAAkC,+CAA+C,kCAAkC,yDAAyD,wEAAwE,4EAA4E,cAAc,iCAAiC,+BAA+B,8BAA8B,oDAAoD,+EAA+E,yEAAyE,kIAAkI,0BAA0B,iFAAiF,6KAA6K,sDAAsD,iDAAiD,sDAAsD,gDAAgD,yBAAyB,wFAAwF,0BAA0B,mBAAmB,EAAE,4BAA4B,kDAAkD,8EAA8E,iDAAiD,qFAAqF,sDAAsD,qFAAqF,mEAAmE,gCAAgC,4QAA4Q,IAAI,8JAA8J,2BAA2B,8FAA8F,IAAI,6GAA6G,+CAA+C,QAAQ,EAAE,qCAAqC,+CAA+C,QAAQ,EAAE,sBAAsB,kBAAkB,sBAAsB,mHAAmH,2BAA2B,GAAG,mFAAmF,6HAA6H,kBAAkB,GAAG,uIAAuI,2HAA2H,gBAAgB,GAAG,sIAAsI,mRAAmR,kCAAkC,GAAG,0GAA0G,2DAA2D,qBAAqB,KAAK,8HAA8H,wBAAwB,oBAAoB,EAAE,6CAA6C,+CAA+C,KAAK,6BAA6B,IAAI,2EAA2E,sBAAsB,wBAAwB,sBAAsB,qBAAqB,gDAAgD,gCAAgC,KAAK,4BAA4B,iNAAiN,sFAAsF,qBAAqB,sXAAsX,mBAAmB,mCAAmC,KAAK,mHAAmH,8EAA8E,OAAO,GAAG,8HAA8H,gDAAgD,SAAS,EAAE,gCAAgC,gDAAgD,SAAS,EAAE,yBAAyB,mBAAmB,sBAAsB,iEAAiE,QAAQ,eAAe,6EAA6E,oGAAoG,0BAA0B,GAAG,iGAAiG,iEAAiE,4BAA4B,oCAAoC,6BAA6B,qCAAqC,yBAAyB,iCAAiC,kFAAkF,8BAA8B,sBAAsB,8BAA8B,yEAAyE,kCAAkC,gCAAgC,gCAAgC,qBAAqB,iCAAiC,2BAA2B,KAAK,6CAA6C,+CAA+C,uGAAuG,6CAA6C,wGAAwG,+CAA+C,gGAAgG,0CAA0C,0CAA0C,kDAAkD,4kBAA4kB,iCAAiC,SAAS,mCAAmC,uBAAuB,sBAAsB,+BAA+B,yBAAyB,qDAAqD,sBAAsB,2DAA2D,2BAA2B,wDAAwD,0BAA0B,yFAAyF,oBAAoB,kKAAkK,+VAA+V,8HAA8H,gCAAgC,WAAW,+HAA+H,4BAA4B,uZAAuZ,kIAAkI,mDAAmD,OAAO,EAAE,qDAAqD,sBAAsB,yBAAyB,sMAAsM,uFAAuF,4EAA4E,2EAA2E,yCAAyC,gJAAgJ,0CAA0C,+DAA+D,qHAAqH,kCAAkC,sBAAsB,kCAAkC,oCAAoC,yCAAyC,6CAA6C,qDAAqD,YAAY,WAAW,2CAA2C,KAAK,4BAA4B,kBAAkB,6BAA6B,mBAAmB,0CAA0C,mCAAmC,0DAA0D,MAAM,8CAA8C,iCAAiC,eAAe,iFAAiF,6IAA6I,yIAAyI,mBAAmB,iCAAiC,2BAA2B,iFAAiF,cAAc,KAAK,4BAA4B,kEAAkE,0EAA0E,OAAO,2WAA2W,mCAAmC,WAAW,6CAA6C,mEAAmE,qBAAqB,KAAK,MAAM,qCAAqC,WAAW,0DAA0D,0BAA0B,kBAAkB,qDAAqD,2FAA2F,kEAAkE,QAAQ,kEAAkE,mCAAmC,WAAW,sDAAsD,0CAA0C,2HAA2H,8DAA8D,sBAAsB,iBAAiB,0EAA0E,0DAA0D,wBAAwB,2BAA2B,QAAQ,QAAQ,+FAA+F,wDAAwD,oGAAoG,+CAA+C,+GAA+G,wIAAwI,uEAAuE,mBAAmB,wEAAwE,qSAAqS,6fAA6f,4HAA4H,8EAA8E,wDAAwD,uBAAuB,sEAAsE,iBAAiB,4FAA4F,yNAAyN,8DAA8D,4BAA4B,wMAAwM,+4IAA+4I,mJAAmJ,UAAU,iXAAiX,4gaAA4ga,UAAU,sEAAsE,SAAS,yDAAyD,6CAA6C,2FAA2F,YAAY,oBAAoB,2BAA2B,yBAAyB,2CAA2C,wCAAwC,6CAA6C,iBAAiB,2CAA2C,6FAA6F,EAAE,yBAAyB,EAAE,2CAA2C,8EAA8E,qBAAqB,kBAAkB,mDAAmD,yCAAyC,6CAA6C,WAAW,4GAA4G,8CAA8C,6BAA6B,oBAAoB,8CAA8C,8BAA8B,EAAE,8DAA8D,8BAA8B,yBAAyB,0CAA0C,4CAA4C,uMAAuM,+BAA+B,2BAA2B,kBAAkB,SAAS,+CAA+C,sBAAsB,aAAa,yBAAyB,EAAE,GAAG,KAAK,yyBAAyyB,qBAAqB,sKAAsK,QAAQ,wEAAwE,iGAAiG,8EAA8E,sDAAsD,gFAAgF,8DAA8D,oFAAoF,qEAAqE,mDAAmD,6BAA6B,gDAAgD,4EAA4E,wDAAwD,gFAAgF,gEAAgE,oFAAoF,EAAE,iEAAiE,6GAA6G,KAAK,oKAAoK,OAAO,uCAAuC,eAAe,iDAAiD,aAAa,aAAa,sEAAsE,uBAAuB,iEAAiE,wJAAwJ,oFAAoF,WAAW,KAAK,IAAI,qBAAqB,UAAU,WAAW,MAAM,uBAAuB,SAAS,sDAAsD,SAAS,iBAAiB,iCAAiC,iFAAiF,WAAW,OAAO,uDAAuD,IAAI,YAAY,WAAW,KAAK,yCAAyC,WAAW,2BAA2B,WAAW,UAAU,oQAAoQ,UAAU,wDAAwD,6CAA6C,8CAA8C,0EAA0E,uIAAuI,sDAAsD,yBAAyB,yBAAyB,yBAAyB,gCAAgC,iCAAiC,2BAA2B,+BAA+B,kCAAkC,uBAAuB,qBAAqB,iFAAiF,qBAAqB,4BAA4B,GAAG,MAAM,oEAAoE,qFAAqF,yBAAyB,uDAAuD,qGAAqG,0DAA0D,qCAAqC,2DAA2D,sCAAsC,qDAAqD,yBAAyB,qDAAqD,gFAAgF,oEAAoE,kHAAkH,qDAAqD,mGAAmG,2DAA2D,kDAAkD,kDAAkD,oDAAoD,uDAAuD,SAAS,EAAE,uEAAuE,6CAA6C,mFAAmF,6CAA6C,iBAAiB,aAAa,mBAAmB,sDAAsD,EAAE,yEAAyE,6CAA6C,0CAA0C,6CAA6C,UAAU,sHAAsH,wDAAwD,wJAAwJ,uIAAuI,gDAAgD,gCAAgC,+HAA+H,6CAA6C,iBAAiB,aAAa,mBAAmB,sDAAsD,EAAE,sBAAsB,yDAAyD,SAAS,sDAAsD,gBAAgB,2CAA2C,wDAAwD,yCAAyC,kCAAkC,wCAAwC,yBAAyB,iDAAiD,6CAA6C,iDAAiD,iBAAiB,4HAA4H,gDAAgD,uNAAuN,oDAAoD,2QAA2Q,mDAAmD,+EAA+E,QAAQ,0BAA0B,+bAA+b,SAAS,+CAA+C,gDAAgD,IAAI,klBAAklB,+BAA+B,6DAA6D,uDAAuD,6BAA6B,mBAAmB,wRAAwR,wCAAwC,sWAAsW,EAAE,8DAA8D,2CAA2C,6CAA6C,iDAAiD,+BAA+B,EAAE,6DAA6D,iDAAiD,kBAAkB,8CAA8C,kEAAkE,EAAE,wDAAwD,sJAAsJ,KAAK,4DAA4D,kBAAkB,0NAA0N,uCAAuC,IAAI,iBAAiB,6BAA6B,IAAI,gBAAgB,iBAAiB,IAAI,WAAW,SAAS,mBAAmB,oFAAoF,mBAAmB,uBAAuB,IAAI,mBAAmB,SAAS,iBAAiB,sCAAsC,sDAAsD,mEAAmE,kLAAkL,wDAAwD,sDAAsD,gJAAgJ,gDAAgD,0DAA0D,gIAAgI,6CAA6C,UAAU,+HAA+H,4CAA4C,kQAAkQ,+VAA+V,6CAA6C,4ZAA4Z,udAAud,gDAAgD,wBAAwB,IAAI,gBAAgB,IAAI,sBAAsB,SAAS,KAAK,4DAA4D,QAAQ,iBAAiB,6CAA6C,6NAA6N,mEAAmE,0DAA0D,qEAAqE,2DAA2D,+CAA+C,mCAAmC,uFAAuF,6BAA6B,kBAAkB,sCAAsC,2BAA2B,oCAAoC,yBAAyB,wCAAwC,6BAA6B,+BAA+B,gBAAgB,+BAA+B,SAAS,+BAA+B,SAAS,gDAAgD,iDAAiD,aAAa,oBAAoB,6DAA6D,uDAAuD,qBAAqB,QAAQ,KAAK,wBAAwB,+DAA+D,+CAA+C,wCAAwC,0EAA0E,WAAW,oEAAoE,KAAK,kBAAkB,SAAS,gBAAgB,wBAAwB,kDAAkD,2CAA2C,6CAA6C,eAAe,+EAA+E,qBAAqB,wBAAwB,4CAA4C,gBAAgB,wEAAwE,EAAE,kBAAkB,+DAA+D,QAAQ,mBAAmB,sBAAsB,gBAAgB,iKAAiK,qCAAqC,SAAS,+BAA+B,SAAS,oCAAoC,wCAAwC,qBAAqB,6BAA6B,SAAS,sCAAsC,mCAAmC,qBAAqB,0BAA0B,8BAA8B,2DAA2D,2BAA2B,8BAA8B,iCAAiC,mCAAmC,YAAY,gBAAgB,+BAA+B,+CAA+C,cAAc,gBAAgB,KAAK,kBAAkB,YAAY,WAAW,eAAe,cAAc,uCAAuC,sHAAsH,IAAI,KAAK,qBAAqB,YAAY,IAAI,wCAAwC,OAAO,aAAa,8CAA8C,6UAA6U,IAAI,KAAK,OAAO,YAAY,IAAI,KAAK,4BAA4B,8BAA8B,UAAU,4CAA4C,OAAO,0CAA0C,KAAK;;;;;;;;;;;;;;;;;;;ACAnp5Y;AACG;AAC5B;AACA,iEAAe,SAAS;;;;;;;;;;ACHxB,YAAY,aAAa,wBAAwB,iBAAiB,sBAAsB,gCAAgC,gCAAgC,kCAAkC,4HAA4H,yDAAyD,8BAA8B,mEAAmE,qBAAM,QAAQ,qBAAM,CAAC,qBAAM,IAAI;AAC/e,mCAAmC,MAAM,iBAAiB,eAAe,QAAQ,aAAa,KAAK,WAAW,gBAAgB,EAAE,OAAO,gBAAgB,OAAO,OAAO,2CAA2C,oCAAoC,IAAI,wDAAwD,yBAAyB,WAAW,mCAAmC,eAAe,OAAO,6BAA6B,IAAI,KAAK,WAAW,kCAAkC,UAAU;AAC1e,2BAA2B,kDAAkD,8CAA8C,uBAAuB,WAAW,+CAA+C,UAAU;AACtN,wCAAwC,4GAA4G,wHAAwH,aAAa,oCAAoC,2BAA2B;AACxV,yDAAyD,yBAAyB,oDAAoD,8CAA8C,cAAc,6CAA6C,uBAAuB,WAAW,2CAA2C,UAAU,cAAc,sCAAsC,QAAQ,kBAAkB,mBAAmB,qBAAqB,EAAE,WAAW,kCAAkC,OAAO;AAClf,uCAAuC,8BAA8B,gCAAgC,+DAA+D,kCAAkC,0BAA0B,2CAA2C,oCAAoC,GAAG,kDAAkD;AACpW,0BAA0B,cAAc,wEAAwE,wEAAwE,QAAQ,SAAS;AACzM,sCAAsC,qBAAqB,qCAAqC,+EAA+E,iFAAiF,6CAA6C,mEAAmE,EAAE;AAClX,2CAA2C,qBAAqB,0CAA0C,yFAAyF,8CAA8C,sCAAsC,6BAA6B,GAAG,QAAQ,6CAA6C,aAAa;AACzX,wCAAwC,6BAA6B,6BAA6B,WAAW,gBAAgB,eAAe,UAAU,OAAO,yBAAyB,kBAAkB,OAAO,uBAAuB,kBAAkB,8BAA8B,UAAU,UAAU,sDAAsD,sBAAsB,oDAAoD,SAAS,GAAG;AACtb,aAAa,cAAc,4BAA4B,YAAY,qBAAqB,mCAAmC,OAAO,iBAAiB,SAAS,MAAM,MAAM,oBAAoB,qCAAqC,oBAAoB,GAAG,gBAAgB,6FAA6F,eAAe,EAAE,sCAAsC,SAAS,GAAG,kBAAkB,cAAc;AACxc,0BAA0B,OAAO,mCAAmC,sBAAsB,EAAE,8DAA8D,YAAY,eAAe,UAAU,gBAAgB,iCAAiC,oBAAoB,YAAY,UAAU,aAAa,UAAU,kBAAkB,kDAAkD,OAAO,gBAAgB,iBAAiB,aAAa,YAAY,GAAG,IAAI,qCAAqC,SAAS;AAC3e,0BAA0B,YAAY,iBAAiB,KAAK,wBAAwB,wBAAwB,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,gDAAgD,uBAAuB,yBAAyB,yBAAyB,EAAE,MAAM,MAAM,MAAM,yFAAyF,cAAc,wFAAwF;AAC7f,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,iBAAiB,aAAa,OAAO,OAAO,qFAAqF,uGAAuG;AAC1e,cAAc,eAAe,iBAAiB,QAAQ,aAAa,KAAK,WAAW,mCAAmC,yCAAyC,0BAA0B,yEAAyE,0BAA0B,UAAU,uBAAuB,qCAAqC,mCAAmC,iDAAiD,+CAA+C;AACre,eAAe,kBAAkB,eAAe,YAAY,kBAAkB,oBAAoB,6CAA6C,IAAI,KAAK,sBAAsB,yBAAyB,qBAAqB,qBAAqB,oGAAoG,KAAK,UAAU,eAAe,MAAM,8BAA8B,MAAM,kCAAkC,MAAM;AACrc,MAAM,gCAAgC,MAAM,gCAAgC,MAAM,6BAA6B,MAAM,gCAAgC,MAAM,gCAAgC,MAAM,+BAA+B,MAAM,qCAAqC,MAAM,gCAAgC,MAAM,+BAA+B,MAAM,gCAAgC,MAAM,8BAA8B,MAAM,8BAA8B,MAAM,gCAAgC,MAAM;AAChf,gBAAgB,MAAM,iFAAiF,MAAM,mCAAmC,MAAM,uCAAuC,MAAM,gCAAgC,MAAM,6BAA6B,MAAM,yCAAyC,MAAM,wCAAwC,MAAM,yCAAyC,6CAA6C,QAAQ,MAAM;AAC7c,MAAM,6CAA6C,MAAM,gCAAgC,MAAM,iBAAiB,MAAM,uBAAuB,oFAAoF,MAAM,sCAAsC,MAAM,iCAAiC,MAAM,8BAA8B,MAAM,iBAAiB,MAAM,sBAAsB,aAAa,MAAM,iCAAiC,MAAM,uBAAuB,MAAM;AACle,OAAO,MAAM,0CAA0C,MAAM,iKAAiK,MAAM,4BAA4B,OAAO,KAAK,yBAAyB,SAAS,gDAAgD,MAAM,kBAAkB,MAAM,qCAAqC,kBAAkB;AACnb,uBAAuB,0GAA0G,mBAAmB,uBAAuB,wBAAwB,mCAAmC,WAAW,oFAAoF,uBAAuB,uBAAuB;AACnX,kCAAkC,qBAAqB,iBAAiB,sBAAsB,SAAS,gBAAgB,wBAAwB,iBAAiB,WAAW,cAAc,+BAA+B,cAAc,4BAA4B,gBAAgB,cAAc,iBAAiB,8BAA8B,gCAAgC,qDAAqD,mDAAmD,cAAc,WAAW;AAChf,wCAAwC,UAAU,kBAAkB,kBAAkB,mBAAmB,cAAc,+EAA+E,OAAO,OAAO;AACpN,yCAAyC,mHAAmH,QAAQ;AACpK,yCAAyC,mHAAmH,QAAQ;AACpK,yCAAyC,mHAAmH,QAAQ,4JAA4J,QAAQ,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO,WAAW,QAAQ,WAAW,mBAAmB;AAC7Z,yBAAyB,mHAAmH,QAAQ;AACpJ,iCAAiC,mHAAmH,QAAQ;AAC5J,iBAAiB,mHAAmH,QAAQ,uVAAuV;AACne,6FAA6F,QAAQ,yWAAyW;AAC9c,mEAAmE,QAAQ;AAC3E;AACA,yCAAyC,gHAAgH,QAAQ;AACjK,uEAAuE,mHAAmH,QAAQ;AAClM,kRAAkR,oHAAoH,2BAA2B,4CAA4C,kBAAkB,8BAA8B;AAC7f,aAAa,mDAAmD,gBAAgB,EAAE,IAAI,iBAAiB,YAAY,sBAAsB,uBAAuB,kBAAkB,yBAAyB,UAAU;AACrN;AACA,8GAA8G,aAAa,wBAAwB,YAAY,YAAY,gCAAgC,OAAO,eAAe,SAAS,2HAA2H,uEAAuE,iBAAiB,2BAA2B,uBAAuB;AAC/e,oBAAoB,kBAAkB,gBAAgB,YAAY,YAAY,gIAAgI,2CAA2C,0BAA0B,IAAI,EAAE,uBAAuB,IAAI,SAAS,eAAe,+BAA+B,kCAAkC,4BAA4B,mBAAmB,iBAAiB,UAAU,IAAI;AAC3d,OAAO,4BAA4B,mBAAmB,iBAAiB,UAAU,IAAI,kCAAkC,4BAA4B,mBAAmB,iBAAiB,UAAU,IAAI,kCAAkC,4BAA4B,mBAAmB,iBAAiB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,oDAAoD,oBAAoB,UAAU,IAAI,SAAS,EAAE;AACne,GAAG,iBAAiB,oBAAoB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,gBAAgB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,gBAAgB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,iBAAiB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,iCAAiC,UAAU,IAAI;AACpf,mBAAmB,iBAAiB,sBAAsB,mBAAmB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,mBAAmB,UAAU,YAAY,8BAA8B,8BAA8B,mBAAmB,yCAAyC,UAAU,IAAI,8BAA8B,8BAA8B,mBAAmB,yCAAyC,UAAU,IAAI;AAC7d,GAAG,iBAAiB,sBAAsB,mBAAmB,UAAU,8DAA8D,sCAAsC,iBAAiB,sBAAsB,oDAAoD,oBAAoB,UAAU,IAAI,SAAS,EAAE,qBAAqB,iBAAiB,oBAAoB,UAAU,IAAI,eAAe,EAAE,qBAAqB,uBAAuB,EAAE,KAAK,EAAE,KAAK,eAAe;AACrd,mBAAmB,mBAAmB,yBAAyB,UAAU,IAAI,sCAAsC,iBAAiB,sBAAsB,iCAAiC,UAAU,IAAI,8BAA8B,iBAAiB,iBAAiB,UAAU;AACnR,uKAAuK,wBAAwB,YAAY,YAAY,YAAY,+CAA+C,uDAAuD,UAAU,wBAAwB,IAAI,wDAAwD,yBAAyB,kCAAkC;AACle,IAAI,IAAI,wBAAwB,IAAI,KAAK,gBAAgB,yCAAyC,oDAAoD,UAAU,KAAK,IAAI,iBAAiB,OAAO,mDAAmD,GAAG,8BAA8B,qBAAqB,mDAAmD,qBAAqB,oBAAoB,QAAQ,kDAAkD,0BAA0B;AAC1d,kEAAkE,UAAU,sBAAsB,iOAAiO,oBAAoB,QAAQ,sBAAsB,WAAW,wBAAwB,SAAS,oBAAoB,oBAAoB,QAAQ,sBAAsB,WAAW;AAClf,2BAA2B,SAAS,iUAAiU,EAAE,qBAAqB,+CAA+C,gDAAgD;AAC3d,6DAA6D,iBAAiB,eAAe,cAAc,kBAAkB,cAAc,0BAA0B,iFAAiF,gBAAgB,aAAa,oGAAoG,MAAM,gBAAgB,cAAc,WAAW;AACta,qCAAqC,kBAAkB,uCAAuC,gBAAgB,4GAA4G,0CAA0C,aAAa,qCAAqC,EAAE,UAAU,cAAc,iEAAiE,6CAA6C,MAAM,gBAAgB;AACpd,GAAG,uBAAuB,QAAQ,aAAa,oFAAoF,qCAAqC,IAAI,0EAA0E,MAAM,SAAS,UAAU,aAAa,+CAA+C,aAAa,kBAAkB,iCAAiC,6BAA6B,yBAAyB,cAAc;AAC/c,qBAAqB,aAAa,0CAA0C,8EAA8E,kGAAkG,0BAA0B,4BAA4B,WAAW,8CAA8C,aAAa,mDAAmD,SAAS,MAAM,cAAc,UAAU,kBAAkB,WAAW,MAAM;AACrf,oBAAoB,mCAAmC,+BAA+B,iDAAiD,uGAAuG,OAAO,UAAU,gBAAgB,MAAM,oCAAoC,oDAAoD;AAC7W,eAAe,gBAAgB,oCAAoC,uBAAuB,IAAI,cAAc,SAAS,gBAAgB,MAAM,yDAAyD,gEAAgE,SAAS,QAAQ,eAAe,OAAO,iBAAiB,oBAAoB,QAAQ,EAAE,sBAAsB,eAAe,SAAS,MAAM;AAC9Y,CAAC,gBAAgB,OAAO,aAAa,uBAAuB,cAAc,eAAe,kBAAkB,eAAe,KAAK,IAAI,cAAc,IAAI,8BAA8B,QAAQ,iBAAiB,2CAA2C,gBAAgB,MAAM,iFAAiF,yEAAyE,mCAAmC,0BAA0B,OAAO;AAC3e,aAAa,qCAAqC,8BAA8B,IAAI,UAAU,gBAAgB,EAAE,cAAc,yCAAyC,SAAS,OAAO,QAAQ,MAAM,+BAA+B,EAAE,gCAAgC,gEAAgE,wFAAwF;AAC9Z,OAAO,EAAE,8BAA8B,2CAA2C,cAAc,iBAAiB,UAAU,EAAE,8BAA8B,kCAAkC,MAAM,4BAA4B,mCAAmC,EAAE,0CAA0C,YAAY,cAAc,eAAe,EAAE,gCAAgC,uCAAuC,EAAE,iDAAiD,+BAA+B;AAClf,QAAQ,QAAQ,kBAAkB,QAAQ,YAAY,IAAI,KAAK,yCAAyC,gBAAgB,gBAAgB,oBAAoB,gBAAgB,kBAAkB,4CAA4C,uCAAuC,SAAS,SAAS,SAAS,iCAAiC,2DAA2D,EAAE,yCAAyC,kBAAkB,IAAI;AACzc,sCAAsC,UAAU,EAAE,yCAAyC,QAAQ,QAAQ,MAAM,wCAAwC,UAAU,KAAK,mBAAmB,uBAAuB,WAAW,mCAAmC,sBAAsB,uBAAuB,WAAW,eAAe,2BAA2B,WAAW,mCAAmC,4DAA4D;AAC5c,2EAA2E,KAAK,MAAM,QAAQ,aAAa,8IAA8I,oBAAoB,eAAe,wBAAwB,WAAW,IAAI,6CAA6C,mCAAmC,UAAU,EAAE,4CAA4C,UAAU;AACrd,oBAAoB,IAAI,6DAA6D,uBAAuB,EAAE,gCAAgC,gBAAgB,EAAE,wCAAwC,oBAAoB,EAAE,qCAAqC,aAAa,EAAE,yCAAyC,aAAa,EAAE,yCAAyC,kBAAkB,mDAAmD,EAAE,oCAAoC;AAC9d,YAAY,EAAE,yCAAyC,8BAA8B,2DAA2D,IAAI,+BAA+B,mCAAmC,uBAAuB,2BAA2B,+DAA+D,uHAAuH,yBAAyB,uBAAuB;AAC9e,sEAAsE,SAAS,kEAAkE,oBAAoB,8BAA8B,qBAAqB,mBAAmB,0DAA0D,EAAE,iCAAiC,eAAe,kBAAkB,UAAU,2BAA2B,mBAAmB,oCAAoC,SAAS,sCAAsC;AACpf,gBAAgB,uBAAuB,WAAW,kBAAkB,OAAO,sDAAsD,iDAAiD,8BAA8B,8GAA8G,uBAAuB,6GAA6G,EAAE,mCAAmC;AACve,iBAAiB,yBAAyB,EAAE,mCAAmC,uEAAuE,EAAE,uCAAuC,4DAA4D,0CAA0C,yBAAyB,uFAAuF,qDAAqD,uBAAuB,kBAAkB;AACnf,0DAA0D,mCAAmC,gBAAgB,4BAA4B,uBAAuB,qCAAqC,OAAO,QAAQ,gBAAgB,UAAU,MAAM,mEAAmE,UAAU,EAAE,mCAAmC,yBAAyB,yBAAyB,wBAAwB,mCAAmC,2BAA2B;AAC9e,YAAY,WAAW,+CAA+C,mBAAmB,EAAE,iCAAiC,yDAAyD,gDAAgD,6CAA6C,2BAA2B,6CAA6C,iCAAiC,uCAAuC,4BAA4B,EAAE,oCAAoC;AACpe,uCAAuC,2BAA2B,2BAA2B,2BAA2B,4BAA4B,+CAA+C,kCAAkC,iCAAiC,EAAE,8BAA8B,aAAa,qHAAqH,EAAE,mCAAmC,aAAa;AAC1d,0EAA0E,EAAE,oCAAoC,uGAAuG,EAAE,2CAA2C,uGAAuG,EAAE,0CAA0C,2DAA2D,mBAAmB,EAAE;AACve,oBAAoB,mCAAmC,EAAE,0CAA0C,oCAAoC,EAAE,sCAAsC,mCAAmC,EAAE,6CAA6C,oCAAoC,EAAE,gCAAgC,iDAAiD,YAAY,WAAW,4CAA4C,UAAU,EAAE,mCAAmC;AAC1e,IAAI,EAAE,qCAAqC,yDAAyD,mBAAmB,6BAA6B,0BAA0B,wBAAwB,mEAAmE,gCAAgC,6DAA6D,EAAE,qCAAqC,yDAAyD,mBAAmB,2BAA2B;AACpf,wBAAwB,wBAAwB,uCAAuC,yBAAyB,gCAAgC,0BAA0B,qEAAqE,EAAE,oCAAoC,2BAA2B,wDAAwD,wIAAwI;AAChf,wBAAwB,0BAA0B,wEAAwE,EAAE,iCAAiC,yBAAyB,2BAA2B,kCAAkC,eAAe,uBAAuB,2CAA2C,8BAA8B,6CAA6C,2DAA2D,eAAe,cAAc,KAAK;AAC5e,6DAA6D,sDAAsD,iDAAiD,EAAE,kCAAkC,yBAAyB,2BAA2B,WAAW,+DAA+D,gDAAgD,kCAAkC,eAAe,uBAAuB,WAAW;AACzc,8BAA8B,EAAE,8BAA8B,+GAA+G,4CAA4C,4FAA4F,qDAAqD,qFAAqF,EAAE,6BAA6B;AAC9d,IAAI,EAAE,6BAA6B,2BAA2B,EAAE,6BAA6B,2BAA2B,EAAE,6BAA6B,2BAA2B,EAAE,6BAA6B,MAAM,EAAE,iEAAiE,uBAAuB,iDAAiD,+BAA+B,qBAAqB,4BAA4B;AAClb,+BAA+B,qBAAqB,6BAA6B,kDAAkD,+BAA+B,qBAAqB,yBAAyB,4BAA4B,+BAA+B,qBAAqB,yBAAyB,kDAAkD,qBAAqB,mBAAmB,EAAE,6BAA6B,kBAAkB,EAAE,8BAA8B,oBAAoB;AACxf,CAAC,qCAAqC,aAAa,4BAA4B,EAAE,+CAA+C,gBAAgB,cAAc,KAAK,kBAAkB,IAAI,eAAe,KAAK,OAAO,qBAAqB,yBAAyB,KAAK,IAAI,kCAAkC,UAAU,EAAE,qCAAqC,8BAA8B,iDAAiD,gBAAgB,eAAe;AAC5c,4BAA4B,MAAM,SAAS,WAAW,WAAW,QAAQ,gBAAgB,SAAS,kEAAkE,oBAAoB,SAAS,KAAK,8CAA8C,mBAAmB,EAAE,uCAAuC,2IAA2I,EAAE,qCAAqC;AACle,wDAAwD,2BAA2B,0BAA0B,oBAAoB,EAAE,6BAA6B,kBAAkB,WAAW,uBAAuB,kBAAkB,IAAI,gBAAgB,uBAAuB,kBAAkB,KAAK,UAAU,gBAAgB,6BAA6B,sCAAsC,4BAA4B,kBAAkB,yBAAyB,2BAA2B,kBAAkB;AACzf,WAAW,2BAA2B,oBAAoB,wBAAwB,6BAA6B,sCAAsC,uBAAuB,mBAAmB,KAAK,OAAO,EAAE,6BAA6B,kBAAkB,uEAAuE,8BAA8B,wDAAwD,8BAA8B,eAAe,+BAA+B;AACre,GAAG,GAAG,iBAAiB,EAAE,qBAAqB,oCAAoC,KAAK,KAAK,MAAM,0BAA0B,KAAK,MAAM,kCAAkC,UAAU,UAAU,UAAU,yBAAyB,KAAK,uBAAuB,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE,qBAAqB,oCAAoC,KAAK,KAAK,MAAM,MAAM,sBAAsB,4BAA4B,KAAK,MAAM,kBAAkB,uCAAuC;AAC5d,wCAAwC,UAAU,UAAU,oCAAoC,QAAQ,IAAI,0DAA0D,sDAAsD,EAAE,4CAA4C,iCAAiC,KAAK,KAAK,kBAAkB,QAAQ,KAAK,iFAAiF,UAAU,iDAAiD,oBAAoB,KAAK;AACzf,SAAS,uBAAuB,EAAE,mDAAmD,qBAAqB,oBAAoB,oBAAoB,oBAAoB,IAAI,uDAAuD,0DAA0D,WAAW,IAAI,oBAAoB,MAAM,KAAK,mBAAmB,aAAa,+BAA+B,MAAM,QAAQ,WAAW,KAAK,8CAA8C;AACpd,MAAM,cAAc,MAAM,yCAAyC,iEAAiE,mBAAmB,EAAE,8CAA8C,eAAe,kBAAkB,+EAA+E,qCAAqC,2BAA2B,mCAAmC,uBAAuB,wDAAwD;AACze,2BAA2B,qBAAqB,uBAAuB,QAAQ,uBAAuB,KAAK,+DAA+D,gBAAgB,yGAAyG,WAAW,kCAAkC,WAAW,SAAS,qCAAqC,EAAE,sCAAsC,eAAe,EAAE,0CAA0C;AAC5e,MAAM,EAAE,uCAAuC,eAAe,EAAE,4CAA4C,aAAa,wCAAwC,2BAA2B,6DAA6D,EAAE,4CAA4C,QAAQ,mBAAmB,mCAAmC,iBAAiB,uCAAuC,kBAAkB,4CAA4C,OAAO;AACle,4DAA4D,iCAAiC,EAAE,4CAA4C,kBAAkB,oBAAoB,0BAA0B,aAAa,qCAAqC,wEAAwE,yBAAyB,8BAA8B,sCAAsC,gEAAgE,aAAa;AAC/e,WAAW,6CAA6C,KAAK,kCAAkC,qCAAqC,4CAA4C,gCAAgC,OAAO,kDAAkD,SAAS,WAAW,OAAO,QAAQ,gBAAgB,SAAS,kEAAkE,mDAAmD,kCAAkC,SAAS,KAAK,KAAK;AAC/e,wBAAwB,uBAAuB,qCAAqC,kCAAkC,iBAAiB,2CAA2C,2BAA2B,UAAU,EAAE,0CAA0C,wHAAwH,EAAE,mDAAmD,UAAU,kBAAkB,mBAAmB,kBAAkB;AACjf,EAAE,6BAA6B,EAAE,sCAAsC,8FAA8F,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mIAAmI;AAClX,0DAA0D,iFAAiF,wDAAwD,8DAA8D,wDAAwD,mFAAmF,wDAAwD;AACpc,QAAQ,EAAE,0CAA0C,mDAAmD,yBAAyB,oDAAoD,eAAe,+DAA+D,aAAa,cAAc,WAAW,KAAK,0DAA0D,6BAA6B,SAAS,8BAA8B,KAAK,WAAW;AAC3b,iCAAiC,iDAAiD,EAAE,0CAA0C,yBAAyB,oDAAoD,oBAAoB,gBAAgB,WAAW,KAAK,0DAA0D,WAAW,sBAAsB,WAAW,8BAA8B,KAAK,WAAW;AACnZ,mBAAmB,EAAE,2CAA2C,6EAA6E,+BAA+B,mBAAmB,IAAI,KAAK,qCAAqC,kBAAkB,mCAAmC,EAAE,2CAA2C,eAAe,OAAO,iCAAiC,IAAI,KAAK,oCAAoC,kBAAkB,uCAAuC,QAAQ;AACpf,EAAE,sBAAsB,UAAU,EAAE,wCAAwC,4FAA4F,uBAAuB,IAAI,kCAAkC,QAAQ,IAAI,8CAA8C,KAAK,IAAI,sBAAsB,UAAU,EAAE,2CAA2C,4FAA4F,WAAW,IAAI;AAChe,WAAW,YAAY,IAAI,+CAA+C,KAAK,IAAI,iCAAiC,KAAK,IAAI,sBAAsB,UAAU,EAAE,uCAAuC,4FAA4F,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,kCAAkC,QAAQ,IAAI,8CAA8C,KAAK,IAAI,iCAAiC,KAAK,IAAI,sBAAsB,UAAU;AACrf,CAAC,wCAAwC,4FAA4F,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,kCAAkC,QAAQ,IAAI,8CAA8C,KAAK,IAAI,iCAAiC,KAAK,IAAI,sBAAsB,UAAU,EAAE,4CAA4C,wBAAwB,iBAAiB,iBAAiB,kCAAkC,KAAK;AACve,2BAA2B,EAAE,mDAAmD,UAAU,yCAAyC,WAAW,SAAS,6BAA6B,QAAQ,sCAAsC,gBAAgB,gBAAgB,oBAAoB,gBAAgB,eAAe,6CAA6C,SAAS,gCAAgC,SAAS,SAAS,SAAS,gBAAgB,kBAAkB,KAAK,oBAAoB;AACje,uFAAuF,EAAE,sDAAsD,gBAAgB,IAAI,KAAK,yDAAyD,SAAS,qBAAqB,uBAAuB,SAAS,QAAQ,8BAA8B,wCAAwC,WAAW,qBAAqB,oDAAoD,EAAE,+CAA+C;AAClf,0BAA0B,2BAA2B,KAAK,MAAM,+BAA+B,YAAY,QAAQ,iCAAiC,YAAY,QAAQ,4BAA4B,UAAU,EAAE,6CAA6C,QAAQ,uBAAuB,KAAK,2CAA2C,UAAU,EAAE,iDAAiD,wEAAwE;AACjd,wBAAwB,uBAAuB,oCAAoC,qCAAqC,8BAA8B,iCAAiC,KAAK,KAAK,iCAAiC,UAAU,mCAAmC,QAAQ,QAAQ,oDAAoD,uDAAuD,GAAG,mCAAmC,0BAA0B;AAC1c,6BAA6B,yCAAyC,sCAAsC,uBAAuB,gBAAgB,EAAE,gCAAgC,wBAAwB,EAAE,+CAA+C,+BAA+B,UAAU,QAAQ,IAAI,iCAAiC,gCAAgC,kBAAkB,IAAI,qDAAqD,iCAAiC,EAAE;AACle,oBAAoB,2BAA2B,8CAA8C,QAAQ,sEAAsE,kBAAkB,UAAU,QAAQ,IAAI,sBAAsB,KAAK,IAAI,mCAAmC,KAAK,cAAc,IAAI,sBAAsB,YAAY,IAAI,uDAAuD,yBAAyB,iDAAiD,mBAAmB,EAAE;AACxe,oBAAoB,+CAA+C,yCAAyC,QAAQ,iBAAiB,0CAA0C,KAAK,wCAAwC,iBAAiB,IAAI,yBAAyB,KAAK,MAAM,kCAAkC,aAAa,iBAAiB,IAAI,mCAAmC,KAAK,mBAAmB,QAAQ,YAAY,IAAI,yDAAyD,kBAAkB;AACvf,2CAA2C,EAAE,8CAA8C,wCAAwC,EAAE,wCAAwC,uBAAuB,uBAAuB,kCAAkC,EAAE,sCAAsC,uEAAuE,+CAA+C,4BAA4B,MAAM,OAAO,4BAA4B;AAChe,CAAC,uDAAuD,wDAAwD,kEAAkE,EAAE,oCAAoC,6BAA6B,EAAE,mCAAmC,0CAA0C,EAAE,4CAA4C,iCAAiC,IAAI,YAAY,IAAI,iCAAiC,eAAe;AACvd,GAAG,qCAAqC,EAAE,2DAA2D,0BAA0B,aAAa,QAAQ,IAAI,QAAQ,oBAAoB,IAAI,KAAK,kCAAkC,WAAW,cAAc,WAAW,8BAA8B,KAAK,IAAI,yBAAyB,4BAA4B,MAAM;AACrW,cAAc,qCAAqC,EAAE,qCAAqC,YAAY,IAAI,yBAAyB,UAAU,KAAK,WAAW;AAC7J,yMAAyM,0BAA0B,oCAAoC,2BAA2B,aAAa,GAAG,EAAE,iBAAiB,eAAe,eAAe,cAAc,YAAY,cAAc,uBAAuB,KAAK,WAAW,MAAM,KAAK,IAAI,0BAA0B,iBAAiB;AAC5e,MAAM,eAAe,MAAM,oBAAoB,MAAM,yBAAyB,MAAM,sBAAsB,QAAQ,aAAa,aAAa,cAAc,sBAAsB,KAAK,GAAG,aAAa,oCAAoC,uBAAuB,uBAAuB,MAAM,sBAAsB,cAAc,UAAU,aAAa,sDAAsD,2FAA2F;AACze,gEAAgE,cAAc,wBAAwB,aAAa,yBAAyB,8BAA8B,WAAW,cAAc,wBAAwB,aAAa,wBAAwB,cAAc,gCAAgC,gCAAgC,KAAK,0BAA0B,iBAAiB,QAAQ,kBAAkB,aAAa,cAAc,mBAAmB,oBAAoB,YAAY;AACte,oDAAoD,sBAAsB,uBAAuB,uHAAuH,2BAA2B,8CAA8C,wCAAwC,WAAW,wBAAwB,MAAM,mBAAmB,KAAK,YAAY,oBAAoB,gEAAgE;AAC1e,WAAW,eAAe,aAAa,gDAAgD,aAAa,kDAAkD,cAAc,yCAAyC,+DAA+D,IAAI,cAAc,SAAS,IAAI,wBAAwB,SAAS,0BAA0B,cAAc,2CAA2C,mEAAmE,IAAI,YAAY,SAAS,IAAI;AAC/f,GAAG,SAAS,wBAAwB,aAAa,uDAAuD,aAAa,OAAO,WAAW,KAAK,mBAAmB,EAAE,EAAE,IAAI,SAAS,MAAM,eAAe,KAAK,WAAW,OAAO,KAAK,MAAM,gBAAgB,WAAW,aAAa,cAAc,eAAe,IAAI,kDAAkD,SAAS,IAAI,IAAI,sDAAsD,SAAS,IAAI,qBAAqB,uBAAuB;AACle,GAAG,kCAAkC,mBAAmB,wBAAwB,mBAAmB,uBAAuB,2BAA2B,iCAAiC,kBAAkB,aAAa,SAAS,UAAU,aAAa,cAAc,OAAO,gBAAgB,SAAS,QAAQ,mBAAmB,uBAAuB,SAAS,oBAAoB,wBAAwB,wBAAwB,UAAU,sBAAsB,kDAAkD;AACpf,WAAW,WAAW,oBAAoB,gDAAgD,mBAAmB,UAAU,eAAe,cAAc,gCAAgC,UAAU,uDAAuD,8BAA8B,mDAAmD,eAAe,4BAA4B,2GAA2G,YAAY;AACxe,0QAA0Q,YAAY;AACtR,2DAA2D,yBAAyB,8BAA8B,iDAAiD,oCAAoC,mDAAmD,+DAA+D,4DAA4D,wBAAwB,+CAA+C,iCAAiC;AAC7d,uBAAuB,+BAA+B,qFAAqF,iCAAiC,uFAAuF,0CAA0C,qDAAqD,+CAA+C,iCAAiC,8CAA8C;AAChe,WAAW,2EAA2E,+DAA+D,+EAA+E,mEAAmE,qFAAqF,mEAAmE;AAC/b,+EAA+E,2EAA2E,uEAAuE,mEAAmE,uEAAuE,2EAA2E;AACtb,yDAAyD,sFAAsF,oCAAoC,mDAAmD,iDAAiD,6DAA6D,sDAAsD,uDAAuD,6BAA6B;AAC9d,qBAAqB,qCAAqC,uDAAuD,iCAAiC,qDAAqD,qBAAqB,4BAA4B,iCAAiC,6BAA6B,wBAAwB,kCAAkC,uCAAuC,aAAa,YAAY,8BAA8B;AAC9c,IAAI,MAAM,gDAAgD,yCAAyC,UAAU,sDAAsD,2BAA2B,oFAAoF,gBAAgB,eAAe,IAAI,EAAE,qDAAqD,4CAA4C,+CAA+C;AACvc,6DAA6D,0BAA0B,yCAAyC,qGAAqG,yCAAyC,6CAA6C,uCAAuC,6CAA6C,6CAA6C,iCAAiC,UAAU;AACve,YAAY,UAAU,6DAA6D,yBAAyB,0CAA0C,+CAA+C,sCAAsC,uCAAuC,wBAAwB,oBAAoB,wEAAwE,oEAAoE,iCAAiC;AAC3e,GAAG,yBAAyB,mBAAmB,+CAA+C,cAAc,yCAAyC,0BAA0B,YAAY,oIAAoI,yBAAyB,uDAAuD,mFAAmF,yBAAyB;AAC3f,wDAAwD,IAAI,wBAAwB,yBAAyB,sCAAsC,oCAAoC,8BAA8B,SAAS,QAAQ,yCAAyC,OAAO,yCAAyC,OAAO,+DAA+D,OAAO,mFAAmF,gBAAgB;AAC/e,kCAAkC,cAAc,mCAAmC,gCAAgC,iBAAiB,YAAY,WAAW,KAAK,WAAW,+CAA+C,8CAA8C,QAAQ,WAAW,KAAK,aAAa,sBAAsB,mEAAmE,+CAA+C,2CAA2C,eAAe,cAAc;AAC7f,cAAc,aAAa,8BAA8B,YAAY,WAAW,KAAK,uBAAuB,oCAAoC,oBAAoB,2BAA2B,mCAAmC,2BAA2B,iBAAiB,qBAAqB,WAAW,oBAAoB,SAAS,uBAAuB,UAAU,sBAAsB,EAAE,uBAAuB,2BAA2B,aAAa,wCAAwC,WAAW;AACtf,aAAa,EAAE,cAAc,cAAc,oDAAoD,wCAAwC,YAAY,YAAY,WAAW,KAAK,OAAO,4FAA4F,sIAAsI,OAAO,sBAAsB,oDAAoD;AACze,CAAC,SAAS,cAAc,KAAK,2BAA2B,EAAE,mIAAmI,uBAAuB,kBAAkB,uGAAuG,kGAAkG,mCAAmC,EAAE,4BAA4B;AAChf,4EAA4E,kBAAkB,mDAAmD,MAAM,8BAA8B,QAAQ,+BAA+B,WAAW,OAAO,2IAA2I,2BAA2B,6DAA6D;AACjd,CAAC,iCAAiC,kDAAkD,IAAI,oDAAoD,QAAQ,+BAA+B,uBAAuB,gEAAgE,SAAS,sBAAsB,iBAAiB,6DAA6D,iEAAiE,MAAM,OAAO,OAAO,OAAO;AACnd,sBAAsB,yHAAyH,aAAa,oHAAoH,iBAAiB,mBAAmB,6BAA6B,0BAA0B,yDAAyD,0CAA0C;AAC9c,6DAA6D,6BAA6B,0BAA0B,EAAE,kJAAkJ,mBAAmB,SAAS,0BAA0B,mBAAmB,yBAAyB,MAAM,kGAAkG,sBAAsB;AACxe,oDAAoD,0CAA0C,uBAAuB,4BAA4B,mBAAmB,6HAA6H,uGAAuG,oCAAoC,eAAe,uBAAuB,+BAA+B;AACjf,+KAA+K,uHAAuH,yEAAyE,eAAe,+CAA+C,8CAA8C;AAC3d,WAAW,qEAAqE,aAAa,aAAa,uBAAuB,aAAa,uBAAuB,UAAU,SAAS,aAAa,kBAAkB,kHAAkH,gBAAgB,oBAAoB,cAAc,sCAAsC,iCAAiC,sBAAsB,iBAAiB,iBAAiB;AAC1f,eAAe,0DAA0D,0CAA0C,oCAAoC,2EAA2E,GAAG,sBAAsB,kBAAkB,gDAAgD,gDAAgD,sBAAsB,iBAAiB,YAAY,WAAW,KAAK,0DAA0D;AAC1e,4BAA4B,GAAG,cAAc,kBAAkB,gFAAgF,aAAa,YAAY,kBAAkB,kCAAkC,MAAM,WAAW,MAAM,EAAE,QAAQ,WAAW,KAAK,WAAW,sBAAsB,yBAAyB,SAAS,QAAQ,WAAW,4BAA4B,aAAa,IAAI,OAAO,WAAW,KAAK,aAAa,YAAY,WAAW,wBAAwB,wBAAwB;AAC3f,sFAAsF,OAAO,4IAA4I,UAAU,QAAQ,WAAW,iDAAiD,YAAY,iBAAiB,2CAA2C,YAAY,WAAW,uCAAuC,KAAK,YAAY,WAAW,iBAAiB,UAAU,0BAA0B;AAC9gB,cAAc,QAAQ,iDAAiD,cAAc,EAAE,sCAAsC,UAAU,OAAO,sDAAsD,YAAY,OAAO,kGAAkG,4BAA4B,UAAU,OAAO,4FAA4F,0BAA0B,WAAW,OAAO,oDAAoD;AACliB,SAAS,OAAO,8CAA8C,yKAAyK,SAAS,8BAA8B,0BAA0B,WAAW,OAAO,kDAAkD,SAAS,+BAA+B;AACpZ,6CAA6C,mCAAmC,aAAa,OAAO,gCAAgC,oFAAoF,SAAS,iCAAiC,+BAA+B,sCAAsC,KAAK,QAAQ,6CAA6C,SAAS,WAAW,UAAU,iBAAiB,cAAc;AAC9b,oDAAoD,qBAAqB,mEAAmE,KAAK,wBAAwB,YAAY,WAAW,KAAK,mDAAmD,YAAY,WAAW,aAAa,8BAA8B,SAAS,UAAU,wDAAwD,SAAS,OAAO,wBAAwB,0FAA0F;AACvgB,QAAQ,wBAAwB,iFAAiF,yEAAyE,eAAe,cAAc,iCAAiC,MAAM,wCAAwC,gGAAgG,gBAAgB,yDAAyD;AAC/c,wBAAwB,yDAAyD,mCAAmC,kCAAkC,yBAAyB,uBAAuB,+BAA+B,UAAU,qCAAqC,6CAA6C,IAAI,6BAA6B,SAAS;AAC3W,KAAK,UAAU,6BAA6B,aAAa,eAAe,OAAO,OAAO,kBAAkB,YAAY,QAAQ,gGAAgG,yDAAyD,2BAA2B,qBAAqB,oDAAoD,uBAAuB,UAAU,WAAW,yBAAyB,WAAW,uBAAuB;AAChe,yEAAyE,gBAAgB,oIAAoI,2IAA2I,2CAA2C;AACnZ,gDAAgD,sCAAsC,SAAS,YAAY,sDAAsD,+BAA+B,aAAa,iDAAiD,6CAA6C,mCAAmC,uEAAuE,qEAAqE;AAC1d,WAAW,iCAAiC,oCAAoC,EAAE,UAAU,6CAA6C,iBAAiB,yDAAyD,SAAS,YAAY,2CAA2C,iBAAiB,wCAAwC,SAAS,YAAY,uBAAuB,OAAO,eAAe,SAAS,0CAA0C,+CAA+C;AAChf,2BAA2B,yEAAyE,oCAAoC,sDAAsD,wFAAwF,eAAe,MAAM,MAAM,qEAAqE,QAAQ,mFAAmF,KAAK,4BAA4B;AAClf,kBAAkB,qBAAqB,uBAAuB,uBAAuB,0BAA0B,qBAAqB,uBAAuB,0BAA0B,2EAA2E,eAAe,6CAA6C,WAAW,yBAAyB,OAAO,OAAO;AAC9W,oFAAoF,iEAAiE,gDAAgD,yBAAyB,OAAO,OAAO,6LAA6L,uCAAuC;AAChd,mBAAmB,iEAAiE,qCAAqC,yCAAyC,qEAAqE,qCAAqC,yFAAyF,qEAAqE,qCAAqC,oCAAoC;AACnf,YAAY,sHAAsH,iEAAiE,oCAAoC,wCAAwC,mEAAmE,gCAAgC,+EAA+E;AACjc,kCAAkC,uCAAuC,+DAA+D,mCAAmC,oCAAoC,iEAAiE,kCAAkC,sCAAsC,kCAAkC,qCAAqC,+DAA+D,iCAAiC;AAC/f,iBAAiB,6DAA6D,iCAAiC,kCAAkC,6DAA6D,qCAAqC,oCAAoC,qEAAqE,sCAAsC,mCAAmC,uEAAuE;AAC5e,YAAY,uEAAuE,oCAAoC,sKAAsK,eAAe,gBAAgB,UAAU,2BAA2B,gCAAgC,iCAAiC,oEAAoE;AACte,yCAAyC,iCAAiC,iCAAiC,6BAA6B,iCAAiC,iCAAiC,8BAA8B,8BAA8B,6BAA6B,gBAAgB,UAAU,qCAAqC,0CAA0C,2CAA2C;AACvb,wCAAwC,mDAAmD,2CAA2C,2CAA2C,uCAAuC,2CAA2C,2CAA2C,wCAAwC,wCAAwC,uCAAuC,gBAAgB,UAAU,mCAAmC;AACle,yCAAyC,4EAA4E,sCAAsC,iDAAiD,yCAAyC,qCAAqC,yCAAyC,yCAAyC,sCAAsC,oCAAoC,uCAAuC,kBAAkB;AAC/e,8BAA8B,+JAA+J,SAAS,gLAAgL,cAAc,oBAAoB,iBAAiB,iCAAiC,EAAE,cAAc;AAC1d,2BAA2B,kBAAkB,kCAAkC,oDAAoD,EAAE,cAAc,mCAAmC,2BAA2B,gCAAgC,UAAU,EAAE,EAAE,YAAY,8BAA8B,+DAA+D,SAAS;AACjX,qBAAqB,IAAI,8BAA8B,qCAAqC,MAAM,+JAA+J,UAAU,6DAA6D,4CAA4C,GAAG,aAAa,qFAAqF,WAAW;AACpe,kHAAkH,UAAU,2EAA2E,qCAAqC,uFAAuF,GAAG,UAAU,gCAAgC,QAAQ,4BAA4B,QAAQ,4BAA4B,QAAQ,SAAS,8BAA8B;AACve,8FAA8F,UAAU,iEAAiE,oCAAoC,uBAAuB,qCAAqC,UAAU,0CAA0C,2CAA2C,mDAAmD,iFAAiF,KAAK;AACjf,iDAAiD,sCAAsC,qCAAqC,4FAA4F,0CAA0C,0DAA0D,QAAQ,6CAA6C,WAAW,mBAAmB,uEAAuE,KAAK;AAC3d,EAAE,0CAA0C,0DAA0D,QAAQ,6CAA6C,WAAW,gEAAgE,+BAA+B,yCAAyC,gDAAgD,sCAAsC,2CAA2C,gDAAgD;AAC/d,QAAQ,yCAAyC,sCAAsC,0CAA0C,4DAA4D,0CAA0C,4DAA4D,4CAA4C,4DAA4D,0CAA0C;AACrb,gCAAgC,8BAA8B,UAAU,kCAAkC,UAAU,wCAAwC,GAAG,gCAAgC,yHAAyH,qDAAqD,4FAA4F,SAAS,EAAE,WAAW;AAC/d,IAAI,UAAU,OAAO,qBAAqB,+GAA+G,0CAA0C,sBAAsB,SAAS,EAAE,GAAG,uDAAuD,6DAA6D,4HAA4H,YAAY,UAAU,EAAE,KAAK;AACpf,+CAA+C,wEAAwE,0GAA0G,4HAA4H,kDAAkD,YAAY,UAAU,EAAE,KAAK,qDAAqD,QAAQ;AACze,WAAW,2GAA2G,yBAAyB,oCAAoC,4CAA4C,cAAc,aAAa,QAAQ,WAAW,MAAM,qCAAqC,SAAS,iGAAiG,OAAO;AACza,QAAQ,MAAM,WAAW,UAAU,KAAK,gDAAgD,iCAAiC,sHAAsH,UAAU,qFAAqF,qCAAqC,mFAAmF;AACtc,qCAAqC,uGAAuG,6DAA6D,qCAAqC,4BAA4B,yGAAyG,6DAA6D,wCAAwC,WAAW;AACne,6LAA6L,+DAA+D,oCAAoC,mDAAmD,kCAAkC,wHAAwH;AAC7e,gCAAgC,kBAAkB,eAAe,yGAAyG,mBAAmB,gEAAgE,iCAAiC,+BAA+B,uBAAuB,uBAAuB,2FAA2F,oCAAoC;AAC1e,6FAA6F,oCAAoC,wCAAwC,6FAA6F,uCAAuC,4DAA4D,qGAAqG;AAC9c,wBAAwB,uCAAuC,6CAA6C,yFAAyF,iEAAiE,yCAAyC,uDAAuD,gGAAgG;AACtc,+BAA+B,oBAAoB,yGAAyG,uDAAuD,yGAAyG,SAAS,KAAK,iDAAiD,iCAAiC,4BAA4B,iDAAiD;AACze,cAAc,yBAAyB,uDAAuD,0BAA0B,cAAc,cAAc,0BAA0B,mGAAmG,qDAAqD,sFAAsF,+CAA+C,qCAAqC;AAChf,UAAU,yEAAyE,iGAAiG,iEAAiE,kCAAkC,mBAAmB,4DAA4D,oCAAoC,cAAc,iCAAiC,iCAAiC;AAC1d,OAAO,qBAAqB,iCAAiC,kCAAkC,qCAAqC,qCAAqC,qCAAqC,WAAW,oBAAoB,UAAU,oBAAoB,UAAU,oBAAoB,UAAU,qBAAqB,GAAG,qCAAqC,0BAA0B,wBAAwB,2EAA2E;AAC7e,YAAY,sDAAsD,oBAAoB,EAAE,YAAY,KAAK,SAAS,iCAAiC,qCAAqC,iBAAiB,qBAAqB,WAAW,oBAAoB,SAAS,qBAAqB,EAAE,uCAAuC,kBAAkB,kCAAkC,aAAa,GAAG,oCAAoC,0CAA0C,kBAAkB;AACxe,GAAG,oCAAoC,UAAU,2CAA2C,EAAE,sCAAsC,uBAAuB,IAAI,oCAAoC,0CAA0C,kBAAkB,sBAAsB,oCAAoC,UAAU,2CAA2C,EAAE,sCAAsC,uBAAuB,IAAI,yCAAyC,+CAA+C;AACzgB,YAAY,2BAA2B,oCAAoC,UAAU,gDAAgD,EAAE,2CAA2C,uBAAuB,IAAI,wBAAwB,uEAAuE,EAAE,kCAAkC,gBAAgB,wDAAwD,gBAAgB,yCAAyC,OAAO,EAAE,2CAA2C;AACrgB,YAAY,oBAAoB,wDAAwD,uBAAuB,qBAAqB,kCAAkC,oCAAoC,2BAA2B,oBAAoB,EAAE,EAAE,iHAAiH,oBAAoB,GAAG,yCAAyC,OAAO,mBAAmB,EAAE,gBAAgB;AAC1d,2FAA2F,2DAA2D,OAAO,mBAAmB,EAAE,sFAAsF,OAAO,mBAAmB,EAAE,oCAAoC,uBAAuB,IAAI,wCAAwC,QAAQ;AACnZ,oBAAoB,oBAAoB,mBAAmB,UAAU,cAAc,6CAA6C,4BAA4B,oBAAoB,2BAA2B,UAAU,0BAA0B,aAAa,4BAA4B,aAAa,4BAA4B,kBAAkB,kCAAkC,EAAE,iCAAiC,EAAE,mCAAmC,mCAAmC;AAChe,gBAAgB,iDAAiD,0BAA0B,oBAAoB,2BAA2B,yEAAyE,EAAE,EAAE,0BAA0B,oBAAoB,2BAA2B,oBAAoB,EAAE,EAAE,gLAAgL,UAAU;AAClf,cAAc,gFAAgF,oBAAoB,oCAAoC,oDAAoD,0DAA0D,iCAAiC,iCAAiC,UAAU,4BAA4B,4CAA4C,oCAAoC,mBAAmB,wCAAwC;AACvf,0CAA0C,8CAA8C,gCAAgC,eAAe,gBAAgB,sDAAsD,uBAAuB,qFAAqF,kBAAkB,YAAY,0BAA0B;AACjX,uIAAuI,4BAA4B,cAAc,0BAA0B,kKAAkK;AAC7W,EAAE,kEAAkE,4DAA4D,SAAS,0CAA0C,oEAAoE,UAAU,iBAAiB,WAAW,kBAAkB,uBAAuB,8EAA8E,cAAc,SAAS,qBAAqB,UAAU;AAC1c,MAAM,2CAA2C,0EAA0E,MAAM,oDAAoD,SAAS,6BAA6B,UAAU,WAAW,OAAO,oBAAoB,SAAS,iFAAiF,uIAAuI;AAC5e,gOAAgO,+LAA+L,wCAAwC,4BAA4B,UAAU,SAAS,iBAAiB;AACvgB,GAAG,wEAAwE,wDAAwD,6EAA6E,eAAe,MAAM,SAAS,SAAS,UAAU,sCAAsC,aAAa,SAAS,8BAA8B,gHAAgH,KAAK;AAChd,sBAAsB,2GAA2G,qBAAqB,SAAS,UAAU,mCAAmC,QAAQ,qDAAqD,uBAAuB,8EAA8E,oCAAoC,EAAE,oEAAoE,0CAA0C;AAClgB,cAAc,kBAAkB,qCAAqC,eAAe,0CAA0C,kBAAkB,qCAAqC,oBAAoB,0CAA0C,kBAAkB,qCAAqC,wCAAwC,oBAAoB,0CAA0C,kBAAkB,qCAAqC,wCAAwC;AAC/e,WAAW,6BAA6B,kBAAkB,qBAAqB,8EAA8E,gBAAgB,uBAAuB,qBAAqB,aAAa,cAAc,kBAAkB,8CAA8C,uCAAuC,oBAAoB,mBAAmB,kBAAkB,4CAA4C,iCAAiC;AACje,4DAA4D,2BAA2B,cAAc,mBAAmB,8CAA8C,wCAAwC,gBAAgB,6DAA6D,gFAAgF,yCAAyC,8EAA8E;AACle,CAAC,EAAE,yDAAyD,kBAAkB,mBAAmB,uBAAuB,MAAM,4BAA4B,sDAAsD,gFAAgF,yCAAyC,0EAA0E,KAAK,+EAA+E;AACve,CAAC,2DAA2D,gBAAgB,gBAAgB,KAAK,uBAAuB,uBAAuB,oIAAoI,6BAA6B,WAAW,mBAAmB,6DAA6D,qBAAqB,8CAA8C;AAC9c,GAAG,+BAA+B,oIAAoI,GAAG,0BAA0B,iBAAiB,6BAA6B,gDAAgD,YAAY,wEAAwE,WAAW,2DAA2D,sBAAsB,QAAQ;AACzd,mBAAmB,uEAAuE,mBAAmB,SAAS,8DAA8D,YAAY,yCAAyC,YAAY,6DAA6D,qBAAqB,8CAA8C,iDAAiD,0BAA0B,iBAAiB;AACjd,EAAE,gDAAgD,YAAY,kCAAkC,YAAY,gIAAgI,UAAU,4BAA4B,WAAW,kIAAkI,UAAU,2BAA2B;AACpc,4BAA4B,YAAY,6DAA6D,4DAA4D,uEAAuE,UAAU,4BAA4B,oBAAoB,wEAAwE,qBAAqB,wDAAwD,sCAAsC;AAC7d,kCAAkC,uBAAuB,yCAAyC,gDAAgD,aAAa,sDAAsD,GAAG,0DAA0D,0BAA0B,qCAAqC,OAAO,8HAA8H,iBAAiB;AACve,iCAAiC,SAAS,qCAAqC,UAAU,qCAAqC,eAAe,uIAAuI,UAAU,qCAAqC,eAAe,+GAA+G,qCAAqC;AACte,OAAO,UAAU,uBAAuB,6BAA6B,4CAA4C,oBAAoB,+CAA+C,eAAe,yGAAyG,qCAAqC,UAAU,kBAAkB,6BAA6B,qCAAqC,UAAU,wCAAwC,WAAW;AAC5e,iDAAiD,uBAAuB,oCAAoC,mCAAmC,8CAA8C,6CAA6C,0DAA0D,0BAA0B,qCAAqC,wCAAwC,OAAO,OAAO,oCAAoC,oCAAoC;AACje,mEAAmE,wBAAwB,gDAAgD,oBAAoB,kEAAkE,WAAW,yIAAyI,oBAAoB,gDAAgD,cAAc;AACvc,mDAAmD,UAAU,0CAA0C,UAAU,+FAA+F,UAAU,6BAA6B,UAAU,+FAA+F,UAAU,6BAA6B,UAAU,+FAA+F,UAAU;AAC1f,2BAA2B,UAAU,+FAA+F,UAAU,6BAA6B,UAAU,+FAA+F,UAAU,4BAA4B,UAAU,+FAA+F,UAAU,6BAA6B,YAAY;AACtd,sDAAsD,UAAU,+BAA+B,YAAY,iEAAiE,mBAAmB,qHAAqH,qDAAqD,EAAE,0DAA0D,0BAA0B,qCAAqC;AACpe,IAAI,iDAAiD,SAAS,EAAE,+BAA+B,UAAU,+BAA+B,WAAW,8DAA8D,mBAAmB,8CAA8C,4GAA4G,iCAAiC,sCAAsC,iDAAiD,UAAU;AAChgB,gDAAgD,gBAAgB,qEAAqE,qBAAqB,8CAA8C,2CAA2C,gDAAgD,4EAA4E,4EAA4E,UAAU,6BAA6B,eAAe;AACjf,iDAAiD,qBAAqB,8CAA8C,2CAA2C,0DAA0D,+CAA+C,UAAU,2BAA2B,eAAe,oLAAoL;AAChf,UAAU,iCAAiC,eAAe,oIAAoI,UAAU,2BAA2B,WAAW,iGAAiG,UAAU,4BAA4B,YAAY,4GAA4G,UAAU;AACvf,2BAA2B,YAAY,0GAA0G,UAAU,gCAAgC,WAAW,sGAAsG,UAAU,4BAA4B,YAAY,iHAAiH,UAAU;AACzd,YAAY,+GAA+G,UAAU,gCAAgC,WAAW,sGAAsG,UAAU,4BAA4B,YAAY,iHAAiH,UAAU,4BAA4B,YAAY;AAC3e,8FAA8F,UAAU,gCAAgC,WAAW,uGAAuG,UAAU,4BAA4B,YAAY,kHAAkH,UAAU,4BAA4B,YAAY;AAChd,6DAA6D,UAAU,gCAAgC,cAAc,uGAAuG,UAAU,qCAAqC,eAAe,kHAAkH,UAAU,oCAAoC,WAAW;AACrc,yCAAyC,UAAU,eAAe,WAAW,+FAA+F,UAAU,eAAe,WAAW,0FAA0F,UAAU,mBAAmB,YAAY;AACnV,QAAQ,UAAU,mBAAmB,cAAc,gGAAgG,UAAU,eAAe,cAAc,uGAAuG,UAAU,6BAA6B,eAAe,kHAAkH,UAAU,6BAA6B;AAChf,CAAC,uGAAuG,UAAU,6BAA6B,eAAe,kHAAkH,UAAU,6BAA6B,eAAe,gHAAgH,UAAU,iCAAiC,eAAe;AAChf,4FAA4F,UAAU,iCAAiC,WAAW,iGAAiG,UAAU,4BAA4B,YAAY,4GAA4G,UAAU,4BAA4B,YAAY;AACnc,gDAAgD,UAAU,gCAAgC,WAAW,iGAAiG,UAAU,4BAA4B,YAAY,4GAA4G,UAAU,4BAA4B,YAAY;AACtZ,QAAQ,UAAU,gCAAgC,UAAU,+FAA+F,UAAU,4BAA4B,WAAW,0GAA0G,UAAU,4BAA4B,WAAW,wGAAwG,UAAU;AACzd,WAAW,+HAA+H,UAAU,mBAAmB,aAAa,yIAAyI,UAAU,qBAAqB,gBAAgB,+GAA+G,UAAU;AACre,iBAAiB,0HAA0H,UAAU,6BAA6B,iBAAiB,wHAAwH,UAAU,iCAAiC,eAAe,wGAAwG,UAAU;AACve,gBAAgB,mHAAmH,UAAU,4BAA4B,gBAAgB,iHAAiH,UAAU,gCAAgC,aAAa;AACjW,QAAQ,UAAU,mGAAmG,WAAW,6DAA6D,qBAAqB,8CAA8C,oFAAoF,2DAA2D,oBAAoB,uCAAuC,YAAY;AACtd,0FAA0F,oBAAoB,uCAAuC,YAAY,yIAAyI,oBAAoB,uBAAuB,cAAc,gHAAgH,UAAU;AAC7d,eAAe,2HAA2H,UAAU,4BAA4B,eAAe,yHAAyH,UAAU,gCAAgC,YAAY,kIAAkI,UAAU;AAC1f,kBAAkB,SAAS,MAAM,0JAA0J,cAAc,gLAAgL,UAAU,oCAAoC,UAAU;AACjb,QAAQ,UAAU,8BAA8B,WAAW,6GAA6G,UAAU,+BAA+B,WAAW,2GAA2G,UAAU,kCAAkC,aAAa,2BAA2B;AAC3Z,0OAA0O,+BAA+B;AACzQ;AACA;AACA,yCAAyC,6CAA6C,0PAA0P,GAAG,yBAAyB,QAAQ,6BAA6B,cAAc,mDAAmD;AACld,+DAA+D,cAAc,kCAAkC,YAAY,iDAAiD,kGAAkG,kBAAkB,uDAAuD,wGAAwG,eAAe,oDAAoD;AAClgB,iFAAiF,YAAY,iDAAiD,kGAAkG,WAAW,kDAAkD,mGAAmG,SAAS,6BAA6B,QAAQ,4BAA4B,SAAS,6BAA6B;AAChgB,WAAW,iDAAiD,kGAAkG,YAAY,iDAAiD,kGAAkG,qBAAqB,0DAA0D;AAC5Y,4BAA4B,+KAA+K,mBAAmB;AAC9N;AACA;AACA;AACA,+DAA+D,+DAA+D,kCAAkC,kBAAkB,YAAY,WAAW,KAAK,uBAAuB,8CAA8C,eAAe,mBAAmB;AACrT,uDAAuD,MAAM,qBAAqB,yBAAyB,qBAAqB,iBAAiB,kBAAkB,kBAAkB,cAAc,yBAAyB,2BAA2B,QAAQ,WAAW,wDAAwD,mBAAmB,mBAAmB,uBAAuB,8BAA8B,KAAK,0BAA0B,oBAAoB,gBAAgB;AAChe,wBAAwB,sBAAsB,iCAAiC,+BAA+B,kBAAkB,kBAAkB,yBAAyB,2BAA2B,eAAe,sBAAsB,uBAAuB,8BAA8B,QAAQ,WAAW,kOAAkO;AACrhB,cAAc,kBAAkB,oCAAoC,+CAA+C,mCAAmC,6CAA6C,mCAAmC,EAAE,yCAAyC,SAAS,gCAAgC,EAAE,cAAc,uBAAuB;AACjW,kCAAkC,cAAc,6MAA6M,aAAa,qHAAqH,SAAS,SAAS,OAAO,kFAAkF,eAAe,OAAO,oBAAoB;AACphB,UAAU,OAAO,0CAA0C,GAAG,oBAAoB,OAAO,4FAA4F,2DAA2D,0BAA0B,aAAa,iBAAiB,iBAAiB,cAAc,oBAAoB,QAAQ,kBAAkB,8BAA8B,+CAA+C;AAClc,iFAAiF,mBAAmB,oBAAoB,iDAAiD,iIAAiI,EAAE,6DAA6D,0BAA0B,aAAa,mBAAmB,cAAc,mCAAmC,2BAA2B;AAC/e,mdAAmd,QAAQ,aAAa;AACxe,GAAG,mBAAmB,MAAM,oEAAoE,kBAAkB,qBAAqB,kBAAkB,oBAAoB,8BAA8B,8BAA8B,kBAAkB,oBAAoB,sCAAsC,4BAA4B,wBAAwB,kBAAkB,oBAAoB,sCAAsC,0BAA0B,wBAAwB;AACve,oBAAoB,sCAAsC,+BAA+B,2BAA2B,kBAAkB,oBAAoB,+FAA+F,+BAA+B,yBAAyB,kBAAkB,oBAAoB,sCAAsC,6EAA6E,+BAA+B;AACze,GAAG,uBAAuB,wDAAwD,gBAAgB,6IAA6I,kBAAkB,EAAE,qEAAqE,4BAA4B,aAAa,cAAc,4BAA4B,iBAAiB,QAAQ,kBAAkB,MAAM;AAC5c,GAAG,cAAc,6IAA6I,kBAAkB,qMAAqM,6BAA6B,QAAQ,gBAAgB,iCAAiC;AAC3c,SAAS,EAAE,qDAAqD,0BAA0B,eAAe,cAAc,mBAAmB,qBAAqB,qBAAqB,QAAQ,aAAa,8CAA8C,qBAAqB,qHAAqH,mDAAmD,oBAAoB,MAAM;AAC9c,gEAAgE,UAAU,UAAU,OAAO,sBAAsB,EAAE,uEAAuE,0BAA0B,aAAa,mBAAmB,cAAc,mCAAmC,QAAQ,aAAa,6IAA6I,kBAAkB;AACzd,gBAAgB,qBAAqB,yCAAyC,2IAA2I,kMAAkM;AAC3Z,2FAA2F,+CAA+C,WAAW,EAAE,kKAAkK,uBAAuB,yBAAyB,yBAAyB,EAAE,eAAe,6EAA6E;AAChe,KAAK,2BAA2B,iBAAiB,mBAAmB,0CAA0C,gDAAgD,aAAa,yBAAyB,2BAA2B;AAC/N,iDAAiD,QAAQ,uBAAuB,qCAAqC,qBAAqB,kBAAkB,qCAAqC,oBAAoB,kBAAkB,qCAAqC,wBAAwB,qBAAqB,8FAA8F,wBAAwB,mBAAmB,qCAAqC;AACve,2CAA2C,wBAAwB,yBAAyB,2IAA2I,iBAAiB,0DAA0D,gBAAgB,0DAA0D,QAAQ,+BAA+B,QAAQ,mCAAmC;AAC9c,mHAAmH,cAAc,yBAAyB,qBAAqB,gHAAgH,yDAAyD,qBAAqB,UAAU,YAAY,OAAO,2CAA2C,SAAS,yCAAyC,UAAU,OAAO;AACxf,qDAAqD,WAAW,OAAO,uCAAuC,qBAAqB,OAAO,0CAA0C,WAAW,OAAO,mFAAmF,EAAE,eAAe,sDAAsD,uBAAuB,6BAA6B,QAAQ,YAAY,qCAAqC,6BAA6B,MAAM,kCAAkC;AAClhB,0BAA0B,UAAU,QAAQ,gCAAgC,EAAE,+DAA+D,GAAG,0BAA0B,EAAE,0EAA0E,uBAAuB,iDAAiD,QAAQ,KAAK,4CAA4C,aAAa,+CAA+C,kDAAkD,QAAQ,gCAAgC;AAC7gB,6FAA6F,GAAG,0BAA0B,EAAE,eAAe,4FAA4F,iBAAiB,wBAAwB,uCAAuC,SAAS,wBAAwB,6BAA6B,kCAAkC,iBAAiB,mCAAmC,UAAU;AACrd,aAAa,sBAAsB,sBAAsB,uEAAuE,WAAW,iBAAiB,8CAA8C,mBAAmB,6EAA6E,mFAAmF,mBAAmB,oBAAoB,SAAS,sDAAsD;AACne,gGAAgG,EAAE,gCAAgC,mBAAmB,mBAAmB,2BAA2B,aAAa,kEAAkE,WAAW,iBAAiB,iKAAiK,UAAU;AACzd,MAAM,mCAAmC,yBAAyB,yBAAyB,uGAAuG,wGAAwG,uEAAuE,uEAAuE;AACxb,uDAAuD,oGAAoG,uBAAuB,mCAAmC,wCAAwC,0CAA0C,oCAAoC,KAAK,iBAAiB,gFAAgF,+BAA+B,UAAU;AAC1d,iCAAiC,oCAAoC,aAAa,uCAAuC,oCAAoC,0FAA0F,6DAA6D,EAAE,gCAAgC,wBAAwB,6GAA6G,uBAAuB;AAClf,wBAAwB,yCAAyC,2CAA2C,qCAAqC,KAAK,iBAAiB,2BAA2B,yBAAyB,wBAAwB,6EAA6E,gDAAgD,2HAA2H;AAC3e,gBAAgB,mCAAmC,QAAQ,WAAW,YAAY,WAAW,oBAAoB,yBAAyB,QAAQ,mBAAmB,iFAAiF,MAAM,iCAAiC,MAAM,kMAAkM;AACre,4DAA4D,kCAAkC,sCAAsC,8HAA8H,mCAAmC,qCAAqC,8FAA8F,+DAA+D,EAAE;AACze,uCAAuC,2HAA2H,sBAAsB,+GAA+G,uFAAuF,uGAAuG;AACre,aAAa,8BAA8B,yCAAyC,eAAe,cAAc,MAAM,WAAW,YAAY,WAAW,iFAAiF,kBAAkB,kBAAkB,4CAA4C,0EAA0E,MAAM,QAAQ,aAAa,mBAAmB,WAAW,kBAAkB,YAAY;AAC3d,oBAAoB,WAAW,cAAc,qBAAqB,gDAAgD,kDAAkD,uDAAuD,SAAS,gBAAgB,mBAAmB,2CAA2C,oEAAoE,qEAAqE,iDAAiD,cAAc,mBAAmB;AAC7gB,gBAAgB,eAAe,MAAM,MAAM,6HAA6H,8HAA8H,uIAAuI,gBAAgB,qBAAqB;AACld,oBAAoB,6DAA6D,oFAAoF,yBAAyB,MAAM,0CAA0C,+FAA+F,gBAAgB,gDAAgD,kBAAkB,EAAE,cAAc,uCAAuC,6BAA6B;AACnf,gBAAgB,gDAAgD,kBAAkB,0BAA0B,OAAO,eAAe,cAAc,uBAAuB,kBAAkB,EAAE,cAAc,cAAc,gBAAgB,YAAY,gDAAgD,kBAAkB,oBAAoB,mBAAmB,KAAK,YAAY,IAAI,iCAAiC,SAAS,UAAU,gBAAgB,uBAAuB;AAC5c,0HAA0H,EAAE,cAAc,cAAc,qCAAqC,oBAAoB,kCAAkC,6CAA6C,WAAW,mBAAmB,qIAAqI,yCAAyC,8BAA8B;AAC1gB,OAAO,wCAAwC,gDAAgD,wBAAwB,gFAAgF,0CAA0C,0BAA0B,KAAK,uCAAuC,+GAA+G;AACta,aAAa,WAAW,uBAAuB,UAAU,4BAA4B,gBAAgB,sCAAsC,SAAS,QAAQ;AAC5J,YAAY,QAAQ,iEAAiE,0DAA0D,0BAA0B,yFAAyF,mEAAmE,6CAA6C;AAClX,4CAA4C,kGAAkG,MAAM,UAAU,4DAA4D,sBAAsB,QAAQ,YAAY,IAAI,KAAK,uBAAuB,2BAA2B;AAC/T,kTAAkT,+BAA+B,UAAU,yEAAyE,WAAW,mBAAmB,qBAAqB;AACvd,UAAU,4BAA4B,8BAA8B,8BAA8B,iCAAiC,4BAA4B,+BAA+B,iBAAiB,MAAM,2BAA2B,uDAAuD,mBAAmB,YAAY,0EAA0E;AAChZ,qCAAqC,kCAAkC,SAAS,mBAAmB,iCAAiC,6DAA6D,mBAAmB,oBAAoB,EAAE,6BAA6B,8FAA8F,aAAa,wEAAwE,cAAc;AACxc,kCAAkC,sCAAsC,cAAc,mIAAmI,uDAAuD,8EAA8E,SAAS,YAAY,IAAI,cAAc,6BAA6B,gBAAgB;AAClb,sBAAsB,+BAA+B,0CAA0C,MAAM,4BAA4B,oIAAoI,QAAQ,+IAA+I,cAAc,uBAAuB,uBAAuB;AACxd,KAAK,mBAAmB,iBAAiB,qIAAqI,gCAAgC,gBAAgB,MAAM,uBAAuB,SAAS,wBAAwB,iBAAiB,oBAAoB;AACjU,qFAAqF,wDAAwD,KAAK,oBAAoB,IAAI,iBAAiB,KAAK,+BAA+B,gDAAgD,aAAa,cAAc,WAAW,OAAO,MAAM,iBAAiB,wBAAwB,UAAU,IAAI,YAAY,WAAW,KAAK,IAAI,WAAW,mCAAmC,UAAU,IAAI,YAAY,YAAY;AAC7e,0BAA0B,mGAAmG,6EAA6E,gGAAgG,qBAAqB,cAAc,kHAAkH,OAAO;AACtc,EAAE,YAAY,4BAA4B,6BAA6B,2CAA2C,yDAAyD,uBAAuB,mCAAmC,4BAA4B,8BAA8B,wBAAwB,4EAA4E,8CAA8C,qDAAqD,UAAU;AAChf,kCAAkC,kLAAkL,2CAA2C,iBAAiB,YAAY,qDAAqD,gGAAgG;AACjb,QAAQ,yDAAyD,0DAA0D,6DAA6D,gCAAgC,wBAAwB,aAAa,0BAA0B,kBAAkB,SAAS,qBAAqB,0FAA0F;AACja,0BAA0B,wCAAwC,aAAa,0BAA0B,kBAAkB,SAAS,qBAAqB,EAAE,iBAAiB,QAAQ,WAAW,cAAc,mBAAmB,6BAA6B,uCAAuC,sBAAsB,gCAAgC,QAAQ,SAAS,UAAU,cAAc,wBAAwB,mCAAmC,qCAAqC,YAAY,gBAAgB,KAAK;AACpgB,qBAAqB,sBAAsB,mBAAmB,QAAQ,gBAAgB,0EAA0E,UAAU,qBAAqB,SAAS,cAAc,WAAW,gCAAgC,sBAAsB,YAAY,WAAW,8DAA8D,aAAa,gBAAgB,0CAA0C,SAAS,6CAA6C;AACze,0BAA0B,8FAA8F,UAAU,QAAQ,oBAAoB,EAAE,oBAAoB,kDAAkD,wCAAwC,8DAA8D,SAAS,gCAAgC,ihBAAihB;AACt4B,SAAS,aAAa,kBAAkB,kBAAkB,qEAAqE,uBAAuB,sDAAsD,QAAQ,iCAAiC,6BAA6B,SAAS,oBAAoB,wUAAwU;AACvnB,OAAO,oBAAoB,uDAAuD,cAAc,KAAK,YAAY,WAAW,8DAA8D,8BAA8B,SAAS,iEAAiE,uZAAuZ;AACzrB,QAAQ,oBAAoB,uDAAuD,eAAe,6BAA6B,KAAK,gEAAgE,WAAW,8DAA8D,8BAA8B,SAAS,iEAAiE,seAAse;AAC31B,MAAM,SAAS,WAAW,kEAAkE,6IAA6I,YAAY,0CAA0C,SAAS,UAAU,0PAA0P;AAC5iB,YAAY,iBAAiB,wFAAwF,SAAS,UAAU,mKAAmK,QAAQ,iBAAiB,wFAAwF,6BAA6B,SAAS,UAAU,8MAA8M;AAC1pB,QAAQ,uBAAuB,oBAAoB,yKAAyK,QAAQ,sBAAsB,kBAAkB,EAAE,cAAc,cAAc,qCAAqC,oBAAoB,2BAA2B,oBAAoB,0FAA0F,SAAS;AACrf,UAAU,iOAAiO,aAAa,kBAAkB,iDAAiD,6FAA6F;AACxZ,6BAA6B,SAAS,mCAAmC,8KAA8K,OAAO,sBAAsB,kDAAkD,SAAS,oBAAoB,0QAA0Q;AAC7mB,WAAW,oBAAoB,UAAU,2YAA2Y,QAAQ,sBAAsB,wBAAwB;AAC1e,8BAA8B,SAAS,oBAAoB,ySAAyS,QAAQ,uBAAuB,oBAAoB,+KAA+K;AACtkB,OAAO,QAAQ,gDAAgD,SAAS,UAAU,kFAAkF,SAAS,wCAAwC,oBAAoB,8KAA8K,QAAQ,aAAa,mDAAmD,SAAS,oBAAoB;AAC5f,2QAA2Q,SAAS,sBAAsB,yBAAyB,iEAAiE,8BAA8B,SAAS,oBAAoB,0SAA0S;AACzuB,OAAO,uBAAuB,oBAAoB,gLAAgL,SAAS,wCAAwC,oBAAoB,+KAA+K,aAAa,oBAAoB,UAAU;AACjgB,8ZAA8Z,aAAa,kBAAkB,wBAAwB,+BAA+B;AACpf,EAAE,YAAY,IAAI,KAAK,kBAAkB,yHAAyH,wIAAwI,oFAAoF,8BAA8B,SAAS,qCAAqC,+MAA+M;AACzpB,OAAO,uDAAuD,oBAAoB,0LAA0L,WAAW,QAAQ,qCAAqC,wBAAwB,+BAA+B,EAAE,6BAA6B,SAAS,UAAU,+GAA+G;AAC5hB,OAAO,QAAQ,gDAAgD,SAAS,UAAU,kFAAkF,aAAa,sDAAsD,oBAAoB,ySAAyS;AACpiB,UAAU,uEAAuE,oBAAoB,qSAAqS,UAAU,QAAQ,0DAA0D,SAAS,UAAU;AACze,4KAA4K,UAAU,iBAAiB,uFAAuF,SAAS,UAAU,uOAAuO;AACxhB,SAAS,iBAAiB,uFAAuF,SAAS,UAAU,wOAAwO,UAAU,iBAAiB,eAAe,gBAAgB,YAAY,WAAW,wDAAwD;AACrf,OAAO,2CAA2C,oCAAoC,KAAK,UAAU,8BAA8B,SAAS,UAAU,6OAA6O,UAAU,iBAAiB,iDAAiD,SAAS,UAAU;AACle,uMAAuM,UAAU,iBAAiB,iDAAiD,SAAS,UAAU,yNAAyN;AAC/f,WAAW,iBAAiB,kEAAkE,SAAS,UAAU,qNAAqN,UAAU,iBAAiB,qEAAqE,SAAS,UAAU,+NAA+N;AACxpB,SAAS,iBAAiB,wEAAwE,SAAS,UAAU,wOAAwO,QAAQ,kBAAkB,uDAAuD,SAAS,iBAAiB;AACxc,YAAY,IAAI,WAAW,iEAAiE,SAAS,UAAU,wJAAwJ,SAAS,mCAAmC,YAAY,mLAAmL,QAAQ,KAAK;AAC/f,YAAY,yCAAyC,UAAU,iHAAiH,iBAAiB,QAAQ,wDAAwD,SAAS,UAAU,2BAA2B,EAAE,iDAAiD,8CAA8C,EAAE,sBAAsB,2EAA2E;AACnf,WAAW,qCAAqC,4CAA4C,SAAS,iCAAiC,EAAE,kDAAkD,wBAAwB,cAAc,uEAAuE,+BAA+B,mFAAmF,uCAAuC,iCAAiC,2CAA2C,EAAE;AAC9gB,WAAW,0BAA0B,UAAU,4DAA4D,QAAQ,gCAAgC,KAAK;AACxJ;AACA,8DAA8D,gCAAgC,eAAe,sDAAsD,8BAA8B,yGAAyG,iBAAiB,0BAA0B,yDAAyD,mDAAmD,gDAAgD;AACjf,uDAAuD,0DAA0D,uCAAuC,oBAAoB,qBAAqB,kCAAkC,qFAAqF,QAAQ,gDAAgD,mDAAmD,MAAM,2DAA2D,cAAc;AAClf,wCAAwC,8FAA8F,8FAA8F,iDAAiD,yBAAyB,6CAA6C,kDAAkD,UAAU,UAAU,OAAO,sCAAsC,SAAS;AACvd,uBAAuB,eAAe,OAAO,0CAA0C,SAAS,4GAA4G,2BAA2B,8CAA8C,OAAO,6CAA6C,UAAU,OAAO,iBAAiB,SAAS,qCAAqC,QAAQ,gBAAgB,4CAA4C;AAC7d,yGAAyG,2DAA2D,0CAA0C,wCAAwC,4CAA4C,wCAAwC,4BAA4B,uBAAuB,kEAAkE;AAC/b,UAAU,+DAA+D,wBAAwB,4DAA4D,QAAQ,yBAAyB,2BAA2B,UAAU,MAAM,uBAAuB,eAAe,iCAAiC,yFAAyF;AACzY,oCAAoC,MAAM,mGAAmG,QAAQ,WAAW,MAAM,OAAO,4BAA4B,SAAS,0GAA0G,OAAO,0CAA0C,kGAAkG,qBAAqB,IAAI,KAAK,KAAK;AAClf,WAAW,IAAI,wDAAwD,0LAA0L,KAAK,IAAI,iCAAiC,QAAQ,KAAK,eAAe,QAAQ,IAAI,8DAA8D;AACjZ,yCAAyC,uCAAuC,WAAW,mBAAmB,gBAAgB,WAAW,EAAE,eAAe,8BAA8B,8LAA8L,uDAAuD,6BAA6B;AAC1c,qDAAqD,qCAAqC,iCAAiC,sCAAsC,sDAAsD,wDAAwD,KAAK,yCAAyC,OAAO,iEAAiE,QAAQ,sBAAsB,iCAAiC,6BAA6B;AACje,gEAAgE,iBAAiB,iBAAiB,QAAQ,SAAS,KAAK,MAAM,QAAQ,SAAS,4CAA4C,yEAAyE,SAAS,WAAW,QAAQ,+BAA+B,qEAAqE,+BAA+B,oEAAoE,gCAAgC;AACvgB,+BAA+B,oGAAoG,uKAAuK,kDAAkD,+FAA+F,wDAAwD;AACnf,YAAY,iCAAiC,8FAA8F,uDAAuD,6BAA6B,MAAM,iBAAiB,uEAAuE,wGAAwG;AACra,kEAAkE,8IAA8I,MAAM,+CAA+C,IAAI,uEAAuE,6CAA6C;AAC7X,SAAS,iDAAiD,IAAI,MAAM,eAAe,8EAA8E,IAAI,SAAS,GAAG,6BAA6B,MAAM,iBAAiB,uEAAuE,wGAAwG;AACpZ,mEAAmE,8IAA8I,MAAM,+CAA+C,IAAI,uEAAuE,6CAA6C;AAC9X,SAAS,iDAAiD,IAAI,MAAM,eAAe,8EAA8E,IAAI,SAAS,GAAG,wDAAwD,2BAA2B,0EAA0E,6EAA6E,iCAAiC,2BAA2B;AACvd,YAAY,+EAA+E,gCAAgC,6BAA6B,aAAa,iCAAiC,iDAAiD,KAAK,oGAAoG,kCAAkC,sCAAsC,EAAE,aAAa,iCAAiC;AACxd,8CAA8C,4EAA4E,EAAE,aAAa,iCAAiC,kCAAkC,EAAE,yBAAyB,2CAA2C,KAAK,kHAAkH,IAAI,mGAAmG;AAChf,yBAAyB,yBAAyB,SAAS,0BAA0B,QAAQ,uDAAuD,SAAS,QAAQ,mBAAmB,kFAAkF,6EAA6E,SAAS,SAAS,GAAG,EAAE,SAAS,QAAQ,mBAAmB,KAAK,yBAAyB,eAAe,KAAK,MAAM,UAAU,mCAAmC;AACvf,2BAA2B,8BAA8B,gFAAgF,4BAA4B,0BAA0B,2BAA2B,8BAA8B,6IAA6I,+CAA+C,6BAA6B;AACjd,qBAAqB,mCAAmC,4GAA4G,2BAA2B,oFAAoF,uBAAuB,0BAA0B,wFAAwF,mFAAmF;AAC/e,8BAA8B,oFAAoF,uBAAuB,IAAI,mDAAmD,SAAS,sEAAsE,WAAW,oCAAoC,MAAM,gFAAgF,MAAM,oBAAoB,yCAAyC;AACvd,4DAA4D,8BAA8B,2BAA2B,sGAAsG,uCAAuC,2BAA2B,sGAAsG,sGAAsG;AACze,YAAY,gIAAgI,sCAAsC,2BAA2B,wJAAwJ,2FAA2F,4BAA4B,eAAe;AAC3e,YAAY,oCAAoC,QAAQ,QAAQ,aAAa,+BAA+B,kBAAkB,MAAM,eAAe,KAAK,aAAa,KAAK,wCAAwC,mRAAmR,6BAA6B;AAClgB,gCAAgC,wCAAwC,8BAA8B,qCAAqC,+EAA+E,oCAAoC,mCAAmC,oCAAoC,wKAAwK;AAC7e,sCAAsC,qCAAqC,gDAAgD,sCAAsC,oGAAoG,QAAQ,aAAa,wFAAwF,+BAA+B,4BAA4B,oDAAoD;AACje,KAAK,8FAA8F,wDAAwD,sDAAsD,EAAE,+BAA+B,eAAe,uBAAuB,sGAAsG,SAAS,GAAG,mCAAmC;AAC7a,0EAA0E,iCAAiC,aAAa,kEAAkE,+GAA+G,gGAAgG,YAAY,2EAA2E,EAAE,GAAG;AACre,qBAAqB,8BAA8B,sCAAsC,4BAA4B,+BAA+B,uCAAuC,4BAA4B,4BAA4B,0EAA0E,6BAA6B,aAAa,oDAAoD,uBAAuB,SAAS,sDAAsD;AACjf,EAAE,WAAW,KAAK,oCAAoC,uBAAuB,kFAAkF,yBAAyB,MAAM,EAAE,SAAS,UAAU,WAAW,kFAAkF,0BAA0B,WAAW,yBAAyB,oHAAoH;AACle,YAAY,uFAAuF,6GAA6G,UAAU,EAAE,aAAa,8BAA8B,GAAG,kCAAkC,oHAAoH,mBAAmB;AACnb,QAAQ,sBAAsB,WAAW,sDAAsD,UAAU,oCAAoC,sCAAsC,+BAA+B,yBAAyB,mBAAmB,SAAS,GAAG,gCAAgC,MAAM,yDAAyD,oHAAoH,iBAAiB;AAC9e,oBAAoB,UAAU,UAAU,kBAAkB,+BAA+B,yCAAyC,8BAA8B,iBAAiB,sBAAsB,eAAe,SAAS,+CAA+C,+BAA+B,EAAE,UAAU,uBAAuB,sBAAsB,WAAW;AACjX,aAAa,iCAAiC,yGAAyG,wDAAwD,sDAAsD,EAAE,wFAAwF,+BAA+B,8EAA8E;AAC5c,yBAAyB,+EAA+E,mKAAmK,wBAAwB,4BAA4B,4BAA4B,qCAAqC,oCAAoC;AACpa,+BAA+B,gIAAgI,yEAAyE,QAAQ,aAAa,wFAAwF,+BAA+B,8BAA8B,gCAAgC,qBAAqB,0BAA0B;AACje,eAAe,UAAU,gCAAgC,2CAA2C,gCAAgC,yCAAyC,mCAAmC,gBAAgB,QAAQ,0BAA0B,iBAAiB,4CAA4C,WAAW,iCAAiC,gCAAgC,+EAA+E,gCAAgC;AAC1f,8CAA8C,iCAAiC,uCAAuC,+BAA+B,8EAA8E,2BAA2B,0EAA0E,8BAA8B,gGAAgG,6BAA6B;AACne,EAAE,iCAAiC,gFAAgF,+BAA+B,yGAAyG,kBAAkB,eAAe,cAAc,oCAAoC,UAAU,6BAA6B,4EAA4E,2BAA2B;AAC5d,EAAE,6BAA6B,2EAA2E,6BAA6B,4EAA4E,6BAA6B,4EAA4E,6BAA6B,4EAA4E,eAAe;AACpb,CAAC,2BAA2B,2GAA2G,WAAW,+CAA+C,yCAAyC,kBAAkB,4BAA4B,kCAAkC,uCAAuC,EAAE,QAAQ,wFAAwF;AACnc,uBAAuB,uCAAuC,SAAS,cAAc,kDAAkD,MAAM,mBAAmB,oEAAoE,6BAA6B,UAAU,gFAAgF,UAAU,MAAM,OAAO,kBAAkB,gCAAgC,QAAQ,WAAW,mBAAmB,wBAAwB;AACle,6DAA6D,EAAE,qEAAqE,4DAA4D,2BAA2B,uCAAuC,+BAA+B,EAAE,6DAA6D,sEAAsE,2BAA2B,mCAAmC,2BAA2B;AAC/f,uEAAuE,sEAAsE,2BAA2B,mCAAmC,2BAA2B,EAAE,gEAAgE,2BAA2B,mCAAmC,2BAA2B,EAAE,0EAA0E,2BAA2B;AACxe,GAAG,2BAA2B,EAAE,8DAA8D,2BAA2B,mCAAmC,2BAA2B,EAAE,gEAAgE,2BAA2B,mCAAmC,2BAA2B,EAAE,0DAA0D,2BAA2B,qCAAqC,6BAA6B,EAAE;AAC7e,uCAAuC,2BAA2B,mCAAmC,2BAA2B,EAAE,4EAA4E,2BAA2B,mCAAmC,2BAA2B,EAAE,oEAAoE,2BAA2B,mCAAmC,2BAA2B,EAAE;AACxc,CAAC,2BAA2B,mCAAmC,2BAA2B,EAAE,kEAAkE,2BAA2B,mCAAmC,2BAA2B,EAAE,mEAAmE,wEAAwE,2BAA2B,mCAAmC,2BAA2B,EAAE;AAC/d,4BAA4B,8DAA8D,2BAA2B,uCAAuC,+BAA+B,EAAE,+DAA+D,4DAA4D,2BAA2B,mCAAmC,2BAA2B,EAAE,6DAA6D;AAChd,CAAC,2BAA2B,mCAAmC,2BAA2B,EAAE,+DAA+D,4EAA4E,2BAA2B,mCAAmC,2BAA2B,EAAE,sEAAsE,2BAA2B,mCAAmC,2BAA2B,EAAE;AACne,2BAA2B,wDAAwD,2BAA2B,mCAAmC,2BAA2B,EAAE,yDAAyD,gFAAgF,2BAA2B,mCAAmC,2BAA2B,EAAE,iFAAiF;AACne,gDAAgD,2BAA2B,mCAAmC,2BAA2B,EAAE,+EAA+E,oEAAoE,2BAA2B,sBAAsB;AAC/U,oCAAoC,mCAAmC,2BAA2B,EAAE,qEAAqE,sEAAsE,2BAA2B,sCAAsC,2BAA2B,EAAE,uEAAuE,sEAAsE,2BAA2B;AACrf,GAAG,2BAA2B,EAAE,uEAAuE,gEAAgE,2BAA2B,mCAAmC,2BAA2B,EAAE,iEAAiE,8EAA8E,2BAA2B,mCAAmC,2BAA2B,EAAE;AAC5e,+BAA+B,8EAA8E,2BAA2B,mCAAmC,2BAA2B,EAAE,+EAA+E,oEAAoE,2BAA2B,mCAAmC,2BAA2B,EAAE;AACtb,kCAAkC,yFAAyF,eAAe,sDAAsD,0BAA0B,iGAAiG,eAAe,eAAe,uBAAuB,QAAQ,KAAK,uGAAuG,cAAc;AAClf,mDAAmD,WAAW,8EAA8E,WAAW,cAAc,mBAAmB,6GAA6G,sBAAsB,gCAAgC,aAAa,mCAAmC,sCAAsC,OAAO,OAAO;AAC/b,mFAAmF,kCAAkC,qBAAqB,2GAA2G,MAAM,IAAI,uFAAuF,SAAS,KAAK,mBAAmB,mBAAmB,YAAY,iBAAiB,uCAAuC;AAC9c,IAAI,UAAU,UAAU,OAAO,qBAAqB,WAAW,OAAO,qBAAqB,UAAU,OAAO,sDAAsD,QAAQ,8BAA8B,EAAE,eAAe,cAAc,yBAAyB,kCAAkC,sDAAsD,gBAAgB,aAAa,uBAAuB,SAAS,QAAQ,yDAAyD,QAAQ;AAC9d,mCAAmC,eAAe,uCAAuC,sBAAsB,gDAAgD,qBAAqB,EAAE,aAAa,qCAAqC,2CAA2C,iEAAiE,yDAAyD,KAAK,oCAAoC,EAAE;AACxb,aAAa,UAAU,yGAAyG,gCAAgC,8FAA8F,2DAA2D,sBAAsB,yCAAyC,SAAS,gCAAgC;AACja,mFAAmF,6BAA6B,yCAAyC,mEAAmE,iEAAiE,4CAA4C,4BAA4B,6EAA6E;AAClb,2CAA2C,MAAM,wBAAwB,WAAW,6HAA6H,0EAA0E,gCAAgC,KAAK,mBAAmB,sBAAsB,WAAW,4BAA4B,SAAS,sFAAsF;AAC/e,gCAAgC,6DAA6D,0BAA0B,iCAAiC,UAAU,4EAA4E,sBAAsB,2BAA2B,QAAQ,gCAAgC,EAAE,wBAAwB,2DAA2D,uBAAuB;AACnb,yBAAyB,8CAA8C,kFAAkF,MAAM,gBAAgB,kEAAkE,8EAA8E;AAC/T,iBAAiB,oCAAoC,eAAe,eAAe,uCAAuC,mBAAmB,oBAAoB,mBAAmB,oBAAoB,uCAAuC,mBAAmB,oBAAoB,mBAAmB,oBAAoB,4BAA4B,mBAAmB,oBAAoB,mBAAmB,oBAAoB,4BAA4B,mBAAmB,oBAAoB;AAC1e,oBAAoB,4BAA4B,qBAAqB,uBAAuB,qBAAqB,wBAAwB,aAAa,UAAU,kBAAkB,0CAA0C,kIAAkI,SAAS;AACvW,wBAAwB,0FAA0F,qFAAqF,6BAA6B,EAAE,GAAG,wEAAwE,OAAO;AACxT,sFAAsF,2BAA2B,uDAAuD,kCAAkC,8BAA8B,uBAAuB,yBAAyB,4BAA4B,uBAAuB,uBAAuB,yBAAyB,yBAAyB;AACpZ,CAAC,SAAS,oEAAoE,uDAAuD,kCAAkC,8BAA8B,uBAAuB,yBAAyB,4BAA4B,uBAAuB,uBAAuB,yBAAyB,yBAAyB,qHAAqH,SAAS;AAC/e,CAAC,yDAAyD,6BAA6B,gCAAgC,2BAA2B,6BAA6B,2BAA2B,8BAA8B,yBAAyB,4BAA4B,uBAAuB,uBAAuB,0HAA0H;AACrc,mCAAmC,yDAAyD,kCAAkC,IAAI,gCAAgC,SAAS,uDAAuD,WAAW,iEAAiE,yCAAyC,UAAU,yCAAyC,UAAU,6EAA6E,+BAA+B;AAChgB,qJAAqJ,yDAAyD,0BAA0B,+BAA+B,6EAA6E,4BAA4B,kEAAkE;AAClb,IAAI,YAAY,MAAM,4EAA4E,wDAAwD,GAAG,yDAAyD,mCAAmC,OAAO,uBAAuB,iBAAiB,uBAAuB,kFAAkF,6DAA6D,qCAAqC;AACnf,wCAAwC,qCAAqC,qDAAqD,4CAA4C,0CAA0C,4CAA4C,+DAA+D,8CAA8C,0CAA0C,8CAA8C;AACzc,2BAA2B,kCAAkC,0CAA0C,oDAAoD,2DAA2D,yCAAyC,QAAQ,6FAA6F,qEAAqE,yCAAyC;AACld,GAAG,2DAA2D,qEAAqE,2CAA2C,0CAA0C,6DAA6D,6EAA6E,kDAAkD,QAAQ;AAC5Z,IAAI,uFAAuF,sCAAsC,wCAAwC,4FAA4F,uDAAuD,yCAAyC,iCAAiC,IAAI,eAAe,IAAI,qBAAqB,IAAI,cAAc,SAAS,MAAM,eAAe,IAAI;AACte,IAAI,SAAS,MAAM,eAAe,IAAI,mBAAmB,SAAS,OAAO,oCAAoC,EAAE,kCAAkC,MAAM,WAAW,MAAM,YAAY,QAAQ,8BAA8B,yBAAyB,OAAO,4BAA4B,0BAA0B,OAAO,4BAA4B,0BAA0B,OAAO,2BAA2B;AAC/Y,CAAC,KAAK,SAAS,MAAM,OAAO,SAAS,MAAM,GAAG,yEAAyE,6CAA6C,6CAA6C,6CAA6C,KAAK,iEAAiE,gCAAgC,qBAAqB,EAAE,gCAAgC,4BAA4B,kBAAkB,IAAI,4BAA4B,QAAQ;AACjf,EAAE,wBAAwB,IAAI,qBAAqB,KAAK,WAAW,EAAE,8EAA8E,UAAU,IAAI,SAAS,KAAK,uDAAuD,mCAAmC,IAAI,UAAU,SAAS,YAAY,uGAAuG,wCAAwC,OAAO;AAClc,oCAAoC,sBAAsB,IAAI,2DAA2D,qBAAqB,KAAK,WAAW,EAAE,8EAA8E,0EAA0E,8BAA8B,SAAS,qBAAqB,2DAA2D,sCAAsC;AACrd,8BAA8B,QAAQ,4BAA4B,uBAAuB,OAAO,4CAA4C,uBAAuB,mEAAmE,WAAW,6DAA6D,UAAU,SAAS,0DAA0D,8BAA8B,wEAAwE,gBAAgB;AACjf,mBAAmB,+CAA+C,MAAM,0HAA0H,sEAAsE,gBAAgB,eAAe,yCAAyC,WAAW,4BAA4B,8CAA8C,WAAW,mBAAmB;AACnc,YAAY,uCAAuC,uBAAuB,aAAa,+DAA+D,sFAAsF,yEAAyE,4CAA4C,iCAAiC,oBAAoB,mCAAmC,sBAAsB,QAAQ,6BAA6B;AACpf,mFAAmF,2CAA2C,2BAA2B,mBAAmB,IAAI,sCAAsC,wBAAwB,0BAA0B,KAAK,iFAAiF,yBAAyB,4CAA4C,iEAAiE,eAAe;AACnf,iDAAiD,0BAA0B,iGAAiG,iBAAiB,iBAAiB,cAAc,aAAa,oBAAoB,2FAA2F,uEAAuE,cAAc,EAAE,8CAA8C;AAC7d,sCAAsC,eAAe,QAAQ,gCAAgC,EAAE,6DAA6D,wBAAwB,cAAc,YAAY,aAAa,MAAM,4FAA4F,yFAAyF,EAAE,yDAAyD,UAAU,iBAAiB,QAAQ,UAAU;AAC9f,QAAQ,gEAAgE,wGAAwG,QAAQ,gCAAgC,EAAE,uEAAuE,eAAe,kDAAkD,wBAAwB,uEAAuE;AACjc,SAAS,gBAAgB,QAAQ,sRAAsR,iCAAiC,oCAAoC,oEAAoE,SAAS,EAAE,MAAM;AACjd,gBAAgB,iDAAiD,gBAAgB,gDAAgD,gDAAgD,mBAAmB,aAAa,qBAAqB,cAAc,uGAAuG,+CAA+C,gBAAgB,2CAA2C,WAAW;AAChd,iBAAiB,SAAS,cAAc,mIAAmI,uDAAuD,8EAA8E,WAAW,YAAY,IAAI,gBAAgB,gBAAgB,sBAAsB,8BAA8B,iBAAiB;AAChb,2DAA2D,kCAAkC,WAAW,6BAA6B,kBAAkB,EAAE,8BAA8B,sGAAsG,uBAAuB,yDAAyD,sBAAsB,yGAAyG,eAAe;AAC3f,UAAU,sBAAsB,mIAAmI,uDAAuD,sBAAsB,wBAAwB,uEAAuE,YAAY,IAAI,gBAAgB,IAAI,2BAA2B,aAAa,UAAU,cAAc,QAAQ,mBAAmB,SAAS,UAAU;AACje,gDAAgD,QAAQ,QAAQ,gBAAgB,6BAA6B,SAAS,UAAU,0DAA0D,OAAO,QAAQ,4CAA4C,SAAS,UAAU,iEAAiE,SAAS,SAAS,eAAe,6BAA6B,SAAS,UAAU,4EAA4E,SAAS;AAC/e,GAAG,uDAAuD,EAAE,QAAQ,wCAAwC,qBAAqB,6BAA6B,SAAS,oBAAoB,yEAAyE,SAAS,SAAS,0HAA0H,eAAe,6BAA6B,SAAS,UAAU,6FAA6F;AAC5iB,KAAK,SAAS,kFAAkF,gDAAgD,kBAAkB,mBAAmB,SAAS,SAAS,oBAAoB,wJAAwJ,SAAS,SAAS,uBAAuB,2EAA2E;AACve,GAAG,6BAA6B,SAAS,UAAU,yHAAyH,OAAO,WAAW,mFAAmF,0HAA0H,kCAAkC,SAAS,YAAY;AAClc,+BAA+B,QAAQ,aAAa,yKAAyK,2BAA2B,uFAAuF,8BAA8B,SAAS,oBAAoB,+IAA+I;AACzhB,OAAO,SAAS,QAAQ,sBAAsB,YAAY,IAAI,yEAAyE,8BAA8B,SAAS,UAAU,4EAA4E,UAAU,QAAQ,oBAAoB,6BAA6B,SAAS,UAAU,mDAAmD,QAAQ,aAAa,uBAAuB,2BAA2B;AACpd,yCAAyC,MAAM,mBAAmB,uDAAuD,8DAA8D,+BAA+B,UAAU,+BAA+B,MAAM,qBAAqB,0CAA0C,6CAA6C,eAAe,oDAAoD,YAAY,eAAe,KAAK,cAAc;AACle,KAAK,mBAAmB,4BAA4B,oCAAoC,6CAA6C,EAAE,yBAAyB,SAAS,yBAAyB,aAAa,eAAe,mCAAmC,qBAAqB,gBAAgB,kEAAkE,6BAA6B,mBAAmB,wBAAwB,kCAAkC;AACld,CAAC,qBAAqB,KAAK,cAAc,yCAAyC,qBAAqB,6EAA6E,SAAS,gBAAgB,iBAAiB,oBAAoB,8CAA8C,uCAAuC,OAAO,sBAAsB,gCAAgC,oDAAoD;AACxb,uBAAuB,gBAAgB,oDAAoD,4DAA4D,YAAY,kBAAkB,8FAA8F,mCAAmC,0BAA0B,oBAAoB,WAAW,6BAA6B,UAAU,EAAE;AACxZ,mCAAmC,8IAA8I,QAAQ,WAAW,+BAA+B,kBAAkB,4CAA4C,uCAAuC,OAAO,sBAAsB,gCAAgC,wDAAwD;AAC7b,uBAAuB,cAAc,oDAAoD,4DAA4D,mBAAmB,gBAAgB,qBAAqB,oBAAoB,QAAQ,6BAA6B,qBAAqB,KAAK,IAAI,EAAE,mDAAmD,6BAA6B,MAAM,wBAAwB;AACpZ,+CAA+C,6BAA6B,SAAS,YAAY,wFAAwF,mDAAmD,wBAAwB,cAAc,cAAc,gDAAgD,4DAA4D,QAAQ,gCAAgC,wDAAwD,wBAAwB;AACpgB,aAAa,cAAc,YAAY,iCAAiC,sCAAsC,cAAc,UAAU,0DAA0D,QAAQ,gCAAgC,EAAE,iBAAiB,cAAc,mDAAmD,OAAO,sBAAsB,kBAAkB,wBAAwB,+CAA+C;AAClb,+CAA+C,yBAAyB,+CAA+C,4HAA4H,OAAO,qBAAqB,kBAAkB,aAAa,OAAO,0IAA0I,gBAAgB,KAAK,YAAY;AAChe,UAAU,4JAA4J,0BAA0B,eAAe,wBAAwB,kCAAkC,8DAA8D,+BAA+B,cAAc,yBAAyB,iBAAiB,+BAA+B,kCAAkC,gBAAgB,EAAE;AACjf,SAAS,kBAAkB,OAAO,0IAA0I,gBAAgB,SAAS,SAAS,YAAY,WAAW,KAAK,aAAa,UAAU,6JAA6J,+CAA+C,+BAA+B,IAAI;AAChf,oDAAoD,KAAK,iBAAiB,sBAAsB,WAAW,IAAI,QAAQ,0IAA0I,0BAA0B,8DAA8D,6BAA6B,gBAAgB,uBAAuB;AAC7Z,2EAA2E,EAAE,cAAc,0CAA0C,qCAAqC,uBAAuB,kCAAkC,6CAA6C,WAAW,2EAA2E,8BAA8B,8DAA8D,cAAc,uBAAuB;AACve,EAAE,cAAc,0CAA0C,2JAA2J,cAAc,mBAAmB,kBAAkB,MAAM,MAAM,6HAA6H;AACjZ,uBAAuB,qJAAqJ,gBAAgB,mBAAmB,mGAAmG,IAAI,oBAAoB,UAAU,2BAA2B,KAAK,UAAU,6BAA6B,KAAK,sBAAsB,QAAQ,WAAW,qBAAqB;AAC9d,kBAAkB,qBAAqB,mBAAmB,8DAA8D,oHAAoH,sBAAsB,uDAAuD,4CAA4C,0BAA0B,QAAQ,oEAAoE,cAAc,YAAY,IAAI;AACze,cAAc,gCAAgC,cAAc,2BAA2B,cAAc,qBAAqB,cAAc,oBAAoB,cAAc,oBAAoB,gBAAgB,kBAAkB,4IAA4I,gBAAgB,kBAAkB,SAAS,YAAY,gBAAgB,KAAK,8CAA8C;AACte,OAAO,uDAAuD,cAAc,kBAAkB,sCAAsC,YAAY,gBAAgB,sBAAsB,gCAAgC,MAAM,SAAS,sDAAsD,wBAAwB,0CAA0C,oDAAoD,wBAAwB;AACza,oCAAoC,yCAAyC,sIAAsI,6BAA6B,MAAM,4CAA4C,YAAY,IAAI,KAAK,kBAAkB,0HAA0H,OAAO,SAAS;AACnd,kBAAkB,0EAA0E,QAAQ;AACpG,YAAY,mEAAmE,QAAQ,qCAAqC,KAAK,iFAAiF,EAAE,oBAAoB,iBAAiB,6GAA6G,gBAAgB,0CAA0C,iEAAiE;AACje,IAAI,+BAA+B,4HAA4H,SAAS,EAAE,2BAA2B,uDAAuD,yDAAyD,+BAA+B,6DAA6D,mGAAmG,gCAAgC;AACphB,GAAG,2CAA2C,8BAA8B,gFAAgF,UAAU,EAAE,wDAAwD,+FAA+F,MAAM,YAAY,gCAAgC,SAAS,YAAY,gBAAgB,8DAA8D;AACpd,oBAAoB,gBAAgB,MAAM,iBAAiB,MAAM,iBAAiB,MAAM,kCAAkC,MAAM,kBAAkB,+BAA+B,qCAAqC,UAAU,iBAAiB,WAAW,mBAAmB,qBAAqB,sDAAsD,qFAAqF,eAAe,MAAM;AACpc,QAAQ,MAAM,oCAAoC,QAAQ,iBAAiB,KAAK,UAAU,qDAAqD,wDAAwD,uBAAuB,wBAAwB,qDAAqD,yDAAyD,WAAW,oDAAoD,8CAA8C,2BAA2B;AAC5e,uBAAuB,eAAe,yBAAyB,+EAA+E,uCAAuC,uCAAuC,WAAW,6BAA6B,kBAAkB,EAAE,+CAA+C,sGAAsG,aAAa,qBAAqB,cAAc;AAC7d,kCAAkC,iDAAiD,MAAM,QAAQ,gBAAgB,mBAAmB,YAAY,aAAa,oBAAoB,+BAA+B,cAAc,mIAAmI,uDAAuD,wBAAwB,gEAAgE;AAChf,8BAA8B,oBAAoB,QAAQ,KAAK,IAAI,aAAa,gBAAgB,qBAAqB,+BAA+B,gBAAgB,6BAA6B,oEAAoE,QAAQ,SAAS,SAAS,YAAY,gBAAgB,sCAAsC,SAAS,YAAY,4CAA4C,sFAAsF,QAAQ;AAChgB,gFAAgF,SAAS,YAAY,4CAA4C,mGAAmG,6BAA6B,uDAAuD,iBAAiB,+CAA+C,0EAA0E,OAAO,kBAAkB;AAC3e,8CAA8C,eAAe,QAAQ,KAAK,IAAI,EAAE,4CAA4C,IAAI,SAAS,sBAAsB,iBAAiB,KAAK,KAAK,EAAE,4CAA4C,IAAI,SAAS,mBAAmB,6BAA6B,yCAAyC,QAAQ,SAAS,cAAc,WAAW,mBAAmB,+BAA+B,EAAE,UAAU,QAAQ,0CAA0C,UAAU,gBAAgB,QAAQ,0DAA0D;AACpkB,QAAQ,UAAU,yBAAyB,aAAa,QAAQ,sBAAsB,6CAA6C,0BAA0B,gBAAgB,iBAAiB,YAAY,IAAI,iCAAiC,+BAA+B,SAAS,UAAU,qJAAqJ,SAAS,gCAAgC,oBAAoB;AACnf,6KAA6K,QAAQ,aAAa,kBAAkB,EAAE,cAAc,0CAA0C,QAAQ,4BAA4B,IAAI,uBAAuB,KAAK,eAAe,YAAY,IAAI,yDAAyD,8BAA8B,SAAS,oBAAoB,iOAAiO;AACtsB,QAAQ,gBAAgB,gCAAgC,2gBAA2gB;AACnkB,UAAU,2BAA2B,0BAA0B,wCAAwC,UAAU,oBAAoB,mSAAmS,aAAa,SAAS,yFAAyF,OAAO;AAC9hB,WAAW,QAAQ,YAAY,gBAAgB,KAAK,gBAAgB,iGAAiG,+CAA+C,SAAS,mCAAmC,sMAAsM,OAAO,sBAAsB;AACne,MAAM,SAAS,oBAAoB,2QAA2Q,MAAM,QAAQ,SAAS,YAAY,gBAAgB,8CAA8C,6BAA6B,SAAS,UAAU,uJAAuJ;AACtlB,OAAO,sBAAsB,wBAAwB,kEAAkE,8BAA8B,SAAS,oBAAoB,0SAA0S,UAAU;AACte,oBAAoB,UAAU,6JAA6J,UAAU,gDAAgD,UAAU,2JAA2J,UAAU,oCAAoC,UAAU,2HAA2H;AAC7kB,SAAS,mBAAmB,UAAU,uJAAuJ,UAAU,qBAAqB,UAAU,sKAAsK,UAAU,mBAAmB,UAAU,2JAA2J;AAC9kB,SAAS,iBAAiB,cAAc,YAAY,gBAAgB,KAAK,kBAAkB,SAAS,mCAAmC,OAAO,cAAc,oCAAoC,KAAK,UAAU,sDAAsD,SAAS,UAAU,iQAAiQ;AACzhB,SAAS,qBAAqB,UAAU,sKAAsK,OAAO,SAAS,WAAW,QAAQ,kEAAkE,wJAAwJ,IAAI,4BAA4B,eAAe;AAC1f,6CAA6C,SAAS,UAAU,8QAA8Q,QAAQ,+BAA+B,oBAAoB,gMAAgM;AACzkB,OAAO,gCAAgC,UAAU,qHAAqH,SAAS,uBAAuB,oBAAoB,iKAAiK,YAAY,oBAAoB,UAAU,wZAAwZ;AAC7zB,SAAS,aAAa,kBAAkB,kBAAkB,qEAAqE,iBAAiB,WAAW,QAAQ,YAAY,qBAAqB,EAAE,6CAA6C,gBAAgB,KAAK,IAAI,sBAAsB,aAAa,aAAa,IAAI,MAAM,gBAAgB,sBAAsB,+CAA+C,SAAS,oBAAoB,wUAAwU;AAChwB,OAAO,aAAa,mDAAmD,SAAS,oBAAoB,6QAA6Q,SAAS,sBAAsB,yBAAyB,kEAAkE,8BAA8B;AACzgB,QAAQ,oBAAoB,2SAA2S,QAAQ,+BAA+B,oBAAoB,gMAAgM;AAClkB,YAAY,oBAAoB,UAAU,6aAA6a,SAAS,oBAAoB,EAAE;AACtf,WAAW,0BAA0B,WAAW,wBAAwB,aAAa,KAAK,UAAU,EAAE,kCAAkC,gBAAgB,4DAA4D,IAAI,IAAI,mDAAmD,KAAK,QAAQ,IAAI,EAAE,KAAK,aAAa,KAAK,aAAa,MAAM,QAAQ,oBAAoB,KAAK,qDAAqD,IAAI,SAAS,KAAK,aAAa,KAAK;AACtc,QAAQ,wCAAwC,SAAS,iEAAiE,+eAA+e;AACzmB,QAAQ,uBAAuB,oBAAoB,kKAAkK,QAAQ,oBAAoB,EAAE,iBAAiB,0BAA0B,2BAA2B,YAAY,aAAa,KAAK,SAAS,EAAE,iCAAiC,gBAAgB,mDAAmD,aAAa,IAAI;AACvd,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,aAAa,KAAK,eAAe,IAAI,QAAQ,mBAAmB,KAAK,mDAAmD,IAAI,QAAQ,KAAK,aAAa,KAAK,yDAAyD,8BAA8B,SAAS,iEAAiE,+ZAA+Z;AACrvB,YAAY,SAAS,wBAAwB,WAAW,QAAQ,QAAQ,sBAAsB,KAAK,IAAI,EAAE,gBAAgB,WAAW,yBAAyB,gBAAgB,mDAAmD,cAAc,uFAAuF,wDAAwD,8BAA8B,SAAS,qCAAqC,8MAA8M;AACvpB,YAAY,kFAAkF,oBAAoB,uSAAuS,QAAQ,uBAAuB,oBAAoB,0LAA0L;AACtoB,UAAU,0CAA0C,UAAU,oJAAoJ,QAAQ,QAAQ,0CAA0C,SAAS,YAAY,IAAI,KAAK,kBAAkB,kEAAkE,+BAA+B,SAAS,UAAU,oLAAoL;AACpmB,OAAO,gCAAgC,UAAU,qHAAqH,QAAQ,SAAS,oDAAoD,wBAAwB,4CAA4C,0BAA0B,UAAU,qDAAqD,iBAAiB,IAAI,SAAS,IAAI,uBAAuB,+BAA+B,SAAS,UAAU;AACnf,sJAAsJ,eAAe,SAAS,kBAAkB,cAAc,YAAY,IAAI,MAAM,oBAAoB,kHAAkH,wBAAwB;AAClY,aAAa,4CAA4C,EAAE,QAAQ,UAAU,KAAK,qBAAqB,0BAA0B,YAAY,mBAAmB,SAAS,UAAU,gNAAgN,EAAE,oDAAoD,wBAAwB,cAAc,cAAc,YAAY;AACzf,yBAAyB,4CAA4C,UAAU,4DAA4D,QAAQ,gCAAgC,EAAE,qDAAqD,iBAAiB,aAAa,aAAa,cAAc,cAAc,8BAA8B,kHAAkH,uBAAuB,uBAAuB;AAC/e,gDAAgD,+BAA+B,UAAU,gBAAgB,4JAA4J,mBAAmB,gEAAgE,IAAI,EAAE,oBAAoB,IAAI,iBAAiB,WAAW,aAAa,yBAAyB,oBAAoB,QAAQ,MAAM,gBAAgB,IAAI,MAAM;AACpf,uEAAuE,wPAAwP,eAAe,SAAS,+BAA+B,WAAW;AACjY,mEAAmE,4BAA4B,QAAQ,oDAAoD,sBAAsB,KAAK,KAAK,UAAU,qBAAqB,qBAAqB,gDAAgD,QAAQ,IAAI,iBAAiB,wBAAwB,iBAAiB,KAAK,yBAAyB,KAAK,GAAG,yBAAyB,8BAA8B,uBAAuB,uBAAuB;AAChf,GAAG,eAAe,wBAAwB,uBAAuB,oBAAoB,SAAS,QAAQ,QAAQ,yBAAyB,2DAA2D,eAAe,uBAAuB,qBAAqB,uCAAuC,qCAAqC,8DAA8D,kBAAkB,eAAe,oDAAoD,wBAAwB;AACpf,8DAA8D,mHAAmH,SAAS,gBAAgB,QAAQ;AAClN,KAAK,mDAAmD,gBAAgB,+CAA+C,gBAAgB,eAAe,4BAA4B,qCAAqC,aAAa,mEAAmE,kCAAkC,qCAAqC,OAAO;AACrX,gCAAgC,WAAW,0BAA0B,sBAAsB,YAAY,IAAI,KAAK,iCAAiC,mBAAmB,UAAU,aAAa,SAAS,eAAe,WAAW,gDAAgD,mBAAmB,iBAAiB,2BAA2B,8BAA8B,yBAAyB,qFAAqF,iBAAiB;AAC1e,kBAAkB,WAAW,6BAA6B,kBAAkB,EAAE,+BAA+B,uGAAuG,aAAa,qBAAqB,cAAc,uDAAuD,0DAA0D,WAAW,YAAY,IAAI,gBAAgB,gBAAgB,sBAAsB,+BAA+B,cAAc;AACnf,yHAAyH,gDAAgD,gBAAgB,2CAA2C,WAAW,2EAA2E,UAAU,QAAQ,kBAAkB,uBAAuB,uCAAuC,QAAQ,SAAS,cAAc,wBAAwB,UAAU,gBAAgB,QAAQ,6CAA6C;AACliB,QAAQ,UAAU,iCAAiC,QAAQ,aAAa,yKAAyK,EAAE,cAAc,0CAA0C,eAAe,KAAK,IAAI,wFAAwF,mEAAmE,SAAS,oBAAoB;AAC3f,8IAA8I,QAAQ,SAAS,+BAA+B,QAAQ,YAAY,IAAI,+DAA+D,8BAA8B,SAAS,UAAU,8EAA8E,EAAE,qDAAqD;AAC3c,CAAC,wBAAwB,cAAc,yBAAyB,gDAAgD,4DAA4D,QAAQ,gCAAgC,EAAE,eAAe,cAAc,sBAAsB,6CAA6C,cAAc,4DAA4D,gBAAgB,6CAA6C,WAAW;AACxc,YAAY,SAAS,kBAAkB,SAAS,wBAAwB,gHAAgH,YAAY,kBAAkB,2BAA2B,WAAW,YAAY,SAAS,gBAAgB,oCAAoC,SAAS,UAAU,+FAA+F,eAAe,gBAAgB,UAAU;AAChe,SAAS,0BAA0B,+EAA+E,sCAAsC,kBAAkB,sCAAsC,wBAAwB,cAAc,aAAa,sBAAsB,qBAAqB,yBAAyB,mCAAmC,wDAAwD,2BAA2B,qBAAqB,4DAA4D;AAC9gB,OAAO,+BAA+B,QAAQ,aAAa,EAAE,aAAa,wCAAwC,6GAA6G,+EAA+E,gCAAgC,kDAAkD,wBAAwB,mBAAmB;AAC3a,gCAAgC,YAAY,iCAAiC,gBAAgB,YAAY,WAAW,gCAAgC,gBAAgB,gBAAgB,QAAQ,iTAAiT;AAC7e,KAAK,4CAA4C,IAAI,GAAG,gBAAgB,6FAA6F,gBAAgB,4BAA4B,iBAAiB,GAAG,oCAAoC,sCAAsC,WAAW,mBAAmB,qBAAqB,MAAM,2GAA2G,iBAAiB;AACpe,YAAY,KAAK,MAAM,gCAAgC,iBAAiB,kEAAkE,EAAE,oBAAoB,UAAU,oFAAoF,yBAAyB,gBAAgB,SAAS,oBAAoB,oFAAoF,gBAAgB,mBAAmB,SAAS,kBAAkB;AACtd,UAAU,aAAa,uBAAuB,gBAAgB,kCAAkC,mBAAmB,wBAAwB,uBAAuB,uDAAuD,kHAAkH,kCAAkC,uBAAuB,eAAe,+DAA+D,yBAAyB,UAAU,cAAc,QAAQ,mBAAmB;AAC9hB,QAAQ,UAAU,oEAAoE,MAAM,WAAW,mDAAmD,SAAS,oBAAoB,qHAAqH,aAAa,WAAW,MAAM,aAAa,gEAAgE,0BAA0B,2BAA2B;AAC5c,4BAA4B,YAAY,gBAAgB,SAAS,SAAS,oBAAoB,4LAA4L,MAAM,WAAW,yBAAyB,0BAA0B,uBAAuB,kCAAkC,SAAS,oBAAoB,6KAA6K;AACjmB,SAAS,QAAQ,wBAAwB,yEAAyE,+BAA+B,iBAAiB,mCAAmC,SAAS,UAAU,oGAAoG,mCAAmC,OAAO,QAAQ,mBAAmB,SAAS,UAAU,iFAAiF,QAAQ,QAAQ,mBAAmB;AACxgB,QAAQ,UAAU,mFAAmF,SAAS,QAAQ,mBAAmB,SAAS,UAAU,6EAA6E,SAAS,WAAW,qFAAqF,SAAS,YAAY,uTAAuT;AAC9pB,OAAO,QAAQ,YAAY,gBAAgB,iCAAiC,gBAAgB,SAAS,UAAU,mEAAmE,OAAO,QAAQ,wBAAwB,SAAS,UAAU,uDAAuD,eAAe,UAAU,oBAAoB,2BAA2B,0DAA0D,+BAA+B,IAAI;AACxc,4BAA4B,QAAQ,SAAS,oBAAoB,8HAA8H,QAAQ,yBAAyB,gCAAgC,0BAA0B,uBAAuB,aAAa,gEAAgE,0BAA0B,YAAY,iBAAiB,cAAc,gDAAgD;AACnf,KAAK,+BAA+B,OAAO,MAAM,sCAAsC,gCAAgC,iBAAiB,WAAW,oDAAoD,EAAE,kBAAkB,uIAAuI,aAAa,gCAAgC,iBAAiB,mCAAmC,gBAAgB,cAAc;AACje,MAAM,sEAAsE,WAAW,mCAAmC,SAAS,UAAU,mCAAmC,wBAAwB,aAAa,MAAM,wNAAwN,+BAA+B,kBAAkB;AACpe,EAAE,WAAW,KAAK,WAAW,8EAA8E,+BAA+B,wBAAwB,MAAM,0BAA0B,WAAW,oLAAoL,iCAAiC,sBAAsB,QAAQ;AAChc,gEAAgE,kBAAkB,sBAAsB,aAAa,2FAA2F,mDAAmD,wBAAwB,kDAAkD,kBAAkB,0BAA0B,WAAW,mBAAmB,0BAA0B,oBAAoB;AACrc,gJAAgJ,mBAAmB,IAAI,4BAA4B,QAAQ,gDAAgD,yIAAyI,mCAAmC;AACva,6BAA6B,gBAAgB,yBAAyB,IAAI,IAAI,EAAE,SAAS,8GAA8G,iDAAiD,gBAAgB,0CAA0C,sCAAsC,gBAAgB,0EAA0E,qBAAqB;AACvc,iEAAiE,yCAAyC,UAAU,6BAA6B,mCAAmC,uBAAuB,gCAAgC,kCAAkC,gCAAgC,mCAAmC,gBAAgB,gBAAgB,oCAAoC,WAAW,gBAAgB,sCAAsC,UAAU,gBAAgB;AAC/e,GAAG,WAAW,gBAAgB,8CAA8C,aAAa,8BAA8B,qBAAqB,eAAe,uCAAuC,WAAW,yBAAyB,YAAY,wBAAwB,qBAAqB,UAAU,yBAAyB,YAAY,wBAAwB,oBAAoB,eAAe,gEAAgE;AACzc,yCAAyC,yBAAyB,kEAAkE,WAAW,yBAAyB,YAAY,wBAAwB,oCAAoC,yBAAyB,eAAe,qCAAqC,yBAAyB,4CAA4C,sCAAsC,yBAAyB,eAAe;AAChd,2HAA2H,6BAA6B,SAAS,wBAAwB,UAAU,UAAU,gDAAgD,0DAA0D,OAAO,qBAAqB,8CAA8C,SAAS,UAAU,iFAAiF,QAAQ;AAC7e,QAAQ,oFAAoF,SAAS,UAAU,mFAAmF,SAAS,uBAAuB,yDAAyD,SAAS,UAAU,+EAA+E,eAAe,gBAAgB,2BAA2B,SAAS,SAAS,4BAA4B;AACre,MAAM,sBAAsB,oEAAoE,EAAE,SAAS,iBAAiB,OAAO,uGAAuG,EAAE,kEAAkE,wBAAwB,kGAAkG,qCAAqC,8BAA8B,QAAQ;AACnf,uEAAuE,yCAAyC,yCAAyC,OAAO,sIAAsI,8BAA8B,YAAY,SAAS,qBAAqB,qDAAqD,UAAU,6BAA6B,MAAM;AAChd,0CAA0C,mBAAmB,sCAAsC,gBAAgB,mCAAmC,aAAa,gCAAgC,WAAW,8BAA8B,0BAA0B,oDAAoD,oDAAoD,oBAAoB,oDAAoD,oDAAoD,kBAAkB;AAC5f,2BAA2B,oBAAoB,UAAU,KAAK,WAAW,2EAA2E,SAAS,YAAY,mFAAmF,OAAO,QAAQ,2EAA2E,SAAS,UAAU,iFAAiF,QAAQ,QAAQ;AAC1c,IAAI,SAAS,UAAU,mFAAmF,SAAS,QAAQ,6EAA6E,SAAS,UAAU,qFAAqF,OAAO,QAAQ,2EAA2E,SAAS,UAAU,uDAAuD,QAAQ;AAC5d,mKAAmK,kCAAkC,QAAQ,gCAAgC,EAAE,eAAe,0DAA0D,8BAA8B,uCAAuC,uCAAuC,uCAAuC,kDAAkD;AAC7f,OAAO,iEAAiE,qHAAqH,mBAAmB,mBAAmB,mBAAmB,0GAA0G;AAChW,kBAAkB,wBAAwB,sFAAsF,4DAA4D,mBAAmB,MAAM,sCAAsC,+GAA+G,2FAA2F,gDAAgD;AACrf,SAAS,QAAQ,SAAS,4EAA4E,SAAS,WAAW,SAAS,SAAS,4EAA4E,SAAS,WAAW,UAAU,SAAS,4EAA4E,SAAS,YAAY,UAAU,MAAM,OAAO,sBAAsB,OAAO,OAAO,sBAAsB,OAAO,OAAO,sBAAsB,UAAU,OAAO,qBAAqB;AAC3f,QAAQ,4CAA4C,EAAE,gEAAgE,wBAAwB,mBAAmB,4BAA4B,QAAQ,iEAAiE,wCAAwC,2CAA2C,sBAAsB;AAC/W,kBAAkB,yBAAyB,oFAAoF,0BAA0B,iEAAiE,UAAU,UAAU,OAAO,yBAAyB,iCAAiC,EAAE,kEAAkE,wBAAwB,mBAAmB,4BAA4B,QAAQ;AAClc,aAAa,yCAAyC,4CAA4C,sBAAsB;AACxH,kBAAkB,oGAAoG,yBAAyB,UAAU,UAAU,OAAO,yBAAyB,iCAAiC,EAAE,eAAe,gBAAgB,mBAAmB,iCAAiC,aAAa,MAAM,6CAA6C,eAAe,sCAAsC,OAAO,OAAO,mCAAmC;AAC/d,gBAAgB,mBAAmB,iCAAiC,aAAa,MAAM,0DAA0D,OAAO,OAAO,cAAc,kDAAkD,gBAAgB,kBAAkB,eAAe,+EAA+E,aAAa,mCAAmC,gBAAgB,mBAAmB,iCAAiC,aAAa,MAAM;AACte,+EAA+E,OAAO,OAAO,sDAAsD,kDAAkD,gBAAgB,mBAAmB,iCAAiC,aAAa,MAAM,4CAA4C,wBAAwB,+DAA+D,wBAAwB,eAAe,4CAA4C,iBAAiB;AACngB,OAAO,mCAAmC,kDAAkD,gBAAgB,mBAAmB,iCAAiC,aAAa,MAAM,wGAAwG,OAAO,OAAO,sDAAsD,kDAAkD,cAAc,+DAA+D,cAAc;AAC5e,uEAAuE,cAAc,2CAA2C,iDAAiD,wBAAwB,+EAA+E,MAAM,+CAA+C,uBAAuB,mCAAmC,KAAK,8BAA8B,mDAAmD,SAAS,QAAQ;AAC9e;AACA,KAAK,6CAA6C,WAAW,eAAe,6EAA6E,aAAa,wLAAwL,+DAA+D;AAC7Z,IAAI,KAAK,gGAAgG,yBAAyB,2DAA2D,iCAAiC,mJAAmJ,2BAA2B;AAC5Y,2BAA2B,6CAA6C,uBAAuB,QAAQ,SAAS,oRAAoR,cAAc,YAAY,aAAa,uDAAuD;AACle,uGAAuG,gCAAgC,iBAAiB,eAAe,2DAA2D,iBAAiB,eAAe,qEAAqE,WAAW,kBAAkB;AACpW,4FAA4F,mFAAmF,8HAA8H,gCAAgC,uBAAuB;AACpW,IAAI,0MAA0M,oCAAoC,qCAAqC,aAAa,uCAAuC,wGAAwG,MAAM,gDAAgD;AACze,6DAA6D,mBAAmB,6CAA6C,sBAAsB,qFAAqF,eAAe,0HAA0H,6EAA6E;AAC9b,cAAc,yDAAyD,iDAAiD,WAAW,mCAAmC,UAAU,MAAM,gDAAgD,OAAO,OAAO,8BAA8B,gDAAgD,UAAU,WAAW,gBAAgB,UAAU,sEAAsE,aAAa,QAAQ;AAC5c,GAAG,SAAS,UAAU,yIAAyI,WAAW,QAAQ,2EAA2E,SAAS,YAAY,8xBAA8xB;AAChjC,WAAW,gBAAgB,UAAU,6DAA6D,YAAY,gBAAgB,UAAU,2DAA2D,WAAW,gBAAgB,UAAU,6DAA6D,YAAY,SAAS,sBAAsB,SAAS,oBAAoB,uHAAuH,iBAAiB,QAAQ,2DAA2D;AACxjB,QAAQ,UAAU,kDAAkD,aAAa,mDAAmD,UAAU,gEAAgE,QAAQ,UAAU,0DAA0D,8CAA8C,SAAS,WAAW,2CAA2C,+BAA+B,qCAAqC;AAC3c,+EAA+E,sEAAsE,oBAAoB,kBAAkB,mBAAmB,+DAA+D,sHAAsH,iCAAiC,EAAE,mDAAmD,qBAAqB;AAC9e,cAAc,eAAe,6BAA6B,2CAA2C,sCAAsC,6BAA6B,2FAA2F,mCAAmC,gFAAgF,KAAK,+FAA+F;AAC1d,sDAAsD,KAAK,+FAA+F,mFAAmF,KAAK,+FAA+F,2BAA2B,oBAAoB,oBAAoB,cAAc,wBAAwB;AAC1b,eAAe,kEAAkE,sGAAsG,QAAQ,WAAW,MAAM,sBAAsB,QAAQ,sEAAsE,+FAA+F,aAAa,gBAAgB,iBAAiB,KAAK,oCAAoC;AAC1e,iBAAiB,iBAAiB,iBAAiB,KAAK,kKAAkK,wCAAwC,YAAY,+BAA+B,6BAA6B,0DAA0D,qBAAqB,8BAA8B,iDAAiD;AACxe,EAAE,sCAAsC;AACxC,mDAAmD,iDAAiD,6CAA6C,6BAA6B,QAAQ,KAAK,iDAAiD,+BAA+B,sDAAsD,eAAe,wDAAwD,EAAE,kCAAkC,eAAe,kCAAkC;AAC7d,CAAC,wBAAwB,0EAA0E,6BAA6B,wPAAwP,iCAAiC,oCAAoC,iCAAiC,MAAM;AACpe,eAAe,2BAA2B,yFAAyF,UAAU,wFAAwF,WAAW,0FAA0F,QAAQ,+BAA+B,UAAU,YAAY,QAAQ,iBAAiB,SAAS,YAAY,QAAQ,2EAA2E;AACxgB,mDAAmD,+DAA+D,GAAG,uBAAuB,EAAE,gEAAgE,GAAG,uBAAuB,EAAE,eAAe,aAAa,qCAAqC,cAAc,mBAAmB,eAAe,MAAM,8CAA8C;AAC/Y,CAAC,sDAAsD,eAAe,cAAc,aAAa,qBAAqB,2IAA2I,uBAAuB,gBAAgB,sFAAsF;AAC9X,qKAAqK,gBAAgB,iEAAiE,sFAAsF;AAC5U,IAAI,gBAAgB,sFAAsF,yCAAyC,gJAAgJ,UAAU,wCAAwC,gDAAgD,gCAAgC,gBAAgB;AACrb,iGAAiG,sBAAsB,8IAA8I,gCAAgC,4BAA4B,UAAU,aAAa,cAAc,cAAc,MAAM,SAAS,EAAE,qDAAqD,wBAAwB;AACld,+BAA+B,gCAAgC,4BAA4B,iDAAiD,KAAK,kCAAkC,sDAAsD,QAAQ,sIAAsI,eAAe,WAAW,uBAAuB;AACxa,2BAA2B,mBAAmB,MAAM,4CAA4C,aAAa,oFAAoF,qGAAqG,OAAO,6CAA6C,kCAAkC,mCAAmC,MAAM,IAAI,wBAAwB;AACjc,OAAO,2CAA2C,sCAAsC,2HAA2H,mIAAmI,2BAA2B,8FAA8F;AAC/c,uBAAuB,QAAQ,SAAS,UAAU,aAAa,iCAAiC,4HAA4H,qGAAqG,sBAAsB,2CAA2C;AAClY,wbAAwb,+CAA+C,eAAe,sCAAsC;AAC5hB,cAAc,qCAAqC,WAAW,kBAAkB,iBAAiB,gBAAgB,iBAAiB,iBAAiB,6HAA6H,UAAU,MAAM,gDAAgD,OAAO,OAAO,gCAAgC,gDAAgD,UAAU,WAAW,gBAAgB,UAAU,+EAA+E;AAC5iB,WAAW,QAAQ,qBAAqB,SAAS,UAAU,gFAAgF,YAAY,SAAS,sBAAsB,SAAS,oBAAoB,8KAA8K,aAAa,QAAQ,qDAAqD,SAAS,UAAU;AAC9d,+CAA+C,iBAAiB,QAAQ,oCAAoC,SAAS,UAAU,kDAAkD,aAAa,mDAAmD,UAAU,iEAAiE,EAAE,sDAAsD,4CAA4C;AACha,OAAO,gDAAgD,uBAAuB,0BAA0B,+CAA+C,8BAA8B,+CAA+C,mCAAmC,kBAAkB,oBAAoB,qDAAqD,kEAAkE,iBAAiB,oBAAoB,iCAAiC;AAC1e,cAAc,6BAA6B,mBAAmB,gCAAgC,qCAAqC,qCAAqC,4BAA4B,uBAAuB,gEAAgE,qBAAqB,0BAA0B,wBAAwB,uCAAuC,GAAG,0DAA0D,wCAAwC,KAAK;AACnf,qBAAqB,6BAA6B,oCAAoC,6BAA6B,uCAAuC,4BAA4B,qBAAqB,4CAA4C,gEAAgE,UAAU,iCAAiC,eAAe,cAAc,UAAU,gCAAgC,6BAA6B;AACtc,WAAW,kBAAkB,uEAAuE,oBAAoB,+BAA+B,SAAS,gBAAgB,mBAAmB,8BAA8B,aAAa,YAAY,gCAAgC,oCAAoC,4BAA4B,eAAe,qIAAqI;AAC9e,aAAa,IAAI,sDAAsD,mBAAmB,oBAAoB,kBAAkB,oBAAoB,SAAS,4EAA4E,MAAM,OAAO,YAAY,YAAY,mFAAmF,mCAAmC,oBAAoB,iBAAiB,IAAI,QAAQ,sBAAsB;AAC3c,MAAM,KAAK,wBAAwB,gBAAgB,kBAAkB,KAAK,2CAA2C,gBAAgB,eAAe,mCAAmC,kBAAkB,QAAQ,kCAAkC,kCAAkC,UAAU,sKAAsK,SAAS,sBAAsB,KAAK,UAAU;AACnf,cAAc,MAAM,MAAM,cAAc,MAAM,MAAM,oDAAoD,KAAK,MAAM,MAAM,2CAA2C,oBAAoB,6BAA6B,+BAA+B,KAAK,+BAA+B,mCAAmC,qBAAqB,0BAA0B,2CAA2C,MAAM,wCAAwC,uBAAuB,SAAS;AACne,qCAAqC,0BAA0B,mGAAmG,YAAY,YAAY,QAAQ,gLAAgL,mDAAmD,sDAAsD;AAC3d,kDAAkD,2CAA2C,+EAA+E,aAAa,WAAW,WAAW,4DAA4D,mCAAmC,kGAAkG,yDAAyD,KAAK;AAC9c,sHAAsH,2DAA2D,sFAAsF,IAAI,wJAAwJ;AACna,0BAA0B,yDAAyD,yDAAyD,eAAe,eAAe,eAAe,SAAS,qBAAqB,0BAA0B,yHAAyH,iDAAiD,2BAA2B,aAAa,oBAAoB,kBAAkB,OAAO;AAChf,EAAE,WAAW,gBAAgB,gBAAgB,wCAAwC,4JAA4J,qCAAqC,SAAS,UAAU,gEAAgE,WAAW,iEAAiE,YAAY;AACjc,CAAC,eAAe,mDAAmD,eAAe,qDAAqD,WAAW,4BAA4B,qUAAqU;AACnf,CAAC,8BAA8B,uEAAuE,iBAAiB,8DAA8D,2BAA2B,8DAA8D,cAAc,8EAA8E,eAAe,uFAAuF,sBAAsB,UAAU;AAChf,UAAU,kBAAkB,4MAA4M,kBAAkB,sFAAsF,iCAAiC,UAAU,MAAM,OAAO,wCAAwC,0CAA0C,OAAO,OAAO,wCAAwC;AAChhB,+CAA+C,UAAU,WAAW,QAAQ,oDAAoD,SAAS,UAAU,kIAAkI,iBAAiB,QAAQ,iGAAiG,SAAS,UAAU,0CAA0C,aAAa,SAAS;AACle,2DAA2D,SAAS,UAAU,qGAAqG,EAAE,yDAAyD,mFAAmF,6DAA6D,kCAAkC,iBAAiB,mDAAmD;AACpe,2EAA2E,uHAAuH,QAAQ,yCAAyC,+BAA+B,WAAW,KAAK,2BAA2B,WAAW,KAAK,wBAAwB,6FAA6F,2CAA2C;AAC7e,kBAAkB,iBAAiB,4EAA4E,gCAAgC,mBAAmB,uBAAuB,qEAAqE,+FAA+F,IAAI,wBAAwB,mGAAmG,KAAK,WAAW,KAAK,MAAM;AACvf,0EAA0E,QAAQ,WAAW,KAAK,qFAAqF,iBAAiB,sBAAsB,YAAY,kHAAkH,EAAE,iBAAiB,sBAAsB,gBAAgB,mBAAmB,qBAAqB,gBAAgB,eAAe;AAC5d,CAAC,4BAA4B,sDAAsD,sCAAsC,sCAAsC,aAAa,YAAY,YAAY,QAAQ,wMAAwM,kCAAkC,qCAAqC,kCAAkC;AAC7f,KAAK,mHAAmH,wDAAwD,qBAAqB,iFAAiF,+DAA+D,gDAAgD,8BAA8B,UAAU,OAAO,OAAO,mBAAmB,OAAO,OAAO,kBAAkB,OAAO,OAAO,mBAAmB;AAC/gB,SAAS,SAAS,kBAAkB,uDAAuD,uEAAuE,OAAO,sBAAsB,uBAAuB,oGAAoG;AAC1T,sBAAsB,YAAY,QAAQ,oBAAoB,MAAM,uNAAuN,uCAAuC,0FAA0F,sDAAsD;AACld,aAAa,OAAO,uBAAuB,iBAAiB,gEAAgE,iKAAiK,OAAO,uBAAuB,oBAAoB,KAAK,sBAAsB,6BAA6B,4BAA4B,eAAe,KAAK,sBAAsB,0BAA0B,eAAe;AACtf,EAAE,UAAU,aAAa,IAAI,WAAW,QAAQ,gCAAgC,EAAE,8CAA8C,gBAAgB,iKAAiK,2KAA2K,OAAO,gBAAgB;AACnf,GAAG,cAAc,mBAAmB,2FAA2F,cAAc,+HAA+H,SAAS,KAAK,gDAAgD,wBAAwB,uEAAuE;AACza,WAAW,YAAY,WAAW,4BAA4B,8BAA8B,gBAAgB,QAAQ,mPAAmP,gCAAgC,mCAAmC,iBAAiB,mCAAmC;AAC9d,KAAK,2EAA2E,gBAAgB,4DAA4D,gBAAgB,uKAAuK,iBAAiB,yBAAyB,iBAAiB,sEAAsE,WAAW,mBAAmB;AAClf,GAAG,+EAA+E,UAAU,qIAAqI,qEAAqE,qEAAqE,wFAAwF,yFAAyF;AAC5hB,0BAA0B,0CAA0C,uBAAuB,4CAA4C,sBAAsB,qCAAqC,uBAAuB,oDAAoD,oCAAoC,2BAA2B,6EAA6E,+BAA+B;AACxb,aAAa,8BAA8B,kEAAkE,+BAA+B,2BAA2B,uFAAuF,cAAc,uBAAuB,gBAAgB,OAAO,8BAA8B,UAAU,KAAK,SAAS,gBAAgB,6BAA6B,SAAS,UAAU,wGAAwG;AACxhB,OAAO,QAAQ,iBAAiB,6BAA6B,SAAS,UAAU,yDAAyD,OAAO,QAAQ,uBAAuB,SAAS,UAAU,sDAAsD,UAAU,SAAS,OAAO,oBAAoB,6BAA6B,SAAS,UAAU,qHAAqH,aAAa,YAAY;AACpe,uFAAuF,SAAS,UAAU,8IAA8I,oBAAoB,YAAY,8GAA8G,SAAS,UAAU,wEAAwE,eAAe,YAAY,yCAAyC;AACriB,QAAQ,UAAU,sHAAsH,sBAAsB,YAAY,+DAA+D,oBAAoB,6BAA6B,EAAE,SAAS,UAAU,gFAAgF,aAAa,SAAS,kEAAkE,4EAA4E;AACniB,6BAA6B,SAAS,UAAU,wEAAwE,WAAW,SAAS,yDAAyD,oDAAoD,SAAS,UAAU,oEAAoE,aAAa,SAAS,yDAAyD,oDAAoD,SAAS,UAAU;AACte,qDAAqD,MAAM,QAAQ,8EAA8E,8DAA8D,SAAS,UAAU,wGAAwG,SAAS,SAAS,aAAa,+EAA+E,kCAAkC,SAAS,UAAU;AAC7e,oCAAoC,2EAA2E,uBAAuB,SAAS,MAAM,uDAAuD,IAAI,yCAAyC,QAAQ,SAAS,UAAU,4IAA4I,8BAA8B,SAAS;AACvc,2FAA2F,SAAS,UAAU,wFAAwF,QAAQ,YAAY,wBAAwB,4EAA4E,SAAS,UAAU,4GAA4G,SAAS,YAAY;AACld,kDAAkD,SAAS,UAAU,yEAAyE,wBAAwB,aAAa,2BAA2B,YAAY,0BAA0B,YAAY,8BAA8B,sBAAsB,4FAA4F,gBAAgB,0BAA0B,aAAa,+BAA+B,YAAY;AAClf,wBAAwB,uBAAuB,SAAS,0BAA0B,gDAAgD,oBAAoB,EAAE,qBAAqB,gCAAgC,kEAAkE,kCAAkC,SAAS,8BAA8B,oCAAoC,WAAW,gGAAgG,IAAI,UAAU;AACrf,gBAAgB,uCAAuC,qCAAqC,2CAA2C,WAAW,qEAAqE,6BAA6B,8BAA8B,gDAAgD,8CAA8C,EAAE,eAAe,gDAAgD,gBAAgB,EAAE,gBAAgB,YAAY,EAAE,EAAE;AACne,gBAAgB,2BAA2B,4DAA4D,wBAAwB,mBAAmB,4IAA4I,WAAW,YAAY,WAAW,4BAA4B,8BAA8B,gBAAgB,QAAQ;AAClZ,UAAU,iBAAiB,0BAA0B,cAAc,YAAY,WAAW,KAAK,kCAAkC,iCAAiC,yBAAyB,aAAa,uEAAuE,sCAAsC,yCAAyC,OAAO;AACrW,gCAAgC,mLAAmL,UAAU,qBAAqB,eAAe,QAAQ,gGAAgG;AACzW,sEAAsE,sBAAsB,kBAAkB,6BAA6B,sEAAsE,QAAQ,SAAS,GAAG,IAAI,EAAE,6EAA6E,GAAG,4CAA4C,UAAU,wBAAwB,EAAE,6DAA6D;AACxc,CAAC,wBAAwB,cAAc,yBAAyB,aAAa,yDAAyD,4DAA4D,QAAQ,gCAAgC,EAAE,eAAe,+BAA+B,wFAAwF,6CAA6C,+CAA+C;AAC9c,sBAAsB,8CAA8C,+CAA+C,+FAA+F,MAAM,0MAA0M;AACla,8CAA8C,wKAAwK,+BAA+B,eAAe,sDAAsD,uBAAuB,WAAW,QAAQ,8DAA8D,8DAA8D;AAChe,uBAAuB,8BAA8B,eAAe,uBAAuB,yCAAyC,4BAA4B,6FAA6F,sDAAsD,oDAAoD,kEAAkE;AACza,4CAA4C,oBAAoB,MAAM,sBAAsB,eAAe,2BAA2B,iEAAiE,qBAAqB,mBAAmB,sCAAsC,+CAA+C,UAAU,UAAU,OAAO,8CAA8C,UAAU,SAAS,QAAQ,8CAA8C;AACtd,yCAAyC,gHAAgH,SAAS,UAAU,6DAA6D,QAAQ,eAAe,mBAAmB,kBAAkB,0CAA0C,uCAAuC,yCAAyC,gBAAgB,wBAAwB,uCAAuC,YAAY;AAC1f,sCAAsC,oCAAoC,aAAa,8CAA8C,6CAA6C,mBAAmB,qEAAqE,gDAAgD,iFAAiF,iBAAiB,gDAAgD,0CAA0C;AACtf,gDAAgD,EAAE,uDAAuD,eAAe,8BAA8B,4CAA4C,qBAAqB,KAAK,sCAAsC,KAAK,YAAY,WAAW,aAAa,OAAO,iBAAiB,YAAY,mCAAmC,wBAAwB,qEAAqE,8BAA8B;AAC7e,OAAO,YAAY,4BAA4B,KAAK,OAAO,6CAA6C,WAAW,4BAA4B,yHAAyH,gBAAgB,uCAAuC,MAAM,uDAAuD,SAAS,QAAQ,gBAAgB,oDAAoD,eAAe;AAChe,KAAK,wCAAwC,UAAU,YAAY,QAAQ,2EAA2E,SAAS,YAAY,kBAAkB,mDAAmD,EAAE,UAAU,uEAAuE,eAAe,8DAA8D,gCAAgC,MAAM,MAAM;AAC5b,iBAAiB,0BAA0B,mBAAmB,mBAAmB,yBAAyB,kBAAkB,iBAAiB,sBAAsB,uBAAuB,0CAA0C,mCAAmC,qBAAqB,QAAQ,KAAK,8EAA8E,eAAe,WAAW,mBAAmB,sCAAsC,oBAAoB,SAAS;AACve,0BAA0B,qBAAqB,wCAAwC,4CAA4C,gDAAgD,gBAAgB,8BAA8B,8DAA8D,4CAA4C,UAAU,MAAM,SAAS,8BAA8B,SAAS,UAAU,qGAAqG;AAC1f,6DAA6D,uCAAuC,iDAAiD,gBAAgB,4CAA4C,UAAU,qEAAqE,eAAe,gCAAgC,MAAM,wEAAwE,YAAY,8BAA8B,eAAe;AACtd,oCAAoC,+CAA+C,gDAAgD,KAAK,6GAA6G,oFAAoF,qFAAqF,4CAA4C,qCAAqC;AAC/e,0BAA0B,8CAA8C,mBAAmB,YAAY,gDAAgD,aAAa,oEAAoE,0CAA0C,wCAAwC,8HAA8H,6CAA6C,OAAO,mBAAmB,SAAS;AACxgB,8EAA8E,kFAAkF,UAAU,qCAAqC,oEAAoE,SAAS,EAAE,mEAAmE,qEAAqE,EAAE,gEAAgE,YAAY,6BAA6B;AACjhB,iEAAiE,EAAE,iEAAiE,mBAAmB,EAAE,iEAAiE,SAAS,EAAE,iEAAiE,qBAAqB,4EAA4E,uCAAuC,+CAA+C;AAC7d,oBAAoB,sBAAsB,SAAS,EAAE,0CAA0C,iBAAiB,sBAAsB,sBAAsB,wDAAwD,iCAAiC,oBAAoB,mCAAmC,0CAA0C,QAAQ,6BAA6B,SAAS,6BAA6B,KAAK;AACta,8BAA8B,qEAAqE,6CAA6C,EAAE,sEAAsE,gIAAgI,SAAS,oBAAoB,oBAAoB,8CAA8C,8BAA8B,EAAE;AACvd,oCAAoC,sBAAsB,kBAAkB,4EAA4E,6BAA6B,EAAE,+DAA+D,gCAAgC,EAAE,qEAAqE,kBAAkB,EAAE,kEAAkE,+BAA+B;AACld,mBAAmB,4EAA4E,8DAA8D,mEAAmE,+DAA+D,6BAA6B,EAAE,mDAAmD,eAAe,kBAAkB,6BAA6B,MAAM;AACrb,2DAA2D,yDAAyD,SAAS,QAAQ,WAAW,mCAAmC,8BAA8B,wBAAwB,KAAK,sEAAsE,8BAA8B,oDAAoD,kDAAkD,sDAAsD;AAC9e,sCAAsC,uDAAuD,mDAAmD,qDAAqD,6BAA6B,QAAQ,iCAAiC,SAAS,6BAA6B,sBAAsB,yBAAyB,EAAE,SAAS,gEAAgE,KAAK,QAAQ,aAAa,qCAAqC,SAAS;AACnf,iCAAiC,yHAAyH,2EAA2E,0BAA0B,qDAAqD,4BAA4B,+BAA+B,2FAA2F;AAC1c,6BAA6B,QAAQ,MAAM,UAAU,iDAAiD,6BAA6B,yHAAyH,sDAAsD,oDAAoD,kDAAkD,qDAAqD,2BAA2B;AACxe,iDAAiD,2BAA2B,0BAA0B,iDAAiD,eAAe,kBAAkB,6CAA6C,6CAA6C,6CAA6C,sCAAsC,uBAAuB,wFAAwF,WAAW;AAC/d,4DAA4D,IAAI,oCAAoC,aAAa,IAAI,oCAAoC,KAAK,mBAAmB,iBAAiB,iBAAiB,wCAAwC,mBAAmB,mDAAmD,UAAU,sBAAsB,mDAAmD,OAAO,OAAO,OAAO,sCAAsC,cAAc;AAC7d,uDAAuD,qDAAqD,8BAA8B,aAAa,YAAY,YAAY,SAAS,QAAQ;AAChM,YAAY,kCAAkC,qCAAqC,yBAAyB,MAAM,yCAAyC,kCAAkC,iCAAiC,qBAAqB,yGAAyG,2BAA2B,wDAAwD,WAAW,mBAAmB,WAAW,yBAAyB,gBAAgB;AACjgB,OAAO,YAAY,WAAW,yDAAyD,SAAS,aAAa,qBAAqB,iBAAiB,2BAA2B,8BAA8B,yBAAyB,4FAA4F,iBAAiB,qCAAqC,oBAAoB,wBAAwB,aAAa,EAAE,KAAK,sBAAsB,2BAA2B;AACxe,WAAW,uCAAuC,kFAAkF,sCAAsC,wGAAwG,UAAU,OAAO,OAAO,wCAAwC,OAAO,OAAO,uCAAuC,OAAO,OAAO,wCAAwC,UAAU,cAAc,QAAQ,mBAAmB,SAAS,UAAU;AACngB,gDAAgD,QAAQ,SAAS,QAAQ,YAAY,gBAAgB,uDAAuD,8BAA8B,SAAS,UAAU,mGAAmG,QAAQ,SAAS,YAAY,gBAAgB,mFAAmF;AAChb,CAAC,SAAS,UAAU,qJAAqJ,QAAQ,aAAa,wBAAwB,QAAQ,gCAAgC,EAAE,oDAAoD,wBAAwB,cAAc,cAAc,YAAY,gCAAgC,UAAU,4DAA4D,QAAQ,gCAAgC;AAClgB,uDAAuD,wBAAwB,cAAc,+BAA+B,YAAY,gCAAgC,UAAU,0DAA0D,QAAQ,gCAAgC,EAAE,mDAAmD,WAAW,iCAAiC,eAAe,8DAA8D,0BAA0B;AAC5d,iBAAiB,cAAc,YAAY,aAAa,4DAA4D,kFAAkF,EAAE,yDAAyD,QAAQ;AACzQ,YAAY,0GAA0G,mBAAmB,gCAAgC,8EAA8E,uBAAuB,iCAAiC,WAAW,EAAE,6DAA6D,eAAe,yDAAyD,0BAA0B,aAAa;AACxe,EAAE,aAAa,4HAA4H,yDAAyD,QAAQ,iKAAiK,qFAAqF,iCAAiC;AACne,0EAA0E,uBAAuB,+BAA+B,UAAU,QAAQ,gBAAgB,MAAM,wEAAwE,gEAAgE,EAAE,yDAAyD,eAAe,mDAAmD,0BAA0B,aAAa,cAAc,aAAa;AAC/e,mGAAmG,+CAA+C,UAAU,gEAAgE,yDAAyD,QAAQ,yMAAyM;AACte,gCAAgC,iCAAiC,OAAO,WAAW,YAAY,WAAW,gCAAgC,oEAAoE,uBAAuB,4BAA4B,WAAW,EAAE,mDAAmD,eAAe,4DAA4D,wBAAwB,0BAA0B,YAAY,YAAY,aAAa,mBAAmB;AACtf,kGAAkG,mDAAmD,cAAc,EAAE,0DAA0D,QAAQ,sFAAsF,2EAA2E,wCAAwC,OAAO,qDAAqD;AAC5e,wCAAwC,8KAA8K,0EAA0E,uBAAuB,8BAA8B,UAAU,UAAU,iBAAiB,iBAAiB,0EAA0E,SAAS,aAAa,EAAE;AAC7e,GAAG,mDAAmD,wBAAwB,cAAc,sCAAsC,EAAE,aAAa,2GAA2G,+CAA+C,UAAU,wCAAwC,yDAAyD,QAAQ;AAC9Z,YAAY,kEAAkE,KAAK,YAAY,WAAW,QAAQ,4BAA4B,SAAS,sHAAsH,SAAS,kEAAkE,uBAAuB,0BAA0B,WAAW,EAAE,mDAAmD,eAAe,OAAO;AAC/d;AACA,yRAAyR,GAAG;AAC5R,+LAA+L,8SAA8S;AAC7e,kCAAkC,4BAA4B,SAAS,YAAY,yBAAyB,IAAI,wFAAwF,YAAY,GAAG,YAAY,kBAAkB,oBAAoB,6BAA6B,gCAAgC,wBAAwB,mCAAmC,yBAAyB,2BAA2B,yBAAyB,qCAAqC;AACnf,iBAAiB,uDAAuD,8CAA8C,2DAA2D,iEAAiE,iDAAiD,eAAe,sBAAsB,YAAY,cAAc,aAAa,WAAW,YAAY,cAAc,8DAA8D,cAAc;AAChe,IAAI,gBAAgB,mBAAmB,IAAI,sBAAsB,SAAS,aAAa,oFAAoF,cAAc,sGAAsG,iDAAiD,2CAA2C,0CAA0C,GAAG,iBAAiB,sBAAsB;AAC/c,kCAAkC,uHAAuH,uBAAuB,wBAAwB,mBAAmB,8BAA8B,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,6EAA6E,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,gSAAgS,MAAM,KAAK,MAAM,wLAAwL,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM;AACp9B,qBAAqB,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,uEAAuE,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,iCAAiC,MAAM,KAAK,MAAM,IAAI,MAAM,iIAAiI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM;AACxjC,4qDAA4qD,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,sIAAsI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,+GAA+G,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM;AAC12F,MAAM,MAAM,KAAK,MAAM,sEAAsE,iEAAiE,yBAAyB,eAAe,oCAAoC,GAAG,aAAa,mCAAmC,2BAA2B,iBAAiB,yGAAyG;AAClb,UAAU,oBAAoB,qBAAqB,qFAAqF,UAAU,MAAM,uBAAuB,6KAA6K,MAAM;AAClW,0DAA0D,cAAc,2EAA2E,+BAA+B,wCAAwC,8KAA8K,WAAW,iCAAiC,gBAAgB;AACpc,aAAa,kFAAkF,gBAAgB,EAAE,IAAI,UAAU,SAAS,KAAK,KAAK,mBAAmB,MAAM,0DAA0D,cAAc,gBAAgB,yFAAyF,KAAK,gJAAgJ,UAAU;AAC3f,MAAM,uDAAuD,IAAI,KAAK,YAAY,QAAQ,IAAI,EAAE,kBAAkB,yCAAyC,uBAAuB,WAAW,KAAK,cAAc,oBAAoB,cAAc,iBAAiB,eAAe,wCAAwC,KAAK,mBAAmB,+CAA+C,YAAY,qDAAqD,SAAS;AAC3c,gCAAgC,KAAK,gBAAgB,EAAE,oFAAoF,gBAAgB,uCAAuC,KAAK,IAAI,EAAE,kBAAkB,4BAA4B,oBAAoB,6BAA6B,iDAAiD,mBAAmB,WAAW,4EAA4E;AACvc,8BAA8B,6CAA6C,8HAA8H,KAAK,QAAQ,iBAAiB,IAAI,MAAM,qFAAqF,QAAQ,iCAAiC,iBAAiB,IAAI,IAAI,MAAM,kCAAkC;AAChb,aAAa,gBAAgB,qCAAqC,yDAAyD,yFAAyF,+DAA+D,2CAA2C,6CAA6C,eAAe,UAAU;AACpY,8BAA8B,6WAA6W,6BAA6B;AACxa;AACA,2UAA2U,gBAAgB,KAAK;AAChW;AACA;AACA,+GAA+G,gBAAgB;AAC/H;AACA;AACA,iEAAiE,OAAO,4CAA4C,sMAAsM,kCAAkC,mEAAmE,kCAAkC;AACjc,eAAe,4DAA4D,KAAK,iDAAiD,sFAAsF,wEAAwE,sFAAsF,yCAAyC,mEAAmE;AACje,sCAAsC,KAAK,oCAAoC,KAAK,kDAAkD,KAAK,uLAAuL,+CAA+C,kDAAkD,oDAAoD;AACvd,iFAAiF,iEAAiE,2BAA2B,KAAK,+FAA+F,KAAK,qFAAqF,UAAU,mDAAmD,KAAK,kCAAkC,eAAe;AAC9d,yFAAyF,4CAA4C,kCAAkC,mEAAmE,sFAAsF,4CAA4C,2BAA2B,KAAK,2BAA2B,KAAK,oDAAoD,KAAK;AACre,oEAAoE,KAAK,oCAAoC,KAAK,oCAAoC,KAAK,iPAAiP,sFAAsF;AACle,6BAA6B,KAAK,mCAAmC,KAAK,mCAAmC,KAAK,2BAA2B,KAAK,4CAA4C,4EAA4E,2EAA2E,MAAM,oCAAoC,mEAAmE;AAClc,qDAAqD,iFAAiF,iEAAiE,wEAAwE,2DAA2D,mEAAmE,0CAA0C;AACvb,6IAA6I,4DAA4D,wBAAwB,2GAA2G,KAAK,yFAAyF,IAAI,2CAA2C,KAAK;AAC9d,sEAAsE,KAAK,oDAAoD,KAAK,mDAAmD,KAAK,wIAAwI,KAAK,qCAAqC,KAAK,oCAAoC,UAAU,8DAA8D,KAAK;AACpe,6CAA6C,KAAK,2CAA2C,KAAK,2CAA2C,uEAAuE,oCAAoC,uEAAuE,qDAAqD,KAAK,2BAA2B,KAAK,qDAAqD;AAC9c,UAAU,uIAAuI,KAAK,gGAAgG,IAAI,2CAA2C,KAAK,4CAA4C,mEAAmE,4DAA4D;AACrd,mHAAmH,0CAA0C,KAAK,oGAAoG,sJAAsJ,oCAAoC,KAAK,gCAAgC;AACre,kLAAkL,wFAAwF,iFAAiF,mDAAmD,iFAAiF;AAC/d,gDAAgD,0JAA0J,kEAAkE,mEAAmE,8EAA8E,4EAA4E;AACze,qBAAqB,4EAA4E,iDAAiD,4EAA4E,+FAA+F,iFAAiF,iEAAiE;AAC/c,wCAAwC,mDAAmD,KAAK,+FAA+F,gBAAgB,yKAAyK,KAAK;AAC7X,+NAA+N,eAAe;AAC9O,+EAA+E,eAAe,2BAA2B,KAAK,wFAAwF,KAAK,oDAAoD,4EAA4E,8DAA8D,KAAK,oCAAoC;AAClc,eAAe,4CAA4C,iFAAiF,2CAA2C,KAAK,2BAA2B,KAAK,EAAE;AAC9N;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qdAAqd;AACrd,ySAAyS,SAAS;AAClT,wIAAwI,YAAY,eAAe,gBAAgB,gBAAgB,eAAe,eAAe,YAAY,gBAAgB,6BAA6B,0BAA0B,8EAA8E,GAAG,SAAS,yCAAyC,6CAA6C;AACpe,WAAW,2CAA2C,yCAAyC,uCAAuC,iCAAiC,iCAAiC,oCAAoC,yBAAyB,kCAAkC,iCAAiC,8BAA8B,wBAAwB,aAAa,uCAAuC,4CAA4C,EAAE,oBAAoB;AACpf,gBAAgB,6BAA6B,QAAQ,EAAE,sCAAsC,eAAe,iBAAiB,QAAQ,WAAW,KAAK,cAAc,cAAc,gCAAgC,UAAU,yBAAyB,oBAAoB,QAAQ,gDAAgD,EAAE,WAAW,kCAAkC,kCAAkC,UAAU,WAAW,SAAS,gEAAgE;AAC/e,0BAA0B,YAAY,GAAG,cAAc,eAAe,IAAI,oCAAoC,KAAK,QAAQ,KAAK,MAAM,sGAAsG,kFAAkF,qCAAqC,+BAA+B,sBAAsB,wEAAwE;AAChe,uEAAuE,cAAc,gEAAgE,OAAO,QAAQ,uDAAuD,IAAI,MAAM,0EAA0E,UAAU,oCAAoC,iFAAiF,iBAAiB,+DAA+D;AAC9f,iCAAiC,uBAAuB,mCAAmC,GAAG,iEAAiE,iCAAiC,2FAA2F,iBAAiB,qBAAqB,GAAG,2BAA2B,4BAA4B,+BAA+B,2CAA2C,mBAAmB;AACxd,iBAAiB,uBAAuB,qJAAqJ,2BAA2B,8CAA8C,cAAc,EAAE,kBAAkB,sDAAsD,gBAAgB,wBAAwB,WAAW;AACjZ,4CAA4C,EAAE,yEAAyE,OAAO,iCAAiC,+BAA+B,MAAM,QAAQ,WAAW,oEAAoE,oBAAoB,8CAA8C,iFAAiF,UAAU,+BAA+B;AACvd,qDAAqD,eAAe,eAAe,8BAA8B,+BAA+B,6BAA6B,iCAAiC,kCAAkC,+BAA+B,6BAA6B,4BAA4B,6BAA6B,6BAA6B,8BAA8B,iCAAiC,6BAA6B;AAC9d,6BAA6B,gCAAgC,gCAAgC,+BAA+B,gCAAgC,gCAAgC,kCAAkC,gCAAgC,6BAA6B,8BAA8B,8BAA8B,4BAA4B,+BAA+B,4BAA4B,6BAA6B,4BAA4B;AACve,aAAa,4BAA4B,+BAA+B,4BAA4B,+BAA+B,iCAAiC,YAAY,iBAAiB,aAAa,oCAAoC,YAAY,aAAa,mCAAmC,YAAY,aAAa,8BAA8B,YAAY,aAAa,kDAAkD,wCAAwC;AACxd,GAAG,YAAY,YAAY,YAAY,sBAAsB,eAAe,iBAAiB,cAAc,kBAAkB,aAAa,uDAAuD,wCAAwC,wCAAwC,YAAY,YAAY,YAAY,sBAAsB,eAAe,iBAAiB,cAAc,kBAAkB,aAAa,+CAA+C,wCAAwC;AAC/e,eAAe,YAAY,aAAa,gBAAgB,YAAY,sBAAsB,iBAAiB,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,eAAe,cAAc,kBAAkB,aAAa;AACpf,kBAAkB,wCAAwC,wCAAwC,eAAe,aAAa,cAAc,kBAAkB,aAAa,0CAA0C,wCAAwC,wCAAwC,cAAc,UAAU,aAAa,cAAc,kBAAkB,aAAa,4CAA4C,wCAAwC,wCAAwC;AACnf,EAAE,kBAAkB,aAAa,cAAc,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,cAAc,YAAY,YAAY,cAAc,cAAc,kBAAkB,aAAa,2CAA2C,wCAAwC,wCAAwC,cAAc,YAAY,YAAY,cAAc,cAAc;AAChf,EAAE,aAAa,sCAAsC,wCAAwC,wCAAwC,YAAY,YAAY,cAAc,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,YAAY,YAAY,cAAc,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC;AACze,eAAe,aAAa,YAAY,cAAc,kBAAkB,aAAa,wCAAwC,wCAAwC,wCAAwC,aAAa,YAAY,cAAc,kBAAkB,aAAa,wCAAwC,wCAAwC,wCAAwC,WAAW,aAAa,YAAY,aAAa,cAAc,kBAAkB,aAAa;AACze,sBAAsB,wCAAwC,wCAAwC,YAAY,gBAAgB,cAAc,iBAAiB,cAAc,kBAAkB,aAAa,qCAAqC,wCAAwC,wCAAwC,YAAY,WAAW,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC;AACld,GAAG,aAAa,cAAc,kBAAkB,aAAa,2CAA2C,wCAAwC,wCAAwC,cAAc,aAAa,aAAa,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,qCAAqC;AAC/d,eAAe,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,iCAAiC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,+BAA+B,wCAAwC,wCAAwC,cAAc,kBAAkB,aAAa,gCAAgC;AACxd,GAAG,wCAAwC,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,YAAY,cAAc,UAAU,cAAc,kBAAkB,aAAa,mCAAmC;AACle,eAAe,wCAAwC,cAAc,kBAAkB,aAAa,qCAAqC,wCAAwC,wCAAwC,UAAU,cAAc,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,YAAY,UAAU,aAAa,cAAc,kBAAkB,aAAa;AACpe,kBAAkB,wCAAwC,wCAAwC,UAAU,eAAe,cAAc,kBAAkB,aAAa,qCAAqC,wCAAwC,wCAAwC,YAAY,YAAY,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,YAAY,YAAY;AAChf,EAAE,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,YAAY,cAAc,cAAc,kBAAkB,aAAa,gCAAgC,wCAAwC,wCAAwC,YAAY,cAAc,kBAAkB,aAAa,uCAAuC,wCAAwC;AACje,eAAe,WAAW,kBAAkB,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,WAAW,kBAAkB,cAAc,kBAAkB,aAAa,yCAAyC,wCAAwC,wCAAwC,WAAW,aAAa,kBAAkB,cAAc,kBAAkB,aAAa;AACze,kBAAkB,wCAAwC,wCAAwC,WAAW,kBAAkB,cAAc,kBAAkB,aAAa,kCAAkC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,kCAAkC,wCAAwC,wCAAwC,aAAa,cAAc;AACre,EAAE,aAAa,sCAAsC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,wCAAwC,wCAAwC,wCAAwC,YAAY,WAAW,mBAAmB,cAAc,kBAAkB,aAAa,qCAAqC,wCAAwC;AAC3d,YAAY,YAAY,YAAY,gBAAgB,cAAc,kBAAkB,aAAa,gCAAgC,wCAAwC,wCAAwC,SAAS,cAAc,kBAAkB,aAAa,gCAAgC,wCAAwC,wCAAwC,SAAS,cAAc,kBAAkB,aAAa,+CAA+C;AAC5d,eAAe,wCAAwC,aAAa,kBAAkB,mBAAmB,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC,wCAAwC,cAAc,cAAc,kBAAkB,aAAa,kCAAkC,wCAAwC,wCAAwC,SAAS,cAAc,kBAAkB,aAAa;AAC/e,gBAAgB,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,cAAc,kBAAkB,aAAa,qCAAqC,wCAAwC,wCAAwC,aAAa,cAAc,kBAAkB,aAAa;AACze,oBAAoB,wCAAwC,wCAAwC,aAAa,YAAY,WAAW,cAAc,kBAAkB,aAAa,0CAA0C,wCAAwC,wCAAwC,aAAa,aAAa,WAAW,cAAc,kBAAkB,aAAa,sCAAsC,wCAAwC;AAC/c,aAAa,WAAW,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,UAAU,WAAW,cAAc,kBAAkB,aAAa,mCAAmC,wCAAwC,wCAAwC,YAAY,WAAW,cAAc,kBAAkB,aAAa,oCAAoC;AACrd,GAAG,wCAAwC,YAAY,WAAW,cAAc,kBAAkB,aAAa,kCAAkC,aAAa,aAAa,YAAY,aAAa,iCAAiC,YAAY,aAAa,8BAA8B,aAAa,aAAa,4CAA4C,cAAc,YAAY,WAAW,gBAAgB,aAAa,8CAA8C;AACld,GAAG,wCAAwC,YAAY,YAAY,YAAY,cAAc,kBAAkB,aAAa,6CAA6C,YAAY,cAAc,kBAAkB,mBAAmB,aAAa,gBAAgB,aAAa,gCAAgC,WAAW,kBAAkB,aAAa,kCAAkC,WAAW,aAAa,aAAa,gCAAgC,YAAY,cAAc,aAAa;AAC1e,cAAc,oBAAoB,qBAAqB,aAAa,+CAA+C,yDAAyD,cAAc,yBAAyB,mBAAmB,EAAE,yDAAyD,8DAA8D,cAAc,EAAE,uDAAuD,6DAA6D,cAAc,EAAE;AACnf,QAAQ,wDAAwD,cAAc,EAAE,yDAAyD,8DAA8D,cAAc,oBAAoB,cAAc,oBAAoB,cAAc,8BAA8B,wBAAwB,uBAAuB,iBAAiB,yBAAyB,mBAAmB,EAAE,mEAAmE;AACxe,oBAAoB,cAAc,oBAAoB,cAAc,oBAAoB,cAAc,8BAA8B,wBAAwB,uBAAuB,iBAAiB,yBAAyB,mBAAmB,EAAE,mDAAmD,2DAA2D,cAAc,qBAAqB,eAAe,wBAAwB,kBAAkB,oBAAoB,cAAc,8BAA8B,wBAAwB;AACphB,wBAAwB,mBAAmB,EAAE,+CAA+C,0DAA0D,eAAe,EAAE,+CAA+C,4DAA4D,iBAAiB,EAAE,+CAA+C,4DAA4D,iBAAiB,qBAAqB,eAAe,EAAE;AACvc,8DAA8D,gBAAgB,kBAAkB,YAAY,qBAAqB,eAAe,EAAE,qDAAqD,8DAA8D,gBAAgB,0BAA0B,oBAAoB,qBAAqB,eAAe,sBAAsB,gBAAgB,EAAE,yCAAyC,wDAAwD,gBAAgB;AAChgB,mBAAmB,cAAc,oBAAoB,cAAc,sBAAsB,gBAAgB,EAAE,mDAAmD,6DAA6D,gBAAgB,oBAAoB,cAAc,oBAAoB,cAAc,sBAAsB,gBAAgB,EAAE,6CAA6C,wDAAwD,cAAc,oBAAoB,cAAc;AAC5e,YAAY,gBAAgB,EAAE,uCAAuC,qDAAqD,cAAc,oBAAoB,cAAc,sBAAsB,gBAAgB,EAAE,2CAA2C,wDAAwD,eAAe,oBAAoB,cAAc,EAAE,qDAAqD,6DAA6D,eAAe,oBAAoB,cAAc;AAC3gB,6CAA6C,uDAAuD,aAAa,qBAAqB,eAAe,oBAAoB,cAAc,qBAAqB,eAAe,EAAE,yCAAyC,sDAAsD,cAAc,wBAAwB,kBAAkB,sBAAsB,gBAAgB,yBAAyB,mBAAmB,EAAE;AACxc,yDAAyD,cAAc,mBAAmB,aAAa,EAAE,+CAA+C,0DAA0D,eAAe,EAAE,uDAAuD,+DAA+D,gBAAgB,qBAAqB,eAAe,qBAAqB,eAAe,EAAE,+CAA+C;AACle,qBAAqB,eAAe,EAAE,mDAAmD,4DAA4D,eAAe,EAAE,2CAA2C,wDAAwD,eAAe,EAAE,2CAA2C,sCAAsC,6CAA6C,uCAAuC,mDAAmD;AAClf,GAAG,6CAA6C,wDAAwD,cAAc,sBAAsB,gBAAgB,kBAAkB,YAAY,EAAE,mDAAmD,0CAA0C,+CAA+C,uDAAuD,YAAY,sBAAsB,gBAAgB,EAAE,6CAA6C;AAChe,oBAAoB,cAAc,kBAAkB,YAAY,qBAAqB,eAAe,EAAE,iDAAiD,wDAAwD,YAAY,uBAAuB,iBAAiB,EAAE,+CAA+C,yDAAyD,cAAc,oBAAoB,cAAc,EAAE,6CAA6C;AAC5c,YAAY,cAAc,oBAAoB,cAAc,sBAAsB,gBAAgB,EAAE,2CAA2C,uDAAuD,cAAc,sBAAsB,gBAAgB,EAAE,yCAAyC,sDAAsD,cAAc,EAAE,mDAAmD,0DAA0D,aAAa,0BAA0B,oBAAoB;AACnhB,iDAAiD,yDAAyD,aAAa,0BAA0B,oBAAoB,EAAE,mDAAmD,0DAA0D,aAAa,qBAAqB,eAAe,0BAA0B,oBAAoB,EAAE,2DAA2D,8DAA8D,aAAa;AAC3f,yBAAyB,oBAAoB,EAAE,6CAA6C,yDAAyD,eAAe,EAAE,6CAA6C,yDAAyD,eAAe,EAAE,qDAAqD,6DAA6D,eAAe,EAAE,iDAAiD;AACjd,oBAAoB,cAAc,mBAAmB,aAAa,2BAA2B,qBAAqB,EAAE,2CAA2C,uDAAuD,cAAc,oBAAoB,cAAc,wBAAwB,kBAAkB,EAAE,yCAAyC,mDAAmD,WAAW,EAAE,yCAAyC,mDAAmD,WAAW;AAClgB,+DAA+D,kEAAkE,eAAe,0BAA0B,oBAAoB,2BAA2B,qBAAqB,EAAE,qDAAqD,8DAA8D,gBAAgB,EAAE,6CAA6C,qDAAqD,WAAW,EAAE;AACpe,eAAe,gEAAgE,eAAe,EAAE,mDAAmD,0CAA0C,mDAAmD,4DAA4D,eAAe,EAAE,qDAAqD,6DAA6D,eAAe,oBAAoB,cAAc,mBAAmB,aAAa;AAChgB,qDAAqD,6DAA6D,eAAe,qBAAqB,eAAe,mBAAmB,aAAa,EAAE,iDAAiD,2DAA2D,eAAe,mBAAmB,aAAa,EAAE,2CAA2C,qDAAqD,YAAY,mBAAmB,aAAa,EAAE;AAClf,OAAO,uDAAuD,cAAc,mBAAmB,aAAa,EAAE,6CAA6C,wDAAwD,cAAc,mBAAmB,aAAa,EAAE,2CAA2C,sCAAsC,6CAA6C,uCAAuC,yCAAyC;AACjd,iDAAiD,yCAAyC,mDAAmD,0CAA0C,6CAA6C,uCAAuC,6CAA6C,yDAAyD,eAAe,qBAAqB,eAAe,oBAAoB,cAAc,EAAE;AACxc,2DAA2D,cAAc,EAAE,6CAA6C,yDAAyD,eAAe,EAAE,yCAAyC,qCAAqC,uCAAuC,oCAAoC,yCAAyC,qCAAqC,yCAAyC;AACld,2CAA2C,sCAAsC,iDAAiD,yCAAyC,yCAAyC,qCAAqC,yCAAyC,qCAAqC,yCAAyC,qCAAqC,+CAA+C,wCAAwC;AAC5e,SAAS,wCAAwC,6CAA6C,uCAAuC,+CAA+C,wCAAwC,+CAA+C,wCAAwC,mDAAmD,0CAA0C,+CAA+C,wCAAwC;AACve,MAAM,qCAAqC,2CAA2C,sCAAsC,2CAA2C,sCAAsC,uCAAuC,oCAAoC,6CAA6C,uCAAuC,uCAAuC,oCAAoC,yCAAyC;AAChe,GAAG,uCAAuC,oCAAoC,yCAAyC,qCAAqC,uCAAuC,oCAAoC,6CAA6C,uCAAuC,uCAAuC,oCAAoC,6CAA6C,uCAAuC;AAC1d,gBAAgB,kEAAkE,gBAAgB,oBAAoB,cAAc,mBAAmB,aAAa,wBAAwB,kBAAkB,EAAE,6DAA6D,gEAAgE,cAAc,oBAAoB,cAAc,oBAAoB,cAAc,EAAE,sDAAsD;AACvd,oBAAoB,cAAc,sBAAsB,gBAAgB,0BAA0B,oBAAoB,2BAA2B,qBAAqB,qBAAqB,eAAe,wBAAwB,kBAAkB,EAAE,yCAAyC,qDAAqD,aAAa,0BAA0B,oBAAoB,EAAE,iDAAiD,yDAAyD,aAAa;AACxgB,oBAAoB,eAAe,EAAE,6CAA6C,wDAAwD,cAAc,sBAAsB,gBAAgB,EAAE,mDAAmD,mEAAmE,sBAAsB,6BAA6B,uBAAuB,EAAE,2CAA2C,eAAe,kBAAkB,kBAAkB,kBAAkB;AAClf,KAAK,cAAc,qDAAqD,6CAA6C,gBAAgB,qDAAqD,iEAAiE,qBAAqB,gBAAgB,0DAA0D,kBAAkB,2DAA2D,cAAc;AACrb,6BAA6B,cAAc,QAAQ,eAAe,uDAAuD,sBAAsB,4BAA4B,OAAO,KAAK,aAAa,2BAA2B,SAAS,6BAA6B,8BAA8B,6CAA6C,0CAA0C,IAAI,QAAQ,SAAS,iBAAiB,SAAS,+CAA+C,SAAS,oBAAoB;AACrf,wBAAwB,oFAAoF,wHAAwH,oBAAoB,MAAM,uGAAuG,aAAa,sBAAsB,+FAA+F,QAAQ;AAC/e,iCAAiC,iBAAiB,MAAM,mCAAmC,MAAM,8BAA8B,SAAS,MAAM,yHAAyH,QAAQ,SAAS,MAAM,mCAAmC,MAAM,wCAAwC,MAAM,qFAAqF,MAAM;AAChd,MAAM,4CAA4C,MAAM,iDAAiD,MAAM,+CAA+C,MAAM,iDAAiD,MAAM,iGAAiG,MAAM,sDAAsD,MAAM,wCAAwC,MAAM,+BAA+B,MAAM;AACjd,MAAM,8DAA8D,yHAAyH,aAAa,WAAW,kBAAkB,cAAc,yFAAyF,iBAAiB,gBAAgB,iEAAiE,gBAAgB,eAAe,oCAAoC;AACnf,uCAAuC,uCAAuC,0CAA0C,6CAA6C,2CAA2C,sDAAsD,wCAAwC,0CAA0C,gDAAgD,gDAAgD,mCAAmC,gBAAgB;AAC3e,gGAAgG,SAAS,gBAAgB,WAAW,mMAAmM,QAAQ,OAAO,qHAAqH,SAAS,gBAAgB,MAAM;AAC1e,SAAS,QAAQ,gCAAgC,SAAS,aAAa,8BAA8B,QAAQ,IAAI,wBAAwB,aAAa,SAAS,KAAK,SAAS,YAAY,WAAW,uBAAuB,yCAAyC,OAAO,MAAM,kBAAkB,8BAA8B,MAAM,oBAAoB,4BAA4B,SAAS,kBAAkB,MAAM,gBAAgB,SAAS,QAAQ,OAAO,MAAM,kBAAkB,SAAS,mBAAmB;AACpf,gBAAgB,QAAQ,gBAAgB,6BAA6B,sBAAsB,2BAA2B,kDAAkD,mCAAmC,SAAS,WAAW,kFAAkF,kFAAkF,KAAK,QAAQ,OAAO,yBAAyB,6DAA6D;AAC7e,MAAM,2FAA2F,gBAAgB,+DAA+D,iBAAiB,gBAAgB,sCAAsC,aAAa,uEAAuE,aAAa,sFAAsF,cAAc,oBAAoB;AAChd,yBAAyB,wFAAwF,0FAA0F,oCAAoC,oBAAoB,UAAU,eAAe,YAAY,OAAO,KAAK,aAAa,qLAAqL;AACtf,GAAG,SAAS,cAAc,OAAO,oCAAoC,aAAa,YAAY,6HAA6H,aAAa,kBAAkB,SAAS,0BAA0B,yFAAyF,cAAc,kBAAkB,oEAAoE,SAAS,gCAAgC;AACngB,cAAc,kBAAkB,kCAAkC,SAAS,IAAI,iCAAiC,SAAS,kBAAkB,SAAS,KAAK,MAAM,SAAS,kBAAkB,4FAA4F,wFAAwF,6BAA6B,WAAW,QAAQ,IAAI,0EAA0E;AAC5e,IAAI,kBAAkB,+BAA+B,UAAU,yDAAyD,kBAAkB,eAAe,iHAAiH,yBAAyB,gBAAgB,oFAAoF,mBAAmB,mBAAmB,SAAS;AACtb,6CAA6C,eAAe,QAAQ,OAAO,MAAM,cAAc,kBAAkB,4BAA4B,SAAS,6GAA6G,KAAK,QAAQ,WAAW,yFAAyF,kEAAkE;AACtb,uBAAuB,gBAAgB,iBAAiB,aAAa,eAAe,oGAAoG,0GAA0G,yHAAyH;AAC3Z,kBAAkB,kBAAkB,4FAA4F,mIAAmI,YAAY,WAAW,cAAc,kBAAkB;AAC1T,2FAA2F,0FAA0F,sEAAsE,gBAAgB,WAAW,wDAAwD,aAAa,wBAAwB,aAAa,kDAAkD,sDAAsD;AACxe,SAAS,YAAY,oDAAoD,yBAAyB,OAAO,EAAE,aAAa,eAAe,mGAAmG,+BAA+B,SAAS,wBAAwB,aAAa,sDAAsD,KAAK,MAAM,6BAA6B,kCAAkC,SAAS,gBAAgB;AAChd,OAAO,0BAA0B,qEAAqE,SAAS,oEAAoE,YAAY,OAAO,EAAE,aAAa,eAAe,mEAAmE,qBAAqB,KAAK,QAAQ,kHAAkH,cAAc,KAAK,MAAM;AACpd,4HAA4H,WAAW,iIAAiI,MAAM,+BAA+B,sDAAsD,SAAS,KAAK,MAAM,0DAA0D,QAAQ,+CAA+C;AACxe,OAAO,mCAAmC,8GAA8G,eAAe,gBAAgB,+BAA+B,oBAAoB,kBAAkB,8BAA8B,gBAAgB,kBAAkB,KAAK,oCAAoC,iCAAiC,kBAAkB,KAAK,oBAAoB,kBAAkB,8DAA8D;AACjgB,4DAA4D,0BAA0B,kBAAkB,wKAAwK,kBAAkB,gBAAgB,YAAY,kBAAkB,sBAAsB,uBAAuB,wEAAwE;AACrc,6GAA6G,YAAY,iEAAiE,uBAAuB,cAAc,kBAAkB,4BAA4B,oFAAoF,gBAAgB,gBAAgB,SAAS,EAAE,iBAAiB,qCAAqC,SAAS,eAAe,IAAI,qBAAqB;AACnf,QAAQ,MAAM,oBAAoB,IAAI,QAAQ,EAAE,IAAI,gBAAgB,qBAAqB,cAAc,QAAQ,EAAE,iBAAiB,SAAS,kCAAkC,wCAAwC,SAAS,WAAW,cAAc,MAAM,MAAM,gDAAgD,MAAM,SAAS,QAAQ,IAAI,KAAK,gBAAgB,aAAa,+BAA+B,kBAAkB;AACja,+CAA+C,aAAa,SAAS,aAAa,KAAK,QAAQ,IAAI,uFAAuF,iCAAiC,QAAQ,OAAO,SAAS,gBAAgB,SAAS,GAAG,QAAQ,QAAQ,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,8BAA8B,wBAAwB,aAAa,QAAQ,EAAE,iBAAiB,SAAS,kCAAkC,wCAAwC;AACtf,OAAO,WAAW,aAAa,MAAM,MAAM,SAAS,QAAQ,IAAI,KAAK,QAAQ,8BAA8B,eAAe,+BAA+B,kBAAkB,gBAAgB,kBAAkB,WAAW,2LAA2L,cAAc,KAAK,WAAW,eAAe,EAAE,iBAAiB,4BAA4B,IAAI,QAAQ;AAC3f,OAAO,eAAe,IAAI,YAAY,IAAI,QAAQ,SAAS,qBAAqB,QAAQ,IAAI,KAAK,iBAAiB,SAAS,eAAe,cAAc,kBAAkB,OAAO,oBAAoB,gCAAgC,QAAQ,OAAO,SAAS,mBAAmB,0BAA0B,aAAa,aAAa,+GAA+G,cAAc;AACjc,8NAA8N,iBAAiB,iBAAiB,SAAS,0BAA0B,gCAAgC,gCAAgC,4EAA4E,gCAAgC,mCAAmC;AAClf,mCAAmC,mCAAmC,kCAAkC,wEAAwE,6DAA6D,8CAA8C,gBAAgB,0BAA0B,mJAAmJ;AACxd,2CAA2C,iBAAiB,iBAAiB,2EAA2E,8BAA8B,aAAa,aAAa,2BAA2B,sBAAsB,iCAAiC,kBAAkB,MAAM,4DAA4D;AACtX,UAAU,uIAAuI,+GAA+G,SAAS,oCAAoC,yEAAyE,8BAA8B;AACpZ,uBAAuB,SAAS,aAAa,QAAQ,QAAQ,QAAQ,UAAU,qCAAqC,SAAS,sBAAsB,6BAA6B,kBAAkB,2BAA2B,MAAM,oCAAoC,kBAAkB,2BAA2B,MAAM,sDAAsD,MAAM;AACtX,iIAAiI,iGAAiG,uCAAuC,SAAS,SAAS,8EAA8E,SAAS,SAAS,gEAAgE,oBAAoB,KAAK,QAAQ,SAAS,MAAM,SAAS;AACpf,mHAAmH,SAAS,gCAAgC,SAAS,cAAc,8CAA8C,yDAAyD,uBAAuB,wBAAwB,oBAAoB,kBAAkB,oBAAoB,oDAAoD,mBAAmB;AAC1c,IAAI,sCAAsC,iDAAiD,SAAS,mHAAmH,8EAA8E,uBAAuB,0BAA0B,oBAAoB,gBAAgB,IAAI,QAAQ,0DAA0D,IAAI,4BAA4B,IAAI,KAAK;AACze,sEAAsE,gFAAgF,oFAAoF,kBAAkB,iBAAiB,yBAAyB,kBAAkB,oEAAoE,kCAAkC,+CAA+C;AAC7c,sCAAsC,YAAY,gBAAgB,uJAAuJ,UAAU,4DAA4D,SAAS,qBAAqB,IAAI,sEAAsE,2BAA2B,eAAe,oBAAoB,IAAI,UAAU,GAAG,GAAG,QAAQ,sDAAsD;AACvhB,uBAAuB,eAAe,KAAK,GAAG,wGAAwG,KAAK,IAAI,EAAE,kBAAkB,KAAK,UAAU,kBAAkB,KAAK,qCAAqC,WAAW,oBAAoB,IAAI,MAAM,iBAAiB,8CAA8C,KAAK,oBAAoB,IAAI,2BAA2B,UAAU,KAAK,6DAA6D;AAC1e,KAAK,2BAA2B,wBAAwB,gFAAgF,yFAAyF,mBAAmB,6EAA6E,oEAAoE,mEAAmE,IAAI,KAAK;AACjd,IAAI,4DAA4D,wFAAwF,+FAA+F,KAAK,iBAAiB,yDAAyD,gBAAgB,sBAAsB,sCAAsC,uCAAuC;AACzb,yFAAyF,gBAAgB,QAAQ,iBAAiB,aAAa,eAAe,oDAAoD,kEAAkE,4BAA4B,iHAAiH,cAAc;AAC/a,iFAAiF,oCAAoC,gBAAgB,aAAa,eAAe,4BAA4B,6BAA6B,+FAA+F,+FAA+F,iGAAiG;AACzf,OAAO,oGAAoG,qBAAqB,YAAY,OAAO,KAAK,mBAAmB,QAAQ,aAAa,QAAQ,kBAAkB,qBAAqB,EAAE,6CAA6C,8BAA8B,8BAA8B,WAAW,cAAc,cAAc,8DAA8D,yBAAyB;AACxd,kHAAkH,4BAA4B,aAAa,WAAW,kFAAkF,aAAa,KAAK,IAAI,oBAAoB,QAAQ,IAAI;AAC9S,scAAsc,IAAI,aAAa,IAAI,OAAO,OAAO,OAAO;AAChf,uDAAuD,IAAI,MAAM,kJAAkJ,iBAAiB,mCAAmC,yBAAyB,OAAO,2IAA2I;AAClb,qDAAqD,SAAS,wFAAwF,uGAAuG,yOAAyO;AACte,OAAO,yHAAyH,qBAAqB,sJAAsJ,IAAI,2CAA2C,YAAY,cAAc,yBAAyB;AAC7Y,8BAA8B,4CAA4C,IAAI,KAAK,6CAA6C,QAAQ,OAAO,4BAA4B,+CAA+C,oMAAoM,6CAA6C;AAC3c,KAAK,IAAI,0BAA0B,oBAAoB,cAAc,cAAc,cAAc,wDAAwD,KAAK,IAAI,KAAK,KAAK,UAAU,OAAO,6FAA6F,uBAAuB,gGAAgG,oBAAoB,4CAA4C;AACjd,4CAA4C,cAAc,+DAA+D,gBAAgB,UAAU,iBAAiB,WAAW,sDAAsD,kBAAkB,kBAAkB,kBAAkB,kEAAkE,UAAU,IAAI,KAAK,aAAa,4BAA4B,WAAW,kBAAkB,kBAAkB,0BAA0B,IAAI;AACte,uBAAuB,gBAAgB,QAAQ,EAAE,eAAe,2FAA2F,aAAa,qGAAqG,yDAAyD,8HAA8H,4CAA4C;AAChf,GAAG,WAAW,SAAS,QAAQ,OAAO,wBAAwB,+FAA+F,uCAAuC,sEAAsE,6BAA6B,SAAS,WAAW,uFAAuF,+BAA+B,SAAS,WAAW,KAAK,SAAS,KAAK,QAAQ,OAAO;AACve,qCAAqC,sEAAsE,qHAAqH,yGAAyG,SAAS,WAAW,sGAAsG,QAAQ,IAAI;AAC/c,yDAAyD,SAAS,gNAAgN,2BAA2B,SAAS,WAAW,cAAc;AAC/U,EAAE,8DAA8D,OAAO,gBAAgB,wDAAwD,+DAA+D,iDAAiD,gCAAgC,wBAAwB,gBAAgB,iFAAiF,oEAAoE;AAC5d,GAAG,6BAA6B,mBAAmB,eAAe,eAAe,SAAS,2BAA2B,SAAS,uBAAuB,SAAS,QAAQ,OAAO,wBAAwB,gCAAgC,gCAAgC,WAAW,IAAI,QAAQ,OAAO,oCAAoC,cAAc,IAAI,MAAM,kCAAkC,wCAAwC,WAAW,IAAI,oBAAoB,uBAAuB,MAAM;AACze,SAAS,KAAK,MAAM,gCAAgC,OAAO,gIAAgI,MAAM,uGAAuG,KAAK,iCAAiC,aAAa,OAAO,wBAAwB,gBAAgB,2CAA2C;AACrb,uBAAuB,SAAS,uBAAuB,KAAK,mBAAmB,QAAQ,OAAO,gCAAgC,uDAAuD,wDAAwD,MAAM;AACnP,YAAY,sBAAsB,8EAA8E,IAAI,OAAO,kBAAkB,2DAA2D,KAAK,QAAQ,OAAO,0BAA0B,qCAAqC,0DAA0D,4EAA4E,gDAAgD;AACjd,QAAQ,8BAA8B,mFAAmF,yHAAyH,iBAAiB,SAAS,KAAK,KAAK,sEAAsE,KAAK,8HAA8H,QAAQ,IAAI;AAC3e,4FAA4F,sEAAsE,oEAAoE,SAAS;AAC/O,YAAY,kQAAkQ,qBAAqB,OAAO,UAAU,KAAK,OAAO,gBAAgB,cAAc,mJAAmJ;AACjf,gHAAgH,eAAe,IAAI,KAAK,QAAQ,kCAAkC,qBAAqB,aAAa,wFAAwF;AAC5S,gNAAgN,OAAO,oCAAoC,0DAA0D,sBAAsB,iBAAiB,QAAQ,SAAS;AAC7W,gBAAgB,mBAAmB,kDAAkD,SAAS,mCAAmC,iCAAiC,wBAAwB,iBAAiB,SAAS,kBAAkB,KAAK,QAAQ,OAAO,KAAK,IAAI,IAAI,IAAI,SAAS,iBAAiB,iBAAiB,2BAA2B,eAAe,mBAAmB,WAAW,eAAe,kBAAkB,mDAAmD,QAAQ,OAAO;AACje,sDAAsD,IAAI,kGAAkG,OAAO,iGAAiG;AACpQ,KAAK,iDAAiD,SAAS,kDAAkD,MAAM,sDAAsD,8CAA8C,0CAA0C,MAAM,8BAA8B,qCAAqC,gCAAgC,oCAAoC,qCAAqC,4BAA4B,6BAA6B;AAChf,iBAAiB,6BAA6B,wCAAwC,+BAA+B,8BAA8B,6DAA6D,uDAAuD,sEAAsE,gCAAgC,oCAAoC,eAAe,0BAA0B,SAAS,KAAK,aAAa;AACrd,2BAA2B,yCAAyC,IAAI,yBAAyB,iCAAiC,wCAAwC,GAAG,0CAA0C,GAAG,8BAA8B,KAAK,uBAAuB,kBAAkB,WAAW,QAAQ,IAAI,WAAW,SAAS,iBAAiB,MAAM,4BAA4B,sGAAsG;AAC1e,YAAY,6BAA6B,SAAS,QAAQ,mBAAmB,MAAM,mBAAmB,wBAAwB,oBAAoB,uBAAuB,KAAK,QAAQ,WAAW,oDAAoD,oBAAoB,8BAA8B,sBAAsB,KAAK,QAAQ,WAAW,8BAA8B,gBAAgB,sCAAsC;AACza,6BAA6B,YAAY,gBAAgB,mDAAmD,yCAAyC,eAAe,kBAAkB,cAAc,eAAe,qBAAqB,wBAAwB,sBAAsB,iBAAiB,YAAY,iBAAiB,iBAAiB,iBAAiB,+GAA+G,cAAc,aAAa;AAChf,iEAAiE,cAAc,uBAAuB,gBAAgB,cAAc,gBAAgB,uBAAuB,cAAc,+BAA+B,eAAe,aAAa,gBAAgB,MAAM,QAAQ,WAAW,YAAY,gBAAgB,yBAAyB,oCAAoC;AACtX,mRAAmR,EAAE,gCAAgC,oBAAoB,qCAAqC,0BAA0B,oCAAoC,0BAA0B,iCAAiC;AACve,iBAAiB,0CAA0C,wBAAwB,gCAAgC,6BAA6B,+BAA+B,wBAAwB,mCAAmC,6BAA6B,mCAAmC,0BAA0B,oCAAoC,sDAAsD,sCAAsC,0BAA0B,QAAQ;AACte,WAAW,uBAAuB,gCAAgC,kBAAkB,kCAAkC,oBAAoB,iCAAiC,sBAAsB,oCAAoC,+BAA+B,uCAAuC,uCAAuC,SAAS,GAAG,+BAA+B,oDAAoD,KAAK,uBAAuB,+BAA+B;AAC5e,aAAa,UAAU,yCAAyC,WAAW,QAAQ,uBAAuB,KAAK,uBAAuB,sBAAsB,UAAU,wCAAwC,WAAW,uFAAuF,SAAS,UAAU,sCAAsC,+FAA+F,qEAAqE;AAC7gB,EAAE,GAAG,yBAAyB,kCAAkC,2FAA2F,qEAAqE,cAAc,GAAG,yBAAyB,mCAAmC,4FAA4F,uEAAuE,UAAU,kBAAkB,GAAG;AAC/e,iCAAiC,0FAA0F,mEAAmE,oBAAoB,GAAG,wBAAwB,mCAAmC,MAAM,sFAAsF,wBAAwB,SAAS,QAAQ,uBAAuB,kCAAkC,SAAS,qBAAqB;AAC5e,iCAAiC,mBAAmB,6BAA6B,qCAAqC,gEAAgE,uBAAuB,sDAAsD,UAAU,gCAAgC,QAAQ,aAAa,iFAAiF,eAAe,QAAQ,IAAI,kCAAkC,gCAAgC;AAChf,EAAE,aAAa,iFAAiF,eAAe,QAAQ,IAAI,kCAAkC,yCAAyC,oBAAoB,WAAW,iDAAiD,6BAA6B,2CAA2C,8BAA8B,iCAAiC,cAAc,kDAAkD;AAC7d,cAAc,MAAM,QAAQ,WAAW,4EAA4E,8FAA8F,yCAAyC,oCAAoC,gDAAgD,8DAA8D,iEAAiE,mCAAmC;AAChf,0BAA0B,mCAAmC,uCAAuC,oBAAoB,2BAA2B,eAAe,oHAAoH,KAAK,SAAS,uBAAuB,+FAA+F,mCAAmC,MAAM,sBAAsB;AACzd,wBAAwB,iCAAiC,+BAA+B,MAAM,kCAAkC,gBAAgB,+BAA+B,MAAM,iDAAiD,kCAAkC,MAAM,gEAAgE,sBAAsB,4DAA4D,+CAA+C;AAC/c,gDAAgD,qCAAqC,qBAAqB,iBAAiB,MAAM,yDAAyD,sBAAsB,iDAAiD,6CAA6C,qBAAqB,qBAAqB,iBAAiB,MAAM;AAC/W,eAAe,MAAM,gDAAgD,MAAM,gDAAgD,wBAAwB,MAAM,sEAAsE,eAAe,0CAA0C,oBAAoB,uBAAuB,sJAAsJ;AACzd,sEAAsE,8BAA8B,6BAA6B,iCAAiC,MAAM,oDAAoD,wBAAwB,MAAM,sDAAsD,uBAAuB,MAAM,8CAA8C,uBAAuB,qBAAqB,iCAAiC,MAAM;AAC9c,qBAAqB,iCAAiC,MAAM,2CAA2C,qBAAqB,iCAAiC,MAAM,yJAAyJ,MAAM,+CAA+C,6BAA6B,MAAM,sFAAsF,MAAM;AAChf,eAAe,QAAQ,IAAI,KAAK,4CAA4C,oBAAoB,uBAAuB,SAAS,wHAAwH,6GAA6G,8CAA8C,MAAM,8CAA8C,MAAM;AAC7c,gEAAgE,oCAAoC,MAAM,0CAA0C,qCAAqC,uBAAuB,0BAA0B,MAAM,gFAAgF,uCAAuC,+BAA+B,kDAAkD,kCAAkC;AAC1d,qCAAqC,sBAAsB,+CAA+C,MAAM,8CAA8C,wBAAwB,MAAM,mDAAmD,MAAM,6EAA6E,+CAA+C,gDAAgD,qCAAqC,uBAAuB,iBAAiB,MAAM;AACpf,uBAAuB,yBAAyB,MAAM,2CAA2C,uBAAuB,MAAM,2FAA2F,MAAM,oDAAoD,sBAAsB,wCAAwC,MAAM,kDAAkD,MAAM,wDAAwD,sBAAsB;AAC7d,eAAe,MAAM,gDAAgD,4BAA4B,MAAM,6CAA6C,4GAA4G,8DAA8D,MAAM,uEAAuE,mEAAmE,MAAM;AACpd,6CAA6C,MAAM,mDAAmD,MAAM,mDAAmD,yBAAyB,MAAM,8EAA8E,MAAM,oCAAoC,uFAAuF,MAAM,iDAAiD,MAAM;AAC1c,mBAAmB,6CAA6C,iBAAiB,QAAQ,IAAI,gFAAgF,qCAAqC,QAAQ,QAAQ,WAAW,KAAK,WAAW,4CAA4C,iBAAiB,0BAA0B,qDAAqD;AACzY,kBAAkB,oCAAoC,sBAAsB,uBAAuB,iDAAiD,sBAAsB,iDAAiD,yBAAyB,oBAAoB,wCAAwC,sBAAsB,kBAAkB,4CAA4C,QAAQ,QAAQ,OAAO,wFAAwF;AACnf,kBAAkB,SAAS,QAAQ,KAAK,KAAK,MAAM,yCAAyC,qBAAqB,oBAAoB,kCAAkC,2EAA2E,KAAK,wBAAwB,QAAQ,IAAI,qGAAqG,OAAO,iDAAiD;AACxb,uBAAuB,QAAQ,kDAAkD,SAAS,OAAO,KAAK,OAAO,KAAK,OAAO,2BAA2B,QAAQ,uCAAuC,MAAM,YAAY,WAAW,6CAA6C,8CAA8C,WAAW,YAAY,WAAW,WAAW,SAAS,OAAO,wFAAwF,UAAU;AAC1d,eAAe,QAAQ,mGAAmG,OAAO,UAAU,8BAA8B,oJAAoJ,+BAA+B,kCAAkC,GAAG,GAAG,6BAA6B,eAAe,iCAAiC,YAAY,QAAQ,gBAAgB;AACrf,cAAc,YAAY,UAAU,0BAA0B,kBAAkB,wBAAwB,eAAe,WAAW,QAAQ,WAAW,8CAA8C,2BAA2B,iBAAiB,QAAQ,mBAAmB,uCAAuC,oCAAoC,wCAAwC,0CAA0C,kDAAkD;AACzd,2PAA2P,2BAA2B,0BAA0B,eAAe,QAAQ,IAAI,KAAK,qBAAqB,gCAAgC,mDAAmD,+CAA+C;AACve,yBAAyB,2CAA2C,6DAA6D,yCAAyC,uCAAuC,+CAA+C,iDAAiD,yBAAyB,eAAe,yBAAyB,SAAS,QAAQ,IAAI,iCAAiC,gBAAgB,aAAa,UAAU,oBAAoB;AACne,gBAAgB,+CAA+C,eAAe,sBAAsB,gBAAgB,UAAU,aAAa,kBAAkB,oBAAoB,iBAAiB,YAAY,cAAc,eAAe,iBAAiB,+BAA+B,aAAa,wBAAwB,oCAAoC,mBAAmB,+BAA+B,kBAAkB,mBAAmB,mBAAmB,oBAAoB,gBAAgB;AAClf,GAAG,gBAAgB,eAAe,oBAAoB,qEAAqE,oBAAoB,uBAAuB,qBAAqB,sBAAsB,cAAc,iCAAiC,gBAAgB,UAAU,6HAA6H,UAAU,mBAAmB,mBAAmB,MAAM,oBAAoB;AACje,KAAK,cAAc,UAAU,YAAY,WAAW,KAAK,sBAAsB,qKAAqK,aAAa,MAAM,iBAAiB,qCAAqC,WAAW,aAAa,6BAA6B,0BAA0B,mBAAmB,2BAA2B,sCAAsC;AAChe,yBAAyB,uCAAuC,MAAM,gBAAgB,eAAe,mBAAmB,6DAA6D,QAAQ,IAAI,WAAW,aAAa,4DAA4D,uBAAuB,qBAAqB,SAAS,+BAA+B,uCAAuC,iCAAiC;AACjb,oCAAoC,qCAAqC,WAAW,QAAQ,mBAAmB,oBAAoB,8FAA8F,gDAAgD,mBAAmB,UAAU,8BAA8B,uBAAuB,0BAA0B,gBAAgB,QAAQ,mBAAmB,oBAAoB,IAAI,GAAG,UAAU,2CAA2C;AACxf,GAAG,8FAA8F,yEAAyE,qDAAqD,gGAAgG,iCAAiC,OAAO,iBAAiB,wBAAwB,8CAA8C,yBAAyB,sBAAsB,cAAc;AAC3f,uBAAuB,UAAU,qCAAqC,mEAAmE,aAAa,2BAA2B,UAAU,IAAI,qCAAqC,yBAAyB,WAAW,UAAU,IAAI,wCAAwC,yBAAyB,WAAW,UAAU,IAAI,oCAAoC,gEAAgE,aAAa;AACje,IAAI,UAAU,IAAI,8BAA8B,4DAA4D,4CAA4C,yCAAyC,sBAAsB,4DAA4D,cAAc,iBAAiB,MAAM,8CAA8C,qCAAqC,iFAAiF,GAAG;AAC/d,gEAAgE,0CAA0C,0DAA0D,IAAI,8CAA8C,8BAA8B,SAAS,gBAAgB,qGAAqG,4CAA4C,MAAM,0BAA0B;AAC9b,0BAA0B,wFAAwF,gBAAgB,EAAE,4BAA4B,SAAS,iDAAiD,4CAA4C,MAAM,sDAAsD,SAAS,QAAQ,gBAAgB,oDAAoD,KAAK,QAAQ,MAAM,8BAA8B,MAAM;AAC9c,wBAAwB,UAAU,gBAAgB,0JAA0J,oBAAoB,gFAAgF,GAAG,wBAAwB,2BAA2B,QAAQ,gBAAgB,oFAAoF;AACld,GAAG,MAAM,mHAAmH,2FAA2F,gBAAgB,KAAK,KAAK,QAAQ,gBAAgB,yEAAyE,+DAA+D,QAAQ,WAAW,+BAA+B;AACnc,QAAQ,KAAK,QAAQ,gBAAgB,mDAAmD,gEAAgE,8BAA8B,MAAM,SAAS,4EAA4E,kBAAkB,KAAK,8BAA8B,8BAA8B,UAAU,gEAAgE,kCAAkC;AAChd,uDAAuD,4DAA4D,kCAAkC,qDAAqD,qDAAqD,+DAA+D,iCAAiC,oDAAoD,sDAAsD;AACzc,eAAe,6CAA6C,mIAAmI,0CAA0C,MAAM,cAAc,iBAAiB,yCAAyC,GAAG,yBAAyB,0BAA0B,qBAAqB,uBAAuB,2BAA2B,QAAQ,IAAI,gDAAgD;AAChf,6BAA6B,8FAA8F,mCAAmC,oDAAoD,mCAAmC,cAAc,iBAAiB,UAAU,+BAA+B,6IAA6I,8BAA8B;AACxe,+BAA+B,yCAAyC,GAAG,iBAAiB,2BAA2B,iCAAiC,MAAM,uDAAuD,yBAAyB,mBAAmB,4BAA4B,oCAAoC,QAAQ,IAAI,KAAK,mCAAmC,4GAA4G,GAAG;AACpe,WAAW,GAAG,0BAA0B,IAAI,cAAc,iBAAiB,UAAU,8BAA8B,yBAAyB,8DAA8D,kBAAkB,oCAAoC,SAAS,KAAK,yBAAyB,4HAA4H,iEAAiE;AACpe,IAAI,MAAM,4BAA4B,sHAAsH,6BAA6B,sJAAsJ,6DAA6D,8BAA8B;AAC1a,qCAAqC,GAAG,yBAAyB,gCAAgC,+BAA+B,kDAAkD,0BAA0B,0DAA0D,0DAA0D;AAChU,oDAAoD,wEAAwE,+BAA+B,MAAM,sCAAsC,SAAS,QAAQ,WAAW,iCAAiC,iEAAiE,kCAAkC,sBAAsB,iDAAiD,MAAM,wCAAwC,MAAM,oEAAoE;AACtiB,MAAM,gDAAgD,MAAM,kDAAkD,UAAU,qCAAqC,oBAAoB,oCAAoC,4CAA4C,4GAA4G,sDAAsD;AACna,uBAAuB,uFAAuF,yCAAyC,gCAAgC,QAAQ,mDAAmD,4DAA4D,qCAAqC,eAAe,eAAe,QAAQ,IAAI,uEAAuE,oBAAoB,cAAc;AACte,UAAU,mCAAmC,MAAM,sDAAsD,qEAAqE,6BAA6B,kCAAkC,UAAU,wCAAwC,0BAA0B,qBAAqB,yDAAyD,MAAM,uDAAuD,MAAM;AAC1c,OAAO,qEAAqE,mEAAmE,oCAAoC,MAAM,qEAAqE,sBAAsB,+CAA+C,qJAAqJ;AACxd,mFAAmF,+CAA+C,6CAA6C,2CAA2C,mDAAmD,mDAAmD,iDAAiD,qDAAqD,6CAA6C;AACnd,sEAAsE,yDAAyD,wGAAwG,qLAAqL;AAC5Z,OAAO,4MAA4M,sCAAsC,iDAAiD,KAAK,eAAe,QAAQ,WAAW,4BAA4B,qEAAqE;AAClb,qBAAqB,8GAA8G,gBAAgB,4BAA4B,6CAA6C,mDAAmD,cAAc,wEAAwE,0DAA0D;AAC/Z,qBAAqB,UAAU,4BAA4B,qEAAqE,0DAA0D,mHAAmH,UAAU,4BAA4B,8CAA8C,GAAG,yBAAyB,GAAG,8CAA8C,GAAG,IAAI,GAAG,yBAAyB;AACjf,qEAAqE,GAAG,yBAAyB,MAAM,wEAAwE,GAAG,yBAAyB,MAAM,wDAAwD,MAAM,yCAAyC,oFAAoF,qDAAqD;AACjc,6BAA6B,4CAA4C,GAAG,yBAAyB,GAAG,0DAA0D,IAAI,GAAG,yBAAyB,MAAM,wDAAwD,MAAM,uDAAuD;AAC7T,gBAAgB,yDAAyD,yDAAyD,2DAA2D,kDAAkD,MAAM,8DAA8D,gEAAgE,4DAA4D,uCAAuC;AACtd,wBAAwB,sGAAsG,qDAAqD,+DAA+D,yEAAyE,mCAAmC,MAAM,mDAAmD,SAAS,QAAQ,WAAW,oDAAoD,UAAU;AACjf,YAAY,sDAAsD,eAAe,sBAAsB,qDAAqD,sFAAsF,6BAA6B,0BAA0B,qGAAqG,2BAA2B,yBAAyB,iDAAiD;AACnf,wBAAwB,iFAAiF,2BAA2B,sBAAsB,uGAAuG,2BAA2B,2BAA2B;AACvT,qBAAqB,yDAAyD,qCAAqC,sBAAsB,wDAAwD,wDAAwD,mBAAmB,iCAAiC,wBAAwB,oBAAoB,sCAAsC,4BAA4B,UAAU,iCAAiC,2CAA2C;AACjf,GAAG,uCAAuC,2CAA2C,4BAA4B,qCAAqC,0BAA0B,0CAA0C,2CAA2C,+BAA+B,wCAAwC,6BAA6B,wCAAwC,2CAA2C,6BAA6B,sCAAsC;AAC/f,yCAAyC,2CAA2C,4EAA4E,2BAA2B,2CAA2C,GAAG,uCAAuC,4BAA4B,wCAAwC,iGAAiG,oCAAoC,oBAAoB,IAAI;AACjf,WAAW,cAAc,IAAI,qCAAqC,WAAW,QAAQ,gCAAgC,wBAAwB,oBAAoB,SAAS,QAAQ,sBAAsB,KAAK,sBAAsB,mCAAmC,wCAAwC,kBAAkB,gDAAgD,oDAAoD;AACpa,qBAAqB,6CAA6C,8CAA8C,8CAA8C,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,+BAA+B,0BAA0B,wBAAwB,wBAAwB,uBAAuB,MAAM,QAAQ,WAAW,KAAK,WAAW,wCAAwC,WAAW,UAAU,4BAA4B,aAAa,kDAAkD,2CAA2C,oBAAoB;AAC9mB,iBAAiB,GAAG,oBAAoB,UAAU,mBAAmB,OAAO,gBAAgB,EAAE,wEAAwE,yCAAyC,kBAAkB,uBAAuB,wCAAwC,2DAA2D,0BAA0B,eAAe,eAAe,eAAe,eAAe,eAAe,+BAA+B,yBAAyB,qBAAqB,mBAAmB,kCAAkC;AAClkB,qBAAqB,MAAM,KAAK,QAAQ,WAAW,yDAAyD,uBAAuB,iBAAiB,cAAc,GAAG,sCAAsC,aAAa,QAAQ,uBAAuB,KAAK,uBAAuB,gBAAgB,wBAAwB,oDAAoD,kBAAkB,gBAAgB,eAAe,0BAA0B,QAAQ,WAAW,KAAK,QAAQ,mBAAmB;AAC7e,wGAAwG,wBAAwB,EAAE,MAAM,uDAAuD,KAAK,2EAA2E,EAAE,OAAO,gBAAgB,UAAU,4BAA4B,MAAM,+CAA+C,gCAAgC,8DAA8D;AACje,KAAK,iCAAiC,oEAAoE,qBAAqB,6KAA6K,cAAc,mBAAmB,+BAA+B,mEAAmE,KAAK,kCAAkC,cAAc;AACpe,mCAAmC,2DAA2D,kCAAkC,uBAAuB,0CAA0C,cAAc,uBAAuB,0BAA0B,iBAAiB,wLAAwL,gCAAgC,OAAO,iBAAiB,wBAAwB;AACzhB,gDAAgD,sBAAsB,yBAAyB,gBAAgB,IAAI,yDAAyD,sBAAsB,cAAc,wBAAwB,qBAAqB,4EAA4E,mBAAmB,6BAA6B,2FAA2F,uBAAuB;AAC3e,yBAAyB,yBAAyB,kCAAkC,2BAA2B,GAAG,0EAA0E,cAAc,iBAAiB,wEAAwE,GAAG,yBAAyB,0BAA0B,qBAAqB,uBAAuB;AACrY,kDAAkD,gCAAgC,OAAO,iBAAiB,wBAAwB,qDAAqD,sBAAsB,yBAAyB,gBAAgB,IAAI,yDAAyD,sBAAsB,cAAc,iBAAiB,wBAAwB,qBAAqB,wBAAwB,cAAc,kBAAkB,+BAA+B,UAAU;AACtf,yJAAyJ,qBAAqB,2FAA2F,qCAAqC,IAAI,8DAA8D,kDAAkD,GAAG,yBAAyB,WAAW,GAAG,cAAc,iBAAiB;AAC3e,wCAAwC,cAAc,MAAM,8EAA8E,GAAG,mBAAmB,IAAI,6CAA6C,oEAAoE,8BAA8B,iCAAiC,OAAO,6BAA6B,wBAAwB,aAAa,GAAG,KAAK,8BAA8B,iCAAiC;AACpe,4DAA4D,kBAAkB,SAAS,KAAK,MAAM,+BAA+B,uBAAuB,SAAS,IAAI,IAAI,KAAK,6BAA6B,0BAA0B,gBAAgB,iCAAiC,gCAAgC,8CAA8C,2BAA2B,yBAAyB,8BAA8B,oBAAoB,SAAS,QAAQ,IAAI;AAC/d,QAAQ,iCAAiC,8BAA8B,2BAA2B,oCAAoC,sBAAsB,8BAA8B,cAAc,QAAQ,IAAI,KAAK,oBAAoB,oBAAoB,4GAA4G,WAAW,yBAAyB,sBAAsB;AACva,qBAAqB,kCAAkC,sBAAsB,cAAc,iBAAiB,cAAc,GAAG,iBAAiB,wBAAwB,cAAc,iBAAiB,yEAAyE,+GAA+G,aAAa,kCAAkC,gCAAgC;AAC5c,+BAA+B,0DAA0D,6DAA6D,GAAG,yBAAyB,8BAA8B,2BAA2B,8DAA8D,GAAG,yBAAyB,kDAAkD,GAAG,yBAAyB,2BAA2B,yBAAyB;AACvc,GAAG,oBAAoB,uFAAuF,2DAA2D,iBAAiB,cAAc,iBAAiB,+FAA+F,GAAG,yBAAyB,yBAAyB,cAAc,GAAG,iBAAiB,uBAAuB,uHAAuH;AAC7hB,yBAAyB,6BAA6B,cAAc,kBAAkB,gCAAgC,gDAAgD,oBAAoB,uEAAuE,GAAG,kBAAkB,sCAAsC,MAAM,yBAAyB,8BAA8B,OAAO;AAChY,cAAc,2CAA2C,gCAAgC,uBAAuB,QAAQ,IAAI,KAAK,iBAAiB,uGAAuG,GAAG,yBAAyB,gCAAgC,8CAA8C,KAAK,aAAa,mBAAmB,gDAAgD,sCAAsC;AAC9d,YAAY,uBAAuB,SAAS,cAAc,4CAA4C,QAAQ,IAAI,sCAAsC,6EAA6E,GAAG,yBAAyB,4BAA4B,QAAQ,IAAI,KAAK,aAAa,uBAAuB,0BAA0B,yBAAyB,mCAAmC,GAAG,MAAM;AACjb,iBAAiB,SAAS,uBAAuB,qCAAqC,+CAA+C,wCAAwC,wBAAwB,6CAA6C,wEAAwE,0BAA0B,wBAAwB;AAC5W,oDAAoD,uBAAuB,yBAAyB,8BAA8B,qCAAqC,iEAAiE,SAAS,MAAM,sHAAsH,iIAAiI,eAAe,KAAK;AAClgB,iDAAiD,QAAQ,mBAAmB,yDAAyD,QAAQ,uCAAuC,+DAA+D,uDAAuD,SAAS,yDAAyD,uFAAuF,sBAAsB,EAAE;AAC3d,0CAA0C,0CAA0C,2CAA2C,SAAS,EAAE,6CAA6C,YAAY,EAAE,iCAAiC,uPAAuP,EAAE;AAC/d,2CAA2C,0BAA0B,GAAG,0GAA0G,0BAA0B,GAAG,iEAAiE,yBAAyB,MAAM,EAAE,MAAM;AACvT,+DAA+D,QAAQ,WAAW,kDAAkD,uBAAuB,IAAI,kDAAkD,WAAW,6HAA6H,EAAE,QAAQ,mBAAmB,yGAAyG,GAAG,QAAQ;AAC1e,sBAAsB,+GAA+G,GAAG,gGAAgG,GAAG,iGAAiG,+FAA+F,IAAI,uBAAuB,EAAE;AACxc,6BAA6B,GAAG,+BAA+B,IAAI,EAAE,8CAA8C,iCAAiC,EAAE,sBAAsB,YAAY,kDAAkD,2CAA2C,oBAAoB,sEAAsE,GAAG,qBAAqB,YAAY,iBAAiB,YAAY,OAAO,gBAAgB,EAAE,EAAE,eAAe,MAAM;AAChe,8CAA8C,kBAAkB,iBAAiB,8CAA8C,GAAG,6EAA6E,mDAAmD,mCAAmC,IAAI,mDAAmD,wBAAwB,GAAG,gDAAgD,GAAG,qBAAqB,GAAG,sBAAsB,GAAG,uBAAuB;AAClf,KAAK,sDAAsD,yFAAyF,oDAAoD,oGAAoG,gEAAgE,+DAA+D,4DAA4D;AACve,mBAAmB,KAAK,eAAe,uDAAuD,GAAG,mFAAmF,2BAA2B,kCAAkC,2EAA2E,8CAA8C,4BAA4B,OAAO,gDAAgD,UAAU;AACvc,yCAAyC,sBAAsB,kIAAkI,oFAAoF,gDAAgD,mBAAmB,KAAK,oCAAoC,wDAAwD,iEAAiE;AAC1f,gCAAgC,GAAG,IAAI,yCAAyC,gCAAgC,mDAAmD,kFAAkF,qBAAqB,gBAAgB,GAAG,GAAG,+BAA+B,mHAAmH,qBAAqB,6BAA6B,GAAG;AACve,iBAAiB,+BAA+B,GAAG,cAAc,iBAAiB,UAAU,uCAAuC,mEAAmE,mCAAmC,yCAAyC,6BAA6B,KAAK,yBAAyB,8BAA8B,8BAA8B,GAAG,cAAc,iBAAiB,uBAAuB;AAClc,aAAa,GAAG,yBAAyB,0BAA0B,qBAAqB,uBAAuB,2BAA2B,QAAQ,IAAI,8EAA8E,qCAAqC,8FAA8F,qBAAqB,cAAc,iBAAiB,uCAAuC,IAAI,gCAAgC;AACte,sDAAsD,sCAAsC,EAAE,oDAAoD,GAAG,2EAA2E,GAAG,UAAU,+BAA+B,qDAAqD,sCAAsC,6BAA6B,yCAAyC,mCAAmC;AAChd,+CAA+C,+BAA+B,eAAe,EAAE,4DAA4D,EAAE,4HAA4H,EAAE,oFAAoF,0BAA0B,GAAG,wGAAwG,0BAA0B;AAC9gB,gCAAgC,IAAI,EAAE,8CAA8C,iCAAiC,EAAE,qBAAqB,YAAY,kDAAkD,2CAA2C,oBAAoB,sEAAsE,GAAG,qBAAqB,YAAY,iBAAiB,YAAY,OAAO,cAAc,EAAE,qBAAqB,qBAAqB,EAAE,EAAE,uBAAuB;AAC5e,QAAQ,UAAU,GAAG,iBAAiB,8EAA8E,GAAG,0EAA0E,2BAA2B,8CAA8C,kCAAkC,8BAA8B,sHAAsH;AAChc,GAAG,4EAA4E,+DAA+D,8BAA8B,kBAAkB,+BAA+B,8BAA8B,iHAAiH,kDAAkD,4DAA4D;AAC1d,GAAG,kBAAkB,gCAAgC,uBAAuB,oBAAoB,qBAAqB,oCAAoC,2DAA2D,2EAA2E,gCAAgC,OAAO,iBAAiB,wBAAwB,qDAAqD,sBAAsB,yBAAyB,gBAAgB,IAAI,GAAG;AAC1e,iBAAiB,sBAAsB,uBAAuB,sBAAsB,iDAAiD,MAAM,yCAAyC,MAAM,sKAAsK,sDAAsD,+CAA+C,qBAAqB,iBAAiB;AAC3e,MAAM,iDAAiD,MAAM,+CAA+C,sBAAsB,QAAQ,IAAI,+BAA+B,MAAM,iDAAiD,uBAAuB,yBAAyB,MAAM,qDAAqD,sCAAsC,MAAM,yCAAyC,6CAA6C;AACjd,6CAA6C,yCAAyC,6CAA6C,+CAA+C,+CAA+C,uDAAuD,8BAA8B,0CAA0C,MAAM,4BAA4B,sCAAsC,MAAM,4CAA4C,MAAM,sCAAsC;AACtgB,MAAM,yEAAyE,iCAAiC,MAAM,QAAQ,WAAW,sBAAsB,+BAA+B,4BAA4B,uDAAuD,mCAAmC,yLAAyL;AAC7e,KAAK,4EAA4E,6BAA6B,OAAO,QAAQ,6BAA6B,WAAW,UAAU,qCAAqC,IAAI,MAAM,qCAAqC,IAAI,MAAM,+GAA+G,MAAM,mGAAmG,MAAM;AAC3e,EAAE,0CAA0C,IAAI,kIAAkI,UAAU,iBAAiB,kFAAkF,oGAAoG,OAAO,mCAAmC,GAAG,MAAM,qCAAqC,GAAG,MAAM,qCAAqC;AACzgB,iBAAiB,0GAA0G,GAAG,mCAAmC,GAAG,MAAM,qCAAqC,GAAG,MAAM,gCAAgC,qCAAqC,MAAM,iBAAiB,sFAAsF,2CAA2C,GAAG,MAAM,yCAAyC,MAAM,4DAA4D;AACziB,iBAAiB,qCAAqC,yCAAyC,GAAG,MAAM,gCAAgC,2DAA2D,MAAM,4CAA4C,yCAAyC,YAAY,8BAA8B,SAAS,gBAAgB,mBAAmB,sDAAsD,wBAAwB,sBAAsB,uBAAuB;AAC/e,EAAE,SAAS,uBAAuB,iBAAiB,UAAU,iCAAiC,aAAa,iBAAiB,8EAA8E,0BAA0B,oBAAoB,4BAA4B,wDAAwD,GAAG,gIAAgI,GAAG;AACld,qCAAqC,IAAI,gCAAgC,QAAQ,sCAAsC,mCAAmC,QAAQ,KAAK,WAAW,wBAAwB,+BAA+B,MAAM,kDAAkD,2BAA2B,sBAAsB,QAAQ,IAAI,2FAA2F,8BAA8B,6BAA6B,0GAA0G,kDAAkD,EAAE,+CAA+C,uCAAuC,gBAAgB,uDAAuD,qFAAqF,EAAE;AACt4B,2CAA2C,0BAA0B,GAAG,0GAA0G,0BAA0B,GAAG,iEAAiE,wBAAwB,2BAA2B,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,aAAa;AACld,uBAAuB,OAAO,sBAAsB,OAAO,oBAAoB,EAAE,+BAA+B,IAAI,EAAE,8CAA8C,iCAAiC,EAAE,oBAAoB,EAAE,qBAAqB,YAAY,kDAAkD,2CAA2C,oBAAoB,sEAAsE,GAAG,qBAAqB,YAAY,iBAAiB,YAAY,OAAO,iBAAiB,EAAE;AAChhB,sBAAsB,2CAA2C,eAAe,GAAG,MAAM,+BAA+B,gCAAgC,iBAAiB,wCAAwC,UAAU,6BAA6B,gBAAgB,2CAA2C,uDAAuD,UAAU,0BAA0B,mBAAmB,YAAY,gBAAgB,OAAO,yDAAyD;AAC7f,mCAAmC,GAAG,IAAI,yCAAyC,4BAA4B,kBAAkB,qDAAqD,iBAAiB,iDAAiD,6BAA6B,iCAAiC,qDAAqD,gBAAgB,+CAA+C,oBAAoB,uDAAuD;AACrf,cAAc,sCAAsC,sBAAsB,2CAA2C,2CAA2C,yDAAyD,kBAAkB,cAAc,cAAc,4CAA4C,gCAAgC,EAAE,GAAG,+BAA+B,mDAAmD,uDAAuD;AACje,2BAA2B,EAAE,GAAG,+BAA+B,oBAAoB,gGAAgG,QAAQ,oBAAoB,8CAA8C,wCAAwC,iDAAiD,yJAAyJ;AAC/e,UAAU,YAAY,8FAA8F,oBAAoB,mBAAmB,eAAe,sCAAsC,oDAAoD,sCAAsC,IAAI,oDAAoD,2DAA2D,QAAQ,eAAe,aAAa;AACjc,gBAAgB,qCAAqC,wBAAwB,wBAAwB,UAAU,+BAA+B,2CAA2C,wFAAwF,aAAa,6EAA6E,2DAA2D,6CAA6C,aAAa,UAAU;AAC1e,0DAA0D,qEAAqE,qDAAqD,aAAa,0CAA0C,EAAE,EAAE,SAAS,aAAa,MAAM,wDAAwD,mBAAmB,wBAAwB,2EAA2E,0BAA0B,MAAM,kBAAkB;AAC3e,QAAQ,YAAY,KAAK,oBAAoB,SAAS,IAAI,WAAW,+BAA+B,qBAAqB,OAAO,eAAe,qBAAqB,EAAE,oBAAoB,MAAM,kKAAkK,yFAAyF,gBAAgB,aAAa,MAAM,eAAe;AAC7e,wDAAwD,aAAa,mCAAmC,OAAO,8DAA8D,oBAAoB,UAAU,gEAAgE,yCAAyC,SAAS,EAAE,EAAE,0DAA0D,gCAAgC,gEAAgE;AAC3d,GAAG,cAAc,kBAAkB,sCAAsC,sBAAsB,mBAAmB,oEAAoE,wCAAwC,cAAc,kBAAkB,sCAAsC,sBAAsB,mBAAmB,+DAA+D,2CAA2C;AACvb,OAAO,0CAA0C,mBAAmB,mDAAmD,gEAAgE,6BAA6B,eAAe,sGAAsG,cAAc,cAAc,wDAAwD;AAC7Z,aAAa,2CAA2C,iGAAiG,aAAa,+FAA+F,aAAa,oBAAoB,MAAM,8EAA8E,QAAQ,WAAW,KAAK,WAAW;AAC7Z,kCAAkC,sCAAsC,qBAAqB,SAAS,EAAE,SAAS,aAAa,+BAA+B,SAAS,GAAG,8BAA8B,8FAA8F,WAAW,6CAA6C,KAAK,mCAAmC,2DAA2D,+CAA+C;AAC/e,uBAAuB,qEAAqE,+DAA+D,+CAA+C,eAAe,iCAAiC,mCAAmC,kBAAkB,mCAAmC,8CAA8C,8CAA8C,8CAA8C,qBAAqB;AACjf,cAAc,kBAAkB,uDAAuD,MAAM,eAAe,eAAe,KAAK,aAAa,QAAQ,mBAAmB,IAAI,EAAE,iBAAiB,kCAAkC,yBAAyB,QAAQ,IAAI,gCAAgC,iBAAiB,mDAAmD,MAAM,aAAa,YAAY,SAAS,+EAA+E,eAAe;AAChf,oBAAoB,WAAW,yBAAyB,sDAAsD,QAAQ,OAAO,6DAA6D,6CAA6C,8DAA8D,eAAe,kBAAkB,uCAAuC,QAAQ,EAAE,wBAAwB,8BAA8B,gBAAgB,gBAAgB,0BAA0B;AACve,GAAG,qBAAqB,yBAAyB,sBAAsB,2CAA2C,4BAA4B,0CAA0C,4CAA4C,0DAA0D,sDAAsD,MAAM,iCAAiC,WAAW,kBAAkB,iBAAiB,eAAe,kBAAkB,eAAe,QAAQ,QAAQ;AACze,IAAI,cAAc,IAAI,yBAAyB,IAAI,IAAI,WAAW,SAAS,KAAK,WAAW,WAAW,KAAK,KAAK,KAAK,UAAU,0BAA0B,EAAE,IAAI,IAAI,WAAW,SAAS,KAAK,WAAW,MAAM,MAAM,IAAI,kCAAkC,SAAS,IAAI,iDAAiD,wBAAwB,UAAU,mDAAmD,gCAAgC,iBAAiB,oDAAoD;AACjf,IAAI,0DAA0D,sBAAsB,aAAa,gBAAgB,IAAI,6DAA6D,EAAE,WAAW,kDAAkD,4BAA4B,IAAI,oBAAoB,IAAI,IAAI,cAAc,KAAK,4BAA4B,IAAI,mBAAmB,IAAI,IAAI,cAAc,UAAU,EAAE,uBAAuB,wCAAwC,aAAa,WAAW;AAC5e,kBAAkB,aAAa,mBAAmB,4BAA4B,IAAI,oBAAoB,wCAAwC,aAAa,WAAW,qCAAqC,aAAa,oBAAoB,4BAA4B,IAAI,mBAAmB,8CAA8C,IAAI,oBAAoB,QAAQ,sCAAsC,aAAa,eAAe,qCAAqC,aAAa,eAAe;AAChf,oBAAoB,oDAAoD,UAAU,0DAA0D,sBAAsB,mBAAmB,gBAAgB,IAAI,8DAA8D,EAAE,WAAW,EAAE,gCAAgC,gCAAgC,iBAAiB,IAAI,kBAAkB,QAAQ,oBAAoB,IAAI,IAAI,cAAc,KAAK,IAAI,kBAAkB,QAAQ,mBAAmB,IAAI,IAAI,eAAe;AAC5f,GAAG,EAAE,uBAAuB,4BAA4B,kCAAkC,UAAU,qBAAqB,aAAa,qCAAqC,SAAS,oBAAoB,IAAI,6BAA6B,mBAAmB,4BAA4B,8BAA8B,UAAU,qBAAqB,aAAa,qCAAqC,SAAS,mBAAmB,IAAI,6BAA6B,oBAAoB;AACxd,IAAI,oBAAoB,QAAQ,sCAAsC,qBAAqB,WAAW,qCAAqC,qBAAqB,WAAW,uCAAuC,kDAAkD,+BAA+B,sBAAsB,wBAAwB,oCAAoC,wCAAwC,uEAAuE;AACpe,KAAK,wCAAwC,aAAa,wIAAwI,uDAAuD,uBAAuB,WAAW,gJAAgJ,+DAA+D;AAC1e,6DAA6D,uBAAuB,WAAW,uFAAuF,8DAA8D,YAAY,MAAM,cAAc,YAAY,qCAAqC,YAAY,YAAY,YAAY,oDAAoD,qCAAqC,2BAA2B;AAC7d,iBAAiB,mDAAmD,aAAa,YAAY,qDAAqD,mDAAmD,uBAAuB,qDAAqD,kBAAkB,kDAAkD,6BAA6B,YAAY,WAAW,UAAU,mDAAmD,WAAW;AACjd,kDAAkD,mDAAmD,IAAI,8CAA8C,6DAA6D,yDAAyD,eAAe,qDAAqD,0BAA0B,oFAAoF,YAAY,WAAW;AACtd,sBAAsB,kEAAkE,QAAQ,4IAA4I,0EAA0E;AACtT,mCAAmC,kCAAkC,qCAAqC,OAAO,OAAO,uGAAuG,WAAW,YAAY,6DAA6D,MAAM;AACzT,aAAa,iBAAiB,oBAAoB,oDAAoD,yBAAyB,iBAAiB,sEAAsE,MAAM,QAAQ,wBAAwB,KAAK,IAAI,iDAAiD,aAAa,MAAM,KAAK,IAAI,EAAE,iBAAiB,8BAA8B,+FAA+F,KAAK;AACve,GAAG,wCAAwC,0GAA0G,gCAAgC,8BAA8B,iBAAiB,QAAQ,aAAa,WAAW,UAAU,eAAe,OAAO,iBAAiB,mCAAmC,WAAW,OAAO,uCAAuC,sCAAsC,aAAa,iBAAiB,OAAO,4CAA4C;AACxgB,iDAAiD,cAAc,QAAQ,iBAAiB,sDAAsD,6CAA6C,4CAA4C,iFAAiF,kGAAkG,EAAE,eAAe,aAAa;AACxb;AACA;AACA;AACA;AACA,4aAA4a,oDAAoD,YAAY;AAC5e,QAAQ,yDAAyD,kWAAkW,6iBAA6iB;AACh9B,KAAK,6BAA6B,UAAU,8EAA8E,MAAM,6BAA6B,UAAU,qJAAqJ,MAAM,6BAA6B,UAAU,+IAA+I;AACxf,OAAO,+BAA+B,UAAU,8VAA8V,MAAM,6BAA6B,UAAU,8IAA8I;AACzkB,UAAU,kCAAkC,UAAU,oMAAoM,MAAM,6BAA6B,UAAU,2FAA2F,qBAAqB,UAAU,iCAAiC,oBAAoB;AACtd,0GAA0G,MAAM,6BAA6B,oBAAoB,2UAA2U,sUAAsU;AAClzB,QAAQ,gCAAgC,oBAAoB,kGAAkG,YAAY,4CAA4C,oBAAoB,gZAAgZ;AAC1nB,QAAQ,gCAAgC,oBAAoB,iOAAiO,UAAU,iCAAiC,oBAAoB,wGAAwG,2HAA2H,kDAAkD;AACjnB,SAAS,iCAAiC,UAAU,mNAAmN,UAAU,iCAAiC,oBAAoB,sLAAsL;AAC5f,MAAM,8BAA8B,UAAU,iMAAiM,MAAM,6BAA6B,UAAU,oIAAoI,KAAK,4BAA4B,UAAU,8LAA8L;AACzoB,OAAO,+BAA+B,oBAAoB,oWAAoW,aAAa,oCAAoC,oBAAoB;AACne,gQAAgQ,aAAa,oCAAoC,oBAAoB,4SAA4S;AACjnB,MAAM,8BAA8B,oBAAoB,0SAA0S,MAAM,6BAA6B,UAAU,gFAAgF,SAAS;AACxe,QAAQ,UAAU,6SAA6S,MAAM,6BAA6B,YAAY,qVAAqV;AACnsB,KAAK,6BAA6B,YAAY,uVAAuV,OAAO,4CAA4C,oBAAoB,gMAAgM;AAC5oB,KAAK,6BAA6B,UAAU,6HAA6H,OAAO,8BAA8B,oBAAoB,yNAAyN,MAAM,6BAA6B,UAAU;AACxe,iEAAiE,MAAM,6BAA6B,oBAAoB,8OAA8O,QAAQ,+BAA+B,YAAY,0NAA0N,6MAA6M;AACh0B,MAAM,8BAA8B,UAAU,0KAA0K,QAAQ,+BAA+B,+BAA+B,sQAAsQ;AACpiB,SAAS,iCAAiC,oBAAoB,0KAA0K,SAAS,gCAAgC,qHAAqH,qSAAqS;AAC3qB,KAAK,6BAA6B,2DAA2D,4RAA4R,OAAO,8BAA8B,oBAAoB,oJAAoJ;AACtkB,4BAA4B,sUAAsU,6CAA6C;AAC/Y,sHAAsH,+BAA+B,UAAU,8VAA8V;AAC7f,+DAA+D,6CAA6C,qBAAqB,iEAAiE,+CAA+C,qBAAqB;AACtQ,kIAAkI,eAAe,gGAAgG,6CAA6C,6CAA6C,6CAA6C,iBAAiB;AACzY,oDAAoD,mDAAmD,2CAA2C,eAAe,6CAA6C,+CAA+C,iDAAiD,kDAAkD,sEAAsE,gDAAgD;AACtd,kDAAkD,sDAAsD,oDAAoD,sDAAsD,kDAAkD,0DAA0D,4DAA4D,oDAAoD,oDAAoD;AACle,8BAA8B,kDAAkD,sDAAsD,gDAAgD,oDAAoD,sDAAsD,oDAAoD,mDAAmD,oDAAoD,oDAAoD;AAC/e,gCAAgC,wDAAwD,gDAAgD,0DAA0D,oEAAoE,0DAA0D,gDAAgD,gDAAgD,gDAAgD;AAChd,kEAAkE,wDAAwD,gDAAgD,wDAAwD,0DAA0D,oDAAoD,gDAAgD,kDAAkD,oDAAoD;AACte,+BAA+B,4DAA4D,oDAAoD,4DAA4D,sDAAsD,0DAA0D,0DAA0D,kDAAkD,sDAAsD;AAC7d,wBAAwB,0IAA0I,IAAI;;;;;;;;;;;;;;;;;;;;;;ACjiC/I;AACY;AAMpB;AACgE;AAC/E;AACA;AACA,6BAA6B,2CAAQ;AACrC;AACA,QAAQ,+CAAY;AACpB;AACA,gBAAgB,+CAAY,CAAC,iEAAyB;AACtD;AACA;AACA;AACA,YAAY,oDAAiB;AAC7B,kCAAkC,4CAAS;AAC3C;AACA;AACA;AACA;AACA,sBAAsB,6CAAG;AACzB,uBAAuB,6CAAG;AAC1B,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,6CAAC,CAAC,+CAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB,kBAAkB,iBAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA,2DAA2D,iBAAiB;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6CAAC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,gBAAgB;AACxE;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gDAAgD,kBAAkB;AAClE;AACA;AACA;AACA;AACA;AACA,iEAAe,cAAc;;;;;;;;;;;;AC5K7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClBwC;AACR;AAChC;AACuD;AACE;AACD;AACxD;AACwE;AACJ;AACN;AACA;AACE;AACA;AACA;AACI;AACM;AACV;AACJ;AACE;AACM;AACpE;AACuE;AACE;AACE;AACA;AAC3E;AAC4C;AAC5C;AACgF;AACJ;AACN;AACA;AACE;AACA;AACA;AACI;AACM;AACV;AACJ;AACE;AACM;AAC5E;AAC+E;AACE;AACE;AACA;AACnF;AACoD;AACpD;AACyB;AACzB;AAC6C;AAC7C;AACA,cAAc,mDAAiB,EAAE,sEAAS;AAC1C,cAAc,oDAAkB,EAAE,uEAAU;AAC5C,gDAAc,GAAG,kEAAM;AACvB,mDAAiB,GAAG,kEAAM;AAC1B;AACA,0CAAO;AACP;AACA;AACA,IAAI,gDAAc;AAClB,IAAI,2DAAqB;AACzB,IAAI,yDAAmB;AACvB,IAAI,sDAAgB;AACpB,IAAI,sDAAgB;AACpB,IAAI,uDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,wDAAiB;AACrB,IAAI,0DAAmB;AACvB,IAAI,6DAAsB;AAC1B,IAAI,wDAAiB;AACrB,IAAI,sDAAe;AACnB,IAAI,uDAAgB;AACpB,IAAI,0DAAmB;AACvB,IAAI,8DAAkB;AACtB,IAAI,+DAAmB;AACvB,IAAI,gEAAoB;AACxB,IAAI,gEAAoB;AACxB,IAAI,0CAAU;AACd;AACA;AACA;AACA,IAAI,gDAAc;AAClB,IAAI,gEAAyB;AAC7B,IAAI,8DAAuB;AAC3B,IAAI,2DAAoB;AACxB,IAAI,2DAAoB;AACxB,IAAI,4DAAqB;AACzB,IAAI,4DAAqB;AACzB,IAAI,4DAAqB;AACzB,IAAI,8DAAuB;AAC3B,IAAI,iEAA0B;AAC9B,IAAI,4DAAqB;AACzB,IAAI,0DAAmB;AACvB,IAAI,2DAAoB;AACxB,IAAI,8DAAuB;AAC3B,IAAI,kEAAsB;AAC1B,IAAI,mEAAuB;AAC3B,IAAI,oEAAwB;AAC5B,IAAI,oEAAwB;AAC5B,IAAI,8CAAc;AAClB,E","sources":["webpack://@mixly/python-skulpt-car/../python/blocks/control.js","webpack://@mixly/python-skulpt-car/../python/blocks/dicts.js","webpack://@mixly/python-skulpt-car/../python/blocks/html.js","webpack://@mixly/python-skulpt-car/../python/blocks/lists.js","webpack://@mixly/python-skulpt-car/../python/blocks/logic.js","webpack://@mixly/python-skulpt-car/../python/blocks/math.js","webpack://@mixly/python-skulpt-car/../python/blocks/procedures.js","webpack://@mixly/python-skulpt-car/../python/blocks/set.js","webpack://@mixly/python-skulpt-car/../python/blocks/storage.js","webpack://@mixly/python-skulpt-car/../python/blocks/text.js","webpack://@mixly/python-skulpt-car/../python/blocks/tuple.js","webpack://@mixly/python-skulpt-car/../python/blocks/utility.js","webpack://@mixly/python-skulpt-car/../python/blocks/variables.js","webpack://@mixly/python-skulpt-car/../python/generators/control.js","webpack://@mixly/python-skulpt-car/../python/generators/dicts.js","webpack://@mixly/python-skulpt-car/../python/generators/html.js","webpack://@mixly/python-skulpt-car/../python/generators/lists.js","webpack://@mixly/python-skulpt-car/../python/generators/logic.js","webpack://@mixly/python-skulpt-car/../python/generators/math.js","webpack://@mixly/python-skulpt-car/../python/generators/procedures.js","webpack://@mixly/python-skulpt-car/../python/generators/set.js","webpack://@mixly/python-skulpt-car/../python/generators/storage.js","webpack://@mixly/python-skulpt-car/../python/generators/text.js","webpack://@mixly/python-skulpt-car/../python/generators/tuple.js","webpack://@mixly/python-skulpt-car/../python/generators/utility.js","webpack://@mixly/python-skulpt-car/../python/generators/variables.js","webpack://@mixly/python-skulpt-car/../python/others/names.js","webpack://@mixly/python-skulpt-car/../python/others/procedures.js","webpack://@mixly/python-skulpt-car/../python/others/variables.js","webpack://@mixly/python-skulpt-car/../python/python_generator.js","webpack://@mixly/python-skulpt-car/../python_skulpt/blocks/data.js","webpack://@mixly/python-skulpt-car/../python_skulpt/blocks/inout.js","webpack://@mixly/python-skulpt-car/../python_skulpt/blocks/system.js","webpack://@mixly/python-skulpt-car/../python_skulpt/blocks/turtle.js","webpack://@mixly/python-skulpt-car/../python_skulpt/generators/data.js","webpack://@mixly/python-skulpt-car/../python_skulpt/generators/inout.js","webpack://@mixly/python-skulpt-car/../python_skulpt/generators/system.js","webpack://@mixly/python-skulpt-car/../python_skulpt/generators/turtle.js","webpack://@mixly/python-skulpt-car/./blocks/game.js","webpack://@mixly/python-skulpt-car/./generators/game.js","webpack://@mixly/python-skulpt-car/./others/loader.js","webpack://@mixly/python-skulpt-car/./others/mixpy-project.js","webpack://@mixly/python-skulpt-car/./others/nav-ext.js","webpack://@mixly/python-skulpt-car/./others/py-engine.js","webpack://@mixly/python-skulpt-car/./others/python-shell.js","webpack://@mixly/python-skulpt-car/./others/skulpt/pygame-zero.js","webpack://@mixly/python-skulpt-car/./others/skulpt/pygame-zero.min.js","webpack://@mixly/python-skulpt-car/./others/skulpt/skulpt-stdlib.js","webpack://@mixly/python-skulpt-car/./others/skulpt/skulpt.js","webpack://@mixly/python-skulpt-car/./others/skulpt/skulpt.min.js","webpack://@mixly/python-skulpt-car/./others/statusbar-image.js","webpack://@mixly/python-skulpt-car/./css/color_mixpy_python_skulpt.css?b95b","webpack://@mixly/python-skulpt-car/external var \"$\"","webpack://@mixly/python-skulpt-car/external var \"Blockly\"","webpack://@mixly/python-skulpt-car/external var \"Mixly\"","webpack://@mixly/python-skulpt-car/webpack/bootstrap","webpack://@mixly/python-skulpt-car/webpack/runtime/compat get default export","webpack://@mixly/python-skulpt-car/webpack/runtime/define property getters","webpack://@mixly/python-skulpt-car/webpack/runtime/global","webpack://@mixly/python-skulpt-car/webpack/runtime/hasOwnProperty shorthand","webpack://@mixly/python-skulpt-car/webpack/runtime/make namespace object","webpack://@mixly/python-skulpt-car/webpack/runtime/publicPath","webpack://@mixly/python-skulpt-car/./index.js"],"sourcesContent":["import * as Blockly from 'blockly/core';\r\n\r\nconst LOOPS_HUE = 120;\r\n\r\nexport const controls_main = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_NAME_MAIN);\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_SETUP);\r\n }\r\n};\r\n\r\nexport const base_setup = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_SETUP);\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_SETUP);\r\n }\r\n};\r\n\r\nexport const controls_delay = {\r\n init: function () {\r\n var UNIT = [\r\n [Blockly.Msg.MIXLY_mSecond, 'delay'],\r\n [Blockly.Msg.MIXLY_uSecond, 'delayMicroseconds']\r\n ];\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput(\"DELAY_TIME\", Number)\r\n .appendField(Blockly.Msg.MIXLY_DELAY)\r\n .appendField(new Blockly.FieldDropdown(UNIT), 'UNIT')\r\n .setCheck(Number);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);\r\n this.setHelpUrl(\"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#id9\");\r\n this.wiki = {\r\n 'zh-hans': {\r\n page: ['Arduino AVR', '控制', '延时']\r\n }\r\n };\r\n }\r\n};\r\n\r\nexport const controls_end_program = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_CONTROL_END_PROGRAM);\r\n this.setPreviousStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_CONTROL_END_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const controls_if = {\r\n /**\r\n * Block for if/elseif/else condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n //this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL);\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('IF0')\r\n .setCheck([Boolean, Number])\r\n .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);\r\n this.appendStatementInput('DO0')\r\n .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setHelpUrl(\"https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#if\");\r\n this.setMutator(new Blockly.icons.MutatorIcon(['controls_if_elseif',\r\n 'controls_if_else'], this));\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) {\r\n return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;\r\n } else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) {\r\n return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;\r\n } else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) {\r\n return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;\r\n } else if (thisBlock.elseifCount_ && thisBlock.elseCount_) {\r\n return Blockly.Msg.CONTROLS_IF_TOOLTIP_4;\r\n }\r\n return '';\r\n });\r\n this.elseifCount_ = 0;\r\n this.elseCount_ = 0;\r\n },\r\n /**\r\n * Create XML to represent the number of else-if and else inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n if (!this.elseifCount_ && !this.elseCount_) {\r\n return null;\r\n }\r\n var container = document.createElement('mutation');\r\n if (this.elseifCount_) {\r\n container.setAttribute('elseif', this.elseifCount_);\r\n }\r\n if (this.elseCount_) {\r\n container.setAttribute('else', 1);\r\n }\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the else-if and else inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var containerBlock = this;\r\n var valueConnections = [];\r\n var statementConnections = [];\r\n // var elseStatementConnection = null;\r\n if (this.elseCount_) {\r\n // if (containerBlock.getInputTargetBlock('ELSE') && containerBlock.getInputTargetBlock('ELSE').previousConnection)\r\n // elseStatementConnection = containerBlock.getInputTargetBlock('ELSE').previousConnection;\r\n this.removeInput('ELSE');\r\n }\r\n for (var i = this.elseifCount_; i > 0; i--) {\r\n if (containerBlock.getInputTargetBlock('IF' + i) && containerBlock.getInputTargetBlock('IF' + i).previousConnection)\r\n valueConnections[i] = (containerBlock.getInputTargetBlock('IF' + i).previousConnection);\r\n else\r\n valueConnections[i] = null;\r\n this.removeInput('IF' + i);\r\n if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection)\r\n statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection);\r\n else\r\n statementConnections[i] = null;\r\n this.removeInput('DO' + i);\r\n }\r\n this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10);\r\n this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10);\r\n //this.compose(containerBlock);\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n this.appendValueInput('IF' + i)\r\n .setCheck([Boolean, Number])\r\n .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF);\r\n this.appendStatementInput('DO' + i)\r\n .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);\r\n }\r\n if (this.elseCount_) {\r\n this.appendStatementInput('ELSE')\r\n .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE);\r\n }\r\n for (var i = valueConnections.length - 2; i > 0; i--) {\r\n if (valueConnections[i])\r\n valueConnections[i].reconnect(this, 'IF' + i);\r\n }\r\n for (var i = statementConnections.length - 2; i > 0; i--) {\r\n if (statementConnections[i])\r\n statementConnections[i].reconnect(this, 'DO' + i);\r\n }\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock = workspace.newBlock('controls_if_if');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n var elseifBlock = workspace.newBlock('controls_if_elseif');\r\n elseifBlock.initSvg();\r\n connection.connect(elseifBlock.previousConnection);\r\n connection = elseifBlock.nextConnection;\r\n }\r\n if (this.elseCount_) {\r\n var elseBlock = workspace.newBlock('controls_if_else');\r\n elseBlock.initSvg();\r\n connection.connect(elseBlock.previousConnection);\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n // Disconnect the else input blocks and remove the inputs.\r\n if (this.elseCount_) {\r\n this.removeInput('ELSE');\r\n }\r\n this.elseCount_ = 0;\r\n // Disconnect all the elseif input blocks and remove the inputs.\r\n for (var i = this.elseifCount_; i > 0; i--) {\r\n this.removeInput('IF' + i);\r\n this.removeInput('DO' + i);\r\n }\r\n this.elseifCount_ = 0;\r\n // Rebuild the block's optional inputs.\r\n var clauseBlock = containerBlock.getInputTargetBlock('STACK');\r\n var valueConnections = [null];\r\n var statementConnections = [null];\r\n var elseStatementConnection = null;\r\n while (clauseBlock) {\r\n switch (clauseBlock.type) {\r\n case 'controls_if_elseif':\r\n this.elseifCount_++;\r\n valueConnections.push(clauseBlock.valueConnection_);\r\n statementConnections.push(clauseBlock.statementConnection_);\r\n break;\r\n case 'controls_if_else':\r\n this.elseCount_++;\r\n elseStatementConnection = clauseBlock.statementConnection_;\r\n break;\r\n default:\r\n throw Error('Unknown block type: ' + clauseBlock.type);\r\n }\r\n clauseBlock = clauseBlock.nextConnection &&\r\n clauseBlock.nextConnection.targetBlock();\r\n }\r\n\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);\r\n\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var clauseBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 1;\r\n while (clauseBlock) {\r\n switch (clauseBlock.type) {\r\n case 'controls_if_elseif':\r\n var inputIf = this.getInput('IF' + i);\r\n var inputDo = this.getInput('DO' + i);\r\n clauseBlock.valueConnection_ =\r\n inputIf && inputIf.connection.targetConnection;\r\n clauseBlock.statementConnection_ =\r\n inputDo && inputDo.connection.targetConnection;\r\n i++;\r\n break;\r\n case 'controls_if_else':\r\n var inputDo = this.getInput('ELSE');\r\n clauseBlock.statementConnection_ =\r\n inputDo && inputDo.connection.targetConnection;\r\n break;\r\n default:\r\n throw 'Unknown block type.';\r\n }\r\n clauseBlock = clauseBlock.nextConnection &&\r\n clauseBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Reconstructs the block with all child blocks attached.\r\n */\r\n rebuildShape_: function () {\r\n var valueConnections = [null];\r\n var statementConnections = [null];\r\n var elseStatementConnection = null;\r\n\r\n if (this.getInput('ELSE')) {\r\n elseStatementConnection = this.getInput('ELSE').connection.targetConnection;\r\n }\r\n var i = 1;\r\n while (this.getInput('IF' + i)) {\r\n var inputIf = this.getInput('IF' + i);\r\n var inputDo = this.getInput('DO' + i);\r\n console.log(inputIf.connection.targetConnection);\r\n valueConnections.push(inputIf.connection.targetConnection);\r\n statementConnections.push(inputDo.connection.targetConnection);\r\n i++;\r\n }\r\n this.updateShape_();\r\n this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @this Blockly.Block\r\n * @private\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('ELSE')) {\r\n this.removeInput('ELSE');\r\n }\r\n var i = 1;\r\n while (this.getInput('IF' + i)) {\r\n this.removeInput('IF' + i);\r\n this.removeInput('DO' + i);\r\n i++;\r\n }\r\n // Rebuild block.\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n this.appendValueInput('IF' + i)\r\n .setCheck([Number, Boolean])\r\n .appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSEIF']);\r\n this.appendStatementInput('DO' + i)\r\n .appendField(Blockly.Msg['CONTROLS_IF_MSG_THEN']);\r\n }\r\n if (this.elseCount_) {\r\n this.appendStatementInput('ELSE')\r\n .appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSE']);\r\n }\r\n },\r\n /**\r\n * Reconnects child blocks.\r\n * @param {!Array} valueConnections List of value\r\n * connectsions for if input.\r\n * @param {!Array} statementConnections List of\r\n * statement connections for do input.\r\n * @param {?Blockly.RenderedConnection} elseStatementConnection Statement\r\n * connection for else input.\r\n */\r\n reconnectChildBlocks_: function (valueConnections, statementConnections,\r\n elseStatementConnection) {\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n valueConnections[i] && valueConnections[i].reconnect(this, 'IF' + i);\r\n statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i);\r\n }\r\n elseStatementConnection && elseStatementConnection.reconnect(this, 'ELSE');\r\n }\r\n};\r\n\r\n\r\nexport const controls_range = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('FROM')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.PYTHON_RANGE)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);\r\n this.appendValueInput('TO')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO);\r\n this.appendValueInput('STEP')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.PYTHON_RANGE_STEP);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const controls_forEach = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('LIST')\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT_ITEM)\r\n // .appendField(new Blockly.FieldTextInput('i'), 'VAR');\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.MIXLY_DO);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(function () {\r\n return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace('“%1”', '');\r\n });\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const controls_whileUntil = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('BOOL')\r\n .setCheck([Boolean, Number])\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT)\r\n .appendField(new Blockly.FieldDropdown(this.OPERATORS), 'MODE')\r\n // this.appendDummyInput()\r\n // .appendField(Blockly.Msg.CONTROLS_WHILE_SHI);\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT + Blockly.Msg.MIXLY_DO);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var op = thisBlock.getFieldValue('MODE');\r\n var TOOLTIPS = {\r\n 'WHILE': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,\r\n 'UNTIL': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL\r\n };\r\n return TOOLTIPS[op];\r\n });\r\n }\r\n};\r\n\r\nexport const controls_try_finally = {\r\n /**\r\n * Block for if/elseif/else condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TRY);\r\n this.appendStatementInput('try');\r\n this.appendValueInput('IF1')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_EXCEPT);\r\n this.appendStatementInput('DO1')\r\n .appendField('');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['controls_except', 'controls_finally'], this));\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_CONTROL_TRY_TOOLTIP);\r\n this.elseifCount_ = 1;\r\n this.elseCount_ = 0;\r\n },\r\n /**\r\n * Create XML to represent the number of else-if and else inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n if (!this.elseifCount_ && !this.elseCount_) {\r\n return null;\r\n }\r\n var container = document.createElement('mutation');\r\n if (this.elseifCount_) {\r\n container.setAttribute('elseif', this.elseifCount_);\r\n }\r\n if (this.elseCount_) {\r\n container.setAttribute('else', 1);\r\n }\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the else-if and else inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var containerBlock = this;\r\n var valueConnections = [];\r\n var statementConnections = [];\r\n // var elseStatementConnection = null;\r\n if (this.elseCount_) {\r\n // if (containerBlock.getInputTargetBlock('ELSE') && containerBlock.getInputTargetBlock('ELSE').previousConnection)\r\n // elseStatementConnection = containerBlock.getInputTargetBlock('ELSE').previousConnection;\r\n this.removeInput('ELSE');\r\n }\r\n for (var i = this.elseifCount_; i > 0; i--) {\r\n if (containerBlock.getInputTargetBlock('IF' + i) && containerBlock.getInputTargetBlock('IF' + i).previousConnection)\r\n valueConnections[i] = (containerBlock.getInputTargetBlock('IF' + i).previousConnection);\r\n else\r\n valueConnections[i] = null;\r\n this.removeInput('IF' + i);\r\n if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection)\r\n statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection);\r\n else\r\n statementConnections[i] = null;\r\n this.removeInput('DO' + i);\r\n }\r\n this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10);\r\n this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10);\r\n //this.compose(containerBlock);\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n this.appendValueInput('IF' + i)\r\n .setCheck([Boolean, Number])\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_EXCEPT);\r\n this.appendStatementInput('DO' + i)\r\n .appendField(\"\");\r\n }\r\n if (this.elseCount_) {\r\n this.appendStatementInput('ELSE')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_FINALLY);\r\n }\r\n for (var i = valueConnections.length - 2; i > 0; i--) {\r\n if (valueConnections[i])\r\n valueConnections[i].reconnect(this, 'IF' + i);\r\n }\r\n for (var i = statementConnections.length - 2; i > 0; i--) {\r\n if (statementConnections[i])\r\n statementConnections[i].reconnect(this, 'DO' + i);\r\n }\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock = workspace.newBlock('controls_try');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n var elseifBlock = workspace.newBlock('controls_except');\r\n elseifBlock.initSvg();\r\n connection.connect(elseifBlock.previousConnection);\r\n connection = elseifBlock.nextConnection;\r\n }\r\n if (this.elseCount_) {\r\n var elseBlock = workspace.newBlock('controls_finally');\r\n elseBlock.initSvg();\r\n connection.connect(elseBlock.previousConnection);\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n // Disconnect the else input blocks and remove the inputs.\r\n if (this.elseCount_) {\r\n this.removeInput('ELSE');\r\n }\r\n this.elseCount_ = 0;\r\n // Disconnect all the elseif input blocks and remove the inputs.\r\n for (var i = this.elseifCount_; i > 0; i--) {\r\n this.removeInput('IF' + i);\r\n this.removeInput('DO' + i);\r\n }\r\n this.elseifCount_ = 0;\r\n // Rebuild the block's optional inputs.\r\n var clauseBlock = containerBlock.getInputTargetBlock('STACK');\r\n var valueConnections = [null];\r\n var statementConnections = [null];\r\n var elseStatementConnection = null;\r\n while (clauseBlock) {\r\n switch (clauseBlock.type) {\r\n case 'controls_except':\r\n this.elseifCount_++;\r\n valueConnections.push(clauseBlock.valueConnection_);\r\n statementConnections.push(clauseBlock.statementConnection_);\r\n break;\r\n case 'controls_finally':\r\n this.elseCount_++;\r\n elseStatementConnection = clauseBlock.statementConnection_;\r\n break;\r\n default:\r\n throw Error('Unknown block type: ' + clauseBlock.type);\r\n }\r\n clauseBlock = clauseBlock.nextConnection &&\r\n clauseBlock.nextConnection.targetBlock();\r\n }\r\n\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);\r\n\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var clauseBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 1;\r\n while (clauseBlock) {\r\n switch (clauseBlock.type) {\r\n case 'controls_except':\r\n var inputIf = this.getInput('IF' + i);\r\n var inputDo = this.getInput('DO' + i);\r\n clauseBlock.valueConnection_ =\r\n inputIf && inputIf.connection.targetConnection;\r\n clauseBlock.statementConnection_ =\r\n inputDo && inputDo.connection.targetConnection;\r\n i++;\r\n break;\r\n case 'controls_finally':\r\n var inputDo = this.getInput('ELSE');\r\n clauseBlock.statementConnection_ =\r\n inputDo && inputDo.connection.targetConnection;\r\n break;\r\n default:\r\n throw 'Unknown block type.';\r\n }\r\n clauseBlock = clauseBlock.nextConnection &&\r\n clauseBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Reconstructs the block with all child blocks attached.\r\n */\r\n rebuildShape_: function () {\r\n var valueConnections = [null];\r\n var statementConnections = [null];\r\n var elseStatementConnection = null;\r\n\r\n if (this.getInput('ELSE')) {\r\n elseStatementConnection = this.getInput('ELSE').connection.targetConnection;\r\n }\r\n var i = 1;\r\n while (this.getInput('IF' + i)) {\r\n var inputIf = this.getInput('IF' + i);\r\n var inputDo = this.getInput('DO' + i);\r\n console.log(inputIf.connection.targetConnection);\r\n valueConnections.push(inputIf.connection.targetConnection);\r\n statementConnections.push(inputDo.connection.targetConnection);\r\n i++;\r\n }\r\n this.updateShape_();\r\n this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @this Blockly.Block\r\n * @private\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('ELSE')) {\r\n this.removeInput('ELSE');\r\n }\r\n var i = 1;\r\n while (this.getInput('IF' + i)) {\r\n this.removeInput('IF' + i);\r\n this.removeInput('DO' + i);\r\n i++;\r\n }\r\n // Rebuild block.\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n this.appendValueInput('IF' + i)\r\n .setCheck([Number, Boolean])\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_EXCEPT);\r\n this.appendStatementInput('DO' + i)\r\n .appendField('');\r\n }\r\n if (this.elseCount_) {\r\n this.appendStatementInput('ELSE')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_FINALLY);\r\n }\r\n },\r\n /**\r\n * Reconnects child blocks.\r\n * @param {!Array} valueConnections List of value\r\n * connectsions for if input.\r\n * @param {!Array} statementConnections List of\r\n * statement connections for do input.\r\n * @param {?Blockly.RenderedConnection} elseStatementConnection Statement\r\n * connection for else input.\r\n */\r\n reconnectChildBlocks_: function (valueConnections, statementConnections,\r\n elseStatementConnection) {\r\n for (var i = 1; i <= this.elseifCount_; i++) {\r\n valueConnections[i] && valueConnections[i].reconnect(this, 'IF' + i);\r\n statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i);\r\n }\r\n elseStatementConnection && elseStatementConnection.reconnect(this, 'ELSE');\r\n }\r\n};\r\n\r\nexport const controls_flow_statements = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n var dropdown = new Blockly.FieldDropdown(this.OPERATORS);\r\n this.appendDummyInput()\r\n .appendField(dropdown, 'FLOW')\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_INPUT_OFLOOP);\r\n this.setPreviousStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_FLOW_STATEMENTS_TOOLTIP);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var op = thisBlock.getFieldValue('FLOW');\r\n var TOOLTIPS = {\r\n 'BREAK': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK,\r\n 'CONTINUE': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE\r\n };\r\n return TOOLTIPS[op];\r\n });\r\n },\r\n onchange: function () {\r\n if (!this.workspace) {\r\n // Block has been deleted.\r\n return;\r\n }\r\n var legal = false;\r\n // Is the block nested in a control statement?\r\n var block = this;\r\n do {\r\n if (block.type == 'controls_repeat' ||\r\n block.type == 'controls_for' ||\r\n block.type == 'controls_forEach' ||\r\n block.type == 'controls_repeat_ext' ||\r\n block.type == 'controls_whileUntil' ||\r\n block.type == 'do_while') {\r\n legal = true;\r\n break;\r\n }\r\n block = block.getSurroundParent();\r\n } while (block);\r\n if (legal) {\r\n this.setWarningText(null);\r\n } else {\r\n this.setWarningText(Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_WARNING);\r\n }\r\n }\r\n};\r\n\r\n\r\nexport const controls_for = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_WITH)\r\n .appendField(new Blockly.FieldTextInput('i'), 'VAR');\r\n this.appendValueInput('FROM')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);\r\n this.appendValueInput('TO')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO);\r\n this.appendValueInput('STEP')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.MIXLY_STEP);\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.MIXLY_DO);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace('%1',\r\n thisBlock.getFieldValue('VAR'));\r\n });\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const controls_for_range = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_WITH)\r\n .appendField(new Blockly.FieldTextInput('i'), 'VAR');\r\n this.appendValueInput('FROM')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);\r\n this.appendValueInput('TO')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO);\r\n this.appendValueInput('STEP')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.MIXLY_STEP);\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.MIXLY_DO);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n return Blockly.Msg.MIXLY_PYTHON_CONTROLS_FOR_RANGE_TOOLTIP.replace('%1',\r\n thisBlock.getFieldValue('VAR'));\r\n });\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\n\r\ncontrols_whileUntil.OPERATORS = [\r\n [Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE, 'WHILE'],\r\n [Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, 'UNTIL']\r\n];\r\n\r\n\r\n\r\ncontrols_flow_statements.OPERATORS = [\r\n [Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK, 'BREAK'],\r\n [Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE, 'CONTINUE']\r\n];\r\n\r\n\r\n\r\nexport const controls_if_if = {\r\n /**\r\n * Mutator block for if container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const controls_if_elseif = {\r\n /**\r\n * Mutator bolck for else-if condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const controls_if_else = {\r\n /**\r\n * Mutator block for else condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE);\r\n this.setPreviousStatement(true);\r\n this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\n\r\n\r\nexport const controls_try = {\r\n /**\r\n * Mutator block for if container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField('try');\r\n this.appendStatementInput('STACK');\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const controls_except = {\r\n /**\r\n * Mutator bolck for else-if condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_EXCEPT);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.contextMenu = false;\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_CONTROL_EXCEPT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const controls_finally = {\r\n /**\r\n * Mutator block for else condition.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_FINALLY);\r\n this.setPreviousStatement(true);\r\n this.contextMenu = false;\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_CONTROL_FINALLY_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const controls_repeat_ext = {\r\n /**\r\n * Block for repeat n times (external number).\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.jsonInit({\r\n \"message0\": Blockly.Msg.CONTROLS_REPEAT_TITLE,\r\n \"args0\": [\r\n {\r\n \"type\": \"input_value\",\r\n \"name\": \"TIMES\",\r\n // \"check\": \"Number\"\r\n }\r\n ],\r\n \"previousStatement\": null,\r\n \"nextStatement\": null,\r\n \"colour\": LOOPS_HUE,\r\n \"tooltip\": Blockly.Msg.CONTROLS_REPEAT_TOOLTIP,\r\n \"helpUrl\": Blockly.Msg.CONTROLS_REPEAT_HELPURL\r\n });\r\n this.appendStatementInput('DO');\r\n }\r\n};\r\n\r\n\r\n\r\nexport const controls_lambda = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('BOOL')\r\n .appendField('lambda')\r\n //.appendField(new Blockly.FieldDropdown(this.OPERATORS), 'MODE');\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.MIXLY_STAT);\r\n this.setOutput(true);\r\n // this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const controls_pass = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_PASS);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_PASS_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const controls_thread = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_START)\r\n this.appendValueInput('callback')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE)\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_PARAMS);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_TOOLTIP);\r\n }\r\n};\r\n\r\n//do-while循环\r\nexport const do_while = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_REPEAT + Blockly.Msg.MIXLY_DO);\r\n this.appendStatementInput(\"input_data\")\r\n .setCheck(null)\r\n this.appendValueInput(\"select_data\")\r\n .setCheck(null)\r\n .appendField(Blockly.Msg.CONTROLS_OPERATOR_UNTIL)\r\n .appendField(new Blockly.FieldDropdown([[Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE, \"true\"], [Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, \"false\"]]), \"type\");\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setColour(LOOPS_HUE);\r\n this.setTooltip(\"do-while loop\");\r\n this.setHelpUrl(\"\");\r\n }\r\n};\r\n\r\nexport const garbage_collection = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_OP_GARBAGE_COLLECT);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const get_mem_alloc = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GET_MEM_ALLOC);\r\n this.setOutput(true)\r\n }\r\n};\r\n\r\nexport const get_mem_free = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GET_MEM_FREE);\r\n this.setOutput(true)\r\n }\r\n};\r\n\r\nexport const get_unique_identifier = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_DEVICE + 'ID');\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_GET_UNIQUE_IDEN);\r\n }\r\n};\r\n\r\n// export const base_type = controls_type;\r\n// export const controls_TypeLists = controls_typeLists;\r\n\r\nexport const datetime_fromtimestamp = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_RTC_TIMESTAMP);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TIMESTAMP_TO_DATA);\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n }\r\n};\r\n\r\n\r\nexport const gene_unique_identifier = {\r\n init: function () {\r\n this.setColour(LOOPS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GET_UNIQUE_IDEN);\r\n this.setOutput(true)\r\n }\r\n};","/**\r\n * @license\r\n * Visual Blocks Editor\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Dictionary blocks for Blockly.\r\n * @author acbart@vt.edu (Austin Cory Bart)\r\n */\r\nimport * as Blockly from 'blockly/core';\r\n\r\nconst DICTS_HUE = 345;\r\n\r\nexport const dicts_create_with = {\r\n\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldTextInput('mydict'), 'VAR')\r\n .appendField(new Blockly.FieldLabel(Blockly.Msg.DICTS_CREATE_WITH_INPUT_WITH), 'TIP')\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['dicts_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_TOOLTIP);\r\n },\r\n\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('dicts_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('dicts_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n }\r\n\r\n var keyNames = [];\r\n for (var i = 0; this.getInput('ADD' + i); i++) {\r\n //this.getInput('VALUE' + i).removeField(\"KEY\"+i);\r\n keyNames.push(this.getFieldValue(\"KEY\" + i))\r\n this.removeInput('ADD' + i);\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.getField('TIP').setValue(Blockly.Msg.DICTS_CREATE_EMPTY_TITLE);\r\n } else {\r\n this.getField('TIP').setValue(Blockly.Msg.DICTS_CREATE_WITH_INPUT_WITH);\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n this.appendValueInput('ADD' + i)\r\n .setCheck(null)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(\r\n new Blockly.FieldTextInput(\r\n keyNames.length > i\r\n ? keyNames[i]\r\n : (i == 0 ? '\"key\"' : '\"key' + (i + 1) + '\"')),\r\n 'KEY' + i)\r\n .appendField(\":\")\r\n }\r\n }\r\n }, getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\n\r\n\r\nexport const dicts_create_with_container = {\r\n\r\n /**\r\n * Mutator block for list container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const dicts_create_with_item = {\r\n /**\r\n * Mutator bolck for adding items.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TITLE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const dicts_keys = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.DICT_KEYS);\r\n this.setTooltip(Blockly.Msg.DICTS_KEYS_TOOLTIP);\r\n this.setOutput(true, 'List');\r\n }\r\n};\r\n\r\nexport const dicts_get = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n // this.appendDummyInput(\"\")\r\n\r\n // .appendField(Blockly.Msg.DICTS_GET_FROM_DICTS)\r\n\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.DICTS_GET_IN)\r\n this.appendDummyInput(\"\")\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n .appendField(Blockly.Msg.DICTS_ADD_VALUE);\r\n\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.DICTS_GET_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const dicts_get_default = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.DICTS_GET_IN)\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.DICTS_ADD_VALUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.DICTS_DEFAULT_VALUE);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.DICTS_GET_DEFAULT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const dicts_add_or_change = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.DICTS_ADD)\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n this.appendDummyInput()\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.DICTS_ADD_VALUE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.DICTS_ADD_OR_CHANGE_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const dicts_delete = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.DICTS_DELETE_IN)\r\n this.appendDummyInput(\"\")\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n .appendField(Blockly.Msg.DICTS_DELETE_VALUE);\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.DICTS_DELETE_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const dicts_update = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT2')\r\n .setCheck('Dict')\r\n .appendField(Blockly.Msg.MAKE_DICT)\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n .appendField(Blockly.Msg.DICT_UPDATE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MID);\r\n this.setTooltip(Blockly.Msg.DICTS_UPDATE_TOOLTIP);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const dicts_clear = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.DICT_CLEAR);\r\n this.setTooltip(Blockly.Msg.DICTS_CLEAR_TOOLTIP);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const dicts_items = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.DICT_ITEMS);\r\n this.setTooltip(Blockly.Msg.DICTS_ITEMS_TOOLTIP);\r\n this.setOutput(true, 'List');\r\n }\r\n};\r\n\r\nexport const dicts_values = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.DICT_VALUES);\r\n this.setTooltip(Blockly.Msg.DICTS_VALUES_TOOLTIP);\r\n this.setOutput(true, 'List');\r\n }\r\n};\r\n\r\nexport const dicts_length = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_LENGTH)\r\n\r\n this.setTooltip(Blockly.Msg.DICT_LENGTH_TOOLTIP);\r\n this.setOutput(true, Number);\r\n }\r\n};\r\n\r\nexport const dicts_deldict = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.DICT_DELDICT);\r\n this.setTooltip(Blockly.Msg.DICTS_DEL_TOOLTIP);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const dicts_add_change_del = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n\r\n this['MODE'] = [\r\n [Blockly.Msg.DICTS_ADD_OR_CHANGE, 'INSERT'],\r\n [Blockly.Msg.MIXLY_MICROBIT_JS_DELETE_VAR, 'DELETE']\r\n ];\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput('AT2')\r\n this.appendValueInput('KEY')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n .appendField(Blockly.Msg.DICTS_ADD_VALUE);\r\n this.updateAt_(true);\r\n this.setInputsInline(true);\r\n this.setOutput(false);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var b = this;\r\n this.setTooltip(function () {\r\n var e = b.getFieldValue(\"WHERE\"),\r\n d = \"\";\r\n switch (e) {\r\n case \"INSERT\":\r\n d = Blockly.Msg.DICTS_ADD_TOOLTIP;\r\n break;\r\n case \"DELETE\":\r\n d = Blockly.Msg.DICTS_DELETE_TOOLTIP;\r\n break;\r\n }\r\n //if (\"FROM_START\" == e || \"FROM_END\" == e) d += \" \" + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace(\"%1\", ONE_BASED_INDEXING ? \"#1\": \"#0\");\r\n return d\r\n })\r\n\r\n },\r\n /**\r\n * Create XML to represent whether there are 'AT' inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n var isAt = this.getInput('AT2').type == Blockly.INPUT_VALUE;\r\n container.setAttribute('at2', isAt);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the 'AT' inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var isAt = (xmlElement.getAttribute('at2') == 'true');\r\n this.updateAt_(isAt);\r\n },\r\n /**\r\n * Create or delete an input for a numeric index.\r\n * This block has two such inputs, independant of each other.\r\n * @param {number} n Specify first or second input (1 or 2).\r\n * @param {boolean} isAt True if the input should exist.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateAt_: function (isAt) {\r\n // Create or delete an input for the numeric index.\r\n // Destroy old 'AT' and 'ORDINAL' inputs.\r\n this.removeInput('AT2');\r\n this.removeInput('ORDINAL', true);\r\n // Create either a value 'AT' input or a dummy input.\r\n if (isAt) {\r\n this.appendValueInput('AT2').setCheck(Number);\r\n } else {\r\n this.appendDummyInput('AT2');\r\n }\r\n var menu = new Blockly.FieldDropdown(this['MODE'],\r\n function (value) {\r\n var newAt = (value == 'INSERT');\r\n // The 'isAt' variable is available due to this function being a\r\n // closure.\r\n if (newAt != isAt) {\r\n var block = this.sourceBlock_;\r\n block.updateAt_(newAt);\r\n // This menu has been destroyed and replaced.\r\n // Update the replacement.\r\n block.setFieldValue(value, 'WHERE');\r\n return null;\r\n }\r\n return undefined;\r\n });\r\n\r\n this.getInput('AT2')\r\n .appendField(menu, 'WHERE');\r\n\r\n // this.moveInputBefore('AT2','LIST');\r\n }\r\n};\r\n\r\nexport const dicts_pop = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_DICT_POP)\r\n this.appendValueInput('KEY')\r\n this.appendDummyInput(\"\")\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n .appendField(Blockly.Msg.DICTS_ADD_VALUE);\r\n this.setTooltip(Blockly.Msg.DICT_POP_TOOLTIP);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const dicts_setdefault = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict');\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.DICTS_SET_DEFAULT)\r\n this.appendDummyInput(\"\")\r\n // .appendField(new Blockly.FieldTextInput('\"key\"'), 'KEY')\r\n .appendField(Blockly.Msg.DICTS_DEFAULT_VALUE);\r\n this.appendValueInput('VAR')\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.DICTS_SETDEFAULT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const dicts_create_with_noreturn = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendDummyInput(\"\")\r\n // .appendField(new Blockly.FieldTextInput('mydict'), 'VAR')\r\n .appendField(new Blockly.FieldLabel(Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT), 'TIP')\r\n .appendField(' ')\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setOutput(true, \"Dict\")\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['dicts_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_TOOLTIP);\r\n },\r\n\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('dicts_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('dicts_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n }\r\n\r\n var keyNames = [];\r\n for (var i = 0; this.getInput('ADD' + i); i++) {\r\n //this.getInput('VALUE' + i).removeField(\"KEY\"+i);\r\n keyNames.push(this.getFieldValue(\"KEY\" + i))\r\n this.removeInput('ADD' + i);\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.getField('TIP').setValue(Blockly.Msg.LOGIC_NULL + Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT);\r\n } else {\r\n this.getField('TIP').setValue(Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT);\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n this.appendValueInput('ADD' + i)\r\n .setCheck(null)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(\r\n new Blockly.FieldTextInput(\r\n keyNames.length > i\r\n ? keyNames[i]\r\n : (i == 0 ? '\"key\"' : '\"key' + (i + 1) + '\"')),\r\n 'KEY' + i)\r\n .appendField(\":\")\r\n }\r\n\r\n }\r\n }, getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const dicts_todict = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TODICT);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TODICT);\r\n }\r\n};\r\n\r\nexport const dicts_to_json = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TO_JSON);\r\n this.setTooltip(Blockly.Msg.MIXLY_TO_JSON_TOOLTIP);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const json_to_dicts = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('VAR');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_CONVERT_TO_JSON);\r\n this.setTooltip(Blockly.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const dicts_to_to ={\r\n init:function(){\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict');\r\n this.appendValueInput('VAR1')\r\n .appendField('key1');\r\n this.appendValueInput('VAR2')\r\n .appendField('index');\r\n this.appendValueInput('VAR3')\r\n .appendField('key2');\r\n this.appendValueInput('VAR4')\r\n .appendField('key3');\r\n this.setInputsInline(true)\r\n this.setTooltip(Blockly.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP);\r\n this.setOutput(true);\r\n }\r\n}\r\n\r\nexport const dicts_to_json2 = {\r\n init: function () {\r\n this.setColour(DICTS_HUE);\r\n this.appendValueInput('DICT');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TO_JSON);\r\n this.setTooltip(Blockly.Msg.MIXLY_TO_JSON_TOOLTIP);\r\n this.setOutput(true);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst HTML_HUE = '#1ec1e4';\r\n\r\nexport const html_document = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_DOCUMENT);\r\n this.appendStatementInput('HEAD')\r\n .appendField(Blockly.Msg.HTML_HEAD);\r\n this.appendStatementInput('BODY')\r\n .appendField(Blockly.Msg.HTML_BODY);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const html_title = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_LEVEL)\r\n .appendField(new Blockly.FieldDropdown([[\"1\", \"1\"], [\"2\", \"2\"], [\"3\", \"3\"], [\"4\", \"4\"], [\"5\", \"5\"], [\"6\", \"6\"]]), 'LEVEL');\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_head_body = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.HTML_HEAD, \"head\"],\r\n [Blockly.Msg.HTML_BODY, \"body\"]\r\n ]), 'LEVEL');\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_content = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.HTML_P, \"p\"],\r\n [Blockly.Msg.HTML_SPAN, \"span\"],\r\n [Blockly.Msg.HTML_FORM, \"form\"],\r\n [Blockly.Msg.HTML_TABLE, \"table\"],\r\n [Blockly.Msg.HTML_LINE, \"tr\"],\r\n [Blockly.Msg.HTML_CELL, \"td\"],\r\n [Blockly.Msg.HTML_OL, \"ol\"],\r\n [Blockly.Msg.HTML_UL, \"ul\"],\r\n [Blockly.Msg.HTML_LI, \"li\"]\r\n ]), 'LEVEL')\r\n // this.appendValueInput('style')\r\n // .appendField(Blockly.Msg.MIXLY_AIP_ATTR)\r\n // .setAlign(Blockly.inputs.Align.RIGHT);\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setInputsInline(false);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_content_more = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField('<')\r\n .appendField(new Blockly.FieldTextInput('tag'), \"LEVEL\")\r\n .appendField('>')\r\n this.appendValueInput('style')\r\n .appendField(Blockly.Msg.MIXLY_AIP_ATTR)\r\n .setAlign(Blockly.inputs.Align.RIGHT);\r\n this.appendStatementInput('DO')\r\n .appendField('');\r\n this.setInputsInline(false);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_style = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_STYLE)\r\n this.appendStatementInput('STYLE');\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const html_form = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_FORM_CONTENT)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.HTML_TEXT, \"text\"],\r\n [Blockly.Msg.HTML_EMAIL, \"email\"],\r\n [Blockly.Msg.HTML_NUMBER, \"number\"],\r\n [Blockly.Msg.HTML_PASSWORD, \"password\"],\r\n [Blockly.Msg.HTML_CHECKBOX, \"checkbox\"],\r\n [Blockly.Msg.HTML_RADIOBUTTON, \"radiobutton\"],\r\n [Blockly.Msg.HTML_BUTTON, \"button\"],\r\n [Blockly.Msg.HTML_COLOUR, \"colour\"],\r\n [Blockly.Msg.HTML_DATE, \"date\"],\r\n [Blockly.Msg.HTML_LOCALTIME, \"local time\"],\r\n [Blockly.Msg.HTML_FILE, \"file\"],\r\n [Blockly.Msg.HTML_HIDDEN, \"hidden\"],\r\n [Blockly.Msg.HTML_IMAGE, \"image\"],\r\n [Blockly.Msg.HTML_MONTH, \"month\"],\r\n [Blockly.Msg.HTML_RANGE, \"range\"],\r\n [Blockly.Msg.HTML_RESET, \"reset\"],\r\n [Blockly.Msg.HTML_SEARCH, \"search\"],\r\n [Blockly.Msg.HTML_SUBMIT, \"submit\"],\r\n [Blockly.Msg.HTML_TELEPHONENUMBER, \"telephone number\"],\r\n [Blockly.Msg.HTML_TIME, \"time\"],\r\n [Blockly.Msg.HTML_URL, \"url\"],\r\n [Blockly.Msg.HTML_WEEK, \"week\"]\r\n ]), 'LEVEL')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_NAME)\r\n .appendField(new Blockly.FieldTextInput('car'), \"NAME\")\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_VALUE)\r\n .appendField(new Blockly.FieldTextInput('go'), \"VALUE\")\r\n this.appendValueInput('style')\r\n .appendField(Blockly.Msg.MIXLY_AIP_ATTR)\r\n .setAlign(Blockly.inputs.Align.RIGHT);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_style_content = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput('property'), \"KEY\")\r\n .appendField(':')\r\n .appendField(new Blockly.FieldTextInput('value'), \"VALUE\")\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_style_color = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput('property'), \"KEY\")\r\n .appendField(':')\r\n .appendField(new Blockly.FieldColour(\"#ff0000\"), \"RGB_LED_COLOR\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const html_text = {\r\n init: function () {\r\n this.setColour(HTML_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_TEXT)\r\n .appendField(new Blockly.FieldTextInput('text'), \"TEXT\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst LISTS_HUE = 260; //'#70b234'//260;\r\n\r\nexport const lists_get_index = {\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput(\"LIST\")\r\n this.appendValueInput(\"AT\")\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_FROM_START)\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM);\r\n }\r\n}\r\n\r\n\r\nexport const lists_get_sublist = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('LIST')\r\n this.appendDummyInput('')\r\n this.appendValueInput('AT1')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_FROM_START);\r\n this.appendValueInput('AT2')\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL + \" \" + Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL);\r\n this.setInputsInline(true);\r\n this.setOutput(true, 'List');\r\n this.setTooltip(Blockly.Msg.PYTHON_LISTS_GET_SUBLIST_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const lists_2d_get_data_with_col_row = {\r\n init: function () {\r\n this.appendValueInput(\"LIST\")\r\n .setCheck(null);\r\n this.appendValueInput(\"row\")\r\n .setCheck(null)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.DATAFRAME_RAW);\r\n this.appendValueInput(\"col\")\r\n .setCheck(null)\r\n .appendField(Blockly.Msg.DATAFRAME_COLUMN);\r\n this.setInputsInline(true);\r\n this.setOutput(true, null);\r\n this.setColour(LISTS_HUE);\r\n this.setTooltip(\"\");\r\n this.setHelpUrl(\"\");\r\n }\r\n};\r\n\r\nexport const lists_2d_get_col_row_data = {\r\n init: function () {\r\n this.appendValueInput(\"LIST\")\r\n .setCheck(null);\r\n this.appendValueInput(\"row_start\")\r\n .setCheck(null)\r\n .appendField(Blockly.Msg.MIXLY_GET + \" \" + Blockly.Msg.DATAFRAME_RAW + \" [\");\r\n this.appendValueInput(\"row_end\")\r\n .setCheck(null)\r\n .appendField(\",\");\r\n this.appendValueInput(\"col_start\")\r\n .setCheck(null)\r\n .appendField(\") \" + Blockly.Msg.DATAFRAME_COLUMN + \" [\");\r\n this.appendValueInput(\"col_end\")\r\n .setCheck(null)\r\n .appendField(\",\");\r\n this.appendDummyInput()\r\n .appendField(\") \" + Blockly.Msg.DICTS_ADD_VALUE);\r\n this.setInputsInline(true);\r\n this.setOutput(true, 'List');\r\n this.setColour(LISTS_HUE);\r\n this.setTooltip(\"\");\r\n this.setHelpUrl(\"\");\r\n }\r\n};\r\n\r\nexport const lists_create_with = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput(\"\")\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n .appendField(new Blockly.FieldTextInput('mylist'), 'VAR')\r\n .appendField('[')\r\n //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE')\r\n .appendField(']');\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('lists_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('lists_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.LISTS_CREATE_PYTHON_EMPTY_TITLE);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.blockpy_LISTS_CREATE_WITH_INPUT_WITH);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\n\r\nexport const lists_create_with_text = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput(\"\")\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n // .appendField(Blockly.Msg.blockpy_MIXLY_SPLITBYDOU)\r\n .appendField(new Blockly.FieldTextInput('mylist'), 'VAR')\r\n //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE')\r\n // .appendField(Blockly.Msg.MIXLY_MAKELISTFROM)\r\n // .appendField(this.newQuote_(true))\r\n .appendField(' = [')\r\n .appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')\r\n .appendField(']');\r\n // .appendField(this.newQuote_(false))\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LISTS_CREATE_WITH_TEXT2);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n}\r\n\r\n\r\nexport const lists_create_with_container = {\r\n /**\r\n * Mutator block for list container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const lists_create_with_item = {\r\n /**\r\n * Mutator bolck for adding items.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\n\r\nexport const lists_set_index = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('LIST');\r\n this.appendValueInput('AT')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_LIST_ASSIGN_AT);\r\n this.appendValueInput('TO')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIST_VALUE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.LANG_LISTS_SET_INDEX_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const lists_append_extend = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this['TYPE'] = [\r\n [Blockly.Msg.MIXLY_blockpy_set_add, 'append'],\r\n [Blockly.Msg.MIXLY_MICROBIT_LIST_EXTEND, 'extend']\r\n ];\r\n\r\n this.appendValueInput('LIST')\r\n .setCheck('List')\r\n this.appendValueInput('DATA')\r\n .appendField(new Blockly.FieldDropdown(this['TYPE']), 'OP')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_LIST_A_ITEM)\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIST_TO_END);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'append': Blockly.Msg.MIXLY_TOOLTIP_LIST_APPEND,\r\n 'extend': Blockly.Msg.LISTS_EXTEND_TOOLTIP\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n\r\n};\r\n\r\nexport const lists_get_random_item = {\r\n /**\r\n * Block for get a random item from list.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput(\"LIST\");\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_RANDOM)\r\n this.setTooltip(Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const lists_get_random_sublist = {\r\n /**\r\n * Block for get a random item from list.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput(\"LIST\");\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + Blockly.Msg.MIXLY_MICROBIT_RANDOM)\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2 + Blockly.Msg.LISTS_GET_RANDOM_SUBLIST)\r\n this.setTooltip(Blockly.Msg.LISTS_GET_RANDOM_SUBLIST_TOOLTIP);\r\n this.setOutput(true, 'List');\r\n }\r\n};\r\n\r\nexport const lists_insert_value = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('LIST');\r\n this.appendValueInput('AT')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIST_INSERT_AT);\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIST_VALUE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.LANG_LISTS_SET_INDEX_TOOLTIP);\r\n this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT);\r\n }\r\n};\r\n\r\nexport const lists_reverse = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck('List') //this.appendDummyInput(\"\")\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIST_REVERSE)\r\n //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR');\r\n this.setTooltip(Blockly.Msg.LANG_LISTS_CLEAR_TOOLTIP);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\nexport const lists_clear = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_CLEAR)\r\n //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR');\r\n this.setTooltip(Blockly.Msg.LANG_LISTS_REVERSE_TOOLTIP);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const lists_remove_at = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this['TYPE'] = [\r\n [Blockly.Msg.SERIES_INDEX, 'del'],\r\n [Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE, 'remove']\r\n ];\r\n this.appendValueInput('LIST')\r\n .setCheck('List')\r\n this.appendValueInput('DATA')\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_LISTS_REMOVE)\r\n .appendField(new Blockly.FieldDropdown(this['TYPE']), 'OP')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'del': Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_DELETE,\r\n 'remove': Blockly.Msg.MIXLY_TOOLTIP_LIST_REMOVE\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\nexport const lists_pop = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('LIST');\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_LIST_POP);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM);\r\n }\r\n};\r\n\r\nexport const lists_find = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_LIST_INDEX, 'INDEX'],\r\n [Blockly.Msg.MIXLY_LIST_COUNT, 'COUNT']\r\n ];\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck('List')\r\n this.appendValueInput('data')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(Blockly.Msg.HTML_VALUE)\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_DE)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'INDEX': Blockly.Msg.MIXLY_TOOLTIP_LIST_FIND_INDEX,\r\n 'COUNT': Blockly.Msg.MIXLY_TOOLTIP_LIST_FIND_COUNT\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\nexport const list_trig = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_LIST_LEN, 'LEN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_SUM, 'SUM'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MAX, 'MAX'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MIN, 'MIN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE, 'AVERAGE'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN, 'MEDIAN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MODE, 'MODE'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV, 'STD_DEV'],\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);\r\n this.setColour(LISTS_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('data')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'LEN': Blockly.Msg.LISTS_LENGTH_TOOLTIP,\r\n 'SUM': Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM,\r\n 'MAX': Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX,\r\n 'MIN': Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN,\r\n 'AVERAGE': Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE,\r\n 'MEDIAN': Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN,\r\n 'MODE': Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE,\r\n 'STD_DEV': Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const lists_sort = {\r\n /**\r\n * Block for sorting a list.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.jsonInit({\r\n \"args0\": [\r\n {\r\n \"type\": \"input_value\",\r\n \"name\": \"LIST\",\r\n \"check\": \"List\"\r\n },\r\n {\r\n \"type\": \"field_dropdown\",\r\n \"name\": \"TYPE\",\r\n \"options\": [\r\n [Blockly.Msg.LISTS_SORT_TYPE_NUMERIC, \"NUMERIC\"],\r\n [Blockly.Msg.LISTS_SORT_TYPE_TEXT, \"TEXT\"],\r\n [Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE, \"IGNORE_CASE\"]\r\n ]\r\n },\r\n {\r\n \"type\": \"field_dropdown\",\r\n \"name\": \"DIRECTION\",\r\n \"options\": [\r\n [Blockly.Msg.LISTS_SORT_ORDER_ASCENDING, \"1\"],\r\n [Blockly.Msg.LISTS_SORT_ORDER_DESCENDING, \"-1\"]\r\n ]\r\n },\r\n ],\r\n \"message0\": Blockly.Msg.LISTS_SORT_TITLE,\r\n \"inputsInline\": true,\r\n \"output\": \"List\",\r\n \"colour\": LISTS_HUE,\r\n \"tooltip\": Blockly.Msg.LISTS_SORT_TOOLTIP,\r\n \"helpUrl\": Blockly.Msg.LISTS_SORT_HELPURL\r\n });\r\n }\r\n};\r\n\r\nexport const lists_change_to = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple'],\r\n [Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set'],\r\n [Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD, 'array']\r\n ];\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(\"List\")\r\n // .appendField(Blockly.Msg.blockpy_USE_LIST);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.A_TO_B)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'tuple': Blockly.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_TUPLE,\r\n 'set': Blockly.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_SET,\r\n 'array': Blockly.Msg.MIXLY_TOOLTIP_CONVERT_LIST_TO_ARRAY\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const list_many_input = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField('[')\r\n .appendField(new Blockly.FieldTextInput('0,0,0'), \"CONTENT\")\r\n .appendField(']');\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const lists_create_with_noreturn = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, \"List\")\r\n this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('lists_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('lists_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.LISTS_CREATE_PYTHON_EMPTY_TITLE);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.blockpy_LISTS_CREATE_WITH_INPUT_WITH);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n}\r\n\r\nexport const lists_change_to_general = {\r\n init: function () {\r\n var OPERATORS =\r\n [\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple'],\r\n [Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set']\r\n ];\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.A_TO_B)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const lists_del_general = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('TUP')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.OBJECT_DELETE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const list_tolist = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOLIST);\r\n this.setOutput(true, 'List');\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOLIST);\r\n }\r\n};\r\n\r\nexport const lists_create_with2 = lists_create_with\r\nexport const lists_create_with_text2 = lists_create_with_text\r\nexport const lists_getIndex3 = lists_get_index\r\nexport const lists_getSublist3 = lists_get_sublist\r\nexport const lists_setIndex3 = lists_set_index\r\nexport const lists_insert_value2 = lists_insert_value\r\nexport const lists_remove_at2 = lists_remove_at\r\nexport const list_tolist2 = list_tolist;\r\n\r\n\r\nexport const ENUMERATE ={\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.blockpy_USE_LIST);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TO_INDEX_SEQUENCE);\r\n // this.appendValueInput('VAR_N')\r\n // .appendField(Blockly.Msg.MIXLY_INDEX+Blockly.Msg.MIXLY_STARTSWITH);\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOTO_INDEX_SEQUENC_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const enumerate = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_USE_LIST);\r\n this.appendValueInput('LIST');\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.MIXLY_TO_INDEX_SEQUENCE)\r\n .appendField(Blockly.Msg.MIXLY_INDEX+Blockly.Msg.MIXLY_STARTSWITH);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOTO_INDEX_SEQUENC_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const content_in_lists = {\r\n init: function () {\r\n this.setColour(LISTS_HUE);\r\n this.appendValueInput(\"CON\")\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_ESP32_MIXGO_MUSIC_SHOW_IN);\r\n this.appendValueInput(\"LIST\")\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MID);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nconst LOGIC_HUE = 210;\r\n\r\nexport const logic_compare = {\r\n /**\r\n * Block for comparison operator.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = Blockly.RTL ? [\r\n ['=', 'EQ'],\r\n ['\\u2260', 'NEQ'],\r\n ['>', 'LT'],\r\n ['\\u2265', 'LTE'],\r\n ['<', 'GT'],\r\n ['\\u2264', 'GTE']\r\n ] : [\r\n ['=', 'EQ'],\r\n ['\\u2260', 'NEQ'],\r\n ['<', 'LT'],\r\n ['\\u2264', 'LTE'],\r\n ['>', 'GT'],\r\n ['\\u2265', 'GTE']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true, Boolean);\r\n this.appendValueInput('A');\r\n this.appendValueInput('B')\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var op = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'EQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,\r\n 'NEQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,\r\n 'LT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,\r\n 'LTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,\r\n 'GT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,\r\n 'GTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE\r\n };\r\n return TOOLTIPS[op];\r\n });\r\n this.prevBlocks_ = [null, null];\r\n },\r\n /**\r\n * Called whenever anything on the workspace changes.\r\n * Prevent mismatched types from being compared.\r\n * @this Blockly.Block\r\n */\r\n /*onchange: function(e) {\r\n var blockA = this.getInputTargetBlock('A');\r\n var blockB = this.getInputTargetBlock('B');\r\n // Disconnect blocks that existed prior to this change if they don't match.\r\n if (blockA && blockB &&\r\n !blockA.outputConnection.checkType_(blockB.outputConnection)) {\r\n // Mismatch between two inputs. Disconnect previous and bump it away.\r\n // Ensure that any disconnections are grouped with the causing event.\r\n Blockly.Events.setGroup(e.group);\r\n for (var i = 0; i < this.prevBlocks_.length; i++) {\r\n var block = this.prevBlocks_[i];\r\n if (block === blockA || block === blockB) {\r\n block.unplug();\r\n block.bumpNeighbours_();\r\n }\r\n }\r\n Blockly.Events.setGroup(false);\r\n }\r\n this.prevBlocks_[0] = blockA;\r\n this.prevBlocks_[1] = blockB;\r\n }*/\r\n};\r\n\r\nexport const logic_compare_continous = {\r\n\r\n init: function () {\r\n var OPERATORS1 = Blockly.RTL ? [\r\n ['>', 'LT'],\r\n ['\\u2265', 'LTE'],\r\n ['<', 'GT'],\r\n ['\\u2264', 'GTE']\r\n ] : [\r\n ['<', 'LT'],\r\n ['\\u2264', 'LTE'],\r\n ['>', 'GT'],\r\n ['\\u2265', 'GTE']\r\n ];\r\n var OPERATORS2 = Blockly.RTL ? [\r\n ['>', 'LT'],\r\n ['\\u2265', 'LTE'],\r\n ['<', 'GT'],\r\n ['\\u2264', 'GTE']\r\n ] : [\r\n ['<', 'LT'],\r\n ['\\u2264', 'LTE'],\r\n ['>', 'GT'],\r\n ['\\u2265', 'GTE']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true, Boolean);\r\n this.appendValueInput('A');\r\n this.appendValueInput('B')\r\n .appendField(new Blockly.FieldDropdown(OPERATORS1), 'OP1');\r\n this.appendValueInput('C')\r\n .appendField(new Blockly.FieldDropdown(OPERATORS2), 'OP2');\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_LOGIC_COMPARE_CONTINOUS_TOOLTIP);\r\n\r\n }\r\n};\r\n\r\nexport const logic_operation = {\r\n /**\r\n * Block for logical operations: 'and', 'or'.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.LOGIC_OPERATION_AND, 'AND'],\r\n [Blockly.Msg.LOGIC_OPERATION_OR, 'OR'],\r\n [Blockly.Msg.LOGIC_OPERATION_NOR, 'NOR'],\r\n [Blockly.Msg.LOGIC_OPERATION_XOR, 'XOR']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true, Boolean);\r\n this.appendValueInput('A')\r\n .setCheck([Boolean, Number]);\r\n this.appendValueInput('B')\r\n .setCheck([Boolean, Number])\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var op = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'AND': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND,\r\n 'OR': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR,\r\n 'NOR': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_NOR,\r\n 'XOR': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_XOR\r\n };\r\n return TOOLTIPS[op];\r\n });\r\n }\r\n};\r\n\r\nexport const logic_negate = {\r\n /**\r\n * Block for negation.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_NEGATE_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true, Boolean);\r\n this.appendValueInput('BOOL')\r\n .setCheck([Number, Boolean])\r\n .appendField(Blockly.Msg.LOGIC_NEGATE_TITLE);\r\n //this.interpolateMsg(Blockly.Msg.LOGIC_NEGATE_TITLE,\r\n // ['BOOL', Boolean, Blockly.inputs.Align.RIGHT],\r\n // Blockly.inputs.Align.RIGHT);\r\n this.setTooltip(Blockly.Msg.LOGIC_NEGATE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const logic_boolean = {\r\n /**\r\n * Block for boolean data type: true and false.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var BOOLEANS = [\r\n [Blockly.Msg.LOGIC_BOOLEAN_TRUE, 'TRUE'],\r\n [Blockly.Msg.LOGIC_BOOLEAN_FALSE, 'FALSE']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_BOOLEAN_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true, Boolean);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown(BOOLEANS), 'BOOL');\r\n this.setTooltip(Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const logic_null = {\r\n /**\r\n * Block for null data type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n //this.setHelpUrl(Blockly.Msg.LOGIC_NULL_HELPURL);\r\n this.setColour(LOGIC_HUE);\r\n this.setOutput(true);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LOGIC_NULL);\r\n this.setTooltip(Blockly.Msg.LOGIC_NULL_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const logic_true_or_false = {\r\n init: function () {\r\n this.setColour(LOGIC_HUE);\r\n this.appendValueInput('A');\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE);\r\n this.appendValueInput('C')\r\n .appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE);\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LOGIT_TRUEORFALSE);\r\n }\r\n};\r\n\r\nexport const logic_is_in = {\r\n init: function () {\r\n var BOOLEANS = [\r\n [Blockly.Msg.TEXT_APPEND_TO, 'in'],\r\n [Blockly.Msg.MIXLY_PYTHON_LOGIC_IS_NOT_IN, 'not in']\r\n ];\r\n this.setColour(LOGIC_HUE);\r\n this.appendValueInput('A');\r\n this.appendValueInput('B')\r\n .setCheck([String, 'List'])\r\n //.appendField(Blockly.Msg.TEXT_APPEND_TO)\r\n .appendField(new Blockly.FieldDropdown(BOOLEANS), 'BOOL');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MICROBIT_LOGIC_IS_IN);\r\n this.setOutput(true, Boolean);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.IN);\r\n }\r\n};\r\n\r\nexport const logic_is = {\r\n init: function () {\r\n var BOOLEANS = [\r\n [Blockly.Msg.MIXLY_PYTHON_LOGIC_IS, 'is'],\r\n [Blockly.Msg.MIXLY_PYTHON_LOGIC_IS_NOT, 'is not']\r\n ];\r\n this.setColour(LOGIC_HUE);\r\n this.appendValueInput('A');\r\n this.appendValueInput('B')\r\n .appendField(new Blockly.FieldDropdown(BOOLEANS), 'BOOL');\r\n //.appendField(Blockly.Msg.MIXLY_PYTHON_LOGIC_IS);\r\n this.setOutput(true, Boolean);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_LOGIC_IS_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const logic_tobool = {\r\n init: function () {\r\n this.setColour(LOGIC_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOBOOL);\r\n this.setOutput(true, Boolean);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOBOOL);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst MATH_HUE = 230; //'#e49f16';\r\n\r\nBlockly.FieldTextInput.math_number_validator = function (text) {\r\n //return window.isNaN(text) ? null : String(text);\r\n // var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\\.[a-fA-F0-9]+)?$/;\r\n // return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配\r\n return String(text);//不再校验\r\n};\r\n\r\nBlockly.FieldTextInput.math_number_validator_include_blank = function (text) {\r\n if (text === \"\") {\r\n return \"\";\r\n }\r\n var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\\.[a-fA-F0-9]+)?$/;\r\n return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配\r\n};\r\n\r\nexport const math_number = {\r\n /**\r\n * Block for numeric value.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput('0',\r\n Blockly.FieldTextInput.math_number_validator), 'NUM');\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const math_constant = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n var constant =\r\n [['π', 'pi'], ['e', 'e']];\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT)\r\n .appendField(new Blockly.FieldDropdown(constant), 'CONSTANT')\r\n\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('CONSTANT');\r\n var TOOLTIPS = {\r\n 'pi': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_TOOLTIP,\r\n 'e': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n\r\n }\r\n};\r\n\r\nexport const math_constant_mp = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n var constant =\r\n [['π', 'pi'], ['e', 'e']];\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT)\r\n .appendField(new Blockly.FieldDropdown(constant), 'CONSTANT')\r\n\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('CONSTANT');\r\n var TOOLTIPS = {\r\n 'pi': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_MP_TOOLTIP,\r\n 'e': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_MP_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n\r\n }\r\n};\r\n\r\nexport const math_arithmetic = {\r\n /**\r\n * Block for basic arithmetic operator.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n ['+', 'ADD'],\r\n ['-', 'MINUS'],\r\n ['×', 'MULTIPLY'],\r\n ['÷', 'DIVIDE'],\r\n ['%', 'QUYU'],\r\n ['//', 'ZHENGCHU'],\r\n ['**', 'POWER']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true);\r\n this.appendValueInput('A')\r\n this.appendValueInput('B')\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,\r\n 'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,\r\n 'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,\r\n 'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,\r\n 'QUYU': Blockly.Msg.MATH_MODULO_TOOLTIP,\r\n 'ZHENGCHU': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,\r\n 'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const math_selfcalcu = {\r\n /**\r\n * Block for basic arithmetic operator.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n ['+=', 'ADD'],\r\n ['-=', 'MINUS'],\r\n ['×=', 'MULTIPLY'],\r\n ['÷=', 'DIVIDE'],\r\n ['%=', 'QUYU'],\r\n ['//=', 'ZHENGCHU'],\r\n ['**=', 'POWER']\r\n ];\r\n\r\n this.setColour(MATH_HUE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.appendValueInput('A')\r\n this.appendValueInput('B')\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,\r\n 'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,\r\n 'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,\r\n 'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,\r\n 'QUYU': Blockly.Msg.MATH_MODULO_TOOLTIP,\r\n 'ZHENGCHU': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,\r\n 'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const math_bit = {\r\n init: function () {\r\n var OPERATORS = [\r\n ['&', '&'],\r\n ['|', '|'],\r\n ['>>', '>>'],\r\n ['<<', '<<']\r\n ];\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('A')\r\n .setCheck(Number);\r\n this.appendValueInput('B')\r\n .setCheck(Number)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n this.setTooltip(\"位运算\");\r\n }\r\n};\r\n\r\nexport const math_trig = {\r\n /**\r\n * Block for trigonometry operators.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n ['sin', 'SIN'],\r\n ['cos', 'COS'],\r\n ['tan', 'TAN'],\r\n ['asin', 'ASIN'],\r\n ['acos', 'ACOS'],\r\n ['atan', 'ATAN'],\r\n ['-', '-'],\r\n ['ln', 'LN'],\r\n ['log10', 'LOG10'],\r\n ['e^', 'EXP'],\r\n ['10^', 'POW10']\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'SIN': Blockly.Msg.MATH_TRIG_TOOLTIP_SIN,\r\n 'COS': Blockly.Msg.MATH_TRIG_TOOLTIP_COS,\r\n 'TAN': Blockly.Msg.MATH_TRIG_TOOLTIP_TAN,\r\n 'ASIN': Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN,\r\n 'ACOS': Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS,\r\n 'ATAN': Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN,\r\n 'LN': Blockly.Msg.MATH_SINGLE_TOOLTIP_LN\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const math_dec = {\r\n /**\r\n * Block for trigonometry operators.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MATH_BIN, 'bin'],\r\n [Blockly.Msg.MATH_OCT, 'oct'],\r\n [Blockly.Msg.MATH_HEX, 'hex'],\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, String);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'bin': Blockly.Msg.MATH_DEC_TOOLTIP_BIN,\r\n 'oct': Blockly.Msg.MATH_DEC_TOOLTIP_OCT,\r\n 'hex': Blockly.Msg.MATH_DEC_TOOLTIP_HEX,\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\n//取整等\r\nexport const math_to_int = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.LANG_MATH_TO_ROUND, 'round'],\r\n [Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'],\r\n [Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor'],\r\n [Blockly.Msg.MATH_ABS, 'fabs'],\r\n // [Blockly.Msg.MATH_SQ, 'pow'],\r\n [Blockly.Msg.MATH_SQRT, 'sqrt']\r\n ];\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('A')\r\n .setCheck(Number)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'sqrt': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT,\r\n 'fabs': Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS,\r\n 'sq': Blockly.Msg.MATH_SINGLE_TOOLTIP_SQ,\r\n 'round': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROUND,\r\n 'ceil': Blockly.Msg.MATH_SINGLE_TOOLTIP_CEIL,\r\n 'floor': Blockly.Msg.MATH_SINGLE_TOOLTIP_FLOOR\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n//最大最小值\r\nexport const math_max_min = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_MAX, 'max'],\r\n [Blockly.Msg.MIXLY_MIN, 'min'],\r\n ];\r\n\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('A')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')\r\n .appendField('(');\r\n this.appendValueInput('B')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(',');\r\n this.appendDummyInput('')\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(')');\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'max': Blockly.Msg.MIXLY_TOOLTIP_MATH_MAX,\r\n 'min': Blockly.Msg.MIXLY_TOOLTIP_MATH_MIN\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const math_number_base_conversion = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MATH_TWO, 'two'],\r\n [Blockly.Msg.MATH_EIGHT, 'eight'],\r\n [Blockly.Msg.MATH_TEN, 'ten'],\r\n [Blockly.Msg.MATH_SIXTEEN, 'sixteen']\r\n ];\r\n this.setColour(MATH_HUE);\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.MATH_BA)\r\n this.appendValueInput(\"NUM\")\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')\r\n .appendField(Blockly.Msg.MATH_JinZhi)\r\n .setCheck(Number);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MATH_ZHW)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP2')\r\n .appendField(Blockly.Msg.MATH_JinZhi);\r\n this.setFieldValue('ten', 'OP2')\r\n // this.setPreviousStatement(true, null);\r\n // this.setNextStatement(true, null);\r\n this.setOutput(true)\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'two': Blockly.Msg.MATH_Before_two,\r\n 'eight': Blockly.Msg.MATH_Before_eight,\r\n 'ten': Blockly.Msg.MATH_Before_ten,\r\n 'sixteen': Blockly.Msg.MATH_Before_sixteen,\r\n };\r\n var mode2 = thisBlock.getFieldValue('OP2');\r\n var TOOLTIPS2 = {\r\n 'two': Blockly.Msg.MATH_Behind_two,\r\n 'eight': Blockly.Msg.MATH_Behind_eight,\r\n 'ten': Blockly.Msg.MATH_Behind_ten,\r\n 'sixteen': Blockly.Msg.MATH_Behind_sixteen,\r\n };\r\n return TOOLTIPS[mode] + TOOLTIPS2[mode2];\r\n });\r\n }\r\n};\r\n\r\n\r\nexport const math_random = {\r\n init: function () {\r\n var INT_FLOAT = [[Blockly.Msg.LANG_MATH_INT, 'int'], [Blockly.Msg.LANG_MATH_FLOAT, 'float']];\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, Number);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_RANDOM)\r\n .appendField(new Blockly.FieldDropdown(INT_FLOAT), 'TYPE');\r\n this.appendValueInput('FROM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);\r\n this.appendValueInput('TO')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_TO);\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('TYPE');\r\n var TOOLTIPS = {\r\n 'int': Blockly.Msg.LANG_MATH_INT,\r\n 'float': Blockly.Msg.LANG_MATH_FLOAT_RANDOM\r\n };\r\n return Blockly.Msg.MATH_RANDOM_INT_TOOLTIP + TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\n\r\nexport const math_constrain = {\r\n /**\r\n * Block for constraining a number between two limits.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('VALUE')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_CONSTRAIN);\r\n this.appendValueInput('LOW')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_LOW);\r\n this.appendValueInput('HIGH')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MATH_CONSTRAIN_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const math_map = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput(\"NUM\", Number)\r\n .appendField(Blockly.Msg.MIXLY_MAP)\r\n .setCheck(Number);\r\n this.appendValueInput(\"fromLow\", Number)\r\n .appendField(Blockly.Msg.MIXLY_MAP_FROM)\r\n .setCheck(Number);\r\n this.appendValueInput(\"fromHigh\", Number)\r\n .appendField(\",\")\r\n .setCheck(Number);\r\n this.appendValueInput(\"toLow\", Number)\r\n .appendField(Blockly.Msg.MIXLY_MAP_TO)\r\n .setCheck(Number);\r\n this.appendValueInput(\"toHigh\", Number)\r\n .appendField(\",\")\r\n .setCheck(Number);\r\n this.appendDummyInput(\"\")\r\n .appendField(\"]\");\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_MAP);\r\n }\r\n};\r\n\r\nexport const math_indexer_number = {\r\n /**\r\n * Block for numeric value.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput('0', Blockly.FieldTextInput.math_number_validator_include_blank), 'NUM');\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const math_random_seed = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_MATH_RANDOM_SEED);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED);\r\n }\r\n};\r\n\r\nexport const math_round = {\r\n\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('VALUE')\r\n .setCheck(Number)\r\n this.appendValueInput('VAR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MATH_ROUND)\r\n .appendField(Blockly.Msg.TEXT_KEEP);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_DECIMAL);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MATH_ROUND_NEW_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const text_to_number = {\r\n init: function () {\r\n var TO_INT_FLOAT =\r\n [[Blockly.Msg.MIXLY_TO_INT, 'int'], [Blockly.Msg.MIXLY_TO_FLOAT, 'float'], [Blockly.Msg.MIXLY_TO_BITES, 'b'], [Blockly.Msg.LANG_MATH_BYTE + Blockly.Msg.MIXLY_TO_INT, 'bti']];\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(new Blockly.FieldDropdown(TO_INT_FLOAT), 'TOWHAT');\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('TOWHAT');\r\n var TOOLTIPS = {\r\n 'int': Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOINT,\r\n 'float': Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOFLOAT,\r\n 'b': Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOBYTE\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const text_to_number_skulpt = {\r\n init: function () {\r\n var TO_INT_FLOAT =\r\n [[Blockly.Msg.MIXLY_TO_INT, 'int'], [Blockly.Msg.MIXLY_TO_FLOAT, 'float']];\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(new Blockly.FieldDropdown(TO_INT_FLOAT), 'TOWHAT');\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('TOWHAT');\r\n var TOOLTIPS = {\r\n 'int': Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOINT,\r\n 'float': Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOFLOAT\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const base_map = math_map\r\n\r\nexport const turn_to_int = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.LANG_MATH_BYTE + Blockly.Msg.MIXLY_TO_HEX);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOHEX)\r\n }\r\n};\r\n\r\nexport const generate_cartesian_product = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.itemCount_ = 1;\r\n this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));\r\n this.appendDummyInput('DUMMY')\r\n .appendField(Blockly.Msg.MIXLY_PRODUCT + Blockly.Msg.MIXLY_GENERATE_CARTESIAN_PRODUCT);\r\n this.appendValueInput('REPEAT')\r\n .appendField(Blockly.Msg.MIXLY_EVERY_PER_ELEPER_ELEMENT);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.CONTROLS_REPEAT_TITLE_TIMES);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('lists_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('lists_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput(`ADD${i}`).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput(`ADD${i}`);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n let i = 0;\r\n while (this.getInput(`ADD${i}`)) {\r\n this.removeInput(`ADD${i}`);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.MIXLY_EMPTY_REMINDER);\r\n } else {\r\n for (let i = 0; i < this.itemCount_; i++) {\r\n this.appendValueInput(`ADD${i}`);\r\n this.moveInputBefore(`ADD${i}`, 'REPEAT');\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n}\r\n\r\nexport const math_radian_to_degree = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true)\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_SET_RADIAN);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TRANS_TO_ANGLE);\r\n this.setInputsInline(true);\r\n }\r\n};\r\n\r\nexport const math_degree_to_radian = {\r\n init: function () {\r\n this.setColour(MATH_HUE);\r\n this.setOutput(true)\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_SET_DEGREE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TRANS_TO_RADIAN);\r\n this.setInputsInline(true);\r\n }\r\n};","/**\r\n * @license\r\n * Copyright 2012 Google LLC\r\n * SPDX-License-Identifier: Apache-2.0\r\n */\r\n\r\n/**\r\n * @fileoverview Procedure blocks for Blockly.\r\n * @author fraser@google.com (Neil Fraser)\r\n */\r\nimport * as Blockly from 'blockly/core';\r\nimport { Variables, Procedures } from 'blockly/core';\r\n\r\nexport const procedures_defnoreturn = {\r\n /**\r\n * Block for defining a procedure with no return value.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n var initName = Procedures.findLegalName('', this);\r\n var nameField = new Blockly.FieldTextInput(initName,\r\n Procedures.rename);\r\n nameField.setSpellcheck(false);\r\n this.appendDummyInput()\r\n // .appendField(Blockly.Msg['PROCEDURES_DEFNORETURN_TITLE'])\r\n .appendField(nameField, 'NAME')\r\n .appendField('', 'PARAMS');\r\n this.setMutator(new Blockly.icons.MutatorIcon(['procedures_mutatorarg'], this));\r\n if ((this.workspace.options.comments ||\r\n (this.workspace.options.parentWorkspace &&\r\n this.workspace.options.parentWorkspace.options.comments)) &&\r\n Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']) {\r\n this.setCommentText(Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']);\r\n }\r\n this.setStyle('procedure_blocks');\r\n this.setTooltip(Blockly.Msg['PROCEDURES_DEFNORETURN_TOOLTIP']);\r\n this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFNORETURN_HELPURL']);\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n this.setStatements_(true);\r\n this.statementConnection_ = null;\r\n },\r\n /**\r\n * Add or remove the statement block from this function definition.\r\n * @param {boolean} hasStatements True if a statement block is needed.\r\n * @this {Blockly.Block}\r\n */\r\n setStatements_: function (hasStatements) {\r\n if (this.hasStatements_ === hasStatements) {\r\n return;\r\n }\r\n if (hasStatements) {\r\n this.appendStatementInput('STACK')\r\n .appendField(Blockly.Msg['PROCEDURES_DEFNORETURN_DO']);\r\n if (this.getInput('RETURN')) {\r\n this.moveInputBefore('STACK', 'RETURN');\r\n }\r\n } else {\r\n this.removeInput('STACK', true);\r\n }\r\n this.hasStatements_ = hasStatements;\r\n },\r\n /**\r\n * Update the display of parameters for this procedure definition block.\r\n * @private\r\n * @this {Blockly.Block}\r\n */\r\n updateParams_: function () {\r\n // Merge the arguments into a human-readable list.\r\n var paramString = '';\r\n if (this.arguments_.length) {\r\n paramString = Blockly.Msg['PROCEDURES_BEFORE_PARAMS'] +\r\n ' ' + this.arguments_.join(', ');\r\n }\r\n // The params field is deterministic based on the mutation,\r\n // no need to fire a change event.\r\n Blockly.Events.disable();\r\n try {\r\n this.setFieldValue(paramString, 'PARAMS');\r\n } finally {\r\n Blockly.Events.enable();\r\n }\r\n },\r\n /**\r\n * Create XML to represent the argument inputs.\r\n * @param {boolean=} opt_paramIds If true include the IDs of the parameter\r\n * quarks. Used by Procedures.mutateCallers for reconnection.\r\n * @return {!Element} XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n mutationToDom: function (opt_paramIds) {\r\n var container = Blockly.utils.xml.createElement('mutation');\r\n if (opt_paramIds) {\r\n container.setAttribute('name', this.getFieldValue('NAME'));\r\n }\r\n for (var i = 0; i < this.argumentVarModels_.length; i++) {\r\n var parameter = Blockly.utils.xml.createElement('arg');\r\n var argModel = this.argumentVarModels_[i];\r\n parameter.setAttribute('name', argModel.name);\r\n parameter.setAttribute('varid', argModel.getId());\r\n if (opt_paramIds && this.paramIds_) {\r\n parameter.setAttribute('paramId', this.paramIds_[i]);\r\n }\r\n container.appendChild(parameter);\r\n }\r\n\r\n // Save whether the statement input is visible.\r\n if (!this.hasStatements_) {\r\n container.setAttribute('statements', 'false');\r\n }\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the argument inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n for (var i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\r\n if (childNode.nodeName.toLowerCase() == 'arg') {\r\n var varName = childNode.getAttribute('name');\r\n var varId = childNode.getAttribute('varid') || childNode.getAttribute('varId');\r\n this.arguments_.push(varName);\r\n var variable = Blockly.Variables.getOrCreateVariablePackage(\r\n this.workspace, varId, varName, '');\r\n if (variable != null) {\r\n this.argumentVarModels_.push(variable);\r\n } else {\r\n console.log('Failed to create a variable with name ' + varName + ', ignoring.');\r\n }\r\n }\r\n }\r\n this.updateParams_();\r\n Procedures.mutateCallers(this);\r\n\r\n // Show or hide the statement input.\r\n this.setStatements_(xmlElement.getAttribute('statements') !== 'false');\r\n },\r\n /**\r\n * Returns the state of this block as a JSON serializable object.\r\n *\r\n * @returns The state of this block, eg the parameters and statements.\r\n */\r\n saveExtraState: function () {\r\n if (!this.argumentVarModels_.length && this.hasStatements_) {\r\n return null;\r\n }\r\n const state = Object.create(null);\r\n if (this.argumentVarModels_.length) {\r\n state['params'] = [];\r\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\r\n state['params'].push({\r\n // We don't need to serialize the name, but just in case we decide\r\n // to separate params from variables.\r\n 'name': this.argumentVarModels_[i].name,\r\n 'id': this.argumentVarModels_[i].getId(),\r\n });\r\n }\r\n }\r\n if (!this.hasStatements_) {\r\n state['hasStatements'] = false;\r\n }\r\n return state;\r\n },\r\n /**\r\n * Applies the given state to this block.\r\n *\r\n * @param state The state to apply to this block, eg the parameters\r\n * and statements.\r\n */\r\n loadExtraState: function (state) {\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n if (state['params']) {\r\n for (let i = 0; i < state['params'].length; i++) {\r\n const param = state['params'][i];\r\n const variable = Variables.getOrCreateVariablePackage(\r\n this.workspace,\r\n param['id'],\r\n param['name'],\r\n '',\r\n );\r\n this.arguments_.push(variable.name);\r\n this.argumentVarModels_.push(variable);\r\n }\r\n }\r\n this.updateParams_();\r\n Procedures.mutateCallers(this);\r\n this.setStatements_(state['hasStatements'] !== false);\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this {Blockly.Block}\r\n */\r\n decompose: function (workspace) {\r\n /*\r\n * Creates the following XML:\r\n * \r\n * \r\n * \r\n * arg1_name\r\n * etc...\r\n * \r\n * \r\n * \r\n */\r\n\r\n var containerBlockNode = Blockly.utils.xml.createElement('block');\r\n containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer');\r\n var statementNode = Blockly.utils.xml.createElement('statement');\r\n statementNode.setAttribute('name', 'STACK');\r\n containerBlockNode.appendChild(statementNode);\r\n\r\n var node = statementNode;\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var argBlockNode = Blockly.utils.xml.createElement('block');\r\n argBlockNode.setAttribute('type', 'procedures_mutatorarg');\r\n var fieldNode = Blockly.utils.xml.createElement('field');\r\n fieldNode.setAttribute('name', 'NAME');\r\n var argumentName = Blockly.utils.xml.createTextNode(this.arguments_[i]);\r\n fieldNode.appendChild(argumentName);\r\n argBlockNode.appendChild(fieldNode);\r\n var nextNode = Blockly.utils.xml.createElement('next');\r\n argBlockNode.appendChild(nextNode);\r\n\r\n node.appendChild(argBlockNode);\r\n node = nextNode;\r\n }\r\n\r\n var containerBlock = Blockly.Xml.domToBlock(containerBlockNode, workspace);\r\n\r\n if (this.type == 'procedures_defreturn') {\r\n containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');\r\n } else {\r\n containerBlock.removeInput('STATEMENT_INPUT');\r\n }\r\n\r\n // Initialize procedure's callers with blank IDs.\r\n Procedures.mutateCallers(this);\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this {Blockly.Block}\r\n */\r\n compose: function (containerBlock) {\r\n // Parameter list.\r\n this.arguments_ = [];\r\n this.paramIds_ = [];\r\n this.argumentVarModels_ = [];\r\n var paramBlock = containerBlock.getInputTargetBlock('STACK');\r\n while (paramBlock && !paramBlock.isInsertionMarker()) {\r\n var varName = paramBlock.getFieldValue('NAME');\r\n this.arguments_.push(varName);\r\n var variable = this.workspace.getVariable(varName, '');\r\n this.argumentVarModels_.push(variable);\r\n\r\n this.paramIds_.push(paramBlock.id);\r\n paramBlock = paramBlock.nextConnection &&\r\n paramBlock.nextConnection.targetBlock();\r\n }\r\n this.updateParams_();\r\n Procedures.mutateCallers(this);\r\n\r\n // Show/hide the statement input.\r\n var hasStatements = containerBlock.getFieldValue('STATEMENTS');\r\n if (hasStatements !== null) {\r\n hasStatements = hasStatements == 'TRUE';\r\n if (this.hasStatements_ != hasStatements) {\r\n if (hasStatements) {\r\n this.setStatements_(true);\r\n // Restore the stack, if one was saved.\r\n this.statementConnection_ && this.statementConnection_.reconnect(this, 'STACK');\r\n this.statementConnection_ = null;\r\n } else {\r\n // Save the stack, then disconnect it.\r\n var stackConnection = this.getInput('STACK').connection;\r\n this.statementConnection_ = stackConnection.targetConnection;\r\n if (this.statementConnection_) {\r\n var stackBlock = stackConnection.targetBlock();\r\n stackBlock.unplug();\r\n stackBlock.bumpNeighbours();\r\n }\r\n this.setStatements_(false);\r\n }\r\n }\r\n }\r\n },\r\n /**\r\n * Return the signature of this procedure definition.\r\n * @return {!Array} Tuple containing three elements:\r\n * - the name of the defined procedure,\r\n * - a list of all its arguments,\r\n * - that it DOES NOT have a return value.\r\n * @this {Blockly.Block}\r\n */\r\n getProcedureDef: function () {\r\n return [this.getFieldValue('NAME'), this.arguments_, false];\r\n },\r\n /**\r\n * Return all variables referenced by this block.\r\n * @return {!Array} List of variable names.\r\n * @this {Blockly.Block}\r\n */\r\n getVars: function () {\r\n return this.arguments_;\r\n },\r\n /**\r\n * Return all variables referenced by this block.\r\n * @return {!Array} List of variable models.\r\n * @this {Blockly.Block}\r\n */\r\n getVarModels: function () {\r\n return this.argumentVarModels_;\r\n },\r\n /**\r\n * Notification that a variable is renaming.\r\n * If the ID matches one of this block's variables, rename it.\r\n * @param {string} oldId ID of variable to rename.\r\n * @param {string} newId ID of new variable. May be the same as oldId, but\r\n * with an updated name. Guaranteed to be the same type as the old\r\n * variable.\r\n * @override\r\n * @this {Blockly.Block}\r\n */\r\n renameVarById: function (oldId, newId) {\r\n var oldVariable = this.workspace.getVariableById(oldId);\r\n if (oldVariable.type != '') {\r\n // Procedure arguments always have the empty type.\r\n return;\r\n }\r\n var oldName = oldVariable.name;\r\n var newVar = this.workspace.getVariableById(newId);\r\n\r\n var change = false;\r\n for (var i = 0; i < this.argumentVarModels_.length; i++) {\r\n if (this.argumentVarModels_[i].getId() == oldId) {\r\n this.arguments_[i] = newVar.name;\r\n this.argumentVarModels_[i] = newVar;\r\n change = true;\r\n }\r\n }\r\n if (change) {\r\n this.displayRenamedVar_(oldName, newVar.name);\r\n Procedures.mutateCallers(this);\r\n }\r\n },\r\n /**\r\n * Notification that a variable is renaming but keeping the same ID. If the\r\n * variable is in use on this block, rerender to show the new name.\r\n * @param {!Blockly.VariableModel} variable The variable being renamed.\r\n * @package\r\n * @override\r\n * @this {Blockly.Block}\r\n */\r\n updateVarName: function (variable) {\r\n var newName = variable.name;\r\n var change = false;\r\n for (var i = 0; i < this.argumentVarModels_.length; i++) {\r\n if (this.argumentVarModels_[i].getId() == variable.getId()) {\r\n var oldName = this.arguments_[i];\r\n this.arguments_[i] = newName;\r\n change = true;\r\n }\r\n }\r\n if (change) {\r\n this.displayRenamedVar_(oldName, newName);\r\n Procedures.mutateCallers(this);\r\n }\r\n },\r\n /**\r\n * Update the display to reflect a newly renamed argument.\r\n * @param {string} oldName The old display name of the argument.\r\n * @param {string} newName The new display name of the argument.\r\n * @private\r\n * @this {Blockly.Block}\r\n */\r\n displayRenamedVar_: function (oldName, newName) {\r\n this.updateParams_();\r\n const mutator = this.getIcon(Blockly.icons.MutatorIcon.TYPE);\r\n // Update the mutator's variables if the mutator is open.\r\n if (mutator && mutator.bubbleIsVisible()) {\r\n var blocks = mutator.getWorkspace().getAllBlocks(false);\r\n for (var i = 0, block; (block = blocks[i]); i++) {\r\n if (block.type == 'procedures_mutatorarg' &&\r\n Blockly.Names.equals(oldName, block.getFieldValue('NAME'))) {\r\n block.setFieldValue(newName, 'NAME');\r\n }\r\n }\r\n }\r\n },\r\n /**\r\n * Add custom menu options to this block's context menu.\r\n * @param {!Array} options List of menu options to add to.\r\n * @this {Blockly.Block}\r\n */\r\n customContextMenu: function (options) {\r\n if (this.isInFlyout) {\r\n return;\r\n }\r\n // Add option to create caller.\r\n var option = { enabled: true };\r\n var name = this.getFieldValue('NAME');\r\n option.text = Blockly.Msg['PROCEDURES_CREATE_DO'].replace('%1', name);\r\n var xmlMutation = Blockly.utils.xml.createElement('mutation');\r\n xmlMutation.setAttribute('name', name);\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var xmlArg = Blockly.utils.xml.createElement('arg');\r\n xmlArg.setAttribute('name', this.arguments_[i]);\r\n xmlMutation.appendChild(xmlArg);\r\n }\r\n var xmlBlock = Blockly.utils.xml.createElement('block');\r\n xmlBlock.setAttribute('type', this.callType_);\r\n xmlBlock.appendChild(xmlMutation);\r\n option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock);\r\n options.push(option);\r\n\r\n // Add options to create getters for each parameter.\r\n if (!this.isCollapsed()) {\r\n for (var i = 0; i < this.argumentVarModels_.length; i++) {\r\n var argOption = { enabled: true };\r\n var argVar = this.argumentVarModels_[i];\r\n argOption.text = Blockly.Msg['VARIABLES_SET_CREATE_GET']\r\n .replace('%1', argVar.name);\r\n\r\n var argXmlField = Blockly.Variables.generateVariableFieldDom(argVar);\r\n var argXmlBlock = Blockly.utils.xml.createElement('block');\r\n argXmlBlock.setAttribute('type', 'variables_get');\r\n argXmlBlock.appendChild(argXmlField);\r\n argOption.callback =\r\n Blockly.ContextMenu.callbackFactory(this, argXmlBlock);\r\n options.push(argOption);\r\n }\r\n }\r\n },\r\n callType_: 'procedures_callnoreturn'\r\n};\r\n\r\nexport const procedures_defreturn = {\r\n /**\r\n * Block for defining a procedure with a return value.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n var initName = Procedures.findLegalName('', this);\r\n var nameField = new Blockly.FieldTextInput(initName,\r\n Procedures.rename);\r\n nameField.setSpellcheck(false);\r\n this.appendDummyInput()\r\n // .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_TITLE'])\r\n .appendField(nameField, 'NAME')\r\n .appendField('', 'PARAMS');\r\n this.appendValueInput('RETURN')\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['procedures_mutatorarg'], this));\r\n if ((this.workspace.options.comments ||\r\n (this.workspace.options.parentWorkspace &&\r\n this.workspace.options.parentWorkspace.options.comments)) &&\r\n Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']) {\r\n this.setCommentText(Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']);\r\n }\r\n this.setStyle('procedure_blocks');\r\n this.setTooltip(Blockly.Msg['PROCEDURES_DEFRETURN_TOOLTIP']);\r\n this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFRETURN_HELPURL']);\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n this.setStatements_(true);\r\n this.statementConnection_ = null;\r\n },\r\n setStatements_: procedures_defnoreturn.setStatements_,\r\n updateParams_: procedures_defnoreturn.updateParams_,\r\n mutationToDom: procedures_defnoreturn.mutationToDom,\r\n domToMutation: procedures_defnoreturn.domToMutation,\r\n decompose: procedures_defnoreturn.decompose,\r\n compose: procedures_defnoreturn.compose,\r\n /**\r\n * Return the signature of this procedure definition.\r\n * @return {!Array} Tuple containing three elements:\r\n * - the name of the defined procedure,\r\n * - a list of all its arguments,\r\n * - that it DOES have a return value.\r\n * @this {Blockly.Block}\r\n */\r\n getProcedureDef: function () {\r\n return [this.getFieldValue('NAME'), this.arguments_, true];\r\n },\r\n getVars: procedures_defnoreturn.getVars,\r\n getVarModels: procedures_defnoreturn.getVarModels,\r\n renameVarById: procedures_defnoreturn.renameVarById,\r\n updateVarName: procedures_defnoreturn.updateVarName,\r\n displayRenamedVar_: procedures_defnoreturn.displayRenamedVar_,\r\n customContextMenu: procedures_defnoreturn.customContextMenu,\r\n callType_: 'procedures_callreturn'\r\n};\r\n\r\nexport const procedures_mutatorcontainer = {\r\n /**\r\n * Mutator block for procedure container.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg['PROCEDURES_MUTATORCONTAINER_TITLE']);\r\n this.appendStatementInput('STACK');\r\n this.appendDummyInput('STATEMENT_INPUT')\r\n .appendField(Blockly.Msg['PROCEDURES_ALLOW_STATEMENTS'])\r\n .appendField(new Blockly.FieldCheckbox('TRUE'), 'STATEMENTS');\r\n this.setStyle('procedure_blocks');\r\n this.setTooltip(Blockly.Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']);\r\n this.contextMenu = false;\r\n },\r\n};\r\n\r\nexport const procedures_mutatorarg = {\r\n /**\r\n * Mutator block for procedure argument.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n var field = new Blockly.FieldTextInput(\r\n Procedures.DEFAULT_ARG, this.validator_);\r\n // Hack: override showEditor to do just a little bit more work.\r\n // We don't have a good place to hook into the start of a text edit.\r\n field.oldShowEditorFn_ = field.showEditor_;\r\n var newShowEditorFn = function () {\r\n this.createdVariables_ = [];\r\n this.oldShowEditorFn_();\r\n };\r\n field.showEditor_ = newShowEditorFn;\r\n\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.PROCEDURES_BEFORE_PARAMS)\r\n .appendField(field, 'NAME');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setStyle('procedure_blocks');\r\n this.setTooltip(Blockly.Msg['PROCEDURES_MUTATORARG_TOOLTIP']);\r\n this.contextMenu = false;\r\n\r\n // Create the default variable when we drag the block in from the flyout.\r\n // Have to do this after installing the field on the block.\r\n field.onFinishEditing_ = this.deleteIntermediateVars_;\r\n // Create an empty list so onFinishEditing_ has something to look at, even\r\n // though the editor was never opened.\r\n field.createdVariables_ = [];\r\n field.onFinishEditing_('x');\r\n },\r\n /**\r\n * Obtain a valid name for the procedure argument. Create a variable if\r\n * necessary.\r\n * Merge runs of whitespace. Strip leading and trailing whitespace.\r\n * Beyond this, all names are legal.\r\n * @param {string} varName User-supplied name.\r\n * @return {?string} Valid name, or null if a name was not specified.\r\n * @private\r\n * @this Blockly.FieldTextInput\r\n */\r\n validator_: function (varName) {\r\n var sourceBlock = this.getSourceBlock();\r\n\r\n var outerWs = sourceBlock.workspace.getRootWorkspace();\r\n varName = varName.replace(/[\\s\\xa0]+/g, ' ').replace(/^ | $/g, '');\r\n if (!varName) {\r\n return null;\r\n }\r\n\r\n // Prevents duplicate parameter names in functions\r\n var workspace = sourceBlock.workspace.targetWorkspace ||\r\n sourceBlock.workspace;\r\n var blocks = workspace.getAllBlocks(false);\r\n var caselessName = varName.toLowerCase();\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i].id == this.getSourceBlock().id) {\r\n continue;\r\n }\r\n // Other blocks values may not be set yet when this is loaded.\r\n var otherVar = blocks[i].getFieldValue('NAME');\r\n if (otherVar && otherVar.toLowerCase() == caselessName) {\r\n return null;\r\n }\r\n }\r\n\r\n // Don't create variables for arg blocks that\r\n // only exist in the mutator's flyout.\r\n if (sourceBlock.isInFlyout) {\r\n return varName;\r\n }\r\n\r\n var model = outerWs.getVariable(varName, '');\r\n if (model && model.name != varName) {\r\n // Rename the variable (case change)\r\n outerWs.renameVariableById(model.getId(), varName);\r\n }\r\n if (!model) {\r\n model = outerWs.createVariable(varName, '');\r\n if (model && this.createdVariables_) {\r\n this.createdVariables_.push(model);\r\n }\r\n }\r\n return varName;\r\n },\r\n\r\n /**\r\n * Called when focusing away from the text field.\r\n * Deletes all variables that were created as the user typed their intended\r\n * variable name.\r\n * @param {string} newText The new variable name.\r\n * @private\r\n * @this Blockly.FieldTextInput\r\n */\r\n deleteIntermediateVars_: function (newText) {\r\n var outerWs = this.getSourceBlock().workspace.getRootWorkspace();\r\n if (!outerWs) {\r\n return;\r\n }\r\n for (var i = 0; i < this.createdVariables_.length; i++) {\r\n var model = this.createdVariables_[i];\r\n if (model.name != newText) {\r\n outerWs.deleteVariableById(model.getId());\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const procedures_callnoreturn = {\r\n /**\r\n * Block for calling a procedure with no return value.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n this.appendDummyInput('TOPROW')\r\n .appendField('', 'NAME');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setStyle('procedure_blocks');\r\n // Tooltip is set in renameProcedure.\r\n this.setHelpUrl(Blockly.Msg['PROCEDURES_CALLNORETURN_HELPURL']);\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n this.quarkConnections_ = {};\r\n this.quarkIds_ = null;\r\n this.previousEnabledState_ = true;\r\n },\r\n /**\r\n * Returns the name of the procedure this block calls.\r\n * @return {string} Procedure name.\r\n * @this {Blockly.Block}\r\n */\r\n getProcedureCall: function () {\r\n // The NAME field is guaranteed to exist, null will never be returned.\r\n return /** @type {string} */ (this.getFieldValue('NAME'));\r\n },\r\n /**\r\n * Notification that a procedure is renaming.\r\n * If the name matches this block's procedure, rename it.\r\n * @param {string} oldName Previous name of procedure.\r\n * @param {string} newName Renamed procedure.\r\n * @this {Blockly.Block}\r\n */\r\n renameProcedure: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getProcedureCall())) {\r\n this.setFieldValue(newName, 'NAME');\r\n var baseMsg = this.outputConnection ?\r\n Blockly.Msg['PROCEDURES_CALLRETURN_TOOLTIP'] :\r\n Blockly.Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];\r\n this.setTooltip(baseMsg.replace('%1', newName));\r\n }\r\n },\r\n /**\r\n * Notification that the procedure's parameters have changed.\r\n * @param {!Array} paramNames New param names, e.g. ['x', 'y', 'z'].\r\n * @param {!Array} paramIds IDs of params (consistent for each\r\n * parameter through the life of a mutator, regardless of param renaming),\r\n * e.g. ['piua', 'f8b_', 'oi.o'].\r\n * @private\r\n * @this {Blockly.Block}\r\n */\r\n setProcedureParameters_: function (paramNames, paramIds) {\r\n // Data structures:\r\n // this.arguments = ['x', 'y']\r\n // Existing param names.\r\n // this.quarkConnections_ {piua: null, f8b_: Connection}\r\n // Look-up of paramIds to connections plugged into the call block.\r\n // this.quarkIds_ = ['piua', 'f8b_']\r\n // Existing param IDs.\r\n // Note that quarkConnections_ may include IDs that no longer exist, but\r\n // which might reappear if a param is reattached in the mutator.\r\n const defBlock = Procedures.getDefinition(\r\n this.getProcedureCall(),\r\n this.workspace,\r\n );\r\n const mutatorIcon = defBlock && defBlock.getIcon(Blockly.icons.MutatorIcon.TYPE);\r\n const mutatorOpen = mutatorIcon && mutatorIcon.bubbleIsVisible();\r\n if (!mutatorOpen) {\r\n this.quarkConnections_ = {};\r\n this.quarkIds_ = null;\r\n } else {\r\n // fix #6091 - this call could cause an error when outside if-else\r\n // expanding block while mutating prevents another error (ancient fix)\r\n this.setCollapsed(false);\r\n }\r\n // Test arguments (arrays of strings) for changes. '\\n' is not a valid\r\n // argument name character, so it is a valid delimiter here.\r\n if (paramNames.join('\\n') === this.arguments_.join('\\n')) {\r\n // No change.\r\n this.quarkIds_ = paramIds;\r\n return;\r\n }\r\n if (paramIds.length !== paramNames.length) {\r\n throw Error('paramNames and paramIds must be the same length.');\r\n }\r\n if (!this.quarkIds_) {\r\n // Initialize tracking for this block.\r\n this.quarkConnections_ = {};\r\n this.quarkIds_ = [];\r\n }\r\n // Update the quarkConnections_ with existing connections.\r\n for (let i = 0; i < this.arguments_.length; i++) {\r\n const input = this.getInput('ARG' + i);\r\n if (input) {\r\n const connection = input?.connection?.targetConnection;\r\n this.quarkConnections_[this.quarkIds_[i]] = connection;\r\n if (\r\n mutatorOpen &&\r\n connection &&\r\n !paramIds.includes(this.quarkIds_[i])\r\n ) {\r\n // This connection should no longer be attached to this block.\r\n connection.disconnect();\r\n connection.getSourceBlock().bumpNeighbours();\r\n }\r\n }\r\n }\r\n // Rebuild the block's arguments.\r\n this.arguments_ = [].concat(paramNames);\r\n // And rebuild the argument model list.\r\n this.argumentVarModels_ = [];\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var variable = Blockly.Variables.getOrCreateVariablePackage(\r\n this.workspace, null, this.arguments_[i], '');\r\n this.argumentVarModels_.push(variable);\r\n }\r\n\r\n this.updateShape_();\r\n this.quarkIds_ = paramIds;\r\n // Reconnect any child blocks.\r\n if (this.quarkIds_) {\r\n for (let i = 0; i < this.arguments_.length; i++) {\r\n const quarkId = this.quarkIds_[i]; // TODO(#6920)\r\n if (quarkId in this.quarkConnections_) {\r\n // TODO(#6920): investigate claimed circular initialisers.\r\n const connection = this.quarkConnections_[quarkId];\r\n if (!connection?.reconnect(this, 'ARG' + i)) {\r\n // Block no longer exists or has been attached elsewhere.\r\n delete this.quarkConnections_[quarkId];\r\n }\r\n }\r\n }\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of arguments.\r\n * @private\r\n * @this {Blockly.Block}\r\n */\r\n updateShape_: function () {\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var field = this.getField('ARGNAME' + i);\r\n if (field) {\r\n // Ensure argument name is up to date.\r\n // The argument name field is deterministic based on the mutation,\r\n // no need to fire a change event.\r\n Blockly.Events.disable();\r\n try {\r\n field.setValue(this.arguments_[i]);\r\n } finally {\r\n Blockly.Events.enable();\r\n }\r\n } else {\r\n // Add new input.\r\n field = new Blockly.FieldLabel(this.arguments_[i]);\r\n var input = this.appendValueInput('ARG' + i)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(field, 'ARGNAME' + i);\r\n input.init();\r\n }\r\n }\r\n // Remove deleted inputs.\r\n while (this.getInput('ARG' + i)) {\r\n this.removeInput('ARG' + i);\r\n i++;\r\n }\r\n // Add 'with:' if there are parameters, remove otherwise.\r\n var topRow = this.getInput('TOPROW');\r\n if (topRow) {\r\n if (this.arguments_.length) {\r\n if (!this.getField('WITH')) {\r\n topRow.appendField(Blockly.Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH');\r\n topRow.init();\r\n }\r\n } else {\r\n if (this.getField('WITH')) {\r\n topRow.removeField('WITH');\r\n }\r\n }\r\n }\r\n },\r\n /**\r\n * Create XML to represent the (non-editable) name and arguments.\r\n * @return {!Element} XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n mutationToDom: function () {\r\n var container = Blockly.utils.xml.createElement('mutation');\r\n container.setAttribute('name', this.getProcedureCall());\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var parameter = Blockly.utils.xml.createElement('arg');\r\n parameter.setAttribute('name', this.arguments_[i]);\r\n container.appendChild(parameter);\r\n }\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the (non-editable) name and parameters.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n domToMutation: function (xmlElement) {\r\n var name = xmlElement.getAttribute('name');\r\n this.renameProcedure(this.getProcedureCall(), name);\r\n var args = [];\r\n var paramIds = [];\r\n for (var i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\r\n if (childNode.nodeName.toLowerCase() == 'arg') {\r\n args.push(childNode.getAttribute('name'));\r\n paramIds.push(childNode.getAttribute('paramId'));\r\n }\r\n }\r\n this.setProcedureParameters_(args, paramIds);\r\n },\r\n /**\r\n * Returns the state of this block as a JSON serializable object.\r\n *\r\n * @returns The state of this block, ie the params and procedure name.\r\n */\r\n saveExtraState: function () {\r\n const state = Object.create(null);\r\n state['name'] = this.getProcedureCall();\r\n if (this.arguments_.length) {\r\n state['params'] = this.arguments_;\r\n }\r\n return state;\r\n },\r\n /**\r\n * Applies the given state to this block.\r\n *\r\n * @param state The state to apply to this block, ie the params and\r\n * procedure name.\r\n */\r\n loadExtraState: function (state) {\r\n this.renameProcedure(this.getProcedureCall(), state['name']);\r\n const params = state['params'];\r\n if (params) {\r\n const ids = [];\r\n ids.length = params.length;\r\n ids.fill(null); // TODO(#6920)\r\n this.setProcedureParameters_(params, ids);\r\n }\r\n },\r\n /**\r\n * Return all variables referenced by this block.\r\n * @return {!Array} List of variable names.\r\n * @this {Blockly.Block}\r\n */\r\n getVars: function () {\r\n return this.arguments_;\r\n },\r\n /**\r\n * Return all variables referenced by this block.\r\n * @return {!Array} List of variable models.\r\n * @this {Blockly.Block}\r\n */\r\n getVarModels: function () {\r\n return this.argumentVarModels_;\r\n },\r\n /**\r\n * Procedure calls cannot exist without the corresponding procedure\r\n * definition. Enforce this link whenever an event is fired.\r\n * @param {!Blockly.Events.Abstract} event Change event.\r\n * @this {Blockly.Block}\r\n */\r\n onchange: function (event) {\r\n if (!this.workspace || this.workspace.isFlyout) {\r\n // Block is deleted or is in a flyout.\r\n return;\r\n }\r\n if (!event.recordUndo) {\r\n // Events not generated by user. Skip handling.\r\n return;\r\n }\r\n if (event.type == Blockly.Events.BLOCK_CREATE &&\r\n event.ids.indexOf(this.id) != -1) {\r\n // Look for the case where a procedure call was created (usually through\r\n // paste) and there is no matching definition. In this case, create\r\n // an empty definition block with the correct signature.\r\n var name = this.getProcedureCall();\r\n var def = Procedures.getDefinition(name, this.workspace);\r\n if (def && (def.type != this.defType_)) {\r\n // The signatures don't match.\r\n def = null;\r\n }\r\n if (!def) {\r\n Blockly.Events.setGroup(event.group);\r\n /**\r\n * Create matching definition block.\r\n * \r\n * \r\n * \r\n * \r\n * \r\n * test\r\n * \r\n * \r\n */\r\n var xml = Blockly.utils.xml.createElement('xml');\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', this.defType_);\r\n var xy = this.getRelativeToSurfaceXY();\r\n var x = xy.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1);\r\n var y = xy.y + Blockly.SNAP_RADIUS * 2;\r\n block.setAttribute('x', x);\r\n block.setAttribute('y', y);\r\n var mutation = this.mutationToDom();\r\n block.appendChild(mutation);\r\n var field = Blockly.utils.xml.createElement('field');\r\n field.setAttribute('name', 'NAME');\r\n var callName = this.getProcedureCall();\r\n if (!callName) {\r\n // Rename if name is empty string.\r\n callName = Procedures.findLegalName('', this);\r\n this.renameProcedure('', callName);\r\n }\r\n field.appendChild(Blockly.utils.xml.createTextNode(callName));\r\n block.appendChild(field);\r\n xml.appendChild(block);\r\n Blockly.Xml.domToWorkspace(xml, this.workspace);\r\n Blockly.Events.setGroup(false);\r\n } else {\r\n if (JSON.stringify(def.getVars()) != JSON.stringify(this.arguments_)) {\r\n let paramNames = def.arguments_;\r\n let paramIds = [];\r\n for (var i = 0; i < this.arguments_.length; i++) {\r\n var input = this.getInput('ARG' + i);\r\n if (!input) {\r\n continue;\r\n }\r\n var connection = input.connection.targetConnection;\r\n if (!connection) {\r\n paramIds.push(null);\r\n continue;\r\n }\r\n paramIds.push(connection.sourceBlock_.id);\r\n }\r\n this.setProcedureParameters_(paramNames, paramIds);\r\n }\r\n }\r\n } else if (event.type == Blockly.Events.BLOCK_DELETE) {\r\n // Look for the case where a procedure definition has been deleted,\r\n // leaving this block (a procedure call) orphaned. In this case, delete\r\n // the orphan.\r\n var name = this.getProcedureCall();\r\n var def = Procedures.getDefinition(name, this.workspace);\r\n if (!def) {\r\n Blockly.Events.setGroup(event.group);\r\n this.dispose(true);\r\n Blockly.Events.setGroup(false);\r\n }\r\n } else if (event.type == Blockly.Events.CHANGE && event.element == 'disabled') {\r\n var name = this.getProcedureCall();\r\n var def = Procedures.getDefinition(name, this.workspace);\r\n if (def && def.id == event.blockId) {\r\n // in most cases the old group should be ''\r\n var oldGroup = Blockly.Events.getGroup();\r\n if (oldGroup) {\r\n // This should only be possible programmatically and may indicate a problem\r\n // with event grouping. If you see this message please investigate. If the\r\n // use ends up being valid we may need to reorder events in the undo stack.\r\n console.log('Saw an existing group while responding to a definition change');\r\n }\r\n Blockly.Events.setGroup(event.group);\r\n if (event.newValue) {\r\n this.previousEnabledState_ = this.isEnabled();\r\n this.setEnabled(false);\r\n } else {\r\n this.setEnabled(this.previousEnabledState_);\r\n }\r\n Blockly.Events.setGroup(oldGroup);\r\n }\r\n }\r\n },\r\n /**\r\n * Add menu option to find the definition block for this call.\r\n * @param {!Array} options List of menu options to add to.\r\n * @this {Blockly.Block}\r\n */\r\n customContextMenu: function (options) {\r\n if (!this.workspace.isMovable()) {\r\n // If we center on the block and the workspace isn't movable we could\r\n // loose blocks at the edges of the workspace.\r\n return;\r\n }\r\n\r\n var option = { enabled: true };\r\n option.text = Blockly.Msg['PROCEDURES_HIGHLIGHT_DEF'];\r\n var name = this.getProcedureCall();\r\n var workspace = this.workspace;\r\n option.callback = function () {\r\n var def = Procedures.getDefinition(name, workspace);\r\n if (def) {\r\n workspace.centerOnBlock(def.id);\r\n def.select();\r\n }\r\n };\r\n options.push(option);\r\n },\r\n defType_: 'procedures_defnoreturn'\r\n};\r\n\r\nexport const procedures_callreturn = {\r\n /**\r\n * Block for calling a procedure with a return value.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n this.appendDummyInput('TOPROW')\r\n .appendField('', 'NAME');\r\n this.setOutput(true);\r\n this.setStyle('procedure_blocks');\r\n // Tooltip is set in domToMutation.\r\n this.setHelpUrl(Blockly.Msg['PROCEDURES_CALLRETURN_HELPURL']);\r\n this.arguments_ = [];\r\n this.argumentVarModels_ = [];\r\n this.quarkConnections_ = {};\r\n this.quarkIds_ = null;\r\n this.previousEnabledState_ = true;\r\n },\r\n\r\n getProcedureCall: procedures_callnoreturn.getProcedureCall,\r\n renameProcedure: procedures_callnoreturn.renameProcedure,\r\n setProcedureParameters_:\r\n procedures_callnoreturn.setProcedureParameters_,\r\n updateShape_: procedures_callnoreturn.updateShape_,\r\n mutationToDom: procedures_callnoreturn.mutationToDom,\r\n domToMutation: procedures_callnoreturn.domToMutation,\r\n getVars: procedures_callnoreturn.getVars,\r\n getVarModels: procedures_callnoreturn.getVarModels,\r\n onchange: procedures_callnoreturn.onchange,\r\n customContextMenu:\r\n procedures_callnoreturn.customContextMenu,\r\n defType_: 'procedures_defreturn'\r\n};\r\n\r\nexport const procedures_ifreturn = {\r\n /**\r\n * Block for conditionally returning a value from a procedure.\r\n * @this {Blockly.Block}\r\n */\r\n init: function () {\r\n this.appendValueInput('CONDITION')\r\n .setCheck('Boolean')\r\n .appendField(Blockly.Msg['CONTROLS_IF_MSG_IF']);\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setStyle('procedure_blocks');\r\n this.setTooltip(Blockly.Msg['PROCEDURES_IFRETURN_TOOLTIP']);\r\n this.setHelpUrl(Blockly.Msg['PROCEDURES_IFRETURN_HELPURL']);\r\n this.hasReturnValue_ = true;\r\n },\r\n /**\r\n * Create XML to represent whether this block has a return value.\r\n * @return {!Element} XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n mutationToDom: function () {\r\n var container = Blockly.utils.xml.createElement('mutation');\r\n container.setAttribute('value', Number(this.hasReturnValue_));\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore whether this block has a return value.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this {Blockly.Block}\r\n */\r\n domToMutation: function (xmlElement) {\r\n var value = xmlElement.getAttribute('value');\r\n this.hasReturnValue_ = (value == 1);\r\n if (!this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendDummyInput('VALUE')\r\n .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);\r\n }\r\n },\r\n /**\r\n * Called whenever anything on the workspace changes.\r\n * Add warning if this flow block is not nested inside a loop.\r\n * @param {!Blockly.Events.Abstract} _e Change event.\r\n * @this {Blockly.Block}\r\n */\r\n onchange: function () {\r\n if (!this.workspace.isDragging || this.workspace.isDragging()) {\r\n return; // Don't change state at the start of a drag.\r\n }\r\n var legal = false;\r\n // Is the block nested in a procedure?\r\n var block = this;\r\n do {\r\n if (this.FUNCTION_TYPES.indexOf(block.type) != -1) {\r\n legal = true;\r\n break;\r\n }\r\n block = block.getSurroundParent();\r\n } while (block);\r\n if (legal) {\r\n // If needed, toggle whether this block has a return value.\r\n if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendDummyInput('VALUE')\r\n .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);\r\n this.hasReturnValue_ = false;\r\n } else if (block.type == 'procedures_defreturn' &&\r\n !this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);\r\n this.hasReturnValue_ = true;\r\n }\r\n this.setWarningText(null);\r\n if (!this.isInFlyout) {\r\n this.setEnabled(true);\r\n }\r\n } else {\r\n this.setWarningText(Blockly.Msg['PROCEDURES_IFRETURN_WARNING']);\r\n if (!this.isInFlyout && !this.getInheritedDisabled()) {\r\n this.setEnabled(false);\r\n }\r\n }\r\n },\r\n /**\r\n * List of block types that are functions and thus do not need warnings.\r\n * To add a new function type add this to your code:\r\n * procedures_ifreturn.FUNCTION_TYPES.push('custom_func');\r\n */\r\n FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn']\r\n};\r\n\r\nexport const procedures_return = {\r\n /**\r\n * Block for conditionally returning a value from a procedure.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setStyle('procedure_blocks');\r\n // this.appendValueInput('CONDITION')\r\n // .setCheck(Boolean)\r\n // .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP);\r\n this.hasReturnValue_ = true;\r\n },\r\n /**\r\n * Create XML to represent whether this block has a return value.\r\n * @return {!Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('value', Number(this.hasReturnValue_));\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore whether this block has a return value.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var value = xmlElement.getAttribute('value');\r\n this.hasReturnValue_ = (value == 1);\r\n if (!this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendDummyInput('VALUE')\r\n .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);\r\n }\r\n },\r\n /**\r\n * Called whenever anything on the workspace changes.\r\n * Add warning if this flow block is not nested inside a loop.\r\n * @param {!Blockly.Events.Abstract} e Change event.\r\n * @this Blockly.Block\r\n */\r\n onchange: function () {\r\n var legal = false;\r\n // Is the block nested in a procedure?\r\n var block = this;\r\n do {\r\n if (this.FUNCTION_TYPES.indexOf(block.type) != -1) {\r\n legal = true;\r\n break;\r\n }\r\n block = block.getSurroundParent();\r\n } while (block);\r\n if (legal) {\r\n // If needed, toggle whether this block has a return value.\r\n if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendDummyInput('VALUE')\r\n .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);\r\n this.hasReturnValue_ = false;\r\n } else if (block.type == 'procedures_defreturn' &&\r\n !this.hasReturnValue_) {\r\n this.removeInput('VALUE');\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);\r\n this.hasReturnValue_ = true;\r\n }\r\n this.setWarningText(null);\r\n } else {\r\n this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING);\r\n }\r\n },\r\n /**\r\n * List of block types that are functions and thus do not need warnings.\r\n * To add a new function type add this to your code:\r\n * procedures_ifreturn.FUNCTION_TYPES.push('custom_func');\r\n */\r\n FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn', 'method_procedures_defnoreturn', 'method_procedures_defreturn']\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst SET_HUE = 100;\r\n\r\nexport const set_create_with = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n .appendField(new Blockly.FieldTextInput('s1'), 'VAR')\r\n\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['set_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.blockpy_SET_CREATE_WITH_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('set_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('set_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.blockpy_SET_CREATE_EMPTY_TITLE);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.blockpy_SET_CREATE_WITH_INPUT_WITH);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const set_create_with_container = {\r\n /**\r\n * Mutator block for list container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const set_create_with_item = {\r\n /**\r\n * Mutator bolck for adding items.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_SET_VARIABLES_NAME);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.blockpy_SET_CREATE_WITH_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const set_length = {\r\n\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendValueInput('SET');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_LENGTH);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.SET_LENGTH_TOOLTIP);\r\n this.setOutput(true, Number);\r\n }\r\n};\r\n\r\nexport const set_pop = {\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendValueInput('SET')\r\n .setCheck('Set')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_SET_GET_AND_REMOVE_LAST);\r\n this.setTooltip(Blockly.Msg.SET_POP_TOOLTIP);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const set_clear = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendValueInput('SET')\r\n .setCheck('Set')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.SET_CLEAR);\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const set_operate = {\r\n init: function () {\r\n\r\n\r\n this.appendValueInput('SET1')\r\n .setCheck('Set')\r\n var operate = [\r\n [Blockly.Msg.blockpy_set_union, 'union'],\r\n [Blockly.Msg.blockpy_set_intersection, 'intersection'],\r\n [Blockly.Msg.blockpy_set_difference, 'difference']\r\n ];\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_and_set)\r\n this.appendValueInput('SET2')\r\n .setCheck('Set')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_set_get_operate)\r\n .appendField(new Blockly.FieldDropdown(operate), 'OPERATE')\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true, \"set\");\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OPERATE');\r\n var TOOLTIPS = {\r\n 'union': Blockly.Msg.MIXLY_TOOLTIP_SET_UNION,\r\n 'intersection': Blockly.Msg.MIXLY_TOOLTIP_SET_INTERSECTION,\r\n 'difference': Blockly.Msg.MIXLY_TOOLTIP_SET_DIFFERENCE\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const set_operate_update = {\r\n init: function () {\r\n\r\n this.appendValueInput('SET1')\r\n .setCheck('Set')\r\n var operate_update = [\r\n [Blockly.Msg.blockpy_set_union, 'update'],\r\n [Blockly.Msg.blockpy_set_intersection, 'intersection_update'],\r\n [Blockly.Msg.blockpy_set_difference, 'difference_update']\r\n ];\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_and_set)\r\n this.appendValueInput('SET2')\r\n .setCheck('Set')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_set_get_operate)\r\n .appendField(new Blockly.FieldDropdown(operate_update), 'OPERATE')\r\n\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_set_update)\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OPERATE');\r\n var TOOLTIPS = {\r\n 'update': Blockly.Msg.MIXLY_TOOLTIP_SET_UPDATE,\r\n 'intersection_update': Blockly.Msg.MIXLY_TOOLTIP_SET_INTERSECTION_UPDATE,\r\n 'difference_update': Blockly.Msg.MIXLY_TOOLTIP_SET_DIFFERENCE_UPDATE\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const set_add_discard = {\r\n init: function () {\r\n this.appendValueInput('SET')\r\n .setCheck('Set')\r\n var changenum =\r\n [[Blockly.Msg.MIXLY_blockpy_set_add, 'add'], [Blockly.Msg.MIXLY_blockpy_set_discard, 'discard']];\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(changenum), 'OPERATE')\r\n this.appendValueInput('data')\r\n .appendField(Blockly.Msg.blockpy_SET_VARIABLES_NAME)\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OPERATE');\r\n var TOOLTIPS = {\r\n 'add': Blockly.Msg.SET_ADD_TOOLTIP,\r\n 'discard': Blockly.Msg.SET_DISCARD_TOOLTIP,\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const set_sub = {\r\n init: function () {\r\n\r\n this.appendValueInput('SET1')\r\n .setCheck('Set')\r\n var sub_super = [\r\n [Blockly.Msg.blockpy_set_sub, 'issubset'],\r\n [Blockly.Msg.blockpy_set_super, 'issuperset']\r\n ];\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_is_set)\r\n this.appendValueInput('SET2')\r\n .setCheck('Set')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_set_of)\r\n .appendField(new Blockly.FieldDropdown(sub_super), 'OPERATE')\r\n\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true, Boolean);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OPERATE');\r\n var TOOLTIPS = {\r\n 'issubset': Blockly.Msg.MIXLY_TOOLTIP_SET_SUB,\r\n 'issuperset': Blockly.Msg.MIXLY_TOOLTIP_SET_SUPER\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const set_update = {\r\n init: function () {\r\n this.appendValueInput('SET')\r\n .setCheck('Set')\r\n this.setColour(SET_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck([String, 'List'])\r\n .appendField(Blockly.Msg.blockpy_set_add_update);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.SET_UPDATE_TOOLTIP);\r\n }\r\n};\r\n\r\n// export const set_change_to = {\r\n// init: function() {\r\n// var OPERATORS =\r\n// [[Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'],\r\n// [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, 'tuple']\r\n// ];\r\n// this.setColour(SET_HUE);\r\n// this.appendValueInput('VAR')\r\n// .setCheck(\"Set\")\r\n// // .appendField(Blockly.Msg.blockpy_USE_LIST);\r\n// this.appendDummyInput(\"\")\r\n// .appendField(Blockly.Msg.A_TO_B)\r\n// .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n// this.setInputsInline(true);\r\n// this.setOutput(true);\r\n// var thisBlock = this;\r\n// this.setTooltip(function() {\r\n// var mode = thisBlock.getFieldValue('OP');\r\n// var TOOLTIPS = {\r\n// 'list': Blockly.Msg.SET_TO_LISTS,\r\n// 'tuple': Blockly.Msg.SET_TO_TUPLE,\r\n// };\r\n// return TOOLTIPS[mode];\r\n// });\r\n// }\r\n// };\r\n\r\nexport const set_create_with_text_return = {\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField('{')\r\n .appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')\r\n .appendField('}');\r\n // .appendField(this.newQuote_(false))\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_SET_CREATE_WITH_TEXT);\r\n }\r\n}\r\n\r\nexport const set_toset = {\r\n init: function () {\r\n this.setColour(SET_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOSET);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOSET);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst STORAGE_HUE = 0; //'#5d69c5'//0;\r\n\r\nexport const storage_open_file_with_os = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput('fn')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_STORAGE_OPEN_FILE_WITH_OS + \"(For Windows)\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n }\r\n}\r\n\r\nexport const storage_fileopen = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILENAME\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE);\r\n //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb'],\r\n [Blockly.Msg.MIXLY_ADD, 'a'],\r\n [Blockly.Msg.MATH_BIN + Blockly.Msg.MIXLY_ADD, 'ab'],\r\n [Blockly.Msg.MIXLY_R_W ,'r+'],\r\n [Blockly.Msg.MATH_BIN + Blockly.Msg.MIXLY_R_W ,'rb+'],\r\n [Blockly.Msg.MIXLY_W_R ,'w+'],\r\n [Blockly.Msg.MATH_BIN + Blockly.Msg.MIXLY_W_R ,'wb+'],\r\n [Blockly.Msg.MIXLY_A_R ,'a+'],\r\n [Blockly.Msg.MATH_BIN + Blockly.Msg.MIXLY_A_R ,'ab+']\r\n ]), 'MODE');\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_AS);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_USE;\r\n var mode1 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE;\r\n var mode3 = Blockly.Msg.MIXLY_BELONG;\r\n var TOOLTIPS = {\r\n 'r': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,\r\n 'w': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,\r\n 'rb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,\r\n 'wb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE\r\n };\r\n return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2;\r\n });\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\n\r\nexport const storage_fileopen_new = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILENAME\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE);\r\n //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb']\r\n ]), 'MODE');\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_USE;\r\n var mode1 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE;\r\n var mode3 = Blockly.Msg.MIXLY_BELONG;\r\n var mode4 = Blockly.Msg.PY_STORAGE_FILE_OBJECT;\r\n var TOOLTIPS = {\r\n 'r': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,\r\n 'w': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,\r\n 'rb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,\r\n 'wb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE\r\n };\r\n return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2 + mode4;\r\n });\r\n }\r\n};\r\n\r\nexport const storage_fileopen_new_encoding = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILENAME\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE);\r\n //.appendField(new Blockly.FieldTextInput('filename.txt'), 'FILENAME');\r\n var code =\r\n [['ANSI', 'ANSI'], ['gbk', 'gbk'], ['utf-8', 'utf-8']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ, 'r'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE, 'w'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ, 'rb'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE, 'wb']\r\n ]), 'MODE');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXPY_TEXT_ENCODE)\r\n .appendField(new Blockly.FieldDropdown(code), 'CODE')\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_USE;\r\n var mode1 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE;\r\n var mode3 = Blockly.Msg.MIXLY_BELONG;\r\n var mode4 = Blockly.Msg.PY_STORAGE_FILE_OBJECT;\r\n var TOOLTIPS = {\r\n 'r': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,\r\n 'w': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,\r\n 'rb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,\r\n 'wb': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE\r\n };\r\n return mode0 + TOOLTIPS[mode] + mode3 + mode1 + mode2 + mode4;\r\n });\r\n }\r\n};\r\n\r\nexport const storage_file_write = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput('data')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE);\r\n // .appendField(new Blockly.FieldTextInput('f'), 'FILE');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE);\r\n }\r\n}\r\n\r\nexport const storage_get_contents_without_para = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck('Variable')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL, 'read'], [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE, 'readline'], [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES, 'readlines']]), 'MODE');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false); //in front of the block has something\r\n this.setNextStatement(false); //beyond the ... has something\r\n this.setOutput(true, String);\r\n }\r\n};\r\n\r\nexport const storage_get_contents = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck('Variable')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE, 'read'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE, 'readline'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE, 'readlines']\r\n ]), 'MODE');\r\n this.appendValueInput(\"SIZE\")\r\n .setCheck(Number);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false); //in front of the block has something\r\n this.setNextStatement(false); //beyond the ... has something\r\n this.setOutput(true, String);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER;\r\n var TOOLTIPS = {\r\n 'read': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE,\r\n 'readline': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE,\r\n 'readlines': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE\r\n };\r\n return mode0 + TOOLTIPS[mode] + 'x' + mode2;\r\n });\r\n }\r\n};\r\n\r\nexport const storage_get_a_line = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE);\r\n this.setNextStatement(true);\r\n this.appendValueInput(\"SIZE\")\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MICROBIT_PYTHON_TYPE);\r\n }\r\n};\r\n\r\nexport const storage_can_write_ornot = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.HTML_FILE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, Boolean);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT1);\r\n }\r\n};\r\n\r\nexport const storage_get_filename = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILENAME);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILENAME);\r\n }\r\n};\r\n\r\nexport const storage_close_file = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE);\r\n }\r\n};\r\n\r\nexport const storage_list_all_files = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, 'List');\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES);\r\n }\r\n};\r\nBlockly.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE\r\nexport const storage_delete_file = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE, 'remove'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_DIRS, 'removedirs']\r\n ]), 'MODE');\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE);\r\n }\r\n};\r\n\r\nexport const storage_get_file_size = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE);\r\n }\r\n};\r\n\r\nexport const storage_file_tell = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_RETURN_FILE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_PRESENT_LOCATION);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_TELL);\r\n }\r\n};\r\n\r\nexport const storage_file_seek = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck('Variable')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START, 'start'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT, 'current'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END, 'end']\r\n ]), 'MODE');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET);\r\n this.appendValueInput(\"SIZE\")\r\n .setCheck(Number);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true); //in front of the block has something\r\n this.setNextStatement(true); //beyond the ... has something\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER;\r\n var mode3 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET;\r\n var TOOLTIPS = {\r\n 'start': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START,\r\n 'current': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT,\r\n 'end': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END\r\n };\r\n return mode0 + \" \" + TOOLTIPS[mode] + mode3 + 'x' + mode2;\r\n });\r\n }\r\n};\r\n\r\nexport const storage_get_current_dir = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, 'List');\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR);\r\n }\r\n};\r\n\r\nexport const storage_make_dir = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"PATH\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_ESP32_SET);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR, 'mkdir'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MAKEDIRS, 'makedirs']\r\n ]), 'MODE');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true); //in front of the block has something\r\n this.setNextStatement(true); //beyond the ... has something\r\n this.setOutput(false);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH;\r\n var mode2 = Blockly.Msg.MIXLY_ESP32_SET;\r\n var TOOLTIPS = {\r\n 'mkdir': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR,\r\n 'makedirs': Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS\r\n };\r\n return mode0 + 'x' + mode2 + TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const storage_rename = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME);\r\n this.appendValueInput(\"NEWFILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_AS);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME);\r\n }\r\n};\r\n\r\nexport const storage_change_dir = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR);\r\n }\r\n};\r\n\r\nexport const storage_is_file = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.HTML_FILE, 'isfile'],\r\n [Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_DIR, 'isdir']\r\n ]), 'MODE');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, Boolean);\r\n let thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('MODE');\r\n var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH;\r\n var mode2 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT;\r\n var TOOLTIPS = {\r\n 'isfile': Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR,\r\n 'isdir': Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS\r\n };\r\n return mode0 + 'x' + mode2 + TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const sdcard_use_spi_init = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput('SPISUB')\r\n .appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + \"SPI\")\r\n .setCheck(\"var\");\r\n this.appendValueInput('PINSUB')\r\n .appendField(\"CS\")\r\n this.appendValueInput('SUB')\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)\r\n .setCheck(\"var\");\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO)\r\n .appendField(Blockly.Msg.MIXLY_SD_CARD);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n }\r\n};\r\n\r\nexport const sdcard_mount = {\r\n init: function () {\r\n this.setColour(STORAGE_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_SD_CARD);\r\n this.appendValueInput(\"DIR\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_SDCARD_MOUNT);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip();\r\n }\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nconst TEXTS_HUE = 160//'#9ec440'//160;\r\n\r\nexport const text = {\r\n /**\r\n * Block for text value.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n //this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(this.newQuote_(true))\r\n .appendField(new Blockly.FieldTextInput(''), 'TEXT')\r\n .appendField(this.newQuote_(false));\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.TEXT_TEXT_TOOLTIP);\r\n },\r\n /**\r\n * Create an image of an open or closed quote.\r\n * @param {boolean} open True if open quote, false if closed.\r\n * @return {!Blockly.FieldImage} The field image of the quote.\r\n * @private\r\n */\r\n newQuote_: function (open) {\r\n if (open == this.RTL) {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';\r\n } else {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';\r\n }\r\n return new Blockly.FieldImage(file, 12, 12, '\"');\r\n }\r\n};\r\n\r\nexport const text_textarea = {\r\n /**\r\n * Block for text value.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n //this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(this.newQuote_(true))\r\n .appendField(new Blockly.FieldMultilineInput('Hello\\nMixly'), 'VALUE')\r\n // .appendField(new Blockly.FieldTextInput(''), 'TEXT')\r\n .appendField(this.newQuote_(false));\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.TEXT_LINES_TOOLTIP);\r\n },\r\n /**\r\n * Create an image of an open or closed quote.\r\n * @param {boolean} open True if open quote, false if closed.\r\n * @return {!Blockly.FieldImage} The field image of the quote.\r\n * @private\r\n */\r\n newQuote_: function (open) {\r\n if (open == this.RTL) {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';\r\n } else {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';\r\n }\r\n return new Blockly.FieldImage(file, 12, 12, '\"');\r\n }\r\n};\r\n\r\nexport const text_bytes = {\r\n /**\r\n * Block for text value.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TEXT_BYTES)\r\n .appendField(this.newQuote_(true))\r\n .appendField(new Blockly.FieldTextInput(''), 'TEXT')\r\n .appendField(this.newQuote_(false));\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.TEXT_TEXT_TOOLTIP);\r\n },\r\n /**\r\n * Create an image of an open or closed quote.\r\n * @param {boolean} open True if open quote, false if closed.\r\n * @return {!Blockly.FieldImage} The field image of the quote.\r\n * @private\r\n */\r\n newQuote_: function (open) {\r\n if (open == this.RTL) {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';\r\n } else {\r\n var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';\r\n }\r\n return new Blockly.FieldImage(file, 12, 12, '\"');\r\n }\r\n};\r\n\r\nBlockly.FieldTextInput.char_validator = function (text) {\r\n if (text.length > 1) {\r\n if (text.charAt(0) === \"\\\\\") {\r\n var charAtOne = text.charAt(1);\r\n if (charAtOne === \"0\" ||\r\n charAtOne === \"b\" ||\r\n charAtOne === \"f\" ||\r\n charAtOne === \"n\" ||\r\n charAtOne === \"r\" ||\r\n charAtOne === \"t\" ||\r\n charAtOne === \"\\\\\" ||\r\n charAtOne === \"'\") {\r\n return String(text).substring(0, 2);\r\n } else if (charAtOne === \"x\" && text.charAt(2) === \"0\" && text.charAt(3) === \"B\") {\r\n return String(text).substring(0, 4);\r\n }\r\n }\r\n }\r\n return String(text).substring(0, 1);\r\n};\r\n\r\nexport const text_char = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(this.newQuote_(true))\r\n .appendField(new Blockly.FieldTextInput('', Blockly.FieldTextInput.char_validator), 'TEXT')\r\n .appendField(this.newQuote_(false));\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.TEXT_CHAR_TOOLTIP);\r\n },\r\n newQuote_: function (open) {\r\n if (open == true) {\r\n var file = '../../media/quote2.png';\r\n } else {\r\n var file = '../../media/quote3.png';\r\n }\r\n return new Blockly.FieldImage(file, 7, 12, '\"');\r\n }\r\n};\r\n\r\n\r\nexport const text_join = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('A')\r\n .setCheck([String, Number]);\r\n this.appendValueInput('B')\r\n .setCheck([String, Number])\r\n .appendField(Blockly.Msg.MIXLY_TEXT_JOIN);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_JOIN);\r\n }\r\n};\r\n\r\nexport const ascii_to_char = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TOCHAR);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOCHAR);\r\n }\r\n};\r\n\r\nexport const char_to_ascii = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_TOASCII);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOASCII);\r\n }\r\n};\r\n\r\nexport const number_to_text = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOSTRING);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOTEXT);\r\n }\r\n};\r\n\r\nexport const text_length = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_LENGTH);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_LENGTH);\r\n }\r\n}\r\n\r\n\r\n\r\nexport const text_char_at2 = {\r\n init: function () {\r\n this.WHERE_OPTIONS = [\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_START, \"FROM_START\"],\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_END, \"FROM_END\"],\r\n [Blockly.Msg.TEXT_GET_INDEX_RANDOM + 1 + Blockly.Msg.TEXT_CHARAT2, \"RANDOM\"]\r\n ];\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String)\r\n // .appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST)\r\n this.appendValueInput(\"AT\")\r\n .setCheck(Number)\r\n this.appendDummyInput()\r\n //.appendField(Blockly.Msg.MIXLY_MID)\r\n .appendField(Blockly.Msg.LISTS_GET_INDEX_GET, \"MODE\");\r\n // .appendField(\"\", \"SPACE\");\r\n Blockly.Msg.LISTS_GET_INDEX_TAIL && this.appendDummyInput(\"TAIL\").appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL);\r\n // this.appendDummyInput().appendField(Blockly.Msg.MIXLY_DE);\r\n this.setInputsInline(!0);\r\n this.setOutput(!0);\r\n this.updateAt_(!0);\r\n var b = this;\r\n this.setTooltip(function () {\r\n var a = b.getFieldValue(\"MODE\"),\r\n e = b.getFieldValue(\"WHERE\"),\r\n d = \"\";\r\n switch (a + \" \" + e) {\r\n case \"GET FROM_START\":\r\n case \"GET FROM_END\":\r\n d = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;\r\n break;\r\n case \"GET RANDOM\":\r\n d = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;\r\n break;\r\n case \"GET_REMOVE FROM_START\":\r\n case \"GET_REMOVE FROM_END\":\r\n d = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;\r\n break;\r\n case \"GET_REMOVE RANDOM\":\r\n d = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM;\r\n break;\r\n }\r\n if (\"FROM_START\" == e || \"FROM_END\" == e) d += \" \" + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace(\"%1\", Blockly.Msg.ONE_BASED_INDEXING ? \"#1\" : \"#0\");\r\n return d\r\n })\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('WHERE');\r\n var TOOLTIPS = {\r\n 'FROM_START': Blockly.Msg.LISTS_GET_INDEX_FROM_START,\r\n 'FROM_END': Blockly.Msg.LISTS_GET_INDEX_FROM_END,\r\n 'RANDOM': Blockly.Msg.TEXT_GET_INDEX_RANDOM\r\n };\r\n return Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING + TOOLTIPS[mode] + 'n' + Blockly.Msg.TEXT_CHARAT2;\r\n });\r\n },\r\n mutationToDom: function () {\r\n var a = document.createElement(\"mutation\");\r\n a.setAttribute(\"statement\", !this.outputConnection);\r\n var b = this.getInput(\"AT\").type == Blockly.INPUT_VALUE;\r\n a.setAttribute(\"at\", b);\r\n return a\r\n },\r\n domToMutation: function (a) {\r\n var b = \"true\" == a.getAttribute(\"statement\");\r\n this.updateStatement_(b);\r\n a = \"false\" != a.getAttribute(\"at\");\r\n this.updateAt_(a)\r\n },\r\n updateStatement_: function (a) {\r\n a != !this.outputConnection && (this.unplug(!0, !0), a ? (this.setOutput(!1), this.setPreviousStatement(!0), this.setNextStatement(!0)) : (this.setPreviousStatement(!1), this.setNextStatement(!1), this.setOutput(!0)))\r\n },\r\n updateAt_: function (a) {\r\n this.removeInput(\"AT\");\r\n this.removeInput(\"ORDINAL\", !0);\r\n a ? (this.appendValueInput(\"AT\").setCheck(Number), Blockly.Msg.TEXT_CHARAT2 && this.appendDummyInput(\"ORDINAL\").appendField(Blockly.Msg.TEXT_CHARAT2)) : this.appendDummyInput(\"AT\");\r\n var b = new Blockly.FieldDropdown(this.WHERE_OPTIONS,\r\n function (b) {\r\n var e = \"FROM_START\" == b || \"FROM_END\" == b;\r\n if (e != a) {\r\n var d = this.sourceBlock_;\r\n d.updateAt_(e);\r\n d.setFieldValue(b, \"WHERE\");\r\n return null\r\n }\r\n });\r\n this.getInput(\"AT\").appendField(b, \"WHERE\");\r\n Blockly.Msg.LISTS_GET_INDEX_TAIL && this.moveInputBefore(\"TAIL\", null)\r\n }\r\n};\r\n\r\n\r\nexport const text_char_at = {\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String);\r\n this.appendValueInput(\"AT\")\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LISTS_GET_INDEX_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_FROM_START);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT2);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING + Blockly.Msg.LISTS_GET_INDEX_FROM_START + 'n' + Blockly.Msg.TEXT_CHARAT2);\r\n }\r\n}\r\n\r\n\r\nexport const text_random_char = {\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_RANDOM_CHAR);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.TEXT_RANDOM_CHAR_TOOLTIP);\r\n }\r\n}\r\n\r\n\r\nexport const text_substring2 = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this['WHERE_OPTIONS_1'] = [\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'],\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST']\r\n ];\r\n this['WHERE_OPTIONS_2'] = [\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST']\r\n ];\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String)\r\n //.appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL)\r\n // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) {\r\n // this.appendDummyInput('TAIL')\r\n // .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL);\r\n // }\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);\r\n this.appendDummyInput('AT1');\r\n this.appendDummyInput('AT2');\r\n this.setInputsInline(true);\r\n this.setOutput(true, 'List');\r\n this.updateAt_(1, true);\r\n this.updateAt_(2, true);\r\n this.setTooltip(Blockly.Msg._GET_TEXT_SUBLIST_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent whether there are 'AT' inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE;\r\n container.setAttribute('at1', isAt1);\r\n var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE;\r\n container.setAttribute('at2', isAt2);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the 'AT' inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var isAt1 = (xmlElement.getAttribute('at1') == 'true');\r\n var isAt2 = (xmlElement.getAttribute('at2') == 'true');\r\n this.updateAt_(1, isAt1);\r\n this.updateAt_(2, isAt2);\r\n },\r\n /**\r\n * Create or delete an input for a numeric index.\r\n * This block has two such inputs, independant of each other.\r\n * @param {number} n Specify first or second input (1 or 2).\r\n * @param {boolean} isAt True if the input should exist.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateAt_: function (n, isAt) {\r\n // Create or delete an input for the numeric index.\r\n // Destroy old 'AT' and 'ORDINAL' inputs.\r\n this.removeInput('AT' + n);\r\n this.removeInput('ORDINAL' + n, true);\r\n // Create either a value 'AT' input or a dummy input.\r\n if (isAt) {\r\n this.appendValueInput('AT' + n).setCheck(Number);\r\n if (Blockly.Msg.TEXT_CHARAT2) {\r\n this.appendDummyInput('ORDINAL' + n)\r\n .appendField(Blockly.Msg.TEXT_CHARAT2);\r\n }\r\n } else {\r\n this.appendDummyInput('AT' + n);\r\n }\r\n var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n],\r\n function (value) {\r\n var newAt = (value == 'FROM_START') || (value == 'FROM_END');\r\n // The 'isAt' variable is available due to this function being a\r\n // closure.\r\n if (newAt != isAt) {\r\n var block = this.sourceBlock_;\r\n block.updateAt_(n, newAt);\r\n // This menu has been destroyed and replaced.\r\n // Update the replacement.\r\n block.setFieldValue(value, 'WHERE' + n);\r\n return null;\r\n }\r\n return undefined;\r\n });\r\n this.getInput('AT' + n)\r\n .appendField(menu, 'WHERE' + n);\r\n if (n == 1) {\r\n this.moveInputBefore('AT1', 'AT2');\r\n if (this.getInput('ORDINAL1')) {\r\n this.moveInputBefore('ORDINAL1', 'AT2');\r\n }\r\n }\r\n // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) {\r\n // this.moveInputBefore('TAIL', null);\r\n // }\r\n }\r\n};\r\n\r\nexport const text_substring = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String)\r\n this.appendValueInput('AT1')\r\n .appendField(Blockly.Msg.LISTS_GET_INDEX_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_FROM_START);\r\n this.appendValueInput('AT2')\r\n .appendField(Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT2);\r\n this.setInputsInline(true);\r\n this.setOutput(true, ['List', String]);\r\n this.setTooltip(Blockly.Msg._GET_TEXT_SUBLIST_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const text_equals_starts_ends = {\r\n init: function () {\r\n var TEXT_DOWHAT = [\r\n [Blockly.Msg.MIXLY_EQUALS, '==='],\r\n [Blockly.Msg.MIXLY_STARTSWITH, 'startswith'],\r\n [Blockly.Msg.MIXLY_ENDSWITH, 'endswith']\r\n ];\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"STR1\")\r\n .setCheck(String);\r\n this.appendValueInput(\"STR2\")\r\n .appendField(new Blockly.FieldDropdown(TEXT_DOWHAT), 'DOWHAT')\r\n .setCheck(String);\r\n this.setOutput(true, [Boolean, Number]);\r\n this.setInputsInline(true);\r\n }\r\n}\r\n\r\nexport const text_compare_to = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"STR1\")\r\n .setCheck(String);\r\n this.appendValueInput(\"STR2\")\r\n .appendField(Blockly.Msg.MIXLY_COMPARETO)\r\n .setCheck(String);\r\n this.setOutput(true, Number);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_COMPARETO_HELP);\r\n }\r\n}\r\n\r\nexport const text_capital = {\r\n init: function () {\r\n var TEXT_CAPITAL = [\r\n [Blockly.Msg.TEXT_UPPER, 'upper'],\r\n [Blockly.Msg.TEXT_TITLE, 'title'],\r\n [Blockly.Msg.TEXT_CAPITALIZE, 'capitalize'],\r\n [Blockly.Msg.TEXT_SWAPCASE, 'swapcase'],\r\n [Blockly.Msg.TEXT_LOWER, 'lower']\r\n ];\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(new Blockly.FieldDropdown(TEXT_CAPITAL), 'CAPITAL')\r\n .setCheck(String);\r\n this.setOutput(true, String);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('CAPITAL');\r\n var TOOLTIPS = {\r\n 'upper': Blockly.Msg.MIXLY_MIXPY_TEXT_UPPER_TOOLTIP,\r\n 'title': Blockly.Msg.MIXLY_MIXPY_TEXT_TITLE_TOOLTIP,\r\n 'swapcase': Blockly.Msg.MIXLY_MIXPY_TEXT_SWAPCASE_TOOLTIP,\r\n 'capitalize': Blockly.Msg.MIXLY_MIXPY_TEXT_CAPITALIZE_TOOLTIP,\r\n 'lower': Blockly.Msg.MIXLY_MIXPY_TEXT_LOWER_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n}\r\n\r\nexport const text_center = {\r\n init: function () {\r\n var TEXT_CENTER = [\r\n [Blockly.Msg.TEXT_LJUST, 'ljust'],\r\n [Blockly.Msg.TEXT_CENTER, 'center'],\r\n [Blockly.Msg.TEXT_RJUST, 'rjust']\r\n ];\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(new Blockly.FieldDropdown(TEXT_CENTER), 'CENTER')\r\n .setCheck(String);\r\n this.appendValueInput(\"WID\")\r\n .appendField(Blockly.Msg.MIXLY_WIDTH)\r\n .setCheck(Number);\r\n this.appendValueInput(\"Symbol\")\r\n .appendField(Blockly.Msg.MIXLY_RECT_Fill)\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_CENTER_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const text_find = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .setCheck(String);\r\n this.appendValueInput(\"STR\")\r\n .appendField(Blockly.Msg.MIXLY_MID + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER)\r\n .setCheck(String);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_LIST_INDEX);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_FIND_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const text_join_seq = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_USE_STR)\r\n .setCheck(String);\r\n this.appendValueInput('LIST')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_SEQ)\r\n .setCheck('List', 'Tuple', 'Set', 'Dict');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_GET_STR);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const text_replace = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String);\r\n this.appendValueInput(\"STR1\")\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_REPLACE)\r\n .setCheck(String);\r\n this.appendValueInput(\"STR2\")\r\n .appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO)\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_REPLACE_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const text_split = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput(\"VAR\");\r\n this.appendValueInput(\"VAL\")\r\n .appendField(Blockly.Msg.LIST_SPLIT_AS);\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.LIST_SPLIT);\r\n this.setOutput(true, \"List\");\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_SPLIT_TOOLTIP);\r\n this.setInputsInline(true);\r\n }\r\n}\r\n\r\nexport const text_strip = {\r\n init: function () {\r\n var STRIP =\r\n [[Blockly.Msg.TEXT_TRIM_BOTH, 'strip'], [Blockly.Msg.TEXT_TRIM_LEFT, 'lstrip'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'rstrip']];\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.TEXT_STRIM);\r\n this.appendDummyInput('')\r\n .appendField(new Blockly.FieldDropdown(STRIP), 'TOWHAT');\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.TEXT_BLANK);\r\n this.setOutput(true, String);\r\n this.setInputsInline(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('TOWHAT');\r\n var TOOLTIPS = {\r\n 'strip': Blockly.Msg.TEXT_TRIM_BOTH_TOOLTIP,\r\n 'lstrip': Blockly.Msg.TEXT_TRIM_LEFT_TOOLTIP,\r\n 'rstrip': Blockly.Msg.TEXT_TRIM_RIGHT_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const text_format = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT)\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldTextInput('str'), 'VAR');\r\n this.itemCount_ = 1;\r\n this.updateShape_();\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setInputsInline(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['text_create_with_item'], this));\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_FORMAT_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('text_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('text_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField();\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.PROCEDURES_BEFORE_PARAMS);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n if (this.getFieldValue('VAR') != null) {\r\n if ((this.getFieldValue('VAR').indexOf(\"'\") == -1) && (this.getFieldValue('VAR').indexOf('\"') == -1)) {\r\n return [this.getFieldValue('VAR')];\r\n }\r\n return [];\r\n }\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n\r\n }\r\n};\r\n\r\nexport const text_create_with_container = {\r\n /**\r\n * Mutator block for list container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const text_create_with_item = {\r\n /**\r\n * Mutator bolck for adding items.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_SET_VARIABLES_NAME);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const text_substring3 = text_substring\r\nexport const text_compareTo = text_compare_to\r\nexport const text_char_at3 = text_char_at\r\n\r\nexport const text_format_noreturn = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT)\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n this.appendValueInput(\"VAR\")\r\n .setCheck(String);\r\n this.itemCount_ = 1;\r\n this.updateShape_();\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setInputsInline(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['text_create_with_item'], this));\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TEXT_FORMAT_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('text_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('text_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField();\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.PROCEDURES_BEFORE_PARAMS);\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\n\r\nexport const text_encode = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n var encode_decode =\r\n [[Blockly.Msg.MIXPY_TEXT_ENCODE, 'encode'], [Blockly.Msg.MIXPY_TEXT_DECODE, 'decode']];\r\n var code =\r\n [['ASCII', 'ASCII'], ['gb2312', 'gb2312'], ['gbk', 'gbk'], ['utf-8', 'utf-8'], ['utf-16', 'utf-16'], ['utf-32', 'utf-32']];\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown(code), 'CODE')\r\n .appendField(' ')\r\n this.appendValueInput(\"VAR\")\r\n .appendField(new Blockly.FieldDropdown(encode_decode), 'DIR')\r\n .appendField(Blockly.Msg.LANG_MATH_STRING);\r\n this.setOutput(true, String);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXPY_TEXT_ENCODE_DECODE_TOOLTIP);\r\n\r\n }\r\n};\r\n\r\n\r\nexport const text_eval = {\r\n init: function () {\r\n\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TEXT_EVAL);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TEXT_EVAL_RESULT);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TEXT_EVAL_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const os_system = {\r\n init: function () {\r\n this.setColour(TEXTS_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_OS_SYSTEM);\r\n this.setInputsInline(true);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_OS_SYSTEM_TOOLTIP);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst TUPLE_HUE = 195; //'#5ec73d'//195;\r\n\r\nexport const tuple_create_with = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput(\"\")\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array'], [Blockly.Msg.LANG_MATH_STRING, 'Array'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n .appendField(new Blockly.FieldTextInput('mytup'), 'VAR');\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['tuple_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('tuple_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('tuple_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.TUPLE_CREATE_EMPTY_TITLE);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.TUPLE_CREATE_WITH_INPUT_WITH);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const tuple_create_with_container = {\r\n /**\r\n * Mutator block for list container.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TUPLE_CREATE_WITH_CONTAINER_TITLE_ADD);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const tuple_create_with_item = {\r\n /**\r\n * Mutator bolck for adding items.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_SET_VARIABLES_NAME);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const tuple_create_with_text2 = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput(\"\")\r\n //don't need to specify the data type in Python\r\n // .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'Array']]), 'TYPE')\r\n // .appendField(' ')\r\n // .appendField(Blockly.Msg.blockpy_MIXLY_TUPLE_CREATE)\r\n .appendField(new Blockly.FieldTextInput('mytup'), 'VAR')\r\n //.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE')\r\n // .appendField(Blockly.Msg.MIXLY_MAKELISTFROM)\r\n // .appendField(this.newQuote_(true))\r\n .appendField(' = (')\r\n .appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')\r\n .appendField(')');\r\n // .appendField(this.newQuote_(false))\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n // newQuote_: function(open) {\r\n // if (open == this.RTL) {\r\n // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';\r\n // } else {\r\n // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';\r\n // }\r\n // return new Blockly.FieldImage(file, 12, 12, '\"');\r\n // }\r\n}\r\n\r\nexport const tuple_create_with_text_return = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField('(')\r\n .appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')\r\n .appendField(')');\r\n // .appendField(this.newQuote_(false))\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT);\r\n // },\r\n // getVars: function() {\r\n // return [this.getFieldValue('VAR')];\r\n // },\r\n // renameVar: function(oldName, newName) {\r\n // if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n // this.setTitleValue(newName, 'VAR');\r\n // }\r\n }\r\n // newQuote_: function(open) {\r\n // if (open == this.RTL) {\r\n // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';\r\n // } else {\r\n // var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';\r\n // }\r\n // return new Blockly.FieldImage(file, 12, 12, '\"');\r\n // }\r\n}\r\n\r\nexport const tuple_getIndex = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.setOutput(true);\r\n this.appendValueInput('TUP')\r\n .setCheck('Tuple')\r\n this.appendValueInput('AT')\r\n .setCheck(Number)\r\n\r\n .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_GET_INDEX_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const tuple_length = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('TUP');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_LENGTH);\r\n\r\n this.setTooltip(Blockly.Msg.TUPLE_LENGTH_TOOLTIP);\r\n this.setOutput(true, Number);\r\n }\r\n};\r\n\r\nexport const tuple_del = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('TUP')\r\n .setCheck('Tuple')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.TUPLE_DEL);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_DEL_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const tuple_join = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('TUP1')\r\n .setCheck('Tuple')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.TUPLE_JOIN)\r\n this.appendValueInput('TUP2')\r\n .setCheck('Tuple')\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_JOIN_TOOLTIP);\r\n this.setOutput(true, \"Tuple\");\r\n }\r\n};\r\n\r\n\r\nexport const tuple_max = {\r\n init: function () {\r\n this.appendValueInput('TUP')\r\n .setCheck('Tuple')\r\n var max_min =\r\n [[Blockly.Msg.blockpy_TUPLE_MAX, 'max'], [Blockly.Msg.blockpy_TUPLE_MIN, 'min'], [Blockly.Msg.MATH_ONLIST_OPERATOR_SUM, 'sum']];\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)\r\n .appendField(new Blockly.FieldDropdown(max_min), 'DIR')\r\n\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'max': Blockly.Msg.MIXLY_TOOLTIP_TUPLE_MAX,\r\n 'min': Blockly.Msg.MIXLY_TOOLTIP_TUPLE_MIN,\r\n 'sum': Blockly.Msg.MIXLY_TOOLTIP_TUPLE_SUM\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const tuple_change_to = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, 'list'],\r\n [Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, 'set']\r\n ];\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(\"Tuple\")\r\n // .appendField(Blockly.Msg.blockpy_USE_LIST);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.A_TO_B)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'list': Blockly.Msg.TUPLE_TO_LISTS,\r\n 'set': Blockly.Msg.TUPLE_TO_SET,\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const tuple_find = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_LIST_INDEX, 'INDEX'],\r\n [Blockly.Msg.MIXLY_LIST_COUNT, 'COUNT']\r\n ];\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck('List')\r\n this.appendValueInput('data')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(Blockly.Msg.HTML_VALUE)\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_DE)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n //.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'INDEX': Blockly.Msg.MIXLY_TOOLTIP_TUPLE_FIND_INDEX,\r\n 'COUNT': Blockly.Msg.MIXLY_TOOLTIP_TUPLE_FIND_COUNT\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const tuple_trig = {\r\n init: function () {\r\n var OPERATORS = [\r\n [Blockly.Msg.MIXLY_LIST_LEN, 'LEN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_SUM, 'SUM'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MAX, 'MAX'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MIN, 'MIN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE, 'AVERAGE'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN, 'MEDIAN'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_MODE, 'MODE'],\r\n [Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV, 'STD_DEV'],\r\n ];\r\n //this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);\r\n this.setColour(TUPLE_HUE);\r\n this.setOutput(true, Number);\r\n this.appendValueInput('data')\r\n .setCheck('List')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setInputsInline(true);\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('OP');\r\n var TOOLTIPS = {\r\n 'LEN': Blockly.Msg.TUPLE_LENGTH_TOOLTIP,\r\n 'SUM': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_SUM,\r\n 'MAX': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MAX,\r\n 'MIN': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MIN,\r\n 'AVERAGE': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_AVERAGE,\r\n 'MEDIAN': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MEDIAN,\r\n 'MODE': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_MODE,\r\n 'STD_DEV': Blockly.Msg.MATH_ONLIST_TOOLTIP_TUPLE_STD_DEV\r\n\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const tuple_getSublist = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this['WHERE_OPTIONS_1'] = [\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_START, 'FROM_START'],\r\n [Blockly.Msg.LISTS_GET_INDEX_FROM_END, 'FROM_END'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, 'FIRST']\r\n ];\r\n this['WHERE_OPTIONS_2'] = [\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, 'FROM_START'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, 'FROM_END'],\r\n [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, 'LAST']\r\n ];\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('LIST')\r\n .setCheck('List')\r\n //.appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL)\r\n // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) {\r\n // this.appendDummyInput('TAIL')\r\n // .appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL);\r\n // }\r\n this.appendDummyInput('')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);\r\n this.appendDummyInput('AT1');\r\n this.appendDummyInput('AT2');\r\n this.setInputsInline(true);\r\n this.setOutput(true, 'List');\r\n this.updateAt_(1, true);\r\n this.updateAt_(2, true);\r\n this.setTooltip(Blockly.Msg.PYTHON_TUPLE_GET_SUBLIST_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent whether there are 'AT' inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE;\r\n container.setAttribute('at1', isAt1);\r\n var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE;\r\n container.setAttribute('at2', isAt2);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the 'AT' inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n var isAt1 = (xmlElement.getAttribute('at1') == 'true');\r\n var isAt2 = (xmlElement.getAttribute('at2') == 'true');\r\n this.updateAt_(1, isAt1);\r\n this.updateAt_(2, isAt2);\r\n },\r\n /**\r\n * Create or delete an input for a numeric index.\r\n * This block has two such inputs, independant of each other.\r\n * @param {number} n Specify first or second input (1 or 2).\r\n * @param {boolean} isAt True if the input should exist.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateAt_: function (n, isAt) {\r\n // Create or delete an input for the numeric index.\r\n // Destroy old 'AT' and 'ORDINAL' inputs.\r\n this.removeInput('AT' + n);\r\n this.removeInput('ORDINAL' + n, true);\r\n // Create either a value 'AT' input or a dummy input.\r\n if (isAt) {\r\n this.appendValueInput('AT' + n).setCheck(Number);\r\n if (Blockly.Msg.TEXT_CHARAT_TAIL) {\r\n this.appendDummyInput('ORDINAL' + n)\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL);\r\n }\r\n } else {\r\n this.appendDummyInput('AT' + n);\r\n }\r\n var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n],\r\n function (value) {\r\n var newAt = (value == 'FROM_START') || (value == 'FROM_END');\r\n // The 'isAt' variable is available due to this function being a\r\n // closure.\r\n if (newAt != isAt) {\r\n var block = this.sourceBlock_;\r\n block.updateAt_(n, newAt);\r\n // This menu has been destroyed and replaced.\r\n // Update the replacement.\r\n block.setFieldValue(value, 'WHERE' + n);\r\n return null;\r\n }\r\n return undefined;\r\n });\r\n this.getInput('AT' + n)\r\n .appendField(menu, 'WHERE' + n);\r\n if (n == 1) {\r\n this.moveInputBefore('AT1', 'AT2');\r\n if (this.getInput('ORDINAL1')) {\r\n this.moveInputBefore('ORDINAL1', 'AT2');\r\n }\r\n }\r\n // if (Blockly.Msg.LISTS_GET_SUBLIST_TAIL) {\r\n // this.moveInputBefore('TAIL', null);\r\n // }\r\n }\r\n};\r\n\r\nexport const tuple_create_with_noreturn = {\r\n /**\r\n * Block for creating a list with any number of elements of any type.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.itemCount_ = 3;\r\n this.updateShape_();\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, \"Tuple\")\r\n this.setMutator(new Blockly.icons.MutatorIcon(['tuple_create_with_item'], this));\r\n this.setTooltip(Blockly.Msg.TUPLE_CREATE_WITH_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent list inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('tuple_create_with_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('tuple_create_with_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.TUPLE_CREATE_EMPTY_TITLE);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.TUPLE_CREATE_WITH_INPUT_WITH);\r\n }\r\n }\r\n }\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const tuple_get_sublist = {\r\n /**\r\n * Block for getting sublist.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL);\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('LIST')\r\n this.appendDummyInput('')\r\n this.appendValueInput('AT1')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_FROM_START);\r\n this.appendValueInput('AT2')\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL + \" \" + Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TEXT_CHARAT_TAIL);\r\n this.setInputsInline(true);\r\n this.setOutput(true, 'Tuple');\r\n this.setTooltip(Blockly.Msg.PYTHON_TUPLE_GET_SUBLIST_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const tuple_get_random_item = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput(\"TUP\");\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + \" \" + Blockly.Msg.LISTS_GET_INDEX_RANDOM)\r\n this.setTooltip(Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const tuple_totuple = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOTUPLE);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOTUPLE);\r\n }\r\n};\r\nfunction getCurrentTimeTuple() {\r\n var now = new Date();\r\n var year = now.getFullYear();\r\n var month = now.getMonth() + 1; // 月份从 0 开始,所以要加 1\r\n var day = now.getDate();\r\n var hour = now.getHours();\r\n var minute = now.getMinutes();\r\n var second = now.getSeconds();\r\n \r\n // 返回元组格式的时间字符串\r\n return year + \",\" + month + \",\" + day + \",\" + hour + \",\" + minute + \",\" + second ;\r\n}\r\nexport const tuple_input = {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField('(')\r\n .appendField(new Blockly.FieldTextInput(getCurrentTimeTuple()),\"CONTENT\")\r\n .appendField(')');\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\n\r\nexport const tuple_create_llm_params= {\r\n init: function () {\r\n this.setColour(TUPLE_HUE);\r\n this.appendValueInput(\"params\")\r\n .appendField('(')\r\n .appendField(Blockly.Msg.MIXLY_NAME_OF_PARAMS)\r\n this.appendDummyInput()\r\n .appendField(',')\r\n .appendField(Blockly.Msg.MIXLY_TYPE)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_TYPE_BOOLEAN,\"boolean\"],\r\n [Blockly.Msg.MIXLY_TYPE_STRING,\"string\"],\r\n [Blockly.Msg.MIXLY_TYPE_NUMBER,\"number\"],\r\n [Blockly.Msg.MIXLY_TYPE_INTEGER,\"integer\"],\r\n [Blockly.Msg.MIXLY_TYPE_NULL,\"null\"]\r\n ]),\"type\")\r\n this.appendValueInput(\"des\")\r\n .appendField(',')\r\n .appendField(Blockly.Msg.MIXLY_DESCRIPTION)\r\n this.appendDummyInput()\r\n .appendField(')');\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT);\r\n }\r\n};","/**\r\n * @license\r\n * Visual Blocks Editor\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Utility blocks for Blockly.\r\n * @author acbart@vt.edu (Austin Cory Bart)\r\n */\r\nimport * as Blockly from 'blockly/core';\r\n\r\nconst UTILITY_HUE = 160;\r\n\r\nexport const raw_table = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.appendDummyInput()\r\n .appendField('Tabular Abstraction:');\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTable(''), 'TEXT');\r\n }\r\n};\r\n\r\nexport const raw_block = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.appendDummyInput()\r\n .appendField('Code Block:');\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldMultilineInput(''), 'TEXT');\r\n }\r\n};\r\n\r\nexport const raw_expression = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendField('Code Expression:');\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldMultilineInput(''), 'TEXT');\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const raw_empty = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.appendValueInput('VALUE')\r\n .appendField('');\r\n this.setInputsInline(false);\r\n }\r\n};\r\n\r\nexport const text_comment = {\r\n // Text value.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendTitle('Comment:')\r\n .appendTitle(new Blockly.FieldTextInput(''), 'TEXT');\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip('This comment will be ignored by Python');\r\n }\r\n};\r\n\r\nexport const type_check = {\r\n // Set element at index.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendValueInput('VALUE')\r\n .appendField(Blockly.Msg.TYPE_CHECK);\r\n this.setInputsInline(false);\r\n this.setOutput(true, 'Type');\r\n //this.setPreviousStatement(true);\r\n //this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const text_print_multiple = {\r\n /**\r\n * Block for printing multiple things (including nothing)\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.itemCount_ = 1;\r\n this.updateShape_();\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['text_print_multiple_item'], this));\r\n this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);\r\n },\r\n /**\r\n * Create XML to represent print inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock = Blockly.Block.obtain(workspace,\r\n 'text_print_multiple_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var x = 0; x < this.itemCount_; x++) {\r\n var itemBlock = workspace.newBlock('text_print_multiple_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('PRINT' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n // Store a pointer to any connected child blocks.\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var x = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('PRINT' + x);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n x++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('PRINT' + i)) {\r\n this.removeInput('PRINT' + i);\r\n i++;\r\n }\r\n }\r\n\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(\"print\");\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('PRINT' + i);\r\n if (i == 0) {\r\n input.appendField(\"print\");\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const text_print_multiple_container = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendField('print');\r\n this.appendStatementInput('STACK');\r\n this.setTooltip('');\r\n this.contextMenu = false;\r\n }\r\n};\r\nexport const text_print_multiple_item = {\r\n // Add items.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendField('item');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip('');\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const function_call = {\r\n /**\r\n * Block for printing multiple things (including nothing)\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.itemCount_ = 1;\r\n this.hasReturn_ = false;\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput(\"str\"), 'NAME');\r\n this.updateShape_();\r\n this.setMutator(new Blockly.icons.MutatorIcon(['function_call_item'], this));\r\n this.setTooltip(\"Can be used to call any function\");\r\n },\r\n /**\r\n * Create XML to represent print inputs.\r\n * @return {Element} XML storage element.\r\n * @this Blockly.Block\r\n */\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n container.setAttribute('hasReturn', this.hasReturn_ ? \"TRUE\" : \"FALSE\");\r\n return container;\r\n },\r\n /**\r\n * Parse XML to restore the list inputs.\r\n * @param {!Element} xmlElement XML storage element.\r\n * @this Blockly.Block\r\n */\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.hasReturn_ = xmlElement.getAttribute('hasReturn') === \"TRUE\";\r\n this.updateShape_();\r\n },\r\n /**\r\n * Populate the mutator's dialog with this block's components.\r\n * @param {!Blockly.Workspace} workspace Mutator's workspace.\r\n * @return {!Blockly.Block} Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n decompose: function (workspace) {\r\n var containerBlock = Blockly.Block.obtain(workspace,\r\n 'function_call_container');\r\n containerBlock.initSvg();\r\n\r\n containerBlock.setFieldValue(this.hasStatements_ ? 'TRUE' : 'FALSE',\r\n 'RETURN');\r\n\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var x = 0; x < this.itemCount_; x++) {\r\n var itemBlock = workspace.newBlock('function_call_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n /**\r\n * Notification that the procedure's return state has changed.\r\n * @param {boolean} returnState New return state\r\n * @this Blockly.Block\r\n */\r\n setReturn: function (returnState) {\r\n this.unplug(true, true);\r\n this.setOutput(returnState);\r\n this.setPreviousStatement(!returnState);\r\n this.setNextStatement(!returnState);\r\n if (this.rendered) {\r\n this.render();\r\n }\r\n },\r\n /**\r\n * Reconfigure this block based on the mutator dialog's components.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n\r\n this.hasReturn_ = containerBlock.getFieldValue(\"RETURN\") === \"TRUE\";\r\n\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ARGUMENT' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n /**\r\n * Store pointers to any connected child blocks.\r\n * @param {!Blockly.Block} containerBlock Root block in mutator.\r\n * @this Blockly.Block\r\n */\r\n saveConnections: function (containerBlock) {\r\n // Store a pointer to any connected child blocks.\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var x = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ARGUMENT' + x);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n x++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n /**\r\n * Modify this block to have the correct number of inputs.\r\n * @private\r\n * @this Blockly.Block\r\n */\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ARGUMENT' + i)) {\r\n this.removeInput('ARGUMENT' + i);\r\n i++;\r\n }\r\n }\r\n\r\n // Rebuild block.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n this.appendValueInput('ARGUMENT' + i);\r\n }\r\n\r\n // Set whether returns anything\r\n this.setReturn(this.hasReturn_);\r\n }\r\n};\r\n\r\nexport const function_call_container = {\r\n // Container.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendField('Arguments');\r\n this.appendStatementInput('STACK');\r\n this.appendDummyInput()\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField('has return')\r\n .appendField(new Blockly.FieldCheckbox('TRUE'),\r\n 'RETURN');\r\n this.setTooltip('');\r\n this.contextMenu = false;\r\n }\r\n};\r\nexport const function_call_item = {\r\n // Add items.\r\n init: function () {\r\n this.setColour(UTILITY_HUE);\r\n this.appendDummyInput()\r\n .appendField('argument');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip('');\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const attribute_access = {\r\n init: function () {\r\n this.appendValueInput(\"MODULE\")\r\n .setCheck(null);\r\n this.appendValueInput(\"NAME\")\r\n .setCheck(null)\r\n .appendField(\".\");\r\n this.setInputsInline(true);\r\n this.setOutput(true, null);\r\n this.setColour(230);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n","import * as Blockly from 'blockly/core';\r\nimport Names from '../others/names';\r\n\r\nconst VARIABLES_HUE = 330//'#af5180'//330;\r\n\r\n// ************************************************************************\r\n// THIS SECTION IS INSERTED INTO BLOCKLY BY BLOCKLYDUINO.\r\n// export const variables_declare = {\r\n// // Variable setter.\r\n// init: function() {\r\n// this.setColour(VARIABLES_HUE);\r\n// this.appendValueInput('VALUE', null)\r\n// .appendField(Blockly.Msg.MIXLY_DECLARE)\r\n// .appendField(new Blockly.FieldTextInput(''), 'VAR')\r\n// //.appendField(Blockly.Msg.MIXLY_AS)\r\n// //.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_NUMBER, 'number'], [Blockly.Msg.LANG_MATH_STRING, 'string'], [Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean']]), 'TYPE')\r\n// \t .appendField(Blockly.Msg.MIXLY_VALUE);\r\n// this.setPreviousStatement(true);\r\n// this.setNextStatement(true);\r\n// this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_VARIABLES_DECLARE);\r\n// },\r\n// getVars: function() {\r\n// return [this.getFieldValue('VAR')];\r\n// },\r\n// renameVar: function(oldName, newName) {\r\n// if (Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n// this.setTitleValue(newName, 'VAR');\r\n// }\r\n// }\r\n// };\r\n// ************************************************************************\r\n\r\nexport const variables_get = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldTextInput(''), 'VAR')\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setFieldValue(newName, 'VAR');\r\n }\r\n }/*,\r\n onchange: function() {\r\n\t var varName = Blockly.Arduino.variableDB_.getName(this.getFieldValue('VAR'),Blockly.Variables.NAME_TYPE);\r\n\t if(Blockly.Arduino.definitions_['var_declare'+varName]){\r\n\t\t this.setWarningText(null);\r\n\t }else{\r\n\t\t this.setWarningText(Blockly.Msg.MIXLY_WARNING_NOT_DECLARE);\r\n\t }\r\n }*/\r\n};\r\n\r\n// export const variables_set = {\r\n// init: function() {\r\n// this.setColour(VARIABLES_HUE);\r\n// this.appendValueInput('VALUE')\r\n// .appendField(new Blockly.FieldTextInput(''), 'VAR')\r\n// \t\t.appendField(Blockly.Msg.MIXLY_VALUE2);\r\n// this.setPreviousStatement(true);\r\n// this.setNextStatement(true);\r\n// this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP);\r\n// },\r\n// getVars: function() {\r\n// return [this.getFieldValue('VAR')];\r\n// },\r\n// renameVar: function(oldName, newName) {\r\n// if (Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n// this.setFieldValue(newName, 'VAR');\r\n// }\r\n// }/*,\r\n// onchange: function() {\r\n// \t var varName = Blockly.Arduino.variableDB_.getName(this.getFieldValue('VAR'),Blockly.Variables.NAME_TYPE);\r\n// \t if(Blockly.Arduino.definitions_['var_declare'+varName]){\r\n// \t\t this.setWarningText(null);\r\n// \t }else{\r\n// \t\t this.setWarningText(Blockly.Msg.MIXLY_WARNING_NOT_DECLARE);\r\n// \t }\r\n// }*/\r\n// };\r\nexport const variables_set = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendValueInput('VALUE')\r\n .appendField(new Blockly.FieldTextInput(''), 'VAR')\r\n .appendField(Blockly.Msg.MIXLY_VALUE2);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP);\r\n },\r\n getVars: function () {\r\n var varValue = this.getFieldValue('VAR');\r\n if (varValue == null) {\r\n return [];\r\n }\r\n return varValue.split(\",\");\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setFieldValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n/**\r\n * Block for basic data type change.\r\n * @this Blockly.Block\r\n */\r\nexport const variables_change = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n var DATATYPES =\r\n [\r\n [Blockly.Msg.LANG_MATH_INT, \"int\"],\r\n [Blockly.Msg.LANG_MATH_FLOAT, \"float\"],\r\n [Blockly.Msg.LANG_MATH_BOOLEAN, \"bool\"],\r\n // [Blockly.Msg.MIXLY_MICROPYTHON_TYPE_COMPLEX, \"complex\"],\r\n [Blockly.Msg.LANG_MATH_STRING, \"str\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, \"list\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, \"tuple\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT, \"dict\"],\r\n [Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, \"set\"],\r\n [Blockly.Msg.LANG_MATH_BYTE, \"bytes\"]\r\n ];\r\n this.appendValueInput('MYVALUE')\r\n .appendField(new Blockly.FieldDropdown(DATATYPES), 'OP');\r\n // Assign 'this' to a variable for use in the tooltip closure below.\r\n this.setOutput(true);\r\n // this.setInputsInline(true);\r\n\r\n }\r\n};\r\n\r\n\r\nexport const variables_global = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_GLOBAL)\r\n .setCheck(\"var\");\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const controls_type = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendValueInput(\"DATA\")\r\n .appendField(Blockly.Msg.MICROBIT_PYTHON_TYPE);\r\n // this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MICROBIT_PYTHON_TYPE);\r\n }\r\n};\r\n\r\n\r\nexport const controls_typeLists = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_GET_TYPE)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.LANG_MATH_INT, \"int\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_FLOAT, \"float\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING, \"str\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, \"list\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, \"tuple\"],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT, \"dict\"],\r\n [Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, \"set\"],\r\n [Blockly.Msg.LANG_MATH_BYTE, \"bytes\"],\r\n // [Blockly.Msg.MIXLY_MICROBIT_IMAGE,\"image\"],\r\n [Blockly.Msg.LOGIC_NULL, \"type(None)\"]]), \"type\");\r\n //整数、浮点数、字符串、列表、元组、字典、集合、图像不太对, unfinished\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('type');\r\n var mode0 = Blockly.Msg.MICROBIT_controls_TypeLists;\r\n var TOOLTIPS = {\r\n 'int': Blockly.Msg.LANG_MATH_INT,\r\n 'float': Blockly.Msg.MIXLY_MICROBIT_TYPE_FLOAT,\r\n 'str': Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING,\r\n 'list': Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST,\r\n 'tuple': Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE,\r\n 'dict': Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT,\r\n 'set': Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD,\r\n 'image': Blockly.Msg.MIXLY_MICROBIT_IMAGE,\r\n 'bytes': Blockly.Msg.LANG_MATH_BYTE,\r\n 'NoneType': Blockly.Msg.LOGIC_NULL\r\n };\r\n return mode0 + TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const lists_zip = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n\r\n this.itemCount_ = 2;\r\n this.updateShape_();\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setOutput(true, \"List\")\r\n this.setMutator(new Blockly.icons.MutatorIcon(['lists_zip_item'], this));\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP_TOOLTIP);\r\n },\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('lists_zip_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('lists_zip_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i).connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP);\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const lists_zip_container = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const lists_zip_item = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const unpack_iterable_object = {\r\n init: function () {\r\n this.setColour(VARIABLES_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_VARIABLE_UNPACK)\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_PYTHON_LISTS_ZIP_ITEM, '*'],\r\n [Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT, '**']\r\n ]), 'TYPE');\r\n this.setTooltip('');\r\n this.setOutput(true);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\nimport { Boards } from 'mixly';\r\n\r\nexport const controls_main = function (a, generator) {\r\n var d = generator.statementToCode(a, \"DO\"),\r\n d = generator.addLoopTrap(d, a.id) || generator.PASS;\r\n return \"if __name__ == '__main__':\\n\" + d;\r\n}\r\n\r\nexport const base_setup = function (_, generator) {\r\n var branch = generator.statementToCode(this, 'DO');\r\n branch = branch.replace(/(^\\s*)|(\\s*$)/g, \"\").replace(/\\n {4}/g, '\\n');//去除两端空格\r\n if (branch.endsWith('\\n')) {\r\n generator.setups_['setup_setup'] = branch;\r\n }\r\n else {\r\n generator.setups_['setup_setup'] = branch + '\\n';\r\n }\r\n return '';\r\n}\r\n\r\n// ok\r\nexport const controls_if = function (a, generator) {\r\n var b = 0,\r\n c = \"\",\r\n d,\r\n e;\r\n do\r\n e = generator.valueToCode(a, \"IF\" + b, generator.ORDER_NONE) || \"False\", d = generator.statementToCode(a, \"DO\" + b) || generator.PASS, c += (0 == b ? \"if \" : \"elif \") + e + \":\\n\" + d, ++b;\r\n while (a.getInput(\"IF\" + b));\r\n a.getInput(\"ELSE\") && (d = generator.statementToCode(a, \"ELSE\") || generator.PASS, c += \"else:\\n\" + d);\r\n return c\r\n}\r\n\r\nexport const controls_try_finally = function (_, generator) {\r\n var n = 1;\r\n var argument = generator.valueToCode(this, 'IF' + n,\r\n generator.ORDER_NONE) || 'null';\r\n var branch = '';\r\n var t = generator.statementToCode(this, 'try') || ' pass\\n';\r\n var code = 'try:\\n' + t;\r\n for (n = 1; n <= this.elseifCount_; n++) {\r\n argument = generator.valueToCode(this, 'IF' + n,\r\n generator.ORDER_NONE) || '';\r\n if (argument !== '')\r\n argument = ' ' + argument\r\n branch = generator.statementToCode(this, 'DO' + n) || ' pass\\n';\r\n code += 'except' + argument + ': \\n' + branch;\r\n }\r\n if (this.elseCount_) {\r\n branch = generator.statementToCode(this, 'ELSE') || ' pass\\n';\r\n code += 'finally:\\n' + branch;\r\n }\r\n // code += '}';\r\n return code;\r\n}\r\n\r\n// ok\r\nexport const controls_for = function (a, generator) {\r\n var b = generator.variableDB_.getName(a.getFieldValue(\"VAR\"), Blockly.Variables.NAME_TYPE),\r\n //var b = generator.valueToCode(a, \"VAR\", generator.ORDER_MEMBER) || \"''\",\r\n c = generator.valueToCode(a, \"FROM\", generator.ORDER_NONE) || \"0\",\r\n d = generator.valueToCode(a, \"TO\", generator.ORDER_NONE) || \"0\",\r\n e = generator.valueToCode(a, \"STEP\", generator.ORDER_NONE) || \"1\",\r\n f = generator.statementToCode(a, \"DO\"),\r\n f = generator.addLoopTrap(f, a.id) || generator.PASS,\r\n g = \"\",\r\n h = function (_, generator) {\r\n return generator.provideFunction_(\"upRange\",\r\n [\"def \" + generator.FUNCTION_NAME_PLACEHOLDER_ + \"(start, stop, step):\", \" while start <= stop:\", \" yield start\", \" start += abs(step)\"])\r\n },\r\n k = function (_, generator) {\r\n return generator.provideFunction_(\"downRange\", [\"def \" + generator.FUNCTION_NAME_PLACEHOLDER_ + \"(start, stop, step):\", \" while start >= stop:\", \" yield start\", \" start -= abs(step)\"])\r\n }\r\n a = function (a, b, c) {\r\n return \"(\" + a + \" <= \" + b + \") and \" + h() + \"(\" + a + \", \" + b + \", \" + c + \") or \" + k() + \"(\" + a + \", \" + b + \", \" + c + \")\"\r\n }\r\n if (Blockly.isNumber(c) && Blockly.isNumber(d) &&\r\n Blockly.isNumber(e))\r\n c = parseFloat(c), d = parseFloat(d), e = Math.abs(parseFloat(e)), 0 === c % 1 && 0 === d % 1 && 0 === e % 1 ? (c <= d ? (d++, a = 0 == c && 1 == e ? d : c + \", \" + d, 1 != e && (a += \", \" + e)) : (d--, a = c + \", \" + d + \", -\" + e), a = \"range(\" + a + \")\") : (a = c < d ? h() : k(), a += \"(\" + c + \", \" + d + \", \" + e + \")\");\r\n else {\r\n var l = function (a, c) {\r\n if (Blockly.isNumber(a))\r\n a = parseFloat(a);\r\n else {\r\n var d = generator.variableDB_.getDistinctName(b + c, Blockly.Variables.NAME_TYPE);\r\n g += d + \" = \" + a + \"\\n\";\r\n a = d\r\n }\r\n return a\r\n },\r\n c = l(c, \"_start\"),\r\n d = l(d, \"_end\");\r\n l(e, \"_inc\");\r\n a = \"number\" == typeof c && \"number\" == typeof d ? c < d ? h(c, d, e) : k(c, d, e) : a(c, d, e)\r\n }\r\n return g += \"for \" + b + \" in \" + a + \":\\n\" + f\r\n}\r\n\r\nexport const controls_for_range = function (block, generator) {\r\n var iter = generator.variableDB_.getName(block.getFieldValue(\"VAR\"), Blockly.Variables.NAME_TYPE),\r\n from = generator.valueToCode(block, \"FROM\", generator.ORDER_NONE) || \"0\",\r\n end = generator.valueToCode(block, \"TO\", generator.ORDER_NONE) || \"0\",\r\n step = generator.valueToCode(block, \"STEP\", generator.ORDER_NONE) || \"1\",\r\n dostatement = generator.statementToCode(block, \"DO\"),\r\n pass = generator.addLoopTrap(dostatement, block.id) || generator.PASS;\r\n generator.setups_[\"mixly_range\"] = \"def mixly_range(start, stop, step):\\n\" +\r\n \" for i in range(start, stop + 1, step):\\n\" +\r\n \" yield i\\n\\n\";\r\n return \"for \" + iter + \" in mixly_range(\" + from + \", \" + end + \", \" + step + \"):\\n\" + pass;\r\n}\r\n\r\nexport const controls_whileUntil = function (a, generator) {\r\n var b = \"UNTIL\" == a.getFieldValue(\"MODE\"),\r\n c = generator.valueToCode(a, \"BOOL\", generator.ORDER_NONE) || \"False\",\r\n d = generator.statementToCode(a, \"DO\"),\r\n d = generator.addLoopTrap(d, a.id) || generator.PASS;\r\n b && (c = \"not \" + c);\r\n return \"while \" + c + \":\\n\" + d\r\n}\r\n\r\n// export const controls_flow_statements = function (_, generator) {\r\n// // Flow statements: continue, break.\r\n// switch (this.getFieldValue('FLOW')) {\r\n// case 'BREAK':\r\n// return 'break;\\n';\r\n// case 'CONTINUE':\r\n// return 'continue;\\n';\r\n// }\r\n// throw 'Unknown flow statement.';\r\n// }\r\n\r\n//ok\r\nexport const controls_flow_statements = function (a) {\r\n switch (a.getFieldValue(\"FLOW\")) {\r\n case \"BREAK\":\r\n return \"break\\n\";\r\n case \"CONTINUE\":\r\n return \"continue\\n\"\r\n }\r\n throw \"Unknown flow statement.\";\r\n}\r\n\r\n// ok\r\nexport const controls_delay = function (_, generator) {\r\n var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'\r\n var code = 'sleep(' + delay_time + ')\\n';\r\n return code;\r\n}\r\n\r\n// ok\r\nexport const Panic_with_status_code = function (_, generator) {\r\n var status_code = generator.valueToCode(this, 'STATUS_CODE', generator.ORDER_ATOMIC) || '1000'\r\n var code = 'panic(' + status_code + ')\\n';\r\n return code;\r\n}\r\n\r\n// ok\r\nexport const controls_millis = function (_, generator) {\r\n generator.definitions_.import_time = \"import time\";\r\n var code = 'time.time()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\n// ok\r\nexport const reset = function (_, generator) {\r\n generator.definitions_['import_microbit'] = 'from microbit import *'\r\n return 'reset()\\n';\r\n}\r\nexport const controls_interrupts = function () {\r\n return 'interrupts();\\n';\r\n}\r\n\r\nexport const controls_nointerrupts = function () {\r\n return 'noInterrupts();\\n';\r\n}\r\n\r\n\r\nexport const controls_forEach = function (block, generator) {\r\n // For each loop.\r\n var variable0 = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var argument0 = generator.valueToCode(block, 'LIST',\r\n generator.ORDER_RELATIONAL) || '[]';\r\n var branch = generator.statementToCode(block, 'DO');\r\n branch = generator.addLoopTrap(branch, block.id) ||\r\n generator.PASS;\r\n var code = 'for ' + variable0 + ' in ' + argument0 + ':\\n' + branch;\r\n return code;\r\n}\r\n\r\nexport const controls_range = function (_, generator) {\r\n var from = generator.valueToCode(this, \"FROM\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"TO\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"STEP\", generator.ORDER_NONE) || \"1\";\r\n var code = \"range(\" + from + \", \" + end + \", \" + step + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const controls_lambda = function (a, generator) {\r\n var c = generator.valueToCode(a, \"BOOL\", generator.ORDER_NONE) || \"None\",\r\n d = generator.statementToCode(a, \"DO\") || \"pass\";\r\n var code = \"lambda \" + c + \": \" + d;\r\n code = code.replace('\\n', '').replace(' ', '')\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const time_sleep = function (_, generator) {\r\n generator.definitions_['import_time'] = 'import time';\r\n var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'\r\n var code = 'time.sleep(' + delay_time + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const controls_pass = function () {\r\n return 'pass\\n';\r\n}\r\n\r\nexport const controls_thread = function (_, generator) {\r\n generator.definitions_['import__thread'] = 'import _thread';\r\n var v = generator.valueToCode(this, \"VAR\", generator.ORDER_NONE) || \"None\";\r\n var callback = generator.variableDB_.getName(\r\n generator.valueToCode(this, \"callback\", generator.ORDER_NONE) || \"None\",\r\n Blockly.Procedures.NAME_TYPE\r\n );\r\n var code = \"_thread.start_new_thread(\" + callback + \", \" + v + \")\\n\";\r\n return code;\r\n}\r\n\r\n// do-while循环\r\nexport const do_while = function (_, generator) {\r\n var value_select_data = generator.valueToCode(this, 'select_data', generator.ORDER_NONE) || \"False\";\r\n var statements_input_data = generator.statementToCode(this, 'input_data')\r\n var dropdown_type = this.getFieldValue('type');\r\n if (dropdown_type == 'true') {\r\n statements_input_data = statements_input_data + ' if (' + value_select_data + '):\\n' + ' break\\n';\r\n }\r\n else {\r\n statements_input_data = statements_input_data + ' if not (' + value_select_data + '):\\n' + ' break\\n';\r\n }\r\n statements_input_data = generator.addLoopTrap(statements_input_data, this.id) || generator.PASS;\r\n //var dropdown_type = this.getFieldValue('type');\r\n var code = 'while True:\\n' + statements_input_data;\r\n return code;\r\n}\r\n\r\n// export const base_type = controls_type;\r\n// export const controls_TypeLists = controls_typeLists;\r\n\r\nexport const controls_repeat_ext = function (a, generator) {\r\n var times = generator.valueToCode(this, 'TIMES', generator.ORDER_ATOMIC);\r\n var d = generator.statementToCode(a, \"DO\"),\r\n d = generator.addLoopTrap(d, a.id) || generator.PASS;\r\n return 'for _my_variable in range(' + times + '):\\n' + d;\r\n}\r\n\r\n\r\nexport const garbage_collection = function (_, generator) {\r\n generator.definitions_['import_gc'] = 'import gc';\r\n var code = 'gc.collect()\\n'\r\n return code;\r\n}\r\n\r\nexport const get_mem_alloc = function (_, generator) {\r\n generator.definitions_['import_gc'] = 'import gc';\r\n var code = 'gc.mem_alloc()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const get_mem_free = function (_, generator) {\r\n generator.definitions_['import_gc'] = 'import gc';\r\n var code = 'gc.mem_free()';\r\n return [code, generator.ORDER_ATOMIC]\r\n}\r\n\r\nexport const get_unique_identifier = function (_, generator) {\r\n generator.definitions_['import_machine'] = 'import machine';\r\n var code = 'machine.unique_id()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\n// ok\r\nexport const controls_repeat = controls_repeat_ext;\r\n\r\nexport const datetime_fromtimestamp = function(_,generator){\r\n generator.definitions_['import_datetime'] = 'import datetime';\r\n var ts = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = 'datetime.datetime.fromtimestamp(' + ts + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const gene_unique_identifier = function (_, generator) {\r\n var version = Boards.getSelectedBoardKey().split(':')[2]\r\n generator.definitions_['import_' + version + 'uuid'] = 'from ' + version + ' import uuid';\r\n var code = 'uuid()';\r\n return [code, generator.ORDER_ATOMIC]\r\n}","/**\r\n * @license\r\n * Visual Blocks Language\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Generating Python for dictionary blocks.\r\n * @author acbart@vt.edu (Austin Cory Bart)\r\n */\r\nimport * as Blockly from 'blockly/core';\r\nimport { Boards } from 'mixly';\r\n\r\nexport const dicts_create_with = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n //var dropdown_type = this.getFieldValue('TYPE');\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n var keyName = this.getFieldValue('KEY' + n);\r\n code[n] = keyName + \":\" + (generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value);\r\n }\r\n var code = varName + '= ' + '{' + code.join(', ') + '}\\n';\r\n //var code =''+varName+'['+size+\"]\"+'='+ '{' + code.join(', ') + '}\\n';\r\n //generator.setups_['setup_lists'+varName] = code;\r\n return code;\r\n}\r\n\r\nexport const dicts_keys = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.keys()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_get = function (_, generator) {\r\n var version = Boards.getSelectedBoardKey().split(':')[2]\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n if (version=='educore'){\r\n var code = varName+'.get('+text+')';\r\n }else{\r\n var code = varName + \"[\" + text + \"]\";\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_get_default = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n // var text=this.getFieldValue('KEY');\r\n var code = varName + \".get(\" + text + ',' + argument + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_add_or_change = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict';\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \"[\" + text + \"] = \" + argument + '\\n';\r\n return code;\r\n}\r\n\r\nexport const dicts_delete = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict';\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n var code = \"del \" + varName + \"[\" + text + \"]\\n\";\r\n return code;\r\n}\r\n\r\nexport const dicts_update = function (_, generator) {\r\n var varName2 = generator.valueToCode(this, 'DICT2', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.update(' + varName2 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const dicts_clear = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.clear()\\n';\r\n return code;\r\n}\r\n\r\nexport const dicts_items = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.items()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_values = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.values()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_length = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'len(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_deldict = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'del ' + varName + '\\n';\r\n return code;\r\n}\r\n\r\nexport const dicts_add_change_del = function (block, generator) {\r\n var dict = generator.valueToCode(block, 'DICT',\r\n generator.ORDER_MEMBER) || '[]';\r\n var mode = block.getFieldValue('WHERE');\r\n var KEY = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n\r\n switch (mode) {\r\n case 'INSERT':\r\n //var at2 = block.getFieldValue('AT2');\r\n var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = dict + \"[\" + KEY + \"] = \" + at2 + '\\n'\r\n break;\r\n case 'DELETE':\r\n var code = 'del ' + dict + \"[\" + KEY + \"]\\n\"\r\n break;\r\n default:\r\n throw 'Unhandled option (lists_setIndex2)';\r\n }\r\n return code;\r\n}\r\n\r\nexport const dicts_pop = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n var code = varName + \".pop(\" + text + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_setdefault = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || 'mydict';\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n // var text=this.getFieldValue('KEY');\r\n var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".setdefault\" + \"(\" + text + \",\" + argument + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const dicts_create_with_noreturn = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n // var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n // Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n var keyName = this.getFieldValue('KEY' + n);\r\n code[n] = keyName + \": \" + (generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value);\r\n }\r\n // if (this.itemCount_!=1){\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\\n';}\r\n // else {\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\\n';}\r\n var code = '{' + code.join(', ') + '}';\r\n\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_todict = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['dict(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_to_json = function (_, generator) {\r\n generator.definitions_['import_json'] = 'import json';\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'json.dumps(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const json_to_dicts = function (_, generator) {\r\n generator.definitions_['import_json'] = 'import json';\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || 'null';\r\n var code = 'json.loads(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_to_to = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var R = generator.valueToCode(this, 'VAR1', generator.ORDER_ASSIGNMENT) || 'null';\r\n var I = generator.valueToCode(this, 'VAR2', generator.ORDER_ASSIGNMENT) || 'null';\r\n var L = generator.valueToCode(this, 'VAR3', generator.ORDER_ASSIGNMENT) || 'null';\r\n var N = generator.valueToCode(this, 'VAR4', generator.ORDER_ASSIGNMENT) || 'null';\r\n var code = varName + '['+R+']'+'['+I+']'+'['+L+']'+'['+N+']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dicts_to_json2 = function (_, generator) {\r\n generator.definitions_['import_json'] = 'import json';\r\n generator.definitions_['import_ujson'] = 'import ujson';\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'ujson.loads(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}","export const html_document = function (_, generator) {\r\n var head = generator.statementToCode(this, 'HEAD');\r\n var body = generator.statementToCode(this, 'BODY');\r\n var code = \"'''\\n\\n\\n\" + '\\t\\n' + head + \"\\n\\n\" + body + \"\\n\\n'''\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const html_title = function (_, generator) {\r\n var t = generator.statementToCode(this, 'DO');\r\n var l = this.getFieldValue('LEVEL');\r\n var code = \"\\n\" + t + \"\\n\";\r\n return code;\r\n}\r\n\r\nexport const html_head_body = function (_, generator) {\r\n var t = generator.statementToCode(this, 'DO');\r\n var l = this.getFieldValue('LEVEL');\r\n if (l == 'head') {\r\n var code = \"<\" + l + '>\\n\\t\\n' + t + \"\\n\";\r\n }\r\n else {\r\n var code = \"<\" + l + \">\\n\" + t + \"\\n\";\r\n }\r\n return code;\r\n}\r\n\r\nexport const html_content = function (_, generator) {\r\n var t = generator.statementToCode(this, 'DO');\r\n // var s = generator.valueToCode(this, 'style');\r\n var l = this.getFieldValue('LEVEL');\r\n // var code = \"<\" + l + \" \" + s + \" >\\n\" + t + \"\\n\";\r\n var code = \"<\" + l + \">\\n\" + t + \"\\n\";\r\n return code;\r\n}\r\n\r\nexport const html_content_more = function (_, generator) {\r\n var t = generator.statementToCode(this, 'DO');\r\n var s = generator.valueToCode(this, 'style');\r\n var l = this.getFieldValue('LEVEL');\r\n var code = \"<\" + l + \" \" + s + \" >\\n\" + t + \"\\n\";\r\n return code;\r\n}\r\n\r\nexport const html_style = function (_, generator) {\r\n var style = generator.statementToCode(this, 'STYLE');\r\n var code = 'style=\"' + style + '\"';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const html_form = function (_, generator) {\r\n var tag = this.getFieldValue('LEVEL');\r\n var name = this.getFieldValue('NAME');\r\n var value = this.getFieldValue('VALUE');\r\n var s = generator.valueToCode(this, 'style') || \"\";\r\n var code = '';\r\n return code;\r\n}\r\n\r\nexport const html_style_content = function () {\r\n var key = this.getFieldValue('KEY');\r\n var value = this.getFieldValue('VALUE');\r\n var code = key + ':' + value + \";\";\r\n return code;\r\n}\r\n\r\nexport const html_text = function () {\r\n var text = this.getFieldValue('TEXT');\r\n var code = text + \"\\n\";\r\n return code;\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const lists_get_sublist = function (_, generator) {\r\n // Get sublist.\r\n var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ADDITIVE);\r\n var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ADDITIVE);\r\n var code = list + '[' + at1 + ' : ' + at2 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_2d_get_data_with_col_row = function (_, generator) {\r\n var value_LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC) || 'mylist';\r\n var value_row = generator.valueToCode(this, 'row', generator.ORDER_ATOMIC) || 0;\r\n var value_col = generator.valueToCode(this, 'col', generator.ORDER_ATOMIC) || 0;\r\n var code = value_LIST + '[' + value_row + ',' + value_col + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_2d_get_col_row_data = function (_, generator) {\r\n var value_LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC) || 'mylist';\r\n var value_row_start = generator.valueToCode(this, 'row_start', generator.ORDER_ATOMIC) || 0;\r\n var value_row_end = generator.valueToCode(this, 'row_end', generator.ORDER_ATOMIC) || 1;\r\n var value_col_start = generator.valueToCode(this, 'col_start', generator.ORDER_ATOMIC) || 0;\r\n var value_col_end = generator.valueToCode(this, 'col_end', generator.ORDER_ATOMIC) || 1;\r\n var code = value_LIST + '[' + value_row_start + ' : ' + value_row_end + ',' + value_col_start + ' : ' + value_col_end + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_create_with = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n //generator.setups_['var_declare'+varName] = varName+' = '+ '[' + code.join(', ') + ']\\n';\r\n var code = varName + ' = ' + '[' + code.join(', ') + ']\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_create_with_text = function (_, generator) {\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var text = this.getFieldValue('TEXT');\r\n // generator.setups_['var_declare'+varName] = varName+' = '+ '[' + text + ']\\n';\r\n var code = varName + ' = ' + '[' + text + ']\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_get_index = function (_, generator) {\r\n // Indexing into a list is the same as indexing into a string.\r\n var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var argument0 = generator.valueToCode(this, 'AT', generator.ORDER_ADDITIVE) || 0;\r\n var code = list + '[' + argument0 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_set_index = function (_, generator) {\r\n // Set element at index.\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var argument0 = generator.valueToCode(this, 'AT',\r\n generator.ORDER_ADDITIVE) || '0';\r\n var argument2 = generator.valueToCode(this, 'TO',\r\n generator.ORDER_ASSIGNMENT) || '0';\r\n // Blockly uses one-based indicies.\r\n return varName + '[' + argument0 + '] = ' + argument2 + '\\n';\r\n}\r\n\r\nexport const lists_append_extend = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'DATA', generator.ORDER_ASSIGNMENT) || '0';\r\n var op = this.getFieldValue('OP');\r\n var code = varName + '.' + op + '(' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_get_random_item = function (_, generator) {\r\n generator.definitions_['import_random'] = 'import random';\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var code = 'random.choice(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_get_random_sublist = function (_, generator) {\r\n generator.definitions_['import_random'] = 'import random';\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var VALUE = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'random.sample(' + varName + ',' + VALUE + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_insert_value = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0';\r\n var at = generator.valueToCode(this, 'AT', generator.ORDER_ADDITIVE) || '0';\r\n var VALUE = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.insert(' + at + ', ' + VALUE + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_reverse = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.reverse()\\n';\r\n return code;\r\n}\r\nexport const lists_clear = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.clear()\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_find = function (_, generator) {\r\n var op = this.getFieldValue('OP');\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n if (op == 'INDEX')\r\n var code = varName + '.index(' + argument + ')';\r\n else if (op == 'COUNT')\r\n var code = varName + '.count(' + argument + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_remove_at = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'DATA', generator.ORDER_ASSIGNMENT) || '0';\r\n var op = this.getFieldValue('OP');\r\n var code = \"\";\r\n if (op == \"del\") {\r\n code = 'del ' + varName + '[' + argument + ']\\n';\r\n } else {\r\n code = varName + '.remove' + '(' + argument + ')\\n';\r\n }\r\n return code;\r\n}\r\n\r\nexport const lists_pop = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var argument = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.pop(' + argument + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const list_trig = function (a, generator) {\r\n var b = a.getFieldValue(\"OP\"), c;\r\n generator.definitions_['import_math'] = \"import math\";\r\n a = generator.valueToCode(a, 'data', generator.ORDER_NONE)\r\n switch (b) {\r\n case \"LEN\":\r\n c = \"len(\" + a + \")\";\r\n break;\r\n case \"SUM\":\r\n c = \"sum(\" + a + \")\";\r\n break;\r\n case \"MIN\":\r\n c = \"min(\" + a + \")\";\r\n break;\r\n case \"MAX\":\r\n c = \"max(\" + a + \")\";\r\n break;\r\n case 'AVERAGE':\r\n generator.definitions_['import_mixpy_math_mean'] = \"from mixpy import math_mean\";\r\n c = 'math_mean(' + a + ')';\r\n break;\r\n case 'MEDIAN':\r\n generator.definitions_['import_mixpy_math_median'] = \"from mixpy import math_median\";\r\n c = 'math_median(' + a + ')';\r\n break;\r\n case 'MODE':\r\n generator.definitions_['import_mixpy_math_modes'] = \"from mixpy import math_modes\";\r\n c = 'math_modes(' + a + ')';\r\n break;\r\n case 'STD_DEV':\r\n generator.definitions_['import_mixpy_math_standard_deviation'] = \"from mixpy import math_standard_deviation\";\r\n c = 'math_standard_deviation(' + a + ')';\r\n break;\r\n default:\r\n throw 'Unknown operator: ' + b;\r\n }\r\n if (c)\r\n return [c, generator.ORDER_ATOMIC];\r\n\r\n}\r\n\r\nexport const lists_sort = function (block, generator) {\r\n // Block for sorting a list.\r\n generator.definitions_['import_mixpy_lists_sort'] = \"from mixpy import lists_sort\";\r\n var list = (generator.valueToCode(block, 'LIST',\r\n generator.ORDER_NONE) || '[]');\r\n var type = block.getFieldValue('TYPE');\r\n var reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True';\r\n var code = 'lists_sort(' + list + ', \"' + type + '\", ' + reverse + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_change_to = function (_, generator) {\r\n var op = this.getFieldValue('OP');\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = '';\r\n if (op == 'array') {\r\n generator.definitions_['import_numpy'] = 'import numpy';\r\n code = 'numpy.array(' + varName + ')';\r\n }\r\n else {\r\n code = op + '(' + varName + ')';\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const list_many_input = function (_, generator) {\r\n var text = this.getFieldValue('CONTENT');\r\n var code = '[' + text + ']'\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_create_with_noreturn = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n var code = '[' + code.join(', ') + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_change_to_general = lists_change_to;\r\n\r\nexport const lists_del_general = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'del ' + varName + '\\n';\r\n return code;\r\n}\r\n\r\nexport const lists_create_with2 = lists_create_with\r\nexport const lists_create_with_text2 = lists_create_with_text\r\nexport const lists_getIndex3 = lists_get_index\r\nexport const lists_getSublist3 = lists_get_sublist\r\nexport const lists_setIndex3 = lists_set_index\r\nexport const lists_insert_value2 = lists_insert_value\r\nexport const lists_remove_at2 = lists_remove_at\r\n\r\nexport const list_tolist = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['list(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const list_tolist2 = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return [str + '.tolist()', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const enumerate = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var argument = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'enumerate(' +varName+',start='+ argument + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const content_in_lists = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || 'mylist';\r\n var con = generator.valueToCode(this, 'CON', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = con +' in '+varName;\r\n return [code, generator.ORDER_ATOMIC];\r\n}","export const logic_compare = function (_, generator) {\r\n // Comparison operator.\r\n var mode = this.getFieldValue('OP');\r\n var operator = logic_compare.OPERATORS[mode];\r\n var order = (operator == '==' || operator == '!=') ?\r\n generator.ORDER_EQUALITY : generator.ORDER_RELATIONAL;\r\n var argument0 = generator.valueToCode(this, 'A', order) || '0';\r\n var argument1 = generator.valueToCode(this, 'B', order) || '0';\r\n var code = argument0 + ' ' + operator + ' ' + argument1;\r\n return [code, order];\r\n}\r\n\r\nexport const logic_compare_continous = function (_, generator) {\r\n // Comparison operator.\r\n var mode1 = this.getFieldValue('OP1');\r\n var operator1 = logic_compare.OPERATORS[mode1];\r\n var mode2 = this.getFieldValue('OP2');\r\n var operator2 = logic_compare.OPERATORS[mode2];\r\n var argument0 = generator.valueToCode(this, 'A', generator.ORDER_RELATIONAL) || '0';\r\n var argument1 = generator.valueToCode(this, 'B', generator.ORDER_RELATIONAL) || '0';\r\n var argument2 = generator.valueToCode(this, 'C', generator.ORDER_RELATIONAL) || '0';\r\n var code = argument0 + ' ' + operator1 + ' ' + argument1 + ' ' + operator2 + ' ' + argument2;\r\n return [code, generator.ORDER_RELATIONAL];\r\n}\r\n\r\nlogic_compare.OPERATORS = {\r\n EQ: '==',\r\n NEQ: '!=',\r\n LT: '<',\r\n LTE: '<=',\r\n GT: '>',\r\n GTE: '>='\r\n};\r\n\r\nexport const logic_operation = function (_, generator) {\r\n // Operations 'and', 'or'.\r\n var operator = this.getFieldValue('OP');\r\n var order = (operator == '&&') ? generator.ORDER_LOGICAL_AND :\r\n generator.ORDER_LOGICAL_OR;\r\n var argument0 = generator.valueToCode(this, 'A', order) || 'False';\r\n var argument1 = generator.valueToCode(this, 'B', order) || 'False';\r\n if (operator == 'AND') {\r\n var code = argument0 + ' and ' + argument1;\r\n } else if (operator == 'OR') {\r\n var code = argument0 + ' or ' + argument1;\r\n } else if (operator == 'NOR') {\r\n // var code = '('+argument0+' and '+argument1+' ) or ((not '+argument0+') and (not '+argument1+'))';\r\n var code = 'not(' + argument0 + '^' + argument1 + ')';\r\n } else {\r\n // var code = '((not '+argument0+') and '+argument1+' ) or ( '+argument0+' and (not '+argument1+'))';\r\n var code = argument0 + '^' + argument1;\r\n }\r\n return [code, order];\r\n}\r\n\r\nexport const logic_negate = function (_, generator) {\r\n // Negation.\r\n var order = generator.ORDER_UNARY_PREFIX;\r\n var argument0 = generator.valueToCode(this, 'BOOL', order) || 'False';\r\n var code = 'not ' + argument0;\r\n return [code, order];\r\n}\r\n\r\nexport const logic_boolean = function (_, generator) {\r\n // Boolean values true and false.\r\n var code = (this.getFieldValue('BOOL') == 'TRUE') ? 'True' : 'False';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const logic_null = function (_, generator) {\r\n var code = 'None';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const logic_true_or_false = function (_, generator) {\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || 'False';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || 'False';\r\n var c = generator.valueToCode(this, 'C', generator.ORDER_ATOMIC) || 'False';\r\n var code = '(' + b + ' if ' + a + ' else ' + c + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const logic_is_in = function (_, generator) {\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var bool = this.getFieldValue('BOOL');\r\n var code = a + ' ' + bool + ' ' + b;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const logic_is = function (_, generator) {\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var bool = this.getFieldValue('BOOL');\r\n var code = a + ' ' + bool + ' ' + b;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const logic_tobool = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['bool(' + str + ')', generator.ORDER_ATOMIC];\r\n}","// export const math_number = function() {\r\n// // Numeric value.\r\n// var code = (this.getFieldValue('NUM'));\r\n// // -4.abs() returns -4 in Dart due to strange order of operation choices.\r\n// // -4 is actually an operator and a number. Reflect this in the order.\r\n// var order = code < 0 ?\r\n// generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;\r\n// return [code, order];\r\n// }\r\n\r\n// generator.math = {}\r\n// generator.addReservedWords(\"math,random,Number\");\r\n\r\nexport const math_number = function (_, generator) {\r\n // a = parseFloat(a.getFieldValue(\"NUM\"));\r\n // var b;\r\n // Infinity == a ? (a = 'float(\"inf\")', b = generator.ORDER_FUNCTION_CALL) : -Infinity == a ? (a = '-float(\"inf\")', b = generator.ORDER_UNARY_SIGN) : b = 0 > a ? generator.ORDER_UNARY_SIGN : generator.ORDER_ATOMIC;\r\n // return [a, b]\r\n\r\n var code = this.getFieldValue('NUM');\r\n // -4.abs() returns -4 in Dart due to strange order of operation choices.\r\n // -4 is actually an operator and a number. Reflect this in the order.\r\n var order = code < 0 ?\r\n generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;\r\n return [code, order];\r\n}\r\n\r\nexport const math_constant = function (_, generator) {\r\n generator.definitions_.import_math = \"import math\";\r\n var name = this.getFieldValue('CONSTANT');\r\n var code = 'math.' + name;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_constant_mp = function (_, generator) {\r\n generator.definitions_.import_math = \"import math\";\r\n var name = this.getFieldValue('CONSTANT');\r\n var code = 'math.' + name;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_bit = function (_, generator) {\r\n var operator = this.getFieldValue('OP');\r\n var order = generator.ORDER_ATOMIC;\r\n var argument0 = generator.valueToCode(this, 'A', order) || '0';\r\n var argument1 = generator.valueToCode(this, 'B', order) || '0';\r\n var code = '(' + argument0 + operator + argument1 + ')';\r\n return [code, order];\r\n}\r\n\r\nexport const math_arithmetic = function (a, generator) {\r\n var b = {\r\n ADD: [\" + \", generator.ORDER_ADDITIVE],\r\n MINUS: [\" - \", generator.ORDER_ADDITIVE],\r\n MULTIPLY: [\" * \", generator.ORDER_MULTIPLICATIVE],\r\n DIVIDE: [\" / \", generator.ORDER_MULTIPLICATIVE],\r\n QUYU: [' % ', generator.ORDER_MULTIPLICATIVE],//增加取余操作\r\n ZHENGCHU: [' // ', generator.ORDER_MULTIPLICATIVE],//增加整除操作\r\n POWER: [\" ** \", generator.ORDER_EXPONENTIATION]\r\n }[a.getFieldValue(\"OP\")];\r\n var c = b[0],\r\n b = b[1],\r\n d = generator.valueToCode(a, \"A\", b) || \"0\";\r\n a = generator.valueToCode(a, \"B\", b) || \"0\";\r\n return [d + c + a, b]\r\n}\r\n\r\nexport const math_selfcalcu = function (_, generator) {\r\n var argument0 = generator.valueToCode(this, 'A', generator.ORDER_RELATIONAL) || '0';\r\n var argument1 = generator.valueToCode(this, 'B', generator.ORDER_RELATIONAL) || '0';\r\n var operator = this.getFieldValue('OP');\r\n switch (operator) {\r\n case 'ADD': var op = '+='; break;\r\n case 'MINUS': var op = '-='; break;\r\n case 'MULTIPLY': var op = '*='; break;\r\n case 'DIVIDE': var op = '/='; break;\r\n case 'QUYU': var op = '%='; break;\r\n case 'ZHENGCHU': var op = '//='; break;\r\n case 'POWER': var op = '**='; break;\r\n }\r\n var code = argument0 + ' ' + op + ' ' + argument1 + '\\n';\r\n return code;\r\n}\r\n\r\nexport const math_single = function (a, generator) {\r\n var b = a.getFieldValue(\"OP\"),\r\n c;\r\n if (\"NEG\" == b)\r\n return c = generator.valueToCode(a, \"NUM\", generator.ORDER_UNARY_SIGN) || \"0\", [\"-\" + c, generator.ORDER_UNARY_SIGN];\r\n generator.definitions_['import_math'] = \"import math\";\r\n a = \"SIN\" == b || \"COS\" == b || \"TAN\" == b ? generator.valueToCode(a, \"NUM\", generator.ORDER_MULTIPLICATIVE) || \"0\" : generator.valueToCode(a, \"NUM\", generator.ORDER_NONE) || \"0\";\r\n switch (b) {\r\n case \"ABS\":\r\n c = \"math.fabs(\" + a + \")\";\r\n break;\r\n case \"ROOT\":\r\n c = \"math.sqrt(\" +\r\n a + \")\";\r\n break;\r\n case \"LN\":\r\n c = \"math.log(\" + a + \")\";\r\n break;\r\n case \"LOG10\":\r\n c = \"math.log10(\" + a + \")\";\r\n break;\r\n case \"EXP\":\r\n c = \"math.exp(\" + a + \")\";\r\n break;\r\n case \"POW10\":\r\n c = \"math.pow(10,\" + a + \")\";\r\n break;\r\n case \"ROUND\":\r\n c = \"round(\" + a + \")\";\r\n break;\r\n case \"ROUNDUP\":\r\n c = \"math.ceil(\" + a + \")\";\r\n break;\r\n case \"ROUNDDOWN\":\r\n c = \"math.floor(\" + a + \")\";\r\n break;\r\n case \"SIN\":\r\n c = \"math.sin(\" + a + \")\";\r\n break;\r\n case \"COS\":\r\n c = \"math.cos(\" + a + \")\";\r\n break;\r\n case \"TAN\":\r\n c = \"math.tan(\" + a + \")\";\r\n break;\r\n case \"++\":\r\n c = \"++(\" + a + \")\";\r\n break;\r\n case \"--\":\r\n c = \"--(\" + a + \")\";\r\n break;\r\n case \"-\":\r\n c = \"-(\" + a + \")\";\r\n break;\r\n default:\r\n }\r\n if (c)\r\n return [c, generator.ORDER_EXPONENTIATION];\r\n switch (b) {\r\n case \"ASIN\":\r\n c = \"math.degrees(math.asin(\" + a + \"))\";\r\n break;\r\n case \"ACOS\":\r\n c = \"math.degrees(math.acos(\" + a + \"))\";\r\n break;\r\n case \"ATAN\":\r\n c = \"math.degrees(math.atan(\" + a + \"))\";\r\n break;\r\n }\r\n return [c, generator.ORDER_MULTIPLICATIVE]\r\n}\r\n\r\nexport const math_trig = math_single;\r\n\r\nexport const math_dec = function (_, generator) {\r\n var argument0 = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';\r\n var operator = this.getFieldValue('OP');\r\n var code = operator + '(' + argument0 + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n\r\n}\r\n\r\nexport const math_to_int = function (_, generator) {\r\n var argument0 = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';\r\n var operator = this.getFieldValue('OP');\r\n var code = \"\";\r\n if (operator === \"round\") {\r\n code = operator + '(' + argument0 + ')';\r\n } else {\r\n code = \"math.\" + operator + '(' + argument0 + ')';\r\n generator.definitions_.import_math = \"import math\";\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_max_min = function (_, generator) {\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_NONE) || '0';\r\n var operator = this.getFieldValue('OP');\r\n var code = operator + '(' + a + ', ' + b + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_random = function (_, generator) {\r\n generator.definitions_.import_random = \"import random\";\r\n // Random integer between [X] and [Y].\r\n var type = this.getFieldValue('TYPE');\r\n var argument0 = generator.valueToCode(this, 'FROM',\r\n generator.ORDER_NONE) || '0';\r\n var argument1 = generator.valueToCode(this, 'TO',\r\n generator.ORDER_NONE) || '0';\r\n if (type == 'int') {\r\n var code = 'random.randint(' + argument0 + ', ' + argument1 + ')';\r\n } else if (type == 'float') {\r\n var code = 'random.uniform(' + argument0 + ', ' + argument1 + ')';\r\n }\r\n return [code, generator.ORDER_UNARY_POSTFIX];\r\n}\r\n\r\nexport const math_map = function (_, generator) {\r\n var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_NONE);\r\n var value_fl = generator.valueToCode(this, 'fromLow', generator.ORDER_ATOMIC);\r\n var value_fh = generator.valueToCode(this, 'fromHigh', generator.ORDER_ATOMIC);\r\n var value_tl = generator.valueToCode(this, 'toLow', generator.ORDER_ATOMIC);\r\n var value_th = generator.valueToCode(this, 'toHigh', generator.ORDER_ATOMIC);\r\n generator.definitions_['import_mixpy_math_map'] = \"from mixpy import math_map\";\r\n var code = 'math_map(' + value_num + ', ' + value_fl + ', ' + value_fh + ', ' + value_tl + ', ' + value_th + ')';\r\n return [code, generator.ORDER_NONE];\r\n}\r\n\r\nexport const math_constrain = function (_, generator) {\r\n // Constrain a number between two limits.\r\n var argument0 = generator.valueToCode(this, 'VALUE',\r\n generator.ORDER_NONE) || '0';\r\n var argument1 = generator.valueToCode(this, 'LOW',\r\n generator.ORDER_NONE) || '0';\r\n var argument2 = generator.valueToCode(this, 'HIGH',\r\n generator.ORDER_NONE) || '0';\r\n var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';\r\n return [code, generator.ORDER_UNARY_POSTFIX];\r\n}\r\n\r\nexport const math_number_base_conversion = function (a, generator) {\r\n var c1 = a.getFieldValue(\"OP\");\r\n var d = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';\r\n var c2 = a.getFieldValue(\"OP2\");\r\n generator.definitions_['import_math'] = \"import math\";\r\n var param1 = \"\";\r\n var param2 = \"10\";\r\n if (c1 == \"two\") {\r\n param2 = '2';\r\n } else if (c1 == \"eight\") {\r\n param2 = '8'\r\n } else if (c1 == \"ten\") {\r\n param2 = '10'\r\n } else if (c1 == \"sixteen\") {\r\n param2 = '16'\r\n }\r\n\r\n if (c2 == \"two\") {\r\n param1 = 'bin';\r\n } else if (c2 == \"eight\") {\r\n param1 = 'oct'\r\n } else if (c2 == \"ten\") {\r\n param1 = ''\r\n } else if (c2 == \"sixteen\") {\r\n param1 = 'hex'\r\n }\r\n if (param1 == \"\") {\r\n var code = \"int(str(\" + d + \"), \" + param2 + \")\";\r\n } else {\r\n var code = param1 + \"(int(str(\" + d + \"), \" + param2 + \"))\";\r\n\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_random_seed = function (_, generator) {\r\n // Random integer between [X] and [Y].\r\n generator.definitions_.import_random = \"import random\";\r\n var a = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';\r\n var code = 'random.seed(' + a + ');' + '\\n';\r\n return code;\r\n}\r\n\r\nexport const math_indexer_number = function (_, generator) {\r\n var code = this.getFieldValue('NUM');\r\n // -4.abs() returns -4 in Dart due to strange order of operation choices.\r\n // -4 is actually an operator and a number. Reflect this in the order.\r\n var order = code < 0 ?\r\n generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;\r\n return [code, order];\r\n}\r\n\r\nexport const math_round = function (_, generator) {\r\n var argument0 = generator.valueToCode(this, 'VALUE',\r\n generator.ORDER_NONE) || '0';\r\n var argument1 = generator.valueToCode(this, 'VAR',\r\n generator.ORDER_NONE) || '0';\r\n\r\n var code = 'round(' + argument0 + ', ' + argument1 + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_to_number = function (_, generator) {\r\n var towhat = this.getFieldValue('TOWHAT');\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n if (towhat == 'b') return ['' + str + '.encode(\"utf-8\")', generator.ORDER_ATOMIC];\r\n else if (towhat == 'bti') return ['int.from_bytes(' + str + ',\"big\")', generator.ORDER_ATOMIC];\r\n return [towhat + \"(\" + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_to_number_skulpt = function (_, generator) {\r\n var towhat = this.getFieldValue('TOWHAT');\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n if (towhat == 'b') return ['' + str + '.encode(\"utf-8\")', generator.ORDER_ATOMIC];\r\n return [towhat + \"(\" + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const base_map = math_map;\r\n\r\nexport const turn_to_int = function (_, generator) {\r\n generator.definitions_.import_hexlify = \"from ubinascii import hexlify\";\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n return [\"hexlify(\" + str + ').decode()', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const generate_cartesian_product = function (_, generator) {\r\n generator.definitions_.import_itertools = 'import itertools';\r\n let re = generator.valueToCode(this, 'REPEAT', generator.ORDER_ATOMIC);\r\n let items = new Array(this.itemCount_);\r\n for (let n = 0; n < this.itemCount_; n++) {\r\n items[n] = generator.valueToCode(this, `ADD${n}`, generator.ORDER_NONE) || '0';\r\n }\r\n let code = '';\r\n if (this.itemCount_) {\r\n code = `itertools.product(${items.join(', ')}, repeat=${re})`;\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_radian_to_degree = function (_, generator) {\r\n generator.definitions_.import_math = \"import math\";\r\n var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = 'math.degrees('+ v + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const math_degree_to_radian = function (_, generator) {\r\n generator.definitions_.import_math = \"import math\";\r\n var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = 'math.radians('+ v + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const procedures_defreturn = function (_, generator) {\r\n // Define a procedure with a return value.\r\n var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),\r\n Blockly.Procedures.NAME_TYPE);\r\n var branch = (this.getInput('STACK') && generator.statementToCode(this, 'STACK')) ?? ' pass\\n';\r\n if (generator.INFINITE_LOOP_TRAP) {\r\n branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,\r\n '\\'' + this.id + '\\'') + branch;\r\n }\r\n var returnValue = generator.valueToCode(this, 'RETURN',\r\n generator.ORDER_NONE) || '';\r\n //var type=this.getFieldValue('TYPE');\r\n if (returnValue) {\r\n returnValue = ' return ' + returnValue + '\\n';\r\n }\r\n //var returnType = returnValue ? type : 'void';\r\n var args = [];\r\n for (var x = 0; x < this.arguments_.length; x++) {\r\n var varName = generator.variableDB_.getName(this.arguments_[x], Blockly.Variables.NAME_TYPE);\r\n args[x] = varName;\r\n }\r\n var code = 'def ' + funcName + '(' + args.join(', ') + '):\\n' +\r\n branch + returnValue + '\\n';\r\n code = generator.scrub_(this, code);\r\n generator.setups_[funcName] = code;\r\n return null;\r\n}\r\n\r\nexport const procedures_defnoreturn = function (_, generator) {\r\n // Define a procedure with a return value.\r\n var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),\r\n Blockly.Procedures.NAME_TYPE);\r\n var branch = (this.getInput('STACK') && generator.statementToCode(this, 'STACK')) ?? ' pass\\n';\r\n if (generator.INFINITE_LOOP_TRAP) {\r\n branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,\r\n '\\'' + this.id + '\\'') + branch;\r\n }\r\n //var returnType = returnValue ? type : 'void';\r\n var args = [];\r\n for (var x = 0; x < this.arguments_.length; x++) {\r\n var varName = generator.variableDB_.getName(this.arguments_[x], Blockly.Variables.NAME_TYPE);\r\n args[x] = varName;\r\n }\r\n var code = 'def ' + funcName + '(' + args.join(', ') + '):\\n' +\r\n branch + '\\n';\r\n code = generator.scrub_(this, code);\r\n generator.setups_[funcName] = code;\r\n return null;\r\n}\r\n\r\nexport const procedures_callreturn = function (_, generator) {\r\n // Call a procedure with a return value.\r\n var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),\r\n Blockly.Procedures.NAME_TYPE);\r\n var args = [];\r\n for (var x = 0; x < this.arguments_.length; x++) {\r\n args[x] = generator.valueToCode(this, 'ARG' + x,\r\n generator.ORDER_NONE) || 'null';\r\n }\r\n var code = funcName + '(' + args.join(', ') + ')';\r\n return [code, generator.ORDER_UNARY_POSTFIX];\r\n}\r\n\r\nexport const procedures_callnoreturn = function (_, generator) {\r\n // Call a procedure with no return value.\r\n var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),\r\n Blockly.Procedures.NAME_TYPE);\r\n var args = [];\r\n for (var x = 0; x < this.arguments_.length; x++) {\r\n args[x] = generator.valueToCode(this, 'ARG' + x,\r\n generator.ORDER_NONE) || 'null';\r\n }\r\n var code = funcName + '(' + args.join(', ') + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const procedures_ifreturn = function (_, generator) {\r\n // Conditionally return value from a procedure.\r\n var condition = generator.valueToCode(this, 'CONDITION',\r\n generator.ORDER_NONE) || 'False';\r\n var code = 'if (' + condition + ') :\\n';\r\n if (this.hasReturnValue_) {\r\n var value = generator.valueToCode(this, 'VALUE',\r\n generator.ORDER_NONE) || 'None';\r\n code += ' return ' + value;\r\n } else {\r\n code += ' return None';\r\n }\r\n code += '\\n';\r\n return code;\r\n}\r\n\r\nexport const procedures_return = function (_, generator) {\r\n // Conditionally return value from a procedure.\r\n var code = \"\"\r\n if (this.hasReturnValue_) {\r\n var value = generator.valueToCode(this, 'VALUE',\r\n generator.ORDER_NONE) || 'None';\r\n code += 'return ' + value;\r\n } else {\r\n code += 'return None';\r\n }\r\n code += '\\n';\r\n return code;\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const set_create_with = function (_, generator) {\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n //generator.definitions_['var_declare'+varName] = varName+'= '+ '{' + code.join(', ') + '}\\n';\r\n code = varName + '= ' + '{' + code.join(', ') + '}\\n';\r\n if (this.itemCount_ == 0) { code = varName + ' = ' + 'set()\\n' }\r\n return code;\r\n}\r\n\r\nexport const set_length = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'len(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_pop = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.pop()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_clear = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.clear()\\n';\r\n return code;\r\n}\r\n\r\nexport const set_operate = function (_, generator) {\r\n var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0';\r\n var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0';\r\n var operate = this.getFieldValue('OPERATE');\r\n //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = vars1 + \".\" + operate + \"(\" + vars2 + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_operate_update = function (_, generator) {\r\n var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0';\r\n var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0';\r\n var operate = this.getFieldValue('OPERATE');\r\n //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = vars1 + \".\" + operate + \"(\" + vars2 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const set_add_discard = function (_, generator) {\r\n var vars1 = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0';\r\n var operate = this.getFieldValue('OPERATE');\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = vars1 + \".\" + operate + \"(\" + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const set_sub = function (_, generator) {\r\n var vars1 = generator.valueToCode(this, 'SET1', generator.ORDER_ASSIGNMENT) || '0';\r\n var vars2 = generator.valueToCode(this, 'SET2', generator.ORDER_ASSIGNMENT) || '0';\r\n var operate = this.getFieldValue('OPERATE');\r\n //var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = vars1 + \".\" + operate + \"(\" + vars2 + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_update = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'SET', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".\" + 'update' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\n// export const set_change_to = function(){\r\n// var op = this.getFieldValue('OP');\r\n// var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n// var code = op + '(' + varName + ')\\n';\r\n// return [code, generator.ORDER_ATOMIC];\r\n// }\r\n\r\nexport const set_create_with_text_return = function (_, generator) {\r\n var text = this.getFieldValue('TEXT');\r\n var code = '{' + text + '}';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_toset = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['set(' + str + ')', generator.ORDER_ATOMIC];\r\n}","export const storage_open_file_with_os = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var fn = generator.valueToCode(this, 'fn', generator.ORDER_ATOMIC);\r\n return \"os.startfile(\" + fn + \")\\n\";\r\n}\r\n\r\nexport const storage_fileopen = function (_, generator) {\r\n // For each loop.\r\n var variable0 = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC);\r\n var mode = this.getFieldValue('MODE');\r\n var code = variable0 + ' = open(' + fn + ', \\'' + mode + '\\')\\n';\r\n return code;\r\n}\r\n\r\nexport const storage_fileopen_new = function (_, generator) { // For each loop.\r\n var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC);\r\n var mode = this.getFieldValue('MODE');\r\n var code = 'open(' + fn + ', \\'' + mode + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_fileopen_new_encoding = function (_, generator) { // For each loop.\r\n var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC);\r\n var mode = this.getFieldValue('MODE');\r\n var encode = this.getFieldValue('CODE');\r\n var code = 'open(' + fn + ', \\'' + mode + '\\', encoding=\"' + encode + '\")';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_file_write = function (_, generator) {\r\n var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n return file + \".write(\" + data + \")\\n\";\r\n}\r\n\r\nexport const storage_get_contents_without_para = function (_, generator) {\r\n var mode = this.getFieldValue('MODE');\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = file + '.' + mode + '()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_get_contents = function (_, generator) {\r\n var mode = this.getFieldValue('MODE');\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC);\r\n var code = file + '.' + mode + '(' + size + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_get_a_line = function (_, generator) {\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC);\r\n var code = file + \".readline(\" + size + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_can_write_ornot = function (_, generator) {\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = file + \".writable()\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_get_filename = function (_, generator) {\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = file + \".name()\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_close_file = function (_, generator) {\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = file + \".close()\\n\";\r\n return code;\r\n}\r\n\r\nexport const storage_list_all_files = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var code = 'os.listdir()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_delete_file = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var mode = this.getFieldValue('MODE');\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = \"os.\" + mode + \"(\" + file + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const storage_get_file_size = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = \"os.path.getsize(\" + file + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_file_tell = function (_, generator) {\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = file + \".tell()\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_file_seek = function (_, generator) {\r\n var mode = this.getFieldValue('MODE');\r\n var mode_num = 0;\r\n if (mode == 'start') {\r\n mode_num = 0;\r\n }\r\n else if (mode == 'current') {\r\n mode_num = 1;\r\n }\r\n else {\r\n mode_num = 2;\r\n }\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var size = generator.valueToCode(this, 'SIZE', generator.ORDER_ATOMIC);\r\n var code = file + '.seek(' + size + ',' + mode_num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const storage_change_dir = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = \"os.chdir(\" + file + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const storage_get_current_dir = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var code = 'os.getcwd()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const storage_make_dir = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var mode = this.getFieldValue('MODE');\r\n var path = generator.valueToCode(this, 'PATH', generator.ORDER_ATOMIC);\r\n var code = 'os.' + mode + '(' + path + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const storage_rename = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var file1 = generator.valueToCode(this, 'NEWFILE', generator.ORDER_ATOMIC);\r\n var code = \"os.rename(\" + file + \",\" + file1 + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const storage_is_file = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var mode = this.getFieldValue('MODE');\r\n var code = \"os.\" + mode + \"(\" + file + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const sdcard_use_spi_init = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n generator.definitions_['import_sdcard'] = 'import sdcard';\r\n var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);\r\n var sv = generator.valueToCode(this, 'SPISUB', generator.ORDER_ATOMIC);\r\n var pv = generator.valueToCode(this, 'PINSUB', generator.ORDER_ATOMIC);\r\n var code = v + ' = sdcard.SDCard(' + sv + ',' + pv + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const sdcard_mount = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n generator.definitions_['import_sdcard'] = 'import sdcard';\r\n var sd = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var dir = generator.valueToCode(this, 'DIR', generator.ORDER_ATOMIC);\r\n return \"os.mount(\" + sd + ',' + dir + \")\\n\";\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const text = function (_, generator) {\r\n // Text value.\r\n //var code = 'String('+generator.quote_(this.getFieldValue('TEXT'))+')';\r\n var code = generator.quote_(this.getFieldValue('TEXT'));\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_textarea = function (_, generator) {\r\n // Text value.\r\n //var code = 'String('+generator.quote_(this.getFieldValue('TEXT'))+')';\r\n var code = '\"\"\"' + (this.getFieldValue('VALUE')) + '\"\"\"';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_bytes = function (_, generator) {\r\n const text = this.getFieldValue('TEXT');\r\n return [`b'${text}'`, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_char = function (_, generator) {\r\n var code = '\\'' + this.getFieldValue('TEXT') + '\\'';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_join = function (_, generator) {\r\n // Text value.\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC);\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC);\r\n return [a + ' + ' + b, generator.ORDER_ADDITIVE];\r\n}\r\n\r\nexport const ascii_to_char = function (_, generator) {\r\n var asciivalue = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['chr(' + asciivalue + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const char_to_ascii = function (_, generator) {\r\n var charvalue = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || 'a';\r\n return ['ord(' + charvalue + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const number_to_text = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0';\r\n return ['str(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_length = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n return ['len(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_char_at2 = function (a, generator) {\r\n var c = a.getFieldValue(\"WHERE\") || \"FROM_START\",\r\n str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n switch (c) {\r\n case \"FROM_START\":\r\n a = generator.getAdjustedInt(a, \"AT\");\r\n return [str + \"[\" + a + \"]\", generator.ORDER_ATOMIC];\r\n case \"FROM_END\":\r\n a = generator.getAdjustedInt(a, \"AT\", 1, !0);\r\n return [str + \"[\" + a + \"]\", generator.ORDER_ATOMIC];\r\n case \"RANDOM\":\r\n generator.definitions_.import_random = \"import random\";\r\n return [\"random.choice(\" + str + \")\", generator.ORDER_FUNCTION_CALL];\r\n }\r\n throw \"Unhandled combination (lists_getIndex).\";\r\n}\r\n\r\nexport const text_char_at = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var at = generator.valueToCode(this, 'AT', generator.ORDER_ATOMIC) || 0;\r\n return [str + \"[\" + at + \"]\", generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_random_char = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n generator.definitions_.import_random = \"import random\";\r\n return [\"random.choice(\" + str + \")\", generator.ORDER_FUNCTION_CALL];\r\n}\r\n\r\nexport const text_equals_starts_ends = function (_, generator) {\r\n var str1 = (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '\"\"');\r\n var str2 = (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '\"\"');\r\n var dowhat = this.getFieldValue('DOWHAT');\r\n if (dowhat === '===')\r\n return [str1 + ' == ' + str2, generator.ORDER_ATOMIC];\r\n return [str1 + '.' + dowhat + '(' + str2 + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_compare_to = function (_, generator) {\r\n var str1 = (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '\"\"');\r\n var str2 = (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '\"\"');\r\n return ['cmp(' + str1 + ',' + str2 + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_substring2 = function (block, generator) {\r\n // Get sublist.\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var where1 = block.getFieldValue('WHERE1');\r\n var where2 = block.getFieldValue('WHERE2');\r\n switch (where1) {\r\n case 'FROM_START':\r\n var at1 = generator.getAdjustedInt(block, 'AT1');\r\n if (at1 == '0') {\r\n at1 = '';\r\n }\r\n break;\r\n case 'FROM_END':\r\n var at1 = generator.getAdjustedInt(block, 'AT1', 0, true);\r\n break;\r\n case 'FIRST':\r\n var at1 = '0';\r\n break;\r\n default:\r\n throw 'Unhandled option (lists_getSublist)';\r\n }\r\n switch (where2) {\r\n case 'FROM_START':\r\n var at2 = generator.getAdjustedInt(block, 'AT2');\r\n break;\r\n case 'FROM_END':\r\n var at2 = generator.getAdjustedInt(block, 'AT2', 0, true);\r\n // Ensure that if the result calculated is 0 that sub-sequence will\r\n // include all elements as expected.\r\n if (!Blockly.isNumber(String(at2))) {\r\n generator.definitions_['import_sys'] = 'import sys';\r\n at2 += ' or sys.maxsize';\r\n } else if (at2 == '0') {\r\n at2 = '';\r\n }\r\n break;\r\n case 'LAST':\r\n var at2 = '-1';\r\n break;\r\n default:\r\n throw 'Unhandled option (lists_getSublist)';\r\n }\r\n var code = str + '[' + at1 + ' : ' + at2 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_substring = function (_, generator) {\r\n // Get sublist.\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ATOMIC);\r\n var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ATOMIC);\r\n var code = str + '[' + at1 + ' : ' + at2 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_capital = function (_, generator) {\r\n var capital = this.getFieldValue('CAPITAL');\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n return ['' + str + '.' + capital + '()', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_center = function (_, generator) {\r\n var center = this.getFieldValue('CENTER');\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var width = generator.valueToCode(this, 'WID', generator.ORDER_ATOMIC);\r\n var symbol = generator.valueToCode(this, 'Symbol', generator.ORDER_ATOMIC);\r\n return ['' + str + '.' + center + '(' + width + ',' + symbol + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_find = function (_, generator) {\r\n var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var str = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC);\r\n return ['' + sentence + '.find(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_join_seq = function (_, generator) {\r\n var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var varName = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT) || '0';\r\n return [sentence + '.join(' + varName + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_replace = function (_, generator) {\r\n var sentence = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var str1 = generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC);\r\n var str2 = generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC);\r\n return ['' + sentence + '.replace(' + str1 + ',' + str2 + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_split = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var argument = generator.valueToCode(this, 'VAL', generator.ORDER_ATOMIC) || '\"\"';\r\n var code = str + \".split(\" + argument + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_strip = function (_, generator) {\r\n var towhat = this.getFieldValue('TOWHAT');\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = str + \".\" + towhat + \"()\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_format = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var s = this.getFieldValue('VAR');\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n var code = s + '.format(' + code.join(', ') + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_format_noreturn = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var s = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n var code = s + '.format(' + code.join(', ') + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_substring3 = text_substring\r\nexport const text_compareTo = text_compare_to\r\nexport const text_char_at3 = text_char_at\r\n\r\nexport const text_encode = function (_, generator) {\r\n var code = this.getFieldValue('DIR');\r\n var varName = this.getFieldValue('CODE')\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n return [str + '.' + code + '(\"' + varName + '\")', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const text_eval = function (_, generator) {\r\n var codestr = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = \"eval\" + '(' + codestr + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const os_system = function (_, generator) {\r\n generator.definitions_['import_os'] = 'import os';\r\n var codestr = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = \"os.system\" + '(' + codestr + ')\\n';\r\n return code;\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const tuple_create_with = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n // if (this.itemCount_!=1){\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\\n';}\r\n // else {\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\\n';}\r\n if (this.itemCount_ != 1) {\r\n var code = varName + '= ' + '(' + code.join(', ') + ')\\n';\r\n }\r\n else {\r\n var code = varName + '= ' + '(' + code.join(', ') + ',)\\n';\r\n }\r\n return code;\r\n}\r\n\r\nexport const tuple_create_with_text2 = function (_, generator) {\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n var text = this.getFieldValue('TEXT');\r\n //generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + text + ')\\n';\r\n var code = varName + '= ' + '(' + text + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const tuple_create_with_text_return = function (_, generator) {\r\n var text = this.getFieldValue('TEXT');\r\n var code = '(' + text + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_getIndex = function (_, generator) {\r\n // Indexing into a list is the same as indexing into a string.\r\n var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument0 = generator.valueToCode(this, 'AT',\r\n generator.ORDER_ADDITIVE) || '1';\r\n if (argument0.match(/^\\d+$/)) {\r\n // If the index is a naked number, decrement it right now.\r\n argument0 = parseInt(argument0, 10);\r\n }\r\n // else {\r\n // If the index is dynamic, decrement it in code.\r\n // argument0;\r\n // }\r\n var code = varName + '[' + argument0 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_length = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'len(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_del = function (_, generator) {\r\n var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'del ' + varName + '\\n';\r\n return code;\r\n}\r\n\r\nexport const tuple_join = function (_, generator) {\r\n var varName1 = generator.valueToCode(this, 'TUP1', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName2 = generator.valueToCode(this, 'TUP2', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName1 + \" + \" + varName2;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_max = function (_, generator) {\r\n var varname = generator.valueToCode(this, 'TUP', generator.ORDER_ASSIGNMENT) || '0';\r\n var maxmin = this.getFieldValue('DIR');\r\n var code = maxmin + \"(\" + varname + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_change_to = function (_, generator) {\r\n var op = this.getFieldValue('OP');\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = op + '(' + varName + ')\\n';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_find = function (_, generator) {\r\n var op = this.getFieldValue('OP');\r\n var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n if (op == 'INDEX')\r\n var code = varName + '.index(' + argument + ')';\r\n else if (op == 'COUNT')\r\n var code = varName + '.count(' + argument + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_trig = function (a, generator) {\r\n var b = a.getFieldValue(\"OP\"), c;\r\n generator.definitions_['import_math'] = \"import math\";\r\n a = generator.valueToCode(a, 'data', generator.ORDER_NONE)\r\n switch (b) {\r\n case \"LEN\":\r\n c = \"len(\" + a + \")\";\r\n break;\r\n case \"SUM\":\r\n c = \"sum(\" + a + \")\";\r\n break;\r\n case \"MIN\":\r\n c = \"min(\" + a + \")\";\r\n break;\r\n case \"MAX\":\r\n c = \"max(\" + a + \")\";\r\n break;\r\n case 'AVERAGE':\r\n // generator.definitions_['from_numbers_import_Number'] =\r\n // 'from numbers import Number';\r\n var functionName = generator.provideFunction_(\r\n 'math_mean',\r\n // This operation excludes null and values that aren't int or float:',\r\n // math_mean([null, null, \"aString\", 1, 9]) == 5.0.',\r\n ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(myList):',\r\n ' localList = [e for e in myList if type(e) == int or type(e) == float]',\r\n ' if not localList: return',\r\n ' return float(sum(localList)) / len(localList)']);\r\n c = functionName + '(' + a + ')';\r\n break;\r\n case 'MEDIAN':\r\n // generator.definitions_['from_numbers_import_Number'] =\r\n // 'from numbers import Numberd';\r\n var functionName = generator.provideFunction_(\r\n 'math_median',\r\n // This operation excludes null values:\r\n // math_median([null, null, 1, 3]) == 2.0.\r\n ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(myList):',\r\n ' localList = sorted([e for e in myList if type(e) == int or type(e) == float])',\r\n ' if not localList: return',\r\n ' if len(localList) % 2 == 0:',\r\n ' return (localList[len(localList) // 2 - 1] + ' +\r\n 'localList[len(localList) // 2]) / 2.0',\r\n ' else:',\r\n ' return localList[(len(localList) - 1) // 2]']);\r\n c = functionName + '(' + a + ')';\r\n break;\r\n case 'MODE':\r\n var functionName = generator.provideFunction_(\r\n 'math_modes',\r\n // As a list of numbers can contain more than one mode,\r\n // the returned result is provided as an array.\r\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].\r\n ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(some_list):',\r\n ' modes = []',\r\n ' # Using a lists of [item, count] to keep count rather than dict',\r\n ' # to avoid \"unhashable\" errors when the counted item is ' +\r\n 'itself a list or dict.',\r\n ' counts = []',\r\n ' maxCount = 1',\r\n ' for item in some_list:',\r\n ' found = False',\r\n ' for count in counts:',\r\n ' if count[0] == item:',\r\n ' count[1] += 1',\r\n ' maxCount = max(maxCount, count[1])',\r\n ' found = True',\r\n ' if not found:',\r\n ' counts.append([item, 1])',\r\n ' for counted_item, item_count in counts:',\r\n ' if item_count == maxCount:',\r\n ' modes.append(counted_item)',\r\n ' return modes']);\r\n c = functionName + '(' + a + ')';\r\n break;\r\n case 'STD_DEV':\r\n generator.definitions_['import_math'] = 'import math';\r\n var functionName = generator.provideFunction_(\r\n 'math_standard_deviation',\r\n ['def ' + generator.FUNCTION_NAME_PLACEHOLDER_ + '(numbers):',\r\n ' n = len(numbers)',\r\n ' if n == 0: return',\r\n ' mean = float(sum(numbers)) / n',\r\n ' variance = sum((x - mean) ** 2 for x in numbers) / n',\r\n ' return math.sqrt(variance)']);\r\n c = functionName + '(' + a + ')';\r\n break;\r\n default:\r\n throw 'Unknown operator: ' + b;\r\n }\r\n if (c)\r\n return [c, generator.ORDER_FUNCTION_CALL];\r\n\r\n}\r\n\r\nexport const tuple_getSublist = function (block, generator) {\r\n // Get sublist.\r\n var list = generator.valueToCode(block, 'LIST',\r\n generator.ORDER_MEMBER) || '[]';\r\n var where1 = block.getFieldValue('WHERE1');\r\n var where2 = block.getFieldValue('WHERE2');\r\n switch (where1) {\r\n case 'FROM_START':\r\n var at1 = generator.getAdjustedInt(block, 'AT1');\r\n if (at1 == '0') {\r\n at1 = '';\r\n }\r\n break;\r\n case 'FROM_END':\r\n var at1 = generator.getAdjustedInt(block, 'AT1', 1, true);\r\n break;\r\n case 'FIRST':\r\n var at1 = '0';\r\n break;\r\n default:\r\n throw 'Unhandled option (lists_getSublist)';\r\n }\r\n switch (where2) {\r\n case 'FROM_START':\r\n var at2 = generator.getAdjustedInt(block, 'AT2', 1);\r\n at2 = at2 - 1;\r\n break;\r\n case 'FROM_END':\r\n var at2 = generator.getAdjustedInt(block, 'AT2', 1, true);\r\n // Ensure that if the result calculated is 0 that sub-sequence will\r\n // include all elements as expected.\r\n if (!Blockly.isNumber(String(at2))) {\r\n generator.definitions_['import_sys'] = 'import sys';\r\n at2 += ' or sys.maxsize';\r\n } else if (at2 == '0') {\r\n at2 = '';\r\n }\r\n break;\r\n case 'LAST':\r\n var at2 = '-1';\r\n break;\r\n default:\r\n throw 'Unhandled option (lists_getSublist)';\r\n }\r\n var code = list + '[' + at1 + ' : ' + at2 + ']';\r\n return [code, generator.ORDER_MEMBER];\r\n}\r\n\r\nexport const tuple_create_with_noreturn = function (_, generator) {\r\n // Create a list with any number of elements of any type.\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n\r\n\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n // if (this.itemCount_!=1){\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ')\\n';}\r\n // else {\r\n // generator.definitions_['var_declare'+varName] = varName+'= '+ '(' + code.join(', ') + ',)\\n';}\r\n if (this.itemCount_ != 1) {\r\n var code = '(' + code.join(', ') + ')';\r\n }\r\n else {\r\n var code = '(' + code.join(', ') + ',)';\r\n }\r\n\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_get_sublist = function (_, generator) {\r\n // Get sublist.\r\n var list = generator.valueToCode(this, 'LIST', generator.ORDER_ADDITIVE) || '0';\r\n var at1 = generator.valueToCode(this, 'AT1', generator.ORDER_ADDITIVE) || '0';\r\n var at2 = generator.valueToCode(this, 'AT2', generator.ORDER_ADDITIVE) || '0';\r\n var code = list + '[' + at1 + ' : ' + at2 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_get_random_item = function (_, generator) {\r\n generator.definitions_['import_random'] = 'import random';\r\n var varName = generator.valueToCode(this, 'TUP', generator.ORDER_ADDITIVE) || 'mytup';\r\n var code = 'random.choice(' + varName + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_totuple = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'\r\n return ['tuple(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_input = function (_, generator) {\r\n var text = this.getFieldValue('CONTENT');\r\n var code = '(' + text + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const tuple_create_llm_params = function (_, generator) {\r\n var params = generator.valueToCode(this, 'params', generator.ORDER_ATOMIC) || '0'\r\n var des = generator.valueToCode(this, 'des', generator.ORDER_ATOMIC) || '0'\r\n var type = this.getFieldValue('type');\r\n var code = '(' + params + ',\"' + type + '\",' + des +')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}","/**\r\n * @license\r\n * Visual Blocks Language\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Generating Python for utility blocks.\r\n * @author acbart@vt.edu (Austin Cory Bart)\r\n */\r\n\r\nexport const raw_block = function (block) {\r\n var code = block.getFieldValue('TEXT') + \"\\n\";\r\n return code;\r\n}\r\n\r\nexport const raw_expression = function (block, generator) {\r\n var code = block.getFieldValue('TEXT');\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const raw_empty = function (block, generator) {\r\n var code = generator.valueToCode(block, 'VALUE',\r\n generator.ORDER_ATOMIC) || '';\r\n return code + \"\\n\";\r\n}\r\n\r\nexport const raw_table = function () {\r\n //var code = block.getFieldValue('TEXT')+\"\\n\";\r\n return '';//code;\r\n}\r\n\r\nexport const type_check = function (block, generator) {\r\n var value = generator.valueToCode(block, 'VALUE',\r\n generator.ORDER_MEMBER) || '___';\r\n var code = 'type(' + value + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const function_call = function (block, generator) {\r\n var name = block.getFieldValue('NAME');\r\n var hasReturn = block.hasReturn_;\r\n var args = new Array(block.itemCount_);\r\n for (var n = 0; n < block.itemCount_; n++) {\r\n args[n] = generator.valueToCode(block, 'ARGUMENT' + n,\r\n generator.ORDER_NONE) || '___';\r\n }\r\n var code = name + '(' + args.join(', ') + ')';\r\n if (hasReturn) {\r\n return [code, generator.ORDER_ATOMIC];\r\n }\r\n return code + '\\n';\r\n}\r\n\r\nexport const attribute_access = function (block, generator) {\r\n var value_module = generator.valueToCode(block, 'MODULE', generator.ORDER_ATOMIC);\r\n var value_name = generator.valueToCode(block, 'NAME', generator.ORDER_ATOMIC);\r\n //去除掉两端的括号,如(val()) --> val()\r\n value_name = value_name.substring(1, value_name.length - 1);\r\n // TODO: Assemble JavaScript into code variable.\r\n var code = value_module + '.' + value_name;\r\n // TODO: Change ORDER_NONE to the correct strength.\r\n return [code, generator.ORDER_NONE];\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const variables_get = function (_, generator) {\r\n // Variable getter.\r\n var code = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\n// export const variables_declare = function() {\r\n// var dropdown_type = this.getFieldValue('TYPE');\r\n// var argument0;\r\n// //TODO: settype to variable\r\n// argument0 = generator.valueToCode(this, 'VALUE',generator.ORDER_ASSIGNMENT) || 'None';\r\n// var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n// Blockly.Variables.NAME_TYPE);\r\n\r\n// if (dropdown_type === 'number')\r\n// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = 0;';\r\n// else if(dropdown_type === 'string')\r\n// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = \\'\\';';\r\n// else if(dropdown_type === 'boolean')\r\n// generator.definitions_['var_declare' + varName] = 'let ' + ' ' + varName + ' = true;';\r\n// else if(dropdown_type.startsWith('Array'))\r\n// generator.definitions_['var_declare' + varName] = 'let ' + varName + ':' + dropdown_type + ' = [];';\r\n\r\n// if(generator.setups_['var_declare' + varName] === undefined) {\r\n// generator.setups_['var_declare' + varName] = varName + ' = ' + argument0 + '\\n';\r\n// }else {\r\n// }\r\n// return '';\r\n// }\r\n\r\nexport const variables_set = function (_, generator) {\r\n // Variable setter.\r\n if (this.getFieldValue('VAR') == \"\") {\r\n return \" = None\\n\";\r\n }\r\n var argument0 = generator.valueToCode(this, 'VALUE',\r\n generator.ORDER_ASSIGNMENT) || 'None';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);\r\n return varName + ' = ' + argument0 + '\\n';\r\n}\r\n\r\nexport const variables_change = function (_, generator) {\r\n // Variable setter.\r\n var operator = this.getFieldValue('OP');\r\n var varName = generator.valueToCode(this, 'MYVALUE', generator.ORDER_ATOMIC) || 'None';\r\n if (operator == 'bytes') { var code = operator + '(' + varName + ',\"UTF-8\")'; }\r\n else { var code = operator + '(' + varName + ')'; }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const variables_global = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || 'None';\r\n var code = \"global \" + str + '\\n';\r\n return code;\r\n}\r\n\r\n// ok\r\nexport const controls_type = function (_, generator) {\r\n var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || 'None'\r\n var code = 'type(' + data + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const controls_typeLists = function (_, generator) {\r\n //generator.definitions_['import_microbit_*'] = 'from microbit import *';\r\n var type = this.getFieldValue('type');\r\n // generator.definitions_['func_type' + type] = code;\r\n return [type, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const lists_zip = function (_, generator) {\r\n var code = new Array(this.itemCount_);\r\n var default_value = '[]';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n var code = 'zip(' + code.join(', ') + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const unpack_iterable_object = function (_, generator) {\r\n const varName = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '[]';\r\n const type = this.getFieldValue('TYPE');\r\n const code = `${type}(${varName})`;\r\n return [code, generator.ORDER_ATOMIC];\r\n}","/**\r\n * @license\r\n * Visual Blocks Editor\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Utility functions for handling variables and procedure names.\r\n * @author fraser@google.com (Neil Fraser)\r\n */\r\nimport Variables from './variables';\r\n\r\n/**\r\n * Class for a database of entity names (variables, functions, etc).\r\n * @param {string} reservedWords A comma-separated string of words that are\r\n * illegal for use as names in a language (e.g. 'new,if,this,...').\r\n * @param {string=} opt_variablePrefix Some languages need a '$' or a namespace\r\n * before all variable names.\r\n * @constructor\r\n */\r\nclass Names {\r\n constructor(reservedWords, opt_variablePrefix) {\r\n this.variablePrefix_ = opt_variablePrefix || '';\r\n this.reservedDict_ = Object.create(null);\r\n if (reservedWords) {\r\n var splitWords = reservedWords.split(',');\r\n for (var i = 0; i < splitWords.length; i++) {\r\n this.reservedDict_[splitWords[i]] = true;\r\n }\r\n }\r\n this.reset();\r\n }\r\n /**\r\n * Do the given two entity names refer to the same entity?\r\n * Blockly names are case-insensitive.\r\n * @param {string} name1 First name.\r\n * @param {string} name2 Second name.\r\n * @return {boolean} True if names are the same.\r\n */\r\n static equals(name1, name2) {\r\n return name1 == name2;\r\n }\r\n /**\r\n * When JavaScript (or most other languages) is generated, variable 'foo' and\r\n * procedure 'foo' would collide. However, Blockly has no such problems since\r\n * variable get 'foo' and procedure call 'foo' are unambiguous.\r\n * Therefore, Blockly keeps a separate type name to disambiguate.\r\n * getName('foo', 'variable') -> 'foo'\r\n * getName('foo', 'procedure') -> 'foo2'\r\n */\r\n /**\r\n * Empty the database and start from scratch. The reserved words are kept.\r\n */\r\n reset() {\r\n this.db_ = Object.create(null);\r\n this.dbReverse_ = Object.create(null);\r\n this.variableMap_ = null;\r\n }\r\n /**\r\n * Set the variable map that maps from variable name to variable object.\r\n * @param {!Blockly.VariableMap} map The map to track.\r\n * @package\r\n */\r\n setVariableMap(map) {\r\n this.variableMap_ = map;\r\n }\r\n /**\r\n * Get the name for a user-defined variable, based on its ID.\r\n * This should only be used for variables of type Variables.NAME_TYPE.\r\n * @param {string} id The ID to look up in the variable map.\r\n * @return {?string} The name of the referenced variable, or null if there was\r\n * no variable map or the variable was not found in the map.\r\n * @private\r\n */\r\n getNameForUserVariable_(id) {\r\n if (!this.variableMap_) {\r\n /*\r\n console.log('Deprecated call to Names.prototype.getName without ' +\r\n 'defining a variable map. To fix, add the folowing code in your ' +\r\n 'generator\\'s init() function:\\n' +\r\n 'Blockly.YourGeneratorName.variableDB_.setVariableMap(' +\r\n 'workspace.getVariableMap());');\r\n */\r\n return null;\r\n }\r\n var variable = this.variableMap_.getVariableById(id);\r\n if (variable) {\r\n return variable.name;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Convert a Blockly entity name to a legal exportable entity name.\r\n * @param {string} name The Blockly entity name (no constraints).\r\n * @param {string} type The type of entity in Blockly\r\n * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...).\r\n * @return {string} An entity name that is legal in the exported language.\r\n */\r\n getName(name, type) {\r\n if (type == Variables.NAME_TYPE) {\r\n var varName = this.getNameForUserVariable_(name);\r\n if (varName) {\r\n name = varName;\r\n }\r\n }\r\n var normalized = name + '_' + type;\r\n\r\n var isVarType = type == Variables.NAME_TYPE ||\r\n type == Names.DEVELOPER_VARIABLE_TYPE;\r\n\r\n var prefix = isVarType ? this.variablePrefix_ : '';\r\n if (normalized in this.db_) {\r\n return prefix + this.db_[normalized];\r\n }\r\n var safeName = this.getDistinctName(name, type);\r\n this.db_[normalized] = safeName.substr(prefix.length);\r\n return safeName;\r\n }\r\n /**\r\n * Convert a Blockly entity name to a legal exportable entity name.\r\n * Ensure that this is a new name not overlapping any previously defined name.\r\n * Also check against list of reserved words for the current language and\r\n * ensure name doesn't collide.\r\n * @param {string} name The Blockly entity name (no constraints).\r\n * @param {string} type The type of entity in Blockly\r\n * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...).\r\n * @return {string} An entity name that is legal in the exported language.\r\n */\r\n getDistinctName(name, type) {\r\n var safeName = this.safeName_(name);\r\n var i = '';\r\n while (this.dbReverse_[safeName + i] ||\r\n (safeName + i) in this.reservedDict_) {\r\n // Collision with existing name. Create a unique name.\r\n i = i ? i + 1 : 2;\r\n }\r\n safeName += i;\r\n this.dbReverse_[safeName] = true;\r\n var isVarType = type == Variables.NAME_TYPE ||\r\n type == Names.DEVELOPER_VARIABLE_TYPE;\r\n var prefix = isVarType ? this.variablePrefix_ : '';\r\n return prefix + safeName;\r\n }\r\n /**\r\n * Given a proposed entity name, generate a name that conforms to the\r\n * [_A-Za-z][_A-Za-z0-9]* format that most languages consider legal for\r\n * variables.\r\n * @param {string} name Potentially illegal entity name.\r\n * @return {string} Safe entity name.\r\n * @private\r\n */\r\n safeName_(name) {\r\n if (!name) {\r\n name = 'unnamed';\r\n } else {\r\n // Unfortunately names in non-latin characters will look like\r\n // _E9_9F_B3_E4_B9_90 which is pretty meaningless.\r\n // https://github.com/google/blockly/issues/1654\r\n name = encodeURI(name.replace(/ /g, '_')).replace(/[^,\\w]/g, '_');\r\n // Most languages don't allow names with leading numbers.\r\n if ('0123456789'.indexOf(name[0]) != -1) {\r\n name = 'my_' + name;\r\n }\r\n }\r\n return name;\r\n }\r\n}\r\n\r\n/**\r\n * Constant to separate developer variable names from user-defined variable\r\n * names when running generators.\r\n * A developer variable will be declared as a global in the generated code, but\r\n * will never be shown to the user in the workspace or stored in the variable\r\n * map.\r\n */\r\nNames.DEVELOPER_VARIABLE_TYPE = 'DEVELOPER_VARIABLE';\r\n\r\nexport default Names;","/**\r\n * @license\r\n * Copyright 2012 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Utility functions for handling procedures.\r\n * @author fraser@google.com (Neil Fraser)\r\n */\r\nimport * as Blockly from 'blockly/core';\r\n\r\nconst Procedures = {};\r\n\r\n/**\r\n * Constant to separate procedure names from variables and generated functions\r\n * when running generators.\r\n * @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME\r\n */\r\nProcedures.NAME_TYPE = Blockly.PROCEDURE_CATEGORY_NAME;\r\n\r\n/**\r\n * Find all user-created procedure definitions in a workspace.\r\n * @param {!Blockly.Workspace} root Root workspace.\r\n * @return {!Array.>} Pair of arrays, the\r\n * first contains procedures without return variables, the second with.\r\n * Each procedure is defined by a three-element list of name, parameter\r\n * list, and return value boolean.\r\n */\r\nProcedures.allProcedures = function (root) {\r\n var blocks = root.getAllBlocks(false);\r\n var proceduresReturn = [];\r\n var proceduresNoReturn = [];\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i].getProcedureDef) {\r\n var tuple = blocks[i].getProcedureDef();\r\n if (tuple) {\r\n if (tuple[2]) {\r\n proceduresReturn.push(tuple);\r\n } else {\r\n proceduresNoReturn.push(tuple);\r\n }\r\n }\r\n }\r\n }\r\n proceduresNoReturn.sort(Procedures.procTupleComparator_);\r\n proceduresReturn.sort(Procedures.procTupleComparator_);\r\n return [proceduresNoReturn, proceduresReturn];\r\n};\r\n\r\n/**\r\n * Comparison function for case-insensitive sorting of the first element of\r\n * a tuple.\r\n * @param {!Array} ta First tuple.\r\n * @param {!Array} tb Second tuple.\r\n * @return {number} -1, 0, or 1 to signify greater than, equality, or less than.\r\n * @private\r\n */\r\nProcedures.procTupleComparator_ = function (ta, tb) {\r\n return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase());\r\n};\r\n\r\n/**\r\n * Ensure two identically-named procedures don't exist.\r\n * Take the proposed procedure name, and return a legal name i.e. one that\r\n * is not empty and doesn't collide with other procedures.\r\n * @param {string} name Proposed procedure name.\r\n * @param {!Blockly.Block} block Block to disambiguate.\r\n * @return {string} Non-colliding name.\r\n */\r\nProcedures.findLegalName = function (name, block) {\r\n if (block.isInFlyout) {\r\n // Flyouts can have multiple procedures called 'do something'.\r\n return name;\r\n }\r\n name = name || Blockly.Msg['UNNAMED_KEY'] || 'unnamed';\r\n while (!Procedures.isLegalName_(name, block.workspace, block)) {\r\n // Collision with another procedure.\r\n var r = name.match(/^(.*?)(\\d+)$/);\r\n if (!r) {\r\n name += '2';\r\n } else {\r\n name = r[1] + (parseInt(r[2], 10) + 1);\r\n }\r\n }\r\n return name;\r\n};\r\n\r\n/**\r\n * Does this procedure have a legal name? Illegal names include names of\r\n * procedures already defined.\r\n * @param {string} name The questionable name.\r\n * @param {!Blockly.Workspace} workspace The workspace to scan for collisions.\r\n * @param {Blockly.Block=} opt_exclude Optional block to exclude from\r\n * comparisons (one doesn't want to collide with oneself).\r\n * @return {boolean} True if the name is legal.\r\n * @private\r\n */\r\nProcedures.isLegalName_ = function (name, workspace, opt_exclude) {\r\n return !Procedures.isNameUsed(name, workspace, opt_exclude);\r\n};\r\n\r\n/**\r\n * Return if the given name is already a procedure name.\r\n * @param {string} name The questionable name.\r\n * @param {!Blockly.Workspace} workspace The workspace to scan for collisions.\r\n * @param {Blockly.Block=} opt_exclude Optional block to exclude from\r\n * comparisons (one doesn't want to collide with oneself).\r\n * @return {boolean} True if the name is used, otherwise return false.\r\n */\r\nProcedures.isNameUsed = function (name, workspace, opt_exclude) {\r\n var blocks = workspace.getAllBlocks(false);\r\n // Iterate through every block and check the name.\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i] == opt_exclude) {\r\n continue;\r\n }\r\n if (blocks[i].getProcedureDef) {\r\n var procName = blocks[i].getProcedureDef();\r\n if (Blockly.Names.equals(procName[0], name)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Rename a procedure. Called by the editable field.\r\n * @param {string} name The proposed new name.\r\n * @return {string} The accepted name.\r\n * @this {Blockly.Field}\r\n */\r\nProcedures.rename = function (name) {\r\n // Strip leading and trailing whitespace. Beyond this, all names are legal.\r\n name = name.trim();\r\n\r\n var legalName = Procedures.findLegalName(name, this.getSourceBlock());\r\n var oldName = this.getValue();\r\n if (oldName != name && oldName != legalName) {\r\n // Rename any callers.\r\n var blocks = this.getSourceBlock().workspace.getAllBlocks(false);\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i].renameProcedure) {\r\n blocks[i].renameProcedure(oldName, legalName);\r\n }\r\n }\r\n }\r\n return legalName;\r\n};\r\n\r\n/**\r\n * Construct the blocks required by the flyout for the procedure category.\r\n * @param {!Blockly.Workspace} workspace The workspace containing procedures.\r\n * @return {!Array.} Array of XML block elements.\r\n */\r\nProcedures.flyoutCategory = function (workspace) {\r\n var xmlList = [];\r\n if (Blockly.Blocks['procedures_defnoreturn']) {\r\n // \r\n // do something\r\n // \r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'procedures_defnoreturn');\r\n block.setAttribute('gap', 16);\r\n var nameField = Blockly.utils.xml.createElement('field');\r\n nameField.setAttribute('name', 'NAME');\r\n nameField.appendChild(Blockly.utils.xml.createTextNode(\r\n Blockly.Msg['PROCEDURES_DEFNORETURN_PROCEDURE']));\r\n block.appendChild(nameField);\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['procedures_defreturn']) {\r\n // \r\n // do something\r\n // \r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'procedures_defreturn');\r\n block.setAttribute('gap', 16);\r\n var nameField = Blockly.utils.xml.createElement('field');\r\n nameField.setAttribute('name', 'NAME');\r\n nameField.appendChild(Blockly.utils.xml.createTextNode(\r\n Blockly.Msg['PROCEDURES_DEFRETURN_PROCEDURE']));\r\n block.appendChild(nameField);\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['procedures_return']) {\r\n // \r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'procedures_return');\r\n block.setAttribute('gap', 16);\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['procedures_ifreturn']) {\r\n // \r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'procedures_ifreturn');\r\n block.setAttribute('gap', 16);\r\n xmlList.push(block);\r\n }\r\n if (xmlList.length) {\r\n // Add slightly larger gap between system blocks and user calls.\r\n xmlList[xmlList.length - 1].setAttribute('gap', 24);\r\n }\r\n\r\n function populateProcedures(procedureList, templateName) {\r\n for (var i = 0; i < procedureList.length; i++) {\r\n var name = procedureList[i][0];\r\n var args = procedureList[i][1];\r\n // \r\n // \r\n // \r\n // \r\n // \r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', templateName);\r\n block.setAttribute('gap', 16);\r\n var mutation = Blockly.utils.xml.createElement('mutation');\r\n mutation.setAttribute('name', name);\r\n block.appendChild(mutation);\r\n for (var j = 0; j < args.length; j++) {\r\n var arg = Blockly.utils.xml.createElement('arg');\r\n arg.setAttribute('name', args[j]);\r\n mutation.appendChild(arg);\r\n }\r\n xmlList.push(block);\r\n }\r\n }\r\n\r\n var tuple = Procedures.allProcedures(workspace);\r\n populateProcedures(tuple[0], 'procedures_callnoreturn');\r\n populateProcedures(tuple[1], 'procedures_callreturn');\r\n return xmlList;\r\n};\r\n\r\n/**\r\n * Find all the callers of a named procedure.\r\n * @param {string} name Name of procedure.\r\n * @param {!Blockly.Workspace} workspace The workspace to find callers in.\r\n * @return {!Array.} Array of caller blocks.\r\n */\r\nProcedures.getCallers = function (name, workspace) {\r\n var callers = [];\r\n var blocks = workspace.getAllBlocks(false);\r\n // Iterate through every block and check the name.\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i].getProcedureCall) {\r\n var procName = blocks[i].getProcedureCall();\r\n // Procedure name may be null if the block is only half-built.\r\n if (procName && Blockly.Names.equals(procName, name)) {\r\n callers.push(blocks[i]);\r\n }\r\n }\r\n }\r\n return callers;\r\n};\r\n\r\n/**\r\n * When a procedure definition changes its parameters, find and edit all its\r\n * callers.\r\n * @param {!Blockly.Block} defBlock Procedure definition block.\r\n */\r\nProcedures.mutateCallers = function (defBlock) {\r\n const oldRecordUndo = Blockly.Events.getRecordUndo();\r\n const procedureBlock = defBlock;\r\n const name = procedureBlock.getProcedureDef()[0];\r\n const xmlElement = defBlock.mutationToDom(true);\r\n const callers = Blockly.Procedures.getCallers(name, defBlock.workspace);\r\n for (let i = 0, caller; (caller = callers[i]); i++) {\r\n const oldMutationDom = caller.mutationToDom();\r\n const oldMutation = oldMutationDom && Blockly.utils.xml.domToText(oldMutationDom);\r\n if (caller.domToMutation) {\r\n caller.domToMutation(xmlElement);\r\n }\r\n const newMutationDom = caller.mutationToDom();\r\n const newMutation = newMutationDom && Blockly.utils.xml.domToText(newMutationDom);\r\n if (oldMutation !== newMutation) {\r\n // Fire a mutation on every caller block. But don't record this as an\r\n // undo action since it is deterministically tied to the procedure's\r\n // definition mutation.\r\n Blockly.Events.setRecordUndo(false);\r\n Blockly.Events.fire(\r\n new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(\r\n caller,\r\n 'mutation',\r\n null,\r\n oldMutation,\r\n newMutation,\r\n ),\r\n );\r\n Blockly.Events.setRecordUndo(oldRecordUndo);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Find the definition block for the named procedure.\r\n * @param {string} name Name of procedure.\r\n * @param {!Blockly.Workspace} workspace The workspace to search.\r\n * @return {Blockly.Block} The procedure definition block, or null not found.\r\n */\r\nProcedures.getDefinition = function (name, workspace) {\r\n // Assume that a procedure definition is a top block.\r\n var blocks = workspace.getTopBlocks(false);\r\n for (var i = 0; i < blocks.length; i++) {\r\n if (blocks[i].getProcedureDef) {\r\n var tuple = blocks[i].getProcedureDef();\r\n if (tuple && Blockly.Names.equals(tuple[0], name)) {\r\n return blocks[i];\r\n }\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexport default Procedures;","/**\r\n * @license\r\n * Visual Blocks Editor\r\n *\r\n * Copyright 2012 Google Inc.\r\n * https://developers.google.com/blockly/\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * @fileoverview Utility functions for handling variables.\r\n * @author fraser@google.com (Neil Fraser)\r\n */\r\n\r\nimport * as Blockly from 'blockly/core';\r\n\r\nconst Variables = {};\r\n\r\n/**\r\n * Category to separate variable names from procedures and generated functions.\r\n */\r\nVariables.NAME_TYPE = 'VARIABLE';\r\n\r\n/**\r\n * Find all user-created variables.\r\n * @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace.\r\n * @return {!Array.} Array of variable names.\r\n */\r\nVariables.allVariables = function (root) {\r\n var blocks;\r\n if (root.getDescendants) {\r\n // Root is Block.\r\n blocks = root.getDescendants();\r\n } else if (root.getAllBlocks) {\r\n // Root is Workspace.\r\n blocks = root.getAllBlocks();\r\n } else {\r\n throw 'Not Block or Workspace: ' + root;\r\n }\r\n var variableHash = Object.create(null);\r\n // Iterate through every block and add each variable to the hash.\r\n for (var x = 0; x < blocks.length; x++) {\r\n var blockVariables = blocks[x].getVars();\r\n for (var y = 0; y < blockVariables.length; y++) {\r\n var varName = blockVariables[y];\r\n // Variable name may be null if the block is only half-built.\r\n if (varName) {\r\n variableHash[varName] = varName;\r\n }\r\n }\r\n }\r\n // Flatten the hash into a list.\r\n var variableList = [];\r\n for (var name in variableHash) {\r\n variableList.push(variableHash[name]);\r\n }\r\n return variableList;\r\n};\r\n\r\n/**\r\n * Find all instances of the specified variable and rename them.\r\n * @param {string} oldName Variable to rename.\r\n * @param {string} newName New variable name.\r\n * @param {!Blockly.Workspace} workspace Workspace rename variables in.\r\n */\r\nVariables.renameVariable = function (oldName, newName, workspace) {\r\n Blockly.Events.setGroup(true);\r\n var blocks = workspace.getAllBlocks();\r\n // Iterate through every block.\r\n for (var i = 0; i < blocks.length; i++) {\r\n blocks[i].renameVar(oldName, newName);\r\n }\r\n Blockly.Events.setGroup(false);\r\n};\r\n\r\n/**\r\n * Construct the blocks required by the flyout for the variable category.\r\n * @param {!Blockly.Workspace} workspace The workspace contianing variables.\r\n * @return {!Array.} Array of XML block elements.\r\n */\r\nVariables.flyoutCategory = function (workspace) {\r\n var variableList = Variables.allVariables(workspace);\r\n //variableList.sort(goog.string.caseInsensitiveCompare);\r\n // In addition to the user's variables, we also want to display the default\r\n // variable name at the top. We also don't want this duplicated if the\r\n // user has created a variable of the same name.\r\n // alert(variableList)\r\n // goog.array.remove(variableList, Blockly.Msg.VARIABLES_DEFAULT_NAME);\r\n // variableList.unshift(Blockly.Msg.VARIABLES_DEFAULT_NAME);\r\n\r\n var xmlList = [];\r\n\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_global');\r\n xmlList.push(block);\r\n\r\n if (Blockly.Blocks['variables_set']) {\r\n //增加variables_declare模块\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_set');\r\n xmlList.push(block);\r\n }//change tyep\r\n /*\r\n if (Blockly.Blocks['variables_change']) {\r\n //增加variables_declare模块\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_change');\r\n xmlList.push(block);\r\n }*/\r\n if (Blockly.Blocks['variables_change']) {\r\n //增加variables_declare模块\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_change');\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['controls_type']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'controls_type');\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['controls_typeLists']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'controls_typeLists');\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['lists_zip']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'lists_zip');\r\n block.setAttribute('inline', 'false');\r\n var mutation = Blockly.utils.xml.createElement('mutation');\r\n mutation.setAttribute('items', 2);\r\n block.appendChild(mutation);\r\n for (let i = 0; i < 2; i++) {\r\n let add = Blockly.utils.xml.createElement('value');\r\n add.setAttribute('name', `ADD${i}`);\r\n // let childBlock = Blockly.utils.xml.createElement('block');\r\n // childBlock.setAttribute('type', 'list_many_input');\r\n // let field = Blockly.utils.xml.createElement('field');\r\n // let value = Blockly.utils.xml.createTextNode('0,1,2,3');\r\n // field.setAttribute('name', 'CONTENT');\r\n // field.appendChild(value);\r\n // childBlock.appendChild(field);\r\n // add.appendChild(childBlock);\r\n block.appendChild(add);\r\n }\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['unpack_iterable_object']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'unpack_iterable_object');\r\n xmlList.push(block);\r\n }\r\n for (var i = 0; i < variableList.length; i++) {\r\n // alert(variableList)\r\n // if(i==0&& !(Blockly.Python.setups_['variables_set'+''])){\r\n // \tcontinue;\r\n // }\r\n if (Blockly.Blocks['variables_set']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_set');\r\n if (Blockly.Blocks['variables_get']) {\r\n block.setAttribute('gap', 8);\r\n }\r\n var field = Blockly.utils.xml.createElement('field', null, variableList[i]);\r\n field.setAttribute('name', 'VAR');\r\n var name = Blockly.utils.xml.createTextNode(variableList[i]);\r\n field.appendChild(name);\r\n block.appendChild(field);\r\n xmlList.push(block);\r\n }\r\n if (Blockly.Blocks['variables_get']) {\r\n var block = Blockly.utils.xml.createElement('block');\r\n block.setAttribute('type', 'variables_get');\r\n if (Blockly.Blocks['variables_set']) {\r\n block.setAttribute('gap', 24);\r\n }\r\n var field = Blockly.utils.xml.createElement('field', null, variableList[i]);\r\n field.setAttribute('name', 'VAR');\r\n var name = Blockly.utils.xml.createTextNode(variableList[i]);\r\n field.appendChild(name);\r\n block.appendChild(field);\r\n xmlList.push(block);\r\n }\r\n }\r\n return xmlList;\r\n};\r\n\r\n/**\r\n* Return a new variable name that is not yet being used. This will try to\r\n* generate single letter variable names in the range 'i' to 'z' to start with.\r\n* If no unique name is located it will try 'i' to 'z', 'a' to 'h',\r\n* then 'i2' to 'z2' etc. Skip 'l'.\r\n * @param {!Blockly.Workspace} workspace The workspace to be unique in.\r\n* @return {string} New variable name.\r\n*/\r\nVariables.generateUniqueName = function (workspace) {\r\n var variableList = Variables.allVariables(workspace);\r\n var newName = '';\r\n if (variableList.length) {\r\n var nameSuffix = 1;\r\n var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'.\r\n var letterIndex = 0;\r\n var potName = letters.charAt(letterIndex);\r\n while (!newName) {\r\n var inUse = false;\r\n for (var i = 0; i < variableList.length; i++) {\r\n if (variableList[i] == potName) {\r\n // This potential name is already used.\r\n inUse = true;\r\n break;\r\n }\r\n }\r\n if (inUse) {\r\n // Try the next potential name.\r\n letterIndex++;\r\n if (letterIndex == letters.length) {\r\n // Reached the end of the character sequence so back to 'i'.\r\n // a new suffix.\r\n letterIndex = 0;\r\n nameSuffix++;\r\n }\r\n potName = letters.charAt(letterIndex);\r\n if (nameSuffix > 1) {\r\n potName += nameSuffix;\r\n }\r\n } else {\r\n // We can use the current potential name.\r\n newName = potName;\r\n }\r\n }\r\n } else {\r\n newName = 'i';\r\n }\r\n return newName;\r\n};\r\n\r\nexport default Variables;","/*\r\nOverrides for generic Python code generation.\r\n*/\r\nimport * as Blockly from 'blockly/core';\r\nimport Names from './others/names';\r\n\r\n/**\r\n * Python code generator.\r\n * @type {!Blockly.Generator}\r\n */\r\nexport const Python = new Blockly.Generator('Python');\r\nPython.INDENT = \" \";\r\n\r\n/**\r\n * List of illegal variable names.\r\n * This is not intended to be a security feature. Blockly is 100% client-side,\r\n * so bypassing this list is trivial. This is intended to prevent users from\r\n * accidentally clobbering a built-in object or function.\r\n * @private\r\n */\r\nPython.addReservedWords(\r\n // import keyword\r\n // print(','.join(sorted(keyword.kwlist)))\r\n // https://docs.python.org/3/reference/lexical_analysis.html#keywords\r\n // https://docs.python.org/2/reference/lexical_analysis.html#keywords\r\n 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' +\r\n 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,' +\r\n 'or,pass,print,raise,return,try,while,with,yield,' +\r\n // https://docs.python.org/3/library/constants.html\r\n // https://docs.python.org/2/library/constants.html\r\n 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' +\r\n // >>> print(','.join(sorted(dir(__builtins__))))\r\n // https://docs.python.org/3/library/functions.html\r\n // https://docs.python.org/2/library/functions.html\r\n 'ArithmeticError,AssertionError,AttributeError,BaseException,' +\r\n 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' +\r\n 'ChildProcessError,ConnectionAbortedError,ConnectionError,' +\r\n 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,' +\r\n 'Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,' +\r\n 'FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,' +\r\n 'ImportWarning,IndentationError,IndexError,InterruptedError,' +\r\n 'IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,' +\r\n 'ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,' +\r\n 'NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,' +\r\n 'PermissionError,ProcessLookupError,RecursionError,ReferenceError,' +\r\n 'ResourceWarning,RuntimeError,RuntimeWarning,StandardError,' +\r\n 'StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,' +\r\n 'SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,' +\r\n 'UnicodeDecodeError,UnicodeEncodeError,UnicodeError,' +\r\n 'UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,' +\r\n 'ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,' +\r\n '__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,' +\r\n 'basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,' +\r\n 'coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,' +\r\n 'enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,' +\r\n 'getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,' +\r\n 'issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,' +\r\n 'next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,' +\r\n 'reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,' +\r\n 'sum,super,tuple,type,unichr,unicode,vars,xrange,zip'\r\n);\r\n\r\n/**\r\n * Order of operation ENUMs.\r\n * http://docs.python.org/reference/expressions.html#summary\r\n */\r\nPython.ORDER_ATOMIC = 0; // 0 \"\" ...\r\nPython.ORDER_COLLECTION = 1; // tuples, lists, dictionaries\r\nPython.ORDER_STRING_CONVERSION = 1; // `expression...`\r\nPython.ORDER_UNARY_POSTFIX = 1; // expr++ expr-- () [] .\r\nPython.ORDER_UNARY_PREFIX = 2; // -expr !expr ~expr ++expr --expr\r\nPython.ORDER_MEMBER = 2.1; // . []\r\nPython.ORDER_FUNCTION_CALL = 2.2; // ()\r\nPython.ORDER_EXPONENTIATION = 3; // **\r\nPython.ORDER_UNARY_SIGN = 4; // + -\r\nPython.ORDER_BITWISE_NOT = 4; // ~\r\nPython.ORDER_MULTIPLICATIVE = 5; // * / // %\r\nPython.ORDER_ADDITIVE = 6; // + -\r\nPython.ORDER_BITWISE_SHIFT = 7; // << >>\r\nPython.ORDER_BITWISE_AND = 8; // &\r\nPython.ORDER_BITWISE_XOR = 9; // ^\r\nPython.ORDER_BITWISE_OR = 10; // |\r\nPython.ORDER_RELATIONAL = 11; // in, not in, is, is not,\r\n// <, <=, >, >=, <>, !=, ==\r\nPython.ORDER_EQUALITY = 11; // == != === !==\r\nPython.ORDER_LOGICAL_NOT = 12; // not\r\nPython.ORDER_LOGICAL_AND = 13; // and\r\nPython.ORDER_LOGICAL_OR = 14; // or\r\nPython.ORDER_ASSIGNMENT = 14; // = *= /= ~/= %= += -= <<= >>= &= ^= |=\r\nPython.ORDER_CONDITIONAL = 15; // if else\r\nPython.ORDER_LAMBDA = 16; // lambda\r\nPython.ORDER_NONE = 99; // (...)\r\n\r\n/**\r\n * List of outer-inner pairings that do NOT require parentheses.\r\n * @type {!Array.>}\r\n */\r\nPython.ORDER_OVERRIDES = [\r\n // (foo()).bar -> foo().bar\r\n // (foo())[0] -> foo()[0]\r\n [Python.ORDER_FUNCTION_CALL, Python.ORDER_MEMBER],\r\n // (foo())() -> foo()()\r\n [Python.ORDER_FUNCTION_CALL, Python.ORDER_FUNCTION_CALL],\r\n // (foo.bar).baz -> foo.bar.baz\r\n // (foo.bar)[0] -> foo.bar[0]\r\n // (foo[0]).bar -> foo[0].bar\r\n // (foo[0])[1] -> foo[0][1]\r\n [Python.ORDER_MEMBER, Python.ORDER_MEMBER],\r\n // (foo.bar)() -> foo.bar()\r\n // (foo[0])() -> foo[0]()\r\n [Python.ORDER_MEMBER, Python.ORDER_FUNCTION_CALL],\r\n\r\n // not (not foo) -> not not foo\r\n // [Python.ORDER_LOGICAL_NOT, Python.ORDER_LOGICAL_NOT],\r\n // a and (b and c) -> a and b and c\r\n // [Python.ORDER_LOGICAL_AND, Python.ORDER_LOGICAL_AND],\r\n // a or (b or c) -> a or b or c\r\n // [Python.ORDER_LOGICAL_OR, Python.ORDER_LOGICAL_OR]\r\n];\r\n\r\nPython.init = function () {\r\n /**\r\n * Empty loops or conditionals are not allowed in Python.\r\n */\r\n Python.PASS = this.INDENT + 'pass\\n';\r\n // Create a dictionary of definitions to be printed before the code.\r\n Python.definitions_ = Object.create(null);\r\n // Create a dictionary mapping desired function names in definitions_\r\n // to actual function names (to avoid collisions with user functions).\r\n Python.functionNames_ = Object.create(null);\r\n Python.setups_ = Object.create(null);\r\n Python.loops_ = Object.create(null);\r\n Python.codeEnd_ = Object.create(null);\r\n\r\n if (!Python.variableDB_) {\r\n Python.variableDB_ = new Names(Python.RESERVED_WORDS_);\r\n } else {\r\n Python.variableDB_.reset();\r\n }\r\n}\r\n\r\nPython.finish = function (code) {\r\n // Convert the definitions dictionary into a list.\r\n if (code !== \"\") {\r\n code = code.replace(/\\n/g, '\\n');\r\n code = code.replace(/\\n\\s+$/, '\\n');\r\n }\r\n var imports = [];\r\n var definitions_var = []; //变量定义\r\n var definitions_fun = []; //函数定义\r\n for (var name in this.definitions_) {\r\n var def = this.definitions_[name];\r\n if (name.indexOf('import') === 0) {\r\n imports.push(def);\r\n } else if (name.indexOf('var_declare') === 0) {\r\n definitions_var.push(def);\r\n } else {\r\n definitions_fun.push(def);\r\n }\r\n }\r\n if (imports.length) {\r\n imports.push('\\n\\n');\r\n }\r\n if (definitions_var.length) {\r\n definitions_var.push('\\n\\n');\r\n }\r\n if (definitions_fun.length) {\r\n definitions_fun.push('\\n\\n');\r\n }\r\n var functions = [];\r\n for (var name in Python.functions_) {\r\n functions.push(Python.functions_[name]);\r\n }\r\n if (functions.length) {\r\n functions.push('\\n\\n');\r\n }\r\n var setups = [];\r\n for (var name in Python.setups_) {\r\n setups.push(Python.setups_[name]);\r\n }\r\n if (setups.length) {\r\n setups.push('\\n\\n');\r\n }\r\n var loops = [];\r\n for (var name in Python.loops_) {\r\n loops.push(Python.loops_[name]);\r\n }\r\n var codeEnd = [];\r\n for (var name in Python.codeEnd_) {\r\n codeEnd.push(Python.codeEnd_[name]);\r\n }\r\n if (codeEnd.length !== 0) {\r\n codeEnd.push('\\n');\r\n }\r\n if (loops.length > 0) {\r\n return imports.join('\\n') + definitions_var.join('\\n') + definitions_fun.join('\\n')\r\n + functions.join('\\n') + setups.join('') + code + 'while True:\\n' + loops.join('') + codeEnd.join('\\n');\r\n }\r\n return imports.join('\\n') + definitions_var.join('\\n') + definitions_fun.join('\\n')\r\n + functions.join('\\n') + setups.join('') + code + codeEnd.join('\\n');\r\n}\r\n\r\n\r\n/**\r\n * Naked values are top-level blocks with outputs that aren't plugged into\r\n * anything.\r\n * @param {string} line Line of generated code.\r\n * @return {string} Legal line of code.\r\n */\r\nPython.scrubNakedValue = function (line) {\r\n return line + '\\n';\r\n}\r\n\r\n/**\r\n * Encode a string as a properly escaped Python string, complete with quotes.\r\n * @param {string} string Text to encode.\r\n * @return {string} Python string.\r\n * @private\r\n */\r\nPython.quote_ = function (string) {\r\n // Can't use goog.string.quote since % must also be escaped.\r\n // string = string.replace(/\\\\/g, '\\\\\\\\')\r\n // .replace(/\\n/g, '\\\\\\n');\r\n\r\n // Follow the CPython behaviour of repr() for a non-byte string.\r\n var quote = '\\'';\r\n if (string.indexOf('\\'') !== -1) {\r\n if (string.indexOf('\"') === -1) {\r\n quote = '\"';\r\n } else {\r\n string = string.replace(/'/g, '\\\\\\'');\r\n }\r\n }\r\n return quote + string + quote;\r\n}\r\n\r\n/**\r\n * Encode a string as a properly escaped multiline Python string, complete\r\n * with quotes.\r\n * @param {string} string Text to encode.\r\n * @return {string} Python string.\r\n * @private\r\n */\r\nPython.multiline_quote_ = function (string) {\r\n // Can't use goog.string.quote since % must also be escaped.\r\n string = string.replace(/'''/g, '\\\\\\'\\\\\\'\\\\\\'');\r\n return '\\'\\'\\'' + string + '\\'\\'\\'';\r\n}\r\n\r\n/**\r\n * Common tasks for generating Python from blocks.\r\n * Handles comments for the specified block and any connected value blocks.\r\n * Calls any statements following this block.\r\n * @param {!Blockly.Block} block The current block.\r\n * @param {string} code The Python code created for this block.\r\n * @param {boolean=} opt_thisOnly True to generate code for only this statement.\r\n * @return {string} Python code with comments and subsequent blocks added.\r\n * @private\r\n */\r\nPython.scrub_ = function (block, code, opt_thisOnly) {\r\n var commentCode = '';\r\n // Only collect comments for blocks that aren't inline.\r\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\r\n // Collect comment for this block.\r\n var comment = block.getCommentText();\r\n if (comment) {\r\n comment = Blockly.utils.string.wrap(comment,\r\n Python.COMMENT_WRAP - 3);\r\n commentCode += Python.prefixLines(comment + '\\n', '# ');\r\n }\r\n // Collect comments for all value arguments.\r\n // Don't collect comments for nested statements.\r\n for (var i = 0; i < block.inputList.length; i++) {\r\n if (block.inputList[i].type == Blockly.INPUT_VALUE) {\r\n var childBlock = block.inputList[i].connection.targetBlock();\r\n if (childBlock) {\r\n var comment = Python.allNestedComments(childBlock);\r\n if (comment) {\r\n commentCode += Python.prefixLines(comment, '# ');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n var nextBlock = block.nextConnection && block.nextConnection.targetBlock();\r\n var nextCode = opt_thisOnly ? '' : Python.blockToCode(nextBlock);\r\n return commentCode + code + nextCode;\r\n}\r\n\r\n/**\r\n * Gets a property and adjusts the value, taking into account indexing, and\r\n * casts to an integer.\r\n * @param {!Blockly.Block} block The block.\r\n * @param {string} atId The property ID of the element to get.\r\n * @param {number=} opt_delta Value to add.\r\n * @param {boolean=} opt_negate Whether to negate the value.\r\n * @return {string|number}\r\n */\r\nPython.getAdjustedInt = function (block, atId, opt_delta, opt_negate) {\r\n var delta = opt_delta || 0;\r\n if (block.workspace.options.oneBasedIndex) {\r\n delta--;\r\n }\r\n var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\r\n var atOrder = delta ? Python.ORDER_ADDITIVE :\r\n Python.ORDER_NONE;\r\n var at = Python.valueToCode(block, atId, atOrder) || defaultAtIndex;\r\n\r\n if (Blockly.isNumber(at)) {\r\n // If the index is a naked number, adjust it right now.\r\n at = parseInt(at, 10) + delta;\r\n if (opt_negate) {\r\n at = -at;\r\n }\r\n } else {\r\n // If the index is dynamic, adjust it in code.\r\n if (delta > 0) {\r\n at = 'int(' + at + ' + ' + delta + ')';\r\n } else if (delta < 0) {\r\n at = 'int(' + at + ' - ' + -delta + ')';\r\n } else {\r\n at = 'int(' + at + ')';\r\n }\r\n if (opt_negate) {\r\n at = '-' + at;\r\n }\r\n }\r\n return at;\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nconst DATA_HUE = 170//'#5ec73d'//195;\r\n\r\nexport const series_create = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.blockpy_series_create)\r\n .appendField(new Blockly.FieldTextInput('ser1'), 'VAR')\r\n this.appendValueInput('SER')\r\n .appendField(Blockly.Msg.blockpy_series_via)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.blockpy_series_create_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const series_create_from_index = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.blockpy_series_create)\r\n .appendField(new Blockly.FieldTextInput('ser1'), 'VAR')\r\n this.appendValueInput('SER')\r\n .appendField(Blockly.Msg.blockpy_series_via)\r\n this.appendValueInput('INDEX')\r\n .setCheck([String, 'List'])\r\n .appendField(Blockly.Msg.blockpy_series_set_index)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.blockpy_series_create_index_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const dataframe_create = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.blockpy_dataframe_create)\r\n .appendField(new Blockly.FieldTextInput('df1'), 'VAR')\r\n this.appendValueInput('SER')\r\n .appendField(Blockly.Msg.blockpy_series_via)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.blockpy_dataframe_create_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const dataframe_create_from_one_index = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var column_raw =\r\n [[Blockly.Msg.DATAFRAME_RAW, 'index'], [Blockly.Msg.DATAFRAME_COLUMN, 'columns']];\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_dataframe_create)\r\n .appendField(new Blockly.FieldTextInput('df1'), 'VAR')\r\n this.appendValueInput('SER')\r\n .appendField(Blockly.Msg.blockpy_series_via)\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(column_raw), 'COLUMN_RAW')\r\n this.appendValueInput('INDEX')\r\n .setCheck([String, 'List'])\r\n .appendField(Blockly.Msg.blockpy_series_set_index)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const dataframe_create_from_index = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.blockpy_dataframe_create)\r\n .appendField(new Blockly.FieldTextInput('df1'), 'VAR')\r\n this.appendValueInput('SER')\r\n .appendField(Blockly.Msg.blockpy_series_via)\r\n this.appendValueInput('INDEX_COLUMN')\r\n .setCheck([String, 'List'])\r\n .appendField(Blockly.Msg.blockpy_dataframe_set_index_column)\r\n this.appendValueInput('INDEX_RAW')\r\n .setCheck([String, 'List'])\r\n .appendField(Blockly.Msg.blockpy_dataframe_set_index_raw)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n //this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.blockpy_dataframe_create_index_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n\r\nexport const series_create_from_text = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(new Blockly.FieldTextInput('ser1'), 'VAR')\r\n\r\n .appendField(' = [')\r\n .appendField(new Blockly.FieldTextInput('1,2,3'), 'TEXT')\r\n .appendField(']');\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIES_CREATE_FROM_TEXT);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\nexport const series_index_value = {\r\n /**\r\n * Block for list length.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var index_value =\r\n [[Blockly.Msg.SERIES_INDEX, 'index'], [Blockly.Msg.HTML_VALUE, 'value']];\r\n this.appendValueInput('SERIES')\r\n .setCheck('Series')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.SERIES_INDEX_VALUE)\r\n .appendField(new Blockly.FieldDropdown(index_value), 'INDEX_VALUE')\r\n\r\n this.setOutput(true, 'List');\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('INDEX_VALUE');\r\n var TOOLTIPS = {\r\n 'index': Blockly.Msg.SERIES_INDEX_TOOLTIP,\r\n 'value': Blockly.Msg.HTML_VALUE_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n\r\n }\r\n};\r\n\r\nexport const series_get_num = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n //this.setOutput(true, Number);\r\n this.setOutput(true);\r\n this.appendValueInput('SER')\r\n .setCheck('Series')\r\n this.appendValueInput('AT')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.TUPLE_GET_INDEX_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const pl_plot_easy = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('SER')\r\n .setCheck('Series')\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const pl_plot = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var line_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'],\r\n [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, \"\"]];\r\n var color_type = [\r\n [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'],\r\n [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'],\r\n [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'],\r\n [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w']\r\n ];\r\n var dot_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n\r\n this.appendValueInput('SER')\r\n .setCheck('Series')\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE)\r\n .appendField(new Blockly.FieldDropdown(line_type), 'LINE')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldDropdown(color_type), 'COLOR')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const pl_show = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_SHOW);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const pl_axes = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.mixpy_PL_AXES);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const pl_legend = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const pl_title = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_TITLE);\r\n this.appendValueInput('TITLE')\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const pl_label = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var xylabel =\r\n [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL)\r\n .appendField(new Blockly.FieldDropdown(xylabel), 'DIR');\r\n this.appendValueInput('LABEL')\r\n .appendField(Blockly.Msg.blockpy_PYLAB_LABEL)\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n // var thisBlock = this;\r\n // this.setTooltip(function() {\r\n // var mode = thisBlock.getFieldValue('DIR');\r\n // var TOOLTIPS = {\r\n // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD,\r\n // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD\r\n // };\r\n // return TOOLTIPS[mode];\r\n // });\r\n }\r\n};\r\n\r\n\r\nexport const array_create = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('FROM')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.MIXLY_SPLITBYDOU)\r\n .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_FROM);\r\n this.appendValueInput('TO')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.MIXPY_DATA_ARRAY_CREATE_TO);\r\n this.appendValueInput('STEP')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(Blockly.Msg.MIXLY_STEP);\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pl_plot_bar = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var plot_bar =\r\n [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW)\r\n .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR');\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP,\r\n 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const pl_plot_scatter = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var color_type = [\r\n [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'],\r\n [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'],\r\n [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'],\r\n [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w']\r\n ];\r\n var dot_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendValueInput('S')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldDropdown(color_type), 'COLOR');\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(\"\");\r\n }\r\n};\r\n\r\nexport const pl_plot_xy = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var line_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':']\r\n , [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, \"\"]];\r\n var color_type = [\r\n [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'],\r\n [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'],\r\n [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'],\r\n [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w']\r\n ];\r\n var dot_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE)\r\n .appendField(new Blockly.FieldDropdown(line_type), 'LINE')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldDropdown(color_type), 'COLOR')\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pl_bar = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var align =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_BAR)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendValueInput('WIDTH')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_WIDTH);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN)\r\n .appendField(new Blockly.FieldDropdown(align), 'ALIGN')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR');\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pl_pie = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var shadow =\r\n [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']];\r\n var autopct =\r\n [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE)\r\n .appendField(Blockly.Msg.COLOUR_BLEND_RATIO);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.appendValueInput('EXPLODE')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT)\r\n .appendField(new Blockly.FieldDropdown(autopct), 'autopct')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW)\r\n .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const pl_hist = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_HIST)\r\n .appendField(Blockly.Msg.MIXLY_SD_DATA);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const pl_ticks = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var xylabel =\r\n [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_SETTING)\r\n .appendField(new Blockly.FieldDropdown(xylabel), 'DIR');\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE)\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const numpy_trig = {\r\n /**\r\n * Block for trigonometry operators.\r\n * @this Blockly.Block\r\n */\r\n init: function () {\r\n var OPERATORS = [\r\n ['sin', 'sin'],\r\n ['cos', 'cos'],\r\n ['tan', 'tan'],\r\n ['arcsin', 'arcsin'],\r\n ['arccos', 'arccos'],\r\n ['arctan', 'arctan'],\r\n [Blockly.Msg.LANG_MATH_TO_ROUND, 'round'],\r\n [Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'],\r\n [Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor']\r\n ];\r\n this.setColour(DATA_HUE);\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.mixpy_NUMPY_TRIG)\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');\r\n this.setTooltip(Blockly.Msg.mixpy_NUMPY_TRIG_TOOLTIP);\r\n\r\n }\r\n};\r\n\r\nexport const pl_subplot = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('VET')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE);\r\n this.appendValueInput('HOR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pandas_readcsv = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput(\"FILENAME\")\r\n .appendField(Blockly.Msg.MIXPY_PANDAS_READ_CSV);\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([[Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_Y, '0'], [Blockly.Msg.mixpy_PANDAS_READCSV_HEADER_N, 'None']]), 'MODE');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.mixpy_PANDAS_READCSV_TITLE);\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PANDAS_READCSV_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n};\r\n\r\nexport const dataframe_get = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('DICT')\r\n .setCheck('Dict')\r\n this.appendValueInput('KEY')\r\n .appendField(Blockly.Msg.mixpy_DATAFRAME_GET)\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_DATAFRAME_GET_INDEX)\r\n .appendField(new Blockly.FieldDropdown([[Blockly.Msg.DATAFRAME_COLUMN, 'column'], [Blockly.Msg.DATAFRAME_RAW, 'raw']]), 'MODE')\r\n\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.mixpy_DATAFRAME_GET_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pl_savefig = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PL_SAVEFIG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const pl_text = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var halign =\r\n [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']];\r\n var valign =\r\n [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']];\r\n this.appendValueInput('VET')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_SETTING)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_X);\r\n this.appendValueInput('HOR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_Y);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR)\r\n .appendField(new Blockly.FieldDropdown(halign), 'HALIGN');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_VER)\r\n .appendField(new Blockly.FieldDropdown(valign), 'VALIGN');\r\n this.appendValueInput('FONTNUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const array_toarray = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TOARRAY);\r\n this.setOutput(true, 'List');\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_TOOLTIP_TOARRAY);\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport const plot_plot_easy = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('SER')\r\n .setCheck('Series')\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const plot_plot = {//将XX绘制为折线图,删去尚不支持的点型\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var line_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'],\r\n [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, \"\"]];\r\n var color_type = [\r\n [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'],\r\n [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'],\r\n [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'],\r\n [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w']\r\n ];\r\n var dot_type =\r\n [[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o']\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n\r\n this.appendValueInput('SER')\r\n .setCheck('Series')\r\n .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE)\r\n .appendField(new Blockly.FieldDropdown(line_type), 'LINE')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldDropdown(color_type), 'COLOR')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const plot_show = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_SHOW);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const plot_axes = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.mixpy_PL_AXES);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const plot_legend = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_LEGEND);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const plot_title = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_TITLE);\r\n this.appendValueInput('TITLE')\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const plot_label = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var xylabel =\r\n [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_PYLAB_SET_LABEL)\r\n .appendField(new Blockly.FieldDropdown(xylabel), 'DIR');\r\n this.appendValueInput('LABEL')\r\n .appendField(Blockly.Msg.blockpy_PYLAB_LABEL)\r\n .setCheck(String);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n // var thisBlock = this;\r\n // this.setTooltip(function() {\r\n // var mode = thisBlock.getFieldValue('DIR');\r\n // var TOOLTIPS = {\r\n // 'x': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD,\r\n // 'y': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD\r\n // };\r\n // return TOOLTIPS[mode];\r\n // });\r\n }\r\n};\r\n\r\nexport const plot_plot_bar = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var plot_bar =\r\n [[Blockly.Msg.mixpy_PYLAB_PLOT_BAR_PLOT, 'plot'], [Blockly.Msg.mixpy_PYLAB_PLOT_BAR_BAR, 'bar']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_DISPLAY_DRAW)\r\n .appendField(new Blockly.FieldDropdown(plot_bar), 'DIR');\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'plot': Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP,\r\n 'bar': Blockly.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const plot_plot_scatter = {//散点图,删去尚不支持的点型;修改了颜色的选择方式\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var dot_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o']\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_SCATTER)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendValueInput('S')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT');\r\n // this.appendDummyInput(\"\")\r\n // .appendField(Blockly.Msg.HTML_COLOUR)\r\n // .appendField(new Blockly.FieldDropdown(color_type), 'COLOR');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR');\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(\"\");\r\n }\r\n};\r\n\r\nexport const plot_plot_xy = {//折线图,删去尚不支持的点型\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var line_type = [\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_SOLID, '-'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED, '--'],\r\n [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN, '-.'], [Blockly.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED, ':'],\r\n [Blockly.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE, \"\"]];\r\n var color_type = [\r\n [Blockly.Msg.COLOUR_RGB_BLUE, 'b'], [Blockly.Msg.COLOUR_RGB_GREEN, 'g'],\r\n [Blockly.Msg.COLOUR_RGB_RED, 'r'], [Blockly.Msg.COLOUR_CYAN, 'c'],\r\n [Blockly.Msg.COLOUR_MAGENTA, 'm'], [Blockly.Msg.COLOUR_YELLOW, 'y'],\r\n [Blockly.Msg.COLOUR_BLACK, 'k'], [Blockly.Msg.COLOUR_WHITE, 'w']\r\n ];\r\n var dot_type =\r\n [[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR, '.'], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL, ','], [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT, 'o']\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN, 'v'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP, '^'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT, '<'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT, '>'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP, '1'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN, '2'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT, '3'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT, '4'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE, 's'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON, 'p'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_STAR, '*'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL, 'h'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL, 'H'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_PLUS, '+'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_CROSS, 'x'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND, 'D'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL, 'd'],\r\n // [Blockly.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL, '|'],[Blockly.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL, '_']\r\n ];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_XY)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_DOT)\r\n .appendField(new Blockly.FieldDropdown(dot_type), 'DOT')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_PYLAB_PLOT_LINE)\r\n .appendField(new Blockly.FieldDropdown(line_type), 'LINE')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldDropdown(color_type), 'COLOR')\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const plot_bar = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var align =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.AILGN_EDGE, 'edge']];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_BAR)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_X);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PLOT_Y);\r\n this.appendValueInput('WIDTH')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_WIDTH);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_BAR_ALIGN)\r\n .appendField(new Blockly.FieldDropdown(align), 'ALIGN')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.HTML_COLOUR)\r\n .appendField(new Blockly.FieldColour('#0000ff'), 'COLOR');\r\n this.appendValueInput('TAG')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const plot_pie = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var shadow =\r\n [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'False'], [Blockly.Msg.mixpy_PL_PIE_SHADOW_Y, 'True']];\r\n var autopct =\r\n [[Blockly.Msg.mixpy_PL_PIE_SHADOW_N, 'None'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z, '%.0f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_O, '%.1f%%'], [Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT_T, '%.2f%%']];\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE)\r\n .appendField(Blockly.Msg.COLOUR_BLEND_RATIO);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.appendValueInput('EXPLODE')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_EXPLODE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_AUTOPCT)\r\n .appendField(new Blockly.FieldDropdown(autopct), 'autopct')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PYLAB_PIE_SHADOW)\r\n .appendField(new Blockly.FieldDropdown(shadow), 'SHADOW')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const plot_hist = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_HIST)\r\n .appendField(Blockly.Msg.MIXLY_SD_DATA);\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const plot_ticks = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var xylabel =\r\n [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_SETTING)\r\n .appendField(new Blockly.FieldDropdown(xylabel), 'DIR');\r\n this.appendValueInput('A')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE)\r\n this.appendValueInput('B')\r\n .appendField(Blockly.Msg.mixpy_PYLAB_TICKS_TAG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PYLAB_TICKS_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const plot_subplot = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendValueInput('VET')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_VERTICLE);\r\n this.appendValueInput('HOR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_HORIZEN);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_SUBPLOT_NUM);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const plot_savefig = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PL_SAVEFIG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.mixpy_PL_SAVEFIG_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const plot_text = {\r\n init: function () {\r\n this.setColour(DATA_HUE);\r\n var halign =\r\n [[Blockly.Msg.TEXT_TRIM_LEFT, 'right'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.TEXT_TRIM_RIGHT, 'left']];\r\n var valign =\r\n [[Blockly.Msg.mixpy_PL_TEXT_TOP, 'bottom'], [Blockly.Msg.mixpy_PL_TEXT_CENTER, 'center'], [Blockly.Msg.mixpy_PL_TEXT_BOTTOM, 'top']];\r\n this.appendValueInput('VET')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_SETTING)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_X);\r\n this.appendValueInput('HOR')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_Y);\r\n this.appendValueInput('NUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_TAG);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_HOR)\r\n .appendField(new Blockly.FieldDropdown(halign), 'HALIGN');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.mixpy_PL_TEXT_VER)\r\n .appendField(new Blockly.FieldDropdown(valign), 'VALIGN');\r\n this.appendValueInput('FONTNUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.mixpy_PL_TEXT_TOOLTIP);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst INOUT_HUE = 20;\r\n\r\nexport const inout_input = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.blockpy_inout_raw_input)\r\n .setCheck(String);\r\n this.setOutput(true);\r\n this.setTooltip(Blockly.Msg.INOUT_input_TOOLTIP);\r\n }\r\n}\r\n\r\nexport const inout_print = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setTooltip(Blockly.Msg.BLOCKPY_PRINT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const inout_print_inline = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const inout_print_end = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);\r\n this.appendValueInput(\"END\")\r\n .appendField(Blockly.Msg.MIXLY_ENDSWITH);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const inout_type_input = {\r\n init: function () {\r\n\r\n var input_type =\r\n [[Blockly.Msg.LANG_MATH_STRING, 'str'], [Blockly.Msg.LANG_MATH_INT, 'int']\r\n , [Blockly.Msg.LANG_MATH_FLOAT, 'float']];\r\n this.setColour(INOUT_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)\r\n .appendField(new Blockly.FieldDropdown(input_type), 'DIR')\r\n this.appendValueInput(\"VAR\")\r\n .appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE)\r\n .setCheck(String);\r\n\r\n this.setInputsInline(true);\r\n this.setOutput(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'str': Blockly.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP,\r\n 'int': Blockly.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP,\r\n 'float': Blockly.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const inout_print_many = {\r\n\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n\r\n this.itemCount_ = 2;\r\n this.updateShape_();\r\n this.setPreviousStatement(false);\r\n this.setNextStatement(false);\r\n this.setInputsInline(true);\r\n this.setMutator(new Blockly.icons.MutatorIcon(['inout_print_item'], this));\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP);\r\n },\r\n\r\n mutationToDom: function () {\r\n var container = document.createElement('mutation');\r\n container.setAttribute('items', this.itemCount_);\r\n return container;\r\n },\r\n\r\n domToMutation: function (xmlElement) {\r\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\r\n this.updateShape_();\r\n },\r\n\r\n decompose: function (workspace) {\r\n var containerBlock =\r\n workspace.newBlock('inout_print_container');\r\n containerBlock.initSvg();\r\n var connection = containerBlock.getInput('STACK').connection;\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var itemBlock = workspace.newBlock('inout_print_item');\r\n itemBlock.initSvg();\r\n connection.connect(itemBlock.previousConnection);\r\n connection = itemBlock.nextConnection;\r\n }\r\n return containerBlock;\r\n },\r\n\r\n compose: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n // Count number of inputs.\r\n var connections = [];\r\n var i = 0;\r\n while (itemBlock) {\r\n connections[i] = itemBlock.valueConnection_;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n i++;\r\n }\r\n this.itemCount_ = i;\r\n this.updateShape_();\r\n // Reconnect any child blocks.\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n if (connections[i]) {\r\n this.getInput('ADD' + i)\r\n .connection.connect(connections[i]);\r\n }\r\n }\r\n },\r\n\r\n saveConnections: function (containerBlock) {\r\n var itemBlock = containerBlock.getInputTargetBlock('STACK');\r\n var i = 0;\r\n while (itemBlock) {\r\n var input = this.getInput('ADD' + i);\r\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\r\n i++;\r\n itemBlock = itemBlock.nextConnection &&\r\n itemBlock.nextConnection.targetBlock();\r\n }\r\n },\r\n\r\n updateShape_: function () {\r\n // Delete everything.\r\n if (this.getInput('EMPTY')) {\r\n this.removeInput('EMPTY');\r\n } else {\r\n var i = 0;\r\n while (this.getInput('ADD' + i)) {\r\n this.removeInput('ADD' + i);\r\n i++;\r\n }\r\n }\r\n // Rebuild block.\r\n if (this.itemCount_ == 0) {\r\n this.appendDummyInput('EMPTY')\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_EMPTY);\r\n } else {\r\n for (var i = 0; i < this.itemCount_; i++) {\r\n var input = this.appendValueInput('ADD' + i);\r\n if (i == 0) {\r\n input.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);\r\n }\r\n }\r\n }\r\n }\r\n};\r\nexport const inout_print_container = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);\r\n this.appendStatementInput('STACK');\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};\r\n\r\nexport const inout_print_item = {\r\n init: function () {\r\n this.setColour(INOUT_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_ITEM_TOOLTIP);\r\n this.contextMenu = false;\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst SYSTEM_HUE = 120;\r\n\r\nexport const base_delay = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendValueInput(\"DELAY_TIME\", Number)\r\n .appendField(Blockly.Msg.MIXLY_DELAY + '(' + Blockly.Msg.MIXLY_MILLIS + ')')\r\n .setCheck(Number);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);\r\n }\r\n};\r\n\r\nexport const controls_millis = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_time_time);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_MILLIS);\r\n }\r\n};\r\n\r\nexport const time_localtime = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME)\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_ALL, \"all\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_YEAR, \"0\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MONTH, \"1\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DATE, \"2\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_HOUR, \"3\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_MINUTE, \"4\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_SECOND, \"5\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INWEEK, \"6\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_INYEAR, \"7\"],\r\n [Blockly.Msg.MIXLY_SYSTEM_TIME_LOCALTIME_DST, \"8\"]\r\n ]), \"op\");\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n }\r\n};\r\n\r\nexport const Panic_with_status_code = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendValueInput(\"STATUS_CODE\", Number)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code)\r\n .setCheck(Number);\r\n this.setPreviousStatement(true, null);\r\n // this.setNextStatement(true, null);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);\r\n }\r\n};\r\n\r\nexport const reset = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);\r\n this.setPreviousStatement(true);\r\n // this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const controls_mstimer2 = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendValueInput('TIME')\r\n .setCheck(Number)\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField('MsTimer2')\r\n .appendField(Blockly.Msg.MIXLY_MSTIMER2_EVERY);\r\n this.appendDummyInput()\r\n .appendField('ms');\r\n this.appendStatementInput('DO')\r\n .appendField(Blockly.Msg.MIXLY_MSTIMER2_DO);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const controls_mstimer2_start = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendDummyInput()\r\n .appendField('MsTimer2')\r\n .appendField(Blockly.Msg.MIXLY_MSTIMER2_START);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const controls_mstimer2_stop = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendDummyInput()\r\n .appendField('MsTimer2')\r\n .appendField(Blockly.Msg.MIXLY_STOP);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const time_sleep = {\r\n init: function () {\r\n this.setColour(SYSTEM_HUE);\r\n this.appendValueInput(\"DELAY_TIME\", Number)\r\n .appendField(Blockly.Msg.MIXLY_DELAY)\r\n .setCheck(Number);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_SECOND)\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nconst TURTLE_HUE = 180;\r\n\r\nexport const turtle_create = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.blockpy_turtle_create)\r\n .appendField(new Blockly.FieldTextInput('tina'), 'VAR')\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.blockpy_turtle_create_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const turtle_done = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_TURTLE_DONE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_exitonclick = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_TURTLE_EXITONCLICK);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_move = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var front_back =\r\n [[Blockly.Msg.blockpy_forward, 'forward'], [Blockly.Msg.blockpy_backward, 'backward']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n // .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY)\r\n .appendField(new Blockly.FieldDropdown(front_back), 'DIR')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MOVE_BY_num);\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'forward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD,\r\n 'backward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_rotate = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var front_back =\r\n [[Blockly.Msg.blockpy_left, 'left'], [Blockly.Msg.blockpy_right, 'right']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n // .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_rotate)\r\n .appendField(new Blockly.FieldDropdown(front_back), 'DIR')\r\n .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'left': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_LEFT,\r\n 'right': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RIGHT\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_setheading = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.blockpy_setheading);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_setheading_degree);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_screen_delay = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_SCREEN_DELAY);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_MILLIS);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SCREEN_DELAY);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_goto = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n\r\n .appendField(Blockly.Msg.blockpy_turtle_goto);\r\n this.appendValueInput('val')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.blockpy_turtle_goto_y);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_goto_position);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_setxy = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var set_xy =\r\n [[Blockly.Msg.PYLAB_LABEL_X, 'x'], [Blockly.Msg.PYLAB_LABEL_Y, 'y']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .appendField(new Blockly.FieldDropdown(set_xy), 'DIR')\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_MIXPY_TURTLE_SETXY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_pos_shape = {\r\n\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n var pos_shape =\r\n [[Blockly.Msg.TURTLE_POS, 'pos'], [Blockly.Msg.TURTLE_SHAPE, 'shape'], [Blockly.Msg.TURTLE_HEADING, 'heading'], [Blockly.Msg.MIXLY_MIXPY_TURTLE_WIDTH, 'width'], [Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE, 'shapesize'], [Blockly.Msg.MIXLY_SPEED, 'speed']];\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.TURTLE_POS_SHAPE)\r\n .appendField(new Blockly.FieldDropdown(pos_shape), 'DIR')\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'pos': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_POS,\r\n 'shape': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHAPE,\r\n 'heading': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HEADING,\r\n 'width': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_WIDTH,\r\n 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_GET_SPEED,\r\n 'shapesize': Blockly.Msg.MIXLY_TURTEL_GET_SHAPESIZE_TOOLTIP\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n this.setOutput(true);\r\n this.setInputsInline(true);\r\n\r\n }\r\n};\r\n\r\n\r\nexport const turtle_clear = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var clear_reset =\r\n [[Blockly.Msg.MIXLY_LCD_STAT_CLEAR, 'clear'], [Blockly.Msg.blockpy_turtle_reset, 'reset']\r\n , [Blockly.Msg.blockpy_turtle_home, 'home']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(clear_reset), 'DIR')\r\n\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'clear': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CLEAR,\r\n 'reset': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RESET,\r\n 'home': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HOME\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_penup = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var penup_down =\r\n [[Blockly.Msg.blockpy_turtle_penup, 'penup'], [Blockly.Msg.blockpy_turtle_pendown, 'pendown']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(penup_down), 'DIR')\r\n\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'penup': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENUP,\r\n 'pendown': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_PENDOWN\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_fill = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var fill =\r\n [[Blockly.Msg.blockpy_turtle_beginfill, 'begin'], [Blockly.Msg.blockpy_turtle_endfill, 'end']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(fill), 'DIR')\r\n\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'begin': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BEGINFILL,\r\n 'end': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_ENDFILL\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\n\r\nexport const turtle_size_speed = {\r\n init: function () {\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldTextInput('tina'), 'TUR')\r\n var size_speed =\r\n [[Blockly.Msg.blockpy_turtle_size, 'pensize'], [Blockly.Msg.MIXLY_SPEED, 'speed']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n // .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_set)\r\n .appendField(new Blockly.FieldDropdown(size_speed), 'DIR')\r\n .appendField(Blockly.Msg.blockpy_turtle_set_num);\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'pensize': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE,\r\n 'speed': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_size = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.blockpy_turtle_set_size);\r\n\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SIZE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\n\r\nexport const turtle_speed = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.blockpy_turtle_set_speed);\r\n\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SPEED);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_circle = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var circle_dot =\r\n [[Blockly.Msg.blockpy_turtle_circle, 'circle'], [Blockly.Msg.blockpy_turtle_dot, 'dot']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n // .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_draw)\r\n .appendField(new Blockly.FieldDropdown(circle_dot), 'DIR')\r\n .appendField(Blockly.Msg.blockpy_turtle_radius);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'circle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE,\r\n 'dot': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_DOT\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\nexport const turtle_circle_advanced = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n // .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_DRAW_CIRCLE)\r\n .appendField(Blockly.Msg.blockpy_turtle_radius);\r\n this.appendValueInput('data')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.blockpy_turtle_angle);\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CIRCLE);\r\n }\r\n};\r\n\r\nexport const turtle_visible = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var visible =\r\n [[Blockly.Msg.blockpy_turtle_hide, 'hideturtle'], [Blockly.Msg.blockpy_turtle_show, 'showturtle']];\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(new Blockly.FieldDropdown(visible), 'DIR')\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n var thisBlock = this;\r\n this.setTooltip(function () {\r\n var mode = thisBlock.getFieldValue('DIR');\r\n var TOOLTIPS = {\r\n 'hideturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HIDE,\r\n 'showturtle': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_SHOW\r\n };\r\n return TOOLTIPS[mode];\r\n });\r\n }\r\n};\r\n\r\n\r\nexport const turtle_bgcolor = {\r\n init: function () {\r\n\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_bgcolor)\r\n .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_pencolor = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_pencolor)\r\n .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_fillcolor = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_fillcolor)\r\n .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_clone = {\r\n\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.TURTLE_CLONE);\r\n this.setTooltip(Blockly.Msg.TURTLE_CLONE_TOOLTIP);\r\n this.setOutput(true);\r\n }\r\n};\r\n\r\nexport const turtle_bgcolor_hex_new = {\r\n init: function () {\r\n\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_bgcolor);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_pencolor_hex_new = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_pencolor);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_fillcolor_hex_new = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_fillcolor);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_color = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_pencolor)\r\n .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME');\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.blockpy_turtle_fillcolor)\r\n .appendField(new Blockly.FieldColour('#ff0000'), 'FIELDNAME2');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_color_hex = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR1')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_pencolor);\r\n this.appendValueInput('VAR2')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_fillcolor);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_bgcolor_hex = {\r\n init: function () {\r\n\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_bgcolor_hex);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_pencolor_hex = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_pencolor_hex);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_fillcolor_hex = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_fillcolor_hex);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_shape = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n var shape = [\r\n [Blockly.Msg.blockpy_turtle_shape_arrow, 'arrow'], [Blockly.Msg.blockpy_turtle_shape_turtle, 'turtle'],\r\n [Blockly.Msg.blockpy_turtle_shape_circle, 'circle'], [Blockly.Msg.blockpy_turtle_shape_square, 'square'],\r\n [Blockly.Msg.blockpy_turtle_shape_triangle, 'triangle'], [Blockly.Msg.blockpy_turtle_shape_classic, 'classic']\r\n ];\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.blockpy_turtle_shape)\r\n .appendField(new Blockly.FieldDropdown(shape), 'DIR');\r\n\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TURTLE_SHAPE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_shapesize = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE);\r\n this.appendValueInput('WID')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_WID);\r\n this.appendValueInput('LEN')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_LEN);\r\n this.appendValueInput('OUTLINE')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_SHAPESIZE_OUTLINE);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SHAPESIZE);\r\n }\r\n};\r\n\r\nexport const turtle_numinput = {\r\n init: function () {\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_NUMINPUT)\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TITLE')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE);\r\n this.appendValueInput('PROMPT')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT);\r\n this.appendValueInput('DEFAULT')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.DICTS_DEFAULT_VALUE);\r\n this.appendValueInput('MIN')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MIN);\r\n this.appendValueInput('MAX')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MATH_ONLIST_OPERATOR_MAX);\r\n this.setInputsInline(true);\r\n this.setOutput(true, Number);\r\n this.setTooltip(Blockly.Msg.TURTLE_NUMINPUT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_textinput = {\r\n init: function () {\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT)\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TITLE')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_TITLE);\r\n this.appendValueInput('PROMPT')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_MIXPY_TURTLE_TEXTINPUT_PROMPT);\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n this.setTooltip(Blockly.Msg.TURTLE_TEXTINPUT_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_write = {\r\n init: function () {\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_write);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_write_format = {\r\n init: function () {\r\n var move =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']];\r\n var align =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']];\r\n var fonttype =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD_ITALIC, 'bold\",\"italic']];\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_write);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE)\r\n .appendField(new Blockly.FieldDropdown(move), 'MOVE');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN)\r\n .appendField(new Blockly.FieldDropdown(align), 'ALIGN');\r\n this.appendValueInput('FONTNAME')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME);\r\n this.appendValueInput('FONTNUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE)\r\n .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_write_format_skulpt = {\r\n init: function () {\r\n var move =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True']];\r\n var align =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_LEFT, 'left'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER, 'center'], [Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN_RIGHT, 'right']];\r\n var fonttype =\r\n [[Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_NORMAL, 'normal'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_BOLD, 'bold'], [Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE_ITALIC, 'italic']];\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('VAR')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.blockpy_turtle_write);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE)\r\n .appendField(new Blockly.FieldDropdown(move), 'MOVE');\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_ALIGN)\r\n .appendField(new Blockly.FieldDropdown(align), 'ALIGN');\r\n this.appendValueInput('FONTNAME')\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME);\r\n this.appendValueInput('FONTNUM')\r\n .setCheck(Number)\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_TYPE)\r\n .appendField(new Blockly.FieldDropdown(fonttype), 'FONTTYPE');\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.TURTLE_WRITE_TOOLTIP);\r\n }\r\n};\r\n\r\n\r\nexport const turtle_color_seclet = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendDummyInput(\"\")\r\n .setAlign(Blockly.inputs.Align.RIGHT)\r\n .appendField(new Blockly.FieldColour(\"ff0000\"), \"COLOR\");\r\n this.setInputsInline(true);\r\n this.setOutput(true, String);\r\n }\r\n};\r\n\r\nexport const turtle_getscreen = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendDummyInput(\"\")\r\n\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_GETSCREEN)\r\n .appendField(new Blockly.FieldTextInput('screen'), 'VAR')\r\n\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TURTEL_GETSCREEN_TOOLTIP);\r\n },\r\n getVars: function () {\r\n return [this.getFieldValue('VAR')];\r\n },\r\n renameVar: function (oldName, newName) {\r\n if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {\r\n this.setTitleValue(newName, 'VAR');\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const turtle_onkey = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY);\r\n this.appendValueInput('callback')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONKEY_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_onclick = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK);\r\n this.appendValueInput('callback')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONCLICK_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_ontimer = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n this.appendValueInput('VAR')\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER);\r\n this.appendDummyInput(\"\")\r\n .appendField(Blockly.Msg.MIXLY_mSecond);\r\n this.appendValueInput('callback')\r\n .appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE)\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setInputsInline(true);\r\n this.setTooltip(Blockly.Msg.MIXLY_TURTEL_EVENT_ONTIMER_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_listen = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_TURTEL_SCREEN_LISTEN);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};\r\n\r\nexport const turtle_screen_savefig = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n this.appendValueInput(\"FILE\")\r\n .setCheck(String)\r\n .appendField(Blockly.Msg.mixpy_PL_SAVEFIG);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setOutput(false);\r\n this.setTooltip(Blockly.Msg.mixpy_TURTLE_SAVEFIG_TOOLTIP);\r\n }\r\n};\r\n\r\nexport const turtle_stamp = {\r\n init: function () {\r\n this.setColour(TURTLE_HUE);\r\n this.appendValueInput('TUR')\r\n .setCheck('Turtle')\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.TURTLE_STAMP);\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n }\r\n};","import * as Blockly from 'blockly/core';\r\n\r\nexport const series_create = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + 'pandas.Series(' + varName1 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const series_create_from_index = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + 'pandas.Series(' + varName1 + ',' + 'index=' + varName2 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const dataframe_create = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const dataframe_create_from_index = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName2 = generator.valueToCode(this, 'INDEX_COLUMN', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var varName3 = generator.valueToCode(this, 'INDEX_RAW', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + 'columns=' + varName2 + ',index=' + varName3 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const dataframe_create_from_one_index = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var name = this.getFieldValue('COLUMN_RAW');\r\n var varName1 = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName2 = generator.valueToCode(this, 'INDEX', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + 'pandas.DataFrame(' + varName1 + ',' + name + '=' + varName2 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const series_create_from_text = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var text = this.getFieldValue('TEXT');\r\n var code = varName + ' = ' + 'pandas.Series([' + text + '])\\n';\r\n return code;\r\n}\r\n\r\nexport const series_index_value = function (_, generator) {\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var varName = generator.valueToCode(this, 'SERIES', generator.ORDER_ASSIGNMENT) || '0';\r\n var name = this.getFieldValue('INDEX_VALUE');\r\n var code = varName + '.' + name;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const series_get_num = function (_, generator) {\r\n // Indexing into a list is the same as indexing into a string.\r\n var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument0 = generator.valueToCode(this, 'AT',\r\n generator.ORDER_ADDITIVE) || '1';\r\n var code = varName + '[' + argument0 + ']';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const pl_show = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var code = 'pylab.show()\\n';\r\n return code;\r\n}\r\n\r\nexport const pl_axes = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var code = 'pylab.axes(aspect=1)\\n';\r\n return code;\r\n}\r\n\r\nexport const pl_plot_easy = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'pylab.plot(' + varName + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_plot = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var line = this.getFieldValue('LINE');\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'pylab.plot(' + varName + \",'\" + dot + line + color + \"')\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_legend = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n generator.definitions_.import_matplotlib_font_manager = \"import matplotlib.font_manager\";\r\n var code = 'pylab.legend(' + 'prop=matplotlib.font_manager.FontProperties(\"' + \"STSong\" + '\")' + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const pl_title = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC);\r\n var code = 'pylab.title(' + a + ', fontproperties = \"' + \"STSong\" + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const pl_label = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC);\r\n var code = 'pylab.' + direction + 'label(' + a + ', fontproperties = \"' + \"STSong\" + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const array_create = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n var from = generator.valueToCode(this, \"FROM\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"TO\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"STEP\", generator.ORDER_NONE) || \"1\";\r\n var code = \"numpy.arange(\" + from + \", \" + end + \", \" + step + \")\";\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const pl_plot_bar = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'pylab.' + direction + '(' + a + ',' + b + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_plot_scatter = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'pylab.scatter(' + a + ',' + b + \",s=\" + s + \",c='\" + color + \"',marker='\" + dot + \"',label=\" + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_plot_xy = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var line = this.getFieldValue('LINE');\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'pylab.plot(' + a + ',' + b + \",'\" + dot + line + color + \"'\" + ',label=' + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_bar = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0';\r\n var color = this.getFieldValue('COLOR')\r\n var align = this.getFieldValue('ALIGN');\r\n var code = 'pylab.bar(' + a + ',' + b + ',align=\"' + align + '\",color=\"' + color + '\",width=' + width + ',label=' + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_pie = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var shadow = this.getFieldValue('SHADOW');\r\n var autopct = this.getFieldValue('autopct');\r\n if (autopct != 'None') { autopct = \"'\" + autopct + \"'\" }\r\n var code = 'pylab.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_hist = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'pylab.hist(' + a + ',' + b + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_ticks = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'pylab.' + direction + 'ticks(' + a + ',' + b + \",fontproperties = '\" + \"STSong\" + \"')\\n\";\r\n return code;\r\n}\r\n\r\nexport const numpy_trig = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n var argument0 = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';\r\n var operator = this.getFieldValue('OP');\r\n var code = \"\";\r\n code = \"numpy.\" + operator + '(' + argument0 + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const pl_subplot = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n var from = generator.valueToCode(this, \"VET\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"HOR\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"NUM\", generator.ORDER_NONE) || \"0\";\r\n var code = \"pylab.subplot(\" + from + \", \" + end + \", \" + step + \")\\n\";\r\n return code\r\n}\r\n\r\nexport const pandas_readcsv = function (_, generator) {\r\n // For each loop.\r\n generator.definitions_.import_pandas = \"import pandas\";\r\n var fn = generator.valueToCode(this, 'FILENAME', generator.ORDER_ATOMIC);\r\n var mode = this.getFieldValue('MODE');\r\n var code = 'pandas.read_csv(' + fn + ', header=' + mode + ')\\n';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const dataframe_get = function (_, generator) {\r\n var mode = this.getFieldValue('MODE');\r\n var varName = generator.valueToCode(this, 'DICT', generator.ORDER_ASSIGNMENT) || '0';\r\n var text = generator.valueToCode(this, 'KEY', generator.ORDER_ASSIGNMENT);\r\n if (mode == \"column\") {\r\n var code = varName + \"[\" + text + \"]\";\r\n } else if (mode == 'raw') {\r\n var code = varName + \".loc[\" + text + \"]\";\r\n }\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const pl_savefig = function (_, generator) {\r\n generator.definitions_.import_pylab = \"import pylab\";\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = \"pylab.savefig(\" + file + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const pl_text = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n var from = generator.valueToCode(this, \"VET\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"HOR\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"NUM\", generator.ORDER_NONE) || \"0\";\r\n var halign = this.getFieldValue('HALIGN');\r\n var valign = this.getFieldValue('VALIGN');\r\n var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = \"pylab.text(\" + from + \", \" + end + \", \" + step + \", ha='\" + halign + \"', va='\" + valign + \"', fontsize=\" + fontnum + \")\\n\";\r\n return code\r\n}\r\n\r\nexport const array_toarray = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0';\r\n generator.definitions_['import_numpy'] = 'import numpy';\r\n var code = 'numpy.array(' + str + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const plot_show = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var code = 'matplotlib.pyplot.show()\\n';\r\n return code;\r\n}\r\n\r\nexport const plot_axes = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var code = 'matplotlib.pyplot.axes(aspect=1)\\n';\r\n return code;\r\n}\r\n\r\nexport const plot_plot_easy = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'matplotlib.pyplot.plot(' + varName + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_plot = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var line = this.getFieldValue('LINE');\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var varName = generator.valueToCode(this, 'SER', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = 'matplotlib.pyplot.plot(' + varName + \",'\" + dot + line + color + \"')\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_legend = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n generator.definitions_.import_matplotlib_font_manager = \"import matplotlib.font_manager\";\r\n var code = 'matplotlib.pyplot.legend(' + 'prop=matplotlib.font_manager.FontProperties(\"' + \"STSong\" + '\")' + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const plot_title = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC);\r\n var code = 'matplotlib.pyplot.title(' + a + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const plot_label = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'LABEL', generator.ORDER_ATOMIC);\r\n var code = 'matplotlib.pyplot.' + direction + 'label(' + a + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const plot_plot_bar = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'matplotlib.pyplot.' + direction + '(' + a + ',' + b + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_plot_scatter = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var s = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'matplotlib.pyplot.scatter(' + a + ',' + b + \",s=\" + s + \",color='\" + color + \"',marker='\" + dot + \"',label=\" + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_plot_xy = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var line = this.getFieldValue('LINE');\r\n var color = this.getFieldValue('COLOR');\r\n var dot = this.getFieldValue('DOT');\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'matplotlib.pyplot.plot(' + a + ',' + b + \",'\" + dot + line + color + \"'\" + ',label=' + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_bar = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_RELATIONAL) || '0';\r\n var color = this.getFieldValue('COLOR')\r\n var align = this.getFieldValue('ALIGN');\r\n var code = 'matplotlib.pyplot.bar(' + a + ',' + b + ',align=\"' + align + '\",color=\"' + color + '\",width=' + width + ',label=' + tag + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_pie = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var explode = generator.valueToCode(this, 'EXPLODE', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var shadow = this.getFieldValue('SHADOW');\r\n var autopct = this.getFieldValue('autopct');\r\n if (autopct != 'None') { autopct = \"'\" + autopct + \"'\" }\r\n var code = 'matplotlib.pyplot.pie(' + a + ',explode=' + explode + ',labels=' + b + ',autopct=' + autopct + ',shadow=' + shadow + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_hist = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'matplotlib.pyplot.hist(' + a + ',' + b + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_ticks = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var direction = this.getFieldValue('DIR');\r\n var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || '\\'\\'';\r\n var code = 'matplotlib.pyplot.' + direction + 'ticks(' + a + ',' + b + \",fontproperties = '\" + \"STSong\" + \"')\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_subplot = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var from = generator.valueToCode(this, \"VET\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"HOR\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"NUM\", generator.ORDER_NONE) || \"0\";\r\n var code = \"matplotlib.pyplot.subplot(\" + from + \", \" + end + \", \" + step + \")\\n\";\r\n return code\r\n}\r\n\r\nexport const plot_savefig = function (_, generator) {\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var code = \"matplotlib.pyplot.savefig('1.png')\\n\";\r\n return code;\r\n}\r\n\r\nexport const plot_text = function (_, generator) {\r\n generator.definitions_.import_numpy = \"import numpy\";\r\n generator.definitions_.import_matplotlib_pyplot = \"import matplotlib.pyplot\";\r\n var from = generator.valueToCode(this, \"VET\", generator.ORDER_NONE) || \"0\";\r\n var end = generator.valueToCode(this, \"HOR\", generator.ORDER_NONE) || \"0\";\r\n var step = generator.valueToCode(this, \"NUM\", generator.ORDER_NONE) || \"0\";\r\n var halign = this.getFieldValue('HALIGN');\r\n var valign = this.getFieldValue('VALIGN');\r\n var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = \"matplotlib.pyplot.text(\" + from + \", \" + end + \", \" + step + \", ha='\" + halign + \"', va='\" + valign + \"', fontsize=\" + fontnum + \")\\n\";\r\n return code\r\n}","export const inout_input = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n return ['input(' + str + ')', generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const inout_print = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var code = \"print(\" + str + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const inout_print_inline = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var code = \"print(\" + str + ',end =\"\")\\n';\r\n return code;\r\n}\r\n\r\nexport const inout_print_end = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var end = generator.valueToCode(this, 'END', generator.ORDER_ATOMIC) || '\"\"';\r\n var code = \"print(\" + str + ',end =' + end + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const inout_type_input = function (_, generator) {\r\n var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '\"\"';\r\n var type = this.getFieldValue('DIR');\r\n if (type == 'str') { var code = 'input(' + str + ')' }\r\n else if (type == 'int') { var code = 'int(input(' + str + '))' }\r\n else if (type == 'float') { var code = 'float(input(' + str + '))' }\r\n //var code=varname+\".\" + type + \"(\" + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const inout_print_many = function (_, generator) {\r\n var code = new Array(this.itemCount_);\r\n var default_value = '0';\r\n for (var n = 0; n < this.itemCount_; n++) {\r\n code[n] = generator.valueToCode(this, 'ADD' + n,\r\n generator.ORDER_NONE) || default_value;\r\n }\r\n var code = 'print(' + code.join(', ') + ')\\n';\r\n return code;\r\n}","export const controls_millis = function (_, generator) {\r\n generator.definitions_.import_time = \"import time\";\r\n var code = 'time.time()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const controls_end_program = function () {\r\n return 'exit()\\n';\r\n}\r\n\r\nexport const time_localtime = function (_, generator) {\r\n generator.definitions_.import_time = \"import time\";\r\n var op = this.getFieldValue('op');\r\n var code = \"time.localtime()[\" + op + \"]\";\r\n switch (op) {\r\n case \"all\":\r\n var code1 = \"time.localtime()\";\r\n return [code1, generator.ORDER_ASSIGNMENT];\r\n default:\r\n return [code, generator.ORDER_ASSIGNMENT];\r\n }\r\n}","import * as Blockly from 'blockly/core';\r\n\r\nexport const turtle_create = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n //var size=window.parseFloat(this.getFieldValue('SIZE'));\r\n //generator.definitions_['var_declare'+varName] = varName+'= '+ 'turtle.Turtle()\\n';\r\n var code = varName + ' = ' + 'turtle.Turtle()\\n';\r\n return code;\r\n // return '';\r\n}\r\n\r\nexport const turtle_done = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var code = 'turtle.done()\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_exitonclick = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var code = 'turtle.exitonclick()\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_move = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var direction = this.getFieldValue('DIR');\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + direction + \"(\" + num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_rotate = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var direction = this.getFieldValue('DIR');\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + direction + \"(\" + num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_setheading = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.setheading(' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_screen_delay = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.screen.delay(' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_goto = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var xnum = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var ynum = generator.valueToCode(this, 'val', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.goto(' + xnum + ',' + ynum + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_pos_shape = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var get = this.getFieldValue('DIR');\r\n var code = varName + '.' + get + '()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const turtle_clear = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var clear = this.getFieldValue('DIR');\r\n var code = varName + \".\" + clear + \"(\" + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_penup = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var penup = this.getFieldValue('DIR');\r\n var code = varName + \".\" + penup + \"(\" + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_fill = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var penup = this.getFieldValue('DIR');\r\n var code = varName + \".\" + penup + \"_fill(\" + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_size_speed = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = this.getFieldValue('TUR');\r\n var size = this.getFieldValue('DIR');\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + size + \"(\" + num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_size = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.pensize(' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_speed = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.speed(' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_circle = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var circle = this.getFieldValue('DIR');\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + circle + \"(\" + num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_setxy = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var xy = this.getFieldValue('DIR');\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".set\" + xy + \"(\" + num + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_circle_advanced = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var num = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".circle (\" + num + ',' + argument + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_visible = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var visible = this.getFieldValue('DIR');\r\n var code = varName + \".\" + visible + \"(\" + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_bgcolor = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var color = this.getFieldValue('FIELDNAME');\r\n var code = \"turtle.\" + 'bgcolor' + '(\"' + color + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_pencolor = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = this.getFieldValue('FIELDNAME');\r\n var code = varName + \".\" + 'pencolor' + '(\"' + color + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_fillcolor = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = this.getFieldValue('FIELDNAME');\r\n var code = varName + \".\" + 'fillcolor' + '(\"' + color + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_clone = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.clone()';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const turtle_bgcolor_hex = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = \"turtle.\" + 'bgcolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_pencolor_hex = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".\" + 'pencolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_fillcolor_hex = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + 'fillcolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_bgcolor_hex_new = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = \"turtle.\" + 'bgcolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_pencolor_hex_new = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".\" + 'pencolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_fillcolor_hex_new = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + 'fillcolor' + '(' + color + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_color_hex = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);\r\n var color2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + 'color' + '(' + color1 + ',' + color2 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_color = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var color1 = this.getFieldValue('FIELDNAME');\r\n var color2 = this.getFieldValue('FIELDNAME2');\r\n var code = varName + \".\" + 'color' + '(\"' + color1 + '\",\"' + color2 + '\")\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_shape = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var direction = this.getFieldValue('DIR');\r\n\r\n var code = varName + \".shape('\" + direction + \"')\\n\";\r\n return code;\r\n}\r\n\r\nexport const turtle_shapesize = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument1 = generator.valueToCode(this, 'WID', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument2 = generator.valueToCode(this, 'LEN', generator.ORDER_ASSIGNMENT) || '0';\r\n var argument3 = generator.valueToCode(this, 'OUTLINE', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".shapesize(\" + argument1 + ',' + argument2 + ',' + argument3 + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_textinput = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC);\r\n var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC);\r\n var code = \"turtle.textinput\" + '(' + title + ',' + prompt + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const turtle_numinput = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var title = generator.valueToCode(this, 'TITLE', generator.ORDER_ATOMIC);\r\n var prompt = generator.valueToCode(this, 'PROMPT', generator.ORDER_ATOMIC);\r\n var data = generator.valueToCode(this, 'DEFAULT', generator.ORDER_ATOMIC);\r\n var min = generator.valueToCode(this, 'MIN', generator.ORDER_ATOMIC);\r\n var max = generator.valueToCode(this, 'MAX', generator.ORDER_ATOMIC);\r\n var code = \"turtle.numinput\" + '(' + title + ',' + prompt + \",\" + data + ',minval = ' + min + ',maxval = ' + max + ')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const turtle_write = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n //var color = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + \".\" + 'write' + '(' + write + ')\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_write_format = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var move = this.getFieldValue('MOVE');\r\n var align = this.getFieldValue('ALIGN');\r\n var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC);\r\n var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0';\r\n var fonttype = this.getFieldValue('FONTTYPE');\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + 'write' + '(' + write + ',' + move + ',align=\"' + align + '\",font=(' + fontname + ',' + fontnum + ',\"' + fonttype + '\"))\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_write_format_skulpt = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var move = this.getFieldValue('MOVE');\r\n var align = this.getFieldValue('ALIGN');\r\n var fontname = generator.valueToCode(this, 'FONTNAME', generator.ORDER_ATOMIC);\r\n var fontnum = generator.valueToCode(this, 'FONTNUM', generator.ORDER_ASSIGNMENT) || '0';\r\n var fonttype = this.getFieldValue('FONTTYPE');\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var write = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);\r\n var code = varName + \".\" + 'write' + '(' + write + ',' + move + ',align=\"' + align + '\",font=(' + fontname + ',' + fontnum + ',\"' + fonttype + '\"))\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_color_seclet = function (_, generator) {\r\n var colour = this.getFieldValue('COLOR');\r\n var code = '\"' + colour + '\"'\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const turtle_getscreen = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var turName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),\r\n Blockly.Variables.NAME_TYPE);\r\n var code = varName + ' = ' + turName + '.getscreen()\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_onkey = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var v = generator.valueToCode(this, \"VAR\", generator.ORDER_NONE) || \"None\";\r\n var callback = generator.valueToCode(this, \"callback\", generator.ORDER_NONE) || \"None\";\r\n var code = varName + \".onkey(\" + callback + \", \" + v + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const turtle_onclick = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var callback = generator.valueToCode(this, \"callback\", generator.ORDER_NONE) || \"None\";\r\n var code = varName + \".onclick(\" + callback + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const turtle_ontimer = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var v = generator.valueToCode(this, \"VAR\", generator.ORDER_NONE) || \"None\";\r\n var callback = generator.valueToCode(this, \"callback\", generator.ORDER_NONE) || \"None\";\r\n var code = varName + \".ontimer(\" + callback + \", \" + v + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const turtle_listen = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.listen()\\n';\r\n return code;\r\n}\r\n\r\nexport const turtle_screen_savefig = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC);\r\n var code = varName + \".getcanvas().postscript(file=\" + file + \")\\n\";\r\n return code;\r\n}\r\n\r\nexport const turtle_stamp = function (_, generator) {\r\n generator.definitions_.import_turtle = \"import turtle\";\r\n var varName = generator.valueToCode(this, 'TUR', generator.ORDER_ASSIGNMENT) || '0';\r\n var code = varName + '.stamp()\\n';\r\n return code;\r\n}","import * as Blockly from 'blockly/core';\r\n\r\n//初始化地图为第1关\r\nexport const initSettedMap_1 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第一关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第2关\r\nexport const initSettedMap_2 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第二关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第3关\r\nexport const initSettedMap_3 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第三关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第4关\r\nexport const initSettedMap_4 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第四关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第5关\r\nexport const initSettedMap_5 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第五关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第6关\r\nexport const initSettedMap_6 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第六关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\n//初始化地图为第7关\r\nexport const initSettedMap_7 = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"初始化地图为第七关\")\r\n this.setInputsInline(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const game_init = {\r\n init: function () {\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.appendStatementInput('DO0')\r\n .appendField(Blockly.Msg.MIXLY_GAME_INIT);\r\n }\r\n};\r\n\r\n\r\nexport const move_direction_steps = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"向\")\r\n .appendField(new Blockly.FieldDropdown([[\"东\", '1'], [\"南\", '2'], [\"西\", '3'], [\"北\", '0']]), \"direction\");\r\n this.appendDummyInput()\r\n .appendField(\"移动\");\r\n this.appendValueInput(\"times\")\r\n .setCheck(Number)\r\n this.appendDummyInput()\r\n .appendField(\"步\");\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const Turn = {\r\n init: function () {\r\n var Directions = [\r\n [Blockly.Msg.MIXLY_GAME_Turn_LEFT, 'left'],\r\n [Blockly.Msg.MIXLY_GAME_Turn_RIGHT, 'right']\r\n ];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GAME_TURN1)\r\n .appendField(new Blockly.FieldDropdown(Directions), 'Direction')\r\n .appendField(Blockly.Msg.MIXLY_GAME_TURN2);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const isDone = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GAME_ISDONE);\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const isPath = {\r\n init: function () {\r\n var Directions = [\r\n [Blockly.Msg.MIXLY_GAME_ISPATH_LEFT, 'left'],\r\n [Blockly.Msg.MIXLY_GAME_ISPATH_RIGHT, 'right']\r\n ];\r\n this.appendDummyInput()\r\n .appendField(Blockly.Msg.MIXLY_GAME_ISPATH1)\r\n .appendField(new Blockly.FieldDropdown(Directions), 'Direction')\r\n .appendField(Blockly.Msg.MIXLY_GAME_ISPATH2);\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\n//最新块\r\nexport const set_map = {\r\n init: function () {\r\n // this.appendDummyInput()\r\n // .appendField(\"设置地图:长\");\r\n this.appendValueInput(\"x\")\r\n .setCheck(Number)\r\n .appendField(\"设置地图,长为:\");\r\n this.appendValueInput(\"y\")\r\n .setCheck(Number)\r\n .appendField(\"宽为:\");\r\n this.appendValueInput(\"startPos\")\r\n .setCheck(null)\r\n .appendField(\",起点坐标\");\r\n this.appendValueInput(\"endPos\")\r\n .setCheck(null)\r\n .appendField(\"终点坐标\");\r\n this.appendValueInput(\"background\")\r\n .setCheck(null)\r\n .appendField(\"背景\");\r\n // this.appendDummyInput()\r\n // .appendField(\",背景\")\r\n // .appendField(new Blockly.FieldDropdown([[\"背景1\",\"3\"],[\"背景2\",\"4\"]]), \"bg\");\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const game_get_local_img = {\r\n init: function () {\r\n this.imgArr = this.getLocalImg();\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown(this.getLocalImg()), \"type\");\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n },\r\n onchange: function () {\r\n let typeValue = this.getFieldValue(\"type\");\r\n //let newImgArr = this.getLocalImg();\r\n let newImgArr = this.imgArr;\r\n if (this.haveNewSrc(this.imgArr, newImgArr)) {\r\n this.imgArr = newImgArr;\r\n var typeField = this.getField(\"type\");\r\n typeField.menuGenerator_ = this.imgArr;\r\n if (this.checkSrc(typeValue, this.imgArr)) {\r\n this.setFieldValue(typeValue, \"type\");\r\n } else {\r\n this.setFieldValue(this.imgArr[0][1], \"type\");\r\n }\r\n }\r\n },\r\n haveNewSrc: function (oldArr, newArr) {\r\n if (oldArr.length !== newArr.length) return true;\r\n for (var i = 0; i < oldArr.length; i++) {\r\n if (oldArr[i][0].src !== newArr[i][0].src) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n checkSrc: function (newSrc, srcArr) {\r\n for (var i = 0; i < srcArr.length; i++) {\r\n if (srcArr[i][0].src == newSrc) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n getLocalImg: function () {\r\n let imgArr = [];\r\n try {\r\n var imgDirArr = [\"bg_default.png\", \"bg_astro.png\", \"bg_panda.jpg\"]\r\n for (var i = 0; i < imgDirArr.length; i++) {\r\n var dropdownItem = {};\r\n dropdownItem.src = \"./media/mixpyBuild/maps/\" + imgDirArr[i];\r\n dropdownItem.width = 40;\r\n dropdownItem.height = 45;\r\n if (imgDirArr[i] == \"\") {\r\n dropdownItem.alt = \"无\";\r\n } else {\r\n dropdownItem.alt = \"*\";\r\n }\r\n var dropdownArr = [];\r\n dropdownArr.push(dropdownItem);\r\n var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(\".\"));\r\n dropdownData = '\\'' + dropdownData + '\\'';\r\n dropdownArr.push(dropdownData);\r\n imgArr.push(dropdownArr);\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n imgArr = [[\"'无可用地图'\", \"'无可用地图'\"]];\r\n }\r\n if (imgArr.length > 0) {\r\n return imgArr;\r\n }\r\n return [[\"'无可用地图'\", \"'无可用地图'\"]];\r\n }\r\n};\r\n\r\n\r\nexport const set_pathtype = {\r\n init: function () {\r\n this.appendValueInput(\"pathtype\")\r\n .setCheck(null)\r\n .appendField(\"设置路径样式为\");\r\n this.setInputsInline(true);\r\n this.setPreviousStatement(true, null);\r\n this.setNextStatement(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const game_get_path_img = {\r\n init: function () {\r\n this.imgArr = this.getLocalImg();\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown(this.getLocalImg()), \"type\");\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n },\r\n onchange: function () {\r\n let typeValue = this.getFieldValue(\"type\");\r\n //let newImgArr = this.getLocalImg();\r\n let newImgArr = this.imgArr;\r\n if (this.haveNewSrc(this.imgArr, newImgArr)) {\r\n this.imgArr = newImgArr;\r\n var typeField = this.getField(\"type\");\r\n typeField.menuGenerator_ = this.imgArr;\r\n if (this.checkSrc(typeValue, this.imgArr)) {\r\n this.setFieldValue(typeValue, \"type\");\r\n } else {\r\n this.setFieldValue(this.imgArr[0][1], \"type\");\r\n }\r\n }\r\n },\r\n haveNewSrc: function (oldArr, newArr) {\r\n if (oldArr.length !== newArr.length) return true;\r\n for (var i = 0; i < oldArr.length; i++) {\r\n if (oldArr[i][0].src !== newArr[i][0].src) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n checkSrc: function (newSrc, srcArr) {\r\n for (var i = 0; i < srcArr.length; i++) {\r\n if (srcArr[i][0].src == newSrc) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n getLocalImg: function () {\r\n let imgArr = [];\r\n try {\r\n var imgDirArr = [\"default.png\", \"bamboo.png\", \"pipeline.png\"]\r\n for (var i = 0; i < imgDirArr.length; i++) {\r\n var dropdownItem = {};\r\n dropdownItem.src = \"./media/mixpyBuild/path/\" + imgDirArr[i];\r\n dropdownItem.width = 40;\r\n dropdownItem.height = 45;\r\n dropdownItem.alt = \"*\";\r\n var dropdownArr = [];\r\n dropdownArr.push(dropdownItem);\r\n var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(\".\"));\r\n dropdownData = '\\'' + dropdownData + '\\'';\r\n dropdownArr.push(dropdownData);\r\n imgArr.push(dropdownArr);\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n imgArr = [[\"'无可用路径'\", \"'无可用路径'\"]];\r\n }\r\n if (imgArr.length > 0) {\r\n return imgArr;\r\n }\r\n return [[\"'无可用路径'\", \"'无可用路径'\"]];\r\n }\r\n};\r\n\r\nexport const place_item = {\r\n init: function () {\r\n this.setColour(290);\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.appendValueInput(\"posx\")\r\n .setCheck(null)\r\n .appendField(\"在(\");\r\n this.appendDummyInput()\r\n .appendField(',');\r\n this.appendValueInput(\"posy\")\r\n .setCheck(null)\r\n .appendField(\"\");\r\n this.appendDummyInput()\r\n .appendField(')放置')\r\n .appendField(new Blockly.FieldDropdown([[\"障碍\", \"'wall'\"], [\"金币\", \"'coin'\"]]), \"item\");\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const game_get_character_img = {\r\n init: function () {\r\n this.imgArr = this.getLocalImg();\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown(this.getLocalImg()), \"type\");\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n },\r\n onchange: function () {\r\n let typeValue = this.getFieldValue(\"type\");\r\n //let newImgArr = this.getLocalImg();\r\n let newImgArr = this.imgArr;\r\n if (this.haveNewSrc(this.imgArr, newImgArr)) {\r\n this.imgArr = newImgArr;\r\n var typeField = this.getField(\"type\");\r\n typeField.menuGenerator_ = this.imgArr;\r\n if (this.checkSrc(typeValue, this.imgArr)) {\r\n this.setFieldValue(typeValue, \"type\");\r\n } else {\r\n this.setFieldValue(this.imgArr[0][1], \"type\");\r\n }\r\n }\r\n },\r\n haveNewSrc: function (oldArr, newArr) {\r\n if (oldArr.length !== newArr.length) return true;\r\n for (var i = 0; i < oldArr.length; i++) {\r\n if (oldArr[i][0].src !== newArr[i][0].src) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n checkSrc: function (newSrc, srcArr) {\r\n for (var i = 0; i < srcArr.length; i++) {\r\n if (srcArr[i][0].src == newSrc) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n getLocalImg: function () {\r\n let imgArr = [];\r\n try {\r\n var imgDirArr = [\"pegman.png\", \"astro.png\", \"panda.png\", \"robot.png\"]\r\n for (var i = 0; i < imgDirArr.length; i++) {\r\n var dropdownItem = {};\r\n dropdownItem.src = \"./media/mixpyBuild/characters/\" + imgDirArr[i];\r\n dropdownItem.width = 40;\r\n dropdownItem.height = 45;\r\n dropdownItem.alt = \"*\";\r\n var dropdownArr = [];\r\n dropdownArr.push(dropdownItem);\r\n var dropdownData = imgDirArr[i].substring(0, imgDirArr[i].lastIndexOf(\".\"));\r\n dropdownData = '\\'' + dropdownData + '\\'';\r\n dropdownArr.push(dropdownData);\r\n imgArr.push(dropdownArr);\r\n }\r\n\r\n\r\n } catch (e) {\r\n console.log(e);\r\n imgArr = [[\"'无可用角色'\", \"'无可用角色'\"]];\r\n }\r\n if (imgArr.length > 0) {\r\n return imgArr;\r\n }\r\n return [[\"'无可用角色'\", \"'无可用角色'\"]];\r\n }\r\n};\r\n\r\n\r\nexport const initialize = {\r\n init: function () {\r\n this.setColour(290);\r\n this.appendValueInput(\"character\")\r\n .setCheck(null)\r\n .appendField(\"初始化角色为\");\r\n this.appendDummyInput()\r\n // .appendField('初始化角色为')\r\n // .appendField(new Blockly.FieldDropdown([[\"默认⼩⼈\",\"0\"],[\"熊猫\",\"1\"],[\"宇航员\",\"2\"],[\"机器⼈\",\"3\"]]), \"character\")\r\n .appendField('面朝')\r\n .appendField(new Blockly.FieldDropdown([[\"北\", \"0\"], [\"南\", \"2\"], [\"西\", \"3\"], [\"东\", \"1\"]]), \"direction\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const get_actor_point = {\r\n init: function () {\r\n this.setColour(290);\r\n this.appendDummyInput()\r\n .appendField('获取⻆⾊所获分数');\r\n this.setOutput(true, Number);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const isBarrier = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(new Blockly.FieldDropdown([[\"北\", \"0\"], [\"南\", \"2\"], [\"西\", \"3\"], [\"东\", \"1\"]]), \"direction\");\r\n this.appendDummyInput()\r\n .appendField('侧有障碍');\r\n this.setInputsInline(true);\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const randomOil = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"随机生成小车油量\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const isOilFull = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField('需要加油');\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const isLightGreen = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField('信号灯为绿灯');\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const isLightRed = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField('信号灯为红灯');\r\n this.setOutput(true, null);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n this.setHelpUrl('');\r\n }\r\n};\r\n\r\nexport const addOil = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"进加油站加油\");\r\n this.setPreviousStatement(true);\r\n this.setNextStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};\r\n\r\nexport const isCirculationRight = {\r\n init: function () {\r\n this.appendDummyInput()\r\n .appendField(\"检查程序循环数目是否正确\");\r\n this.setPreviousStatement(true);\r\n this.setColour(290);\r\n this.setTooltip('');\r\n }\r\n};","export const game_init = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = generator.statementToCode(block, \"DO0\") + 'blocklygame.initMap(\\'block_id=' + block.id + '\\');\\n'\r\n\r\n var code_piece = [];\r\n code_piece = code.split(\"\\n\");\r\n for (var i = 0; i < code_piece.length; i++) {\r\n if ((code_piece[i].indexOf(\" \") >= 0)) {\r\n code_piece[i] = code_piece[i].replace(\" \", \"\");\r\n }\r\n }\r\n code = \"\"\r\n for (var i = 0; i < code_piece.length; i++) {\r\n code += code_piece[i] + '\\n'\r\n }\r\n return code;\r\n}\r\n\r\n// export const move_direction = function(block) {\r\n// generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n// var Direction = this.getFieldValue('direction');\r\n// return 'actor.moveDirection('+Direction+',\\'block_id=' + block.id + '\\');\\n';\r\n// }\r\n\r\nexport const move_direction_steps = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var times = generator.valueToCode(this, 'times', generator.ORDER_ATOMIC);\r\n var Direction = this.getFieldValue('direction');\r\n var d = 'actor.moveDirection(' + Direction + ',\\'block_id=' + block.id + '\\');\\n',\r\n d = generator.addLoopTrap(d, block.id) || generator.PASS;\r\n return 'for _my_variable in range(' + times + '):\\n\\t' + d;\r\n}\r\n\r\nexport const initSettedMap_1 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(0,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\nexport const initSettedMap_2 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(1,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\nexport const initSettedMap_3 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(2,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\nexport const initSettedMap_4 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(3,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n' + 'actor.randomOil(\\'block_id=' + block.id + '\\');\\n';\r\n}\r\n\r\nexport const initSettedMap_5 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(4,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\nexport const initSettedMap_6 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(5,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\nexport const initSettedMap_7 = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'blocklygame.settedMap(6,\\'block_id=' + block.id + '\\');\\n' + 'actor=blocklygame.Actor(\\'car\\',2);\\n';\r\n}\r\n\r\n// export const move_forward = function(block) {\r\n// generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n// return 'actor.moveForward(\\'block_id=' + block.id + '\\');\\n';\r\n// }\r\n\r\n// export const move_backward = function(block) {\r\n// generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n// var code = 'actor.moveBackward(\\'block_id=' + block.id + '\\');\\n';\r\n// return code;\r\n// }\r\n\r\nexport const Turn = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var dropdown_Direction = this.getFieldValue('Direction');\r\n var code = 'actor.turn(\\'' + dropdown_Direction + \"','block_id=\" + block.id + '\\');\\n';\r\n return code;\r\n}\r\n\r\nexport const isDone = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.isDone(\\'block_id=' + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const isPath = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var dropdown_Direction = this.getFieldValue('Direction');\r\n var code = 'actor.isPath(\\'' + dropdown_Direction + \"','block_id=\" + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\n// 从这里开始是新的块\r\nexport const get_actor_point = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.getPoint(\\'block_id=' + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const game_get_local_img = function (_, generator) {\r\n var dropdown_type = this.getFieldValue('type');\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = dropdown_type;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_map = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var value_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);\r\n var value_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);\r\n var startPos = generator.valueToCode(this, 'startPos', generator.ORDER_ATOMIC);\r\n var endPos = generator.valueToCode(this, 'endPos', generator.ORDER_ATOMIC);\r\n var bg_pic = generator.valueToCode(this, 'background', generator.ORDER_ATOMIC);\r\n\r\n return 'blocklygame.setMap(' + value_x + ',' + value_y + ',' + startPos + ',' + endPos + ',' + bg_pic + \",'block_id=\" + block.id + '\\');\\n';\r\n}\r\n\r\nexport const game_get_character_img = function (_, generator) {\r\n var dropdown_type = this.getFieldValue('type');\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = dropdown_type;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const initialize = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n // var value_character = this.getFieldValue('character');\r\n var value_direction = this.getFieldValue('direction');\r\n var value_character = generator.valueToCode(this, 'character', generator.ORDER_ATOMIC);\r\n return 'actor=blocklygame.Actor(' + value_character + ',' + value_direction + \",'block_id=\" + block.id + '\\');\\n';\r\n}\r\n\r\nexport const place_item = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var value_posx = generator.valueToCode(this, 'posx', generator.ORDER_ATOMIC);\r\n var value_posy = generator.valueToCode(this, 'posy', generator.ORDER_ATOMIC);\r\n var value_item = this.getFieldValue('item');\r\n return 'blocklygame.placeItem(' + value_posx + ',' + value_posy + ',' + value_item + \",'block_id=\" + block.id + '\\');\\n';\r\n}\r\n\r\nexport const game_get_path_img = function (_, generator) {\r\n var dropdown_type = this.getFieldValue('type');\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = dropdown_type;\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const set_pathtype = function (block, generator) {\r\n generator.definitions_['import_blocklygame'] = 'import blocklygame';\r\n var path_type = generator.valueToCode(this, 'pathtype', generator.ORDER_ATOMIC);\r\n return 'blocklygame.setPathType(' + path_type + \",'block_id=\" + block.id + '\\');\\n';\r\n // return 'actor.getPoint();\\n';\r\n}\r\n\r\nexport const isBarrier = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var dropdown_Direction = this.getFieldValue('direction');\r\n var code = 'actor.isBarrier(' + dropdown_Direction + \",'block_id=\" + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const randomOil = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n return 'actor.randomOil(\\'block_id=' + block.id + '\\');\\n';\r\n}\r\n\r\nexport const isOilFull = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.isOilFull(\\'block_id=' + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const isLightGreen = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.isLightGreen(\\'block_id=' + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const isLightRed = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'not actor.isLightGreen(\\'block_id=' + block.id + '\\')';\r\n return [code, generator.ORDER_ATOMIC];\r\n}\r\n\r\nexport const addOil = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.addOil(\\'block_id=' + block.id + '\\');\\n';\r\n return code;\r\n}\r\n\r\nexport const isCirculationRight = function (block, generator) {\r\n generator.definitions_.import_blocklygame = \"import blocklygame\";\r\n var code = 'actor.isCirculationRight(\\'block_id=' + block.id + '\\');\\n';\r\n return code;\r\n}","import NavExt from './nav-ext';\r\n\r\nNavExt.init();","export default class MixpyProject {\r\n constructor() {\r\n this.initProject();\r\n }\r\n\r\n initProject() {\r\n this.fileD = {};\r\n this.MAINF = 'main.py';\r\n this.fileD[this.MAINF] = [\"\", true, 1];\r\n this.selectFile = this.MAINF;\r\n }\r\n\r\n add(file, filecontent, filetype) {\r\n if (this.exist(file)) {\r\n console.log(\"Warning:file already in project\");\r\n return;\r\n }\r\n this.fileD[file] = [filecontent, false, filetype];\r\n }\r\n\r\n delete(file) {\r\n delete this.fileD[file];\r\n this.selectFile = undefined;\r\n }\r\n\r\n getProject() {\r\n return Object.keys(this.fileD);\r\n }\r\n\r\n getUploadFileList() {\r\n var fileNameList = Object.keys(this.fileD);\r\n var ret = [];\r\n for (var i in fileNameList) {\r\n if (this.fileD[fileNameList[i]][2] === 2)\r\n ret.push(fileNameList[i]);\r\n }\r\n return ret;\r\n }\r\n\r\n getNewFileList() {\r\n var fileNameList = Object.keys(this.fileD);\r\n var ret = [];\r\n for (var i in fileNameList) {\r\n if (this.fileD[fileNameList[i]][2] === 1)\r\n ret.push(fileNameList[i]);\r\n }\r\n return ret;\r\n }\r\n\r\n isSelect(f) {\r\n return this.fileD[f][1];\r\n }\r\n\r\n select(f) {\r\n // if (this.selectFile !== undefined) {\r\n // this.modify(this.selectFile, mixlyjs.getCodeContent());\r\n // this.fileD[this.selectFile][1] = false;\r\n // }\r\n this.fileD[f][1] = true;\r\n // this.selectFile = f;\r\n // var suffix = mixlyjs.getFileSuffix(f);\r\n // var textFileSuffix = [\"py\", \"txt\", \"csv\", \"xml\"];\r\n // if (textFileSuffix.indexOf(suffix) !== -1) {\r\n // tabClick('arduino');\r\n // mixlyjs.renderIno(this.fileD[f][0]);\r\n // } else {\r\n // var base64str = 'data:image/' + suffix + ';base64,' + this.fileD[f][0];\r\n // $('#mixpy_show_image').attr('src', base64str);\r\n // mixlyjs.renderIno(this.fileD[f][0]);\r\n // tabClick('image');\r\n // var $imageA = $('#mixpy_link_image');\r\n // $imageA.attr('href', base64str);\r\n // $imageA.attr('download', f);\r\n // }\r\n }\r\n\r\n getFileNum() {\r\n var files = Object.keys(this.fileD);\r\n return files.length;\r\n }\r\n\r\n getFileContent(f) {\r\n return this.fileD[f][0];\r\n }\r\n\r\n getFileType(f) {\r\n return this.fileD[f][2];\r\n }\r\n\r\n modify(f, content) {\r\n this.fileD[f][0] = content;\r\n }\r\n\r\n exist(f) {\r\n return f in this.fileD;\r\n }\r\n}","import $ from 'jquery';\r\nimport * as Blockly from 'blockly/core';\r\nimport {\r\n app,\r\n Nav,\r\n Debug,\r\n HTMLTemplate,\r\n Msg,\r\n Workspace,\r\n Storage\r\n} from 'mixly';\r\nimport PythonShell from './python-shell';\r\nimport LEVEL_SELECTOR_TEMPLATE from '../templates/html/level-selector.html';\r\n\r\n\r\nconst NavExt = {};\r\nconst LEVELS = [\r\n `\r\n \r\n `,\r\n `\r\n \r\n `,\r\n `\r\n \r\n `,\r\n `\r\n \r\n `,\r\n `\r\n \r\n `,\r\n `\r\n \r\n `,\r\n `\r\n \r\n `\r\n];\r\nNavExt.$shadow = $('
');\r\nNavExt.count = 0;\r\n\r\nNavExt.init = function () {\r\n PythonShell.init();\r\n const nav = app.getNav();\r\n\r\n nav.register({\r\n icon: 'icon-play-circled',\r\n title: '',\r\n id: 'python-steprun-btn',\r\n displayText: Blockly.Msg.MSG['step_run'],\r\n preconditionFn: () => {\r\n return true;\r\n },\r\n callback: () => {\r\n PythonShell.steprun().catch(Debug.error);\r\n },\r\n scopeType: Nav.Scope.LEFT,\r\n weight: 4\r\n });\r\n\r\n nav.register({\r\n icon: 'icon-play-circled',\r\n title: '',\r\n id: 'python-run-btn',\r\n displayText: Blockly.Msg.MSG['run'],\r\n preconditionFn: () => {\r\n return true;\r\n },\r\n callback: () => {\r\n PythonShell.run().catch(Debug.error);\r\n },\r\n scopeType: Nav.Scope.LEFT,\r\n weight: 5\r\n });\r\n\r\n nav.register({\r\n icon: 'icon-cancel',\r\n title: '',\r\n id: 'python-stop-btn',\r\n displayText: Blockly.Msg.MSG['stop'],\r\n preconditionFn: () => {\r\n return true;\r\n },\r\n callback: () => {\r\n PythonShell.stop().catch(Debug.error);\r\n },\r\n scopeType: Nav.Scope.LEFT,\r\n weight: 6\r\n });\r\n\r\n const template = new HTMLTemplate(LEVEL_SELECTOR_TEMPLATE);\r\n const $selector = $(template.render());\r\n nav.getBoardSelector().before($selector);\r\n $selector.select2({\r\n width: '90px',\r\n minimumResultsForSearch: Infinity,\r\n dropdownCssClass: `mixly-scrollbar mixly-${template.getId()}`,\r\n dropdownAutoWidth: true,\r\n placeholder: '',\r\n language: Msg.nowLang\r\n });\r\n for (let i = 0; i < LEVELS.length; i++) {\r\n const option = new Option(`关卡 ${i + 1}`, i);\r\n $selector.append(option);\r\n }\r\n $selector.on('select2:select', (event) => {\r\n const { data } = event.params;\r\n const mainWorkspace = Workspace.getMain();\r\n const editor = mainWorkspace.getEditorsManager().getActive();\r\n editor.setValue(LEVELS[parseInt(data.id)], '.mix');\r\n });\r\n $selector.on('select2:opening', () => {\r\n NavExt.count += 1;\r\n $(document.body).append(NavExt.$shadow);\r\n });\r\n $selector.on('select2:closing', () => {\r\n NavExt.count -= 1;\r\n !NavExt.count && NavExt.$shadow.detach();\r\n });\r\n $selector.trigger('change');\r\n Storage.board('mix', LEVELS[0]);\r\n Storage.board('path', '');\r\n}\r\n\r\nexport default NavExt;","/* eslint-disable new-cap */\r\nimport Sk from './skulpt/skulpt';\r\nimport $ from 'jquery';\r\nimport PyGameZero from './skulpt/pygame-zero';\r\nimport { Events, Debug } from 'mixly';\r\nimport MIXPY_TEMPLATE from '../templates/python/mixpy.py';\r\nimport BLOCKLY_GAME_URL from '../others/skulpt/libs/bg_highlight.js?url';\r\nimport INIT_TOOL_URL from '../others/skulpt/libs/inittool.js?url';\r\nimport BG_NONEHL_URL from '../others/skulpt/libs/bg_nonehl.js?url';\r\n\r\n\r\n// 外部引入的第三方库\r\nconst externalLibs = {\r\n './blocklygame/__init__.js': BLOCKLY_GAME_URL,\r\n './blocktool/__init__.js': INIT_TOOL_URL,\r\n './bg_nonehl/__init__.js': BG_NONEHL_URL\r\n};\r\n\r\nvar GLOBAL_VALUE;\r\n\r\nfunction prettyPrintError(error) {\r\n if (typeof error === \"string\") {\r\n return error;\r\n }\r\n // A weird skulpt thing?\r\n if (error.tp$str !== undefined) {\r\n return error.tp$str().v;\r\n }\r\n return \"\" + error.name + \": \" + error.message;\r\n}\r\n\r\nexport default class PyEngine {\r\n #events_ = new Events(['input', 'output', 'display', 'finished', 'error']);\r\n\r\n constructor(programStatus, mixpyProject) {\r\n this.programStatus = programStatus;\r\n this.mixpyProject = mixpyProject;\r\n /**\r\n * Definable function to be run when execution has fully ended,\r\n * whether it succeeds or fails.\r\n *\r\n */\r\n this.onExecutionEnd = null;\r\n }\r\n\r\n getEvents() {\r\n return this.#events_;\r\n }\r\n\r\n /**\r\n * Helper function that will attempt to call the defined onExecutionEnd,\r\n * but will do nothing if there is no function defined.\r\n */\r\n executionEnd_() {\r\n if (this.onExecutionEnd !== null) {\r\n this.onExecutionEnd();\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the Python Execution engine and the Printer (console).\r\n */\r\n loadEngine(container) {\r\n Sk.__future__ = Sk.python3;\r\n // No connected services\r\n Sk.connectedServices = {};\r\n // No time limit\r\n //Sk.execLimit = null;\r\n // Ensure version 3, so we get proper print handling\r\n // Sk.python3 = true;\r\n //输出海龟画图图片\r\n //如果需要输出pygame_zero场景,需要重新设置\r\n Sk.TurtleGraphics = {\r\n target: container,\r\n width: 500,\r\n height: 500\r\n };\r\n\r\n PyGameZero.setContainer(container);\r\n\r\n //数据分析显示图片\r\n Sk.MatPlotLibGraphics = {\r\n target: container,\r\n width: 500,\r\n height: 500\r\n };\r\n // TODO\r\n //Sk.console = printer.getConfiguration();\r\n // Definitely use a prompt\r\n Sk.inputfunTakesPrompt = true;\r\n\r\n // Keeps track of the tracing while the program is executing; destroyed afterwards.\r\n this.executionBuffer = {};\r\n\r\n Sk.domOutput = (html) => {\r\n const dom = this.#events_.on('display', html)[0];\r\n return dom;\r\n };\r\n\r\n Sk.configure({\r\n //设置文本输出\r\n output: (lineText) => {\r\n this.#events_.run('output', {\r\n content: lineText\r\n });\r\n },\r\n // Function to handle loading in new files\r\n read: this.readFile.bind(this),\r\n inputfun: this.skInput.bind(this),\r\n inputfunTakesPrompt: true,\r\n execLimit: Number.POSITIVE_INFINITY,\r\n fileread: this.fileread.bind(this),\r\n filewrite: this.filewrite.bind(this),\r\n __future__: Sk.python3, //python3已成默认值,要使用python2需要单独设置\r\n });\r\n\r\n Sk.builtins.value = new Sk.builtin.func(function () {\r\n return Sk.ffi.remapToPy(GLOBAL_VALUE === undefined ? 5 : GLOBAL_VALUE);\r\n });\r\n Sk.builtins.set_value = new Sk.builtin.func(function (v) {\r\n GLOBAL_VALUE = v.v;\r\n });\r\n\r\n Sk.builtinFiles.files['./mixpy.py'] = MIXPY_TEMPLATE;\r\n }\r\n\r\n /**\r\n * Used to access Skulpt built-ins. This is pretty generic, taken\r\n * almost directly from the Skulpt docs.\r\n *\r\n * @param {String} filename - The python filename (e.g., \"os\" or \"pprint\") that will be loaded.\r\n * @returns {String} The JavaScript source code of the file (weird, right?)\r\n * @throws Will throw an error if the file isn't found.\r\n */\r\n readFile(file) {\r\n // console.log(\"Attempting file: \" + Sk.ffi.remapToJs(file));\r\n // 加载模块\r\n if (PyGameZero.matchModelName(file)) {\r\n return PyGameZero.load(file);\r\n }\r\n if (externalLibs[file] !== undefined) {\r\n return Sk.misceval.promiseToSuspension(fetch(externalLibs[file]).then((resp) => resp.text()));\r\n }\r\n if (Sk.builtinFiles === undefined || Sk.builtinFiles.files[file] === undefined) {\r\n throw \"File not found: '\" + file + \"'\";\r\n }\r\n return Sk.builtinFiles.files[file];\r\n }\r\n\r\n fileread(filename, mode) {\r\n if (this.mixpyProject.exist(filename)) {\r\n return this.mixpyProject.getFileContent(filename);\r\n }\r\n if (mode.indexOf('w') !== -1) {\r\n this.mixpyProject.add(filename, '', 1);\r\n return '';\r\n }\r\n return null;\r\n }\r\n\r\n filewrite(fileItem, str) {\r\n var filename = fileItem.name;\r\n this.mixpyProject.modify(filename, str);\r\n this.mixpyProject.select(filename);\r\n }\r\n\r\n skInput(prompt) {\r\n return new Promise((resolve, reject) => {\r\n this.#events_.run('input', {\r\n content: {\r\n prompt\r\n },\r\n resolve, reject\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Resets the state of the execution engine, including reinitailizing\r\n * the execution buffer (trace, step, etc.), reseting the printer, and\r\n * hiding the trace button.\r\n *\r\n */\r\n reset() {\r\n Sk.execLimit = Number.POSITIVE_INFINITY;\r\n Sk.TurtleGraphics.reset && Sk.TurtleGraphics.reset();\r\n }\r\n\r\n kill() {\r\n // 新增了sprite相关内容\r\n // window.SPRITE.kill();\r\n //点击取消按钮发送数据\r\n Sk.execLimit = 0;\r\n this.executionEnd_();\r\n }\r\n\r\n /**\r\n * \"Steps\" the execution of the code, meant to be used as a callback to the Skulpt\r\n * environment.\r\n *\r\n * @param {Object} variables - Hash that maps the names of variables (Strings) to their Skulpt representation.\r\n * @param {Number} lineNumber - The corresponding line number in the source code that is being executed.\r\n * @param {Number} columnNumber - The corresponding column number in the source code that is being executed. Think of it as the \"X\" position to the lineNumber's \"Y\" position.\r\n * @param {String} filename - The name of the python file being executed (e.g., \"__main__.py\").\r\n * @param {String} astType - Unused? TODO: What is this?\r\n * @param {String} ast - String-encoded JSON representation of the AST node associated with this element.\r\n */\r\n step(variables, lineNumber,\r\n columnNumber, filename) {\r\n if (filename == '.py') {\r\n var currentStep = this.executionBuffer.step;\r\n var globals = this.parseGlobals(variables);\r\n this.executionBuffer.trace.push(\r\n {\r\n 'step': currentStep,\r\n 'filename': filename,\r\n //'block': highlightMap[lineNumber-1],\r\n 'line': lineNumber,\r\n 'column': columnNumber,\r\n 'properties': globals.properties,\r\n 'modules': globals.modules\r\n }\r\n );\r\n this.executionBuffer.step = currentStep + 1;\r\n this.executionBuffer.last_step = currentStep + 1;\r\n this.executionBuffer.line_number = lineNumber;\r\n }\r\n }\r\n\r\n /**\r\n * Runs the AbstractInterpreter to get some static information about the code,\r\n * in particular the variables' types. This is needed for type checking.\r\n *\r\n * @returns {Object} Maps variable names (as Strings) to types as constructed by the AbstractIntepreter.\r\n */\r\n analyzeVariables() {\r\n // Get the code\r\n var code = this.main.model.programs['__main__']();\r\n if (code.trim() == \"\") {\r\n return {};\r\n }\r\n\r\n // var analyzer = new AbstractInterpreter(code);\r\n // report = analyzer.report;\r\n // return analyzer.variableTypes;\r\n }\r\n\r\n /**\r\n * Runs the AbstractInterpreter to get some static information about the code,\r\n * including potential semantic errors. It then parses that information to give\r\n * feedback.\r\n *\r\n * @returns {Boolean} Whether the code was successfully analyzed.\r\n */\r\n analyze() {\r\n this.main.model.execution.status(\"analyzing\");\r\n\r\n // var feedback = this.main.components.feedback;\r\n\r\n // Get the code\r\n var code = this.main.model.programs['__main__']();\r\n if (code.trim() == \"\") {\r\n this.main.components.feedback.emptyProgram(\"You haven't written any code yet!\");\r\n //this.main.model.feedback.status(\"semantic\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Runs the given python code, resetting the console and Trace Table.\r\n * 分步调试代码\r\n */\r\n steprun(code) {\r\n // Reset everything\r\n this.reset();\r\n if (code.indexOf('import blocklygame') !== -1\r\n || code.indexOf('from blocklygame import') !== -1) {\r\n PyGameZero.reset();\r\n $(Sk.TurtleGraphics.target).empty();\r\n }\r\n //如果是第五关、第七关,则需要把检查循环次数的代码加进去\r\n if (code.indexOf(\"settedMap(4\") != -1 | code.indexOf(\"settedMap(6\") != -1) {\r\n if (code.indexOf(\"moveDirection\") != -1) {//初始化的时候不加这行代码\r\n code = code + \"actor.isCirculationRight()\\n\"\r\n }\r\n }\r\n\r\n //除了第六关,其他把检查是否成功代码加进去\r\n if (code.indexOf(\"settedMap(5)\") == -1) {\r\n if (code.indexOf(\"moveDirection\") != -1) {//初始化的时候不加这行代码\r\n code = code + \"actor.isSuccess()\\n\"\r\n }\r\n }\r\n this.programStatus['running'] = true;\r\n Sk.misceval.asyncToPromise(() => Sk.importMainWithBody(\"\", false, code, true))\r\n .then(() => {\r\n // window.SPRITE.running = false;\r\n this.programStatus['running'] = false;\r\n this.#events_.run('finished');\r\n })\r\n .catch((error) => {\r\n Debug.error(error);\r\n // window.SPRITE.running = false;\r\n this.programStatus['running'] = false;\r\n this.#events_.run('error', error);\r\n var original = prettyPrintError(error);\r\n this.#events_.run('finished');\r\n //hack for kill program with time limiterror\r\n if (original.indexOf(\"TimeLimitError\") !== -1) {\r\n return;\r\n }\r\n this.executionEnd_();\r\n });\r\n }\r\n\r\n /**\r\n * Runs the given python code, resetting the console and Trace Table.\r\n */\r\n run(code) {\r\n // Reset everything\r\n this.reset();\r\n if (code.indexOf('import blocklygame') !== -1\r\n || code.indexOf('from blocklygame import') !== -1) {\r\n PyGameZero.reset();\r\n $(Sk.TurtleGraphics.target).empty();\r\n }\r\n if ((code.indexOf(\"import blocktool\") !== -1) || (code.indexOf(\"import blocklygame\") !== -1) || (code.indexOf(\"from blocklygame import\") !== -1)) {\r\n //正则匹配替换block id元素\r\n var code_piece = [];\r\n code_piece = code.split(\"\\n\");\r\n for (var i = 0; i < code_piece.length; i++) {\r\n if (code_piece[i].indexOf(\"block_id\") >= 0) {\r\n var target = \"\";\r\n var re = /,?'block_id=[\\s\\S]*'/.exec(code_piece[i]);\r\n if (re != null) {\r\n target = re[0];\r\n code_piece[i] = code_piece[i].replace(target, \"\");\r\n }\r\n }\r\n //检查是否是高亮辅助块\\toll,如果是,则将此行代码移除\r\n if ((code_piece[i].indexOf(\"import blocktool\") >= 0) || (code_piece[i].indexOf(\"blocktool.highlight\") >= 0)) {\r\n code_piece[i] = \"delete\";\r\n }\r\n //如果使用的是分步调试的blocklygame,要将其换成非分步调试的模块bg_nonehl\r\n if ((code_piece[i].indexOf(\"blocklygame\") >= 0)) {\r\n code_piece[i] = code_piece[i].replace(\"blocklygame\", \"bg_nonehl\");\r\n }\r\n }\r\n code = \"\"\r\n for (var i = 0; i < code_piece.length; i++) {\r\n if (code_piece[i] != \"delete\") {\r\n code += code_piece[i] + '\\n'\r\n }\r\n }\r\n }\r\n //如果是第五关、第七关,则需要把检查循环次数的代码加进去\r\n if (code.indexOf(\"settedMap(4\") != -1 | code.indexOf(\"settedMap(6\") != -1) {\r\n if (code.indexOf(\"moveDirection\") != -1) {//初始化的时候不加这行代码\r\n code = code + \"actor.isCirculationRight();\\n\"\r\n }\r\n }\r\n\r\n //除了第六关,其他把检查是否成功代码加进去\r\n if (code.indexOf(\"settedMap(5)\") == -1) {\r\n if (code.indexOf(\"moveDirection\") != -1) {//初始化的时候不加这行代码\r\n code = code + \"actor.isSuccess();\\n\"\r\n }\r\n }\r\n this.programStatus['running'] = true;\r\n Sk.misceval.asyncToPromise(() => Sk.importMainWithBody(\"\", false, code, true))\r\n .then(() => {\r\n // window.SPRITE.running = false;\r\n this.programStatus['running'] = false;\r\n this.#events_.run('finished');\r\n })\r\n .catch((error) => {\r\n Debug.error(error);\r\n // window.SPRITE.running = false;\r\n this.programStatus['running'] = false;\r\n this.#events_.run('error', error);\r\n var original = prettyPrintError(error);\r\n this.#events_.run('finished');\r\n //hack for kill program with time limiterror\r\n if (original.indexOf(\"TimeLimitError\") !== -1) {\r\n return;\r\n }\r\n this.executionEnd_();\r\n });\r\n }\r\n\r\n setupEnvironment(student_code, traceTable, output, ast, final_values) {\r\n var model = this.main.model;\r\n this._backup_execution = Sk.afterSingleExecution;\r\n Sk.afterSingleExecution = undefined;\r\n Sk.builtins.get_output = new Sk.builtin.func(function () {\r\n Sk.builtin.pyCheckArgs(\"get_output\", arguments, 0, 0);\r\n return Sk.ffi.remapToPy(model.execution.output());\r\n });\r\n Sk.builtins.reset_output = new Sk.builtin.func(function () {\r\n Sk.builtin.pyCheckArgs(\"reset_output\", arguments, 0, 0);\r\n model.execution.output.removeAll();\r\n });\r\n Sk.builtins.log = new Sk.builtin.func(function (data) {\r\n Sk.builtin.pyCheckArgs(\"log\", arguments, 1, 1);\r\n console.log(data);\r\n });\r\n //Sk.builtins.trace = Sk.ffi.remapToPy(traceTable);\r\n Sk.builtins._trace = traceTable;\r\n Sk.builtins._final_values = final_values;\r\n Sk.builtins.code = Sk.ffi.remapToPy(student_code);\r\n Sk.builtins.set_success = this.instructor_module.set_success;\r\n Sk.builtins.set_feedback = this.instructor_module.set_feedback;\r\n Sk.builtins.set_finished = this.instructor_module.set_finished;\r\n Sk.builtins.count_components = this.instructor_module.count_components;\r\n Sk.builtins.no_nonlist_nums = this.instructor_module.no_nonlist_nums;\r\n Sk.builtins.only_printing_properties = this.instructor_module.only_printing_properties;\r\n Sk.builtins.calls_function = this.instructor_module.calls_function;\r\n Sk.builtins.get_property = this.instructor_module.get_property;\r\n Sk.builtins.get_value_by_name = this.instructor_module.get_value_by_name;\r\n Sk.builtins.get_value_by_type = this.instructor_module.get_value_by_type;\r\n Sk.builtins.parse_json = this.instructor_module.parse_json;\r\n Sk.skip_drawing = true;\r\n model.settings.mute_printer(true);\r\n }\r\n\r\n disposeEnvironment() {\r\n Sk.afterSingleExecution = this._backup_execution;\r\n Sk.builtins.get_output = undefined;\r\n Sk.builtins.reset_output = undefined;\r\n Sk.builtins.log = undefined;\r\n Sk.builtins._trace = undefined;\r\n Sk.builtins.trace = undefined;\r\n Sk.builtins.code = undefined;\r\n Sk.builtins.set_success = undefined;\r\n Sk.builtins.set_feedback = undefined;\r\n Sk.builtins.set_finished = undefined;\r\n Sk.builtins.count_components = undefined;\r\n Sk.builtins.calls_function = undefined;\r\n Sk.builtins.get_property = undefined;\r\n Sk.builtins.get_value_by_name = undefined;\r\n Sk.builtins.get_value_by_type = undefined;\r\n Sk.builtins.no_nonlist_nums = undefined;\r\n Sk.builtins.only_printing_properties = undefined;\r\n Sk.builtins.parse_json = undefined;\r\n Sk.skip_drawing = false;\r\n GLOBAL_VALUE = undefined;\r\n this.main.model.settings.mute_printer(false);\r\n }\r\n\r\n parseGlobals(variables) {\r\n var result = Array();\r\n var modules = Array();\r\n for (var property in variables) {\r\n var value = variables[property];\r\n if (property !== \"__name__\" && property !== \"__doc__\") {\r\n property = property.replace('_$rw$', '')\r\n .replace('_$rn$', '');\r\n var parsed = this.parseValue(property, value);\r\n if (parsed !== null) {\r\n result.push(parsed);\r\n } else if (value.constructor == Sk.builtin.module) {\r\n modules.push(value.$d.__name__.v);\r\n }\r\n }\r\n }\r\n return { \"properties\": result, \"modules\": modules };\r\n }\r\n\r\n parseValue(property, value) {\r\n if (value == undefined) {\r\n return {\r\n 'name': property,\r\n 'type': 'Unknown',\r\n \"value\": 'Undefined'\r\n };\r\n }\r\n switch (value.constructor) {\r\n case Sk.builtin.func:\r\n return {\r\n 'name': property,\r\n 'type': \"Function\",\r\n \"value\": (value.func_code.co_varnames !== undefined ?\r\n \" Arguments: \" + value.func_code.co_varnames.join(\", \") :\r\n ' No arguments')\r\n };\r\n case Sk.builtin.module: return null;\r\n case Sk.builtin.str:\r\n return {\r\n 'name': property,\r\n 'type': \"String\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.none:\r\n return {\r\n 'name': property,\r\n 'type': \"None\",\r\n \"value\": \"None\"\r\n };\r\n case Sk.builtin.bool:\r\n return {\r\n 'name': property,\r\n 'type': \"Boolean\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.nmber:\r\n return {\r\n 'name': property,\r\n 'type': \"int\" == value.skType ? \"Integer\" : \"Float\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.int_:\r\n return {\r\n 'name': property,\r\n 'type': \"Integer\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.float_:\r\n return {\r\n 'name': property,\r\n 'type': \"Float\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.tuple:\r\n return {\r\n 'name': property,\r\n 'type': \"Tuple\",\r\n \"value\": value.$r().v\r\n };\r\n case Sk.builtin.list:\r\n if (value.v.length <= 20) {\r\n return {\r\n 'name': property,\r\n 'type': \"List\",\r\n \"value\": value.$r().v,\r\n 'exact_value': value\r\n };\r\n }\r\n return {\r\n 'name': property,\r\n 'type': \"List\",\r\n \"value\": \"[... \" + value.v.length + \" elements ...]\",\r\n \"exact_value\": value\r\n };\r\n\r\n case Sk.builtin.dict:\r\n return {\r\n 'name': property,\r\n 'type': \"Dictionary\",\r\n \"value\": value.$r().v\r\n };\r\n case Number:\r\n return {\r\n 'name': property,\r\n 'type': value % 1 === 0 ? \"Integer\" : \"Float\",\r\n \"value\": value\r\n };\r\n case String:\r\n return {\r\n 'name': property,\r\n 'type': \"String\",\r\n \"value\": value\r\n };\r\n case Boolean:\r\n return {\r\n 'name': property,\r\n 'type': \"Boolean\",\r\n \"value\": (value ? \"True\" : \"False\")\r\n };\r\n default:\r\n return {\r\n 'name': property,\r\n 'type': value.tp$name == undefined ? value : value.tp$name,\r\n \"value\": value.$r == undefined ? value : value.$r().v\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Skulpt Module for holding the Instructor API.\r\n *\r\n * This module is a little hackish. We need to sit down and reevaluate the best way to\r\n * organize it and whether this particular structure is ideal. I suspect it should be\r\n * it's own proper JS file.\r\n *\r\n * @param {String} name - The name of the module (should always be 'instructor')\r\n *\r\n */\r\n// var instructor_module = function (name) {\r\n// // Main module object that gets returned at the end.\r\n// var mod = {};\r\n\r\n// /**\r\n// * Skulpt Exception that represents a Feedback object, to be rendered to the user\r\n// * when the feedback system finds a problem.\r\n// *\r\n// * @param {Array} args - A list of optional arguments to pass to the Exception.\r\n// * Usually this will include a message for the user.\r\n// */\r\n// Sk.builtin.Feedback = function (args) {\r\n// var o;\r\n// if (!(this instanceof Sk.builtin.Feedback)) {\r\n// o = Object.create(Sk.builtin.Feedback.prototype);\r\n// o.constructor.apply(o, arguments);\r\n// return o;\r\n// }\r\n// Sk.builtin.Exception.apply(this, arguments);\r\n// };\r\n// Sk.abstr.setUpInheritance(\"Feedback\", Sk.builtin.Feedback, Sk.builtin.Exception);\r\n\r\n// /**\r\n// * Skulpt Exception that represents a Success object, to be thrown when the user\r\n// * completes their program successfully.\r\n// *\r\n// ** @param {Array} args - A list of optional arguments to pass to the Exception.\r\n// * Usually this will be empty.\r\n// */\r\n// Sk.builtin.Success = function (args) {\r\n// var o;\r\n// if (!(this instanceof Sk.builtin.Success)) {\r\n// o = Object.create(Sk.builtin.Success.prototype);\r\n// o.constructor.apply(o, arguments);\r\n// return o;\r\n// }\r\n// Sk.builtin.Exception.apply(this, arguments);\r\n// };\r\n// Sk.abstr.setUpInheritance(\"Success\", Sk.builtin.Success, Sk.builtin.Exception);\r\n\r\n// /**\r\n// * Skulpt Exception that represents a Finished object, to be thrown when the user\r\n// * completes their program successfully, but isn't in a problem with a \"solution\".\r\n// * This is useful for open-ended canvases where we still want to capture the students'\r\n// * code in Canvas.\r\n// *\r\n// ** @param {Array} args - A list of optional arguments to pass to the Exception.\r\n// * Usually this will be empty.\r\n// */\r\n// Sk.builtin.Finished = function (args) {\r\n// var o;\r\n// if (!(this instanceof Sk.builtin.Finished)) {\r\n// o = Object.create(Sk.builtin.Finished.prototype);\r\n// o.constructor.apply(o, arguments);\r\n// return o;\r\n// }\r\n// Sk.builtin.Exception.apply(this, arguments);\r\n// };\r\n// Sk.abstr.setUpInheritance(\"Finished\", Sk.builtin.Finished, Sk.builtin.Exception);\r\n\r\n// /**\r\n// * A Skulpt function that throws a Feedback exception, allowing us to give feedback\r\n// * to the user through the Feedback panel. This function call is done for aesthetic\r\n// * reasons, so that we are calling a function instead of raising an error. Still,\r\n// * exceptions allow us to break out of the control flow immediately, like a\r\n// * return, so they are a good mechanism to use under the hood.\r\n// *\r\n// * @param {String} message - The message to display to the user.\r\n// */\r\n// mod.set_feedback = new Sk.builtin.func(function (message) {\r\n// Sk.builtin.pyCheckArgs(\"set_feedback\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"message\", \"string\", Sk.builtin.checkString(message));\r\n// throw new Sk.builtin.Feedback(message.v);\r\n// });\r\n\r\n// /**\r\n// * A Skulpt function that throws a Success exception. This will terminate the\r\n// * feedback analysis, but reports that the students' code was successful.\r\n// * This function call is done for aesthetic reasons, so that we are calling a\r\n// * function instead of raising an error. Still, exceptions allow us to break\r\n// * out of the control flow immediately, like a return would, so they are a\r\n// * good mechanism to use under the hood.\r\n// */\r\n// mod.set_success = new Sk.builtin.func(function () {\r\n// Sk.builtin.pyCheckArgs(\"set_success\", arguments, 0, 0);\r\n// throw new Sk.builtin.Success();\r\n// });\r\n\r\n// /**\r\n// * A Skulpt function that throws a Finished exception. This will terminate the\r\n// * feedback analysis, but reports that the students' code was successful.\r\n// * This function call is done for aesthetic reasons, so that we are calling a\r\n// * function instead of raising an error. Still, exceptions allow us to break\r\n// * out of the control flow immediately, like a return would, so they are a\r\n// * good mechanism to use under the hood.\r\n// */\r\n// mod.set_finished = new Sk.builtin.func(function () {\r\n// Sk.builtin.pyCheckArgs(\"set_finished\", arguments, 0, 0);\r\n// throw new Sk.builtin.Finished();\r\n// });\r\n\r\n// // Memoization of previous parses - some mild redundancy to save time\r\n// // TODO: There's no evidence this is good, and could be a memory hog on big\r\n// // programs. Someone should investigate this. The assumption is that multiple\r\n// // helper functions might be using parses. But shouldn't we trim old parses?\r\n// // Perhaps a timed cache would work better.\r\n// var parses = {};\r\n\r\n// /**\r\n// * Given source code as a string, return a flat list of all of the AST elements\r\n// * in the parsed source code.\r\n// *\r\n// * TODO: There's redundancy here, since the source code was previously parsed\r\n// * to run the file and to execute it. We should probably be able to do this just\r\n// * once and shave off time.\r\n// *\r\n// * @param {String} source - Python source code.\r\n// * @returns {Array.}\r\n// */\r\n// function getParseList(source) {\r\n// if (!(source in parses)) {\r\n// var parse = Sk.parse(\"__main__\", source);\r\n// parses[source] = Sk.astFromParse(parse.cst, \"__main__\", parse.flags);\r\n// }\r\n// var ast = parses[source];\r\n// return (new NodeVisitor()).recursive_walk(ast);\r\n// }\r\n\r\n// /**\r\n// * Given source code as a string, return a list of all of the AST elements\r\n// * that are Num (aka numeric literals) but that are not inside List elements.\r\n// *\r\n// * @param {String} source - Python source code.\r\n// * @returns {Array.number} The list of JavaScript numeric literals that were found.\r\n// */\r\n// function getNonListNums(source) {\r\n// if (!(source in parses)) {\r\n// var parse = Sk.parse(\"__main__\", source);\r\n// parses[source] = Sk.astFromParse(parse.cst, \"__main__\", parse.flags);\r\n// }\r\n// var ast = parses[source];\r\n// var visitor = new NodeVisitor();\r\n// var insideList = false;\r\n// var nums = [];\r\n// visitor.visit_List = function (node) {\r\n// insideList = true;\r\n// this.generic_visit(node);\r\n// insideList = false;\r\n// }\r\n// visitor.visit_Num = function (node) {\r\n// if (!insideList) {\r\n// nums.push(node.n);\r\n// }\r\n// this.generic_visit(node);\r\n// }\r\n// visitor.visit(ast);\r\n// return nums;\r\n// }\r\n\r\n// /**\r\n// * Given source code as a string, return a list of all of the AST elements\r\n// * that are being printed (using the print function) but are not variables.\r\n// *\r\n// * @param {String} source - Python source code.\r\n// * @returns {Array.} The list of AST elements that were found.\r\n// */\r\n// function getPrintedNonProperties(source) {\r\n// if (!(source in parses)) {\r\n// var parse = Sk.parse(\"__main__\", source);\r\n// parses[source] = Sk.astFromParse(parse.cst, \"__main__\", parse.flags);\r\n// }\r\n// var ast = parses[source];\r\n// var visitor = new NodeVisitor();\r\n// var nonVariables = [];\r\n// visitor.visit_Call = function (node) {\r\n// var func = node.func;\r\n// var args = node.args;\r\n// if (func._astname == 'Name' && func.id.v == 'print') {\r\n// for (var i = 0; i < args.length; i += 1) {\r\n// if (args[i]._astname != \"Name\") {\r\n// nonVariables.push(args[i]);\r\n// }\r\n// }\r\n// }\r\n// this.generic_visit(node);\r\n// }\r\n// visitor.visit(ast);\r\n// return nonVariables;\r\n// }\r\n\r\n// /**\r\n// * Skulpt function to iterate through the final state of\r\n// * all the variables in the program, and check to see if they have\r\n// * a given value.\r\n// */\r\n// mod.get_value_by_name = new Sk.builtin.func(function (name) {\r\n// Sk.builtin.pyCheckArgs(\"get_value_by_name\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"name\", \"string\", Sk.builtin.checkString(name));\r\n// name = name.v;\r\n// var final_values = Sk.builtins._final_values;\r\n// if (name in final_values) {\r\n// return final_values[name];\r\n// }\r\n// return Sk.builtin.none.none$;\r\n\r\n// });\r\n// mod.get_value_by_type = new Sk.builtin.func(function (type) {\r\n// Sk.builtin.pyCheckArgs(\"get_value_by_type\", arguments, 1, 1);\r\n\r\n// var final_values = Sk.builtins._final_values;\r\n// var result = [];\r\n// for (var property in final_values) {\r\n// if (final_values[property].tp$name == type.tp$name) {\r\n// result.push(final_values[property]);\r\n// }\r\n// }\r\n// return Sk.builtin.list(result);\r\n// });\r\n\r\n// mod.parse_json = new Sk.builtin.func(function (blob) {\r\n// Sk.builtin.pyCheckArgs(\"parse_json\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"blob\", \"string\", Sk.builtin.checkString(blob));\r\n// blob = blob.v;\r\n// return Sk.ffi.remapToPy(JSON.parse(blob));\r\n// });\r\n// mod.get_property = new Sk.builtin.func(function (name) {\r\n// Sk.builtin.pyCheckArgs(\"get_property\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"name\", \"string\", Sk.builtin.checkString(name));\r\n// name = name.v;\r\n// var trace = Sk.builtins._trace;\r\n// if (trace.length <= 0) {\r\n// return Sk.builtin.none.none$;\r\n// }\r\n// var properties = trace[trace.length - 1][\"properties\"];\r\n// for (var i = 0, len = properties.length; i < len; i += 1) {\r\n// if (properties[i]['name'] == name) {\r\n// return Sk.ffi.remapToPy(properties[i])\r\n// }\r\n// }\r\n// return Sk.builtin.none.none$;\r\n// });\r\n\r\n// mod.calls_function = new Sk.builtin.func(function (source, name) {\r\n// Sk.builtin.pyCheckArgs(\"calls_function\", arguments, 2, 2);\r\n// Sk.builtin.pyCheckType(\"source\", \"string\", Sk.builtin.checkString(source));\r\n// Sk.builtin.pyCheckType(\"name\", \"string\", Sk.builtin.checkString(name));\r\n\r\n// source = source.v;\r\n// name = name.v;\r\n\r\n// var ast_list = getParseList(source);\r\n\r\n// var count = 0;\r\n// for (var i = 0, len = ast_list.length; i < len; i = i + 1) {\r\n// if (ast_list[i]._astname == 'Call') {\r\n// if (ast_list[i].func._astname == 'Attribute') {\r\n// count += Sk.ffi.remapToJs(ast_list[i].func.attr) == name | 0;\r\n// } else if (ast_list[i].func._astname == 'Name') {\r\n// count += Sk.ffi.remapToJs(ast_list[i].func.id) == name | 0;\r\n// }\r\n// }\r\n// }\r\n\r\n// return Sk.ffi.remapToPy(count > 0);\r\n// });\r\n\r\n// mod.count_components = new Sk.builtin.func(function (source, component) {\r\n// Sk.builtin.pyCheckArgs(\"count_components\", arguments, 2, 2);\r\n// Sk.builtin.pyCheckType(\"source\", \"string\", Sk.builtin.checkString(source));\r\n// Sk.builtin.pyCheckType(\"component\", \"string\", Sk.builtin.checkString(component));\r\n\r\n// source = source.v;\r\n// component = component.v;\r\n\r\n// var ast_list = getParseList(source);\r\n\r\n// var count = 0;\r\n// for (var i = 0, len = ast_list.length; i < len; i = i + 1) {\r\n// if (ast_list[i]._astname == component) {\r\n// count = count + 1;\r\n// }\r\n// }\r\n\r\n// return Sk.ffi.remapToPy(count);\r\n// });\r\n\r\n// mod.no_nonlist_nums = new Sk.builtin.func(function (source) {\r\n// Sk.builtin.pyCheckArgs(\"no_nonlist_nums\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"source\", \"string\", Sk.builtin.checkString(source));\r\n\r\n// source = source.v;\r\n\r\n// var num_list = getNonListNums(source);\r\n\r\n// var count = 0;\r\n// for (var i = 0, len = num_list.length; i < len; i = i + 1) {\r\n// if (num_list[i].v != 0 && num_list[i].v != 1) {\r\n// return Sk.ffi.remapToPy(true);\r\n// }\r\n// }\r\n// return Sk.ffi.remapToPy(false);\r\n// });\r\n// mod.only_printing_properties = new Sk.builtin.func(function (source) {\r\n// Sk.builtin.pyCheckArgs(\"only_printing_properties\", arguments, 1, 1);\r\n// Sk.builtin.pyCheckType(\"source\", \"string\", Sk.builtin.checkString(source));\r\n\r\n// source = source.v;\r\n\r\n// var non_var_list = getPrintedNonProperties(source);\r\n// return Sk.ffi.remapToPy(non_var_list.length == 0);\r\n// });\r\n\r\n// return mod;\r\n// }\r\n","import MixpyProject from './mixpy-project';\r\nimport PyEngine from './py-engine';\r\nimport { Workspace, Msg } from 'mixly';\r\nimport StatusBarImage from './statusbar-image';\r\n\r\nclass PythonShell {\r\n static {\r\n this.pythonShell = null;\r\n\r\n this.init = async function () {\r\n StatusBarImage.init();\r\n this.pythonShell = new PythonShell();\r\n }\r\n\r\n this.steprun = function () {\r\n const mainWorkspace = Workspace.getMain();\r\n const editor = mainWorkspace.getEditorsManager().getActive();\r\n const code = editor.getCode();\r\n return this.pythonShell.steprun(code);\r\n }\r\n\r\n this.run = function () {\r\n const mainWorkspace = Workspace.getMain();\r\n const editor = mainWorkspace.getEditorsManager().getActive();\r\n const code = editor.getCode();\r\n return this.pythonShell.run(code);\r\n }\r\n\r\n this.stop = function () {\r\n return this.pythonShell.stop();\r\n }\r\n }\r\n\r\n #statusBarTerminal_ = null;\r\n #statusBarImage_ = null;\r\n #statusBarsManager_ = null;\r\n #cursor_ = {\r\n row: 0,\r\n column: 0\r\n };\r\n #prompt_ = '';\r\n #inputResolve_ = null;\r\n #inputReject_ = null;\r\n #waittingForInput_ = false;\r\n #running_ = false;\r\n #pyEngine_ = null;\r\n #onCursorChangeEvent_ = () => this.#onCursorChange_();\r\n #commands_ = [\r\n {\r\n name: 'REPL-Enter',\r\n bindKey: 'Enter',\r\n exec: (editor) => {\r\n const session = editor.getSession();\r\n const cursor = session.selection.getCursor();\r\n if (cursor.row === this.#cursor_.row) {\r\n const newPos = this.#statusBarTerminal_.getEndPos();\r\n let str = this.#statusBarTerminal_.getValueRange(this.#cursor_, newPos);\r\n str = str.replace(this.#prompt_, '');\r\n this.#inputResolve_?.(str);\r\n this.#inputResolve_ = null;\r\n this.#inputReject_ = null;\r\n this.#statusBarTerminal_.addValue('\\n');\r\n this.#exitInput_();\r\n return true;\r\n }\r\n return false;\r\n }\r\n }, {\r\n name: 'REPL-ChangeEditor',\r\n bindKey: 'Delete|Ctrl-X|Backspace',\r\n exec: (editor) => {\r\n const session = editor.getSession();\r\n const cursor = session.selection.getCursor();\r\n if (cursor.row < this.#cursor_.row || cursor.column <= this.#cursor_.column) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n ];\r\n constructor() {\r\n const mainWorkspace = Workspace.getMain();\r\n this.#statusBarsManager_ = mainWorkspace.getStatusBarsManager();\r\n this.#statusBarTerminal_ = this.#statusBarsManager_.getStatusBarById('output');\r\n this.#statusBarImage_ = this.#statusBarsManager_.getStatusBarById('images');\r\n this.#pyEngine_ = new PyEngine({}, new MixpyProject());\r\n this.#pyEngine_.loadEngine(this.#statusBarImage_.getContent().children()[0]);\r\n this.#addEventsListener_();\r\n }\r\n\r\n #addEventsListener_() {\r\n const events = this.#pyEngine_.getEvents();\r\n events.bind('finished', () => {\r\n this.#running_ = false;\r\n this.#statusBarTerminal_.addValue(`\\n==${Msg.Lang['shell.finish']}==`);\r\n });\r\n\r\n events.bind('output', (data) => {\r\n this.#statusBarTerminal_.addValue(data.content);\r\n });\r\n\r\n events.bind('error', (data) => {\r\n this.#running_ = false;\r\n this.#statusBarTerminal_.addValue(`\\n${data.toString()}\\n`);\r\n });\r\n\r\n events.bind('input', (data) => {\r\n const prompt = String(data?.content?.prompt);\r\n this.#statusBarTerminal_.addValue(`>>> ${prompt}`);\r\n this.#prompt_ = prompt;\r\n this.#inputResolve_ = data.resolve;\r\n this.#inputReject_ = data.reject;\r\n this.#enterInput_();\r\n });\r\n\r\n events.bind('display', (data) => {\r\n this.#statusBarsManager_.changeTo('images');\r\n this.#statusBarImage_.display(data);\r\n });\r\n }\r\n\r\n #onCursorChange_() {\r\n const editor = this.#statusBarTerminal_.getEditor();\r\n const session = editor.getSession();\r\n const cursor = session.selection.getCursor();\r\n editor.setReadOnly(\r\n cursor.row < this.#cursor_.row || cursor.column < this.#cursor_.column\r\n );\r\n }\r\n\r\n #enterInput_() {\r\n if (!this.#running_) {\r\n return;\r\n }\r\n this.#waittingForInput_ = true;\r\n this.#cursor_ = this.#statusBarTerminal_.getEndPos();\r\n const editor = this.#statusBarTerminal_.getEditor();\r\n editor.setReadOnly(false);\r\n editor.focus();\r\n const session = editor.getSession();\r\n session.selection.on('changeCursor', this.#onCursorChangeEvent_);\r\n editor.commands.addCommands(this.#commands_);\r\n }\r\n\r\n #exitInput_() {\r\n this.#waittingForInput_ = false;\r\n const editor = this.#statusBarTerminal_.getEditor();\r\n const session = editor.getSession();\r\n session.selection.off('changeCursor', this.#onCursorChangeEvent_);\r\n editor.commands.removeCommands(this.#commands_);\r\n this.#prompt_ = '';\r\n this.#inputResolve_?.('');\r\n // this.#inputReject_?.({});\r\n this.cursor_ = { row: 0, column: 0 };\r\n editor.setReadOnly(true);\r\n }\r\n\r\n addPrompt(prompt, resolve, reject) {\r\n this.#statusBarTerminal_.addValue(prompt);\r\n this.#prompt_ = prompt;\r\n this.#inputResolve_ = resolve;\r\n this.#inputReject_ = reject;\r\n this.#enterInput_();\r\n }\r\n\r\n async steprun(code) {\r\n await this.stop();\r\n this.#statusBarsManager_.changeTo('output');\r\n this.#statusBarsManager_.show();\r\n this.#statusBarTerminal_.setValue(`${Msg.Lang['shell.running']}...\\n`);\r\n this.#running_ = true;\r\n if (code.indexOf('import blocklygame') !== -1\r\n || code.indexOf('from blocklygame import') !== -1) {\r\n this.#statusBarsManager_.changeTo('images');\r\n }\r\n this.#pyEngine_.steprun(code);\r\n }\r\n\r\n async run(code) {\r\n await this.stop();\r\n this.#statusBarsManager_.changeTo('output');\r\n this.#statusBarsManager_.show();\r\n this.#statusBarTerminal_.setValue(`${Msg.Lang['shell.running']}...\\n`);\r\n this.#running_ = true;\r\n if (code.indexOf('import blocklygame') !== -1\r\n || code.indexOf('from blocklygame import') !== -1) {\r\n this.#statusBarsManager_.changeTo('images');\r\n }\r\n this.#pyEngine_.run(code);\r\n }\r\n\r\n async stop() {\r\n if (this.#waittingForInput_) {\r\n this.#exitInput_();\r\n }\r\n if (this.#running_) {\r\n this.#pyEngine_.kill();\r\n await this.sleep(500);\r\n this.#running_ = false;\r\n }\r\n }\r\n\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n}\r\n\r\nexport default PythonShell;","import './pygame-zero.min.js';\r\n\r\nexport default window.PyGameZero;","(function() {\r\n function Kb(a) {\r\n return a && a.__esModule ? {\r\n d: a.default\r\n } : {\r\n d: a\r\n }\r\n }\r\n function Gc(name) {\r\n var err = new Error(\"Cannot find module '\" + name + \"'\");\r\n err.code = \"MODULE_NOT_FOUND\";\r\n throw err\r\n }\r\n var Hc = this;\r\n var Lb = {};\r\n var ma = {};\r\n var te, Mb, ha = {};\r\n !function(e, t) {\r\n \"object\" == typeof ha ? ha = t(function() {\r\n try {\r\n return Gc(\"poly-decomp\")\r\n } catch (e) {}\r\n }()) : \"function\" == typeof Mb && Mb.amd ? Mb(\"Matter\", [\"poly-decomp\"], t) : \"object\" == typeof ha ? (te = t(function() {\r\n try {\r\n return Gc(\"poly-decomp\")\r\n } catch (e) {}\r\n }()),\r\n ha.Matter = te) : e.Matter = t(e.decomp)\r\n }(ha, function(e) {\r\n return function(e) {\r\n var t = {};\r\n function n(i) {\r\n if (t[i])\r\n return t[i].exports;\r\n var o = t[i] = {\r\n i: i,\r\n l: !1,\r\n exports: {}\r\n };\r\n return e[i].call(o.exports, o, o.exports, n),\r\n o.l = !0,\r\n o.exports\r\n }\r\n return n.m = e,\r\n n.c = t,\r\n n.d = function(e, t, i) {\r\n n.o(e, t) || Object.defineProperty(e, t, {\r\n enumerable: !0,\r\n get: i\r\n })\r\n }\r\n ,\r\n n.r = function(e) {\r\n \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\r\n value: \"Module\"\r\n }),\r\n Object.defineProperty(e, \"__esModule\", {\r\n value: !0\r\n })\r\n }\r\n ,\r\n n.t = function(e, t) {\r\n if (1 & t && (e = n(e)),\r\n 8 & t)\r\n return e;\r\n if (4 & t && \"object\" == typeof e && e && e.__esModule)\r\n return e;\r\n var i = Object.create(null);\r\n if (n.r(i),\r\n Object.defineProperty(i, \"default\", {\r\n enumerable: !0,\r\n value: e\r\n }),\r\n 2 & t && \"string\" != typeof e)\r\n for (var o in e)\r\n n.d(i, o, function(t) {\r\n return e[t]\r\n }\r\n .bind(null, o));\r\n return i\r\n }\r\n ,\r\n n.n = function(e) {\r\n var t = e && e.__esModule ? function() {\r\n return e.default\r\n }\r\n : function() {\r\n return e\r\n }\r\n ;\r\n return n.d(t, \"a\", t),\r\n t\r\n }\r\n ,\r\n n.o = function(e, t) {\r\n return Object.prototype.hasOwnProperty.call(e, t)\r\n }\r\n ,\r\n n.p = \"\",\r\n n(n.s = 24)\r\n }([function(e, t) {\r\n var n = {};\r\n e.exports = n,\r\n function() {\r\n n._nextId = 0,\r\n n._seed = 0,\r\n n._nowStartTime = +new Date,\r\n n.extend = function(e, t) {\r\n var i, o;\r\n \"boolean\" == typeof t ? (i = 2,\r\n o = t) : (i = 1,\r\n o = !0);\r\n for (var r = i; r < arguments.length; r++) {\r\n var s = arguments[r];\r\n if (s)\r\n for (var a in s)\r\n o && s[a] && s[a].constructor === Object ? e[a] && e[a].constructor !== Object ? e[a] = s[a] : (e[a] = e[a] || {},\r\n n.extend(e[a], o, s[a])) : e[a] = s[a]\r\n }\r\n return e\r\n }\r\n ,\r\n n.clone = function(e, t) {\r\n return n.extend({}, t, e)\r\n }\r\n ,\r\n n.keys = function(e) {\r\n if (Object.keys)\r\n return Object.keys(e);\r\n var t = [];\r\n for (var n in e)\r\n t.push(n);\r\n return t\r\n }\r\n ,\r\n n.values = function(e) {\r\n var t = [];\r\n if (Object.keys) {\r\n for (var n = Object.keys(e), i = 0; i < n.length; i++)\r\n t.push(e[n[i]]);\r\n return t\r\n }\r\n for (var o in e)\r\n t.push(e[o]);\r\n return t\r\n }\r\n ,\r\n n.get = function(e, t, n, i) {\r\n t = t.split(\".\").slice(n, i);\r\n for (var o = 0; o < t.length; o += 1)\r\n e = e[t[o]];\r\n return e\r\n }\r\n ,\r\n n.set = function(e, t, i, o, r) {\r\n var s = t.split(\".\").slice(o, r);\r\n return n.get(e, t, 0, -1)[s[s.length - 1]] = i,\r\n i\r\n }\r\n ,\r\n n.shuffle = function(e) {\r\n for (var t = e.length - 1; t > 0; t--) {\r\n var i = Math.floor(n.random() * (t + 1))\r\n , o = e[t];\r\n e[t] = e[i],\r\n e[i] = o\r\n }\r\n return e\r\n }\r\n ,\r\n n.choose = function(e) {\r\n return e[Math.floor(n.random() * e.length)]\r\n }\r\n ,\r\n n.isElement = function(e) {\r\n return \"undefined\" != typeof HTMLElement ? e instanceof HTMLElement : !!(e && e.nodeType && e.nodeName)\r\n }\r\n ,\r\n n.isArray = function(e) {\r\n return \"[object Array]\" === Object.prototype.toString.call(e)\r\n }\r\n ,\r\n n.isFunction = function(e) {\r\n return \"function\" == typeof e\r\n }\r\n ,\r\n n.isPlainObject = function(e) {\r\n return \"object\" == typeof e && e.constructor === Object\r\n }\r\n ,\r\n n.isString = function(e) {\r\n return \"[object String]\" === toString.call(e)\r\n }\r\n ,\r\n n.clamp = function(e, t, n) {\r\n return e < t ? t : e > n ? n : e\r\n }\r\n ,\r\n n.sign = function(e) {\r\n return e < 0 ? -1 : 1\r\n }\r\n ,\r\n n.now = function() {\r\n if (\"undefined\" != typeof window && window.performance) {\r\n if (window.performance.now)\r\n return window.performance.now();\r\n if (window.performance.webkitNow)\r\n return window.performance.webkitNow()\r\n }\r\n return new Date - n._nowStartTime\r\n }\r\n ,\r\n n.random = function(t, n) {\r\n return n = void 0 !== n ? n : 1,\r\n (t = void 0 !== t ? t : 0) + e() * (n - t)\r\n }\r\n ;\r\n var e = function() {\r\n return n._seed = (9301 * n._seed + 49297) % 233280,\r\n n._seed / 233280\r\n };\r\n n.colorToNumber = function(e) {\r\n return 3 == (e = e.replace(\"#\", \"\")).length && (e = e.charAt(0) + e.charAt(0) + e.charAt(1) + e.charAt(1) + e.charAt(2) + e.charAt(2)),\r\n parseInt(e, 16)\r\n }\r\n ,\r\n n.logLevel = 1,\r\n n.log = function() {\r\n console && n.logLevel > 0 && n.logLevel <= 3 && console.log.apply(console, [\"matter-js:\"].concat(Array.prototype.slice.call(arguments)))\r\n }\r\n ,\r\n n.info = function() {\r\n console && n.logLevel > 0 && n.logLevel <= 2 && console.info.apply(console, [\"matter-js:\"].concat(Array.prototype.slice.call(arguments)))\r\n }\r\n ,\r\n n.warn = function() {\r\n console && n.logLevel > 0 && n.logLevel <= 3 && console.warn.apply(console, [\"matter-js:\"].concat(Array.prototype.slice.call(arguments)))\r\n }\r\n ,\r\n n.nextId = function() {\r\n return n._nextId++\r\n }\r\n ,\r\n n.indexOf = function(e, t) {\r\n if (e.indexOf)\r\n return e.indexOf(t);\r\n for (var n = 0; n < e.length; n++)\r\n if (e[n] === t)\r\n return n;\r\n return -1\r\n }\r\n ,\r\n n.map = function(e, t) {\r\n if (e.map)\r\n return e.map(t);\r\n for (var n = [], i = 0; i < e.length; i += 1)\r\n n.push(t(e[i]));\r\n return n\r\n }\r\n ,\r\n n.topologicalSort = function(e) {\r\n var t = []\r\n , i = []\r\n , o = [];\r\n for (var r in e)\r\n i[r] || o[r] || n._topologicalSort(r, i, o, e, t);\r\n return t\r\n }\r\n ,\r\n n._topologicalSort = function(e, t, i, o, r) {\r\n var s = o[e] || [];\r\n i[e] = !0;\r\n for (var a = 0; a < s.length; a += 1) {\r\n var l = s[a];\r\n i[l] || t[l] || n._topologicalSort(l, t, i, o, r)\r\n }\r\n i[e] = !1,\r\n t[e] = !0,\r\n r.push(e)\r\n }\r\n ,\r\n n.chain = function() {\r\n for (var e = [], t = 0; t < arguments.length; t += 1) {\r\n var n = arguments[t];\r\n n._chained ? e.push.apply(e, n._chained) : e.push(n)\r\n }\r\n var i = function() {\r\n for (var t, n = new Array(arguments.length), i = 0, o = arguments.length; i < o; i++)\r\n n[i] = arguments[i];\r\n for (i = 0; i < e.length; i += 1) {\r\n var r = e[i].apply(t, n);\r\n void 0 !== r && (t = r)\r\n }\r\n return t\r\n };\r\n return i._chained = e,\r\n i\r\n }\r\n ,\r\n n.chainPathBefore = function(e, t, i) {\r\n return n.set(e, t, n.chain(i, n.get(e, t)))\r\n }\r\n ,\r\n n.chainPathAfter = function(e, t, i) {\r\n return n.set(e, t, n.chain(n.get(e, t), i))\r\n }\r\n }()\r\n }\r\n , function(e, t) {\r\n var n = {};\r\n e.exports = n,\r\n n.create = function(e) {\r\n var t = {\r\n min: {\r\n x: 0,\r\n y: 0\r\n },\r\n max: {\r\n x: 0,\r\n y: 0\r\n }\r\n };\r\n return e && n.update(t, e),\r\n t\r\n }\r\n ,\r\n n.update = function(e, t, n) {\r\n e.min.x = 1 / 0,\r\n e.max.x = -1 / 0,\r\n e.min.y = 1 / 0,\r\n e.max.y = -1 / 0;\r\n for (var i = 0; i < t.length; i++) {\r\n var o = t[i];\r\n o.x > e.max.x && (e.max.x = o.x),\r\n o.x < e.min.x && (e.min.x = o.x),\r\n o.y > e.max.y && (e.max.y = o.y),\r\n o.y < e.min.y && (e.min.y = o.y)\r\n }\r\n n && (n.x > 0 ? e.max.x += n.x : e.min.x += n.x,\r\n n.y > 0 ? e.max.y += n.y : e.min.y += n.y)\r\n }\r\n ,\r\n n.contains = function(e, t) {\r\n return t.x >= e.min.x && t.x <= e.max.x && t.y >= e.min.y && t.y <= e.max.y\r\n }\r\n ,\r\n n.overlaps = function(e, t) {\r\n return e.min.x <= t.max.x && e.max.x >= t.min.x && e.max.y >= t.min.y && e.min.y <= t.max.y\r\n }\r\n ,\r\n n.translate = function(e, t) {\r\n e.min.x += t.x,\r\n e.max.x += t.x,\r\n e.min.y += t.y,\r\n e.max.y += t.y\r\n }\r\n ,\r\n n.shift = function(e, t) {\r\n var n = e.max.x - e.min.x\r\n , i = e.max.y - e.min.y;\r\n e.min.x = t.x,\r\n e.max.x = t.x + n,\r\n e.min.y = t.y,\r\n e.max.y = t.y + i\r\n }\r\n }\r\n , function(e, t) {\r\n var n = {};\r\n e.exports = n,\r\n n.create = function(e, t) {\r\n return {\r\n x: e || 0,\r\n y: t || 0\r\n }\r\n }\r\n ,\r\n n.clone = function(e) {\r\n return {\r\n x: e.x,\r\n y: e.y\r\n }\r\n }\r\n ,\r\n n.magnitude = function(e) {\r\n return Math.sqrt(e.x * e.x + e.y * e.y)\r\n }\r\n ,\r\n n.magnitudeSquared = function(e) {\r\n return e.x * e.x + e.y * e.y\r\n }\r\n ,\r\n n.rotate = function(e, t, n) {\r\n var i = Math.cos(t)\r\n , o = Math.sin(t);\r\n n || (n = {});\r\n var r = e.x * i - e.y * o;\r\n return n.y = e.x * o + e.y * i,\r\n n.x = r,\r\n n\r\n }\r\n ,\r\n n.rotateAbout = function(e, t, n, i) {\r\n var o = Math.cos(t)\r\n , r = Math.sin(t);\r\n i || (i = {});\r\n var s = n.x + ((e.x - n.x) * o - (e.y - n.y) * r);\r\n return i.y = n.y + ((e.x - n.x) * r + (e.y - n.y) * o),\r\n i.x = s,\r\n i\r\n }\r\n ,\r\n n.normalise = function(e) {\r\n var t = n.magnitude(e);\r\n return 0 === t ? {\r\n x: 0,\r\n y: 0\r\n } : {\r\n x: e.x / t,\r\n y: e.y / t\r\n }\r\n }\r\n ,\r\n n.dot = function(e, t) {\r\n return e.x * t.x + e.y * t.y\r\n }\r\n ,\r\n n.cross = function(e, t) {\r\n return e.x * t.y - e.y * t.x\r\n }\r\n ,\r\n n.cross3 = function(e, t, n) {\r\n return (t.x - e.x) * (n.y - e.y) - (t.y - e.y) * (n.x - e.x)\r\n }\r\n ,\r\n n.add = function(e, t, n) {\r\n return n || (n = {}),\r\n n.x = e.x + t.x,\r\n n.y = e.y + t.y,\r\n n\r\n }\r\n ,\r\n n.sub = function(e, t, n) {\r\n return n || (n = {}),\r\n n.x = e.x - t.x,\r\n n.y = e.y - t.y,\r\n n\r\n }\r\n ,\r\n n.mult = function(e, t) {\r\n return {\r\n x: e.x * t,\r\n y: e.y * t\r\n }\r\n }\r\n ,\r\n n.div = function(e, t) {\r\n return {\r\n x: e.x / t,\r\n y: e.y / t\r\n }\r\n }\r\n ,\r\n n.perp = function(e, t) {\r\n return {\r\n x: (t = !0 === t ? -1 : 1) * -e.y,\r\n y: t * e.x\r\n }\r\n }\r\n ,\r\n n.neg = function(e) {\r\n return {\r\n x: -e.x,\r\n y: -e.y\r\n }\r\n }\r\n ,\r\n n.angle = function(e, t) {\r\n return Math.atan2(t.y - e.y, t.x - e.x)\r\n }\r\n ,\r\n n._temp = [n.create(), n.create(), n.create(), n.create(), n.create(), n.create()]\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(2)\r\n , r = n(0);\r\n i.create = function(e, t) {\r\n for (var n = [], i = 0; i < e.length; i++) {\r\n var o = e[i]\r\n , r = {\r\n x: o.x,\r\n y: o.y,\r\n index: i,\r\n body: t,\r\n isInternal: !1\r\n };\r\n n.push(r)\r\n }\r\n return n\r\n }\r\n ,\r\n i.fromPath = function(e, t) {\r\n var n = [];\r\n return e.replace(/L?\\s*([-\\d.e]+)[\\s,]*([-\\d.e]+)*/gi, function(e, t, i) {\r\n n.push({\r\n x: parseFloat(t),\r\n y: parseFloat(i)\r\n })\r\n }),\r\n i.create(n, t)\r\n }\r\n ,\r\n i.centre = function(e) {\r\n for (var t, n, r, s = i.area(e, !0), a = {\r\n x: 0,\r\n y: 0\r\n }, l = 0; l < e.length; l++)\r\n r = (l + 1) % e.length,\r\n t = o.cross(e[l], e[r]),\r\n n = o.mult(o.add(e[l], e[r]), t),\r\n a = o.add(a, n);\r\n return o.div(a, 6 * s)\r\n }\r\n ,\r\n i.mean = function(e) {\r\n for (var t = {\r\n x: 0,\r\n y: 0\r\n }, n = 0; n < e.length; n++)\r\n t.x += e[n].x,\r\n t.y += e[n].y;\r\n return o.div(t, e.length)\r\n }\r\n ,\r\n i.area = function(e, t) {\r\n for (var n = 0, i = e.length - 1, o = 0; o < e.length; o++)\r\n n += (e[i].x - e[o].x) * (e[i].y + e[o].y),\r\n i = o;\r\n return t ? n / 2 : Math.abs(n) / 2\r\n }\r\n ,\r\n i.inertia = function(e, t) {\r\n for (var n, i, r = 0, s = 0, a = e, l = 0; l < a.length; l++)\r\n i = (l + 1) % a.length,\r\n r += (n = Math.abs(o.cross(a[i], a[l]))) * (o.dot(a[i], a[i]) + o.dot(a[i], a[l]) + o.dot(a[l], a[l])),\r\n s += n;\r\n return t / 6 * (r / s)\r\n }\r\n ,\r\n i.translate = function(e, t, n) {\r\n var i;\r\n if (n)\r\n for (i = 0; i < e.length; i++)\r\n e[i].x += t.x * n,\r\n e[i].y += t.y * n;\r\n else\r\n for (i = 0; i < e.length; i++)\r\n e[i].x += t.x,\r\n e[i].y += t.y;\r\n return e\r\n }\r\n ,\r\n i.rotate = function(e, t, n) {\r\n if (0 !== t) {\r\n for (var i = Math.cos(t), o = Math.sin(t), r = 0; r < e.length; r++) {\r\n var s = e[r]\r\n , a = s.x - n.x\r\n , l = s.y - n.y;\r\n s.x = n.x + (a * i - l * o),\r\n s.y = n.y + (a * o + l * i)\r\n }\r\n return e\r\n }\r\n }\r\n ,\r\n i.contains = function(e, t) {\r\n for (var n = 0; n < e.length; n++) {\r\n var i = e[n]\r\n , o = e[(n + 1) % e.length];\r\n if ((t.x - i.x) * (o.y - i.y) + (t.y - i.y) * (i.x - o.x) > 0)\r\n return !1\r\n }\r\n return !0\r\n }\r\n ,\r\n i.scale = function(e, t, n, r) {\r\n if (1 === t && 1 === n)\r\n return e;\r\n var s, a;\r\n r = r || i.centre(e);\r\n for (var l = 0; l < e.length; l++)\r\n s = e[l],\r\n a = o.sub(s, r),\r\n e[l].x = r.x + a.x * t,\r\n e[l].y = r.y + a.y * n;\r\n return e\r\n }\r\n ,\r\n i.chamfer = function(e, t, n, i, s) {\r\n t = \"number\" == typeof t ? [t] : t || [8],\r\n n = void 0 !== n ? n : -1,\r\n i = i || 2,\r\n s = s || 14;\r\n for (var a = [], l = 0; l < e.length; l++) {\r\n var c = e[l - 1 >= 0 ? l - 1 : e.length - 1]\r\n , d = e[l]\r\n , u = e[(l + 1) % e.length]\r\n , p = t[l < t.length ? l : t.length - 1];\r\n if (0 !== p) {\r\n var f = o.normalise({\r\n x: d.y - c.y,\r\n y: c.x - d.x\r\n })\r\n , v = o.normalise({\r\n x: u.y - d.y,\r\n y: d.x - u.x\r\n })\r\n , m = Math.sqrt(2 * Math.pow(p, 2))\r\n , y = o.mult(r.clone(f), p)\r\n , g = o.normalise(o.mult(o.add(f, v), .5))\r\n , x = o.sub(d, o.mult(g, m))\r\n , h = n;\r\n -1 === n && (h = 1.75 * Math.pow(p, .32)),\r\n (h = r.clamp(h, i, s)) % 2 == 1 && (h += 1);\r\n for (var b = Math.acos(o.dot(f, v)) / h, w = 0; w < h; w++)\r\n a.push(o.add(o.rotate(y, b * w), x))\r\n } else\r\n a.push(d)\r\n }\r\n return a\r\n }\r\n ,\r\n i.clockwiseSort = function(e) {\r\n var t = i.mean(e);\r\n return e.sort(function(e, n) {\r\n return o.angle(t, e) - o.angle(t, n)\r\n }),\r\n e\r\n }\r\n ,\r\n i.isConvex = function(e) {\r\n var t, n, i, o, r = 0, s = e.length;\r\n if (s < 3)\r\n return null;\r\n for (t = 0; t < s; t++)\r\n if (i = (t + 2) % s,\r\n o = (e[n = (t + 1) % s].x - e[t].x) * (e[i].y - e[n].y),\r\n (o -= (e[n].y - e[t].y) * (e[i].x - e[n].x)) < 0 ? r |= 1 : o > 0 && (r |= 2),\r\n 3 === r)\r\n return !1;\r\n return 0 !== r || null\r\n }\r\n ,\r\n i.hull = function(e) {\r\n var t, n, i = [], r = [];\r\n for ((e = e.slice(0)).sort(function(e, t) {\r\n var n = e.x - t.x;\r\n return 0 !== n ? n : e.y - t.y\r\n }),\r\n n = 0; n < e.length; n += 1) {\r\n for (t = e[n]; r.length >= 2 && o.cross3(r[r.length - 2], r[r.length - 1], t) <= 0; )\r\n r.pop();\r\n r.push(t)\r\n }\r\n for (n = e.length - 1; n >= 0; n -= 1) {\r\n for (t = e[n]; i.length >= 2 && o.cross3(i[i.length - 2], i[i.length - 1], t) <= 0; )\r\n i.pop();\r\n i.push(t)\r\n }\r\n return i.pop(),\r\n r.pop(),\r\n i.concat(r)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(0);\r\n i.on = function(e, t, n) {\r\n for (var i, o = t.split(\" \"), r = 0; r < o.length; r++)\r\n i = o[r],\r\n e.events = e.events || {},\r\n e.events[i] = e.events[i] || [],\r\n e.events[i].push(n);\r\n return n\r\n }\r\n ,\r\n i.off = function(e, t, n) {\r\n if (t) {\r\n \"function\" == typeof t && (n = t,\r\n t = o.keys(e.events).join(\" \"));\r\n for (var i = t.split(\" \"), r = 0; r < i.length; r++) {\r\n var s = e.events[i[r]]\r\n , a = [];\r\n if (n && s)\r\n for (var l = 0; l < s.length; l++)\r\n s[l] !== n && a.push(s[l]);\r\n e.events[i[r]] = a\r\n }\r\n } else\r\n e.events = {}\r\n }\r\n ,\r\n i.trigger = function(e, t, n) {\r\n var i, r, s, a, l = e.events;\r\n if (l && o.keys(l).length > 0) {\r\n n || (n = {}),\r\n i = t.split(\" \");\r\n for (var c = 0; c < i.length; c++)\r\n if (s = l[r = i[c]]) {\r\n (a = o.clone(n, !1)).name = r,\r\n a.source = e;\r\n for (var d = 0; d < s.length; d++)\r\n s[d].apply(e, [a])\r\n }\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(4)\r\n , r = n(0)\r\n , s = n(1)\r\n , a = n(6);\r\n i.create = function(e) {\r\n return r.extend({\r\n id: r.nextId(),\r\n type: \"composite\",\r\n parent: null,\r\n isModified: !1,\r\n bodies: [],\r\n constraints: [],\r\n composites: [],\r\n label: \"Composite\",\r\n plugin: {}\r\n }, e)\r\n }\r\n ,\r\n i.setModified = function(e, t, n, o) {\r\n if (e.isModified = t,\r\n n && e.parent && i.setModified(e.parent, t, n, o),\r\n o)\r\n for (var r = 0; r < e.composites.length; r++) {\r\n var s = e.composites[r];\r\n i.setModified(s, t, n, o)\r\n }\r\n }\r\n ,\r\n i.add = function(e, t) {\r\n var n = [].concat(t);\r\n o.trigger(e, \"beforeAdd\", {\r\n object: t\r\n });\r\n for (var s = 0; s < n.length; s++) {\r\n var a = n[s];\r\n switch (a.type) {\r\n case \"body\":\r\n if (a.parent !== a) {\r\n r.warn(\"Composite.add: skipped adding a compound body part (you must add its parent instead)\");\r\n break\r\n }\r\n i.addBody(e, a);\r\n break;\r\n case \"constraint\":\r\n i.addConstraint(e, a);\r\n break;\r\n case \"composite\":\r\n i.addComposite(e, a);\r\n break;\r\n case \"mouseConstraint\":\r\n i.addConstraint(e, a.constraint);\r\n }\r\n }\r\n return o.trigger(e, \"afterAdd\", {\r\n object: t\r\n }),\r\n e\r\n }\r\n ,\r\n i.remove = function(e, t, n) {\r\n var r = [].concat(t);\r\n o.trigger(e, \"beforeRemove\", {\r\n object: t\r\n });\r\n for (var s = 0; s < r.length; s++) {\r\n var a = r[s];\r\n switch (a.type) {\r\n case \"body\":\r\n i.removeBody(e, a, n);\r\n break;\r\n case \"constraint\":\r\n i.removeConstraint(e, a, n);\r\n break;\r\n case \"composite\":\r\n i.removeComposite(e, a, n);\r\n break;\r\n case \"mouseConstraint\":\r\n i.removeConstraint(e, a.constraint);\r\n }\r\n }\r\n return o.trigger(e, \"afterRemove\", {\r\n object: t\r\n }),\r\n e\r\n }\r\n ,\r\n i.addComposite = function(e, t) {\r\n return e.composites.push(t),\r\n t.parent = e,\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.removeComposite = function(e, t, n) {\r\n var o = r.indexOf(e.composites, t);\r\n if (-1 !== o && (i.removeCompositeAt(e, o),\r\n i.setModified(e, !0, !0, !1)),\r\n n)\r\n for (var s = 0; s < e.composites.length; s++)\r\n i.removeComposite(e.composites[s], t, !0);\r\n return e\r\n }\r\n ,\r\n i.removeCompositeAt = function(e, t) {\r\n return e.composites.splice(t, 1),\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.addBody = function(e, t) {\r\n return e.bodies.push(t),\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.removeBody = function(e, t, n) {\r\n var o = r.indexOf(e.bodies, t);\r\n if (-1 !== o && (i.removeBodyAt(e, o),\r\n i.setModified(e, !0, !0, !1)),\r\n n)\r\n for (var s = 0; s < e.composites.length; s++)\r\n i.removeBody(e.composites[s], t, !0);\r\n return e\r\n }\r\n ,\r\n i.removeBodyAt = function(e, t) {\r\n return e.bodies.splice(t, 1),\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.addConstraint = function(e, t) {\r\n return e.constraints.push(t),\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.removeConstraint = function(e, t, n) {\r\n var o = r.indexOf(e.constraints, t);\r\n if (-1 !== o && i.removeConstraintAt(e, o),\r\n n)\r\n for (var s = 0; s < e.composites.length; s++)\r\n i.removeConstraint(e.composites[s], t, !0);\r\n return e\r\n }\r\n ,\r\n i.removeConstraintAt = function(e, t) {\r\n return e.constraints.splice(t, 1),\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.clear = function(e, t, n) {\r\n if (n)\r\n for (var o = 0; o < e.composites.length; o++)\r\n i.clear(e.composites[o], t, !0);\r\n return t ? e.bodies = e.bodies.filter(function(e) {\r\n return e.isStatic\r\n }) : e.bodies.length = 0,\r\n e.constraints.length = 0,\r\n e.composites.length = 0,\r\n i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.allBodies = function(e) {\r\n for (var t = [].concat(e.bodies), n = 0; n < e.composites.length; n++)\r\n t = t.concat(i.allBodies(e.composites[n]));\r\n return t\r\n }\r\n ,\r\n i.allConstraints = function(e) {\r\n for (var t = [].concat(e.constraints), n = 0; n < e.composites.length; n++)\r\n t = t.concat(i.allConstraints(e.composites[n]));\r\n return t\r\n }\r\n ,\r\n i.allComposites = function(e) {\r\n for (var t = [].concat(e.composites), n = 0; n < e.composites.length; n++)\r\n t = t.concat(i.allComposites(e.composites[n]));\r\n return t\r\n }\r\n ,\r\n i.get = function(e, t, n) {\r\n var o, r;\r\n switch (n) {\r\n case \"body\":\r\n o = i.allBodies(e);\r\n break;\r\n case \"constraint\":\r\n o = i.allConstraints(e);\r\n break;\r\n case \"composite\":\r\n o = i.allComposites(e).concat(e);\r\n }\r\n return o ? 0 === (r = o.filter(function(e) {\r\n return e.id.toString() === t.toString()\r\n })).length ? null : r[0] : null\r\n }\r\n ,\r\n i.move = function(e, t, n) {\r\n return i.remove(e, t),\r\n i.add(n, t),\r\n e\r\n }\r\n ,\r\n i.rebase = function(e) {\r\n for (var t = i.allBodies(e).concat(i.allConstraints(e)).concat(i.allComposites(e)), n = 0; n < t.length; n++)\r\n t[n].id = r.nextId();\r\n return i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.translate = function(e, t, n) {\r\n for (var o = n ? i.allBodies(e) : e.bodies, r = 0; r < o.length; r++)\r\n a.translate(o[r], t);\r\n return i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.rotate = function(e, t, n, o) {\r\n for (var r = Math.cos(t), s = Math.sin(t), l = o ? i.allBodies(e) : e.bodies, c = 0; c < l.length; c++) {\r\n var d = l[c]\r\n , u = d.position.x - n.x\r\n , p = d.position.y - n.y;\r\n a.setPosition(d, {\r\n x: n.x + (u * r - p * s),\r\n y: n.y + (u * s + p * r)\r\n }),\r\n a.rotate(d, t)\r\n }\r\n return i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.scale = function(e, t, n, o, r) {\r\n for (var s = r ? i.allBodies(e) : e.bodies, l = 0; l < s.length; l++) {\r\n var c = s[l]\r\n , d = c.position.x - o.x\r\n , u = c.position.y - o.y;\r\n a.setPosition(c, {\r\n x: o.x + d * t,\r\n y: o.y + u * n\r\n }),\r\n a.scale(c, t, n)\r\n }\r\n return i.setModified(e, !0, !0, !1),\r\n e\r\n }\r\n ,\r\n i.bounds = function(e) {\r\n for (var t = i.allBodies(e), n = [], o = 0; o < t.length; o += 1) {\r\n var r = t[o];\r\n n.push(r.bounds.min, r.bounds.max)\r\n }\r\n return s.create(n)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(2)\r\n , s = n(7)\r\n , a = (n(10),\r\n n(0))\r\n , l = n(1)\r\n , c = n(15);\r\n !function() {\r\n i._inertiaScale = 4,\r\n i._nextCollidingGroupId = 1,\r\n i._nextNonCollidingGroupId = -1,\r\n i._nextCategory = 1,\r\n i.create = function(t) {\r\n var n = {\r\n id: a.nextId(),\r\n type: \"body\",\r\n label: \"Body\",\r\n parts: [],\r\n plugin: {},\r\n angle: 0,\r\n vertices: o.fromPath(\"L 0 0 L 40 0 L 40 40 L 0 40\"),\r\n position: {\r\n x: 0,\r\n y: 0\r\n },\r\n force: {\r\n x: 0,\r\n y: 0\r\n },\r\n torque: 0,\r\n positionImpulse: {\r\n x: 0,\r\n y: 0\r\n },\r\n constraintImpulse: {\r\n x: 0,\r\n y: 0,\r\n angle: 0\r\n },\r\n totalContacts: 0,\r\n speed: 0,\r\n angularSpeed: 0,\r\n velocity: {\r\n x: 0,\r\n y: 0\r\n },\r\n angularVelocity: 0,\r\n isSensor: !1,\r\n isStatic: !1,\r\n isSleeping: !1,\r\n motion: 0,\r\n sleepThreshold: 60,\r\n density: .001,\r\n restitution: 0,\r\n friction: .1,\r\n frictionStatic: .5,\r\n frictionAir: .01,\r\n collisionFilter: {\r\n category: 1,\r\n mask: 4294967295,\r\n group: 0\r\n },\r\n slop: .05,\r\n timeScale: 1,\r\n render: {\r\n visible: !0,\r\n opacity: 1,\r\n strokeStyle: null,\r\n fillStyle: null,\r\n lineWidth: null,\r\n sprite: {\r\n xScale: 1,\r\n yScale: 1,\r\n xOffset: 0,\r\n yOffset: 0\r\n }\r\n },\r\n events: null,\r\n bounds: null,\r\n chamfer: null,\r\n circleRadius: 0,\r\n positionPrev: null,\r\n anglePrev: 0,\r\n parent: null,\r\n axes: null,\r\n area: 0,\r\n mass: 0,\r\n inertia: 0,\r\n _original: null\r\n }\r\n , i = a.extend(n, t);\r\n return e(i, t),\r\n i\r\n }\r\n ,\r\n i.nextGroup = function(e) {\r\n return e ? i._nextNonCollidingGroupId-- : i._nextCollidingGroupId++\r\n }\r\n ,\r\n i.nextCategory = function() {\r\n return i._nextCategory = i._nextCategory << 1,\r\n i._nextCategory\r\n }\r\n ;\r\n var e = function(e, t) {\r\n t = t || {},\r\n i.set(e, {\r\n bounds: e.bounds || l.create(e.vertices),\r\n positionPrev: e.positionPrev || r.clone(e.position),\r\n anglePrev: e.anglePrev || e.angle,\r\n vertices: e.vertices,\r\n parts: e.parts || [e],\r\n isStatic: e.isStatic,\r\n isSleeping: e.isSleeping,\r\n parent: e.parent || e\r\n }),\r\n o.rotate(e.vertices, e.angle, e.position),\r\n c.rotate(e.axes, e.angle),\r\n l.update(e.bounds, e.vertices, e.velocity),\r\n i.set(e, {\r\n axes: t.axes || e.axes,\r\n area: t.area || e.area,\r\n mass: t.mass || e.mass,\r\n inertia: t.inertia || e.inertia\r\n });\r\n var n = e.isStatic ? \"#14151f\" : a.choose([\"#f19648\", \"#f5d259\", \"#f55a3c\", \"#063e7b\", \"#ececd1\"])\r\n , s = e.isStatic ? \"#555\" : \"#ccc\"\r\n , d = e.isStatic && null === e.render.fillStyle ? 1 : 0;\r\n e.render.fillStyle = e.render.fillStyle || n,\r\n e.render.strokeStyle = e.render.strokeStyle || s,\r\n e.render.lineWidth = e.render.lineWidth || d,\r\n e.render.sprite.xOffset += -(e.bounds.min.x - e.position.x) / (e.bounds.max.x - e.bounds.min.x),\r\n e.render.sprite.yOffset += -(e.bounds.min.y - e.position.y) / (e.bounds.max.y - e.bounds.min.y)\r\n };\r\n i.set = function(e, t, n) {\r\n var o;\r\n for (o in \"string\" == typeof t && (o = t,\r\n (t = {})[o] = n),\r\n t)\r\n if (Object.prototype.hasOwnProperty.call(t, o))\r\n switch (n = t[o],\r\n o) {\r\n case \"isStatic\":\r\n i.setStatic(e, n);\r\n break;\r\n case \"isSleeping\":\r\n s.set(e, n);\r\n break;\r\n case \"mass\":\r\n i.setMass(e, n);\r\n break;\r\n case \"density\":\r\n i.setDensity(e, n);\r\n break;\r\n case \"inertia\":\r\n i.setInertia(e, n);\r\n break;\r\n case \"vertices\":\r\n i.setVertices(e, n);\r\n break;\r\n case \"position\":\r\n i.setPosition(e, n);\r\n break;\r\n case \"angle\":\r\n i.setAngle(e, n);\r\n break;\r\n case \"velocity\":\r\n i.setVelocity(e, n);\r\n break;\r\n case \"angularVelocity\":\r\n i.setAngularVelocity(e, n);\r\n break;\r\n case \"parts\":\r\n i.setParts(e, n);\r\n break;\r\n case \"centre\":\r\n i.setCentre(e, n);\r\n break;\r\n default:\r\n e[o] = n;\r\n }\r\n }\r\n ,\r\n i.setStatic = function(e, t) {\r\n for (var n = 0; n < e.parts.length; n++) {\r\n var i = e.parts[n];\r\n i.isStatic = t,\r\n t ? (i._original = {\r\n restitution: i.restitution,\r\n friction: i.friction,\r\n mass: i.mass,\r\n inertia: i.inertia,\r\n density: i.density,\r\n inverseMass: i.inverseMass,\r\n inverseInertia: i.inverseInertia\r\n },\r\n i.restitution = 0,\r\n i.friction = 1,\r\n i.mass = i.inertia = i.density = 1 / 0,\r\n i.inverseMass = i.inverseInertia = 0,\r\n i.positionPrev.x = i.position.x,\r\n i.positionPrev.y = i.position.y,\r\n i.anglePrev = i.angle,\r\n i.angularVelocity = 0,\r\n i.speed = 0,\r\n i.angularSpeed = 0,\r\n i.motion = 0) : i._original && (i.restitution = i._original.restitution,\r\n i.friction = i._original.friction,\r\n i.mass = i._original.mass,\r\n i.inertia = i._original.inertia,\r\n i.density = i._original.density,\r\n i.inverseMass = i._original.inverseMass,\r\n i.inverseInertia = i._original.inverseInertia,\r\n i._original = null)\r\n }\r\n }\r\n ,\r\n i.setMass = function(e, t) {\r\n var n = e.inertia / (e.mass / 6);\r\n e.inertia = n * (t / 6),\r\n e.inverseInertia = 1 / e.inertia,\r\n e.mass = t,\r\n e.inverseMass = 1 / e.mass,\r\n e.density = e.mass / e.area\r\n }\r\n ,\r\n i.setDensity = function(e, t) {\r\n i.setMass(e, t * e.area),\r\n e.density = t\r\n }\r\n ,\r\n i.setInertia = function(e, t) {\r\n e.inertia = t,\r\n e.inverseInertia = 1 / e.inertia\r\n }\r\n ,\r\n i.setVertices = function(e, t) {\r\n t[0].body === e ? e.vertices = t : e.vertices = o.create(t, e),\r\n e.axes = c.fromVertices(e.vertices),\r\n e.area = o.area(e.vertices),\r\n i.setMass(e, e.density * e.area);\r\n var n = o.centre(e.vertices);\r\n o.translate(e.vertices, n, -1),\r\n i.setInertia(e, i._inertiaScale * o.inertia(e.vertices, e.mass)),\r\n o.translate(e.vertices, e.position),\r\n l.update(e.bounds, e.vertices, e.velocity)\r\n }\r\n ,\r\n i.setParts = function(e, t, n) {\r\n var r;\r\n for (t = t.slice(0),\r\n e.parts.length = 0,\r\n e.parts.push(e),\r\n e.parent = e,\r\n r = 0; r < t.length; r++) {\r\n var s = t[r];\r\n s !== e && (s.parent = e,\r\n e.parts.push(s))\r\n }\r\n if (1 !== e.parts.length) {\r\n if (n = void 0 === n || n) {\r\n var a = [];\r\n for (r = 0; r < t.length; r++)\r\n a = a.concat(t[r].vertices);\r\n o.clockwiseSort(a);\r\n var l = o.hull(a)\r\n , c = o.centre(l);\r\n i.setVertices(e, l),\r\n o.translate(e.vertices, c)\r\n }\r\n var d = i._totalProperties(e);\r\n e.area = d.area,\r\n e.parent = e,\r\n e.position.x = d.centre.x,\r\n e.position.y = d.centre.y,\r\n e.positionPrev.x = d.centre.x,\r\n e.positionPrev.y = d.centre.y,\r\n i.setMass(e, d.mass),\r\n i.setInertia(e, d.inertia),\r\n i.setPosition(e, d.centre)\r\n }\r\n }\r\n ,\r\n i.setCentre = function(e, t, n) {\r\n n ? (e.positionPrev.x += t.x,\r\n e.positionPrev.y += t.y,\r\n e.position.x += t.x,\r\n e.position.y += t.y) : (e.positionPrev.x = t.x - (e.position.x - e.positionPrev.x),\r\n e.positionPrev.y = t.y - (e.position.y - e.positionPrev.y),\r\n e.position.x = t.x,\r\n e.position.y = t.y)\r\n }\r\n ,\r\n i.setPosition = function(e, t) {\r\n var n = r.sub(t, e.position);\r\n e.positionPrev.x += n.x,\r\n e.positionPrev.y += n.y;\r\n for (var i = 0; i < e.parts.length; i++) {\r\n var s = e.parts[i];\r\n s.position.x += n.x,\r\n s.position.y += n.y,\r\n o.translate(s.vertices, n),\r\n l.update(s.bounds, s.vertices, e.velocity)\r\n }\r\n }\r\n ,\r\n i.setAngle = function(e, t) {\r\n var n = t - e.angle;\r\n e.anglePrev += n;\r\n for (var i = 0; i < e.parts.length; i++) {\r\n var s = e.parts[i];\r\n s.angle += n,\r\n o.rotate(s.vertices, n, e.position),\r\n c.rotate(s.axes, n),\r\n l.update(s.bounds, s.vertices, e.velocity),\r\n i > 0 && r.rotateAbout(s.position, n, e.position, s.position)\r\n }\r\n }\r\n ,\r\n i.setVelocity = function(e, t) {\r\n e.positionPrev.x = e.position.x - t.x,\r\n e.positionPrev.y = e.position.y - t.y,\r\n e.velocity.x = t.x,\r\n e.velocity.y = t.y,\r\n e.speed = r.magnitude(e.velocity)\r\n }\r\n ,\r\n i.setAngularVelocity = function(e, t) {\r\n e.anglePrev = e.angle - t,\r\n e.angularVelocity = t,\r\n e.angularSpeed = Math.abs(e.angularVelocity)\r\n }\r\n ,\r\n i.translate = function(e, t) {\r\n i.setPosition(e, r.add(e.position, t))\r\n }\r\n ,\r\n i.rotate = function(e, t, n) {\r\n if (n) {\r\n var o = Math.cos(t)\r\n , r = Math.sin(t)\r\n , s = e.position.x - n.x\r\n , a = e.position.y - n.y;\r\n i.setPosition(e, {\r\n x: n.x + (s * o - a * r),\r\n y: n.y + (s * r + a * o)\r\n }),\r\n i.setAngle(e, e.angle + t)\r\n } else\r\n i.setAngle(e, e.angle + t)\r\n }\r\n ,\r\n i.scale = function(e, t, n, r) {\r\n var s = 0\r\n , a = 0;\r\n r = r || e.position;\r\n for (var d = 0; d < e.parts.length; d++) {\r\n var u = e.parts[d];\r\n o.scale(u.vertices, t, n, r),\r\n u.axes = c.fromVertices(u.vertices),\r\n u.area = o.area(u.vertices),\r\n i.setMass(u, e.density * u.area),\r\n o.translate(u.vertices, {\r\n x: -u.position.x,\r\n y: -u.position.y\r\n }),\r\n i.setInertia(u, i._inertiaScale * o.inertia(u.vertices, u.mass)),\r\n o.translate(u.vertices, {\r\n x: u.position.x,\r\n y: u.position.y\r\n }),\r\n d > 0 && (s += u.area,\r\n a += u.inertia),\r\n u.position.x = r.x + (u.position.x - r.x) * t,\r\n u.position.y = r.y + (u.position.y - r.y) * n,\r\n l.update(u.bounds, u.vertices, e.velocity)\r\n }\r\n e.parts.length > 1 && (e.area = s,\r\n e.isStatic || (i.setMass(e, e.density * s),\r\n i.setInertia(e, a))),\r\n e.circleRadius && (t === n ? e.circleRadius *= t : e.circleRadius = null)\r\n }\r\n ,\r\n i.update = function(e, t, n, i) {\r\n var s = Math.pow(t * n * e.timeScale, 2)\r\n , a = 1 - e.frictionAir * n * e.timeScale\r\n , d = e.position.x - e.positionPrev.x\r\n , u = e.position.y - e.positionPrev.y;\r\n e.velocity.x = d * a * i + e.force.x / e.mass * s,\r\n e.velocity.y = u * a * i + e.force.y / e.mass * s,\r\n e.positionPrev.x = e.position.x,\r\n e.positionPrev.y = e.position.y,\r\n e.position.x += e.velocity.x,\r\n e.position.y += e.velocity.y,\r\n e.angularVelocity = (e.angle - e.anglePrev) * a * i + e.torque / e.inertia * s,\r\n e.anglePrev = e.angle,\r\n e.angle += e.angularVelocity,\r\n e.speed = r.magnitude(e.velocity),\r\n e.angularSpeed = Math.abs(e.angularVelocity);\r\n for (var p = 0; p < e.parts.length; p++) {\r\n var f = e.parts[p];\r\n o.translate(f.vertices, e.velocity),\r\n p > 0 && (f.position.x += e.velocity.x,\r\n f.position.y += e.velocity.y),\r\n 0 !== e.angularVelocity && (o.rotate(f.vertices, e.angularVelocity, e.position),\r\n c.rotate(f.axes, e.angularVelocity),\r\n p > 0 && r.rotateAbout(f.position, e.angularVelocity, e.position, f.position)),\r\n l.update(f.bounds, f.vertices, e.velocity)\r\n }\r\n }\r\n ,\r\n i.applyForce = function(e, t, n) {\r\n e.force.x += n.x,\r\n e.force.y += n.y;\r\n var i = t.x - e.position.x\r\n , o = t.y - e.position.y;\r\n e.torque += i * n.y - o * n.x\r\n }\r\n ,\r\n i._totalProperties = function(e) {\r\n for (var t = {\r\n mass: 0,\r\n area: 0,\r\n inertia: 0,\r\n centre: {\r\n x: 0,\r\n y: 0\r\n }\r\n }, n = 1 === e.parts.length ? 0 : 1; n < e.parts.length; n++) {\r\n var i = e.parts[n]\r\n , o = i.mass !== 1 / 0 ? i.mass : 1;\r\n t.mass += o,\r\n t.area += i.area,\r\n t.inertia += i.inertia,\r\n t.centre = r.add(t.centre, r.mult(i.position, o))\r\n }\r\n return t.centre = r.div(t.centre, t.mass),\r\n t\r\n }\r\n }()\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(4);\r\n i._motionWakeThreshold = .18,\r\n i._motionSleepThreshold = .08,\r\n i._minBias = .9,\r\n i.update = function(e, t) {\r\n for (var n = t * t * t, o = 0; o < e.length; o++) {\r\n var r = e[o]\r\n , s = r.speed * r.speed + r.angularSpeed * r.angularSpeed;\r\n if (0 === r.force.x && 0 === r.force.y) {\r\n var a = Math.min(r.motion, s)\r\n , l = Math.max(r.motion, s);\r\n r.motion = i._minBias * a + (1 - i._minBias) * l,\r\n r.sleepThreshold > 0 && r.motion < i._motionSleepThreshold * n ? (r.sleepCounter += 1,\r\n r.sleepCounter >= r.sleepThreshold && i.set(r, !0)) : r.sleepCounter > 0 && (r.sleepCounter -= 1)\r\n } else\r\n i.set(r, !1)\r\n }\r\n }\r\n ,\r\n i.afterCollisions = function(e, t) {\r\n for (var n = t * t * t, o = 0; o < e.length; o++) {\r\n var r = e[o];\r\n if (r.isActive) {\r\n var s = r.collision\r\n , a = s.bodyA.parent\r\n , l = s.bodyB.parent;\r\n if (!(a.isSleeping && l.isSleeping || a.isStatic || l.isStatic) && (a.isSleeping || l.isSleeping)) {\r\n var c = a.isSleeping && !a.isStatic ? a : l\r\n , d = c === a ? l : a;\r\n !c.isStatic && d.motion > i._motionWakeThreshold * n && i.set(c, !1)\r\n }\r\n }\r\n }\r\n }\r\n ,\r\n i.set = function(e, t) {\r\n var n = e.isSleeping;\r\n t ? (e.isSleeping = !0,\r\n e.sleepCounter = e.sleepThreshold,\r\n e.positionImpulse.x = 0,\r\n e.positionImpulse.y = 0,\r\n e.positionPrev.x = e.position.x,\r\n e.positionPrev.y = e.position.y,\r\n e.anglePrev = e.angle,\r\n e.speed = 0,\r\n e.angularSpeed = 0,\r\n e.motion = 0,\r\n n || o.trigger(e, \"sleepStart\")) : (e.isSleeping = !1,\r\n e.sleepCounter = 0,\r\n n && o.trigger(e, \"sleepEnd\"))\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(2)\r\n , s = n(7)\r\n , a = n(1)\r\n , l = n(15)\r\n , c = n(0);\r\n i._warming = .4,\r\n i._torqueDampen = 1,\r\n i._minLength = 1e-6,\r\n i.create = function(e) {\r\n var t = e;\r\n t.bodyA && !t.pointA && (t.pointA = {\r\n x: 0,\r\n y: 0\r\n }),\r\n t.bodyB && !t.pointB && (t.pointB = {\r\n x: 0,\r\n y: 0\r\n });\r\n var n = t.bodyA ? r.add(t.bodyA.position, t.pointA) : t.pointA\r\n , i = t.bodyB ? r.add(t.bodyB.position, t.pointB) : t.pointB\r\n , o = r.magnitude(r.sub(n, i));\r\n t.length = void 0 !== t.length ? t.length : o,\r\n t.id = t.id || c.nextId(),\r\n t.label = t.label || \"Constraint\",\r\n t.type = \"constraint\",\r\n t.stiffness = t.stiffness || (t.length > 0 ? 1 : .7),\r\n t.damping = t.damping || 0,\r\n t.angularStiffness = t.angularStiffness || 0,\r\n t.angleA = t.bodyA ? t.bodyA.angle : t.angleA,\r\n t.angleB = t.bodyB ? t.bodyB.angle : t.angleB,\r\n t.plugin = {};\r\n var s = {\r\n visible: !0,\r\n lineWidth: 2,\r\n strokeStyle: \"#ffffff\",\r\n type: \"line\",\r\n anchors: !0\r\n };\r\n return 0 === t.length && t.stiffness > .1 ? (s.type = \"pin\",\r\n s.anchors = !1) : t.stiffness < .9 && (s.type = \"spring\"),\r\n t.render = c.extend(s, t.render),\r\n t\r\n }\r\n ,\r\n i.preSolveAll = function(e) {\r\n for (var t = 0; t < e.length; t += 1) {\r\n var n = e[t]\r\n , i = n.constraintImpulse;\r\n n.isStatic || 0 === i.x && 0 === i.y && 0 === i.angle || (n.position.x += i.x,\r\n n.position.y += i.y,\r\n n.angle += i.angle)\r\n }\r\n }\r\n ,\r\n i.solveAll = function(e, t) {\r\n for (var n = 0; n < e.length; n += 1) {\r\n var o = e[n]\r\n , r = !o.bodyA || o.bodyA && o.bodyA.isStatic\r\n , s = !o.bodyB || o.bodyB && o.bodyB.isStatic;\r\n (r || s) && i.solve(e[n], t)\r\n }\r\n for (n = 0; n < e.length; n += 1)\r\n r = !(o = e[n]).bodyA || o.bodyA && o.bodyA.isStatic,\r\n s = !o.bodyB || o.bodyB && o.bodyB.isStatic,\r\n r || s || i.solve(e[n], t)\r\n }\r\n ,\r\n i.solve = function(e, t) {\r\n var n = e.bodyA\r\n , o = e.bodyB\r\n , s = e.pointA\r\n , a = e.pointB;\r\n if (n || o) {\r\n n && !n.isStatic && (r.rotate(s, n.angle - e.angleA, s),\r\n e.angleA = n.angle),\r\n o && !o.isStatic && (r.rotate(a, o.angle - e.angleB, a),\r\n e.angleB = o.angle);\r\n var l = s\r\n , c = a;\r\n if (n && (l = r.add(n.position, s)),\r\n o && (c = r.add(o.position, a)),\r\n l && c) {\r\n var d = r.sub(l, c)\r\n , u = r.magnitude(d);\r\n u < i._minLength && (u = i._minLength);\r\n var p, f, v, m, y, g = (u - e.length) / u, x = e.stiffness < 1 ? e.stiffness * t : e.stiffness, h = r.mult(d, g * x), b = (n ? n.inverseMass : 0) + (o ? o.inverseMass : 0), w = b + ((n ? n.inverseInertia : 0) + (o ? o.inverseInertia : 0));\r\n if (e.damping) {\r\n var S = r.create();\r\n v = r.div(d, u),\r\n y = r.sub(o && r.sub(o.position, o.positionPrev) || S, n && r.sub(n.position, n.positionPrev) || S),\r\n m = r.dot(v, y)\r\n }\r\n n && !n.isStatic && (f = n.inverseMass / b,\r\n n.constraintImpulse.x -= h.x * f,\r\n n.constraintImpulse.y -= h.y * f,\r\n n.position.x -= h.x * f,\r\n n.position.y -= h.y * f,\r\n e.damping && (n.positionPrev.x -= e.damping * v.x * m * f,\r\n n.positionPrev.y -= e.damping * v.y * m * f),\r\n p = r.cross(s, h) / w * i._torqueDampen * n.inverseInertia * (1 - e.angularStiffness),\r\n n.constraintImpulse.angle -= p,\r\n n.angle -= p),\r\n o && !o.isStatic && (f = o.inverseMass / b,\r\n o.constraintImpulse.x += h.x * f,\r\n o.constraintImpulse.y += h.y * f,\r\n o.position.x += h.x * f,\r\n o.position.y += h.y * f,\r\n e.damping && (o.positionPrev.x += e.damping * v.x * m * f,\r\n o.positionPrev.y += e.damping * v.y * m * f),\r\n p = r.cross(a, h) / w * i._torqueDampen * o.inverseInertia * (1 - e.angularStiffness),\r\n o.constraintImpulse.angle += p,\r\n o.angle += p)\r\n }\r\n }\r\n }\r\n ,\r\n i.postSolveAll = function(e) {\r\n for (var t = 0; t < e.length; t++) {\r\n var n = e[t]\r\n , c = n.constraintImpulse;\r\n if (!(n.isStatic || 0 === c.x && 0 === c.y && 0 === c.angle)) {\r\n s.set(n, !1);\r\n for (var d = 0; d < n.parts.length; d++) {\r\n var u = n.parts[d];\r\n o.translate(u.vertices, c),\r\n d > 0 && (u.position.x += c.x,\r\n u.position.y += c.y),\r\n 0 !== c.angle && (o.rotate(u.vertices, c.angle, n.position),\r\n l.rotate(u.axes, c.angle),\r\n d > 0 && r.rotateAbout(u.position, c.angle, n.position, u.position)),\r\n a.update(u.bounds, u.vertices, n.velocity)\r\n }\r\n c.angle *= i._warming,\r\n c.x *= i._warming,\r\n c.y *= i._warming\r\n }\r\n }\r\n }\r\n ,\r\n i.pointAWorld = function(e) {\r\n return {\r\n x: (e.bodyA ? e.bodyA.position.x : 0) + e.pointA.x,\r\n y: (e.bodyA ? e.bodyA.position.y : 0) + e.pointA.y\r\n }\r\n }\r\n ,\r\n i.pointBWorld = function(e) {\r\n return {\r\n x: (e.bodyB ? e.bodyB.position.x : 0) + e.pointB.x,\r\n y: (e.bodyB ? e.bodyB.position.y : 0) + e.pointB.y\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(18);\r\n i.create = function(e, t) {\r\n var n = e.bodyA\r\n , o = e.bodyB\r\n , r = e.parentA\r\n , s = e.parentB\r\n , a = {\r\n id: i.id(n, o),\r\n bodyA: n,\r\n bodyB: o,\r\n contacts: {},\r\n activeContacts: [],\r\n separation: 0,\r\n isActive: !0,\r\n confirmedActive: !0,\r\n isSensor: n.isSensor || o.isSensor,\r\n timeCreated: t,\r\n timeUpdated: t,\r\n inverseMass: r.inverseMass + s.inverseMass,\r\n friction: Math.min(r.friction, s.friction),\r\n frictionStatic: Math.max(r.frictionStatic, s.frictionStatic),\r\n restitution: Math.max(r.restitution, s.restitution),\r\n slop: Math.max(r.slop, s.slop)\r\n };\r\n return i.update(a, e, t),\r\n a\r\n }\r\n ,\r\n i.update = function(e, t, n) {\r\n var r = e.contacts\r\n , s = t.supports\r\n , a = e.activeContacts\r\n , l = t.parentA\r\n , c = t.parentB;\r\n if (e.collision = t,\r\n e.inverseMass = l.inverseMass + c.inverseMass,\r\n e.friction = Math.min(l.friction, c.friction),\r\n e.frictionStatic = Math.max(l.frictionStatic, c.frictionStatic),\r\n e.restitution = Math.max(l.restitution, c.restitution),\r\n e.slop = Math.max(l.slop, c.slop),\r\n a.length = 0,\r\n t.collided) {\r\n for (var d = 0; d < s.length; d++) {\r\n var u = s[d]\r\n , p = o.id(u)\r\n , f = r[p];\r\n f ? a.push(f) : a.push(r[p] = o.create(u))\r\n }\r\n e.separation = t.depth,\r\n i.setActive(e, !0, n)\r\n } else\r\n !0 === e.isActive && i.setActive(e, !1, n)\r\n }\r\n ,\r\n i.setActive = function(e, t, n) {\r\n t ? (e.isActive = !0,\r\n e.timeUpdated = n) : (e.isActive = !1,\r\n e.activeContacts.length = 0)\r\n }\r\n ,\r\n i.id = function(e, t) {\r\n return e.id < t.id ? \"A\" + e.id + \"B\" + t.id : \"A\" + t.id + \"B\" + e.id\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(0)\r\n , r = n(5)\r\n , s = n(1)\r\n , a = n(4)\r\n , l = n(11)\r\n , c = n(2)\r\n , d = n(14);\r\n !function() {\r\n var e, t;\r\n \"undefined\" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function(e) {\r\n window.setTimeout(function() {\r\n e(o.now())\r\n }, 1e3 / 60)\r\n }\r\n ,\r\n t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame),\r\n i.create = function(e) {\r\n var t = {\r\n controller: i,\r\n engine: null,\r\n element: null,\r\n canvas: null,\r\n mouse: null,\r\n frameRequestId: null,\r\n options: {\r\n width: 800,\r\n height: 600,\r\n pixelRatio: 1,\r\n background: \"#14151f\",\r\n wireframeBackground: \"#14151f\",\r\n hasBounds: !!e.bounds,\r\n enabled: !0,\r\n wireframes: !0,\r\n showSleeping: !0,\r\n showDebug: !1,\r\n showBroadphase: !1,\r\n showBounds: !1,\r\n showVelocity: !1,\r\n showCollisions: !1,\r\n showSeparations: !1,\r\n showAxes: !1,\r\n showPositions: !1,\r\n showAngleIndicator: !1,\r\n showIds: !1,\r\n showShadows: !1,\r\n showVertexNumbers: !1,\r\n showConvexHulls: !1,\r\n showInternalEdges: !1,\r\n showMousePosition: !1\r\n }\r\n }\r\n , r = o.extend(t, e);\r\n return r.canvas && (r.canvas.width = r.options.width || r.canvas.width,\r\n r.canvas.height = r.options.height || r.canvas.height),\r\n r.mouse = e.mouse,\r\n r.engine = e.engine,\r\n r.canvas = r.canvas || n(r.options.width, r.options.height),\r\n r.context = r.canvas.getContext(\"2d\"),\r\n r.textures = {},\r\n r.bounds = r.bounds || {\r\n min: {\r\n x: 0,\r\n y: 0\r\n },\r\n max: {\r\n x: r.canvas.width,\r\n y: r.canvas.height\r\n }\r\n },\r\n 1 !== r.options.pixelRatio && i.setPixelRatio(r, r.options.pixelRatio),\r\n o.isElement(r.element) ? r.element.appendChild(r.canvas) : r.canvas.parentNode || o.log(\"Render.create: options.element was undefined, render.canvas was created but not appended\", \"warn\"),\r\n r\r\n }\r\n ,\r\n i.run = function(t) {\r\n !function n(o) {\r\n t.frameRequestId = e(n),\r\n i.world(t)\r\n }()\r\n }\r\n ,\r\n i.stop = function(e) {\r\n t(e.frameRequestId)\r\n }\r\n ,\r\n i.setPixelRatio = function(e, t) {\r\n var n = e.options\r\n , i = e.canvas;\r\n \"auto\" === t && (t = u(i)),\r\n n.pixelRatio = t,\r\n i.setAttribute(\"data-pixel-ratio\", t),\r\n i.width = n.width * t,\r\n i.height = n.height * t,\r\n i.style.width = n.width + \"px\",\r\n i.style.height = n.height + \"px\"\r\n }\r\n ,\r\n i.lookAt = function(e, t, n, i) {\r\n i = void 0 === i || i,\r\n t = o.isArray(t) ? t : [t],\r\n n = n || {\r\n x: 0,\r\n y: 0\r\n };\r\n for (var r = {\r\n min: {\r\n x: 1 / 0,\r\n y: 1 / 0\r\n },\r\n max: {\r\n x: -1 / 0,\r\n y: -1 / 0\r\n }\r\n }, s = 0; s < t.length; s += 1) {\r\n var a = t[s]\r\n , l = a.bounds ? a.bounds.min : a.min || a.position || a\r\n , c = a.bounds ? a.bounds.max : a.max || a.position || a;\r\n l && c && (l.x < r.min.x && (r.min.x = l.x),\r\n c.x > r.max.x && (r.max.x = c.x),\r\n l.y < r.min.y && (r.min.y = l.y),\r\n c.y > r.max.y && (r.max.y = c.y))\r\n }\r\n var u = r.max.x - r.min.x + 2 * n.x\r\n , p = r.max.y - r.min.y + 2 * n.y\r\n , f = e.canvas.height\r\n , v = e.canvas.width / f\r\n , m = u / p\r\n , y = 1\r\n , g = 1;\r\n m > v ? g = m / v : y = v / m,\r\n e.options.hasBounds = !0,\r\n e.bounds.min.x = r.min.x,\r\n e.bounds.max.x = r.min.x + u * y,\r\n e.bounds.min.y = r.min.y,\r\n e.bounds.max.y = r.min.y + p * g,\r\n i && (e.bounds.min.x += .5 * u - u * y * .5,\r\n e.bounds.max.x += .5 * u - u * y * .5,\r\n e.bounds.min.y += .5 * p - p * g * .5,\r\n e.bounds.max.y += .5 * p - p * g * .5),\r\n e.bounds.min.x -= n.x,\r\n e.bounds.max.x -= n.x,\r\n e.bounds.min.y -= n.y,\r\n e.bounds.max.y -= n.y,\r\n e.mouse && (d.setScale(e.mouse, {\r\n x: (e.bounds.max.x - e.bounds.min.x) / e.canvas.width,\r\n y: (e.bounds.max.y - e.bounds.min.y) / e.canvas.height\r\n }),\r\n d.setOffset(e.mouse, e.bounds.min))\r\n }\r\n ,\r\n i.startViewTransform = function(e) {\r\n var t = e.bounds.max.x - e.bounds.min.x\r\n , n = e.bounds.max.y - e.bounds.min.y\r\n , i = t / e.options.width\r\n , o = n / e.options.height;\r\n e.context.setTransform(e.options.pixelRatio / i, 0, 0, e.options.pixelRatio / o, 0, 0),\r\n e.context.translate(-e.bounds.min.x, -e.bounds.min.y)\r\n }\r\n ,\r\n i.endViewTransform = function(e) {\r\n e.context.setTransform(e.options.pixelRatio, 0, 0, e.options.pixelRatio, 0, 0)\r\n }\r\n ,\r\n i.world = function(e) {\r\n var t, n = e.engine, o = n.world, u = e.canvas, p = e.context, v = e.options, m = r.allBodies(o), y = r.allConstraints(o), g = v.wireframes ? v.wireframeBackground : v.background, x = [], h = [], b = {\r\n timestamp: n.timing.timestamp\r\n };\r\n if (a.trigger(e, \"beforeRender\", b),\r\n e.currentBackground !== g && f(e, g),\r\n p.globalCompositeOperation = \"source-in\",\r\n p.fillStyle = \"transparent\",\r\n p.fillRect(0, 0, u.width, u.height),\r\n p.globalCompositeOperation = \"source-over\",\r\n v.hasBounds) {\r\n for (t = 0; t < m.length; t++) {\r\n var w = m[t];\r\n s.overlaps(w.bounds, e.bounds) && x.push(w)\r\n }\r\n for (t = 0; t < y.length; t++) {\r\n var S = y[t]\r\n , A = S.bodyA\r\n , P = S.bodyB\r\n , C = S.pointA\r\n , M = S.pointB;\r\n A && (C = c.add(A.position, S.pointA)),\r\n P && (M = c.add(P.position, S.pointB)),\r\n C && M && (s.contains(e.bounds, C) || s.contains(e.bounds, M)) && h.push(S)\r\n }\r\n i.startViewTransform(e),\r\n e.mouse && (d.setScale(e.mouse, {\r\n x: (e.bounds.max.x - e.bounds.min.x) / e.options.width,\r\n y: (e.bounds.max.y - e.bounds.min.y) / e.options.height\r\n }),\r\n d.setOffset(e.mouse, e.bounds.min))\r\n } else\r\n h = y,\r\n x = m,\r\n 1 !== e.options.pixelRatio && e.context.setTransform(e.options.pixelRatio, 0, 0, e.options.pixelRatio, 0, 0);\r\n !v.wireframes || n.enableSleeping && v.showSleeping ? i.bodies(e, x, p) : (v.showConvexHulls && i.bodyConvexHulls(e, x, p),\r\n i.bodyWireframes(e, x, p)),\r\n v.showBounds && i.bodyBounds(e, x, p),\r\n (v.showAxes || v.showAngleIndicator) && i.bodyAxes(e, x, p),\r\n v.showPositions && i.bodyPositions(e, x, p),\r\n v.showVelocity && i.bodyVelocity(e, x, p),\r\n v.showIds && i.bodyIds(e, x, p),\r\n v.showSeparations && i.separations(e, n.pairs.list, p),\r\n v.showCollisions && i.collisions(e, n.pairs.list, p),\r\n v.showVertexNumbers && i.vertexNumbers(e, x, p),\r\n v.showMousePosition && i.mousePosition(e, e.mouse, p),\r\n i.constraints(h, p),\r\n v.showBroadphase && n.broadphase.controller === l && i.grid(e, n.broadphase, p),\r\n v.showDebug && i.debug(e, p),\r\n v.hasBounds && i.endViewTransform(e),\r\n a.trigger(e, \"afterRender\", b)\r\n }\r\n ,\r\n i.debug = function(e, t) {\r\n var n = t\r\n , i = e.engine\r\n , o = i.world\r\n , s = i.metrics\r\n , a = e.options\r\n , c = r.allBodies(o);\r\n if (i.timing.timestamp - (e.debugTimestamp || 0) >= 500) {\r\n var d = \"\";\r\n s.timing && (d += \"fps: \" + Math.round(s.timing.fps) + \" \"),\r\n s.extended && (s.timing && (d += \"delta: \" + s.timing.delta.toFixed(3) + \" \",\r\n d += \"correction: \" + s.timing.correction.toFixed(3) + \" \"),\r\n d += \"bodies: \" + c.length + \" \",\r\n i.broadphase.controller === l && (d += \"buckets: \" + s.buckets + \" \"),\r\n d += \"\\n\",\r\n d += \"collisions: \" + s.collisions + \" \",\r\n d += \"pairs: \" + i.pairs.list.length + \" \",\r\n d += \"broad: \" + s.broadEff + \" \",\r\n d += \"mid: \" + s.midEff + \" \",\r\n d += \"narrow: \" + s.narrowEff + \" \"),\r\n e.debugString = d,\r\n e.debugTimestamp = i.timing.timestamp\r\n }\r\n if (e.debugString) {\r\n n.font = \"12px Arial\",\r\n a.wireframes ? n.fillStyle = \"rgba(255,255,255,0.5)\" : n.fillStyle = \"rgba(0,0,0,0.5)\";\r\n for (var u = e.debugString.split(\"\\n\"), p = 0; p < u.length; p++)\r\n n.fillText(u[p], 50, 50 + 18 * p)\r\n }\r\n }\r\n ,\r\n i.constraints = function(e, t) {\r\n for (var n = t, i = 0; i < e.length; i++) {\r\n var r = e[i];\r\n if (r.render.visible && r.pointA && r.pointB) {\r\n var s, a, l = r.bodyA, d = r.bodyB;\r\n if (s = l ? c.add(l.position, r.pointA) : r.pointA,\r\n \"pin\" === r.render.type)\r\n n.beginPath(),\r\n n.arc(s.x, s.y, 3, 0, 2 * Math.PI),\r\n n.closePath();\r\n else {\r\n if (a = d ? c.add(d.position, r.pointB) : r.pointB,\r\n n.beginPath(),\r\n n.moveTo(s.x, s.y),\r\n \"spring\" === r.render.type)\r\n for (var u, p = c.sub(a, s), f = c.perp(c.normalise(p)), v = Math.ceil(o.clamp(r.length / 5, 12, 20)), m = 1; m < v; m += 1)\r\n u = m % 2 == 0 ? 1 : -1,\r\n n.lineTo(s.x + p.x * (m / v) + f.x * u * 4, s.y + p.y * (m / v) + f.y * u * 4);\r\n n.lineTo(a.x, a.y)\r\n }\r\n r.render.lineWidth && (n.lineWidth = r.render.lineWidth,\r\n n.strokeStyle = r.render.strokeStyle,\r\n n.stroke()),\r\n r.render.anchors && (n.fillStyle = r.render.strokeStyle,\r\n n.beginPath(),\r\n n.arc(s.x, s.y, 3, 0, 2 * Math.PI),\r\n n.arc(a.x, a.y, 3, 0, 2 * Math.PI),\r\n n.closePath(),\r\n n.fill())\r\n }\r\n }\r\n }\r\n ,\r\n i.bodyShadows = function(e, t, n) {\r\n for (var i = n, o = (e.engine,\r\n 0); o < t.length; o++) {\r\n var r = t[o];\r\n if (r.render.visible) {\r\n if (r.circleRadius)\r\n i.beginPath(),\r\n i.arc(r.position.x, r.position.y, r.circleRadius, 0, 2 * Math.PI),\r\n i.closePath();\r\n else {\r\n i.beginPath(),\r\n i.moveTo(r.vertices[0].x, r.vertices[0].y);\r\n for (var s = 1; s < r.vertices.length; s++)\r\n i.lineTo(r.vertices[s].x, r.vertices[s].y);\r\n i.closePath()\r\n }\r\n var a = r.position.x - .5 * e.options.width\r\n , l = r.position.y - .2 * e.options.height\r\n , c = Math.abs(a) + Math.abs(l);\r\n i.shadowColor = \"rgba(0,0,0,0.15)\",\r\n i.shadowOffsetX = .05 * a,\r\n i.shadowOffsetY = .05 * l,\r\n i.shadowBlur = 1 + 12 * Math.min(1, c / 1e3),\r\n i.fill(),\r\n i.shadowColor = null,\r\n i.shadowOffsetX = null,\r\n i.shadowOffsetY = null,\r\n i.shadowBlur = null\r\n }\r\n }\r\n }\r\n ,\r\n i.bodies = function(e, t, n) {\r\n var i, o, r, s, a = n, l = (e.engine,\r\n e.options), c = l.showInternalEdges || !l.wireframes;\r\n for (r = 0; r < t.length; r++)\r\n if ((i = t[r]).render.visible)\r\n for (s = i.parts.length > 1 ? 1 : 0; s < i.parts.length; s++)\r\n if ((o = i.parts[s]).render.visible) {\r\n if (l.showSleeping && i.isSleeping ? a.globalAlpha = .5 * o.render.opacity : 1 !== o.render.opacity && (a.globalAlpha = o.render.opacity),\r\n o.render.sprite && o.render.sprite.texture && !l.wireframes) {\r\n var d = o.render.sprite\r\n , u = p(e, d.texture);\r\n a.translate(o.position.x, o.position.y),\r\n a.rotate(o.angle),\r\n a.drawImage(u, u.width * -d.xOffset * d.xScale, u.height * -d.yOffset * d.yScale, u.width * d.xScale, u.height * d.yScale),\r\n a.rotate(-o.angle),\r\n a.translate(-o.position.x, -o.position.y)\r\n } else {\r\n if (o.circleRadius)\r\n a.beginPath(),\r\n a.arc(o.position.x, o.position.y, o.circleRadius, 0, 2 * Math.PI);\r\n else {\r\n a.beginPath(),\r\n a.moveTo(o.vertices[0].x, o.vertices[0].y);\r\n for (var f = 1; f < o.vertices.length; f++)\r\n !o.vertices[f - 1].isInternal || c ? a.lineTo(o.vertices[f].x, o.vertices[f].y) : a.moveTo(o.vertices[f].x, o.vertices[f].y),\r\n o.vertices[f].isInternal && !c && a.moveTo(o.vertices[(f + 1) % o.vertices.length].x, o.vertices[(f + 1) % o.vertices.length].y);\r\n a.lineTo(o.vertices[0].x, o.vertices[0].y),\r\n a.closePath()\r\n }\r\n l.wireframes ? (a.lineWidth = 1,\r\n a.strokeStyle = \"#bbb\",\r\n a.stroke()) : (a.fillStyle = o.render.fillStyle,\r\n o.render.lineWidth && (a.lineWidth = o.render.lineWidth,\r\n a.strokeStyle = o.render.strokeStyle,\r\n a.stroke()),\r\n a.fill())\r\n }\r\n a.globalAlpha = 1\r\n }\r\n }\r\n ,\r\n i.bodyWireframes = function(e, t, n) {\r\n var i, o, r, s, a, l = n, c = e.options.showInternalEdges;\r\n for (l.beginPath(),\r\n r = 0; r < t.length; r++)\r\n if ((i = t[r]).render.visible)\r\n for (a = i.parts.length > 1 ? 1 : 0; a < i.parts.length; a++) {\r\n for (o = i.parts[a],\r\n l.moveTo(o.vertices[0].x, o.vertices[0].y),\r\n s = 1; s < o.vertices.length; s++)\r\n !o.vertices[s - 1].isInternal || c ? l.lineTo(o.vertices[s].x, o.vertices[s].y) : l.moveTo(o.vertices[s].x, o.vertices[s].y),\r\n o.vertices[s].isInternal && !c && l.moveTo(o.vertices[(s + 1) % o.vertices.length].x, o.vertices[(s + 1) % o.vertices.length].y);\r\n l.lineTo(o.vertices[0].x, o.vertices[0].y)\r\n }\r\n l.lineWidth = 1,\r\n l.strokeStyle = \"#bbb\",\r\n l.stroke()\r\n }\r\n ,\r\n i.bodyConvexHulls = function(e, t, n) {\r\n var i, o, r, s = n;\r\n for (s.beginPath(),\r\n o = 0; o < t.length; o++)\r\n if ((i = t[o]).render.visible && 1 !== i.parts.length) {\r\n for (s.moveTo(i.vertices[0].x, i.vertices[0].y),\r\n r = 1; r < i.vertices.length; r++)\r\n s.lineTo(i.vertices[r].x, i.vertices[r].y);\r\n s.lineTo(i.vertices[0].x, i.vertices[0].y)\r\n }\r\n s.lineWidth = 1,\r\n s.strokeStyle = \"rgba(255,255,255,0.2)\",\r\n s.stroke()\r\n }\r\n ,\r\n i.vertexNumbers = function(e, t, n) {\r\n var i, o, r, s = n;\r\n for (i = 0; i < t.length; i++) {\r\n var a = t[i].parts;\r\n for (r = a.length > 1 ? 1 : 0; r < a.length; r++) {\r\n var l = a[r];\r\n for (o = 0; o < l.vertices.length; o++)\r\n s.fillStyle = \"rgba(255,255,255,0.2)\",\r\n s.fillText(i + \"_\" + o, l.position.x + .8 * (l.vertices[o].x - l.position.x), l.position.y + .8 * (l.vertices[o].y - l.position.y))\r\n }\r\n }\r\n }\r\n ,\r\n i.mousePosition = function(e, t, n) {\r\n var i = n;\r\n i.fillStyle = \"rgba(255,255,255,0.8)\",\r\n i.fillText(t.position.x + \" \" + t.position.y, t.position.x + 5, t.position.y - 5)\r\n }\r\n ,\r\n i.bodyBounds = function(e, t, n) {\r\n var i = n\r\n , o = (e.engine,\r\n e.options);\r\n i.beginPath();\r\n for (var r = 0; r < t.length; r++) {\r\n if (t[r].render.visible)\r\n for (var s = t[r].parts, a = s.length > 1 ? 1 : 0; a < s.length; a++) {\r\n var l = s[a];\r\n i.rect(l.bounds.min.x, l.bounds.min.y, l.bounds.max.x - l.bounds.min.x, l.bounds.max.y - l.bounds.min.y)\r\n }\r\n }\r\n o.wireframes ? i.strokeStyle = \"rgba(255,255,255,0.08)\" : i.strokeStyle = \"rgba(0,0,0,0.1)\",\r\n i.lineWidth = 1,\r\n i.stroke()\r\n }\r\n ,\r\n i.bodyAxes = function(e, t, n) {\r\n var i, o, r, s, a = n, l = (e.engine,\r\n e.options);\r\n for (a.beginPath(),\r\n o = 0; o < t.length; o++) {\r\n var c = t[o]\r\n , d = c.parts;\r\n if (c.render.visible)\r\n if (l.showAxes)\r\n for (r = d.length > 1 ? 1 : 0; r < d.length; r++)\r\n for (i = d[r],\r\n s = 0; s < i.axes.length; s++) {\r\n var u = i.axes[s];\r\n a.moveTo(i.position.x, i.position.y),\r\n a.lineTo(i.position.x + 20 * u.x, i.position.y + 20 * u.y)\r\n }\r\n else\r\n for (r = d.length > 1 ? 1 : 0; r < d.length; r++)\r\n for (i = d[r],\r\n s = 0; s < i.axes.length; s++)\r\n a.moveTo(i.position.x, i.position.y),\r\n a.lineTo((i.vertices[0].x + i.vertices[i.vertices.length - 1].x) / 2, (i.vertices[0].y + i.vertices[i.vertices.length - 1].y) / 2)\r\n }\r\n l.wireframes ? (a.strokeStyle = \"indianred\",\r\n a.lineWidth = 1) : (a.strokeStyle = \"rgba(255, 255, 255, 0.4)\",\r\n a.globalCompositeOperation = \"overlay\",\r\n a.lineWidth = 2),\r\n a.stroke(),\r\n a.globalCompositeOperation = \"source-over\"\r\n }\r\n ,\r\n i.bodyPositions = function(e, t, n) {\r\n var i, o, r, s, a = n, l = (e.engine,\r\n e.options);\r\n for (a.beginPath(),\r\n r = 0; r < t.length; r++)\r\n if ((i = t[r]).render.visible)\r\n for (s = 0; s < i.parts.length; s++)\r\n o = i.parts[s],\r\n a.arc(o.position.x, o.position.y, 3, 0, 2 * Math.PI, !1),\r\n a.closePath();\r\n for (l.wireframes ? a.fillStyle = \"indianred\" : a.fillStyle = \"rgba(0,0,0,0.5)\",\r\n a.fill(),\r\n a.beginPath(),\r\n r = 0; r < t.length; r++)\r\n (i = t[r]).render.visible && (a.arc(i.positionPrev.x, i.positionPrev.y, 2, 0, 2 * Math.PI, !1),\r\n a.closePath());\r\n a.fillStyle = \"rgba(255,165,0,0.8)\",\r\n a.fill()\r\n }\r\n ,\r\n i.bodyVelocity = function(e, t, n) {\r\n var i = n;\r\n i.beginPath();\r\n for (var o = 0; o < t.length; o++) {\r\n var r = t[o];\r\n r.render.visible && (i.moveTo(r.position.x, r.position.y),\r\n i.lineTo(r.position.x + 2 * (r.position.x - r.positionPrev.x), r.position.y + 2 * (r.position.y - r.positionPrev.y)))\r\n }\r\n i.lineWidth = 3,\r\n i.strokeStyle = \"cornflowerblue\",\r\n i.stroke()\r\n }\r\n ,\r\n i.bodyIds = function(e, t, n) {\r\n var i, o, r = n;\r\n for (i = 0; i < t.length; i++)\r\n if (t[i].render.visible) {\r\n var s = t[i].parts;\r\n for (o = s.length > 1 ? 1 : 0; o < s.length; o++) {\r\n var a = s[o];\r\n r.font = \"12px Arial\",\r\n r.fillStyle = \"rgba(255,255,255,0.5)\",\r\n r.fillText(a.id, a.position.x + 10, a.position.y - 10)\r\n }\r\n }\r\n }\r\n ,\r\n i.collisions = function(e, t, n) {\r\n var i, o, r, s, a = n, l = e.options;\r\n for (a.beginPath(),\r\n r = 0; r < t.length; r++)\r\n if ((i = t[r]).isActive)\r\n for (o = i.collision,\r\n s = 0; s < i.activeContacts.length; s++) {\r\n var c = i.activeContacts[s].vertex;\r\n a.rect(c.x - 1.5, c.y - 1.5, 3.5, 3.5)\r\n }\r\n for (l.wireframes ? a.fillStyle = \"rgba(255,255,255,0.7)\" : a.fillStyle = \"orange\",\r\n a.fill(),\r\n a.beginPath(),\r\n r = 0; r < t.length; r++)\r\n if ((i = t[r]).isActive && (o = i.collision,\r\n i.activeContacts.length > 0)) {\r\n var d = i.activeContacts[0].vertex.x\r\n , u = i.activeContacts[0].vertex.y;\r\n 2 === i.activeContacts.length && (d = (i.activeContacts[0].vertex.x + i.activeContacts[1].vertex.x) / 2,\r\n u = (i.activeContacts[0].vertex.y + i.activeContacts[1].vertex.y) / 2),\r\n o.bodyB === o.supports[0].body || !0 === o.bodyA.isStatic ? a.moveTo(d - 8 * o.normal.x, u - 8 * o.normal.y) : a.moveTo(d + 8 * o.normal.x, u + 8 * o.normal.y),\r\n a.lineTo(d, u)\r\n }\r\n l.wireframes ? a.strokeStyle = \"rgba(255,165,0,0.7)\" : a.strokeStyle = \"orange\",\r\n a.lineWidth = 1,\r\n a.stroke()\r\n }\r\n ,\r\n i.separations = function(e, t, n) {\r\n var i, o, r, s, a, l = n, c = e.options;\r\n for (l.beginPath(),\r\n a = 0; a < t.length; a++)\r\n if ((i = t[a]).isActive) {\r\n r = (o = i.collision).bodyA;\r\n var d = 1;\r\n (s = o.bodyB).isStatic || r.isStatic || (d = .5),\r\n s.isStatic && (d = 0),\r\n l.moveTo(s.position.x, s.position.y),\r\n l.lineTo(s.position.x - o.penetration.x * d, s.position.y - o.penetration.y * d),\r\n d = 1,\r\n s.isStatic || r.isStatic || (d = .5),\r\n r.isStatic && (d = 0),\r\n l.moveTo(r.position.x, r.position.y),\r\n l.lineTo(r.position.x + o.penetration.x * d, r.position.y + o.penetration.y * d)\r\n }\r\n c.wireframes ? l.strokeStyle = \"rgba(255,165,0,0.5)\" : l.strokeStyle = \"orange\",\r\n l.stroke()\r\n }\r\n ,\r\n i.grid = function(e, t, n) {\r\n var i = n;\r\n e.options.wireframes ? i.strokeStyle = \"rgba(255,180,0,0.1)\" : i.strokeStyle = \"rgba(255,180,0,0.5)\",\r\n i.beginPath();\r\n for (var r = o.keys(t.buckets), s = 0; s < r.length; s++) {\r\n var a = r[s];\r\n if (!(t.buckets[a].length < 2)) {\r\n var l = a.split(/C|R/);\r\n i.rect(.5 + parseInt(l[1], 10) * t.bucketWidth, .5 + parseInt(l[2], 10) * t.bucketHeight, t.bucketWidth, t.bucketHeight)\r\n }\r\n }\r\n i.lineWidth = 1,\r\n i.stroke()\r\n }\r\n ,\r\n i.inspector = function(e, t) {\r\n e.engine;\r\n var n, i = e.selected, o = e.render, r = o.options;\r\n if (r.hasBounds) {\r\n var s = o.bounds.max.x - o.bounds.min.x\r\n , a = o.bounds.max.y - o.bounds.min.y\r\n , l = s / o.options.width\r\n , c = a / o.options.height;\r\n t.scale(1 / l, 1 / c),\r\n t.translate(-o.bounds.min.x, -o.bounds.min.y)\r\n }\r\n for (var d = 0; d < i.length; d++) {\r\n var u = i[d].data;\r\n switch (t.translate(.5, .5),\r\n t.lineWidth = 1,\r\n t.strokeStyle = \"rgba(255,165,0,0.9)\",\r\n t.setLineDash([1, 2]),\r\n u.type) {\r\n case \"body\":\r\n n = u.bounds,\r\n t.beginPath(),\r\n t.rect(Math.floor(n.min.x - 3), Math.floor(n.min.y - 3), Math.floor(n.max.x - n.min.x + 6), Math.floor(n.max.y - n.min.y + 6)),\r\n t.closePath(),\r\n t.stroke();\r\n break;\r\n case \"constraint\":\r\n var p = u.pointA;\r\n u.bodyA && (p = u.pointB),\r\n t.beginPath(),\r\n t.arc(p.x, p.y, 10, 0, 2 * Math.PI),\r\n t.closePath(),\r\n t.stroke();\r\n }\r\n t.setLineDash([]),\r\n t.translate(-.5, -.5)\r\n }\r\n null !== e.selectStart && (t.translate(.5, .5),\r\n t.lineWidth = 1,\r\n t.strokeStyle = \"rgba(255,165,0,0.6)\",\r\n t.fillStyle = \"rgba(255,165,0,0.1)\",\r\n n = e.selectBounds,\r\n t.beginPath(),\r\n t.rect(Math.floor(n.min.x), Math.floor(n.min.y), Math.floor(n.max.x - n.min.x), Math.floor(n.max.y - n.min.y)),\r\n t.closePath(),\r\n t.stroke(),\r\n t.fill(),\r\n t.translate(-.5, -.5)),\r\n r.hasBounds && t.setTransform(1, 0, 0, 1, 0, 0)\r\n }\r\n ;\r\n var n = function(e, t) {\r\n var n = document.createElement(\"canvas\");\r\n return n.width = e,\r\n n.height = t,\r\n n.oncontextmenu = function() {\r\n return !1\r\n }\r\n ,\r\n n.onselectstart = function() {\r\n return !1\r\n }\r\n ,\r\n n\r\n }\r\n , u = function(e) {\r\n var t = e.getContext(\"2d\");\r\n return (window.devicePixelRatio || 1) / (t.webkitBackingStorePixelRatio || t.mozBackingStorePixelRatio || t.msBackingStorePixelRatio || t.oBackingStorePixelRatio || t.backingStorePixelRatio || 1)\r\n }\r\n , p = function(e, t) {\r\n var n = e.textures[t];\r\n return n || ((n = e.textures[t] = new Image).src = t,\r\n n)\r\n }\r\n , f = function(e, t) {\r\n var n = t;\r\n /(jpg|gif|png)$/.test(t) && (n = \"url(\" + t + \")\"),\r\n e.canvas.style.background = n,\r\n e.canvas.style.backgroundSize = \"contain\",\r\n e.currentBackground = t\r\n }\r\n }()\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(9)\r\n , r = n(12)\r\n , s = n(0);\r\n i.create = function(e) {\r\n var t = {\r\n controller: i,\r\n detector: r.collisions,\r\n buckets: {},\r\n pairs: {},\r\n pairsList: [],\r\n bucketWidth: 48,\r\n bucketHeight: 48\r\n };\r\n return s.extend(t, e)\r\n }\r\n ,\r\n i.update = function(e, t, n, o) {\r\n var r, s, a, l, c, d = n.world, u = e.buckets, p = !1, f = n.metrics;\r\n for (f.broadphaseTests = 0,\r\n r = 0; r < t.length; r++) {\r\n var v = t[r];\r\n if ((!v.isSleeping || o) && !(v.bounds.max.x < d.bounds.min.x || v.bounds.min.x > d.bounds.max.x || v.bounds.max.y < d.bounds.min.y || v.bounds.min.y > d.bounds.max.y)) {\r\n var m = i._getRegion(e, v);\r\n if (!v.region || m.id !== v.region.id || o) {\r\n f.broadphaseTests += 1,\r\n v.region && !o || (v.region = m);\r\n var y = i._regionUnion(m, v.region);\r\n for (s = y.startCol; s <= y.endCol; s++)\r\n for (a = y.startRow; a <= y.endRow; a++) {\r\n l = u[c = i._getBucketId(s, a)];\r\n var g = s >= m.startCol && s <= m.endCol && a >= m.startRow && a <= m.endRow\r\n , x = s >= v.region.startCol && s <= v.region.endCol && a >= v.region.startRow && a <= v.region.endRow;\r\n !g && x && x && l && i._bucketRemoveBody(e, l, v),\r\n (v.region === m || g && !x || o) && (l || (l = i._createBucket(u, c)),\r\n i._bucketAddBody(e, l, v))\r\n }\r\n v.region = m,\r\n p = !0\r\n }\r\n }\r\n }\r\n p && (e.pairsList = i._createActivePairsList(e))\r\n }\r\n ,\r\n i.clear = function(e) {\r\n e.buckets = {},\r\n e.pairs = {},\r\n e.pairsList = []\r\n }\r\n ,\r\n i._regionUnion = function(e, t) {\r\n var n = Math.min(e.startCol, t.startCol)\r\n , o = Math.max(e.endCol, t.endCol)\r\n , r = Math.min(e.startRow, t.startRow)\r\n , s = Math.max(e.endRow, t.endRow);\r\n return i._createRegion(n, o, r, s)\r\n }\r\n ,\r\n i._getRegion = function(e, t) {\r\n var n = t.bounds\r\n , o = Math.floor(n.min.x / e.bucketWidth)\r\n , r = Math.floor(n.max.x / e.bucketWidth)\r\n , s = Math.floor(n.min.y / e.bucketHeight)\r\n , a = Math.floor(n.max.y / e.bucketHeight);\r\n return i._createRegion(o, r, s, a)\r\n }\r\n ,\r\n i._createRegion = function(e, t, n, i) {\r\n return {\r\n id: e + \",\" + t + \",\" + n + \",\" + i,\r\n startCol: e,\r\n endCol: t,\r\n startRow: n,\r\n endRow: i\r\n }\r\n }\r\n ,\r\n i._getBucketId = function(e, t) {\r\n return \"C\" + e + \"R\" + t\r\n }\r\n ,\r\n i._createBucket = function(e, t) {\r\n return e[t] = []\r\n }\r\n ,\r\n i._bucketAddBody = function(e, t, n) {\r\n for (var i = 0; i < t.length; i++) {\r\n var r = t[i];\r\n if (!(n.id === r.id || n.isStatic && r.isStatic)) {\r\n var s = o.id(n, r)\r\n , a = e.pairs[s];\r\n a ? a[2] += 1 : e.pairs[s] = [n, r, 1]\r\n }\r\n }\r\n t.push(n)\r\n }\r\n ,\r\n i._bucketRemoveBody = function(e, t, n) {\r\n t.splice(s.indexOf(t, n), 1);\r\n for (var i = 0; i < t.length; i++) {\r\n var r = t[i]\r\n , a = o.id(n, r)\r\n , l = e.pairs[a];\r\n l && (l[2] -= 1)\r\n }\r\n }\r\n ,\r\n i._createActivePairsList = function(e) {\r\n var t, n, i = [];\r\n t = s.keys(e.pairs);\r\n for (var o = 0; o < t.length; o++)\r\n (n = e.pairs[t[o]])[2] > 0 ? i.push(n) : delete e.pairs[t[o]];\r\n return i\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(13)\r\n , r = n(9)\r\n , s = n(1);\r\n i.collisions = function(e, t) {\r\n for (var n = [], a = t.pairs.table, l = t.metrics, c = 0; c < e.length; c++) {\r\n var d = e[c][0]\r\n , u = e[c][1];\r\n if ((!d.isStatic && !d.isSleeping || !u.isStatic && !u.isSleeping) && i.canCollide(d.collisionFilter, u.collisionFilter) && (l.midphaseTests += 1,\r\n s.overlaps(d.bounds, u.bounds)))\r\n for (var p = d.parts.length > 1 ? 1 : 0; p < d.parts.length; p++)\r\n for (var f = d.parts[p], v = u.parts.length > 1 ? 1 : 0; v < u.parts.length; v++) {\r\n var m = u.parts[v];\r\n if (f === d && m === u || s.overlaps(f.bounds, m.bounds)) {\r\n var y, g = a[r.id(f, m)];\r\n y = g && g.isActive ? g.collision : null;\r\n var x = o.collides(f, m, y);\r\n l.narrowphaseTests += 1,\r\n x.reused && (l.narrowReuseCount += 1),\r\n x.collided && (n.push(x),\r\n l.narrowDetections += 1)\r\n }\r\n }\r\n }\r\n return n\r\n }\r\n ,\r\n i.canCollide = function(e, t) {\r\n return e.group === t.group && 0 !== e.group ? e.group > 0 : 0 != (e.mask & t.category) && 0 != (t.mask & e.category)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(2);\r\n i.collides = function(e, t, n) {\r\n var s, a, l, c, d = !1;\r\n if (n) {\r\n var u = e.parent\r\n , p = t.parent\r\n , f = u.speed * u.speed + u.angularSpeed * u.angularSpeed + p.speed * p.speed + p.angularSpeed * p.angularSpeed;\r\n d = n && n.collided && f < .2,\r\n c = n\r\n } else\r\n c = {\r\n collided: !1,\r\n bodyA: e,\r\n bodyB: t\r\n };\r\n if (n && d) {\r\n var v = c.axisBody\r\n , m = v === e ? t : e\r\n , y = [v.axes[n.axisNumber]];\r\n if (l = i._overlapAxes(v.vertices, m.vertices, y),\r\n c.reused = !0,\r\n l.overlap <= 0)\r\n return c.collided = !1,\r\n c\r\n } else {\r\n if ((s = i._overlapAxes(e.vertices, t.vertices, e.axes)).overlap <= 0)\r\n return c.collided = !1,\r\n c;\r\n if ((a = i._overlapAxes(t.vertices, e.vertices, t.axes)).overlap <= 0)\r\n return c.collided = !1,\r\n c;\r\n s.overlap < a.overlap ? (l = s,\r\n c.axisBody = e) : (l = a,\r\n c.axisBody = t),\r\n c.axisNumber = l.axisNumber\r\n }\r\n c.bodyA = e.id < t.id ? e : t,\r\n c.bodyB = e.id < t.id ? t : e,\r\n c.collided = !0,\r\n c.depth = l.overlap,\r\n c.parentA = c.bodyA.parent,\r\n c.parentB = c.bodyB.parent,\r\n e = c.bodyA,\r\n t = c.bodyB,\r\n r.dot(l.axis, r.sub(t.position, e.position)) < 0 ? c.normal = {\r\n x: l.axis.x,\r\n y: l.axis.y\r\n } : c.normal = {\r\n x: -l.axis.x,\r\n y: -l.axis.y\r\n },\r\n c.tangent = r.perp(c.normal),\r\n c.penetration = c.penetration || {},\r\n c.penetration.x = c.normal.x * c.depth,\r\n c.penetration.y = c.normal.y * c.depth;\r\n var g = i._findSupports(e, t, c.normal)\r\n , x = [];\r\n if (o.contains(e.vertices, g[0]) && x.push(g[0]),\r\n o.contains(e.vertices, g[1]) && x.push(g[1]),\r\n x.length < 2) {\r\n var h = i._findSupports(t, e, r.neg(c.normal));\r\n o.contains(t.vertices, h[0]) && x.push(h[0]),\r\n x.length < 2 && o.contains(t.vertices, h[1]) && x.push(h[1])\r\n }\r\n return x.length < 1 && (x = [g[0]]),\r\n c.supports = x,\r\n c\r\n }\r\n ,\r\n i._overlapAxes = function(e, t, n) {\r\n for (var o, s, a = r._temp[0], l = r._temp[1], c = {\r\n overlap: Number.MAX_VALUE\r\n }, d = 0; d < n.length; d++) {\r\n if (s = n[d],\r\n i._projectToAxis(a, e, s),\r\n i._projectToAxis(l, t, s),\r\n (o = Math.min(a.max - l.min, l.max - a.min)) <= 0)\r\n return c.overlap = o,\r\n c;\r\n o < c.overlap && (c.overlap = o,\r\n c.axis = s,\r\n c.axisNumber = d)\r\n }\r\n return c\r\n }\r\n ,\r\n i._projectToAxis = function(e, t, n) {\r\n for (var i = r.dot(t[0], n), o = i, s = 1; s < t.length; s += 1) {\r\n var a = r.dot(t[s], n);\r\n a > o ? o = a : a < i && (i = a)\r\n }\r\n e.min = i,\r\n e.max = o\r\n }\r\n ,\r\n i._findSupports = function(e, t, n) {\r\n for (var i, o, s, a, l = Number.MAX_VALUE, c = r._temp[0], d = t.vertices, u = e.position, p = 0; p < d.length; p++)\r\n o = d[p],\r\n c.x = o.x - u.x,\r\n c.y = o.y - u.y,\r\n (i = -r.dot(n, c)) < l && (l = i,\r\n s = o);\r\n return o = d[s.index - 1 >= 0 ? s.index - 1 : d.length - 1],\r\n c.x = o.x - u.x,\r\n c.y = o.y - u.y,\r\n l = -r.dot(n, c),\r\n a = o,\r\n o = d[(s.index + 1) % d.length],\r\n c.x = o.x - u.x,\r\n c.y = o.y - u.y,\r\n (i = -r.dot(n, c)) < l && (a = o),\r\n [s, a]\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(0);\r\n i.create = function(e) {\r\n var t = {};\r\n return e || o.log(\"Mouse.create: element was undefined, defaulting to document.body\", \"warn\"),\r\n t.element = e || document.body,\r\n t.absolute = {\r\n x: 0,\r\n y: 0\r\n },\r\n t.position = {\r\n x: 0,\r\n y: 0\r\n },\r\n t.mousedownPosition = {\r\n x: 0,\r\n y: 0\r\n },\r\n t.mouseupPosition = {\r\n x: 0,\r\n y: 0\r\n },\r\n t.offset = {\r\n x: 0,\r\n y: 0\r\n },\r\n t.scale = {\r\n x: 1,\r\n y: 1\r\n },\r\n t.wheelDelta = 0,\r\n t.button = -1,\r\n t.pixelRatio = parseInt(t.element.getAttribute(\"data-pixel-ratio\"), 10) || 1,\r\n t.sourceEvents = {\r\n mousemove: null,\r\n mousedown: null,\r\n mouseup: null,\r\n mousewheel: null\r\n },\r\n t.mousemove = function(e) {\r\n var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio);\r\n e.changedTouches && (t.button = 0,\r\n e.preventDefault()),\r\n t.absolute.x = n.x,\r\n t.absolute.y = n.y,\r\n t.position.x = t.absolute.x * t.scale.x + t.offset.x,\r\n t.position.y = t.absolute.y * t.scale.y + t.offset.y,\r\n t.sourceEvents.mousemove = e\r\n }\r\n ,\r\n t.mousedown = function(e) {\r\n var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio);\r\n e.changedTouches ? (t.button = 0,\r\n e.preventDefault()) : t.button = e.button,\r\n t.absolute.x = n.x,\r\n t.absolute.y = n.y,\r\n t.position.x = t.absolute.x * t.scale.x + t.offset.x,\r\n t.position.y = t.absolute.y * t.scale.y + t.offset.y,\r\n t.mousedownPosition.x = t.position.x,\r\n t.mousedownPosition.y = t.position.y,\r\n t.sourceEvents.mousedown = e\r\n }\r\n ,\r\n t.mouseup = function(e) {\r\n var n = i._getRelativeMousePosition(e, t.element, t.pixelRatio);\r\n e.changedTouches && e.preventDefault(),\r\n t.button = -1,\r\n t.absolute.x = n.x,\r\n t.absolute.y = n.y,\r\n t.position.x = t.absolute.x * t.scale.x + t.offset.x,\r\n t.position.y = t.absolute.y * t.scale.y + t.offset.y,\r\n t.mouseupPosition.x = t.position.x,\r\n t.mouseupPosition.y = t.position.y,\r\n t.sourceEvents.mouseup = e\r\n }\r\n ,\r\n t.mousewheel = function(e) {\r\n t.wheelDelta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail)),\r\n e.preventDefault()\r\n }\r\n ,\r\n i.setElement(t, t.element),\r\n t\r\n }\r\n ,\r\n i.setElement = function(e, t) {\r\n e.element = t,\r\n t.addEventListener(\"mousemove\", e.mousemove),\r\n t.addEventListener(\"mousedown\", e.mousedown),\r\n t.addEventListener(\"mouseup\", e.mouseup),\r\n t.addEventListener(\"mousewheel\", e.mousewheel),\r\n t.addEventListener(\"DOMMouseScroll\", e.mousewheel),\r\n t.addEventListener(\"touchmove\", e.mousemove),\r\n t.addEventListener(\"touchstart\", e.mousedown),\r\n t.addEventListener(\"touchend\", e.mouseup)\r\n }\r\n ,\r\n i.clearSourceEvents = function(e) {\r\n e.sourceEvents.mousemove = null,\r\n e.sourceEvents.mousedown = null,\r\n e.sourceEvents.mouseup = null,\r\n e.sourceEvents.mousewheel = null,\r\n e.wheelDelta = 0\r\n }\r\n ,\r\n i.setOffset = function(e, t) {\r\n e.offset.x = t.x,\r\n e.offset.y = t.y,\r\n e.position.x = e.absolute.x * e.scale.x + e.offset.x,\r\n e.position.y = e.absolute.y * e.scale.y + e.offset.y\r\n }\r\n ,\r\n i.setScale = function(e, t) {\r\n e.scale.x = t.x,\r\n e.scale.y = t.y,\r\n e.position.x = e.absolute.x * e.scale.x + e.offset.x,\r\n e.position.y = e.absolute.y * e.scale.y + e.offset.y\r\n }\r\n ,\r\n i._getRelativeMousePosition = function(e, t, n) {\r\n var i, o, r = t.getBoundingClientRect(), s = document.documentElement || document.body.parentNode || document.body, a = void 0 !== window.pageXOffset ? window.pageXOffset : s.scrollLeft, l = void 0 !== window.pageYOffset ? window.pageYOffset : s.scrollTop, c = e.changedTouches;\r\n return c ? (i = c[0].pageX - r.left - a,\r\n o = c[0].pageY - r.top - l) : (i = e.pageX - r.left - a,\r\n o = e.pageY - r.top - l),\r\n {\r\n x: i / (t.clientWidth / (t.width || t.clientWidth) * n),\r\n y: o / (t.clientHeight / (t.height || t.clientHeight) * n)\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(2)\r\n , r = n(0);\r\n i.fromVertices = function(e) {\r\n for (var t = {}, n = 0; n < e.length; n++) {\r\n var i = (n + 1) % e.length\r\n , s = o.normalise({\r\n x: e[i].y - e[n].y,\r\n y: e[n].x - e[i].x\r\n })\r\n , a = 0 === s.y ? 1 / 0 : s.x / s.y;\r\n t[a = a.toFixed(3).toString()] = s\r\n }\r\n return r.values(t)\r\n }\r\n ,\r\n i.rotate = function(e, t) {\r\n if (0 !== t)\r\n for (var n = Math.cos(t), i = Math.sin(t), o = 0; o < e.length; o++) {\r\n var r, s = e[o];\r\n r = s.x * n - s.y * i,\r\n s.y = s.x * i + s.y * n,\r\n s.x = r\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(0)\r\n , s = n(6)\r\n , a = n(1)\r\n , l = n(2);\r\n i._decompWarned = !1,\r\n i.rectangle = function(e, t, n, i, a) {\r\n a = a || {};\r\n var l = {\r\n label: \"Rectangle Body\",\r\n position: {\r\n x: e,\r\n y: t\r\n },\r\n vertices: o.fromPath(\"L 0 0 L \" + n + \" 0 L \" + n + \" \" + i + \" L 0 \" + i)\r\n };\r\n if (a.chamfer) {\r\n var c = a.chamfer;\r\n l.vertices = o.chamfer(l.vertices, c.radius, c.quality, c.qualityMin, c.qualityMax),\r\n delete a.chamfer\r\n }\r\n return s.create(r.extend({}, l, a))\r\n }\r\n ,\r\n i.trapezoid = function(e, t, n, i, a, l) {\r\n l = l || {};\r\n var c, d = n * (a *= .5), u = d + (1 - 2 * a) * n, p = u + d;\r\n c = a < .5 ? \"L 0 0 L \" + d + \" \" + -i + \" L \" + u + \" \" + -i + \" L \" + p + \" 0\" : \"L 0 0 L \" + u + \" \" + -i + \" L \" + p + \" 0\";\r\n var f = {\r\n label: \"Trapezoid Body\",\r\n position: {\r\n x: e,\r\n y: t\r\n },\r\n vertices: o.fromPath(c)\r\n };\r\n if (l.chamfer) {\r\n var v = l.chamfer;\r\n f.vertices = o.chamfer(f.vertices, v.radius, v.quality, v.qualityMin, v.qualityMax),\r\n delete l.chamfer\r\n }\r\n return s.create(r.extend({}, f, l))\r\n }\r\n ,\r\n i.circle = function(e, t, n, o, s) {\r\n o = o || {};\r\n var a = {\r\n label: \"Circle Body\",\r\n circleRadius: n\r\n };\r\n s = s || 25;\r\n var l = Math.ceil(Math.max(10, Math.min(s, n)));\r\n return l % 2 == 1 && (l += 1),\r\n i.polygon(e, t, l, n, r.extend({}, a, o))\r\n }\r\n ,\r\n i.polygon = function(e, t, n, a, l) {\r\n if (l = l || {},\r\n n < 3)\r\n return i.circle(e, t, a, l);\r\n for (var c = 2 * Math.PI / n, d = \"\", u = .5 * c, p = 0; p < n; p += 1) {\r\n var f = u + p * c\r\n , v = Math.cos(f) * a\r\n , m = Math.sin(f) * a;\r\n d += \"L \" + v.toFixed(3) + \" \" + m.toFixed(3) + \" \"\r\n }\r\n var y = {\r\n label: \"Polygon Body\",\r\n position: {\r\n x: e,\r\n y: t\r\n },\r\n vertices: o.fromPath(d)\r\n };\r\n if (l.chamfer) {\r\n var g = l.chamfer;\r\n y.vertices = o.chamfer(y.vertices, g.radius, g.quality, g.qualityMin, g.qualityMax),\r\n delete l.chamfer\r\n }\r\n return s.create(r.extend({}, y, l))\r\n }\r\n ,\r\n i.fromVertices = function(e, t, c, d, u, p, f, v) {\r\n var m, y, g, x, h, b, w, S, A, P, C;\r\n try {\r\n m = n(27)\r\n } catch (E) {\r\n m = null\r\n }\r\n for (y = Boolean(m && m.quickDecomp),\r\n d = d || {},\r\n x = [],\r\n u = void 0 !== u && u,\r\n p = void 0 !== p ? p : .01,\r\n f = void 0 !== f ? f : 10,\r\n v = void 0 !== v ? v : .01,\r\n r.isArray(c[0]) || (c = [c]),\r\n P = 0; P < c.length; P += 1)\r\n if (b = c[P],\r\n !!(h = o.isConvex(b)) || y || i._decompWarned || (r.warn(\"Could not resolve the expected 'poly-decomp' package for concave vertices in 'Bodies.fromVertices'\"),\r\n r.warn(\"Try 'npm install poly-decomp --save' or as a global e.g. 'window.decomp'\"),\r\n i._decompWarned = !0),\r\n h || !y)\r\n b = h ? o.clockwiseSort(b) : o.hull(b),\r\n x.push({\r\n position: {\r\n x: e,\r\n y: t\r\n },\r\n vertices: b\r\n });\r\n else {\r\n var M = b.map(function(e) {\r\n return [e.x, e.y]\r\n });\r\n m.makeCCW(M),\r\n !1 !== p && m.removeCollinearPoints(M, p),\r\n !1 !== v && m.removeDuplicatePoints && m.removeDuplicatePoints(M, v);\r\n var k = m.quickDecomp(M);\r\n for (w = 0; w < k.length; w++) {\r\n var B = k[w].map(function(e) {\r\n return {\r\n x: e[0],\r\n y: e[1]\r\n }\r\n });\r\n f > 0 && o.area(B) < f || x.push({\r\n position: o.centre(B),\r\n vertices: B\r\n })\r\n }\r\n }\r\n for (w = 0; w < x.length; w++)\r\n x[w] = s.create(r.extend(x[w], d));\r\n if (u)\r\n for (w = 0; w < x.length; w++) {\r\n var I = x[w];\r\n for (S = w + 1; S < x.length; S++) {\r\n var _ = x[S];\r\n if (a.overlaps(I.bounds, _.bounds)) {\r\n var T = I.vertices\r\n , R = _.vertices;\r\n for (A = 0; A < I.vertices.length; A++)\r\n for (C = 0; C < _.vertices.length; C++) {\r\n var L = l.magnitudeSquared(l.sub(T[(A + 1) % T.length], R[C]))\r\n , O = l.magnitudeSquared(l.sub(T[A], R[(C + 1) % R.length]));\r\n L < 5 && O < 5 && (T[A].isInternal = !0,\r\n R[C].isInternal = !0)\r\n }\r\n }\r\n }\r\n }\r\n return x.length > 1 ? (g = s.create(r.extend({\r\n parts: x.slice(0)\r\n }, d)),\r\n s.setPosition(g, {\r\n x: e,\r\n y: t\r\n }),\r\n g) : x[0]\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(0);\r\n i._registry = {},\r\n i.register = function(e) {\r\n if (i.isPlugin(e) || o.warn(\"Plugin.register:\", i.toString(e), \"does not implement all required fields.\"),\r\n e.name in i._registry) {\r\n var t = i._registry[e.name]\r\n , n = i.versionParse(e.version).number\r\n , r = i.versionParse(t.version).number;\r\n n > r ? (o.warn(\"Plugin.register:\", i.toString(t), \"was upgraded to\", i.toString(e)),\r\n i._registry[e.name] = e) : n < r ? o.warn(\"Plugin.register:\", i.toString(t), \"can not be downgraded to\", i.toString(e)) : e !== t && o.warn(\"Plugin.register:\", i.toString(e), \"is already registered to different plugin object\")\r\n } else\r\n i._registry[e.name] = e;\r\n return e\r\n }\r\n ,\r\n i.resolve = function(e) {\r\n return i._registry[i.dependencyParse(e).name]\r\n }\r\n ,\r\n i.toString = function(e) {\r\n return \"string\" == typeof e ? e : (e.name || \"anonymous\") + \"@\" + (e.version || e.range || \"0.0.0\")\r\n }\r\n ,\r\n i.isPlugin = function(e) {\r\n return e && e.name && e.version && e.install\r\n }\r\n ,\r\n i.isUsed = function(e, t) {\r\n return e.used.indexOf(t) > -1\r\n }\r\n ,\r\n i.isFor = function(e, t) {\r\n var n = e.for && i.dependencyParse(e.for);\r\n return !e.for || t.name === n.name && i.versionSatisfies(t.version, n.range)\r\n }\r\n ,\r\n i.use = function(e, t) {\r\n if (e.uses = (e.uses || []).concat(t || []),\r\n 0 !== e.uses.length) {\r\n for (var n = i.dependencies(e), r = o.topologicalSort(n), s = [], a = 0; a < r.length; a += 1)\r\n if (r[a] !== e.name) {\r\n var l = i.resolve(r[a]);\r\n l ? i.isUsed(e, l.name) || (i.isFor(l, e) || (o.warn(\"Plugin.use:\", i.toString(l), \"is for\", l.for, \"but installed on\", i.toString(e) + \".\"),\r\n l._warned = !0),\r\n l.install ? l.install(e) : (o.warn(\"Plugin.use:\", i.toString(l), \"does not specify an install function.\"),\r\n l._warned = !0),\r\n l._warned ? (s.push(\"\\uD83D\\uDD36 \" + i.toString(l)),\r\n delete l._warned) : s.push(\"\\u2705 \" + i.toString(l)),\r\n e.used.push(l.name)) : s.push(\"\\u274C \" + r[a])\r\n }\r\n s.length > 0 && o.info(s.join(\" \"))\r\n } else\r\n o.warn(\"Plugin.use:\", i.toString(e), \"does not specify any dependencies to install.\")\r\n }\r\n ,\r\n i.dependencies = function(e, t) {\r\n var n = i.dependencyParse(e)\r\n , r = n.name;\r\n if (!(r in (t = t || {}))) {\r\n e = i.resolve(e) || e,\r\n t[r] = o.map(e.uses || [], function(t) {\r\n i.isPlugin(t) && i.register(t);\r\n var r = i.dependencyParse(t)\r\n , s = i.resolve(t);\r\n return s && !i.versionSatisfies(s.version, r.range) ? (o.warn(\"Plugin.dependencies:\", i.toString(s), \"does not satisfy\", i.toString(r), \"used by\", i.toString(n) + \".\"),\r\n s._warned = !0,\r\n e._warned = !0) : s || (o.warn(\"Plugin.dependencies:\", i.toString(t), \"used by\", i.toString(n), \"could not be resolved.\"),\r\n e._warned = !0),\r\n r.name\r\n });\r\n for (var s = 0; s < t[r].length; s += 1)\r\n i.dependencies(t[r][s], t);\r\n return t\r\n }\r\n }\r\n ,\r\n i.dependencyParse = function(e) {\r\n return o.isString(e) ? (/^[\\w-]+(@(\\*|[\\^~]?\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+)?))?$/.test(e) || o.warn(\"Plugin.dependencyParse:\", e, \"is not a valid dependency string.\"),\r\n {\r\n name: e.split(\"@\")[0],\r\n range: e.split(\"@\")[1] || \"*\"\r\n }) : {\r\n name: e.name,\r\n range: e.range || e.version\r\n }\r\n }\r\n ,\r\n i.versionParse = function(e) {\r\n var t = /^(\\*)|(\\^|~|>=|>)?\\s*((\\d+)\\.(\\d+)\\.(\\d+))(-[0-9A-Za-z-]+)?$/;\r\n t.test(e) || o.warn(\"Plugin.versionParse:\", e, \"is not a valid version or range.\");\r\n var n = t.exec(e)\r\n , i = Number(n[4])\r\n , r = Number(n[5])\r\n , s = Number(n[6]);\r\n return {\r\n isRange: Boolean(n[1] || n[2]),\r\n version: n[3],\r\n range: e,\r\n operator: n[1] || n[2] || \"\",\r\n major: i,\r\n minor: r,\r\n patch: s,\r\n parts: [i, r, s],\r\n prerelease: n[7],\r\n number: 1e8 * i + 1e4 * r + s\r\n }\r\n }\r\n ,\r\n i.versionSatisfies = function(e, t) {\r\n t = t || \"*\";\r\n var n = i.versionParse(t)\r\n , o = i.versionParse(e);\r\n if (n.isRange) {\r\n if (\"*\" === n.operator || \"*\" === e)\r\n return !0;\r\n if (\">\" === n.operator)\r\n return o.number > n.number;\r\n if (\">=\" === n.operator)\r\n return o.number >= n.number;\r\n if (\"~\" === n.operator)\r\n return o.major === n.major && o.minor === n.minor && o.patch >= n.patch;\r\n if (\"^\" === n.operator)\r\n return n.major > 0 ? o.major === n.major && o.number >= n.number : n.minor > 0 ? o.minor === n.minor && o.patch >= n.patch : o.patch === n.patch\r\n }\r\n return e === t || \"*\" === e\r\n }\r\n }\r\n , function(e, t) {\r\n var n = {};\r\n e.exports = n,\r\n n.create = function(e) {\r\n return {\r\n id: n.id(e),\r\n vertex: e,\r\n normalImpulse: 0,\r\n tangentImpulse: 0\r\n }\r\n }\r\n ,\r\n n.id = function(e) {\r\n return e.body.id + \"_\" + e.index\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(5)\r\n , r = (n(8),\r\n n(0));\r\n i.create = function(e) {\r\n var t = o.create()\r\n , n = {\r\n label: \"World\",\r\n gravity: {\r\n x: 0,\r\n y: 1,\r\n scale: .001\r\n },\r\n bounds: {\r\n min: {\r\n x: -1 / 0,\r\n y: -1 / 0\r\n },\r\n max: {\r\n x: 1 / 0,\r\n y: 1 / 0\r\n }\r\n }\r\n };\r\n return r.extend(t, n, e)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(9)\r\n , r = n(0);\r\n i._pairMaxIdleLife = 1e3,\r\n i.create = function(e) {\r\n return r.extend({\r\n table: {},\r\n list: [],\r\n collisionStart: [],\r\n collisionActive: [],\r\n collisionEnd: []\r\n }, e)\r\n }\r\n ,\r\n i.update = function(e, t, n) {\r\n var i, r, s, a, l = e.list, c = e.table, d = e.collisionStart, u = e.collisionEnd, p = e.collisionActive;\r\n for (d.length = 0,\r\n u.length = 0,\r\n p.length = 0,\r\n a = 0; a < l.length; a++)\r\n l[a].confirmedActive = !1;\r\n for (a = 0; a < t.length; a++)\r\n (i = t[a]).collided && ((s = c[r = o.id(i.bodyA, i.bodyB)]) ? (s.isActive ? p.push(s) : d.push(s),\r\n o.update(s, i, n),\r\n s.confirmedActive = !0) : (s = o.create(i, n),\r\n c[r] = s,\r\n d.push(s),\r\n l.push(s)));\r\n for (a = 0; a < l.length; a++)\r\n (s = l[a]).isActive && !s.confirmedActive && (o.setActive(s, !1, n),\r\n u.push(s))\r\n }\r\n ,\r\n i.removeOld = function(e, t) {\r\n var n, o, r, s, a = e.list, l = e.table, c = [];\r\n for (s = 0; s < a.length; s++)\r\n (o = (n = a[s]).collision).bodyA.isSleeping || o.bodyB.isSleeping ? n.timeUpdated = t : t - n.timeUpdated > i._pairMaxIdleLife && c.push(s);\r\n for (s = 0; s < c.length; s++)\r\n delete l[(n = a[r = c[s] - s]).id],\r\n a.splice(r, 1)\r\n }\r\n ,\r\n i.clear = function(e) {\r\n return e.table = {},\r\n e.list.length = 0,\r\n e.collisionStart.length = 0,\r\n e.collisionActive.length = 0,\r\n e.collisionEnd.length = 0,\r\n e\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(2)\r\n , s = n(0)\r\n , a = n(1);\r\n i._restingThresh = 4,\r\n i._restingThreshTangent = 6,\r\n i._positionDampen = .9,\r\n i._positionWarming = .8,\r\n i._frictionNormalMultiplier = 5,\r\n i.preSolvePosition = function(e) {\r\n var t, n, i;\r\n for (t = 0; t < e.length; t++)\r\n (n = e[t]).isActive && (i = n.activeContacts.length,\r\n n.collision.parentA.totalContacts += i,\r\n n.collision.parentB.totalContacts += i)\r\n }\r\n ,\r\n i.solvePosition = function(e, t) {\r\n var n, o, s, a, l, c, d, u, p, f = r._temp[0], v = r._temp[1], m = r._temp[2], y = r._temp[3];\r\n for (n = 0; n < e.length; n++)\r\n (o = e[n]).isActive && !o.isSensor && (a = (s = o.collision).parentA,\r\n l = s.parentB,\r\n c = s.normal,\r\n d = r.sub(r.add(l.positionImpulse, l.position, f), r.add(a.positionImpulse, r.sub(l.position, s.penetration, v), m), y),\r\n o.separation = r.dot(c, d));\r\n for (n = 0; n < e.length; n++)\r\n (o = e[n]).isActive && !o.isSensor && (a = (s = o.collision).parentA,\r\n l = s.parentB,\r\n c = s.normal,\r\n p = (o.separation - o.slop) * t,\r\n (a.isStatic || l.isStatic) && (p *= 2),\r\n a.isStatic || a.isSleeping || (u = i._positionDampen / a.totalContacts,\r\n a.positionImpulse.x += c.x * p * u,\r\n a.positionImpulse.y += c.y * p * u),\r\n l.isStatic || l.isSleeping || (u = i._positionDampen / l.totalContacts,\r\n l.positionImpulse.x -= c.x * p * u,\r\n l.positionImpulse.y -= c.y * p * u))\r\n }\r\n ,\r\n i.postSolvePosition = function(e) {\r\n for (var t = 0; t < e.length; t++) {\r\n var n = e[t];\r\n if (n.totalContacts = 0,\r\n 0 !== n.positionImpulse.x || 0 !== n.positionImpulse.y) {\r\n for (var s = 0; s < n.parts.length; s++) {\r\n var l = n.parts[s];\r\n o.translate(l.vertices, n.positionImpulse),\r\n a.update(l.bounds, l.vertices, n.velocity),\r\n l.position.x += n.positionImpulse.x,\r\n l.position.y += n.positionImpulse.y\r\n }\r\n n.positionPrev.x += n.positionImpulse.x,\r\n n.positionPrev.y += n.positionImpulse.y,\r\n r.dot(n.positionImpulse, n.velocity) < 0 ? (n.positionImpulse.x = 0,\r\n n.positionImpulse.y = 0) : (n.positionImpulse.x *= i._positionWarming,\r\n n.positionImpulse.y *= i._positionWarming)\r\n }\r\n }\r\n }\r\n ,\r\n i.preSolveVelocity = function(e) {\r\n var t, n, i, o, s, a, l, c, d, u, p, f, v, m, y = r._temp[0], g = r._temp[1];\r\n for (t = 0; t < e.length; t++)\r\n if ((i = e[t]).isActive && !i.isSensor)\r\n for (o = i.activeContacts,\r\n a = (s = i.collision).parentA,\r\n l = s.parentB,\r\n c = s.normal,\r\n d = s.tangent,\r\n n = 0; n < o.length; n++)\r\n p = (u = o[n]).vertex,\r\n f = u.normalImpulse,\r\n v = u.tangentImpulse,\r\n 0 === f && 0 === v || (y.x = c.x * f + d.x * v,\r\n y.y = c.y * f + d.y * v,\r\n a.isStatic || a.isSleeping || (m = r.sub(p, a.position, g),\r\n a.positionPrev.x += y.x * a.inverseMass,\r\n a.positionPrev.y += y.y * a.inverseMass,\r\n a.anglePrev += r.cross(m, y) * a.inverseInertia),\r\n l.isStatic || l.isSleeping || (m = r.sub(p, l.position, g),\r\n l.positionPrev.x -= y.x * l.inverseMass,\r\n l.positionPrev.y -= y.y * l.inverseMass,\r\n l.anglePrev -= r.cross(m, y) * l.inverseInertia))\r\n }\r\n ,\r\n i.solveVelocity = function(e, t) {\r\n for (var n = t * t, o = r._temp[0], a = r._temp[1], l = r._temp[2], c = r._temp[3], d = r._temp[4], u = r._temp[5], p = 0; p < e.length; p++) {\r\n var f = e[p];\r\n if (f.isActive && !f.isSensor) {\r\n var v = f.collision\r\n , m = v.parentA\r\n , y = v.parentB\r\n , g = v.normal\r\n , x = v.tangent\r\n , h = f.activeContacts\r\n , b = 1 / h.length;\r\n m.velocity.x = m.position.x - m.positionPrev.x,\r\n m.velocity.y = m.position.y - m.positionPrev.y,\r\n y.velocity.x = y.position.x - y.positionPrev.x,\r\n y.velocity.y = y.position.y - y.positionPrev.y,\r\n m.angularVelocity = m.angle - m.anglePrev,\r\n y.angularVelocity = y.angle - y.anglePrev;\r\n for (var w = 0; w < h.length; w++) {\r\n var S = h[w]\r\n , A = S.vertex\r\n , P = r.sub(A, m.position, a)\r\n , C = r.sub(A, y.position, l)\r\n , M = r.add(m.velocity, r.mult(r.perp(P), m.angularVelocity), c)\r\n , k = r.add(y.velocity, r.mult(r.perp(C), y.angularVelocity), d)\r\n , B = r.sub(M, k, u)\r\n , I = r.dot(g, B)\r\n , _ = r.dot(x, B)\r\n , T = Math.abs(_)\r\n , R = s.sign(_)\r\n , L = (1 + f.restitution) * I\r\n , O = s.clamp(f.separation + I, 0, 1) * i._frictionNormalMultiplier\r\n , E = _\r\n , V = 1 / 0;\r\n T > f.friction * f.frictionStatic * O * n && (V = T,\r\n E = s.clamp(f.friction * R * n, -V, V));\r\n var F = r.cross(P, g)\r\n , D = r.cross(C, g)\r\n , W = b / (m.inverseMass + y.inverseMass + m.inverseInertia * F * F + y.inverseInertia * D * D);\r\n if (L *= W,\r\n E *= W,\r\n I < 0 && I * I > i._restingThresh * n)\r\n S.normalImpulse = 0;\r\n else {\r\n var q = S.normalImpulse;\r\n S.normalImpulse = Math.min(S.normalImpulse + L, 0),\r\n L = S.normalImpulse - q\r\n }\r\n if (_ * _ > i._restingThreshTangent * n)\r\n S.tangentImpulse = 0;\r\n else {\r\n var j = S.tangentImpulse;\r\n S.tangentImpulse = s.clamp(S.tangentImpulse + E, -V, V),\r\n E = S.tangentImpulse - j\r\n }\r\n o.x = g.x * L + x.x * E,\r\n o.y = g.y * L + x.y * E,\r\n m.isStatic || m.isSleeping || (m.positionPrev.x += o.x * m.inverseMass,\r\n m.positionPrev.y += o.y * m.inverseMass,\r\n m.anglePrev += r.cross(P, o) * m.inverseInertia),\r\n y.isStatic || y.isSleeping || (y.positionPrev.x -= o.x * y.inverseMass,\r\n y.positionPrev.y -= o.y * y.inverseMass,\r\n y.anglePrev -= r.cross(C, o) * y.inverseInertia)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(19)\r\n , r = n(7)\r\n , s = n(21)\r\n , a = n(10)\r\n , l = n(20)\r\n , c = n(23)\r\n , d = n(11)\r\n , u = n(4)\r\n , p = n(5)\r\n , f = n(8)\r\n , v = n(0)\r\n , m = n(6);\r\n i.create = function(e, t) {\r\n t = (t = v.isElement(e) ? t : e) || {},\r\n ((e = v.isElement(e) ? e : null) || t.render) && v.warn(\"Engine.create: engine.render is deprecated (see docs)\");\r\n var n = {\r\n positionIterations: 6,\r\n velocityIterations: 4,\r\n constraintIterations: 2,\r\n enableSleeping: !1,\r\n events: [],\r\n plugin: {},\r\n timing: {\r\n timestamp: 0,\r\n timeScale: 1\r\n },\r\n broadphase: {\r\n controller: d\r\n }\r\n }\r\n , i = v.extend(n, t);\r\n if (e || i.render) {\r\n var r = {\r\n element: e,\r\n controller: a\r\n };\r\n i.render = v.extend(r, i.render)\r\n }\r\n return i.render && i.render.controller && (i.render = i.render.controller.create(i.render)),\r\n i.render && (i.render.engine = i),\r\n i.world = t.world || o.create(i.world),\r\n i.pairs = l.create(),\r\n i.broadphase = i.broadphase.controller.create(i.broadphase),\r\n i.metrics = i.metrics || {\r\n extended: !1\r\n },\r\n i.metrics = c.create(i.metrics),\r\n i\r\n }\r\n ,\r\n i.update = function(e, t, n) {\r\n t = t || 1e3 / 60,\r\n n = n || 1;\r\n var o, a = e.world, d = e.timing, v = e.broadphase, m = [];\r\n d.timestamp += t * d.timeScale;\r\n var y = {\r\n timestamp: d.timestamp\r\n };\r\n u.trigger(e, \"beforeUpdate\", y);\r\n var g = p.allBodies(a)\r\n , x = p.allConstraints(a);\r\n for (c.reset(e.metrics),\r\n e.enableSleeping && r.update(g, d.timeScale),\r\n i._bodiesApplyGravity(g, a.gravity),\r\n i._bodiesUpdate(g, t, d.timeScale, n, a.bounds),\r\n f.preSolveAll(g),\r\n o = 0; o < e.constraintIterations; o++)\r\n f.solveAll(x, d.timeScale);\r\n f.postSolveAll(g),\r\n v.controller ? (a.isModified && v.controller.clear(v),\r\n v.controller.update(v, g, e, a.isModified),\r\n m = v.pairsList) : m = g,\r\n a.isModified && p.setModified(a, !1, !1, !0);\r\n var h = v.detector(m, e)\r\n , b = e.pairs\r\n , w = d.timestamp;\r\n for (l.update(b, h, w),\r\n l.removeOld(b, w),\r\n e.enableSleeping && r.afterCollisions(b.list, d.timeScale),\r\n b.collisionStart.length > 0 && u.trigger(e, \"collisionStart\", {\r\n pairs: b.collisionStart\r\n }),\r\n s.preSolvePosition(b.list),\r\n o = 0; o < e.positionIterations; o++)\r\n s.solvePosition(b.list, d.timeScale);\r\n for (s.postSolvePosition(g),\r\n f.preSolveAll(g),\r\n o = 0; o < e.constraintIterations; o++)\r\n f.solveAll(x, d.timeScale);\r\n for (f.postSolveAll(g),\r\n s.preSolveVelocity(b.list),\r\n o = 0; o < e.velocityIterations; o++)\r\n s.solveVelocity(b.list, d.timeScale);\r\n return b.collisionActive.length > 0 && u.trigger(e, \"collisionActive\", {\r\n pairs: b.collisionActive\r\n }),\r\n b.collisionEnd.length > 0 && u.trigger(e, \"collisionEnd\", {\r\n pairs: b.collisionEnd\r\n }),\r\n c.update(e.metrics, e),\r\n i._bodiesClearForces(g),\r\n u.trigger(e, \"afterUpdate\", y),\r\n e\r\n }\r\n ,\r\n i.merge = function(e, t) {\r\n if (v.extend(e, t),\r\n t.world) {\r\n e.world = t.world,\r\n i.clear(e);\r\n for (var n = p.allBodies(e.world), o = 0; o < n.length; o++) {\r\n var s = n[o];\r\n r.set(s, !1),\r\n s.id = v.nextId()\r\n }\r\n }\r\n }\r\n ,\r\n i.clear = function(e) {\r\n var t = e.world;\r\n l.clear(e.pairs);\r\n var n = e.broadphase;\r\n if (n.controller) {\r\n var i = p.allBodies(t);\r\n n.controller.clear(n),\r\n n.controller.update(n, i, e, !0)\r\n }\r\n }\r\n ,\r\n i._bodiesClearForces = function(e) {\r\n for (var t = 0; t < e.length; t++) {\r\n var n = e[t];\r\n n.force.x = 0,\r\n n.force.y = 0,\r\n n.torque = 0\r\n }\r\n }\r\n ,\r\n i._bodiesApplyGravity = function(e, t) {\r\n var n = void 0 !== t.scale ? t.scale : .001;\r\n if ((0 !== t.x || 0 !== t.y) && 0 !== n)\r\n for (var i = 0; i < e.length; i++) {\r\n var o = e[i];\r\n o.isStatic || o.isSleeping || (o.force.y += o.mass * t.y * n,\r\n o.force.x += o.mass * t.x * n)\r\n }\r\n }\r\n ,\r\n i._bodiesUpdate = function(e, t, n, i, o) {\r\n for (var r = 0; r < e.length; r++) {\r\n var s = e[r];\r\n s.isStatic || s.isSleeping || m.update(s, t, n, i)\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(5)\r\n , r = n(0);\r\n i.create = function(e) {\r\n return r.extend({\r\n extended: !1,\r\n narrowDetections: 0,\r\n narrowphaseTests: 0,\r\n narrowReuse: 0,\r\n narrowReuseCount: 0,\r\n midphaseTests: 0,\r\n broadphaseTests: 0,\r\n narrowEff: 1e-4,\r\n midEff: 1e-4,\r\n broadEff: 1e-4,\r\n collisions: 0,\r\n buckets: 0,\r\n bodies: 0,\r\n pairs: 0\r\n }, !1, e)\r\n }\r\n ,\r\n i.reset = function(e) {\r\n e.extended && (e.narrowDetections = 0,\r\n e.narrowphaseTests = 0,\r\n e.narrowReuse = 0,\r\n e.narrowReuseCount = 0,\r\n e.midphaseTests = 0,\r\n e.broadphaseTests = 0,\r\n e.narrowEff = 0,\r\n e.midEff = 0,\r\n e.broadEff = 0,\r\n e.collisions = 0,\r\n e.buckets = 0,\r\n e.pairs = 0,\r\n e.bodies = 0)\r\n }\r\n ,\r\n i.update = function(e, t) {\r\n if (e.extended) {\r\n var n = t.world\r\n , i = o.allBodies(n);\r\n e.collisions = e.narrowDetections,\r\n e.pairs = t.pairs.list.length,\r\n e.bodies = i.length,\r\n e.midEff = (e.narrowDetections / (e.midphaseTests || 1)).toFixed(2),\r\n e.narrowEff = (e.narrowDetections / (e.narrowphaseTests || 1)).toFixed(2),\r\n e.broadEff = (1 - e.broadphaseTests / (i.length || 1)).toFixed(2),\r\n e.narrowReuse = (e.narrowReuseCount / (e.narrowphaseTests || 1)).toFixed(2)\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = e.exports = n(25);\r\n i.Body = n(6),\r\n i.Composite = n(5),\r\n i.World = n(19),\r\n i.Contact = n(18),\r\n i.Detector = n(12),\r\n i.Grid = n(11),\r\n i.Pairs = n(20),\r\n i.Pair = n(9),\r\n i.Query = n(26),\r\n i.Resolver = n(21),\r\n i.SAT = n(13),\r\n i.Constraint = n(8),\r\n i.MouseConstraint = n(28),\r\n i.Common = n(0),\r\n i.Engine = n(22),\r\n i.Events = n(4),\r\n i.Mouse = n(14),\r\n i.Runner = n(29),\r\n i.Sleeping = n(7),\r\n i.Plugin = n(17),\r\n i.Metrics = n(23),\r\n i.Bodies = n(16),\r\n i.Composites = n(30),\r\n i.Axes = n(15),\r\n i.Bounds = n(1),\r\n i.Svg = n(31),\r\n i.Vector = n(2),\r\n i.Vertices = n(3),\r\n i.Render = n(10),\r\n i.RenderPixi = n(32),\r\n i.World.add = i.Composite.add,\r\n i.World.remove = i.Composite.remove,\r\n i.World.addComposite = i.Composite.addComposite,\r\n i.World.addBody = i.Composite.addBody,\r\n i.World.addConstraint = i.Composite.addConstraint,\r\n i.World.clear = i.Composite.clear,\r\n i.Engine.run = i.Runner.run\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(17)\r\n , r = n(0);\r\n i.name = \"matter-js\",\r\n i.version = \"0.16.1\",\r\n i.uses = [],\r\n i.used = [],\r\n i.use = function() {\r\n o.use(i, Array.prototype.slice.call(arguments))\r\n }\r\n ,\r\n i.before = function(e, t) {\r\n return e = e.replace(/^Matter./, \"\"),\r\n r.chainPathBefore(i, e, t)\r\n }\r\n ,\r\n i.after = function(e, t) {\r\n return e = e.replace(/^Matter./, \"\"),\r\n r.chainPathAfter(i, e, t)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(2)\r\n , r = n(13)\r\n , s = n(1)\r\n , a = n(16)\r\n , l = n(3);\r\n i.collides = function(e, t) {\r\n for (var n = [], i = 0; i < t.length; i++) {\r\n var o = t[i];\r\n if (s.overlaps(o.bounds, e.bounds))\r\n for (var a = 1 === o.parts.length ? 0 : 1; a < o.parts.length; a++) {\r\n var l = o.parts[a];\r\n if (s.overlaps(l.bounds, e.bounds)) {\r\n var c = r.collides(l, e);\r\n if (c.collided) {\r\n n.push(c);\r\n break\r\n }\r\n }\r\n }\r\n }\r\n return n\r\n }\r\n ,\r\n i.ray = function(e, t, n, r) {\r\n r = r || 1e-100;\r\n for (var s = o.angle(t, n), l = o.magnitude(o.sub(t, n)), c = .5 * (n.x + t.x), d = .5 * (n.y + t.y), u = a.rectangle(c, d, l, r, {\r\n angle: s\r\n }), p = i.collides(u, e), f = 0; f < p.length; f += 1) {\r\n var v = p[f];\r\n v.body = v.bodyB = v.bodyA\r\n }\r\n return p\r\n }\r\n ,\r\n i.region = function(e, t, n) {\r\n for (var i = [], o = 0; o < e.length; o++) {\r\n var r = e[o]\r\n , a = s.overlaps(r.bounds, t);\r\n (a && !n || !a && n) && i.push(r)\r\n }\r\n return i\r\n }\r\n ,\r\n i.point = function(e, t) {\r\n for (var n = [], i = 0; i < e.length; i++) {\r\n var o = e[i];\r\n if (s.contains(o.bounds, t))\r\n for (var r = 1 === o.parts.length ? 0 : 1; r < o.parts.length; r++) {\r\n var a = o.parts[r];\r\n if (s.contains(a.bounds, t) && l.contains(a.vertices, t)) {\r\n n.push(o);\r\n break\r\n }\r\n }\r\n }\r\n return n\r\n }\r\n }\r\n , function(t, n) {\r\n if (void 0 === e) {\r\n var i = new Error(\"Cannot find module 'undefined'\");\r\n throw i.code = \"MODULE_NOT_FOUND\",\r\n i\r\n }\r\n t.exports = e\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(3)\r\n , r = n(7)\r\n , s = n(14)\r\n , a = n(4)\r\n , l = n(12)\r\n , c = n(8)\r\n , d = n(5)\r\n , u = n(0)\r\n , p = n(1);\r\n i.create = function(e, t) {\r\n var n = (e ? e.mouse : null) || (t ? t.mouse : null);\r\n n || (e && e.render && e.render.canvas ? n = s.create(e.render.canvas) : t && t.element ? n = s.create(t.element) : (n = s.create(),\r\n u.warn(\"MouseConstraint.create: options.mouse was undefined, options.element was undefined, may not function as expected\")));\r\n var o = {\r\n type: \"mouseConstraint\",\r\n mouse: n,\r\n element: null,\r\n body: null,\r\n constraint: c.create({\r\n label: \"Mouse Constraint\",\r\n pointA: n.position,\r\n pointB: {\r\n x: 0,\r\n y: 0\r\n },\r\n length: .01,\r\n stiffness: .1,\r\n angularStiffness: 1,\r\n render: {\r\n strokeStyle: \"#90EE90\",\r\n lineWidth: 3\r\n }\r\n }),\r\n collisionFilter: {\r\n category: 1,\r\n mask: 4294967295,\r\n group: 0\r\n }\r\n }\r\n , r = u.extend(o, t);\r\n return a.on(e, \"beforeUpdate\", function() {\r\n var t = d.allBodies(e.world);\r\n i.update(r, t),\r\n i._triggerEvents(r)\r\n }),\r\n r\r\n }\r\n ,\r\n i.update = function(e, t) {\r\n var n = e.mouse\r\n , i = e.constraint\r\n , s = e.body;\r\n if (0 === n.button) {\r\n if (i.bodyB)\r\n r.set(i.bodyB, !1),\r\n i.pointA = n.position;\r\n else\r\n for (var c = 0; c < t.length; c++)\r\n if (s = t[c],\r\n p.contains(s.bounds, n.position) && l.canCollide(s.collisionFilter, e.collisionFilter))\r\n for (var d = s.parts.length > 1 ? 1 : 0; d < s.parts.length; d++) {\r\n var u = s.parts[d];\r\n if (o.contains(u.vertices, n.position)) {\r\n i.pointA = n.position,\r\n i.bodyB = e.body = s,\r\n i.pointB = {\r\n x: n.position.x - s.position.x,\r\n y: n.position.y - s.position.y\r\n },\r\n i.angleB = s.angle,\r\n r.set(s, !1),\r\n a.trigger(e, \"startdrag\", {\r\n mouse: n,\r\n body: s\r\n });\r\n break\r\n }\r\n }\r\n } else\r\n i.bodyB = e.body = null,\r\n i.pointB = null,\r\n s && a.trigger(e, \"enddrag\", {\r\n mouse: n,\r\n body: s\r\n })\r\n }\r\n ,\r\n i._triggerEvents = function(e) {\r\n var t = e.mouse\r\n , n = t.sourceEvents;\r\n n.mousemove && a.trigger(e, \"mousemove\", {\r\n mouse: t\r\n }),\r\n n.mousedown && a.trigger(e, \"mousedown\", {\r\n mouse: t\r\n }),\r\n n.mouseup && a.trigger(e, \"mouseup\", {\r\n mouse: t\r\n }),\r\n s.clearSourceEvents(t)\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(4)\r\n , r = n(22)\r\n , s = n(0);\r\n !function() {\r\n var e, t, n;\r\n (\"undefined\" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame,\r\n t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame),\r\n e) || (e = function(e) {\r\n n = setTimeout(function() {\r\n e(s.now())\r\n }, 1e3 / 60)\r\n }\r\n ,\r\n t = function() {\r\n clearTimeout(n)\r\n }\r\n );\r\n i.create = function(e) {\r\n var t = s.extend({\r\n fps: 60,\r\n correction: 1,\r\n deltaSampleSize: 60,\r\n counterTimestamp: 0,\r\n frameCounter: 0,\r\n deltaHistory: [],\r\n timePrev: null,\r\n timeScalePrev: 1,\r\n frameRequestId: null,\r\n isFixed: !1,\r\n enabled: !0\r\n }, e);\r\n return t.delta = t.delta || 1e3 / t.fps,\r\n t.deltaMin = t.deltaMin || 1e3 / t.fps,\r\n t.deltaMax = t.deltaMax || 1e3 / (.5 * t.fps),\r\n t.fps = 1e3 / t.delta,\r\n t\r\n }\r\n ,\r\n i.run = function(t, n) {\r\n return void 0 !== t.positionIterations && (n = t,\r\n t = i.create()),\r\n function o(r) {\r\n t.frameRequestId = e(o),\r\n r && t.enabled && i.tick(t, n, r)\r\n }(),\r\n t\r\n }\r\n ,\r\n i.tick = function(e, t, n) {\r\n var i, s = t.timing, a = 1, l = {\r\n timestamp: s.timestamp\r\n };\r\n o.trigger(e, \"beforeTick\", l),\r\n o.trigger(t, \"beforeTick\", l),\r\n e.isFixed ? i = e.delta : (i = n - e.timePrev || e.delta,\r\n e.timePrev = n,\r\n e.deltaHistory.push(i),\r\n e.deltaHistory = e.deltaHistory.slice(-e.deltaSampleSize),\r\n a = (i = (i = (i = Math.min.apply(null, e.deltaHistory)) < e.deltaMin ? e.deltaMin : i) > e.deltaMax ? e.deltaMax : i) / e.delta,\r\n e.delta = i),\r\n 0 !== e.timeScalePrev && (a *= s.timeScale / e.timeScalePrev),\r\n 0 === s.timeScale && (a = 0),\r\n e.timeScalePrev = s.timeScale,\r\n e.correction = a,\r\n e.frameCounter += 1,\r\n n - e.counterTimestamp >= 1e3 && (e.fps = e.frameCounter * ((n - e.counterTimestamp) / 1e3),\r\n e.counterTimestamp = n,\r\n e.frameCounter = 0),\r\n o.trigger(e, \"tick\", l),\r\n o.trigger(t, \"tick\", l),\r\n t.world.isModified && t.render && t.render.controller && t.render.controller.clear && t.render.controller.clear(t.render),\r\n o.trigger(e, \"beforeUpdate\", l),\r\n r.update(t, i, a),\r\n o.trigger(e, \"afterUpdate\", l),\r\n t.render && t.render.controller && (o.trigger(e, \"beforeRender\", l),\r\n o.trigger(t, \"beforeRender\", l),\r\n t.render.controller.world(t.render),\r\n o.trigger(e, \"afterRender\", l),\r\n o.trigger(t, \"afterRender\", l)),\r\n o.trigger(e, \"afterTick\", l),\r\n o.trigger(t, \"afterTick\", l)\r\n }\r\n ,\r\n i.stop = function(e) {\r\n t(e.frameRequestId)\r\n }\r\n ,\r\n i.start = function(e, t) {\r\n i.run(e, t)\r\n }\r\n }()\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(5)\r\n , r = n(8)\r\n , s = n(0)\r\n , a = n(6)\r\n , l = n(16);\r\n i.stack = function(e, t, n, i, r, s, l) {\r\n for (var c, d = o.create({\r\n label: \"Stack\"\r\n }), u = e, p = t, f = 0, v = 0; v < i; v++) {\r\n for (var m = 0, y = 0; y < n; y++) {\r\n var g = l(u, p, y, v, c, f);\r\n if (g) {\r\n var x = g.bounds.max.y - g.bounds.min.y\r\n , h = g.bounds.max.x - g.bounds.min.x;\r\n x > m && (m = x),\r\n a.translate(g, {\r\n x: .5 * h,\r\n y: .5 * x\r\n }),\r\n u = g.bounds.max.x + r,\r\n o.addBody(d, g),\r\n c = g,\r\n f += 1\r\n } else\r\n u += r\r\n }\r\n p += m + s,\r\n u = e\r\n }\r\n return d\r\n }\r\n ,\r\n i.chain = function(e, t, n, i, a, l) {\r\n for (var c = e.bodies, d = 1; d < c.length; d++) {\r\n var u = c[d - 1]\r\n , p = c[d]\r\n , f = u.bounds.max.y - u.bounds.min.y\r\n , v = u.bounds.max.x - u.bounds.min.x\r\n , m = p.bounds.max.y - p.bounds.min.y\r\n , y = {\r\n bodyA: u,\r\n pointA: {\r\n x: v * t,\r\n y: f * n\r\n },\r\n bodyB: p,\r\n pointB: {\r\n x: (p.bounds.max.x - p.bounds.min.x) * i,\r\n y: m * a\r\n }\r\n }\r\n , g = s.extend(y, l);\r\n o.addConstraint(e, r.create(g))\r\n }\r\n return e.label += \" Chain\",\r\n e\r\n }\r\n ,\r\n i.mesh = function(e, t, n, i, a) {\r\n var l, c, d, u, p, f = e.bodies;\r\n for (l = 0; l < n; l++) {\r\n for (c = 1; c < t; c++)\r\n d = f[c - 1 + l * t],\r\n u = f[c + l * t],\r\n o.addConstraint(e, r.create(s.extend({\r\n bodyA: d,\r\n bodyB: u\r\n }, a)));\r\n if (l > 0)\r\n for (c = 0; c < t; c++)\r\n d = f[c + (l - 1) * t],\r\n u = f[c + l * t],\r\n o.addConstraint(e, r.create(s.extend({\r\n bodyA: d,\r\n bodyB: u\r\n }, a))),\r\n i && c > 0 && (p = f[c - 1 + (l - 1) * t],\r\n o.addConstraint(e, r.create(s.extend({\r\n bodyA: p,\r\n bodyB: u\r\n }, a)))),\r\n i && c < t - 1 && (p = f[c + 1 + (l - 1) * t],\r\n o.addConstraint(e, r.create(s.extend({\r\n bodyA: p,\r\n bodyB: u\r\n }, a))))\r\n }\r\n return e.label += \" Mesh\",\r\n e\r\n }\r\n ,\r\n i.pyramid = function(e, t, n, o, r, s, l) {\r\n return i.stack(e, t, n, o, r, s, function(t, i, s, c, d, u) {\r\n var p = Math.min(o, Math.ceil(n / 2))\r\n , f = d ? d.bounds.max.x - d.bounds.min.x : 0;\r\n if (!(c > p || s < (c = p - c) || s > n - 1 - c))\r\n return 1 === u && a.translate(d, {\r\n x: (s + (n % 2 == 1 ? 1 : -1)) * f,\r\n y: 0\r\n }),\r\n l(e + (d ? s * f : 0) + s * r, i, s, c, d, u)\r\n })\r\n }\r\n ,\r\n i.newtonsCradle = function(e, t, n, i, s) {\r\n for (var a = o.create({\r\n label: \"Newtons Cradle\"\r\n }), c = 0; c < n; c++) {\r\n var d = l.circle(e + c * (1.9 * i), t + s, i, {\r\n inertia: 1 / 0,\r\n restitution: 1,\r\n friction: 0,\r\n frictionAir: 1e-4,\r\n slop: 1\r\n })\r\n , u = r.create({\r\n pointA: {\r\n x: e + c * (1.9 * i),\r\n y: t\r\n },\r\n bodyB: d\r\n });\r\n o.addBody(a, d),\r\n o.addConstraint(a, u)\r\n }\r\n return a\r\n }\r\n ,\r\n i.car = function(e, t, n, i, s) {\r\n var c = a.nextGroup(!0)\r\n , d = .5 * -n + 20\r\n , u = .5 * n - 20\r\n , p = o.create({\r\n label: \"Car\"\r\n })\r\n , f = l.rectangle(e, t, n, i, {\r\n collisionFilter: {\r\n group: c\r\n },\r\n chamfer: {\r\n radius: .5 * i\r\n },\r\n density: 2e-4\r\n })\r\n , v = l.circle(e + d, t + 0, s, {\r\n collisionFilter: {\r\n group: c\r\n },\r\n friction: .8\r\n })\r\n , m = l.circle(e + u, t + 0, s, {\r\n collisionFilter: {\r\n group: c\r\n },\r\n friction: .8\r\n })\r\n , y = r.create({\r\n bodyB: f,\r\n pointB: {\r\n x: d,\r\n y: 0\r\n },\r\n bodyA: v,\r\n stiffness: 1,\r\n length: 0\r\n })\r\n , g = r.create({\r\n bodyB: f,\r\n pointB: {\r\n x: u,\r\n y: 0\r\n },\r\n bodyA: m,\r\n stiffness: 1,\r\n length: 0\r\n });\r\n return o.addBody(p, f),\r\n o.addBody(p, v),\r\n o.addBody(p, m),\r\n o.addConstraint(p, y),\r\n o.addConstraint(p, g),\r\n p\r\n }\r\n ,\r\n i.softBody = function(e, t, n, o, r, a, c, d, u, p) {\r\n u = s.extend({\r\n inertia: 1 / 0\r\n }, u),\r\n p = s.extend({\r\n stiffness: .2,\r\n render: {\r\n type: \"line\",\r\n anchors: !1\r\n }\r\n }, p);\r\n var f = i.stack(e, t, n, o, r, a, function(e, t) {\r\n return l.circle(e, t, d, u)\r\n });\r\n return i.mesh(f, n, o, c, p),\r\n f.label = \"Soft Body\",\r\n f\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n n(1);\r\n var o = n(0);\r\n i.pathToVertices = function(e, t) {\r\n \"undefined\" == typeof window || \"SVGPathSeg\"in window || o.warn(\"Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.\");\r\n var n, r, s, a, l, c, d, u, p, f, v, m = [], y = 0, g = 0, x = 0;\r\n t = t || 15;\r\n var h = function(e, t, n) {\r\n var i = n % 2 == 1 && n > 1;\r\n if (!p || e != p.x || t != p.y) {\r\n p && i ? (f = p.x,\r\n v = p.y) : (f = 0,\r\n v = 0);\r\n var o = {\r\n x: f + e,\r\n y: v + t\r\n };\r\n !i && p || (p = o),\r\n m.push(o),\r\n g = f + e,\r\n x = v + t\r\n }\r\n }\r\n , b = function(e) {\r\n var t = e.pathSegTypeAsLetter.toUpperCase();\r\n if (\"Z\" !== t) {\r\n switch (t) {\r\n case \"M\":\r\n case \"L\":\r\n case \"T\":\r\n case \"C\":\r\n case \"S\":\r\n case \"Q\":\r\n g = e.x,\r\n x = e.y;\r\n break;\r\n case \"H\":\r\n g = e.x;\r\n break;\r\n case \"V\":\r\n x = e.y;\r\n }\r\n h(g, x, e.pathSegType)\r\n }\r\n };\r\n for (i._svgPathToAbsolute(e),\r\n s = e.getTotalLength(),\r\n c = [],\r\n n = 0; n < e.pathSegList.numberOfItems; n += 1)\r\n c.push(e.pathSegList.getItem(n));\r\n for (d = c.concat(); y < s; ) {\r\n if ((l = c[e.getPathSegAtLength(y)]) != u) {\r\n for (; d.length && d[0] != l; )\r\n b(d.shift());\r\n u = l\r\n }\r\n switch (l.pathSegTypeAsLetter.toUpperCase()) {\r\n case \"C\":\r\n case \"T\":\r\n case \"S\":\r\n case \"Q\":\r\n case \"A\":\r\n a = e.getPointAtLength(y),\r\n h(a.x, a.y, 0);\r\n }\r\n y += t\r\n }\r\n for (n = 0,\r\n r = d.length; n < r; ++n)\r\n b(d[n]);\r\n return m\r\n }\r\n ,\r\n i._svgPathToAbsolute = function(e) {\r\n for (var t, n, i, o, r, s, a = e.pathSegList, l = 0, c = 0, d = a.numberOfItems, u = 0; u < d; ++u) {\r\n var p = a.getItem(u)\r\n , f = p.pathSegTypeAsLetter;\r\n if (/[MLHVCSQTA]/.test(f))\r\n \"x\"in p && (l = p.x),\r\n \"y\"in p && (c = p.y);\r\n else\r\n switch (\"x1\"in p && (i = l + p.x1),\r\n \"x2\"in p && (r = l + p.x2),\r\n \"y1\"in p && (o = c + p.y1),\r\n \"y2\"in p && (s = c + p.y2),\r\n \"x\"in p && (l += p.x),\r\n \"y\"in p && (c += p.y),\r\n f) {\r\n case \"m\":\r\n a.replaceItem(e.createSVGPathSegMovetoAbs(l, c), u);\r\n break;\r\n case \"l\":\r\n a.replaceItem(e.createSVGPathSegLinetoAbs(l, c), u);\r\n break;\r\n case \"h\":\r\n a.replaceItem(e.createSVGPathSegLinetoHorizontalAbs(l), u);\r\n break;\r\n case \"v\":\r\n a.replaceItem(e.createSVGPathSegLinetoVerticalAbs(c), u);\r\n break;\r\n case \"c\":\r\n a.replaceItem(e.createSVGPathSegCurvetoCubicAbs(l, c, i, o, r, s), u);\r\n break;\r\n case \"s\":\r\n a.replaceItem(e.createSVGPathSegCurvetoCubicSmoothAbs(l, c, r, s), u);\r\n break;\r\n case \"q\":\r\n a.replaceItem(e.createSVGPathSegCurvetoQuadraticAbs(l, c, i, o), u);\r\n break;\r\n case \"t\":\r\n a.replaceItem(e.createSVGPathSegCurvetoQuadraticSmoothAbs(l, c), u);\r\n break;\r\n case \"a\":\r\n a.replaceItem(e.createSVGPathSegArcAbs(l, c, p.r1, p.r2, p.angle, p.largeArcFlag, p.sweepFlag), u);\r\n break;\r\n case \"z\":\r\n case \"Z\":\r\n l = t,\r\n c = n;\r\n }\r\n \"M\" != f && \"m\" != f || (t = l,\r\n n = c)\r\n }\r\n }\r\n }\r\n , function(e, t, n) {\r\n var i = {};\r\n e.exports = i;\r\n var o = n(1)\r\n , r = n(5)\r\n , s = n(0)\r\n , a = n(4)\r\n , l = n(2);\r\n !function() {\r\n var e, t;\r\n \"undefined\" != typeof window && (e = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function(e) {\r\n window.setTimeout(function() {\r\n e(s.now())\r\n }, 1e3 / 60)\r\n }\r\n ,\r\n t = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame),\r\n i.create = function(e) {\r\n s.warn(\"RenderPixi.create: Matter.RenderPixi is deprecated (see docs)\");\r\n var t = {\r\n controller: i,\r\n engine: null,\r\n element: null,\r\n frameRequestId: null,\r\n canvas: null,\r\n renderer: null,\r\n container: null,\r\n spriteContainer: null,\r\n pixiOptions: null,\r\n options: {\r\n width: 800,\r\n height: 600,\r\n background: \"#fafafa\",\r\n wireframeBackground: \"#222\",\r\n hasBounds: !1,\r\n enabled: !0,\r\n wireframes: !0,\r\n showSleeping: !0,\r\n showDebug: !1,\r\n showBroadphase: !1,\r\n showBounds: !1,\r\n showVelocity: !1,\r\n showCollisions: !1,\r\n showAxes: !1,\r\n showPositions: !1,\r\n showAngleIndicator: !1,\r\n showIds: !1,\r\n showShadows: !1\r\n }\r\n }\r\n , n = s.extend(t, e)\r\n , o = !n.options.wireframes && \"transparent\" === n.options.background;\r\n return n.pixiOptions = n.pixiOptions || {\r\n view: n.canvas,\r\n transparent: o,\r\n antialias: !0,\r\n backgroundColor: e.background\r\n },\r\n n.mouse = e.mouse,\r\n n.engine = e.engine,\r\n n.renderer = n.renderer || new PIXI.WebGLRenderer(n.options.width,n.options.height,n.pixiOptions),\r\n n.container = n.container || new PIXI.Container,\r\n n.spriteContainer = n.spriteContainer || new PIXI.Container,\r\n n.canvas = n.canvas || n.renderer.view,\r\n n.bounds = n.bounds || {\r\n min: {\r\n x: 0,\r\n y: 0\r\n },\r\n max: {\r\n x: n.options.width,\r\n y: n.options.height\r\n }\r\n },\r\n a.on(n.engine, \"beforeUpdate\", function() {\r\n i.clear(n)\r\n }),\r\n n.textures = {},\r\n n.sprites = {},\r\n n.primitives = {},\r\n n.container.addChild(n.spriteContainer),\r\n s.isElement(n.element) ? n.element.appendChild(n.canvas) : s.warn(\"No \\\"render.element\\\" passed, \\\"render.canvas\\\" was not inserted into document.\"),\r\n n.canvas.oncontextmenu = function() {\r\n return !1\r\n }\r\n ,\r\n n.canvas.onselectstart = function() {\r\n return !1\r\n }\r\n ,\r\n n\r\n }\r\n ,\r\n i.run = function(t) {\r\n !function n(o) {\r\n t.frameRequestId = e(n),\r\n i.world(t)\r\n }()\r\n }\r\n ,\r\n i.stop = function(e) {\r\n t(e.frameRequestId)\r\n }\r\n ,\r\n i.clear = function(e) {\r\n for (var t = e.container, n = e.spriteContainer; t.children[0]; )\r\n t.removeChild(t.children[0]);\r\n for (; n.children[0]; )\r\n n.removeChild(n.children[0]);\r\n var i = e.sprites[\"bg-0\"];\r\n e.textures = {},\r\n e.sprites = {},\r\n e.primitives = {},\r\n e.sprites[\"bg-0\"] = i,\r\n i && t.addChildAt(i, 0),\r\n e.container.addChild(e.spriteContainer),\r\n e.currentBackground = null,\r\n t.scale.set(1, 1),\r\n t.position.set(0, 0)\r\n }\r\n ,\r\n i.setBackground = function(e, t) {\r\n if (e.currentBackground !== t) {\r\n var n = t.indexOf && -1 !== t.indexOf(\"#\")\r\n , i = e.sprites[\"bg-0\"];\r\n if (n) {\r\n var o = s.colorToNumber(t);\r\n e.renderer.backgroundColor = o,\r\n i && e.container.removeChild(i)\r\n } else if (!i) {\r\n var r = d(e, t);\r\n (i = e.sprites[\"bg-0\"] = new PIXI.Sprite(r)).position.x = 0,\r\n i.position.y = 0,\r\n e.container.addChildAt(i, 0)\r\n }\r\n e.currentBackground = t\r\n }\r\n }\r\n ,\r\n i.world = function(e) {\r\n var t, n = e.engine.world, s = e.renderer, a = e.container, c = e.options, d = r.allBodies(n), u = r.allConstraints(n), p = [];\r\n c.wireframes ? i.setBackground(e, c.wireframeBackground) : i.setBackground(e, c.background);\r\n var f = e.bounds.max.x - e.bounds.min.x\r\n , v = e.bounds.max.y - e.bounds.min.y\r\n , m = f / e.options.width\r\n , y = v / e.options.height;\r\n if (c.hasBounds) {\r\n for (t = 0; t < d.length; t++) {\r\n var g = d[t];\r\n g.render.sprite.visible = o.overlaps(g.bounds, e.bounds)\r\n }\r\n for (t = 0; t < u.length; t++) {\r\n var x = u[t]\r\n , h = x.bodyA\r\n , b = x.bodyB\r\n , w = x.pointA\r\n , S = x.pointB;\r\n h && (w = l.add(h.position, x.pointA)),\r\n b && (S = l.add(b.position, x.pointB)),\r\n w && S && (o.contains(e.bounds, w) || o.contains(e.bounds, S)) && p.push(x)\r\n }\r\n a.scale.set(1 / m, 1 / y),\r\n a.position.set(-e.bounds.min.x * (1 / m), -e.bounds.min.y * (1 / y))\r\n } else\r\n p = u;\r\n for (t = 0; t < d.length; t++)\r\n i.body(e, d[t]);\r\n for (t = 0; t < p.length; t++)\r\n i.constraint(e, p[t]);\r\n s.render(a)\r\n }\r\n ,\r\n i.constraint = function(e, t) {\r\n e.engine;\r\n var n = t.bodyA\r\n , i = t.bodyB\r\n , o = t.pointA\r\n , r = t.pointB\r\n , a = e.container\r\n , l = t.render\r\n , c = \"c-\" + t.id\r\n , d = e.primitives[c];\r\n d || (d = e.primitives[c] = new PIXI.Graphics),\r\n l.visible && t.pointA && t.pointB ? (-1 === s.indexOf(a.children, d) && a.addChild(d),\r\n d.clear(),\r\n d.beginFill(0, 0),\r\n d.lineStyle(l.lineWidth, s.colorToNumber(l.strokeStyle), 1),\r\n n ? d.moveTo(n.position.x + o.x, n.position.y + o.y) : d.moveTo(o.x, o.y),\r\n i ? d.lineTo(i.position.x + r.x, i.position.y + r.y) : d.lineTo(r.x, r.y),\r\n d.endFill()) : d.clear()\r\n }\r\n ,\r\n i.body = function(e, t) {\r\n e.engine;\r\n var i = t.render;\r\n if (i.visible)\r\n if (i.sprite && i.sprite.texture) {\r\n var o = \"b-\" + t.id\r\n , r = e.sprites[o]\r\n , a = e.spriteContainer;\r\n r || (r = e.sprites[o] = n(e, t)),\r\n -1 === s.indexOf(a.children, r) && a.addChild(r),\r\n r.position.x = t.position.x,\r\n r.position.y = t.position.y,\r\n r.rotation = t.angle,\r\n r.scale.x = i.sprite.xScale || 1,\r\n r.scale.y = i.sprite.yScale || 1\r\n } else {\r\n var l = \"b-\" + t.id\r\n , d = e.primitives[l]\r\n , u = e.container;\r\n d || ((d = e.primitives[l] = c(e, t)).initialAngle = t.angle),\r\n -1 === s.indexOf(u.children, d) && u.addChild(d),\r\n d.position.x = t.position.x,\r\n d.position.y = t.position.y,\r\n d.rotation = t.angle - d.initialAngle\r\n }\r\n }\r\n ;\r\n var n = function(e, t) {\r\n var n = t.render.sprite.texture\r\n , i = d(e, n)\r\n , o = new PIXI.Sprite(i);\r\n return o.anchor.x = t.render.sprite.xOffset,\r\n o.anchor.y = t.render.sprite.yOffset,\r\n o\r\n }\r\n , c = function(e, t) {\r\n var n, i = t.render, o = e.options, r = new PIXI.Graphics, a = s.colorToNumber(i.fillStyle), l = s.colorToNumber(i.strokeStyle), c = s.colorToNumber(i.strokeStyle), d = s.colorToNumber(\"#bbb\"), u = s.colorToNumber(\"#CD5C5C\");\r\n r.clear();\r\n for (var p = t.parts.length > 1 ? 1 : 0; p < t.parts.length; p++) {\r\n n = t.parts[p],\r\n o.wireframes ? (r.beginFill(0, 0),\r\n r.lineStyle(1, d, 1)) : (r.beginFill(a, 1),\r\n r.lineStyle(i.lineWidth, l, 1)),\r\n r.moveTo(n.vertices[0].x - t.position.x, n.vertices[0].y - t.position.y);\r\n for (var f = 1; f < n.vertices.length; f++)\r\n r.lineTo(n.vertices[f].x - t.position.x, n.vertices[f].y - t.position.y);\r\n r.lineTo(n.vertices[0].x - t.position.x, n.vertices[0].y - t.position.y),\r\n r.endFill(),\r\n (o.showAngleIndicator || o.showAxes) && (r.beginFill(0, 0),\r\n o.wireframes ? r.lineStyle(1, u, 1) : r.lineStyle(1, c),\r\n r.moveTo(n.position.x - t.position.x, n.position.y - t.position.y),\r\n r.lineTo((n.vertices[0].x + n.vertices[n.vertices.length - 1].x) / 2 - t.position.x, (n.vertices[0].y + n.vertices[n.vertices.length - 1].y) / 2 - t.position.y),\r\n r.endFill())\r\n }\r\n return r\r\n }\r\n , d = function(e, t) {\r\n var n = e.textures[t];\r\n return n || (n = e.textures[t] = PIXI.Texture.fromImage(t)),\r\n n\r\n }\r\n }()\r\n }\r\n ])\r\n });\r\n var a = function() {\r\n function e(e) {\r\n this._engine = ha.Engine.create(),\r\n this._pixiObjects = [],\r\n ha.Engine.run(this.engine);\r\n var t = ha.MouseConstraint.create(this.engine, {\r\n mouse: ha.Mouse.create(e.stage)\r\n });\r\n ha.World.add(this.engine.world, t)\r\n }\r\n return Object.defineProperty(e.prototype, \"engine\", {\r\n get: function() {\r\n return this._engine\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"pixiObjects\", {\r\n get: function() {\r\n return this._pixiObjects\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.update = function() {\r\n this._pixiObjects.forEach(function(e) {\r\n return e.update()\r\n })\r\n }\r\n ,\r\n e.prototype.addToWorld = function() {\r\n for (var e = this, t = [], i = 0; i < arguments.length; i++)\r\n t[i] = arguments[i];\r\n t.forEach(function(t) {\r\n return ha.World.addBody(e.engine.world, t.body)\r\n }),\r\n this._pixiObjects = this._pixiObjects.concat(t)\r\n }\r\n ,\r\n e.prototype.removeFromWorld = function() {\r\n for (var e = this, t = [], i = 0; i < arguments.length; i++)\r\n t[i] = arguments[i];\r\n t.forEach(function(t) {\r\n return ha.World.remove(e.engine.world, t.body)\r\n }),\r\n this._pixiObjects = this._pixiObjects.filter(function(e) {\r\n return !t.includes(e)\r\n })\r\n }\r\n ,\r\n e\r\n }();\r\n var b = function() {\r\n function i(i, t, e) {\r\n void 0 === t && (t = {});\r\n var o = i.x\r\n , s = i.y\r\n , r = i.width\r\n , p = i.height;\r\n i.texture;\r\n this._sprite = i,\r\n this._update = e,\r\n this.physicsOptions = t,\r\n t.isCircle ? this._body = ha.Bodies.circle(o, s, r / 2, t) : this._body = ha.Bodies.rectangle(o, s, r, p, t)\r\n }\r\n return Object.defineProperty(i.prototype, \"body\", {\r\n get: function() {\r\n return this._body\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n i.prototype.update = function() {\r\n this._update ? this._update({\r\n position: this._body.position,\r\n rotation: this._body.angle\r\n }) : (this._sprite.position = this._body.position,\r\n this._sprite.rotation = this._body.angle)\r\n }\r\n ,\r\n i\r\n }();\r\n var Nb = {};\r\n var ue, ve, Fa, Ga;\r\n var Ob = /iPhone/i\r\n , Ic = /iPod/i\r\n , Jc = /iPad/i\r\n , Kc = /\\biOS-universal(?:.+)Mac\\b/i\r\n , Pb = /\\bAndroid(?:.+)Mobile\\b/i\r\n , Lc = /Android/i\r\n , Ra = /(?:SD4930UR|\\bSilk(?:.+)Mobile\\b)/i\r\n , ib = /Silk/i\r\n , wa = /Windows Phone/i\r\n , Mc = /\\bWindows(?:.+)ARM\\b/i\r\n , Nc = /BlackBerry/i\r\n , Oc = /BB10/i\r\n , Pc = /Opera Mini/i\r\n , Qc = /\\b(CriOS|Chrome)(?:.+)Mobile/i\r\n , Rc = /Mobile(?:.+)Firefox\\b/i\r\n , Sc = function($) {\r\n return void 0 !== $ && \"MacIntel\" === $.platform && \"number\" == typeof $.maxTouchPoints && $.maxTouchPoints > 1 && \"undefined\" == typeof MSStream\r\n };\r\n function we($) {\r\n return function(a) {\r\n return a.test($)\r\n }\r\n }\r\n function xe($) {\r\n var a = {\r\n userAgent: \"\",\r\n platform: \"\",\r\n maxTouchPoints: 0\r\n };\r\n $ || \"undefined\" == typeof navigator ? \"string\" == typeof $ ? a.userAgent = $ : $ && $.userAgent && (a = {\r\n userAgent: $.userAgent,\r\n platform: $.platform,\r\n maxTouchPoints: $.maxTouchPoints || 0\r\n }) : a = {\r\n userAgent: navigator.userAgent,\r\n platform: navigator.platform,\r\n maxTouchPoints: navigator.maxTouchPoints || 0\r\n };\r\n var e = a.userAgent\r\n , r = e.split(\"[FBAN\");\r\n void 0 !== r[1] && (e = r[0]),\r\n void 0 !== (r = e.split(\"Twitter\"))[1] && (e = r[0]);\r\n var o = we(e)\r\n , v = {\r\n apple: {\r\n phone: o(Ob) && !o(wa),\r\n ipod: o(Ic),\r\n tablet: !o(Ob) && (o(Jc) || Sc(a)) && !o(wa),\r\n universal: o(Kc),\r\n device: (o(Ob) || o(Ic) || o(Jc) || o(Kc) || Sc(a)) && !o(wa)\r\n },\r\n amazon: {\r\n phone: o(Ra),\r\n tablet: !o(Ra) && o(ib),\r\n device: o(Ra) || o(ib)\r\n },\r\n android: {\r\n phone: !o(wa) && o(Ra) || !o(wa) && o(Pb),\r\n tablet: !o(wa) && !o(Ra) && !o(Pb) && (o(ib) || o(Lc)),\r\n device: !o(wa) && (o(Ra) || o(ib) || o(Pb) || o(Lc)) || o(/\\bokhttp\\b/i)\r\n },\r\n windows: {\r\n phone: o(wa),\r\n tablet: o(Mc),\r\n device: o(wa) || o(Mc)\r\n },\r\n other: {\r\n blackberry: o(Nc),\r\n blackberry10: o(Oc),\r\n opera: o(Pc),\r\n firefox: o(Rc),\r\n chrome: o(Qc),\r\n device: o(Nc) || o(Oc) || o(Pc) || o(Rc) || o(Qc)\r\n },\r\n any: !1,\r\n phone: !1,\r\n tablet: !1\r\n };\r\n return v.any = v.apple.device || v.android.device || v.windows.device || v.other.device,\r\n v.phone = v.apple.phone || v.android.phone || v.windows.phone,\r\n v.tablet = v.apple.tablet || v.android.tablet || v.windows.tablet,\r\n v\r\n }\r\n var Ha = xe(self.navigator);\r\n function ye(e) {\r\n var i = !0;\r\n if (Ha.tablet || Ha.phone) {\r\n var r;\r\n if (Ha.apple.device)\r\n if (r = navigator.userAgent.match(/OS (\\d+)_(\\d+)?/))\r\n parseInt(r[1], 10) < 11 && (i = !1);\r\n if (Ha.android.device)\r\n if (r = navigator.userAgent.match(/Android\\s([0-9.]*)/))\r\n parseInt(r[1], 10) < 7 && (i = !1)\r\n }\r\n return i ? e : 4\r\n }\r\n function ze() {\r\n return !Ha.apple.device\r\n }\r\n var aa = {\r\n MIPMAP_TEXTURES: 1,\r\n ANISOTROPIC_LEVEL: 0,\r\n RESOLUTION: 1,\r\n FILTER_RESOLUTION: 1,\r\n SPRITE_MAX_TEXTURES: ye(32),\r\n SPRITE_BATCH_SIZE: 4096,\r\n RENDER_OPTIONS: {\r\n view: null,\r\n antialias: !1,\r\n autoDensity: !1,\r\n backgroundColor: 0,\r\n backgroundAlpha: 1,\r\n useContextAlpha: !0,\r\n clearBeforeRender: !0,\r\n preserveDrawingBuffer: !1,\r\n width: 800,\r\n height: 600,\r\n legacy: !1\r\n },\r\n GC_MODE: 0,\r\n GC_MAX_IDLE: 3600,\r\n GC_MAX_CHECK_COUNT: 600,\r\n WRAP_MODE: 33071,\r\n SCALE_MODE: 1,\r\n PRECISION_VERTEX: \"highp\",\r\n PRECISION_FRAGMENT: Ha.apple.device ? \"highp\" : \"mediump\",\r\n CAN_UPLOAD_SAME_BUFFER: ze(),\r\n CREATE_IMAGE_BITMAP: !1,\r\n ROUND_PIXELS: !1\r\n };\r\n var Ae, Be, Ce, De, Ee, Fe, Ge, He, Ie, Je, Ke, Le, Me, Ne, Oe, Pe, Qe, Aa, jb, Qb, K, Ba, kb, Sa, ua, Ca, Rb, $a, Ia, Ja, Tc, xa, qa, _a;\r\n !function(E) {\r\n E[E.WEBGL_LEGACY = 0] = \"WEBGL_LEGACY\",\r\n E[E.WEBGL = 1] = \"WEBGL\",\r\n E[E.WEBGL2 = 2] = \"WEBGL2\"\r\n }(Aa || (Fe = Aa = {},\r\n Fe)),\r\n function(E) {\r\n E[E.UNKNOWN = 0] = \"UNKNOWN\",\r\n E[E.WEBGL = 1] = \"WEBGL\",\r\n E[E.CANVAS = 2] = \"CANVAS\"\r\n }(jb || (Me = jb = {},\r\n Me)),\r\n function(E) {\r\n E[E.COLOR = 16384] = \"COLOR\",\r\n E[E.DEPTH = 256] = \"DEPTH\",\r\n E[E.STENCIL = 1024] = \"STENCIL\"\r\n }(Qb || (Ce = Qb = {},\r\n Ce)),\r\n function(E) {\r\n E[E.NORMAL = 0] = \"NORMAL\",\r\n E[E.ADD = 1] = \"ADD\",\r\n E[E.MULTIPLY = 2] = \"MULTIPLY\",\r\n E[E.SCREEN = 3] = \"SCREEN\",\r\n E[E.OVERLAY = 4] = \"OVERLAY\",\r\n E[E.DARKEN = 5] = \"DARKEN\",\r\n E[E.LIGHTEN = 6] = \"LIGHTEN\",\r\n E[E.COLOR_DODGE = 7] = \"COLOR_DODGE\",\r\n E[E.COLOR_BURN = 8] = \"COLOR_BURN\",\r\n E[E.HARD_LIGHT = 9] = \"HARD_LIGHT\",\r\n E[E.SOFT_LIGHT = 10] = \"SOFT_LIGHT\",\r\n E[E.DIFFERENCE = 11] = \"DIFFERENCE\",\r\n E[E.EXCLUSION = 12] = \"EXCLUSION\",\r\n E[E.HUE = 13] = \"HUE\",\r\n E[E.SATURATION = 14] = \"SATURATION\",\r\n E[E.COLOR = 15] = \"COLOR\",\r\n E[E.LUMINOSITY = 16] = \"LUMINOSITY\",\r\n E[E.NORMAL_NPM = 17] = \"NORMAL_NPM\",\r\n E[E.ADD_NPM = 18] = \"ADD_NPM\",\r\n E[E.SCREEN_NPM = 19] = \"SCREEN_NPM\",\r\n E[E.NONE = 20] = \"NONE\",\r\n E[E.SRC_OVER = 0] = \"SRC_OVER\",\r\n E[E.SRC_IN = 21] = \"SRC_IN\",\r\n E[E.SRC_OUT = 22] = \"SRC_OUT\",\r\n E[E.SRC_ATOP = 23] = \"SRC_ATOP\",\r\n E[E.DST_OVER = 24] = \"DST_OVER\",\r\n E[E.DST_IN = 25] = \"DST_IN\",\r\n E[E.DST_OUT = 26] = \"DST_OUT\",\r\n E[E.DST_ATOP = 27] = \"DST_ATOP\",\r\n E[E.ERASE = 26] = \"ERASE\",\r\n E[E.SUBTRACT = 28] = \"SUBTRACT\",\r\n E[E.XOR = 29] = \"XOR\"\r\n }(K || (Be = K = {},\r\n Be)),\r\n function(E) {\r\n E[E.POINTS = 0] = \"POINTS\",\r\n E[E.LINES = 1] = \"LINES\",\r\n E[E.LINE_LOOP = 2] = \"LINE_LOOP\",\r\n E[E.LINE_STRIP = 3] = \"LINE_STRIP\",\r\n E[E.TRIANGLES = 4] = \"TRIANGLES\",\r\n E[E.TRIANGLE_STRIP = 5] = \"TRIANGLE_STRIP\",\r\n E[E.TRIANGLE_FAN = 6] = \"TRIANGLE_FAN\"\r\n }(Ba || (Ee = Ba = {},\r\n Ee)),\r\n function(E) {\r\n E[E.RGBA = 6408] = \"RGBA\",\r\n E[E.RGB = 6407] = \"RGB\",\r\n E[E.ALPHA = 6406] = \"ALPHA\",\r\n E[E.LUMINANCE = 6409] = \"LUMINANCE\",\r\n E[E.LUMINANCE_ALPHA = 6410] = \"LUMINANCE_ALPHA\",\r\n E[E.DEPTH_COMPONENT = 6402] = \"DEPTH_COMPONENT\",\r\n E[E.DEPTH_STENCIL = 34041] = \"DEPTH_STENCIL\"\r\n }(kb || (Ge = kb = {},\r\n Ge)),\r\n function(E) {\r\n E[E.TEXTURE_2D = 3553] = \"TEXTURE_2D\",\r\n E[E.TEXTURE_CUBE_MAP = 34067] = \"TEXTURE_CUBE_MAP\",\r\n E[E.TEXTURE_2D_ARRAY = 35866] = \"TEXTURE_2D_ARRAY\",\r\n E[E.TEXTURE_CUBE_MAP_POSITIVE_X = 34069] = \"TEXTURE_CUBE_MAP_POSITIVE_X\",\r\n E[E.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070] = \"TEXTURE_CUBE_MAP_NEGATIVE_X\",\r\n E[E.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071] = \"TEXTURE_CUBE_MAP_POSITIVE_Y\",\r\n E[E.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072] = \"TEXTURE_CUBE_MAP_NEGATIVE_Y\",\r\n E[E.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073] = \"TEXTURE_CUBE_MAP_POSITIVE_Z\",\r\n E[E.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074] = \"TEXTURE_CUBE_MAP_NEGATIVE_Z\"\r\n }(Sa || (Oe = Sa = {},\r\n Oe)),\r\n function(E) {\r\n E[E.UNSIGNED_BYTE = 5121] = \"UNSIGNED_BYTE\",\r\n E[E.UNSIGNED_SHORT = 5123] = \"UNSIGNED_SHORT\",\r\n E[E.UNSIGNED_SHORT_5_6_5 = 33635] = \"UNSIGNED_SHORT_5_6_5\",\r\n E[E.UNSIGNED_SHORT_4_4_4_4 = 32819] = \"UNSIGNED_SHORT_4_4_4_4\",\r\n E[E.UNSIGNED_SHORT_5_5_5_1 = 32820] = \"UNSIGNED_SHORT_5_5_5_1\",\r\n E[E.FLOAT = 5126] = \"FLOAT\",\r\n E[E.HALF_FLOAT = 36193] = \"HALF_FLOAT\"\r\n }(ua || (Pe = ua = {},\r\n Pe)),\r\n function(E) {\r\n E[E.NEAREST = 0] = \"NEAREST\",\r\n E[E.LINEAR = 1] = \"LINEAR\"\r\n }(Ca || (Ne = Ca = {},\r\n Ne)),\r\n function(E) {\r\n E[E.CLAMP = 33071] = \"CLAMP\",\r\n E[E.REPEAT = 10497] = \"REPEAT\",\r\n E[E.MIRRORED_REPEAT = 33648] = \"MIRRORED_REPEAT\"\r\n }(Rb || (Qe = Rb = {},\r\n Qe)),\r\n function(E) {\r\n E[E.OFF = 0] = \"OFF\",\r\n E[E.POW2 = 1] = \"POW2\",\r\n E[E.ON = 2] = \"ON\",\r\n E[E.ON_MANUAL = 3] = \"ON_MANUAL\"\r\n }($a || (Je = $a = {},\r\n Je)),\r\n function(E) {\r\n E[E.NPM = 0] = \"NPM\",\r\n E[E.UNPACK = 1] = \"UNPACK\",\r\n E[E.PMA = 2] = \"PMA\",\r\n E[E.NO_PREMULTIPLIED_ALPHA = 0] = \"NO_PREMULTIPLIED_ALPHA\",\r\n E[E.PREMULTIPLY_ON_UPLOAD = 1] = \"PREMULTIPLY_ON_UPLOAD\",\r\n E[E.PREMULTIPLY_ALPHA = 2] = \"PREMULTIPLY_ALPHA\"\r\n }(Ia || (Ae = Ia = {},\r\n Ae)),\r\n function(E) {\r\n E[E.NO = 0] = \"NO\",\r\n E[E.YES = 1] = \"YES\",\r\n E[E.AUTO = 2] = \"AUTO\",\r\n E[E.BLEND = 0] = \"BLEND\",\r\n E[E.CLEAR = 1] = \"CLEAR\",\r\n E[E.BLIT = 2] = \"BLIT\"\r\n }(Ja || (De = Ja = {},\r\n De)),\r\n function(E) {\r\n E[E.AUTO = 0] = \"AUTO\",\r\n E[E.MANUAL = 1] = \"MANUAL\"\r\n }(Tc || (He = Tc = {},\r\n He)),\r\n function(E) {\r\n E.LOW = \"lowp\",\r\n E.MEDIUM = \"mediump\",\r\n E.HIGH = \"highp\"\r\n }(xa || (Le = xa = {},\r\n Le)),\r\n function(E) {\r\n E[E.NONE = 0] = \"NONE\",\r\n E[E.SCISSOR = 1] = \"SCISSOR\",\r\n E[E.STENCIL = 2] = \"STENCIL\",\r\n E[E.SPRITE = 3] = \"SPRITE\"\r\n }(qa || (Ie = qa = {},\r\n Ie)),\r\n function(E) {\r\n E[E.NONE = 0] = \"NONE\",\r\n E[E.LOW = 2] = \"LOW\",\r\n E[E.MEDIUM = 4] = \"MEDIUM\",\r\n E[E.HIGH = 8] = \"HIGH\"\r\n }(_a || (Ke = _a = {},\r\n Ke));\r\n var Re = {}\r\n , Se = Object.prototype.hasOwnProperty\r\n , na = \"~\";\r\n function ab() {}\r\n function Te(e, t, r) {\r\n this.fn = e,\r\n this.context = t,\r\n this.once = r || !1\r\n }\r\n function Uc(e, t, r, n, $) {\r\n if (\"function\" != typeof r)\r\n throw new TypeError(\"The listener must be a function\");\r\n var v = new Te(r,n || e,$)\r\n , a = na ? na + t : t;\r\n return e._events[a] ? e._events[a].fn ? e._events[a] = [e._events[a], v] : e._events[a].push(v) : (e._events[a] = v,\r\n e._eventsCount++),\r\n e\r\n }\r\n function lb(e, t) {\r\n 0 == --e._eventsCount ? e._events = new ab : delete e._events[t]\r\n }\r\n function ja() {\r\n this._events = new ab,\r\n this._eventsCount = 0\r\n }\r\n Object.create && (ab.prototype = Object.create(null),\r\n new ab().__proto__ || (na = !1)),\r\n ja.prototype.eventNames = function() {\r\n var e, t, r = [];\r\n if (0 === this._eventsCount)\r\n return r;\r\n for (t in e = this._events)\r\n Se.call(e, t) && r.push(na ? t.slice(1) : t);\r\n return Object.getOwnPropertySymbols ? r.concat(Object.getOwnPropertySymbols(e)) : r\r\n }\r\n ,\r\n ja.prototype.listeners = function(e) {\r\n var t = na ? na + e : e\r\n , r = this._events[t];\r\n if (!r)\r\n return [];\r\n if (r.fn)\r\n return [r.fn];\r\n for (var n = 0, $ = r.length, v = new Array($); n < $; n++)\r\n v[n] = r[n].fn;\r\n return v\r\n }\r\n ,\r\n ja.prototype.listenerCount = function(e) {\r\n var t = na ? na + e : e\r\n , r = this._events[t];\r\n return r ? r.fn ? 1 : r.length : 0\r\n }\r\n ,\r\n ja.prototype.emit = function(e, t, r, n, $, v) {\r\n var a = na ? na + e : e;\r\n if (!this._events[a])\r\n return !1;\r\n var i, J, l = this._events[a], s = arguments.length;\r\n if (l.fn) {\r\n switch (l.once && this.removeListener(e, l.fn, void 0, !0),\r\n s) {\r\n case 1:\r\n return l.fn.call(l.context),\r\n !0;\r\n case 2:\r\n return l.fn.call(l.context, t),\r\n !0;\r\n case 3:\r\n return l.fn.call(l.context, t, r),\r\n !0;\r\n case 4:\r\n return l.fn.call(l.context, t, r, n),\r\n !0;\r\n case 5:\r\n return l.fn.call(l.context, t, r, n, $),\r\n !0;\r\n case 6:\r\n return l.fn.call(l.context, t, r, n, $, v),\r\n !0;\r\n }\r\n for (J = 1,\r\n i = new Array(s - 1); J < s; J++)\r\n i[J - 1] = arguments[J];\r\n l.fn.apply(l.context, i)\r\n } else {\r\n var o, f = l.length;\r\n for (J = 0; J < f; J++)\r\n switch (l[J].once && this.removeListener(e, l[J].fn, void 0, !0),\r\n s) {\r\n case 1:\r\n l[J].fn.call(l[J].context);\r\n break;\r\n case 2:\r\n l[J].fn.call(l[J].context, t);\r\n break;\r\n case 3:\r\n l[J].fn.call(l[J].context, t, r);\r\n break;\r\n case 4:\r\n l[J].fn.call(l[J].context, t, r, n);\r\n break;\r\n default:\r\n if (!i)\r\n for (o = 1,\r\n i = new Array(s - 1); o < s; o++)\r\n i[o - 1] = arguments[o];\r\n l[J].fn.apply(l[J].context, i);\r\n }\r\n }\r\n return !0\r\n }\r\n ,\r\n ja.prototype.on = function(e, t, r) {\r\n return Uc(this, e, t, r, !1)\r\n }\r\n ,\r\n ja.prototype.once = function(e, t, r) {\r\n return Uc(this, e, t, r, !0)\r\n }\r\n ,\r\n ja.prototype.removeListener = function(e, t, r, n) {\r\n var $ = na ? na + e : e;\r\n if (!this._events[$])\r\n return this;\r\n if (!t)\r\n return lb(this, $),\r\n this;\r\n var v = this._events[$];\r\n if (v.fn)\r\n v.fn !== t || n && !v.once || r && v.context !== r || lb(this, $);\r\n else {\r\n for (var a = 0, i = [], J = v.length; a < J; a++)\r\n (v[a].fn !== t || n && !v[a].once || r && v[a].context !== r) && i.push(v[a]);\r\n i.length ? this._events[$] = 1 === i.length ? i[0] : i : lb(this, $)\r\n }\r\n return this\r\n }\r\n ,\r\n ja.prototype.removeAllListeners = function(e) {\r\n var t;\r\n return e ? (t = na ? na + e : e,\r\n this._events[t] && lb(this, t)) : (this._events = new ab,\r\n this._eventsCount = 0),\r\n this\r\n }\r\n ,\r\n ja.prototype.off = ja.prototype.removeListener,\r\n ja.prototype.addListener = ja.prototype.on,\r\n ja.prefixed = na,\r\n ja.EventEmitter = ja,\r\n Re = ja;\r\n var Ue = {};\r\n function mb(v, r, e) {\r\n e = e || 2;\r\n var $, n, t, a, i, h, x, o = r && r.length, w = o ? r[0] * e : v.length, l = Vc(v, 0, w, e, !0), u = [];\r\n if (!l || l.next === l.prev)\r\n return u;\r\n if (o && (l = Ze(v, r, l, e)),\r\n v.length > 80 * e) {\r\n $ = t = v[0],\r\n n = a = v[1];\r\n for (var s = e; s < w; s += e)\r\n (i = v[s]) < $ && ($ = i),\r\n (h = v[s + 1]) < n && (n = h),\r\n i > t && (t = i),\r\n h > a && (a = h);\r\n x = 0 !== (x = Math.max(t - $, a - n)) ? 1 / x : 0\r\n }\r\n return bb(l, u, e, $, n, x),\r\n u\r\n }\r\n function Vc(v, r, e, $, n) {\r\n var t, a;\r\n if (n === Ub(v, r, e, $) > 0)\r\n for (t = r; t < e; t += $)\r\n a = Yc(t, v[t], v[t + 1], a);\r\n else\r\n for (t = e - $; t >= r; t -= $)\r\n a = Yc(t, v[t], v[t + 1], a);\r\n return a && nb(a, a.next) && (db(a),\r\n a = a.next),\r\n a\r\n }\r\n function Da(v, r) {\r\n if (!v)\r\n return v;\r\n r || (r = v);\r\n var e, $ = v;\r\n do {\r\n if (e = !1,\r\n $.steiner || !nb($, $.next) && 0 !== ca($.prev, $, $.next))\r\n $ = $.next;\r\n else {\r\n if (db($),\r\n ($ = r = $.prev) === $.next)\r\n break;\r\n e = !0\r\n }\r\n } while (e || $ !== r);\r\n return r\r\n }\r\n function bb(v, r, e, $, n, t, a) {\r\n if (v) {\r\n !a && t && cf(v, $, n, t);\r\n for (var i, h, x = v; v.prev !== v.next; )\r\n if (i = v.prev,\r\n h = v.next,\r\n t ? We(v, $, n, t) : Ve(v))\r\n r.push(i.i / e),\r\n r.push(v.i / e),\r\n r.push(h.i / e),\r\n db(v),\r\n v = h.next,\r\n x = h.next;\r\n else if ((v = h) === x) {\r\n a ? 1 === a ? bb(v = Xe(Da(v), r, e), r, e, $, n, t, 2) : 2 === a && Ye(v, r, e, $, n, t) : bb(Da(v), r, e, $, n, t, 1);\r\n break\r\n }\r\n }\r\n }\r\n function Ve(v) {\r\n var r = v.prev\r\n , e = v\r\n , $ = v.next;\r\n if (ca(r, e, $) >= 0)\r\n return !1;\r\n for (var n = v.next.next; n !== v.prev; ) {\r\n if (Ta(r.x, r.y, e.x, e.y, $.x, $.y, n.x, n.y) && ca(n.prev, n, n.next) >= 0)\r\n return !1;\r\n n = n.next\r\n }\r\n return !0\r\n }\r\n function We(v, r, e, $) {\r\n var n = v.prev\r\n , t = v\r\n , a = v.next;\r\n if (ca(n, t, a) >= 0)\r\n return !1;\r\n for (var i = n.x < t.x ? n.x < a.x ? n.x : a.x : t.x < a.x ? t.x : a.x, h = n.y < t.y ? n.y < a.y ? n.y : a.y : t.y < a.y ? t.y : a.y, x = n.x > t.x ? n.x > a.x ? n.x : a.x : t.x > a.x ? t.x : a.x, o = n.y > t.y ? n.y > a.y ? n.y : a.y : t.y > a.y ? t.y : a.y, w = Sb(i, h, r, e, $), l = Sb(x, o, r, e, $), u = v.prevZ, s = v.nextZ; u && u.z >= w && s && s.z <= l; ) {\r\n if (u !== v.prev && u !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, u.x, u.y) && ca(u.prev, u, u.next) >= 0)\r\n return !1;\r\n if (u = u.prevZ,\r\n s !== v.prev && s !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, s.x, s.y) && ca(s.prev, s, s.next) >= 0)\r\n return !1;\r\n s = s.nextZ\r\n }\r\n for (; u && u.z >= w; ) {\r\n if (u !== v.prev && u !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, u.x, u.y) && ca(u.prev, u, u.next) >= 0)\r\n return !1;\r\n u = u.prevZ\r\n }\r\n for (; s && s.z <= l; ) {\r\n if (s !== v.prev && s !== v.next && Ta(n.x, n.y, t.x, t.y, a.x, a.y, s.x, s.y) && ca(s.prev, s, s.next) >= 0)\r\n return !1;\r\n s = s.nextZ\r\n }\r\n return !0\r\n }\r\n function Xe(v, r, e) {\r\n var $ = v;\r\n do {\r\n var n = $.prev\r\n , t = $.next.next;\r\n !nb(n, t) && Wc(n, $, $.next, t) && cb(n, t) && cb(t, n) && (r.push(n.i / e),\r\n r.push($.i / e),\r\n r.push(t.i / e),\r\n db($),\r\n db($.next),\r\n $ = v = t),\r\n $ = $.next\r\n } while ($ !== v);\r\n return Da($)\r\n }\r\n function Ye(v, r, e, $, n, t) {\r\n var a = v;\r\n do {\r\n for (var i = a.next.next; i !== a.prev; ) {\r\n if (a.i !== i.i && ff(a, i)) {\r\n var h = Xc(a, i);\r\n return a = Da(a, a.next),\r\n h = Da(h, h.next),\r\n bb(a, r, e, $, n, t),\r\n void bb(h, r, e, $, n, t)\r\n }\r\n i = i.next\r\n }\r\n a = a.next\r\n } while (a !== v)\r\n }\r\n function Ze(v, r, e, $) {\r\n var n, t, a, i = [];\r\n for (n = 0,\r\n t = r.length; n < t; n++)\r\n (a = Vc(v, r[n] * $, n < t - 1 ? r[n + 1] * $ : v.length, $, !1)) === a.next && (a.steiner = !0),\r\n i.push(ef(a));\r\n for (i.sort($e),\r\n n = 0; n < i.length; n++)\r\n _e(i[n], e),\r\n e = Da(e, e.next);\r\n return e\r\n }\r\n function $e(v, r) {\r\n return v.x - r.x\r\n }\r\n function _e(v, r) {\r\n if (r = af(v, r)) {\r\n var e = Xc(r, v);\r\n Da(r, r.next),\r\n Da(e, e.next)\r\n }\r\n }\r\n function af(v, r) {\r\n var e, $ = r, n = v.x, t = v.y, a = -1 / 0;\r\n do {\r\n if (t <= $.y && t >= $.next.y && $.next.y !== $.y) {\r\n var i = $.x + (t - $.y) * ($.next.x - $.x) / ($.next.y - $.y);\r\n if (i <= n && i > a) {\r\n if (a = i,\r\n i === n) {\r\n if (t === $.y)\r\n return $;\r\n if (t === $.next.y)\r\n return $.next\r\n }\r\n e = $.x < $.next.x ? $ : $.next\r\n }\r\n }\r\n $ = $.next\r\n } while ($ !== r);\r\n if (!e)\r\n return null;\r\n if (n === a)\r\n return e;\r\n var h, x = e, o = e.x, w = e.y, l = 1 / 0;\r\n $ = e;\r\n do {\r\n n >= $.x && $.x >= o && n !== $.x && Ta(t < w ? n : a, t, o, w, t < w ? a : n, t, $.x, $.y) && (h = Math.abs(t - $.y) / (n - $.x),\r\n cb($, v) && (h < l || h === l && ($.x > e.x || $.x === e.x && bf(e, $))) && (e = $,\r\n l = h)),\r\n $ = $.next\r\n } while ($ !== x);\r\n return e\r\n }\r\n function bf(v, r) {\r\n return ca(v.prev, v, r.prev) < 0 && ca(r.next, v, v.next) < 0\r\n }\r\n function cf(v, r, e, $) {\r\n var n = v;\r\n do {\r\n null === n.z && (n.z = Sb(n.x, n.y, r, e, $)),\r\n n.prevZ = n.prev,\r\n n.nextZ = n.next,\r\n n = n.next\r\n } while (n !== v);\r\n n.prevZ.nextZ = null,\r\n n.prevZ = null,\r\n df(n)\r\n }\r\n function df(v) {\r\n var r, e, $, n, t, a, i, h, x = 1;\r\n do {\r\n for (e = v,\r\n v = null,\r\n t = null,\r\n a = 0; e; ) {\r\n for (a++,\r\n $ = e,\r\n i = 0,\r\n r = 0; r < x && (i++,\r\n $ = $.nextZ); r++)\r\n ;\r\n for (h = x; i > 0 || h > 0 && $; )\r\n 0 !== i && (0 === h || !$ || e.z <= $.z) ? (n = e,\r\n e = e.nextZ,\r\n i--) : (n = $,\r\n $ = $.nextZ,\r\n h--),\r\n t ? t.nextZ = n : v = n,\r\n n.prevZ = t,\r\n t = n;\r\n e = $\r\n }\r\n t.nextZ = null,\r\n x *= 2\r\n } while (a > 1);\r\n return v\r\n }\r\n function Sb(v, r, e, $, n) {\r\n return (v = 1431655765 & ((v = 858993459 & ((v = 252645135 & ((v = 16711935 & ((v = 32767 * (v - e) * n) | v << 8)) | v << 4)) | v << 2)) | v << 1)) | (r = 1431655765 & ((r = 858993459 & ((r = 252645135 & ((r = 16711935 & ((r = 32767 * (r - $) * n) | r << 8)) | r << 4)) | r << 2)) | r << 1)) << 1\r\n }\r\n function ef(v) {\r\n var r = v\r\n , e = v;\r\n do {\r\n (r.x < e.x || r.x === e.x && r.y < e.y) && (e = r),\r\n r = r.next\r\n } while (r !== v);\r\n return e\r\n }\r\n function Ta(v, r, e, $, n, t, a, i) {\r\n return (n - a) * (r - i) - (v - a) * (t - i) >= 0 && (v - a) * ($ - i) - (e - a) * (r - i) >= 0 && (e - a) * (t - i) - (n - a) * ($ - i) >= 0\r\n }\r\n function ff(v, r) {\r\n return v.next.i !== r.i && v.prev.i !== r.i && !gf(v, r) && (cb(v, r) && cb(r, v) && hf(v, r) && (ca(v.prev, v, r.prev) || ca(v, r.prev, r)) || nb(v, r) && ca(v.prev, v, v.next) > 0 && ca(r.prev, r, r.next) > 0)\r\n }\r\n function ca(v, r, e) {\r\n return (r.y - v.y) * (e.x - r.x) - (r.x - v.x) * (e.y - r.y)\r\n }\r\n function nb(v, r) {\r\n return v.x === r.x && v.y === r.y\r\n }\r\n function Wc(v, r, e, $) {\r\n var n = pb(ca(v, r, e))\r\n , t = pb(ca(v, r, $))\r\n , a = pb(ca(e, $, v))\r\n , i = pb(ca(e, $, r));\r\n return n !== t && a !== i || !(0 !== n || !ob(v, e, r)) || !(0 !== t || !ob(v, $, r)) || !(0 !== a || !ob(e, v, $)) || !(0 !== i || !ob(e, r, $))\r\n }\r\n function ob(v, r, e) {\r\n return r.x <= Math.max(v.x, e.x) && r.x >= Math.min(v.x, e.x) && r.y <= Math.max(v.y, e.y) && r.y >= Math.min(v.y, e.y)\r\n }\r\n function pb(v) {\r\n return v > 0 ? 1 : v < 0 ? -1 : 0\r\n }\r\n function gf(v, r) {\r\n var e = v;\r\n do {\r\n if (e.i !== v.i && e.next.i !== v.i && e.i !== r.i && e.next.i !== r.i && Wc(e, e.next, v, r))\r\n return !0;\r\n e = e.next\r\n } while (e !== v);\r\n return !1\r\n }\r\n function cb(v, r) {\r\n return ca(v.prev, v, v.next) < 0 ? ca(v, r, v.next) >= 0 && ca(v, v.prev, r) >= 0 : ca(v, r, v.prev) < 0 || ca(v, v.next, r) < 0\r\n }\r\n function hf(v, r) {\r\n var e = v\r\n , $ = !1\r\n , n = (v.x + r.x) / 2\r\n , t = (v.y + r.y) / 2;\r\n do {\r\n e.y > t != e.next.y > t && e.next.y !== e.y && n < (e.next.x - e.x) * (t - e.y) / (e.next.y - e.y) + e.x && ($ = !$),\r\n e = e.next\r\n } while (e !== v);\r\n return $\r\n }\r\n function Xc(v, r) {\r\n var e = new Tb(v.i,v.x,v.y)\r\n , $ = new Tb(r.i,r.x,r.y)\r\n , n = v.next\r\n , t = r.prev;\r\n return v.next = r,\r\n r.prev = v,\r\n e.next = n,\r\n n.prev = e,\r\n $.next = e,\r\n e.prev = $,\r\n t.next = $,\r\n $.prev = t,\r\n $\r\n }\r\n function Yc(v, r, e, $) {\r\n var n = new Tb(v,r,e);\r\n return $ ? (n.next = $.next,\r\n n.prev = $,\r\n $.next.prev = n,\r\n $.next = n) : (n.prev = n,\r\n n.next = n),\r\n n\r\n }\r\n function db(v) {\r\n v.next.prev = v.prev,\r\n v.prev.next = v.next,\r\n v.prevZ && (v.prevZ.nextZ = v.nextZ),\r\n v.nextZ && (v.nextZ.prevZ = v.prevZ)\r\n }\r\n function Tb(v, r, e) {\r\n this.i = v,\r\n this.x = r,\r\n this.y = e,\r\n this.prev = null,\r\n this.next = null,\r\n this.z = null,\r\n this.prevZ = null,\r\n this.nextZ = null,\r\n this.steiner = !1\r\n }\r\n function Ub(v, r, e, $) {\r\n for (var n = 0, t = r, a = e - $; t < e; t += $)\r\n n += (v[a] - v[t]) * (v[t + 1] + v[a + 1]),\r\n a = t;\r\n return n\r\n }\r\n (Ue = mb).default = mb,\r\n mb.deviation = function(v, r, e, $) {\r\n var n = r && r.length\r\n , t = n ? r[0] * e : v.length\r\n , a = Math.abs(Ub(v, 0, t, e));\r\n if (n)\r\n for (var i = 0, h = r.length; i < h; i++) {\r\n var x = r[i] * e\r\n , o = i < h - 1 ? r[i + 1] * e : v.length;\r\n a -= Math.abs(Ub(v, x, o, e))\r\n }\r\n var w = 0;\r\n for (i = 0; i < $.length; i += 3) {\r\n var l = $[i] * e\r\n , u = $[i + 1] * e\r\n , s = $[i + 2] * e;\r\n w += Math.abs((v[l] - v[s]) * (v[u + 1] - v[l + 1]) - (v[l] - v[u]) * (v[s + 1] - v[l + 1]))\r\n }\r\n return 0 === a && 0 === w ? 0 : Math.abs((w - a) / a)\r\n }\r\n ,\r\n mb.flatten = function(v) {\r\n for (var r = v[0][0].length, e = {\r\n vertices: [],\r\n holes: [],\r\n dimensions: r\r\n }, $ = 0, n = 0; n < v.length; n++) {\r\n for (var t = 0; t < v[n].length; t++)\r\n for (var a = 0; a < r; a++)\r\n e.vertices.push(v[n][t][a]);\r\n n > 0 && ($ += v[n - 1].length,\r\n e.holes.push($))\r\n }\r\n return e\r\n }\r\n ;\r\n var jf = function() {\r\n var o = this\r\n , e = {\r\n exports: this\r\n };\r\n return function(n) {\r\n var r = \"object\" == typeof o && o && !o.nodeType && o\r\n , t = \"object\" == typeof e && e && !e.nodeType && e\r\n , i = \"object\" == typeof Hc && Hc;\r\n i.global !== i && i.window !== i && i.self !== i || (n = i);\r\n var u, f, c = 2147483647, l = 36, s = 1, a = 26, p = 38, h = 700, d = 72, v = 128, g = \"-\", w = /^xn--/, x = /[^\\x20-\\x7E]/, b = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, C = {\r\n overflow: \"Overflow: input needs wider integers to process\",\r\n \"not-basic\": \"Illegal input >= 0x80 (not a basic code point)\",\r\n \"invalid-input\": \"Invalid input\"\r\n }, y = l - s, j = Math.floor, A = String.fromCharCode;\r\n function $(o) {\r\n throw new RangeError(C[o])\r\n }\r\n function I(o, e) {\r\n for (var n = o.length, r = []; n--; )\r\n r[n] = e(o[n]);\r\n return r\r\n }\r\n function E(o, e) {\r\n var n = o.split(\"@\")\r\n , r = \"\";\r\n return n.length > 1 && (r = n[0] + \"@\",\r\n o = n[1]),\r\n r + I((o = o.replace(b, \".\")).split(\".\"), e).join(\".\")\r\n }\r\n function F(o) {\r\n for (var e, n, r = [], t = 0, i = o.length; t < i; )\r\n (e = o.charCodeAt(t++)) >= 55296 && e <= 56319 && t < i ? 56320 == (64512 & (n = o.charCodeAt(t++))) ? r.push(((1023 & e) << 10) + (1023 & n) + 65536) : (r.push(e),\r\n t--) : r.push(e);\r\n return r\r\n }\r\n function O(o) {\r\n return I(o, function(o) {\r\n var e = \"\";\r\n return o > 65535 && (e += A((o -= 65536) >>> 10 & 1023 | 55296),\r\n o = 56320 | 1023 & o),\r\n e += A(o)\r\n }).join(\"\")\r\n }\r\n function S(o, e) {\r\n return o + 22 + 75 * (o < 26) - ((0 != e) << 5)\r\n }\r\n function T(o, e, n) {\r\n var r = 0;\r\n for (o = n ? j(o / h) : o >> 1,\r\n o += j(o / e); o > y * a >> 1; r += l)\r\n o = j(o / y);\r\n return j(r + (y + 1) * o / (o + p))\r\n }\r\n function m(o) {\r\n var e, n, r, t, i, u, f, p, h, w, x, b = [], C = o.length, y = 0, A = v, I = d;\r\n for ((n = o.lastIndexOf(g)) < 0 && (n = 0),\r\n r = 0; r < n; ++r)\r\n o.charCodeAt(r) >= 128 && $(\"not-basic\"),\r\n b.push(o.charCodeAt(r));\r\n for (t = n > 0 ? n + 1 : 0; t < C; ) {\r\n for (i = y,\r\n u = 1,\r\n f = l; t >= C && $(\"invalid-input\"),\r\n ((p = (x = o.charCodeAt(t++)) - 48 < 10 ? x - 22 : x - 65 < 26 ? x - 65 : x - 97 < 26 ? x - 97 : l) >= l || p > j((c - y) / u)) && $(\"overflow\"),\r\n y += p * u,\r\n !(p < (h = f <= I ? s : f >= I + a ? a : f - I)); f += l)\r\n u > j(c / (w = l - h)) && $(\"overflow\"),\r\n u *= w;\r\n I = T(y - i, e = b.length + 1, 0 == i),\r\n j(y / e) > c - A && $(\"overflow\"),\r\n A += j(y / e),\r\n y %= e,\r\n b.splice(y++, 0, A)\r\n }\r\n return O(b)\r\n }\r\n function L(o) {\r\n var e, n, r, t, i, u, f, p, h, w, x, b, C, y, I, E = [];\r\n for (b = (o = F(o)).length,\r\n e = v,\r\n n = 0,\r\n i = d,\r\n u = 0; u < b; ++u)\r\n (x = o[u]) < 128 && E.push(A(x));\r\n for (r = t = E.length,\r\n t && E.push(g); r < b; ) {\r\n for (f = c,\r\n u = 0; u < b; ++u)\r\n (x = o[u]) >= e && x < f && (f = x);\r\n for (f - e > j((c - n) / (C = r + 1)) && $(\"overflow\"),\r\n n += (f - e) * C,\r\n e = f,\r\n u = 0; u < b; ++u)\r\n if ((x = o[u]) < e && ++n > c && $(\"overflow\"),\r\n x == e) {\r\n for (p = n,\r\n h = l; !(p < (w = h <= i ? s : h >= i + a ? a : h - i)); h += l)\r\n I = p - w,\r\n y = l - w,\r\n E.push(A(S(w + I % y, 0))),\r\n p = j(I / y);\r\n E.push(A(S(p, 0))),\r\n i = T(n, C, r == t),\r\n n = 0,\r\n ++r\r\n }\r\n ++n,\r\n ++e\r\n }\r\n return E.join(\"\")\r\n }\r\n if (u = {\r\n version: \"1.4.1\",\r\n ucs2: {\r\n decode: F,\r\n encode: O\r\n },\r\n decode: m,\r\n encode: L,\r\n toASCII: function(o) {\r\n return E(o, function(o) {\r\n return x.test(o) ? \"xn--\" + L(o) : o\r\n })\r\n },\r\n toUnicode: function(o) {\r\n return E(o, function(o) {\r\n return w.test(o) ? m(o.slice(4).toLowerCase()) : o\r\n })\r\n }\r\n },\r\n r && t) {\r\n if (e.exports == r)\r\n t.exports = u;\r\n else\r\n for (f in u)\r\n u.hasOwnProperty(f) && (r[f] = u[f]);\r\n } else\r\n n.punycode = u\r\n }(this),\r\n e.exports\r\n }\r\n .call({});\r\n var va = {};\r\n va = {\r\n isString: function(n) {\r\n return \"string\" == typeof n\r\n },\r\n isObject: function(n) {\r\n return \"object\" == typeof n && null !== n\r\n },\r\n isNull: function(n) {\r\n return null === n\r\n },\r\n isNullOrUndefined: function(n) {\r\n return null == n\r\n }\r\n };\r\n var kf, lf, mf = false;\r\n function nf(r, e) {\r\n return Object.prototype.hasOwnProperty.call(r, e)\r\n }\r\n function of() {\r\n if (mf)\r\n return;\r\n mf = true;\r\n kf = {};\r\n kf = function(r, e, t, a) {\r\n e = e || \"&\",\r\n t = t || \"=\";\r\n var n = {};\r\n if (\"string\" != typeof r || 0 === r.length)\r\n return n;\r\n var o = /\\+/g;\r\n r = r.split(e);\r\n var s = 1e3;\r\n a && \"number\" == typeof a.maxKeys && (s = a.maxKeys);\r\n var p = r.length;\r\n s > 0 && p > s && (p = s);\r\n for (var $ = 0; $ < p; ++$) {\r\n var y, v, c, i, u = r[$].replace(o, \"%20\"), f = u.indexOf(t);\r\n f >= 0 ? (y = u.substr(0, f),\r\n v = u.substr(f + 1)) : (y = u,\r\n v = \"\"),\r\n c = decodeURIComponent(y),\r\n i = decodeURIComponent(v),\r\n nf(n, c) ? lf(n[c]) ? n[c].push(i) : n[c] = [n[c], i] : n[c] = i\r\n }\r\n return n\r\n }\r\n ;\r\n lf = Array.isArray || function(r) {\r\n return \"[object Array]\" === Object.prototype.toString.call(r)\r\n }\r\n }\r\n var pf, eb, qf, rf, sf = false;\r\n function Zc(r, e) {\r\n if (r.map)\r\n return r.map(e);\r\n for (var t = [], n = 0; n < r.length; n++)\r\n t.push(e(r[n], n));\r\n return t\r\n }\r\n function tf() {\r\n if (sf)\r\n return;\r\n sf = true;\r\n pf = {};\r\n eb = function(r) {\r\n switch (typeof r) {\r\n case \"string\":\r\n return r;\r\n case \"boolean\":\r\n return r ? \"true\" : \"false\";\r\n case \"number\":\r\n return isFinite(r) ? r : \"\";\r\n default:\r\n return \"\";\r\n }\r\n }\r\n ;\r\n pf = function(r, e, t, n) {\r\n return e = e || \"&\",\r\n t = t || \"=\",\r\n null === r && (r = void 0),\r\n \"object\" == typeof r ? Zc(rf(r), function(n) {\r\n var i = encodeURIComponent(eb(n)) + t;\r\n return qf(r[n]) ? Zc(r[n], function(r) {\r\n return i + encodeURIComponent(eb(r))\r\n }).join(e) : i + encodeURIComponent(eb(r[n]))\r\n }).join(e) : n ? encodeURIComponent(eb(n)) + t + encodeURIComponent(eb(r)) : \"\"\r\n }\r\n ;\r\n qf = Array.isArray || function(r) {\r\n return \"[object Array]\" === Object.prototype.toString.call(r)\r\n }\r\n ;\r\n rf = Object.keys || function(r) {\r\n var e = [];\r\n for (var t in r)\r\n Object.prototype.hasOwnProperty.call(r, t) && e.push(t);\r\n return e\r\n }\r\n }\r\n var $c, uf, c = ($c = (of(),\r\n kf));\r\n var d = (uf = (tf(),\r\n pf));\r\n var vf = qb;\r\n var wf = Hf;\r\n var xf = Gf;\r\n function sa() {\r\n this.protocol = null,\r\n this.slashes = null,\r\n this.auth = null,\r\n this.host = null,\r\n this.port = null,\r\n this.hostname = null,\r\n this.hash = null,\r\n this.search = null,\r\n this.query = null,\r\n this.pathname = null,\r\n this.path = null,\r\n this.href = null\r\n }\r\n var yf = /^([a-z0-9.+-]+:)/i\r\n , zf = /:[0-9]*$/\r\n , Af = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/\r\n , Bf = [\"<\", \">\", \"\\\"\", \"`\", \" \", \"\\r\", \"\\n\", \"\\t\"]\r\n , Cf = [\"{\", \"}\", \"|\", \"\\\\\", \"^\", \"`\"].concat(Bf)\r\n , Vb = [\"'\"].concat(Cf)\r\n , _c = [\"%\", \"/\", \"?\", \";\", \"#\"].concat(Vb)\r\n , ad = [\"/\", \"?\", \"#\"]\r\n , Df = 255\r\n , bd = /^[+a-z0-9A-Z_-]{0,63}$/\r\n , Ef = /^([+a-z0-9A-Z_-]{0,63})(.*)$/\r\n , Ff = {\r\n javascript: !0,\r\n \"javascript:\": !0\r\n }\r\n , Wb = {\r\n javascript: !0,\r\n \"javascript:\": !0\r\n }\r\n , Ua = {\r\n http: !0,\r\n https: !0,\r\n ftp: !0,\r\n gopher: !0,\r\n file: !0,\r\n \"http:\": !0,\r\n \"https:\": !0,\r\n \"ftp:\": !0,\r\n \"gopher:\": !0,\r\n \"file:\": !0\r\n };\r\n function qb(t, h, r) {\r\n if (t && va.isObject(t) && t instanceof sa)\r\n return t;\r\n var s = new sa;\r\n return s.parse(t, h, r),\r\n s\r\n }\r\n function Gf(t) {\r\n return va.isString(t) && (t = qb(t)),\r\n t instanceof sa ? t.format() : sa.prototype.format.call(t)\r\n }\r\n function Hf(t, h) {\r\n return qb(t, !1, !0).resolve(h)\r\n }\r\n sa.prototype.parse = function(t, h, r) {\r\n if (!va.isString(t))\r\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof t);\r\n var s = t.indexOf(\"?\")\r\n , a = -1 !== s && s < t.indexOf(\"#\") ? \"?\" : \"#\"\r\n , e = t.split(a);\r\n e[0] = e[0].replace(/\\\\/g, \"/\");\r\n var o = t = e.join(a);\r\n if (o = o.trim(),\r\n !r && 1 === t.split(\"#\").length) {\r\n var $ = Af.exec(o);\r\n if ($)\r\n return this.path = o,\r\n this.href = o,\r\n this.pathname = $[1],\r\n $[2] ? (this.search = $[2],\r\n this.query = h ? $c(this.search.substr(1)) : this.search.substr(1)) : h && (this.search = \"\",\r\n this.query = {}),\r\n this\r\n }\r\n var n = yf.exec(o);\r\n if (n) {\r\n var i = (n = n[0]).toLowerCase();\r\n this.protocol = i,\r\n o = o.substr(n.length)\r\n }\r\n if (r || n || o.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\r\n var l = \"//\" === o.substr(0, 2);\r\n !l || n && Wb[n] || (o = o.substr(2),\r\n this.slashes = !0)\r\n }\r\n if (!Wb[n] && (l || n && !Ua[n])) {\r\n for (var p, u, c = -1, v = 0; v < ad.length; v++) {\r\n -1 !== (d = o.indexOf(ad[v])) && (-1 === c || d < c) && (c = d)\r\n }\r\n -1 !== (u = -1 === c ? o.lastIndexOf(\"@\") : o.lastIndexOf(\"@\", c)) && (p = o.slice(0, u),\r\n o = o.slice(u + 1),\r\n this.auth = decodeURIComponent(p)),\r\n c = -1;\r\n for (v = 0; v < _c.length; v++) {\r\n var d;\r\n -1 !== (d = o.indexOf(_c[v])) && (-1 === c || d < c) && (c = d)\r\n }\r\n -1 === c && (c = o.length),\r\n this.host = o.slice(0, c),\r\n o = o.slice(c),\r\n this.parseHost(),\r\n this.hostname = this.hostname || \"\";\r\n var f = \"[\" === this.hostname[0] && \"]\" === this.hostname[this.hostname.length - 1];\r\n if (!f)\r\n for (var m = this.hostname.split(/\\./), F = (v = 0,\r\n m.length); v < F; v++) {\r\n var Z = m[v];\r\n if (Z && !Z.match(bd)) {\r\n for (var g = \"\", y = 0, P = Z.length; y < P; y++)\r\n Z.charCodeAt(y) > 127 ? g += \"x\" : g += Z[y];\r\n if (!g.match(bd)) {\r\n var x = m.slice(0, v)\r\n , b = m.slice(v + 1)\r\n , q = Z.match(Ef);\r\n q && (x.push(q[1]),\r\n b.unshift(q[2])),\r\n b.length && (o = \"/\" + b.join(\".\") + o),\r\n this.hostname = x.join(\".\");\r\n break\r\n }\r\n }\r\n }\r\n this.hostname.length > Df ? this.hostname = \"\" : this.hostname = this.hostname.toLowerCase(),\r\n f || (this.hostname = jf.toASCII(this.hostname));\r\n var O = this.port ? \":\" + this.port : \"\"\r\n , j = this.hostname || \"\";\r\n this.host = j + O,\r\n this.href += this.host,\r\n f && (this.hostname = this.hostname.substr(1, this.hostname.length - 2),\r\n \"/\" !== o[0] && (o = \"/\" + o))\r\n }\r\n if (!Ff[i])\r\n for (v = 0,\r\n F = Vb.length; v < F; v++) {\r\n var U = Vb[v];\r\n if (-1 !== o.indexOf(U)) {\r\n var C = encodeURIComponent(U);\r\n C === U && (C = escape(U)),\r\n o = o.split(U).join(C)\r\n }\r\n }\r\n var A = o.indexOf(\"#\");\r\n -1 !== A && (this.hash = o.substr(A),\r\n o = o.slice(0, A));\r\n var w = o.indexOf(\"?\");\r\n if (-1 !== w ? (this.search = o.substr(w),\r\n this.query = o.substr(w + 1),\r\n h && (this.query = $c(this.query)),\r\n o = o.slice(0, w)) : h && (this.search = \"\",\r\n this.query = {}),\r\n o && (this.pathname = o),\r\n Ua[i] && this.hostname && !this.pathname && (this.pathname = \"/\"),\r\n this.pathname || this.search) {\r\n O = this.pathname || \"\";\r\n var E = this.search || \"\";\r\n this.path = O + E\r\n }\r\n return this.href = this.format(),\r\n this\r\n }\r\n ,\r\n sa.prototype.format = function() {\r\n var t = this.auth || \"\";\r\n t && (t = (t = encodeURIComponent(t)).replace(/%3A/i, \":\"),\r\n t += \"@\");\r\n var h = this.protocol || \"\"\r\n , r = this.pathname || \"\"\r\n , s = this.hash || \"\"\r\n , a = !1\r\n , e = \"\";\r\n this.host ? a = t + this.host : this.hostname && (a = t + (-1 === this.hostname.indexOf(\":\") ? this.hostname : \"[\" + this.hostname + \"]\"),\r\n this.port && (a += \":\" + this.port)),\r\n this.query && va.isObject(this.query) && Object.keys(this.query).length && (e = uf(this.query));\r\n var o = this.search || e && \"?\" + e || \"\";\r\n return h && \":\" !== h.substr(-1) && (h += \":\"),\r\n this.slashes || (!h || Ua[h]) && !1 !== a ? (a = \"//\" + (a || \"\"),\r\n r && \"/\" !== r.charAt(0) && (r = \"/\" + r)) : a || (a = \"\"),\r\n s && \"#\" !== s.charAt(0) && (s = \"#\" + s),\r\n o && \"?\" !== o.charAt(0) && (o = \"?\" + o),\r\n h + a + (r = r.replace(/[?#]/g, function(t) {\r\n return encodeURIComponent(t)\r\n })) + (o = o.replace(\"#\", \"%23\")) + s\r\n }\r\n ,\r\n sa.prototype.resolve = function(t) {\r\n return this.resolveObject(qb(t, !1, !0)).format()\r\n }\r\n ,\r\n sa.prototype.resolveObject = function(t) {\r\n if (va.isString(t)) {\r\n var h = new sa;\r\n h.parse(t, !1, !0),\r\n t = h\r\n }\r\n for (var r = new sa, s = Object.keys(this), a = 0; a < s.length; a++) {\r\n var e = s[a];\r\n r[e] = this[e]\r\n }\r\n if (r.hash = t.hash,\r\n \"\" === t.href)\r\n return r.href = r.format(),\r\n r;\r\n if (t.slashes && !t.protocol) {\r\n for (var o = Object.keys(t), $ = 0; $ < o.length; $++) {\r\n var n = o[$];\r\n \"protocol\" !== n && (r[n] = t[n])\r\n }\r\n return Ua[r.protocol] && r.hostname && !r.pathname && (r.path = r.pathname = \"/\"),\r\n r.href = r.format(),\r\n r\r\n }\r\n if (t.protocol && t.protocol !== r.protocol) {\r\n if (!Ua[t.protocol]) {\r\n for (var i = Object.keys(t), l = 0; l < i.length; l++) {\r\n var p = i[l];\r\n r[p] = t[p]\r\n }\r\n return r.href = r.format(),\r\n r\r\n }\r\n if (r.protocol = t.protocol,\r\n t.host || Wb[t.protocol])\r\n r.pathname = t.pathname;\r\n else {\r\n for (var u = (t.pathname || \"\").split(\"/\"); u.length && !(t.host = u.shift()); )\r\n ;\r\n t.host || (t.host = \"\"),\r\n t.hostname || (t.hostname = \"\"),\r\n \"\" !== u[0] && u.unshift(\"\"),\r\n u.length < 2 && u.unshift(\"\"),\r\n r.pathname = u.join(\"/\")\r\n }\r\n if (r.search = t.search,\r\n r.query = t.query,\r\n r.host = t.host || \"\",\r\n r.auth = t.auth,\r\n r.hostname = t.hostname || t.host,\r\n r.port = t.port,\r\n r.pathname || r.search) {\r\n var c = r.pathname || \"\"\r\n , v = r.search || \"\";\r\n r.path = c + v\r\n }\r\n return r.slashes = r.slashes || t.slashes,\r\n r.href = r.format(),\r\n r\r\n }\r\n var d = r.pathname && \"/\" === r.pathname.charAt(0)\r\n , f = t.host || t.pathname && \"/\" === t.pathname.charAt(0)\r\n , m = f || d || r.host && t.pathname\r\n , F = m\r\n , Z = r.pathname && r.pathname.split(\"/\") || []\r\n , g = (u = t.pathname && t.pathname.split(\"/\") || [],\r\n r.protocol && !Ua[r.protocol]);\r\n if (g && (r.hostname = \"\",\r\n r.port = null,\r\n r.host && (\"\" === Z[0] ? Z[0] = r.host : Z.unshift(r.host)),\r\n r.host = \"\",\r\n t.protocol && (t.hostname = null,\r\n t.port = null,\r\n t.host && (\"\" === u[0] ? u[0] = t.host : u.unshift(t.host)),\r\n t.host = null),\r\n m = m && (\"\" === u[0] || \"\" === Z[0])),\r\n f)\r\n r.host = t.host || \"\" === t.host ? t.host : r.host,\r\n r.hostname = t.hostname || \"\" === t.hostname ? t.hostname : r.hostname,\r\n r.search = t.search,\r\n r.query = t.query,\r\n Z = u;\r\n else if (u.length)\r\n Z || (Z = []),\r\n Z.pop(),\r\n Z = Z.concat(u),\r\n r.search = t.search,\r\n r.query = t.query;\r\n else if (!va.isNullOrUndefined(t.search)) {\r\n if (g)\r\n r.hostname = r.host = Z.shift(),\r\n (q = !!(r.host && r.host.indexOf(\"@\") > 0) && r.host.split(\"@\")) && (r.auth = q.shift(),\r\n r.host = r.hostname = q.shift());\r\n return r.search = t.search,\r\n r.query = t.query,\r\n va.isNull(r.pathname) && va.isNull(r.search) || (r.path = (r.pathname ? r.pathname : \"\") + (r.search ? r.search : \"\")),\r\n r.href = r.format(),\r\n r\r\n }\r\n if (!Z.length)\r\n return r.pathname = null,\r\n r.search ? r.path = \"/\" + r.search : r.path = null,\r\n r.href = r.format(),\r\n r;\r\n for (var y = Z.slice(-1)[0], P = (r.host || t.host || Z.length > 1) && (\".\" === y || \"..\" === y) || \"\" === y, x = 0, b = Z.length; b >= 0; b--)\r\n \".\" === (y = Z[b]) ? Z.splice(b, 1) : \"..\" === y ? (Z.splice(b, 1),\r\n x++) : x && (Z.splice(b, 1),\r\n x--);\r\n if (!m && !F)\r\n for (; x--; x)\r\n Z.unshift(\"..\");\r\n !m || \"\" === Z[0] || Z[0] && \"/\" === Z[0].charAt(0) || Z.unshift(\"\"),\r\n P && \"/\" !== Z.join(\"/\").substr(-1) && Z.push(\"\");\r\n var q, O = \"\" === Z[0] || Z[0] && \"/\" === Z[0].charAt(0);\r\n g && (r.hostname = r.host = O ? \"\" : Z.length ? Z.shift() : \"\",\r\n (q = !!(r.host && r.host.indexOf(\"@\") > 0) && r.host.split(\"@\")) && (r.auth = q.shift(),\r\n r.host = r.hostname = q.shift()));\r\n return (m = m || r.host && Z.length) && !O && Z.unshift(\"\"),\r\n Z.length ? r.pathname = Z.join(\"/\") : (r.pathname = null,\r\n r.path = null),\r\n va.isNull(r.pathname) && va.isNull(r.search) || (r.path = (r.pathname ? r.pathname : \"\") + (r.search ? r.search : \"\")),\r\n r.auth = t.auth || r.auth,\r\n r.slashes = r.slashes || t.slashes,\r\n r.href = r.format(),\r\n r\r\n }\r\n ,\r\n sa.prototype.parseHost = function() {\r\n var t = this.host\r\n , h = zf.exec(t);\r\n h && (\":\" !== (h = h[0]) && (this.port = h.substr(1)),\r\n t = t.substr(0, t.length - h.length)),\r\n t && (this.hostname = t)\r\n }\r\n ;\r\n var rb = Kb(Re);\r\n var cd = Kb(Ue);\r\n var If = {\r\n parse: vf,\r\n format: xf,\r\n resolve: wf\r\n };\r\n aa.RETINA_PREFIX = /@([0-9\\.]+)x/,\r\n aa.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT = !1;\r\n var dd, Jf = !1, ed = \"6.0.1\";\r\n function Kf($) {\r\n var e;\r\n if (!Jf) {\r\n if (navigator.userAgent.toLowerCase().indexOf(\"chrome\") > -1) {\r\n var r = [\"\\n %c %c %c PixiJS \" + ed + \" - \\u2730 \" + $ + \" \\u2730 %c %c http://www.pixijs.com/ %c %c \\u2665%c\\u2665%c\\u2665 \\n\\n\", \"background: #ff66a5; padding:5px 0;\", \"background: #ff66a5; padding:5px 0;\", \"color: #ff66a5; background: #030307; padding:5px 0;\", \"background: #ff66a5; padding:5px 0;\", \"background: #ffc3dc; padding:5px 0;\", \"background: #ff66a5; padding:5px 0;\", \"color: #ff2424; background: #fff; padding:5px 0;\", \"color: #ff2424; background: #fff; padding:5px 0;\", \"color: #ff2424; background: #fff; padding:5px 0;\"];\r\n (e = self.console).log.apply(e, r)\r\n } else\r\n self.console && self.console.log(\"PixiJS \" + ed + \" - \" + $ + \" - http://www.pixijs.com/\");\r\n Jf = !0\r\n }\r\n }\r\n function Lf() {\r\n return void 0 === dd && (dd = function() {\r\n var $ = {\r\n stencil: !0,\r\n failIfMajorPerformanceCaveat: aa.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT\r\n };\r\n try {\r\n if (!self.WebGLRenderingContext)\r\n return !1;\r\n var e = document.createElement(\"canvas\")\r\n , r = e.getContext(\"webgl\", $) || e.getContext(\"experimental-webgl\", $)\r\n , a = !(!r || !r.getContextAttributes().stencil);\r\n if (r) {\r\n var v = r.getExtension(\"WEBGL_lose_context\");\r\n v && v.loseContext()\r\n }\r\n return r = null,\r\n a\r\n } catch (g) {\r\n return !1\r\n }\r\n }()),\r\n dd\r\n }\r\n function Xb($, e) {\r\n return void 0 === e && (e = []),\r\n e[0] = ($ >> 16 & 255) / 255,\r\n e[1] = ($ >> 8 & 255) / 255,\r\n e[2] = (255 & $) / 255,\r\n e\r\n }\r\n function Mf($) {\r\n var e = $.toString(16);\r\n return \"#\" + (e = \"000000\".substr(0, 6 - e.length) + e)\r\n }\r\n function Nf() {\r\n for (var $ = [], e = [], r = 0; r < 32; r++)\r\n $[r] = r,\r\n e[r] = r;\r\n $[K.NORMAL_NPM] = K.NORMAL,\r\n $[K.ADD_NPM] = K.ADD,\r\n $[K.SCREEN_NPM] = K.SCREEN,\r\n e[K.NORMAL] = K.NORMAL_NPM,\r\n e[K.ADD] = K.ADD_NPM,\r\n e[K.SCREEN] = K.SCREEN_NPM;\r\n var a = [];\r\n return a.push(e),\r\n a.push($),\r\n a\r\n }\r\n var Of = Nf();\r\n function fd($, e) {\r\n if (1 === e)\r\n return (255 * e << 24) + $;\r\n if (0 === e)\r\n return 0;\r\n var r = $ >> 16 & 255\r\n , a = $ >> 8 & 255\r\n , v = 255 & $;\r\n return (255 * e << 24) + ((r = r * e + .5 | 0) << 16) + ((a = a * e + .5 | 0) << 8) + (v = v * e + .5 | 0)\r\n }\r\n var e = {\r\n Float32Array: Float32Array,\r\n Uint32Array: Uint32Array,\r\n Int32Array: Int32Array,\r\n Uint8Array: Uint8Array\r\n };\r\n function sb($) {\r\n return $ += 0 === $ ? 1 : 0,\r\n --$,\r\n $ |= $ >>> 1,\r\n $ |= $ >>> 2,\r\n $ |= $ >>> 4,\r\n $ |= $ >>> 8,\r\n ($ |= $ >>> 16) + 1\r\n }\r\n function gd($) {\r\n return !($ & $ - 1 || !$)\r\n }\r\n function hd($) {\r\n var e = ($ > 65535 ? 1 : 0) << 4\r\n , r = (($ >>>= e) > 255 ? 1 : 0) << 3;\r\n return e |= r,\r\n e |= r = (($ >>>= r) > 15 ? 1 : 0) << 2,\r\n (e |= r = (($ >>>= r) > 3 ? 1 : 0) << 1) | ($ >>>= r) >> 1\r\n }\r\n function tb($, e, r) {\r\n var a, v = $.length;\r\n if (!(e >= v || 0 === r)) {\r\n var g = v - (r = e + r > v ? v - e : r);\r\n for (a = e; a < g; ++a)\r\n $[a] = $[a + r];\r\n $.length = g\r\n }\r\n }\r\n var Pf = 0;\r\n function ub() {\r\n return ++Pf\r\n }\r\n var id = {};\r\n function Va($, e, r) {\r\n if (void 0 === r && (r = 3),\r\n !id[e]) {\r\n var a = new Error().stack;\r\n void 0 === a ? console.warn(\"PixiJS Deprecation Warning: \", e + \"\\nDeprecated since v\" + $) : (a = a.split(\"\\n\").splice(r).join(\"\\n\"),\r\n console.groupCollapsed ? (console.groupCollapsed(\"%cPixiJS Deprecation Warning: %c%s\", \"color:#614108;background:#fffbe6\", \"font-weight:normal;color:#614108;background:#fffbe6\", e + \"\\nDeprecated since v\" + $),\r\n console.warn(a),\r\n console.groupEnd()) : (console.warn(\"PixiJS Deprecation Warning: \", e + \"\\nDeprecated since v\" + $),\r\n console.warn(a))),\r\n id[e] = !0\r\n }\r\n }\r\n var jd = {}\r\n , ya = Object.create(null)\r\n , Ka = Object.create(null);\r\n var f = function() {\r\n function $($, e, r) {\r\n this.canvas = document.createElement(\"canvas\"),\r\n this.context = this.canvas.getContext(\"2d\"),\r\n this.resolution = r || aa.RESOLUTION,\r\n this.resize($, e)\r\n }\r\n return $.prototype.clear = function() {\r\n this.context.setTransform(1, 0, 0, 1, 0, 0),\r\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)\r\n }\r\n ,\r\n $.prototype.resize = function($, e) {\r\n this.canvas.width = $ * this.resolution,\r\n this.canvas.height = e * this.resolution\r\n }\r\n ,\r\n $.prototype.destroy = function() {\r\n this.context = null,\r\n this.canvas = null\r\n }\r\n ,\r\n Object.defineProperty($.prototype, \"width\", {\r\n get: function() {\r\n return this.canvas.width\r\n },\r\n set: function($) {\r\n this.canvas.width = $\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty($.prototype, \"height\", {\r\n get: function() {\r\n return this.canvas.height\r\n },\r\n set: function($) {\r\n this.canvas.height = $\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n $\r\n }();\r\n var Yb;\r\n function Qf($, e) {\r\n if (void 0 === e && (e = self.location),\r\n 0 === $.indexOf(\"data:\"))\r\n return \"\";\r\n e = e || self.location,\r\n Yb || (Yb = document.createElement(\"a\")),\r\n Yb.href = $;\r\n var r = If.parse(Yb.href)\r\n , a = !r.port && \"\" === e.port || r.port === e.port;\r\n return r.hostname === e.hostname && a && r.protocol === e.protocol ? \"\" : \"anonymous\"\r\n }\r\n function kd($, e) {\r\n var r = aa.RETINA_PREFIX.exec($);\r\n return r ? parseFloat(r[1]) : void 0 !== e ? e : 1\r\n }\r\n var ka = function() {\r\n function t(t) {\r\n this.items = [],\r\n this._name = t,\r\n this._aliasCount = 0\r\n }\r\n return t.prototype.emit = function(t, e, n, i, r, s, o, u) {\r\n if (arguments.length > 8)\r\n throw new Error(\"max arguments reached\");\r\n var h = this.name\r\n , p = this.items;\r\n this._aliasCount++;\r\n for (var a = 0, m = p.length; a < m; a++)\r\n p[a][h](t, e, n, i, r, s, o, u);\r\n return p === this.items && this._aliasCount--,\r\n this\r\n }\r\n ,\r\n t.prototype.ensureNonAliasedItems = function() {\r\n this._aliasCount > 0 && this.items.length > 1 && (this._aliasCount = 0,\r\n this.items = this.items.slice(0))\r\n }\r\n ,\r\n t.prototype.add = function(t) {\r\n return t[this._name] && (this.ensureNonAliasedItems(),\r\n this.remove(t),\r\n this.items.push(t)),\r\n this\r\n }\r\n ,\r\n t.prototype.remove = function(t) {\r\n var e = this.items.indexOf(t);\r\n return -1 !== e && (this.ensureNonAliasedItems(),\r\n this.items.splice(e, 1)),\r\n this\r\n }\r\n ,\r\n t.prototype.contains = function(t) {\r\n return -1 !== this.items.indexOf(t)\r\n }\r\n ,\r\n t.prototype.removeAll = function() {\r\n return this.ensureNonAliasedItems(),\r\n this.items.length = 0,\r\n this\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.removeAll(),\r\n this.items = null,\r\n this._name = null\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"empty\", {\r\n get: function() {\r\n return 0 === this.items.length\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"name\", {\r\n get: function() {\r\n return this._name\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t\r\n }();\r\n Object.defineProperties(ka.prototype, {\r\n dispatch: {\r\n value: ka.prototype.emit\r\n },\r\n run: {\r\n value: ka.prototype.emit\r\n }\r\n });\r\n var Rf, vb;\r\n aa.TARGET_FPMS = .06,\r\n function(t) {\r\n t[t.INTERACTION = 50] = \"INTERACTION\",\r\n t[t.HIGH = 25] = \"HIGH\",\r\n t[t.NORMAL = 0] = \"NORMAL\",\r\n t[t.LOW = -25] = \"LOW\",\r\n t[t.UTILITY = -50] = \"UTILITY\"\r\n }(vb || (Rf = vb = {},\r\n Rf));\r\n var Zb = function() {\r\n function t(t, e, i, s) {\r\n void 0 === e && (e = null),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = !1),\r\n this.next = null,\r\n this.previous = null,\r\n this._destroyed = !1,\r\n this.fn = t,\r\n this.context = e,\r\n this.priority = i,\r\n this.once = s\r\n }\r\n return t.prototype.match = function(t, e) {\r\n return void 0 === e && (e = null),\r\n this.fn === t && this.context === e\r\n }\r\n ,\r\n t.prototype.emit = function(t) {\r\n this.fn && (this.context ? this.fn.call(this.context, t) : this.fn(t));\r\n var e = this.next;\r\n return this.once && this.destroy(!0),\r\n this._destroyed && (this.next = null),\r\n e\r\n }\r\n ,\r\n t.prototype.connect = function(t) {\r\n this.previous = t,\r\n t.next && (t.next.previous = this),\r\n this.next = t.next,\r\n t.next = this\r\n }\r\n ,\r\n t.prototype.destroy = function(t) {\r\n void 0 === t && (t = !1),\r\n this._destroyed = !0,\r\n this.fn = null,\r\n this.context = null,\r\n this.previous && (this.previous.next = this.next),\r\n this.next && (this.next.previous = this.previous);\r\n var e = this.next;\r\n return this.next = t ? null : e,\r\n this.previous = null,\r\n e\r\n }\r\n ,\r\n t\r\n }()\r\n , Ea = function() {\r\n function t() {\r\n var t = this;\r\n this.autoStart = !1,\r\n this.deltaTime = 1,\r\n this.lastTime = -1,\r\n this.speed = 1,\r\n this.started = !1,\r\n this._requestId = null,\r\n this._maxElapsedMS = 100,\r\n this._minElapsedMS = 0,\r\n this._protected = !1,\r\n this._lastFrame = -1,\r\n this._head = new Zb(null,null,1 / 0),\r\n this.deltaMS = 1 / aa.TARGET_FPMS,\r\n this.elapsedMS = 1 / aa.TARGET_FPMS,\r\n this._tick = function(e) {\r\n t._requestId = null,\r\n t.started && (t.update(e),\r\n t.started && null === t._requestId && t._head.next && (t._requestId = requestAnimationFrame(t._tick)))\r\n }\r\n }\r\n return t.prototype._requestIfNeeded = function() {\r\n null === this._requestId && this._head.next && (this.lastTime = performance.now(),\r\n this._lastFrame = this.lastTime,\r\n this._requestId = requestAnimationFrame(this._tick))\r\n }\r\n ,\r\n t.prototype._cancelIfNeeded = function() {\r\n null !== this._requestId && (cancelAnimationFrame(this._requestId),\r\n this._requestId = null)\r\n }\r\n ,\r\n t.prototype._startIfPossible = function() {\r\n this.started ? this._requestIfNeeded() : this.autoStart && this.start()\r\n }\r\n ,\r\n t.prototype.add = function(t, e, i) {\r\n return void 0 === i && (i = vb.NORMAL),\r\n this._addListener(new Zb(t,e,i))\r\n }\r\n ,\r\n t.prototype.addOnce = function(t, e, i) {\r\n return void 0 === i && (i = vb.NORMAL),\r\n this._addListener(new Zb(t,e,i,!0))\r\n }\r\n ,\r\n t.prototype._addListener = function(t) {\r\n var e = this._head.next\r\n , i = this._head;\r\n if (e) {\r\n for (; e; ) {\r\n if (t.priority > e.priority) {\r\n t.connect(i);\r\n break\r\n }\r\n i = e,\r\n e = e.next\r\n }\r\n t.previous || t.connect(i)\r\n } else\r\n t.connect(i);\r\n return this._startIfPossible(),\r\n this\r\n }\r\n ,\r\n t.prototype.remove = function(t, e) {\r\n for (var i = this._head.next; i; )\r\n i = i.match(t, e) ? i.destroy() : i.next;\r\n return this._head.next || this._cancelIfNeeded(),\r\n this\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"count\", {\r\n get: function() {\r\n if (!this._head)\r\n return 0;\r\n for (var t = 0, e = this._head; e = e.next; )\r\n t++;\r\n return t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.start = function() {\r\n this.started || (this.started = !0,\r\n this._requestIfNeeded())\r\n }\r\n ,\r\n t.prototype.stop = function() {\r\n this.started && (this.started = !1,\r\n this._cancelIfNeeded())\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n if (!this._protected) {\r\n this.stop();\r\n for (var t = this._head.next; t; )\r\n t = t.destroy(!0);\r\n this._head.destroy(),\r\n this._head = null\r\n }\r\n }\r\n ,\r\n t.prototype.update = function(t) {\r\n var e;\r\n if (void 0 === t && (t = performance.now()),\r\n t > this.lastTime) {\r\n if ((e = this.elapsedMS = t - this.lastTime) > this._maxElapsedMS && (e = this._maxElapsedMS),\r\n e *= this.speed,\r\n this._minElapsedMS) {\r\n var i = t - this._lastFrame | 0;\r\n if (i < this._minElapsedMS)\r\n return;\r\n this._lastFrame = t - i % this._minElapsedMS\r\n }\r\n this.deltaMS = e,\r\n this.deltaTime = this.deltaMS * aa.TARGET_FPMS;\r\n for (var s = this._head, r = s.next; r; )\r\n r = r.emit(this.deltaTime);\r\n s.next || this._cancelIfNeeded()\r\n } else\r\n this.deltaTime = this.deltaMS = this.elapsedMS = 0;\r\n this.lastTime = t\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"FPS\", {\r\n get: function() {\r\n return 1e3 / this.elapsedMS\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"minFPS\", {\r\n get: function() {\r\n return 1e3 / this._maxElapsedMS\r\n },\r\n set: function(t) {\r\n var e = Math.min(this.maxFPS, t)\r\n , i = Math.min(Math.max(0, e) / 1e3, aa.TARGET_FPMS);\r\n this._maxElapsedMS = 1 / i\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"maxFPS\", {\r\n get: function() {\r\n return this._minElapsedMS ? Math.round(1e3 / this._minElapsedMS) : 0\r\n },\r\n set: function(t) {\r\n if (0 === t)\r\n this._minElapsedMS = 0;\r\n else {\r\n var e = Math.max(this.minFPS, t);\r\n this._minElapsedMS = 1 / (e / 1e3)\r\n }\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"shared\", {\r\n get: function() {\r\n if (!t._shared) {\r\n var e = t._shared = new t;\r\n e.autoStart = !0,\r\n e._protected = !0\r\n }\r\n return t._shared\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"system\", {\r\n get: function() {\r\n if (!t._system) {\r\n var e = t._system = new t;\r\n e.autoStart = !0,\r\n e._protected = !0\r\n }\r\n return t._system\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t\r\n }()\r\n , g = function() {\r\n function t() {}\r\n return t.init = function(t) {\r\n var e = this;\r\n t = Object.assign({\r\n autoStart: !0,\r\n sharedTicker: !1\r\n }, t),\r\n Object.defineProperty(this, \"ticker\", {\r\n set: function(t) {\r\n this._ticker && this._ticker.remove(this.render, this),\r\n this._ticker = t,\r\n t && t.add(this.render, this, vb.LOW)\r\n },\r\n get: function() {\r\n return this._ticker\r\n }\r\n }),\r\n this.stop = function() {\r\n e._ticker.stop()\r\n }\r\n ,\r\n this.start = function() {\r\n e._ticker.start()\r\n }\r\n ,\r\n this._ticker = null,\r\n this.ticker = t.sharedTicker ? Ea.shared : new Ea,\r\n t.autoStart && this.start()\r\n }\r\n ,\r\n t.destroy = function() {\r\n if (this._ticker) {\r\n var t = this._ticker;\r\n this.ticker = null,\r\n t.destroy()\r\n }\r\n }\r\n ,\r\n t\r\n }();\r\n var Sf, fa, wb = 2 * Math.PI, Tf = 180 / Math.PI, Uf = Math.PI / 180;\r\n !function(t) {\r\n t[t.POLY = 0] = \"POLY\",\r\n t[t.RECT = 1] = \"RECT\",\r\n t[t.CIRC = 2] = \"CIRC\",\r\n t[t.ELIP = 3] = \"ELIP\",\r\n t[t.RREC = 4] = \"RREC\"\r\n }(fa || (Sf = fa = {},\r\n Sf));\r\n var da = function() {\r\n function t(t, i, s, o) {\r\n void 0 === t && (t = 0),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0),\r\n this.x = Number(t),\r\n this.y = Number(i),\r\n this.width = Number(s),\r\n this.height = Number(o),\r\n this.type = fa.RECT\r\n }\r\n return Object.defineProperty(t.prototype, \"left\", {\r\n get: function() {\r\n return this.x\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"right\", {\r\n get: function() {\r\n return this.x + this.width\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"top\", {\r\n get: function() {\r\n return this.y\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"bottom\", {\r\n get: function() {\r\n return this.y + this.height\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"EMPTY\", {\r\n get: function() {\r\n return new t(0,0,0,0)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.clone = function() {\r\n return new t(this.x,this.y,this.width,this.height)\r\n }\r\n ,\r\n t.prototype.copyFrom = function(t) {\r\n return this.x = t.x,\r\n this.y = t.y,\r\n this.width = t.width,\r\n this.height = t.height,\r\n this\r\n }\r\n ,\r\n t.prototype.copyTo = function(t) {\r\n return t.x = this.x,\r\n t.y = this.y,\r\n t.width = this.width,\r\n t.height = this.height,\r\n t\r\n }\r\n ,\r\n t.prototype.contains = function(t, i) {\r\n return !(this.width <= 0 || this.height <= 0) && t >= this.x && t < this.x + this.width && i >= this.y && i < this.y + this.height\r\n }\r\n ,\r\n t.prototype.pad = function(t, i) {\r\n return void 0 === t && (t = 0),\r\n void 0 === i && (i = t),\r\n this.x -= t,\r\n this.y -= i,\r\n this.width += 2 * t,\r\n this.height += 2 * i,\r\n this\r\n }\r\n ,\r\n t.prototype.fit = function(t) {\r\n var i = Math.max(this.x, t.x)\r\n , s = Math.min(this.x + this.width, t.x + t.width)\r\n , o = Math.max(this.y, t.y)\r\n , h = Math.min(this.y + this.height, t.y + t.height);\r\n return this.x = i,\r\n this.width = Math.max(s - i, 0),\r\n this.y = o,\r\n this.height = Math.max(h - o, 0),\r\n this\r\n }\r\n ,\r\n t.prototype.ceil = function(t, i) {\r\n void 0 === t && (t = 1),\r\n void 0 === i && (i = .001);\r\n var s = Math.ceil((this.x + this.width - i) * t) / t\r\n , o = Math.ceil((this.y + this.height - i) * t) / t;\r\n return this.x = Math.floor((this.x + i) * t) / t,\r\n this.y = Math.floor((this.y + i) * t) / t,\r\n this.width = s - this.x,\r\n this.height = o - this.y,\r\n this\r\n }\r\n ,\r\n t.prototype.enlarge = function(t) {\r\n var i = Math.min(this.x, t.x)\r\n , s = Math.max(this.x + this.width, t.x + t.width)\r\n , o = Math.min(this.y, t.y)\r\n , h = Math.max(this.y + this.height, t.y + t.height);\r\n return this.x = i,\r\n this.width = s - i,\r\n this.y = o,\r\n this.height = h - o,\r\n this\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Rectangle x=\" + this.x + \" y=\" + this.y + \" width=\" + this.width + \" height=\" + this.height + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , Vf = function() {\r\n function t(t, i, s) {\r\n void 0 === t && (t = 0),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = 0),\r\n this.x = t,\r\n this.y = i,\r\n this.radius = s,\r\n this.type = fa.CIRC\r\n }\r\n return t.prototype.clone = function() {\r\n return new t(this.x,this.y,this.radius)\r\n }\r\n ,\r\n t.prototype.contains = function(t, i) {\r\n if (this.radius <= 0)\r\n return !1;\r\n var s = this.radius * this.radius\r\n , o = this.x - t\r\n , h = this.y - i;\r\n return (o *= o) + (h *= h) <= s\r\n }\r\n ,\r\n t.prototype.getBounds = function() {\r\n return new da(this.x - this.radius,this.y - this.radius,2 * this.radius,2 * this.radius)\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Circle x=\" + this.x + \" y=\" + this.y + \" radius=\" + this.radius + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , Wf = function() {\r\n function t(t, i, s, o) {\r\n void 0 === t && (t = 0),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0),\r\n this.x = t,\r\n this.y = i,\r\n this.width = s,\r\n this.height = o,\r\n this.type = fa.ELIP\r\n }\r\n return t.prototype.clone = function() {\r\n return new t(this.x,this.y,this.width,this.height)\r\n }\r\n ,\r\n t.prototype.contains = function(t, i) {\r\n if (this.width <= 0 || this.height <= 0)\r\n return !1;\r\n var s = (t - this.x) / this.width\r\n , o = (i - this.y) / this.height;\r\n return (s *= s) + (o *= o) <= 1\r\n }\r\n ,\r\n t.prototype.getBounds = function() {\r\n return new da(this.x - this.width,this.y - this.height,this.width,this.height)\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Ellipse x=\" + this.x + \" y=\" + this.y + \" width=\" + this.width + \" height=\" + this.height + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , $b = function() {\r\n function t() {\r\n for (var t = arguments, i = [], s = 0; s < arguments.length; s++)\r\n i[s] = t[s];\r\n var o = Array.isArray(i[0]) ? i[0] : i;\r\n if (\"number\" != typeof o[0]) {\r\n for (var h = [], r = 0, e = o.length; r < e; r++)\r\n h.push(o[r].x, o[r].y);\r\n o = h\r\n }\r\n this.points = o,\r\n this.type = fa.POLY,\r\n this.closeStroke = !0\r\n }\r\n return t.prototype.clone = function() {\r\n var i = new t(this.points.slice());\r\n return i.closeStroke = this.closeStroke,\r\n i\r\n }\r\n ,\r\n t.prototype.contains = function(t, i) {\r\n for (var s = !1, o = this.points.length / 2, h = 0, r = o - 1; h < o; r = h++) {\r\n var e = this.points[2 * h]\r\n , n = this.points[2 * h + 1]\r\n , a = this.points[2 * r]\r\n , $ = this.points[2 * r + 1];\r\n n > i != $ > i && t < (i - n) / ($ - n) * (a - e) + e && (s = !s)\r\n }\r\n return s\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:PolygoncloseStroke=\" + this.closeStroke + \"points=\" + this.points.reduce(function(t, i) {\r\n return t + \", \" + i\r\n }, \"\") + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , Xf = function() {\r\n function t(t, i, s, o, h) {\r\n void 0 === t && (t = 0),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0),\r\n void 0 === h && (h = 20),\r\n this.x = t,\r\n this.y = i,\r\n this.width = s,\r\n this.height = o,\r\n this.radius = h,\r\n this.type = fa.RREC\r\n }\r\n return t.prototype.clone = function() {\r\n return new t(this.x,this.y,this.width,this.height,this.radius)\r\n }\r\n ,\r\n t.prototype.contains = function(t, i) {\r\n if (this.width <= 0 || this.height <= 0)\r\n return !1;\r\n if (t >= this.x && t <= this.x + this.width && i >= this.y && i <= this.y + this.height) {\r\n if (i >= this.y + this.radius && i <= this.y + this.height - this.radius || t >= this.x + this.radius && t <= this.x + this.width - this.radius)\r\n return !0;\r\n var s = t - (this.x + this.radius)\r\n , o = i - (this.y + this.radius)\r\n , h = this.radius * this.radius;\r\n if (s * s + o * o <= h)\r\n return !0;\r\n if ((s = t - (this.x + this.width - this.radius)) * s + o * o <= h)\r\n return !0;\r\n if (s * s + (o = i - (this.y + this.height - this.radius)) * o <= h)\r\n return !0;\r\n if ((s = t - (this.x + this.radius)) * s + o * o <= h)\r\n return !0\r\n }\r\n return !1\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:RoundedRectangle x=\" + this.x + \" y=\" + this.y + \"width=\" + this.width + \" height=\" + this.height + \" radius=\" + this.radius + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , ra = function() {\r\n function t(t, i) {\r\n void 0 === t && (t = 0),\r\n void 0 === i && (i = 0),\r\n this.x = t,\r\n this.y = i\r\n }\r\n return t.prototype.clone = function() {\r\n return new t(this.x,this.y)\r\n }\r\n ,\r\n t.prototype.copyFrom = function(t) {\r\n return this.set(t.x, t.y),\r\n this\r\n }\r\n ,\r\n t.prototype.copyTo = function(t) {\r\n return t.set(this.x, this.y),\r\n t\r\n }\r\n ,\r\n t.prototype.equals = function(t) {\r\n return t.x === this.x && t.y === this.y\r\n }\r\n ,\r\n t.prototype.set = function(t, i) {\r\n return void 0 === t && (t = 0),\r\n void 0 === i && (i = t),\r\n this.x = t,\r\n this.y = i,\r\n this\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Point x=\" + this.x + \" y=\" + this.y + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , xb = function() {\r\n function t(t, i, s, o) {\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0),\r\n this._x = s,\r\n this._y = o,\r\n this.cb = t,\r\n this.scope = i\r\n }\r\n return t.prototype.clone = function(i, s) {\r\n return void 0 === i && (i = this.cb),\r\n void 0 === s && (s = this.scope),\r\n new t(i,s,this._x,this._y)\r\n }\r\n ,\r\n t.prototype.set = function(t, i) {\r\n return void 0 === t && (t = 0),\r\n void 0 === i && (i = t),\r\n this._x === t && this._y === i || (this._x = t,\r\n this._y = i,\r\n this.cb.call(this.scope)),\r\n this\r\n }\r\n ,\r\n t.prototype.copyFrom = function(t) {\r\n return this._x === t.x && this._y === t.y || (this._x = t.x,\r\n this._y = t.y,\r\n this.cb.call(this.scope)),\r\n this\r\n }\r\n ,\r\n t.prototype.copyTo = function(t) {\r\n return t.set(this._x, this._y),\r\n t\r\n }\r\n ,\r\n t.prototype.equals = function(t) {\r\n return t.x === this._x && t.y === this._y\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:ObservablePoint x=0 y=0 scope=\" + this.scope + \"]\"\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"x\", {\r\n get: function() {\r\n return this._x\r\n },\r\n set: function(t) {\r\n this._x !== t && (this._x = t,\r\n this.cb.call(this.scope))\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"y\", {\r\n get: function() {\r\n return this._y\r\n },\r\n set: function(t) {\r\n this._y !== t && (this._y = t,\r\n this.cb.call(this.scope))\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t\r\n }()\r\n , la = function() {\r\n function t(t, i, s, o, h, r) {\r\n void 0 === t && (t = 1),\r\n void 0 === i && (i = 0),\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 1),\r\n void 0 === h && (h = 0),\r\n void 0 === r && (r = 0),\r\n this.array = null,\r\n this.a = t,\r\n this.b = i,\r\n this.c = s,\r\n this.d = o,\r\n this.tx = h,\r\n this.ty = r\r\n }\r\n return t.prototype.fromArray = function(t) {\r\n this.a = t[0],\r\n this.b = t[1],\r\n this.c = t[3],\r\n this.d = t[4],\r\n this.tx = t[2],\r\n this.ty = t[5]\r\n }\r\n ,\r\n t.prototype.set = function(t, i, s, o, h, r) {\r\n return this.a = t,\r\n this.b = i,\r\n this.c = s,\r\n this.d = o,\r\n this.tx = h,\r\n this.ty = r,\r\n this\r\n }\r\n ,\r\n t.prototype.toArray = function(t, i) {\r\n this.array || (this.array = new Float32Array(9));\r\n var s = i || this.array;\r\n return t ? (s[0] = this.a,\r\n s[1] = this.b,\r\n s[2] = 0,\r\n s[3] = this.c,\r\n s[4] = this.d,\r\n s[5] = 0,\r\n s[6] = this.tx,\r\n s[7] = this.ty,\r\n s[8] = 1) : (s[0] = this.a,\r\n s[1] = this.c,\r\n s[2] = this.tx,\r\n s[3] = this.b,\r\n s[4] = this.d,\r\n s[5] = this.ty,\r\n s[6] = 0,\r\n s[7] = 0,\r\n s[8] = 1),\r\n s\r\n }\r\n ,\r\n t.prototype.apply = function(t, i) {\r\n i = i || new ra;\r\n var s = t.x\r\n , o = t.y;\r\n return i.x = this.a * s + this.c * o + this.tx,\r\n i.y = this.b * s + this.d * o + this.ty,\r\n i\r\n }\r\n ,\r\n t.prototype.applyInverse = function(t, i) {\r\n i = i || new ra;\r\n var s = 1 / (this.a * this.d + this.c * -this.b)\r\n , o = t.x\r\n , h = t.y;\r\n return i.x = this.d * s * o + -this.c * s * h + (this.ty * this.c - this.tx * this.d) * s,\r\n i.y = this.a * s * h + -this.b * s * o + (-this.ty * this.a + this.tx * this.b) * s,\r\n i\r\n }\r\n ,\r\n t.prototype.translate = function(t, i) {\r\n return this.tx += t,\r\n this.ty += i,\r\n this\r\n }\r\n ,\r\n t.prototype.scale = function(t, i) {\r\n return this.a *= t,\r\n this.d *= i,\r\n this.c *= t,\r\n this.b *= i,\r\n this.tx *= t,\r\n this.ty *= i,\r\n this\r\n }\r\n ,\r\n t.prototype.rotate = function(t) {\r\n var i = Math.cos(t)\r\n , s = Math.sin(t)\r\n , o = this.a\r\n , h = this.c\r\n , r = this.tx;\r\n return this.a = o * i - this.b * s,\r\n this.b = o * s + this.b * i,\r\n this.c = h * i - this.d * s,\r\n this.d = h * s + this.d * i,\r\n this.tx = r * i - this.ty * s,\r\n this.ty = r * s + this.ty * i,\r\n this\r\n }\r\n ,\r\n t.prototype.append = function(t) {\r\n var i = this.a\r\n , s = this.b\r\n , o = this.c\r\n , h = this.d;\r\n return this.a = t.a * i + t.b * o,\r\n this.b = t.a * s + t.b * h,\r\n this.c = t.c * i + t.d * o,\r\n this.d = t.c * s + t.d * h,\r\n this.tx = t.tx * i + t.ty * o + this.tx,\r\n this.ty = t.tx * s + t.ty * h + this.ty,\r\n this\r\n }\r\n ,\r\n t.prototype.setTransform = function(t, i, s, o, h, r, e, n, a) {\r\n return this.a = Math.cos(e + a) * h,\r\n this.b = Math.sin(e + a) * h,\r\n this.c = -Math.sin(e - n) * r,\r\n this.d = Math.cos(e - n) * r,\r\n this.tx = t - (s * this.a + o * this.c),\r\n this.ty = i - (s * this.b + o * this.d),\r\n this\r\n }\r\n ,\r\n t.prototype.prepend = function(t) {\r\n var i = this.tx;\r\n if (1 !== t.a || 0 !== t.b || 0 !== t.c || 1 !== t.d) {\r\n var s = this.a\r\n , o = this.c;\r\n this.a = s * t.a + this.b * t.c,\r\n this.b = s * t.b + this.b * t.d,\r\n this.c = o * t.a + this.d * t.c,\r\n this.d = o * t.b + this.d * t.d\r\n }\r\n return this.tx = i * t.a + this.ty * t.c + t.tx,\r\n this.ty = i * t.b + this.ty * t.d + t.ty,\r\n this\r\n }\r\n ,\r\n t.prototype.decompose = function(t) {\r\n var i = this.a\r\n , s = this.b\r\n , o = this.c\r\n , h = this.d\r\n , r = t.pivot\r\n , e = -Math.atan2(-o, h)\r\n , n = Math.atan2(s, i)\r\n , a = Math.abs(e + n);\r\n return a < 1e-5 || Math.abs(wb - a) < 1e-5 ? (t.rotation = n,\r\n t.skew.x = t.skew.y = 0) : (t.rotation = 0,\r\n t.skew.x = e,\r\n t.skew.y = n),\r\n t.scale.x = Math.sqrt(i * i + s * s),\r\n t.scale.y = Math.sqrt(o * o + h * h),\r\n t.position.x = this.tx + (r.x * i + r.y * o),\r\n t.position.y = this.ty + (r.x * s + r.y * h),\r\n t\r\n }\r\n ,\r\n t.prototype.invert = function() {\r\n var t = this.a\r\n , i = this.b\r\n , s = this.c\r\n , o = this.d\r\n , h = this.tx\r\n , r = t * o - i * s;\r\n return this.a = o / r,\r\n this.b = -i / r,\r\n this.c = -s / r,\r\n this.d = t / r,\r\n this.tx = (s * this.ty - o * h) / r,\r\n this.ty = -(t * this.ty - i * h) / r,\r\n this\r\n }\r\n ,\r\n t.prototype.identity = function() {\r\n return this.a = 1,\r\n this.b = 0,\r\n this.c = 0,\r\n this.d = 1,\r\n this.tx = 0,\r\n this.ty = 0,\r\n this\r\n }\r\n ,\r\n t.prototype.clone = function() {\r\n var i = new t;\r\n return i.a = this.a,\r\n i.b = this.b,\r\n i.c = this.c,\r\n i.d = this.d,\r\n i.tx = this.tx,\r\n i.ty = this.ty,\r\n i\r\n }\r\n ,\r\n t.prototype.copyTo = function(t) {\r\n return t.a = this.a,\r\n t.b = this.b,\r\n t.c = this.c,\r\n t.d = this.d,\r\n t.tx = this.tx,\r\n t.ty = this.ty,\r\n t\r\n }\r\n ,\r\n t.prototype.copyFrom = function(t) {\r\n return this.a = t.a,\r\n this.b = t.b,\r\n this.c = t.c,\r\n this.d = t.d,\r\n this.tx = t.tx,\r\n this.ty = t.ty,\r\n this\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Matrix a=\" + this.a + \" b=\" + this.b + \" c=\" + this.c + \" d=\" + this.d + \" tx=\" + this.tx + \" ty=\" + this.ty + \"]\"\r\n }\r\n ,\r\n Object.defineProperty(t, \"IDENTITY\", {\r\n get: function() {\r\n return new t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"TEMP_MATRIX\", {\r\n get: function() {\r\n return new t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t\r\n }()\r\n , La = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1]\r\n , Ma = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1]\r\n , Na = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1]\r\n , Oa = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1]\r\n , _b = []\r\n , ld = []\r\n , yb = Math.sign;\r\n function Yf() {\r\n for (var t = 0; t < 16; t++) {\r\n var i = [];\r\n _b.push(i);\r\n for (var s = 0; s < 16; s++)\r\n for (var o = yb(La[t] * La[s] + Na[t] * Ma[s]), h = yb(Ma[t] * La[s] + Oa[t] * Ma[s]), r = yb(La[t] * Na[s] + Na[t] * Oa[s]), e = yb(Ma[t] * Na[s] + Oa[t] * Oa[s]), n = 0; n < 16; n++)\r\n if (La[n] === o && Ma[n] === h && Na[n] === r && Oa[n] === e) {\r\n i.push(n);\r\n break\r\n }\r\n }\r\n for (t = 0; t < 16; t++) {\r\n var a = new la;\r\n a.set(La[t], Ma[t], Na[t], Oa[t], 0, 0),\r\n ld.push(a)\r\n }\r\n }\r\n Yf();\r\n var ea = {\r\n E: 0,\r\n SE: 1,\r\n S: 2,\r\n SW: 3,\r\n W: 4,\r\n NW: 5,\r\n N: 6,\r\n NE: 7,\r\n MIRROR_VERTICAL: 8,\r\n MAIN_DIAGONAL: 10,\r\n MIRROR_HORIZONTAL: 12,\r\n REVERSE_DIAGONAL: 14,\r\n uX: function(t) {\r\n return La[t]\r\n },\r\n uY: function(t) {\r\n return Ma[t]\r\n },\r\n vX: function(t) {\r\n return Na[t]\r\n },\r\n vY: function(t) {\r\n return Oa[t]\r\n },\r\n inv: function(t) {\r\n return 8 & t ? 15 & t : 7 & -t\r\n },\r\n add: function(t, i) {\r\n return _b[t][i]\r\n },\r\n sub: function(t, i) {\r\n return _b[t][ea.inv(i)]\r\n },\r\n rotate180: function(t) {\r\n return 4 ^ t\r\n },\r\n isVertical: function(t) {\r\n return 2 == (3 & t)\r\n },\r\n byDirection: function(t, i) {\r\n return 2 * Math.abs(t) <= Math.abs(i) ? i >= 0 ? ea.S : ea.N : 2 * Math.abs(i) <= Math.abs(t) ? t > 0 ? ea.E : ea.W : i > 0 ? t > 0 ? ea.SE : ea.SW : t > 0 ? ea.NE : ea.NW\r\n },\r\n matrixAppendRotationInv: function(t, i, s, o) {\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0);\r\n var h = ld[ea.inv(i)];\r\n h.tx = s,\r\n h.ty = o,\r\n t.append(h)\r\n }\r\n }\r\n , Zf = function() {\r\n function t() {\r\n this.worldTransform = new la,\r\n this.localTransform = new la,\r\n this.position = new xb(this.onChange,this,0,0),\r\n this.scale = new xb(this.onChange,this,1,1),\r\n this.pivot = new xb(this.onChange,this,0,0),\r\n this.skew = new xb(this.updateSkew,this,0,0),\r\n this._rotation = 0,\r\n this._cx = 1,\r\n this._sx = 0,\r\n this._cy = 0,\r\n this._sy = 1,\r\n this._localID = 0,\r\n this._currentLocalID = 0,\r\n this._worldID = 0,\r\n this._parentID = 0\r\n }\r\n return t.prototype.onChange = function() {\r\n this._localID++\r\n }\r\n ,\r\n t.prototype.updateSkew = function() {\r\n this._cx = Math.cos(this._rotation + this.skew.y),\r\n this._sx = Math.sin(this._rotation + this.skew.y),\r\n this._cy = -Math.sin(this._rotation - this.skew.x),\r\n this._sy = Math.cos(this._rotation - this.skew.x),\r\n this._localID++\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/math:Transform position=(\" + this.position.x + \", \" + this.position.y + \") rotation=\" + this.rotation + \" scale=(\" + this.scale.x + \", \" + this.scale.y + \") skew=(\" + this.skew.x + \", \" + this.skew.y + \") ]\"\r\n }\r\n ,\r\n t.prototype.updateLocalTransform = function() {\r\n var t = this.localTransform;\r\n this._localID !== this._currentLocalID && (t.a = this._cx * this.scale.x,\r\n t.b = this._sx * this.scale.x,\r\n t.c = this._cy * this.scale.y,\r\n t.d = this._sy * this.scale.y,\r\n t.tx = this.position.x - (this.pivot.x * t.a + this.pivot.y * t.c),\r\n t.ty = this.position.y - (this.pivot.x * t.b + this.pivot.y * t.d),\r\n this._currentLocalID = this._localID,\r\n this._parentID = -1)\r\n }\r\n ,\r\n t.prototype.updateTransform = function(t) {\r\n var i = this.localTransform;\r\n if (this._localID !== this._currentLocalID && (i.a = this._cx * this.scale.x,\r\n i.b = this._sx * this.scale.x,\r\n i.c = this._cy * this.scale.y,\r\n i.d = this._sy * this.scale.y,\r\n i.tx = this.position.x - (this.pivot.x * i.a + this.pivot.y * i.c),\r\n i.ty = this.position.y - (this.pivot.x * i.b + this.pivot.y * i.d),\r\n this._currentLocalID = this._localID,\r\n this._parentID = -1),\r\n this._parentID !== t._worldID) {\r\n var s = t.worldTransform\r\n , o = this.worldTransform;\r\n o.a = i.a * s.a + i.b * s.c,\r\n o.b = i.a * s.b + i.b * s.d,\r\n o.c = i.c * s.a + i.d * s.c,\r\n o.d = i.c * s.b + i.d * s.d,\r\n o.tx = i.tx * s.a + i.ty * s.c + s.tx,\r\n o.ty = i.tx * s.b + i.ty * s.d + s.ty,\r\n this._parentID = t._worldID,\r\n this._worldID++\r\n }\r\n }\r\n ,\r\n t.prototype.setFromMatrix = function(t) {\r\n t.decompose(this),\r\n this._localID++\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"rotation\", {\r\n get: function() {\r\n return this._rotation\r\n },\r\n set: function(t) {\r\n this._rotation !== t && (this._rotation = t,\r\n this.updateSkew())\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.IDENTITY = new t,\r\n t\r\n }();\r\n aa.PREFER_ENV = Ha.any ? Aa.WEBGL : Aa.WEBGL2,\r\n aa.STRICT_TEXTURE_CACHE = !1;\r\n var zb = [];\r\n function ac(t, e) {\r\n if (!t)\r\n return null;\r\n var r = \"\";\r\n if (\"string\" == typeof t) {\r\n var i = /\\.(\\w{3,4})(?:$|\\?|#)/i.exec(t);\r\n i && (r = i[1].toLowerCase())\r\n }\r\n for (var o = zb.length - 1; o >= 0; --o) {\r\n var n = zb[o];\r\n if (n.test && n.test(t, r))\r\n return new n(t,e)\r\n }\r\n throw new Error(\"Unrecognized source type to auto-detect Resource\")\r\n }\r\n var $f = function(t, e) {\r\n return ($f = Object.setPrototypeOf || {\r\n __proto__: []\r\n }instanceof Array && function(t, e) {\r\n t.__proto__ = e\r\n }\r\n || function(t, e) {\r\n for (var r in e)\r\n e.hasOwnProperty(r) && (t[r] = e[r])\r\n }\r\n )(t, e)\r\n };\r\n function ba(t, e) {\r\n function r() {\r\n this.constructor = t\r\n }\r\n $f(t, e),\r\n t.prototype = null === e ? Object.create(e) : (r.prototype = e.prototype,\r\n new r)\r\n }\r\n var Wa = function() {\r\n function t(t, e) {\r\n void 0 === t && (t = 0),\r\n void 0 === e && (e = 0),\r\n this._width = t,\r\n this._height = e,\r\n this.destroyed = !1,\r\n this.internal = !1,\r\n this.onResize = new ka(\"setRealSize\"),\r\n this.onUpdate = new ka(\"update\"),\r\n this.onError = new ka(\"onError\")\r\n }\r\n return t.prototype.bind = function(t) {\r\n this.onResize.add(t),\r\n this.onUpdate.add(t),\r\n this.onError.add(t),\r\n (this._width || this._height) && this.onResize.emit(this._width, this._height)\r\n }\r\n ,\r\n t.prototype.unbind = function(t) {\r\n this.onResize.remove(t),\r\n this.onUpdate.remove(t),\r\n this.onError.remove(t)\r\n }\r\n ,\r\n t.prototype.resize = function(t, e) {\r\n t === this._width && e === this._height || (this._width = t,\r\n this._height = e,\r\n this.onResize.emit(t, e))\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"valid\", {\r\n get: function() {\r\n return !!this._width && !!this._height\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.update = function() {\r\n this.destroyed || this.onUpdate.emit()\r\n }\r\n ,\r\n t.prototype.load = function() {\r\n return Promise.resolve(this)\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"width\", {\r\n get: function() {\r\n return this._width\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"height\", {\r\n get: function() {\r\n return this._height\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.style = function(t, e, r) {\r\n return !1\r\n }\r\n ,\r\n t.prototype.dispose = function() {}\r\n ,\r\n t.prototype.destroy = function() {\r\n this.destroyed || (this.destroyed = !0,\r\n this.dispose(),\r\n this.onError.removeAll(),\r\n this.onError = null,\r\n this.onResize.removeAll(),\r\n this.onResize = null,\r\n this.onUpdate.removeAll(),\r\n this.onUpdate = null)\r\n }\r\n ,\r\n t.test = function(t, e) {\r\n return !1\r\n }\r\n ,\r\n t\r\n }()\r\n , Ab = function(t) {\r\n function e(e, r) {\r\n var i = this\r\n , o = r || {}\r\n , n = o.width\r\n , s = o.height;\r\n if (!n || !s)\r\n throw new Error(\"BufferResource width or height invalid\");\r\n return (i = t.call(this, n, s) || this).data = e,\r\n i\r\n }\r\n return ba(e, t),\r\n e.prototype.upload = function(t, e, r) {\r\n var i = t.gl;\r\n return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK),\r\n r.width === e.width && r.height === e.height ? i.texSubImage2D(e.target, 0, 0, 0, e.width, e.height, e.format, e.type, this.data) : (r.width = e.width,\r\n r.height = e.height,\r\n i.texImage2D(e.target, 0, r.internalFormat, e.width, e.height, 0, e.format, r.type, this.data)),\r\n !0\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this.data = null\r\n }\r\n ,\r\n e.test = function(t) {\r\n return t instanceof Float32Array || t instanceof Uint8Array || t instanceof Uint32Array\r\n }\r\n ,\r\n e\r\n }(Wa)\r\n , _f = {\r\n scaleMode: Ca.NEAREST,\r\n format: kb.RGBA,\r\n alphaMode: Ia.NPM\r\n }\r\n , ia = function(t) {\r\n function e(e, r) {\r\n void 0 === e && (e = null),\r\n void 0 === r && (r = null);\r\n var i = t.call(this) || this\r\n , o = (r = r || {}).alphaMode\r\n , n = r.mipmap\r\n , s = r.anisotropicLevel\r\n , a = r.scaleMode\r\n , u = r.width\r\n , h = r.height\r\n , $ = r.wrapMode\r\n , p = r.format\r\n , l = r.type\r\n , c = r.target\r\n , d = r.resolution\r\n , f = r.resourceOptions;\r\n return !e || e instanceof Wa || ((e = ac(e, f)).internal = !0),\r\n i.width = u || 0,\r\n i.height = h || 0,\r\n i.resolution = d || aa.RESOLUTION,\r\n i.mipmap = void 0 !== n ? n : aa.MIPMAP_TEXTURES,\r\n i.anisotropicLevel = void 0 !== s ? s : aa.ANISOTROPIC_LEVEL,\r\n i.wrapMode = $ || aa.WRAP_MODE,\r\n i.scaleMode = void 0 !== a ? a : aa.SCALE_MODE,\r\n i.format = p || kb.RGBA,\r\n i.type = l || ua.UNSIGNED_BYTE,\r\n i.target = c || Sa.TEXTURE_2D,\r\n i.alphaMode = void 0 !== o ? o : Ia.UNPACK,\r\n i.uid = ub(),\r\n i.touched = 0,\r\n i.isPowerOfTwo = !1,\r\n i._refreshPOT(),\r\n i._glTextures = {},\r\n i.dirtyId = 0,\r\n i.dirtyStyleId = 0,\r\n i.cacheId = null,\r\n i.valid = u > 0 && h > 0,\r\n i.textureCacheIds = [],\r\n i.destroyed = !1,\r\n i.resource = null,\r\n i._batchEnabled = 0,\r\n i._batchLocation = 0,\r\n i.parentTextureArray = null,\r\n i.setResource(e),\r\n i\r\n }\r\n return ba(e, t),\r\n Object.defineProperty(e.prototype, \"realWidth\", {\r\n get: function() {\r\n return Math.ceil(this.width * this.resolution - 1e-4)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"realHeight\", {\r\n get: function() {\r\n return Math.ceil(this.height * this.resolution - 1e-4)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.setStyle = function(t, e) {\r\n var r;\r\n return void 0 !== t && t !== this.scaleMode && (this.scaleMode = t,\r\n r = !0),\r\n void 0 !== e && e !== this.mipmap && (this.mipmap = e,\r\n r = !0),\r\n r && this.dirtyStyleId++,\r\n this\r\n }\r\n ,\r\n e.prototype.setSize = function(t, e, r) {\r\n return this.resolution = r || this.resolution,\r\n this.width = t,\r\n this.height = e,\r\n this._refreshPOT(),\r\n this.update(),\r\n this\r\n }\r\n ,\r\n e.prototype.setRealSize = function(t, e, r) {\r\n return this.resolution = r || this.resolution,\r\n this.width = t / this.resolution,\r\n this.height = e / this.resolution,\r\n this._refreshPOT(),\r\n this.update(),\r\n this\r\n }\r\n ,\r\n e.prototype._refreshPOT = function() {\r\n this.isPowerOfTwo = gd(this.realWidth) && gd(this.realHeight)\r\n }\r\n ,\r\n e.prototype.setResolution = function(t) {\r\n var e = this.resolution;\r\n return e === t ? this : (this.resolution = t,\r\n this.valid && (this.width = this.width * e / t,\r\n this.height = this.height * e / t,\r\n this.emit(\"update\", this)),\r\n this._refreshPOT(),\r\n this)\r\n }\r\n ,\r\n e.prototype.setResource = function(t) {\r\n if (this.resource === t)\r\n return this;\r\n if (this.resource)\r\n throw new Error(\"Resource can be set only once\");\r\n return t.bind(this),\r\n this.resource = t,\r\n this\r\n }\r\n ,\r\n e.prototype.update = function() {\r\n this.valid ? (this.dirtyId++,\r\n this.dirtyStyleId++,\r\n this.emit(\"update\", this)) : this.width > 0 && this.height > 0 && (this.valid = !0,\r\n this.emit(\"loaded\", this),\r\n this.emit(\"update\", this))\r\n }\r\n ,\r\n e.prototype.onError = function(t) {\r\n this.emit(\"error\", this, t)\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n this.resource && (this.resource.unbind(this),\r\n this.resource.internal && this.resource.destroy(),\r\n this.resource = null),\r\n this.cacheId && (delete Ka[this.cacheId],\r\n delete ya[this.cacheId],\r\n this.cacheId = null),\r\n this.dispose(),\r\n e.removeFromCache(this),\r\n this.textureCacheIds = null,\r\n this.destroyed = !0\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this.emit(\"dispose\", this)\r\n }\r\n ,\r\n e.prototype.castToBaseTexture = function() {\r\n return this\r\n }\r\n ,\r\n e.from = function(t, r, i) {\r\n void 0 === i && (i = aa.STRICT_TEXTURE_CACHE);\r\n var o = \"string\" == typeof t\r\n , n = null;\r\n if (o)\r\n n = t;\r\n else {\r\n if (!t._pixiId) {\r\n var s = r && r.pixiIdPrefix || \"pixiid\";\r\n t._pixiId = s + \"_\" + ub()\r\n }\r\n n = t._pixiId\r\n }\r\n var a = Ka[n];\r\n if (o && i && !a)\r\n throw new Error(\"The cacheId \\\"\" + n + \"\\\" does not exist in BaseTextureCache.\");\r\n return a || ((a = new e(t,r)).cacheId = n,\r\n e.addToCache(a, n)),\r\n a\r\n }\r\n ,\r\n e.fromBuffer = function(t, r, i, o) {\r\n t = t || new Float32Array(r * i * 4);\r\n var n = new Ab(t,{\r\n width: r,\r\n height: i\r\n })\r\n , s = t instanceof Float32Array ? ua.FLOAT : ua.UNSIGNED_BYTE;\r\n return new e(n,Object.assign(_f, o || {\r\n width: r,\r\n height: i,\r\n type: s\r\n }))\r\n }\r\n ,\r\n e.addToCache = function(t, e) {\r\n e && (-1 === t.textureCacheIds.indexOf(e) && t.textureCacheIds.push(e),\r\n Ka[e] && console.warn(\"BaseTexture added to the cache with an id [\" + e + \"] that already had an entry\"),\r\n Ka[e] = t)\r\n }\r\n ,\r\n e.removeFromCache = function(t) {\r\n if (\"string\" == typeof t) {\r\n var e = Ka[t];\r\n if (e) {\r\n var r = e.textureCacheIds.indexOf(t);\r\n return r > -1 && e.textureCacheIds.splice(r, 1),\r\n delete Ka[t],\r\n e\r\n }\r\n } else if (t && t.textureCacheIds) {\r\n for (var i = 0; i < t.textureCacheIds.length; ++i)\r\n delete Ka[t.textureCacheIds[i]];\r\n return t.textureCacheIds.length = 0,\r\n t\r\n }\r\n return null\r\n }\r\n ,\r\n e._globalBatch = 0,\r\n e\r\n }(rb.d)\r\n , bc = function(t) {\r\n function e(e, r) {\r\n var i = this\r\n , o = r || {}\r\n , n = o.width\r\n , s = o.height;\r\n (i = t.call(this, n, s) || this).items = [],\r\n i.itemDirtyIds = [];\r\n for (var a = 0; a < e; a++) {\r\n var u = new ia;\r\n i.items.push(u),\r\n i.itemDirtyIds.push(-2)\r\n }\r\n return i.length = e,\r\n i._load = null,\r\n i.baseTexture = null,\r\n i\r\n }\r\n return ba(e, t),\r\n e.prototype.initFromArray = function(t, e) {\r\n for (var r = 0; r < this.length; r++)\r\n t[r] && (t[r].castToBaseTexture ? this.addBaseTextureAt(t[r].castToBaseTexture(), r) : t[r]instanceof Wa ? this.addResourceAt(t[r], r) : this.addResourceAt(ac(t[r], e), r))\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n for (var t = 0, e = this.length; t < e; t++)\r\n this.items[t].destroy();\r\n this.items = null,\r\n this.itemDirtyIds = null,\r\n this._load = null\r\n }\r\n ,\r\n e.prototype.addResourceAt = function(t, e) {\r\n if (!this.items[e])\r\n throw new Error(\"Index \" + e + \" is out of bounds\");\r\n return t.valid && !this.valid && this.resize(t.width, t.height),\r\n this.items[e].setResource(t),\r\n this\r\n }\r\n ,\r\n e.prototype.bind = function(e) {\r\n if (null !== this.baseTexture)\r\n throw new Error(\"Only one base texture per TextureArray is allowed\");\r\n t.prototype.bind.call(this, e);\r\n for (var r = 0; r < this.length; r++)\r\n this.items[r].parentTextureArray = e,\r\n this.items[r].on(\"update\", e.update, e)\r\n }\r\n ,\r\n e.prototype.unbind = function(e) {\r\n t.prototype.unbind.call(this, e);\r\n for (var r = 0; r < this.length; r++)\r\n this.items[r].parentTextureArray = null,\r\n this.items[r].off(\"update\", e.update, e)\r\n }\r\n ,\r\n e.prototype.load = function() {\r\n var t = this;\r\n if (this._load)\r\n return this._load;\r\n var e = this.items.map(function(t) {\r\n return t.resource\r\n }).filter(function(t) {\r\n return t\r\n }).map(function(t) {\r\n return t.load()\r\n });\r\n return this._load = Promise.all(e).then(function() {\r\n var e = t.items[0]\r\n , r = e.realWidth\r\n , i = e.realHeight;\r\n return t.resize(r, i),\r\n Promise.resolve(t)\r\n }),\r\n this._load\r\n }\r\n ,\r\n e\r\n }(Wa)\r\n , md = function(t) {\r\n function e(e, r) {\r\n var i, o, n = this, s = r || {}, a = s.width, u = s.height;\r\n return Array.isArray(e) ? (i = e,\r\n o = e.length) : o = e,\r\n n = t.call(this, o, {\r\n width: a,\r\n height: u\r\n }) || this,\r\n i && n.initFromArray(i, r),\r\n n\r\n }\r\n return ba(e, t),\r\n e.prototype.addBaseTextureAt = function(t, e) {\r\n if (!t.resource)\r\n throw new Error(\"ArrayResource does not support RenderTexture\");\r\n return this.addResourceAt(t.resource, e),\r\n this\r\n }\r\n ,\r\n e.prototype.bind = function(e) {\r\n t.prototype.bind.call(this, e),\r\n e.target = Sa.TEXTURE_2D_ARRAY\r\n }\r\n ,\r\n e.prototype.upload = function(t, e, r) {\r\n var i = this.length\r\n , o = this.itemDirtyIds\r\n , n = this.items\r\n , s = t.gl;\r\n r.dirtyId < 0 && s.texImage3D(s.TEXTURE_2D_ARRAY, 0, e.format, this._width, this._height, i, 0, e.format, e.type, null);\r\n for (var a = 0; a < i; a++) {\r\n var u = n[a];\r\n o[a] < u.dirtyId && (o[a] = u.dirtyId,\r\n u.valid && s.texSubImage3D(s.TEXTURE_2D_ARRAY, 0, 0, 0, a, u.resource.width, u.resource.height, 1, e.format, e.type, u.resource.source))\r\n }\r\n return !0\r\n }\r\n ,\r\n e\r\n }(bc)\r\n , za = function(t) {\r\n function e(e) {\r\n var r = this\r\n , i = e\r\n , o = i.naturalWidth || i.videoWidth || i.width\r\n , n = i.naturalHeight || i.videoHeight || i.height;\r\n return (r = t.call(this, o, n) || this).source = e,\r\n r.noSubImage = !1,\r\n r\r\n }\r\n return ba(e, t),\r\n e.crossOrigin = function(t, e, r) {\r\n void 0 === r && 0 !== e.indexOf(\"data:\") ? t.crossOrigin = Qf(e) : !1 !== r && (t.crossOrigin = \"string\" == typeof r ? r : \"anonymous\")\r\n }\r\n ,\r\n e.prototype.upload = function(t, e, r, i) {\r\n var o = t.gl\r\n , n = e.realWidth\r\n , s = e.realHeight;\r\n return i = i || this.source,\r\n o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK),\r\n this.noSubImage || e.target !== o.TEXTURE_2D || r.width !== n || r.height !== s ? (r.width = n,\r\n r.height = s,\r\n o.texImage2D(e.target, 0, e.format, e.format, e.type, i)) : o.texSubImage2D(o.TEXTURE_2D, 0, 0, 0, e.format, e.type, i),\r\n !0\r\n }\r\n ,\r\n e.prototype.update = function() {\r\n if (!this.destroyed) {\r\n var e = this.source\r\n , r = e.naturalWidth || e.videoWidth || e.width\r\n , i = e.naturalHeight || e.videoHeight || e.height;\r\n this.resize(r, i),\r\n t.prototype.update.call(this)\r\n }\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this.source = null\r\n }\r\n ,\r\n e\r\n }(Wa)\r\n , cc = function(t) {\r\n function e(e) {\r\n return t.call(this, e) || this\r\n }\r\n return ba(e, t),\r\n e.test = function(t) {\r\n var e = self.OffscreenCanvas;\r\n return !!(e && t instanceof e) || self.HTMLCanvasElement && t instanceof HTMLCanvasElement\r\n }\r\n ,\r\n e\r\n }(za)\r\n , nd = function(t) {\r\n function e(r, i) {\r\n var o = this\r\n , n = i || {}\r\n , s = n.width\r\n , a = n.height\r\n , u = n.autoLoad\r\n , h = n.linkBaseTexture;\r\n if (r && r.length !== e.SIDES)\r\n throw new Error(\"Invalid length. Got \" + r.length + \", expected 6\");\r\n o = t.call(this, 6, {\r\n width: s,\r\n height: a\r\n }) || this;\r\n for (var $ = 0; $ < e.SIDES; $++)\r\n o.items[$].target = Sa.TEXTURE_CUBE_MAP_POSITIVE_X + $;\r\n return o.linkBaseTexture = !1 !== h,\r\n r && o.initFromArray(r, i),\r\n !1 !== u && o.load(),\r\n o\r\n }\r\n return ba(e, t),\r\n e.prototype.bind = function(e) {\r\n t.prototype.bind.call(this, e),\r\n e.target = Sa.TEXTURE_CUBE_MAP\r\n }\r\n ,\r\n e.prototype.addBaseTextureAt = function(t, e, r) {\r\n if (void 0 === r && (r = this.linkBaseTexture),\r\n !this.items[e])\r\n throw new Error(\"Index \" + e + \" is out of bounds\");\r\n if (!this.linkBaseTexture || t.parentTextureArray || Object.keys(t._glTextures).length > 0) {\r\n if (!t.resource)\r\n throw new Error(\"CubeResource does not support copying of renderTexture.\");\r\n this.addResourceAt(t.resource, e)\r\n } else\r\n t.target = Sa.TEXTURE_CUBE_MAP_POSITIVE_X + e,\r\n t.parentTextureArray = this.baseTexture,\r\n this.items[e] = t;\r\n return t.valid && !this.valid && this.resize(t.realWidth, t.realHeight),\r\n this.items[e] = t,\r\n this\r\n }\r\n ,\r\n e.prototype.upload = function(t, r, i) {\r\n for (var o = this.itemDirtyIds, n = 0; n < e.SIDES; n++) {\r\n var s = this.items[n];\r\n o[n] < s.dirtyId && (s.valid && s.resource ? (s.resource.upload(t, s, i),\r\n o[n] = s.dirtyId) : o[n] < -1 && (t.gl.texImage2D(s.target, 0, i.internalFormat, r.realWidth, r.realHeight, 0, r.format, i.type, null),\r\n o[n] = -1))\r\n }\r\n return !0\r\n }\r\n ,\r\n e.test = function(t) {\r\n return Array.isArray(t) && t.length === e.SIDES\r\n }\r\n ,\r\n e.SIDES = 6,\r\n e\r\n }(bc)\r\n , dc = function(t) {\r\n function e(e, r) {\r\n var i = this;\r\n if (r = r || {},\r\n !(e instanceof HTMLImageElement)) {\r\n var o = new Image;\r\n za.crossOrigin(o, e, r.crossorigin),\r\n o.src = e,\r\n e = o\r\n }\r\n return i = t.call(this, e) || this,\r\n !e.complete && i._width && i._height && (i._width = 0,\r\n i._height = 0),\r\n i.url = e.src,\r\n i._process = null,\r\n i.preserveBitmap = !1,\r\n i.createBitmap = (void 0 !== r.createBitmap ? r.createBitmap : aa.CREATE_IMAGE_BITMAP) && !!self.createImageBitmap,\r\n i.alphaMode = \"number\" == typeof r.alphaMode ? r.alphaMode : null,\r\n i.bitmap = null,\r\n i._load = null,\r\n !1 !== r.autoLoad && i.load(),\r\n i\r\n }\r\n return ba(e, t),\r\n e.prototype.load = function(t) {\r\n var e = this;\r\n return this._load ? this._load : (void 0 !== t && (this.createBitmap = t),\r\n this._load = new Promise(function(t, r) {\r\n var i = e.source;\r\n e.url = i.src;\r\n var o = function() {\r\n e.destroyed || (i.onload = null,\r\n i.onerror = null,\r\n e.resize(i.width, i.height),\r\n e._load = null,\r\n e.createBitmap ? t(e.process()) : t(e))\r\n };\r\n i.complete && i.src ? o() : (i.onload = o,\r\n i.onerror = function(t) {\r\n r(t),\r\n e.onError.emit(t)\r\n }\r\n )\r\n }\r\n ),\r\n this._load)\r\n }\r\n ,\r\n e.prototype.process = function() {\r\n var t = this\r\n , e = this.source;\r\n return null !== this._process ? this._process : null === this.bitmap && self.createImageBitmap ? (this._process = self.createImageBitmap(e, 0, 0, e.width, e.height, {\r\n premultiplyAlpha: this.alphaMode === Ia.UNPACK ? \"premultiply\" : \"none\"\r\n }).then(function(e) {\r\n return t.destroyed ? Promise.reject() : (t.bitmap = e,\r\n t.update(),\r\n t._process = null,\r\n Promise.resolve(t))\r\n }),\r\n this._process) : Promise.resolve(this)\r\n }\r\n ,\r\n e.prototype.upload = function(e, r, i) {\r\n if (\"number\" == typeof this.alphaMode && (r.alphaMode = this.alphaMode),\r\n !this.createBitmap)\r\n return t.prototype.upload.call(this, e, r, i);\r\n if (!this.bitmap && (this.process(),\r\n !this.bitmap))\r\n return !1;\r\n if (t.prototype.upload.call(this, e, r, i, this.bitmap),\r\n !this.preserveBitmap) {\r\n var o = !0\r\n , n = r._glTextures;\r\n for (var s in n) {\r\n var a = n[s];\r\n if (a !== i && a.dirtyId !== r.dirtyId) {\r\n o = !1;\r\n break\r\n }\r\n }\r\n o && (this.bitmap.close && this.bitmap.close(),\r\n this.bitmap = null)\r\n }\r\n return !0\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this.source.onload = null,\r\n this.source.onerror = null,\r\n t.prototype.dispose.call(this),\r\n this.bitmap && (this.bitmap.close(),\r\n this.bitmap = null),\r\n this._process = null,\r\n this._load = null\r\n }\r\n ,\r\n e.test = function(t) {\r\n return \"string\" == typeof t || t instanceof HTMLImageElement\r\n }\r\n ,\r\n e\r\n }(za)\r\n , od = function(t) {\r\n function e(e, r) {\r\n var i = this;\r\n return r = r || {},\r\n (i = t.call(this, document.createElement(\"canvas\")) || this)._width = 0,\r\n i._height = 0,\r\n i.svg = e,\r\n i.scale = r.scale || 1,\r\n i._overrideWidth = r.width,\r\n i._overrideHeight = r.height,\r\n i._resolve = null,\r\n i._crossorigin = r.crossorigin,\r\n i._load = null,\r\n !1 !== r.autoLoad && i.load(),\r\n i\r\n }\r\n return ba(e, t),\r\n e.prototype.load = function() {\r\n var t = this;\r\n return this._load ? this._load : (this._load = new Promise(function(e) {\r\n if (t._resolve = function() {\r\n t.resize(t.source.width, t.source.height),\r\n e(t)\r\n }\r\n ,\r\n /^\\]*(?:\\s(width|height)=('|\")(\\d*(?:\\.\\d+)?)(?:px)?('|\"))[^>]*(?:\\s(width|height)=('|\")(\\d*(?:\\.\\d+)?)(?:px)?('|\"))[^>]*>/i,\r\n e\r\n }(za)\r\n , pd = function(t) {\r\n function e(r, i) {\r\n var o = this;\r\n if (i = i || {},\r\n !(r instanceof HTMLVideoElement)) {\r\n var n = document.createElement(\"video\");\r\n n.setAttribute(\"preload\", \"auto\"),\r\n n.setAttribute(\"webkit-playsinline\", \"\"),\r\n n.setAttribute(\"playsinline\", \"\"),\r\n \"string\" == typeof r && (r = [r]);\r\n var s = r[0].src || r[0];\r\n za.crossOrigin(n, s, i.crossorigin);\r\n for (var a = 0; a < r.length; ++a) {\r\n var u = document.createElement(\"source\")\r\n , h = r[a]\r\n , $ = h.src\r\n , p = h.mime\r\n , l = ($ = $ || r[a]).split(\"?\").shift().toLowerCase()\r\n , c = l.substr(l.lastIndexOf(\".\") + 1);\r\n p = p || e.MIME_TYPES[c] || \"video/\" + c,\r\n u.src = $,\r\n u.type = p,\r\n n.appendChild(u)\r\n }\r\n r = n\r\n }\r\n return (o = t.call(this, r) || this).noSubImage = !0,\r\n o._autoUpdate = !0,\r\n o._isConnectedToTicker = !1,\r\n o._updateFPS = i.updateFPS || 0,\r\n o._msToNextUpdate = 0,\r\n o.autoPlay = !1 !== i.autoPlay,\r\n o._load = null,\r\n o._resolve = null,\r\n o._onCanPlay = o._onCanPlay.bind(o),\r\n o._onError = o._onError.bind(o),\r\n !1 !== i.autoLoad && o.load(),\r\n o\r\n }\r\n return ba(e, t),\r\n e.prototype.update = function(e) {\r\n if (!this.destroyed) {\r\n var r = Ea.shared.elapsedMS * this.source.playbackRate;\r\n this._msToNextUpdate = Math.floor(this._msToNextUpdate - r),\r\n (!this._updateFPS || this._msToNextUpdate <= 0) && (t.prototype.update.call(this),\r\n this._msToNextUpdate = this._updateFPS ? Math.floor(1e3 / this._updateFPS) : 0)\r\n }\r\n }\r\n ,\r\n e.prototype.load = function() {\r\n var t = this;\r\n if (this._load)\r\n return this._load;\r\n var e = this.source;\r\n return (e.readyState === e.HAVE_ENOUGH_DATA || e.readyState === e.HAVE_FUTURE_DATA) && e.width && e.height && (e.complete = !0),\r\n e.addEventListener(\"play\", this._onPlayStart.bind(this)),\r\n e.addEventListener(\"pause\", this._onPlayStop.bind(this)),\r\n this._isSourceReady() ? this._onCanPlay() : (e.addEventListener(\"canplay\", this._onCanPlay),\r\n e.addEventListener(\"canplaythrough\", this._onCanPlay),\r\n e.addEventListener(\"error\", this._onError, !0)),\r\n this._load = new Promise(function(r) {\r\n t.valid ? r(t) : (t._resolve = r,\r\n e.load())\r\n }\r\n ),\r\n this._load\r\n }\r\n ,\r\n e.prototype._onError = function(t) {\r\n this.source.removeEventListener(\"error\", this._onError, !0),\r\n this.onError.emit(t)\r\n }\r\n ,\r\n e.prototype._isSourcePlaying = function() {\r\n var t = this.source;\r\n return t.currentTime > 0 && !1 === t.paused && !1 === t.ended && t.readyState > 2\r\n }\r\n ,\r\n e.prototype._isSourceReady = function() {\r\n var t = this.source;\r\n return 3 === t.readyState || 4 === t.readyState\r\n }\r\n ,\r\n e.prototype._onPlayStart = function() {\r\n this.valid || this._onCanPlay(),\r\n this.autoUpdate && !this._isConnectedToTicker && (Ea.shared.add(this.update, this),\r\n this._isConnectedToTicker = !0)\r\n }\r\n ,\r\n e.prototype._onPlayStop = function() {\r\n this._isConnectedToTicker && (Ea.shared.remove(this.update, this),\r\n this._isConnectedToTicker = !1)\r\n }\r\n ,\r\n e.prototype._onCanPlay = function() {\r\n var t = this.source;\r\n t.removeEventListener(\"canplay\", this._onCanPlay),\r\n t.removeEventListener(\"canplaythrough\", this._onCanPlay);\r\n var e = this.valid;\r\n this.resize(t.videoWidth, t.videoHeight),\r\n !e && this._resolve && (this._resolve(this),\r\n this._resolve = null),\r\n this._isSourcePlaying() ? this._onPlayStart() : this.autoPlay && t.play()\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this._isConnectedToTicker && Ea.shared.remove(this.update, this);\r\n var e = this.source;\r\n e && (e.removeEventListener(\"error\", this._onError, !0),\r\n e.pause(),\r\n e.src = \"\",\r\n e.load()),\r\n t.prototype.dispose.call(this)\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"autoUpdate\", {\r\n get: function() {\r\n return this._autoUpdate\r\n },\r\n set: function(t) {\r\n t !== this._autoUpdate && (this._autoUpdate = t,\r\n !this._autoUpdate && this._isConnectedToTicker ? (Ea.shared.remove(this.update, this),\r\n this._isConnectedToTicker = !1) : this._autoUpdate && !this._isConnectedToTicker && this._isSourcePlaying() && (Ea.shared.add(this.update, this),\r\n this._isConnectedToTicker = !0))\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"updateFPS\", {\r\n get: function() {\r\n return this._updateFPS\r\n },\r\n set: function(t) {\r\n t !== this._updateFPS && (this._updateFPS = t)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.test = function(t, r) {\r\n return self.HTMLVideoElement && t instanceof HTMLVideoElement || e.TYPES.indexOf(r) > -1\r\n }\r\n ,\r\n e.TYPES = [\"mp4\", \"m4v\", \"webm\", \"ogg\", \"ogv\", \"h264\", \"avi\", \"mov\"],\r\n e.MIME_TYPES = {\r\n ogv: \"video/ogg\",\r\n mov: \"video/quicktime\",\r\n m4v: \"video/mp4\"\r\n },\r\n e\r\n }(za)\r\n , qd = function(t) {\r\n function e(e) {\r\n return t.call(this, e) || this\r\n }\r\n return ba(e, t),\r\n e.test = function(t) {\r\n return !!self.createImageBitmap && t instanceof ImageBitmap\r\n }\r\n ,\r\n e\r\n }(za);\r\n zb.push(dc, qd, cc, pd, od, Ab, nd, md);\r\n var rd = {\r\n __proto__: null,\r\n Resource: Wa,\r\n BaseImageResource: za,\r\n INSTALLED: zb,\r\n autoDetectResource: ac,\r\n AbstractMultiResource: bc,\r\n ArrayResource: md,\r\n BufferResource: Ab,\r\n CanvasResource: cc,\r\n CubeResource: nd,\r\n ImageResource: dc,\r\n SVGResource: od,\r\n VideoResource: pd,\r\n ImageBitmapResource: qd\r\n }\r\n , pa = function() {\r\n function t(t) {\r\n this.renderer = t\r\n }\r\n return t.prototype.destroy = function() {\r\n this.renderer = null\r\n }\r\n ,\r\n t\r\n }()\r\n , ag = function(t) {\r\n function e() {\r\n return null !== t && t.apply(this, arguments) || this\r\n }\r\n return ba(e, t),\r\n e.prototype.upload = function(t, e, r) {\r\n var i = t.gl;\r\n return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.alphaMode === Ia.UNPACK),\r\n r.width === e.width && r.height === e.height ? i.texSubImage2D(e.target, 0, 0, 0, e.width, e.height, e.format, e.type, this.data) : (r.width = e.width,\r\n r.height = e.height,\r\n i.texImage2D(e.target, 0, 1 === t.context.webGLVersion ? i.DEPTH_COMPONENT : i.DEPTH_COMPONENT16, e.width, e.height, 0, e.format, e.type, this.data)),\r\n !0\r\n }\r\n ,\r\n e\r\n }(Ab)\r\n , ec = function() {\r\n function t(t, e) {\r\n this.width = Math.ceil(t || 100),\r\n this.height = Math.ceil(e || 100),\r\n this.stencil = !1,\r\n this.depth = !1,\r\n this.dirtyId = 0,\r\n this.dirtyFormat = 0,\r\n this.dirtySize = 0,\r\n this.depthTexture = null,\r\n this.colorTextures = [],\r\n this.glFramebuffers = {},\r\n this.disposeRunner = new ka(\"disposeFramebuffer\"),\r\n this.multisample = _a.NONE\r\n }\r\n return Object.defineProperty(t.prototype, \"colorTexture\", {\r\n get: function() {\r\n return this.colorTextures[0]\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.addColorTexture = function(t, e) {\r\n return void 0 === t && (t = 0),\r\n this.colorTextures[t] = e || new ia(null,{\r\n scaleMode: Ca.NEAREST,\r\n resolution: 1,\r\n mipmap: $a.OFF,\r\n width: this.width,\r\n height: this.height\r\n }),\r\n this.dirtyId++,\r\n this.dirtyFormat++,\r\n this\r\n }\r\n ,\r\n t.prototype.addDepthTexture = function(t) {\r\n return this.depthTexture = t || new ia(new ag(null,{\r\n width: this.width,\r\n height: this.height\r\n }),{\r\n scaleMode: Ca.NEAREST,\r\n resolution: 1,\r\n width: this.width,\r\n height: this.height,\r\n mipmap: $a.OFF,\r\n format: kb.DEPTH_COMPONENT,\r\n type: ua.UNSIGNED_SHORT\r\n }),\r\n this.dirtyId++,\r\n this.dirtyFormat++,\r\n this\r\n }\r\n ,\r\n t.prototype.enableDepth = function() {\r\n return this.depth = !0,\r\n this.dirtyId++,\r\n this.dirtyFormat++,\r\n this\r\n }\r\n ,\r\n t.prototype.enableStencil = function() {\r\n return this.stencil = !0,\r\n this.dirtyId++,\r\n this.dirtyFormat++,\r\n this\r\n }\r\n ,\r\n t.prototype.resize = function(t, e) {\r\n if (t = Math.ceil(t),\r\n e = Math.ceil(e),\r\n t !== this.width || e !== this.height) {\r\n this.width = t,\r\n this.height = e,\r\n this.dirtyId++,\r\n this.dirtySize++;\r\n for (var r = 0; r < this.colorTextures.length; r++) {\r\n var i = this.colorTextures[r]\r\n , o = i.resolution;\r\n i.setSize(t / o, e / o)\r\n }\r\n if (this.depthTexture) {\r\n o = this.depthTexture.resolution;\r\n this.depthTexture.setSize(t / o, e / o)\r\n }\r\n }\r\n }\r\n ,\r\n t.prototype.dispose = function() {\r\n this.disposeRunner.emit(this, !1)\r\n }\r\n ,\r\n t.prototype.destroyDepthTexture = function() {\r\n this.depthTexture && (this.depthTexture.destroy(),\r\n this.depthTexture = null,\r\n ++this.dirtyId,\r\n ++this.dirtyFormat)\r\n }\r\n ,\r\n t\r\n }()\r\n , sd = function(t) {\r\n function e(e) {\r\n var r = this;\r\n \"number\" == typeof e && (e = {\r\n width: arguments[0],\r\n height: arguments[1],\r\n scaleMode: arguments[2],\r\n resolution: arguments[3]\r\n });\r\n r = t.call(this, null, e) || this;\r\n var i = e || {}\r\n , o = i.width\r\n , n = i.height;\r\n return r.mipmap = 0,\r\n r.width = Math.ceil(o) || 100,\r\n r.height = Math.ceil(n) || 100,\r\n r.valid = !0,\r\n r.clearColor = [0, 0, 0, 0],\r\n r.framebuffer = new ec(r.width * r.resolution,r.height * r.resolution).addColorTexture(0, r),\r\n r.maskStack = [],\r\n r.filterStack = [{}],\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.resize = function(t, e) {\r\n t = Math.ceil(t),\r\n e = Math.ceil(e),\r\n this.framebuffer.resize(t * this.resolution, e * this.resolution)\r\n }\r\n ,\r\n e.prototype.dispose = function() {\r\n this.framebuffer.dispose(),\r\n t.prototype.dispose.call(this)\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n t.prototype.destroy.call(this),\r\n this.framebuffer.destroyDepthTexture(),\r\n this.framebuffer = null\r\n }\r\n ,\r\n e\r\n }(ia)\r\n , td = function() {\r\n function t() {\r\n this.x0 = 0,\r\n this.y0 = 0,\r\n this.x1 = 1,\r\n this.y1 = 0,\r\n this.x2 = 1,\r\n this.y2 = 1,\r\n this.x3 = 0,\r\n this.y3 = 1,\r\n this.uvsFloat32 = new Float32Array(8)\r\n }\r\n return t.prototype.set = function(t, e, r) {\r\n var i = e.width\r\n , o = e.height;\r\n if (r) {\r\n var n = t.width / 2 / i\r\n , s = t.height / 2 / o\r\n , a = t.x / i + n\r\n , u = t.y / o + s;\r\n r = ea.add(r, ea.NW),\r\n this.x0 = a + n * ea.uX(r),\r\n this.y0 = u + s * ea.uY(r),\r\n r = ea.add(r, 2),\r\n this.x1 = a + n * ea.uX(r),\r\n this.y1 = u + s * ea.uY(r),\r\n r = ea.add(r, 2),\r\n this.x2 = a + n * ea.uX(r),\r\n this.y2 = u + s * ea.uY(r),\r\n r = ea.add(r, 2),\r\n this.x3 = a + n * ea.uX(r),\r\n this.y3 = u + s * ea.uY(r)\r\n } else\r\n this.x0 = t.x / i,\r\n this.y0 = t.y / o,\r\n this.x1 = (t.x + t.width) / i,\r\n this.y1 = t.y / o,\r\n this.x2 = (t.x + t.width) / i,\r\n this.y2 = (t.y + t.height) / o,\r\n this.x3 = t.x / i,\r\n this.y3 = (t.y + t.height) / o;\r\n this.uvsFloat32[0] = this.x0,\r\n this.uvsFloat32[1] = this.y0,\r\n this.uvsFloat32[2] = this.x1,\r\n this.uvsFloat32[3] = this.y1,\r\n this.uvsFloat32[4] = this.x2,\r\n this.uvsFloat32[5] = this.y2,\r\n this.uvsFloat32[6] = this.x3,\r\n this.uvsFloat32[7] = this.y3\r\n }\r\n ,\r\n t.prototype.toString = function() {\r\n return \"[@pixi/core:TextureUvs x0=\" + this.x0 + \" y0=\" + this.y0 + \" x1=\" + this.x1 + \" y1=\" + this.y1 + \" x2=\" + this.x2 + \" y2=\" + this.y2 + \" x3=\" + this.x3 + \" y3=\" + this.y3 + \"]\"\r\n }\r\n ,\r\n t\r\n }()\r\n , ud = new td\r\n , oa = function(t) {\r\n function e(r, i, o, n, s, a) {\r\n var u = t.call(this) || this;\r\n if (u.noFrame = !1,\r\n i || (u.noFrame = !0,\r\n i = new da(0,0,1,1)),\r\n r instanceof e && (r = r.baseTexture),\r\n u.baseTexture = r,\r\n u._frame = i,\r\n u.trim = n,\r\n u.valid = !1,\r\n u._uvs = ud,\r\n u.uvMatrix = null,\r\n u.orig = o || i,\r\n u._rotate = Number(s || 0),\r\n !0 === s)\r\n u._rotate = 2;\r\n else if (u._rotate % 2 != 0)\r\n throw new Error(\"attempt to use diamond-shaped UVs. If you are sure, set rotation manually\");\r\n return u.defaultAnchor = a ? new ra(a.x,a.y) : new ra(0,0),\r\n u._updateID = 0,\r\n u.textureCacheIds = [],\r\n r.valid ? u.noFrame ? r.valid && u.onBaseTextureUpdated(r) : u.frame = i : r.once(\"loaded\", u.onBaseTextureUpdated, u),\r\n u.noFrame && r.on(\"update\", u.onBaseTextureUpdated, u),\r\n u\r\n }\r\n return ba(e, t),\r\n e.prototype.update = function() {\r\n this.baseTexture.resource && this.baseTexture.resource.update()\r\n }\r\n ,\r\n e.prototype.onBaseTextureUpdated = function(t) {\r\n if (this.noFrame) {\r\n if (!this.baseTexture.valid)\r\n return;\r\n this._frame.width = t.width,\r\n this._frame.height = t.height,\r\n this.valid = !0,\r\n this.updateUvs()\r\n } else\r\n this.frame = this._frame;\r\n this.emit(\"update\", this)\r\n }\r\n ,\r\n e.prototype.destroy = function(t) {\r\n if (this.baseTexture) {\r\n if (t) {\r\n var r = this.baseTexture.resource;\r\n r && r.url && ya[r.url] && e.removeFromCache(r.url),\r\n this.baseTexture.destroy()\r\n }\r\n this.baseTexture.off(\"loaded\", this.onBaseTextureUpdated, this),\r\n this.baseTexture.off(\"update\", this.onBaseTextureUpdated, this),\r\n this.baseTexture = null\r\n }\r\n this._frame = null,\r\n this._uvs = null,\r\n this.trim = null,\r\n this.orig = null,\r\n this.valid = !1,\r\n e.removeFromCache(this),\r\n this.textureCacheIds = null\r\n }\r\n ,\r\n e.prototype.clone = function() {\r\n return new e(this.baseTexture,this.frame.clone(),this.orig.clone(),this.trim && this.trim.clone(),this.rotate,this.defaultAnchor)\r\n }\r\n ,\r\n e.prototype.updateUvs = function() {\r\n this._uvs === ud && (this._uvs = new td),\r\n this._uvs.set(this._frame, this.baseTexture, this.rotate),\r\n this._updateID++\r\n }\r\n ,\r\n e.from = function(t, r, i) {\r\n void 0 === r && (r = {}),\r\n void 0 === i && (i = aa.STRICT_TEXTURE_CACHE);\r\n var o = \"string\" == typeof t\r\n , n = null;\r\n if (o)\r\n n = t;\r\n else {\r\n if (!t._pixiId) {\r\n var s = r && r.pixiIdPrefix || \"pixiid\";\r\n t._pixiId = s + \"_\" + ub()\r\n }\r\n n = t._pixiId\r\n }\r\n var a = ya[n];\r\n if (o && i && !a)\r\n throw new Error(\"The cacheId \\\"\" + n + \"\\\" does not exist in TextureCache.\");\r\n return a || (r.resolution || (r.resolution = kd(t)),\r\n (a = new e(new ia(t,r))).baseTexture.cacheId = n,\r\n ia.addToCache(a.baseTexture, n),\r\n e.addToCache(a, n)),\r\n a\r\n }\r\n ,\r\n e.fromURL = function(t, r) {\r\n var i = Object.assign({\r\n autoLoad: !1\r\n }, null == r ? void 0 : r.resourceOptions)\r\n , o = e.from(t, Object.assign({\r\n resourceOptions: i\r\n }, r), !1)\r\n , n = o.baseTexture.resource;\r\n return o.baseTexture.valid ? Promise.resolve(o) : n.load().then(function() {\r\n return Promise.resolve(o)\r\n })\r\n }\r\n ,\r\n e.fromBuffer = function(t, r, i, o) {\r\n return new e(ia.fromBuffer(t, r, i, o))\r\n }\r\n ,\r\n e.fromLoader = function(t, r, i, o) {\r\n var n = new ia(t,Object.assign({\r\n scaleMode: aa.SCALE_MODE,\r\n resolution: kd(r)\r\n }, o))\r\n , s = n.resource;\r\n s instanceof dc && (s.url = r);\r\n var a = new e(n);\r\n return i || (i = r),\r\n ia.addToCache(a.baseTexture, i),\r\n e.addToCache(a, i),\r\n i !== r && (ia.addToCache(a.baseTexture, r),\r\n e.addToCache(a, r)),\r\n a.baseTexture.valid ? Promise.resolve(a) : new Promise(function(t) {\r\n a.baseTexture.once(\"loaded\", function() {\r\n return t(a)\r\n })\r\n }\r\n )\r\n }\r\n ,\r\n e.addToCache = function(t, e) {\r\n e && (-1 === t.textureCacheIds.indexOf(e) && t.textureCacheIds.push(e),\r\n ya[e] && console.warn(\"Texture added to the cache with an id [\" + e + \"] that already had an entry\"),\r\n ya[e] = t)\r\n }\r\n ,\r\n e.removeFromCache = function(t) {\r\n if (\"string\" == typeof t) {\r\n var e = ya[t];\r\n if (e) {\r\n var r = e.textureCacheIds.indexOf(t);\r\n return r > -1 && e.textureCacheIds.splice(r, 1),\r\n delete ya[t],\r\n e\r\n }\r\n } else if (t && t.textureCacheIds) {\r\n for (var i = 0; i < t.textureCacheIds.length; ++i)\r\n ya[t.textureCacheIds[i]] === t && delete ya[t.textureCacheIds[i]];\r\n return t.textureCacheIds.length = 0,\r\n t\r\n }\r\n return null\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"resolution\", {\r\n get: function() {\r\n return this.baseTexture.resolution\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"frame\", {\r\n get: function() {\r\n return this._frame\r\n },\r\n set: function(t) {\r\n this._frame = t,\r\n this.noFrame = !1;\r\n var e = t.x\r\n , r = t.y\r\n , i = t.width\r\n , o = t.height\r\n , n = e + i > this.baseTexture.width\r\n , s = r + o > this.baseTexture.height;\r\n if (n || s) {\r\n var a = n && s ? \"and\" : \"or\"\r\n , u = \"X: \" + e + \" + \" + i + \" = \" + (e + i) + \" > \" + this.baseTexture.width\r\n , h = \"Y: \" + r + \" + \" + o + \" = \" + (r + o) + \" > \" + this.baseTexture.height;\r\n throw new Error(\"Texture Error: frame does not fit inside the base Texture dimensions: \" + u + \" \" + a + \" \" + h)\r\n }\r\n this.valid = i && o && this.baseTexture.valid,\r\n this.trim || this.rotate || (this.orig = t),\r\n this.valid && this.updateUvs()\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"rotate\", {\r\n get: function() {\r\n return this._rotate\r\n },\r\n set: function(t) {\r\n this._rotate = t,\r\n this.valid && this.updateUvs()\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"width\", {\r\n get: function() {\r\n return this.orig.width\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"height\", {\r\n get: function() {\r\n return this.orig.height\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.castToBaseTexture = function() {\r\n return this.baseTexture\r\n }\r\n ,\r\n e\r\n }(rb.d);\r\n function bg() {\r\n var t = document.createElement(\"canvas\");\r\n t.width = 16,\r\n t.height = 16;\r\n var e = t.getContext(\"2d\");\r\n return e.fillStyle = \"white\",\r\n e.fillRect(0, 0, 16, 16),\r\n new oa(new ia(new cc(t)))\r\n }\r\n function Bb(t) {\r\n t.destroy = function() {}\r\n ,\r\n t.on = function() {}\r\n ,\r\n t.once = function() {}\r\n ,\r\n t.emit = function() {}\r\n }\r\n oa.EMPTY = new oa(new ia()),\r\n Bb(oa.EMPTY),\r\n Bb(oa.EMPTY.baseTexture),\r\n oa.WHITE = bg(),\r\n Bb(oa.WHITE),\r\n Bb(oa.WHITE.baseTexture);\r\n var fc = function(t) {\r\n function e(e, r) {\r\n var i = t.call(this, e, r) || this;\r\n return i.valid = !0,\r\n i.filterFrame = null,\r\n i.filterPoolKey = null,\r\n i.updateUvs(),\r\n i\r\n }\r\n return ba(e, t),\r\n Object.defineProperty(e.prototype, \"framebuffer\", {\r\n get: function() {\r\n return this.baseTexture.framebuffer\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.resize = function(t, e, r) {\r\n void 0 === r && (r = !0),\r\n t = Math.ceil(t),\r\n e = Math.ceil(e),\r\n this.valid = t > 0 && e > 0,\r\n this._frame.width = this.orig.width = t,\r\n this._frame.height = this.orig.height = e,\r\n r && this.baseTexture.resize(t, e),\r\n this.updateUvs()\r\n }\r\n ,\r\n e.prototype.setResolution = function(t) {\r\n var e = this.baseTexture;\r\n e.resolution !== t && (e.setResolution(t),\r\n this.resize(e.width, e.height, !1))\r\n }\r\n ,\r\n e.create = function(t) {\r\n for (var r = arguments, i = [], o = 1; o < arguments.length; o++)\r\n i[o - 1] = r[o];\r\n return \"number\" == typeof t && (Va(\"6.0.0\", \"Arguments (width, height, scaleMode, resolution) have been deprecated.\"),\r\n t = {\r\n width: t,\r\n height: i[0],\r\n scaleMode: i[1],\r\n resolution: i[2]\r\n }),\r\n new e(new sd(t))\r\n }\r\n ,\r\n e\r\n }(oa)\r\n , cg = function() {\r\n function t(t) {\r\n this.texturePool = {},\r\n this.textureOptions = t || {},\r\n this.enableFullScreen = !1,\r\n this._pixelsWidth = 0,\r\n this._pixelsHeight = 0\r\n }\r\n return t.prototype.createTexture = function(t, e) {\r\n var r = new sd(Object.assign({\r\n width: t,\r\n height: e,\r\n resolution: 1\r\n }, this.textureOptions));\r\n return new fc(r)\r\n }\r\n ,\r\n t.prototype.getOptimalTexture = function(e, r, i) {\r\n void 0 === i && (i = 1);\r\n var o = t.SCREEN_KEY;\r\n e *= i,\r\n r *= i,\r\n this.enableFullScreen && e === this._pixelsWidth && r === this._pixelsHeight || (o = (65535 & (e = sb(e))) << 16 | 65535 & (r = sb(r))),\r\n this.texturePool[o] || (this.texturePool[o] = []);\r\n var n = this.texturePool[o].pop();\r\n return n || (n = this.createTexture(e, r)),\r\n n.filterPoolKey = o,\r\n n.setResolution(i),\r\n n\r\n }\r\n ,\r\n t.prototype.getFilterTexture = function(t, e) {\r\n var r = this.getOptimalTexture(t.width, t.height, e || t.resolution);\r\n return r.filterFrame = t.filterFrame,\r\n r\r\n }\r\n ,\r\n t.prototype.returnTexture = function(t) {\r\n var e = t.filterPoolKey;\r\n t.filterFrame = null,\r\n this.texturePool[e].push(t)\r\n }\r\n ,\r\n t.prototype.returnFilterTexture = function(t) {\r\n this.returnTexture(t)\r\n }\r\n ,\r\n t.prototype.clear = function(t) {\r\n if (t = !1 !== t)\r\n for (var e in this.texturePool) {\r\n var r = this.texturePool[e];\r\n if (r)\r\n for (var i = 0; i < r.length; i++)\r\n r[i].destroy(!0)\r\n }\r\n this.texturePool = {}\r\n }\r\n ,\r\n t.prototype.setScreenSize = function(e) {\r\n if (e.width !== this._pixelsWidth || e.height !== this._pixelsHeight) {\r\n var r = t.SCREEN_KEY\r\n , i = this.texturePool[r];\r\n if (this.enableFullScreen = e.width > 0 && e.height > 0,\r\n i)\r\n for (var o = 0; o < i.length; o++)\r\n i[o].destroy(!0);\r\n this.texturePool[r] = [],\r\n this._pixelsWidth = e.width,\r\n this._pixelsHeight = e.height\r\n }\r\n }\r\n ,\r\n t.SCREEN_KEY = \"screen\",\r\n t\r\n }()\r\n , vd = function() {\r\n function t(t, e, r, i, o, n, s) {\r\n void 0 === e && (e = 0),\r\n void 0 === r && (r = !1),\r\n void 0 === i && (i = 5126),\r\n this.buffer = t,\r\n this.size = e,\r\n this.normalized = r,\r\n this.type = i,\r\n this.stride = o,\r\n this.start = n,\r\n this.instance = s\r\n }\r\n return t.prototype.destroy = function() {\r\n this.buffer = null\r\n }\r\n ,\r\n t.from = function(e, r, i, o, n) {\r\n return new t(e,r,i,o,n)\r\n }\r\n ,\r\n t\r\n }()\r\n , dg = 0\r\n , ta = function() {\r\n function t(t, e, r) {\r\n void 0 === e && (e = !0),\r\n void 0 === r && (r = !1),\r\n this.data = t || new Float32Array(1),\r\n this._glBuffers = {},\r\n this._updateID = 0,\r\n this.index = r,\r\n this.static = e,\r\n this.id = dg++,\r\n this.disposeRunner = new ka(\"disposeBuffer\")\r\n }\r\n return t.prototype.update = function(t) {\r\n this.data = t || this.data,\r\n this._updateID++\r\n }\r\n ,\r\n t.prototype.dispose = function() {\r\n this.disposeRunner.emit(this, !1)\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.dispose(),\r\n this.data = null\r\n }\r\n ,\r\n t.from = function(e) {\r\n return e instanceof Array && (e = new Float32Array(e)),\r\n new t(e)\r\n }\r\n ,\r\n t\r\n }();\r\n function wd(t) {\r\n if (4 === t.BYTES_PER_ELEMENT)\r\n return t instanceof Float32Array ? \"Float32Array\" : t instanceof Uint32Array ? \"Uint32Array\" : \"Int32Array\";\r\n if (2 === t.BYTES_PER_ELEMENT) {\r\n if (t instanceof Uint16Array)\r\n return \"Uint16Array\"\r\n } else if (1 === t.BYTES_PER_ELEMENT && t instanceof Uint8Array)\r\n return \"Uint8Array\";\r\n return null\r\n }\r\n var eg = {\r\n Float32Array: Float32Array,\r\n Uint32Array: Uint32Array,\r\n Int32Array: Int32Array,\r\n Uint8Array: Uint8Array\r\n };\r\n function fg(t, e) {\r\n for (var r = 0, i = 0, o = {}, n = 0; n < t.length; n++)\r\n i += e[n],\r\n r += t[n].length;\r\n var s = new ArrayBuffer(4 * r)\r\n , a = null\r\n , u = 0;\r\n for (n = 0; n < t.length; n++) {\r\n var h = e[n]\r\n , $ = t[n]\r\n , p = wd($);\r\n o[p] || (o[p] = new eg[p](s)),\r\n a = o[p];\r\n for (var l = 0; l < $.length; l++) {\r\n a[(l / h | 0) * i + u + l % h] = $[l]\r\n }\r\n u += h\r\n }\r\n return new Float32Array(s)\r\n }\r\n var xd = {\r\n 5126: 4,\r\n 5123: 2,\r\n 5121: 1\r\n }\r\n , gg = 0\r\n , hg = {\r\n Float32Array: Float32Array,\r\n Uint32Array: Uint32Array,\r\n Int32Array: Int32Array,\r\n Uint8Array: Uint8Array,\r\n Uint16Array: Uint16Array\r\n }\r\n , gc = function() {\r\n function t(t, e) {\r\n void 0 === t && (t = []),\r\n void 0 === e && (e = {}),\r\n this.buffers = t,\r\n this.indexBuffer = null,\r\n this.attributes = e,\r\n this.glVertexArrayObjects = {},\r\n this.id = gg++,\r\n this.instanced = !1,\r\n this.instanceCount = 1,\r\n this.disposeRunner = new ka(\"disposeGeometry\"),\r\n this.refCount = 0\r\n }\r\n return t.prototype.addAttribute = function(t, e, r, i, o, n, s, a) {\r\n if (void 0 === r && (r = 0),\r\n void 0 === i && (i = !1),\r\n void 0 === a && (a = !1),\r\n !e)\r\n throw new Error(\"You must pass a buffer when creating an attribute\");\r\n e instanceof ta || (e instanceof Array && (e = new Float32Array(e)),\r\n e = new ta(e));\r\n var u = t.split(\"|\");\r\n if (u.length > 1) {\r\n for (var h = 0; h < u.length; h++)\r\n this.addAttribute(u[h], e, r, i, o);\r\n return this\r\n }\r\n var $ = this.buffers.indexOf(e);\r\n return -1 === $ && (this.buffers.push(e),\r\n $ = this.buffers.length - 1),\r\n this.attributes[t] = new vd($,r,i,o,n,s,a),\r\n this.instanced = this.instanced || a,\r\n this\r\n }\r\n ,\r\n t.prototype.getAttribute = function(t) {\r\n return this.attributes[t]\r\n }\r\n ,\r\n t.prototype.getBuffer = function(t) {\r\n return this.buffers[this.getAttribute(t).buffer]\r\n }\r\n ,\r\n t.prototype.addIndex = function(t) {\r\n return t instanceof ta || (t instanceof Array && (t = new Uint16Array(t)),\r\n t = new ta(t)),\r\n t.index = !0,\r\n this.indexBuffer = t,\r\n -1 === this.buffers.indexOf(t) && this.buffers.push(t),\r\n this\r\n }\r\n ,\r\n t.prototype.getIndex = function() {\r\n return this.indexBuffer\r\n }\r\n ,\r\n t.prototype.interleave = function() {\r\n if (1 === this.buffers.length || 2 === this.buffers.length && this.indexBuffer)\r\n return this;\r\n var t, e = [], r = [], i = new ta;\r\n for (t in this.attributes) {\r\n var o = this.attributes[t]\r\n , n = this.buffers[o.buffer];\r\n e.push(n.data),\r\n r.push(o.size * xd[o.type] / 4),\r\n o.buffer = 0\r\n }\r\n for (i.data = fg(e, r),\r\n t = 0; t < this.buffers.length; t++)\r\n this.buffers[t] !== this.indexBuffer && this.buffers[t].destroy();\r\n return this.buffers = [i],\r\n this.indexBuffer && this.buffers.push(this.indexBuffer),\r\n this\r\n }\r\n ,\r\n t.prototype.getSize = function() {\r\n for (var t in this.attributes) {\r\n var e = this.attributes[t];\r\n return this.buffers[e.buffer].data.length / (e.stride / 4 || e.size)\r\n }\r\n return 0\r\n }\r\n ,\r\n t.prototype.dispose = function() {\r\n this.disposeRunner.emit(this, !1)\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.dispose(),\r\n this.buffers = null,\r\n this.indexBuffer = null,\r\n this.attributes = null\r\n }\r\n ,\r\n t.prototype.clone = function() {\r\n for (var e = new t, r = 0; r < this.buffers.length; r++)\r\n e.buffers[r] = new ta(this.buffers[r].data.slice(0));\r\n for (var r in this.attributes) {\r\n var i = this.attributes[r];\r\n e.attributes[r] = new vd(i.buffer,i.size,i.normalized,i.type,i.stride,i.start,i.instance)\r\n }\r\n return this.indexBuffer && (e.indexBuffer = e.buffers[this.buffers.indexOf(this.indexBuffer)],\r\n e.indexBuffer.index = !0),\r\n e\r\n }\r\n ,\r\n t.merge = function(e) {\r\n for (var r, i = new t, o = [], n = [], s = [], a = 0; a < e.length; a++) {\r\n r = e[a];\r\n for (var u = 0; u < r.buffers.length; u++)\r\n n[u] = n[u] || 0,\r\n n[u] += r.buffers[u].data.length,\r\n s[u] = 0\r\n }\r\n for (a = 0; a < r.buffers.length; a++)\r\n o[a] = new hg[wd(r.buffers[a].data)](n[a]),\r\n i.buffers[a] = new ta(o[a]);\r\n for (a = 0; a < e.length; a++) {\r\n r = e[a];\r\n for (u = 0; u < r.buffers.length; u++)\r\n o[u].set(r.buffers[u].data, s[u]),\r\n s[u] += r.buffers[u].data.length\r\n }\r\n if (i.attributes = r.attributes,\r\n r.indexBuffer) {\r\n i.indexBuffer = i.buffers[r.buffers.indexOf(r.indexBuffer)],\r\n i.indexBuffer.index = !0;\r\n var h = 0\r\n , $ = 0\r\n , p = 0\r\n , l = 0;\r\n for (a = 0; a < r.buffers.length; a++)\r\n if (r.buffers[a] !== r.indexBuffer) {\r\n l = a;\r\n break\r\n }\r\n for (var a in r.attributes) {\r\n var c = r.attributes[a];\r\n (0 | c.buffer) === l && ($ += c.size * xd[c.type] / 4)\r\n }\r\n for (a = 0; a < e.length; a++) {\r\n var d = e[a].indexBuffer.data;\r\n for (u = 0; u < d.length; u++)\r\n i.indexBuffer.data[u + p] += h;\r\n h += r.buffers[l].data.length / $,\r\n p += d.length\r\n }\r\n }\r\n return i\r\n }\r\n ,\r\n t\r\n }()\r\n , ig = function(t) {\r\n function e() {\r\n var e = t.call(this) || this;\r\n return e.addAttribute(\"aVertexPosition\", new Float32Array([0, 0, 1, 0, 1, 1, 0, 1])).addIndex([0, 1, 3, 2]),\r\n e\r\n }\r\n return ba(e, t),\r\n e\r\n }(gc)\r\n , jg = function(t) {\r\n function e() {\r\n var e = t.call(this) || this;\r\n return e.vertices = new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\r\n e.uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\r\n e.vertexBuffer = new ta(e.vertices),\r\n e.uvBuffer = new ta(e.uvs),\r\n e.addAttribute(\"aVertexPosition\", e.vertexBuffer).addAttribute(\"aTextureCoord\", e.uvBuffer).addIndex([0, 1, 2, 0, 2, 3]),\r\n e\r\n }\r\n return ba(e, t),\r\n e.prototype.map = function(t, e) {\r\n var r = 0\r\n , i = 0;\r\n return this.uvs[0] = r,\r\n this.uvs[1] = i,\r\n this.uvs[2] = r + e.width / t.width,\r\n this.uvs[3] = i,\r\n this.uvs[4] = r + e.width / t.width,\r\n this.uvs[5] = i + e.height / t.height,\r\n this.uvs[6] = r,\r\n this.uvs[7] = i + e.height / t.height,\r\n r = e.x,\r\n i = e.y,\r\n this.vertices[0] = r,\r\n this.vertices[1] = i,\r\n this.vertices[2] = r + e.width,\r\n this.vertices[3] = i,\r\n this.vertices[4] = r + e.width,\r\n this.vertices[5] = i + e.height,\r\n this.vertices[6] = r,\r\n this.vertices[7] = i + e.height,\r\n this.invalidate(),\r\n this\r\n }\r\n ,\r\n e.prototype.invalidate = function() {\r\n return this.vertexBuffer._updateID++,\r\n this.uvBuffer._updateID++,\r\n this\r\n }\r\n ,\r\n e\r\n }(gc)\r\n , kg = 0\r\n , Pa = function() {\r\n function t(t, e) {\r\n this.uniforms = t,\r\n this.group = !0,\r\n this.syncUniforms = {},\r\n this.dirtyId = 0,\r\n this.id = kg++,\r\n this.static = !!e\r\n }\r\n return t.prototype.update = function() {\r\n this.dirtyId++\r\n }\r\n ,\r\n t.prototype.add = function(e, r, i) {\r\n this.uniforms[e] = new t(r,i)\r\n }\r\n ,\r\n t.from = function(e, r) {\r\n return new t(e,r)\r\n }\r\n ,\r\n t\r\n }()\r\n , lg = function() {\r\n function t() {\r\n this.renderTexture = null,\r\n this.target = null,\r\n this.legacy = !1,\r\n this.resolution = 1,\r\n this.sourceFrame = new da,\r\n this.destinationFrame = new da,\r\n this.bindingSourceFrame = new da,\r\n this.bindingDestinationFrame = new da,\r\n this.filters = [],\r\n this.transform = null\r\n }\r\n return t.prototype.clear = function() {\r\n this.target = null,\r\n this.filters = null,\r\n this.renderTexture = null\r\n }\r\n ,\r\n t\r\n }()\r\n , Cb = [new ra, new ra, new ra, new ra]\r\n , hc = new la\r\n , yd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.defaultFilterStack = [{}],\r\n r.texturePool = new cg,\r\n r.texturePool.setScreenSize(e.view),\r\n r.statePool = [],\r\n r.quad = new ig,\r\n r.quadUv = new jg,\r\n r.tempRect = new da,\r\n r.activeState = {},\r\n r.globalUniforms = new Pa({\r\n outputFrame: new da,\r\n inputSize: new Float32Array(4),\r\n inputPixel: new Float32Array(4),\r\n inputClamp: new Float32Array(4),\r\n resolution: 1,\r\n filterArea: new Float32Array(4),\r\n filterClamp: new Float32Array(4)\r\n },!0),\r\n r.forceClear = !1,\r\n r.useMaxPadding = !1,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.push = function(t, e) {\r\n for (var r = this.renderer, i = this.defaultFilterStack, o = this.statePool.pop() || new lg, n = this.renderer.renderTexture, s = e[0].resolution, a = e[0].padding, u = e[0].autoFit, h = e[0].legacy, $ = 1; $ < e.length; $++) {\r\n var p = e[$];\r\n s = Math.min(s, p.resolution),\r\n a = this.useMaxPadding ? Math.max(a, p.padding) : a + p.padding,\r\n u = u && p.autoFit,\r\n h = h || p.legacy\r\n }\r\n if (1 === i.length && (this.defaultFilterStack[0].renderTexture = n.current),\r\n i.push(o),\r\n o.resolution = s,\r\n o.legacy = h,\r\n o.target = t,\r\n o.sourceFrame.copyFrom(t.filterArea || t.getBounds(!0)),\r\n o.sourceFrame.pad(a),\r\n u) {\r\n var l = this.tempRect.copyFrom(n.sourceFrame);\r\n r.projection.transform && this.transformAABB(hc.copyFrom(r.projection.transform).invert(), l),\r\n o.sourceFrame.fit(l)\r\n }\r\n this.roundFrame(o.sourceFrame, n.current ? n.current.resolution : r.resolution, n.sourceFrame, n.destinationFrame, r.projection.transform),\r\n o.renderTexture = this.getOptimalFilterTexture(o.sourceFrame.width, o.sourceFrame.height, s),\r\n o.filters = e,\r\n o.destinationFrame.width = o.renderTexture.width,\r\n o.destinationFrame.height = o.renderTexture.height;\r\n var c = this.tempRect;\r\n c.x = 0,\r\n c.y = 0,\r\n c.width = o.sourceFrame.width,\r\n c.height = o.sourceFrame.height,\r\n o.renderTexture.filterFrame = o.sourceFrame,\r\n o.bindingSourceFrame.copyFrom(n.sourceFrame),\r\n o.bindingDestinationFrame.copyFrom(n.destinationFrame),\r\n o.transform = r.projection.transform,\r\n r.projection.transform = null,\r\n n.bind(o.renderTexture, o.sourceFrame, c),\r\n r.framebuffer.clear(0, 0, 0, 0)\r\n }\r\n ,\r\n e.prototype.pop = function() {\r\n var t = this.defaultFilterStack\r\n , e = t.pop()\r\n , r = e.filters;\r\n this.activeState = e;\r\n var i = this.globalUniforms.uniforms;\r\n i.outputFrame = e.sourceFrame,\r\n i.resolution = e.resolution;\r\n var o = i.inputSize\r\n , n = i.inputPixel\r\n , s = i.inputClamp;\r\n if (o[0] = e.destinationFrame.width,\r\n o[1] = e.destinationFrame.height,\r\n o[2] = 1 / o[0],\r\n o[3] = 1 / o[1],\r\n n[0] = o[0] * e.resolution,\r\n n[1] = o[1] * e.resolution,\r\n n[2] = 1 / n[0],\r\n n[3] = 1 / n[1],\r\n s[0] = .5 * n[2],\r\n s[1] = .5 * n[3],\r\n s[2] = e.sourceFrame.width * o[2] - .5 * n[2],\r\n s[3] = e.sourceFrame.height * o[3] - .5 * n[3],\r\n e.legacy) {\r\n var a = i.filterArea;\r\n a[0] = e.destinationFrame.width,\r\n a[1] = e.destinationFrame.height,\r\n a[2] = e.sourceFrame.x,\r\n a[3] = e.sourceFrame.y,\r\n i.filterClamp = i.inputClamp\r\n }\r\n this.globalUniforms.update();\r\n var u = t[t.length - 1];\r\n if (e.renderTexture.framebuffer.multisample > 1 && this.renderer.framebuffer.blit(),\r\n 1 === r.length)\r\n r[0].apply(this, e.renderTexture, u.renderTexture, Ja.BLEND, e),\r\n this.returnFilterTexture(e.renderTexture);\r\n else {\r\n var h = e.renderTexture\r\n , $ = this.getOptimalFilterTexture(h.width, h.height, e.resolution);\r\n $.filterFrame = h.filterFrame;\r\n var p = 0;\r\n for (p = 0; p < r.length - 1; ++p) {\r\n r[p].apply(this, h, $, Ja.CLEAR, e);\r\n var l = h;\r\n h = $,\r\n $ = l\r\n }\r\n r[p].apply(this, h, u.renderTexture, Ja.BLEND, e),\r\n this.returnFilterTexture(h),\r\n this.returnFilterTexture($)\r\n }\r\n e.clear(),\r\n this.statePool.push(e)\r\n }\r\n ,\r\n e.prototype.bindAndClear = function(t, e) {\r\n void 0 === e && (e = Ja.CLEAR);\r\n var r = this.renderer\r\n , i = r.renderTexture\r\n , o = r.state;\r\n if (t === this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture ? this.renderer.projection.transform = this.activeState.transform : this.renderer.projection.transform = null,\r\n t && t.filterFrame) {\r\n var n = this.tempRect;\r\n n.x = 0,\r\n n.y = 0,\r\n n.width = t.filterFrame.width,\r\n n.height = t.filterFrame.height,\r\n i.bind(t, t.filterFrame, n)\r\n } else\r\n t !== this.defaultFilterStack[this.defaultFilterStack.length - 1].renderTexture ? i.bind(t) : this.renderer.renderTexture.bind(t, this.activeState.bindingSourceFrame, this.activeState.bindingDestinationFrame);\r\n var s = 1 & o.stateId || this.forceClear;\r\n (e === Ja.CLEAR || e === Ja.BLIT && s) && this.renderer.framebuffer.clear(0, 0, 0, 0)\r\n }\r\n ,\r\n e.prototype.applyFilter = function(t, e, r, i) {\r\n var o = this.renderer;\r\n o.state.set(t.state),\r\n this.bindAndClear(r, i),\r\n t.uniforms.uSampler = e,\r\n t.uniforms.filterGlobals = this.globalUniforms,\r\n o.shader.bind(t),\r\n t.legacy ? (this.quadUv.map(e._frame, e.filterFrame),\r\n o.geometry.bind(this.quadUv),\r\n o.geometry.draw(Ba.TRIANGLES)) : (o.geometry.bind(this.quad),\r\n o.geometry.draw(Ba.TRIANGLE_STRIP))\r\n }\r\n ,\r\n e.prototype.calculateSpriteMatrix = function(t, e) {\r\n var r = this.activeState\r\n , i = r.sourceFrame\r\n , o = r.destinationFrame\r\n , n = e._texture.orig\r\n , s = t.set(o.width, 0, 0, o.height, i.x, i.y)\r\n , a = e.worldTransform.copyTo(la.TEMP_MATRIX);\r\n return a.invert(),\r\n s.prepend(a),\r\n s.scale(1 / n.width, 1 / n.height),\r\n s.translate(e.anchor.x, e.anchor.y),\r\n s\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n this.texturePool.clear(!1)\r\n }\r\n ,\r\n e.prototype.getOptimalFilterTexture = function(t, e, r) {\r\n return void 0 === r && (r = 1),\r\n this.texturePool.getOptimalTexture(t, e, r)\r\n }\r\n ,\r\n e.prototype.getFilterTexture = function(t, e) {\r\n if (\"number\" == typeof t) {\r\n var r = t;\r\n t = e,\r\n e = r\r\n }\r\n t = t || this.activeState.renderTexture;\r\n var i = this.texturePool.getOptimalTexture(t.width, t.height, e || t.resolution);\r\n return i.filterFrame = t.filterFrame,\r\n i\r\n }\r\n ,\r\n e.prototype.returnFilterTexture = function(t) {\r\n this.texturePool.returnTexture(t)\r\n }\r\n ,\r\n e.prototype.emptyPool = function() {\r\n this.texturePool.clear(!0)\r\n }\r\n ,\r\n e.prototype.resize = function() {\r\n this.texturePool.setScreenSize(this.renderer.view)\r\n }\r\n ,\r\n e.prototype.transformAABB = function(t, e) {\r\n var r = Cb[0]\r\n , i = Cb[1]\r\n , o = Cb[2]\r\n , n = Cb[3];\r\n r.set(e.left, e.top),\r\n i.set(e.left, e.bottom),\r\n o.set(e.right, e.top),\r\n n.set(e.right, e.bottom),\r\n t.apply(r, r),\r\n t.apply(i, i),\r\n t.apply(o, o),\r\n t.apply(n, n);\r\n var s = Math.min(r.x, i.x, o.x, n.x)\r\n , a = Math.min(r.y, i.y, o.y, n.y)\r\n , u = Math.max(r.x, i.x, o.x, n.x)\r\n , h = Math.max(r.y, i.y, o.y, n.y);\r\n e.x = s,\r\n e.y = a,\r\n e.width = u - s,\r\n e.height = h - a\r\n }\r\n ,\r\n e.prototype.roundFrame = function(t, e, r, i, o) {\r\n if (o) {\r\n var n = o.a\r\n , s = o.b\r\n , a = o.c\r\n , u = o.d;\r\n if (!(0 === s && 0 === a || 0 === n && 0 === u))\r\n return\r\n }\r\n (o = o ? hc.copyFrom(o) : hc.identity()).translate(-r.x, -r.y).scale(i.width / r.width, i.height / r.height).translate(i.x, i.y),\r\n this.transformAABB(o, t),\r\n t.ceil(e),\r\n this.transformAABB(o.invert(), t)\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , zd = function() {\r\n function t(t) {\r\n this.renderer = t\r\n }\r\n return t.prototype.flush = function() {}\r\n ,\r\n t.prototype.destroy = function() {\r\n this.renderer = null\r\n }\r\n ,\r\n t.prototype.start = function() {}\r\n ,\r\n t.prototype.stop = function() {\r\n this.flush()\r\n }\r\n ,\r\n t.prototype.render = function(t) {}\r\n ,\r\n t\r\n }()\r\n , Ad = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.emptyRenderer = new zd(e),\r\n r.currentRenderer = r.emptyRenderer,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.setObjectRenderer = function(t) {\r\n this.currentRenderer !== t && (this.currentRenderer.stop(),\r\n this.currentRenderer = t,\r\n this.currentRenderer.start())\r\n }\r\n ,\r\n e.prototype.flush = function() {\r\n this.setObjectRenderer(this.emptyRenderer)\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.setObjectRenderer(this.emptyRenderer)\r\n }\r\n ,\r\n e.prototype.copyBoundTextures = function(t, e) {\r\n for (var r = this.renderer.texture.boundTextures, i = e - 1; i >= 0; --i)\r\n t[i] = r[i] || null,\r\n t[i] && (t[i]._batchLocation = i)\r\n }\r\n ,\r\n e.prototype.boundArray = function(t, e, r, i) {\r\n for (var o = t.elements, n = t.ids, s = t.count, a = 0, u = 0; u < s; u++) {\r\n var h = o[u]\r\n , $ = h._batchLocation;\r\n if ($ >= 0 && $ < i && e[$] === h)\r\n n[u] = $;\r\n else\r\n for (; a < i; ) {\r\n var p = e[a];\r\n if (!p || p._batchEnabled !== r || p._batchLocation !== a) {\r\n n[u] = a,\r\n h._batchLocation = a,\r\n e[a] = h;\r\n break\r\n }\r\n a++\r\n }\r\n }\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , Bd = 0\r\n , Cd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.webGLVersion = 1,\r\n r.extensions = {},\r\n r.supports = {\r\n uint32Indices: !1\r\n },\r\n r.handleContextLost = r.handleContextLost.bind(r),\r\n r.handleContextRestored = r.handleContextRestored.bind(r),\r\n e.view.addEventListener(\"webglcontextlost\", r.handleContextLost, !1),\r\n e.view.addEventListener(\"webglcontextrestored\", r.handleContextRestored, !1),\r\n r\r\n }\r\n return ba(e, t),\r\n Object.defineProperty(e.prototype, \"isLost\", {\r\n get: function() {\r\n return !this.gl || this.gl.isContextLost()\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.contextChange = function(t) {\r\n this.gl = t,\r\n this.renderer.gl = t,\r\n this.renderer.CONTEXT_UID = Bd++,\r\n t.isContextLost() && t.getExtension(\"WEBGL_lose_context\") && t.getExtension(\"WEBGL_lose_context\").restoreContext()\r\n }\r\n ,\r\n e.prototype.initFromContext = function(t) {\r\n this.gl = t,\r\n this.validateContext(t),\r\n this.renderer.gl = t,\r\n this.renderer.CONTEXT_UID = Bd++,\r\n this.renderer.runners.contextChange.emit(t)\r\n }\r\n ,\r\n e.prototype.initFromOptions = function(t) {\r\n var e = this.createContext(this.renderer.view, t);\r\n this.initFromContext(e)\r\n }\r\n ,\r\n e.prototype.createContext = function(t, e) {\r\n var r;\r\n if (aa.PREFER_ENV >= Aa.WEBGL2 && (r = t.getContext(\"webgl2\", e)),\r\n r)\r\n this.webGLVersion = 2;\r\n else if (this.webGLVersion = 1,\r\n !(r = t.getContext(\"webgl\", e) || t.getContext(\"experimental-webgl\", e)))\r\n throw new Error(\"This browser does not support WebGL. Try using the canvas renderer\");\r\n return this.gl = r,\r\n this.getExtensions(),\r\n this.gl\r\n }\r\n ,\r\n e.prototype.getExtensions = function() {\r\n var t = this.gl\r\n , e = {\r\n anisotropicFiltering: t.getExtension(\"EXT_texture_filter_anisotropic\"),\r\n floatTextureLinear: t.getExtension(\"OES_texture_float_linear\"),\r\n s3tc: t.getExtension(\"WEBGL_compressed_texture_s3tc\"),\r\n s3tc_sRGB: t.getExtension(\"WEBGL_compressed_texture_s3tc_srgb\"),\r\n etc: t.getExtension(\"WEBGL_compressed_texture_etc\"),\r\n etc1: t.getExtension(\"WEBGL_compressed_texture_etc1\"),\r\n pvrtc: t.getExtension(\"WEBGL_compressed_texture_pvrtc\") || t.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\"),\r\n atc: t.getExtension(\"WEBGL_compressed_texture_atc\"),\r\n astc: t.getExtension(\"WEBGL_compressed_texture_astc\")\r\n };\r\n 1 === this.webGLVersion ? Object.assign(this.extensions, e, {\r\n drawBuffers: t.getExtension(\"WEBGL_draw_buffers\"),\r\n depthTexture: t.getExtension(\"WEBGL_depth_texture\"),\r\n loseContext: t.getExtension(\"WEBGL_lose_context\"),\r\n vertexArrayObject: t.getExtension(\"OES_vertex_array_object\") || t.getExtension(\"MOZ_OES_vertex_array_object\") || t.getExtension(\"WEBKIT_OES_vertex_array_object\"),\r\n uint32ElementIndex: t.getExtension(\"OES_element_index_uint\"),\r\n floatTexture: t.getExtension(\"OES_texture_float\"),\r\n floatTextureLinear: t.getExtension(\"OES_texture_float_linear\"),\r\n textureHalfFloat: t.getExtension(\"OES_texture_half_float\"),\r\n textureHalfFloatLinear: t.getExtension(\"OES_texture_half_float_linear\")\r\n }) : 2 === this.webGLVersion && Object.assign(this.extensions, e, {\r\n colorBufferFloat: t.getExtension(\"EXT_color_buffer_float\")\r\n })\r\n }\r\n ,\r\n e.prototype.handleContextLost = function(t) {\r\n t.preventDefault()\r\n }\r\n ,\r\n e.prototype.handleContextRestored = function() {\r\n this.renderer.runners.contextChange.emit(this.gl)\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n var t = this.renderer.view;\r\n t.removeEventListener(\"webglcontextlost\", this.handleContextLost),\r\n t.removeEventListener(\"webglcontextrestored\", this.handleContextRestored),\r\n this.gl.useProgram(null),\r\n this.extensions.loseContext && this.extensions.loseContext.loseContext()\r\n }\r\n ,\r\n e.prototype.postrender = function() {\r\n this.renderer.renderingToScreen && this.gl.flush()\r\n }\r\n ,\r\n e.prototype.validateContext = function(t) {\r\n var e = t.getContextAttributes()\r\n , r = \"WebGL2RenderingContext\"in self && t instanceof self.WebGL2RenderingContext;\r\n r && (this.webGLVersion = 2),\r\n e.stencil || console.warn(\"Provided WebGL context does not have a stencil buffer, masks may not render correctly\");\r\n var i = r || !!t.getExtension(\"OES_element_index_uint\");\r\n this.supports.uint32Indices = i,\r\n i || console.warn(\"Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly\")\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , mg = function() {\r\n return function(t) {\r\n this.framebuffer = t,\r\n this.stencil = null,\r\n this.dirtyId = 0,\r\n this.dirtyFormat = 0,\r\n this.dirtySize = 0,\r\n this.multisample = _a.NONE,\r\n this.msaaBuffer = null,\r\n this.blitFramebuffer = null\r\n }\r\n }()\r\n , ng = new da\r\n , Dd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.managedFramebuffers = [],\r\n r.unknownFramebuffer = new ec(10,10),\r\n r.msaaSamples = null,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.contextChange = function() {\r\n var t = this.gl = this.renderer.gl;\r\n if (this.CONTEXT_UID = this.renderer.CONTEXT_UID,\r\n this.current = this.unknownFramebuffer,\r\n this.viewport = new da,\r\n this.hasMRT = !0,\r\n this.writeDepthTexture = !0,\r\n this.disposeAll(!0),\r\n 1 === this.renderer.context.webGLVersion) {\r\n var e = this.renderer.context.extensions.drawBuffers\r\n , r = this.renderer.context.extensions.depthTexture;\r\n aa.PREFER_ENV === Aa.WEBGL_LEGACY && (e = null,\r\n r = null),\r\n e ? t.drawBuffers = function(t) {\r\n return e.drawBuffersWEBGL(t)\r\n }\r\n : (this.hasMRT = !1,\r\n t.drawBuffers = function() {}\r\n ),\r\n r || (this.writeDepthTexture = !1)\r\n } else\r\n this.msaaSamples = t.getInternalformatParameter(t.RENDERBUFFER, t.RGBA8, t.SAMPLES)\r\n }\r\n ,\r\n e.prototype.bind = function(t, e) {\r\n var r = this.gl;\r\n if (t) {\r\n var i = t.glFramebuffers[this.CONTEXT_UID] || this.initFramebuffer(t);\r\n this.current !== t && (this.current = t,\r\n r.bindFramebuffer(r.FRAMEBUFFER, i.framebuffer)),\r\n i.dirtyId !== t.dirtyId && (i.dirtyId = t.dirtyId,\r\n i.dirtyFormat !== t.dirtyFormat ? (i.dirtyFormat = t.dirtyFormat,\r\n this.updateFramebuffer(t)) : i.dirtySize !== t.dirtySize && (i.dirtySize = t.dirtySize,\r\n this.resizeFramebuffer(t)));\r\n for (var o = 0; o < t.colorTextures.length; o++) {\r\n var n = t.colorTextures[o];\r\n this.renderer.texture.unbind(n.parentTextureArray || n)\r\n }\r\n t.depthTexture && this.renderer.texture.unbind(t.depthTexture),\r\n e ? this.setViewport(e.x, e.y, e.width, e.height) : this.setViewport(0, 0, t.width, t.height)\r\n } else\r\n this.current && (this.current = null,\r\n r.bindFramebuffer(r.FRAMEBUFFER, null)),\r\n e ? this.setViewport(e.x, e.y, e.width, e.height) : this.setViewport(0, 0, this.renderer.width, this.renderer.height)\r\n }\r\n ,\r\n e.prototype.setViewport = function(t, e, r, i) {\r\n var o = this.viewport;\r\n o.width === r && o.height === i && o.x === t && o.y === e || (o.x = t,\r\n o.y = e,\r\n o.width = r,\r\n o.height = i,\r\n this.gl.viewport(t, e, r, i))\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"size\", {\r\n get: function() {\r\n return this.current ? {\r\n x: 0,\r\n y: 0,\r\n width: this.current.width,\r\n height: this.current.height\r\n } : {\r\n x: 0,\r\n y: 0,\r\n width: this.renderer.width,\r\n height: this.renderer.height\r\n }\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.clear = function(t, e, r, i, o) {\r\n void 0 === o && (o = Qb.COLOR | Qb.DEPTH);\r\n var n = this.gl;\r\n n.clearColor(t, e, r, i),\r\n n.clear(o)\r\n }\r\n ,\r\n e.prototype.initFramebuffer = function(t) {\r\n var e = this.gl\r\n , r = new mg(e.createFramebuffer());\r\n return r.multisample = this.detectSamples(t.multisample),\r\n t.glFramebuffers[this.CONTEXT_UID] = r,\r\n this.managedFramebuffers.push(t),\r\n t.disposeRunner.add(this),\r\n r\r\n }\r\n ,\r\n e.prototype.resizeFramebuffer = function(t) {\r\n var e = this.gl\r\n , r = t.glFramebuffers[this.CONTEXT_UID];\r\n r.stencil && (e.bindRenderbuffer(e.RENDERBUFFER, r.stencil),\r\n e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_STENCIL, t.width, t.height));\r\n for (var i = t.colorTextures, o = 0; o < i.length; o++)\r\n this.renderer.texture.bind(i[o], 0);\r\n t.depthTexture && this.renderer.texture.bind(t.depthTexture, 0)\r\n }\r\n ,\r\n e.prototype.updateFramebuffer = function(t) {\r\n var e = this.gl\r\n , r = t.glFramebuffers[this.CONTEXT_UID]\r\n , i = t.colorTextures.length;\r\n e.drawBuffers || (i = Math.min(i, 1)),\r\n r.multisample > 1 && (r.msaaBuffer = e.createRenderbuffer(),\r\n e.bindRenderbuffer(e.RENDERBUFFER, r.msaaBuffer),\r\n e.renderbufferStorageMultisample(e.RENDERBUFFER, r.multisample, e.RGBA8, t.width, t.height),\r\n e.framebufferRenderbuffer(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.RENDERBUFFER, r.msaaBuffer));\r\n for (var o = [], n = 0; n < i; n++)\r\n if (!(0 === n && r.multisample > 1)) {\r\n var s = t.colorTextures[n]\r\n , a = s.parentTextureArray || s;\r\n this.renderer.texture.bind(a, 0),\r\n e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0 + n, s.target, a._glTextures[this.CONTEXT_UID].texture, 0),\r\n o.push(e.COLOR_ATTACHMENT0 + n)\r\n }\r\n if ((o.length > 1 && e.drawBuffers(o),\r\n t.depthTexture) && this.writeDepthTexture) {\r\n var u = t.depthTexture;\r\n this.renderer.texture.bind(u, 0),\r\n e.framebufferTexture2D(e.FRAMEBUFFER, e.DEPTH_ATTACHMENT, e.TEXTURE_2D, u._glTextures[this.CONTEXT_UID].texture, 0)\r\n }\r\n r.stencil || !t.stencil && !t.depth || (r.stencil = e.createRenderbuffer(),\r\n e.bindRenderbuffer(e.RENDERBUFFER, r.stencil),\r\n e.renderbufferStorage(e.RENDERBUFFER, e.DEPTH_STENCIL, t.width, t.height),\r\n t.depthTexture || e.framebufferRenderbuffer(e.FRAMEBUFFER, e.DEPTH_STENCIL_ATTACHMENT, e.RENDERBUFFER, r.stencil))\r\n }\r\n ,\r\n e.prototype.detectSamples = function(t) {\r\n var e = this.msaaSamples\r\n , r = _a.NONE;\r\n if (t <= 1 || null === e)\r\n return r;\r\n for (var i = 0; i < e.length; i++)\r\n if (e[i] <= t) {\r\n r = e[i];\r\n break\r\n }\r\n return 1 === r && (r = _a.NONE),\r\n r\r\n }\r\n ,\r\n e.prototype.blit = function(t, e, r) {\r\n var i = this.current\r\n , o = this.renderer\r\n , n = this.gl\r\n , s = this.CONTEXT_UID;\r\n if (2 === o.context.webGLVersion && i) {\r\n var a = i.glFramebuffers[s];\r\n if (a) {\r\n if (!t) {\r\n if (a.multisample <= 1)\r\n return;\r\n a.blitFramebuffer || (a.blitFramebuffer = new ec(i.width,i.height),\r\n a.blitFramebuffer.addColorTexture(0, i.colorTextures[0])),\r\n (t = a.blitFramebuffer).width = i.width,\r\n t.height = i.height\r\n }\r\n e || ((e = ng).width = i.width,\r\n e.height = i.height),\r\n r || (r = e);\r\n var u = e.width === r.width && e.height === r.height;\r\n this.bind(t),\r\n n.bindFramebuffer(n.READ_FRAMEBUFFER, a.framebuffer),\r\n n.blitFramebuffer(e.x, e.y, e.width, e.height, r.x, r.y, r.width, r.height, n.COLOR_BUFFER_BIT, u ? n.NEAREST : n.LINEAR)\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.disposeFramebuffer = function(t, e) {\r\n var r = t.glFramebuffers[this.CONTEXT_UID]\r\n , i = this.gl;\r\n if (r) {\r\n delete t.glFramebuffers[this.CONTEXT_UID];\r\n var o = this.managedFramebuffers.indexOf(t);\r\n o >= 0 && this.managedFramebuffers.splice(o, 1),\r\n t.disposeRunner.remove(this),\r\n e || (i.deleteFramebuffer(r.framebuffer),\r\n r.stencil && i.deleteRenderbuffer(r.stencil))\r\n }\r\n }\r\n ,\r\n e.prototype.disposeAll = function(t) {\r\n var e = this.managedFramebuffers;\r\n this.managedFramebuffers = [];\r\n for (var r = 0; r < e.length; r++)\r\n this.disposeFramebuffer(e[r], t)\r\n }\r\n ,\r\n e.prototype.forceStencil = function() {\r\n var t = this.current;\r\n if (t) {\r\n var e = t.glFramebuffers[this.CONTEXT_UID];\r\n if (e && !e.stencil) {\r\n t.enableStencil();\r\n var r = t.width\r\n , i = t.height\r\n , o = this.gl\r\n , n = o.createRenderbuffer();\r\n o.bindRenderbuffer(o.RENDERBUFFER, n),\r\n o.renderbufferStorage(o.RENDERBUFFER, o.DEPTH_STENCIL, r, i),\r\n e.stencil = n,\r\n o.framebufferRenderbuffer(o.FRAMEBUFFER, o.DEPTH_STENCIL_ATTACHMENT, o.RENDERBUFFER, n)\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.current = this.unknownFramebuffer,\r\n this.viewport = new da\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , og = function() {\r\n return function(t) {\r\n this.buffer = t || null,\r\n this.updateID = -1,\r\n this.byteLength = -1,\r\n this.refCount = 0\r\n }\r\n }()\r\n , ic = {\r\n 5126: 4,\r\n 5123: 2,\r\n 5121: 1\r\n }\r\n , Ed = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r._activeGeometry = null,\r\n r._activeVao = null,\r\n r.hasVao = !0,\r\n r.hasInstance = !0,\r\n r.canUseUInt32ElementIndex = !1,\r\n r.managedGeometries = {},\r\n r.managedBuffers = {},\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.contextChange = function() {\r\n this.disposeAll(!0);\r\n var t = this.gl = this.renderer.gl\r\n , e = this.renderer.context;\r\n if (this.CONTEXT_UID = this.renderer.CONTEXT_UID,\r\n 2 !== e.webGLVersion) {\r\n var r = this.renderer.context.extensions.vertexArrayObject;\r\n aa.PREFER_ENV === Aa.WEBGL_LEGACY && (r = null),\r\n r ? (t.createVertexArray = function() {\r\n return r.createVertexArrayOES()\r\n }\r\n ,\r\n t.bindVertexArray = function(t) {\r\n return r.bindVertexArrayOES(t)\r\n }\r\n ,\r\n t.deleteVertexArray = function(t) {\r\n return r.deleteVertexArrayOES(t)\r\n }\r\n ) : (this.hasVao = !1,\r\n t.createVertexArray = function() {\r\n return null\r\n }\r\n ,\r\n t.bindVertexArray = function() {\r\n return null\r\n }\r\n ,\r\n t.deleteVertexArray = function() {\r\n return null\r\n }\r\n )\r\n }\r\n if (2 !== e.webGLVersion) {\r\n var i = t.getExtension(\"ANGLE_instanced_arrays\");\r\n i ? (t.vertexAttribDivisor = function(t, e) {\r\n return i.vertexAttribDivisorANGLE(t, e)\r\n }\r\n ,\r\n t.drawElementsInstanced = function(t, e, r, o, n) {\r\n return i.drawElementsInstancedANGLE(t, e, r, o, n)\r\n }\r\n ,\r\n t.drawArraysInstanced = function(t, e, r, o) {\r\n return i.drawArraysInstancedANGLE(t, e, r, o)\r\n }\r\n ) : this.hasInstance = !1\r\n }\r\n this.canUseUInt32ElementIndex = 2 === e.webGLVersion || !!e.extensions.uint32ElementIndex\r\n }\r\n ,\r\n e.prototype.bind = function(t, e) {\r\n e = e || this.renderer.shader.shader;\r\n var r = this.gl\r\n , i = t.glVertexArrayObjects[this.CONTEXT_UID]\r\n , o = !1;\r\n i || (this.managedGeometries[t.id] = t,\r\n t.disposeRunner.add(this),\r\n t.glVertexArrayObjects[this.CONTEXT_UID] = i = {},\r\n o = !0);\r\n var n = i[e.program.id] || this.initGeometryVao(t, e.program, o);\r\n this._activeGeometry = t,\r\n this._activeVao !== n && (this._activeVao = n,\r\n this.hasVao ? r.bindVertexArray(n) : this.activateVao(t, e.program)),\r\n this.updateBuffers()\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.unbind()\r\n }\r\n ,\r\n e.prototype.updateBuffers = function() {\r\n for (var t = this._activeGeometry, e = this.gl, r = 0; r < t.buffers.length; r++) {\r\n var i = t.buffers[r]\r\n , o = i._glBuffers[this.CONTEXT_UID];\r\n if (i._updateID !== o.updateID) {\r\n o.updateID = i._updateID;\r\n var n = i.index ? e.ELEMENT_ARRAY_BUFFER : e.ARRAY_BUFFER;\r\n if (e.bindBuffer(n, o.buffer),\r\n this._boundBuffer = o,\r\n o.byteLength >= i.data.byteLength)\r\n e.bufferSubData(n, 0, i.data);\r\n else {\r\n var s = i.static ? e.STATIC_DRAW : e.DYNAMIC_DRAW;\r\n o.byteLength = i.data.byteLength,\r\n e.bufferData(n, i.data, s)\r\n }\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.checkCompatibility = function(t, e) {\r\n var r = t.attributes\r\n , i = e.attributeData;\r\n for (var o in i)\r\n if (!r[o])\r\n throw new Error(\"shader and geometry incompatible, geometry missing the \\\"\" + o + \"\\\" attribute\")\r\n }\r\n ,\r\n e.prototype.getSignature = function(t, e) {\r\n var r = t.attributes\r\n , i = e.attributeData\r\n , o = [\"g\", t.id];\r\n for (var n in r)\r\n i[n] && o.push(n);\r\n return o.join(\"-\")\r\n }\r\n ,\r\n e.prototype.initGeometryVao = function(t, e, r) {\r\n void 0 === r && (r = !0),\r\n this.checkCompatibility(t, e);\r\n var i = this.gl\r\n , o = this.CONTEXT_UID\r\n , n = this.getSignature(t, e)\r\n , s = t.glVertexArrayObjects[this.CONTEXT_UID]\r\n , a = s[n];\r\n if (a)\r\n return s[e.id] = a,\r\n a;\r\n var u = t.buffers\r\n , h = t.attributes\r\n , $ = {}\r\n , p = {};\r\n for (var l in u)\r\n $[l] = 0,\r\n p[l] = 0;\r\n for (var l in h)\r\n !h[l].size && e.attributeData[l] ? h[l].size = e.attributeData[l].size : h[l].size || console.warn(\"PIXI Geometry attribute '\" + l + \"' size cannot be determined (likely the bound shader does not have the attribute)\"),\r\n $[h[l].buffer] += h[l].size * ic[h[l].type];\r\n for (var l in h) {\r\n var c = h[l]\r\n , d = c.size;\r\n void 0 === c.stride && ($[c.buffer] === d * ic[c.type] ? c.stride = 0 : c.stride = $[c.buffer]),\r\n void 0 === c.start && (c.start = p[c.buffer],\r\n p[c.buffer] += d * ic[c.type])\r\n }\r\n a = i.createVertexArray(),\r\n i.bindVertexArray(a);\r\n for (var f = 0; f < u.length; f++) {\r\n var m = u[f];\r\n m._glBuffers[o] || (m._glBuffers[o] = new og(i.createBuffer()),\r\n this.managedBuffers[m.id] = m,\r\n m.disposeRunner.add(this)),\r\n r && m._glBuffers[o].refCount++\r\n }\r\n return this.activateVao(t, e),\r\n this._activeVao = a,\r\n s[e.id] = a,\r\n s[n] = a,\r\n a\r\n }\r\n ,\r\n e.prototype.disposeBuffer = function(t, e) {\r\n if (this.managedBuffers[t.id]) {\r\n delete this.managedBuffers[t.id];\r\n var r = t._glBuffers[this.CONTEXT_UID]\r\n , i = this.gl;\r\n t.disposeRunner.remove(this),\r\n r && (e || i.deleteBuffer(r.buffer),\r\n delete t._glBuffers[this.CONTEXT_UID])\r\n }\r\n }\r\n ,\r\n e.prototype.disposeGeometry = function(t, e) {\r\n if (this.managedGeometries[t.id]) {\r\n delete this.managedGeometries[t.id];\r\n var r = t.glVertexArrayObjects[this.CONTEXT_UID]\r\n , i = this.gl\r\n , o = t.buffers;\r\n if (t.disposeRunner.remove(this),\r\n r) {\r\n for (var n = 0; n < o.length; n++) {\r\n var s = o[n]._glBuffers[this.CONTEXT_UID];\r\n s.refCount--,\r\n 0 !== s.refCount || e || this.disposeBuffer(o[n], e)\r\n }\r\n if (!e)\r\n for (var a in r)\r\n if (\"g\" === a[0]) {\r\n var u = r[a];\r\n this._activeVao === u && this.unbind(),\r\n i.deleteVertexArray(u)\r\n }\r\n delete t.glVertexArrayObjects[this.CONTEXT_UID]\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.disposeAll = function(t) {\r\n for (var e = Object.keys(this.managedGeometries), r = 0; r < e.length; r++)\r\n this.disposeGeometry(this.managedGeometries[e[r]], t);\r\n e = Object.keys(this.managedBuffers);\r\n for (r = 0; r < e.length; r++)\r\n this.disposeBuffer(this.managedBuffers[e[r]], t)\r\n }\r\n ,\r\n e.prototype.activateVao = function(t, e) {\r\n var r = this.gl\r\n , i = this.CONTEXT_UID\r\n , o = t.buffers\r\n , n = t.attributes;\r\n t.indexBuffer && r.bindBuffer(r.ELEMENT_ARRAY_BUFFER, t.indexBuffer._glBuffers[i].buffer);\r\n var s = null;\r\n for (var a in n) {\r\n var u = n[a]\r\n , h = o[u.buffer]._glBuffers[i];\r\n if (e.attributeData[a]) {\r\n s !== h && (r.bindBuffer(r.ARRAY_BUFFER, h.buffer),\r\n s = h);\r\n var $ = e.attributeData[a].location;\r\n if (r.enableVertexAttribArray($),\r\n r.vertexAttribPointer($, u.size, u.type || r.FLOAT, u.normalized, u.stride, u.start),\r\n u.instance) {\r\n if (!this.hasInstance)\r\n throw new Error(\"geometry error, GPU Instancing is not supported on this device\");\r\n r.vertexAttribDivisor($, 1)\r\n }\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.draw = function(t, e, r, i) {\r\n var o = this.gl\r\n , n = this._activeGeometry;\r\n if (n.indexBuffer) {\r\n var s = n.indexBuffer.data.BYTES_PER_ELEMENT\r\n , a = 2 === s ? o.UNSIGNED_SHORT : o.UNSIGNED_INT;\r\n 2 === s || 4 === s && this.canUseUInt32ElementIndex ? n.instanced ? o.drawElementsInstanced(t, e || n.indexBuffer.data.length, a, (r || 0) * s, i || 1) : o.drawElements(t, e || n.indexBuffer.data.length, a, (r || 0) * s) : console.warn(\"unsupported index buffer type: uint32\")\r\n } else\r\n n.instanced ? o.drawArraysInstanced(t, r, e || n.getSize(), i || 1) : o.drawArrays(t, r, e || n.getSize());\r\n return this\r\n }\r\n ,\r\n e.prototype.unbind = function() {\r\n this.gl.bindVertexArray(null),\r\n this._activeVao = null,\r\n this._activeGeometry = null\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , pg = function() {\r\n function t(t) {\r\n void 0 === t && (t = null),\r\n this.type = qa.NONE,\r\n this.autoDetect = !0,\r\n this.maskObject = t || null,\r\n this.pooled = !1,\r\n this.isMaskData = !0,\r\n this._stencilCounter = 0,\r\n this._scissorCounter = 0,\r\n this._scissorRect = null,\r\n this._target = null\r\n }\r\n return t.prototype.reset = function() {\r\n this.pooled && (this.maskObject = null,\r\n this.type = qa.NONE,\r\n this.autoDetect = !0),\r\n this._target = null\r\n }\r\n ,\r\n t.prototype.copyCountersOrReset = function(t) {\r\n t ? (this._stencilCounter = t._stencilCounter,\r\n this._scissorCounter = t._scissorCounter,\r\n this._scissorRect = t._scissorRect) : (this._stencilCounter = 0,\r\n this._scissorCounter = 0,\r\n this._scissorRect = null)\r\n }\r\n ,\r\n t\r\n }();\r\n function Fd(t, e, r) {\r\n var i = t.createShader(e);\r\n return t.shaderSource(i, r),\r\n t.compileShader(i),\r\n i\r\n }\r\n function Gd(t, e, r, i) {\r\n var o = Fd(t, t.VERTEX_SHADER, e)\r\n , n = Fd(t, t.FRAGMENT_SHADER, r)\r\n , s = t.createProgram();\r\n if (t.attachShader(s, o),\r\n t.attachShader(s, n),\r\n i)\r\n for (var a in i)\r\n t.bindAttribLocation(s, i[a], a);\r\n return t.linkProgram(s),\r\n t.getProgramParameter(s, t.LINK_STATUS) || (t.getShaderParameter(o, t.COMPILE_STATUS) || (console.warn(e),\r\n console.error(t.getShaderInfoLog(o))),\r\n t.getShaderParameter(n, t.COMPILE_STATUS) || (console.warn(r),\r\n console.error(t.getShaderInfoLog(n))),\r\n console.error(\"Pixi.js Error: Could not initialize shader.\"),\r\n console.error(\"gl.VALIDATE_STATUS\", t.getProgramParameter(s, t.VALIDATE_STATUS)),\r\n console.error(\"gl.getError()\", t.getError()),\r\n \"\" !== t.getProgramInfoLog(s) && console.warn(\"Pixi.js Warning: gl.getProgramInfoLog()\", t.getProgramInfoLog(s)),\r\n t.deleteProgram(s),\r\n s = null),\r\n t.deleteShader(o),\r\n t.deleteShader(n),\r\n s\r\n }\r\n function jc(t) {\r\n for (var e = new Array(t), r = 0; r < e.length; r++)\r\n e[r] = !1;\r\n return e\r\n }\r\n function Hd(t, e) {\r\n switch (t) {\r\n case \"float\":\r\n return 0;\r\n case \"vec2\":\r\n return new Float32Array(2 * e);\r\n case \"vec3\":\r\n return new Float32Array(3 * e);\r\n case \"vec4\":\r\n return new Float32Array(4 * e);\r\n case \"int\":\r\n case \"uint\":\r\n case \"sampler2D\":\r\n case \"sampler2DArray\":\r\n return 0;\r\n case \"ivec2\":\r\n return new Int32Array(2 * e);\r\n case \"ivec3\":\r\n return new Int32Array(3 * e);\r\n case \"ivec4\":\r\n return new Int32Array(4 * e);\r\n case \"uvec2\":\r\n return new Uint32Array(2 * e);\r\n case \"uvec3\":\r\n return new Uint32Array(3 * e);\r\n case \"uvec4\":\r\n return new Uint32Array(4 * e);\r\n case \"bool\":\r\n return !1;\r\n case \"bvec2\":\r\n return jc(2 * e);\r\n case \"bvec3\":\r\n return jc(3 * e);\r\n case \"bvec4\":\r\n return jc(4 * e);\r\n case \"mat2\":\r\n return new Float32Array([1, 0, 0, 1]);\r\n case \"mat3\":\r\n return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\r\n case \"mat4\":\r\n return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\r\n }\r\n return null\r\n }\r\n var Id, Jd = {}, Db = Jd;\r\n function Kd() {\r\n if (Db === Jd || Db && Db.isContextLost()) {\r\n var t = document.createElement(\"canvas\")\r\n , e = void 0;\r\n aa.PREFER_ENV >= Aa.WEBGL2 && (e = t.getContext(\"webgl2\", {})),\r\n e || ((e = t.getContext(\"webgl\", {}) || t.getContext(\"experimental-webgl\", {})) ? e.getExtension(\"WEBGL_draw_buffers\") : e = null),\r\n Db = e\r\n }\r\n return Db\r\n }\r\n function qg() {\r\n if (!Id) {\r\n Id = xa.MEDIUM;\r\n var t = Kd();\r\n if (t && t.getShaderPrecisionFormat) {\r\n var e = t.getShaderPrecisionFormat(t.FRAGMENT_SHADER, t.HIGH_FLOAT);\r\n Id = e.precision ? xa.HIGH : xa.MEDIUM\r\n }\r\n }\r\n return Id\r\n }\r\n function Ld(t, e, r) {\r\n if (\"precision\" !== t.substring(0, 9)) {\r\n var i = e;\r\n return e === xa.HIGH && r !== xa.HIGH && (i = xa.MEDIUM),\r\n \"precision \" + i + \" float;\\n\" + t\r\n }\r\n return r !== xa.HIGH && \"precision highp\" === t.substring(0, 15) ? t.replace(\"precision highp\", \"precision mediump\") : t\r\n }\r\n var rg = {\r\n float: 1,\r\n vec2: 2,\r\n vec3: 3,\r\n vec4: 4,\r\n int: 1,\r\n ivec2: 2,\r\n ivec3: 3,\r\n ivec4: 4,\r\n uint: 1,\r\n uvec2: 2,\r\n uvec3: 3,\r\n uvec4: 4,\r\n bool: 1,\r\n bvec2: 2,\r\n bvec3: 3,\r\n bvec4: 4,\r\n mat2: 4,\r\n mat3: 9,\r\n mat4: 16,\r\n sampler2D: 1\r\n };\r\n function sg(t) {\r\n return rg[t]\r\n }\r\n var kc = null\r\n , Md = {\r\n FLOAT: \"float\",\r\n FLOAT_VEC2: \"vec2\",\r\n FLOAT_VEC3: \"vec3\",\r\n FLOAT_VEC4: \"vec4\",\r\n INT: \"int\",\r\n INT_VEC2: \"ivec2\",\r\n INT_VEC3: \"ivec3\",\r\n INT_VEC4: \"ivec4\",\r\n UNSIGNED_INT: \"uint\",\r\n UNSIGNED_INT_VEC2: \"uvec2\",\r\n UNSIGNED_INT_VEC3: \"uvec3\",\r\n UNSIGNED_INT_VEC4: \"uvec4\",\r\n BOOL: \"bool\",\r\n BOOL_VEC2: \"bvec2\",\r\n BOOL_VEC3: \"bvec3\",\r\n BOOL_VEC4: \"bvec4\",\r\n FLOAT_MAT2: \"mat2\",\r\n FLOAT_MAT3: \"mat3\",\r\n FLOAT_MAT4: \"mat4\",\r\n SAMPLER_2D: \"sampler2D\",\r\n INT_SAMPLER_2D: \"sampler2D\",\r\n UNSIGNED_INT_SAMPLER_2D: \"sampler2D\",\r\n SAMPLER_CUBE: \"samplerCube\",\r\n INT_SAMPLER_CUBE: \"samplerCube\",\r\n UNSIGNED_INT_SAMPLER_CUBE: \"samplerCube\",\r\n SAMPLER_2D_ARRAY: \"sampler2DArray\",\r\n INT_SAMPLER_2D_ARRAY: \"sampler2DArray\",\r\n UNSIGNED_INT_SAMPLER_2D_ARRAY: \"sampler2DArray\"\r\n };\r\n function Nd(t, e) {\r\n if (!kc) {\r\n var r = Object.keys(Md);\r\n kc = {};\r\n for (var i = 0; i < r.length; ++i) {\r\n var o = r[i];\r\n kc[t[o]] = Md[o]\r\n }\r\n }\r\n return kc[e]\r\n }\r\n var lc = [{\r\n test: function(t) {\r\n return \"float\" === t.type && 1 === t.size\r\n },\r\n code: function(t) {\r\n return \"\\n if(uv[\\\"\" + t + \"\\\"] !== ud[\\\"\" + t + \"\\\"].value)\\n {\\n ud[\\\"\" + t + \"\\\"].value = uv[\\\"\" + t + \"\\\"]\\n gl.uniform1f(ud[\\\"\" + t + \"\\\"].location, uv[\\\"\" + t + \"\\\"])\\n }\\n \"\r\n }\r\n }, {\r\n test: function(t) {\r\n return (\"sampler2D\" === t.type || \"samplerCube\" === t.type || \"sampler2DArray\" === t.type) && 1 === t.size && !t.isArray\r\n },\r\n code: function(t) {\r\n return \"t = syncData.textureCount++;\\n\\n renderer.texture.bind(uv[\\\"\" + t + \"\\\"], t);\\n\\n if(ud[\\\"\" + t + \"\\\"].value !== t)\\n {\\n ud[\\\"\" + t + \"\\\"].value = t;\\n gl.uniform1i(ud[\\\"\" + t + \"\\\"].location, t);\\n; // eslint-disable-line max-len\\n }\"\r\n }\r\n }, {\r\n test: function(t, e) {\r\n return \"mat3\" === t.type && 1 === t.size && void 0 !== e.a\r\n },\r\n code: function(t) {\r\n return \"\\n gl.uniformMatrix3fv(ud[\\\"\" + t + \"\\\"].location, false, uv[\\\"\" + t + \"\\\"].toArray(true));\\n \"\r\n }\r\n }, {\r\n test: function(t, e) {\r\n return \"vec2\" === t.type && 1 === t.size && void 0 !== e.x\r\n },\r\n code: function(t) {\r\n return \"\\n cv = ud[\\\"\" + t + \"\\\"].value;\\n v = uv[\\\"\" + t + \"\\\"];\\n\\n if(cv[0] !== v.x || cv[1] !== v.y)\\n {\\n cv[0] = v.x;\\n cv[1] = v.y;\\n gl.uniform2f(ud[\\\"\" + t + \"\\\"].location, v.x, v.y);\\n }\"\r\n }\r\n }, {\r\n test: function(t) {\r\n return \"vec2\" === t.type && 1 === t.size\r\n },\r\n code: function(t) {\r\n return \"\\n cv = ud[\\\"\" + t + \"\\\"].value;\\n v = uv[\\\"\" + t + \"\\\"];\\n\\n if(cv[0] !== v[0] || cv[1] !== v[1])\\n {\\n cv[0] = v[0];\\n cv[1] = v[1];\\n gl.uniform2f(ud[\\\"\" + t + \"\\\"].location, v[0], v[1]);\\n }\\n \"\r\n }\r\n }, {\r\n test: function(t, e) {\r\n return \"vec4\" === t.type && 1 === t.size && void 0 !== e.width\r\n },\r\n code: function(t) {\r\n return \"\\n cv = ud[\\\"\" + t + \"\\\"].value;\\n v = uv[\\\"\" + t + \"\\\"];\\n\\n if(cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height)\\n {\\n cv[0] = v.x;\\n cv[1] = v.y;\\n cv[2] = v.width;\\n cv[3] = v.height;\\n gl.uniform4f(ud[\\\"\" + t + \"\\\"].location, v.x, v.y, v.width, v.height)\\n }\"\r\n }\r\n }, {\r\n test: function(t) {\r\n return \"vec4\" === t.type && 1 === t.size\r\n },\r\n code: function(t) {\r\n return \"\\n cv = ud[\\\"\" + t + \"\\\"].value;\\n v = uv[\\\"\" + t + \"\\\"];\\n\\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3])\\n {\\n cv[0] = v[0];\\n cv[1] = v[1];\\n cv[2] = v[2];\\n cv[3] = v[3];\\n\\n gl.uniform4f(ud[\\\"\" + t + \"\\\"].location, v[0], v[1], v[2], v[3])\\n }\"\r\n }\r\n }]\r\n , tg = {\r\n float: \"\\n if(cv !== v)\\n {\\n cv.v = v;\\n gl.uniform1f(location, v)\\n }\",\r\n vec2: \"\\n if(cv[0] !== v[0] || cv[1] !== v[1])\\n {\\n cv[0] = v[0];\\n cv[1] = v[1];\\n gl.uniform2f(location, v[0], v[1])\\n }\",\r\n vec3: \"\\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2])\\n {\\n cv[0] = v[0];\\n cv[1] = v[1];\\n cv[2] = v[2];\\n\\n gl.uniform3f(location, v[0], v[1], v[2])\\n }\",\r\n vec4: \"gl.uniform4f(location, v[0], v[1], v[2], v[3])\",\r\n int: \"gl.uniform1i(location, v)\",\r\n ivec2: \"gl.uniform2i(location, v[0], v[1])\",\r\n ivec3: \"gl.uniform3i(location, v[0], v[1], v[2])\",\r\n ivec4: \"gl.uniform4i(location, v[0], v[1], v[2], v[3])\",\r\n uint: \"gl.uniform1ui(location, v)\",\r\n uvec2: \"gl.uniform2ui(location, v[0], v[1])\",\r\n uvec3: \"gl.uniform3ui(location, v[0], v[1], v[2])\",\r\n uvec4: \"gl.uniform4ui(location, v[0], v[1], v[2], v[3])\",\r\n bool: \"gl.uniform1i(location, v)\",\r\n bvec2: \"gl.uniform2i(location, v[0], v[1])\",\r\n bvec3: \"gl.uniform3i(location, v[0], v[1], v[2])\",\r\n bvec4: \"gl.uniform4i(location, v[0], v[1], v[2], v[3])\",\r\n mat2: \"gl.uniformMatrix2fv(location, false, v)\",\r\n mat3: \"gl.uniformMatrix3fv(location, false, v)\",\r\n mat4: \"gl.uniformMatrix4fv(location, false, v)\",\r\n sampler2D: \"gl.uniform1i(location, v)\",\r\n samplerCube: \"gl.uniform1i(location, v)\",\r\n sampler2DArray: \"gl.uniform1i(location, v)\"\r\n }\r\n , ug = {\r\n float: \"gl.uniform1fv(location, v)\",\r\n vec2: \"gl.uniform2fv(location, v)\",\r\n vec3: \"gl.uniform3fv(location, v)\",\r\n vec4: \"gl.uniform4fv(location, v)\",\r\n mat4: \"gl.uniformMatrix4fv(location, false, v)\",\r\n mat3: \"gl.uniformMatrix3fv(location, false, v)\",\r\n mat2: \"gl.uniformMatrix2fv(location, false, v)\",\r\n int: \"gl.uniform1iv(location, v)\",\r\n ivec2: \"gl.uniform2iv(location, v)\",\r\n ivec3: \"gl.uniform3iv(location, v)\",\r\n ivec4: \"gl.uniform4iv(location, v)\",\r\n uint: \"gl.uniform1uiv(location, v)\",\r\n uvec2: \"gl.uniform2uiv(location, v)\",\r\n uvec3: \"gl.uniform3uiv(location, v)\",\r\n uvec4: \"gl.uniform4uiv(location, v)\",\r\n bool: \"gl.uniform1iv(location, v)\",\r\n bvec2: \"gl.uniform2iv(location, v)\",\r\n bvec3: \"gl.uniform3iv(location, v)\",\r\n bvec4: \"gl.uniform4iv(location, v)\",\r\n sampler2D: \"gl.uniform1iv(location, v)\",\r\n samplerCube: \"gl.uniform1iv(location, v)\",\r\n sampler2DArray: \"gl.uniform1iv(location, v)\"\r\n };\r\n function vg(t, e) {\r\n var r = [\"\\n var v = null;\\n var cv = null\\n var t = 0;\\n var gl = renderer.gl\\n \"];\r\n for (var i in t.uniforms) {\r\n var o = e[i];\r\n if (o) {\r\n for (var n = t.uniforms[i], s = !1, a = 0; a < lc.length; a++)\r\n if (lc[a].test(o, n)) {\r\n r.push(lc[a].code(i, n)),\r\n s = !0;\r\n break\r\n }\r\n if (!s) {\r\n var u = (1 === o.size ? tg : ug)[o.type].replace(\"location\", \"ud[\\\"\" + i + \"\\\"].location\");\r\n r.push(\"\\n cv = ud[\\\"\" + i + \"\\\"].value;\\n v = uv[\\\"\" + i + \"\\\"];\\n \" + u + \";\")\r\n }\r\n } else\r\n t.uniforms[i].group && r.push(\"\\n renderer.shader.syncUniformGroup(uv[\\\"\" + i + \"\\\"], syncData);\\n \")\r\n }\r\n return new Function(\"ud\",\"uv\",\"renderer\",\"syncData\",r.join(\"\\n\"))\r\n }\r\n var mc, wg = [\"precision mediump float;\", \"void main(void){\", \"float test = 0.1;\", \"%forloop%\", \"gl_FragColor = vec4(0.0);\", \"}\"].join(\"\\n\");\r\n function xg(t) {\r\n for (var e = \"\", r = 0; r < t; ++r)\r\n r > 0 && (e += \"\\nelse \"),\r\n r < t - 1 && (e += \"if(test == \" + r + \".0){}\");\r\n return e\r\n }\r\n function yg(t, e) {\r\n if (0 === t)\r\n throw new Error(\"Invalid value of `0` passed to `checkMaxIfStatementsInShader`\");\r\n for (var r = e.createShader(e.FRAGMENT_SHADER); ; ) {\r\n var i = wg.replace(/%forloop%/gi, xg(t));\r\n if (e.shaderSource(r, i),\r\n e.compileShader(r),\r\n e.getShaderParameter(r, e.COMPILE_STATUS))\r\n break;\r\n t = t / 2 | 0\r\n }\r\n return t\r\n }\r\n function zg() {\r\n if (\"boolean\" == typeof mc)\r\n return mc;\r\n try {\r\n var t = new Function(\"param1\",\"param2\",\"param3\",\"return param1[param2] === param3;\");\r\n mc = !0 === t({\r\n a: \"b\"\r\n }, \"a\", \"b\")\r\n } catch (e) {\r\n mc = !1\r\n }\r\n return mc\r\n }\r\n var Ag = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\n\\nvoid main(void){\\n gl_FragColor *= texture2D(uSampler, vTextureCoord);\\n}\"\r\n , Bg = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void){\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\\n\"\r\n , Cg = 0\r\n , Eb = {}\r\n , nc = function() {\r\n function t(e, r, i) {\r\n void 0 === i && (i = \"pixi-shader\"),\r\n this.id = Cg++,\r\n this.vertexSrc = e || t.defaultVertexSrc,\r\n this.fragmentSrc = r || t.defaultFragmentSrc,\r\n this.vertexSrc = this.vertexSrc.trim(),\r\n this.fragmentSrc = this.fragmentSrc.trim(),\r\n \"#version\" !== this.vertexSrc.substring(0, 8) && (i = i.replace(/\\s+/g, \"-\"),\r\n Eb[i] ? (Eb[i]++,\r\n i += \"-\" + Eb[i]) : Eb[i] = 1,\r\n this.vertexSrc = \"#define SHADER_NAME \" + i + \"\\n\" + this.vertexSrc,\r\n this.fragmentSrc = \"#define SHADER_NAME \" + i + \"\\n\" + this.fragmentSrc,\r\n this.vertexSrc = Ld(this.vertexSrc, aa.PRECISION_VERTEX, xa.HIGH),\r\n this.fragmentSrc = Ld(this.fragmentSrc, aa.PRECISION_FRAGMENT, qg())),\r\n this.extractData(this.vertexSrc, this.fragmentSrc),\r\n this.glPrograms = {},\r\n this.syncUniforms = null\r\n }\r\n return t.prototype.extractData = function(t, e) {\r\n var r = Kd();\r\n if (r) {\r\n var i = Gd(r, t, e);\r\n this.attributeData = this.getAttributeData(i, r),\r\n this.uniformData = this.getUniformData(i, r),\r\n r.deleteProgram(i)\r\n } else\r\n this.uniformData = {},\r\n this.attributeData = {}\r\n }\r\n ,\r\n t.prototype.getAttributeData = function(t, e) {\r\n for (var r = {}, i = [], o = e.getProgramParameter(t, e.ACTIVE_ATTRIBUTES), n = 0; n < o; n++) {\r\n var s = e.getActiveAttrib(t, n)\r\n , a = Nd(e, s.type)\r\n , u = {\r\n type: a,\r\n name: s.name,\r\n size: sg(a),\r\n location: 0\r\n };\r\n r[s.name] = u,\r\n i.push(u)\r\n }\r\n i.sort(function(t, e) {\r\n return t.name > e.name ? 1 : -1\r\n });\r\n for (n = 0; n < i.length; n++)\r\n i[n].location = n;\r\n return r\r\n }\r\n ,\r\n t.prototype.getUniformData = function(t, e) {\r\n for (var r = {}, i = e.getProgramParameter(t, e.ACTIVE_UNIFORMS), o = 0; o < i; o++) {\r\n var n = e.getActiveUniform(t, o)\r\n , s = n.name.replace(/\\[.*?\\]$/, \"\")\r\n , a = n.name.match(/\\[.*?\\]$/)\r\n , u = Nd(e, n.type);\r\n r[s] = {\r\n type: u,\r\n size: n.size,\r\n isArray: a,\r\n value: Hd(u, n.size)\r\n }\r\n }\r\n return r\r\n }\r\n ,\r\n Object.defineProperty(t, \"defaultVertexSrc\", {\r\n get: function() {\r\n return Bg\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"defaultFragmentSrc\", {\r\n get: function() {\r\n return Ag\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.from = function(e, r, i) {\r\n var o = e + r\r\n , n = jd[o];\r\n return n || (jd[o] = n = new t(e,r,i)),\r\n n\r\n }\r\n ,\r\n t\r\n }()\r\n , oc = function() {\r\n function t(t, e) {\r\n for (var r in this.program = t,\r\n this.uniformGroup = e ? e instanceof Pa ? e : new Pa(e) : new Pa({}),\r\n t.uniformData)\r\n this.uniformGroup.uniforms[r]instanceof Array && (this.uniformGroup.uniforms[r] = new Float32Array(this.uniformGroup.uniforms[r]))\r\n }\r\n return t.prototype.checkUniformExists = function(t, e) {\r\n if (e.uniforms[t])\r\n return !0;\r\n for (var r in e.uniforms) {\r\n var i = e.uniforms[r];\r\n if (i.group && this.checkUniformExists(t, i))\r\n return !0\r\n }\r\n return !1\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.uniformGroup = null\r\n }\r\n ,\r\n Object.defineProperty(t.prototype, \"uniforms\", {\r\n get: function() {\r\n return this.uniformGroup.uniforms\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.from = function(e, r, i) {\r\n return new t(nc.from(e, r),i)\r\n }\r\n ,\r\n t\r\n }()\r\n , pc = 0\r\n , qc = 1\r\n , rc = 2\r\n , sc = 3\r\n , tc = 4\r\n , uc = 5\r\n , Fb = function() {\r\n function t() {\r\n this.data = 0,\r\n this.blendMode = K.NORMAL,\r\n this.polygonOffset = 0,\r\n this.blend = !0,\r\n this.depthMask = !0\r\n }\r\n return Object.defineProperty(t.prototype, \"blend\", {\r\n get: function() {\r\n return !!(this.data & 1 << pc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << pc) !== t && (this.data ^= 1 << pc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"offsets\", {\r\n get: function() {\r\n return !!(this.data & 1 << qc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << qc) !== t && (this.data ^= 1 << qc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"culling\", {\r\n get: function() {\r\n return !!(this.data & 1 << rc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << rc) !== t && (this.data ^= 1 << rc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"depthTest\", {\r\n get: function() {\r\n return !!(this.data & 1 << sc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << sc) !== t && (this.data ^= 1 << sc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"depthMask\", {\r\n get: function() {\r\n return !!(this.data & 1 << uc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << uc) !== t && (this.data ^= 1 << uc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"clockwiseFrontFace\", {\r\n get: function() {\r\n return !!(this.data & 1 << tc)\r\n },\r\n set: function(t) {\r\n !!(this.data & 1 << tc) !== t && (this.data ^= 1 << tc)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"blendMode\", {\r\n get: function() {\r\n return this._blendMode\r\n },\r\n set: function(t) {\r\n this.blend = t !== K.NONE,\r\n this._blendMode = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"polygonOffset\", {\r\n get: function() {\r\n return this._polygonOffset\r\n },\r\n set: function(t) {\r\n this.offsets = !!t,\r\n this._polygonOffset = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.toString = function() {\r\n return \"[@pixi/core:State blendMode=\" + this.blendMode + \" clockwiseFrontFace=\" + this.clockwiseFrontFace + \" culling=\" + this.culling + \" depthMask=\" + this.depthMask + \" polygonOffset=\" + this.polygonOffset + \"]\"\r\n }\r\n ,\r\n t.for2d = function() {\r\n var e = new t;\r\n return e.depthTest = !1,\r\n e.blend = !0,\r\n e\r\n }\r\n ,\r\n t\r\n }()\r\n , Dg = \"attribute vec2 aVertexPosition;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform vec4 inputSize;\\nuniform vec4 outputFrame;\\n\\nvec4 filterVertexPosition( void )\\n{\\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\\n\\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\\n}\\n\\nvec2 filterTextureCoord( void )\\n{\\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\\n}\\n\\nvoid main(void)\\n{\\n gl_Position = filterVertexPosition();\\n vTextureCoord = filterTextureCoord();\\n}\\n\"\r\n , Eg = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\n\\nvoid main(void){\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n}\\n\"\r\n , Fg = function(t) {\r\n function e(r, i, o) {\r\n var n = this\r\n , s = nc.from(r || e.defaultVertexSrc, i || e.defaultFragmentSrc);\r\n return (n = t.call(this, s, o) || this).padding = 0,\r\n n.resolution = aa.FILTER_RESOLUTION,\r\n n.enabled = !0,\r\n n.autoFit = !0,\r\n n.legacy = !!n.program.attributeData.aTextureCoord,\r\n n.state = new Fb,\r\n n\r\n }\r\n return ba(e, t),\r\n e.prototype.apply = function(t, e, r, i, o) {\r\n t.applyFilter(this, e, r, i)\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"blendMode\", {\r\n get: function() {\r\n return this.state.blendMode\r\n },\r\n set: function(t) {\r\n this.state.blendMode = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e, \"defaultVertexSrc\", {\r\n get: function() {\r\n return Dg\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e, \"defaultFragmentSrc\", {\r\n get: function() {\r\n return Eg\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e\r\n }(oc)\r\n , Gg = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\nuniform mat3 otherMatrix;\\n\\nvarying vec2 vMaskCoord;\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n\\n vTextureCoord = aTextureCoord;\\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\\n}\\n\"\r\n , Hg = \"varying vec2 vMaskCoord;\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform sampler2D mask;\\nuniform float alpha;\\nuniform float npmAlpha;\\nuniform vec4 maskClamp;\\n\\nvoid main(void)\\n{\\n float clip = step(3.5,\\n step(maskClamp.x, vMaskCoord.x) +\\n step(maskClamp.y, vMaskCoord.y) +\\n step(vMaskCoord.x, maskClamp.z) +\\n step(vMaskCoord.y, maskClamp.w));\\n\\n vec4 original = texture2D(uSampler, vTextureCoord);\\n vec4 masky = texture2D(mask, vMaskCoord);\\n float alphaMul = 1.0 - npmAlpha * (1.0 - masky.a);\\n\\n original *= (alphaMul * masky.r * alpha * clip);\\n\\n gl_FragColor = original;\\n}\\n\"\r\n , Od = new la\r\n , Ig = function() {\r\n function t(t, e) {\r\n this._texture = t,\r\n this.mapCoord = new la,\r\n this.uClampFrame = new Float32Array(4),\r\n this.uClampOffset = new Float32Array(2),\r\n this._textureID = -1,\r\n this._updateID = 0,\r\n this.clampOffset = 0,\r\n this.clampMargin = void 0 === e ? .5 : e,\r\n this.isSimple = !1\r\n }\r\n return Object.defineProperty(t.prototype, \"texture\", {\r\n get: function() {\r\n return this._texture\r\n },\r\n set: function(t) {\r\n this._texture = t,\r\n this._textureID = -1\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.multiplyUvs = function(t, e) {\r\n void 0 === e && (e = t);\r\n for (var r = this.mapCoord, i = 0; i < t.length; i += 2) {\r\n var o = t[i]\r\n , n = t[i + 1];\r\n e[i] = o * r.a + n * r.c + r.tx,\r\n e[i + 1] = o * r.b + n * r.d + r.ty\r\n }\r\n return e\r\n }\r\n ,\r\n t.prototype.update = function(t) {\r\n var e = this._texture;\r\n if (!e || !e.valid)\r\n return !1;\r\n if (!t && this._textureID === e._updateID)\r\n return !1;\r\n this._textureID = e._updateID,\r\n this._updateID++;\r\n var r = e._uvs;\r\n this.mapCoord.set(r.x1 - r.x0, r.y1 - r.y0, r.x3 - r.x0, r.y3 - r.y0, r.x0, r.y0);\r\n var i = e.orig\r\n , o = e.trim;\r\n o && (Od.set(i.width / o.width, 0, 0, i.height / o.height, -o.x / o.width, -o.y / o.height),\r\n this.mapCoord.append(Od));\r\n var n = e.baseTexture\r\n , s = this.uClampFrame\r\n , a = this.clampMargin / n.resolution\r\n , u = this.clampOffset;\r\n return s[0] = (e._frame.x + a + u) / n.width,\r\n s[1] = (e._frame.y + a + u) / n.height,\r\n s[2] = (e._frame.x + e._frame.width - a + u) / n.width,\r\n s[3] = (e._frame.y + e._frame.height - a + u) / n.height,\r\n this.uClampOffset[0] = u / n.realWidth,\r\n this.uClampOffset[1] = u / n.realHeight,\r\n this.isSimple = e._frame.width === n.width && e._frame.height === n.height && 0 === e.rotate,\r\n !0\r\n }\r\n ,\r\n t\r\n }()\r\n , Jg = function(t) {\r\n function e(e) {\r\n var r = this\r\n , i = new la;\r\n return r = t.call(this, Gg, Hg) || this,\r\n e.renderable = !1,\r\n r.maskSprite = e,\r\n r.maskMatrix = i,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.apply = function(t, e, r, i) {\r\n var o = this.maskSprite\r\n , n = o._texture;\r\n n.valid && (n.uvMatrix || (n.uvMatrix = new Ig(n,0)),\r\n n.uvMatrix.update(),\r\n this.uniforms.npmAlpha = n.baseTexture.alphaMode ? 0 : 1,\r\n this.uniforms.mask = n,\r\n this.uniforms.otherMatrix = t.calculateSpriteMatrix(this.maskMatrix, o).prepend(n.uvMatrix.mapCoord),\r\n this.uniforms.alpha = o.worldAlpha,\r\n this.uniforms.maskClamp = n.uvMatrix.uClampFrame,\r\n t.applyFilter(this, e, r, i))\r\n }\r\n ,\r\n e\r\n }(Fg)\r\n , Pd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.enableScissor = !0,\r\n r.alphaMaskPool = [],\r\n r.maskDataPool = [],\r\n r.maskStack = [],\r\n r.alphaMaskIndex = 0,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.setMaskStack = function(t) {\r\n this.maskStack = t,\r\n this.renderer.scissor.setMaskStack(t),\r\n this.renderer.stencil.setMaskStack(t)\r\n }\r\n ,\r\n e.prototype.push = function(t, e) {\r\n var r = e;\r\n if (!r.isMaskData) {\r\n var i = this.maskDataPool.pop() || new pg;\r\n i.pooled = !0,\r\n i.maskObject = e,\r\n r = i\r\n }\r\n switch (r.autoDetect && this.detect(r),\r\n r.copyCountersOrReset(this.maskStack[this.maskStack.length - 1]),\r\n r._target = t,\r\n r.type) {\r\n case qa.SCISSOR:\r\n this.maskStack.push(r),\r\n this.renderer.scissor.push(r);\r\n break;\r\n case qa.STENCIL:\r\n this.maskStack.push(r),\r\n this.renderer.stencil.push(r);\r\n break;\r\n case qa.SPRITE:\r\n r.copyCountersOrReset(null),\r\n this.pushSpriteMask(r),\r\n this.maskStack.push(r);\r\n }\r\n }\r\n ,\r\n e.prototype.pop = function(t) {\r\n var e = this.maskStack.pop();\r\n if (e && e._target === t) {\r\n switch (e.type) {\r\n case qa.SCISSOR:\r\n this.renderer.scissor.pop();\r\n break;\r\n case qa.STENCIL:\r\n this.renderer.stencil.pop(e.maskObject);\r\n break;\r\n case qa.SPRITE:\r\n this.popSpriteMask();\r\n }\r\n e.reset(),\r\n e.pooled && this.maskDataPool.push(e)\r\n }\r\n }\r\n ,\r\n e.prototype.detect = function(t) {\r\n var e = t.maskObject;\r\n if (e.isSprite)\r\n t.type = qa.SPRITE;\r\n else if (t.type = qa.STENCIL,\r\n this.enableScissor && e.isFastRect && e.isFastRect()) {\r\n var r = e.worldTransform\r\n , i = Math.atan2(r.b, r.a)\r\n , o = Math.atan2(r.d, r.c);\r\n i = Math.round(i * (180 / Math.PI) * 100),\r\n o = ((o = Math.round(o * (180 / Math.PI) * 100) - i) % 18e3 + 18e3) % 18e3,\r\n 0 === (i = (i % 9e3 + 9e3) % 9e3) && 9e3 === o && (t.type = qa.SCISSOR)\r\n }\r\n }\r\n ,\r\n e.prototype.pushSpriteMask = function(t) {\r\n var e = t.maskObject\r\n , r = t._target\r\n , i = this.alphaMaskPool[this.alphaMaskIndex];\r\n i || (i = this.alphaMaskPool[this.alphaMaskIndex] = [new Jg(e)]),\r\n i[0].resolution = this.renderer.resolution,\r\n i[0].maskSprite = e;\r\n var o = r.filterArea;\r\n r.filterArea = e.getBounds(!0),\r\n this.renderer.filter.push(r, i),\r\n r.filterArea = o,\r\n this.alphaMaskIndex++\r\n }\r\n ,\r\n e.prototype.popSpriteMask = function() {\r\n this.renderer.filter.pop(),\r\n this.alphaMaskIndex--\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , Qd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.maskStack = [],\r\n r.glConst = 0,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.getStackLength = function() {\r\n return this.maskStack.length\r\n }\r\n ,\r\n e.prototype.setMaskStack = function(t) {\r\n var e = this.renderer.gl\r\n , r = this.getStackLength();\r\n this.maskStack = t;\r\n var i = this.getStackLength();\r\n i !== r && (0 === i ? e.disable(this.glConst) : (e.enable(this.glConst),\r\n this._useCurrent()))\r\n }\r\n ,\r\n e.prototype._useCurrent = function() {}\r\n ,\r\n e.prototype.destroy = function() {\r\n t.prototype.destroy.call(this),\r\n this.maskStack = null\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , Rd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.glConst = WebGLRenderingContext.SCISSOR_TEST,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.getStackLength = function() {\r\n var t = this.maskStack[this.maskStack.length - 1];\r\n return t ? t._scissorCounter : 0\r\n }\r\n ,\r\n e.prototype.push = function(t) {\r\n var e = t.maskObject;\r\n e.renderable = !0;\r\n var r = t._scissorRect\r\n , i = e.getBounds(!0)\r\n , o = this.renderer.gl;\r\n e.renderable = !1,\r\n r ? i.fit(r) : o.enable(o.SCISSOR_TEST),\r\n t._scissorCounter++,\r\n t._scissorRect = i,\r\n this._useCurrent()\r\n }\r\n ,\r\n e.prototype.pop = function() {\r\n var t = this.renderer.gl;\r\n this.getStackLength() > 0 ? this._useCurrent() : t.disable(t.SCISSOR_TEST)\r\n }\r\n ,\r\n e.prototype._useCurrent = function() {\r\n var t = this.maskStack[this.maskStack.length - 1]._scissorRect\r\n , e = this.renderer.renderTexture.current\r\n , r = this.renderer.projection\r\n , i = r.transform\r\n , o = r.sourceFrame\r\n , n = r.destinationFrame\r\n , s = e ? e.resolution : this.renderer.resolution\r\n , a = n.width / o.width\r\n , u = n.height / o.height\r\n , h = ((t.x - o.x) * a + n.x) * s\r\n , $ = ((t.y - o.y) * u + n.y) * s\r\n , p = t.width * a * s\r\n , l = t.height * u * s;\r\n i && (h += i.tx * s,\r\n $ += i.ty * s),\r\n e || ($ = this.renderer.height - l - $),\r\n this.renderer.gl.scissor(h, $, p, l)\r\n }\r\n ,\r\n e\r\n }(Qd)\r\n , Sd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.glConst = WebGLRenderingContext.STENCIL_TEST,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.getStackLength = function() {\r\n var t = this.maskStack[this.maskStack.length - 1];\r\n return t ? t._stencilCounter : 0\r\n }\r\n ,\r\n e.prototype.push = function(t) {\r\n var e = t.maskObject\r\n , r = this.renderer.gl\r\n , i = t._stencilCounter;\r\n 0 === i && (this.renderer.framebuffer.forceStencil(),\r\n r.enable(r.STENCIL_TEST)),\r\n t._stencilCounter++,\r\n r.colorMask(!1, !1, !1, !1),\r\n r.stencilFunc(r.EQUAL, i, this._getBitwiseMask()),\r\n r.stencilOp(r.KEEP, r.KEEP, r.INCR),\r\n e.renderable = !0,\r\n e.render(this.renderer),\r\n this.renderer.batch.flush(),\r\n this.renderer.framebuffer.blit(),\r\n e.renderable = !1,\r\n this._useCurrent()\r\n }\r\n ,\r\n e.prototype.pop = function(t) {\r\n var e = this.renderer.gl;\r\n 0 === this.getStackLength() ? (e.disable(e.STENCIL_TEST),\r\n e.clear(e.STENCIL_BUFFER_BIT),\r\n e.clearStencil(0)) : (e.colorMask(!1, !1, !1, !1),\r\n e.stencilOp(e.KEEP, e.KEEP, e.DECR),\r\n t.renderable = !0,\r\n t.render(this.renderer),\r\n this.renderer.batch.flush(),\r\n t.renderable = !1,\r\n this._useCurrent())\r\n }\r\n ,\r\n e.prototype._useCurrent = function() {\r\n var t = this.renderer.gl;\r\n t.colorMask(!0, !0, !0, !0),\r\n t.stencilFunc(t.EQUAL, this.getStackLength(), this._getBitwiseMask()),\r\n t.stencilOp(t.KEEP, t.KEEP, t.KEEP)\r\n }\r\n ,\r\n e.prototype._getBitwiseMask = function() {\r\n return (1 << this.getStackLength()) - 1\r\n }\r\n ,\r\n e\r\n }(Qd)\r\n , Td = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.destinationFrame = null,\r\n r.sourceFrame = null,\r\n r.defaultFrame = null,\r\n r.projectionMatrix = new la,\r\n r.transform = null,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.update = function(t, e, r, i) {\r\n this.destinationFrame = t || this.destinationFrame || this.defaultFrame,\r\n this.sourceFrame = e || this.sourceFrame || t,\r\n this.calculateProjection(this.destinationFrame, this.sourceFrame, r, i),\r\n this.transform && this.projectionMatrix.append(this.transform);\r\n var o = this.renderer;\r\n o.globalUniforms.uniforms.projectionMatrix = this.projectionMatrix,\r\n o.globalUniforms.update(),\r\n o.shader.shader && o.shader.syncUniformGroup(o.shader.shader.uniforms.globals)\r\n }\r\n ,\r\n e.prototype.calculateProjection = function(t, e, r, i) {\r\n var o = this.projectionMatrix\r\n , n = i ? -1 : 1;\r\n o.identity(),\r\n o.a = 1 / e.width * 2,\r\n o.d = n * (1 / e.height * 2),\r\n o.tx = -1 - e.x * o.a,\r\n o.ty = -n - e.y * o.d\r\n }\r\n ,\r\n e.prototype.setTransform = function(t) {}\r\n ,\r\n e\r\n }(pa)\r\n , Qa = new da\r\n , fb = new da\r\n , Ud = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.clearColor = e._backgroundColorRgba,\r\n r.defaultMaskStack = [],\r\n r.current = null,\r\n r.sourceFrame = new da,\r\n r.destinationFrame = new da,\r\n r.viewportFrame = new da,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.bind = function(t, e, r) {\r\n void 0 === t && (t = null);\r\n var i, o, n, s = this.renderer;\r\n this.current = t,\r\n t ? (n = (i = t.baseTexture).resolution,\r\n e || (Qa.width = t.frame.width,\r\n Qa.height = t.frame.height,\r\n e = Qa),\r\n r || (fb.x = t.frame.x,\r\n fb.y = t.frame.y,\r\n fb.width = e.width,\r\n fb.height = e.height,\r\n r = fb),\r\n o = i.framebuffer) : (n = s.resolution,\r\n e || (Qa.width = s.screen.width,\r\n Qa.height = s.screen.height,\r\n e = Qa),\r\n r || ((r = Qa).width = e.width,\r\n r.height = e.height));\r\n var a = this.viewportFrame;\r\n a.x = r.x * n,\r\n a.y = r.y * n,\r\n a.width = r.width * n,\r\n a.height = r.height * n,\r\n t || (a.y = s.view.height - (a.y + a.height)),\r\n this.renderer.framebuffer.bind(o, a),\r\n this.renderer.projection.update(r, e, n, !o),\r\n t ? this.renderer.mask.setMaskStack(i.maskStack) : this.renderer.mask.setMaskStack(this.defaultMaskStack),\r\n this.sourceFrame.copyFrom(e),\r\n this.destinationFrame.copyFrom(r)\r\n }\r\n ,\r\n e.prototype.clear = function(t, e) {\r\n t = this.current ? t || this.current.baseTexture.clearColor : t || this.clearColor;\r\n var r = this.destinationFrame\r\n , i = this.current ? this.current.baseTexture : this.renderer.screen\r\n , o = r.width !== i.width || r.height !== i.height;\r\n if (o) {\r\n var n = this.viewportFrame\r\n , s = n.x\r\n , a = n.y\r\n , u = n.width\r\n , h = n.height;\r\n this.renderer.gl.enable(this.renderer.gl.SCISSOR_TEST),\r\n this.renderer.gl.scissor(s, a, u, h)\r\n }\r\n this.renderer.framebuffer.clear(t[0], t[1], t[2], t[3], e),\r\n o && this.renderer.scissor.pop()\r\n }\r\n ,\r\n e.prototype.resize = function() {\r\n this.bind(null)\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.bind(null)\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , h = function() {\r\n return function() {}\r\n }()\r\n , Kg = function() {\r\n function t(t, e) {\r\n this.program = t,\r\n this.uniformData = e,\r\n this.uniformGroups = {}\r\n }\r\n return t.prototype.destroy = function() {\r\n this.uniformData = null,\r\n this.uniformGroups = null,\r\n this.program = null\r\n }\r\n ,\r\n t\r\n }()\r\n , Lg = 0\r\n , Vd = {\r\n textureCount: 0\r\n }\r\n , Wd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.destroyed = !1,\r\n r.systemCheck(),\r\n r.gl = null,\r\n r.shader = null,\r\n r.program = null,\r\n r.cache = {},\r\n r.id = Lg++,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.systemCheck = function() {\r\n if (!zg())\r\n throw new Error(\"Current environment does not allow unsafe-eval, please use @pixi/unsafe-eval module to enable support.\")\r\n }\r\n ,\r\n e.prototype.contextChange = function(t) {\r\n this.gl = t,\r\n this.reset()\r\n }\r\n ,\r\n e.prototype.bind = function(t, e) {\r\n t.uniforms.globals = this.renderer.globalUniforms;\r\n var r = t.program\r\n , i = r.glPrograms[this.renderer.CONTEXT_UID] || this.generateShader(t);\r\n return this.shader = t,\r\n this.program !== r && (this.program = r,\r\n this.gl.useProgram(i.program)),\r\n e || (Vd.textureCount = 0,\r\n this.syncUniformGroup(t.uniformGroup, Vd)),\r\n i\r\n }\r\n ,\r\n e.prototype.setUniforms = function(t) {\r\n var e = this.shader.program\r\n , r = e.glPrograms[this.renderer.CONTEXT_UID];\r\n e.syncUniforms(r.uniformData, t, this.renderer)\r\n }\r\n ,\r\n e.prototype.syncUniformGroup = function(t, e) {\r\n var r = this.getglProgram();\r\n t.static && t.dirtyId === r.uniformGroups[t.id] || (r.uniformGroups[t.id] = t.dirtyId,\r\n this.syncUniforms(t, r, e))\r\n }\r\n ,\r\n e.prototype.syncUniforms = function(t, e, r) {\r\n (t.syncUniforms[this.shader.program.id] || this.createSyncGroups(t))(e.uniformData, t.uniforms, this.renderer, r)\r\n }\r\n ,\r\n e.prototype.createSyncGroups = function(t) {\r\n var e = this.getSignature(t, this.shader.program.uniformData);\r\n return this.cache[e] || (this.cache[e] = vg(t, this.shader.program.uniformData)),\r\n t.syncUniforms[this.shader.program.id] = this.cache[e],\r\n t.syncUniforms[this.shader.program.id]\r\n }\r\n ,\r\n e.prototype.getSignature = function(t, e) {\r\n var r = t.uniforms\r\n , i = [];\r\n for (var o in r)\r\n i.push(o),\r\n e[o] && i.push(e[o].type);\r\n return i.join(\"-\")\r\n }\r\n ,\r\n e.prototype.getglProgram = function() {\r\n return this.shader ? this.shader.program.glPrograms[this.renderer.CONTEXT_UID] : null\r\n }\r\n ,\r\n e.prototype.generateShader = function(t) {\r\n var e = this.gl\r\n , r = t.program\r\n , i = {};\r\n for (var o in r.attributeData)\r\n i[o] = r.attributeData[o].location;\r\n var n = Gd(e, r.vertexSrc, r.fragmentSrc, i)\r\n , s = {};\r\n for (var o in r.uniformData) {\r\n var a = r.uniformData[o];\r\n s[o] = {\r\n location: e.getUniformLocation(n, o),\r\n value: Hd(a.type, a.size)\r\n }\r\n }\r\n var u = new Kg(n,s);\r\n return r.glPrograms[this.renderer.CONTEXT_UID] = u,\r\n u\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.program = null,\r\n this.shader = null\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n this.destroyed = !0\r\n }\r\n ,\r\n e\r\n }(pa);\r\n function Mg(t, e) {\r\n return void 0 === e && (e = []),\r\n e[K.NORMAL] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.ADD] = [t.ONE, t.ONE],\r\n e[K.MULTIPLY] = [t.DST_COLOR, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.SCREEN] = [t.ONE, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.OVERLAY] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.DARKEN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.LIGHTEN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.COLOR_DODGE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.COLOR_BURN] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.HARD_LIGHT] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.SOFT_LIGHT] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.DIFFERENCE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.EXCLUSION] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.HUE] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.SATURATION] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.COLOR] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.LUMINOSITY] = [t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.NONE] = [0, 0],\r\n e[K.NORMAL_NPM] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.ADD_NPM] = [t.SRC_ALPHA, t.ONE, t.ONE, t.ONE],\r\n e[K.SCREEN_NPM] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.SRC_IN] = [t.DST_ALPHA, t.ZERO],\r\n e[K.SRC_OUT] = [t.ONE_MINUS_DST_ALPHA, t.ZERO],\r\n e[K.SRC_ATOP] = [t.DST_ALPHA, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.DST_OVER] = [t.ONE_MINUS_DST_ALPHA, t.ONE],\r\n e[K.DST_IN] = [t.ZERO, t.SRC_ALPHA],\r\n e[K.DST_OUT] = [t.ZERO, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.DST_ATOP] = [t.ONE_MINUS_DST_ALPHA, t.SRC_ALPHA],\r\n e[K.XOR] = [t.ONE_MINUS_DST_ALPHA, t.ONE_MINUS_SRC_ALPHA],\r\n e[K.SUBTRACT] = [t.ONE, t.ONE, t.ONE, t.ONE, t.FUNC_REVERSE_SUBTRACT, t.FUNC_ADD],\r\n e\r\n }\r\n var Xd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.gl = null,\r\n r.stateId = 0,\r\n r.polygonOffset = 0,\r\n r.blendMode = K.NONE,\r\n r._blendEq = !1,\r\n r.map = [],\r\n r.checks = [],\r\n r.defaultState = new Fb,\r\n r.defaultState.blend = !0,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.contextChange = function(t) {\r\n this.gl = t,\r\n this.blendModes = Mg(t),\r\n this.set(this.defaultState),\r\n this.reset()\r\n }\r\n ,\r\n e.prototype.set = function(t) {\r\n if (t = t || this.defaultState,\r\n this.stateId !== t.data) {\r\n for (var e = this.stateId ^ t.data, r = 0; e; )\r\n 1 & e && this.map[r].call(this, !!(t.data & 1 << r)),\r\n e >>= 1,\r\n r++;\r\n this.stateId = t.data\r\n }\r\n for (r = 0; r < this.checks.length; r++)\r\n this.checks[r](this, t)\r\n }\r\n ,\r\n e.prototype.forceState = function(t) {\r\n t = t || this.defaultState;\r\n for (var e = 0; e < this.map.length; e++)\r\n this.map[e].call(this, !!(t.data & 1 << e));\r\n for (e = 0; e < this.checks.length; e++)\r\n this.checks[e](this, t);\r\n this.stateId = t.data\r\n }\r\n ,\r\n e.prototype.setBlend = function(t) {\r\n this.updateCheck(e.checkBlendMode, t),\r\n this.gl[t ? \"enable\" : \"disable\"](this.gl.BLEND)\r\n }\r\n ,\r\n e.prototype.setOffset = function(t) {\r\n this.updateCheck(e.checkPolygonOffset, t),\r\n this.gl[t ? \"enable\" : \"disable\"](this.gl.POLYGON_OFFSET_FILL)\r\n }\r\n ,\r\n e.prototype.setDepthTest = function(t) {\r\n this.gl[t ? \"enable\" : \"disable\"](this.gl.DEPTH_TEST)\r\n }\r\n ,\r\n e.prototype.setDepthMask = function(t) {\r\n this.gl.depthMask(t)\r\n }\r\n ,\r\n e.prototype.setCullFace = function(t) {\r\n this.gl[t ? \"enable\" : \"disable\"](this.gl.CULL_FACE)\r\n }\r\n ,\r\n e.prototype.setFrontFace = function(t) {\r\n this.gl.frontFace(this.gl[t ? \"CW\" : \"CCW\"])\r\n }\r\n ,\r\n e.prototype.setBlendMode = function(t) {\r\n if (t !== this.blendMode) {\r\n this.blendMode = t;\r\n var e = this.blendModes[t]\r\n , r = this.gl;\r\n 2 === e.length ? r.blendFunc(e[0], e[1]) : r.blendFuncSeparate(e[0], e[1], e[2], e[3]),\r\n 6 === e.length ? (this._blendEq = !0,\r\n r.blendEquationSeparate(e[4], e[5])) : this._blendEq && (this._blendEq = !1,\r\n r.blendEquationSeparate(r.FUNC_ADD, r.FUNC_ADD))\r\n }\r\n }\r\n ,\r\n e.prototype.setPolygonOffset = function(t, e) {\r\n this.gl.polygonOffset(t, e)\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, !1),\r\n this.forceState(this.defaultState),\r\n this._blendEq = !0,\r\n this.blendMode = -1,\r\n this.setBlendMode(0)\r\n }\r\n ,\r\n e.prototype.updateCheck = function(t, e) {\r\n var r = this.checks.indexOf(t);\r\n e && -1 === r ? this.checks.push(t) : e || -1 === r || this.checks.splice(r, 1)\r\n }\r\n ,\r\n e.checkBlendMode = function(t, e) {\r\n t.setBlendMode(e.blendMode)\r\n }\r\n ,\r\n e.checkPolygonOffset = function(t, e) {\r\n t.setPolygonOffset(1, e.polygonOffset)\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , Yd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.count = 0,\r\n r.checkCount = 0,\r\n r.maxIdle = aa.GC_MAX_IDLE,\r\n r.checkCountMax = aa.GC_MAX_CHECK_COUNT,\r\n r.mode = aa.GC_MODE,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.postrender = function() {\r\n this.renderer.renderingToScreen && (this.count++,\r\n this.mode !== Tc.MANUAL && (this.checkCount++,\r\n this.checkCount > this.checkCountMax && (this.checkCount = 0,\r\n this.run())))\r\n }\r\n ,\r\n e.prototype.run = function() {\r\n for (var t = this.renderer.texture, e = t.managedTextures, r = !1, i = 0; i < e.length; i++) {\r\n var o = e[i];\r\n !o.framebuffer && this.count - o.touched > this.maxIdle && (t.destroyTexture(o, !0),\r\n e[i] = null,\r\n r = !0)\r\n }\r\n if (r) {\r\n var n = 0;\r\n for (i = 0; i < e.length; i++)\r\n null !== e[i] && (e[n++] = e[i]);\r\n e.length = n\r\n }\r\n }\r\n ,\r\n e.prototype.unload = function(t) {\r\n var e = this.renderer.texture\r\n , r = t._texture;\r\n r && !r.framebuffer && e.destroyTexture(r);\r\n for (var i = t.children.length - 1; i >= 0; i--)\r\n this.unload(t.children[i])\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , vc = function() {\r\n return function(t) {\r\n this.texture = t,\r\n this.width = -1,\r\n this.height = -1,\r\n this.dirtyId = -1,\r\n this.dirtyStyleId = -1,\r\n this.mipmap = !1,\r\n this.wrapMode = 33071,\r\n this.type = 6408,\r\n this.internalFormat = 5121\r\n }\r\n }()\r\n , Zd = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.boundTextures = [],\r\n r.currentLocation = -1,\r\n r.managedTextures = [],\r\n r._unknownBoundTextures = !1,\r\n r.unknownTexture = new ia,\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.contextChange = function() {\r\n var t = this.gl = this.renderer.gl;\r\n this.CONTEXT_UID = this.renderer.CONTEXT_UID,\r\n this.webGLVersion = this.renderer.context.webGLVersion;\r\n var e = t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS);\r\n this.boundTextures.length = e;\r\n for (var r = 0; r < e; r++)\r\n this.boundTextures[r] = null;\r\n this.emptyTextures = {};\r\n var i = new vc(t.createTexture());\r\n t.bindTexture(t.TEXTURE_2D, i.texture),\r\n t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, 1, 1, 0, t.RGBA, t.UNSIGNED_BYTE, new Uint8Array(4)),\r\n this.emptyTextures[t.TEXTURE_2D] = i,\r\n this.emptyTextures[t.TEXTURE_CUBE_MAP] = new vc(t.createTexture()),\r\n t.bindTexture(t.TEXTURE_CUBE_MAP, this.emptyTextures[t.TEXTURE_CUBE_MAP].texture);\r\n for (r = 0; r < 6; r++)\r\n t.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X + r, 0, t.RGBA, 1, 1, 0, t.RGBA, t.UNSIGNED_BYTE, null);\r\n t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MAG_FILTER, t.LINEAR),\r\n t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MIN_FILTER, t.LINEAR);\r\n for (r = 0; r < this.boundTextures.length; r++)\r\n this.bind(null, r)\r\n }\r\n ,\r\n e.prototype.bind = function(t, e) {\r\n void 0 === e && (e = 0);\r\n var r = this.gl;\r\n if (t) {\r\n if ((t = t.castToBaseTexture()).parentTextureArray)\r\n return;\r\n if (t.valid) {\r\n t.touched = this.renderer.textureGC.count;\r\n var i = t._glTextures[this.CONTEXT_UID] || this.initTexture(t);\r\n this.boundTextures[e] !== t && (this.currentLocation !== e && (this.currentLocation = e,\r\n r.activeTexture(r.TEXTURE0 + e)),\r\n r.bindTexture(t.target, i.texture)),\r\n i.dirtyId !== t.dirtyId && (this.currentLocation !== e && (this.currentLocation = e,\r\n r.activeTexture(r.TEXTURE0 + e)),\r\n this.updateTexture(t)),\r\n this.boundTextures[e] = t\r\n }\r\n } else\r\n this.currentLocation !== e && (this.currentLocation = e,\r\n r.activeTexture(r.TEXTURE0 + e)),\r\n r.bindTexture(r.TEXTURE_2D, this.emptyTextures[r.TEXTURE_2D].texture),\r\n this.boundTextures[e] = null\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n this._unknownBoundTextures = !0,\r\n this.currentLocation = -1;\r\n for (var t = 0; t < this.boundTextures.length; t++)\r\n this.boundTextures[t] = this.unknownTexture\r\n }\r\n ,\r\n e.prototype.unbind = function(t) {\r\n var e = this.gl\r\n , r = this.boundTextures;\r\n if (this._unknownBoundTextures) {\r\n this._unknownBoundTextures = !1;\r\n for (var i = 0; i < r.length; i++)\r\n r[i] === this.unknownTexture && this.bind(null, i)\r\n }\r\n for (i = 0; i < r.length; i++)\r\n r[i] === t && (this.currentLocation !== i && (e.activeTexture(e.TEXTURE0 + i),\r\n this.currentLocation = i),\r\n e.bindTexture(t.target, this.emptyTextures[t.target].texture),\r\n r[i] = null)\r\n }\r\n ,\r\n e.prototype.initTexture = function(t) {\r\n var e = new vc(this.gl.createTexture());\r\n return e.dirtyId = -1,\r\n t._glTextures[this.CONTEXT_UID] = e,\r\n this.managedTextures.push(t),\r\n t.on(\"dispose\", this.destroyTexture, this),\r\n e\r\n }\r\n ,\r\n e.prototype.initTextureType = function(t, e) {\r\n if (e.internalFormat = t.format,\r\n e.type = t.type,\r\n 2 === this.webGLVersion) {\r\n var r = this.renderer.gl;\r\n t.type === r.FLOAT && t.format === r.RGBA && (e.internalFormat = r.RGBA32F),\r\n t.type === ua.HALF_FLOAT && (e.type = r.HALF_FLOAT),\r\n e.type === r.HALF_FLOAT && t.format === r.RGBA && (e.internalFormat = r.RGBA16F)\r\n }\r\n }\r\n ,\r\n e.prototype.updateTexture = function(t) {\r\n var e = t._glTextures[this.CONTEXT_UID];\r\n if (e) {\r\n var r = this.renderer;\r\n if (this.initTextureType(t, e),\r\n t.resource && t.resource.upload(r, t, e))\r\n ;\r\n else {\r\n var i = t.realWidth\r\n , o = t.realHeight\r\n , n = r.gl;\r\n (e.width !== i || e.height !== o || e.dirtyId < 0) && (e.width = i,\r\n e.height = o,\r\n n.texImage2D(t.target, 0, e.internalFormat, i, o, 0, t.format, e.type, null))\r\n }\r\n t.dirtyStyleId !== e.dirtyStyleId && this.updateTextureStyle(t),\r\n e.dirtyId = t.dirtyId\r\n }\r\n }\r\n ,\r\n e.prototype.destroyTexture = function(t, e) {\r\n var r = this.gl;\r\n if ((t = t.castToBaseTexture())._glTextures[this.CONTEXT_UID] && (this.unbind(t),\r\n r.deleteTexture(t._glTextures[this.CONTEXT_UID].texture),\r\n t.off(\"dispose\", this.destroyTexture, this),\r\n delete t._glTextures[this.CONTEXT_UID],\r\n !e)) {\r\n var i = this.managedTextures.indexOf(t);\r\n -1 !== i && tb(this.managedTextures, i, 1)\r\n }\r\n }\r\n ,\r\n e.prototype.updateTextureStyle = function(t) {\r\n var e = t._glTextures[this.CONTEXT_UID];\r\n e && (t.mipmap !== $a.POW2 && 2 === this.webGLVersion || t.isPowerOfTwo ? e.mipmap = t.mipmap >= 1 : e.mipmap = !1,\r\n 2 === this.webGLVersion || t.isPowerOfTwo ? e.wrapMode = t.wrapMode : e.wrapMode = Rb.CLAMP,\r\n t.resource && t.resource.style(this.renderer, t, e) || this.setStyle(t, e),\r\n e.dirtyStyleId = t.dirtyStyleId)\r\n }\r\n ,\r\n e.prototype.setStyle = function(t, e) {\r\n var r = this.gl;\r\n if (e.mipmap && t.mipmap !== $a.ON_MANUAL && r.generateMipmap(t.target),\r\n r.texParameteri(t.target, r.TEXTURE_WRAP_S, e.wrapMode),\r\n r.texParameteri(t.target, r.TEXTURE_WRAP_T, e.wrapMode),\r\n e.mipmap) {\r\n r.texParameteri(t.target, r.TEXTURE_MIN_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR_MIPMAP_LINEAR : r.NEAREST_MIPMAP_NEAREST);\r\n var i = this.renderer.context.extensions.anisotropicFiltering;\r\n if (i && t.anisotropicLevel > 0 && t.scaleMode === Ca.LINEAR) {\r\n var o = Math.min(t.anisotropicLevel, r.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT));\r\n r.texParameterf(t.target, i.TEXTURE_MAX_ANISOTROPY_EXT, o)\r\n }\r\n } else\r\n r.texParameteri(t.target, r.TEXTURE_MIN_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR : r.NEAREST);\r\n r.texParameteri(t.target, r.TEXTURE_MAG_FILTER, t.scaleMode === Ca.LINEAR ? r.LINEAR : r.NEAREST)\r\n }\r\n ,\r\n e\r\n }(pa)\r\n , $d = {\r\n __proto__: null,\r\n FilterSystem: yd,\r\n BatchSystem: Ad,\r\n ContextSystem: Cd,\r\n FramebufferSystem: Dd,\r\n GeometrySystem: Ed,\r\n MaskSystem: Pd,\r\n ScissorSystem: Rd,\r\n StencilSystem: Sd,\r\n ProjectionSystem: Td,\r\n RenderTextureSystem: Ud,\r\n ShaderSystem: Wd,\r\n StateSystem: Xd,\r\n TextureGCSystem: Yd,\r\n TextureSystem: Zd\r\n }\r\n , wc = new la\r\n , Ng = function(t) {\r\n function e(e, r) {\r\n void 0 === e && (e = jb.UNKNOWN);\r\n var i = t.call(this) || this;\r\n return r = Object.assign({}, aa.RENDER_OPTIONS, r),\r\n i.options = r,\r\n i.type = e,\r\n i.screen = new da(0,0,r.width,r.height),\r\n i.view = r.view || document.createElement(\"canvas\"),\r\n i.resolution = r.resolution || aa.RESOLUTION,\r\n i.useContextAlpha = r.useContextAlpha,\r\n i.autoDensity = !!r.autoDensity,\r\n i.preserveDrawingBuffer = r.preserveDrawingBuffer,\r\n i.clearBeforeRender = r.clearBeforeRender,\r\n i._backgroundColor = 0,\r\n i._backgroundColorRgba = [0, 0, 0, 1],\r\n i._backgroundColorString = \"#000000\",\r\n i.backgroundColor = r.backgroundColor || i._backgroundColor,\r\n i.backgroundAlpha = r.backgroundAlpha,\r\n void 0 !== r.transparent && (Va(\"6.0.0\", \"Option transparent is deprecated, please use backgroundAlpha instead.\"),\r\n i.useContextAlpha = r.transparent,\r\n i.backgroundAlpha = r.transparent ? 0 : 1),\r\n i._lastObjectRendered = null,\r\n i.plugins = {},\r\n i\r\n }\r\n return ba(e, t),\r\n e.prototype.initPlugins = function(t) {\r\n for (var e in t)\r\n this.plugins[e] = new t[e](this)\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"width\", {\r\n get: function() {\r\n return this.view.width\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"height\", {\r\n get: function() {\r\n return this.view.height\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.resize = function(t, e) {\r\n this.screen.width = t,\r\n this.screen.height = e,\r\n this.view.width = t * this.resolution,\r\n this.view.height = e * this.resolution,\r\n this.autoDensity && (this.view.style.width = t + \"px\",\r\n this.view.style.height = e + \"px\"),\r\n this.emit(\"resize\", t, e)\r\n }\r\n ,\r\n e.prototype.generateTexture = function(t, e, r, i) {\r\n 0 === (i = i || t.getLocalBounds(null, !0)).width && (i.width = 1),\r\n 0 === i.height && (i.height = 1);\r\n var o = fc.create({\r\n width: 0 | i.width,\r\n height: 0 | i.height,\r\n scaleMode: e,\r\n resolution: r\r\n });\r\n return wc.tx = -i.x,\r\n wc.ty = -i.y,\r\n this.render(t, {\r\n renderTexture: o,\r\n clear: !1,\r\n transform: wc,\r\n skipUpdateTransform: !!t.parent\r\n }),\r\n o\r\n }\r\n ,\r\n e.prototype.destroy = function(t) {\r\n for (var e in this.plugins)\r\n this.plugins[e].destroy(),\r\n this.plugins[e] = null;\r\n t && this.view.parentNode && this.view.parentNode.removeChild(this.view);\r\n this.plugins = null,\r\n this.type = jb.UNKNOWN,\r\n this.view = null,\r\n this.screen = null,\r\n this._tempDisplayObjectParent = null,\r\n this.options = null,\r\n this._backgroundColorRgba = null,\r\n this._backgroundColorString = null,\r\n this._lastObjectRendered = null\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"backgroundColor\", {\r\n get: function() {\r\n return this._backgroundColor\r\n },\r\n set: function(t) {\r\n this._backgroundColor = t,\r\n this._backgroundColorString = Mf(t),\r\n Xb(t, this._backgroundColorRgba)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"backgroundAlpha\", {\r\n get: function() {\r\n return this._backgroundColorRgba[3]\r\n },\r\n set: function(t) {\r\n this._backgroundColorRgba[3] = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e\r\n }(rb.d)\r\n , i = function(t) {\r\n function e(r) {\r\n var i = t.call(this, jb.WEBGL, r) || this;\r\n return r = i.options,\r\n i.gl = null,\r\n i.CONTEXT_UID = 0,\r\n i.runners = {\r\n destroy: new ka(\"destroy\"),\r\n contextChange: new ka(\"contextChange\"),\r\n reset: new ka(\"reset\"),\r\n update: new ka(\"update\"),\r\n postrender: new ka(\"postrender\"),\r\n prerender: new ka(\"prerender\"),\r\n resize: new ka(\"resize\")\r\n },\r\n i.globalUniforms = new Pa({\r\n projectionMatrix: new la\r\n },!0),\r\n i.addSystem(Pd, \"mask\").addSystem(Cd, \"context\").addSystem(Xd, \"state\").addSystem(Wd, \"shader\").addSystem(Zd, \"texture\").addSystem(Ed, \"geometry\").addSystem(Dd, \"framebuffer\").addSystem(Rd, \"scissor\").addSystem(Sd, \"stencil\").addSystem(Td, \"projection\").addSystem(Yd, \"textureGC\").addSystem(yd, \"filter\").addSystem(Ud, \"renderTexture\").addSystem(Ad, \"batch\"),\r\n i.initPlugins(e.__plugins),\r\n r.context ? i.context.initFromContext(r.context) : i.context.initFromOptions({\r\n alpha: !!i.useContextAlpha,\r\n antialias: r.antialias,\r\n premultipliedAlpha: i.useContextAlpha && \"notMultiplied\" !== i.useContextAlpha,\r\n stencil: !0,\r\n preserveDrawingBuffer: r.preserveDrawingBuffer,\r\n powerPreference: i.options.powerPreference\r\n }),\r\n i.renderingToScreen = !0,\r\n Kf(2 === i.context.webGLVersion ? \"WebGL 2\" : \"WebGL 1\"),\r\n i.resize(i.options.width, i.options.height),\r\n i\r\n }\r\n return ba(e, t),\r\n e.create = function(t) {\r\n if (Lf())\r\n return new e(t);\r\n throw new Error(\"WebGL unsupported in this browser, use \\\"pixi.js-legacy\\\" for fallback canvas2d support.\")\r\n }\r\n ,\r\n e.prototype.addSystem = function(t, e) {\r\n e || (e = t.name);\r\n var r = new t(this);\r\n if (this[e])\r\n throw new Error(\"Whoops! The name \\\"\" + e + \"\\\" is already in use\");\r\n for (var i in this[e] = r,\r\n this.runners)\r\n this.runners[i].add(r);\r\n return this\r\n }\r\n ,\r\n e.prototype.render = function(t, e) {\r\n var r, i, o, n;\r\n if (e && (e instanceof fc ? (Va(\"6.0.0\", \"Renderer#render arguments changed, use options instead.\"),\r\n r = e,\r\n i = arguments[2],\r\n o = arguments[3],\r\n n = arguments[4]) : (r = e.renderTexture,\r\n i = e.clear,\r\n o = e.transform,\r\n n = e.skipUpdateTransform)),\r\n this.renderingToScreen = !r,\r\n this.runners.prerender.emit(),\r\n this.emit(\"prerender\"),\r\n this.projection.transform = o,\r\n !this.context.isLost) {\r\n if (r || (this._lastObjectRendered = t),\r\n !n) {\r\n var s = t.enableTempParent();\r\n t.updateTransform(),\r\n t.disableTempParent(s)\r\n }\r\n this.renderTexture.bind(r),\r\n this.batch.currentRenderer.start(),\r\n (void 0 !== i ? i : this.clearBeforeRender) && this.renderTexture.clear(),\r\n t.render(this),\r\n this.batch.currentRenderer.flush(),\r\n r && r.baseTexture.update(),\r\n this.runners.postrender.emit(),\r\n this.projection.transform = null,\r\n this.emit(\"postrender\")\r\n }\r\n }\r\n ,\r\n e.prototype.resize = function(e, r) {\r\n t.prototype.resize.call(this, e, r),\r\n this.runners.resize.emit(e, r)\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n return this.runners.reset.emit(),\r\n this\r\n }\r\n ,\r\n e.prototype.clear = function() {\r\n this.renderTexture.bind(),\r\n this.renderTexture.clear()\r\n }\r\n ,\r\n e.prototype.destroy = function(e) {\r\n for (var r in this.runners.destroy.emit(),\r\n this.runners)\r\n this.runners[r].destroy();\r\n t.prototype.destroy.call(this, e),\r\n this.gl = null\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"extract\", {\r\n get: function() {\r\n return Va(\"6.0.0\", \"Renderer#extract has been deprecated, please use Renderer#plugins.extract instead.\"),\r\n this.plugins.extract\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.registerPlugin = function(t, r) {\r\n e.__plugins = e.__plugins || {},\r\n e.__plugins[t] = r\r\n }\r\n ,\r\n e\r\n }(Ng);\r\n var xc = function() {\r\n return function() {\r\n this.texArray = null,\r\n this.blend = 0,\r\n this.type = Ba.TRIANGLES,\r\n this.start = 0,\r\n this.size = 0,\r\n this.data = null\r\n }\r\n }()\r\n , yc = function() {\r\n function t() {\r\n this.elements = [],\r\n this.ids = [],\r\n this.count = 0\r\n }\r\n return t.prototype.clear = function() {\r\n for (var t = 0; t < this.count; t++)\r\n this.elements[t] = null;\r\n this.count = 0\r\n }\r\n ,\r\n t\r\n }()\r\n , Og = function() {\r\n function t(t) {\r\n \"number\" == typeof t ? this.rawBinaryData = new ArrayBuffer(t) : t instanceof Uint8Array ? this.rawBinaryData = t.buffer : this.rawBinaryData = t,\r\n this.uint32View = new Uint32Array(this.rawBinaryData),\r\n this.float32View = new Float32Array(this.rawBinaryData)\r\n }\r\n return Object.defineProperty(t.prototype, \"int8View\", {\r\n get: function() {\r\n return this._int8View || (this._int8View = new Int8Array(this.rawBinaryData)),\r\n this._int8View\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"uint8View\", {\r\n get: function() {\r\n return this._uint8View || (this._uint8View = new Uint8Array(this.rawBinaryData)),\r\n this._uint8View\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"int16View\", {\r\n get: function() {\r\n return this._int16View || (this._int16View = new Int16Array(this.rawBinaryData)),\r\n this._int16View\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"uint16View\", {\r\n get: function() {\r\n return this._uint16View || (this._uint16View = new Uint16Array(this.rawBinaryData)),\r\n this._uint16View\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t.prototype, \"int32View\", {\r\n get: function() {\r\n return this._int32View || (this._int32View = new Int32Array(this.rawBinaryData)),\r\n this._int32View\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t.prototype.view = function(t) {\r\n return this[t + \"View\"]\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.rawBinaryData = null,\r\n this._int8View = null,\r\n this._uint8View = null,\r\n this._int16View = null,\r\n this._uint16View = null,\r\n this._int32View = null,\r\n this.uint32View = null,\r\n this.float32View = null\r\n }\r\n ,\r\n t.sizeOf = function(t) {\r\n switch (t) {\r\n case \"int8\":\r\n case \"uint8\":\r\n return 1;\r\n case \"int16\":\r\n case \"uint16\":\r\n return 2;\r\n case \"int32\":\r\n case \"uint32\":\r\n case \"float32\":\r\n return 4;\r\n default:\r\n throw new Error(t + \" isn't a valid view type\");\r\n }\r\n }\r\n ,\r\n t\r\n }()\r\n , Pg = function(t) {\r\n function e(e) {\r\n var r = t.call(this, e) || this;\r\n return r.shaderGenerator = null,\r\n r.geometryClass = null,\r\n r.vertexSize = null,\r\n r.state = Fb.for2d(),\r\n r.size = 4 * aa.SPRITE_BATCH_SIZE,\r\n r._vertexCount = 0,\r\n r._indexCount = 0,\r\n r._bufferedElements = [],\r\n r._bufferedTextures = [],\r\n r._bufferSize = 0,\r\n r._shader = null,\r\n r._packedGeometries = [],\r\n r._packedGeometryPoolSize = 2,\r\n r._flushId = 0,\r\n r._aBuffers = {},\r\n r._iBuffers = {},\r\n r.MAX_TEXTURES = 1,\r\n r.renderer.on(\"prerender\", r.onPrerender, r),\r\n e.runners.contextChange.add(r),\r\n r._dcIndex = 0,\r\n r._aIndex = 0,\r\n r._iIndex = 0,\r\n r._attributeBuffer = null,\r\n r._indexBuffer = null,\r\n r._tempBoundTextures = [],\r\n r\r\n }\r\n return ba(e, t),\r\n e.prototype.contextChange = function() {\r\n var t = this.renderer.gl;\r\n aa.PREFER_ENV === Aa.WEBGL_LEGACY ? this.MAX_TEXTURES = 1 : (this.MAX_TEXTURES = Math.min(t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS), aa.SPRITE_MAX_TEXTURES),\r\n this.MAX_TEXTURES = yg(this.MAX_TEXTURES, t)),\r\n this._shader = this.shaderGenerator.generateShader(this.MAX_TEXTURES);\r\n for (var e = 0; e < this._packedGeometryPoolSize; e++)\r\n this._packedGeometries[e] = new this.geometryClass;\r\n this.initFlushBuffers()\r\n }\r\n ,\r\n e.prototype.initFlushBuffers = function() {\r\n for (var t = e._drawCallPool, r = e._textureArrayPool, i = this.size / 4, o = Math.floor(i / this.MAX_TEXTURES) + 1; t.length < i; )\r\n t.push(new xc);\r\n for (; r.length < o; )\r\n r.push(new yc);\r\n for (var n = 0; n < this.MAX_TEXTURES; n++)\r\n this._tempBoundTextures[n] = null\r\n }\r\n ,\r\n e.prototype.onPrerender = function() {\r\n this._flushId = 0\r\n }\r\n ,\r\n e.prototype.render = function(t) {\r\n t._texture.valid && (this._vertexCount + t.vertexData.length / 2 > this.size && this.flush(),\r\n this._vertexCount += t.vertexData.length / 2,\r\n this._indexCount += t.indices.length,\r\n this._bufferedTextures[this._bufferSize] = t._texture.baseTexture,\r\n this._bufferedElements[this._bufferSize++] = t)\r\n }\r\n ,\r\n e.prototype.buildTexturesAndDrawCalls = function() {\r\n var t = this._bufferedTextures\r\n , r = this.MAX_TEXTURES\r\n , i = e._textureArrayPool\r\n , o = this.renderer.batch\r\n , n = this._tempBoundTextures\r\n , s = this.renderer.textureGC.count\r\n , a = ++ia._globalBatch\r\n , u = 0\r\n , h = i[0]\r\n , $ = 0;\r\n o.copyBoundTextures(n, r);\r\n for (var p = 0; p < this._bufferSize; ++p) {\r\n var l = t[p];\r\n t[p] = null,\r\n l._batchEnabled !== a && (h.count >= r && (o.boundArray(h, n, a, r),\r\n this.buildDrawCalls(h, $, p),\r\n $ = p,\r\n h = i[++u],\r\n ++a),\r\n l._batchEnabled = a,\r\n l.touched = s,\r\n h.elements[h.count++] = l)\r\n }\r\n h.count > 0 && (o.boundArray(h, n, a, r),\r\n this.buildDrawCalls(h, $, this._bufferSize),\r\n ++u,\r\n ++a);\r\n for (p = 0; p < n.length; p++)\r\n n[p] = null;\r\n ia._globalBatch = a\r\n }\r\n ,\r\n e.prototype.buildDrawCalls = function(t, r, i) {\r\n var o = this._bufferedElements\r\n , n = this._attributeBuffer\r\n , s = this._indexBuffer\r\n , a = this.vertexSize\r\n , u = e._drawCallPool\r\n , h = this._dcIndex\r\n , $ = this._aIndex\r\n , p = this._iIndex\r\n , l = u[h];\r\n l.start = this._iIndex,\r\n l.texArray = t;\r\n for (var c = r; c < i; ++c) {\r\n var d = o[c]\r\n , f = d._texture.baseTexture\r\n , m = Of[f.alphaMode ? 1 : 0][d.blendMode];\r\n o[c] = null,\r\n r < c && l.blend !== m && (l.size = p - l.start,\r\n r = c,\r\n (l = u[++h]).texArray = t,\r\n l.start = p),\r\n this.packInterleavedGeometry(d, n, s, $, p),\r\n $ += d.vertexData.length / 2 * a,\r\n p += d.indices.length,\r\n l.blend = m\r\n }\r\n r < i && (l.size = p - l.start,\r\n ++h),\r\n this._dcIndex = h,\r\n this._aIndex = $,\r\n this._iIndex = p\r\n }\r\n ,\r\n e.prototype.bindAndClearTexArray = function(t) {\r\n for (var e = this.renderer.texture, r = 0; r < t.count; r++)\r\n e.bind(t.elements[r], t.ids[r]),\r\n t.elements[r] = null;\r\n t.count = 0\r\n }\r\n ,\r\n e.prototype.updateGeometry = function() {\r\n var t = this._packedGeometries\r\n , e = this._attributeBuffer\r\n , r = this._indexBuffer;\r\n aa.CAN_UPLOAD_SAME_BUFFER ? (t[this._flushId]._buffer.update(e.rawBinaryData),\r\n t[this._flushId]._indexBuffer.update(r),\r\n this.renderer.geometry.updateBuffers()) : (this._packedGeometryPoolSize <= this._flushId && (this._packedGeometryPoolSize++,\r\n t[this._flushId] = new this.geometryClass),\r\n t[this._flushId]._buffer.update(e.rawBinaryData),\r\n t[this._flushId]._indexBuffer.update(r),\r\n this.renderer.geometry.bind(t[this._flushId]),\r\n this.renderer.geometry.updateBuffers(),\r\n this._flushId++)\r\n }\r\n ,\r\n e.prototype.drawBatches = function() {\r\n for (var t = this._dcIndex, r = this.renderer, i = r.gl, o = r.state, n = e._drawCallPool, s = null, a = 0; a < t; a++) {\r\n var u = n[a]\r\n , h = u.texArray\r\n , $ = u.type\r\n , p = u.size\r\n , l = u.start\r\n , c = u.blend;\r\n s !== h && (s = h,\r\n this.bindAndClearTexArray(h)),\r\n this.state.blendMode = c,\r\n o.set(this.state),\r\n i.drawElements($, p, i.UNSIGNED_SHORT, 2 * l)\r\n }\r\n }\r\n ,\r\n e.prototype.flush = function() {\r\n 0 !== this._vertexCount && (this._attributeBuffer = this.getAttributeBuffer(this._vertexCount),\r\n this._indexBuffer = this.getIndexBuffer(this._indexCount),\r\n this._aIndex = 0,\r\n this._iIndex = 0,\r\n this._dcIndex = 0,\r\n this.buildTexturesAndDrawCalls(),\r\n this.updateGeometry(),\r\n this.drawBatches(),\r\n this._bufferSize = 0,\r\n this._vertexCount = 0,\r\n this._indexCount = 0)\r\n }\r\n ,\r\n e.prototype.start = function() {\r\n this.renderer.state.set(this.state),\r\n this.renderer.shader.bind(this._shader),\r\n aa.CAN_UPLOAD_SAME_BUFFER && this.renderer.geometry.bind(this._packedGeometries[this._flushId])\r\n }\r\n ,\r\n e.prototype.stop = function() {\r\n this.flush()\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n for (var e = 0; e < this._packedGeometryPoolSize; e++)\r\n this._packedGeometries[e] && this._packedGeometries[e].destroy();\r\n this.renderer.off(\"prerender\", this.onPrerender, this),\r\n this._aBuffers = null,\r\n this._iBuffers = null,\r\n this._packedGeometries = null,\r\n this._attributeBuffer = null,\r\n this._indexBuffer = null,\r\n this._shader && (this._shader.destroy(),\r\n this._shader = null),\r\n t.prototype.destroy.call(this)\r\n }\r\n ,\r\n e.prototype.getAttributeBuffer = function(t) {\r\n var e = sb(Math.ceil(t / 8))\r\n , r = hd(e)\r\n , i = 8 * e;\r\n this._aBuffers.length <= r && (this._iBuffers.length = r + 1);\r\n var o = this._aBuffers[i];\r\n return o || (this._aBuffers[i] = o = new Og(i * this.vertexSize * 4)),\r\n o\r\n }\r\n ,\r\n e.prototype.getIndexBuffer = function(t) {\r\n var e = sb(Math.ceil(t / 12))\r\n , r = hd(e)\r\n , i = 12 * e;\r\n this._iBuffers.length <= r && (this._iBuffers.length = r + 1);\r\n var o = this._iBuffers[r];\r\n return o || (this._iBuffers[r] = o = new Uint16Array(i)),\r\n o\r\n }\r\n ,\r\n e.prototype.packInterleavedGeometry = function(t, e, r, i, o) {\r\n for (var n = e.uint32View, s = e.float32View, a = i / this.vertexSize, u = t.uvs, h = t.indices, $ = t.vertexData, p = t._texture.baseTexture._batchLocation, l = Math.min(t.worldAlpha, 1), c = l < 1 && t._texture.baseTexture.alphaMode ? fd(t._tintRGB, l) : t._tintRGB + (255 * l << 24), d = 0; d < $.length; d += 2)\r\n s[i++] = $[d],\r\n s[i++] = $[d + 1],\r\n s[i++] = u[d],\r\n s[i++] = u[d + 1],\r\n n[i++] = c,\r\n s[i++] = p;\r\n for (d = 0; d < h.length; d++)\r\n r[o++] = a + h[d]\r\n }\r\n ,\r\n e._drawCallPool = [],\r\n e._textureArrayPool = [],\r\n e\r\n }(zd)\r\n , Qg = function() {\r\n function t(t, e) {\r\n if (this.vertexSrc = t,\r\n this.fragTemplate = e,\r\n this.programCache = {},\r\n this.defaultGroupCache = {},\r\n e.indexOf(\"%count%\") < 0)\r\n throw new Error(\"Fragment template must contain \\\"%count%\\\".\");\r\n if (e.indexOf(\"%forloop%\") < 0)\r\n throw new Error(\"Fragment template must contain \\\"%forloop%\\\".\")\r\n }\r\n return t.prototype.generateShader = function(t) {\r\n if (!this.programCache[t]) {\r\n for (var e = new Int32Array(t), r = 0; r < t; r++)\r\n e[r] = r;\r\n this.defaultGroupCache[t] = Pa.from({\r\n uSamplers: e\r\n }, !0);\r\n var i = this.fragTemplate;\r\n i = (i = i.replace(/%count%/gi, \"\" + t)).replace(/%forloop%/gi, this.generateSampleSrc(t)),\r\n this.programCache[t] = new nc(this.vertexSrc,i)\r\n }\r\n var o = {\r\n tint: new Float32Array([1, 1, 1, 1]),\r\n translationMatrix: new la,\r\n default: this.defaultGroupCache[t]\r\n };\r\n return new oc(this.programCache[t],o)\r\n }\r\n ,\r\n t.prototype.generateSampleSrc = function(t) {\r\n var e = \"\";\r\n e += \"\\n\",\r\n e += \"\\n\";\r\n for (var r = 0; r < t; r++)\r\n r > 0 && (e += \"\\nelse \"),\r\n r < t - 1 && (e += \"if(vTextureId < \" + r + \".5)\"),\r\n e += \"\\n{\",\r\n e += \"\\n\\tcolor = texture2D(uSamplers[\" + r + \"], vTextureCoord);\",\r\n e += \"\\n}\";\r\n return e += \"\\n\",\r\n e += \"\\n\"\r\n }\r\n ,\r\n t\r\n }()\r\n , _d = function(t) {\r\n function e(e) {\r\n void 0 === e && (e = !1);\r\n var r = t.call(this) || this;\r\n return r._buffer = new ta(null,e,!1),\r\n r._indexBuffer = new ta(null,e,!0),\r\n r.addAttribute(\"aVertexPosition\", r._buffer, 2, !1, ua.FLOAT).addAttribute(\"aTextureCoord\", r._buffer, 2, !1, ua.FLOAT).addAttribute(\"aColor\", r._buffer, 4, !0, ua.UNSIGNED_BYTE).addAttribute(\"aTextureId\", r._buffer, 1, !0, ua.FLOAT).addIndex(r._indexBuffer),\r\n r\r\n }\r\n return ba(e, t),\r\n e\r\n }(gc)\r\n , ae = \"precision highp float;\\nattribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\nattribute vec4 aColor;\\nattribute float aTextureId;\\n\\nuniform mat3 projectionMatrix;\\nuniform mat3 translationMatrix;\\nuniform vec4 tint;\\n\\nvarying vec2 vTextureCoord;\\nvarying vec4 vColor;\\nvarying float vTextureId;\\n\\nvoid main(void){\\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n\\n vTextureCoord = aTextureCoord;\\n vTextureId = aTextureId;\\n vColor = aColor * tint;\\n}\\n\"\r\n , be = \"varying vec2 vTextureCoord;\\nvarying vec4 vColor;\\nvarying float vTextureId;\\nuniform sampler2D uSamplers[%count%];\\n\\nvoid main(void){\\n vec4 color;\\n %forloop%\\n gl_FragColor = color * vColor;\\n}\\n\"\r\n , Rg = function() {\r\n function t() {}\r\n return t.create = function(t) {\r\n var e = Object.assign({\r\n vertex: ae,\r\n fragment: be,\r\n geometryClass: _d,\r\n vertexSize: 6\r\n }, t)\r\n , r = e.vertex\r\n , i = e.fragment\r\n , o = e.vertexSize\r\n , n = e.geometryClass;\r\n return function(t) {\r\n function e(e) {\r\n var s = t.call(this, e) || this;\r\n return s.shaderGenerator = new Qg(r,i),\r\n s.geometryClass = n,\r\n s.vertexSize = o,\r\n s\r\n }\r\n return ba(e, t),\r\n e\r\n }(Pg)\r\n }\r\n ,\r\n Object.defineProperty(t, \"defaultVertexSrc\", {\r\n get: function() {\r\n return ae\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(t, \"defaultFragmentTemplate\", {\r\n get: function() {\r\n return be\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n t\r\n }()\r\n , j = Rg.create()\r\n , Sg = {}\r\n , Tg = function(t) {\r\n Object.defineProperty(Sg, t, {\r\n get: function() {\r\n return Va(\"6.0.0\", \"PIXI.systems.\" + t + \" has moved to PIXI.\" + t),\r\n rd[t]\r\n }\r\n })\r\n };\r\n for (var ce in rd)\r\n Tg(ce);\r\n var Ug = {}\r\n , Vg = function(t) {\r\n Object.defineProperty(Ug, t, {\r\n get: function() {\r\n return Va(\"6.0.0\", \"PIXI.resources.\" + t + \" has moved to PIXI.\" + t),\r\n $d[t]\r\n }\r\n })\r\n };\r\n for (var ce in $d)\r\n Vg(ce);\r\n aa.SORTABLE_CHILDREN = !1;\r\n var Gb = function() {\r\n function t() {\r\n this.minX = 1 / 0,\r\n this.minY = 1 / 0,\r\n this.maxX = -1 / 0,\r\n this.maxY = -1 / 0,\r\n this.rect = null,\r\n this.updateID = -1\r\n }\r\n return t.prototype.isEmpty = function() {\r\n return this.minX > this.maxX || this.minY > this.maxY\r\n }\r\n ,\r\n t.prototype.clear = function() {\r\n this.minX = 1 / 0,\r\n this.minY = 1 / 0,\r\n this.maxX = -1 / 0,\r\n this.maxY = -1 / 0\r\n }\r\n ,\r\n t.prototype.getRectangle = function(t) {\r\n return this.minX > this.maxX || this.minY > this.maxY ? da.EMPTY : ((t = t || new da(0,0,1,1)).x = this.minX,\r\n t.y = this.minY,\r\n t.width = this.maxX - this.minX,\r\n t.height = this.maxY - this.minY,\r\n t)\r\n }\r\n ,\r\n t.prototype.addPoint = function(t) {\r\n this.minX = Math.min(this.minX, t.x),\r\n this.maxX = Math.max(this.maxX, t.x),\r\n this.minY = Math.min(this.minY, t.y),\r\n this.maxY = Math.max(this.maxY, t.y)\r\n }\r\n ,\r\n t.prototype.addPointMatrix = function(t, e) {\r\n var i = t.a\r\n , r = t.b\r\n , n = t.c\r\n , s = t.d\r\n , o = t.tx\r\n , a = t.ty\r\n , h = i * e.x + n * e.y + o\r\n , l = r * e.x + s * e.y + a;\r\n this.minX = Math.min(this.minX, h),\r\n this.maxX = Math.max(this.maxX, h),\r\n this.minY = Math.min(this.minY, l),\r\n this.maxY = Math.max(this.maxY, l)\r\n }\r\n ,\r\n t.prototype.addQuad = function(t) {\r\n var e = this.minX\r\n , i = this.minY\r\n , r = this.maxX\r\n , n = this.maxY\r\n , s = t[0]\r\n , o = t[1];\r\n e = s < e ? s : e,\r\n i = o < i ? o : i,\r\n r = s > r ? s : r,\r\n n = o > n ? o : n,\r\n e = (s = t[2]) < e ? s : e,\r\n i = (o = t[3]) < i ? o : i,\r\n r = s > r ? s : r,\r\n n = o > n ? o : n,\r\n e = (s = t[4]) < e ? s : e,\r\n i = (o = t[5]) < i ? o : i,\r\n r = s > r ? s : r,\r\n n = o > n ? o : n,\r\n e = (s = t[6]) < e ? s : e,\r\n i = (o = t[7]) < i ? o : i,\r\n r = s > r ? s : r,\r\n n = o > n ? o : n,\r\n this.minX = e,\r\n this.minY = i,\r\n this.maxX = r,\r\n this.maxY = n\r\n }\r\n ,\r\n t.prototype.addFrame = function(t, e, i, r, n) {\r\n this.addFrameMatrix(t.worldTransform, e, i, r, n)\r\n }\r\n ,\r\n t.prototype.addFrameMatrix = function(t, e, i, r, n) {\r\n var s = t.a\r\n , o = t.b\r\n , a = t.c\r\n , h = t.d\r\n , l = t.tx\r\n , d = t.ty\r\n , p = this.minX\r\n , m = this.minY\r\n , u = this.maxX\r\n , c = this.maxY\r\n , f = s * e + a * i + l\r\n , y = o * e + h * i + d;\r\n p = f < p ? f : p,\r\n m = y < m ? y : m,\r\n u = f > u ? f : u,\r\n c = y > c ? y : c,\r\n p = (f = s * r + a * i + l) < p ? f : p,\r\n m = (y = o * r + h * i + d) < m ? y : m,\r\n u = f > u ? f : u,\r\n c = y > c ? y : c,\r\n p = (f = s * e + a * n + l) < p ? f : p,\r\n m = (y = o * e + h * n + d) < m ? y : m,\r\n u = f > u ? f : u,\r\n c = y > c ? y : c,\r\n p = (f = s * r + a * n + l) < p ? f : p,\r\n m = (y = o * r + h * n + d) < m ? y : m,\r\n u = f > u ? f : u,\r\n c = y > c ? y : c,\r\n this.minX = p,\r\n this.minY = m,\r\n this.maxX = u,\r\n this.maxY = c\r\n }\r\n ,\r\n t.prototype.addVertexData = function(t, e, i) {\r\n for (var r = this.minX, n = this.minY, s = this.maxX, o = this.maxY, a = e; a < i; a += 2) {\r\n var h = t[a]\r\n , l = t[a + 1];\r\n r = h < r ? h : r,\r\n n = l < n ? l : n,\r\n s = h > s ? h : s,\r\n o = l > o ? l : o\r\n }\r\n this.minX = r,\r\n this.minY = n,\r\n this.maxX = s,\r\n this.maxY = o\r\n }\r\n ,\r\n t.prototype.addVertices = function(t, e, i, r) {\r\n this.addVerticesMatrix(t.worldTransform, e, i, r)\r\n }\r\n ,\r\n t.prototype.addVerticesMatrix = function(t, e, i, r, n, s) {\r\n void 0 === n && (n = 0),\r\n void 0 === s && (s = n);\r\n for (var o = t.a, a = t.b, h = t.c, l = t.d, d = t.tx, p = t.ty, m = this.minX, u = this.minY, c = this.maxX, f = this.maxY, y = i; y < r; y += 2) {\r\n var x = e[y]\r\n , b = e[y + 1]\r\n , $ = o * x + h * b + d\r\n , v = l * b + a * x + p;\r\n m = Math.min(m, $ - n),\r\n c = Math.max(c, $ + n),\r\n u = Math.min(u, v - s),\r\n f = Math.max(f, v + s)\r\n }\r\n this.minX = m,\r\n this.minY = u,\r\n this.maxX = c,\r\n this.maxY = f\r\n }\r\n ,\r\n t.prototype.addBounds = function(t) {\r\n var e = this.minX\r\n , i = this.minY\r\n , r = this.maxX\r\n , n = this.maxY;\r\n this.minX = t.minX < e ? t.minX : e,\r\n this.minY = t.minY < i ? t.minY : i,\r\n this.maxX = t.maxX > r ? t.maxX : r,\r\n this.maxY = t.maxY > n ? t.maxY : n\r\n }\r\n ,\r\n t.prototype.addBoundsMask = function(t, e) {\r\n var i = t.minX > e.minX ? t.minX : e.minX\r\n , r = t.minY > e.minY ? t.minY : e.minY\r\n , n = t.maxX < e.maxX ? t.maxX : e.maxX\r\n , s = t.maxY < e.maxY ? t.maxY : e.maxY;\r\n if (i <= n && r <= s) {\r\n var o = this.minX\r\n , a = this.minY\r\n , h = this.maxX\r\n , l = this.maxY;\r\n this.minX = i < o ? i : o,\r\n this.minY = r < a ? r : a,\r\n this.maxX = n > h ? n : h,\r\n this.maxY = s > l ? s : l\r\n }\r\n }\r\n ,\r\n t.prototype.addBoundsMatrix = function(t, e) {\r\n this.addFrameMatrix(e, t.minX, t.minY, t.maxX, t.maxY)\r\n }\r\n ,\r\n t.prototype.addBoundsArea = function(t, e) {\r\n var i = t.minX > e.x ? t.minX : e.x\r\n , r = t.minY > e.y ? t.minY : e.y\r\n , n = t.maxX < e.x + e.width ? t.maxX : e.x + e.width\r\n , s = t.maxY < e.y + e.height ? t.maxY : e.y + e.height;\r\n if (i <= n && r <= s) {\r\n var o = this.minX\r\n , a = this.minY\r\n , h = this.maxX\r\n , l = this.maxY;\r\n this.minX = i < o ? i : o,\r\n this.minY = r < a ? r : a,\r\n this.maxX = n > h ? n : h,\r\n this.maxY = s > l ? s : l\r\n }\r\n }\r\n ,\r\n t.prototype.pad = function(t, e) {\r\n void 0 === t && (t = 0),\r\n void 0 === e && (e = t),\r\n this.isEmpty() || (this.minX -= t,\r\n this.maxX += t,\r\n this.minY -= e,\r\n this.maxY += e)\r\n }\r\n ,\r\n t.prototype.addFramePad = function(t, e, i, r, n, s) {\r\n t -= n,\r\n e -= s,\r\n i += n,\r\n r += s,\r\n this.minX = this.minX < t ? this.minX : t,\r\n this.maxX = this.maxX > i ? this.maxX : i,\r\n this.minY = this.minY < e ? this.minY : e,\r\n this.maxY = this.maxY > r ? this.maxY : r\r\n }\r\n ,\r\n t\r\n }()\r\n , Wg = function(t, e) {\r\n return (Wg = Object.setPrototypeOf || {\r\n __proto__: []\r\n }instanceof Array && function(t, e) {\r\n t.__proto__ = e\r\n }\r\n || function(t, e) {\r\n for (var i in e)\r\n e.hasOwnProperty(i) && (t[i] = e[i])\r\n }\r\n )(t, e)\r\n };\r\n function zc(t, e) {\r\n function i() {\r\n this.constructor = t\r\n }\r\n Wg(t, e),\r\n t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype,\r\n new i)\r\n }\r\n var Hb = function(t) {\r\n function e() {\r\n var e = t.call(this) || this;\r\n return e.tempDisplayObjectParent = null,\r\n e.transform = new Zf,\r\n e.alpha = 1,\r\n e.visible = !0,\r\n e.renderable = !0,\r\n e.parent = null,\r\n e.worldAlpha = 1,\r\n e._lastSortedIndex = 0,\r\n e._zIndex = 0,\r\n e.filterArea = null,\r\n e.filters = null,\r\n e._enabledFilters = null,\r\n e._bounds = new Gb,\r\n e._localBounds = null,\r\n e._boundsID = 0,\r\n e._boundsRect = null,\r\n e._localBoundsRect = null,\r\n e._mask = null,\r\n e._destroyed = !1,\r\n e.isSprite = !1,\r\n e.isMask = !1,\r\n e\r\n }\r\n return zc(e, t),\r\n e.mixin = function(t) {\r\n for (var i = Object.keys(t), r = 0; r < i.length; ++r) {\r\n var n = i[r];\r\n Object.defineProperty(e.prototype, n, Object.getOwnPropertyDescriptor(t, n))\r\n }\r\n }\r\n ,\r\n e.prototype._recursivePostUpdateTransform = function() {\r\n this.parent ? (this.parent._recursivePostUpdateTransform(),\r\n this.transform.updateTransform(this.parent.transform)) : this.transform.updateTransform(this._tempDisplayObjectParent.transform)\r\n }\r\n ,\r\n e.prototype.updateTransform = function() {\r\n this._boundsID++,\r\n this.transform.updateTransform(this.parent.transform),\r\n this.worldAlpha = this.alpha * this.parent.worldAlpha\r\n }\r\n ,\r\n e.prototype.getBounds = function(t, e) {\r\n return t || (this.parent ? (this._recursivePostUpdateTransform(),\r\n this.updateTransform()) : (this.parent = this._tempDisplayObjectParent,\r\n this.updateTransform(),\r\n this.parent = null)),\r\n this._bounds.updateID !== this._boundsID && (this.calculateBounds(),\r\n this._bounds.updateID = this._boundsID),\r\n e || (this._boundsRect || (this._boundsRect = new da),\r\n e = this._boundsRect),\r\n this._bounds.getRectangle(e)\r\n }\r\n ,\r\n e.prototype.getLocalBounds = function(t) {\r\n t || (this._localBoundsRect || (this._localBoundsRect = new da),\r\n t = this._localBoundsRect),\r\n this._localBounds || (this._localBounds = new Gb);\r\n var e = this.transform\r\n , i = this.parent;\r\n this.parent = null,\r\n this.transform = this._tempDisplayObjectParent.transform;\r\n var r = this._bounds\r\n , n = this._boundsID;\r\n this._bounds = this._localBounds;\r\n var s = this.getBounds(!1, t);\r\n return this.parent = i,\r\n this.transform = e,\r\n this._bounds = r,\r\n this._bounds.updateID += this._boundsID - n,\r\n s\r\n }\r\n ,\r\n e.prototype.toGlobal = function(t, e, i) {\r\n return void 0 === i && (i = !1),\r\n i || (this._recursivePostUpdateTransform(),\r\n this.parent ? this.displayObjectUpdateTransform() : (this.parent = this._tempDisplayObjectParent,\r\n this.displayObjectUpdateTransform(),\r\n this.parent = null)),\r\n this.worldTransform.apply(t, e)\r\n }\r\n ,\r\n e.prototype.toLocal = function(t, e, i, r) {\r\n return e && (t = e.toGlobal(t, i, r)),\r\n r || (this._recursivePostUpdateTransform(),\r\n this.parent ? this.displayObjectUpdateTransform() : (this.parent = this._tempDisplayObjectParent,\r\n this.displayObjectUpdateTransform(),\r\n this.parent = null)),\r\n this.worldTransform.applyInverse(t, i)\r\n }\r\n ,\r\n e.prototype.setParent = function(t) {\r\n if (!t || !t.addChild)\r\n throw new Error(\"setParent: Argument must be a Container\");\r\n return t.addChild(this),\r\n t\r\n }\r\n ,\r\n e.prototype.setTransform = function(t, e, i, r, n, s, o, a, h) {\r\n return void 0 === t && (t = 0),\r\n void 0 === e && (e = 0),\r\n void 0 === i && (i = 1),\r\n void 0 === r && (r = 1),\r\n void 0 === n && (n = 0),\r\n void 0 === s && (s = 0),\r\n void 0 === o && (o = 0),\r\n void 0 === a && (a = 0),\r\n void 0 === h && (h = 0),\r\n this.position.x = t,\r\n this.position.y = e,\r\n this.scale.x = i || 1,\r\n this.scale.y = r || 1,\r\n this.rotation = n,\r\n this.skew.x = s,\r\n this.skew.y = o,\r\n this.pivot.x = a,\r\n this.pivot.y = h,\r\n this\r\n }\r\n ,\r\n e.prototype.destroy = function(t) {\r\n this.parent && this.parent.removeChild(this),\r\n this.removeAllListeners(),\r\n this.transform = null,\r\n this.parent = null,\r\n this._bounds = null,\r\n this._mask = null,\r\n this.filters = null,\r\n this.filterArea = null,\r\n this.hitArea = null,\r\n this.interactive = !1,\r\n this.interactiveChildren = !1,\r\n this._destroyed = !0\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"_tempDisplayObjectParent\", {\r\n get: function() {\r\n return null === this.tempDisplayObjectParent && (this.tempDisplayObjectParent = new Xg),\r\n this.tempDisplayObjectParent\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.enableTempParent = function() {\r\n var t = this.parent;\r\n return this.parent = this._tempDisplayObjectParent,\r\n t\r\n }\r\n ,\r\n e.prototype.disableTempParent = function(t) {\r\n this.parent = t\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"x\", {\r\n get: function() {\r\n return this.position.x\r\n },\r\n set: function(t) {\r\n this.transform.position.x = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"y\", {\r\n get: function() {\r\n return this.position.y\r\n },\r\n set: function(t) {\r\n this.transform.position.y = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"worldTransform\", {\r\n get: function() {\r\n return this.transform.worldTransform\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"localTransform\", {\r\n get: function() {\r\n return this.transform.localTransform\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"position\", {\r\n get: function() {\r\n return this.transform.position\r\n },\r\n set: function(t) {\r\n this.transform.position.copyFrom(t)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"scale\", {\r\n get: function() {\r\n return this.transform.scale\r\n },\r\n set: function(t) {\r\n this.transform.scale.copyFrom(t)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"pivot\", {\r\n get: function() {\r\n return this.transform.pivot\r\n },\r\n set: function(t) {\r\n this.transform.pivot.copyFrom(t)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"skew\", {\r\n get: function() {\r\n return this.transform.skew\r\n },\r\n set: function(t) {\r\n this.transform.skew.copyFrom(t)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"rotation\", {\r\n get: function() {\r\n return this.transform.rotation\r\n },\r\n set: function(t) {\r\n this.transform.rotation = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"angle\", {\r\n get: function() {\r\n return this.transform.rotation * Tf\r\n },\r\n set: function(t) {\r\n this.transform.rotation = t * Uf\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"zIndex\", {\r\n get: function() {\r\n return this._zIndex\r\n },\r\n set: function(t) {\r\n this._zIndex = t,\r\n this.parent && (this.parent.sortDirty = !0)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"worldVisible\", {\r\n get: function() {\r\n var t = this;\r\n do {\r\n if (!t.visible)\r\n return !1;\r\n t = t.parent\r\n } while (t);\r\n return !0\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"mask\", {\r\n get: function() {\r\n return this._mask\r\n },\r\n set: function(t) {\r\n var e;\r\n this._mask && ((e = this._mask.maskObject || this._mask).renderable = !0,\r\n e.isMask = !1);\r\n (this._mask = t,\r\n this._mask) && ((e = this._mask.maskObject || this._mask).renderable = !1,\r\n e.isMask = !0)\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e\r\n }(rb.d)\r\n , Xg = function(t) {\r\n function e() {\r\n var e = null !== t && t.apply(this, arguments) || this;\r\n return e.sortDirty = null,\r\n e\r\n }\r\n return zc(e, t),\r\n e\r\n }(Hb);\r\n function Yg(t, e) {\r\n return t.zIndex === e.zIndex ? t._lastSortedIndex - e._lastSortedIndex : t.zIndex - e.zIndex\r\n }\r\n Hb.prototype.displayObjectUpdateTransform = Hb.prototype.updateTransform;\r\n var Ac = function(t) {\r\n function e() {\r\n var e = t.call(this) || this;\r\n return e.children = [],\r\n e.sortableChildren = aa.SORTABLE_CHILDREN,\r\n e.sortDirty = !1,\r\n e\r\n }\r\n return zc(e, t),\r\n e.prototype.onChildrenChange = function(t) {}\r\n ,\r\n e.prototype.addChild = function() {\r\n for (var t = arguments, e = [], i = 0; i < arguments.length; i++)\r\n e[i] = t[i];\r\n if (e.length > 1)\r\n for (var r = 0; r < e.length; r++)\r\n this.addChild(e[r]);\r\n else {\r\n var n = e[0];\r\n n.parent && n.parent.removeChild(n),\r\n n.parent = this,\r\n this.sortDirty = !0,\r\n n.transform._parentID = -1,\r\n this.children.push(n),\r\n this._boundsID++,\r\n this.onChildrenChange(this.children.length - 1),\r\n this.emit(\"childAdded\", n, this, this.children.length - 1),\r\n n.emit(\"added\", this)\r\n }\r\n return e[0]\r\n }\r\n ,\r\n e.prototype.addChildAt = function(t, e) {\r\n if (e < 0 || e > this.children.length)\r\n throw new Error(t + \"addChildAt: The index \" + e + \" supplied is out of bounds \" + this.children.length);\r\n return t.parent && t.parent.removeChild(t),\r\n t.parent = this,\r\n this.sortDirty = !0,\r\n t.transform._parentID = -1,\r\n this.children.splice(e, 0, t),\r\n this._boundsID++,\r\n this.onChildrenChange(e),\r\n t.emit(\"added\", this),\r\n this.emit(\"childAdded\", t, this, e),\r\n t\r\n }\r\n ,\r\n e.prototype.swapChildren = function(t, e) {\r\n if (t !== e) {\r\n var i = this.getChildIndex(t)\r\n , r = this.getChildIndex(e);\r\n this.children[i] = e,\r\n this.children[r] = t,\r\n this.onChildrenChange(i < r ? i : r)\r\n }\r\n }\r\n ,\r\n e.prototype.getChildIndex = function(t) {\r\n var e = this.children.indexOf(t);\r\n if (-1 === e)\r\n throw new Error(\"The supplied DisplayObject must be a child of the caller\");\r\n return e\r\n }\r\n ,\r\n e.prototype.setChildIndex = function(t, e) {\r\n if (e < 0 || e >= this.children.length)\r\n throw new Error(\"The index \" + e + \" supplied is out of bounds \" + this.children.length);\r\n var i = this.getChildIndex(t);\r\n tb(this.children, i, 1),\r\n this.children.splice(e, 0, t),\r\n this.onChildrenChange(e)\r\n }\r\n ,\r\n e.prototype.getChildAt = function(t) {\r\n if (t < 0 || t >= this.children.length)\r\n throw new Error(\"getChildAt: Index (\" + t + \") does not exist.\");\r\n return this.children[t]\r\n }\r\n ,\r\n e.prototype.removeChild = function() {\r\n for (var t = arguments, e = [], i = 0; i < arguments.length; i++)\r\n e[i] = t[i];\r\n if (e.length > 1)\r\n for (var r = 0; r < e.length; r++)\r\n this.removeChild(e[r]);\r\n else {\r\n var n = e[0]\r\n , s = this.children.indexOf(n);\r\n if (-1 === s)\r\n return null;\r\n n.parent = null,\r\n n.transform._parentID = -1,\r\n tb(this.children, s, 1),\r\n this._boundsID++,\r\n this.onChildrenChange(s),\r\n n.emit(\"removed\", this),\r\n this.emit(\"childRemoved\", n, this, s)\r\n }\r\n return e[0]\r\n }\r\n ,\r\n e.prototype.removeChildAt = function(t) {\r\n var e = this.getChildAt(t);\r\n return e.parent = null,\r\n e.transform._parentID = -1,\r\n tb(this.children, t, 1),\r\n this._boundsID++,\r\n this.onChildrenChange(t),\r\n e.emit(\"removed\", this),\r\n this.emit(\"childRemoved\", e, this, t),\r\n e\r\n }\r\n ,\r\n e.prototype.removeChildren = function(t, e) {\r\n void 0 === t && (t = 0),\r\n void 0 === e && (e = this.children.length);\r\n var i, r = t, n = e - r;\r\n if (n > 0 && n <= e) {\r\n i = this.children.splice(r, n);\r\n for (var s = 0; s < i.length; ++s)\r\n i[s].parent = null,\r\n i[s].transform && (i[s].transform._parentID = -1);\r\n this._boundsID++,\r\n this.onChildrenChange(t);\r\n for (s = 0; s < i.length; ++s)\r\n i[s].emit(\"removed\", this),\r\n this.emit(\"childRemoved\", i[s], this, s);\r\n return i\r\n }\r\n if (0 === n && 0 === this.children.length)\r\n return [];\r\n throw new RangeError(\"removeChildren: numeric values are outside the acceptable range.\")\r\n }\r\n ,\r\n e.prototype.sortChildren = function() {\r\n for (var t = !1, e = 0, i = this.children.length; e < i; ++e) {\r\n var r = this.children[e];\r\n r._lastSortedIndex = e,\r\n t || 0 === r.zIndex || (t = !0)\r\n }\r\n t && this.children.length > 1 && this.children.sort(Yg),\r\n this.sortDirty = !1\r\n }\r\n ,\r\n e.prototype.updateTransform = function() {\r\n this.sortableChildren && this.sortDirty && this.sortChildren(),\r\n this._boundsID++,\r\n this.transform.updateTransform(this.parent.transform),\r\n this.worldAlpha = this.alpha * this.parent.worldAlpha;\r\n for (var t = 0, e = this.children.length; t < e; ++t) {\r\n var i = this.children[t];\r\n i.visible && i.updateTransform()\r\n }\r\n }\r\n ,\r\n e.prototype.calculateBounds = function() {\r\n this._bounds.clear(),\r\n this._calculateBounds();\r\n for (var t = 0; t < this.children.length; t++) {\r\n var e = this.children[t];\r\n if (e.visible && e.renderable)\r\n if (e.calculateBounds(),\r\n e._mask) {\r\n var i = e._mask.maskObject || e._mask;\r\n i.calculateBounds(),\r\n this._bounds.addBoundsMask(e._bounds, i._bounds)\r\n } else\r\n e.filterArea ? this._bounds.addBoundsArea(e._bounds, e.filterArea) : this._bounds.addBounds(e._bounds)\r\n }\r\n this._bounds.updateID = this._boundsID\r\n }\r\n ,\r\n e.prototype.getLocalBounds = function(e, i) {\r\n void 0 === i && (i = !1);\r\n var r = t.prototype.getLocalBounds.call(this, e);\r\n if (!i)\r\n for (var n = 0, s = this.children.length; n < s; ++n) {\r\n var o = this.children[n];\r\n o.visible && o.updateTransform()\r\n }\r\n return r\r\n }\r\n ,\r\n e.prototype._calculateBounds = function() {}\r\n ,\r\n e.prototype.render = function(t) {\r\n if (this.visible && !(this.worldAlpha <= 0) && this.renderable)\r\n if (this._mask || this.filters && this.filters.length)\r\n this.renderAdvanced(t);\r\n else {\r\n this._render(t);\r\n for (var e = 0, i = this.children.length; e < i; ++e)\r\n this.children[e].render(t)\r\n }\r\n }\r\n ,\r\n e.prototype.renderAdvanced = function(t) {\r\n t.batch.flush();\r\n var e = this.filters\r\n , i = this._mask;\r\n if (e) {\r\n this._enabledFilters || (this._enabledFilters = []),\r\n this._enabledFilters.length = 0;\r\n for (var r = 0; r < e.length; r++)\r\n e[r].enabled && this._enabledFilters.push(e[r]);\r\n this._enabledFilters.length && t.filter.push(this, this._enabledFilters)\r\n }\r\n i && t.mask.push(this, this._mask),\r\n this._render(t);\r\n r = 0;\r\n for (var n = this.children.length; r < n; r++)\r\n this.children[r].render(t);\r\n t.batch.flush(),\r\n i && t.mask.pop(this),\r\n e && this._enabledFilters && this._enabledFilters.length && t.filter.pop()\r\n }\r\n ,\r\n e.prototype._render = function(t) {}\r\n ,\r\n e.prototype.destroy = function(e) {\r\n t.prototype.destroy.call(this),\r\n this.sortDirty = !1;\r\n var i = \"boolean\" == typeof e ? e : e && e.children\r\n , r = this.removeChildren(0, this.children.length);\r\n if (i)\r\n for (var n = 0; n < r.length; ++n)\r\n r[n].destroy(e)\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"width\", {\r\n get: function() {\r\n return this.scale.x * this.getLocalBounds().width\r\n },\r\n set: function(t) {\r\n var e = this.getLocalBounds().width;\r\n this.scale.x = 0 !== e ? t / e : 1,\r\n this._width = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"height\", {\r\n get: function() {\r\n return this.scale.y * this.getLocalBounds().height\r\n },\r\n set: function(t) {\r\n var e = this.getLocalBounds().height;\r\n this.scale.y = 0 !== e ? t / e : 1,\r\n this._height = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e\r\n }(Hb);\r\n Ac.prototype.containerUpdateTransform = Ac.prototype.updateTransform;\r\n (function(t) {\r\n t.MITER = \"miter\",\r\n t.BEVEL = \"bevel\",\r\n t.ROUND = \"round\"\r\n }\r\n )(Fa || (ve = Fa = {},\r\n ve)),\r\n function(t) {\r\n t.BUTT = \"butt\",\r\n t.ROUND = \"round\",\r\n t.SQUARE = \"square\"\r\n }(Ga || (ue = Ga = {},\r\n ue));\r\n var gb = {\r\n adaptive: !0,\r\n maxLength: 10,\r\n minSegments: 8,\r\n maxSegments: 2048,\r\n epsilon: 1e-4,\r\n _segmentsCount: function(t, e) {\r\n if (void 0 === e && (e = 20),\r\n !this.adaptive || !t || isNaN(t))\r\n return e;\r\n var r = Math.ceil(t / this.maxLength);\r\n return r < this.minSegments ? r = this.minSegments : r > this.maxSegments && (r = this.maxSegments),\r\n r\r\n }\r\n }\r\n , de = function() {\r\n function t() {\r\n this.color = 16777215,\r\n this.alpha = 1,\r\n this.texture = oa.WHITE,\r\n this.matrix = null,\r\n this.visible = !1,\r\n this.reset()\r\n }\r\n return t.prototype.clone = function() {\r\n var e = new t;\r\n return e.color = this.color,\r\n e.alpha = this.alpha,\r\n e.texture = this.texture,\r\n e.matrix = this.matrix,\r\n e.visible = this.visible,\r\n e\r\n }\r\n ,\r\n t.prototype.reset = function() {\r\n this.color = 16777215,\r\n this.alpha = 1,\r\n this.texture = oa.WHITE,\r\n this.matrix = null,\r\n this.visible = !1\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.texture = null,\r\n this.matrix = null\r\n }\r\n ,\r\n t\r\n }()\r\n , Zg = function(t, e) {\r\n return (Zg = Object.setPrototypeOf || {\r\n __proto__: []\r\n }instanceof Array && function(t, e) {\r\n t.__proto__ = e\r\n }\r\n || function(t, e) {\r\n for (var r in e)\r\n e.hasOwnProperty(r) && (t[r] = e[r])\r\n }\r\n )(t, e)\r\n };\r\n function Bc(t, e) {\r\n function r() {\r\n this.constructor = t\r\n }\r\n Zg(t, e),\r\n t.prototype = null === e ? Object.create(e) : (r.prototype = e.prototype,\r\n new r)\r\n }\r\n var ee = {\r\n build: function(t) {\r\n t.points = t.shape.points.slice()\r\n },\r\n triangulate: function(t, e) {\r\n var r = t.points\r\n , i = t.holes\r\n , a = e.points\r\n , n = e.indices;\r\n if (r.length >= 6) {\r\n for (var s = [], h = 0; h < i.length; h++) {\r\n var o = i[h];\r\n s.push(r.length / 2),\r\n r = r.concat(o.points)\r\n }\r\n var l = cd.d(r, s, 2);\r\n if (!l)\r\n return;\r\n var $ = a.length / 2;\r\n for (h = 0; h < l.length; h += 3)\r\n n.push(l[h] + $),\r\n n.push(l[h + 1] + $),\r\n n.push(l[h + 2] + $);\r\n for (h = 0; h < r.length; h++)\r\n a.push(r[h])\r\n }\r\n }\r\n }\r\n , fe = {\r\n build: function(t) {\r\n var e, r, i = t.shape, a = t.points, n = i.x, s = i.y;\r\n if (a.length = 0,\r\n t.type === fa.CIRC)\r\n e = i.radius,\r\n r = i.radius;\r\n else {\r\n var h = t.shape;\r\n e = h.width,\r\n r = h.height\r\n }\r\n if (0 !== e && 0 !== r) {\r\n var o = Math.floor(30 * Math.sqrt(i.radius)) || Math.floor(15 * Math.sqrt(e + r));\r\n o /= 2.3;\r\n for (var l = 2 * Math.PI / o, $ = 0; $ < o - .5; $++)\r\n a.push(n + Math.sin(-l * $) * e, s + Math.cos(-l * $) * r);\r\n a.push(a[0], a[1])\r\n }\r\n },\r\n triangulate: function(t, e) {\r\n var r = t.points\r\n , i = e.points\r\n , a = e.indices\r\n , n = i.length / 2\r\n , s = n\r\n , h = t.shape\r\n , o = t.matrix\r\n , l = h.x\r\n , $ = h.y;\r\n i.push(t.matrix ? o.a * l + o.c * $ + o.tx : l, t.matrix ? o.b * l + o.d * $ + o.ty : $);\r\n for (var u = 0; u < r.length; u += 2)\r\n i.push(r[u], r[u + 1]),\r\n a.push(n++, s, n)\r\n }\r\n }\r\n , $g = {\r\n build: function(t) {\r\n var e = t.shape\r\n , r = e.x\r\n , i = e.y\r\n , a = e.width\r\n , n = e.height\r\n , s = t.points;\r\n s.length = 0,\r\n s.push(r, i, r + a, i, r + a, i + n, r, i + n)\r\n },\r\n triangulate: function(t, e) {\r\n var r = t.points\r\n , i = e.points\r\n , a = i.length / 2;\r\n i.push(r[0], r[1], r[2], r[3], r[6], r[7], r[4], r[5]),\r\n e.indices.push(a, a + 1, a + 2, a + 1, a + 2, a + 3)\r\n }\r\n };\r\n function Xa(t, e, r) {\r\n return t + (e - t) * r\r\n }\r\n function Ib(t, e, r, i, a, n, s) {\r\n void 0 === s && (s = []);\r\n for (var h = s, o = 0, l = 0, $ = 0, u = 0, p = 0, c = 0, d = 0, v = 0; d <= 20; ++d)\r\n o = Xa(t, r, v = d / 20),\r\n l = Xa(e, i, v),\r\n $ = Xa(r, a, v),\r\n u = Xa(i, n, v),\r\n p = Xa(o, $, v),\r\n c = Xa(l, u, v),\r\n h.push(p, c);\r\n return h\r\n }\r\n var _g = {\r\n build: function(t) {\r\n var e = t.shape\r\n , r = t.points\r\n , i = e.x\r\n , a = e.y\r\n , n = e.width\r\n , s = e.height\r\n , h = Math.max(0, Math.min(e.radius, Math.min(n, s) / 2));\r\n r.length = 0,\r\n h ? (Ib(i, a + h, i, a, i + h, a, r),\r\n Ib(i + n - h, a, i + n, a, i + n, a + h, r),\r\n Ib(i + n, a + s - h, i + n, a + s, i + n - h, a + s, r),\r\n Ib(i + h, a + s, i, a + s, i, a + s - h, r)) : r.push(i, a, i + n, a, i + n, a + s, i, a + s)\r\n },\r\n triangulate: function(t, e) {\r\n for (var r = t.points, i = e.points, a = e.indices, n = i.length / 2, s = cd.d(r, null, 2), h = 0, o = s.length; h < o; h += 3)\r\n a.push(s[h] + n),\r\n a.push(s[h + 1] + n),\r\n a.push(s[h + 2] + n);\r\n for (h = 0,\r\n o = r.length; h < o; h++)\r\n i.push(r[h], r[++h])\r\n }\r\n };\r\n function ge(t, e, r, i, a, n, s, h) {\r\n var o, l;\r\n s ? (o = i,\r\n l = -r) : (o = -i,\r\n l = r);\r\n var $ = t - r * a + o\r\n , u = e - i * a + l\r\n , p = t + r * n + o\r\n , c = e + i * n + l;\r\n return h.push($, u),\r\n h.push(p, c),\r\n 2\r\n }\r\n function Ya(t, e, r, i, a, n, s, h) {\r\n var o = r - t\r\n , l = i - e\r\n , $ = Math.atan2(o, l)\r\n , u = Math.atan2(a - t, n - e);\r\n h && $ < u ? $ += 2 * Math.PI : !h && $ > u && (u += 2 * Math.PI);\r\n var p = $\r\n , c = u - $\r\n , d = Math.abs(c)\r\n , v = Math.sqrt(o * o + l * l)\r\n , f = 1 + (15 * d * Math.sqrt(v) / Math.PI >> 0)\r\n , y = c / f;\r\n if (p += y,\r\n h) {\r\n s.push(t, e),\r\n s.push(r, i);\r\n for (var g = 1, q = p; g < f; g++,\r\n q += y)\r\n s.push(t, e),\r\n s.push(t + Math.sin(q) * v, e + Math.cos(q) * v);\r\n s.push(t, e),\r\n s.push(a, n)\r\n } else {\r\n s.push(r, i),\r\n s.push(t, e);\r\n for (g = 1,\r\n q = p; g < f; g++,\r\n q += y)\r\n s.push(t + Math.sin(q) * v, e + Math.cos(q) * v),\r\n s.push(t, e);\r\n s.push(a, n),\r\n s.push(t, e)\r\n }\r\n return 2 * f\r\n }\r\n function ah(t, e) {\r\n var r = t.shape\r\n , i = t.points || r.points.slice()\r\n , a = e.closePointEps;\r\n if (0 !== i.length) {\r\n var n = t.lineStyle\r\n , s = new ra(i[0],i[1])\r\n , h = new ra(i[i.length - 2],i[i.length - 1])\r\n , o = r.type !== fa.POLY || r.closeStroke\r\n , l = Math.abs(s.x - h.x) < a && Math.abs(s.y - h.y) < a;\r\n if (o) {\r\n i = i.slice(),\r\n l && (i.pop(),\r\n i.pop(),\r\n h.set(i[i.length - 2], i[i.length - 1]));\r\n var $ = .5 * (s.x + h.x)\r\n , u = .5 * (h.y + s.y);\r\n i.unshift($, u),\r\n i.push($, u)\r\n }\r\n var p = e.points\r\n , c = i.length / 2\r\n , d = i.length\r\n , v = p.length / 2\r\n , f = n.width / 2\r\n , y = f * f\r\n , g = n.miterLimit * n.miterLimit\r\n , q = i[0]\r\n , m = i[1]\r\n , Q = i[2]\r\n , x = i[3]\r\n , b = 0\r\n , _ = 0\r\n , P = -(m - x)\r\n , S = q - Q\r\n , A = 0\r\n , w = 0\r\n , L = Math.sqrt(P * P + S * S);\r\n P /= L,\r\n S /= L,\r\n P *= f,\r\n S *= f;\r\n var E = n.alignment\r\n , C = 2 * (1 - E)\r\n , M = 2 * E;\r\n o || (n.cap === Ga.ROUND ? d += Ya(q - P * (C - M) * .5, m - S * (C - M) * .5, q - P * C, m - S * C, q + P * M, m + S * M, p, !0) + 2 : n.cap === Ga.SQUARE && (d += ge(q, m, P, S, C, M, !0, p))),\r\n p.push(q - P * C, m - S * C),\r\n p.push(q + P * M, m + S * M);\r\n for (var D = 1; D < c - 1; ++D) {\r\n q = i[2 * (D - 1)],\r\n m = i[2 * (D - 1) + 1],\r\n Q = i[2 * D],\r\n x = i[2 * D + 1],\r\n b = i[2 * (D + 1)],\r\n _ = i[2 * (D + 1) + 1],\r\n P = -(m - x),\r\n S = q - Q,\r\n P /= L = Math.sqrt(P * P + S * S),\r\n S /= L,\r\n P *= f,\r\n S *= f,\r\n A = -(x - _),\r\n w = Q - b,\r\n A /= L = Math.sqrt(A * A + w * w),\r\n w /= L,\r\n A *= f,\r\n w *= f;\r\n var I = Q - q\r\n , T = m - x\r\n , R = Q - b\r\n , O = _ - x\r\n , N = T * R - O * I\r\n , B = N < 0;\r\n if (Math.abs(N) < .1)\r\n p.push(Q - P * C, x - S * C),\r\n p.push(Q + P * M, x + S * M);\r\n else {\r\n var U = (-P + q) * (-S + x) - (-P + Q) * (-S + m)\r\n , H = (-A + b) * (-w + x) - (-A + Q) * (-w + _)\r\n , F = (I * H - R * U) / N\r\n , G = (O * U - T * H) / N\r\n , z = (F - Q) * (F - Q) + (G - x) * (G - x)\r\n , j = Q + (F - Q) * C\r\n , W = x + (G - x) * C\r\n , k = Q - (F - Q) * M\r\n , V = x - (G - x) * M\r\n , J = B ? C : M;\r\n z <= Math.min(I * I + T * T, R * R + O * O) + J * J * y ? n.join === Fa.BEVEL || z / y > g ? (B ? (p.push(j, W),\r\n p.push(Q + P * M, x + S * M),\r\n p.push(j, W),\r\n p.push(Q + A * M, x + w * M)) : (p.push(Q - P * C, x - S * C),\r\n p.push(k, V),\r\n p.push(Q - A * C, x - w * C),\r\n p.push(k, V)),\r\n d += 2) : n.join === Fa.ROUND ? B ? (p.push(j, W),\r\n p.push(Q + P * M, x + S * M),\r\n d += Ya(Q, x, Q + P * M, x + S * M, Q + A * M, x + w * M, p, !0) + 4,\r\n p.push(j, W),\r\n p.push(Q + A * M, x + w * M)) : (p.push(Q - P * C, x - S * C),\r\n p.push(k, V),\r\n d += Ya(Q, x, Q - P * C, x - S * C, Q - A * C, x - w * C, p, !1) + 4,\r\n p.push(Q - A * C, x - w * C),\r\n p.push(k, V)) : (p.push(j, W),\r\n p.push(k, V)) : (p.push(Q - P * C, x - S * C),\r\n p.push(Q + P * M, x + S * M),\r\n n.join === Fa.BEVEL || z / y > g || (n.join === Fa.ROUND ? d += B ? Ya(Q, x, Q + P * M, x + S * M, Q + A * M, x + w * M, p, !0) + 2 : Ya(Q, x, Q - P * C, x - S * C, Q - A * C, x - w * C, p, !1) + 2 : (B ? (p.push(k, V),\r\n p.push(k, V)) : (p.push(j, W),\r\n p.push(j, W)),\r\n d += 2)),\r\n p.push(Q - A * C, x - w * C),\r\n p.push(Q + A * M, x + w * M),\r\n d += 2)\r\n }\r\n }\r\n q = i[2 * (c - 2)],\r\n m = i[2 * (c - 2) + 1],\r\n Q = i[2 * (c - 1)],\r\n P = -(m - (x = i[2 * (c - 1) + 1])),\r\n S = q - Q,\r\n P /= L = Math.sqrt(P * P + S * S),\r\n S /= L,\r\n P *= f,\r\n S *= f,\r\n p.push(Q - P * C, x - S * C),\r\n p.push(Q + P * M, x + S * M),\r\n o || (n.cap === Ga.ROUND ? d += Ya(Q - P * (C - M) * .5, x - S * (C - M) * .5, Q - P * C, x - S * C, Q + P * M, x + S * M, p, !1) + 2 : n.cap === Ga.SQUARE && (d += ge(Q, x, P, S, C, M, !1, p)));\r\n var Y = e.indices\r\n , X = gb.epsilon * gb.epsilon;\r\n for (D = v; D < d + v - 2; ++D)\r\n q = p[2 * D],\r\n m = p[2 * D + 1],\r\n Q = p[2 * (D + 1)],\r\n x = p[2 * (D + 1) + 1],\r\n b = p[2 * (D + 2)],\r\n _ = p[2 * (D + 2) + 1],\r\n Math.abs(q * (x - _) + Q * (_ - m) + b * (m - x)) < X || Y.push(D, D + 1, D + 2)\r\n }\r\n }\r\n function bh(t, e) {\r\n var r = 0\r\n , i = t.shape\r\n , a = t.points || i.points\r\n , n = i.type !== fa.POLY || i.closeStroke;\r\n if (0 !== a.length) {\r\n var s = e.points\r\n , h = e.indices\r\n , o = a.length / 2\r\n , l = s.length / 2\r\n , $ = l;\r\n for (s.push(a[0], a[1]),\r\n r = 1; r < o; r++)\r\n s.push(a[2 * r], a[2 * r + 1]),\r\n h.push($, $ + 1),\r\n $++;\r\n n && h.push($, l)\r\n }\r\n }\r\n function he(t, e) {\r\n t.lineStyle.native ? bh(t, e) : ah(t, e)\r\n }\r\n var hb, ie = function() {\r\n function t() {}\r\n return t.curveTo = function(t, e, r, i, a, n) {\r\n var s = n[n.length - 2]\r\n , h = n[n.length - 1] - e\r\n , o = s - t\r\n , l = i - e\r\n , $ = r - t\r\n , u = Math.abs(h * $ - o * l);\r\n if (u < 1e-8 || 0 === a)\r\n return n[n.length - 2] === t && n[n.length - 1] === e || n.push(t, e),\r\n null;\r\n var p = h * h + o * o\r\n , c = l * l + $ * $\r\n , d = h * l + o * $\r\n , v = a * Math.sqrt(p) / u\r\n , f = a * Math.sqrt(c) / u\r\n , y = v * d / p\r\n , g = f * d / c\r\n , q = v * $ + f * o\r\n , m = v * l + f * h\r\n , Q = o * (f + y)\r\n , x = h * (f + y)\r\n , b = $ * (v + g)\r\n , _ = l * (v + g);\r\n return {\r\n cx: q + t,\r\n cy: m + e,\r\n radius: a,\r\n startAngle: Math.atan2(x - m, Q - q),\r\n endAngle: Math.atan2(_ - m, b - q),\r\n anticlockwise: o * l > $ * h\r\n }\r\n }\r\n ,\r\n t.arc = function(t, e, r, i, a, n, s, h, o) {\r\n for (var l = s - n, $ = gb._segmentsCount(Math.abs(l) * a, 40 * Math.ceil(Math.abs(l) / wb)), u = l / (2 * $), p = 2 * u, c = Math.cos(u), d = Math.sin(u), v = $ - 1, f = v % 1 / v, y = 0; y <= v; ++y) {\r\n var g = u + n + p * (y + f * y)\r\n , q = Math.cos(g)\r\n , m = -Math.sin(g);\r\n o.push((c * q + d * m) * a + r, (c * -m + d * q) * a + i)\r\n }\r\n }\r\n ,\r\n t\r\n }(), ch = function() {\r\n function t() {}\r\n return t.curveLength = function(t, e, r, i, a, n, s, h) {\r\n for (var o = 0, l = 0, $ = 0, u = 0, p = 0, c = 0, d = 0, v = 0, f = 0, y = 0, g = 0, q = t, m = e, Q = 1; Q <= 10; ++Q)\r\n y = q - (v = (d = (c = (p = 1 - (l = Q / 10)) * p) * p) * t + 3 * c * l * r + 3 * p * ($ = l * l) * a + (u = $ * l) * s),\r\n g = m - (f = d * e + 3 * c * l * i + 3 * p * $ * n + u * h),\r\n q = v,\r\n m = f,\r\n o += Math.sqrt(y * y + g * g);\r\n return o\r\n }\r\n ,\r\n t.curveTo = function(e, r, i, a, n, s, h) {\r\n var o = h[h.length - 2]\r\n , l = h[h.length - 1];\r\n h.length -= 2;\r\n var $ = gb._segmentsCount(t.curveLength(o, l, e, r, i, a, n, s))\r\n , u = 0\r\n , p = 0\r\n , c = 0\r\n , d = 0\r\n , v = 0;\r\n h.push(o, l);\r\n for (var f = 1, y = 0; f <= $; ++f)\r\n c = (p = (u = 1 - (y = f / $)) * u) * u,\r\n v = (d = y * y) * y,\r\n h.push(c * o + 3 * p * y * e + 3 * u * d * i + v * n, c * l + 3 * p * y * r + 3 * u * d * a + v * s)\r\n }\r\n ,\r\n t\r\n }(), dh = function() {\r\n function t() {}\r\n return t.curveLength = function(t, e, r, i, a, n) {\r\n var s = t - 2 * r + a\r\n , h = e - 2 * i + n\r\n , o = 2 * r - 2 * t\r\n , l = 2 * i - 2 * e\r\n , $ = 4 * (s * s + h * h)\r\n , u = 4 * (s * o + h * l)\r\n , p = o * o + l * l\r\n , c = 2 * Math.sqrt($ + u + p)\r\n , d = Math.sqrt($)\r\n , v = 2 * $ * d\r\n , f = 2 * Math.sqrt(p)\r\n , y = u / d;\r\n return (v * c + d * u * (c - f) + (4 * p * $ - u * u) * Math.log((2 * d + y + c) / (y + f))) / (4 * v)\r\n }\r\n ,\r\n t.curveTo = function(e, r, i, a, n) {\r\n for (var s = n[n.length - 2], h = n[n.length - 1], o = gb._segmentsCount(t.curveLength(s, h, e, r, i, a)), l = 0, $ = 0, u = 1; u <= o; ++u) {\r\n var p = u / o;\r\n l = s + (e - s) * p,\r\n $ = h + (r - h) * p,\r\n n.push(l + (e + (i - e) * p - l) * p, $ + (r + (a - r) * p - $) * p)\r\n }\r\n }\r\n ,\r\n t\r\n }(), eh = function() {\r\n function t() {\r\n this.reset()\r\n }\r\n return t.prototype.begin = function(t, e, r) {\r\n this.reset(),\r\n this.style = t,\r\n this.start = e,\r\n this.attribStart = r\r\n }\r\n ,\r\n t.prototype.end = function(t, e) {\r\n this.attribSize = e - this.attribStart,\r\n this.size = t - this.start\r\n }\r\n ,\r\n t.prototype.reset = function() {\r\n this.style = null,\r\n this.size = 0,\r\n this.start = 0,\r\n this.attribStart = 0,\r\n this.attribSize = 0\r\n }\r\n ,\r\n t\r\n }(), Cc = ((hb = {})[fa.POLY] = ee,\r\n hb[fa.CIRC] = fe,\r\n hb[fa.ELIP] = fe,\r\n hb[fa.RECT] = $g,\r\n hb[fa.RREC] = _g,\r\n hb), je = [], Jb = [], ke = function() {\r\n function t(t, e, r, i) {\r\n void 0 === e && (e = null),\r\n void 0 === r && (r = null),\r\n void 0 === i && (i = null),\r\n this.shape = t,\r\n this.lineStyle = r,\r\n this.fillStyle = e,\r\n this.matrix = i,\r\n this.type = t.type,\r\n this.points = [],\r\n this.holes = []\r\n }\r\n return t.prototype.clone = function() {\r\n return new t(this.shape,this.fillStyle,this.lineStyle,this.matrix)\r\n }\r\n ,\r\n t.prototype.destroy = function() {\r\n this.shape = null,\r\n this.holes.length = 0,\r\n this.holes = null,\r\n this.points.length = 0,\r\n this.points = null,\r\n this.lineStyle = null,\r\n this.fillStyle = null\r\n }\r\n ,\r\n t\r\n }(), Za = new ra, fh = new Gb, gh = function(t) {\r\n function e() {\r\n var e = t.call(this) || this;\r\n return e.uvsFloat32 = null,\r\n e.indicesUint16 = null,\r\n e.points = [],\r\n e.colors = [],\r\n e.uvs = [],\r\n e.indices = [],\r\n e.textureIds = [],\r\n e.graphicsData = [],\r\n e.dirty = 0,\r\n e.batchDirty = -1,\r\n e.cacheDirty = -1,\r\n e.clearDirty = 0,\r\n e.drawCalls = [],\r\n e.batches = [],\r\n e.shapeIndex = 0,\r\n e._bounds = new Gb,\r\n e.boundsDirty = -1,\r\n e.boundsPadding = 0,\r\n e.batchable = !1,\r\n e.indicesUint16 = null,\r\n e.uvsFloat32 = null,\r\n e.closePointEps = 1e-4,\r\n e\r\n }\r\n return Bc(e, t),\r\n Object.defineProperty(e.prototype, \"bounds\", {\r\n get: function() {\r\n return this.boundsDirty !== this.dirty && (this.boundsDirty = this.dirty,\r\n this.calculateBounds()),\r\n this._bounds\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.invalidate = function() {\r\n this.boundsDirty = -1,\r\n this.dirty++,\r\n this.batchDirty++,\r\n this.shapeIndex = 0,\r\n this.points.length = 0,\r\n this.colors.length = 0,\r\n this.uvs.length = 0,\r\n this.indices.length = 0,\r\n this.textureIds.length = 0;\r\n for (var t = 0; t < this.drawCalls.length; t++)\r\n this.drawCalls[t].texArray.clear(),\r\n Jb.push(this.drawCalls[t]);\r\n this.drawCalls.length = 0;\r\n for (t = 0; t < this.batches.length; t++) {\r\n var e = this.batches[t];\r\n e.reset(),\r\n je.push(e)\r\n }\r\n this.batches.length = 0\r\n }\r\n ,\r\n e.prototype.clear = function() {\r\n return this.graphicsData.length > 0 && (this.invalidate(),\r\n this.clearDirty++,\r\n this.graphicsData.length = 0),\r\n this\r\n }\r\n ,\r\n e.prototype.drawShape = function(t, e, r, i) {\r\n void 0 === e && (e = null),\r\n void 0 === r && (r = null),\r\n void 0 === i && (i = null);\r\n var a = new ke(t,e,r,i);\r\n return this.graphicsData.push(a),\r\n this.dirty++,\r\n this\r\n }\r\n ,\r\n e.prototype.drawHole = function(t, e) {\r\n if (void 0 === e && (e = null),\r\n !this.graphicsData.length)\r\n return null;\r\n var r = new ke(t,null,null,e)\r\n , i = this.graphicsData[this.graphicsData.length - 1];\r\n return r.lineStyle = i.lineStyle,\r\n i.holes.push(r),\r\n this.dirty++,\r\n this\r\n }\r\n ,\r\n e.prototype.destroy = function() {\r\n t.prototype.destroy.call(this);\r\n for (var e = 0; e < this.graphicsData.length; ++e)\r\n this.graphicsData[e].destroy();\r\n this.points.length = 0,\r\n this.points = null,\r\n this.colors.length = 0,\r\n this.colors = null,\r\n this.uvs.length = 0,\r\n this.uvs = null,\r\n this.indices.length = 0,\r\n this.indices = null,\r\n this.indexBuffer.destroy(),\r\n this.indexBuffer = null,\r\n this.graphicsData.length = 0,\r\n this.graphicsData = null,\r\n this.drawCalls.length = 0,\r\n this.drawCalls = null,\r\n this.batches.length = 0,\r\n this.batches = null,\r\n this._bounds = null\r\n }\r\n ,\r\n e.prototype.containsPoint = function(t) {\r\n for (var e = this.graphicsData, r = 0; r < e.length; ++r) {\r\n var i = e[r];\r\n if (i.fillStyle.visible && i.shape && (i.matrix ? i.matrix.applyInverse(t, Za) : Za.copyFrom(t),\r\n i.shape.contains(Za.x, Za.y))) {\r\n var a = !1;\r\n if (i.holes)\r\n for (var n = 0; n < i.holes.length; n++) {\r\n if (i.holes[n].shape.contains(Za.x, Za.y)) {\r\n a = !0;\r\n break\r\n }\r\n }\r\n if (!a)\r\n return !0\r\n }\r\n }\r\n return !1\r\n }\r\n ,\r\n e.prototype.updateBatches = function(t) {\r\n if (this.graphicsData.length) {\r\n if (this.validateBatching()) {\r\n this.cacheDirty = this.dirty;\r\n var e = this.uvs\r\n , r = this.graphicsData\r\n , i = null\r\n , a = null;\r\n this.batches.length > 0 && (a = (i = this.batches[this.batches.length - 1]).style);\r\n for (var n = this.shapeIndex; n < r.length; n++) {\r\n this.shapeIndex++;\r\n var s = r[n]\r\n , h = s.fillStyle\r\n , o = s.lineStyle;\r\n Cc[s.type].build(s),\r\n s.matrix && this.transformPoints(s.points, s.matrix);\r\n for (var l = 0; l < 2; l++) {\r\n var $ = 0 === l ? h : o;\r\n if ($.visible) {\r\n var u = $.texture.baseTexture\r\n , p = this.indices.length\r\n , c = this.points.length / 2;\r\n u.wrapMode = Rb.REPEAT,\r\n 0 === l ? this.processFill(s) : this.processLine(s);\r\n var d = this.points.length / 2 - c;\r\n 0 !== d && (i && !this._compareStyles(a, $) && (i.end(p, c),\r\n i = null),\r\n i || ((i = je.pop() || new eh).begin($, p, c),\r\n this.batches.push(i),\r\n a = $),\r\n this.addUvs(this.points, e, $.texture, c, d, $.matrix))\r\n }\r\n }\r\n }\r\n var v = this.indices.length\r\n , f = this.points.length / 2;\r\n if (i && i.end(v, f),\r\n 0 !== this.batches.length) {\r\n if (this.indicesUint16 && this.indices.length === this.indicesUint16.length)\r\n this.indicesUint16.set(this.indices);\r\n else {\r\n var y = f > 65535 && t;\r\n this.indicesUint16 = y ? new Uint32Array(this.indices) : new Uint16Array(this.indices)\r\n }\r\n this.batchable = this.isBatchable(),\r\n this.batchable ? this.packBatches() : this.buildDrawCalls()\r\n } else\r\n this.batchable = !0\r\n }\r\n } else\r\n this.batchable = !0\r\n }\r\n ,\r\n e.prototype._compareStyles = function(t, e) {\r\n return !(!t || !e) && t.texture.baseTexture === e.texture.baseTexture && t.color + t.alpha === e.color + e.alpha && !!t.native == !!e.native\r\n }\r\n ,\r\n e.prototype.validateBatching = function() {\r\n if (this.dirty === this.cacheDirty || !this.graphicsData.length)\r\n return !1;\r\n for (var t = 0, e = this.graphicsData.length; t < e; t++) {\r\n var r = this.graphicsData[t]\r\n , i = r.fillStyle\r\n , a = r.lineStyle;\r\n if (i && !i.texture.baseTexture.valid)\r\n return !1;\r\n if (a && !a.texture.baseTexture.valid)\r\n return !1\r\n }\r\n return !0\r\n }\r\n ,\r\n e.prototype.packBatches = function() {\r\n this.batchDirty++,\r\n this.uvsFloat32 = new Float32Array(this.uvs);\r\n for (var t = this.batches, e = 0, r = t.length; e < r; e++)\r\n for (var i = t[e], a = 0; a < i.size; a++) {\r\n var n = i.start + a;\r\n this.indicesUint16[n] = this.indicesUint16[n] - i.attribStart\r\n }\r\n }\r\n ,\r\n e.prototype.isBatchable = function() {\r\n if (this.points.length > 131070)\r\n return !1;\r\n for (var t = this.batches, r = 0; r < t.length; r++)\r\n if (t[r].style.native)\r\n return !1;\r\n return this.points.length < 2 * e.BATCHABLE_SIZE\r\n }\r\n ,\r\n e.prototype.buildDrawCalls = function() {\r\n for (var t = ++ia._globalBatch, e = 0; e < this.drawCalls.length; e++)\r\n this.drawCalls[e].texArray.clear(),\r\n Jb.push(this.drawCalls[e]);\r\n this.drawCalls.length = 0;\r\n var r = this.colors\r\n , i = this.textureIds\r\n , a = Jb.pop();\r\n a || ((a = new xc).texArray = new yc),\r\n a.texArray.count = 0,\r\n a.start = 0,\r\n a.size = 0,\r\n a.type = Ba.TRIANGLES;\r\n var n = 0\r\n , s = null\r\n , h = 0\r\n , o = !1\r\n , l = Ba.TRIANGLES\r\n , $ = 0;\r\n this.drawCalls.push(a);\r\n for (e = 0; e < this.batches.length; e++) {\r\n var u = this.batches[e]\r\n , p = u.style\r\n , c = p.texture.baseTexture;\r\n o !== !!p.native && (l = (o = !!p.native) ? Ba.LINES : Ba.TRIANGLES,\r\n s = null,\r\n n = 8,\r\n t++),\r\n s !== c && (s = c,\r\n c._batchEnabled !== t && (8 === n && (t++,\r\n n = 0,\r\n a.size > 0 && ((a = Jb.pop()) || ((a = new xc).texArray = new yc),\r\n this.drawCalls.push(a)),\r\n a.start = $,\r\n a.size = 0,\r\n a.texArray.count = 0,\r\n a.type = l),\r\n c.touched = 1,\r\n c._batchEnabled = t,\r\n c._batchLocation = n,\r\n c.wrapMode = 10497,\r\n a.texArray.elements[a.texArray.count++] = c,\r\n n++)),\r\n a.size += u.size,\r\n $ += u.size,\r\n h = c._batchLocation,\r\n this.addColors(r, p.color, p.alpha, u.attribSize),\r\n this.addTextureIds(i, h, u.attribSize)\r\n }\r\n ia._globalBatch = t,\r\n this.packAttributes()\r\n }\r\n ,\r\n e.prototype.packAttributes = function() {\r\n for (var t = this.points, e = this.uvs, r = this.colors, i = this.textureIds, a = new ArrayBuffer(3 * t.length * 4), n = new Float32Array(a), s = new Uint32Array(a), h = 0, o = 0; o < t.length / 2; o++)\r\n n[h++] = t[2 * o],\r\n n[h++] = t[2 * o + 1],\r\n n[h++] = e[2 * o],\r\n n[h++] = e[2 * o + 1],\r\n s[h++] = r[o],\r\n n[h++] = i[o];\r\n this._buffer.update(a),\r\n this._indexBuffer.update(this.indicesUint16)\r\n }\r\n ,\r\n e.prototype.processFill = function(t) {\r\n t.holes.length ? (this.processHoles(t.holes),\r\n ee.triangulate(t, this)) : Cc[t.type].triangulate(t, this)\r\n }\r\n ,\r\n e.prototype.processLine = function(t) {\r\n he(t, this);\r\n for (var e = 0; e < t.holes.length; e++)\r\n he(t.holes[e], this)\r\n }\r\n ,\r\n e.prototype.processHoles = function(t) {\r\n for (var e = 0; e < t.length; e++) {\r\n var r = t[e];\r\n Cc[r.type].build(r),\r\n r.matrix && this.transformPoints(r.points, r.matrix)\r\n }\r\n }\r\n ,\r\n e.prototype.calculateBounds = function() {\r\n var t = this._bounds\r\n , e = fh\r\n , r = la.IDENTITY;\r\n this._bounds.clear(),\r\n e.clear();\r\n for (var i = 0; i < this.graphicsData.length; i++) {\r\n var a = this.graphicsData[i]\r\n , n = a.shape\r\n , s = a.type\r\n , h = a.lineStyle\r\n , o = a.matrix || la.IDENTITY\r\n , l = 0;\r\n if (h && h.visible) {\r\n var $ = h.alignment;\r\n l = h.width,\r\n s === fa.POLY ? l *= .5 + Math.abs(.5 - $) : l *= Math.max(0, $)\r\n }\r\n if (r !== o && (e.isEmpty() || (t.addBoundsMatrix(e, r),\r\n e.clear()),\r\n r = o),\r\n s === fa.RECT || s === fa.RREC) {\r\n var u = n;\r\n e.addFramePad(u.x, u.y, u.x + u.width, u.y + u.height, l, l)\r\n } else if (s === fa.CIRC) {\r\n var p = n;\r\n e.addFramePad(p.x, p.y, p.x, p.y, p.radius + l, p.radius + l)\r\n } else if (s === fa.ELIP) {\r\n var c = n;\r\n e.addFramePad(c.x, c.y, c.x, c.y, c.width + l, c.height + l)\r\n } else {\r\n var d = n;\r\n t.addVerticesMatrix(r, d.points, 0, d.points.length, l, l)\r\n }\r\n }\r\n e.isEmpty() || t.addBoundsMatrix(e, r),\r\n t.pad(this.boundsPadding, this.boundsPadding)\r\n }\r\n ,\r\n e.prototype.transformPoints = function(t, e) {\r\n for (var r = 0; r < t.length / 2; r++) {\r\n var i = t[2 * r]\r\n , a = t[2 * r + 1];\r\n t[2 * r] = e.a * i + e.c * a + e.tx,\r\n t[2 * r + 1] = e.b * i + e.d * a + e.ty\r\n }\r\n }\r\n ,\r\n e.prototype.addColors = function(t, e, r, i) {\r\n for (var a = fd((e >> 16) + (65280 & e) + ((255 & e) << 16), r); i-- > 0; )\r\n t.push(a)\r\n }\r\n ,\r\n e.prototype.addTextureIds = function(t, e, r) {\r\n for (; r-- > 0; )\r\n t.push(e)\r\n }\r\n ,\r\n e.prototype.addUvs = function(t, e, r, i, a, n) {\r\n void 0 === n && (n = null);\r\n for (var s = 0, h = e.length, o = r.frame; s < a; ) {\r\n var l = t[2 * (i + s)]\r\n , $ = t[2 * (i + s) + 1];\r\n if (n) {\r\n var u = n.a * l + n.c * $ + n.tx;\r\n $ = n.b * l + n.d * $ + n.ty,\r\n l = u\r\n }\r\n s++,\r\n e.push(l / o.width, $ / o.height)\r\n }\r\n var p = r.baseTexture;\r\n (o.width < p.width || o.height < p.height) && this.adjustUvs(e, r, h, a)\r\n }\r\n ,\r\n e.prototype.adjustUvs = function(t, e, r, i) {\r\n for (var a = e.baseTexture, n = r + 2 * i, s = e.frame, h = s.width / a.width, o = s.height / a.height, l = s.x / s.width, $ = s.y / s.height, u = Math.floor(t[r] + 1e-6), p = Math.floor(t[r + 1] + 1e-6), c = r + 2; c < n; c += 2)\r\n u = Math.min(u, Math.floor(t[c] + 1e-6)),\r\n p = Math.min(p, Math.floor(t[c + 1] + 1e-6));\r\n l -= u,\r\n $ -= p;\r\n for (c = r; c < n; c += 2)\r\n t[c] = (t[c] + l) * h,\r\n t[c + 1] = (t[c + 1] + $) * o\r\n }\r\n ,\r\n e.BATCHABLE_SIZE = 100,\r\n e\r\n }(_d), hh = function(t) {\r\n function e() {\r\n var e = null !== t && t.apply(this, arguments) || this;\r\n return e.width = 0,\r\n e.alignment = .5,\r\n e.native = !1,\r\n e.cap = Ga.BUTT,\r\n e.join = Fa.MITER,\r\n e.miterLimit = 10,\r\n e\r\n }\r\n return Bc(e, t),\r\n e.prototype.clone = function() {\r\n var t = new e;\r\n return t.color = this.color,\r\n t.alpha = this.alpha,\r\n t.texture = this.texture,\r\n t.matrix = this.matrix,\r\n t.visible = this.visible,\r\n t.width = this.width,\r\n t.alignment = this.alignment,\r\n t.native = this.native,\r\n t.cap = this.cap,\r\n t.join = this.join,\r\n t.miterLimit = this.miterLimit,\r\n t\r\n }\r\n ,\r\n e.prototype.reset = function() {\r\n t.prototype.reset.call(this),\r\n this.color = 0,\r\n this.alignment = .5,\r\n this.width = 0,\r\n this.native = !1\r\n }\r\n ,\r\n e\r\n }(de), ih = new Float32Array(3), Dc = {}, jh = function(t) {\r\n function e(e) {\r\n void 0 === e && (e = null);\r\n var r = t.call(this) || this;\r\n return r._geometry = e || new gh,\r\n r._geometry.refCount++,\r\n r.shader = null,\r\n r.state = Fb.for2d(),\r\n r._fillStyle = new de,\r\n r._lineStyle = new hh,\r\n r._matrix = null,\r\n r._holeMode = !1,\r\n r.currentPath = null,\r\n r.batches = [],\r\n r.batchTint = -1,\r\n r.batchDirty = -1,\r\n r.vertexData = null,\r\n r.pluginName = \"batch\",\r\n r._transformID = -1,\r\n r.tint = 16777215,\r\n r.blendMode = K.NORMAL,\r\n r\r\n }\r\n return Bc(e, t),\r\n Object.defineProperty(e.prototype, \"geometry\", {\r\n get: function() {\r\n return this._geometry\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.clone = function() {\r\n return this.finishPoly(),\r\n new e(this._geometry)\r\n }\r\n ,\r\n Object.defineProperty(e.prototype, \"blendMode\", {\r\n get: function() {\r\n return this.state.blendMode\r\n },\r\n set: function(t) {\r\n this.state.blendMode = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"tint\", {\r\n get: function() {\r\n return this._tint\r\n },\r\n set: function(t) {\r\n this._tint = t\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"fill\", {\r\n get: function() {\r\n return this._fillStyle\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n Object.defineProperty(e.prototype, \"line\", {\r\n get: function() {\r\n return this._lineStyle\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n e.prototype.lineStyle = function(t, e, r, i, a) {\r\n return void 0 === t && (t = null),\r\n void 0 === e && (e = 0),\r\n void 0 === r && (r = 1),\r\n void 0 === i && (i = .5),\r\n void 0 === a && (a = !1),\r\n \"number\" == typeof t && (t = {\r\n width: t,\r\n color: e,\r\n alpha: r,\r\n alignment: i,\r\n native: a\r\n }),\r\n this.lineTextureStyle(t)\r\n }\r\n ,\r\n e.prototype.lineTextureStyle = function(t) {\r\n t = Object.assign({\r\n width: 0,\r\n texture: oa.WHITE,\r\n color: t && t.texture ? 16777215 : 0,\r\n alpha: 1,\r\n matrix: null,\r\n alignment: .5,\r\n native: !1,\r\n cap: Ga.BUTT,\r\n join: Fa.MITER,\r\n miterLimit: 10\r\n }, t),\r\n this.currentPath && this.startPoly();\r\n var e = t.width > 0 && t.alpha > 0;\r\n return e ? (t.matrix && (t.matrix = t.matrix.clone(),\r\n t.matrix.invert()),\r\n Object.assign(this._lineStyle, {\r\n visible: e\r\n }, t)) : this._lineStyle.reset(),\r\n this\r\n }\r\n ,\r\n e.prototype.startPoly = function() {\r\n if (this.currentPath) {\r\n var t = this.currentPath.points\r\n , e = this.currentPath.points.length;\r\n e > 2 && (this.drawShape(this.currentPath),\r\n this.currentPath = new $b,\r\n this.currentPath.closeStroke = !1,\r\n this.currentPath.points.push(t[e - 2], t[e - 1]))\r\n } else\r\n this.currentPath = new $b,\r\n this.currentPath.closeStroke = !1\r\n }\r\n ,\r\n e.prototype.finishPoly = function() {\r\n this.currentPath && (this.currentPath.points.length > 2 ? (this.drawShape(this.currentPath),\r\n this.currentPath = null) : this.currentPath.points.length = 0)\r\n }\r\n ,\r\n e.prototype.moveTo = function(t, e) {\r\n return this.startPoly(),\r\n this.currentPath.points[0] = t,\r\n this.currentPath.points[1] = e,\r\n this\r\n }\r\n ,\r\n e.prototype.lineTo = function(t, e) {\r\n this.currentPath || this.moveTo(0, 0);\r\n var r = this.currentPath.points\r\n , i = r[r.length - 2]\r\n , a = r[r.length - 1];\r\n return i === t && a === e || r.push(t, e),\r\n this\r\n }\r\n ,\r\n e.prototype._initCurve = function(t, e) {\r\n void 0 === t && (t = 0),\r\n void 0 === e && (e = 0),\r\n this.currentPath ? 0 === this.currentPath.points.length && (this.currentPath.points = [t, e]) : this.moveTo(t, e)\r\n }\r\n ,\r\n e.prototype.quadraticCurveTo = function(t, e, r, i) {\r\n this._initCurve();\r\n var a = this.currentPath.points;\r\n return 0 === a.length && this.moveTo(0, 0),\r\n dh.curveTo(t, e, r, i, a),\r\n this\r\n }\r\n ,\r\n e.prototype.bezierCurveTo = function(t, e, r, i, a, n) {\r\n return this._initCurve(),\r\n ch.curveTo(t, e, r, i, a, n, this.currentPath.points),\r\n this\r\n }\r\n ,\r\n e.prototype.arcTo = function(t, e, r, i, a) {\r\n this._initCurve(t, e);\r\n var n = this.currentPath.points\r\n , s = ie.curveTo(t, e, r, i, a, n);\r\n if (s) {\r\n var h = s.cx\r\n , o = s.cy\r\n , l = s.radius\r\n , $ = s.startAngle\r\n , u = s.endAngle\r\n , p = s.anticlockwise;\r\n this.arc(h, o, l, $, u, p)\r\n }\r\n return this\r\n }\r\n ,\r\n e.prototype.arc = function(t, e, r, i, a, n) {\r\n if (void 0 === n && (n = !1),\r\n i === a)\r\n return this;\r\n if (!n && a <= i ? a += wb : n && i <= a && (i += wb),\r\n 0 === a - i)\r\n return this;\r\n var s = t + Math.cos(i) * r\r\n , h = e + Math.sin(i) * r\r\n , o = this._geometry.closePointEps\r\n , l = this.currentPath ? this.currentPath.points : null;\r\n if (l) {\r\n var $ = Math.abs(l[l.length - 2] - s)\r\n , u = Math.abs(l[l.length - 1] - h);\r\n $ < o && u < o || l.push(s, h)\r\n } else\r\n this.moveTo(s, h),\r\n l = this.currentPath.points;\r\n return ie.arc(s, h, t, e, r, i, a, n, l),\r\n this\r\n }\r\n ,\r\n e.prototype.beginFill = function(t, e) {\r\n return void 0 === t && (t = 0),\r\n void 0 === e && (e = 1),\r\n this.beginTextureFill({\r\n texture: oa.WHITE,\r\n color: t,\r\n alpha: e\r\n })\r\n }\r\n ,\r\n e.prototype.beginTextureFill = function(t) {\r\n t = Object.assign({\r\n texture: oa.WHITE,\r\n color: 16777215,\r\n alpha: 1,\r\n matrix: null\r\n }, t),\r\n this.currentPath && this.startPoly();\r\n var e = t.alpha > 0;\r\n return e ? (t.matrix && (t.matrix = t.matrix.clone(),\r\n t.matrix.invert()),\r\n Object.assign(this._fillStyle, {\r\n visible: e\r\n }, t)) : this._fillStyle.reset(),\r\n this\r\n }\r\n ,\r\n e.prototype.endFill = function() {\r\n return this.finishPoly(),\r\n this._fillStyle.reset(),\r\n this\r\n }\r\n ,\r\n e.prototype.drawRect = function(t, e, r, i) {\r\n return this.drawShape(new da(t,e,r,i))\r\n }\r\n ,\r\n e.prototype.drawRoundedRect = function(t, e, r, i, a) {\r\n return this.drawShape(new Xf(t,e,r,i,a))\r\n }\r\n ,\r\n e.prototype.drawCircle = function(t, e, r) {\r\n return this.drawShape(new Vf(t,e,r))\r\n }\r\n ,\r\n e.prototype.drawEllipse = function(t, e, r, i) {\r\n return this.drawShape(new Wf(t,e,r,i))\r\n }\r\n ,\r\n e.prototype.drawPolygon = function() {\r\n for (var t, e = arguments, r = [], i = 0; i < arguments.length; i++)\r\n r[i] = e[i];\r\n var a = !0\r\n , n = r[0];\r\n n.points ? (a = n.closeStroke,\r\n t = n.points) : t = Array.isArray(r[0]) ? r[0] : r;\r\n var s = new $b(t);\r\n return s.closeStroke = a,\r\n this.drawShape(s),\r\n this\r\n }\r\n ,\r\n e.prototype.drawShape = function(t) {\r\n return this._holeMode ? this._geometry.drawHole(t, this._matrix) : this._geometry.drawShape(t, this._fillStyle.clone(), this._lineStyle.clone(), this._matrix),\r\n this\r\n }\r\n ,\r\n e.prototype.clear = function() {\r\n return this._geometry.clear(),\r\n this._lineStyle.reset(),\r\n this._fillStyle.reset(),\r\n this._boundsID++,\r\n this._matrix = null,\r\n this._holeMode = !1,\r\n this.currentPath = null,\r\n this\r\n }\r\n ,\r\n e.prototype.isFastRect = function() {\r\n var t = this._geometry.graphicsData;\r\n return 1 === t.length && t[0].shape.type === fa.RECT && !(t[0].lineStyle.visible && t[0].lineStyle.width)\r\n }\r\n ,\r\n e.prototype._render = function(t) {\r\n this.finishPoly();\r\n var e = this._geometry\r\n , r = t.context.supports.uint32Indices;\r\n e.updateBatches(r),\r\n e.batchable ? (this.batchDirty !== e.batchDirty && this._populateBatches(),\r\n this._renderBatched(t)) : (t.batch.flush(),\r\n this._renderDirect(t))\r\n }\r\n ,\r\n e.prototype._populateBatches = function() {\r\n var t = this._geometry\r\n , e = this.blendMode\r\n , r = t.batches.length;\r\n this.batchTint = -1,\r\n this._transformID = -1,\r\n this.batchDirty = t.batchDirty,\r\n this.batches.length = r,\r\n this.vertexData = new Float32Array(t.points);\r\n for (var i = 0; i < r; i++) {\r\n var a = t.batches[i]\r\n , n = a.style.color\r\n , s = new Float32Array(this.vertexData.buffer,4 * a.attribStart * 2,2 * a.attribSize)\r\n , h = new Float32Array(t.uvsFloat32.buffer,4 * a.attribStart * 2,2 * a.attribSize)\r\n , o = {\r\n vertexData: s,\r\n blendMode: e,\r\n indices: new Uint16Array(t.indicesUint16.buffer,2 * a.start,a.size),\r\n uvs: h,\r\n _batchRGB: Xb(n),\r\n _tintRGB: n,\r\n _texture: a.style.texture,\r\n alpha: a.style.alpha,\r\n worldAlpha: 1\r\n };\r\n this.batches[i] = o\r\n }\r\n }\r\n ,\r\n e.prototype._renderBatched = function(t) {\r\n if (this.batches.length) {\r\n t.batch.setObjectRenderer(t.plugins[this.pluginName]),\r\n this.calculateVertices(),\r\n this.calculateTints();\r\n for (var e = 0, r = this.batches.length; e < r; e++) {\r\n var i = this.batches[e];\r\n i.worldAlpha = this.worldAlpha * i.alpha,\r\n t.plugins[this.pluginName].render(i)\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype._renderDirect = function(t) {\r\n var e = this._resolveDirectShader(t)\r\n , r = this._geometry\r\n , i = this.tint\r\n , a = this.worldAlpha\r\n , n = e.uniforms\r\n , s = r.drawCalls;\r\n n.translationMatrix = this.transform.worldTransform,\r\n n.tint[0] = (i >> 16 & 255) / 255 * a,\r\n n.tint[1] = (i >> 8 & 255) / 255 * a,\r\n n.tint[2] = (255 & i) / 255 * a,\r\n n.tint[3] = a,\r\n t.shader.bind(e),\r\n t.geometry.bind(r, e),\r\n t.state.set(this.state);\r\n for (var h = 0, o = s.length; h < o; h++)\r\n this._renderDrawCallDirect(t, r.drawCalls[h])\r\n }\r\n ,\r\n e.prototype._renderDrawCallDirect = function(t, e) {\r\n for (var r = e.texArray, i = e.type, a = e.size, n = e.start, s = r.count, h = 0; h < s; h++)\r\n t.texture.bind(r.elements[h], h);\r\n t.geometry.draw(i, a, n)\r\n }\r\n ,\r\n e.prototype._resolveDirectShader = function(t) {\r\n var e = this.shader\r\n , r = this.pluginName;\r\n if (!e) {\r\n if (!Dc[r]) {\r\n for (var i = t.plugins.batch.MAX_TEXTURES, a = new Int32Array(i), n = 0; n < i; n++)\r\n a[n] = n;\r\n var s = {\r\n tint: new Float32Array([1, 1, 1, 1]),\r\n translationMatrix: new la,\r\n default: Pa.from({\r\n uSamplers: a\r\n }, !0)\r\n }\r\n , h = t.plugins[r]._shader.program;\r\n Dc[r] = new oc(h,s)\r\n }\r\n e = Dc[r]\r\n }\r\n return e\r\n }\r\n ,\r\n e.prototype._calculateBounds = function() {\r\n this.finishPoly();\r\n var t = this._geometry;\r\n if (t.graphicsData.length) {\r\n var e = t.bounds\r\n , r = e.minX\r\n , i = e.minY\r\n , a = e.maxX\r\n , n = e.maxY;\r\n this._bounds.addFrame(this.transform, r, i, a, n)\r\n }\r\n }\r\n ,\r\n e.prototype.containsPoint = function(t) {\r\n return this.worldTransform.applyInverse(t, e._TEMP_POINT),\r\n this._geometry.containsPoint(e._TEMP_POINT)\r\n }\r\n ,\r\n e.prototype.calculateTints = function() {\r\n if (this.batchTint !== this.tint) {\r\n this.batchTint = this.tint;\r\n for (var t = Xb(this.tint, ih), e = 0; e < this.batches.length; e++) {\r\n var r = this.batches[e]\r\n , i = r._batchRGB\r\n , a = (t[0] * i[0] * 255 << 16) + (t[1] * i[1] * 255 << 8) + (0 | t[2] * i[2] * 255);\r\n r._tintRGB = (a >> 16) + (65280 & a) + ((255 & a) << 16)\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.calculateVertices = function() {\r\n var t = this.transform._worldID;\r\n if (this._transformID !== t) {\r\n this._transformID = t;\r\n for (var e = this.transform.worldTransform, r = e.a, i = e.b, a = e.c, n = e.d, s = e.tx, h = e.ty, o = this._geometry.points, l = this.vertexData, $ = 0, u = 0; u < o.length; u += 2) {\r\n var p = o[u]\r\n , c = o[u + 1];\r\n l[$++] = r * p + a * c + s,\r\n l[$++] = n * c + i * p + h\r\n }\r\n }\r\n }\r\n ,\r\n e.prototype.closePath = function() {\r\n var t = this.currentPath;\r\n return t && (t.closeStroke = !0),\r\n this\r\n }\r\n ,\r\n e.prototype.setMatrix = function(t) {\r\n return this._matrix = t,\r\n this\r\n }\r\n ,\r\n e.prototype.beginHole = function() {\r\n return this.finishPoly(),\r\n this._holeMode = !0,\r\n this\r\n }\r\n ,\r\n e.prototype.endHole = function() {\r\n return this.finishPoly(),\r\n this._holeMode = !1,\r\n this\r\n }\r\n ,\r\n e.prototype.destroy = function(e) {\r\n this._geometry.refCount--,\r\n 0 === this._geometry.refCount && this._geometry.dispose(),\r\n this._matrix = null,\r\n this.currentPath = null,\r\n this._lineStyle.destroy(),\r\n this._lineStyle = null,\r\n this._fillStyle.destroy(),\r\n this._fillStyle = null,\r\n this._geometry = null,\r\n this.shader = null,\r\n this.vertexData = null,\r\n this.batches.length = 0,\r\n this.batches = null,\r\n t.prototype.destroy.call(this, e)\r\n }\r\n ,\r\n e._TEMP_POINT = new ra,\r\n e\r\n }(Ac);\r\n var kh = Nb && Nb.__extends || function() {\r\n var t = function(i, r) {\r\n return (t = Object.setPrototypeOf || {\r\n __proto__: []\r\n }instanceof Array && function(t, i) {\r\n t.__proto__ = i\r\n }\r\n || function(t, i) {\r\n for (var r in i)\r\n Object.prototype.hasOwnProperty.call(i, r) && (t[r] = i[r])\r\n }\r\n )(i, r)\r\n };\r\n return function(i, r) {\r\n if (\"function\" != typeof r && null !== r)\r\n throw new TypeError(\"Class extends value \" + String(r) + \" is not a constructor or null\");\r\n function o() {\r\n this.constructor = i\r\n }\r\n t(i, r),\r\n i.prototype = null === r ? Object.create(r) : (o.prototype = r.prototype,\r\n new o)\r\n }\r\n }()\r\n , lh = window.PIXI ? window.PIXI.Graphics : jh\r\n , le = function(t) {\r\n function i(i, r, o) {\r\n void 0 === r && (r = {});\r\n var s = t.call(this) || this;\r\n s.graphicsOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 100,\r\n height: 100,\r\n fill: 0,\r\n lineWidth: 1,\r\n lineColor: 16777215\r\n },\r\n s.graphicsOptions = Object.assign(s.graphicsOptions, i),\r\n s.physicsOptions = r;\r\n var p = s.graphicsOptions.width / 2\r\n , n = s.graphicsOptions.height / 2;\r\n return s.pivot.x = p,\r\n s.pivot.y = n,\r\n s._update = o,\r\n s.graphicsOptions.radius ? s._body = ha.Bodies.circle(s.graphicsOptions.x, s.graphicsOptions.y, s.graphicsOptions.radius, s.physicsOptions) : s._body = ha.Bodies.rectangle(s.graphicsOptions.x + p, s.graphicsOptions.y + n, s.graphicsOptions.width, s.graphicsOptions.height, s.physicsOptions),\r\n s\r\n }\r\n return kh(i, t),\r\n Object.defineProperty(i.prototype, \"body\", {\r\n get: function() {\r\n return this._body\r\n },\r\n enumerable: !1,\r\n configurable: !0\r\n }),\r\n i.prototype.update = function() {\r\n this._update({\r\n position: this._body.position,\r\n rotation: this._body.angle\r\n })\r\n }\r\n ,\r\n i\r\n }(lh);\r\n Nb.PhysicsGraphics = le;\r\n var me = ma && ma.__assign || function() {\r\n return (me = Object.assign || function(r) {\r\n for (var n, e = 1, t = arguments.length; e < t; e++)\r\n for (var a in n = arguments[e])\r\n Object.prototype.hasOwnProperty.call(n, a) && (r[a] = n[a]);\r\n return r\r\n }\r\n ).apply(this, arguments)\r\n }\r\n , ne = ma && ma.__spreadArray || function(r, n) {\r\n for (var e = 0, t = n.length, a = r.length; e < t; e++,\r\n a++)\r\n r[a] = n[e];\r\n return r\r\n }\r\n ;\r\n function oe(r, n) {\r\n return window[n] ? Promise.resolve(window[n]) : new Promise(function(e, t) {\r\n var a = document.createElement(\"script\");\r\n a.onload = function() {\r\n e(n && window[n])\r\n }\r\n ,\r\n a.onerror = function(r) {\r\n a.onload = null,\r\n a.onerror = null,\r\n document.body.removeChild(a),\r\n t(r)\r\n }\r\n ,\r\n a.src = r,\r\n a.async = !0,\r\n document.body.appendChild(a)\r\n }\r\n )\r\n }\r\n ma.loadScript = oe;\r\n var mh = function(r) {\r\n r.App && (r.App.destroy({\r\n removeView: !0\r\n }),\r\n window.PIXI.loader.destroy(),\r\n r.App = null,\r\n r.timerMap.forEach(function(r, n) {\r\n window.clearInterval(r),\r\n window.clearTimeout(r)\r\n }),\r\n r.timerMap.clear(),\r\n r.soundMap = {},\r\n r.music.pause(),\r\n r.music = null,\r\n r.music = new Audio,\r\n Object.keys(r.windowListener).map(function(n) {\r\n var e = n.replace(\"Listener\", \"\");\r\n window.removeEventListener(e, r.windowListener[n])\r\n }))\r\n };\r\n ma.resetPygameZero = mh;\r\n var Ec = {\r\n aqua: \"#00FFFF\",\r\n black: \"#000000\",\r\n blue: \"#0000FF\",\r\n fuchsia: \"#FF00FF\",\r\n gray: \"#808080\",\r\n green: \"#008000\",\r\n lime: \"#00FF00\",\r\n maroon: \"#800000\",\r\n navy: \"#000080\",\r\n olive: \"#808000\",\r\n orange: \"#FFA500\",\r\n purple: \"#800080\",\r\n red: \"#FF0000\",\r\n silver: \"#C0C0C0\",\r\n teal: \"#008080\",\r\n white: \"#FFFFFF\",\r\n yellow: \"#FFFF00\"\r\n };\r\n ma.ColorNameMap = Ec;\r\n var nh = function(r) {\r\n Math.round(r.view.width / 2),\r\n Math.round(r.view.height / 2);\r\n var n = {\r\n transX: function(r, n) {\r\n return void 0 === n && (n = !1),\r\n r\r\n },\r\n transY: function(r, n) {\r\n return void 0 === n && (n = !1),\r\n r\r\n },\r\n transPos: function(r, e) {\r\n return void 0 === e && (e = !1),\r\n r ? [n.transX(r[0], e), n.transY(r[1], e)] : r\r\n },\r\n transColor: function(r) {\r\n return Array.isArray(r) ? window.PIXI.utils.rgb2hex(r) : r.match(\"#\") ? window.PIXI.utils.string2hex(r) : Ec[r] ? window.PIXI.utils.string2hex(Ec[r]) : 16777215\r\n }\r\n };\r\n return n\r\n };\r\n function oh(r, n) {\r\n Array.isArray(n) && (n.x = n[0],\r\n n.y = n[1],\r\n n.width = 0,\r\n n.height = 0),\r\n r.centerX = r.x + r.width / 2,\r\n r.centerY = r.y + r.height / 2,\r\n n.centerX = n.x + n.width / 2,\r\n n.centerY = n.y + n.height / 2,\r\n r.halfWidth = r.width / 2,\r\n r.halfHeight = r.height / 2,\r\n n.halfWidth = n.width / 2,\r\n n.halfHeight = n.height / 2;\r\n var e = r.centerX - n.centerX\r\n , t = r.centerY - n.centerY\r\n , a = r.halfWidth + n.halfWidth\r\n , i = r.halfHeight + n.halfHeight;\r\n return Math.abs(e) < a && Math.abs(t) < i\r\n }\r\n ma.translateTools = nh,\r\n ma.hitTestRectangle = oh;\r\n var Fc = {};\r\n function ph(r) {\r\n function n(r) {\r\n var n;\r\n return Array.isArray(r) && (n = ne([], r),\r\n r = n[0]),\r\n new Promise(function(e, t) {\r\n window.PIXI.utils.TextureCache[r] ? e(window.PIXI.utils.TextureCache[r]) : window.PIXI.loader.add(n || r).load(function() {\r\n var n = window.PIXI.loader.resources[r].texture;\r\n e(n)\r\n })\r\n }\r\n )\r\n }\r\n return /\\.json$/.test(r) ? Fc[r] ? n(Fc[r]) : fetch(r).then(function(r) {\r\n return r.json()\r\n }).then(function(e) {\r\n var t = r.replace(\"index.json\", \"\")\r\n , a = e.map(function(r) {\r\n return t + r\r\n });\r\n return Fc[r] = a,\r\n n(a)\r\n }) : n(r)\r\n }\r\n ma.textureRecources = ph;\r\n var ga = window.Sk\r\n , qh = function(r) {\r\n return ga.misceval.callsimOrSuspend(ga.builtins.property, new ga.builtin.func(r), new ga.builtin.func(function() {}\r\n ))\r\n };\r\n function pe(r, n) {\r\n var e = function(e) {\r\n for (var t = [], a = 1; a < arguments.length; a++)\r\n t[a - 1] = arguments[a];\r\n n || (t = new ga.builtins.tuple(t));\r\n var i = new ga.builtin.dict(e);\r\n return r(t, i)\r\n };\r\n return e.co_kwargs = !0,\r\n e\r\n }\r\n ma.defineGetter = qh,\r\n ma.genkwaFunc = pe;\r\n var qe = function(r, n) {\r\n return ga.misceval.callsimOrSuspend(ga.builtins.property, new ga.builtin.func(function(e) {\r\n return \"function\" == typeof r ? r(e) : ga.ffi.remapToPy(e[r][n])\r\n }\r\n ), new ga.builtin.func(function(e, t) {\r\n \"function\" == typeof n ? n(e, t) : e[r][n] = t.v\r\n }\r\n ))\r\n };\r\n ma.defineProperty = qe;\r\n var rh = function(r, n, e, t) {\r\n return new ga.builtin.func(function(n) {\r\n for (var a = [], i = 1; i < arguments.length; i++)\r\n a[i - 1] = arguments[i];\r\n return ga.misceval.callsimOrSuspend(ga.misceval.buildClass(r, function(r, i) {\r\n i.__init__ = new ga.builtin.func(function(r) {\r\n r.graph = new window.PIXI.Graphics;\r\n var e = r.graph;\r\n t.apply(void 0, ne([n, e], a));\r\n var i = r.graph.width / 2\r\n , o = r.graph.height / 2\r\n , $ = r.graph.graphicsData[0].shape.x\r\n , s = r.graph.graphicsData[0].shape.y;\r\n r.graph.isCircle ? (r.graph.pivot.set(2 * i, 2 * o),\r\n r.graph.position.set(2 * i, 2 * i)) : (r.graph.pivot.set($ + i, s + o),\r\n r.graph.position.set($ + i, s + o))\r\n }\r\n ),\r\n i.rotation = qe(function(r) {\r\n return ga.ffi.remapToPy(r.rotation)\r\n }, function(r, n) {\r\n r.physicGraphics ? ha.Body.setAngle(r.physicGraphics._body, n.v) : r.graph.rotation = n.v\r\n }),\r\n i.physicsImpostor = new ga.builtin.func(pe(function(r, n) {\r\n n = ga.ffi.remapToJs(n);\r\n var t = r[0]\r\n , a = r[1]\r\n , i = r[2];\r\n a = ga.ffi.remapToJs(a || n.is_static) || !1;\r\n var o = !1;\r\n i = ga.ffi.remapToJs(i || n.physicsOptions) || {};\r\n var $ = t.graph\r\n , s = $.graphicsData\r\n , p = $.width\r\n , c = $.height\r\n , u = $.line\r\n , l = $.rotation\r\n , h = {};\r\n t.graph.isCircle && (o = !0,\r\n h.radius = s[0].shape.radius),\r\n t.graph.isFilled && (h.fill = s[0].fillStyle.color),\r\n t.physicGraphics = new le(me({\r\n x: s[0].shape.x,\r\n y: s[0].shape.y,\r\n width: p,\r\n height: c,\r\n lineWidth: u.width,\r\n lineColor: u.color\r\n }, h),me({\r\n isCircle: o,\r\n isStatic: a\r\n }, i),function(r) {\r\n var n = r.position\r\n , e = r.rotation;\r\n t.graph.position = n,\r\n t.graph.rotation = e\r\n }\r\n ),\r\n ha.Body.setAngle(t.physicGraphics._body, l),\r\n e.addToWorld(t.physicGraphics)\r\n }, !0))\r\n }))\r\n }\r\n )\r\n };\r\n ma.upgradeGraphics = rh;\r\n var sh = {};\r\n sh = {\r\n scripts: {\r\n start: \"parcel build src/main.ts && parcel src/pygame-zero.ts -d ./dist\",\r\n server: \"node server.js\",\r\n build: \"parcel build src/main.ts --experimental-scope-hoisting --no-source-maps && parcel build src/pygame-zero.ts --no-source-maps\"\r\n },\r\n name: \"skulpt-pygame-zero\",\r\n description: \"This module provides most of the functions of pygame-zero for skulpt\",\r\n version: \"0.3.4-alpha2\",\r\n main: \"dist/main.js\",\r\n files: [\"lib\", \"dist\", \"*.d.ts\", \"README.md\", \"README-zh.md\"],\r\n devDependencies: {\r\n \"alphanum-sort\": \"^1.0.2\",\r\n \"ansi-styles\": \"^3.2.1\",\r\n argparse: \"^1.0.10\",\r\n boolbase: \"^1.0.0\",\r\n browserslist: \"^4.16.3\",\r\n \"call-bind\": \"^1.0.2\",\r\n \"caller-callsite\": \"^2.0.0\",\r\n \"caller-path\": \"^2.0.0\",\r\n callsites: \"^2.0.0\",\r\n \"caniuse-api\": \"^3.0.0\",\r\n \"caniuse-lite\": \"^1.0.30001194\",\r\n chalk: \"^2.4.2\",\r\n coa: \"^2.0.2\",\r\n color: \"^3.1.3\",\r\n \"color-convert\": \"^1.9.3\",\r\n \"color-name\": \"^1.1.3\",\r\n \"color-string\": \"^1.5.4\",\r\n colorette: \"^1.2.2\",\r\n cosmiconfig: \"^5.2.1\",\r\n \"css-color-names\": \"^0.0.4\",\r\n \"css-declaration-sorter\": \"^4.0.1\",\r\n \"css-select\": \"^2.1.0\",\r\n \"css-select-base-adapter\": \"^0.1.1\",\r\n \"css-tree\": \"^1.0.0-alpha.37\",\r\n \"css-what\": \"^3.4.2\",\r\n cssesc: \"^3.0.0\",\r\n \"cssnano-preset-default\": \"^4.0.7\",\r\n \"cssnano-util-get-arguments\": \"^4.0.0\",\r\n \"cssnano-util-get-match\": \"^4.0.0\",\r\n \"cssnano-util-raw-cache\": \"^4.0.1\",\r\n \"cssnano-util-same-parent\": \"^4.0.1\",\r\n csso: \"^4.2.0\",\r\n \"define-properties\": \"^1.1.3\",\r\n \"dom-serializer\": \"^0.2.2\",\r\n domelementtype: \"^1.3.1\",\r\n domutils: \"^1.7.0\",\r\n \"dot-prop\": \"^5.3.0\",\r\n \"electron-to-chromium\": \"^1.3.678\",\r\n entities: \"^2.2.0\",\r\n \"error-ex\": \"^1.3.2\",\r\n \"es-abstract\": \"^1.18.0-next.3\",\r\n \"es-to-primitive\": \"^1.2.1\",\r\n escalade: \"^3.1.1\",\r\n \"escape-string-regexp\": \"^1.0.5\",\r\n esprima: \"^4.0.1\",\r\n \"function-bind\": \"^1.1.1\",\r\n \"get-intrinsic\": \"^1.1.1\",\r\n has: \"^1.0.3\",\r\n \"has-bigints\": \"^1.0.1\",\r\n \"has-flag\": \"^3.0.0\",\r\n \"has-symbols\": \"^1.0.2\",\r\n \"hex-color-regex\": \"^1.1.0\",\r\n \"hsl-regex\": \"^1.0.0\",\r\n \"hsla-regex\": \"^1.0.0\",\r\n \"html-comment-regex\": \"^1.1.2\",\r\n \"import-fresh\": \"^2.0.0\",\r\n \"indexes-of\": \"^1.0.1\",\r\n \"is-absolute-url\": \"^2.1.0\",\r\n \"is-arrayish\": \"^0.2.1\",\r\n \"is-bigint\": \"^1.0.1\",\r\n \"is-boolean-object\": \"^1.1.0\",\r\n \"is-callable\": \"^1.2.3\",\r\n \"is-color-stop\": \"^1.1.0\",\r\n \"is-date-object\": \"^1.0.2\",\r\n \"is-directory\": \"^0.3.1\",\r\n \"is-negative-zero\": \"^2.0.1\",\r\n \"is-number-object\": \"^1.0.4\",\r\n \"is-obj\": \"^2.0.0\",\r\n \"is-regex\": \"^1.1.2\",\r\n \"is-resolvable\": \"^1.1.0\",\r\n \"is-string\": \"^1.0.5\",\r\n \"is-svg\": \"^3.0.0\",\r\n \"is-symbol\": \"^1.0.3\",\r\n \"js-yaml\": \"^3.14.1\",\r\n \"json-parse-better-errors\": \"^1.0.2\",\r\n \"lodash.memoize\": \"^4.1.2\",\r\n \"lodash.uniq\": \"^4.5.0\",\r\n \"matter-js\": \"^0.16.1\",\r\n \"mdn-data\": \"^2.0.4\",\r\n minimist: \"^1.2.5\",\r\n mkdirp: \"^0.5.5\",\r\n \"node-releases\": \"^1.1.71\",\r\n \"normalize-url\": \"^3.3.0\",\r\n \"nth-check\": \"^1.0.2\",\r\n \"object-inspect\": \"^1.9.0\",\r\n \"object-keys\": \"^1.1.1\",\r\n \"object.assign\": \"^4.1.2\",\r\n \"object.getownpropertydescriptors\": \"^2.1.2\",\r\n \"object.values\": \"^1.1.3\",\r\n \"parse-json\": \"^4.0.0\",\r\n postcss: \"^7.0.35\",\r\n \"postcss-calc\": \"^7.0.5\",\r\n \"postcss-colormin\": \"^4.0.3\",\r\n \"postcss-convert-values\": \"^4.0.1\",\r\n \"postcss-discard-comments\": \"^4.0.2\",\r\n \"postcss-discard-duplicates\": \"^4.0.2\",\r\n \"postcss-discard-empty\": \"^4.0.1\",\r\n \"postcss-discard-overridden\": \"^4.0.1\",\r\n \"postcss-merge-longhand\": \"^4.0.11\",\r\n \"postcss-merge-rules\": \"^4.0.3\",\r\n \"postcss-minify-font-values\": \"^4.0.2\",\r\n \"postcss-minify-gradients\": \"^4.0.2\",\r\n \"postcss-minify-params\": \"^4.0.2\",\r\n \"postcss-minify-selectors\": \"^4.0.2\",\r\n \"postcss-normalize-charset\": \"^4.0.1\",\r\n \"postcss-normalize-display-values\": \"^4.0.2\",\r\n \"postcss-normalize-positions\": \"^4.0.2\",\r\n \"postcss-normalize-repeat-style\": \"^4.0.2\",\r\n \"postcss-normalize-string\": \"^4.0.2\",\r\n \"postcss-normalize-timing-functions\": \"^4.0.2\",\r\n \"postcss-normalize-unicode\": \"^4.0.1\",\r\n \"postcss-normalize-url\": \"^4.0.1\",\r\n \"postcss-normalize-whitespace\": \"^4.0.2\",\r\n \"postcss-ordered-values\": \"^4.1.2\",\r\n \"postcss-reduce-initial\": \"^4.0.3\",\r\n \"postcss-reduce-transforms\": \"^4.0.2\",\r\n \"postcss-selector-parser\": \"^3.1.2\",\r\n \"postcss-svgo\": \"^4.0.2\",\r\n \"postcss-unique-selectors\": \"^4.0.1\",\r\n \"postcss-value-parser\": \"^3.3.1\",\r\n q: \"^1.5.1\",\r\n \"resolve-from\": \"^3.0.0\",\r\n \"rgb-regex\": \"^1.0.1\",\r\n \"rgba-regex\": \"^1.0.0\",\r\n sax: \"^1.2.4\",\r\n \"simple-swizzle\": \"^0.2.2\",\r\n \"source-map\": \"^0.6.1\",\r\n \"sprintf-js\": \"^1.0.3\",\r\n stable: \"^0.1.8\",\r\n \"string.prototype.trimend\": \"^1.0.4\",\r\n \"string.prototype.trimstart\": \"^1.0.4\",\r\n stylehacks: \"^4.0.3\",\r\n \"supports-color\": \"^6.1.0\",\r\n svgo: \"^1.3.2\",\r\n timsort: \"^0.3.0\",\r\n typescript: \"^4.2.3\",\r\n \"unbox-primitive\": \"^1.0.0\",\r\n uniq: \"^1.0.1\",\r\n uniqs: \"^2.0.0\",\r\n unquote: \"^1.1.1\",\r\n \"util-deprecate\": \"^1.0.2\",\r\n \"util.promisify\": \"^1.0.1\",\r\n vendors: \"^1.0.4\",\r\n \"which-boxed-primitive\": \"^1.0.2\"\r\n },\r\n repository: {\r\n type: \"git\",\r\n url: \"git+https://github.com/lipten/skulpt-pygame-zero.git\"\r\n },\r\n keywords: [],\r\n author: \"\",\r\n license: \"ISC\",\r\n bugs: {\r\n url: \"https://github.com/lipten/skulpt-pygame-zero/issues\"\r\n },\r\n homepage: \"https://github.com/lipten/skulpt-pygame-zero#readme\",\r\n _id: \"skulpt-pygame-zero@0.2.3-alpha3\",\r\n dependencies: {\r\n \"@pixi/graphics\": \"^6.0.1\"\r\n }\r\n };\r\n var th = Kb(sh);\r\n var uh = window.Sk\r\n , re = {\r\n // \"./pgzrun/__init__.js\": \"https://cdn.jsdelivr.net/npm/skulpt-pygame-zero@\" + th.d.version + \"/dist/pygame-zero.js\"\r\n \"./pgzrun/__init__.js\": \"https://cdn.jsdelivr.net/gh/LIAO-wanting/skulpt_pj@main/src/pgzhelper/pygamezero.js\"\r\n }\r\n , se = {\r\n usePyGameZero: function(e) {\r\n var n = this;\r\n return function(t) {\r\n return n.matchModelName(t) ? n.load(t) : e.call(this, t)\r\n }\r\n },\r\n load: function(e) {\r\n return uh.misceval.promiseToSuspension(new Promise(function(n, t) {\r\n oe(\"https://cdn.bootcdn.net/ajax/libs/pixi.js/5.3.4/pixi.min.js\", \"PIXI\").then(function() {\r\n fetch(re[e]).then(function(e) {\r\n window.PIXI.utils.skipHello();\r\n var t = e.text();\r\n n(t)\r\n })\r\n })\r\n }\r\n ))\r\n },\r\n matchModelName: function(e) {\r\n return Object.keys(re).includes(e)\r\n },\r\n setContainer: function(e) {\r\n this.container = e\r\n },\r\n reset: function() {\r\n this._handleReset()\r\n },\r\n _handleReset: function() {},\r\n _onRunning: function(e) {\r\n this.app = e\r\n },\r\n _moduleCache: {\r\n App: null,\r\n timerMap: new Map,\r\n soundMap: {},\r\n music: new Audio,\r\n windowListener: {}\r\n }\r\n };\r\n Lb.PyGameZero = se,\r\n window.PyGameZero = se;\r\n if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n module.exports = Lb\r\n } else if (typeof define === \"function\" && define.amd) {\r\n define(function() {\r\n return Lb\r\n })\r\n }\r\n}\r\n)();\r\n","Sk.builtinFiles={\"files\":{\"src/builtin/sys.js\":\"var $builtinmodule=function(){var b,a=Math.pow,c={},d=[],e=Sk.getSysArgv();for(b=0;b= 0:\\n if self.pos + length < newpos:\\n newpos = self.pos + length\\n r = self.buf[self.pos:newpos]\\n self.pos = newpos\\n return r\\n\\n def readlines(self, sizehint = 0):\\n \\\"\\\"\\\"Read until EOF using readline() and return a list containing the\\n lines thus read.\\n\\n If the optional sizehint argument is present, instead of reading up\\n to EOF, whole lines totalling approximately sizehint bytes (or more\\n to accommodate a final whole line).\\n \\\"\\\"\\\"\\n total = 0\\n lines = []\\n line = self.readline()\\n while line:\\n lines.append(line)\\n total += len(line)\\n if 0 < sizehint <= total:\\n break\\n line = self.readline()\\n return lines\\n\\n def truncate(self, size=None):\\n \\\"\\\"\\\"Truncate the file's size.\\n\\n If the optional size argument is present, the file is truncated to\\n (at most) that size. The size defaults to the current position.\\n The current file position is not changed unless the position\\n is beyond the new file size.\\n\\n If the specified size exceeds the file's current size, the\\n file remains unchanged.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if size is None:\\n size = self.pos\\n elif size < 0:\\n raise IOError(22, \\\"Negative size not allowed\\\")\\n elif size < self.pos:\\n self.pos = size\\n self.buf = self.getvalue()[:size]\\n self.len = size\\n\\n def write(self, s):\\n \\\"\\\"\\\"Write a string to the file.\\n\\n There is no return value.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if not s: return\\n # Force s to be a string or unicode\\n if not isinstance(s, str):\\n s = str(s)\\n spos = self.pos\\n slen = self.len\\n if spos == slen:\\n self.buflist.append(s)\\n self.len = self.pos = spos + len(s)\\n return\\n if spos > slen:\\n self.buflist.append('\\\\0'*(spos - slen))\\n slen = spos\\n newpos = spos + len(s)\\n if spos < slen:\\n if self.buflist:\\n self.buf += ''.join(self.buflist)\\n self.buflist = [self.buf[:spos], s, self.buf[newpos:]]\\n self.buf = ''\\n if newpos > slen:\\n slen = newpos\\n else:\\n self.buflist.append(s)\\n slen = newpos\\n self.len = slen\\n self.pos = newpos\\n\\n def writelines(self, iterable):\\n \\\"\\\"\\\"Write a sequence of strings to the file. The sequence can be any\\n iterable object producing strings, typically a list of strings. There\\n is no return value.\\n\\n (The name is intended to match readlines(); writelines() does not add\\n line separators.)\\n \\\"\\\"\\\"\\n write = self.write\\n for line in iterable:\\n write(line)\\n\\n def flush(self):\\n \\\"\\\"\\\"Flush the internal buffer\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n\\n def getvalue(self):\\n \\\"\\\"\\\"\\n Retrieve the entire contents of the \\\"file\\\" at any time before\\n the StringIO object's close() method is called.\\n\\n The StringIO object can accept either Unicode or 8-bit strings,\\n but mixing the two may take some care. If both are used, 8-bit\\n strings that cannot be interpreted as 7-bit ASCII (that use the\\n 8th bit) will cause a UnicodeError to be raised when getvalue()\\n is called.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if self.buflist:\\n self.buf += ''.join(self.buflist)\\n self.buflist = []\\n return self.buf\\n\",\"src/lib/UserDict.py\":\"raise NotImplementedError(\\\"UserDict is not yet implemented in Skulpt\\\")\\n\",\"src/lib/UserList.py\":\"raise NotImplementedError(\\\"UserList is not yet implemented in Skulpt\\\")\\n\",\"src/lib/UserString.py\":\"raise NotImplementedError(\\\"UserString is not yet implemented in Skulpt\\\")\\n\",\"src/lib/_LWPCookieJar.py\":\"raise NotImplementedError(\\\"_LWPCookieJar is not yet implemented in Skulpt\\\")\\n\",\"src/lib/_MozillaCookieJar.py\":\"raise NotImplementedError(\\\"_MozillaCookieJar is not yet implemented in Skulpt\\\")\\n\",\"src/lib/__future__.py\":\"raise NotImplementedError(\\\"__future__ is not yet implemented in Skulpt\\\")\\n\",\"src/lib/__phello__.foo.py\":\"raise NotImplementedError(\\\"__phello__.foo is not yet implemented in Skulpt\\\")\\n\",\"src/lib/_abcoll.py\":\"raise NotImplementedError(\\\"_abcoll is not yet implemented in Skulpt\\\")\\n\",\"src/lib/_strptime.py\":\"raise NotImplementedError(\\\"_strptime is not yet implemented in Skulpt\\\")\\n\",\"src/lib/_threading_local.py\":\"raise NotImplementedError(\\\"_threading_local is not yet implemented in Skulpt\\\")\\n\",\"src/lib/abc.py\":\"raise NotImplementedError(\\\"abc is not yet implemented in Skulpt\\\")\\n\",\"src/lib/aifc.py\":\"raise NotImplementedError(\\\"aifc is not yet implemented in Skulpt\\\")\\n\",\"src/lib/antigravity.py\":\"import webbrowser\\n\\nwebbrowser.open(\\\"https://xkcd.com/353/\\\")\\n\",\"src/lib/anydbm.py\":\"raise NotImplementedError(\\\"anydbm is not yet implemented in Skulpt\\\")\\n\",\"src/lib/array.js\":\"$builtinmodule=function(){var a={},b=[\\\"c\\\",\\\"b\\\",\\\"B\\\",\\\"u\\\",\\\"h\\\",\\\"H\\\",\\\"i\\\",\\\"I\\\",\\\"l\\\",\\\"L\\\",\\\"f\\\",\\\"d\\\"];return a.__name__=new Sk.builtin.str(\\\"array\\\"),a.array=Sk.misceval.buildClass(a,function(a,c){c.__init__=new Sk.builtin.func(function(a,c,d){if(Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,2,3),-1==b.indexOf(Sk.ffi.remapToJs(c)))throw new Sk.builtin.ValueError(\\\"bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)\\\");if(d&&!Sk.builtin.checkIterable(d))throw new Sk.builtin.TypeError(\\\"iteration over non-sequence\\\");if(a.$d.mp$ass_subscript(new Sk.builtin.str(\\\"typecode\\\"),c),a.$d.mp$ass_subscript(new Sk.builtin.str(\\\"__module__\\\"),new Sk.builtin.str(\\\"array\\\")),a.typecode=c,void 0===d)a.internalIterable=new Sk.builtin.list;else if(d instanceof Sk.builtin.list)a.internalIterable=d;else for(a.internalIterable=new Sk.builtin.list,iter=Sk.abstr.iter(d),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])}),c.__repr__=new Sk.builtin.func(function(a){var b=Sk.ffi.remapToJs(a.typecode),c=\\\"\\\";return Sk.ffi.remapToJs(a.internalIterable).length&&(\\\"c\\\"==Sk.ffi.remapToJs(a.typecode)?c=\\\", '\\\"+Sk.ffi.remapToJs(a.internalIterable).join(\\\"\\\")+\\\"'\\\":c=\\\", \\\"+Sk.ffi.remapToJs(Sk.misceval.callsimArray(a.internalIterable.__repr__,[a.internalIterable]))),new Sk.builtin.str(\\\"array('\\\"+b+\\\"'\\\"+c+\\\")\\\")}),c.__str__=c.__repr__,c.__getattribute__=new Sk.builtin.func(function(a,b){return a.tp$getattr(b)}),c.append=new Sk.builtin.func(function(a,b){return Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,b]),Sk.builtin.none.none$}),c.extend=new Sk.builtin.func(function(a,b){if(Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,2,2),!Sk.builtin.checkIterable(b))throw new Sk.builtin.TypeError(\\\"iteration over non-sequence\\\");for(iter=Sk.abstr.iter(b),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])})},\\\"array\\\",[]),a};\",\"src/lib/ast.py\":\"raise NotImplementedError(\\\"ast is not yet implemented in Skulpt\\\")\\n\",\"src/lib/asynchat.py\":\"raise NotImplementedError(\\\"asynchat is not yet implemented in Skulpt\\\")\\n\",\"src/lib/asyncore.py\":\"raise NotImplementedError(\\\"asyncore is not yet implemented in Skulpt\\\")\\n\",\"src/lib/atexit.py\":\"raise NotImplementedError(\\\"atexit is not yet implemented in Skulpt\\\")\\n\",\"src/lib/audiodev.py\":\"raise NotImplementedError(\\\"audiodev is not yet implemented in Skulpt\\\")\\n\",\"src/lib/base64.py\":\"raise NotImplementedError(\\\"base64 is not yet implemented in Skulpt\\\")\\n\",\"src/lib/bdb.py\":\"raise NotImplementedError(\\\"bdb is not yet implemented in Skulpt\\\")\\n\",\"src/lib/binhex.py\":\"raise NotImplementedError(\\\"binhex is not yet implemented in Skulpt\\\")\\n\",\"src/lib/bisect.py\":\"\\\"\\\"\\\"Bisection algorithms.\\\"\\\"\\\"\\n\\ndef insort_right(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Insert item x in list a, and keep it sorted assuming a is sorted.\\n\\n If x is already in a, insert it to the right of the rightmost x.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if x < a[mid]: hi = mid\\n else: lo = mid+1\\n a.insert(lo, x)\\n\\ndef bisect_right(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Return the index where to insert item x in list a, assuming a is sorted.\\n\\n The return value i is such that all e in a[:i] have e <= x, and all e in\\n a[i:] have e > x. So if x already appears in the list, a.insert(x) will\\n insert just after the rightmost x already there.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if x < a[mid]: hi = mid\\n else: lo = mid+1\\n return lo\\n\\ndef insort_left(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Insert item x in list a, and keep it sorted assuming a is sorted.\\n\\n If x is already in a, insert it to the left of the leftmost x.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if a[mid] < x: lo = mid+1\\n else: hi = mid\\n a.insert(lo, x)\\n\\n\\ndef bisect_left(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Return the index where to insert item x in list a, assuming a is sorted.\\n\\n The return value i is such that all e in a[:i] have e < x, and all e in\\n a[i:] have e >= x. So if x already appears in the list, a.insert(x) will\\n insert just before the leftmost x already there.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if a[mid] < x: lo = mid+1\\n else: hi = mid\\n return lo\\n\\n# Overwrite above definitions with a fast C implementation\\ntry:\\n from _bisect import *\\nexcept ImportError:\\n pass\\n\\n# Create aliases\\nbisect = bisect_right\\ninsort = insort_right\\n\",\"src/lib/bsddb/__init__.py\":\"raise NotImplementedError(\\\"bsddb is not yet implemented in Skulpt\\\")\\n\",\"src/lib/cProfile.py\":\"raise NotImplementedError(\\\"cProfile is not yet implemented in Skulpt\\\")\\n\",\"src/lib/calendar.py\":\"raise NotImplementedError(\\\"calendar is not yet implemented in Skulpt\\\")\\n\",\"src/lib/cgi.py\":\"raise NotImplementedError(\\\"cgi is not yet implemented in Skulpt\\\")\\n\",\"src/lib/cgitb.py\":\"raise NotImplementedError(\\\"cgitb is not yet implemented in Skulpt\\\")\\n\",\"src/lib/chunk.py\":\"raise NotImplementedError(\\\"chunk is not yet implemented in Skulpt\\\")\\n\",\"src/lib/cmd.py\":\"raise NotImplementedError(\\\"cmd is not yet implemented in Skulpt\\\")\\n\",\"src/lib/code.py\":\"raise NotImplementedError(\\\"code is not yet implemented in Skulpt\\\")\\n\",\"src/lib/codecs.py\":\"raise NotImplementedError(\\\"codecs is not yet implemented in Skulpt\\\")\\n\",\"src/lib/codeop.py\":\"raise NotImplementedError(\\\"codeop is not yet implemented in Skulpt\\\")\\n\",\"src/lib/collections.js\":\"function $builtinmodule(){const a={};return Sk.misceval.chain(Sk.importModule(\\\"keyword\\\",!1,!0),b=>(a._iskeyword=b.$d.iskeyword,Sk.importModule(\\\"itertools\\\",!1,!0)),b=>(a._chain=b.$d.chain,a._starmap=b.$d.starmap,a._repeat=b.$d.repeat,Sk.importModule(\\\"operator\\\",!1,!0)),b=>{a._itemgetter=b.$d.itemgetter},()=>collections_mod(a))}function collections_mod(a){function counterNumberSlot(b){return function(c){if(void 0!==c&&!(c instanceof a.Counter))return Sk.builtin.NotImplemented.NotImplemented$;const d=new a.Counter;return b.call(this,d,c),d}}function counterInplaceSlot(a,b){return function(c){if(!(c instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError(\\\"Counter \\\"+a+\\\"= \\\"+Sk.abstr.typeName(c)+\\\" is not supported\\\");return b.call(this,c),this.keep$positive()}}function namedtuple(b,c,d,l,m){function _make(a,b){return a.prototype.tp$new(Sk.misceval.arrayFromIterable(b))}function _asdict(a){const b=[];for(let c=0;c\\\"'\\\"+a.$jsstr()+\\\"'\\\")+\\\"]\\\")}return f}if(b=b.tp$str(),Sk.misceval.isTrue(Sk.misceval.callsimArray(a._iskeyword,[b])))throw new Sk.builtin.ValueError(\\\"Type names and field names cannot be a keyword: '\\\"+Sk.misceval.objectRepr(b)+\\\"'\\\");const n=b.$jsstr();if(e.test(n)||!g.test(n)||!n)throw new Sk.builtin.ValueError(\\\"Type names and field names must be valid identifiers: '\\\"+n+\\\"'\\\");let o,p;if(Sk.builtin.checkString(c))o=c.$jsstr().replace(h,\\\" \\\").split(j),1==o.length&&\\\"\\\"===o[0]&&(o=[]),p=o.map(a=>new Sk.builtin.str(a));else{o=[],p=[];for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext())b=b.tp$str(),p.push(b),o.push(b.$jsstr())}let q=new Set;if(Sk.misceval.isTrue(d))for(i=0;io.length)throw new Sk.builtin.TypeError(\\\"Got more default values than field names\\\");for(let a=0,b=p.length-t.length;bo[b]+\\\"=\\\"+Sk.misceval.objectRepr(a));return new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+a.join(\\\", \\\")+\\\")\\\")}},proto:Object.assign({__module__:Sk.builtin.checkNone(m)?Sk.globals.__name__:m,__slots__:new Sk.builtin.tuple,_fields:r,_field_defaults:u,_make:new Sk.builtin.classmethod(new Sk.builtin.func(_make)),_asdict:new Sk.builtin.func(_asdict),_replace:new Sk.builtin.func(_replace)},v)})}a.__all__=new Sk.builtin.list([\\\"deque\\\",\\\"defaultdict\\\",\\\"namedtuple\\\",\\\"Counter\\\",\\\"OrderedDict\\\"].map(a=>new Sk.builtin.str(a))),a.defaultdict=Sk.abstr.buildNativeClass(\\\"collections.defaultdict\\\",{constructor:function defaultdict(a,b){this.default_factory=a,Sk.builtin.dict.call(this,b)},base:Sk.builtin.dict,methods:{copy:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__copy__:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__missing__:{$meth(a){if(Sk.builtin.checkNone(this.default_factory))throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(a));else{const b=Sk.misceval.callsimArray(this.default_factory,[]);return this.mp$ass_subscript(a,b),b}},$flags:{OneArg:!0}}},getsets:{default_factory:{$get(){return this.default_factory},$set(a){a=a||Sk.builtin.none.none$,this.default_factory=a}}},slots:{tp$doc:\\\"defaultdict(default_factory[, ...]) --> dict with default factory\\\\n\\\\nThe default factory is called without arguments to produce\\\\na new value when a key is not present, in __getitem__ only.\\\\nA defaultdict compares equal to a dict with the same items.\\\\nAll remaining arguments are treated the same as if they were\\\\npassed to the dict constructor, including keyword arguments.\\\\n\\\",tp$init(a,b){const c=a.shift();if(void 0===c)this.default_factory=Sk.builtin.none.none$;else if(!Sk.builtin.checkCallable(c)&&!Sk.builtin.checkNone(c))throw new Sk.builtin.TypeError(\\\"first argument must be callable\\\");else this.default_factory=c;return Sk.builtin.dict.prototype.tp$init.call(this,a,b)},$r(){const a=Sk.misceval.objectRepr(this.default_factory),b=Sk.builtin.dict.prototype.$r.call(this).v;return new Sk.builtin.str(\\\"defaultdict(\\\"+a+\\\", \\\"+b+\\\")\\\")}},proto:{$copy(){const b=[];return Sk.misceval.iterFor(Sk.abstr.iter(this),a=>{b.push(a),b.push(this.mp$subscript(a))}),new a.defaultdict(this.default_factory,b)}}}),a.Counter=Sk.abstr.buildNativeClass(\\\"Counter\\\",{constructor:function Counter(){this.$d=new Sk.builtin.dict,Sk.builtin.dict.apply(this)},base:Sk.builtin.dict,methods:{elements:{$flags:{NoArgs:!0},$meth(){const b=a._chain.tp$getattr(new Sk.builtin.str(\\\"from_iterable\\\")),c=a._starmap,d=a._repeat,e=Sk.misceval.callsimArray;return e(b,[e(c,[d,e(this.tp$getattr(this.str$items))])])}},most_common:{$flags:{NamedArgs:[\\\"n\\\"],Defaults:[Sk.builtin.none.none$]},$meth(a){length=this.sq$length(),Sk.builtin.checkNone(a)?a=length:(a=Sk.misceval.asIndexOrThrow(a),a=a>length?length:0>a?0:a);const b=this.$items().sort((c,a)=>Sk.misceval.richCompareBool(c[1],a[1],\\\"Lt\\\")?1:Sk.misceval.richCompareBool(c[1],a[1],\\\"Gt\\\")?-1:0);return new Sk.builtin.list(b.slice(0,a).map(a=>new Sk.builtin.tuple(a)))}},update:{$flags:{FastCall:!0},$meth(a,b){return Sk.abstr.checkArgsLen(\\\"update\\\",a,0,1),this.counter$update(a,b)}},subtract:{$flags:{FastCall:!0},$meth(a,b){Sk.abstr.checkArgsLen(\\\"subtract\\\",a,0,1);const c=a[0];if(void 0!==c)if(c instanceof Sk.builtin.dict)for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),\\\"Sub\\\"))}else for(iter=Sk.abstr.iter(c),k=iter.tp$iternext();void 0!==k;k=iter.tp$iternext()){const a=this.mp$subscript(k);this.mp$ass_subscript(k,Sk.abstr.numberBinOp(a,this.$one,\\\"Sub\\\"))}b=b||[];for(let c=0;c>> c = Counter('abcdeabcdabcaba') # count elements from a string\\\\n\\\\n >>> c.most_common(3) # three most common elements\\\\n [('a', 5), ('b', 4), ('c', 3)]\\\\n >>> sorted(c) # list all unique elements\\\\n ['a', 'b', 'c', 'd', 'e']\\\\n >>> ''.join(sorted(c.elements())) # list elements with repetitions\\\\n 'aaaaabbbbcccdde'\\\\n >>> sum(c.values()) # total of all counts\\\\n 15\\\\n\\\\n >>> c['a'] # count of letter 'a'\\\\n 5\\\\n >>> for elem in 'shazam': # update counts from an iterable\\\\n ... c[elem] += 1 # by adding 1 to each element's count\\\\n >>> c['a'] # now there are seven 'a'\\\\n 7\\\\n >>> del c['b'] # remove all 'b'\\\\n >>> c['b'] # now there are zero 'b'\\\\n 0\\\\n\\\\n >>> d = Counter('simsalabim') # make another counter\\\\n >>> c.update(d) # add in the second counter\\\\n >>> c['a'] # now there are nine 'a'\\\\n 9\\\\n\\\\n >>> c.clear() # empty the counter\\\\n >>> c\\\\n Counter()\\\\n\\\\n Note: If a count is set to zero or reduced to zero, it will remain\\\\n in the counter until the entry is deleted or the counter is cleared:\\\\n\\\\n >>> c = Counter('aaabbc')\\\\n >>> c['b'] -= 2 # reduce the count of 'b' by two\\\\n >>> c.most_common() # 'b' is still in, but its count is zero\\\\n [('a', 3), ('c', 1), ('b', 0)]\\\\n\\\\n\\\",tp$init(a,b){return Sk.abstr.checkArgsLen(this.tpjs_name,a,0,1),this.counter$update(a,b)},$r(){const a=0{Sk.misceval.richCompareBool(c,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(b,c)})}),nb$negative:counterNumberSlot(function(a){this.$items().forEach(([b,c])=>{Sk.misceval.richCompareBool(c,this.$zero,\\\"Lt\\\")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,\\\"Sub\\\"))})}),nb$subtract:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),\\\"Sub\\\");Sk.misceval.richCompareBool(e,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\\\"Lt\\\")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,\\\"Sub\\\"))})}),nb$add:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),\\\"Add\\\");Sk.misceval.richCompareBool(e,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(b,c)})}),nb$inplace_add:counterInplaceSlot(\\\"+\\\",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,\\\"Add\\\");this.mp$ass_subscript(a,c)})}),nb$inplace_subtract:counterInplaceSlot(\\\"-\\\",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,\\\"Sub\\\");this.mp$ass_subscript(a,c)})}),nb$or:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,\\\"Lt\\\")?e:d;Sk.misceval.richCompareBool(f,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(c,f)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(b,c)})}),nb$and:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,\\\"Lt\\\")?d:e;Sk.misceval.richCompareBool(f,this.$zero,\\\"Gt\\\")&&a.mp$ass_subscript(c,f)})}),nb$inplace_and:counterInplaceSlot(\\\"&\\\",function(a){this.$items().forEach(([b,c])=>{const d=a.mp$subscript(b);Sk.misceval.richCompareBool(d,c,\\\"Lt\\\")&&this.mp$ass_subscript(b,d)})}),nb$inplace_or:counterInplaceSlot(\\\"|\\\",function(a){a.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.mp$subscript(a),\\\"Gt\\\")&&this.mp$ass_subscript(a,b)})}),nb$reflected_and:null,nb$reflected_or:null,nb$reflected_add:null,nb$reflected_subtract:null},proto:{keep$positive(){return this.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.$zero,\\\"LtE\\\")&&this.mp$ass_subscript(a)}),this},$zero:new Sk.builtin.int_(0),$one:new Sk.builtin.int_(1),str$items:new Sk.builtin.str(\\\"items\\\"),counter$update(a,b){const c=a[0];if(void 0!==c)if(!Sk.builtin.checkMapping(c))for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,this.$one,\\\"Add\\\"))}else if(!this.sq$length())this.update$common(a,void 0,\\\"update\\\");else for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),\\\"Add\\\"))}if(b&&b.length)if(!this.sq$length())this.update$common([],b,\\\"update\\\");else for(let a=0;a deque object\\\\n\\\\nA list-like sequence optimized for data accesses near its endpoints.\\\",tp$hash:Sk.builtin.none.none$,tp$new:Sk.generic.new,tp$init(a,b){if([iterable,maxlen]=Sk.abstr.copyKeywordsToNamedArgs(\\\"deque\\\",[\\\"iterable\\\",\\\"maxlen\\\"],a,b),void 0!==maxlen&&!Sk.builtin.checkNone(maxlen))if(maxlen=Sk.misceval.asIndexSized(maxlen,Sk.builtin.OverflowError,\\\"an integer is required\\\"),0>maxlen)throw new Sk.builtin.ValueError(\\\"maxlen must be non-negative\\\");else this.maxlen=maxlen;this.$clear(),void 0!==iterable&&this.$extend(iterable)},tp$getattr:Sk.generic.getAttr,tp$richcompare(b,c){var d=Math.max;if(this===b&&Sk.misceval.opAllowsEquality(c))return!0;if(!(b instanceof a.deque))return Sk.builtin.NotImplemented.NotImplemented$;const e=b,f=this.v;b=b.v;const g=this.tail-this.head&this.mask,h=e.tail-e.head&e.mask;let j,l=d(g,h);if(g===h)for(l=0;l=g||l>=h)switch(c){case\\\"Lt\\\":return gh;case\\\"GtE\\\":return g>=h;}return\\\"Eq\\\"!==c&&(\\\"NotEq\\\"===c||Sk.misceval.richCompareBool(f[this.head+l&this.mask],b[e.head+l&e.mask],c))},tp$iter(){return new c(this)},$r(){const a=[],b=this.tail-this.head&this.mask;if(this.$entered_repr)return new Sk.builtin.str(\\\"[...]\\\");this.$entered_repr=!0;for(let c=0;c=a&&c.$clear();for(let e=1;e=b||a<-b)throw new Sk.builtin.IndexError(\\\"deque index out of range\\\");const c=(0<=a?this.head:this.tail)+a&this.mask;return this.v[c]},mp$ass_subscript(a,b){a=Sk.misceval.asIndexOrThrow(a);const c=this.tail-this.head&this.mask;if(a>=c||a<-c)throw new Sk.builtin.IndexError(\\\"deque index out of range\\\");void 0===b?this.del$item(a):this.set$item(a,b)},nb$inplace_add(a){for(this.maxlen=void 0,it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i);return this},nb$inplace_multiply(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError,\\\"can't multiply sequence by non-int of type '{tp$name}'\\\"),0>=a&&this.$clear();const b=this.$copy(),c=this.tail-this.head&this.mask;for(let d=1;d integer -- return number of occurrences of value\\\"},extend:{$meth(a){return this.$extend(a),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Extend the right side of the deque with elements from the iterable\\\"},extendleft:{$meth(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$pushLeft(i);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Extend the left side of the deque with elements from the iterable\\\"},index:{$meth(a,b,c){const d=this.$index(a,b,c);if(void 0!==d)return new Sk.builtin.int_(d);throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+\\\" is not in deque\\\")},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\\\"D.index(value, [start, [stop]]) -> integer -- return first index of value.\\\\nRaises ValueError if the value is not present.\\\"},insert:{$meth(a,b){a=Sk.misceval.asIndexOrThrow(a,\\\"integer argument expected, got {tp$name}\\\");const c=this.tail-this.head&this.mask;if(void 0!==this.maxlen&&c>=this.maxlen)throw new Sk.builtin.IndexError(\\\"deque already at its maximum size\\\");a>c&&(a=c),a<=-c&&(a=0);const d=(0<=a?this.head:this.tail)+a&this.mask;let e=this.tail;for(this.tail=this.tail+1&this.mask;e!==d;){const a=e-1&this.mask;this.v[e]=this.v[a],e=a}return this.v[d]=b,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1),Sk.builtin.none.none$},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:\\\"D.insert(index, object) -- insert object before index\\\"},pop:{$meth(){return this.$pop()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Remove and return the rightmost element.\\\"},popleft:{$meth(){return this.$popLeft()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Remove and return the leftmost element.\\\"},remove:{$meth(a){const b=this.$index(a);if(void 0===b)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+\\\" is not in deque\\\");const c=this.head+b&this.mask;for(let b=c;b!==this.tail;){const a=b+1&this.mask;this.v[b]=this.v[a],b=a}this.tail=this.tail-1&this.mask;var d=this.tail-this.head&this.mask;d>>1&&this.$resize(d,this.v.length>>>1)},$flags:{OneArg:!0},$textsig:null,$doc:\\\"D.remove(value) -- remove first occurrence of value.\\\"},__reversed__:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"D.__reversed__() -- return a reverse iterator over the deque\\\"},reverse:{$meth(){const c=this.head,d=this.tail,e=this.mask,f=this.tail-this.head&this.mask;for(let g=0;g<~~(f/2);g++){const f=d-g-1&e,a=c+g&e,b=this.v[f];this.v[f]=this.v[a],this.v[a]=b}return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"D.reverse() -- reverse *IN PLACE*\\\"},rotate:{$meth(a){a=void 0===a?1:Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);const c=this.head,d=this.tail;if(0===a||c===d)return this;if(this.head=c-a&this.mask,this.tail=d-a&this.mask,0a;e--){const f=d-e&this.mask,a=c-e&this.mask;this.v[f]=this.v[a],this.v[a]=void 0}return Sk.builtin.none.none$},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\\\"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.\\\"}},getsets:{maxlen:{$get(){return void 0===this.maxlen?Sk.builtin.none.none$:new Sk.builtin.int_(this.maxlen)},$doc:\\\"maximum size of a deque or None if unbounded\\\"}},proto:{$clear(){this.head=0,this.tail=0,this.mask=1,this.v=[,,]},$copy(){return new a.deque(this.v.slice(0),this.maxlen,this.head,this.tail,this.mask)},$extend(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i)},set$item(a,b){const c=(0<=a?this.head:this.tail)+a&this.mask;this.v[c]=b},del$item(a){const b=(0<=a?this.head:this.tail)+a&this.mask;for(let c=b;c!==this.tail;){const a=c+1&this.mask;this.v[c]=this.v[a],c=a}const c=this.tail-this.head&this.mask;this.tail=this.tail-1&this.mask,c>>1&&this.$resize(c,this.v.length>>>1)},$push(a){this.v[this.tail]=a,this.tail=this.tail+1&this.mask,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$popLeft(),this},$pushLeft(a){this.head=this.head-1&this.mask,this.v[this.head]=a,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$pop(),this},$pop(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\\\"pop from an empty deque\\\");this.tail=this.tail-1&this.mask;const a=this.v[this.tail];this.v[this.tail]=void 0;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$popLeft(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\\\"pop from an empty deque\\\");const a=this.v[this.head];this.v[this.head]=void 0,this.head=this.head+1&this.mask;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$resize(a,b){const c=this.head,d=this.mask;if(this.head=0,this.tail=a,this.mask=b-1,0===c)return void(this.v.length=b);const e=Array(b);for(let f=0;f=this.$length)){const a=(0<=this.$index?this.$head:this.$tail)+this.$index&this.$mask;return this.$index++,this.dq[a]}},methods:{__length_hint__:{$meth:function __length_hint__(){return new Sk.builtin.int_(this.$length-this.$index)},$flags:{NoArgs:!0}}}}),d=Sk.abstr.buildIteratorClass(\\\"_collections._deque_reverse_iterator\\\",{constructor:function _deque_reverse_iterator(a){this.$index=(a.tail-a.head&a.mask)-1,this.dq=a.v,this.$head=a.head,this.$mask=a.mask},iternext(){if(!(0>this.$index)){const a=this.$head+this.$index&this.$mask;return this.$index--,this.dq[a]}},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef}}),e=new RegExp(/^[0-9].*/),f=new RegExp(/^[0-9_].*/),g=new RegExp(/^\\\\w*$/),h=/,/g,j=/\\\\s+/;return namedtuple.co_argcount=2,namedtuple.co_kwonlyargcount=3,namedtuple.$kwdefs=[Sk.builtin.bool.false$,Sk.builtin.none.none$,Sk.builtin.none.none$],namedtuple.co_varnames=[\\\"typename\\\",\\\"field_names\\\",\\\"rename\\\",\\\"defaults\\\",\\\"module\\\"],a.namedtuple=new Sk.builtin.func(namedtuple),a}\",\"src/lib/colorsys.py\":\"raise NotImplementedError(\\\"colorsys is not yet implemented in Skulpt\\\")\\n\",\"src/lib/commands.py\":\"raise NotImplementedError(\\\"commands is not yet implemented in Skulpt\\\")\\n\",\"src/lib/compileall.py\":\"raise NotImplementedError(\\\"compileall is not yet implemented in Skulpt\\\")\\n\",\"src/lib/compiler/__init__.py\":\"raise NotImplementedError(\\\"compiler is not yet implemented in Skulpt\\\")\\n\",\"src/lib/config/__init__.py\":\"raise NotImplementedError(\\\"config is not yet implemented in Skulpt\\\")\\n\",\"src/lib/contextlib.py\":\"raise NotImplementedError(\\\"contextlib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/cookielib.py\":\"raise NotImplementedError(\\\"cookielib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/copy.py\":\"\\\"\\\"\\\"\\nThis file was modified from CPython.\\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\\n\\\"\\\"\\\"\\nimport types\\nclass Error(Exception):\\n pass\\nerror = Error \\nclass _EmptyClass:\\n pass\\ntry:\\n long\\nexcept NameError:\\n long = int\\n\\ndef copy(x):\\n cls = type(x)\\n if callable(x):\\n return x\\n copier = getattr(cls, \\\"__copy__\\\", None)\\n if copier:\\n return copier(x)\\n if cls in (type(None), int, float, bool, str, tuple, type, frozenset, long):\\n return x\\n if (cls == list) or (cls == dict) or (cls == set) or (cls == slice):\\n return cls(x)\\n try:\\n getstate = getattr(x, \\\"__getstate__\\\", None)\\n setstate = getattr(x, \\\"__setstate__\\\", None)\\n initargs = getattr(x, \\\"__getinitargs__\\\", None)\\n except:\\n reductor = False\\n if getstate or setstate or initargs:\\n raise NotImplementedError(\\\"Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()\\\")\\n reductor = getattr(x, \\\"__reduce_ex__\\\", None)\\n if reductor:\\n rv = reductor(4)\\n else:\\n reductor = getattr(x, \\\"__reduce__\\\", None)\\n if reductor:\\n rv = reductor()\\n elif str(cls)[1:6] == \\\"class\\\":\\n copier = _copy_inst\\n return copier(x)\\n else:\\n raise Error(\\\"un(shallow)copyable object of type %s\\\" % cls)\\n if isinstance(rv, str):\\n return x\\n return _reconstruct(x, rv, 0)\\n\\ndef _copy_inst(x):\\n if hasattr(x, '__copy__'):\\n return x.__copy__()\\n if hasattr(x, '__getinitargs__'):\\n args = x.__getinitargs__()\\n y = x.__class__(*args)\\n else:\\n y = _EmptyClass()\\n y.__class__ = x.__class__\\n if hasattr(x, '__getstate__'):\\n state = x.__getstate__()\\n else:\\n state = x.__dict__\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n y.__dict__.update(state)\\n return y\\n\\nd = _deepcopy_dispatch = {}\\n\\ndef deepcopy(x, memo=None, _nil=[]):\\n \\\"\\\"\\\"Deep copy operation on arbitrary Python objects.\\n See the module's __doc__ string for more info.\\n \\\"\\\"\\\"\\n if memo is None:\\n memo = {}\\n idx = id(x)\\n y = memo.get(idx, _nil)\\n if y is not _nil:\\n return y\\n cls = type(x)\\n try:\\n getstate = getattr(x, \\\"__getstate__\\\", None)\\n setstate = getattr(x, \\\"__setstate__\\\", None)\\n initargs = getattr(x, \\\"__getinitargs__\\\", None)\\n except:\\n reductor = False\\n if getstate or setstate or initargs:\\n raise NotImplementedError(\\\"Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()\\\")\\n copier = _deepcopy_dispatch.get(cls)\\n if copier:\\n y = copier(x, memo)\\n elif str(cls)[1:6] == \\\"class\\\":\\n copier = _deepcopy_dispatch[\\\"InstanceType\\\"]\\n y = copier(x, memo)\\n else:\\n try:\\n issc = issubclass(cls, type)\\n except TypeError: # cls is not a class (old Boost; see SF #502085)\\n issc = 0\\n if issc:\\n y = _deepcopy_atomic(x, memo)\\n else:\\n copier = getattr(x, \\\"__deepcopy__\\\", None)\\n if copier:\\n y = copier(memo)\\n else:\\n reductor = getattr(x, \\\"__reduce_ex__\\\", None)\\n if reductor:\\n rv = reductor(2)\\n else:\\n reductor = getattr(x, \\\"__reduce__\\\", None)\\n if reductor:\\n rv = reductor()\\n else:\\n raise Error(\\n \\\"un(deep)copyable object of type %s\\\" % cls)\\n y = _reconstruct(x, rv, 1, memo)\\n memo[idx] = y\\n _keep_alive(x, memo) # Make sure x lives at least as long as d\\n return y\\n\\ndef _deepcopy_atomic(x, memo):\\n return x\\nd[type(None)] = _deepcopy_atomic\\n# d[type(Ellipsis)] = _deepcopy_atomic\\nd[type(NotImplemented)] = _deepcopy_atomic\\nd[int] = _deepcopy_atomic\\nd[float] = _deepcopy_atomic\\nd[bool] = _deepcopy_atomic\\nd[complex] = _deepcopy_atomic\\n# d[bytes] = _deepcopy_atomic\\nd[str] = _deepcopy_atomic\\n# try:\\n# d[types.CodeType] = _deepcopy_atomic\\n# except AttributeError:\\n# pass\\nd[type] = _deepcopy_atomic\\n# d[types.BuiltinFunctionType] = _deepcopy_atomic\\nd[types.FunctionType] = _deepcopy_atomic\\n# d[weakref.ref] = _deepcopy_atomic\\n\\ndef _deepcopy_list(x, memo):\\n y = []\\n memo[id(x)] = y\\n for a in x:\\n y.append(deepcopy(a, memo))\\n return y\\nd[list] = _deepcopy_list\\n\\ndef _deepcopy_set(x, memo):\\n result = set([]) # make empty set\\n memo[id(x)] = result # register this set in the memo for loop checking\\n for a in x: # go through elements of set\\n result.add(deepcopy(a, memo)) # add the copied elements into the new set\\n return result # return the new set\\nd[set] = _deepcopy_set\\n\\ndef _deepcopy_frozenset(x, memo):\\n result = frozenset(_deepcopy_set(x,memo)) \\n memo[id(x)] = result \\n return result\\nd[frozenset] = _deepcopy_frozenset\\n\\ndef _deepcopy_tuple(x, memo):\\n y = [deepcopy(a, memo) for a in x]\\n # We're not going to put the tuple in the memo, but it's still important we\\n # check for it, in case the tuple contains recursive mutable structures.\\n try:\\n return memo[id(x)]\\n except KeyError:\\n pass\\n for k, j in zip(x, y):\\n if k is not j:\\n y = tuple(y)\\n break\\n else:\\n y = x\\n return y\\nd[tuple] = _deepcopy_tuple\\n\\ndef _deepcopy_dict(x, memo):\\n y = {}\\n memo[id(x)] = y\\n for key, value in x.items():\\n y[deepcopy(key, memo)] = deepcopy(value, memo)\\n return y\\nd[dict] = _deepcopy_dict\\n\\n# def _deepcopy_method(x, memo): # Copy instance methods\\n# y = type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class);\\n# return y\\nd[types.MethodType] = _deepcopy_atomic\\n\\ndef _deepcopy_inst(x, memo):\\n if hasattr(x, '__deepcopy__'):\\n return x.__deepcopy__(memo)\\n if hasattr(x, '__getinitargs__'):\\n args = x.__getinitargs__()\\n args = deepcopy(args, memo)\\n y = x.__class__(*args)\\n else:\\n y = _EmptyClass()\\n y.__class__ = x.__class__\\n memo[id(x)] = y\\n if hasattr(x, '__getstate__'):\\n state = x.__getstate__()\\n else:\\n state = x.__dict__\\n state = deepcopy(state, memo)\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n y.__dict__.update(state)\\n return y\\nd[\\\"InstanceType\\\"] = _deepcopy_inst\\n\\ndef _keep_alive(x, memo):\\n \\\"\\\"\\\"Keeps a reference to the object x in the memo.\\n Because we remember objects by their id, we have\\n to assure that possibly temporary objects are kept\\n alive by referencing them.\\n We store a reference at the id of the memo, which should\\n normally not be used unless someone tries to deepcopy\\n the memo itself...\\n \\\"\\\"\\\"\\n try:\\n memo[id(memo)].append(x)\\n except KeyError:\\n # aha, this is the first one :-)\\n memo[id(memo)]=[x]\\n\\ndef _reconstruct(x, info, deep, memo=None):\\n if isinstance(info, str):\\n return x\\n assert isinstance(info, tuple)\\n if memo is None:\\n memo = {}\\n n = len(info)\\n assert n in (2, 3, 4, 5)\\n callable, args = info[:2]\\n if n > 2:\\n state = info[2]\\n else:\\n state = None\\n if n > 3:\\n listiter = info[3]\\n else:\\n listiter = None\\n if n > 4:\\n dictiter = info[4]\\n else:\\n dictiter = None\\n if deep:\\n args = deepcopy(args, memo)\\n y = callable(*args)\\n memo[id(x)] = y\\n\\n if state is not None:\\n if deep:\\n state = deepcopy(state, memo)\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n if isinstance(state, tuple) and len(state) == 2:\\n state, slotstate = state\\n else:\\n slotstate = None\\n if state is not None:\\n y.__dict__.update(state)\\n if slotstate is not None:\\n for key, value in slotstate.items():\\n setattr(y, key, value)\\n\\n if listiter is not None:\\n for item in listiter:\\n if deep:\\n item = deepcopy(item, memo)\\n y.append(item)\\n if dictiter is not None:\\n for key, value in dictiter:\\n if deep:\\n key = deepcopy(key, memo)\\n value = deepcopy(value, memo)\\n y[key] = value\\n return y\\n\\ndel d\\n\\ndel types\\n\\n# Helper for instance creation without calling __init__\\nclass _EmptyClass:\\n pass\",\"src/lib/copy_reg.py\":\"raise NotImplementedError(\\\"copy_reg is not yet implemented in Skulpt\\\")\\n\",\"src/lib/csv.py\":\"raise NotImplementedError(\\\"csv is not yet implemented in Skulpt\\\")\\n\",\"src/lib/ctypes/__init__.py\":\"raise NotImplementedError(\\\"ctypes is not yet implemented in Skulpt\\\")\\n\",\"src/lib/ctypes/macholib/__init__.py\":\"raise NotImplementedError(\\\"macholib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/curses/__init__.py\":\"raise NotImplementedError(\\\"curses is not yet implemented in Skulpt\\\")\\n\",\"src/lib/datetime.py\":\"\\\"\\\"\\\"Concrete date/time and related types -- prototype implemented in Python.\\n\\nSee http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage\\n\\nSee also http://dir.yahoo.com/Reference/calendars/\\n\\nFor a primer on DST, including many current DST rules, see\\nhttp://webexhibits.org/daylightsaving/\\n\\nFor more about DST than you ever wanted to know, see\\nftp://elsie.nci.nih.gov/pub/\\n\\nSources for time zone and DST data: http://www.twinsun.com/tz/tz-link.htm\\n\\nThis was originally copied from the sandbox of the CPython CVS repository.\\nThanks to Tim Peters for suggesting using it.\\n\\nThis was then copied from PyPy v5.1.0 into Skulpt by Meredydd Luff, removing\\n'from __future__ import division' (and replacing division operators accordingly)\\nand pickle support (which requires 'struct', which Skulpt does not currently\\n[as of 31/8/2016] have)\\n\\\"\\\"\\\"\\n\\nimport time as _time\\nimport math as _math\\n\\n# Python 2-vs-3 compat hack\\nimport sys\\nunicode = unicode if sys.version_info < (3,) else str\\n\\n_SENTINEL = object()\\n\\ndef _cmp(x, y):\\n return 0 if x == y else 1 if x > y else -1\\n\\ndef _round(x):\\n return int(_math.floor(x + 0.5) if x >= 0.0 else _math.ceil(x - 0.5))\\n\\nMINYEAR = 1\\nMAXYEAR = 9999\\n_MINYEARFMT = 1900\\n\\n_MAX_DELTA_DAYS = 999999999\\n\\n# Utility functions, adapted from Python's Demo/classes/Dates.py, which\\n# also assumes the current Gregorian calendar indefinitely extended in\\n# both directions. Difference: Dates.py calls January 1 of year 0 day\\n# number 1. The code here calls January 1 of year 1 day number 1. This is\\n# to match the definition of the \\\"proleptic Gregorian\\\" calendar in Dershowitz\\n# and Reingold's \\\"Calendrical Calculations\\\", where it's the base calendar\\n# for all computations. See the book for algorithms for converting between\\n# proleptic Gregorian ordinals and many other calendar systems.\\n\\n_DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\\n\\n_DAYS_BEFORE_MONTH = [-1]\\ndbm = 0\\nfor dim in _DAYS_IN_MONTH[1:]:\\n _DAYS_BEFORE_MONTH.append(dbm)\\n dbm += dim\\ndel dbm, dim\\n\\ndef _is_leap(year):\\n \\\"year -> 1 if leap year, else 0.\\\"\\n return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)\\n\\ndef _days_before_year(year):\\n \\\"year -> number of days before January 1st of year.\\\"\\n y = year - 1\\n return y*365 + y//4 - y//100 + y//400\\n\\ndef _days_in_month(year, month):\\n \\\"year, month -> number of days in that month in that year.\\\"\\n assert 1 <= month <= 12, month\\n if month == 2 and _is_leap(year):\\n return 29\\n return _DAYS_IN_MONTH[month]\\n\\ndef _days_before_month(year, month):\\n \\\"year, month -> number of days in year preceding first day of month.\\\"\\n assert 1 <= month <= 12, 'month must be in 1..12'\\n return _DAYS_BEFORE_MONTH[month] + (month > 2 and _is_leap(year))\\n\\ndef _ymd2ord(year, month, day):\\n \\\"year, month, day -> ordinal, considering 01-Jan-0001 as day 1.\\\"\\n assert 1 <= month <= 12, 'month must be in 1..12'\\n dim = _days_in_month(year, month)\\n assert 1 <= day <= dim, ('day must be in 1..%d' % dim)\\n return (_days_before_year(year) +\\n _days_before_month(year, month) +\\n day)\\n\\n_DI400Y = _days_before_year(401) # number of days in 400 years\\n_DI100Y = _days_before_year(101) # \\\" \\\" \\\" \\\" 100 \\\"\\n_DI4Y = _days_before_year(5) # \\\" \\\" \\\" \\\" 4 \\\"\\n\\n# A 4-year cycle has an extra leap day over what we'd get from pasting\\n# together 4 single years.\\nassert _DI4Y == 4 * 365 + 1\\n\\n# Similarly, a 400-year cycle has an extra leap day over what we'd get from\\n# pasting together 4 100-year cycles.\\nassert _DI400Y == 4 * _DI100Y + 1\\n\\n# OTOH, a 100-year cycle has one fewer leap day than we'd get from\\n# pasting together 25 4-year cycles.\\nassert _DI100Y == 25 * _DI4Y - 1\\n\\n_US_PER_US = 1\\n_US_PER_MS = 1000\\n_US_PER_SECOND = 1000000\\n_US_PER_MINUTE = 60000000\\n_SECONDS_PER_DAY = 24 * 3600\\n_US_PER_HOUR = 3600000000\\n_US_PER_DAY = 86400000000\\n_US_PER_WEEK = 604800000000\\n\\ndef _ord2ymd(n):\\n \\\"ordinal -> (year, month, day), considering 01-Jan-0001 as day 1.\\\"\\n\\n # n is a 1-based index, starting at 1-Jan-1. The pattern of leap years\\n # repeats exactly every 400 years. The basic strategy is to find the\\n # closest 400-year boundary at or before n, then work with the offset\\n # from that boundary to n. Life is much clearer if we subtract 1 from\\n # n first -- then the values of n at 400-year boundaries are exactly\\n # those divisible by _DI400Y:\\n #\\n # D M Y n n-1\\n # -- --- ---- ---------- ----------------\\n # 31 Dec -400 -_DI400Y -_DI400Y -1\\n # 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary\\n # ...\\n # 30 Dec 000 -1 -2\\n # 31 Dec 000 0 -1\\n # 1 Jan 001 1 0 400-year boundary\\n # 2 Jan 001 2 1\\n # 3 Jan 001 3 2\\n # ...\\n # 31 Dec 400 _DI400Y _DI400Y -1\\n # 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary\\n n -= 1\\n n400, n = divmod(n, _DI400Y)\\n year = n400 * 400 + 1 # ..., -399, 1, 401, ...\\n\\n # Now n is the (non-negative) offset, in days, from January 1 of year, to\\n # the desired date. Now compute how many 100-year cycles precede n.\\n # Note that it's possible for n100 to equal 4! In that case 4 full\\n # 100-year cycles precede the desired day, which implies the desired\\n # day is December 31 at the end of a 400-year cycle.\\n n100, n = divmod(n, _DI100Y)\\n\\n # Now compute how many 4-year cycles precede it.\\n n4, n = divmod(n, _DI4Y)\\n\\n # And now how many single years. Again n1 can be 4, and again meaning\\n # that the desired day is December 31 at the end of the 4-year cycle.\\n n1, n = divmod(n, 365)\\n\\n year += n100 * 100 + n4 * 4 + n1\\n if n1 == 4 or n100 == 4:\\n assert n == 0\\n return year-1, 12, 31\\n\\n # Now the year is correct, and n is the offset from January 1. We find\\n # the month via an estimate that's either exact or one too large.\\n leapyear = n1 == 3 and (n4 != 24 or n100 == 3)\\n assert leapyear == _is_leap(year)\\n month = (n + 50) >> 5\\n preceding = _DAYS_BEFORE_MONTH[month] + (month > 2 and leapyear)\\n if preceding > n: # estimate is too large\\n month -= 1\\n preceding -= _DAYS_IN_MONTH[month] + (month == 2 and leapyear)\\n n -= preceding\\n assert 0 <= n < _days_in_month(year, month)\\n\\n # Now the year and month are correct, and n is the offset from the\\n # start of that month: we're done!\\n return year, month, n+1\\n\\n# Month and day names. For localized versions, see the calendar module.\\n_MONTHNAMES = [None, \\\"Jan\\\", \\\"Feb\\\", \\\"Mar\\\", \\\"Apr\\\", \\\"May\\\", \\\"Jun\\\",\\n \\\"Jul\\\", \\\"Aug\\\", \\\"Sep\\\", \\\"Oct\\\", \\\"Nov\\\", \\\"Dec\\\"]\\n_DAYNAMES = [None, \\\"Mon\\\", \\\"Tue\\\", \\\"Wed\\\", \\\"Thu\\\", \\\"Fri\\\", \\\"Sat\\\", \\\"Sun\\\"]\\n\\n\\ndef _build_struct_time(y, m, d, hh, mm, ss, dstflag):\\n wday = (_ymd2ord(y, m, d) + 6) % 7\\n dnum = _days_before_month(y, m) + d\\n return _time.struct_time((y, m, d, hh, mm, ss, wday, dnum, dstflag))\\n\\ndef _format_time(hh, mm, ss, us):\\n # Skip trailing microseconds when us==0.\\n result = \\\"%02d:%02d:%02d\\\" % (hh, mm, ss)\\n if us:\\n result += \\\".%06d\\\" % us\\n return result\\n\\n# Correctly substitute for %z and %Z escapes in strftime formats.\\ndef _wrap_strftime(object, format, timetuple):\\n year = timetuple[0]\\n if year < _MINYEARFMT:\\n raise ValueError(\\\"year=%d is before %d; the datetime strftime() \\\"\\n \\\"methods require year >= %d\\\" %\\n (year, _MINYEARFMT, _MINYEARFMT))\\n # Don't call utcoffset() or tzname() unless actually needed.\\n freplace = None # the string to use for %f\\n zreplace = None # the string to use for %z\\n Zreplace = None # the string to use for %Z\\n\\n # Scan format for %z and %Z escapes, replacing as needed.\\n newformat = []\\n push = newformat.append\\n i, n = 0, len(format)\\n while i < n:\\n ch = format[i]\\n i += 1\\n if ch == '%':\\n if i < n:\\n ch = format[i]\\n i += 1\\n if ch == 'f':\\n if freplace is None:\\n freplace = '%06d' % getattr(object,\\n 'microsecond', 0)\\n newformat.append(freplace)\\n elif ch == 'z':\\n if zreplace is None:\\n zreplace = \\\"\\\"\\n if hasattr(object, \\\"_utcoffset\\\"):\\n offset = object._utcoffset()\\n if offset is not None:\\n sign = '+'\\n if offset < 0:\\n offset = -offset\\n sign = '-'\\n h, m = divmod(offset, 60)\\n zreplace = '%c%02d%02d' % (sign, h, m)\\n assert '%' not in zreplace\\n newformat.append(zreplace)\\n elif ch == 'Z':\\n if Zreplace is None:\\n Zreplace = \\\"\\\"\\n if hasattr(object, \\\"tzname\\\"):\\n s = object.tzname()\\n if s is not None:\\n # strftime is going to have at this: escape %\\n Zreplace = s.replace('%', '%%')\\n newformat.append(Zreplace)\\n else:\\n push('%')\\n push(ch)\\n else:\\n push('%')\\n else:\\n push(ch)\\n newformat = \\\"\\\".join(newformat)\\n return _time.strftime(newformat, timetuple)\\n\\n# Just raise TypeError if the arg isn't None or a string.\\ndef _check_tzname(name):\\n if name is not None and not isinstance(name, str):\\n raise TypeError(\\\"tzinfo.tzname() must return None or string, \\\"\\n \\\"not '%s'\\\" % type(name))\\n\\n# name is the offset-producing method, \\\"utcoffset\\\" or \\\"dst\\\".\\n# offset is what it returned.\\n# If offset isn't None or timedelta, raises TypeError.\\n# If offset is None, returns None.\\n# Else offset is checked for being in range, and a whole # of minutes.\\n# If it is, its integer value is returned. Else ValueError is raised.\\ndef _check_utc_offset(name, offset):\\n assert name in (\\\"utcoffset\\\", \\\"dst\\\")\\n if offset is None:\\n return\\n if not isinstance(offset, timedelta):\\n raise TypeError(\\\"tzinfo.%s() must return None \\\"\\n \\\"or timedelta, not '%s'\\\" % (name, type(offset)))\\n days = offset.days\\n if days < -1 or days > 0:\\n offset = 1440 # trigger out-of-range\\n else:\\n seconds = days * 86400 + offset.seconds\\n minutes, seconds = divmod(seconds, 60)\\n if seconds or offset.microseconds:\\n raise ValueError(\\\"tzinfo.%s() must return a whole number \\\"\\n \\\"of minutes\\\" % name)\\n offset = minutes\\n if not -1440 < offset < 1440:\\n raise ValueError(\\\"%s()=%d, must be in -1439..1439\\\" % (name, offset))\\n return offset\\n\\ndef _check_int_field(value):\\n if isinstance(value, int):\\n return int(value)\\n if not isinstance(value, float):\\n try:\\n value = value.__int__()\\n except AttributeError:\\n pass\\n else:\\n if isinstance(value, int):\\n return int(value)\\n raise TypeError('__int__ method should return an integer')\\n raise TypeError('an integer is required')\\n raise TypeError('integer argument expected, got float')\\n\\ndef _check_date_fields(year, month, day):\\n year = _check_int_field(year)\\n month = _check_int_field(month)\\n day = _check_int_field(day)\\n if not MINYEAR <= year <= MAXYEAR:\\n raise ValueError('year must be in %d..%d' % (MINYEAR, MAXYEAR), year)\\n if not 1 <= month <= 12:\\n raise ValueError('month must be in 1..12', month)\\n dim = _days_in_month(year, month)\\n if not 1 <= day <= dim:\\n raise ValueError('day must be in 1..%d' % dim, day)\\n return year, month, day\\n\\ndef _check_time_fields(hour, minute, second, microsecond):\\n hour = _check_int_field(hour)\\n minute = _check_int_field(minute)\\n second = _check_int_field(second)\\n microsecond = _check_int_field(microsecond)\\n if not 0 <= hour <= 23:\\n raise ValueError('hour must be in 0..23', hour)\\n if not 0 <= minute <= 59:\\n raise ValueError('minute must be in 0..59', minute)\\n if not 0 <= second <= 59:\\n raise ValueError('second must be in 0..59', second)\\n if not 0 <= microsecond <= 999999:\\n raise ValueError('microsecond must be in 0..999999', microsecond)\\n return hour, minute, second, microsecond\\n\\ndef _check_tzinfo_arg(tz):\\n if tz is not None and not isinstance(tz, tzinfo):\\n raise TypeError(\\\"tzinfo argument must be None or of a tzinfo subclass\\\")\\n\\n\\n# Notes on comparison: In general, datetime module comparison operators raise\\n# TypeError when they don't know how to do a comparison themself. If they\\n# returned NotImplemented instead, comparison could (silently) fall back to\\n# the default compare-objects-by-comparing-their-memory-addresses strategy,\\n# and that's not helpful. There are two exceptions:\\n#\\n# 1. For date and datetime, if the other object has a \\\"timetuple\\\" attr,\\n# NotImplemented is returned. This is a hook to allow other kinds of\\n# datetime-like objects a chance to intercept the comparison.\\n#\\n# 2. Else __eq__ and __ne__ return False and True, respectively. This is\\n# so opertaions like\\n#\\n# x == y\\n# x != y\\n# x in sequence\\n# x not in sequence\\n# dict[x] = y\\n#\\n# don't raise annoying TypeErrors just because a datetime object\\n# is part of a heterogeneous collection. If there's no known way to\\n# compare X to a datetime, saying they're not equal is reasonable.\\n\\ndef _cmperror(x, y):\\n raise TypeError(\\\"can't compare '%s' to '%s'\\\" % (\\n type(x).__name__, type(y).__name__))\\n\\ndef _normalize_pair(hi, lo, factor):\\n if not 0 <= lo <= factor-1:\\n inc, lo = divmod(lo, factor)\\n hi += inc\\n return hi, lo\\n\\ndef _normalize_datetime(y, m, d, hh, mm, ss, us, ignore_overflow=False):\\n # Normalize all the inputs, and store the normalized values.\\n ss, us = _normalize_pair(ss, us, 1000000)\\n mm, ss = _normalize_pair(mm, ss, 60)\\n hh, mm = _normalize_pair(hh, mm, 60)\\n d, hh = _normalize_pair(d, hh, 24)\\n y, m, d = _normalize_date(y, m, d, ignore_overflow)\\n return y, m, d, hh, mm, ss, us\\n\\ndef _normalize_date(year, month, day, ignore_overflow=False):\\n # That was easy. Now it gets muddy: the proper range for day\\n # can't be determined without knowing the correct month and year,\\n # but if day is, e.g., plus or minus a million, the current month\\n # and year values make no sense (and may also be out of bounds\\n # themselves).\\n # Saying 12 months == 1 year should be non-controversial.\\n if not 1 <= month <= 12:\\n year, month = _normalize_pair(year, month-1, 12)\\n month += 1\\n assert 1 <= month <= 12\\n\\n # Now only day can be out of bounds (year may also be out of bounds\\n # for a datetime object, but we don't care about that here).\\n # If day is out of bounds, what to do is arguable, but at least the\\n # method here is principled and explainable.\\n dim = _days_in_month(year, month)\\n if not 1 <= day <= dim:\\n # Move day-1 days from the first of the month. First try to\\n # get off cheap if we're only one day out of range (adjustments\\n # for timezone alone can't be worse than that).\\n if day == 0: # move back a day\\n month -= 1\\n if month > 0:\\n day = _days_in_month(year, month)\\n else:\\n year, month, day = year-1, 12, 31\\n elif day == dim + 1: # move forward a day\\n month += 1\\n day = 1\\n if month > 12:\\n month = 1\\n year += 1\\n else:\\n ordinal = _ymd2ord(year, month, 1) + (day - 1)\\n year, month, day = _ord2ymd(ordinal)\\n\\n if not ignore_overflow and not MINYEAR <= year <= MAXYEAR:\\n raise OverflowError(\\\"date value out of range\\\")\\n return year, month, day\\n\\ndef _accum(tag, sofar, num, factor, leftover):\\n if isinstance(num, int):\\n prod = num * factor\\n rsum = sofar + prod\\n return rsum, leftover\\n if isinstance(num, float):\\n fracpart, intpart = _math.modf(num)\\n prod = int(intpart) * factor\\n rsum = sofar + prod\\n if fracpart == 0.0:\\n return rsum, leftover\\n assert isinstance(factor, int)\\n fracpart, intpart = _math.modf(factor * fracpart)\\n rsum += int(intpart)\\n return rsum, leftover + fracpart\\n raise TypeError(\\\"unsupported type for timedelta %s component: %s\\\" %\\n (tag, type(num)))\\n\\nclass timedelta(object):\\n \\\"\\\"\\\"Represent the difference between two datetime objects.\\n\\n Supported operators:\\n\\n - add, subtract timedelta\\n - unary plus, minus, abs\\n - compare to timedelta\\n - multiply, divide by int/long\\n\\n In addition, datetime supports subtraction of two datetime objects\\n returning a timedelta, and addition or subtraction of a datetime\\n and a timedelta giving a datetime.\\n\\n Representation: (days, seconds, microseconds). Why? Because I\\n felt like it.\\n \\\"\\\"\\\"\\n __slots__ = '_days', '_seconds', '_microseconds', '_hashcode'\\n\\n def __new__(cls, days=_SENTINEL, seconds=_SENTINEL, microseconds=_SENTINEL,\\n milliseconds=_SENTINEL, minutes=_SENTINEL, hours=_SENTINEL, weeks=_SENTINEL):\\n x = 0\\n leftover = 0.0\\n if microseconds is not _SENTINEL:\\n x, leftover = _accum(\\\"microseconds\\\", x, microseconds, _US_PER_US, leftover)\\n if milliseconds is not _SENTINEL:\\n x, leftover = _accum(\\\"milliseconds\\\", x, milliseconds, _US_PER_MS, leftover)\\n if seconds is not _SENTINEL:\\n x, leftover = _accum(\\\"seconds\\\", x, seconds, _US_PER_SECOND, leftover)\\n if minutes is not _SENTINEL:\\n x, leftover = _accum(\\\"minutes\\\", x, minutes, _US_PER_MINUTE, leftover)\\n if hours is not _SENTINEL:\\n x, leftover = _accum(\\\"hours\\\", x, hours, _US_PER_HOUR, leftover)\\n if days is not _SENTINEL:\\n x, leftover = _accum(\\\"days\\\", x, days, _US_PER_DAY, leftover)\\n if weeks is not _SENTINEL:\\n x, leftover = _accum(\\\"weeks\\\", x, weeks, _US_PER_WEEK, leftover)\\n if leftover != 0.0:\\n x += _round(leftover)\\n return cls._from_microseconds(x)\\n\\n @classmethod\\n def _from_microseconds(cls, us):\\n s, us = divmod(us, _US_PER_SECOND)\\n d, s = divmod(s, _SECONDS_PER_DAY)\\n return cls._create(d, s, us, False)\\n\\n @classmethod\\n def _create(cls, d, s, us, normalize):\\n if normalize:\\n s, us = _normalize_pair(s, us, 1000000)\\n d, s = _normalize_pair(d, s, 24*3600)\\n\\n if not -_MAX_DELTA_DAYS <= d <= _MAX_DELTA_DAYS:\\n raise OverflowError(\\\"days=%d; must have magnitude <= %d\\\" % (d, _MAX_DELTA_DAYS))\\n\\n self = object.__new__(cls)\\n self._days = d\\n self._seconds = s\\n self._microseconds = us\\n self._hashcode = -1\\n return self\\n\\n def _to_microseconds(self):\\n return ((self._days * _SECONDS_PER_DAY + self._seconds) * _US_PER_SECOND +\\n self._microseconds)\\n\\n def __repr__(self):\\n module = \\\"datetime.\\\" if self.__class__ is timedelta else \\\"\\\"\\n if self._microseconds:\\n return \\\"%s(%d, %d, %d)\\\" % (module + self.__class__.__name__,\\n self._days,\\n self._seconds,\\n self._microseconds)\\n if self._seconds:\\n return \\\"%s(%d, %d)\\\" % (module + self.__class__.__name__,\\n self._days,\\n self._seconds)\\n return \\\"%s(%d)\\\" % (module + self.__class__.__name__, self._days)\\n\\n def __str__(self):\\n mm, ss = divmod(self._seconds, 60)\\n hh, mm = divmod(mm, 60)\\n s = \\\"%d:%02d:%02d\\\" % (hh, mm, ss)\\n if self._days:\\n def plural(n):\\n return n, abs(n) != 1 and \\\"s\\\" or \\\"\\\"\\n s = (\\\"%d day%s, \\\" % plural(self._days)) + s\\n if self._microseconds:\\n s = s + \\\".%06d\\\" % self._microseconds\\n return s\\n\\n def total_seconds(self):\\n \\\"\\\"\\\"Total seconds in the duration.\\\"\\\"\\\"\\n return self._to_microseconds() / 10.0**6\\n\\n # Read-only field accessors\\n @property\\n def days(self):\\n \\\"\\\"\\\"days\\\"\\\"\\\"\\n return self._days\\n\\n @property\\n def seconds(self):\\n \\\"\\\"\\\"seconds\\\"\\\"\\\"\\n return self._seconds\\n\\n @property\\n def microseconds(self):\\n \\\"\\\"\\\"microseconds\\\"\\\"\\\"\\n return self._microseconds\\n\\n def __add__(self, other):\\n if isinstance(other, timedelta):\\n # for CPython compatibility, we cannot use\\n # our __class__ here, but need a real timedelta\\n return timedelta._create(self._days + other._days,\\n self._seconds + other._seconds,\\n self._microseconds + other._microseconds,\\n True)\\n return NotImplemented\\n\\n def __sub__(self, other):\\n if isinstance(other, timedelta):\\n # for CPython compatibility, we cannot use\\n # our __class__ here, but need a real timedelta\\n return timedelta._create(self._days - other._days,\\n self._seconds - other._seconds,\\n self._microseconds - other._microseconds,\\n True)\\n return NotImplemented\\n\\n def __neg__(self):\\n # for CPython compatibility, we cannot use\\n # our __class__ here, but need a real timedelta\\n return timedelta._create(-self._days,\\n -self._seconds,\\n -self._microseconds,\\n True)\\n\\n def __pos__(self):\\n # for CPython compatibility, we cannot use\\n # our __class__ here, but need a real timedelta\\n return timedelta._create(self._days,\\n self._seconds,\\n self._microseconds,\\n False)\\n\\n def __abs__(self):\\n if self._days < 0:\\n return -self\\n else:\\n return self\\n\\n def __mul__(self, other):\\n if not isinstance(other, int):\\n return NotImplemented\\n usec = self._to_microseconds()\\n return timedelta._from_microseconds(usec * other)\\n\\n __rmul__ = __mul__\\n\\n def __div__(self, other):\\n if not isinstance(other, int):\\n return NotImplemented\\n usec = self._to_microseconds()\\n return timedelta._from_microseconds(usec // other)\\n\\n __floordiv__ = __div__\\n\\n # Comparisons of timedelta objects with other.\\n\\n def __eq__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) == 0\\n else:\\n return False\\n\\n def __ne__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) != 0\\n else:\\n return True\\n\\n def __le__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) <= 0\\n else:\\n _cmperror(self, other)\\n\\n def __lt__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) < 0\\n else:\\n _cmperror(self, other)\\n\\n def __ge__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) >= 0\\n else:\\n _cmperror(self, other)\\n\\n def __gt__(self, other):\\n if isinstance(other, timedelta):\\n return self._cmp(other) > 0\\n else:\\n _cmperror(self, other)\\n\\n def _cmp(self, other):\\n assert isinstance(other, timedelta)\\n return _cmp(self._getstate(), other._getstate())\\n\\n def __hash__(self):\\n if self._hashcode == -1:\\n self._hashcode = hash(self._getstate())\\n return self._hashcode\\n\\n def __nonzero__(self):\\n return (self._days != 0 or\\n self._seconds != 0 or\\n self._microseconds != 0)\\n\\ntimedelta.min = timedelta(-_MAX_DELTA_DAYS)\\ntimedelta.max = timedelta(_MAX_DELTA_DAYS, 24*3600-1, 1000000-1)\\ntimedelta.resolution = timedelta(microseconds=1)\\n\\nclass date(object):\\n \\\"\\\"\\\"Concrete date type.\\n\\n Constructors:\\n\\n __new__()\\n fromtimestamp()\\n today()\\n fromordinal()\\n\\n Operators:\\n\\n __repr__, __str__\\n __cmp__, __hash__\\n __add__, __radd__, __sub__ (add/radd only with timedelta arg)\\n\\n Methods:\\n\\n timetuple()\\n toordinal()\\n weekday()\\n isoweekday(), isocalendar(), isoformat()\\n ctime()\\n strftime()\\n\\n Properties (readonly):\\n year, month, day\\n \\\"\\\"\\\"\\n __slots__ = '_year', '_month', '_day', '_hashcode'\\n\\n def __new__(cls, year, month=None, day=None):\\n \\\"\\\"\\\"Constructor.\\n\\n Arguments:\\n\\n year, month, day (required, base 1)\\n \\\"\\\"\\\"\\n year, month, day = _check_date_fields(year, month, day)\\n self = object.__new__(cls)\\n self._year = year\\n self._month = month\\n self._day = day\\n self._hashcode = -1\\n return self\\n\\n # Additional constructors\\n\\n @classmethod\\n def fromtimestamp(cls, t):\\n \\\"Construct a date from a POSIX timestamp (like time.time()).\\\"\\n y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t)\\n return cls(y, m, d)\\n\\n @classmethod\\n def today(cls):\\n \\\"Construct a date from time.time().\\\"\\n t = _time.time()\\n return cls.fromtimestamp(t)\\n\\n @classmethod\\n def fromordinal(cls, n):\\n \\\"\\\"\\\"Contruct a date from a proleptic Gregorian ordinal.\\n\\n January 1 of year 1 is day 1. Only the year, month and day are\\n non-zero in the result.\\n \\\"\\\"\\\"\\n y, m, d = _ord2ymd(n)\\n return cls(y, m, d)\\n\\n # Conversions to string\\n\\n def __repr__(self):\\n \\\"\\\"\\\"Convert to formal string, for repr().\\n\\n >>> dt = datetime(2010, 1, 1)\\n >>> repr(dt)\\n 'datetime.datetime(2010, 1, 1, 0, 0)'\\n\\n >>> dt = datetime(2010, 1, 1, tzinfo=timezone.utc)\\n >>> repr(dt)\\n 'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)'\\n \\\"\\\"\\\"\\n module = \\\"datetime.\\\" if self.__class__ is date else \\\"\\\"\\n return \\\"%s(%d, %d, %d)\\\" % (module + self.__class__.__name__,\\n self._year,\\n self._month,\\n self._day)\\n\\n # XXX These shouldn't depend on time.localtime(), because that\\n # clips the usable dates to [1970 .. 2038). At least ctime() is\\n # easily done without using strftime() -- that's better too because\\n # strftime(\\\"%c\\\", ...) is locale specific.\\n\\n def ctime(self):\\n \\\"Return ctime() style string.\\\"\\n weekday = self.toordinal() % 7 or 7\\n return \\\"%s %s %2d 00:00:00 %04d\\\" % (\\n _DAYNAMES[weekday],\\n _MONTHNAMES[self._month],\\n self._day, self._year)\\n\\n def strftime(self, format):\\n \\\"Format using strftime().\\\"\\n return _wrap_strftime(self, format, self.timetuple())\\n\\n def __format__(self, fmt):\\n if not isinstance(fmt, (str, unicode)):\\n raise ValueError(\\\"__format__ expects str or unicode, not %s\\\" %\\n fmt.__class__.__name__)\\n if len(fmt) != 0:\\n return self.strftime(fmt)\\n return str(self)\\n\\n def isoformat(self):\\n \\\"\\\"\\\"Return the date formatted according to ISO.\\n\\n This is 'YYYY-MM-DD'.\\n\\n References:\\n - http://www.w3.org/TR/NOTE-datetime\\n - http://www.cl.cam.ac.uk/~mgk25/iso-time.html\\n \\\"\\\"\\\"\\n return \\\"%04d-%02d-%02d\\\" % (self._year, self._month, self._day)\\n\\n __str__ = isoformat\\n\\n # Read-only field accessors\\n @property\\n def year(self):\\n \\\"\\\"\\\"year (1-9999)\\\"\\\"\\\"\\n return self._year\\n\\n @property\\n def month(self):\\n \\\"\\\"\\\"month (1-12)\\\"\\\"\\\"\\n return self._month\\n\\n @property\\n def day(self):\\n \\\"\\\"\\\"day (1-31)\\\"\\\"\\\"\\n return self._day\\n\\n # Standard conversions, __cmp__, __hash__ (and helpers)\\n\\n def timetuple(self):\\n \\\"Return local time tuple compatible with time.localtime().\\\"\\n return _build_struct_time(self._year, self._month, self._day,\\n 0, 0, 0, -1)\\n\\n def toordinal(self):\\n \\\"\\\"\\\"Return proleptic Gregorian ordinal for the year, month and day.\\n\\n January 1 of year 1 is day 1. Only the year, month and day values\\n contribute to the result.\\n \\\"\\\"\\\"\\n return _ymd2ord(self._year, self._month, self._day)\\n\\n def replace(self, year=None, month=None, day=None):\\n \\\"\\\"\\\"Return a new date with new values for the specified fields.\\\"\\\"\\\"\\n if year is None:\\n year = self._year\\n if month is None:\\n month = self._month\\n if day is None:\\n day = self._day\\n return date(year, month, day)\\n\\n # Comparisons of date objects with other.\\n\\n def __eq__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) == 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n return False\\n\\n def __ne__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) != 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n return True\\n\\n def __le__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) <= 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __lt__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) < 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __ge__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) >= 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __gt__(self, other):\\n if isinstance(other, date):\\n return self._cmp(other) > 0\\n elif hasattr(other, \\\"timetuple\\\"):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def _cmp(self, other):\\n assert isinstance(other, date)\\n y, m, d = self._year, self._month, self._day\\n y2, m2, d2 = other._year, other._month, other._day\\n return _cmp((y, m, d), (y2, m2, d2))\\n\\n def __hash__(self):\\n \\\"Hash.\\\"\\n if self._hashcode == -1:\\n self._hashcode = hash(self._getstate())\\n return self._hashcode\\n\\n # Computations\\n\\n def _add_timedelta(self, other, factor):\\n y, m, d = _normalize_date(\\n self._year,\\n self._month,\\n self._day + other.days * factor)\\n return date(y, m, d)\\n\\n def __add__(self, other):\\n \\\"Add a date to a timedelta.\\\"\\n if isinstance(other, timedelta):\\n return self._add_timedelta(other, 1)\\n return NotImplemented\\n\\n __radd__ = __add__\\n\\n def __sub__(self, other):\\n \\\"\\\"\\\"Subtract two dates, or a date and a timedelta.\\\"\\\"\\\"\\n if isinstance(other, date):\\n days1 = self.toordinal()\\n days2 = other.toordinal()\\n return timedelta._create(days1 - days2, 0, 0, False)\\n if isinstance(other, timedelta):\\n return self._add_timedelta(other, -1)\\n return NotImplemented\\n\\n def weekday(self):\\n \\\"Return day of the week, where Monday == 0 ... Sunday == 6.\\\"\\n return (self.toordinal() + 6) % 7\\n\\n # Day-of-the-week and week-of-the-year, according to ISO\\n\\n def isoweekday(self):\\n \\\"Return day of the week, where Monday == 1 ... Sunday == 7.\\\"\\n # 1-Jan-0001 is a Monday\\n return self.toordinal() % 7 or 7\\n\\n def isocalendar(self):\\n \\\"\\\"\\\"Return a 3-tuple containing ISO year, week number, and weekday.\\n\\n The first ISO week of the year is the (Mon-Sun) week\\n containing the year's first Thursday; everything else derives\\n from that.\\n\\n The first week is 1; Monday is 1 ... Sunday is 7.\\n\\n ISO calendar algorithm taken from\\n http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm\\n \\\"\\\"\\\"\\n year = self._year\\n week1monday = _isoweek1monday(year)\\n today = _ymd2ord(self._year, self._month, self._day)\\n # Internally, week and day have origin 0\\n week, day = divmod(today - week1monday, 7)\\n if week < 0:\\n year -= 1\\n week1monday = _isoweek1monday(year)\\n week, day = divmod(today - week1monday, 7)\\n elif week >= 52:\\n if today >= _isoweek1monday(year+1):\\n year += 1\\n week = 0\\n return year, week+1, day+1\\n\\n_date_class = date # so functions w/ args named \\\"date\\\" can get at the class\\n\\ndate.min = date(1, 1, 1)\\ndate.max = date(9999, 12, 31)\\ndate.resolution = timedelta(days=1)\\n\\nclass tzinfo(object):\\n \\\"\\\"\\\"Abstract base class for time zone info classes.\\n\\n Subclasses must override the name(), utcoffset() and dst() methods.\\n \\\"\\\"\\\"\\n __slots__ = ()\\n\\n def tzname(self, dt):\\n \\\"datetime -> string name of time zone.\\\"\\n raise NotImplementedError(\\\"tzinfo subclass must override tzname()\\\")\\n\\n def utcoffset(self, dt):\\n \\\"datetime -> minutes east of UTC (negative for west of UTC)\\\"\\n raise NotImplementedError(\\\"tzinfo subclass must override utcoffset()\\\")\\n\\n def dst(self, dt):\\n \\\"\\\"\\\"datetime -> DST offset in minutes east of UTC.\\n\\n Return 0 if DST not in effect. utcoffset() must include the DST\\n offset.\\n \\\"\\\"\\\"\\n raise NotImplementedError(\\\"tzinfo subclass must override dst()\\\")\\n\\n def fromutc(self, dt):\\n \\\"datetime in UTC -> datetime in local time.\\\"\\n\\n if not isinstance(dt, datetime):\\n raise TypeError(\\\"fromutc() requires a datetime argument\\\")\\n if dt.tzinfo is not self:\\n raise ValueError(\\\"dt.tzinfo is not self\\\")\\n\\n dtoff = dt.utcoffset()\\n if dtoff is None:\\n raise ValueError(\\\"fromutc() requires a non-None utcoffset() \\\"\\n \\\"result\\\")\\n\\n # See the long comment block at the end of this file for an\\n # explanation of this algorithm.\\n dtdst = dt.dst()\\n if dtdst is None:\\n raise ValueError(\\\"fromutc() requires a non-None dst() result\\\")\\n delta = dtoff - dtdst\\n if delta:\\n dt = dt + delta\\n dtdst = dt.dst()\\n if dtdst is None:\\n raise ValueError(\\\"fromutc(): dt.dst gave inconsistent \\\"\\n \\\"results; cannot convert\\\")\\n if dtdst:\\n return dt + dtdst\\n else:\\n return dt\\n\\n_tzinfo_class = tzinfo\\n\\nclass time(object):\\n \\\"\\\"\\\"Time with time zone.\\n\\n Constructors:\\n\\n __new__()\\n\\n Operators:\\n\\n __repr__, __str__\\n __cmp__, __hash__\\n\\n Methods:\\n\\n strftime()\\n isoformat()\\n utcoffset()\\n tzname()\\n dst()\\n\\n Properties (readonly):\\n hour, minute, second, microsecond, tzinfo\\n \\\"\\\"\\\"\\n __slots__ = '_hour', '_minute', '_second', '_microsecond', '_tzinfo', '_hashcode'\\n\\n def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None):\\n \\\"\\\"\\\"Constructor.\\n\\n Arguments:\\n\\n hour, minute (required)\\n second, microsecond (default to zero)\\n tzinfo (default to None)\\n \\\"\\\"\\\"\\n hour, minute, second, microsecond = _check_time_fields(\\n hour, minute, second, microsecond)\\n _check_tzinfo_arg(tzinfo)\\n self = object.__new__(cls)\\n self._hour = hour\\n self._minute = minute\\n self._second = second\\n self._microsecond = microsecond\\n self._tzinfo = tzinfo\\n self._hashcode = -1\\n return self\\n\\n # Read-only field accessors\\n @property\\n def hour(self):\\n \\\"\\\"\\\"hour (0-23)\\\"\\\"\\\"\\n return self._hour\\n\\n @property\\n def minute(self):\\n \\\"\\\"\\\"minute (0-59)\\\"\\\"\\\"\\n return self._minute\\n\\n @property\\n def second(self):\\n \\\"\\\"\\\"second (0-59)\\\"\\\"\\\"\\n return self._second\\n\\n @property\\n def microsecond(self):\\n \\\"\\\"\\\"microsecond (0-999999)\\\"\\\"\\\"\\n return self._microsecond\\n\\n @property\\n def tzinfo(self):\\n \\\"\\\"\\\"timezone info object\\\"\\\"\\\"\\n return self._tzinfo\\n\\n # Standard conversions, __hash__ (and helpers)\\n\\n # Comparisons of time objects with other.\\n\\n def __eq__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) == 0\\n else:\\n return False\\n\\n def __ne__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) != 0\\n else:\\n return True\\n\\n def __le__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) <= 0\\n else:\\n _cmperror(self, other)\\n\\n def __lt__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) < 0\\n else:\\n _cmperror(self, other)\\n\\n def __ge__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) >= 0\\n else:\\n _cmperror(self, other)\\n\\n def __gt__(self, other):\\n if isinstance(other, time):\\n return self._cmp(other) > 0\\n else:\\n _cmperror(self, other)\\n\\n def _cmp(self, other):\\n assert isinstance(other, time)\\n mytz = self._tzinfo\\n ottz = other._tzinfo\\n myoff = otoff = None\\n\\n if mytz is ottz:\\n base_compare = True\\n else:\\n myoff = self._utcoffset()\\n otoff = other._utcoffset()\\n base_compare = myoff == otoff\\n\\n if base_compare:\\n return _cmp((self._hour, self._minute, self._second,\\n self._microsecond),\\n (other._hour, other._minute, other._second,\\n other._microsecond))\\n if myoff is None or otoff is None:\\n raise TypeError(\\\"can't compare offset-naive and offset-aware times\\\")\\n myhhmm = self._hour * 60 + self._minute - myoff\\n othhmm = other._hour * 60 + other._minute - otoff\\n return _cmp((myhhmm, self._second, self._microsecond),\\n (othhmm, other._second, other._microsecond))\\n\\n def __hash__(self):\\n \\\"\\\"\\\"Hash.\\\"\\\"\\\"\\n if self._hashcode == -1:\\n tzoff = self._utcoffset()\\n if not tzoff: # zero or None\\n self._hashcode = hash(self._getstate()[0])\\n else:\\n h, m = divmod(self.hour * 60 + self.minute - tzoff, 60)\\n if 0 <= h < 24:\\n self._hashcode = hash(time(h, m, self.second, self.microsecond))\\n else:\\n self._hashcode = hash((h, m, self.second, self.microsecond))\\n return self._hashcode\\n\\n # Conversion to string\\n\\n def _tzstr(self, sep=\\\":\\\"):\\n \\\"\\\"\\\"Return formatted timezone offset (+xx:xx) or None.\\\"\\\"\\\"\\n off = self._utcoffset()\\n if off is not None:\\n if off < 0:\\n sign = \\\"-\\\"\\n off = -off\\n else:\\n sign = \\\"+\\\"\\n hh, mm = divmod(off, 60)\\n assert 0 <= hh < 24\\n off = \\\"%s%02d%s%02d\\\" % (sign, hh, sep, mm)\\n return off\\n\\n def __repr__(self):\\n \\\"\\\"\\\"Convert to formal string, for repr().\\\"\\\"\\\"\\n if self._microsecond != 0:\\n s = \\\", %d, %d\\\" % (self._second, self._microsecond)\\n elif self._second != 0:\\n s = \\\", %d\\\" % self._second\\n else:\\n s = \\\"\\\"\\n module = \\\"datetime.\\\" if self.__class__ is time else \\\"\\\"\\n s= \\\"%s(%d, %d%s)\\\" % (module + self.__class__.__name__,\\n self._hour, self._minute, s)\\n if self._tzinfo is not None:\\n assert s[-1:] == \\\")\\\"\\n s = s[:-1] + \\\", tzinfo=%r\\\" % self._tzinfo + \\\")\\\"\\n return s\\n\\n def isoformat(self):\\n \\\"\\\"\\\"Return the time formatted according to ISO.\\n\\n This is 'HH:MM:SS.mmmmmm+zz:zz', or 'HH:MM:SS+zz:zz' if\\n self.microsecond == 0.\\n \\\"\\\"\\\"\\n s = _format_time(self._hour, self._minute, self._second,\\n self._microsecond)\\n tz = self._tzstr()\\n if tz:\\n s += tz\\n return s\\n\\n __str__ = isoformat\\n\\n def strftime(self, format):\\n \\\"\\\"\\\"Format using strftime(). The date part of the timestamp passed\\n to underlying strftime should not be used.\\n \\\"\\\"\\\"\\n # The year must be >= _MINYEARFMT else Python's strftime implementation\\n # can raise a bogus exception.\\n timetuple = (1900, 1, 1,\\n self._hour, self._minute, self._second,\\n 0, 1, -1)\\n return _wrap_strftime(self, format, timetuple)\\n\\n def __format__(self, fmt):\\n if not isinstance(fmt, (str, unicode)):\\n raise ValueError(\\\"__format__ expects str or unicode, not %s\\\" %\\n fmt.__class__.__name__)\\n if len(fmt) != 0:\\n return self.strftime(fmt)\\n return str(self)\\n\\n # Timezone functions\\n\\n def utcoffset(self):\\n \\\"\\\"\\\"Return the timezone offset in minutes east of UTC (negative west of\\n UTC).\\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.utcoffset(None)\\n offset = _check_utc_offset(\\\"utcoffset\\\", offset)\\n if offset is not None:\\n offset = timedelta._create(0, offset * 60, 0, True)\\n return offset\\n\\n # Return an integer (or None) instead of a timedelta (or None).\\n def _utcoffset(self):\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.utcoffset(None)\\n offset = _check_utc_offset(\\\"utcoffset\\\", offset)\\n return offset\\n\\n def tzname(self):\\n \\\"\\\"\\\"Return the timezone name.\\n\\n Note that the name is 100% informational -- there's no requirement that\\n it mean anything in particular. For example, \\\"GMT\\\", \\\"UTC\\\", \\\"-500\\\",\\n \\\"-5:00\\\", \\\"EDT\\\", \\\"US/Eastern\\\", \\\"America/New York\\\" are all valid replies.\\n \\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n name = self._tzinfo.tzname(None)\\n _check_tzname(name)\\n return name\\n\\n def dst(self):\\n \\\"\\\"\\\"Return 0 if DST is not in effect, or the DST offset (in minutes\\n eastward) if DST is in effect.\\n\\n This is purely informational; the DST offset has already been added to\\n the UTC offset returned by utcoffset() if applicable, so there's no\\n need to consult dst() unless you're interested in displaying the DST\\n info.\\n \\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.dst(None)\\n offset = _check_utc_offset(\\\"dst\\\", offset)\\n if offset is not None:\\n offset = timedelta._create(0, offset * 60, 0, True)\\n return offset\\n\\n # Return an integer (or None) instead of a timedelta (or None).\\n def _dst(self):\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.dst(None)\\n offset = _check_utc_offset(\\\"dst\\\", offset)\\n return offset\\n\\n def replace(self, hour=None, minute=None, second=None, microsecond=None,\\n tzinfo=True):\\n \\\"\\\"\\\"Return a new time with new values for the specified fields.\\\"\\\"\\\"\\n if hour is None:\\n hour = self.hour\\n if minute is None:\\n minute = self.minute\\n if second is None:\\n second = self.second\\n if microsecond is None:\\n microsecond = self.microsecond\\n if tzinfo is True:\\n tzinfo = self.tzinfo\\n return time(hour, minute, second, microsecond, tzinfo)\\n\\n def __nonzero__(self):\\n if self.second or self.microsecond:\\n return True\\n offset = self._utcoffset() or 0\\n return self.hour * 60 + self.minute != offset\\n\\n_time_class = time # so functions w/ args named \\\"time\\\" can get at the class\\n\\ntime.min = time(0, 0, 0)\\ntime.max = time(23, 59, 59, 999999)\\ntime.resolution = timedelta(microseconds=1)\\n\\nclass datetime(date):\\n \\\"\\\"\\\"datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\\n\\n The year, month and day arguments are required. tzinfo may be None, or an\\n instance of a tzinfo subclass. The remaining arguments may be ints or longs.\\n \\\"\\\"\\\"\\n __slots__ = date.__slots__ + time.__slots__\\n\\n def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0,\\n microsecond=0, tzinfo=None):\\n year, month, day = _check_date_fields(year, month, day)\\n hour, minute, second, microsecond = _check_time_fields(\\n hour, minute, second, microsecond)\\n _check_tzinfo_arg(tzinfo)\\n self = object.__new__(cls)\\n self._year = year\\n self._month = month\\n self._day = day\\n self._hour = hour\\n self._minute = minute\\n self._second = second\\n self._microsecond = microsecond\\n self._tzinfo = tzinfo\\n self._hashcode = -1\\n return self\\n\\n # Read-only field accessors\\n @property\\n def hour(self):\\n \\\"\\\"\\\"hour (0-23)\\\"\\\"\\\"\\n return self._hour\\n\\n @property\\n def minute(self):\\n \\\"\\\"\\\"minute (0-59)\\\"\\\"\\\"\\n return self._minute\\n\\n @property\\n def second(self):\\n \\\"\\\"\\\"second (0-59)\\\"\\\"\\\"\\n return self._second\\n\\n @property\\n def microsecond(self):\\n \\\"\\\"\\\"microsecond (0-999999)\\\"\\\"\\\"\\n return self._microsecond\\n\\n @property\\n def tzinfo(self):\\n \\\"\\\"\\\"timezone info object\\\"\\\"\\\"\\n return self._tzinfo\\n\\n @classmethod\\n def fromtimestamp(cls, timestamp, tz=None):\\n \\\"\\\"\\\"Construct a datetime from a POSIX timestamp (like time.time()).\\n\\n A timezone info object may be passed in as well.\\n \\\"\\\"\\\"\\n _check_tzinfo_arg(tz)\\n converter = _time.localtime if tz is None else _time.gmtime\\n self = cls._from_timestamp(converter, timestamp, tz)\\n if tz is not None:\\n self = tz.fromutc(self)\\n return self\\n\\n @classmethod\\n def utcfromtimestamp(cls, t):\\n \\\"Construct a UTC datetime from a POSIX timestamp (like time.time()).\\\"\\n return cls._from_timestamp(_time.gmtime, t, None)\\n\\n @classmethod\\n def _from_timestamp(cls, converter, timestamp, tzinfo):\\n t_full = timestamp\\n timestamp = int(_math.floor(timestamp))\\n frac = t_full - timestamp\\n us = _round(frac * 1e6)\\n\\n # If timestamp is less than one microsecond smaller than a\\n # full second, us can be rounded up to 1000000. In this case,\\n # roll over to seconds, otherwise, ValueError is raised\\n # by the constructor.\\n if us == 1000000:\\n timestamp += 1\\n us = 0\\n y, m, d, hh, mm, ss, weekday, jday, dst = converter(timestamp)\\n ss = min(ss, 59) # clamp out leap seconds if the platform has them\\n return cls(y, m, d, hh, mm, ss, us, tzinfo)\\n\\n @classmethod\\n def now(cls, tz=None):\\n \\\"Construct a datetime from time.time() and optional time zone info.\\\"\\n t = _time.time()\\n return cls.fromtimestamp(t, tz)\\n\\n @classmethod\\n def utcnow(cls):\\n \\\"Construct a UTC datetime from time.time().\\\"\\n t = _time.time()\\n return cls.utcfromtimestamp(t)\\n\\n @classmethod\\n def combine(cls, date, time):\\n \\\"Construct a datetime from a given date and a given time.\\\"\\n if not isinstance(date, _date_class):\\n raise TypeError(\\\"date argument must be a date instance\\\")\\n if not isinstance(time, _time_class):\\n raise TypeError(\\\"time argument must be a time instance\\\")\\n return cls(date.year, date.month, date.day,\\n time.hour, time.minute, time.second, time.microsecond,\\n time.tzinfo)\\n\\n def timetuple(self):\\n \\\"Return local time tuple compatible with time.localtime().\\\"\\n dst = self._dst()\\n if dst is None:\\n dst = -1\\n elif dst:\\n dst = 1\\n return _build_struct_time(self.year, self.month, self.day,\\n self.hour, self.minute, self.second,\\n dst)\\n\\n def utctimetuple(self):\\n \\\"Return UTC time tuple compatible with time.gmtime().\\\"\\n y, m, d = self.year, self.month, self.day\\n hh, mm, ss = self.hour, self.minute, self.second\\n offset = self._utcoffset()\\n if offset: # neither None nor 0\\n mm -= offset\\n y, m, d, hh, mm, ss, _ = _normalize_datetime(\\n y, m, d, hh, mm, ss, 0, ignore_overflow=True)\\n return _build_struct_time(y, m, d, hh, mm, ss, 0)\\n\\n def date(self):\\n \\\"Return the date part.\\\"\\n return date(self._year, self._month, self._day)\\n\\n def time(self):\\n \\\"Return the time part, with tzinfo None.\\\"\\n return time(self.hour, self.minute, self.second, self.microsecond)\\n\\n def timetz(self):\\n \\\"Return the time part, with same tzinfo.\\\"\\n return time(self.hour, self.minute, self.second, self.microsecond,\\n self._tzinfo)\\n\\n def replace(self, year=None, month=None, day=None, hour=None,\\n minute=None, second=None, microsecond=None, tzinfo=True):\\n \\\"\\\"\\\"Return a new datetime with new values for the specified fields.\\\"\\\"\\\"\\n if year is None:\\n year = self.year\\n if month is None:\\n month = self.month\\n if day is None:\\n day = self.day\\n if hour is None:\\n hour = self.hour\\n if minute is None:\\n minute = self.minute\\n if second is None:\\n second = self.second\\n if microsecond is None:\\n microsecond = self.microsecond\\n if tzinfo is True:\\n tzinfo = self.tzinfo\\n return datetime(year, month, day, hour, minute, second, microsecond,\\n tzinfo)\\n\\n def astimezone(self, tz):\\n if not isinstance(tz, tzinfo):\\n raise TypeError(\\\"tz argument must be an instance of tzinfo\\\")\\n\\n mytz = self.tzinfo\\n if mytz is None:\\n raise ValueError(\\\"astimezone() requires an aware datetime\\\")\\n\\n if tz is mytz:\\n return self\\n\\n # Convert self to UTC, and attach the new time zone object.\\n myoffset = self.utcoffset()\\n if myoffset is None:\\n raise ValueError(\\\"astimezone() requires an aware datetime\\\")\\n utc = (self - myoffset).replace(tzinfo=tz)\\n\\n # Convert from UTC to tz's local time.\\n return tz.fromutc(utc)\\n\\n # Ways to produce a string.\\n\\n def ctime(self):\\n \\\"Return ctime() style string.\\\"\\n weekday = self.toordinal() % 7 or 7\\n return \\\"%s %s %2d %02d:%02d:%02d %04d\\\" % (\\n _DAYNAMES[weekday],\\n _MONTHNAMES[self._month],\\n self._day,\\n self._hour, self._minute, self._second,\\n self._year)\\n\\n def isoformat(self, sep='T'):\\n \\\"\\\"\\\"Return the time formatted according to ISO.\\n\\n This is 'YYYY-MM-DD HH:MM:SS.mmmmmm', or 'YYYY-MM-DD HH:MM:SS' if\\n self.microsecond == 0.\\n\\n If self.tzinfo is not None, the UTC offset is also attached, giving\\n 'YYYY-MM-DD HH:MM:SS.mmmmmm+HH:MM' or 'YYYY-MM-DD HH:MM:SS+HH:MM'.\\n\\n Optional argument sep specifies the separator between date and\\n time, default 'T'.\\n \\\"\\\"\\\"\\n s = (\\\"%04d-%02d-%02d%c\\\" % (self._year, self._month, self._day, sep) +\\n _format_time(self._hour, self._minute, self._second,\\n self._microsecond))\\n off = self._utcoffset()\\n if off is not None:\\n if off < 0:\\n sign = \\\"-\\\"\\n off = -off\\n else:\\n sign = \\\"+\\\"\\n hh, mm = divmod(off, 60)\\n s += \\\"%s%02d:%02d\\\" % (sign, hh, mm)\\n return s\\n\\n def __repr__(self):\\n \\\"\\\"\\\"Convert to formal string, for repr().\\\"\\\"\\\"\\n L = [self._year, self._month, self._day, # These are never zero\\n self._hour, self._minute, self._second, self._microsecond]\\n if L[-1] == 0:\\n del L[-1]\\n if L[-1] == 0:\\n del L[-1]\\n s = \\\", \\\".join(map(str, L))\\n module = \\\"datetime.\\\" if self.__class__ is datetime else \\\"\\\"\\n s = \\\"%s(%s)\\\" % (module + self.__class__.__name__, s)\\n if self._tzinfo is not None:\\n assert s[-1:] == \\\")\\\"\\n s = s[:-1] + \\\", tzinfo=%r\\\" % self._tzinfo + \\\")\\\"\\n return s\\n\\n def __str__(self):\\n \\\"Convert to string, for str().\\\"\\n return self.isoformat(sep=' ')\\n\\n @classmethod\\n def strptime(cls, date_string, format):\\n 'string, format -> new datetime parsed from a string (like time.strptime()).'\\n from _strptime import _strptime\\n # _strptime._strptime returns a two-element tuple. The first\\n # element is a time.struct_time object. The second is the\\n # microseconds (which are not defined for time.struct_time).\\n struct, micros = _strptime(date_string, format)\\n return cls(*(struct[0:6] + (micros,)))\\n\\n def utcoffset(self):\\n \\\"\\\"\\\"Return the timezone offset in minutes east of UTC (negative west of\\n UTC).\\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.utcoffset(self)\\n offset = _check_utc_offset(\\\"utcoffset\\\", offset)\\n if offset is not None:\\n offset = timedelta._create(0, offset * 60, 0, True)\\n return offset\\n\\n # Return an integer (or None) instead of a timedelta (or None).\\n def _utcoffset(self):\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.utcoffset(self)\\n offset = _check_utc_offset(\\\"utcoffset\\\", offset)\\n return offset\\n\\n def tzname(self):\\n \\\"\\\"\\\"Return the timezone name.\\n\\n Note that the name is 100% informational -- there's no requirement that\\n it mean anything in particular. For example, \\\"GMT\\\", \\\"UTC\\\", \\\"-500\\\",\\n \\\"-5:00\\\", \\\"EDT\\\", \\\"US/Eastern\\\", \\\"America/New York\\\" are all valid replies.\\n \\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n name = self._tzinfo.tzname(self)\\n _check_tzname(name)\\n return name\\n\\n def dst(self):\\n \\\"\\\"\\\"Return 0 if DST is not in effect, or the DST offset (in minutes\\n eastward) if DST is in effect.\\n\\n This is purely informational; the DST offset has already been added to\\n the UTC offset returned by utcoffset() if applicable, so there's no\\n need to consult dst() unless you're interested in displaying the DST\\n info.\\n \\\"\\\"\\\"\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.dst(self)\\n offset = _check_utc_offset(\\\"dst\\\", offset)\\n if offset is not None:\\n offset = timedelta._create(0, offset * 60, 0, True)\\n return offset\\n\\n # Return an integer (or None) instead of a timedelta (or None).\\n def _dst(self):\\n if self._tzinfo is None:\\n return None\\n offset = self._tzinfo.dst(self)\\n offset = _check_utc_offset(\\\"dst\\\", offset)\\n return offset\\n\\n # Comparisons of datetime objects with other.\\n\\n def __eq__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) == 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n return False\\n\\n def __ne__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) != 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n return True\\n\\n def __le__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) <= 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __lt__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) < 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __ge__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) >= 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def __gt__(self, other):\\n if isinstance(other, datetime):\\n return self._cmp(other) > 0\\n elif hasattr(other, \\\"timetuple\\\") and not isinstance(other, date):\\n return NotImplemented\\n else:\\n _cmperror(self, other)\\n\\n def _cmp(self, other):\\n assert isinstance(other, datetime)\\n mytz = self._tzinfo\\n ottz = other._tzinfo\\n myoff = otoff = None\\n\\n if mytz is ottz:\\n base_compare = True\\n else:\\n if mytz is not None:\\n myoff = self._utcoffset()\\n if ottz is not None:\\n otoff = other._utcoffset()\\n base_compare = myoff == otoff\\n\\n if base_compare:\\n return _cmp((self._year, self._month, self._day,\\n self._hour, self._minute, self._second,\\n self._microsecond),\\n (other._year, other._month, other._day,\\n other._hour, other._minute, other._second,\\n other._microsecond))\\n if myoff is None or otoff is None:\\n raise TypeError(\\\"can't compare offset-naive and offset-aware datetimes\\\")\\n # XXX What follows could be done more efficiently...\\n diff = self - other # this will take offsets into account\\n if diff.days < 0:\\n return -1\\n return diff and 1 or 0\\n\\n def _add_timedelta(self, other, factor):\\n y, m, d, hh, mm, ss, us = _normalize_datetime(\\n self._year,\\n self._month,\\n self._day + other.days * factor,\\n self._hour,\\n self._minute,\\n self._second + other.seconds * factor,\\n self._microsecond + other.microseconds * factor)\\n return datetime(y, m, d, hh, mm, ss, us, tzinfo=self._tzinfo)\\n\\n def __add__(self, other):\\n \\\"Add a datetime and a timedelta.\\\"\\n if not isinstance(other, timedelta):\\n return NotImplemented\\n return self._add_timedelta(other, 1)\\n\\n __radd__ = __add__\\n\\n def __sub__(self, other):\\n \\\"Subtract two datetimes, or a datetime and a timedelta.\\\"\\n if not isinstance(other, datetime):\\n if isinstance(other, timedelta):\\n return self._add_timedelta(other, -1)\\n return NotImplemented\\n\\n delta_d = self.toordinal() - other.toordinal()\\n delta_s = (self._hour - other._hour) * 3600 + \\\\\\n (self._minute - other._minute) * 60 + \\\\\\n (self._second - other._second)\\n delta_us = self._microsecond - other._microsecond\\n base = timedelta._create(delta_d, delta_s, delta_us, True)\\n if self._tzinfo is other._tzinfo:\\n return base\\n myoff = self._utcoffset()\\n otoff = other._utcoffset()\\n if myoff == otoff:\\n return base\\n if myoff is None or otoff is None:\\n raise TypeError(\\\"can't subtract offset-naive and offset-aware datetimes\\\")\\n return base + timedelta(minutes = otoff-myoff)\\n\\n def __hash__(self):\\n if self._hashcode == -1:\\n tzoff = self._utcoffset()\\n if tzoff is None:\\n self._hashcode = hash(self._getstate()[0])\\n else:\\n days = _ymd2ord(self.year, self.month, self.day)\\n seconds = self.hour * 3600 + (self.minute - tzoff) * 60 + self.second\\n self._hashcode = hash(timedelta(days, seconds, self.microsecond))\\n return self._hashcode\\n\\n\\n\\ndatetime.min = datetime(1, 1, 1)\\ndatetime.max = datetime(9999, 12, 31, 23, 59, 59, 999999)\\ndatetime.resolution = timedelta(microseconds=1)\\n\\n\\ndef _isoweek1monday(year):\\n # Helper to calculate the day number of the Monday starting week 1\\n # XXX This could be done more efficiently\\n THURSDAY = 3\\n firstday = _ymd2ord(year, 1, 1)\\n firstweekday = (firstday + 6) % 7 # See weekday() above\\n week1monday = firstday - firstweekday\\n if firstweekday > THURSDAY:\\n week1monday += 7\\n return week1monday\\n\\n\\\"\\\"\\\"\\nSome time zone algebra. For a datetime x, let\\n x.n = x stripped of its timezone -- its naive time.\\n x.o = x.utcoffset(), and assuming that doesn't raise an exception or\\n return None\\n x.d = x.dst(), and assuming that doesn't raise an exception or\\n return None\\n x.s = x's standard offset, x.o - x.d\\n\\nNow some derived rules, where k is a duration (timedelta).\\n\\n1. x.o = x.s + x.d\\n This follows from the definition of x.s.\\n\\n2. If x and y have the same tzinfo member, x.s = y.s.\\n This is actually a requirement, an assumption we need to make about\\n sane tzinfo classes.\\n\\n3. The naive UTC time corresponding to x is x.n - x.o.\\n This is again a requirement for a sane tzinfo class.\\n\\n4. (x+k).s = x.s\\n This follows from #2, and that datimetimetz+timedelta preserves tzinfo.\\n\\n5. (x+k).n = x.n + k\\n Again follows from how arithmetic is defined.\\n\\nNow we can explain tz.fromutc(x). Let's assume it's an interesting case\\n(meaning that the various tzinfo methods exist, and don't blow up or return\\nNone when called).\\n\\nThe function wants to return a datetime y with timezone tz, equivalent to x.\\nx is already in UTC.\\n\\nBy #3, we want\\n\\n y.n - y.o = x.n [1]\\n\\nThe algorithm starts by attaching tz to x.n, and calling that y. So\\nx.n = y.n at the start. Then it wants to add a duration k to y, so that [1]\\nbecomes true; in effect, we want to solve [2] for k:\\n\\n (y+k).n - (y+k).o = x.n [2]\\n\\nBy #1, this is the same as\\n\\n (y+k).n - ((y+k).s + (y+k).d) = x.n [3]\\n\\nBy #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.\\nSubstituting that into [3],\\n\\n x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving\\n k - (y+k).s - (y+k).d = 0; rearranging,\\n k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so\\n k = y.s - (y+k).d\\n\\nOn the RHS, (y+k).d can't be computed directly, but y.s can be, and we\\napproximate k by ignoring the (y+k).d term at first. Note that k can't be\\nvery large, since all offset-returning methods return a duration of magnitude\\nless than 24 hours. For that reason, if y is firmly in std time, (y+k).d must\\nbe 0, so ignoring it has no consequence then.\\n\\nIn any case, the new value is\\n\\n z = y + y.s [4]\\n\\nIt's helpful to step back at look at [4] from a higher level: it's simply\\nmapping from UTC to tz's standard time.\\n\\nAt this point, if\\n\\n z.n - z.o = x.n [5]\\n\\nwe have an equivalent time, and are almost done. The insecurity here is\\nat the start of daylight time. Picture US Eastern for concreteness. The wall\\ntime jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good\\nsense then. The docs ask that an Eastern tzinfo class consider such a time to\\nbe EDT (because it's \\\"after 2\\\"), which is a redundant spelling of 1:MM EST\\non the day DST starts. We want to return the 1:MM EST spelling because that's\\nthe only spelling that makes sense on the local wall clock.\\n\\nIn fact, if [5] holds at this point, we do have the standard-time spelling,\\nbut that takes a bit of proof. We first prove a stronger result. What's the\\ndifference between the LHS and RHS of [5]? Let\\n\\n diff = x.n - (z.n - z.o) [6]\\n\\nNow\\n z.n = by [4]\\n (y + y.s).n = by #5\\n y.n + y.s = since y.n = x.n\\n x.n + y.s = since z and y are have the same tzinfo member,\\n y.s = z.s by #2\\n x.n + z.s\\n\\nPlugging that back into [6] gives\\n\\n diff =\\n x.n - ((x.n + z.s) - z.o) = expanding\\n x.n - x.n - z.s + z.o = cancelling\\n - z.s + z.o = by #2\\n z.d\\n\\nSo diff = z.d.\\n\\nIf [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time\\nspelling we wanted in the endcase described above. We're done. Contrarily,\\nif z.d = 0, then we have a UTC equivalent, and are also done.\\n\\nIf [5] is not true now, diff = z.d != 0, and z.d is the offset we need to\\nadd to z (in effect, z is in tz's standard time, and we need to shift the\\nlocal clock into tz's daylight time).\\n\\nLet\\n\\n z' = z + z.d = z + diff [7]\\n\\nand we can again ask whether\\n\\n z'.n - z'.o = x.n [8]\\n\\nIf so, we're done. If not, the tzinfo class is insane, according to the\\nassumptions we've made. This also requires a bit of proof. As before, let's\\ncompute the difference between the LHS and RHS of [8] (and skipping some of\\nthe justifications for the kinds of substitutions we've done several times\\nalready):\\n\\n diff' = x.n - (z'.n - z'.o) = replacing z'.n via [7]\\n x.n - (z.n + diff - z'.o) = replacing diff via [6]\\n x.n - (z.n + x.n - (z.n - z.o) - z'.o) =\\n x.n - z.n - x.n + z.n - z.o + z'.o = cancel x.n\\n - z.n + z.n - z.o + z'.o = cancel z.n\\n - z.o + z'.o = #1 twice\\n -z.s - z.d + z'.s + z'.d = z and z' have same tzinfo\\n z'.d - z.d\\n\\nSo z' is UTC-equivalent to x iff z'.d = z.d at this point. If they are equal,\\nwe've found the UTC-equivalent so are done. In fact, we stop with [7] and\\nreturn z', not bothering to compute z'.d.\\n\\nHow could z.d and z'd differ? z' = z + z.d [7], so merely moving z' by\\na dst() offset, and starting *from* a time already in DST (we know z.d != 0),\\nwould have to change the result dst() returns: we start in DST, and moving\\na little further into it takes us out of DST.\\n\\nThere isn't a sane case where this can happen. The closest it gets is at\\nthe end of DST, where there's an hour in UTC with no spelling in a hybrid\\ntzinfo class. In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT. During\\nthat hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM\\nUTC) because the docs insist on that, but 0:MM is taken as being in daylight\\ntime (4:MM UTC). There is no local time mapping to 5:MM UTC. The local\\nclock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in\\nstandard time. Since that's what the local clock *does*, we want to map both\\nUTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous\\nin local time, but so it goes -- it's the way the local clock works.\\n\\nWhen x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,\\nso z=0:MM. z.d=60 (minutes) then, so [5] doesn't hold and we keep going.\\nz' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]\\n(correctly) concludes that z' is not UTC-equivalent to x.\\n\\nBecause we know z.d said z was in daylight time (else [5] would have held and\\nwe would have stopped then), and we know z.d != z'.d (else [8] would have held\\nand we have stopped then), and there are only 2 possible values dst() can\\nreturn in Eastern, it follows that z'.d must be 0 (which it is in the example,\\nbut the reasoning doesn't depend on the example -- it depends on there being\\ntwo possible dst() outcomes, one zero and the other non-zero). Therefore\\nz' must be in standard time, and is the spelling we want in this case.\\n\\nNote again that z' is not UTC-equivalent as far as the hybrid tzinfo class is\\nconcerned (because it takes z' as being in standard time rather than the\\ndaylight time we intend here), but returning it gives the real-life \\\"local\\nclock repeats an hour\\\" behavior when mapping the \\\"unspellable\\\" UTC hour into\\ntz.\\n\\nWhen the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with\\nthe 1:MM standard time spelling we want.\\n\\nSo how can this break? One of the assumptions must be violated. Two\\npossibilities:\\n\\n1) [2] effectively says that y.s is invariant across all y belong to a given\\n time zone. This isn't true if, for political reasons or continental drift,\\n a region decides to change its base offset from UTC.\\n\\n2) There may be versions of \\\"double daylight\\\" time where the tail end of\\n the analysis gives up a step too early. I haven't thought about that\\n enough to say.\\n\\nIn any case, it's clear that the default fromutc() is strong enough to handle\\n\\\"almost all\\\" time zones: so long as the standard offset is invariant, it\\ndoesn't matter if daylight time transition points change from year to year, or\\nif daylight time is skipped in some years; it doesn't matter how large or\\nsmall dst() may get within its bounds; and it doesn't even matter if some\\nperverse time zone returns a negative dst()). So a breaking case must be\\npretty bizarre, and a tzinfo subclass can override fromutc() if it is.\\n\\\"\\\"\\\"\\n\",\"src/lib/dbhash.py\":\"raise NotImplementedError(\\\"dbhash is not yet implemented in Skulpt\\\")\\n\",\"src/lib/decimal.py\":\"raise NotImplementedError(\\\"decimal is not yet implemented in Skulpt\\\")\\n\",\"src/lib/difflib.py\":\"raise NotImplementedError(\\\"difflib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/dircache.py\":\"raise NotImplementedError(\\\"dircache is not yet implemented in Skulpt\\\")\\n\",\"src/lib/dis.py\":\"raise NotImplementedError(\\\"dis is not yet implemented in Skulpt\\\")\\n\",\"src/lib/distutils/__init__.py\":\"raise NotImplementedError(\\\"distutils is not yet implemented in Skulpt\\\")\\n\",\"src/lib/distutils/command/__init__.py\":\"raise NotImplementedError(\\\"command is not yet implemented in Skulpt\\\")\\n\",\"src/lib/distutils/tests/__init__.py\":\"raise NotImplementedError(\\\"tests is not yet implemented in Skulpt\\\")\\n\",\"src/lib/doctest.py\":\"raise NotImplementedError(\\\"doctest is not yet implemented in Skulpt\\\")\\n\",\"src/lib/document.js\":\"var $builtinmodule=function(){var a,b={__name__:new Sk.builtin.str(\\\"document\\\")};return b.getElementById=new Sk.builtin.func(function(a){var c=document.getElementById(a.v);return c?Sk.misceval.callsimArray(b.Element,[c]):Sk.builtin.none.none$}),b.createElement=new Sk.builtin.func(function(a){var c=document.createElement(a.v);if(c)return Sk.misceval.callsimArray(b.Element,[c])}),b.getElementsByTagName=new Sk.builtin.func(function(a){for(var c=document.getElementsByTagName(a.v),d=[],e=c.length-1;0<=e;e--)d.push(Sk.misceval.callsimArray(b.Element,[c[e]]));return new Sk.builtin.list(d)}),b.getElementsByClassName=new Sk.builtin.func(function(a){for(var c=document.getElementsByClassName(a.v),d=[],e=0;eb||0>c||b>=a.width||c>=a.height)throw new Sk.builtin.ValueError(\\\"Pixel index out of range.\\\")};var i=function(a,b,c){var d;Sk.builtin.pyCheckArgsLen(\\\"setdelay\\\",arguments.length,2,3),a.delay=Sk.ffi.remapToJs(b),d=Sk.builtin.asnum$(c),a.updateInterval=d?d:1};b.set_delay=new Sk.builtin.func(i),b.setDelay=new Sk.builtin.func(i);var j=function(a){var b,d=[];for(Sk.builtin.pyCheckArgsLen(\\\"getpixels\\\",arguments.length,1,1),b=0;b=a.width?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,0,a.lasty,a.width,2):a.lasty+a.updateInterval>=a.height?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,a.lastx,0,2,a.height):a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,g(b,a.lastx),g(c,a.lasty),e(f(b-a.lastx),1),e(f(c-a.lasty),1)),a.lastx=b,a.lasty=c,0e)throw new Sk.builtin.ValueError(\\\"r must be non-negative\\\");if(this===a)return new a.constructor(f,e);else{const b=new this.constructor;return a.constructor.call(b,f,e),b}}var a={};return a.accumulate=Sk.abstr.buildIteratorClass(\\\"itertools.accumulate\\\",{constructor:function accumulate(a,b,c){this.iter=a,this.func=b,this.total=c,this.tp$iternext=()=>(this.total=Sk.builtin.checkNone(this.total)?this.iter.tp$iternext():this.total,this.tp$iternext=this.constructor.prototype.tp$iternext,this.total)},iternext(){let a=this.iter.tp$iternext();if(void 0!==a)return this.total=Sk.misceval.callsimArray(this.func,[this.total,a]),this.total},slots:{tp$doc:\\\"accumulate(iterable[, func, initial]) --> accumulate object\\\\n\\\\nReturn series of accumulated sums (or other binary function results).\\\",tp$new(b,c){Sk.abstr.checkArgsLen(\\\"accumulate\\\",b,0,2);let[d,e,f]=Sk.abstr.copyKeywordsToNamedArgs(\\\"accumulate\\\",[\\\"iterable\\\",\\\"func\\\",\\\"initial\\\"],b,c,[Sk.builtin.none.none$,Sk.builtin.none.none$]);if(d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func((c,a)=>Sk.abstr.numberBinOp(c,a,\\\"Add\\\")):e,this===a.accumulate.prototype)return new a.accumulate(d,e,f);else{const b=new this.constructor;return a.accumulate.call(b,d,e,f),b}}}}),a.chain=Sk.abstr.buildIteratorClass(\\\"itertools.chain\\\",{constructor:function chain(a){this.iterables=a,this.current_it=null,this.tp$iternext=()=>(this.tp$iternext=this.constructor.prototype.tp$iternext,this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)?void(this.tp$iternext=()=>void 0):(this.current_it=Sk.abstr.iter(this.current_it),this.tp$iternext())},iternext(){for(let a;void 0===a;)if(a=this.current_it.tp$iternext(),void 0===a){if(this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)return void(this.tp$iternext=()=>void 0);this.current_it=Sk.abstr.iter(this.current_it)}else return a},slots:{tp$doc:\\\"chain(*iterables) --> chain object\\\\n\\\\nReturn a chain object whose .__next__() method returns elements from the\\\\nfirst iterable until it is exhausted, then elements from the next\\\\niterable, until all of the iterables are exhausted.\\\",tp$new(b,c){if(Sk.abstr.checkNoKwargs(\\\"chain\\\",c),b=new Sk.builtin.tuple(b.slice(0)).tp$iter(),this===a.chain.prototype)return new a.chain(b);else{const c=new this.constructor;return a.chain.call(c,b),c}}},classmethods:{from_iterable:{$meth(b){const c=Sk.abstr.iter(b);return new a.chain(c)},$flags:{OneArg:!0},$doc:\\\"chain.from_iterable(iterable) --> chain object\\\\n\\\\nAlternate chain() constructor taking a single iterable argument\\\\nthat evaluates lazily.\\\",$textsig:null}}}),a.combinations=Sk.abstr.buildIteratorClass(\\\"itertools.combinations\\\",{constructor:function combinations(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill().map((a,b)=>b),this.n=a.length,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=a+this.n-this.r){b=!0;break}if(!b)return void(this.r=0);this.indices[a]++;for(let b=a+1;bthis.pool[a]);return new Sk.builtin.tuple(c)},slots:{tp$doc:\\\"combinations(iterable, r) --> combinations object\\\\n\\\\nReturn successive r-length combinations of elements in the iterable.\\\\n\\\\ncombinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)\\\",tp$new(b,c){return combinationsNew.call(this,a.combinations.prototype,b,c)}}}),a.combinations_with_replacement=Sk.abstr.buildIteratorClass(\\\"itertools.combinations_with_replacement\\\",{constructor:function combinations_with_replacement(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill(0),this.n=a.length,this.tp$iternext=()=>{if(!this.r||this.n){this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map(a=>this.pool[a]);return new Sk.builtin.tuple(a)}}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=this.n-1){b=!0;break}if(!b)return void(this.r=0);const c=this.indices[a]+1;for(let b=a;bthis.pool[a]);return new Sk.builtin.tuple(d)},slots:{tp$doc:\\\"combinations_with_replacement(iterable, r) --> combinations_with_replacement object\\\\n\\\\nReturn successive r-length combinations of elements in the iterable\\\\nallowing individual elements to have successive repeats.\\\\ncombinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC\\\",tp$new(b,c){return combinationsNew.call(this,a.combinations_with_replacement.prototype,b,c)}}}),a.compress=Sk.abstr.buildIteratorClass(\\\"itertools.compress\\\",{constructor:function compress(a,b){this.data=a,this.selectors=b},iternext(){let a=this.data.tp$iternext(),b=this.selectors.tp$iternext();for(;void 0!==a&&void 0!==b;){if(Sk.misceval.isTrue(b))return a;a=this.data.tp$iternext(),b=this.selectors.tp$iternext()}},slots:{tp$doc:\\\"compress(data, selectors) --> iterator over selected data\\\\n\\\\nReturn data elements corresponding to true selector elements.\\\\nForms a shorter iterator from selected data elements using the\\\\nselectors to choose the data elements.\\\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"compress\\\",[\\\"data\\\",\\\"selectors\\\"],b,c,[]),d=Sk.abstr.iter(d),e=Sk.abstr.iter(e),this===a.count.prototype)return new a.compress(d,e);else{const b=new this.constructor;return a.compress.call(b,d,e),b}}}}),a.count=Sk.abstr.buildIteratorClass(\\\"itertools.count\\\",{constructor:function count(a,b){this.start=a,this.step=b},iternext(){const a=this.start;return this.start=Sk.abstr.numberBinOp(this.start,this.step,\\\"Add\\\"),a},slots:{tp$doc:\\\"count(start=0, step=1) --> count object\\\\n\\\\nReturn a count object whose .__next__() method returns consecutive values.\\\\nEquivalent to:\\\\n\\\\n def count(firstval=0, step=1):\\\\n x = firstval\\\\n while 1:\\\\n yield x\\\\n x += step\\\\n\\\",tp$new(b,c){const[d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"count\\\",[\\\"start\\\",\\\"step\\\"],b,c,[new Sk.builtin.int_(0),new Sk.builtin.int_(1)]);if(!Sk.builtin.checkNumber(d)&&!Sk.builtin.checkComplex(d))throw new Sk.builtin.TypeError(\\\"a number is required\\\");if(!Sk.builtin.checkNumber(e)&&!Sk.builtin.checkComplex(e))throw new Sk.builtin.TypeError(\\\"a number is required\\\");if(this===a.count.prototype)return new a.count(d,e);else{const b=new this.constructor;return a.count.call(b,d,e),b}},$r(){const a=Sk.misceval.objectRepr(this.start);let b=Sk.misceval.objectRepr(this.step);return b=\\\"1\\\"===b?\\\"\\\":\\\", \\\"+b,new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+a+b+\\\")\\\")}}}),a.cycle=Sk.abstr.buildIteratorClass(\\\"itertools.cycle\\\",{constructor:function cycle(a){this.iter=a,this.saved=[],this.consumed=!1,this.i=0,this.length},iternext(){let a;if(!this.consumed){if(a=this.iter.tp$iternext(),void 0!==a)return this.saved.push(a),a;if(this.consumed=!0,this.length=this.saved.length,!this.length)return}return a=this.saved[this.i],this.i=(this.i+1)%this.length,a},slots:{tp$doc:\\\"cycle(iterable) --> cycle object\\\\n\\\\nReturn elements from the iterable until it is exhausted.\\\\nThen repeat the sequence indefinitely.\\\",tp$new(b,c){Sk.abstr.checkOneArg(\\\"cycle\\\",b,c);const d=Sk.abstr.iter(b[0]);if(this===a.cycle.prototype)return new a.cycle(d);else{const b=new this.constructor;return a.cycle.call(b,d),b}}}}),a.dropwhile=Sk.abstr.buildIteratorClass(\\\"itertools.dropwhile\\\",{constructor:function dropwhile(a,b){this.predicate=a,this.iter=b,this.passed},iternext(){let a=this.iter.tp$iternext();for(;void 0===this.passed&&void 0!==a;){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(!Sk.misceval.isTrue(b))return this.passed=!0,a;a=this.iter.tp$iternext()}return a},slots:{tp$doc:\\\"dropwhile(predicate, iterable) --> dropwhile object\\\\n\\\\nDrop items from the iterable while predicate(item) is true.\\\\nAfterwards, return every element until the iterable is exhausted.\\\",tp$new(b,c){Sk.abstr.checkNoKwargs(\\\"dropwhile\\\",c),Sk.abstr.checkArgsLen(\\\"dropwhile\\\",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.dropwhile.prototype)return new a.dropwhile(d,e);else{const b=new this.constructor;return a.dropwhile.call(b,d,e),b}}}}),a.filterfalse=Sk.abstr.buildIteratorClass(\\\"itertools.filterfalse\\\",{constructor:function filterfalse(a,b){this.predicate=a,this.iter=b},iternext(){let a=this.iter.tp$iternext();if(void 0!==a){for(let b=Sk.misceval.callsimArray(this.predicate,[a]);Sk.misceval.isTrue(b);){if(a=this.iter.tp$iternext(),void 0===a)return;b=Sk.misceval.callsimArray(this.predicate,[a])}return a}},slots:{tp$doc:\\\"filterfalse(function or None, sequence) --> filterfalse object\\\\n\\\\nReturn those items of sequence for which function(item) is false.\\\\nIf function is None, return the items that are false.\\\",tp$new(b,c){Sk.abstr.checkNoKwargs(\\\"filterfalse\\\",c),Sk.abstr.checkArgsLen(\\\"filterfalse\\\",b,2,2);const d=Sk.builtin.checkNone(b[0])?Sk.builtin.bool:b[0],e=Sk.abstr.iter(b[1]);if(this===a.filterfalse.prototype)return new a.filterfalse(d,e);else{const b=new this.constructor;return a.filterfalse.call(b,d,e),b}}}}),a._grouper=Sk.abstr.buildIteratorClass(\\\"itertools._grouper\\\",{constructor:function _grouper(a){this.groupby=a,this.tgtkey=a.tgtkey,this.id=a.id},iternext(){const a=Sk.misceval.richCompareBool(this.groupby.currkey,this.tgtkey,\\\"Eq\\\");if(this.groupby.id===this.id&&a){let a=this.groupby.currval;return this.groupby.currval=this.groupby.iter.tp$iternext(),void 0!==this.groupby.currval&&(this.groupby.currkey=Sk.misceval.callsimArray(this.groupby.keyf,[this.groupby.currval])),a}}}),a.groupby=Sk.abstr.buildIteratorClass(\\\"itertools.groupby\\\",{constructor:function groupby(a,b){this.iter=a,this.keyf=b,this.currval,this.currkey=this.tgtkey=new Sk.builtin.object,this.id},iternext(){this.id={};for(let a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\\\"Eq\\\");a;){if(this.currval=this.iter.tp$iternext(),void 0===this.currval)return;this.currkey=Sk.misceval.callsimArray(this.keyf,[this.currval]),a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\\\"Eq\\\")}this.tgtkey=this.currkey;const b=new a._grouper(this);return new Sk.builtin.tuple([this.currkey,b])},slots:{tp$doc:\\\"groupby(iterable, key=None) -> make an iterator that returns consecutive\\\\nkeys and groups from the iterable. If the key function is not specified or\\\\nis None, the element itself is used for grouping.\\\\n\\\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"groupby\\\",[\\\"iterable\\\",\\\"key\\\"],b,c,[Sk.builtin.none.none$]),d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func(a=>a):e,this===a.groupby.prototype)return new a.groupby(d,e);else{const b=new this.constructor;return a.groupby.call(b,d,e),b}}}}),a.islice=Sk.abstr.buildIteratorClass(\\\"itertools.islice\\\",{constructor:function islice(a,b,c,d){this.iter=a,this.previt=b,this.stop=c,this.step=d,this.tp$iternext=()=>{if(this.tp$iternext=this.constructor.prototype.tp$iternext,this.previt>=this.stop){for(let a=0;a=this.stop){for(let a=this.previt+1;a islice object\\\\nislice(iterable, start, stop[, step]) --> islice object\\\\n\\\\nReturn an iterator whose next() method returns selected values from an\\\\niterable. If start is specified, will skip all preceding elements;\\\\notherwise, start defaults to zero. Step defaults to one. If\\\\nspecified as another value, step determines how many values are \\\\nskipped between successive calls. Works like a slice() on a list\\\\nbut returns an iterator.\\\",tp$new(b,c){var d=Number.MAX_SAFE_INTEGER;Sk.abstr.checkNoKwargs(\\\"islice\\\",c),Sk.abstr.checkArgsLen(\\\"islice\\\",b,2,4);const e=Sk.abstr.iter(b[0]);let f=b[1],g=b[2],h=b[3];if(void 0===g?(g=f,f=Sk.builtin.none.none$,h=Sk.builtin.none.none$):void 0===h&&(h=Sk.builtin.none.none$),!(Sk.builtin.checkNone(g)||Sk.misceval.isIndex(g)))throw new Sk.builtin.ValueError(\\\"Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");else if(g=Sk.builtin.checkNone(g)?d:Sk.misceval.asIndexSized(g),0>g||g>d)throw new Sk.builtin.ValueError(\\\"Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");if(!(Sk.builtin.checkNone(f)||Sk.misceval.isIndex(f)))throw new Sk.builtin.ValueError(\\\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");else if(f=Sk.builtin.checkNone(f)?0:Sk.misceval.asIndexSized(f),0>f||f>d)throw new Sk.builtin.ValueError(\\\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");if(!(Sk.builtin.checkNone(h)||Sk.misceval.isIndex(h)))throw new Sk.builtin.ValueError(\\\"Step for islice() must be a positive integer or None\\\");else if(h=Sk.builtin.checkNone(h)?1:Sk.misceval.asIndexSized(h),0>=h||h>d)throw new Sk.builtin.ValueError(\\\"Step for islice() must be a positive integer or None.\\\");if(this===a.islice.prototype)return new a.islice(e,f,g,h);else{const b=new this.constructor;return a.islice.call(b,e,f,g,h),b}}}}),a.permutations=Sk.abstr.buildIteratorClass(\\\"itertools.permutations\\\",{constructor:function permutations(a,b){this.pool=a,this.r=b;const c=a.length;this.indices=Array(c).fill().map((a,b)=>b),this.cycles=Array(b).fill().map((a,b)=>c-b),this.n=c,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){for(let a=this.r-1;0<=a;a--)if(this.cycles[a]--,0==this.cycles[a])this.indices.push(this.indices.splice(a,1)[0]),this.cycles[a]=this.n-a;else{j=this.cycles[a],[this.indices[a],this.indices[this.n-j]]=[this.indices[this.n-j],this.indices[a]];const b=this.indices.map(a=>this.pool[a]).slice(0,this.r);return new Sk.builtin.tuple(b)}this.r=0},slots:{tp$doc:\\\"permutations(iterable[, r]) --> permutations object\\\\n\\\\nReturn successive r-length permutations of elements in the iterable.\\\\n\\\\npermutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)\\\",tp$new(b,c){let d,e;[d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"permutations\\\",[\\\"iterable\\\",\\\"r\\\"],b,c,[Sk.builtin.none.none$]);const f=Sk.misceval.arrayFromIterable(d);if(e=Sk.builtin.checkNone(e)?f.length:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),0>e)throw new Sk.builtin.ValueError(\\\"r must be non-negative\\\");if(this===a.permutations.prototype)return new a.permutations(f,e);else{const b=new this.constructor;return a.permutations.call(b,f,e),b}}}}),a.product=Sk.abstr.buildIteratorClass(\\\"itertools.product\\\",{constructor:function product(a){this.pools=a,this.n=a.length,this.indices=Array(a.length).fill(0),this.pool_sizes=a.map(a=>a.length),this.tp$iternext=()=>{this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return a.some(a=>void 0===a)?void(this.n=0):new Sk.builtin.tuple(a)}},iternext(){for(let a=this.n-1;0<=a&&a=this.pool_sizes[a]?(this.indices[a]=-1,a--):a++;if(!this.n||this.indices.every(a=>-1===a))return void(this.n=0);else{const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return new Sk.builtin.tuple(a)}},slots:{tp$doc:\\\"product(*iterables, repeat=1) --> product object\\\\n\\\\nCartesian product of input iterables. Equivalent to nested for-loops.\\\\n\\\\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\\\\nThe leftmost iterators are in the outermost for-loop, so the output tuples\\\\ncycle in a manner similar to an odometer (with the rightmost element changing\\\\non every iteration).\\\\n\\\\nTo compute the product of an iterable with itself, specify the number\\\\nof repetitions with the optional repeat keyword argument. For example,\\\\nproduct(A, repeat=4) means the same as product(A, A, A, A).\\\\n\\\\nproduct('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\\\\nproduct((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...\\\",tp$new(b,c){let[d]=Sk.abstr.copyKeywordsToNamedArgs(\\\"product\\\",[\\\"repeat\\\"],[],c,[new Sk.builtin.int_(1)]);if(d=Sk.misceval.asIndexSized(d,Sk.builtin.OverFlowError),0>d)throw new Sk.builtin.ValueError(\\\"repeat argument cannot be negative\\\");const e=[];for(let a=0;athis.object)},iternext(){return 0 create an iterator which returns the object\\\\nfor the specified number of times. If not specified, returns the object\\\\nendlessly.\\\",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"repeat\\\",[\\\"object\\\",\\\"times\\\"],b,c,[null]),e=null===e?void 0:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),this===a.repeat.prototype)return new a.repeat(d,e);else{const b=new this.constructor;return a.repeat.call(b,d,e),b}},$r(){return object_repr=Sk.misceval.objectRepr(this.object),times_repr=void 0===this.times?\\\"\\\":\\\", \\\"+(0<=this.times?this.times:0),new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+object_repr+times_repr+\\\")\\\")}},methods:{__lenght_hint__:{$meth(){if(void 0===this.times)throw new Sk.builtin.TypeError(\\\"len() of unsized object\\\");return new Sk.builtin.int_(this.times)},$flags:{NoArgs:!0},$textsig:null}}}),a.starmap=Sk.abstr.buildIteratorClass(\\\"itertools.starmap\\\",{constructor:function starmap(a,b){this.func=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0===a)return;const b=Sk.misceval.arrayFromIterable(a),c=Sk.misceval.callsimArray(this.func,b);return c},slots:{tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs(\\\"starmap\\\",[\\\"func\\\",\\\"iterable\\\"],b,c,[]),e=Sk.abstr.iter(e),d=Sk.builtin.checkNone(d)?Sk.builtin.bool:d,this===a.starmap.prototype)return new a.starmap(d,e);else{const b=new this.constructor;return a.starmap.call(b,d,e),b}}}}),a.takewhile=Sk.abstr.buildIteratorClass(\\\"itertools.takewhile\\\",{constructor:function takewhile(a,b){this.predicate=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0!==a){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(Sk.misceval.isTrue(b))return a;this.tp$iternext=()=>void 0}},slots:{tp$doc:\\\"takewhile(predicate, iterable) --> takewhile object\\\\n\\\\nReturn successive entries from an iterable as long as the \\\\npredicate evaluates to true for each entry.\\\",tp$new(b,c){Sk.abstr.checkNoKwargs(\\\"takewhile\\\",c),Sk.abstr.checkArgsLen(\\\"takewhile\\\",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.takewhile.prototype)return new a.takewhile(d,e);else{const b=new this.constructor;return a.takewhile.call(b,d,e),b}}}}),a.tee=new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError(\\\"tee is not yet implemented in Skulpt\\\")}),a.zip_longest=Sk.abstr.buildIteratorClass(\\\"itertools.zip_longest\\\",{constructor:function zip_longest(a,b){this.iters=a,this.fillvalue=b,this.active=this.iters.length},iternext(){if(!this.active)return;let b;const c=[];for(let d=0;d zip_longest object\\\\n\\\\nReturn a zip_longest object whose .__next__() method returns a tuple where\\\\nthe i-th element comes from the i-th iterable argument. The .__next__()\\\\nmethod continues until the longest iterable in the argument sequence\\\\nis exhausted and then it raises StopIteration. When the shorter iterables\\\\nare exhausted, the fillvalue is substituted in their place. The fillvalue\\\\ndefaults to None or can be specified by a keyword argument.\\\\n\\\",tp$new(b,c){const[d]=Sk.abstr.copyKeywordsToNamedArgs(\\\"zip_longest\\\",[\\\"fillvalue\\\"],[],c,[Sk.builtin.none.none$]),e=[];for(let a=0;aa?-1:1:0>1/a?-1:1,a},o=18;return Sk.abstr.setUpModuleMethods(\\\"math\\\",l,{acos:{$meth:function acos(a){var b=Math.acos;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc cosine (measured in radians) of x.\\\"},acosh:{$meth:function acosh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a-1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic cosine of x.\\\"},asin:{$meth:function asin(a){var b=Math.asin;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc sine (measured in radians) of x.\\\"},asinh:{$meth:function asinh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a+1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic sine of x.\\\"},atan:{$meth:function atan(a){var b=Math.atan;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc tangent (measured in radians) of x.\\\"},atan2:{$meth:function atan2(a,b){var c=Math.atan2;return Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),new Sk.builtin.float_(c(Sk.builtin.asnum$(a),Sk.builtin.asnum$(b)))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, y, x, /)\\\",$doc:\\\"Return the arc tangent (measured in radians) of y/x.\\\\n\\\\nUnlike atan(y/x), the signs of both x and y are considered.\\\"},atanh:{$meth:function atanh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=(1+a)/(1-a);return new Sk.builtin.float_(e(b)/2)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic tangent of x.\\\"},ceil:{$meth:function ceil(a){var b=Math.ceil;Sk.builtin.pyCheckType(\\\"\\\",\\\"real number\\\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);return Sk.__future__.ceil_floor_int?new Sk.builtin.int_(b(c)):new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the ceiling of x as an Integral.\\\\n\\\\nThis is the smallest integer >= x.\\\"},copysign:{$meth:function copysign(a,b){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(b));const c=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(a),e=n(d),f=n(c);return new Sk.builtin.float_(d*(e*f))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return a float with the magnitude (absolute value) of x but the sign of y.\\\\n\\\\nOn platforms that support signed zeros, copysign(1.0, -0.0)\\\\nreturns -1.0.\\\\n\\\"},cos:{$meth:function cos(a){var b=Math.cos;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the cosine of x (measured in radians).\\\"},cosh:{$meth:function cosh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b+1/b)/2)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic cosine of x.\\\"},degrees:{$meth:function degrees(b){Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(b));const c=180/a*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Convert angle x from radians to degrees.\\\"},erf:{$meth:function erf(){throw new Sk.builtin.NotImplementedError(\\\"math.erf() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Error function at x.\\\"},erfc:{$meth:function erfc(){throw new Sk.builtin.NotImplementedError(\\\"math.erfc() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Complementary error function at x.\\\"},exp:{$meth:function exp(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));let b=a.v;if(\\\"number\\\"!=typeof b&&(b=a.nb$float().v),b==1/0||b==-Infinity||isNaN(b))return new Sk.builtin.float_(f(b));const c=f(b);if(!isFinite(c))throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return e raised to the power of x.\\\"},expm1:{$meth:function expm1(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(.7>k(b)){const a=f(b);if(1==a)return new Sk.builtin.float_(b);else{const c=(a-1)*b/e(a);return new Sk.builtin.float_(c)}}else{const a=f(b)-1;return new Sk.builtin.float_(a)}},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return exp(x)-1.\\\\n\\\\nThis function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\\\"},fabs:{$meth:function fabs(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));let b=a.v;return JSBI.__isBigInt(b)&&(b=a.nb$float().v),b=k(b),new Sk.builtin.float_(b)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the absolute value of the float x.\\\"},factorial:{$meth:function factorial(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));let b=Sk.builtin.asnum$(a);if(a=j(b),a!=b)throw new Sk.builtin.ValueError(\\\"factorial() only accepts integral values\\\");if(0>a)throw new Sk.builtin.ValueError(\\\"factorial() not defined for negative numbers\\\");let c=1;for(let b=2;b<=a&&b<=o;b++)c*=b;if(a<=o)return new Sk.builtin.int_(c);c=JSBI.BigInt(c);for(let b=19;b<=a;b++)c=JSBI.multiply(c,JSBI.BigInt(b));return new Sk.builtin.int_(c)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Find x!.\\\\n\\\\nRaise a ValueError if x is negative or non-integral.\\\"},floor:{$meth:function floor(a){return Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.__future__.ceil_floor_int?new Sk.builtin.int_(j(Sk.builtin.asnum$(a))):new Sk.builtin.float_(j(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the floor of x as an Integral.\\\\n\\\\nThis is the largest integer <= x.\\\"},fmod:{$meth:function fmod(a,b){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(b));let c=a.v,d=b.v;if(\\\"number\\\"!=typeof c&&(c=a.nb$float().v),\\\"number\\\"!=typeof d&&(d=b.nb$float().v),(d==1/0||d==-Infinity)&&isFinite(c))return new Sk.builtin.float_(c);const e=c%d;if(isNaN(e)&&!isNaN(c)&&!isNaN(d))throw new Sk.builtin.ValueError(\\\"math domain error\\\");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return fmod(x, y), according to platform C.\\\\n\\\\nx % y may differ.\\\"},frexp:{$meth:function frexp(a){var b=Math.max;Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a),d=[c,0];if(0!==c&&i(c)){const a=k(c);let e=b(-1023,j(h(a))+1),f=a*g(2,-e);for(;.5>f;)f*=2,e--;for(;1<=f;)f*=.5,e++;0>c&&(f=-f),d[0]=f,d[1]=e}return d[0]=new Sk.builtin.float_(d[0]),d[1]=new Sk.builtin.int_(d[1]),new Sk.builtin.tuple(d)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the mantissa and exponent of x, as pair (m, e).\\\\n\\\\nm is a float and e is an int, such that x = m * 2.**e.\\\\nIf x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.\\\"},fsum:{$meth:function fsum(a){if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError(\\\"'\\\"+Sk.abstr.typeName(a)+\\\"' object is not iterable\\\");let b=[];a=Sk.abstr.iter(a);let c,d,e;for(let f=a.tp$iternext();void 0!==f;f=a.tp$iternext()){Sk.builtin.pyCheckType(\\\"\\\",\\\"real number\\\",Sk.builtin.checkNumber(f)),c=0;let a=f.v;\\\"number\\\"!=typeof a&&(a=f.nb$float().v),f=a;for(let a,g=0,h=b.length;gb?-b:b,new Sk.builtin.int_(b)):(d=JSBI.BigInt(d),e=JSBI.BigInt(e),b=_biggcd(d,e),JSBI.lessThan(b,JSBI.__ZERO)&&(b=JSBI.multiply(b,JSBI.BigInt(-1))),new Sk.builtin.int_(b.toString()))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"greatest common divisor of x and y\\\"},hypot:{$meth:function hypot(a,c){return Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(c)),a=Sk.builtin.asnum$(a),c=Sk.builtin.asnum$(c),new Sk.builtin.float_(b(a*a+c*c))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return the Euclidean distance, sqrt(x*x + y*y).\\\"},isclose:{$meth:function isclose(c,d){Sk.abstr.checkArgsLen(\\\"isclose\\\",c,2,2),rel_abs_vals=Sk.abstr.copyKeywordsToNamedArgs(\\\"isclose\\\",[\\\"rel_tol\\\",\\\"abs_tol\\\"],[],d,[new Sk.builtin.float_(1e-9),new Sk.builtin.float_(0)]);const e=c[0],a=c[1],b=rel_abs_vals[0],f=rel_abs_vals[1];Sk.builtin.pyCheckType(\\\"a\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"b\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"rel_tol\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),Sk.builtin.pyCheckType(\\\"abs_tol\\\",\\\"number\\\",Sk.builtin.checkNumber(f));const g=Sk.builtin.asnum$(e),h=Sk.builtin.asnum$(a),i=Sk.builtin.asnum$(b),j=Sk.builtin.asnum$(f);if(0>i||0>j)throw new Sk.builtin.ValueError(\\\"tolerances must be non-negative\\\");if(g==h)return Sk.builtin.bool.true$;if(g==1/0||g==-Infinity||h==1/0||h==-Infinity)return Sk.builtin.bool.false$;const l=k(h-g),m=l<=k(i*h)||l<=k(i*g)||l<=j;return new Sk.builtin.bool(m)},$flags:{FastCall:!0},$textsig:\\\"($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\\\",$doc:\\\"Determine whether two floating point numbers are close in value.\\\\n\\\\n rel_tol\\\\n maximum difference for being considered \\\\\\\"close\\\\\\\", relative to the\\\\n magnitude of the input values\\\\n abs_tol\\\\n maximum difference for being considered \\\\\\\"close\\\\\\\", regardless of the\\\\n magnitude of the input values\\\\n\\\\nReturn True if a is close in value to b, and False otherwise.\\\\n\\\\nFor the values to be considered close, the difference between them\\\\nmust be smaller than at least one of the tolerances.\\\\n\\\\n-inf, inf and NaN behave similarly to the IEEE 754 Standard. That\\\\nis, NaN is not close to anything, even itself. inf and -inf are\\\\nonly close to themselves.\\\"},isfinite:{$meth:function isfinite(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.true$:isFinite(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return True if x is neither an infinity nor a NaN, and False otherwise.\\\"},isinf:{$meth:function isinf(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.false$:isFinite(b)||isNaN(b)?Sk.builtin.bool.false$:Sk.builtin.bool.true$},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return True if x is a positive or negative infinity, and False otherwise.\\\"},isnan:{$meth:function isnan(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return isNaN(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return True if x is a NaN (not a number), and False otherwise.\\\"},ldexp:{$meth:function ldexp(a,b){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"i\\\",\\\"integer\\\",Sk.builtin.checkInt(b));let c=a.v;\\\"number\\\"!=typeof c&&(c=a.nb$float().v);const d=Sk.builtin.asnum$(b);if(c==1/0||c==-Infinity||0==c||isNaN(c))return a;const e=c*g(2,d);if(!isFinite(e))throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, i, /)\\\",$doc:\\\"Return x * (2**i).\\\\n\\\\nThis is essentially the inverse of frexp().\\\"},lgamma:{$meth:function lgamma(){throw new Sk.builtin.NotImplementedError(\\\"math.lgamma() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Natural logarithm of absolute value of Gamma function at x.\\\"},log:{$meth:function log(a,b){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));let f,g,h=Sk.builtin.asnum$(a);if(0>=h)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(void 0===b?f=d:(Sk.builtin.pyCheckType(\\\"base\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),f=Sk.builtin.asnum$(b)),0>=f)throw new Sk.builtin.ValueError(\\\"math domain error\\\");else if(Sk.builtin.checkFloat(a)||he)throw new Sk.builtin.ValueError(\\\"math domain error\\\");else if(Sk.builtin.checkFloat(a)||e=c)throw new Sk.builtin.ValueError(\\\"math domain error\\\");else{if(0==c)return new Sk.builtin.float_(c);if(k(c)=c){const a=1+c,b=e(a)-(a-1-c)/a;return new Sk.builtin.float_(b)}else{const a=e(1+c);return new Sk.builtin.float_(a)}}},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the natural logarithm of 1+x (base e).\\\\n\\\\nThe result is computed in a way which is accurate for x near zero.\\\"},log2:{$meth:function log2(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));let b,d=Sk.builtin.asnum$(a);if(0>d)throw new Sk.builtin.ValueError(\\\"math domain error\\\");else if(Sk.builtin.checkFloat(a)||de)throw new Sk.builtin.ValueError(\\\"math domain error\\\");else{if(1==d)return new Sk.builtin.float_(1);if(i(d)&&i(e)&&0>d&&!c(e))throw new Sk.builtin.ValueError(\\\"math domain error\\\");else if(-1==d&&(e==-Infinity||e==1/0))return new Sk.builtin.float_(1)}const f=g(d,e);if(!i(d)||!i(e))return new Sk.builtin.float_(f);if(f==1/0||f==-Infinity)throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(f)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return x**y (x to the power of y).\\\"},radians:{$meth:function radians(b){Sk.builtin.pyCheckType(\\\"deg\\\",\\\"number\\\",Sk.builtin.checkNumber(b));const c=a/180*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Convert angle x from degrees to radians.\\\"},remainder:{$meth:function remainder(a,b){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(b));let d=a.v,e=b.v;if(\\\"number\\\"!=typeof d&&(d=a.nb$float().v),\\\"number\\\"!=typeof e&&(e=b.nb$float().v),isFinite(d)&&isFinite(e)){let a,b,f,c,g;if(0==e)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(a=k(d),b=k(e),c=a%b,f=b-c,cf)g=-f;else{if(c!=f)throw new Sk.builtin.AssertionError;g=c-2*(.5*(a-c)%b)}return new Sk.builtin.float_(n(d)*g)}if(isNaN(d))return a;if(isNaN(e))return b;if(d==1/0||d==-Infinity)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(e!=1/0&&e!=-Infinity)throw new Sk.builtin.AssertionError;return new Sk.builtin.float_(d)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Difference between x and the closest integer multiple of y.\\\\n\\\\nReturn x - n*y where n*y is the closest integer multiple of y.\\\\nIn the case where x is exactly halfway between two multiples of\\\\ny, the nearest even value of n is used. The result is always exact.\\\"},sin:{$meth:function sin(a){var b=Math.sin;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the sine of x (measured in radians).\\\"},sinh:{$meth:function sinh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b-1/b)/2)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic sine of x.\\\"},sqrt:{$meth:function sqrt(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);if(0>c)throw new Sk.builtin.ValueError(\\\"math domain error\\\");return new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the square root of x.\\\"},tan:{$meth:function tan(a){var b=Math.tan;return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the tangent of x (measured in radians).\\\"},tanh:{$meth:function tanh(a){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(0===b)return new Sk.builtin.float_(b);const c=g(d,b),e=1/c;return new Sk.builtin.float_((c-e)/2/((c+e)/2))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic tangent of x.\\\"},trunc:{$meth:function trunc(a){return Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.checkInt(a)?a:new Sk.builtin.int_(0|Sk.builtin.asnum$(a))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Truncates the Real x to the nearest Integral toward 0.\\\\n\\\\nUses the __trunc__ magic method.\\\"}}),l};\",\"src/lib/md5.py\":\"raise NotImplementedError(\\\"md5 is not yet implemented in Skulpt\\\")\\n\",\"src/lib/mhlib.py\":\"raise NotImplementedError(\\\"mhlib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/mimetools.py\":\"raise NotImplementedError(\\\"mimetools is not yet implemented in Skulpt\\\")\\n\",\"src/lib/mimetypes.py\":\"raise NotImplementedError(\\\"mimetypes is not yet implemented in Skulpt\\\")\\n\",\"src/lib/mimify.py\":\"raise NotImplementedError(\\\"mimify is not yet implemented in Skulpt\\\")\\n\",\"src/lib/modulefinder.py\":\"raise NotImplementedError(\\\"modulefinder is not yet implemented in Skulpt\\\")\\n\",\"src/lib/multifile.py\":\"raise NotImplementedError(\\\"multifile is not yet implemented in Skulpt\\\")\\n\",\"src/lib/multiprocessing/__init__.py\":\"raise NotImplementedError(\\\"multiprocessing is not yet implemented in Skulpt\\\")\\n\",\"src/lib/multiprocessing/dummy/__init__.py\":\"raise NotImplementedError(\\\"dummy is not yet implemented in Skulpt\\\")\\n\",\"src/lib/mutex.py\":\"raise NotImplementedError(\\\"mutex is not yet implemented in Skulpt\\\")\\n\",\"src/lib/netrc.py\":\"raise NotImplementedError(\\\"netrc is not yet implemented in Skulpt\\\")\\n\",\"src/lib/new.py\":\"raise NotImplementedError(\\\"new is not yet implemented in Skulpt\\\")\\n\",\"src/lib/nntplib.py\":\"raise NotImplementedError(\\\"nntplib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/ntpath.py\":\"raise NotImplementedError(\\\"ntpath is not yet implemented in Skulpt\\\")\\n\",\"src/lib/nturl2path.py\":\"raise NotImplementedError(\\\"nturl2path is not yet implemented in Skulpt\\\")\\n\",\"src/lib/numbers.py\":\"Number = (int, float, complex)\\nIntegral = int\\nComplex = complex\\n\",\"src/lib/opcode.py\":\"raise NotImplementedError(\\\"opcode is not yet implemented in Skulpt\\\")\\n\",\"src/lib/operator.js\":\"function $builtinmodule(){return operator={__name__:new Sk.builtin.str(\\\"operator\\\"),__doc__:new Sk.builtin.str(\\\"Operator interface.\\\\n\\\\nThis module exports a set of functions implemented in javascript corresponding\\\\nto the intrinsic operators of Python. For example, operator.add(x, y)\\\\nis equivalent to the expression x+y. The function names are those\\\\nused for special methods; variants without leading and trailing\\\\n'__' are also provided for convenience.\\\"),__all__:new Sk.builtin.list([\\\"abs\\\",\\\"add\\\",\\\"and_\\\",\\\"attrgetter\\\",\\\"concat\\\",\\\"contains\\\",\\\"countOf\\\",\\\"delitem\\\",\\\"eq\\\",\\\"floordiv\\\",\\\"ge\\\",\\\"getitem\\\",\\\"gt\\\",\\\"iadd\\\",\\\"iand\\\",\\\"iconcat\\\",\\\"ifloordiv\\\",\\\"ilshift\\\",\\\"imatmul\\\",\\\"imod\\\",\\\"imul\\\",\\\"index\\\",\\\"indexOf\\\",\\\"inv\\\",\\\"invert\\\",\\\"ior\\\",\\\"ipow\\\",\\\"irshift\\\",\\\"is_\\\",\\\"is_not\\\",\\\"isub\\\",\\\"itemgetter\\\",\\\"itruediv\\\",\\\"ixor\\\",\\\"le\\\",\\\"length_hint\\\",\\\"lshift\\\",\\\"lt\\\",\\\"matmul\\\",\\\"methodcaller\\\",\\\"mod\\\",\\\"mul\\\",\\\"ne\\\",\\\"neg\\\",\\\"not_\\\",\\\"or_\\\",\\\"pos\\\",\\\"pow\\\",\\\"rshift\\\",\\\"setitem\\\",\\\"sub\\\",\\\"truediv\\\",\\\"truth\\\",\\\"xor\\\"].map(a=>new Sk.builtin.str(a)))},operator.itemgetter=Sk.abstr.buildNativeClass(\\\"operator.itemgetter\\\",{constructor:function itemgetter(a){this.items=a,this.oneitem=1===a.length,this.item=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){return Sk.abstr.checkNoKwargs(\\\"itemgetter\\\",b),Sk.abstr.checkArgsLen(\\\"itemgetter\\\",a,1),new operator.itemgetter(a)},tp$call(a,b){Sk.abstr.checkNoKwargs(\\\"itemgetter\\\",b),Sk.abstr.checkArgsLen(\\\"itemgetter\\\",a,1,1);const c=a[0];return this.oneitem?Sk.abstr.objectGetItem(c,this.item,!0):new Sk.builtin.tuple(this.items.map(a=>Sk.abstr.objectGetItem(c,a)))},tp$doc:\\\"Return a callable object that fetches the given item(s) from its operand.\\\\n After f = itemgetter(2), the call f(r) returns r[2].\\\\n After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])\\\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\\\"(...)\\\");this.in$repr=!0;const a=this.tp$name+\\\"(\\\"+this.items.map(a=>Sk.misceval.objectRepr(a)).join(\\\", \\\")+\\\")\\\";return this.in$repr=!1,a}}}),operator.attrgetter=Sk.abstr.buildNativeClass(\\\"operator.attrgetter\\\",{constructor:function attrgetter(a){this.attrs=a,this.oneattr=1===a.length,this.attr=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkNoKwargs(\\\"attrgetter\\\",b),Sk.abstr.checkArgsLen(\\\"attrgetter\\\",a,1);const c=[];for(let d=0;dnew Sk.builtin.str(a))):c.push([b])}return new operator.attrgetter(c)},tp$call(a,b){Sk.abstr.checkNoKwargs(\\\"attrgetter\\\",b),Sk.abstr.checkArgsLen(\\\"attrgetter\\\",a,1,1);const c=a[0];if(this.oneattr)return this.attr.reduce((a,b)=>Sk.abstr.gattr(a,b),c);const d=this.attrs.map(a=>a.reduce((a,b)=>Sk.abstr.gattr(a,b),c));return new Sk.builtin.tuple(d)},tp$doc:\\\"attrgetter(attr, ...) --> attrgetter object\\\\n\\\\nReturn a callable object that fetches the given attribute(s) from its operand.\\\\nAfter f = attrgetter('name'), the call f(r) returns r.name.\\\\nAfter g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\\\\nAfter h = attrgetter('name.first', 'name.last'), the call h(r) returns\\\\n(r.name.first, r.name.last).\\\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\\\"(...)\\\");this.in$repr=!0;const a=this.tp$name+\\\"(\\\"+this.items.map(a=>Sk.misceval.objectRepr(a)).join(\\\", \\\")+\\\")\\\";return this.in$repr=!1,a}}}),operator.methodcaller=Sk.abstr.buildNativeClass(\\\"operator.methodcaller\\\",{constructor:function methodcaller(a,b,c){this.$name=a,this.args=b,this.kwargs=c||[],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkArgsLen(\\\"methodcaller\\\",a,1);const c=a[0];if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\\\"method name must be a string\\\");return new operator.methodcaller(c,a.slice(1),b)},tp$call(a,b){Sk.abstr.checkNoKwargs(\\\"methodcaller\\\",b),Sk.abstr.checkArgsLen(\\\"methodcaller\\\",a,1,1);const c=a[0];return Sk.misceval.chain(Sk.abstr.gattr(c,this.$name,!0),a=>Sk.misceval.callsimOrSuspendArray(a,this.args,this.kwargs))},tp$doc:\\\"methodcaller(name, ...) --> methodcaller object\\\\n\\\\nReturn a callable object that calls the given method on its operand.\\\\nAfter f = methodcaller('name'), the call f(r) returns r.name().\\\\nAfter g = methodcaller('name', 'date', foo=1), the call g(r) returns\\\\nr.name('date', foo=1).\\\",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+\\\"(...)\\\");this.in$repr=!0;let a=[Sk.misceval.objectRepr(this.$name),...this.args.map(a=>Sk.misceval.objectRepr(a))];for(let b=0;b= b.\\\"},gt:{$meth:function gt(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\\\"Gt\\\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a > b.\\\"},not_:{$meth:function not_(a){return Sk.abstr.numberUnaryOp(a,\\\"Not\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as not a.\\\"},truth:{$meth:function truth(a){return Sk.builtin.bool(a)},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Return True if a is true, False otherwise.\\\"},is_:{$meth:function is_(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\\\"Is\\\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a is b.\\\"},is_not:{$meth:function is_not(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,\\\"IsNot\\\"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a is not b.\\\"},abs:{$meth:function abs(a){return Sk.builtin.abs(a)},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as abs(a).\\\"},add:{$meth:function add(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Add\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a + b.\\\"},and_:{$meth:function and_(c,a){return Sk.abstr.numberBinOp(c,a,\\\"BitAnd\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a & b.\\\"},floordiv:{$meth:function floordiv(c,a){return Sk.abstr.numberBinOp(c,a,\\\"FloorDiv\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a // b.\\\"},index:{$meth:function index(b){return new Sk.builtin.int_(Sk.misceval.asIndexOrThrow(b))},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as a.__index__()\\\"},inv:{$meth:function inv(a){return Sk.abstr.numberUnaryOp(a,\\\"Invert\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as ~a.\\\"},invert:{$meth:function invert(a){return Sk.abstr.numberUnaryOp(a,\\\"Invert\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as ~a.\\\"},lshift:{$meth:function lshift(c,a){return Sk.abstr.numberBinOp(c,a,\\\"LShift\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a << b.\\\"},mod:{$meth:function mod(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Mod\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a % b.\\\"},mul:{$meth:function mul(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Mult\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a * b.\\\"},matmul:{$meth:function matmul(c,a){return Sk.abstr.numberBinOp(c,a,\\\"MatMult\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a @ b.\\\"},neg:{$meth:function neg(a){return Sk.abstr.numberUnaryOp(a,\\\"USub\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as -a.\\\"},or_:{$meth:function or_(c,a){return Sk.abstr.numberBinOp(c,a,\\\"BitOr\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a | b.\\\"},pos:{$meth:function pos(a){return Sk.abstr.numberUnaryOp(a,\\\"UAdd\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, a, /)\\\",$doc:\\\"Same as +a.\\\"},pow:{$meth:function pow(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Pow\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a ** b.\\\"},rshift:{$meth:function rshift(c,a){return Sk.abstr.numberBinOp(c,a,\\\"RShift\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a >> b.\\\"},sub:{$meth:function sub(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Sub\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a - b.\\\"},truediv:{$meth:function div(c,a){return Sk.abstr.numberBinOp(c,a,\\\"Div\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a / b.\\\"},xor:{$meth:function xor(c,a){return Sk.abstr.numberBinOp(c,a,\\\"BitXor\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a ^ b.\\\"},concat:{$meth:function concat(c,a){return Sk.abstr.sequenceConcat(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a + b, for a and b sequences.\\\"},contains:{$meth:function contains(c,a){return Sk.builtin.bool(Sk.abstr.sequenceContains(c,a))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as b in a (note reversed operands).\\\"},countOf:{$meth:function countOf(c,a){return Sk.abstr.sequenceGetCountOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Return the number of times b occurs in a.\\\"},delitem:{$meth:function delitem(c,a){return Sk.misceval.chain(Sk.abstr.objectDelItem(c,a,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as del a[b].\\\"},getitem:{$meth:function getitem(c,a){return Sk.abstr.objectGetItem(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a[b].\\\"},indexOf:{$meth:function indexOf(c,a){return Sk.abstr.sequenceGetIndexOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Return the first index of b in a.\\\"},setitem:{$meth:function setitem(d,a,b){return Sk.misceval.chain(Sk.abstr.objectSetItem(d,a,b,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:3,MaxArgs:3},$textsig:\\\"($module, a, b, c, /)\\\",$doc:\\\"Same as a[b] = c.\\\"},length_hint:{$meth:function length_hint(a,b){if(void 0===b)b=new Sk.builtin.int_(0);else if(!Sk.builtin.checkInt(b))throw new Sk.builtin.TypeError(\\\"'\\\"+Sk.abstr.typeName(b)+\\\"' object cannot be interpreted as an integer\\\");try{return Sk.builtin.len(a)}catch(a){if(!(a instanceof Sk.builtin.TypeError))throw a}const c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$length_hint);if(void 0!==c){const a=Sk.misceval.callsimArray(c,[]);if(a===Sk.builtin.NotImplemented.NotImplemented$)return b;if(!Sk.builtin.checkInteger(a))throw new Sk.builtin.TypeError(\\\"__length_hint__ must be an integer, not \\\"+Sk.abstr.typeName(a));else if(a.nb$isnegative())throw new Sk.builtin.TypeError(\\\"__length_hint__() should return >= 0\\\");return a}return b},$flags:{MinArgs:1,MaxArgs:2},$textsig:\\\"($module, obj, default=0, /)\\\",$doc:\\\"Return an estimate of the number of items in obj.\\\\n\\\\nThis is useful for presizing containers when building from an iterable.\\\\n\\\\nIf the object supports len(), the result will be exact.\\\\nOtherwise, it may over- or under-estimate by an arbitrary amount.\\\\nThe result will be an integer >= 0.\\\"},iadd:{$meth:function iadd(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Add\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a += b.\\\"},iand:{$meth:function iand(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"BitAnd\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a &= b.\\\"},iconcat:{$meth:function iconcat(c,a){if(void 0!==c.sq$inplace_concat)return c.sq$inplace_concat(a);if(void 0!==c.sq$concat)return c.sq$concat(a);if(!Sk.builtin.checkSequence(c)||!Sk.builtin.checkSequence(a))throw new Sk.builtin.TypeError(Sk.abstr.typeName(c)+\\\" object can't be concatenated\\\");return Sk.abstr.numberInplaceBinOp(c,a,\\\"Add\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a += b, for a and b sequences.\\\"},ifloordiv:{$meth:function ifloordiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"FloorDiv\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a //= b.\\\"},ilshift:{$meth:function ilshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"LShift\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a <<= b.\\\"},imod:{$meth:function imod(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Mod\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a %= b.\\\"},imul:{$meth:function imul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Mult\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a *= b.\\\"},imatmul:{$meth:function imatmul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"MatMult\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a @= b.\\\"},ior:{$meth:function ior(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"BitOr\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a |= b.\\\"},ipow:{$meth:function ipow(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Pow\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a **= b.\\\"},irshift:{$meth:function irshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"LRhift\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a >>= b.\\\"},isub:{$meth:function isub(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Sub\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a -= b.\\\"},itruediv:{$meth:function idiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"Div\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a /= b.\\\"},ixor:{$meth:function ixor(c,a){return Sk.abstr.numberInplaceBinOp(c,a,\\\"BitXor\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, a, b, /)\\\",$doc:\\\"Same as a ^= b.\\\"}}),Object.assign(operator,{__abs__:operator.abs,__add__:operator.add,__and__:operator.and,__concat__:operator.concat,__contains__:operator.contains,__delitem__:operator.delitem,__eq__:operator.eq,__floordiv__:operator.floordiv,__ge__:operator.ge,__getitem__:operator.getitem,__gt__:operator.gt,__iadd__:operator.iadd,__iand__:operator.iand,__iconcat__:operator.iconcat,__ifloordiv__:operator.ifloordiv,__ilshift__:operator.ilshift,__imatmul__:operator.imatmul,__imod__:operator.imod,__imul__:operator.imul,__index__:operator.index,__inv__:operator.inv,__invert__:operator.invert,__ior__:operator.ior,__ipow__:operator.ipow,__irshift__:operator.irshift,__isub__:operator.isub,__itruediv__:operator.itruediv,__ixor__:operator.ixor,__le__:operator.le,__lshift__:operator.lshift,__lt__:operator.lt,__matmul__:operator.matmul,__mod__:operator.mod,__mul__:operator.mul,__ne__:operator.ne,__neg__:operator.neg,__not__:operator.not,__or__:operator.or,__pos__:operator.pos,__pow__:operator.pow,__rshift__:operator.rshift,__setitem__:operator.setitem,__sub__:operator.sub,__truediv__:operator.truediv,__xor__:operator.xor,_abs:Sk.builtins.abs,div:operator.truediv,__div__:operator.truediv}),operator}\",\"src/lib/optparse.py\":\"raise NotImplementedError(\\\"optparse is not yet implemented in Skulpt\\\")\\n\",\"src/lib/os.py\":\"raise NotImplementedError(\\\"os is not yet implemented in Skulpt\\\")\\n\",\"src/lib/os2emxpath.py\":\"raise NotImplementedError(\\\"os2emxpath is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pdb.py\":\"raise NotImplementedError(\\\"pdb is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pickle.py\":\"raise NotImplementedError(\\\"pickle is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pickletools.py\":\"raise NotImplementedError(\\\"pickletools is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pipes.py\":\"raise NotImplementedError(\\\"pipes is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pkgutil.py\":\"raise NotImplementedError(\\\"pkgutil is not yet implemented in Skulpt\\\")\\n\",\"src/lib/platform.js\":\"var $builtinmodule=function(){var a={},b=\\\"undefined\\\"!=typeof window&&\\\"undefined\\\"!=typeof window.navigator;return a.python_implementation=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\\\"python_implementation\\\",arguments.length,0,0),new Sk.builtin.str(\\\"Skulpt\\\")}),a.node=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\\\"node\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")}),a.version=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\\\"version\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")}),a.python_version=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\\\"python_version\\\",arguments.length,0,0),a=Sk.__future__.python_version?\\\"3.2.0\\\":\\\"2.7.0\\\",new Sk.builtin.str(a)}),a.system=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\\\"system\\\",arguments.length,0,0),a=b?window.navigator.appCodeName:\\\"\\\",new Sk.builtin.str(a)}),a.machine=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\\\"machine\\\",arguments.length,0,0),a=b?window.navigator.platform:\\\"\\\",new Sk.builtin.str(a)}),a.release=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen(\\\"release\\\",arguments.length,0,0),a=b?window.navigator.appVersion:\\\"\\\",new Sk.builtin.str(a)}),a.architecture=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\\\"architecture\\\",arguments.length,0,0),new Sk.builtin.tuple([new Sk.builtin.str(\\\"64bit\\\"),new Sk.builtin.str(\\\"\\\")])}),a.processor=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen(\\\"processor\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")}),a};\",\"src/lib/platform.py\":\"raise NotImplementedError(\\\"platform is not yet implemented in Skulpt\\\")\\n\",\"src/lib/plistlib.py\":\"raise NotImplementedError(\\\"plistlib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/popen2.py\":\"raise NotImplementedError(\\\"popen2 is not yet implemented in Skulpt\\\")\\n\",\"src/lib/poplib.py\":\"raise NotImplementedError(\\\"poplib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/posixfile.py\":\"raise NotImplementedError(\\\"posixfile is not yet implemented in Skulpt\\\")\\n\",\"src/lib/posixpath.py\":\"raise NotImplementedError(\\\"posixpath is not yet implemented in Skulpt\\\")\\n\",\"src/lib/pprint.py\":\"raise NotImplementedError(\\\"pprint is not yet implemented in Skulpt\\\")\\n\",\"src/lib/processing.js\":\"var $builtinmodule=function(){var b,c,d,e,f,g,h,a=Math.PI,j={__name__:new Sk.builtin.str(\\\"processing\\\")},k=[],l=!0,m=null;return j.processing=null,j.p=null,j.X=new Sk.builtin.int_(0),j.Y=new Sk.builtin.int_(1),j.Z=new Sk.builtin.int_(2),j.R=new Sk.builtin.int_(3),j.G=new Sk.builtin.int_(4),j.B=new Sk.builtin.int_(5),j.A=new Sk.builtin.int_(6),j.U=new Sk.builtin.int_(7),j.V=new Sk.builtin.int_(8),j.NX=new Sk.builtin.int_(9),j.NY=new Sk.builtin.int_(10),j.NZ=new Sk.builtin.int_(11),j.EDGE=new Sk.builtin.int_(12),j.SR=new Sk.builtin.int_(13),j.SG=new Sk.builtin.int_(14),j.SB=new Sk.builtin.int_(15),j.SA=new Sk.builtin.int_(16),j.SW=new Sk.builtin.int_(17),j.TX=new Sk.builtin.int_(18),j.TY=new Sk.builtin.int_(19),j.TZ=new Sk.builtin.int_(20),j.VX=new Sk.builtin.int_(21),j.VY=new Sk.builtin.int_(22),j.VZ=new Sk.builtin.int_(23),j.VW=new Sk.builtin.int_(24),j.AR=new Sk.builtin.int_(25),j.AG=new Sk.builtin.int_(26),j.AB=new Sk.builtin.int_(27),j.DR=new Sk.builtin.int_(3),j.DG=new Sk.builtin.int_(4),j.DB=new Sk.builtin.int_(5),j.DA=new Sk.builtin.int_(6),j.SPR=new Sk.builtin.int_(28),j.SPG=new Sk.builtin.int_(29),j.SPB=new Sk.builtin.int_(30),j.SHINE=new Sk.builtin.int_(31),j.ER=new Sk.builtin.int_(32),j.EG=new Sk.builtin.int_(33),j.EB=new Sk.builtin.int_(34),j.BEEN_LIT=new Sk.builtin.int_(35),j.VERTEX_FIELD_COUNT=new Sk.builtin.int_(36),j.CENTER=new Sk.builtin.int_(3),j.RADIUS=new Sk.builtin.int_(2),j.CORNERS=new Sk.builtin.int_(1),j.CORNER=new Sk.builtin.int_(0),j.DIAMETER=new Sk.builtin.int_(3),j.BASELINE=new Sk.builtin.int_(0),j.TOP=new Sk.builtin.int_(101),j.BOTTOM=new Sk.builtin.int_(102),j.NORMAL=new Sk.builtin.int_(1),j.NORMALIZED=new Sk.builtin.int_(1),j.IMAGE=new Sk.builtin.int_(2),j.MODEL=new Sk.builtin.int_(4),j.SHAPE=new Sk.builtin.int_(5),j.AMBIENT=new Sk.builtin.int_(0),j.DIRECTIONAL=new Sk.builtin.int_(1),j.SPOT=new Sk.builtin.int_(3),j.RGB=new Sk.builtin.int_(1),j.ARGB=new Sk.builtin.int_(2),j.HSB=new Sk.builtin.int_(3),j.ALPHA=new Sk.builtin.int_(4),j.CMYK=new Sk.builtin.int_(5),j.TIFF=new Sk.builtin.int_(0),j.TARGA=new Sk.builtin.int_(1),j.JPEG=new Sk.builtin.int_(2),j.GIF=new Sk.builtin.int_(3),j.MITER=new Sk.builtin.str(\\\"miter\\\"),j.BEVEL=new Sk.builtin.str(\\\"bevel\\\"),j.ROUND=new Sk.builtin.str(\\\"round\\\"),j.SQUARE=new Sk.builtin.str(\\\"butt\\\"),j.PROJECT=new Sk.builtin.str(\\\"square\\\"),j.P2D=new Sk.builtin.int_(1),j.JAVA2D=new Sk.builtin.int_(1),j.WEBGL=new Sk.builtin.int_(2),j.P3D=new Sk.builtin.int_(2),j.OPENGL=new Sk.builtin.int_(2),j.PDF=new Sk.builtin.int_(0),j.DXF=new Sk.builtin.int_(0),j.OTHER=new Sk.builtin.int_(0),j.WINDOWS=new Sk.builtin.int_(1),j.MAXOSX=new Sk.builtin.int_(2),j.LINUX=new Sk.builtin.int_(3),j.EPSILON=new Sk.builtin.float_(1e-4),j.MAX_FLOAT=new Sk.builtin.float_(34028235e31),j.MIN_FLOAT=new Sk.builtin.float_(-34028235e31),j.MAX_INT=new Sk.builtin.int_(2147483647),j.MIN_INT=new Sk.builtin.int_(-2147483648),j.HALF_PI=new Sk.builtin.float_(a/2),j.THIRD_PI=new Sk.builtin.float_(a/3),j.PI=new Sk.builtin.float_(a),j.TWO_PI=new Sk.builtin.float_(2*a),j.TAU=new Sk.builtin.float_(2*a),j.QUARTER_PI=new Sk.builtin.float_(a/4),j.DEG_TO_RAD=new Sk.builtin.float_(a/180),j.RAD_TO_DEG=new Sk.builtin.float_(180/a),j.WHITESPACE=new Sk.builtin.str(\\\" \\\\t\\\\n\\\\r\\\\f\\\\xA0\\\"),j.POINT=new Sk.builtin.int_(2),j.POINTS=new Sk.builtin.int_(2),j.LINE=new Sk.builtin.int_(4),j.LINES=new Sk.builtin.int_(4),j.TRIANGLE=new Sk.builtin.int_(8),j.TRIANGLES=new Sk.builtin.int_(9),j.TRIANGLE_FAN=new Sk.builtin.int_(11),j.TRIANGLE_STRIP=new Sk.builtin.int_(10),j.QUAD=new Sk.builtin.int_(16),j.QUADS=new Sk.builtin.int_(16),j.QUAD_STRIP=new Sk.builtin.int_(17),j.POLYGON=new Sk.builtin.int_(20),j.PATH=new Sk.builtin.int_(21),j.RECT=new Sk.builtin.int_(30),j.ELLIPSE=new Sk.builtin.int_(31),j.ARC=new Sk.builtin.int_(32),j.SPHERE=new Sk.builtin.int_(40),j.BOX=new Sk.builtin.int_(41),j.GROUP=new Sk.builtin.int_(0),j.PRIMITIVE=new Sk.builtin.int_(1),j.GEOMETRY=new Sk.builtin.int_(3),j.VERTEX=new Sk.builtin.int_(0),j.BEZIER_VERTEX=new Sk.builtin.int_(1),j.CURVE_VERTEX=new Sk.builtin.int_(2),j.BREAK=new Sk.builtin.int_(3),j.CLOSESHAPE=new Sk.builtin.int_(4),j.REPLACE=new Sk.builtin.int_(0),j.BLEND=new Sk.builtin.int_(1),j.ADD=new Sk.builtin.int_(2),j.SUBTRACT=new Sk.builtin.int_(4),j.LIGHTEST=new Sk.builtin.int_(8),j.DARKEST=new Sk.builtin.int_(16),j.DIFFERENCE=new Sk.builtin.int_(32),j.EXCLUSION=new Sk.builtin.int_(64),j.MULTIPLY=new Sk.builtin.int_(128),j.SCREEN=new Sk.builtin.int_(256),j.OVERLAY=new Sk.builtin.int_(512),j.HARD_LIGHT=new Sk.builtin.int_(1024),j.SOFT_LIGHT=new Sk.builtin.int_(2048),j.DODGE=new Sk.builtin.int_(4096),j.BURN=new Sk.builtin.int_(8192),j.ALPHA_MASK=new Sk.builtin.int_(4278190080),j.RED_MASK=new Sk.builtin.int_(16711680),j.GREEN_MASK=new Sk.builtin.int_(65280),j.BLUE_MASK=new Sk.builtin.int_(255),j.CUSTOM=new Sk.builtin.int_(0),j.ORTHOGRAPHIC=new Sk.builtin.int_(2),j.PERSPECTIVE=new Sk.builtin.int_(3),j.ARROW=new Sk.builtin.str(\\\"default\\\"),j.CROSS=new Sk.builtin.str(\\\"crosshair\\\"),j.HAND=new Sk.builtin.str(\\\"pointer\\\"),j.MOVE=new Sk.builtin.str(\\\"move\\\"),j.TEXT=new Sk.builtin.str(\\\"text\\\"),j.WAIT=new Sk.builtin.str(\\\"wait\\\"),j.NOCURSOR=Sk.builtin.assk$(\\\"url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto\\\"),j.DISABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(1),j.ENABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(-1),j.ENABLE_OPENGL_4X_SMOOTH=new Sk.builtin.int_(2),j.ENABLE_NATIVE_FONTS=new Sk.builtin.int_(3),j.DISABLE_DEPTH_TEST=new Sk.builtin.int_(4),j.ENABLE_DEPTH_TEST=new Sk.builtin.int_(-4),j.ENABLE_DEPTH_SORT=new Sk.builtin.int_(5),j.DISABLE_DEPTH_SORT=new Sk.builtin.int_(-5),j.DISABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(6),j.ENABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(-6),j.ENABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(7),j.DISABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(-7),j.HINT_COUNT=new Sk.builtin.int_(10),j.OPEN=new Sk.builtin.int_(1),j.CLOSE=new Sk.builtin.int_(2),j.BLUR=new Sk.builtin.int_(11),j.GRAY=new Sk.builtin.int_(12),j.INVERT=new Sk.builtin.int_(13),j.OPAQUE=new Sk.builtin.int_(14),j.POSTERIZE=new Sk.builtin.int_(15),j.THRESHOLD=new Sk.builtin.int_(16),j.ERODE=new Sk.builtin.int_(17),j.DILATE=new Sk.builtin.int_(18),j.BACKSPACE=new Sk.builtin.int_(8),j.TAB=new Sk.builtin.int_(9),j.ENTER=new Sk.builtin.int_(10),j.RETURN=new Sk.builtin.int_(13),j.ESC=new Sk.builtin.int_(27),j.DELETE=new Sk.builtin.int_(127),j.CODED=new Sk.builtin.int_(65535),j.SHIFT=new Sk.builtin.int_(16),j.CONTROL=new Sk.builtin.int_(17),j.ALT=new Sk.builtin.int_(18),j.CAPSLK=new Sk.builtin.int_(20),j.PGUP=new Sk.builtin.int_(33),j.PGDN=new Sk.builtin.int_(34),j.END=new Sk.builtin.int_(35),j.HOME=new Sk.builtin.int_(36),j.LEFT=new Sk.builtin.int_(37),j.UP=new Sk.builtin.int_(38),j.RIGHT=new Sk.builtin.int_(39),j.DOWN=new Sk.builtin.int_(40),j.F1=new Sk.builtin.int_(112),j.F2=new Sk.builtin.int_(113),j.F3=new Sk.builtin.int_(114),j.F4=new Sk.builtin.int_(115),j.F5=new Sk.builtin.int_(116),j.F6=new Sk.builtin.int_(117),j.F7=new Sk.builtin.int_(118),j.F8=new Sk.builtin.int_(119),j.F9=new Sk.builtin.int_(120),j.F10=new Sk.builtin.int_(121),j.F11=new Sk.builtin.int_(122),j.F12=new Sk.builtin.int_(123),j.NUMLK=new Sk.builtin.int_(144),j.META=new Sk.builtin.int_(157),j.INSERT=new Sk.builtin.int_(155),j.SINCOS_LENGTH=new Sk.builtin.int_(720),j.PRECISIONB=new Sk.builtin.int_(15),j.PRECISIONF=new Sk.builtin.int_(32768),j.PREC_MAXVAL=new Sk.builtin.int_(32767),j.PREC_ALPHA_SHIFT=new Sk.builtin.int_(9),j.PREC_RED_SHIFT=new Sk.builtin.int_(1),j.NORMAL_MODE_AUTO=new Sk.builtin.int_(0),j.NORMAL_MODE_SHAPE=new Sk.builtin.int_(1),j.NORMAL_MODE_VERTEX=new Sk.builtin.int_(2),j.MAX_LIGHTS=new Sk.builtin.int_(8),j.line=new Sk.builtin.func(function(a,b,c,d){j.processing.line(a.v,b.v,c.v,d.v)}),j.ellipse=new Sk.builtin.func(function(a,b,c,d){j.processing.ellipse(a.v,b.v,c.v,d.v)}),j.text=new Sk.builtin.func(function(a,b,c){j.processing.text(a.v,b.v,c.v)}),j.point=new Sk.builtin.func(function(a,b){j.processing.point(a.v,b.v)}),j.arc=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.arc(a.v,b.v,c.v,d.v,e.v,f.v)}),j.quad=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.quad(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.rect=new Sk.builtin.func(function(a,b,c,d,e){\\\"undefined\\\"==typeof e?j.processing.rect(a.v,b.v,c.v,d.v):j.processing.rect(a.v,b.v,c.v,d.v,e.v)}),j.triangle=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.triangle(a.v,b.v,c.v,d.v,e.v,f.v)}),j.bezier=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){\\\"undefined\\\"==typeof i?j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.alpha=new Sk.builtin.func(function(a,c,d){return\\\"undefined\\\"==typeof c?new Sk.builtin.float_(j.processing.alpha(a.v)):\\\"undefined\\\"==typeof d?new Sk.builtin.float_(j.processing.alpha(a.v,c.v)):new Sk.builtin.float_(j.processing.alpha(a.v,c.v,d.v))}),j.ambient=new Sk.builtin.func(function(a,c,d){\\\"undefined\\\"==typeof c?j.processing.ambient(a.v):\\\"undefined\\\"==typeof d?j.processing.ambient(a.v,c.v):j.processing.ambient(a.v,c.v,d.v)}),j.ambientLight=new Sk.builtin.func(function(a,b,c,d,e,f){\\\"undefined\\\"==typeof d?j.processing.ambientLight(a.v,b.v,c.v):\\\"undefined\\\"==typeof e?j.processing.ambientLight(a.v,b.v,c.v,d.v):\\\"undefined\\\"==typeof f?j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v):j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.beginCamera=new Sk.builtin.func(function(){j.processing.beginCamera()}),j.beginShape=new Sk.builtin.func(function(a){\\\"undefined\\\"==typeof a&&(a=j.POLYGON),j.processing.beginShape(a.v)}),j.bezierDetail=new Sk.builtin.func(function(a){a=\\\"undefined\\\"==typeof a?20:a.v,j.processing.bezierDetail(a)}),j.bezierPoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierPoint(e.v,a.v,b.v,c.v,d.v)}),j.bezierTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierTangent(e.v,a.v,b.v,c.v,d.v)}),j.bezierVertex=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){\\\"undefined\\\"==typeof g?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v):\\\"undefined\\\"==typeof h?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v):\\\"undefined\\\"==typeof i?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.blend=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v)}),j.blendColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.blendColor(a.v,b.v,d.v),e}),j.brightness=new Sk.builtin.func(function(a,c,d){return\\\"undefined\\\"==typeof c?new Sk.builtin.float_(j.processing.brightness(a.v)):\\\"undefined\\\"==typeof d?new Sk.builtin.float_(j.processing.brightness(a.v,c.v)):new Sk.builtin.float_(j.processing.brightness(a.v,c.v,d.v))}),j.camera=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){\\\"undefined\\\"==typeof a?j.processing.camera():j.processing.camera(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.constrain=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.constrain(a.v,b.v,c.v))}),j.copy=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.createFont=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PFont);return e.v=\\\"undefined\\\"==typeof c?j.processing.createFont(a.v,b.v):\\\"undefined\\\"==typeof d?j.processing.createFont(a.v,b.v,c.v):j.processing.createFont(a.v,b.v,c.v,d.v),e}),j.createGraphics=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PGraphics);return e.v=\\\"undefined\\\"==typeof d?j.processing.createGraphics(a.v,b.v,c.v):j.processing.createGraphics(a.v,b.v,c.v,d.v),e}),j.createImage=new Sk.builtin.func(function(a,b,c){var d=Sk.misceval.callsimArray(j.PImage);return d.v=j.processing.createImage(a.v,b.v,c.v),d}),j.cursor=new Sk.builtin.func(function(a,b,c){\\\"undefined\\\"==typeof a?j.processing.cursor():\\\"undefined\\\"==typeof b?j.processing.cursor(a.v):\\\"undefined\\\"==typeof c?j.processing.cursor(a.v,b.v):j.processing.cursor(a.v,b.v,c.v)}),j.curve=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){\\\"undefined\\\"==typeof i?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):\\\"undefined\\\"==typeof k?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):\\\"undefined\\\"==typeof l?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v):\\\"undefined\\\"==typeof m?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v):j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.curveDetail=new Sk.builtin.func(function(a){j.processing.curveDetail(a.v)}),j.curvePoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curvePoint(e.v,a.v,b.v,c.v,d.v)}),j.curveTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curveTangent(e.v,a.v,b.v,c.v,d.v)}),j.curveTightness=new Sk.builtin.func(function(a){j.processing.curveTightness(a.v)}),j.curveVertex=new Sk.builtin.func(function(a,b,c){\\\"undefined\\\"==typeof c?j.processing.curveVertex(a.v,b.v):j.processing.curveVertex(a.v,b.v,c.v)}),j.day=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.day())}),j.degrees=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.degrees(a.v))}),j.directionalLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.directionalLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.dist=new Sk.builtin.func(function(a,b,c,d,e,f){return\\\"undefined\\\"==typeof e?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v)):\\\"undefined\\\"==typeof f?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v)):new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v,f.v))}),j.emissive=new Sk.builtin.func(function(a,b,c){\\\"undefined\\\"==typeof b?j.processing.emissive(a.v):\\\"undefined\\\"==typeof c?j.processing.emissive(a.v,b.v):j.processing.emissive(a.v,b.v,c.v)}),j.endCamera=new Sk.builtin.func(function(){j.processing.endCamera()}),j.endShape=new Sk.builtin.func(function(a){\\\"undefined\\\"==typeof a?j.processing.endShape():j.processing.endShape(a.v)}),j.filter=new Sk.builtin.func(function(a,b){\\\"undefined\\\"==typeof b?j.processing.filter(a.v):j.processing.filter(a.v,b.v)}),j.frustum=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.frustum(a,b,c,d,e,f)}),j.hint=new Sk.builtin.func(function(a){j.processing.hint(a)}),j.hour=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.hour())}),j.hue=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.hue(a.v))}),j.imageMode=new Sk.builtin.func(function(a){j.processing.imageMode(a.v)}),j.lerp=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.lerp(a.v,b.v,c.v))}),j.lerpColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.lerpColor(a.v,b.v,d.v),e}),j.lightFalloff=new Sk.builtin.func(function(a,b,c){j.processing.lightFalloff(a.v,b.v,c.v)}),j.lights=new Sk.builtin.func(function(){j.processing.lights()}),j.lightSpecular=new Sk.builtin.func(function(a,b,c){j.processing.lightSpecular(a.v,b.v,c.v)}),j.loadBytes=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadBytes(a.v))}),j.loadFont=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PFont);return b.v=j.processing.loadFont(a.v),b}),j.loadShape=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PShapeSVG,[new Sk.builtin.str(\\\"string\\\"),a]);return b}),j.loadStrings=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadStrings(a.v))}),j.mag=new Sk.builtin.func(function(d,a,b){return\\\"undefined\\\"==typeof b?new Sk.builtin.float_(j.processing.mag(d.v,a.v)):new Sk.builtin.float_(j.processing.mag(d.v,a.v,b.v))}),j.map=new Sk.builtin.func(function(a,b,c,d,e){return new Sk.builtin.float_(j.processing.map(a.v,b.v,c.v,d.v,e.v))}),j.millis=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.millis())}),j.minute=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.minute())}),j.modelX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelX(a.v,b.v,c.v))}),j.modelY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelY(a.v,b.v,c.v))}),j.modelZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelZ(a.v,b.v,c.v))}),j.month=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.month())}),j.noCursor=new Sk.builtin.func(function(){j.processing.noCursor()}),j.noise=new Sk.builtin.func(function(a,b,c){return\\\"undefined\\\"==typeof b?new Sk.builtin.float_(j.processing.noise(a.v)):\\\"undefined\\\"==typeof c?new Sk.builtin.float_(j.processing.noise(a.v,b.v)):new Sk.builtin.float_(j.processing.noise(a.v,b.v,c.v))}),j.noiseDetail=new Sk.builtin.func(function(a,b){j.processing.noiseDetail(a.v,b.v)}),j.noiseSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.noiseSeed(a.v))}),j.noLights=new Sk.builtin.func(function(){j.processing.noLights()}),j.norm=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.norm(a.v,b.v,c.v))}),j.normal=new Sk.builtin.func(function(a,b,c){j.processing.normal(a.v,b.v,c.v)}),j.noTint=new Sk.builtin.func(function(){j.processing.noTint()}),j.ortho=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.ortho(a.v,b.v,c.v,d.v,e.v,f.v)}),j.perspective=new Sk.builtin.func(function(a,b,c,d){\\\"undefined\\\"==typeof a?j.processing.perspective():\\\"undefined\\\"==typeof b?j.processing.perspective(a.v):\\\"undefined\\\"==typeof c?j.processing.perspective(a.v,b.v):\\\"undefined\\\"==typeof d?j.processing.perspective(a.v,b.v,c.v):j.processing.perspective(a.v,b.v,c.v,d.v)}),j.pointLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.pointLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.printCamera=new Sk.builtin.func(function(){j.processing.printCamera()}),j.println=new Sk.builtin.func(function(a){j.processing.println(a.v)}),j.printProjection=new Sk.builtin.func(function(){j.processing.printProjection()}),j.radians=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.radians(a.v))}),j.randomSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.randomSeed(a.v))}),j.random=new Sk.builtin.func(function(a,b){return\\\"undefined\\\"==typeof a?new Sk.builtin.float_(j.processing.random()):\\\"undefined\\\"==typeof b?new Sk.builtin.float_(j.processing.random(a.v)):new Sk.builtin.float_(j.processing.random(a.v,b.v))}),j.requestImage=new Sk.builtin.func(function(a,b){var c=Sk.misceval.callsimArray(j.PImage);return c.v=\\\"undefined\\\"==typeof b?j.processing.requestImage(a.v):j.processing.requestImage(a.v,b.v),c}),j.saturation=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.saturation(a.v))}),j.save=new Sk.builtin.func(function(a){j.processing.save(a.v)}),j.saveFrame=new Sk.builtin.func(function(a){\\\"undefined\\\"==typeof a?j.processing.saveFrame():j.processing.saveFrame(a.v)}),j.saveStrings=new Sk.builtin.func(function(a,b){j.processing.saveStrings(a.v,b.v)}),j.screenX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenX(a.v,b.v,c.v))}),j.screenY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenY(a.v,b.v,c.v))}),j.screenZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenZ(a.v,b.v,c.v))}),j.second=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.second())}),j.shape=new Sk.builtin.func(function(a,b,c,d,e){\\\"undefined\\\"==typeof b?j.processing.shape(a.v):\\\"undefined\\\"==typeof c?j.processing.shape(a.v,b.v):\\\"undefined\\\"==typeof d?j.processing.shape(a.v,b.v,c.v):\\\"undefined\\\"==typeof e?j.processing.shape(a.v,b.v,c.v,d.v):j.processing.shape(a.v,b.v,c.v,d.v,e.v)}),j.shapeMode=new Sk.builtin.func(function(a){j.processing.shapeMode(a.v)}),j.shininess=new Sk.builtin.func(function(a){j.processing.shininess(a.v)}),j.specular=new Sk.builtin.func(function(a,b,c){\\\"undefined\\\"==typeof b?j.processing.specular(a.v):\\\"undefined\\\"==typeof c?j.processing.specular(a.v,b.v):j.processing.specular(a.v,b.v,c.v)}),j.spotLight=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.spotLight(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.sq=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.sq(a))}),j.status=new Sk.builtin.func(function(a){j.processing.status(a.v)}),j.textAlign=new Sk.builtin.func(function(a,b){\\\"undefined\\\"==typeof b?j.processing.textAlign(a.v):j.processing.textAlign(a.v,b.v)}),j.textAscent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textAscent())}),j.textDescent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textDescent())}),j.textFont=new Sk.builtin.func(function(a,b){\\\"undefined\\\"==typeof b?j.processing.textFont(a.v):j.processing.textFont(a.v,b.v)}),j.textLeading=new Sk.builtin.func(function(a){j.processing.textLeading(a.v)}),j.textMode=new Sk.builtin.func(function(a){j.processing.textMode(a.v)}),j.textSize=new Sk.builtin.func(function(a){j.processing.textSize(a.v)}),j.texture=new Sk.builtin.func(function(a){j.processing.texture(a.v)}),j.textureMode=new Sk.builtin.func(function(a){j.processing.textureMode(a.v)}),j.textWidth=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.textWidth(a.v))}),j.tint=new Sk.builtin.func(function(a,b,c,d){\\\"undefined\\\"==typeof b?j.processing.tint(a.v):\\\"undefined\\\"==typeof c?j.processing.tint(a.v,b.v):\\\"undefined\\\"==typeof d?j.processing.tint(a.v,b.v,c.v):j.processing.tint(a.v,b.v,c.v,d.v)}),j.updatePixels=new Sk.builtin.func(function(){j.processing.updatePixels()}),j.vertex=new Sk.builtin.func(function(a,b,c,d,e){\\\"undefined\\\"==typeof c?j.processing.vertex(a.v,b.v):\\\"undefined\\\"==typeof d?j.processing.vertex(a.v,b.v,c.v):\\\"undefined\\\"==typeof e?j.processing.vertex(a.v,b.v,c.v,d.v):j.processing.vertex(a.v,b.v,c.v,d.v,e.v)}),j.year=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.year())}),j.box=new Sk.builtin.func(function(a){j.processing.box(a.v)}),j.sphere=new Sk.builtin.func(function(a){j.processing.sphere(a.v)}),j.sphereDetail=new Sk.builtin.func(function(a,b){\\\"undefined\\\"==typeof b?j.processing.sphereDetail(a.v):j.processing.sphereDetail(a.v,b.v)}),j.background=new Sk.builtin.func(function(a,c,d){\\\"undefined\\\"!=typeof c&&(c=c.v),\\\"undefined\\\"!=typeof d&&(d=d.v),j.processing.background(a.v,c,d)}),j.fill=new Sk.builtin.func(function(a,c,d,e){\\\"undefined\\\"!=typeof c&&(c=c.v),\\\"undefined\\\"!=typeof d&&(d=d.v),\\\"undefined\\\"!=typeof e&&(e=e.v),j.processing.fill(a.v,c,d,e)}),j.stroke=new Sk.builtin.func(function(a,c,d,e){\\\"undefined\\\"!=typeof c&&(c=c.v),\\\"undefined\\\"!=typeof d&&(d=d.v),\\\"undefined\\\"!=typeof e&&(e=e.v),j.processing.stroke(a.v,c,d,e)}),j.noStroke=new Sk.builtin.func(function(){j.processing.noStroke()}),j.colorMode=new Sk.builtin.func(function(a,b,c,d,e){b=\\\"undefined\\\"==typeof b?255:b.v,\\\"undefined\\\"!=typeof c&&(c=c.v),\\\"undefined\\\"!=typeof d&&(d=d.v),\\\"undefined\\\"!=typeof e&&(e=e.v),j.processing.colorMode(a.v,b,c,d,e)}),j.noFill=new Sk.builtin.func(function(){j.processing.noFill()}),j.loop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception(\\\"loop() should be called after run()\\\");l=!0,j.processing.loop()}),j.noLoop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception(\\\"noLoop() should be called after run()\\\");l=!1,j.processing.noLoop()}),j.frameRate=new Sk.builtin.func(function(a){j.processing.frameRate(a.v)}),j.width=new Sk.builtin.int_(0),j.height=new Sk.builtin.int_(0),j.renderMode=j.P2D,j.size=new Sk.builtin.func(function(a,b,c){\\\"undefined\\\"==typeof c&&(c=j.P2D),j.processing.size(a.v,b.v,c.v),j.width=new Sk.builtin.int_(j.processing.width),j.height=new Sk.builtin.int_(j.processing.height),j.renderMode=c}),j.exitp=new Sk.builtin.func(function(){j.processing.exit()}),j.mouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseX)}),j.mouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseY)}),j.pmouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseX)}),j.pmouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseY)}),j.rectMode=new Sk.builtin.func(function(a){j.processing.rectMode(a.v)}),j.strokeWeight=new Sk.builtin.func(function(a){j.processing.strokeWeight(a.v)}),j.smooth=new Sk.builtin.func(function(){j.processing.smooth()}),j.noSmooth=new Sk.builtin.func(function(){j.processing.noSmooth()}),j.ellipseMode=new Sk.builtin.func(function(a){j.processing.ellipseMode(a.v)}),j.strokeCap=new Sk.builtin.func(function(a){j.processing.strokeCap(a.v)}),j.strokeJoin=new Sk.builtin.func(function(a){j.processing.strokeJoin(a.v)}),j.rotate=new Sk.builtin.func(function(a){j.processing.rotate(a.v)}),j.rotateX=new Sk.builtin.func(function(a){j.processing.rotateX(a.v)}),j.rotateY=new Sk.builtin.func(function(a){j.processing.rotateY(a.v)}),j.rotateZ=new Sk.builtin.func(function(a){j.processing.rotateZ(a.v)}),j.scale=new Sk.builtin.func(function(a,b,c){b=\\\"undefined\\\"==typeof b?1:b.v,c=\\\"undefined\\\"==typeof c?1:c.v,j.processing.scale(a.v,b,c)}),j.translate=new Sk.builtin.func(function(a,b,c){b=\\\"undefined\\\"==typeof b?1:b.v,c=\\\"undefined\\\"==typeof c?1:c.v,j.processing.translate(a.v,b,c)}),j.popMatrix=new Sk.builtin.func(function(){j.processing.popMatrix()}),j.pushMatrix=new Sk.builtin.func(function(){j.processing.pushMatrix()}),j.applyMatrix=new Sk.builtin.func(function(){var a,b=Array.prototype.slice.call(arguments,0,16);for(a=0;a 0):\\n self.percDown(i)\\n i = i - 1\\n \\n def percDown(self,i):\\n while (i * 2) <= self.currentSize:\\n mc = self.minChild(i)\\n if self.heapArray[i][0] > self.heapArray[mc][0]:\\n tmp = self.heapArray[i]\\n self.heapArray[i] = self.heapArray[mc]\\n self.heapArray[mc] = tmp\\n i = mc\\n \\n def minChild(self,i):\\n if i*2 > self.currentSize:\\n return -1\\n else:\\n if i*2 + 1 > self.currentSize:\\n return i*2\\n else:\\n if self.heapArray[i*2][0] < self.heapArray[i*2+1][0]:\\n return i*2\\n else:\\n return i*2+1\\n\\n def percUp(self,i):\\n while i // 2 > 0:\\n if self.heapArray[i][0] < self.heapArray[i//2][0]:\\n tmp = self.heapArray[i//2]\\n self.heapArray[i//2] = self.heapArray[i]\\n self.heapArray[i] = tmp\\n i = i//2\\n \\n def add(self,k):\\n self.heapArray.append(k)\\n self.currentSize = self.currentSize + 1\\n self.percUp(self.currentSize)\\n\\n def delMin(self):\\n retval = self.heapArray[1][1]\\n self.heapArray[1] = self.heapArray[self.currentSize]\\n self.currentSize = self.currentSize - 1\\n self.heapArray.pop()\\n self.percDown(1)\\n return retval\\n \\n def isEmpty(self):\\n if self.currentSize == 0:\\n return True\\n else:\\n return False\\n\\n def decreaseKey(self,val,amt):\\n # this is a little wierd, but we need to find the heap thing to decrease by\\n # looking at its value\\n done = False\\n i = 1\\n myKey = 0\\n while not done and i <= self.currentSize:\\n if self.heapArray[i][1] == val:\\n done = True\\n myKey = i\\n else:\\n i = i + 1\\n if myKey > 0:\\n self.heapArray[myKey] = (amt,self.heapArray[myKey][1])\\n self.percUp(myKey)\\n \\n def __contains__(self,vtx):\\n for pair in self.heapArray:\\n if pair[1] == vtx:\\n return True\\n return False\\n \\nclass TestBinHeap(unittest.TestCase):\\n def setUp(self):\\n self.theHeap = PriorityQueue()\\n self.theHeap.add((2,'x'))\\n self.theHeap.add((3,'y'))\\n self.theHeap.add((5,'z'))\\n self.theHeap.add((6,'a'))\\n self.theHeap.add((4,'d'))\\n\\n\\n def testInsert(self):\\n assert self.theHeap.currentSize == 5\\n\\n def testDelmin(self):\\n assert self.theHeap.delMin() == 'x'\\n assert self.theHeap.delMin() == 'y'\\n \\n def testDecKey(self):\\n self.theHeap.decreaseKey('d',1)\\n assert self.theHeap.delMin() == 'd'\\n \\nif __name__ == '__main__':\\n unittest.main()\\n\",\"src/lib/pythonds/trees/__init__.py\":\"\\n# from .binaryTree import BinaryTree\\n# from .balance import AVLTree\\n# from .bst import BinarySearchTree\\n# from .binheap import BinHeap\\n\\n\\n\",\"src/lib/pythonds/trees/balance.py\":\"#!/bin/env python3.1\\n# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005, 2010\\n# \\n\\nfrom .bst import BinarySearchTree, TreeNode\\n\\nclass AVLTree(BinarySearchTree):\\n '''\\n Author: Brad Miller\\n Date: 1/15/2005\\n Description: Imlement a binary search tree with the following interface\\n functions: \\n __contains__(y) <==> y in x\\n __getitem__(y) <==> x[y]\\n __init__()\\n __len__() <==> len(x)\\n __setitem__(k,v) <==> x[k] = v\\n clear()\\n get(k)\\n has_key(k)\\n items() \\n keys() \\n values()\\n put(k,v)\\n '''\\n\\n\\n def _put(self,key,val,currentNode):\\n if key < currentNode.key:\\n if currentNode.hasLeftChild():\\n self._put(key,val,currentNode.leftChild)\\n else:\\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\\n self.updateBalance(currentNode.leftChild)\\n else:\\n if currentNode.hasRightChild():\\n self._put(key,val,currentNode.rightChild)\\n else:\\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\\n self.updateBalance(currentNode.rightChild) \\n\\n def updateBalance(self,node):\\n if node.balanceFactor > 1 or node.balanceFactor < -1:\\n self.rebalance(node)\\n return\\n if node.parent != None:\\n if node.isLeftChild():\\n node.parent.balanceFactor += 1\\n elif node.isRightChild():\\n node.parent.balanceFactor -= 1\\n\\n if node.parent.balanceFactor != 0:\\n self.updateBalance(node.parent)\\n\\n def rebalance(self,node):\\n if node.balanceFactor < 0:\\n if node.rightChild.balanceFactor > 0:\\n # Do an LR Rotation\\n self.rotateRight(node.rightChild)\\n self.rotateLeft(node)\\n else:\\n # single left\\n self.rotateLeft(node)\\n elif node.balanceFactor > 0:\\n if node.leftChild.balanceFactor < 0:\\n # Do an RL Rotation\\n self.rotateLeft(node.leftChild)\\n self.rotateRight(node)\\n else:\\n # single right\\n self.rotateRight(node)\\n\\n def rotateLeft(self,rotRoot):\\n newRoot = rotRoot.rightChild\\n rotRoot.rightChild = newRoot.leftChild\\n if newRoot.leftChild != None:\\n newRoot.leftChild.parent = rotRoot\\n newRoot.parent = rotRoot.parent\\n if rotRoot.isRoot():\\n self.root = newRoot\\n else:\\n if rotRoot.isLeftChild():\\n rotRoot.parent.leftChild = newRoot\\n else:\\n rotRoot.parent.rightChild = newRoot\\n newRoot.leftChild = rotRoot\\n rotRoot.parent = newRoot\\n rotRoot.balanceFactor = rotRoot.balanceFactor + 1 - min(newRoot.balanceFactor, 0)\\n newRoot.balanceFactor = newRoot.balanceFactor + 1 + max(rotRoot.balanceFactor, 0)\\n\\n\\n def rotateRight(self,rotRoot):\\n newRoot = rotRoot.leftChild\\n rotRoot.leftChild = newRoot.rightChild\\n if newRoot.rightChild != None:\\n newRoot.rightChild.parent = rotRoot\\n newRoot.parent = rotRoot.parent\\n if rotRoot.isRoot():\\n self.root = newRoot\\n else:\\n if rotRoot.isRightChild():\\n rotRoot.parent.rightChild = newRoot\\n else:\\n rotRoot.parent.leftChild = newRoot\\n newRoot.rightChild = rotRoot\\n rotRoot.parent = newRoot\\n rotRoot.balanceFactor = rotRoot.balanceFactor - 1 - max(newRoot.balanceFactor, 0)\\n newRoot.balanceFactor = newRoot.balanceFactor - 1 + min(rotRoot.balanceFactor, 0)\\n \\n\",\"src/lib/pythonds/trees/binaryTree.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n# \\n\\nclass BinaryTree:\\n \\\"\\\"\\\"\\n A recursive implementation of Binary Tree\\n Using links and Nodes approach.\\n \\\"\\\"\\\" \\n def __init__(self,rootObj):\\n self.key = rootObj\\n self.leftChild = None\\n self.rightChild = None\\n\\n def insertLeft(self,newNode):\\n if self.leftChild == None:\\n self.leftChild = BinaryTree(newNode)\\n else:\\n t = BinaryTree(newNode)\\n t.left = self.leftChild\\n self.leftChild = t\\n \\n def insertRight(self,newNode):\\n if self.rightChild == None:\\n self.rightChild = BinaryTree(newNode)\\n else:\\n t = BinaryTree(newNode)\\n t.right = self.rightChild\\n self.rightChild = t\\n\\n def isLeaf(self):\\n return ((not self.leftChild) and (not self.rightChild))\\n\\n def getRightChild(self):\\n return self.rightChild\\n\\n def getLeftChild(self):\\n return self.leftChild\\n\\n def setRootVal(self,obj):\\n self.key = obj\\n\\n def getRootVal(self,):\\n return self.key\\n\\n def inorder(self):\\n if self.leftChild:\\n self.leftChild.inorder()\\n print(self.key)\\n if self.rightChild:\\n self.rightChild.inorder()\\n\\n def postorder(self):\\n if self.leftChild:\\n self.leftChild.postorder()\\n if self.rightChild:\\n self.rightChild.postorder()\\n print(self.key)\\n\\n\\n def preorder(self):\\n print(self.key)\\n if self.leftChild:\\n self.leftChild.preorder()\\n if self.rightChild:\\n self.rightChild.preorder()\\n\\n def printexp(self):\\n if self.leftChild:\\n print('(')\\n self.leftChild.printexp()\\n print(self.key)\\n if self.rightChild:\\n self.rightChild.printexp()\\n print(')')\\n\\n def postordereval(self):\\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if self.leftChild:\\n res1 = self.leftChild.postordereval() #// \\\\label{peleft}\\n if self.rightChild:\\n res2 = self.rightChild.postordereval() #// \\\\label{peright}\\n if res1 and res2:\\n return opers[self.key](res1,res2) #// \\\\label{peeval}\\n else:\\n return self.key\\n\\ndef inorder(tree):\\n if tree != None:\\n inorder(tree.getLeftChild())\\n print(tree.getRootVal())\\n inorder(tree.getRightChild())\\n\\ndef printexp(tree):\\n if tree.leftChild:\\n print('(')\\n printexp(tree.getLeftChild())\\n print(tree.getRootVal())\\n if tree.rightChild:\\n printexp(tree.getRightChild())\\n print(')') \\n\\ndef printexp(tree):\\n sVal = \\\"\\\"\\n if tree:\\n sVal = '(' + printexp(tree.getLeftChild())\\n sVal = sVal + str(tree.getRootVal())\\n sVal = sVal + printexp(tree.getRightChild()) + ')'\\n return sVal\\n\\ndef postordereval(tree):\\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if tree:\\n res1 = postordereval(tree.getLeftChild()) #// \\\\label{peleft}\\n res2 = postordereval(tree.getRightChild()) #// \\\\label{peright}\\n if res1 and res2:\\n return opers[tree.getRootVal()](res1,res2) #// \\\\label{peeval}\\n else:\\n return tree.getRootVal()\\n\\ndef height(tree):\\n if tree == None:\\n return -1\\n else:\\n return 1 + max(height(tree.leftChild),height(tree.rightChild))\\n\\n# t = BinaryTree(7)\\n# t.insertLeft(3)\\n# t.insertRight(9)\\n# inorder(t)\\n# import operator\\n# x = BinaryTree('*')\\n# x.insertLeft('+')\\n# l = x.getLeftChild()\\n# l.insertLeft(4)\\n# l.insertRight(5)\\n# x.insertRight(7)\\n# print(printexp(x))\\n# print(postordereval(x))\\n# print(height(x))\\n\",\"src/lib/pythonds/trees/binheap.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n# \\n\\n# this heap takes key value pairs, we will assume that the keys are integers\\nclass BinHeap:\\n def __init__(self):\\n self.heapList = [0]\\n self.currentSize = 0\\n\\n\\n def buildHeap(self,alist):\\n i = len(alist) // 2\\n self.currentSize = len(alist)\\n self.heapList = [0] + alist[:]\\n print(len(self.heapList), i)\\n while (i > 0):\\n print(self.heapList, i)\\n self.percDown(i)\\n i = i - 1\\n print(self.heapList,i)\\n \\n def percDown(self,i):\\n while (i * 2) <= self.currentSize:\\n mc = self.minChild(i)\\n if self.heapList[i] > self.heapList[mc]:\\n tmp = self.heapList[i]\\n self.heapList[i] = self.heapList[mc]\\n self.heapList[mc] = tmp\\n i = mc\\n \\n def minChild(self,i):\\n if i * 2 + 1 > self.currentSize:\\n return i * 2\\n else:\\n if self.heapList[i * 2] < self.heapList[i * 2 + 1]:\\n return i * 2\\n else:\\n return i * 2 + 1\\n\\n def percUp(self,i):\\n while i // 2 > 0:\\n if self.heapList[i] < self.heapList[i//2]:\\n tmp = self.heapList[i // 2]\\n self.heapList[i // 2] = self.heapList[i]\\n self.heapList[i] = tmp\\n i = i // 2\\n \\n def insert(self,k):\\n self.heapList.append(k)\\n self.currentSize = self.currentSize + 1\\n self.percUp(self.currentSize)\\n\\n def delMin(self):\\n retval = self.heapList[1]\\n self.heapList[1] = self.heapList[self.currentSize]\\n self.currentSize = self.currentSize - 1\\n self.heapList.pop()\\n self.percDown(1)\\n return retval\\n \\n def isEmpty(self):\\n if currentSize == 0:\\n return True\\n else:\\n return False\\n\",\"src/lib/pythonds/trees/bst.py\":\"#!/bin/env python3.1\\n# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005, 2010\\n# \\n\\nclass BinarySearchTree:\\n '''\\n Author: Brad Miller\\n Date: 1/15/2005\\n Description: Imlement a binary search tree with the following interface\\n functions: \\n __contains__(y) <==> y in x\\n __getitem__(y) <==> x[y]\\n __init__()\\n __len__() <==> len(x)\\n __setitem__(k,v) <==> x[k] = v\\n clear()\\n get(k)\\n items() \\n keys() \\n values()\\n put(k,v)\\n in\\n del <==> \\n '''\\n\\n def __init__(self):\\n self.root = None\\n self.size = 0\\n \\n def put(self,key,val):\\n if self.root:\\n self._put(key,val,self.root)\\n else:\\n self.root = TreeNode(key,val)\\n self.size = self.size + 1\\n\\n def _put(self,key,val,currentNode):\\n if key < currentNode.key:\\n if currentNode.hasLeftChild():\\n self._put(key,val,currentNode.leftChild)\\n else:\\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\\n else:\\n if currentNode.hasRightChild():\\n self._put(key,val,currentNode.rightChild)\\n else:\\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\\n \\n def __setitem__(self,k,v):\\n self.put(k,v)\\n\\n def get(self,key):\\n if self.root:\\n res = self._get(key,self.root)\\n if res:\\n return res.payload\\n else:\\n return None\\n else:\\n return None\\n \\n def _get(self,key,currentNode):\\n if not currentNode:\\n return None\\n elif currentNode.key == key:\\n return currentNode\\n elif key < currentNode.key:\\n return self._get(key,currentNode.leftChild)\\n else:\\n return self._get(key,currentNode.rightChild)\\n \\n \\n def __getitem__(self,key):\\n res = self.get(key)\\n if res:\\n return res\\n else:\\n raise KeyError('Error, key not in tree')\\n \\n\\n def __contains__(self,key):\\n if self._get(key,self.root):\\n return True\\n else:\\n return False\\n \\n def length(self):\\n return self.size\\n\\n def __len__(self):\\n return self.size\\n\\n def __iter__(self):\\n return self.root.__iter__()\\n \\n def delete(self,key):\\n if self.size > 1:\\n nodeToRemove = self._get(key,self.root)\\n if nodeToRemove:\\n self.remove(nodeToRemove)\\n self.size = self.size-1\\n else:\\n raise KeyError('Error, key not in tree')\\n elif self.size == 1 and self.root.key == key:\\n self.root = None\\n self.size = self.size - 1\\n else:\\n raise KeyError('Error, key not in tree')\\n\\n def __delitem__(self,key):\\n self.delete(key)\\n \\n def remove(self,currentNode):\\n if currentNode.isLeaf(): #leaf\\n if currentNode == currentNode.parent.leftChild:\\n currentNode.parent.leftChild = None\\n else:\\n currentNode.parent.rightChild = None\\n elif currentNode.hasBothChildren(): #interior\\n succ = currentNode.findSuccessor()\\n succ.spliceOut()\\n currentNode.key = succ.key\\n currentNode.payload = succ.payload\\n else: # this node has one child\\n if currentNode.hasLeftChild():\\n if currentNode.isLeftChild():\\n currentNode.leftChild.parent = currentNode.parent\\n currentNode.parent.leftChild = currentNode.leftChild\\n elif currentNode.isRightChild():\\n currentNode.leftChild.parent = currentNode.parent\\n currentNode.parent.rightChild = currentNode.leftChild\\n else:\\n currentNode.replaceNodeData(currentNode.leftChild.key,\\n currentNode.leftChild.payload,\\n currentNode.leftChild.leftChild,\\n currentNode.leftChild.rightChild)\\n else:\\n if currentNode.isLeftChild():\\n currentNode.rightChild.parent = currentNode.parent\\n currentNode.parent.leftChild = currentNode.rightChild\\n elif currentNode.isRightChild():\\n currentNode.rightChild.parent = currentNode.parent\\n currentNode.parent.rightChild = currentNode.rightChild\\n else:\\n currentNode.replaceNodeData(currentNode.rightChild.key,\\n currentNode.rightChild.payload,\\n currentNode.rightChild.leftChild,\\n currentNode.rightChild.rightChild)\\n\\n def inorder(self):\\n self._inorder(self.root)\\n\\n def _inorder(self,tree):\\n if tree != None:\\n self._inorder(tree.leftChild)\\n print(tree.key)\\n self._inorder(tree.rightChild)\\n\\n def postorder(self):\\n self._postorder(self.root)\\n\\n def _postorder(self, tree):\\n if tree:\\n self._postorder(tree.rightChild)\\n self._postorder(tree.leftChild)\\n print(tree.key) \\n\\n def preorder(self):\\n self._preorder(self,self.root)\\n\\n def _preorder(self,tree):\\n if tree:\\n print(tree.key) \\n self._preorder(tree.leftChild)\\n self._preorder(tree.rightChild)\\n\\n \\nclass TreeNode:\\n def __init__(self,key,val,left=None,right=None,parent=None):\\n self.key = key\\n self.payload = val\\n self.leftChild = left\\n self.rightChild = right\\n self.parent = parent\\n self.balanceFactor = 0\\n \\n def hasLeftChild(self):\\n return self.leftChild\\n\\n def hasRightChild(self):\\n return self.rightChild\\n \\n def isLeftChild(self):\\n return self.parent and self.parent.leftChild == self\\n\\n def isRightChild(self):\\n return self.parent and self.parent.rightChild == self\\n\\n def isRoot(self):\\n return not self.parent\\n\\n def isLeaf(self):\\n return not (self.rightChild or self.leftChild)\\n\\n def hasAnyChildren(self):\\n return self.rightChild or self.leftChild\\n\\n def hasBothChildren(self):\\n return self.rightChild and self.leftChild\\n \\n def replaceNodeData(self,key,value,lc,rc):\\n self.key = key\\n self.payload = value\\n self.leftChild = lc\\n self.rightChild = rc\\n if self.hasLeftChild():\\n self.leftChild.parent = self\\n if self.hasRightChild():\\n self.rightChild.parent = self\\n \\n def findSuccessor(self):\\n succ = None\\n if self.hasRightChild():\\n succ = self.rightChild.findMin()\\n else:\\n if self.parent:\\n if self.isLeftChild():\\n succ = self.parent\\n else:\\n self.parent.rightChild = None\\n succ = self.parent.findSuccessor()\\n self.parent.rightChild = self\\n return succ\\n\\n\\n def spliceOut(self):\\n if self.isLeaf():\\n if self.isLeftChild():\\n self.parent.leftChild = None\\n else:\\n self.parent.rightChild = None\\n elif self.hasAnyChildren():\\n if self.hasLeftChild():\\n if self.isLeftChild():\\n self.parent.leftChild = self.leftChild\\n else:\\n self.parent.rightChild = self.leftChild\\n self.leftChild.parent = self.parent\\n else:\\n if self.isLeftChild():\\n self.parent.leftChild = self.rightChild\\n else:\\n self.parent.rightChild = self.rightChild\\n self.rightChild.parent = self.parent\\n\\n def findMin(self):\\n current = self\\n while current.hasLeftChild():\\n current = current.leftChild\\n return current\\n\\n def __iter__(self):\\n \\\"\\\"\\\"The standard inorder traversal of a binary tree.\\\"\\\"\\\"\\n if self:\\n if self.hasLeftChild():\\n for elem in self.leftChild:\\n yield elem\\n yield self.key\\n if self.hasRightChild():\\n for elem in self.rightChild:\\n yield elem\\n\\n \\n\",\"src/lib/quopri.py\":\"raise NotImplementedError(\\\"quopri is not yet implemented in Skulpt\\\")\\n\",\"src/lib/random.js\":\"var MersenneTwister=function(a){a==null&&(a=new Date().getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=Array(this.N),this.mti=this.N+1,this.init_genrand(a)};MersenneTwister.prototype.init_genrand=function(a){for(this.mt[0]=a>>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(1812433253*((4294901760&a)>>>16)<<16)+1812433253*(65535&a)+this.mti,this.mt[this.mti]>>>=0}},MersenneTwister.prototype.init_by_array=function(a,b){var d,e,f;for(this.init_genrand(19650218),d=1,e=0,f=this.N>b?this.N:b;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1664525*((4294901760&g)>>>16)<<16)+1664525*(65535&g))+a[e]+e,this.mt[d]>>>=0,d++,e++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1),e>=b&&(e=0)}for(f=this.N-1;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1566083941*((4294901760&g)>>>16)<<16)+1566083941*(65535&g))-d,this.mt[d]>>>=0,d++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1)}this.mt[0]=2147483648},MersenneTwister.prototype.genrand_int32=function(){var a,b=[0,this.MATRIX_A];if(this.mti>=this.N){var d;for(this.mti==this.N+1&&this.init_genrand(5489),d=0;d>>1^b[1&a];for(;d>>1^b[1&a];a=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^a>>>1^b[1&a],this.mti=0}return a=this.mt[this.mti++],a^=a>>>11,a^=2636928640&a<<7,a^=4022730752&a<<15,a^=a>>>18,a>>>0},MersenneTwister.prototype.genrand_int31=function(){return this.genrand_int32()>>>1},MersenneTwister.prototype.genrand_real1=function(){return this.genrand_int32()*(1/4294967295)},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)},MersenneTwister.prototype.genrand_real3=function(){return(this.genrand_int32()+.5)*(1/4294967296)},MersenneTwister.prototype.genrand_res53=function(){var d=this.genrand_int32()>>>5,a=this.genrand_int32()>>>6;return(67108864*d+a)*(1/9007199254740992)};var $builtinmodule=function(){var a=Math.log,b=Math.sqrt,d={},e=new MersenneTwister,f=void 0;d.seed=new Sk.builtin.func(function(a){return Sk.builtin.pyCheckArgsLen(\\\"seed\\\",arguments.length,0,1),a=Sk.builtin.asnum$(a),e=0d)h=g((f+d+1)/d);else throw new Sk.builtin.ValueError(\\\"zero step for randrange()\\\");if(0>=h)throw new Sk.builtin.ValueError(\\\"empty range for randrange()\\\");return i=a+d*g(e.genrand_res53()*h),new Sk.builtin.int_(i)};d.randint=new Sk.builtin.func(function(d,e){return Sk.builtin.pyCheckArgsLen(\\\"randint\\\",arguments.length,2,2),d=Sk.builtin.asnum$(d),e=Sk.builtin.asnum$(e),h(d,e+1)}),d.randrange=new Sk.builtin.func(function(a,b,d){return Sk.builtin.pyCheckArgsLen(\\\"randrange\\\",arguments.length,1,3),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(d),h(a,b,d)}),d.uniform=new Sk.builtin.func(function(d,f){Sk.builtin.pyCheckArgsLen(\\\"uniform\\\",arguments.length,2,2),d=Sk.builtin.asnum$(d),f=Sk.builtin.asnum$(f);var g=e.genrand_res53();return c=d+g*(f-d),new Sk.builtin.float_(c)}),d.triangular=new Sk.builtin.func(function(a,d,f){Sk.builtin.pyCheckArgsLen(\\\"triangular\\\",arguments.length,2,3),Sk.builtin.pyCheckType(\\\"low\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"high\\\",\\\"number\\\",Sk.builtin.checkNumber(d));var g,h,i;return a=Sk.builtin.asnum$(a),d=Sk.builtin.asnum$(d),a>d&&(i=a,a=d,d=i),void 0===f||f===Sk.builtin.none.none$?f=(d-a)/2:(Sk.builtin.pyCheckType(\\\"mode\\\",\\\"number\\\",Sk.builtin.checkNumber(f)),f=Sk.builtin.asnum$(f)),g=e.genrand_res53(),h=g<(f-a)/(d-a)?a+b(g*(d-a)*(f-a)):d-b((1-g)*(d-a)*(d-f)),new Sk.builtin.float_(h)});var i=function(d,g){var k,l,m,n,o,h=Math.sin,i=Math.cos,j=Math.PI;return void 0===f?(k=e.genrand_res53(),l=e.genrand_res53(),m=b(-2*a(k)),n=2*j*l,o=m*i(n),f=m*h(n)):(o=f,f=void 0),d+g*o};return d.gauss=new Sk.builtin.func(function(a,b){return Sk.builtin.pyCheckArgsLen(\\\"gauss\\\",arguments.length,2,2),Sk.builtin.pyCheckType(\\\"mu\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"sigma\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(i(a,b))}),d.normalvariate=d.gauss,d.lognormvariate=new Sk.builtin.func(function(a,b){var d=Math.exp;return Sk.builtin.pyCheckArgsLen(\\\"lognormvariate\\\",arguments.length,2,2),Sk.builtin.pyCheckType(\\\"mu\\\",\\\"number\\\",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType(\\\"sigma\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(d(i(a,b)))}),d.expovariate=new Sk.builtin.func(function(b){Sk.builtin.pyCheckArgsLen(\\\"expovariate\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"lambd\\\",\\\"number\\\",Sk.builtin.checkNumber(b)),b=Sk.builtin.asnum$(b);var d=e.genrand_res53();return new Sk.builtin.float_(-a(d)/b)}),d.choice=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen(\\\"choice\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"seq\\\",\\\"sequence\\\",Sk.builtin.checkSequence(a)),void 0!==a.sq$length){var b=new Sk.builtin.int_(g(e.genrand_res53()*a.sq$length()));return a.mp$subscript(b)}throw new Sk.builtin.TypeError(\\\"object has no length\\\")}),d.shuffle=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen(\\\"shuffle\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"x\\\",\\\"sequence\\\",Sk.builtin.checkSequence(a)),a.constructor===Sk.builtin.list){const h=a.v;for(var b=h.length-1;0=c)););return j.push(new Sk.builtin.str(f.substring(l))),new Sk.builtin.list(j)},_split.co_varnames=[\\\"pattern\\\",\\\"string\\\",\\\"maxsplit\\\",\\\"flags\\\"],_split.$defaults=[new Sk.builtin.int_(0),new Sk.builtin.int_(0)],mod.split=new Sk.builtin.func(_split),_findall=function(a,b,c){var d,e,f,g,h,j;if(Sk.builtin.pyCheckArgsLen(\\\"findall\\\",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\\\"pattern must be a string\\\");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\\\"string must be a string\\\");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError(\\\"flags must be a number\\\");if(d=Sk.ffi.unwrapo(a),e=Sk.ffi.unwrapo(b),d=convert(d),f=getFlags(c),g=new RegExp(d,f),d.match(/\\\\$/)){var k=new RegExp(/\\\\n$/);e.match(k)&&(e=e.slice(0,-1))}for(h=[],j;null!=(j=g.exec(e));){if(2>j.length)h.push(new Sk.builtin.str(j[0]));else if(2==j.length)h.push(new Sk.builtin.str(j[1]));else{for(var l=[],m=1;m=a.thematch.v.length)throw new Sk.builtin.IndexError(\\\"Index out of range: \\\"+b);return a.thematch.v[b]})},mod.MatchObject=Sk.misceval.buildClass(mod,matchobj,\\\"MatchObject\\\",[]),mod._findre=function(res,string){res=res.replace(/([^\\\\\\\\]){,(?![^\\\\[]*\\\\])/g,\\\"$1{0,\\\");var matches,sitem,retval,re=eval(res),patt=/\\\\n$/,str=Sk.ffi.remapToJs(string);if(matches=str.match(patt)?str.slice(0,-1).match(re):str.match(re),retval=new Sk.builtin.list,null==matches)return retval;for(var i=0;ilst.v.length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_search.co_varnames=[\\\"pattern\\\",\\\"string\\\",\\\"flags\\\"],_search.$defaults=[new Sk.builtin.int_(0)],mod.search=new Sk.builtin.func(_search),_match=function(a,b,c){var d,e;if(Sk.builtin.pyCheckArgsLen(\\\"match\\\",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\\\"pattern must be a string\\\");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\\\"string must be a string\\\");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError(\\\"flags must be a number\\\");return(pat=Sk.ffi.remapToJs(a),e=\\\"/^\\\"+pat.replace(/\\\\//g,\\\"\\\\\\\\/\\\")+\\\"/\\\",lst=mod._findre(e,b),1>Sk.ffi.remapToJs(lst).length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_match.co_varnames=[\\\"pattern\\\",\\\"string\\\",\\\"flags\\\"],_match.$defaults=[new Sk.builtin.int_(0)],mod.match=new Sk.builtin.func(_match),regexobj=function(a,b){var c,d,e,f,g,h;b.__init__=new Sk.builtin.func(function(a,b,c){return a.re=b,a.flags=void 0===c?0:c,Sk.builtin.none.none$}),h=new Sk.builtin.func(function(a){var b=\\\"re.compile('\\\"+Sk.ffi.remapToJs(a.re)+\\\"')\\\";return Sk.ffi.remapToPy(b.substring(0,212))}),b.__str__=h,b.__repr__=h,c=function(a,b,c){var d=Sk.ffi.remapToJs(a),e=null==b?0:Sk.ffi.remapToJs(b),f=null==c?d.length:Sk.ffi.remapToJs(c);return\\\"^\\\"==e&&(e=d.indexOf(\\\"\\\\n\\\")+1),null===f&&(f=d.length),Sk.ffi.remapToPy(d.substring(e,f))},d=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\\\"search\\\",arguments.length,2,4);var f=c(b,d,e);return _search(a.re,f,a.flags)},d.co_varnames=[\\\"self\\\",\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],d.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.search=new Sk.builtin.func(d),e=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\\\"match\\\",arguments.length,2,4);var f=c(b,d,e);return _match(a.re,f,a.flags)},e.co_varnames=[\\\"self\\\",\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],e.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.match=new Sk.builtin.func(e),f=function(a,b,c){if(Sk.builtin.pyCheckArgsLen(\\\"split\\\",arguments.length,2,3),void 0===c&&(c=0),!Sk.builtin.checkInt(c))throw new Sk.builtin.TypeError(\\\"maxsplit must be an integer\\\");return _split(a.re,b,c,a.flags)},f.co_varnames=[\\\"self\\\",\\\"string\\\",\\\"maxsplit\\\"],f.$defaults=[new Sk.builtin.int_(0)],b.split=new Sk.builtin.func(f),g=function(a,b,d,e){Sk.builtin.pyCheckArgsLen(\\\"findall\\\",arguments.length,2,4);var f=c(b,d,e);return _findall(a.re,f,a.flags)},g.co_varnames=[\\\"self\\\",\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],g.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.findall=new Sk.builtin.func(g)},mod.RegexObject=Sk.misceval.buildClass(mod,regexobj,\\\"RegexObject\\\",[]),mod.compile=new Sk.builtin.func(function(a,b){var c;if(Sk.builtin.pyCheckArgsLen(\\\"compile\\\",arguments.length,1,2),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\\\"pattern must be a string\\\");if(void 0===b&&(b=0),!Sk.builtin.checkNumber(b))throw new Sk.builtin.TypeError(\\\"flags must be a number\\\");return c=Sk.misceval.callsimArray(mod.RegexObject,[a,b]),c}),mod.purge=new Sk.builtin.func(function(){}),mod};\",\"src/lib/repr.py\":\"raise NotImplementedError(\\\"repr is not yet implemented in Skulpt\\\")\\n\",\"src/lib/rexec.py\":\"raise NotImplementedError(\\\"rexec is not yet implemented in Skulpt\\\")\\n\",\"src/lib/rfc822.py\":\"raise NotImplementedError(\\\"rfc822 is not yet implemented in Skulpt\\\")\\n\",\"src/lib/rlcompleter.py\":\"raise NotImplementedError(\\\"rlcompleter is not yet implemented in Skulpt\\\")\\n\",\"src/lib/robotparser.py\":\"raise NotImplementedError(\\\"robotparser is not yet implemented in Skulpt\\\")\\n\",\"src/lib/runpy.py\":\"raise NotImplementedError(\\\"runpy is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sched.py\":\"raise NotImplementedError(\\\"sched is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sets.py\":\"raise NotImplementedError(\\\"sets is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sgmllib.py\":\"raise NotImplementedError(\\\"sgmllib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sha.py\":\"raise NotImplementedError(\\\"sha is not yet implemented in Skulpt\\\")\\n\",\"src/lib/shelve.py\":\"raise NotImplementedError(\\\"shelve is not yet implemented in Skulpt\\\")\\n\",\"src/lib/shlex.py\":\"raise NotImplementedError(\\\"shlex is not yet implemented in Skulpt\\\")\\n\",\"src/lib/shutil.py\":\"raise NotImplementedError(\\\"shutil is not yet implemented in Skulpt\\\")\\n\",\"src/lib/signal.js\":\"var $builtinmodule=function(){var a={SIG_DFL:new Sk.builtin.int_(0),SIG_IGN:new Sk.builtin.int_(1),CTRL_C_EVENT:new Sk.builtin.int_(0),CTRL_BREAK_EVENT:new Sk.builtin.int_(0),NSIG:new Sk.builtin.int_(23),SIGHUP:new Sk.builtin.int_(1),SIGNINT:new Sk.builtin.int_(2),SIGILL:new Sk.builtin.int_(4),SIGFPE:new Sk.builtin.int_(8),SIGKILL:new Sk.builtin.int_(9),SIGSEGV:new Sk.builtin.int_(11),SIGTERM:new Sk.builtin.int_(15),SIGBREAK:new Sk.builtin.int_(21),SIGABRT:new Sk.builtin.int_(22),pause:new Sk.builtin.func(function(){Sk.builtin.pyCheckArgsLen(\\\"pause\\\",arguments.length,0,0);var a=new Sk.misceval.Suspension;return a.resume=function(){return Sk.builtin.none.none$},a.data={type:\\\"Sk.promise\\\",promise:new Promise(function(a){if(null!=Sk.signals&&Sk.signals.addEventListener){function handleSignal(){Sk.signals.removeEventListener(handleSignal),a()}Sk.signals.addEventListener(handleSignal)}else console.warn(\\\"signal.pause() not supported\\\"),Sk.misceval.print_(\\\"signal.pause() not supported\\\"),a()})},a}),signal:new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError(\\\"signal.signal is not supported.\\\")})};return a};\",\"src/lib/site.py\":\"raise NotImplementedError(\\\"site is not yet implemented in Skulpt\\\")\\n\",\"src/lib/smtpd.py\":\"raise NotImplementedError(\\\"smtpd is not yet implemented in Skulpt\\\")\\n\",\"src/lib/smtplib.py\":\"raise NotImplementedError(\\\"smtplib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sndhdr.py\":\"raise NotImplementedError(\\\"sndhdr is not yet implemented in Skulpt\\\")\\n\",\"src/lib/socket.py\":\"raise NotImplementedError(\\\"socket is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sqlite3/__init__.py\":\"raise NotImplementedError(\\\"sqlite3 is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sre.py\":\"raise NotImplementedError(\\\"sre is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sre_compile.py\":\"raise NotImplementedError(\\\"sre_compile is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sre_constants.py\":\"raise NotImplementedError(\\\"sre_constants is not yet implemented in Skulpt\\\")\\n\",\"src/lib/sre_parse.py\":\"raise NotImplementedError(\\\"sre_parse is not yet implemented in Skulpt\\\")\\n\",\"src/lib/ssl.py\":\"raise NotImplementedError(\\\"ssl is not yet implemented in Skulpt\\\")\\n\",\"src/lib/stat.py\":\"raise NotImplementedError(\\\"stat is not yet implemented in Skulpt\\\")\\n\",\"src/lib/statvfs.py\":\"raise NotImplementedError(\\\"statvfs is not yet implemented in Skulpt\\\")\\n\",\"src/lib/string.js\":\"var $builtinmodule=function(){var a={};return a.ascii_lowercase=new Sk.builtin.str(\\\"abcdefghijklmnopqrstuvwxyz\\\"),a.ascii_uppercase=new Sk.builtin.str(\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"),a.ascii_letters=new Sk.builtin.str(a.ascii_lowercase.v+a.ascii_uppercase.v),a.lowercase=new Sk.builtin.str(\\\"abcdefghijklmnopqrstuvwxyz\\\"),a.uppercase=new Sk.builtin.str(\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"),a.letters=new Sk.builtin.str(a.lowercase.v+a.uppercase.v),a.digits=new Sk.builtin.str(\\\"0123456789\\\"),a.hexdigits=new Sk.builtin.str(\\\"0123456789abcdefABCDEF\\\"),a.octdigits=new Sk.builtin.str(\\\"01234567\\\"),a.punctuation=new Sk.builtin.str(\\\"!\\\\\\\"#$%&'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~\\\"),a.whitespace=new Sk.builtin.str(\\\"\\\\t\\\\n\\\\x0B\\\\f\\\\r \\\"),a.printable=new Sk.builtin.str(a.digits.v+a.letters.v+a.punctuation.v+\\\" \\\\t\\\\n\\\\r\\\\x0B\\\\f\\\"),a.split=new Sk.builtin.func(function(...a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.split,a)}),a.capitalize=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.capitalize,[a])}),a.join=new Sk.builtin.func(function(a,b){return void 0===b&&(b=new Sk.builtin.str(\\\" \\\")),Sk.misceval.callsimArray(Sk.builtin.str.prototype.join,[b,a])}),a.capwords=new Sk.builtin.func(function(b,c){if(Sk.builtin.pyCheckArgsLen(\\\"capwords\\\",arguments.length,1,2),!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\\\"s must be a string\\\");if(void 0===c&&(c=new Sk.builtin.str(\\\" \\\")),!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\\\"sep must be a string\\\");for(var d=Sk.misceval.callsimArray(a.split,[b,c]).v,e=[],f=0;f\\n\\nimport re, string\\n\\n__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten']\\n\\n# Hardcode the recognized whitespace characters to the US-ASCII\\n# whitespace characters. The main reason for doing this is that\\n# some Unicode spaces (like \\\\u00a0) are non-breaking whitespaces.\\n_whitespace = '\\\\t\\\\n\\\\x0b\\\\x0c\\\\r '\\n\\nclass TextWrapper:\\n \\\"\\\"\\\"\\n Object for wrapping/filling text. The public interface consists of\\n the wrap() and fill() methods; the other methods are just there for\\n subclasses to override in order to tweak the default behaviour.\\n If you want to completely replace the main wrapping algorithm,\\n you'll probably have to override _wrap_chunks().\\n Several instance attributes control various aspects of wrapping:\\n width (default: 70)\\n the maximum width of wrapped lines (unless break_long_words\\n is false)\\n initial_indent (default: \\\"\\\")\\n string that will be prepended to the first line of wrapped\\n output. Counts towards the line's width.\\n subsequent_indent (default: \\\"\\\")\\n string that will be prepended to all lines save the first\\n of wrapped output; also counts towards each line's width.\\n expand_tabs (default: true)\\n Expand tabs in input text to spaces before further processing.\\n Each tab will become 0 .. 'tabsize' spaces, depending on its position\\n in its line. If false, each tab is treated as a single character.\\n tabsize (default: 8)\\n Expand tabs in input text to 0 .. 'tabsize' spaces, unless\\n 'expand_tabs' is false.\\n replace_whitespace (default: true)\\n Replace all whitespace characters in the input text by spaces\\n after tab expansion. Note that if expand_tabs is false and\\n replace_whitespace is true, every tab will be converted to a\\n single space!\\n fix_sentence_endings (default: false)\\n Ensure that sentence-ending punctuation is always followed\\n by two spaces. Off by default because the algorithm is\\n (unavoidably) imperfect.\\n break_long_words (default: true)\\n Break words longer than 'width'. If false, those words will not\\n be broken, and some lines might be longer than 'width'.\\n break_on_hyphens (default: true)\\n Allow breaking hyphenated words. If true, wrapping will occur\\n preferably on whitespaces and right after hyphens part of\\n compound words.\\n drop_whitespace (default: true)\\n Drop leading and trailing whitespace from lines.\\n max_lines (default: None)\\n Truncate wrapped lines.\\n placeholder (default: ' [...]')\\n Append to the last line of truncated text.\\n \\\"\\\"\\\"\\n\\n unicode_whitespace_trans = {}\\n # uspace = ord(' ')\\n uspace = ' '\\n for x in _whitespace:\\n # unicode_whitespace_trans[ord(x)] = uspace\\n unicode_whitespace_trans[x] = uspace\\n\\n # This funky little regex is just the trick for splitting\\n # text up into word-wrappable chunks. E.g.\\n # \\\"Hello there -- you goof-ball, use the -b option!\\\"\\n # splits into\\n # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!\\n # (after stripping out empty strings).\\n wordsep_re = re.compile(\\n r'(\\\\s+|' # any whitespace\\n r'[^\\\\s\\\\w]*\\\\w+[^0-9\\\\W]-(?=\\\\w+[^0-9\\\\W]))') # hyphenated words\\n em_dash = re.compile(r'(\\\\s+|' # any whitespace\\n r'[^\\\\s\\\\w]*\\\\w+[^0-9\\\\W]-(?=\\\\w+[^0-9\\\\W])|' # hyphenated words\\n r'(?!^)-{2,}(?=\\\\w))') # em-dash\\n\\n \\n # This less funky little regex just split on recognized spaces. E.g.\\n # \\\"Hello there -- you goof-ball, use the -b option!\\\"\\n # splits into\\n # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/\\n wordsep_simple_re = re.compile(r'(\\\\s+)')\\n\\n\\n # XXX this is not locale- or charset-aware -- string.lowercase\\n # is US-ASCII only (and therefore English-only)\\n sentence_end_re = re.compile(r'[a-z]' # lowercase letter\\n r'[\\\\.\\\\!\\\\?]' # sentence-ending punct.\\n r'[\\\\\\\"\\\\']?' # optional end-of-quote\\n r'\\\\Z') # end of chunk\\n sentence_end_re = r'[a-z][\\\\.\\\\!\\\\?][\\\\\\\"\\\\']?'\\n\\n def __init__(self,\\n width=70,\\n initial_indent=\\\"\\\",\\n subsequent_indent=\\\"\\\",\\n expand_tabs=True,\\n replace_whitespace=True,\\n fix_sentence_endings=False,\\n break_long_words=True,\\n drop_whitespace=True,\\n break_on_hyphens=True,\\n tabsize=8,\\n max_lines=None,\\n placeholder=' [...]'):\\n self.width = width\\n self.initial_indent = initial_indent\\n self.subsequent_indent = subsequent_indent\\n self.expand_tabs = expand_tabs\\n self.replace_whitespace = replace_whitespace\\n self.fix_sentence_endings = fix_sentence_endings\\n self.break_long_words = break_long_words\\n self.drop_whitespace = drop_whitespace\\n self.break_on_hyphens = break_on_hyphens\\n self.tabsize = tabsize\\n self.max_lines = max_lines\\n self.placeholder = placeholder\\n\\n\\n # -- Private methods -----------------------------------------------\\n # (possibly useful for subclasses to override)\\n\\n def _munge_whitespace(self, text):\\n \\\"\\\"\\\"_munge_whitespace(text : string) -> string\\n Munge whitespace in text: expand tabs and convert all other\\n whitespace characters to spaces. Eg. \\\" foo\\\\\\\\tbar\\\\\\\\n\\\\\\\\nbaz\\\"\\n becomes \\\" foo bar baz\\\".\\n \\\"\\\"\\\"\\n if self.expand_tabs:\\n text = text.expandtabs(self.tabsize)\\n if self.replace_whitespace:\\n for key, val in self.unicode_whitespace_trans.items():\\n text = text.replace(key, val)\\n return text\\n\\n\\n def _split(self, text):\\n \\\"\\\"\\\"_split(text : string) -> [string]\\n Split the text to wrap into indivisible chunks. Chunks are\\n not quite the same as words; see _wrap_chunks() for full\\n details. As an example, the text\\n Look, goof-ball -- use the -b option!\\n breaks into the following chunks:\\n 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',\\n 'use', ' ', 'the', ' ', '-b', ' ', 'option!'\\n if break_on_hyphens is True, or in:\\n 'Look,', ' ', 'goof-ball', ' ', '--', ' ',\\n 'use', ' ', 'the', ' ', '-b', ' ', option!'\\n otherwise.\\n \\\"\\\"\\\"\\n if self.break_on_hyphens is True:\\n chunks = self.wordsep_re.split(text)\\n if \\\"--\\\" in text:\\n chunks = [item \\n for sublist in [self.em_dash.split(chunk) for chunk in chunks] \\n for item in sublist]\\n else:\\n chunks = self.wordsep_simple_re.split(text)\\n chunks = [c for c in chunks if c]\\n return chunks\\n\\n def _fix_sentence_endings(self, chunks):\\n \\\"\\\"\\\"_fix_sentence_endings(chunks : [string])\\n Correct for sentence endings buried in 'chunks'. Eg. when the\\n original text contains \\\"... foo.\\\\\\\\nBar ...\\\", munge_whitespace()\\n and split() will convert that to [..., \\\"foo.\\\", \\\" \\\", \\\"Bar\\\", ...]\\n which has one too few spaces; this method simply changes the one\\n space to two.\\n \\\"\\\"\\\"\\n i = 0\\n # patsearch = self.sentence_end_re.search\\n while i < len(chunks)-1:\\n if chunks[i+1] == \\\" \\\" and re.search(self.sentence_end_re, chunks[i]) and chunks[i][-1] in \\\".!?\\\\\\\"\\\\'\\\":\\n chunks[i+1] = \\\" \\\"\\n i += 2\\n else:\\n i += 1\\n\\n def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):\\n \\\"\\\"\\\"_handle_long_word(chunks : [string],\\n cur_line : [string],\\n cur_len : int, width : int)\\n Handle a chunk of text (most likely a word, not whitespace) that\\n is too long to fit in any line.\\n \\\"\\\"\\\"\\n # Figure out when indent is larger than the specified width, and make\\n # sure at least one character is stripped off on every pass\\n if width < 1:\\n space_left = 1\\n else:\\n space_left = width - cur_len\\n\\n # If we're allowed to break long words, then do so: put as much\\n # of the next chunk onto the current line as will fit.\\n if self.break_long_words:\\n cur_line.append(reversed_chunks[-1][:space_left])\\n reversed_chunks[-1] = reversed_chunks[-1][space_left:]\\n\\n # Otherwise, we have to preserve the long word intact. Only add\\n # it to the current line if there's nothing already there --\\n # that minimizes how much we violate the width constraint.\\n elif not cur_line:\\n cur_line.append(reversed_chunks.pop())\\n\\n # If we're not allowed to break long words, and there's already\\n # text on the current line, do nothing. Next time through the\\n # main loop of _wrap_chunks(), we'll wind up here again, but\\n # cur_len will be zero, so the next line will be entirely\\n # devoted to the long word that we can't handle right now.\\n\\n def _wrap_chunks(self, chunks):\\n \\\"\\\"\\\"_wrap_chunks(chunks : [string]) -> [string]\\n Wrap a sequence of text chunks and return a list of lines of\\n length 'self.width' or less. (If 'break_long_words' is false,\\n some lines may be longer than this.) Chunks correspond roughly\\n to words and the whitespace between them: each chunk is\\n indivisible (modulo 'break_long_words'), but a line break can\\n come between any two chunks. Chunks should not have internal\\n whitespace; ie. a chunk is either all whitespace or a \\\"word\\\".\\n Whitespace chunks will be removed from the beginning and end of\\n lines, but apart from that whitespace is preserved.\\n \\\"\\\"\\\"\\n lines = []\\n if self.width <= 0:\\n raise ValueError(\\\"invalid width %r (must be > 0)\\\" % self.width)\\n if self.max_lines is not None:\\n if self.max_lines > 1:\\n indent = self.subsequent_indent\\n else:\\n indent = self.initial_indent\\n if len(indent) + len(self.placeholder.lstrip()) > self.width:\\n raise ValueError(\\\"placeholder too large for max width\\\")\\n\\n # Arrange in reverse order so items can be efficiently popped\\n # from a stack of chucks.\\n chunks.reverse()\\n\\n while chunks:\\n\\n # Start the list of chunks that will make up the current line.\\n # cur_len is just the length of all the chunks in cur_line.\\n cur_line = []\\n cur_len = 0\\n\\n # Figure out which static string will prefix this line.\\n if lines:\\n indent = self.subsequent_indent\\n else:\\n indent = self.initial_indent\\n\\n # Maximum width for this line.\\n width = self.width - len(indent)\\n\\n # First chunk on line is whitespace -- drop it, unless this\\n # is the very beginning of the text (ie. no lines started yet).\\n if self.drop_whitespace and chunks[-1].strip() == '' and lines:\\n del chunks[-1]\\n\\n while chunks:\\n l = len(chunks[-1])\\n\\n # Can at least squeeze this chunk onto the current line.\\n if cur_len + l <= width:\\n cur_line.append(chunks.pop())\\n cur_len += l\\n\\n # Nope, this line is full.\\n else:\\n break\\n\\n # The current line is full, and the next chunk is too big to\\n # fit on *any* line (not just this one).\\n if chunks and len(chunks[-1]) > width:\\n self._handle_long_word(chunks, cur_line, cur_len, width)\\n cur_len = sum(map(len, cur_line))\\n\\n # If the last chunk on this line is all whitespace, drop it.\\n if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':\\n cur_len -= len(cur_line[-1])\\n del cur_line[-1]\\n\\n if cur_line:\\n if (self.max_lines is None or\\n len(lines) + 1 < self.max_lines or\\n (not chunks or\\n self.drop_whitespace and\\n len(chunks) == 1 and\\n not chunks[0].strip()) and cur_len <= width):\\n # Convert current line back to a string and store it in\\n # list of all lines (return value).\\n lines.append(indent + ''.join(cur_line))\\n else:\\n while cur_line:\\n if (cur_line[-1].strip() and\\n cur_len + len(self.placeholder) <= width):\\n cur_line.append(self.placeholder)\\n lines.append(indent + ''.join(cur_line))\\n break\\n cur_len -= len(cur_line[-1])\\n del cur_line[-1]\\n else:\\n if lines:\\n prev_line = lines[-1].rstrip()\\n if (len(prev_line) + len(self.placeholder) <=\\n self.width):\\n lines[-1] = prev_line + self.placeholder\\n break\\n lines.append(indent + self.placeholder.lstrip())\\n break\\n\\n return lines\\n\\n def _split_chunks(self, text):\\n text = self._munge_whitespace(text)\\n return self._split(text)\\n\\n # -- Public interface ----------------------------------------------\\n\\n def wrap(self, text):\\n \\\"\\\"\\\"wrap(text : string) -> [string]\\n Reformat the single paragraph in 'text' so it fits in lines of\\n no more than 'self.width' columns, and return a list of wrapped\\n lines. Tabs in 'text' are expanded with string.expandtabs(),\\n and all other whitespace characters (including newline) are\\n converted to space.\\n \\\"\\\"\\\"\\n chunks = self._split_chunks(text)\\n if self.fix_sentence_endings:\\n self._fix_sentence_endings(chunks)\\n return self._wrap_chunks(chunks)\\n\\n def fill(self, text):\\n \\\"\\\"\\\"fill(text : string) -> string\\n Reformat the single paragraph in 'text' to fit in lines of no\\n more than 'self.width' columns, and return a new string\\n containing the entire wrapped paragraph.\\n \\\"\\\"\\\"\\n return \\\"\\\\n\\\".join(self.wrap(text))\\n\\n\\n# -- Convenience interface ---------------------------------------------\\n\\ndef wrap(text, width=70, **kwargs):\\n \\\"\\\"\\\"Wrap a single paragraph of text, returning a list of wrapped lines.\\n Reformat the single paragraph in 'text' so it fits in lines of no\\n more than 'width' columns, and return a list of wrapped lines. By\\n default, tabs in 'text' are expanded with string.expandtabs(), and\\n all other whitespace characters (including newline) are converted to\\n space. See TextWrapper class for available keyword args to customize\\n wrapping behaviour.\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, **kwargs)\\n return w.wrap(text)\\n\\ndef fill(text, width=70, **kwargs):\\n \\\"\\\"\\\"Fill a single paragraph of text, returning a new string.\\n Reformat the single paragraph in 'text' to fit in lines of no more\\n than 'width' columns, and return a new string containing the entire\\n wrapped paragraph. As with wrap(), tabs are expanded and other\\n whitespace characters converted to space. See TextWrapper class for\\n available keyword args to customize wrapping behaviour.\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, **kwargs)\\n return w.fill(text)\\n\\ndef shorten(text, width, **kwargs):\\n \\\"\\\"\\\"Collapse and truncate the given text to fit in the given width.\\n The text first has its whitespace collapsed. If it then fits in\\n the *width*, it is returned as is. Otherwise, as many words\\n as possible are joined and then the placeholder is appended::\\n >>> textwrap.shorten(\\\"Hello world!\\\", width=12)\\n 'Hello world!'\\n >>> textwrap.shorten(\\\"Hello world!\\\", width=11)\\n 'Hello [...]'\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, max_lines=1, **kwargs)\\n return w.fill(' '.join(text.strip().split()))\\n\\n\\n# -- Loosely related functionality -------------------------------------\\n\\n# _whitespace_only_re = re.compile('^[ \\\\t]+$', re.MULTILINE)\\n# _leading_whitespace_re = re.compile('(^[ \\\\t]*)(?:[^ \\\\t\\\\n])', re.MULTILINE)\\n\\ndef dedent(text):\\n \\\"\\\"\\\"Remove any common leading whitespace from every line in `text`.\\n This can be used to make triple-quoted strings line up with the left\\n edge of the display, while still presenting them in the source code\\n in indented form.\\n Note that tabs and spaces are both treated as whitespace, but they\\n are not equal: the lines \\\" hello\\\" and \\\"\\\\\\\\thello\\\" are\\n considered to have no common leading whitespace.\\n Entirely blank lines are normalized to a newline character.\\n \\\"\\\"\\\"\\n # Look for the longest leading string of spaces and tabs common to\\n # all lines.\\n margin = None\\n\\n indents = re.findall(r'(^[ \\\\t]*)(?:[^ \\\\t\\\\n])',text, re.MULTILINE)\\n for indent in indents:\\n if margin is None:\\n margin = indent\\n\\n # Current line more deeply indented than previous winner:\\n # no change (previous winner is still on top).\\n elif indent.startswith(margin):\\n pass\\n\\n # Current line consistent with and no deeper than previous winner:\\n # it's the new winner.\\n elif margin.startswith(indent):\\n margin = indent\\n\\n # Find the largest common whitespace between current line and previous\\n # winner.\\n else:\\n for i, (x, y) in enumerate(zip(margin, indent)):\\n if x != y:\\n margin = margin[:i]\\n break\\n # sanity check (testing/debugging only)\\n if 0 and margin:\\n for line in text.split(\\\"\\\\n\\\"):\\n assert not line or line.startswith(margin), \\\\\\n \\\"line = %r, margin = %r\\\" % (line, margin)\\n\\n if margin:\\n lines = [line[len(margin):] \\n if line.strip()\\n else line.strip() \\n for line in text.split(\\\"\\\\n\\\")]\\n text = \\\"\\\\n\\\".join(lines)\\n return text\\n\\n\\ndef indent(text, prefix, predicate=None):\\n \\\"\\\"\\\"Adds 'prefix' to the beginning of selected lines in 'text'.\\n If 'predicate' is provided, 'prefix' will only be added to the lines\\n where 'predicate(line)' is True. If 'predicate' is not provided,\\n it will default to adding 'prefix' to all non-empty lines that do not\\n consist solely of whitespace characters.\\n \\\"\\\"\\\"\\n if predicate is None:\\n def predicate(line):\\n return line.strip()\\n\\n def prefixed_lines():\\n for line in text.splitlines(True):\\n yield (prefix + line if predicate(line) else line)\\n return ''.join(prefixed_lines())\\n\\n\\nif __name__ == \\\"__main__\\\":\\n #print dedent(\\\"\\\\tfoo\\\\n\\\\tbar\\\")\\n #print dedent(\\\" \\\\thello there\\\\n \\\\t how are you?\\\")\\n print(dedent(\\\"Hello there.\\\\n This is indented.\\\"))\",\"src/lib/this.py\":\"raise NotImplementedError(\\\"this is not yet implemented in Skulpt\\\")\\n\",\"src/lib/threading.py\":\"raise NotImplementedError(\\\"threading is not yet implemented in Skulpt\\\")\\n\",\"src/lib/time.js\":\"var $builtinmodule=function(){function check_struct_time(a){if(!(a instanceof b))throw new Sk.builtin.TypeError(\\\"Required argument 'struct_time' must be of type: 'struct_time'\\\");var c,d=a.v.length,e=a.v;for(c=0;c\\\",function jsReadline(){const b=Sk.misceval.callsimArray(a);return Sk.ffi.remapToJs(b)},\\\"UTF-8\\\",function receiveToken(a){b.push(new Sk.builtin.tuple([Sk.ffi.remapToPy(a.type),Sk.ffi.remapToPy(a.string),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.start[0]),Sk.ffi.remapToPy(a.start[1])]),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.end[0]),Sk.ffi.remapToPy(a.end[1])]),Sk.ffi.remapToPy(a.line)]))}),new Sk.builtin.list(b)})};return a};\",\"src/lib/trace.py\":\"raise NotImplementedError(\\\"trace is not yet implemented in Skulpt\\\")\\n\",\"src/lib/traceback.py\":\"raise NotImplementedError(\\\"traceback is not yet implemented in Skulpt\\\")\\n\",\"src/lib/tty.py\":\"raise NotImplementedError(\\\"tty is not yet implemented in Skulpt\\\")\\n\",\"src/lib/turtle.js\":\"var $builtinmodule=function(){\\\"use strict\\\";var e=function getConfiguredTarget(){var e,t;for(e=Sk.TurtleGraphics&&Sk.TurtleGraphics.target||\\\"turtle\\\",t=\\\"string\\\"==typeof e?document.getElementById(e):e;t.firstChild;)t.removeChild(t.firstChild);return t}();return e.turtleInstance?e.turtleInstance.reset():e.turtleInstance=function generateTurtleModule(e){var t=Math.round,r=Math.max,n=Math.sqrt,a=Math.min,s=Math.abs,o=Math.PI,d=Math.atan2,_=Math.sin,c=Math.cos;function getAsset(e){var t=g.assets,r=\\\"function\\\"==typeof t?t(e):t[e];return\\\"string\\\"==typeof r?new Promise(function(t,n){var a=new Image;a.onload=function(){g.assets[e]=this,t(a)},a.onerror=function(){n(new Error(\\\"Missing asset: \\\"+r))},a.src=r}):new InstantPromise(void 0,r)}function InstantPromise(e,t){this.lastResult=t,this.lastError=e}function FrameManager(){this.reset()}function getFrameManager(){return A||(A=new FrameManager),A}function MouseHandler(){var t=this;for(var r in this._target=getTarget(),this._managers={},this._handlers={mousedown:function(r){t.onEvent(\\\"mousedown\\\",r)},mouseup:function(r){t.onEvent(\\\"mouseup\\\",r)},mousemove:function(r){t.onEvent(\\\"mousemove\\\",r)}},this._handlers)this._target.addEventListener(r,this._handlers[r])}function EventManager(e,t){this._type=e,this._target=t,this._handlers=void 0,getMouseHandler().addManager(e,this)}function Turtle(e){if(getFrameManager().addTurtle(this),this._screen=getScreen(),this._managers={},this._shape=e.v,!v.hasOwnProperty(this._shape))throw new Sk.builtin.ValueError(\\\"Shape:'\\\"+this._shape+\\\"' not in default shape, please check shape again!\\\");this.reset()}function Screen(){var e,t;this._frames=1,this._delay=void 0,this._bgcolor=\\\"none\\\",this._mode=\\\"standard\\\",this._managers={},this._keyLogger={},e=(g.worldWidth||g.width||getWidth())/2,t=(g.worldHeight||g.height||getHeight())/2,this.setUpWorld(-e,-t,e,t)}function ensureAnonymous(){return f||(f=Sk.misceval.callsimArray(y.Turtle)),f.instance}function getTarget(){return e}function getScreen(){return p||(p=new Screen),p}function getMouseHandler(){return h||(h=new MouseHandler),h}function getWidth(){return 0|(p&&p._width||g.width||getTarget().clientWidth||T.width)}function getHeight(){return 0|(p&&p._height||g.height||getTarget().clientHeight||T.height)}function createLayer(e,t){var r,n=document.createElement(\\\"canvas\\\"),a=getWidth(),s=getHeight(),l=getTarget().firstChild?-s+\\\"px\\\":\\\"0\\\";return n.width=a,n.height=s,n.style.position=\\\"relative\\\",n.style.display=\\\"block\\\",n.style.setProperty(\\\"margin-top\\\",l),n.style.setProperty(\\\"z-index\\\",e),t&&(n.style.display=\\\"none\\\"),getTarget().appendChild(n),r=n.getContext(\\\"2d\\\"),r.lineCap=\\\"round\\\",r.lineJoin=\\\"round\\\",applyWorld(getScreen(),r),r}function cancelAnimationFrame(){u&&((window.cancelAnimationFrame||window.mozCancelAnimationFrame)(u),u=void 0),m&&(window.clearTimeout(m),m=void 0)}function applyWorld(e,t){var r=e.llx,n=e.lly,a=e.urx,s=e.ury,l=e.xScale,i=e.yScale;t&&(clearLayer(t),t.restore(),t.save(),t.scale(1/l,1/i),t.translate(-r,-s))}function pushUndo(e){var t,r,n;if(g.allowUndo&&e._bufferSize){for(e._undoBuffer||(e._undoBuffer=[]);e._undoBuffer.length>e._bufferSize;)e._undoBuffer.shift();for(r={},t=[\\\"x\\\",\\\"y\\\",\\\"angle\\\",\\\"radians\\\",\\\"color\\\",\\\"fill\\\",\\\"down\\\",\\\"filling\\\",\\\"shown\\\",\\\"shape\\\",\\\"size\\\"],n=0;no;o++)if(\\\"number\\\"==typeof t[o])t[o]=r(0,a(255,parseInt(t[o])));else throw new Sk.builtin.ValueError(\\\"bad color sequence\\\");}else for(o=0;3>o;o++)if(\\\"number\\\"!=typeof t[o])throw new Sk.builtin.ValueError(\\\"bad color sequence\\\");else if(1>=t[o])t[o]=r(0,a(255,parseInt(255*t[o])));else throw new Sk.builtin.ValueError(\\\"bad color sequence\\\");\\\"number\\\"==typeof t[o]?(t[3]=r(0,a(1,t[o])),t=\\\"rgba(\\\"+t.join(\\\",\\\")+\\\")\\\"):t=\\\"rgb(\\\"+t.slice(0,3).join(\\\",\\\")+\\\")\\\"}else if(\\\"string\\\"==typeof t&&!t.match(/\\\\s*url\\\\s*\\\\(/i))t=t.replace(/\\\\s+/g,\\\"\\\");else return\\\"black\\\";return t}function calculateHeading(e,t,r){var n=e._angle||0,a=e._radians||0;return r||(r={}),\\\"number\\\"==typeof t&&(e._isRadians?n=a=t%Turtle.RADIANS:e._fullCircle?(n=t%e._fullCircle,a=n/e._fullCircle*Turtle.RADIANS):n=a=0,0>n&&(n+=e._fullCircle,a+=Turtle.RADIANS)),r.angle=n,r.radians=a,r}function pythonToJavascriptFunction(e,t){return function(){var r=Array.prototype.slice.call(arguments),n=r.map(function(e){return Sk.ffi.remapToPy(e)});return\\\"undefined\\\"!=typeof t&&n.unshift(t),Sk.misceval.applyAsync(void 0,e,void 0,void 0,void 0,n).catch(Sk.uncaughtException)}}function addModuleMethod(e,t,r,n){var a,s=r.replace(/^\\\\$/,\\\"\\\"),l=s.replace(/_\\\\$[a-z]+\\\\$$/i,\\\"\\\"),o=e.prototype[r].length,d=e.prototype[r].minArgs,_=e.prototype[r].co_varnames||[],c=e.prototype[r].returnType,u=e.prototype[r].isSk;void 0===d&&(d=o),a=function(){var e,t,a,s,_,m=Array.prototype.slice.call(arguments,0),p=n?n():m.shift().instance;if(m.lengtho)throw _=d===o?\\\"exactly \\\"+o:\\\"between \\\"+d+\\\" and \\\"+o,new Sk.builtin.TypeError(l+\\\"() takes \\\"+_+\\\" positional argument(s) (\\\"+m.length+\\\" given)\\\");for(e=m.length;0<=--e;)void 0!==m[e]&&(m[e]=m[e]instanceof Sk.builtin.func?pythonToJavascriptFunction(m[e]):m[e]instanceof Sk.builtin.method?pythonToJavascriptFunction(m[e].im_func,m[e].im_self):m[e]&&m[e].$d instanceof Sk.builtin.dict&&m[e].instance?m[e].instance:Sk.ffi.remapToJs(m[e]));var g=m.slice(0);for(m=[],e=g.length;0<=e;--e)null!==g[e]&&(m[e]=g[e]);try{t=p[r].apply(p,m)}catch(t){throw window&&window.console&&(window.console.log(\\\"wrapped method failed\\\"),window.console.log(t.stack)),t}return t instanceof InstantPromise&&(t=t.lastResult),t instanceof Promise?(t=t.catch(function(t){throw window&&window.console&&(window.console.log(\\\"promise failed\\\"),window.console.log(t.stack)),t}),a=new Sk.misceval.Suspension,a.resume=function(){return void 0===s?Sk.builtin.none.none$:Sk.ffi.remapToPy(s)},a.data={type:\\\"Sk.promise\\\",promise:t.then(function(e){return s=e,e})},a):void 0===t?Sk.builtin.none.none$:u?t:\\\"function\\\"==typeof c?c(t):Sk.ffi.remapToPy(t)},a.co_name=new Sk.builtin.str(l),a.co_varnames=_.slice(),a.$defaults=[];for(var m=d;m<_.length;m++)a.$defaults.push(Sk.builtin.none.none$);n||a.co_varnames.unshift(\\\"self\\\"),t[s]=new Sk.builtin.func(a)}function initTurtle(e,t){Sk.builtin.pyCheckArgs(\\\"__init__\\\",arguments,2,3,!1,!1),e.instance=new Turtle(t),e.instance.skInstance=e}function focusTurtle(e){return void 0!==e&&(w=!!e,w?getTarget().focus():getTarget().blur()),w}function resetTurtle(){for(cancelAnimationFrame(),getScreen().reset(),getFrameManager().reset();e.firstChild;)e.removeChild(e.firstChild);h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}function stopTurtle(){cancelAnimationFrame(),h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}var u,m,p,g,f,h,y={__name__:new Sk.builtin.str(\\\"turtle\\\")},$=0,w=!0,b=1e3/30,v={},k=0,x={},T={target:\\\"turtle\\\",width:400,height:400,worldWidth:0,worldHeight:0,animate:!0,bufferSize:0,allowUndo:!0,assets:{}};e.hasAttribute(\\\"tabindex\\\")||e.setAttribute(\\\"tabindex\\\",0),x.FLOAT=function(e){return new Sk.builtin.float_(e)},x.COLOR=function(e){if(\\\"string\\\"==typeof e)return new Sk.builtin.str(e);for(var t=0;3>t;t++)e[t]=Sk.builtin.assk$(e[t]);return 4===e.length&&(e[3]=new Sk.builtin.float_(e[3])),new Sk.builtin.tuple(e)},x.TURTLE_LIST=function(e){for(var t=[],r=0;rt&&(t+=this._fullCircle),this.rotate(e,t-e)},e.getManager=function(e){return this._managers[e]||(this._managers[e]=new EventManager(e,this)),this._managers[e]},e.getPaper=function(){return this._paper||(this._paper=createLayer(2))},e.reset=function(){for(var e in this._x=0,this._y=0,this._radians=0,this._angle=0,this._shown=!0,this._down=!0,this._color=\\\"black\\\",this._fill=\\\"black\\\",this._size=1,this._filling=!1,this._undoBuffer=[],this._speed=3,this._computed_speed=5,this._colorMode=1,this._state=void 0,this._managers)this._managers[e].reset();this._isRadians=!1,this._fullCircle=360,this._bufferSize=\\\"number\\\"==typeof g.bufferSize?g.bufferSize:0,removeLayer(this._paper),this._paper=void 0},e.$degrees=function(e){return e=\\\"number\\\"==typeof e?s(e):360,this._isRadians=!1,this._angle=e&&this._fullCircle?this._angle/this._fullCircle*e:this._radians=0,this._fullCircle=e,this.addUpdate(void 0,!1,{angle:this._angle,radians:this._radians})},e.$degrees.minArgs=0,e.$degrees.co_varnames=[\\\"fullcircle\\\"],e.$degrees.returnType=x.FLOAT,e.$radians=function(){return this._isRadians||(this._isRadians=!0,this._angle=this._radians,this._fullCircle=Turtle.RADIANS),this._angle},e.$radians.returnType=x.FLOAT,e.$position=e.$pos=function(){return[this.$xcor(),this.$ycor()]},e.$position.returnType=function(e){return new Sk.builtin.tuple([new Sk.builtin.float_(e[0]),new Sk.builtin.float_(e[1])])},e.$towards=function(e,t){var r=getCoordinates(e,t),n=o+d(this._y-r.y,this._x-r.x),a=n*(this._fullCircle/Turtle.RADIANS);return a},e.$towards.co_varnames=[\\\"x\\\",\\\"y\\\"],e.$towards.minArgs=1,e.$towards.returnType=x.FLOAT,e.$distance=function(e,t){var r=getCoordinates(e,t),a=r.x-this._x,s=r.y-this._y;return n(a*a+s*s)},e.$distance.co_varnames=[\\\"x\\\",\\\"y\\\"],e.$distance.minArgs=1,e.$distance.returnType=x.FLOAT,e.$heading=function(){return 1e-13>s(this._angle)?0:this._angle},e.$heading.returnType=x.FLOAT,e.$xcor=function(){return 1e-13>s(this._x)?0:this._x},e.$xcor.returnType=x.FLOAT,e.$ycor=function(){return 1e-13>s(this._y)?0:this._y},e.$ycor.returnType=x.FLOAT,e.$forward=e.$fd=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,e)},e.$forward.co_varnames=e.$fd.co_varnames=[\\\"distance\\\"],e.$undo=function(){popUndo(this)},e.$undobufferentries=function(){return this._undoBuffer.length},e.$setundobuffer=function(e){this._bufferSize=\\\"number\\\"==typeof e?a(s(e),1e3):0},e.$setundobuffer.co_varnames=[\\\"size\\\"],e.$backward=e.$back=e.$bk=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,-e)},e.$backward.co_varnames=e.$back.co_varnames=e.$bk.co_varnames=[\\\"distance\\\"],e.$goto_$rw$=e.$setpos=e.$setposition=function(e,t){var r=getCoordinates(e,t);return pushUndo(this),this.translate(this._x,this._y,r.x-this._x,r.y-this._y,!0)},e.$goto_$rw$.co_varnames=e.$setpos.co_varnames=e.$setposition.co_varnames=[\\\"x\\\",\\\"y\\\"],e.$goto_$rw$.minArgs=e.$setpos.minArgs=e.$setposition.minArgs=1,e.$setx=function(e){return this.translate(this._x,this._y,e-this._x,0,!0)},e.$setx.co_varnames=[\\\"x\\\"],e.$sety=function(e){return this.translate(this._x,this._y,0,e-this._y,!0)},e.$sety.co_varnames=[\\\"y\\\"],e.$home=function(){var e=this,t=this._angle;return pushUndo(this),e.translate(this._x,this._y,-this._x,-this._y,!0).then(function(){return e.queueTurnTo(t,0)}).then(function(){})},e.$right=e.$rt=function(e){return pushUndo(this),this.rotate(this._angle,-e)},e.$right.co_varnames=e.$rt.co_varnames=[\\\"angle\\\"],e.$left=e.$lt=function(e){return pushUndo(this),this.rotate(this._angle,e)},e.$left.co_varnames=e.$lt.co_varnames=[\\\"angle\\\"],e.$setheading=e.$seth=function(e){return pushUndo(this),this.queueTurnTo(this._angle,e)},e.$setheading.co_varnames=e.$seth.co_varnames=[\\\"angle\\\"],e.$circle=function(e,t,r){var n,d,u,m,p,g,f,h,$,b=this,v=this._x,k=this._y,T=this._angle,A={},L=1/getScreen().lineScale,S=!0;for(pushUndo(this),void 0===t&&(t=b._fullCircle),void 0===r&&(d=s(t)/b._fullCircle,r=1+(0|a(11+s(e*L)/6,59)*d)),u=t/r,m=.5*u,p=2*e*_(u*o/b._fullCircle),0>e?(p=-p,u=-u,m=-m,n=T-t):n=T+t,$=getFrameManager().willRenderNext()?Promise.resolve():new InstantPromise,T+=m,g=0;g=e&&(e=getWidth()*e),1>=t&&(t=getHeight()*t),this._width=e,this._height=t,this._xOffset=void 0===r||isNaN(parseInt(r))?0:parseInt(r),this._yOffset=void 0===n||isNaN(parseInt(n))?0:parseInt(n),\\\"world\\\"===this._mode?this._setworldcoordinates(this.llx,this.lly,this.urx,this.ury):this._setworldcoordinates(-e/2,-t/2,e/2,t/2)},e.$setup.minArgs=0,e.$setup.co_varnames=[\\\"width\\\",\\\"height\\\",\\\"startx\\\",\\\"starty\\\"],e.$register_shape=e.$addshape=function(e,t){return t?void(v[e]=t):getAsset(e).then(function(t){v[e]=t})},e.$register_shape.minArgs=1,e.$getshapes=function(){return Object.keys(v)},e.$tracer=function(e,t){return void 0!==e||void 0!==t?(\\\"number\\\"==typeof t&&(this._delay=t,getFrameManager().refreshInterval(t)),\\\"number\\\"==typeof e?(this._frames=e,getFrameManager().frameBuffer(e)):void 0):this._frames},e.$tracer.co_varnames=[\\\"frames\\\",\\\"delay\\\"],e.$tracer.minArgs=0,e.$delay=function(e){return void 0===e?void 0===this._delay?b:this._delay:this.$tracer(void 0,e)},e.$delay.co_varnames=[\\\"delay\\\"],e._setworldcoordinates=function(e,t,r,n){var a=this,s=getFrameManager().turtles();return this.setUpWorld(e,t,r,n),this._sprites&&applyWorld(this,this._sprites),this._background&&applyWorld(this,this._background),this.$clear()},e.$setworldcoordinates=function(e,t,r,n){return this._mode=\\\"world\\\",this._setworldcoordinates(e,t,r,n)},e.$setworldcoordinates.co_varnames=[\\\"llx\\\",\\\"lly\\\",\\\"urx\\\",\\\"ury\\\"],e.minArgs=4,e.$clear=e.$clearscreen=function(){return this.reset(),this.$reset()},e.$update=function(){return getFrameManager().update()},e.$reset=e.$resetscreen=function(){var e=this,t=getFrameManager().turtles();return getFrameManager().addFrame(function(){applyWorld(e,e._sprites),applyWorld(e,e._background);for(var r=0;r 1:\\n print('Running %s' % self.cleanName(func))\\n try:\\n self.setUp()\\n self.assertPassed = 0\\n self.assertFailed = 0\\n func()\\n self.tearDown()\\n if self.assertFailed == 0:\\n self.numPassed += 1\\n else:\\n self.numFailed += 1\\n print('Tests failed in %s ' % self.cleanName(func))\\n except Exception as e:\\n self.assertFailed += 1\\n self.numFailed += 1\\n print('Test threw exception in %s (%s)' % (self.cleanName(func), e))\\n self.showSummary()\\n\\n def assertEqual(self, actual, expected, feedback=\\\"\\\"):\\n res = actual==expected\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to equal %s\\\" % (str(actual),str(expected))\\n self.appendResult(res, actual ,expected, feedback)\\n\\n def assertNotEqual(self, actual, expected, feedback=\\\"\\\"):\\n res = actual != expected\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not equal %s\\\" % (str(actual),str(expected))\\n self.appendResult(res, actual, expected, feedback)\\n\\n def assertTrue(self,x, feedback=\\\"\\\"):\\n res = bool(x) is True\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be True\\\" % (str(x))\\n self.appendResult(res, x, True, feedback)\\n\\n def assertFalse(self,x, feedback=\\\"\\\"):\\n res = not bool(x)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be False\\\" % (str(x))\\n self.appendResult(res, x, False, feedback)\\n\\n def assertIs(self,a,b, feedback=\\\"\\\"):\\n res = a is b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be the same object as %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsNot(self,a,b, feedback=\\\"\\\"):\\n res = a is not b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be the same object as %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsNone(self,x, feedback=\\\"\\\"):\\n res = x is None\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be None\\\" % (str(x))\\n self.appendResult(res, x, None, feedback)\\n\\n def assertIsNotNone(self,x, feedback=\\\"\\\"):\\n res = x is not None\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be None\\\" % (str(x))\\n self.appendResult(res, x, None, feedback)\\n\\n def assertIn(self, a, b, feedback=\\\"\\\"):\\n res = a in b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be in %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotIn(self, a, b, feedback=\\\"\\\"):\\n res = a not in b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be in %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsInstance(self,a,b, feedback=\\\"\\\"):\\n res = isinstance(a,b)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be an instance of %s\\\" % (str(a), str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotIsInstance(self,a,b, feedback=\\\"\\\"):\\n res = not isinstance(a,b)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be an instance of %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertRegex(self, text, expected_regex, feedback=\\\"\\\"):\\n \\\"\\\"\\\"Fail the test unless the text matches the regular expression.\\\"\\\"\\\"\\n if isinstance(expected_regex, (str, )): #bytes\\n assert expected_regex, \\\"expected_regex must not be empty.\\\"\\n expected_regex = re.compile(expected_regex)\\n if not expected_regex.search(text):\\n res = False\\n feedback = \\\"Regex didn't match: %r not found in %r\\\" % (\\n repr(expected_regex), text)\\n else:\\n res = True\\n self.appendResult(res, text, expected_regex, feedback)\\n\\n def assertNotRegex(self, text, unexpected_regex, feedback=\\\"\\\"):\\n \\\"\\\"\\\"Fail the test if the text matches the regular expression.\\\"\\\"\\\"\\n if isinstance(unexpected_regex, (str, )): # bytes\\n unexpected_regex = re.compile(unexpected_regex)\\n match = unexpected_regex.search(text)\\n if match:\\n feedback = 'Regex matched: %r matches %r in %r' % (\\n text[match.start() : match.end()],\\n repr(unexpected_regex),\\n text)\\n # _formatMessage ensures the longMessage option is respected\\n self.appendResult(not bool(match), text, unexpected_regex, feedback)\\n\\n def assertAlmostEqual(self, a, b, places=7, feedback=\\\"\\\", delta=None):\\n\\n if delta is not None:\\n res = abs(a-b) <= delta\\n else:\\n if places is None:\\n places = 7\\n res = round(a-b, places) == 0\\n \\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to equal %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotAlmostEqual(self, a, b, places=7, feedback=\\\"\\\", delta=None):\\n\\n if delta is not None:\\n res = not (a == b) and abs(a - b) > delta\\n else:\\n if places is None:\\n places = 7\\n\\n res = round(a-b, places) != 0\\n\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not equal %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertGreater(self,a,b, feedback=\\\"\\\"):\\n res = a > b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be greater than %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertGreaterEqual(self,a,b, feedback=\\\"\\\"):\\n res = a >= b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be >= %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertLess(self, a, b, feedback=\\\"\\\"):\\n res = a < b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be less than %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertLessEqual(self,a,b, feedback=\\\"\\\"):\\n res = a <= b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be <= %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def appendResult(self,res,actual,expected,feedback):\\n if res:\\n msg = 'Pass'\\n self.assertPassed += 1\\n else:\\n msg = 'Fail: ' + feedback\\n print(msg)\\n self.assertFailed += 1\\n\\n def assertRaises(self, expected_exception, *args, **kwargs):\\n context = _AssertRaisesContext(expected_exception, self)\\n try:\\n return context.handle(args, kwargs)\\n finally:\\n # bpo-23890: manually break a reference cycle\\n context = None\\n\\n def fail(self, msg=None):\\n if msg is None:\\n msg = 'Fail'\\n else:\\n msg = 'Fail: ' + msg\\n print(msg)\\n self.assertFailed += 1\\n\\n def showSummary(self):\\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\\n print(\\\"Ran %d tests, passed: %d failed: %d\\\\n\\\" % (self.numPassed+self.numFailed,\\n self.numPassed, self.numFailed))\\n\\n\\n\\ndef main(verbosity=1):\\n glob = globals() # globals() still needs work\\n for name in glob:\\n if type(glob[name]) == type and issubclass(glob[name], TestCase):\\n try:\\n tc = glob[name]()\\n tc.verbosity = verbosity\\n tc.main()\\n except:\\n print(\\\"Uncaught Error in: \\\", name)\\n\",\"src/lib/unittest/gui.py\":\"import document\\nfrom unittest import TestCase\\n\\nclass TestCaseGui(TestCase):\\n def __init__(self):\\n TestCase.__init__(self)\\n self.divid = document.currentDiv()\\n self.mydiv = document.getElementById(self.divid)\\n res = document.getElementById(self.divid+'_unit_results')\\n if res:\\n self.resdiv = res\\n res.innerHTML = ''\\n else:\\n self.resdiv = document.createElement('div')\\n self.resdiv.setAttribute('id',self.divid+'_unit_results')\\n self.resdiv.setAttribute('class','unittest-results')\\n self.mydiv.appendChild(self.resdiv)\\n\\n\\n def main(self):\\n t = document.createElement('table')\\n self.resTable = t\\n self.resdiv.appendChild(self.resTable)\\n\\n headers = ['Result','Actual Value','Expected Value','Notes']\\n row = document.createElement('tr')\\n for item in headers:\\n head = document.createElement('th')\\n head.setAttribute('class','ac-feedback')\\n head.innerHTML = item\\n head.setCSS('text-align','center')\\n row.appendChild(head)\\n self.resTable.appendChild(row)\\n\\n for func in self.tlist:\\n try:\\n self.setUp()\\n func()\\n self.tearDown()\\n except Exception as e:\\n self.appendResult('Error', None, None, e)\\n self.numFailed += 1\\n self.showSummary()\\n\\n def appendResult(self,res,actual,expected,param):\\n trimActual = False\\n if len(str(actual)) > 15:\\n trimActual = True\\n actualType = type(actual)\\n trimExpected = False\\n if len(str(expected)) > 15:\\n trimExpected = True\\n expectedType = type(expected)\\n row = document.createElement('tr')\\n err = False\\n if res == 'Error':\\n err = True\\n msg = 'Error: %s' % param\\n errorData = document.createElement('td')\\n errorData.setAttribute('class','ac-feedback')\\n errorData.innerHTML = 'ERROR'\\n errorData.setCSS('background-color','#de8e96')\\n errorData.setCSS('text-align','center')\\n row.appendChild(errorData)\\n elif res:\\n passed = document.createElement('td')\\n passed.setAttribute('class','ac-feedback')\\n passed.innerHTML = 'Pass'\\n passed.setCSS('background-color','#83d382')\\n passed.setCSS('text-align','center')\\n row.appendChild(passed)\\n self.numPassed += 1\\n else:\\n fail = document.createElement('td')\\n fail.setAttribute('class','ac-feedback')\\n fail.innerHTML = 'Fail'\\n fail.setCSS('background-color','#de8e96')\\n fail.setCSS('text-align','center')\\n row.appendChild(fail)\\n self.numFailed += 1\\n\\n\\n act = document.createElement('td')\\n act.setAttribute('class','ac-feedback')\\n if trimActual:\\n actHTML = str(actual)[:5] + \\\"...\\\" + str(actual)[-5:]\\n if actualType == str:\\n actHTML = repr(actHTML)\\n act.innerHTML = actHTML\\n else:\\n act.innerHTML = repr(actual)\\n act.setCSS('text-align','center')\\n row.appendChild(act)\\n\\n expect = document.createElement('td')\\n expect.setAttribute('class','ac-feedback')\\n\\n if trimExpected:\\n expectedHTML = str(expected)[:5] + \\\"...\\\" + str(expected)[-5:]\\n if expectedType == str:\\n expectedHTML = repr(expectedHTML)\\n expect.innerHTML = expectedHTML\\n else:\\n expect.innerHTML = repr(expected)\\n expect.setCSS('text-align','center')\\n row.appendChild(expect)\\n inp = document.createElement('td')\\n inp.setAttribute('class','ac-feedback')\\n\\n if err:\\n inp.innerHTML = msg\\n else:\\n inp.innerHTML = param\\n inp.setCSS('text-align','center')\\n row.appendChild(inp)\\n self.resTable.appendChild(row)\\n\\n\\n def showSummary(self):\\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\\n pTag = document.createElement('p')\\n pTag.innerHTML = \\\"You passed: \\\" + str(pct) + \\\"% of the tests\\\"\\n self.resdiv.appendChild(pTag)\\n\",\"src/lib/urllib/__init__.js\":\"var $builtinmodule=function(){return{}};\",\"src/lib/urllib/request/__init__.js\":\"var $builtinmodule=function(){var a={};return a.Response=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.data$=b.responseText,a.lineList=a.data$.split(\\\"\\\\n\\\"),a.lineList=a.lineList.slice(0,-1);for(var c=0;c\\\")}),b.__iter__=new Sk.builtin.func(function(a){var b=a.lineList;return Sk.builtin.makeGenerator(function(){return this.$index>=this.$lines.length?void 0:new Sk.builtin.str(this.$lines[this.$index++])},{$obj:a,$index:0,$lines:b})}),b.read=new Sk.builtin.func(function(a,b){if(a.closed)throw new Sk.builtin.ValueError(\\\"I/O operation on closed file\\\");var c=a.data$.length;void 0===b&&(b=c);var d=new Sk.builtin.str(a.data$.substr(a.pos$,b));return a.pos$+=b,a.pos$>=c&&(a.pos$=c),d}),b.readline=new Sk.builtin.func(function(a){var b=\\\"\\\";return a.currentLine
\\\"+a+\\\"
\\\"},d=\\\"This page requires a browser that supports WebGL.
Click here to upgrade your browser.\\\",e=function(a){for(var b=[\\\"webgl\\\",\\\"experimental-webgl\\\",\\\"webkit-3d\\\",\\\"moz-webgl\\\"],c=null,d=0;dClick here for more information.\\\"):c(d)}return h};return a.Context=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){var c=document.getElementById(b.v),d=f(b.v,c);if(!d)throw new Error(\\\"Your browser does not appear to support WebGL.\\\");for(var e in a.gl=d,d.__proto__)if(\\\"number\\\"==typeof d.__proto__[e])Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),d.__proto__[e]);else if(\\\"function\\\"==typeof d.__proto__[e])switch(e){case\\\"bufferData\\\":break;case\\\"clearColor\\\":break;case\\\"drawArrays\\\":break;case\\\"getAttribLocation\\\":break;case\\\"getUniformLocation\\\":break;case\\\"shaderSource\\\":break;case\\\"uniformMatrix4fv\\\":break;case\\\"vertexAttribPointer\\\":break;case\\\"viewport\\\":break;default:(function(b){Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),new Sk.builtin.func(function(){var a=d.__proto__[b];return a.apply(d,arguments)}))})(e);}d.clearColor(100/255,149/255,237/255,1),d.clear(d.COLOR_BUFFER_BIT)}),b.tp$getattr=Sk.generic.getAttr,b.bufferData=new Sk.builtin.func(function(a,b,c,d){a.gl.bufferData(b,c.v,d)}),b.clearColor=new Sk.builtin.func(function(a,b,c,d,e){a.gl.clearColor(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.getAttribLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getAttribLocation(b,c.v)}),b.getUniformLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getUniformLocation(b,c.v)}),b.shaderSource=new Sk.builtin.func(function(a,b,c){a.gl.shaderSource(b,c.v)}),b.drawArrays=new Sk.builtin.func(function(a,b,c,d){a.gl.drawArrays(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d))}),b.vertexAttribPointer=new Sk.builtin.func(function(a,b,c,d,e,f,g){a.gl.vertexAttribPointer(b,Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),e,Sk.builtin.asnum$(f),Sk.builtin.asnum$(g))}),b.viewport=new Sk.builtin.func(function(a,b,c,d,e){a.gl.viewport(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.uniformMatrix4fv=new Sk.builtin.func(function(a,b,c,d){a.gl.uniformMatrix4fv(Sk.builtin.asnum$(b),c,d.v)}),b.setDrawFunc=new Sk.builtin.func(function(a,b){var c=new Date().getTime(),d=setInterval(function(){Sk.misceval.callsimArray(b,[a,new Date().getTime()-c])},1e3/60)})},\\\"Context\\\",[]),a.Float32Array=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.v=\\\"number\\\"==typeof b?new Float32Array(b):new Float32Array(Sk.ffi.remapToJs(b))}),b.__repr__=new Sk.builtin.func(function(a){for(var b=[],c=0;ce;e++)d.elements[4*e+0]=b.elements[4*e+0]*c.elements[0]+b.elements[4*e+1]*c.elements[4]+b.elements[4*e+2]*c.elements[8]+b.elements[4*e+3]*c.elements[12],d.elements[4*e+1]=b.elements[4*e+0]*c.elements[1]+b.elements[4*e+1]*c.elements[5]+b.elements[4*e+2]*c.elements[9]+b.elements[4*e+3]*c.elements[13],d.elements[4*e+2]=b.elements[4*e+0]*c.elements[2]+b.elements[4*e+1]*c.elements[6]+b.elements[4*e+2]*c.elements[10]+b.elements[4*e+3]*c.elements[14],d.elements[4*e+3]=b.elements[4*e+0]*c.elements[3]+b.elements[4*e+1]*c.elements[7]+b.elements[4*e+2]*c.elements[11]+b.elements[4*e+3]*c.elements[15];return b.elements=d.elements,b}),c.lookAt=new Sk.builtin.func(function(b,c,e,f,g,h,i,j,k,l){var m=[c-g,e-h,f-i],n=d(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);n&&(m[0]/=n,m[1]/=n,m[2]/=n);var o=[j,k,l],p=[];p[0]=o[1]*m[2]-o[2]*m[1],p[1]=-o[0]*m[2]+o[2]*m[0],p[2]=o[0]*m[1]-o[1]*m[0],o[0]=m[1]*p[2]-m[2]*p[1],o[1]=-m[0]*p[2]+m[2]*p[0],o[2]=m[0]*p[1]-m[1]*p[0],n=d(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]),n&&(p[0]/=n,p[1]/=n,p[2]/=n),n=d(o[0]*o[0]+o[1]*o[1]+o[2]*o[2]),n&&(o[0]/=n,o[1]/=n,o[2]/=n);var q=Sk.misceval.callsimArray(a.Mat44);return q.elements[0]=p[0],q.elements[4]=p[1],q.elements[8]=p[2],q.elements[12]=0,q.elements[1]=o[0],q.elements[5]=o[1],q.elements[9]=o[2],q.elements[13]=0,q.elements[2]=m[0],q.elements[6]=m[1],q.elements[10]=m[2],q.elements[14]=0,q.elements[3]=0,q.elements[7]=0,q.elements[11]=0,q.elements[15]=1,q=q.multiply(b),b.elements=q.elements,b.translate(-c,-e,-f),b})},\\\"Mat44\\\",[]),a.Mat33=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a){Sk.misceval.callsimArray(b.loadIdentity,[a])}),b.loadIdentity=new Sk.builtin.func(function(a){a.elements=[1,0,0,0,1,0,0,0,1]})},\\\"Mat33\\\",[]),a.Vec3=Sk.misceval.buildClass(a,function(b,c){c.__init__=new Sk.builtin.func(function(a,b,c,d){a.x=b,a.y=c,a.z=d}),c.__sub__=new Sk.builtin.func(function(b,c){return Sk.misceval.callsimArray(a.Vec3,[b.x-c.x,b.y-c.y,b.z-c.z])})},\\\"Vec3\\\",[]),a.cross=new Sk.builtin.func(function(b,c){return Sk.asserts.assert(b instanceof a.Vec3&&c instanceof a.Vec3),Sk.misceval.callsimArray(a.Vec3,[b.y*c.z-b.z*c.y,b.z*c.x-b.x*c.z,b.x*c.y-b.y*c.x])}),a};\",\"src/lib/webgl/matrix4.js\":\"var $builtinmodule=function(){var a=Math.PI,b={},c=new Float32Array(3),d=new Float32Array(3),e=new Float32Array(3),f=new Float32Array(4),g=new Float32Array(4),h=new Float32Array(4),i=new Float32Array(16),j=new Float32Array(16),k=new Float32Array(16),l=function(b,c){for(var a=Math.sqrt,d=0,e=c.length,f=0;fe;++e)for(var f=0;4>f;++f)c[4*e+f]=d[4*f+e];return c}),b};\",\"src/lib/webgl/models.js\":\"var $builtinmodule=function(a){var c={},d=function(a,c){var d=c||gl.ARRAY_BUFFER,e=gl.createBuffer();if(this.target=d,this.buf=e,this.set(a),this.numComponents_=a.numComponents,this.numElements_=a.numElements,this.totalComponents_=this.numComponents_*this.numElements_,a.buffer instanceof Float32Array)this.type_=gl.FLOAT;else if(a.buffer instanceof Uint8Array)this.type_=gl.UNSIGNED_BYTE;else if(a.buffer instanceof Int8Array)this.type_=gl._BYTE;else if(a.buffer instanceof Uint16Array)this.type_=gl.UNSIGNED_SHORT;else if(a.buffer instanceof Int16Array)this.type_=gl.SHORT;else throw\\\"unhandled type:\\\"+typeof a.buffer};return d.prototype.set=function(a){gl.bindBuffer(this.target,this.buf),gl.bufferData(this.target,a.buffer,gl.STATIC_DRAW)},d.prototype.type=function(){return this.type_},d.prototype.numComponents=function(){return this.numComponents_},d.prototype.numElements=function(){return this.numElements_},d.prototype.totalComponents=function(){return this.totalComponents_},d.prototype.buffer=function(){return this.buf},d.prototype.stride=function(){return 0},d.prototype.offset=function(){return 0},c.Model=Sk.misceval.buildClass(c,function(c,e){e.__init__=new Sk.builtin.func(function(c,e,f,g){c.buffers={};var h=function(a,e){var f=\\\"indices\\\"==a?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;b=c.buffers[a],b?b.set(e):b=new d(e,f),c.buffers[a]=b};for(a in f)h(a,f[a]);var i={},j=0;for(var k in g)i[k]=j++;c.mode=gl.TRIANGLES,c.textures=g.v,c.textureUnits=i,c.shader=e}),e.drawPrep=new Sk.builtin.func(function(a,c){var d=a.shader,e=a.buffers,f=a.textures;for(var g in c=Sk.ffi.remapToJs(c),Sk.misceval.callsimArray(d.use,[d]),e){var h=e[g];if(\\\"indices\\\"==g)gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,h.buffer());else{var i=d.attrib[g];i&&i(h)}}for(var j in f){var k=a.textureUnits[j];d.setUniform$impl(d,textuer,k),f[j].bindToUnit(k)}for(var l in c)d.setUniform$impl(d,l,c[l])}),e.draw=new Sk.builtin.func(function(a,c,d){var e=a.shader;for(uniform in c=Sk.ffi.remapToJs(c),c)e.setUniform$impl(e,uniform,c[uniform]);if(d)for(var f in d){var g=a.textureUnits[f];e.setUniform$impl(e,f,g),d[f].bindToUnit(g)}var h=a.buffers;gl.drawElements(a.mode,h.indices.totalComponents(),gl.UNSIGNED_SHORT,0)})},\\\"Model\\\",[]),c};\",\"src/lib/webgl/primitives.js\":\"var $builtinmodule=function(){var a={},b=function(a,b,c){c=c||\\\"Float32Array\\\";var d=window[c];b.length?(this.buffer=new d(b),b=this.buffer.length/a,this.cursor=b):(this.buffer=new d(a*b),this.cursor=0),this.numComponents=a,this.numElements=b,this.type=c};return b.prototype.stride=function(){return 0},b.prototype.offset=function(){return 0},b.prototype.getElement=function(a){for(var b=a*this.numComponents,c=[],d=0;do;++o){c=d[o];for(var p=0;4>p;++p){var q=g[c[p]],r=h[o],s=i[p];k.push(q),l.push(r),m.push(s)}var t=4*o;n.push([t+0,t+1,t+2]),n.push([t+0,t+2,t+3])}return{position:k,normal:l,texCoord:m,indices:n}}),a};\",\"src/lib/whichdb.py\":\"raise NotImplementedError(\\\"whichdb is not yet implemented in Skulpt\\\")\\n\",\"src/lib/wsgiref/__init__.py\":\"raise NotImplementedError(\\\"wsgiref is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xdrlib.py\":\"raise NotImplementedError(\\\"xdrlib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xml/__init__.py\":\"raise NotImplementedError(\\\"xml is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xml/dom/__init__.py\":\"raise NotImplementedError(\\\"dom is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xml/etree/__init__.py\":\"raise NotImplementedError(\\\"etree is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xml/parsers/__init__.py\":\"raise NotImplementedError(\\\"parsers is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xml/sax/__init__.py\":\"raise NotImplementedError(\\\"sax is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xmllib.py\":\"raise NotImplementedError(\\\"xmllib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/xmlrpclib.py\":\"raise NotImplementedError(\\\"xmlrpclib is not yet implemented in Skulpt\\\")\\n\",\"src/lib/zipfile.py\":\"raise NotImplementedError(\\\"zipfile is not yet implemented in Skulpt\\\")\\n\"}}","import './skulpt.min.js';\r\nimport './skulpt-stdlib.js';\r\n\r\nexport default window.Sk;","(function(){'use strict';var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(m,q,a){m!=Array.prototype&&m!=Object.prototype&&(m[q]=a.value)};$jscomp.getGlobal=function(m){return\"undefined\"!=typeof window&&window===m?m:\"undefined\"!=typeof global&&null!=global?global:m};$jscomp.global=$jscomp.getGlobal(this);\r\n$jscomp.polyfill=function(m,q,a,c){if(q){a=$jscomp.global;m=m.split(\".\");for(c=0;ca&&(a=Math.max(a+b,0));a{Sk.abstr.setUpSlots(a);Sk.abstr.setUpMethods(a);Sk.abstr.setUpGetSets(a)});a(19);a(20);a(21);[Sk.builtin.str,Sk.builtin.none,Sk.builtin.NotImplemented,Sk.builtin.object].forEach(a=>{a=a.prototype;a.__doc__=a.hasOwnProperty(\"tp$doc\")?new Sk.builtin.str(a.tp$doc):Sk.builtin.none.none$});\r\na(22);a(23);a(24);a(25);a(26);a(27);a(28);a(29);a(31);a(32);a(33);a(34);a(35);a(36);a(37);a(38);a(39);a(40);a(41);a(42);a(43);a(44);a(45);a(46);a(47);a(48);a(49);a(50);a(51);a(52);a(53);a(54);a(55);a(56);a(57);a(58);a(59);a(60);a(61);a(62);a(63);a(64);a(65)},function(m,q,a){(function(a){var b={build:{githash:\"6c99c2196851bb29f0e503afccb01804f089cb60\",date:\"2021-02-23T18:59:26.986Z\"}};b.global=\"undefined\"!==typeof a?a:\"undefined\"!==typeof self?self:\"undefined\"!==typeof window?window:{};b.exportSymbol=\r\nfunction(a,c){a=a.split(\".\");var e=b.global,f;for(f=0;fd.getHours()?k.am:k.pm;break;case 82:u+=p(k.formats.R,d,k,g);break;case 83:u+=c(d.getSeconds(),C);break;case 84:u+=p(k.formats.T,d,k,g);break;case 85:u+=c(f(d,\"sunday\"),C);break;case 87:u+=c(f(d,\"monday\"),C);break;case 88:u+=p(k.formats.X,d,k,g);break;case 89:u+=\r\nd.getFullYear();break;case 90:E&&0===B?u+=\"GMT\":(C=d.toString().match(/\\(([\\w\\s]+)\\)/),u+=C&&C[1]||\"\");break;case 97:u+=k.shortDays[d.getDay()];break;case 98:u+=k.shortMonths[d.getMonth()];break;case 99:u+=p(k.formats.c,d,k,g);break;case 100:u+=c(d.getDate(),C);break;case 101:u+=c(d.getDate(),null==C?\" \":C);break;case 104:u+=k.shortMonths[d.getMonth()];break;case 106:C=new Date(d.getFullYear(),0,1);C=Math.ceil((d.getTime()-C.getTime())/864E5);u+=b(C);break;case 107:u+=c(d.getHours(),null==C?\" \":C);\r\nbreak;case 108:u+=c(e(d.getHours()),null==C?\" \":C);break;case 109:u+=c(d.getMonth()+1,C);break;case 110:u+=\"\\n\";break;case 111:C=d.getDate();u=k.ordinalSuffixes?u+(String(C)+(k.ordinalSuffixes[C-1]||l(C))):u+(String(C)+l(C));break;case 112:u+=12>d.getHours()?k.AM:k.PM;break;case 114:u+=p(k.formats.r,d,k,g);break;case 115:u+=Math.floor(g/1E3);break;case 116:u+=\"\\t\";break;case 117:C=d.getDay();u+=0===C?7:C;break;case 118:u+=p(k.formats.v,d,k,g);break;case 119:u+=d.getDay();break;case 120:u+=p(k.formats.x,\r\nd,k,g);break;case 121:u+=(\"\"+d.getFullYear()).slice(2);break;case 122:E&&0===B?u+=N?\"+00:00\":\"+0000\":(C=0!==B?B/6E4:-d.getTimezoneOffset(),n=N?\":\":\"\",A=Math.abs(C%60),u+=(0>C?\"-\":\"+\")+c(Math.floor(Math.abs(C/60)))+n+c(A));break;default:n&&(u+=\"%\"),u+=a[F]}C=null;n=!1}else 37===A?n=!0:u+=a[F]}return u}var y=k||g,B=n||0,E=A||!1,F=0,w,m=function(a,b){if(b){var d=b.getTime();if(E){var c=6E4*(b.getTimezoneOffset()||0);b=new Date(d+c+B);6E4*(b.getTimezoneOffset()||0)!==c&&(b=6E4*(b.getTimezoneOffset()||\r\n0),b=new Date(d+b+B))}}else d=Date.now(),d>F?(F=d,w=new Date(F),d=F,E&&(w=new Date(F+6E4*(w.getTimezoneOffset()||0)+B))):d=F,b=w;return p(a,b,y,d)};m.localize=function(b){return new a(b||y,B,E)};m.localizeByIdentifier=function(a){var b=d[a];return b?m.localize(b):(h('[WARNING] No locale found with identifier \"'+a+'\".'),m)};m.timezone=function(b){var d=B,c=E,e=typeof b;if(\"number\"===e||\"string\"===e)c=!0,\"string\"===e?(d=\"-\"===b[0]?-1:1,e=parseInt(b.slice(1,3),10),b=parseInt(b.slice(3,5),10),d=d*(60*\r\ne+b)*6E4):\"number\"===e&&(d=6E4*b);return new a(y,d,c)};m.utc=function(){return new a(y,B,!0)};return m}function c(a,b){if(\"\"===b||9=a||0===b||4<=b)return\"th\";switch(b){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\"}}function h(a){\"undefined\"!==typeof console&&\"function\"==typeof console.warn&&console.warn(a)}var d={de_DE:{days:\"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag\".split(\" \"),shortDays:\"So Mo Di Mi Do Fr Sa\".split(\" \"),months:\"Januar Februar M\\u00e4rz April Mai Juni Juli August September Oktober November Dezember\".split(\" \"),shortMonths:\"Jan Feb M\\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez\".split(\" \"),\r\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d.%m.%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},en_CA:{days:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),shortDays:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),ordinalSuffixes:\"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st\".split(\" \"),\r\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}},en_US:{days:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),shortDays:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),ordinalSuffixes:\"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st\".split(\" \"),\r\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%m/%d/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}},es_MX:{days:\"domingo lunes martes mi\\u00e9rcoles jueves viernes s\\u00e1bado\".split(\" \"),shortDays:\"dom lun mar mi\\u00e9 jue vie s\\u00e1b\".split(\" \"),months:\"enero;febrero;marzo;abril;mayo;junio;julio;agosto;septiembre;octubre;noviembre; diciembre\".split(\";\"),shortMonths:\"ene feb mar abr may jun jul ago sep oct nov dic\".split(\" \"),AM:\"AM\",PM:\"PM\",\r\nam:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},fr_FR:{days:\"dimanche lundi mardi mercredi jeudi vendredi samedi\".split(\" \"),shortDays:\"dim. lun. mar. mer. jeu. ven. sam.\".split(\" \"),months:\"janvier f\\u00e9vrier mars avril mai juin juillet ao\\u00fbt septembre octobre novembre d\\u00e9cembre\".split(\" \"),shortMonths:\"janv. f\\u00e9vr. mars avril mai juin juil. ao\\u00fbt sept. oct. nov. d\\u00e9c.\".split(\" \"),AM:\"AM\",\r\nPM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},it_IT:{days:\"domenica luned\\u00ec marted\\u00ec mercoled\\u00ec gioved\\u00ec venerd\\u00ec sabato\".split(\" \"),shortDays:\"dom lun mar mer gio ven sab\".split(\" \"),months:\"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre\".split(\" \"),shortMonths:\"pr mag giu lug ago set ott nov dic\".split(\" \"),AM:\"AM\",PM:\"PM\",am:\"am\",\r\npm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},nl_NL:{days:\"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag\".split(\" \"),shortDays:\"zo ma di wo do vr za\".split(\" \"),months:\"januari februari maart april mei juni juli augustus september oktober november december\".split(\" \"),shortMonths:\"jan feb mrt apr mei jun jul aug sep okt nov dec\".split(\" \"),AM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",\r\nD:\"%d-%m-%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},pt_BR:{days:\"domingo segunda ter\\u00e7a quarta quinta sexta s\\u00e1bado\".split(\" \"),shortDays:\"Dom Seg Ter Qua Qui Sex S\\u00e1b\".split(\" \"),months:\"janeiro fevereiro mar\\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro\".split(\" \"),shortMonths:\"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez\".split(\" \"),AM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d-%m-%Y\",F:\"%Y-%m-%d\",\r\nR:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},ru_RU:{days:\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435 \\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a \\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a \\u0421\\u0440\\u0435\\u0434\\u0430 \\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433 \\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430 \\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\".split(\" \"),shortDays:\"\\u0412\\u0441 \\u041f\\u043d \\u0412\\u0442 \\u0421\\u0440 \\u0427\\u0442 \\u041f\\u0442 \\u0421\\u0431\".split(\" \"),\r\nmonths:\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c \\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c \\u041c\\u0430\\u0440\\u0442 \\u0410\\u043f\\u0440\\u0435\\u043b\\u044c \\u041c\\u0430\\u0439 \\u0418\\u044e\\u043d\\u044c \\u0418\\u044e\\u043b\\u044c \\u0410\\u0432\\u0433\\u0443\\u0441\\u0442 \\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c \\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c \\u041d\\u043e\\u044f\\u0431\\u0440\\u044c \\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\".split(\" \"),shortMonths:\"\\u044f\\u043d\\u0432 \\u0444\\u0435\\u0432 \\u043c\\u0430\\u0440 \\u0430\\u043f\\u0440 \\u043c\\u0430\\u0439 \\u0438\\u044e\\u043d \\u0438\\u044e\\u043b \\u0430\\u0432\\u0433 \\u0441\\u0435\\u043d \\u043e\\u043a\\u0442 \\u043d\\u043e\\u044f \\u0434\\u0435\\u043a\".split(\" \"),\r\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X\",D:\"%d.%m.%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},tr_TR:{days:\"Pazar Pazartesi Sal\\u0131 \\u00c7ar\\u015famba Per\\u015fembe Cuma Cumartesi\".split(\" \"),shortDays:\"Paz Pzt Sal \\u00c7r\\u015f Pr\\u015f Cum Cts\".split(\" \"),months:\"Ocak \\u015eubat Mart Nisan May\\u0131s Haziran Temmuz A\\u011fustos Eyl\\u00fcl Ekim Kas\\u0131m Aral\\u0131k\".split(\" \"),shortMonths:\"Oca \\u015eub Mar Nis May Haz Tem A\\u011fu Eyl Eki Kas Ara\".split(\" \"),\r\nAM:\"\\u00d6\\u00d6\",PM:\"\\u00d6S\",am:\"\\u00d6\\u00d6\",pm:\"\\u00d6S\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d-%m-%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},zh_CN:{days:\"\\u661f\\u671f\\u65e5 \\u661f\\u671f\\u4e00 \\u661f\\u671f\\u4e8c \\u661f\\u671f\\u4e09 \\u661f\\u671f\\u56db \\u661f\\u671f\\u4e94 \\u661f\\u671f\\u516d\".split(\" \"),shortDays:\"\\u65e5\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\".split(\"\"),months:\"\\u4e00\\u6708\\u4efd \\u4e8c\\u6708\\u4efd \\u4e09\\u6708\\u4efd \\u56db\\u6708\\u4efd \\u4e94\\u6708\\u4efd \\u516d\\u6708\\u4efd \\u4e03\\u6708\\u4efd \\u516b\\u6708\\u4efd \\u4e5d\\u6708\\u4efd \\u5341\\u6708\\u4efd \\u5341\\u4e00\\u6708\\u4efd \\u5341\\u4e8c\\u6708\\u4efd\".split(\" \"),\r\nshortMonths:\"\\u4e00\\u6708 \\u4e8c\\u6708 \\u4e09\\u6708 \\u56db\\u6708 \\u4e94\\u6708 \\u516d\\u6708 \\u4e03\\u6708 \\u516b\\u6708 \\u4e5d\\u6708 \\u5341\\u6708 \\u5341\\u4e00\\u6708 \\u5341\\u4e8c\\u6708\".split(\" \"),AM:\"\\u4e0a\\u5348\",PM:\"\\u4e0b\\u5348\",am:\"\\u4e0a\\u5348\",pm:\"\\u4e0b\\u5348\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}}},g=d.en_US,n=new a(g,0,!1);if(\"undefined\"!==typeof m)var k=m.exports=n;else k=function(){return this||(0,eval)(\"this\")}(),\r\nk.strftime=n;\"function\"!==typeof Date.now&&(Date.now=function(){return+new Date})})()},function(m,q,a){(function(){var a=function(b,c,f){return a.parse(b,c,f)};a.version=\"0.0.1\";(m.exports=a).strptime=a;a.locale={a:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),A:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),b:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),B:\"January February March April May June July August September October November December\".split(\" \"),f:\"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.\".split(\" \"),\r\nc:\"%Y-%m-%d %H:%M:%S\",P:[\"am\",\"pm\"],r:\"%I:%M:%S %p\",x:\"%m/%d/%y\",X:\"%H:%M:%S\",day:[\"Yesterday\",\"Today\",\"Tomorrow\"],bg:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),Bg:\"January February March April May June July August September October November December\".split(\" \"),fg:\"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.\".split(\" \"),Date_dBY_year_in_HM:\"%#B %-d, %Y at %-H:%M\",Date_dBY_year:\"%#B %-d, %Y\",Date_dBY:\"%#B %-d, %Y\",Date_AdBY:\"%A, %#B %-d, %Y\",Date_dBA:\"%#B %-d, %A\",\r\nDate_df_in_HM:\"%#f, %-d at %-H:%M\",Date_dfY:\"%-d %#f %Y\",Date_dB_in_HM:\"%#B %-d at %-H:%M\",Date_df:\"%-d %#f\"};(function(a){function b(a,c,e,f,h,l){c=String(c);e=String(e);c=c.replace(/^[#_0\\^\\-!~]+/,\"\");f=d[c];if(!f)return a;var k=!1;-1===e.indexOf(\"!\")&&1===c.length&&(-1b||99b||31b||31b||23b||12b||12b||59b||60b||99b||12null!==b&&a(b):a=>a instanceof c;c.powermod=(a,b,l)=>{const e=c.BigInt(1);let d=e;for(b=c.greaterThan(b,c.__ZERO)?b:c.unaryMinus(b);c.greaterThan(b,c.__ZERO);)c.bitwiseAnd(b,e)&&(d=c.remainder(c.multiply(d,\r\na),l)),b=c.signedRightShift(b,e),a=c.remainder(c.multiply(a,a),l);return d}}else Object.assign(c,{BigInt:Sk.global.BigInt,toNumber:a=>Number(a),toString:a=>a.toString(),__isBigInt:a=>\"bigint\"===typeof a,unaryMinus:a=>-a,bitwiseNot:a=>~a,bitwiseAnd:(a,c)=>a&c,bitwiseOr:(a,c)=>a|c,bitwiseXor:(a,c)=>a^c,exponentiate:(a,e)=>{const b=c.BigInt(1);let l=b;for(e=e>c.__ZERO?e:-e;e>c.__ZERO;)e&b&&(l*=a),e>>=b,a*=a;return l},powermod:(a,e,f)=>{const b=c.BigInt(1);let h=b;for(e=e>c.__ZERO?e:-e;e>c.__ZERO;)e&\r\nb&&(h=h*a%f),e>>=b,a=a*a%f;return h},multiply:(a,c)=>a*c,divide:(a,c)=>a/c,remainder:(a,c)=>a%c,add:(a,c)=>a+c,subtract:(a,c)=>a-c,leftShift:(a,c)=>a<a>>c,unsignedRightShift:(a,c)=>a>>>c,lessThan:(a,c)=>aa<=c,greaterThan:(a,c)=>a>c,greaterThanOrEqual:(a,c)=>a>=c,equal:(a,c)=>a===c,notEqual:(a,c)=>a!==c});c.__ZERO=c.BigInt(0);c.__MAX_SAFE=c.BigInt(Number.MAX_SAFE_INTEGER);c.__MIN_SAFE=c.BigInt(-Number.MAX_SAFE_INTEGER);c.numberIfSafe=a=>c.lessThan(a,\r\nc.__MAX_SAFE)&&c.greaterThan(a,c.__MIN_SAFE)?c.toNumber(a):a},function(m,q,a){(function(a,b){m.exports=b()})(this,function(){function a(b){\"@babel/helpers - typeof\";return a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a},a(b)}function b(a,b){for(var d,c=0;ca.length)&&(b=a.length);for(var d=0,c=Array(b);d=a.length?{done:!0}:{done:!1,value:a[c++]}},e:function(a){throw a;},f:b}}throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\r\n}var e,k=!0,f=!1;return{s:function(){d=a[Symbol.iterator]()},n:function(){var a=d.next();return k=a.done,a},e:function(a){f=!0;e=a},f:function(){try{k||null==d.return||d.return()}finally{if(f)throw e;}}}}var t=Math.imul,y=Math.clz32,B=function(b){function d(a,b){var c;if(!(this instanceof d))throw new TypeError(\"Cannot call a class as a function\");if(a>d.__kMaxLength)throw new RangeError(\"Maximum BigInt size exceeded\");return c=h.call(this,a),c.sign=b,c}var c=Math.abs,g=Math.max;f(d,b);var h=k(d);\r\nreturn e(d,[{key:\"toDebugString\",value:function(){var a,b=[\"BigInt[\"],d=A(this);try{for(d.s();!(a=d.n()).done;){var c=a.value;b.push((c?(c>>>0).toString(16):c)+\", \")}}catch(O){d.e(O)}finally{d.f()}return b.push(\"]\"),b.join(\"\")}},{key:\"toString\",value:function(){var a=0a||36this.length&&(c=this.length);var e=\r\n65535&a;a>>>=16;var k=0,f=65535&b;b>>>=16;for(var g=0;g>>16;h=d.__imul(p,e);p=d.__imul(p,a);var u=d.__imul(l,e);l=d.__imul(l,a);var y=f+(65535&h);h=b+k+(y>>>16)+(h>>>16)+(65535&p)+(65535&u);f=(p>>>16)+(u>>>16)+(65535&l)+(h>>>16);k=f>>>16;f&=65535;b=l>>>16;this.__setDigit(g,65535&y|h<<16)}if(0!==k||0!==f||0!==b)throw Error(\"implementation bug\");}},{key:\"__inplaceAdd\",value:function(a,b,d){for(var c,e=0,k=0;k>>16,this.__setHalfDigit(b+k,c);return e}},{key:\"__inplaceSub\",value:function(a,b,d){var c=0;if(1&b){b>>=1;for(var e=this.__digit(b),k=65535&e,f=0;f>>1;f++){var g=a.__digit(f);e=(e>>>16)-(65535&g)-c;c=1&e>>>16;this.__setDigit(b+f,e<<16|65535&k);e=this.__digit(b+f+1);k=(65535&e)-(g>>>16)-c;c=1&k>>>16}g=a.__digit(f);var h=(e>>>16)-(65535&g)-c;c=1&h>>>16;this.__setDigit(b+f,h<<16|65535&k);if(b+f+1>=this.length)throw new RangeError(\"out of bounds\");0==(1&d)&&(e=this.__digit(b+f+1),k=(65535&\r\ne)-(g>>>16)-c,c=1&k>>>16,this.__setDigit(b+a.length,4294901760&e|65535&k))}else{b>>=1;for(k=0;k>>16,e=(e>>>16)-(g>>>16)-c,c=1&e>>>16,this.__setDigit(b+k,e<<16|65535&f);f=this.__digit(b+k);a=a.__digit(k);e=(65535&f)-(65535&a)-c;c=1&e>>>16;g=0;0==(1&d)&&(g=(f>>>16)-(a>>>16)-c,c=1&g>>>16);this.__setDigit(b+k,g<<16|65535&e)}return c}},{key:\"__inplaceRightShift\",value:function(a){if(0!==a){for(var b,d=this.__digit(0)>>>a,\r\nc=this.length-1,e=0;e>>a;this.__setDigit(c,d)}}},{key:\"__digit\",value:function(a){return this[a]}},{key:\"__unsignedDigit\",value:function(a){return this[a]>>>0}},{key:\"__setDigit\",value:function(a,b){this[a]=0|b}},{key:\"__setDigitGrow\",value:function(a,b){this[a]=0|b}},{key:\"__halfDigitLength\",value:function(){var a=this.length;return 65535>=this.__unsignedDigit(a-1)?2*a-1:2*a}},{key:\"__halfDigit\",value:function(a){return 65535&this[a>>>1]>>>\r\n((1&a)<<4)}},{key:\"__setHalfDigit\",value:function(a,b){var d=a>>>1,c=this.__digit(d);this.__setDigit(d,1&a?65535&c|b<<16:4294901760&c|65535&b)}}],[{key:\"BigInt\",value:function(b){var c=Math.floor,e=Number.isFinite;if(\"number\"==typeof b){if(0===b)return d.__zero();if((0|b)===b)return 0>b?d.__oneDigit(-b,!0):d.__oneDigit(b,!1);if(!e(b)||c(b)!==b)throw new RangeError(\"The number \"+b+\" cannot be converted to BigInt because it is not an integer\");return d.__fromDouble(b)}if(\"string\"==typeof b){c=d.__fromString(b);\r\nif(null===c)throw new SyntaxError(\"Cannot convert \"+b+\" to a BigInt\");return c}if(\"boolean\"==typeof b)return!0===b?d.__oneDigit(1,!1):d.__zero();if(\"object\"===a(b)){if(b.constructor===d)return b;b=d.__toPrimitive(b);return d.BigInt(b)}throw new TypeError(\"Cannot convert \"+b+\" to a BigInt\");}},{key:\"toNumber\",value:function(a){var b=a.length;if(0===b)return 0;if(1===b){var c=a.__unsignedDigit(0);return a.sign?-c:c}var e=a.__digit(b-1),k=d.__clz32(e);c=32*b-k;if(1024>>12;var h=g-12;b=12<=g?0:e<<20+g;g=20+g;0>>32-h,b=e<>>32-g,g-=32);e=d.__decideRounding(a,g,f,e);if((1===e||0===e&&1==(1&b))&&(b=b+1>>>0,0===b&&(k++,0!=k>>>20&&(k=0,c++,1023=\r\nd.__kMaxLengthBits)throw new RangeError(\"BigInt too big\");if(1===a.length&&2===a.__digit(0)){var c=1+(b>>>5);a=new d(c,a.sign&&0!=(1&b));a.__initializeDigits();return a.__setDigit(c-1,1<<(31&b)),a}c=null;var e=a;0!=(1&b)&&(c=a);for(b>>=1;0!==b;b>>=1)e=d.multiply(e,e),0!=(1&b)&&(null===c?c=e:c=d.multiply(c,e));return c}},{key:\"multiply\",value:function(a,b){if(0===a.length)return a;if(0===b.length)return b;var c=a.length+b.length;32<=a.__clzmsd()+b.__clzmsd()&&c--;c=new d(c,a.sign!==b.sign);c.__initializeDigits();\r\nfor(var e=0;ed.__absoluteCompare(a,b))return d.__zero();var c=a.sign!==b.sign,e=b.__unsignedDigit(0);if(1===b.length&&65535>=e){if(1===e)return c===a.sign?a:d.unaryMinus(a);a=d.__absoluteDivSmall(a,e,null)}else a=d.__absoluteDivLarge(a,b,!0,!1);return a.sign=c,a.__trim()}},{key:\"remainder\",value:function(a,b){if(0===b.length)throw new RangeError(\"Division by zero\");\r\nif(0>d.__absoluteCompare(a,b))return a;var c=b.__unsignedDigit(0);if(1===b.length&&65535>=c){if(1===c)return d.__zero();b=d.__absoluteModSmall(a,c);return 0===b?d.__zero():d.__oneDigit(b,a.sign)}b=d.__absoluteDivLarge(a,b,!1,!0);return b.sign=a.sign,b.__trim()}},{key:\"add\",value:function(a,b){var c=a.sign;return c===b.sign?d.__absoluteAdd(a,b,c):0<=d.__absoluteCompare(a,b)?d.__absoluteSub(a,b,c):d.__absoluteSub(b,a,!c)}},{key:\"subtract\",value:function(a,b){var c=a.sign;return c===b.sign?0<=d.__absoluteCompare(a,\r\nb)?d.__absoluteSub(a,b,c):d.__absoluteSub(b,a,!c):d.__absoluteAdd(a,b,c)}},{key:\"leftShift\",value:function(a,b){return 0===b.length||0===a.length?a:b.sign?d.__rightShiftByAbsolute(a,b):d.__leftShiftByAbsolute(a,b)}},{key:\"signedRightShift\",value:function(a,b){return 0===b.length||0===a.length?a:b.sign?d.__leftShiftByAbsolute(a,b):d.__rightShiftByAbsolute(a,b)}},{key:\"unsignedRightShift\",value:function(){throw new TypeError(\"BigInts have no unsigned right shift; use >> instead\");}},{key:\"lessThan\",\r\nvalue:function(a,b){return 0>d.__compareToBigInt(a,b)}},{key:\"lessThanOrEqual\",value:function(a,b){return 0>=d.__compareToBigInt(a,b)}},{key:\"greaterThan\",value:function(a,b){return 0=d.__kMaxLengthBits)return b;var c=a+31>>>5;if(b.lengthd.__kMaxLengthBits)throw new RangeError(\"BigInt too big\");return d.__truncateAndSubFromPowerOfTwo(a,b,!1)}if(a>=d.__kMaxLengthBits)return b;var c=a+31>>>5;if(b.length>>\r\ne?d.__truncateToNBits(a,b):b}},{key:\"ADD\",value:function(a,b){if(a=d.__toPrimitive(a),b=d.__toPrimitive(b),\"string\"==typeof a)return\"string\"!=typeof b&&(b=b.toString()),a+b;if(\"string\"==typeof b)return a.toString()+b;if(a=d.__toNumeric(a),b=d.__toNumeric(b),d.__isBigInt(a)&&d.__isBigInt(b))return d.add(a,b);if(\"number\"==typeof a&&\"number\"==typeof b)return a+b;throw new TypeError(\"Cannot mix BigInt and other types, use explicit conversions\");}},{key:\"LT\",value:function(a,b){return d.__compare(a,b,\r\n0)}},{key:\"LE\",value:function(a,b){return d.__compare(a,b,1)}},{key:\"GT\",value:function(a,b){return d.__compare(a,b,2)}},{key:\"GE\",value:function(a,b){return d.__compare(a,b,3)}},{key:\"EQ\",value:function(b,c){for(;;){if(d.__isBigInt(b))return d.__isBigInt(c)?d.equal(b,c):d.EQ(c,b);if(\"number\"==typeof b){if(d.__isBigInt(c))return d.__equalToNumber(c,b);if(\"object\"!==a(c))return b==c;c=d.__toPrimitive(c)}else if(\"string\"==typeof b){if(d.__isBigInt(c))return b=d.__fromString(b),null!==b&&d.equal(b,c);\r\nif(\"object\"!==a(c))return b==c;c=d.__toPrimitive(c)}else if(\"boolean\"==typeof b){if(d.__isBigInt(c))return d.__equalToNumber(c,+b);if(\"object\"!==a(c))return b==c;c=d.__toPrimitive(c)}else if(\"symbol\"===a(b)){if(d.__isBigInt(c))return!1;if(\"object\"!==a(c))return b==c;c=d.__toPrimitive(c)}else if(\"object\"===a(b)){if(\"object\"===a(c)&&c.constructor!==d)return b==c;b=d.__toPrimitive(b)}else return b==c}}},{key:\"NE\",value:function(a,b){return!d.EQ(a,b)}},{key:\"__zero\",value:function(){return new d(0,!1)}},\r\n{key:\"__oneDigit\",value:function(a,b){b=new d(1,b);return b.__setDigit(0,a),b}},{key:\"__decideRounding\",value:function(a,b,d,c){if(0b)b=-b-1;else{if(0===d)return-1;d--;c=a.__digit(d);b=31}b=1<>>20)-1023;var c=(b>>>5)+1;a=new d(c,0>a);var e=1048575&d.__kBitConversionInts[1]|1048576,\r\nk=d.__kBitConversionInts[0];b&=31;if(20>b){var f=20-b;var g=f+32;b=e>>>f;e=e<<32-f|k>>>f;k<<=32-f}else 20===b?(g=32,b=e,e=k):(f=b-20,g=32-f,b=e<>>32-f,e=k<=a&&9<=a)||(159>=a?32==a:131071>=a?160==a||5760==a:196607>=a?(a&=131071,10>=a||40==a||41==a||47==a||95==a||4096==a):65279==a)}},{key:\"__fromString\",value:function(a){var b=11073741824/h)return null;g=new d((h*g+p>>>d.__kBitsPerCharTableShift)+31>>>5,!1);var l=10>b?b:10,y=10>=d.__kBitsPerCharTableShift;var B=[],n=[],A=\r\n!1;do{for(var w,E=p=0;;){if(f-48>>>0>>0>>0>>0>>d.__kBitsPerCharTableShift+5)}while(!B)}if(k!==e){if(!d.__isWhitespace(f))return null;for(k++;k>>h-k)}if(0!==e){if(c>=a.length)throw Error(\"implementation bug\");a.__setDigit(c++,e)}for(;c<\r\na.length;c++)a.__setDigit(c,0)}},{key:\"__toStringBasePowerOfTwo\",value:function(a,b){var c=a.length,e=b-1;e=(85&e>>>1)+(85&e);e=(51&e>>>2)+(51&e);e=(15&e>>>4)+(15&e);--b;var k=a.__digit(c-1),f=d.__clz32(k),g=0|(32*c-f+e-1)/e;if(a.sign&&g++,268435456>>p;for(p=32-p;p>=e;)f[g--]=d.__kConversionChars[h&b],h>>>=e,p-=e}f[g--]=d.__kConversionChars[(h|k<<\r\np)&b];for(h=k>>>e-p;0!==h;)f[g--]=d.__kConversionChars[h&b],h>>>=e;if(a.sign&&(f[g--]=\"-\"),-1!==g)throw Error(\"implementation bug\");return f.join(\"\")}},{key:\"__toStringGeneric\",value:function(a,b,c){var e=a.length;if(0===e)return\"\";if(1===e)return b=a.__unsignedDigit(0).toString(b),!1===c&&a.sign&&(b=\"-\"+b),b;var k=32*e-d.__clz32(a.__digit(e-1));e=d.__kMaxBitsPerChar[b]-1;k*=d.__kBitsPerCharTableMultiplier;e=(0|(k+(e-1))/e)+1>>1;k=d.exponentiate(d.__oneDigit(b,!1),d.__oneDigit(e,!1));var f=k.__unsignedDigit(0);\r\nif(1===k.length&&65535>=f){k=new d(a.length,!1);k.__initializeDigits();var g=0;for(var h=2*a.length-1;0<=h;h--)g=g<<16|a.__halfDigit(h),k.__setHalfDigit(h,0|g/f),g=0|g%f;f=g.toString(b)}else f=d.__absoluteDivLarge(a,k,!0,!0),k=f.quotient,f=f.remainder.__trim(),f=d.__toStringGeneric(f,b,!0);k.__trim();for(b=d.__toStringGeneric(k,b,!0);f.lengtha?d.__absoluteLess(c):0}},{key:\"__compareToNumber\",value:function(a,b){if(1|b){var e=a.sign,k=0>b;if(e!==k)return d.__unequalSign(e);if(0===a.length){if(k)throw Error(\"implementation bug\");return 0===b?0:-1}if(1b?d.__absoluteGreater(e):ab)return d.__unequalSign(c);if(0===b)throw Error(\"implementation bug: should be handled elsewhere\");if(0===a.length)return-1;d.__kBitConversionDouble[0]=b;b=2047&d.__kBitConversionInts[1]>>>20;if(2047==b)throw Error(\"implementation bug: handled elsewhere\");var e=b-1023;if(0>e)return d.__absoluteGreater(c);\r\nb=a.length;var k=a.__digit(b-1),f=d.__clz32(k),g=32*b-f;e+=1;if(ge)return d.__absoluteGreater(c);e=1048576|1048575&d.__kBitConversionInts[1];var h=d.__kBitConversionInts[0];f=31-f;if(f!==(g-1)%31)throw Error(\"implementation bug\");if(20>f){var p=20-f;f=p+32;g=e>>>p;e=e<<32-p|h>>>p;h<<=32-p}else 20===f?(f=32,g=e,e=h):(p=f-20,f=32-p,g=e<>>32-p,e=h<>>=0,g>>>=0,k>g)return d.__absoluteGreater(c);if(k>>0,e=h,h=0):g=0;k=a.__unsignedDigit(b);if(k>g)return d.__absoluteGreater(c);if(kb&&a.__unsignedDigit(0)===c(b):0===d.__compareToDouble(a,b)}},{key:\"__comparisonResultToBool\",value:function(a,b){switch(b){case 0:return 0>a;case 1:return 0>=a;case 2:return 0b;case 3:return a>=b}if(d.__isBigInt(a)&&\"string\"==typeof b)return b=d.__fromString(b),null!==b&&d.__comparisonResultToBool(d.__compareToBigInt(a,b),c);if(\"string\"==typeof a&&d.__isBigInt(b))return a=d.__fromString(a),null!==a&&d.__comparisonResultToBool(d.__compareToBigInt(a,b),c);\r\nif(a=d.__toNumeric(a),b=d.__toNumeric(b),d.__isBigInt(a)){if(d.__isBigInt(b))return d.__comparisonResultToBool(d.__compareToBigInt(a,b),c);if(\"number\"!=typeof b)throw Error(\"implementation bug\");return d.__comparisonResultToBool(d.__compareToNumber(a,b),c)}if(\"number\"!=typeof a)throw Error(\"implementation bug\");if(d.__isBigInt(b))return d.__comparisonResultToBool(d.__compareToNumber(b,a),2^c);if(\"number\"!=typeof b)throw Error(\"implementation bug\");return 0===c?ab:3===c?a>=b:\r\nvoid 0}},{key:\"__absoluteAdd\",value:function(a,b,c){if(a.length>>16)+(f>>>16)+(h>>>16);e=f>>>16;c.__setDigit(k,65535&h|f<<16)}for(;k>>16)+(b>>>16),e=h>>>\r\n16,c.__setDigit(k,65535&b|h<<16);return k>>16;f=(f>>>16)-(g>>>16)-e;e=1&f>>>16;c.__setDigit(k,65535&h|f<<16)}for(;k>>16,h=(h>>>16)-e,e=1&h>>>16,c.__setDigit(k,65535&b|h<<16);\r\nreturn c.__trim()}},{key:\"__absoluteAddOne\",value:function(a,b){var c=2d?0:a.__unsignedDigit(d)>\r\nb.__unsignedDigit(d)?1:-1}},{key:\"__multiplyAccumulate\",value:function(a,b,c,e){if(0!==b){for(var k=65535&b,f=b>>>16,g=b=0,h=0,p=0;p>>=16;var B=a.__digit(p),n=65535&B,A=B>>>16;B=d.__imul(n,k);n=d.__imul(n,f);var u=d.__imul(A,k);A=d.__imul(A,f);y+=g+(65535&B);l+=h+b+(y>>>16)+(B>>>16)+(65535&n)+(65535&u);b=l>>>16;g=(n>>>16)+(u>>>16)+(65535&A)+b;b=g>>>16;g&=65535;h=A>>>16;l=65535&y|l<<16;c.__setDigit(e,l)}for(;0!==b||0!==g||0!==h;e++)k=c.__digit(e),a=\r\n(65535&k)+g,k=(k>>>16)+(a>>>16)+h+b,h=g=0,b=k>>>16,k=65535&a|k<<16,c.__setDigit(e,k)}}},{key:\"__internalMultiplyAdd\",value:function(a,b,c,e,k){for(var f=0,g=0;g>>16;f=d.__imul(h>>>16,b);p=(65535&f)+(p>>>16)+c;c=p>>>16;f>>>=16;k.__setDigit(g,p<<16|65535&l)}if(k.length>e)for(k.__setDigit(e++,c+f);e>>0;var f=0|e/b;e=0|e%b;e=(e<<16|a.__halfDigit(k-1))>>>0;var g=0|e/b;e=0|e%b;c.__setDigit(k>>>1,f<<16|g)}return c}},{key:\"__absoluteModSmall\",value:function(a,b){var d=0;for(var c=2*a.length-1;0<=c;c--)d=(d<<16|a.__halfDigit(c))>>>0,d=0|d%b;return d}},{key:\"__absoluteDivLarge\",value:function(a,b,c,e){var k=b.__halfDigitLength(),f=b.length,g=a.__halfDigitLength()-k,h=null;c&&(h=new d(g+2>>>1,!1),h.__initializeDigits());\r\nvar p=new d(k+2>>>1,!1);p.__initializeDigits();var l=d.__clz16(b.__halfDigit(k-1));0>>0;n=0|A/y;A=0|A%y;for(var u=b.__halfDigit(k-2),w=a.__halfDigit(g+k-2);d.__imul(n,u)>>>0>(A<<16|w)>>>0&&(n--,A+=y,!(65535>>1,B|n))}return e?(a.__inplaceRightShift(l),c?{quotient:h,remainder:a}:a):c?h:void 0}},{key:\"__clz16\",value:function(a){return d.__clz32(a)-16}},{key:\"__specialLeftShift\",value:function(a,b,c){var e=a.length,k=new d(e+c,!1);if(0===b){for(b=0;b>>32-b;return 0c)throw new RangeError(\"BigInt too big\");b=c>>>5;var e=31&c,k=a.length,f=0!==e&&0!=a.__digit(k-1)>>>32-e,g=k+b+(f?1:0);c=new d(g,a.sign);if(0===e){for(e=0;e>>32-e;if(f)c.__setDigit(k+b,g);else if(0!==g)throw Error(\"implementation bug\");}return c.__trim()}},{key:\"__rightShiftByAbsolute\",\r\nvalue:function(a,b){var c=a.length,e=a.sign,k=d.__toShiftAmount(b);if(0>k)return d.__rightShiftByMaximum(e);b=k>>>5;var f=31&k,g=c-b;if(0>=g)return d.__rightShiftByMaximum(e);k=!1;if(e)if(0!=(a.__digit(b)&(1<>>f;h=c-b-1;for(var p=0;p>>f;e.__setDigit(h,g)}return k&&\r\n(e=d.__absoluteAddOne(e,!0,e)),e.__trim()}},{key:\"__rightShiftByMaximum\",value:function(a){return a?d.__oneDigit(1,!0):d.__zero()}},{key:\"__toShiftAmount\",value:function(a){if(1d.__kMaxLengthBits?-1:a}},{key:\"__toPrimitive\",value:function(b){var c=1>>5,e=new d(c,b.sign);--c;for(var k=0;k>>\r\na);return e.__setDigit(c,b),e.__trim()}},{key:\"__truncateAndSubFromPowerOfTwo\",value:function(a,b,c){var e=Math.min,k=a+31>>>5;c=new d(k,c);var f=0;--k;var g=0;for(e=e(k,b.length);f>>16;h=-(h>>>16)-g;g=1&h>>>16;c.__setDigit(f,65535&p|h<<16)}for(;f>>16)-(1&g>>>16)<<16):(a=32-a,b=b<>>a,a=1<<32-a,g=(65535&a)-(65535&b)-g,g=(65535&g|(a>>>16)-(b>>>16)-(1&g>>>\r\n16)<<16)&a-1);return c.__setDigit(k,g),c.__trim()}},{key:\"__digitPow\",value:function(a,b){for(var d=1;0>>=1,a*=a;return d}}]),d}(n(Array));return B.__kMaxLength=33554432,B.__kMaxLengthBits=B.__kMaxLength<<5,B.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],B.__kBitsPerCharTableShift=5,B.__kBitsPerCharTableMultiplier=1<>>0)/b)},B.__imul=t||function(a,b){return 0|a*b},B})},function(m,q,a){(function(a,b){(function(a,c){function e(a){delete t[a]}function f(a){if(y)setTimeout(f,0,a);else{var b=t[a];if(b){y=!0;try{var d=b.callback,k=b.args;switch(k.length){case 0:d();\r\nbreak;case 1:d(k[0]);break;case 2:d(k[0],k[1]);break;case 3:d(k[0],k[1],k[2]);break;default:d.apply(c,k)}}finally{e(a),y=!1}}}}function d(){E=function(a){b.nextTick(function(){f(a)})}}function g(){if(a.postMessage&&!a.importScripts){var b=!0,d=a.onmessage;a.onmessage=function(){b=!1};a.postMessage(\"\",\"*\");a.onmessage=d;return b}}function n(){var b=\"setImmediate$\"+Math.random()+\"$\",d=function(d){d.source===a&&\"string\"===typeof d.data&&0===d.data.indexOf(b)&&f(+d.data.slice(b.length))};a.addEventListener?\r\na.addEventListener(\"message\",d,!1):a.attachEvent(\"onmessage\",d);E=function(d){a.postMessage(b+d,\"*\")}}function k(){var a=new MessageChannel;a.port1.onmessage=function(a){f(a.data)};E=function(b){a.port2.postMessage(b)}}function p(){var a=B.documentElement;E=function(b){var d=B.createElement(\"script\");d.onreadystatechange=function(){f(b);d.onreadystatechange=null;a.removeChild(d);d=null};a.appendChild(d)}}function w(){E=function(a){setTimeout(f,0,a)}}if(!a.setImmediate){var A=1,t={},y=!1,B=a.document,\r\nE,F=Object.getPrototypeOf&&Object.getPrototypeOf(a);F=F&&F.setTimeout?F:a;\"[object process]\"==={}.toString.call(a.process)?d():g()?n():a.MessageChannel?k():B&&\"onreadystatechange\"in B.createElement(\"script\")?p():w();F.setImmediate=function(a){\"function\"!==typeof a&&(a=new Function(\"\"+a));for(var b=Array(arguments.length-1),d=0;d the object's type\\ntype(name, bases, dict) -> a new type\",tp$call:function(a,b){if(this===Sk.builtin.type){if(1===a.length&&(void 0===b||!b.length))return a[0].ob$type;if(3!==a.length)throw new Sk.builtin.TypeError(\"type() takes 1 or 3 arguments\");\r\n}let d=this.prototype.tp$new(a,b);if(d.$isSuspension)return Sk.misceval.chain(d,c=>{d=c;if(d.ob$type.$isSubType(this))return d.tp$init(a,b)},()=>d);if(d.ob$type.$isSubType(this)){const c=d.tp$init(a,b);return void 0!==c&&c.$isSuspension?Sk.misceval.chain(c,()=>d):d}return d},tp$new:function(a,c){if(3!==a.length){if(1===a.length&&(void 0===c||!c.length))return a[0].ob$type;throw new Sk.builtin.TypeError(\"type() takes 1 or 3 arguments\");}let d;c=a[0];d=a[1];a=a[2];if(\"dict\"!==a.tp$name)throw new Sk.builtin.TypeError(\"type() argument 3 must be dict, not \"+\r\nSk.abstr.typeName(a));if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"type() argument 1 must be str, not \"+Sk.abstr.typeName(c));c=c.$jsstr();if(\"tuple\"!==d.tp$name)throw new Sk.builtin.TypeError(\"type() argument 2 must be tuple, not \"+Sk.abstr.typeName(d));d=d.sk$asarray();const e=function(){this.$d=new Sk.builtin.dict};b(c,e,d,this.constructor);Sk.globals&&(e.prototype.__module__=Sk.globals.__name__);e.prototype.__doc__=Sk.builtin.none.none$;void 0===e.$typeLookup(Sk.builtin.str.$dict)&&\r\n(e.prototype.__dict__=new Sk.builtin.getset_descriptor(e,h));a.$items().forEach(([a,b])=>{e.prototype[a.$mangled]=b});e.prototype.hasOwnProperty(\"__new__\")&&(a=e.prototype.__new__,a instanceof Sk.builtin.func&&(e.prototype.__new__=new Sk.builtin.staticmethod(a)));e.$allocateSlots();return e},tp$getattr:function(a,b){var d=this.ob$type;const c=d.$typeLookup(a);let e;if(void 0!==c&&(e=c.tp$descr_get,void 0!==e&&void 0!==c.tp$descr_set))return b=e.call(c,this,d,b);a=this.$typeLookup(a);if(void 0!==a)return d=\r\na.tp$descr_get,void 0!==d?b=d.call(a,null,this,b):a;if(void 0!==e)return b=e.call(c,this,d,b);if(void 0!==c)return c},tp$setattr:function(a,b,c){if(!this.sk$klass){if(void 0!==b)throw new Sk.builtin.TypeError(\"can't set attributes of built-in/extension type '\"+this.prototype.tp$name+\"'\");throw new Sk.builtin.TypeError(\"can't delete attributes on type object '\"+this.prototype.tp$name+\"'\");}const d=this.ob$type.$typeLookup(a);if(void 0!==d){const a=d.tp$descr_set;if(a)return a.call(d,this,b,c)}c=a.$mangled;\r\nif(void 0===b)if(b=this.prototype,b.hasOwnProperty(c))delete b[c],a=Sk.dunderToSkulpt[c],void 0!==a&&(delete this.prototype[a],b.sk$prototypical||this.$allocateGetterSlot(c));else throw new Sk.builtin.AttributeError(\"type object '\"+this.prototype.tp$name+\"' has no attribute '\"+a.$jsstr()+\"'\");else this.prototype[c]=b,c in Sk.dunderToSkulpt&&this.$allocateSlot(c,b)},$r:function(){let a=this.prototype.__module__,b=\"\",c=\"class\";a&&Sk.builtin.checkString(a)?b=a.v+\".\":a=null;a||this.sk$klass||Sk.__future__.class_repr||\r\n(c=\"type\");return new Sk.builtin.str(\"<\"+c+\" '\"+b+this.prototype.tp$name+\"'>\")}},writable:!0},tp$methods:{value:null,writable:!0},tp$getsets:{value:null,writable:!0},sk$type:{value:!0},$isSubType:{value:function(a){return this===a||this.prototype instanceof a||!this.prototype.sk$prototypical&&this.prototype.tp$mro.includes(a)}},$allocateSlot:{value:function(a,b){a=Sk.slots[a];const c=a.$slot_name,d=this.prototype;d.hasOwnProperty(c)&&delete d[c];d[c]=a.$slot_func(b)}},$allocateSlots:{value:function(){const a=\r\nthis.prototype;this.prototype.sk$prototypical?Object.keys(a).forEach(b=>{b in Sk.slots&&this.$allocateSlot(b,a[b])}):Object.keys(Sk.slots).forEach(b=>{a.hasOwnProperty(b)?this.$allocateSlot(b,a[b]):this.$allocateGetterSlot(b)})}},$allocateGetterSlot:{value:function(a){const b=Sk.slots[a].$slot_name,c=this.prototype;c.hasOwnProperty(b)||Object.defineProperty(c,b,{configurable:!0,get(){const a=c.tp$mro;for(let c=1;ca.length)throw a=\r\nb.tp$name,new Sk.builtin.TypeError(a+\".__new__(): not enough arguments\");var e=a.shift();if(void 0===e.sk$type)throw a=b.tp$name,new Sk.builtin.TypeError(a+\"__new__(X): X is not a type object (\"+Sk.abstr.typeName(e)+\")\");if(!e.$isSubType(this))throw a=b.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+\".__new__(\"+e+\"): \"+e+\" is not a subtype of \"+a);const f=e.prototype.sk$staticNew.prototype;if(f.tp$new!==b.tp$new)throw a=b.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+\".__new__(\"+\r\ne+\") is not safe, use \"+f.tp$name+\".__new__()\");return b.tp$new.call(e.prototype,a,c)},$flags:{FastCall:!0},$textsig:\"($type, *args, **kwargs)\",$name:\"__new__\"};Sk.generic.selfIter=function(){return this};Sk.generic.iterNextWithArrayCheckSize=function(){if(this.$seq.length!==this.$orig.get$size()){const a=this.tp$name.split(\"_\")[0];throw new Sk.builtin.RuntimeError(a+\" changed size during iteration\");}if(!(this.$index>=this.$seq.length))return this.$seq[this.$index++]};Sk.generic.iterNextWithArray=\r\nfunction(){const a=this.$seq[this.$index++];void 0===a&&(this.tp$iternext=()=>{});return a};Sk.generic.iterLengthHintWithArrayMethodDef={$meth:function(){return new Sk.builtin.int_(this.$seq.length-this.$index)},$flags:{NoArgs:!0}};Sk.generic.iterReverseLengthHintMethodDef={$meth:function(){return new Sk.builtin.int_(this.$index)},$flags:{NoArgs:!0}};Sk.generic.getSetDict={$get(){return this.$d},$set(a){if(void 0===a)this.$d=new Sk.builtin.dict;else if(a instanceof Sk.builtin.dict)this.$d=a;else throw new Sk.builtin.TypeError(\"__dict__ must be set to a dictionary, not a '\"+\r\nSk.abstr.typeName(a)+\"'\");},$doc:\"dictionary for instance variables (if defined)\",$name:\"__dict__\"};Sk.generic.seqCompare=function(a,c){if(this===a&&Sk.misceval.opAllowsEquality(c))return!0;if(!(a instanceof this.sk$builtinBase))return Sk.builtin.NotImplemented.NotImplemented$;const b=this.v;a=a.v;let e;if(b.length!==a.length&&(\"Eq\"===c||\"NotEq\"===c))return\"Eq\"===c?!1:!0;for(e=0;e=\r\nf||e>=l)switch(c){case \"Lt\":return fl;case \"GtE\":return f>=l;default:Sk.asserts.fail()}return\"Eq\"===c?!1:\"NotEq\"===c?!0:Sk.misceval.richCompareBool(b[e],a[e],c)}},function(m,q){Sk.builtin.pyCheckArgs=function(a,c,b,e,f,l){c=c.length;void 0===e&&(e=Infinity);f&&--c;l&&--c;if(ce)throw new Sk.builtin.TypeError((b===e?a+\"() takes exactly \"+b+\" arguments\":ce)throw new Sk.builtin.TypeError((b===e?a+\"() takes exactly \"+b+\" arguments\":c{a[c]=function(a){return this.tp$richcompare(a,b)}})}function l(a){const b=Sk.reflectedNumberSlots;\r\nObject.keys(b).forEach(c=>{if(void 0!==a[c]){const d=b[c],e=d.reflected,f=a[e];void 0!==f?null===f&&delete a[e]:a[e]=d.slot||a[c]}})}function h(a){const b=Sk.sequenceAndMappingSlots;Object.keys(b).forEach(c=>{void 0!==a[c]&&b[c].forEach(b=>{a[b]=a[c]})})}Sk.abstr={};Sk.abstr.typeName=function(a){return null!=a&&void 0!==a.tp$name?a.tp$name:\"\"};const d={Add:\"+\",Sub:\"-\",Mult:\"*\",MatMult:\"@\",Div:\"/\",FloorDiv:\"//\",Mod:\"%\",DivMod:\"divmod()\",Pow:\"** or pow()\",LShift:\"<<\",RShift:\">>\",BitAnd:\"&\",\r\nBitXor:\"^\",BitOr:\"|\"},g={UAdd:\"+\",USub:\"-\",Invert:\"~\"};Sk.abstr.numberBinOp=function(a,b,c){var f;if(!(f=e(a,b,c)))throw a=Sk.abstr.typeName(a),b=Sk.abstr.typeName(b),new Sk.builtin.TypeError(\"unsupported operand type(s) for \"+d[c]+\": '\"+a+\"' and '\"+b+\"'\");return f};Sk.exportSymbol(\"Sk.abstr.numberBinOp\",Sk.abstr.numberBinOp);Sk.abstr.numberInplaceBinOp=function(a,c,f){a:{var k=b(a,f);if(void 0!==k&&(k=k.call(a,c),k!==Sk.builtin.NotImplemented.NotImplemented$))break a;k=e(a,c,f)}if(!k)throw a=Sk.abstr.typeName(a),\r\nc=Sk.abstr.typeName(c),new Sk.builtin.TypeError(\"unsupported operand type(s) for \"+d[f]+\"=: '\"+a+\"' and '\"+c+\"'\");return k};Sk.exportSymbol(\"Sk.abstr.numberInplaceBinOp\",Sk.abstr.numberInplaceBinOp);Sk.abstr.numberUnaryOp=function(a,b){if(\"Not\"===b)return Sk.misceval.isTrue(a)?Sk.builtin.bool.false$:Sk.builtin.bool.true$;b:{switch(b){case \"USub\":var c=a.nb$negative;break b;case \"UAdd\":c=a.nb$positive;break b;case \"Invert\":c=a.nb$invert;break b}c=void 0}c=void 0!==c?c.call(a):void 0;if(!c)throw a=\r\nSk.abstr.typeName(a),new Sk.builtin.TypeError(\"bad operand type for unary \"+g[b]+\": '\"+a+\"'\");return c};Sk.exportSymbol(\"Sk.abstr.numberUnaryOp\",Sk.abstr.numberUnaryOp);Sk.abstr.fixSeqIndex_=function(a,b){b=Sk.builtin.asnum$(b);0>b&&a.sq$length&&(b+=a.sq$length());return b};Sk.abstr.sequenceContains=function(a,b,c){if(a.sq$contains)return a.sq$contains(b,c);a=Sk.misceval.iterFor(Sk.abstr.iter(a),function(a){return a===b||Sk.misceval.richCompareBool(a,b,\"Eq\")?new Sk.misceval.Break(!0):!1},!1);return c?\r\na:Sk.misceval.retryOptionalSuspensionOrThrow(a)};Sk.abstr.sequenceConcat=function(a,b){if(a.sq$concat)return a.sq$concat(b);throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object can't be concatenated\");};Sk.abstr.sequenceGetIndexOf=function(a,b){if(a.index)return Sk.misceval.callsimArray(a.index,[a,b]);let c=0;for(let d=Sk.abstr.iter(a),e=d.tp$iternext();void 0!==e;e=d.tp$iternext()){if(Sk.misceval.richCompareBool(b,e,\"Eq\"))return new Sk.builtin.int_(c);c+=1}throw new Sk.builtin.ValueError(\"sequence.index(x): x not in sequence\");\r\n};Sk.abstr.sequenceGetCountOf=function(a,b){if(a.count)return Sk.misceval.callsimArray(a.count,[a,b]);let c=0;for(let d=Sk.abstr.iter(a),e=d.tp$iternext();void 0!==e;e=d.tp$iternext())Sk.misceval.richCompareBool(b,e,\"Eq\")&&(c+=1);return new Sk.builtin.int_(c)};Sk.abstr.sequenceGetItem=function(a,b,c){\"number\"===typeof b&&(b=new Sk.builtin.int_(b));return Sk.abstr.objectGetItem(a,b,c)};Sk.abstr.sequenceSetItem=function(a,b,c,d){\"number\"===typeof b&&(b=new Sk.builtin.int_(b));return Sk.abstr.objectSetItem(a,\r\nb,c,d)};Sk.abstr.sequenceDelItem=function(a,b,c){return Sk.abstr.objectDelItem(a,b,c)};Sk.abstr.sequenceGetSlice=function(a,b,c){return Sk.abstr.objectGetItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceDelSlice=function(a,b,c){return Sk.abstr.objectDelItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceSetSlice=function(a,b,c,d){return Sk.abstr.objectSetItem(a,new Sk.builtin.slice(b,c))};Sk.abstr.sequenceUnpack=function(a,b,c,d){if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError(\"cannot unpack non-iterable \"+\r\nSk.abstr.typeName(a)+\" object\");const e=Sk.abstr.iter(a),f=[];let k=0,g;0{f.push(a);if(++k===b)return new Sk.misceval.Break}));return Sk.misceval.chain(g,()=>{if(f.length{if(void 0!==a)throw new Sk.builtin.ValueError(\"too many values to unpack (expected \"+b+\")\");return f});const a=[];return Sk.misceval.chain(Sk.misceval.iterFor(e,\r\nb=>{a.push(b)}),()=>{const d=a.length+b-c;if(0>d)throw new Sk.builtin.ValueError(\"not enough values to unpack (expected at least \"+c+\", got \"+(c+d)+\")\");f.push(new Sk.builtin.list(a.slice(0,d)));f.push(...a.slice(d));return f})})};Sk.abstr.mappingUnpackIntoKeywordArray=function(a,b,c){if(b instanceof Sk.builtin.dict)b.$items().forEach(([b,d])=>{if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError((c.$qualname?c.$qualname+\"() \":\"\")+\"keywords must be strings\");a.push(b.v);a.push(d)});else{var d=\r\nSk.abstr.lookupSpecial(b,Sk.builtin.str.$keys);if(void 0===d)throw new Sk.builtin.TypeError(\"Object is not a mapping\");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d),d=>Sk.misceval.iterFor(Sk.abstr.iter(d),d=>{if(!Sk.builtin.checkString(d))throw new Sk.builtin.TypeError((c.$qualname?c.$qualname+\"() \":\"\")+\"keywords must be strings\");return Sk.misceval.chain(b.mp$subscript(d,!0),b=>{a.push(d.v);a.push(b)})}))}};Sk.abstr.copyKeywordsToNamedArgs=function(a,b,c,d,e){d=d||[];var f=c.length+\r\nd.length/2;if(f>b.length)throw new Sk.builtin.TypeError(a+\"() expected at most \"+b.length+\" arguments (\"+f+\" given)\");if(d.length||void 0!==e){if(f===b.length&&!d.length)return c;if(0===f&&b.length===(e&&e.length))return e}else return c;c=c.slice(0);for(f=0;fvoid 0===c[b]);if(b.length)throw new Sk.builtin.TypeError(a+\"() missing \"+b.length+\" required positional arguments: \"+b.join(\", \"));}return c};Sk.exportSymbol(\"Sk.abstr.copyKeywordsToNamedArgs\",Sk.abstr.copyKeywordsToNamedArgs);Sk.abstr.checkNoKwargs=function(a,b){if(b&&b.length)throw new Sk.builtin.TypeError(a+\"() takes no keyword arguments\");};Sk.exportSymbol(\"Sk.abstr.checkNoKwargs\",Sk.abstr.checkNoKwargs);\r\nSk.abstr.checkNoArgs=function(a,b,c){if(b=b.length+(c?c.length:0))throw new Sk.builtin.TypeError(a+\"() takes no arguments (\"+b+\" given)\");};Sk.exportSymbol(\"Sk.abstr.checkNoArgs\",Sk.abstr.checkNoArgs);Sk.abstr.checkOneArg=function(a,b,c){Sk.abstr.checkNoKwargs(a,c);if(1!==b.length)throw new Sk.builtin.TypeError(a+\"() takes exactly one argument (\"+b.length+\" given)\");};Sk.exportSymbol(\"Sk.abstr.checkOneArg\",Sk.abstr.checkOneArg);Sk.abstr.checkArgsLen=function(a,b,c,d){b=b.length;void 0===d&&(d=Infinity);\r\nif(bd)throw new Sk.builtin.TypeError((c===d?a+\"() takes exactly \"+c+\" arguments\":b{d.$name=b;c[b]=new Sk.builtin.getset_descriptor(a,d)});Object.defineProperty(c,\"tp$getsets\",{value:null,writable:!0})}};Sk.abstr.setUpMethods=function(a,b){if(void 0!==Sk.builtin.method_descriptor){var c=a.prototype;b=b||c.tp$methods||{};Object.entries(b).forEach(([b,d])=>{d.$name=b;c[b]=new Sk.builtin.method_descriptor(a,d)});Object.defineProperty(c,\"tp$methods\",{value:null,writable:!0})}};Sk.abstr.setUpClassMethods=function(a,b){if(void 0!==Sk.builtin.classmethod_descriptor){var c=\r\na.prototype;b=b||c.tp$classmethods||{};Object.entries(b).forEach(([b,d])=>{d.$name=b;c[b]=new Sk.builtin.classmethod_descriptor(a,d)});Object.defineProperty(c,\"tp$classmethods\",{value:null,writable:!0})}};const n=Object.entries({Eq:\"ob$eq\",NotEq:\"ob$ne\",Gt:\"ob$gt\",GtE:\"ob$ge\",Lt:\"ob$lt\",LtE:\"ob$le\"});Sk.abstr.setUpSlots=function(a,b){function c(b,c){e[b]=new Sk.builtin.wrapper_descriptor(a,Sk.slots[b],c)}function d(a,b){\"string\"===typeof a?c(a,b):a.forEach(a=>{c(a,b)})}if(void 0!==Sk.builtin.wrapper_descriptor){var e=\r\na.prototype;b=b||e.tp$slots||{};b.tp$new===Sk.generic.new&&(b.tp$new=Sk.generic.new(a));b.tp$richcompare&&f(b);b.tp$as_number&&l(b);b.tp$as_sequence_or_mapping&&h(b);Object.entries(b).forEach(([a,b])=>{Object.defineProperty(e,a,{value:b,writable:!0})});b.tp$new&&(e.__new__=new Sk.builtin.sk_method(Sk.generic.newMethodDef,a),Object.defineProperty(e,\"sk$staticNew\",{value:a,writable:!0}));Sk.subSlots.main_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});var g=b.tp$hash;void 0!==g&&(\"function\"===typeof g?\r\nc(\"__hash__\",g):g===Sk.builtin.none.none$?e.__hash__=g:Sk.asserts.fail(\"invalid tp$hash\"));b.tp$as_number&&Sk.subSlots.number_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});b.tp$as_sequence_or_mapping&&Sk.subSlots.sequence_and_mapping_slots.forEach(([a,c])=>{a=b[a];void 0!==a&&d(c,a)});Object.defineProperty(e,\"tp$slots\",{value:null,writable:!0})}};Sk.abstr.buildNativeClass=function(a,b){b=b||{};Sk.asserts.assert(b.hasOwnProperty(\"constructor\"),\"A constructor is required to build a native class\");\r\nlet c=b.constructor;if(a.includes(\".\")){var d=a.split(\".\");a=d.pop();d=d.join(\".\")}Sk.abstr.setUpInheritance(a,c,b.base,b.meta);Sk.abstr.setUpBuiltinMro(c);const e=c.prototype;Object.defineProperties(e,{tp$slots:{value:b.slots,writable:!0},tp$getsets:{value:b.getsets,writable:!0},tp$methods:{value:b.methods,writable:!0},tp$classmethods:{value:b.classmethods,writable:!0}});Sk.abstr.setUpSlots(c,b.slots||{});Sk.abstr.setUpMethods(c,b.methods);Sk.abstr.setUpGetSets(c,b.getsets);Sk.abstr.setUpClassMethods(c,\r\nb.classmethods);void 0!==d&&(e.__module__=new Sk.builtin.str(d));Object.entries(b.proto||{}).forEach(([a,b])=>{Object.defineProperty(e,a,{value:b,writable:!0,enumerable:!(a.includes(\"$\")||a in Object.prototype)})});Object.entries(b.flags||{}).forEach(([a,b])=>{Object.defineProperty(c,a,{value:b,writable:!0})});void 0!==Sk.builtin.str&&e.hasOwnProperty(\"tp$doc\")&&!e.hasOwnProperty(\"__doc__\")&&(a=e.tp$doc||null,e.__doc__=\"string\"===typeof a?new Sk.builtin.str(a):Sk.builtin.none.none$);return c};Sk.abstr.buildIteratorClass=\r\nfunction(a,b){Sk.asserts.assert(b.hasOwnProperty(\"constructor\"),\"must provide a constructor\");b.slots=b.slots||{};b.slots.tp$iter=Sk.generic.selfIter;b.slots.tp$iternext=b.slots.tp$iternext||b.iternext;b.slots.tp$getattr=b.slots.tp$getattr||Sk.generic.getAttr;a=Sk.abstr.buildNativeClass(a,b);Sk.abstr.built$iterators.push(a);return a};Sk.abstr.built$iterators=[];Sk.abstr.setUpModuleMethods=function(a,b,c){Object.entries(c).forEach(([c,d])=>{d.$name=d.$name||c;b[c]=new Sk.builtin.sk_method(d,null,a)})};\r\nSk.abstr.superConstructor=function(a,b,c){var d=Array.prototype.slice.call(arguments,2);a.prototype.tp$base.apply(b,d)}},function(m,q){const a=new Map;Sk.builtin.object=Sk.abstr.buildNativeClass(\"object\",{constructor:function(){Sk.asserts.assert(this instanceof Sk.builtin.object,\"bad call to object, use 'new'\")},base:null,slots:{tp$new(a,b){if(a.length||b&&b.length){if(this.tp$new!==Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(\"object.__new__() takes exactly one argument (the type to instantiate)\");\r\nif(this.tp$init===Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+\"() takes no arguments\");}return new this.constructor},tp$init(a,b){if(a.length||b&&b.length){if(this.tp$init!==Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(\"object.__init__() takes exactly one argument (the instance to initialize)\");if(this.tp$new===Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+\".__init__() takes exactly one argument (the instance to initialize)\");\r\n}},tp$getattr:Sk.generic.getAttr,tp$setattr:Sk.generic.setAttr,$r(){const a=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$module);let b=\"\";a&&Sk.builtin.checkString(a)&&(b=a.v+\".\");return new Sk.builtin.str(\"<\"+b+Sk.abstr.typeName(this)+\" object>\")},tp$str(){return this.$r()},tp$hash(){let c=a.get(this);if(void 0!==c)return c;c=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2);a.set(this,c);return c},tp$richcompare(a,b){switch(b){case \"Eq\":a=this===a||Sk.builtin.NotImplemented.NotImplemented$;\r\nbreak;case \"NotEq\":a=this.tp$richcompare(a,\"Eq\");a!==Sk.builtin.NotImplemented.NotImplemented$&&(a=!Sk.misceval.isTrue(a));break;default:a=Sk.builtin.NotImplemented.NotImplemented$}return a},tp$doc:\"The most base type\"},getsets:{__class__:{$get(){return this.ob$type},$set(a){if(void 0===a)throw new Sk.builtin.TypeError(\"can't delete __class__ attribute\");if(!Sk.builtin.checkClass(a))throw new Sk.builtin.TypeError(\"__class__ must be set to a class, not '\"+Sk.abstr.typeName(a)+\"' object\");const b=this.ob$type;\r\nif(!(b.$isSubType(Sk.builtin.module)&&a.$isSubType(Sk.builtin.module)||void 0!==b.sk$klass&&void 0!==a.sk$klass))throw new Sk.builtin.TypeError(\" __class__ assignment only supported for heap types or ModuleType subclasses\");if(a.prototype.sk$builtinBase!==this.sk$builtinBase)throw new Sk.builtin.TypeError(\"__class__ assignment: '\"+Sk.abstr.typeName(this)+\"' object layout differs from '\"+a.prototype.tp$name+\"'\");Object.setPrototypeOf(this,a.prototype)},$doc:\"the object's class\"}},methods:{__dir__:{$meth:function(){let a=\r\n[];if(this.$d)if(this.$d instanceof Sk.builtin.dict)a=this.$d.sk$asarray();else for(var b in this.$d)a.push(new Sk.builtin.str(b));b=Sk.misceval.callsimArray(Sk.builtin.type.prototype.__dir__,[this.ob$type]);a.push(...b.v);b.v=a;return b},$flags:{NoArgs:!0},$doc:\"Default dir() implementation.\"},__format__:{$meth(a){if(Sk.builtin.checkString(a)){if(a=Sk.ffi.remapToJs(a),\"\"!==a)throw new Sk.builtin.NotImplementedError(\"format spec is not yet implemented\");}else{if(Sk.__future__.exceptions)throw new Sk.builtin.TypeError(\"format() argument 2 must be str, not \"+\r\nSk.abstr.typeName(a));throw new Sk.builtin.TypeError(\"format expects arg 2 to be string or unicode, not \"+Sk.abstr.typeName(a));}return this.tp$str()},$flags:{OneArg:!0},$doc:\"Default object formatter.\"}},proto:{valueOf:Object.prototype.valueOf,toString:function(){return this.tp$str().v},hasOwnProperty:Object.prototype.hasOwnProperty,hp$type:void 0,sk$attrError(){return\"'\"+this.tp$name+\"' object\"}}});Sk.abstr.setUpInheritance(\"type\",Sk.builtin.type,Sk.builtin.object);Sk.abstr.setUpBuiltinMro(Sk.builtin.type)},\r\nfunction(m,q){function a(a,b,c){Sk.abstr.checkNoArgs(this.$name,b,c);a=this.call(a);return void 0===a?Sk.builtin.none.none$:a}function c(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);a=this.call(a,b[0]);return void 0===a?Sk.builtin.none.none$:a}function b(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,1,2);a=this.call(a,...b);return void 0===a?Sk.builtin.none.none$:a}function e(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,2,2);this.call(a,\r\nb[0],b[1]);return Sk.builtin.none.none$}function f(a,b,d){a=c.call(this,a,b,d);return a===Sk.builtin.NotImplemented.NotImplemented$?a:new Sk.builtin.bool(a)}function l(a,b){return function(c,d,e){c=a.call(this,c,d,e);return b(c)}}function h(a){return function(){const b=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimArray(b,[])}}function d(a,b,c,d){return function(e){return function(){var f=e.tp$descr_get?e.tp$descr_get(this):e;f=Sk.misceval.callsimArray(f,[]);if(!b(f))throw new Sk.builtin.TypeError(a+\r\n\" should return \"+c+\" (returned \"+Sk.abstr.typeName(f)+\")\");return void 0!==d?d(f):f}}}function g(a){return function(b){const c=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimArray(c,[b])}}function n(a,b){let c=this.ob$type.$typeLookup(Sk.builtin.str.$getattribute);if(c instanceof Sk.builtin.wrapper_descriptor)return c.d$wrapped.call(this,a,b);c.tp$descr_get&&(c=c.tp$descr_get(this));const d=Sk.misceval.tryCatch(()=>Sk.misceval.callsimOrSuspendArray(c,[a]),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;\r\n});return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}function k(a,b,c){return function(d){return function(d,e,f){let g;void 0===e?(g=b,c=null):g=a;let h=this.ob$type.$typeLookup(new Sk.builtin.str(g));if(h instanceof Sk.builtin.wrapper_descriptor)return h.d$wrapped.call(this,d,e);h.tp$descr_get&&(h=h.tp$descr_get(this));if(void 0!==h)d=Sk.misceval.callsimOrSuspendArray(h,void 0===e?[d]:[d,e]);else{if(c)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(this)+\"' object \"+c);throw new Sk.builtin.AttributeError(g);\r\n}return f?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}}}function p(a,b){let c=a.ob$type;for(;c&&void 0!==c.sk$klass;)c=c.prototype.tp$base;if(c&&c.prototype.tp$setattr!==b)throw new Sk.builtin.TypeError(\"can't apply this \"+b.$name+\" to \"+Sk.abstr.typeName(a)+\" object\");}Sk.slots=Object.create(null);m=Sk.slots;Sk.slots.__init__={$name:\"__init__\",$slot_name:\"tp$init\",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,b,\r\nc);return Sk.misceval.chain(b,a=>{if(!Sk.builtin.checkNone(a)&&void 0!==a)throw new Sk.builtin.TypeError(\"__init__() should return None, not \"+Sk.abstr.typeName(a));})}},$wrapper:function(a,b,c){this.call(a,b,c);return Sk.builtin.none.none$},$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},$doc:\"Initialize self. See help(type(self)) for accurate signature.\"};m.__new__={$name:\"__new__\",$slot_name:\"tp$new\",$slot_func:function(a){const b=function(b,c){let d=a;a.tp$descr_get&&(d=a.tp$descr_get(null,\r\nthis.constructor));return Sk.misceval.callsimOrSuspendArray(d,[this.constructor,...b],c)};b.sk$static_new=!1;return b},$wrapper:null,$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},$doc:\"Create and return a new object.\"};m.__call__={$name:\"__call__\",$slot_name:\"tp$call\",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;return Sk.misceval.callsimOrSuspendArray(d,b,c)}},$wrapper:function(a,b,c){a=a.tp$call(b,c);return void 0===a?Sk.builtin.none.none$:\r\na},$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},$doc:\"Call self as a function.\"};m.__repr__={$name:\"__repr__\",$slot_name:\"$r\",$slot_func:d(\"__repr__\",Sk.builtin.checkString,\"str\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return repr(self).\"};m.__str__={$name:\"__str__\",$slot_name:\"tp$str\",$slot_func:d(\"__str__\",Sk.builtin.checkString,\"str\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return str(self).\"};var w=d(\"__hash__\",Sk.builtin.checkInt,\"int\",a=>\"number\"===\r\ntypeof a.v?a.v:a.tp$hash());m.__hash__={$name:\"__hash__\",$slot_name:\"tp$hash\",$slot_func:function(a){return a===Sk.builtin.none.none$?Sk.builtin.none.none$:w(a)},$wrapper:l(a,a=>new Sk.builtin.int_(a)),$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return hash(self).\"};m.__getattribute__={$name:\"__getattribute__\",$slot_name:\"tp$getattr\",$slot_func:function(a){return function(a,b){let c=this.ob$type.$typeLookup(Sk.builtin.str.$getattr);if(void 0===c)return n.call(this,a,b);const d=Sk.misceval.chain(n.call(this,\r\na,b),b=>Sk.misceval.tryCatch(()=>{if(void 0!==b)return b;c.tp$descr_get&&(c=c.tp$descr_get(this));return Sk.misceval.callsimOrSuspendArray(c,[a])},function(a){if(!(a instanceof Sk.builtin.AttributeError))throw a;}));return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}},$wrapper:function(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);b=b[0];if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"attribute name must be string, not '\"+Sk.abstr.typeName(b)+\"'\");c=this.call(a,b);if(void 0===c)throw new Sk.builtin.AttributeError(Sk.abstr.typeName(a)+\r\n\" has no attribute \"+b.$jsstr());return c},$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Return getattr(self, name).\"};m.__getattr__={$name:\"__getattr__\",$slot_name:\"tp$getattr\",$slot_func:m.__getattribute__.$slot_func,$wrapper:null,$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Return getattr(self, name).\"};m.__setattr__={$name:\"__setattr__\",$slot_name:\"tp$setattr\",$slot_func:k(\"__setattr__\",\"__delattr__\"),$wrapper:function(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,\r\nb,2,2);p(a,this);this.call(a,b[0],b[1]);return Sk.builtin.none.none$},$textsig:\"($self, name, value, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Implement setattr(self, name, value).\"};m.__delattr__={$name:\"__delattr__\",$slot_name:\"tp$setattr\",$slot_func:m.__setattr__.$slot_func,$wrapper:function(a,b,c){Sk.abstr.checkOneArg(this.$name,b,c);p(a,this);this.call(a,b[0]);return Sk.builtin.none.none$},$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Implement delattr(self, name).\"};m.__get__={$name:\"__get__\",\r\n$slot_name:\"tp$descr_get\",$slot_func:function(a){return function(b,c,d){null===b&&(b=Sk.builtin.none.none$);null==c&&(c=Sk.builtin.none.none$);const e=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(e,[b,c]);return d?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)}},$wrapper:function(a,b,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,b,1,2);c=b[0];b=b[1];c===Sk.builtin.none.none$&&(c=null);b===Sk.builtin.none.none$&&(b=null);if(null===b&&null===\r\nc)throw new Sk.builtin.TypeError(\"__get__(None, None) is invalid\");return this.call(a,c,b)},$textsig:\"($self, instance, owner, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Return an attribute of instance, which is of type owner.\"};m.__set__={$name:\"__set__\",$slot_name:\"tp$descr_set\",$slot_func:k(\"__set__\",\"__delete__\"),$wrapper:e,$textsig:\"($self, instance, value, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Set an attribute of instance to value.\"};m.__delete__={$name:\"__delete__\",$slot_name:\"tp$descr_set\",$slot_func:m.__set__.$slot_func,\r\n$wrapper:c,$textsig:\"($self, instance, /)\",$flags:{OneArg:!0},$doc:\"Delete an attribute of instance.\"};m.__eq__={$name:\"__eq__\",$slot_name:\"ob$eq\",$slot_func:g,$wrapper:f,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self==value.\"};m.__ge__={$name:\"__ge__\",$slot_name:\"ob$ge\",$slot_func:g,$wrapper:f,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self>=value.\"};m.__gt__={$name:\"__gt__\",$slot_name:\"ob$gt\",$slot_func:g,$wrapper:f,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},\r\n$doc:\"Return self>value.\"};m.__le__={$name:\"__le__\",$slot_name:\"ob$le\",$slot_func:g,$wrapper:f,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self<=value.\"};m.__lt__={$name:\"__lt__\",$slot_name:\"ob$lt\",$slot_func:g,$wrapper:f,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return selfSk.misceval.callsimOrSuspendArray(c,[]),a=>{if(!(a instanceof Sk.builtin.StopIteration))throw a;});return b?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}},$wrapper:function(a,b,c){Sk.abstr.checkNoArgs(this.$name,b,c);return Sk.misceval.chain(a.tp$iternext(!0),\r\na=>{if(void 0===a)throw new Sk.builtin.StopIteration;return a})},$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Implement next(self).\"};m.__len__={$name:\"__len__\",$slot_name:\"sq$length\",$slot_func:function(a){return function(b){const c=a.tp$descr_get?a.tp$descr_get(this):a;if(b)return b=Sk.misceval.callsimOrSuspendArray(c,[]),Sk.misceval.chain(b,a=>Sk.misceval.asIndexOrThrow(a));b=Sk.misceval.callsimArray(c,[]);return Sk.misceval.asIndexOrThrow(b)}},$wrapper:l(a,a=>new Sk.builtin.int_(a)),$flags:{NoArgs:!0},\r\n$textsig:\"($self, /)\",$doc:\"Return len(self).\"};m.__contains__={$name:\"__contains__\",$slot_name:\"sq$contains\",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,[b]);b=Sk.misceval.chain(b,a=>Sk.misceval.isTrue(a));return b.$isSuspension?c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b):b}},$wrapper:l(c,a=>new Sk.builtin.bool(a)),$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Return key in self.\"};m.__getitem__={$name:\"__getitem__\",\r\n$slot_name:\"mp$subscript\",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;b=Sk.misceval.callsimOrSuspendArray(d,[b]);return c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)}},$wrapper:c,$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Return self[key].\"};m.__setitem__={$name:\"__setitem__\",$slot_name:\"mp$ass_subscript\",$slot_func:k(\"__setitem__\",\"__delitem__\",\"does not support item assignment\"),$wrapper:e,$textsig:\"($self, key, value, /)\",$flags:{MinArgs:2,\r\nMaxArgs:2},$doc:\"Set self[key] to value.\"};m.__delitem__={$name:\"__delitem__\",$slot_name:\"mp$ass_subscript\",$slot_func:m.__setitem__.$slot_func,$wrapper:c,$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Delete self[key].\"};m.__add__={$name:\"__add__\",$slot_name:\"nb$add\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self+value.\"};m.__radd__={$name:\"__radd__\",$slot_name:\"nb$reflected_add\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},\r\n$doc:\"Return value+self.\"};m.__iadd__={$name:\"__iadd__\",$slot_name:\"nb$inplace_add\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self+=value.\"};m.__sub__={$name:\"__sub__\",$slot_name:\"nb$subtract\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self-value.\"};m.__rsub__={$name:\"__rsub__\",$slot_name:\"nb$reflected_subtract\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value-self.\"};\r\nm.__imul__={$name:\"__imul__\",$slot_name:\"nb$inplace_multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self*=value.\"};m.__mul__={$name:\"__mul__\",$slot_name:\"nb$multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self*value.\"};m.__rmul__={$name:\"__rmul__\",$slot_name:\"nb$reflected_multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value*self.\"};m.__isub__={$name:\"__isub__\",\r\n$slot_name:\"nb$inplace_subtract\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self-=value.\"};m.__mod__={$name:\"__mod__\",$slot_name:\"nb$remainder\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self%value.\"};m.__rmod__={$name:\"__rmod__\",$slot_name:\"nb$reflected_remainder\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value%self.\"};m.__imod__={$name:\"__imod__\",$slot_name:\"nb$inplace_remainder\",\r\n$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement value%=self.\"};m.__divmod__={$name:\"__divmod__\",$slot_name:\"nb$divmod\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return divmod(self, value).\"};m.__rdivmod__={$name:\"__rdivmod__\",$slot_name:\"nb$reflected_divmod\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return divmod(value, self)\"};m.__pos__={$name:\"__pos__\",$slot_name:\"nb$positive\",$slot_func:h,\r\n$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"+self\"};m.__neg__={$name:\"__neg__\",$slot_name:\"nb$negative\",$slot_func:h,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"-self\"};m.__abs__={$name:\"__abs__\",$slot_name:\"nb$abs\",$slot_func:h,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"abs(self)\"};m.__bool__={$name:\"__bool__\",$slot_name:\"nb$bool\",$slot_func:d(\"__bool__\",Sk.builtin.checkBool,\"bool\",a=>0!==a.v),$wrapper:l(a,a=>new Sk.builtin.bool(a)),$textsig:\"($self, /)\",\r\n$flags:{NoArgs:!0},$doc:\"self != 0\"};m.__invert__={$name:\"__invert__\",$slot_name:\"nb$invert\",$slot_func:h,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"~self\"};m.__lshift__={$name:\"__lshift__\",$slot_name:\"nb$lshift\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self<>value.\"};m.__rrshift__={$name:\"__rrshift__\",$slot_name:\"nb$reflected_rshift\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value>>self.\"};m.__ilshift__={$name:\"__ilshift__\",$slot_name:\"nb$inplace_lshift\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self<<=value.\"};m.__irshift__={$name:\"__irshift__\",\r\n$slot_name:\"nb$inplace_rshift\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self=>>value.\"};m.__and__={$name:\"__and__\",$slot_name:\"nb$and\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self&value.\"};m.__rand__={$name:\"__rand__\",$slot_name:\"nb$refelcted_and\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value&self.\"};m.__iand__={$name:\"__iand__\",$slot_name:\"nb$and\",$slot_func:g,\r\n$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self&=value.\"};m.__xor__={$name:\"__xor__\",$slot_name:\"nb$xor\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self^value.\"};m.__rxor__={$name:\"__rxor__\",$slot_name:\"nb$reflected_xor\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value^self.\"};m.__ixor__={$name:\"__ixor__\",$slot_name:\"nb$inplace_xor\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",\r\n$flags:{OneArg:!0},$doc:\"Implement self^=value.\"};m.__or__={$name:\"__or__\",$slot_name:\"nb$or\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self|value.\"};m.__ror__={$name:\"__ror__\",$slot_name:\"nb$reflected_or\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value|self.\"};m.__ior__={$name:\"__ior__\",$slot_name:\"nb$inplace_or\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self|=value.\"};\r\nm.__int__={$name:\"__int__\",$slot_name:\"nb$int\",$slot_func:d(\"__int__\",Sk.builtin.checkInt,\"int\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"int(self)\"};m.__float__={$name:\"__float__\",$slot_name:\"nb$float\",$slot_func:d(\"__float__\",Sk.builtin.checkFloat,\"float\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"float(self)\"};m.__floordiv__={$name:\"__floordiv__\",$slot_name:\"nb$floor_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self//value.\"};\r\nm.__rfloordiv__={$name:\"__rfloordiv__\",$slot_name:\"nb$reflected_floor_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value//self.\"};m.__ifloordiv__={$name:\"__ifloordiv__\",$slot_name:\"nb$inplace_floor_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self//=value.\"};m.__truediv__={$name:\"__truediv__\",$slot_name:\"nb$divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self/value.\"};\r\nm.__rtruediv__={$name:\"__rtruediv__\",$slot_name:\"nb$reflected_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value/self.\"};m.__itruediv__={$name:\"__itruediv__\",$slot_name:\"nb$inplace_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self/=value.\"};m.__index__={$name:\"__index__\",$slot_name:\"nb$index\",$slot_func:d(\"__index__\",Sk.builtin.checkInt,\"int\",a=>a.v),$wrapper:l(a,a=>new Sk.builtin.int_(a)),$textsig:\"($self, /)\",\r\n$flags:{NoArgs:!0},$doc:\"Return self converted to an integer, if self is suitable for use as an index into a list.\"};m.__pow__={$name:\"__pow__\",$slot_name:\"nb$power\",$slot_func:function(a){return function(b,c){const d=a.tp$descr_get?a.tp$descr_get(this):a;return void 0==c?Sk.misceval.callsimArray(d,[b]):Sk.misceval.callsimArray(d,[b,c])}},$wrapper:b,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Return pow(self, value, mod).\"};m.__rpow__={$name:\"__rpow__\",$slot_name:\"nb$reflected_power\",\r\n$slot_func:m.__pow__.$slot_func,$wrapper:b,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Return pow(value, self, mod).\"};m.__ipow__={$name:\"__ipow__\",$slot_name:\"nb$inplace_power\",$slot_func:m.__pow__.$slot_func,$wrapper:b,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Implement **=\"};m.__matmul__={$name:\"__matmul__\",$slot_name:\"nb$matrix_multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self@value.\"};\r\nm.__rmatmul__={$name:\"__rmatmul__\",$slot_name:\"nb$reflected_matrix_multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value@self.\"};m.__imatmul__={$name:\"__imatmul__\",$slot_name:\"nb$inplace_matrix_multiply\",$slot_func:g,$wrapper:c,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self@=value.\"};m.__long__={$name:\"__long__\",$slot_name:\"nb$long\",$slot_func:d(\"__long__\",Sk.builtin.checkInt,\"int\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},\r\n$doc:\"int(self)\"};var A,t={next:{$name:\"next\",$slot_name:\"tp$iternext\",$slot_func:m.__next__.$slot_func,$wrapper:m.__next__.$wrapper,$textsig:m.__next__.$textsig,$flags:m.__next__.$flags},__nonzero__:{$name:\"__nonzero__\",$slot_name:\"nb$bool\",$slot_func:d(\"__nonzero__\",Sk.builtin.checkInt,\"int\",a=>0!==a.v),$wrapper:l(a,a=>new Sk.builtin.bool(a)),$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"x.__nonzero__() <==> x != 0\"},__div__:{$name:\"__div__\",$slot_name:\"nb$divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, other/)\",\r\n$flags:{OneArg:!0},$doc:\"x.__div__(y) <==> x/y\"},__rdiv__:{$name:\"__rdiv__\",$slot_name:\"nb$reflected_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, other/)\",$flags:{OneArg:!0},$doc:\"x.__rdiv__(y) <==> x/y\"},__idiv__:{$name:\"__idiv__\",$slot_name:\"nb$inplace_divide\",$slot_func:g,$wrapper:c,$textsig:\"($self, other/)\",$flags:{OneArg:!0},$doc:\"implement self /= other\"}};Sk.subSlots={main_slots:Object.entries({tp$init:\"__init__\",tp$call:\"__call__\",$r:\"__repr__\",tp$str:\"__str__\",tp$getattr:\"__getattribute__\",\r\ntp$setattr:[\"__setattr__\",\"__delattr__\"],ob$eq:\"__eq__\",ob$ne:\"__ne__\",ob$lt:\"__lt__\",ob$le:\"__le__\",ob$gt:\"__gt__\",ob$ge:\"__ge__\",tp$descr_get:\"__get__\",tp$descr_set:[\"__set__\",\"__delete__\"],tp$iter:\"__iter__\",tp$iternext:\"__next__\"}),number_slots:Object.entries({nb$abs:\"__abs__\",nb$negative:\"__neg__\",nb$positive:\"__pos__\",nb$int:\"__int__\",nb$long:\"__long__\",nb$float:\"__float__\",nb$add:\"__add__\",nb$reflected_add:\"__radd__\",nb$inplace_add:\"__iadd__\",nb$subtract:\"__sub__\",nb$reflected_subtract:\"__rsub__\",\r\nnb$inplace_subtract:\"__isub__\",nb$multiply:\"__mul__\",nb$reflected_multiply:\"__rmul__\",nb$inplace_multiply:\"__imul__\",nb$floor_divide:\"__floordiv__\",nb$reflected_floor_divide:\"__rfloordiv__\",nb$inplace_floor_divide:\"__ifloordiv__\",nb$invert:\"__invert__\",nb$remainder:\"__mod__\",nb$reflected_remainder:\"__rmod__\",nb$inplace_remainder:\"__imod__\",nb$divmod:\"__divmod__\",nb$reflected_divmod:\"__rdivmod__\",nb$power:\"__pow__\",nb$reflected_power:\"__rpow__\",nb$inplace_power:\"__ipow__\",nb$divide:\"__truediv__\",nb$reflected_divide:\"__rtruediv__\",\r\nnb$inplace_divide:\"__itruediv__\",nb$bool:\"__bool__\",nb$and:\"__and__\",nb$reflected_and:\"__rand__\",nb$inplace_and:\"__iand__\",nb$or:\"__or__\",nb$reflected_or:\"__ror__\",nb$inplace_or:\"__ior__\",nb$xor:\"__xor__\",nb$reflected_xor:\"__rxor__\",nb$inplace_xor:\"__ixor__\",nb$lshift:\"__lshift__\",nb$reflected_lshift:\"__rlshift__\",nb$rshift:\"__rshift__\",nb$reflected_rshift:\"__rrshift__\",nb$inplace_lshift:\"__ilshift__\",nb$inplace_rshift:\"__irshift__\",nb$matrix_multiply:\"__matmul__\",nb$reflected_matrix_multiply:\"__rmatmul__\",\r\nnb$inplace_matrix_multiply:\"__imatmul__\"}),sequence_and_mapping_slots:Object.entries({sq$length:\"__len__\",sq$contains:\"__contains__\",mp$subscript:\"__getitem__\",mp$ass_subscript:[\"__setitem__\",\"__delitem__\"],nb$add:\"__add__\",nb$multiply:\"__mul__\",nb$reflected_multiply:\"__rmul__\",nb$inplace_add:\"__iadd__\",nb$inplace_multiply:\"__imul__\"})};Sk.reflectedNumberSlots={nb$add:{reflected:\"nb$reflected_add\"},nb$subtract:{reflected:\"nb$reflected_subtract\",slot:function(a){return a instanceof this.constructor?\r\na.nb$subtract(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$multiply:{reflected:\"nb$reflected_multiply\"},nb$divide:{reflected:\"nb$reflected_divide\",slot:function(a){return a instanceof this.constructor?a.nb$divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$floor_divide:{reflected:\"nb$reflected_floor_divide\",slot:function(a){return a instanceof this.constructor?a.nb$floor_divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$remainder:{reflected:\"nb$reflected_remainder\",slot:function(a){return a instanceof\r\nthis.constructor?a.nb$remainder(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$divmod:{reflected:\"nb$reflected_divmod\",slot:function(a){return a instanceof this.constructor?a.nb$divmod(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$power:{reflected:\"nb$reflected_power\",slot:function(a,b){return a instanceof this.constructor?a.nb$power(this,b):Sk.builtin.NotImplemented.NotImplemented$}},nb$and:{reflected:\"nb$reflected_and\"},nb$or:{reflected:\"nb$reflected_or\"},nb$xor:{reflected:\"nb$reflected_xor\"},\r\nnb$lshift:{reflected:\"nb$reflected_lshift\",slot:function(a){return a instanceof this.constructor?a.nb$lshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$rshift:{reflected:\"nb$reflected_rshift\",slot:function(a){return a instanceof this.constructor?a.nb$rshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$matrix_multiply:{reflected:\"nb$reflexted_matrix_multiply\",slot:function(a){return a instanceof this.constructor?a.nb$matrix_multiply(this):Sk.builtin.NotImplemented.NotImplemented$}}};\r\nSk.sequenceAndMappingSlots={sq$concat:[\"nb$add\"],sq$repeat:[\"nb$multiply\",\"nb$reflected_multiply\"],mp$length:[\"sq$length\"],sq$inplace_repeat:[\"nb$inplace_multiply\"],sq$inplace_concat:[\"nb$inplace_add\"]};Sk.dunderToSkulpt={__repr__:\"$r\",__str__:\"tp$str\",__init__:\"tp$init\",__new__:\"tp$new\",__hash__:\"tp$hash\",__call__:\"tp$call\",__iter__:\"tp$iter\",__next__:\"tp$iternext\",__eq__:\"ob$eq\",__ne__:\"ob$ne\",__lt__:\"ob$lt\",__le__:\"ob$le\",__gt__:\"ob$gt\",__ge__:\"ob$ge\",__abs__:\"nb$abs\",__neg__:\"nb$negative\",__pos__:\"nb$positive\",\r\n__int__:\"nb$int\",__float__:\"nb$float\",__add__:\"nb$add\",__radd__:\"nb$reflected_add\",__iadd__:\"nb$inplace_add\",__sub__:\"nb$subtract\",__rsub__:\"nb$reflected_subtract\",__isub__:\"nb$inplace_subtract\",__mul__:\"nb$multiply\",__rmul__:\"nb$reflected_multiply\",__imul__:\"nb$inplace_multiply\",__truediv__:\"nb$divide\",__rtruediv__:\"nb$reflected_divide\",__itruediv__:\"nb$inplace_divide\",__floordiv__:\"nb$floor_divide\",__rfloordiv__:\"nb$reflected_floor_divide\",__ifloordiv__:\"nb$inplace_floor_divide\",__invert__:\"nb$invert\",\r\n__mod__:\"nb$remainder\",__rmod__:\"nb$reflected_remainder\",__imod__:\"nb$inplace_remainder\",__divmod__:\"nb$divmod\",__rdivmod__:\"nb$reflected_divmod\",__pow__:\"nb$power\",__rpow__:\"nb$reflected_power\",__ipow__:\"nb$inplace_power\",__bool__:\"nb$bool\",__long__:\"nb$long\",__lshift__:\"nb$lshift\",__rlshift__:\"nb$reflected_lshift\",__ilshift__:\"nb$inplace_lshift\",__rshift__:\"nb$rshift\",__rrshift__:\"nb$reflected_rshift\",__irshift__:\"nb$inplace_rshift\",__and__:\"nb$and\",__rand__:\"nb$reflected_and\",__iand__:\"nb$inplace_and\",\r\n__or__:\"nb$or\",__ror__:\"nb$reflected_or\",__ior__:\"nb$inplace_or\",__xor__:\"nb$xor\",__rxor__:\"nb$reflected_xor\",__ixor__:\"nb$inplace_xor\",__matmul__:\"nb$matrix_multiply\",__rmatmul__:\"nb$reflected_matrix_multiply\",__imatmul__:\"nb$inplace_matrix_multiply\",__get__:\"tp$descr_get\",__set__:\"tp$descr_set\",__delete__:\"tp$descr_set\",__getattribute__:\"tp$getattr\",__getattr__:\"tp$getattr\",__setattr__:\"tp$setattr\",__delattr__:\"tp$setattr\",__len__:\"sq$length\",__contains__:\"sq$contains\",__getitem__:\"mp$subscript\",\r\n__setitem__:\"mp$ass_subscript\",__delitem__:\"mp$ass_subscript\"};Sk.exportSymbol(\"Sk.setupDunderMethods\",Sk.setupDunderMethods);Sk.setupDunderMethods=function(a){function b(a,b,c){for(let d=0;d\"tp$iternext\"===a[0]),\r\nk=f.findIndex(a=>\"nb$bool\"===a[0]),l=Sk.dunderToSkulpt;if(a){l.__bool__=\"nb$bool\";l.__next__=\"tp$iternext\";delete l.__nonzero__;delete l.__div__;delete l.__rdiv__;delete l.__idiv__;delete l.next;for(let a in A)c[a]=A[a];for(let a in t)delete c[a];for(a=0;a\")}const f={__doc__:{$get(){return this.d$def.$doc?new Sk.builtin.str(this.d$def.$doc):Sk.builtin.none.none$}},__objclass__:{$get(){return this.d$type}},\r\n__name__:{$get(){return new Sk.builtin.str(this.d$name)}}};m={__text_signature__:{$get(){return this.d$def.$textsig?new Sk.builtin.str(this.d$def.$textsig):Sk.builtin.none.none$}}};Sk.builtin.getset_descriptor=a(\"getset_descriptor\",void 0,{constructor:function(a,b){this.d$def=b;this.$get=b.$get;this.$set=b.$set;this.d$type=a;this.d$name=b.$name},slots:{tp$descr_get(a,b){if(b=this.d$check(a))return b;if(void 0!==this.$get)return this.$get.call(a);throw new Sk.builtin.AttributeError(\"getset_descriptor '\"+\r\nthis.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' objects is not readable\");},tp$descr_set(a,b){this.d$set_check(a);if(void 0!==this.$set)return this.$set.call(a,b);throw new Sk.builtin.AttributeError(\"attribute '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' objects is readonly\");}}});Sk.builtin.method_descriptor=a(\"method_descriptor\",\"method\",{constructor:function(a,b){this.d$def=b;this.$meth=b.$meth;this.d$type=a;this.d$name=b.$name||\"\";this.$flags=a=b.$flags||{};a.FastCall&&\r\na.NoKwargs?this.tp$call=this.$methodFastCallNoKwargs:a.FastCall?this.tp$call=this.$methodFastCall:a.NoArgs?this.tp$call=this.$methodCallNoArgs:a.OneArg?this.tp$call=this.$methodCallOneArg:a.NamedArgs?this.tp$call=this.$methodCallNamedArgs:void 0!==a.MinArgs?this.tp$call=this.$methodCallMinArgs:(this.func_code=b.$meth,this.tp$call=this.$defaultCall,this.$memoiseFlags=Sk.builtin.func.prototype.$memoiseFlags,this.$resolveArgs=Sk.builtin.func.prototype.$resolveArgs)},slots:{tp$call(a,b){return this.tp$call(a,\r\nb)},tp$descr_get(a,b){let c;return(c=this.d$check(a))?c:new Sk.builtin.sk_method(this.d$def,a)}},getsets:m,proto:{$methodFastCall(a,b){const c=a.shift();this.m$checkself(c);return this.$meth.call(c,a,b)},$methodFastCallNoKwargs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoKwargs(this.d$name,b);return this.$meth.call(c,a)},$methodCallNoArgs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoArgs(this.d$name,a,b);return this.$meth.call(c)},$methodCallOneArg(a,b){const c=a.shift();\r\nthis.m$checkself(c);Sk.abstr.checkOneArg(this.d$name,a,b);return this.$meth.call(c,a[0])},$methodCallNamedArgs(a,b){const c=a.shift();this.m$checkself(c);a=Sk.abstr.copyKeywordsToNamedArgs(this.d$name,this.$flags.NamedArgs,a,b,this.$flags.Defaults);return this.$meth.call(c,...a)},$methodCallMinArgs(a,b){const c=a.shift();this.m$checkself(c);Sk.abstr.checkNoKwargs(this.d$name,b);Sk.abstr.checkArgsLen(this.d$name,a,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth.call(c,...a)},$defaultCall(a,\r\nb){this.m$checkself(a[0]);return Sk.builtin.func.prototype.tp$call.call(this,a,b)},m$checkself(a){if(void 0===a)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");this.d$check(a)}}});Sk.builtin.wrapper_descriptor=a(\"wrapper_descriptor\",\"slot wrapper\",{constructor:function(a,b,c){this.d$def=b;this.d$type=a;this.d$name=c.$name=b.$name;this.d$wrapped=c},slots:{tp$descr_get(a,b){let c;return(c=this.d$check(a))?c:new Sk.builtin.method_wrapper(this,\r\na)},tp$call(a,b){if(1>a.length)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");const c=a.shift();if(!c.ob$type.$isSubType(this.d$type))throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' requires a '\"+this.d$type.prototype.tp$name+\"' object but received a '\"+Sk.abstr.typeName(c)+\"'\");return this.raw$call(c,a,b)}},proto:{raw$call(a,b,c){this.d$wrapped.$name=this.d$name;return this.d$def.$wrapper.call(this.d$wrapped,\r\na,b,c)}}});Sk.builtin.method_wrapper=a(\"method_wrapper\",void 0,{constructor:function(a,b){this.m$descr=a;this.m$self=b;this.d$def=a.d$def;this.d$name=a.d$name;this.d$type=a.d$type},slots:{tp$call(a,b){return this.m$descr.raw$call(this.m$self,a,b)},tp$richcompare(a,b){if(\"Eq\"!==b&&\"NotEq\"!==b||!(a instanceof Sk.builtin.method_wrapper))return Sk.builtin.NotImplemented.NotImplemented$;a=this.m$self===a.m$self&&this.m$descr===a.m$descr;return\"Eq\"===b?a:!a},$r(){return new Sk.builtin.str(\"\")}},getsets:{__self__:{$get(){return this.m$self}}}});Sk.builtin.classmethod_descriptor=a(\"classmethod_descriptor\",\"method\",{constructor:function(a,b){this.d$def=b;this.$meth=b.$meth;this.d$type=a;this.d$name=b.$name||\"\"},slots:{tp$call(a,b){if(1>a.length)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");const c=a.shift();return this.tp$descr_get(null,\r\nc).tp$call(a,b)},tp$descr_get(a,b,c){if(void 0===b)if(null!==a)b=b||a.ob$type;else throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' for type '\"+this.d$type.prototype.tp$name+\"' needs an object or a type\");if(b.ob$type!==Sk.builtin.type)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' for type '\"+this.d$type.prototype.tp$name+\"' needs a type not a '\"+Sk.abstr.typeName(b)+\"' as arg 2\");if(!b.$isSubType(this.d$type))throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' requires a '\"+\r\nthis.d$type.prototype.tp$name+\"' object but received a '\"+Sk.abstr.typeName(b)+\"' object\");return new Sk.builtin.sk_method(this.d$def,b)}},getsets:m});[Sk.builtin.method_descriptor,Sk.builtin.getset_descriptor,Sk.builtin.wrapper_descriptor,Sk.builtin.method_wrapper,Sk.builtin.classmethod_descriptor].forEach(a=>{Sk.abstr.setUpSlots(a);Sk.abstr.setUpMethods(a);Sk.abstr.setUpGetSets(a)})},function(m,q){Sk.builtin.sk_method=Sk.abstr.buildNativeClass(\"builtin_function_or_method\",{constructor:function(a,\r\nc,b){this.$meth=a.$meth.bind(c);this.$doc=a.$doc;this.$self=c||null;this.$module=b?new Sk.builtin.str(b):null;this.$name=a.$name||a.$meth.name||\"\";this.m$def=a;this.$textsig=a.$textsig;this.$flags=a=a.$flags||{};a.FastCall&&a.NoKwargs?this.tp$call=this.$fastCallNoKwargs:a.FastCall?this.tp$call=this.$meth:a.NoArgs?this.tp$call=this.$callNoArgs:a.OneArg?this.tp$call=this.$callOneArg:a.NamedArgs?this.tp$call=this.$callNamedArgs:void 0!==a.MinArgs?this.tp$call=this.$callMinArgs:(this.func_code=\r\nthis.$meth,this.tp$call=this.$defaultCallMethod)},proto:{$fastCallNoKwargs(a,c){Sk.abstr.checkNoKwargs(this.$name,c);return this.$meth(a)},$callNoArgs(a,c){Sk.abstr.checkNoArgs(this.$name,a,c);return this.$meth()},$callOneArg(a,c){Sk.abstr.checkOneArg(this.$name,a,c);return this.$meth(a[0])},$callNamedArgs(a,c){a=Sk.abstr.copyKeywordsToNamedArgs(this.$name,this.$flags.NamedArgs,a,c,this.$flags.Defaults);return this.$meth(...a)},$callMinArgs(a,c){Sk.abstr.checkNoKwargs(this.$name,c);Sk.abstr.checkArgsLen(this.$name,\r\na,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth(...a)},$defaultCallMethod(a,c){return null!==this.$self?Sk.builtin.func.prototype.tp$call.call(this,[this.$self,...a],c):Sk.builtin.func.prototype.tp$call.call(this,a,c)},$memoiseFlags(){return Sk.builtin.func.prototype.$memoiseFlags.call(this)},$resolveArgs(){return Sk.builtin.func.prototype.$resolveArgs.call(this)}},flags:{sk$acceptable_as_base_class:!1},slots:{tp$getattr:Sk.generic.getAttr,$r(){return null===this.$self?new Sk.builtin.str(\"\"):new Sk.builtin.str(\"\")},tp$call(a,c){return this.tp$call(a,c)},tp$richcompare(a,c){if(\"Eq\"!==c&&\"NotEq\"!==c||!(a instanceof Sk.builtin.sk_method))return Sk.builtin.NotImplemented.NotImplemented$;a=this.$self===a.$self&&this.m$def.$meth===a.m$def.$meth;return\"Eq\"===c?a:!a}},getsets:{__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(a){this.$module=a=a||Sk.builtin.none.none$}},__doc__:{$get(){return this.$doc?\r\nnew Sk.builtin.str(this.$doc):Sk.builtin.none.none$}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__text_signature__:{$get(){return new Sk.builtin.str(this.$textsig)}},__self__:{$get(){return this.$self||Sk.sysModules.mp$lookup(this.$module)||Sk.builtin.none.none$}}}})},function(m,q){Sk.builtin.none=Sk.abstr.buildNativeClass(\"NoneType\",{constructor:function(){return Sk.builtin.none.none$},slots:{tp$new(a,c){Sk.abstr.checkNoArgs(\"NoneType\",a,c);return Sk.builtin.none.none$},$r(){return new Sk.builtin.str(\"None\")},\r\ntp$as_number:!0,nb$bool(){return!1}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.none.none$=Object.create(Sk.builtin.none.prototype,{v:{value:null,enumerable:!0}});Sk.builtin.NotImplemented=Sk.abstr.buildNativeClass(\"NotImplementedType\",{constructor:function(){return Sk.builtin.NotImplemented.NotImplemented$},slots:{$r(){return new Sk.builtin.str(\"NotImplemented\")},tp$new(a,c){Sk.abstr.checkNoArgs(\"NotImplementedType\",a,c);return Sk.builtin.NotImplemented.NotImplemented$}},flags:{sk$acceptable_as_base_class:!1}});\r\nSk.builtin.NotImplemented.NotImplemented$=Object.create(Sk.builtin.NotImplemented.prototype,{v:{value:null,enumerable:!0}})},function(m,q){const a=/^(?:(.)?([<>=\\^]))?([\\+\\-\\s])?(#)?(0)?(\\d+)?(,)?(?:\\.(\\d+))?([bcdeEfFgGnosxX%])?$/;Sk.formatting={};let c=function(a,b,c,e){Sk.asserts.assert(\"string\"===typeof b);if(a[6]){var d=parseInt(a[6],10);e=a[2]||(a[5]?\"=\":e?\">\":\"<\");let f=d-(b.length+(c?c.length:0));if(0>=f)return b;d=(a[1]||(a[5]?\"0\":\" \")).repeat(f);switch(e){case \"=\":if(\"s\"===a[9])throw new Sk.builtin.ValueError(\"'=' alignment not allowed in string format specifier\");\r\nreturn c+d+b;case \">\":return d+c+b;case \"<\":return c+b+d;case \"^\":return a=Math.floor(f/2),d.substring(0,a)+c+b+d.substring(a)}}return c+b},b=function(a,b){return b?\"-\":\"+\"===a[3]?\"+\":\" \"===a[3]?\" \":\"\"},e=function(a,e,d){Sk.asserts.assert(e instanceof Sk.builtin.int_||e instanceof Sk.builtin.lng);if(a[8])throw new Sk.builtin.ValueError(\"Precision not allowed in integer format\");let f=e.str$(d,!1);e=e.nb$isnegative();e=b(a,e);a[4]&&(16===d?e+=\"0x\":8===d?e+=\"0o\":2===d&&(e+=\"0b\"));\"X\"===a[9]&&(f=f.toUpperCase());\r\n\"n\"===a[9]?f=(+f).toLocaleString():a[7]&&(d=f.toString().split(\".\"),d[0]=d[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g,\",\"),f=d.join(\".\"));return c(a,f,e,!0)},f=function(f,h,d){if(!h)return f.str$(10,!0);h=h.match(a);if(!h)throw new Sk.builtin.ValueError(\"Invalid format specifier\");var g=h[9];g||(g=d?\"g\":\"d\");if(-1==(d?\"fFeEgG%\":\"bcdoxXnfFeEgG%\").indexOf(g))throw new Sk.builtin.ValueError(\"Unknown format code '\"+h[9]+\"' for object of type '\"+Sk.abstr.typeName(f)+\"'\");switch(g){case \"d\":case \"n\":return e(h,\r\nf,10);case \"x\":case \"X\":return e(h,f,16);case \"o\":return e(h,f,8);case \"b\":return e(h,f,2);case \"c\":if(h[3])throw new Sk.builtin.ValueError(\"Sign not allowed with integer format specifier 'c'\");if(h[4])throw new Sk.builtin.ValueError(\"Alternate form not allowed with integer format specifier 'c'\");if(h[7])throw new Sk.builtin.ValueError(\"Cannot specify ',' with 'c'\");if(h[8])throw new Sk.builtin.ValueError(\"Cannot specify ',' with 'c'\");return c(h,String.fromCodePoint(Sk.builtin.asnum$(f)),\"\",!0);\r\ncase \"f\":case \"F\":case \"e\":case \"E\":case \"g\":case \"G\":{if(h[4])throw new Sk.builtin.ValueError(\"Alternate form (#) not allowed in float format specifier\");d=Sk.builtin.asnum$(f);\"string\"===typeof d&&(d=Number(d));if(Infinity===d)return c(h,\"inf\",\"\",!0);if(-Infinity===d)return c(h,\"inf\",\"-\",!0);if(isNaN(d))return c(h,\"nan\",\"\",!0);f=!1;0>d&&(d=-d,f=!0);var l=[\"toExponential\",\"toFixed\",\"toPrecision\"][\"efg\".indexOf(g.toLowerCase())];let a=h[8]?parseInt(h[8],10):6;d=d[l](a);-1!==\"EFG\".indexOf(g)&&(d=d.toUpperCase());\r\nif(\"g\"===g.toLowerCase()||!h[9]){if(l=d.match(/\\.(\\d*[1-9])?(0+)$/)){let [,a,b]=l;d=d.slice(0,a?-b.length:-(b.length+1))}-1!=d.indexOf(\".\")||h[9]||(d+=\".0\")}\"e\"===g.toLowerCase()&&(d=d.replace(/^([-+]?[0-9]*\\.?[0-9]+[eE][-+]?)([0-9])?$/,\"$10$2\"));h[7]&&(g=d.toString().split(\".\"),g[0]=g[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g,\",\"),d=g.join(\".\"));return c(h,d,b(h,f),!0)}case \"%\":if(h[4])throw new Sk.builtin.ValueError(\"Alternate form (#) not allowed with format specifier '%'\");f=Sk.builtin.asnum$(f);\"string\"===\r\ntypeof f&&(f=Number(f));if(Infinity===f)return c(h,\"inf%\",\"\",!0);if(-Infinity===f)return c(h,\"inf%\",\"-\",!0);if(isNaN(f))return c(h,\"nan%\",\"\",!0);g=!1;0>f&&(f=-f,g=!0);d=h[8]?parseInt(h[8],10):6;f=(100*f).toFixed(d)+\"%\";return c(h,f,b(h,g),!0);default:throw new Sk.builtin.ValueError(\"Unknown format code '\"+h[9]+\"'\");}};Sk.formatting.mkNumber__format__=a=>function(b){if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"format() argument 2 must be str, not \"+Sk.abstr.typeName(b));return new Sk.builtin.str(f(this,\r\nb.$jsstr(),a))};Sk.formatting.format=function(a,b){b=b||[];const c={};for(let a=0;ac?Infinity:c;null!=(h=e.exec(a))&&kd)return new Sk.builtin.tuple([new Sk.builtin.str(\"\"),new Sk.builtin.str(\"\"),new Sk.builtin.str(c)])}else if(d=c.indexOf(b),0>d)return new Sk.builtin.tuple([new Sk.builtin.str(c),new Sk.builtin.str(\"\"),new Sk.builtin.str(\"\")]);return new Sk.builtin.tuple([new Sk.builtin.str(c.substring(0,d)),new Sk.builtin.str(b),new Sk.builtin.str(c.substring(d+b.length))])}}function f(a,b){return function(c,d){c=Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);\r\nif(void 0===d)d=\" \";else if(d instanceof Sk.builtin.str&&1===d.sq$length())d=d.v;else throw new Sk.builtin.TypeError(\"the fill character must be a str of length 1\");const e=this.sq$length();let f;if(e>=c)return new Sk.builtin.str(this.v);if(b)return f=d.repeat(Math.floor((c-e)/2)),f=f+this.v+f,(c-e)%2&&(f+=d),new Sk.builtin.str(f);f=d.repeat(c-e);return new Sk.builtin.str(a?f+this.v:this.v+f)}}function l(a,b,c){({start:b,end:c}=Sk.builtin.slice.startEnd$wrt(a,b,c));if(a.$hasAstralCodePoints()){const d=\r\na.codepoints[b];b=void 0===d?b+a.v.length-a.codepoints.length:d;c=a.codepoints[c];c=void 0===c?a.v.length:c}return{start:b,end:c}}function h(a){return function(b,c,d){b=this.get$tgt(b);({start:c,end:d}=l(this,c,d));if(d=c&&b<=d?b:-1;if(this.codepoints){d=this.sq$length();c=-1;for(let a=0;ae)return Sk.builtin.bool.false$;d=this.v.slice(d,e);if(c instanceof Sk.builtin.tuple){for(let e=Sk.abstr.iter(c),f=e.tp$iternext();void 0!==f;f=e.tp$iternext()){if(!(f instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"tuple for \"+a+\" must only contain str, not \"+Sk.abstr.typeName(f));if(b(d,f.v))return Sk.builtin.bool.true$}return Sk.builtin.bool.false$}return new Sk.builtin.bool(b(d,\r\nc.v))}}var g=/^[0-9!#_]/,n=Object.create(null);Sk.builtin.str=Sk.abstr.buildNativeClass(\"str\",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.str,\"bad call to str - use 'new'\");if(\"string\"!==typeof a)if(void 0===a)a=\"\";else if(null===a)a=\"None\";else{if(void 0!==a.tp$str)return a.tp$str();if(\"number\"===typeof a)a=Number.isFinite(a)?String(a):String(a).replace(\"Infinity\",\"inf\").replace(\"NaN\",\"nan\");else throw new Sk.builtin.TypeError(\"could not convert object of type '\"+Sk.abstr.typeName(a)+\r\n\"' to str\");}var b=n[a];if(void 0!==b)return b;n[a]=this;b=void 0===t[a]?a:a+\"_$rw$\";this.$mangled=b;this.$savedKeyHash=a.replace(g,\"!$&\");this.v=a},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:\"str(object='') -> str\\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\\n\\nCreate a new string object from the given object. If encoding or\\nerrors is specified, then the object must expose a data buffer\\nthat will be decoded using the given encoding and error handler.\\nOtherwise, returns the result of object.__str__() (if defined)\\nor repr(object).\\nencoding defaults to sys.getdefaultencoding().\\nerrors defaults to 'strict'.\",\r\ntp$new(a,b){b=b||[];if(this!==Sk.builtin.str.prototype)return this.$subtype_new(a,b);if(1>=a.length&&!b.length)return new Sk.builtin.str(a[0]);if(Sk.__future__.python3){const [c,d,e]=Sk.abstr.copyKeywordsToNamedArgs(\"str\",[\"object\",\"encoding\",\"errors\"],a,b);if(void 0===c||void 0===d&&void 0===e)return new Sk.builtin.str(c);Sk.builtin.bytes.check$encodeArgs(\"str\",d,e);if(!Sk.builtin.checkBytes(c))throw new Sk.builtin.TypeError(\"decoding to str: need a bytes-like object, \"+Sk.abstr.typeName(c)+\" found\");\r\nreturn Sk.builtin.bytes.$decode.call(c,d,e)}throw new Sk.builtin.TypeError(\"str takes at most one argument (\"+(a.length+b.length)+\" given)\");},$r(){let a=\"'\";-1!==this.v.indexOf(\"'\")&&-1===this.v.indexOf('\"')&&(a='\"');const b=this.v.length;let c=a;for(let f=0;fe||57344<=e)&&!Sk.__future__.python3?c+=\"\\\\u\"+(\"000\"+e.toString(16)).slice(-4):55296<=e&&\r\n!Sk.__future__.python3?(d=this.v.codePointAt(f),f++,d=d.toString(16),e=\"0000000\"+d.toString(16),c=4d||127<=e&&!Sk.__future__.python3?(d=d.charCodeAt(0).toString(16),2>d.length&&(d=\"0\"+d),c+=\"\\\\x\"+d):c+=d}return new Sk.builtin.str(c+a)},tp$str(){return this.constructor===Sk.builtin.str?this:new Sk.builtin.str(this.v)},tp$iter(){return new A(this)},tp$richcompare(a,b){if(!(a instanceof Sk.builtin.str))return Sk.builtin.NotImplemented.NotImplemented$;\r\nswitch(b){case \"Lt\":return this.va.v;case \"GtE\":return this.v>=a.v}},mp$subscript(a){let b;if(Sk.misceval.isIndex(a)){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);b=this.sq$length();0>a&&(a+=b);if(0>a||a>=b)throw new Sk.builtin.IndexError(\"string index out of range\");return this.codepoints?new Sk.builtin.str(this.v.substring(this.codepoints[a],this.codepoints[a+1])):\r\nnew Sk.builtin.str(this.v.charAt(a))}if(a instanceof Sk.builtin.slice){let c=\"\";b=this.sq$length();this.codepoints?a.sssiter$(b,a=>{c+=this.v.substring(this.codepoints[a],this.codepoints[a+1])}):a.sssiter$(b,a=>{c+=this.v.charAt(a)});return new Sk.builtin.str(c)}throw new Sk.builtin.TypeError(\"string indices must be integers, not \"+Sk.abstr.typeName(a));},sq$length(){return this.$hasAstralCodePoints()?this.codepoints.length:this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"cannot concatenate 'str' and '\"+\r\nSk.abstr.typeName(a)+\"' objects\");return new Sk.builtin.str(this.v+a.v)},sq$repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(a)+\"'\");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(a*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;let b=\"\";for(let c=0;c' requires string as left operand not \"+\r\nSk.abstr.typeName(a));return-1!==this.v.indexOf(a.v)},tp$as_number:!0,nb$remainder:function(a){var b;const c=this.sk$builtinBase;a.constructor===Sk.builtin.tuple||a instanceof Sk.builtin.dict||a instanceof Sk.builtin.mappingproxy||(a=new Sk.builtin.tuple([a]));var d=0;var e=this.$jsstr().replace(/%(\\([a-zA-Z0-9]+\\))?([#0 +\\-]+)?(\\*|[0-9]+)?(\\.(\\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrsb%])/g,function(e,f,g,k,h,l,p){var n,B,A,u,y;k=Sk.builtin.asnum$(k);h=Sk.builtin.asnum$(h);void 0!==f&&\"\"!==f||\"%\"==p||(n=\r\nd++);\"\"===h&&(h=void 0);var t=B=A=u=y=!1;g&&(-1!==g.indexOf(\"-\")?u=!0:-1!==g.indexOf(\"0\")&&(y=!0),-1!==g.indexOf(\"+\")?B=!0:-1!==g.indexOf(\" \")&&(A=!0),t=-1!==g.indexOf(\"#\"));h&&(h=parseInt(h.substr(1),10));g=function(a,b){var c;b=Sk.builtin.asnum$(b);var d=!1;if(\"number\"===typeof a){0>a&&(a=-a,d=!0);var e=a.toString(b)}else a instanceof Sk.builtin.float_?(e=a.str$(b,!1),2b){this.codepoints=[];for(a=0;ab&&a++;return!0}}this.codepoints=null;return!1},sk$asarray(){const a=[];if(this.$hasAstralCodePoints()){var b=this.codepoints;for(let c=0;cd)return new Sk.builtin.str(this.v.replace(b,c));let e=0;b=this.v.replace(b,a=>e++b?0:2*(a.length/2-b);b=[];for(0>=d?d=0:b.push(new Sk.builtin.str(this.v.slice(0,a[d-1])));d{if(!(a instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"sequence item \"+b.length+\": expected str, \"+Sk.abstr.typeName(a)+\" found\");b.push(a.v)}),()=>new Sk.builtin.str(b.join(this.v)))},$flags:{OneArg:!0},$textsig:\"($self, iterable, /)\",$doc:\"Concatenate any number of strings.\\n\\nThe string whose method is called is inserted in between each given string.\\nThe result is returned as a new string.\\n\\nExample: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'\"},\r\ncapitalize:{$meth:function(){return new Sk.builtin.str(this.v.charAt(0).toUpperCase()+this.v.slice(1).toLowerCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a capitalized version of the string.\\n\\nMore specifically, make the first character have upper case and the rest lower\\ncase.\"},title:{$meth:function(){const a=this.v.replace(/[a-z][a-z]*/gi,a=>a[0].toUpperCase()+a.substr(1).toLowerCase());return new Sk.builtin.str(a)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a version of the string where each word is titlecased.\\n\\nMore specifically, words start with uppercased characters and all remaining\\ncased characters have lower case.\"},\r\ncenter:{$meth:f(!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a centered string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},count:{$meth:function(a,b,c){a=this.get$tgt(a);({start:b,end:c}=l(this,b,c));if(c int\\n\\nReturn the number of non-overlapping occurrences of substring sub in\\nstring S[start:end]. Optional arguments start and end are\\ninterpreted as in slice notation.\"},expandtabs:{$meth:function(a){if(Sk.builtin.checkInt(a))a=Sk.builtin.asnum$(a);else throw new Sk.builtin.TypeError(\"an integer is required, got type\"+Sk.abstr.typeName(a));const b=Array(a+1).join(\" \"),c=this.v.replace(/([^\\r\\n\\t]*)\\t/g,(c,d)=>d+b.slice(d.length%a));\r\nreturn new Sk.builtin.str(c)},$flags:{NamedArgs:[\"tabsize\"],Defaults:[8]},$textsig:\"($self, /, tabsize=8)\",$doc:\"Return a copy where all tab characters are expanded using spaces.\\n\\nIf tabsize is not given, a tab size of 8 characters is assumed.\"},find:{$meth:function(a,b,c){return new Sk.builtin.int_(this.find$left(a,b,c))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.find(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},\r\npartition:{$meth:e(!1),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the string into three parts using the given separator.\\n\\nThis will search for the separator in the string. If the separator is found,\\nreturns a 3-tuple containing the part before the separator, the separator\\nitself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing the original string\\nand two empty strings.\"},index:{$meth:function(a,b,c){a=this.find$left(a,b,c);if(-1===a)throw new Sk.builtin.ValueError(\"substring not found\");\r\nreturn new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.index(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in S where substring sub is found, \\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the substring is not found.\"},ljust:{$meth:f(!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a left-justified string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},\r\nlower:{$meth(){return new Sk.builtin.str(this.v.toLowerCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a copy of the string converted to lowercase.\"},lstrip:{$meth:b(/^\\s+/g,a=>\"^[\"+a+\"]+\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with leading whitespace removed.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},rfind:{$meth(a,b,c){return new Sk.builtin.int_(this.find$right(a,b,c))},$flags:{MinArgs:1,MaxArgs:3},\r\n$textsig:null,$doc:\"S.rfind(sub[, start[, end]]) -> int\\n\\nReturn the highest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},rindex:{$meth:function(a,b,c){a=this.find$right(a,b,c);if(-1===a)throw new Sk.builtin.ValueError(\"substring not found\");return new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.rindex(sub[, start[, end]]) -> int\\n\\nReturn the highest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the substring is not found.\"},\r\nrjust:{$meth:f(!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a right-justified string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},rstrip:{$meth:b(/\\s+$/g,a=>\"[\"+a+\"]+$\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with trailing whitespace removed.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},rpartition:{$meth:e(!0),$flags:{OneArg:!0},\r\n$textsig:\"($self, sep, /)\",$doc:\"Partition the string into three parts using the given separator.\\n\\nThis will search for the separator in the string, starting at the end. If\\nthe separator is found, returns a 3-tuple containing the part before the\\nseparator, the separator itself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing two empty strings\\nand the original string.\"},splitlines:{$meth:function(a){a=Sk.misceval.isTrue(a);const b=this.v,c=[],d=b.length;var e=\r\n0;for(let g=0;g\"^[\"+a+\"]+|[\"+a+\"]+$\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with leading and trailing whitespace remove.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},swapcase:{$meth(){const a=this.v.replace(/[a-z]/gi,a=>{const b=a.toLowerCase();return b===a?a.toUpperCase():b});return new Sk.builtin.str(a)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Convert uppercase characters to lowercase and lowercase characters to uppercase.\"},\r\nupper:{$meth(){return new Sk.builtin.str(this.v.toUpperCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a copy of the string converted to uppercase.\"},startswith:{$meth:d(\"startswith\",(a,b)=>0===a.indexOf(b)),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.startswith(prefix[, start[, end]]) -> bool\\n\\nReturn True if S starts with the specified prefix, False otherwise.\\nWith optional start, test S beginning at that position.\\nWith optional end, stop comparing S at that position.\\nprefix can also be a tuple of strings to try.\"},\r\nendswith:{$meth:d(\"endswith\",(a,b)=>-1!==a.indexOf(b,a.length-b.length)),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.endswith(suffix[, start[, end]]) -> bool\\n\\nReturn True if S ends with the specified suffix, False otherwise.\\nWith optional start, test S beginning at that position.\\nWith optional end, stop comparing S at that position.\\nsuffix can also be a tuple of strings to try.\"},isascii:{$meth(){return new Sk.builtin.bool(/^[\\x00-\\x7F]*$/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",\r\n$doc:\"Return True if all characters in the string are ASCII, False otherwise.\\n\\nASCII characters have code points in the range U+0000-U+007F.\\nEmpty string is ASCII too.\"},islower:{$meth:function(){return new Sk.builtin.bool(this.v.length&&/[a-z]/.test(this.v)&&!/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if the string is a lowercase string, False otherwise.\\n\\nA string is lowercase if all cased characters in the string are lowercase and\\nthere is at least one cased character in the string.\"},\r\nisupper:{$meth:function(){return new Sk.builtin.bool(this.v.length&&!/[a-z]/.test(this.v)&&/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if the string is an uppercase string, False otherwise.\\n\\nA string is uppercase if all cased characters in the string are uppercase and\\nthere is at least one cased character in the string.\"},istitle:{$meth:function(){const a=this.v;let b=!1,c=!1,d;for(let e=0;e str\\n\\nReturn a formatted version of S, using substitutions from args and kwargs.\\nThe substitutions are identified by braces ('{' and '}').\"},\r\n__format__:{$meth:Sk.formatting.formatString,$flags:{OneArg:!0},$textsig:\"($self, format_spec, /)\",$doc:\"Return a formatted version of the string as described by format_spec.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.str(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null}}});Sk.exportSymbol(\"Sk.builtin.str\",Sk.builtin.str);var k=/^[A-Za-z0-9]+$/,p=/([.*+?=|\\\\\\/()\\[\\]\\{\\}^$])/g,w=/^[\\s\\xa0]+/;Sk.builtin.str.$py2decode=new Sk.builtin.method_descriptor(Sk.builtin.str,{$name:\"decode\",\r\n$meth(a,b){const c=new Sk.builtin.bytes(this.v);return Sk.builtin.bytes.$decode.call(c,a,b)},$flags:{NamedArgs:[\"encoding\",\"errors\"]}});var A=Sk.abstr.buildIteratorClass(\"str_iterator\",{constructor:function(a){this.$index=0;a.$hasAstralCodePoints()?(this.$seq=a.codepoints,this.tp$iternext=()=>{const b=this.$seq[this.$index];if(void 0!==b)return new Sk.builtin.str(a.v.substring(b,this.$seq[++this.$index]))}):(this.$seq=a.v,this.tp$iternext=()=>{const a=this.$seq[this.$index++];if(void 0!==a)return new Sk.builtin.str(a)})},\r\niternext(){return this.tp$iternext()},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),t={abstract:!0,as:!0,boolean:!0,break:!0,byte:!0,case:!0,catch:!0,char:!0,class:!0,continue:!0,const:!0,debugger:!0,default:!0,delete:!0,do:!0,double:!0,else:!0,enum:!0,export:!0,extends:!0,false:!0,final:!0,finally:!0,float:!0,for:!0,function:!0,goto:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,int:!0,interface:!0,is:!0,long:!0,namespace:!0,\r\nnative:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,short:!0,static:!0,super:!0,switch:!0,synchronized:!0,this:!0,throw:!0,throws:!0,transient:!0,true:!0,try:!0,typeof:!0,use:!0,var:!0,void:!0,volatile:!0,while:!0,with:!0,constructor:!0,__defineGetter__:!0,__defineSetter__:!0,apply:!0,arguments:!0,call:!0,caller:!0,eval:!0,hasOwnProperty:!0,isPrototypeOf:!0,__lookupGetter__:!0,__lookupSetter__:!0,__noSuchMethod__:!0,propertyIsEnumerable:!0,prototype:!0,toSource:!0,toLocaleString:!0,\r\ntoString:!0,unwatch:!0,valueOf:!0,watch:!0,length:!0,name:!0};Sk.builtin.str.reservedWords_=t},function(m,q){Sk.builtin.func=Sk.abstr.buildNativeClass(\"function\",{constructor:function(a,c,b,e){Sk.asserts.assert(this instanceof Sk.builtin.func,\"builtin func should be called as a class with `new`\");this.func_code=a;this.func_globals=c||null;this.$name=a.co_name&&a.co_name.v||a.name||\"\";this.$d=Sk.builtin.dict?new Sk.builtin.dict:void 0;this.$doc=a.co_docstring||Sk.builtin.none.none$;this.$module=\r\nSk.globals&&Sk.globals.__name__||Sk.builtin.none.none$;this.$qualname=a.co_qualname&&a.co_qualname.v||this.$name;if(void 0!==e)for(let a in e)b[a]=e[a];this.func_closure=b;this.$memoiseFlags();this.memoised=a.co_fastcall||null;this.tp$call=a.co_fastcall?a.bind(this):Sk.builtin.func.prototype.tp$call.bind(this)},slots:{tp$getattr:Sk.generic.getAttr,tp$descr_get(a,c){return null===a?this:new Sk.builtin.method(this,a)},$r(){return new Sk.builtin.str(\"\")},tp$call(a,c){this.memoised||\r\n(this.$memoiseFlags(),this.memoised=!0);if(void 0===this.co_argcount&&void 0===this.co_varnames&&!this.co_kwargs&&!this.func_closure){if(c&&0!==c.length)throw new Sk.builtin.TypeError(this.$name+\"() takes no keyword arguments\");return this.func_code.apply(this.func_globals,a)}a=this.$resolveArgs(a,c);this.func_closure&&a.push(this.func_closure);return this.func_code.apply(this.func_globals,a)}},getsets:{__name__:{$get(){return new Sk.builtin.str(this.$name)},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"__name__ must be set to a string object\");\r\nthis.$name=a.$jsstr()}},__qualname__:{$get(){return new Sk.builtin.str(this.$qualname)},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"__qualname__ must be set to a string object\");this.$qualname=a.$jsstr()}},__dict__:Sk.generic.getSetDict,__defaults__:{$get(){return new Sk.builtin.tuple(this.$defaults)}},__doc__:{$get(){return this.$doc},$set(a){this.$doc=a||Sk.builtin.none.none$}}},proto:{$memoiseFlags(){this.co_varnames=this.func_code.co_varnames;this.co_argcount=this.func_code.co_argcount;\r\nvoid 0===this.co_argcount&&this.co_varnames&&(this.co_argcount=this.co_argcount=this.co_varnames.length);this.co_kwonlyargcount=this.func_code.co_kwonlyargcount||0;this.co_varargs=this.func_code.co_varargs;this.co_kwargs=this.func_code.co_kwargs;this.$defaults=this.func_code.$defaults||[];this.$kwdefs=this.func_code.$kwdefs||[]},$resolveArgs:function(a,c){var b=this.co_argcount;void 0===b&&(b=this.co_varnames?this.co_varnames.length:a.length);var e=this.co_varnames||[],f=this.co_kwonlyargcount||0;\r\nlet l=b+f;if(!(0!==f||this.co_kwargs||c&&0!==c.length||this.co_varargs)){if(a.length==b)return a;if(0===a.length&&this.$defaults&&this.$defaults.length===b){for(e=0;e!=this.$defaults.length;e++)a[e]=this.$defaults[e];return a}}let h;this.co_kwargs&&(h=[]);var d=a.length;let g=a.length<=b?a:a.slice(0,b);if(this.co_varargs)a=a.length>g.length?a.slice(g.length):[],g[l]=new Sk.builtin.tuple(a);else if(d>b)throw new Sk.builtin.TypeError(this.$name+\"() takes \"+b+\" positional argument\"+(1==b?\"\":\"s\")+\" but \"+\r\nd+(1==d?\" was \":\" were \")+\" given\");if(c){if(this.func_code.no_kw)throw new Sk.builtin.TypeError(this.$name+\"() takes no keyword arguments\");for(a=0;aa.indexOf(\".\")&&0>a.indexOf(\"e\")&&0>a.indexOf(\"E\"))return a;var b=0;if(0<=a.indexOf(\"e\")){var c=a.substr(0,a.indexOf(\"e\"));b=a.substr(a.indexOf(\"e\")+1)}else 0<=a.indexOf(\"E\")?\r\n(c=a.substr(0,a.indexOf(\"e\")),b=a.substr(a.indexOf(\"E\")+1)):c=a;b=parseInt(b,10);a=c.indexOf(\".\");if(0>a){if(0<=b){for(;0-b?c.substr(0,c.length+b):0}c=0===a?c.substr(1):ac.length;)c+=\"0\";return c=0>=a?0:c.substr(0,a)};Sk.exportSymbol(\"Sk.builtin.asnum$nofloat\",Sk.builtin.asnum$nofloat);Sk.builtin.round=function(a,c){if(void 0===a)throw new Sk.builtin.TypeError(\"a float is required\");if(!Sk.__future__.dunder_round){if(!Sk.builtin.checkNumber(a))throw new Sk.builtin.TypeError(\"a float is required\");\r\nif(a.round$)return a.round$(c);throw new Sk.builtin.AttributeError(Sk.abstr.typeName(a)+\" instance has no attribute '__float__'\");}if(void 0!==c&&!Sk.builtin.checkNone(c)&&!Sk.misceval.isIndex(c))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(c)+\"' object cannot be interpreted as an index\");a=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$round);if(void 0!==a)return void 0!==c?Sk.misceval.callsimArray(a,[c]):Sk.misceval.callsimArray(a,[]);throw new Sk.builtin.TypeError(\"a float is required\");};Sk.builtin.len=\r\nfunction(a){if(a.sq$length)a=a.sq$length(!0);else throw new Sk.builtin.TypeError(\"object of type '\"+Sk.abstr.typeName(a)+\"' has no len()\");return Sk.misceval.chain(a,a=>new Sk.builtin.int_(a))};Sk.builtin.min=function(a,c){let b;const e=a.length;if(!e)throw new Sk.builtin.TypeError(\"min expected 1 argument, got 0\");const [h,d]=Sk.abstr.copyKeywordsToNamedArgs(\"min\",[\"default\",\"key\"],[],c,[null,Sk.builtin.none.none$]);if(1{g=a;if(void 0!==g)return Sk.builtin.checkNone(d)?Sk.misceval.iterFor(b,a=>{Sk.misceval.richCompareBool(a,g,\"Lt\")&&(g=a)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,[g]),a=>Sk.misceval.iterFor(b,b=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,\r\n[b]),c=>{Sk.misceval.richCompareBool(c,a,\"Lt\")&&(g=b,a=c)})))},()=>{if(void 0===g){if(null===h)throw new Sk.builtin.ValueError(\"min() arg is an empty sequence\");g=h}return g})};Sk.builtin.max=function(a,c){let b;const e=a.length;if(!e)throw new Sk.builtin.TypeError(\"max expected 1 argument, got 0\");const [h,d]=Sk.abstr.copyKeywordsToNamedArgs(\"min\",[\"default\",\"key\"],[],c,[null,Sk.builtin.none.none$]);if(1{g=a;if(void 0!==g)return Sk.builtin.checkNone(d)?Sk.misceval.iterFor(b,a=>{Sk.misceval.richCompareBool(a,g,\"Gt\")&&(g=a)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,[g]),a=>Sk.misceval.iterFor(b,b=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(d,\r\n[b]),c=>{Sk.misceval.richCompareBool(c,a,\"Gt\")&&(g=b,a=c)})))},()=>{if(void 0===g){if(null===h)throw new Sk.builtin.ValueError(\"min() arg is an empty sequence\");g=h}return g})};Sk.builtin.min.co_fastcall=Sk.builtin.max.co_fastcall=1;Sk.builtin.any=function(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),function(a){if(Sk.misceval.isTrue(a))return new Sk.misceval.Break(Sk.builtin.bool.true$)}),a=>a||Sk.builtin.bool.false$)};Sk.builtin.all=function(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),\r\nfunction(a){if(!Sk.misceval.isTrue(a))return new Sk.misceval.Break(Sk.builtin.bool.false$)}),a=>a||Sk.builtin.bool.true$)};Sk.builtin.sum=function(a,c){function b(){return Sk.misceval.iterFor(d,a=>{if(a.constructor===Sk.builtin.int_)g=g.nb$add(a);else{if(a.constructor===Sk.builtin.float_)return g=g.nb$float().nb$add(a),new Sk.misceval.Break(\"float\");g=Sk.abstr.numberBinOp(g,a,\"Add\");return new Sk.misceval.Break(\"slow\")}})}function e(){return Sk.misceval.iterFor(d,a=>{if(a.constructor===Sk.builtin.float_||\r\na.constructor===Sk.builtin.int_)g=g.nb$add(a);else return g=Sk.abstr.numberBinOp(g,a,\"Add\"),new Sk.misceval.Break(\"slow\")})}function h(){return Sk.misceval.iterFor(d,a=>{g=Sk.abstr.numberBinOp(g,a,\"Add\")})}const d=Sk.abstr.iter(a);if(void 0===c)var g=new Sk.builtin.int_(0);else{if(Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"sum() can't sum strings [use ''.join(seq) instead]\");g=c}a=void 0===c||c.constructor===Sk.builtin.int_?b():c.constructor===Sk.builtin.float_?\"float\":\"slow\";return Sk.misceval.chain(a,\r\na=>\"float\"===a?e():a,a=>{if(\"slow\"===a)return h()},()=>g)};Sk.builtin.zip=function(){var a,c;if(0===arguments.length)return new Sk.builtin.list([]);var f=[];for(c=0;ca||1114112<=a)throw new Sk.builtin.ValueError(\"chr() arg not in range(0x110000)\");}else if(0>a||256<=a)throw new Sk.builtin.ValueError(\"chr() arg not in range(256)\");return new Sk.builtin.str(String.fromCodePoint(a))};\r\nSk.builtin.unichr=function(a){if(!Sk.builtin.checkInt(a))throw new Sk.builtin.TypeError(\"an integer is required\");a=Sk.builtin.asnum$(a);try{return new Sk.builtin.str(String.fromCodePoint(a))}catch(e){if(e instanceof RangeError)throw new Sk.builtin.ValueError(e.message);throw e;}};Sk.builtin.int2str_=function(a,c,f){let b;a.constructor===Sk.builtin.int_||a instanceof Sk.builtin.int_||(a=a.nb$index());b=a.v;let e=b.toString(c);e=a.nb$isnegative()?\"-\"+f+e.slice(1):f+e;2!==c&&!Sk.__future__.python3&&\r\n(a instanceof Sk.builtin.lng||JSBI.__isBigInt(b))&&(e+=\"L\");return new Sk.builtin.str(e)};Sk.builtin.hex=function(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"hex() argument can't be converted to hex\");return Sk.builtin.int2str_(a,16,\"0x\")};Sk.builtin.oct=function(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"oct() argument can't be converted to hex\");return Sk.__future__.octal_number_literal?Sk.builtin.int2str_(a,8,\"0o\"):Sk.builtin.int2str_(a,8,\"0\")};Sk.builtin.bin=\r\nfunction(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object can't be interpreted as an index\");return Sk.builtin.int2str_(a,2,\"0b\")};Sk.builtin.dir=function(a){if(void 0!==a)return a=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$dir),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(a,[]),a=>Sk.builtin.sorted(a));throw new Sk.builtin.NotImplementedError(\"skulpt does not yet support dir with no args\");};Sk.builtin.repr=function(a){return a.$r()};Sk.builtin.ascii=\r\nfunction(a){return Sk.misceval.chain(a.$r(),a=>{let b,c;for(c=0;c=d?(e=d.toString(16),2>e.length&&(e=\"0\"+e),b+=\"\\\\x\"+e):127d||57344<=d?b+=\"\\\\u\"+(\"000\"+d.toString(16)).slice(-4):55296<=d?(e=a.v.codePointAt(c),c++,e=e.toString(16),d=\"0000000\"+e.toString(16),b=4a.tp$getattr(c,!0),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;});return Sk.misceval.chain(b,b=>{if(void 0===b){if(void 0!==f)return f;throw new Sk.builtin.AttributeError(a.sk$attrError()+\" has no attribute \"+Sk.misceval.objectRepr(c));}return b})};Sk.builtin.setattr=function(a,c,f){if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"attribute name must be string\");\r\nreturn Sk.misceval.chain(a.tp$setattr(c,f,!0),()=>Sk.builtin.none.none$)};Sk.builtin.raw_input=function(a){var b=a?a:\"\";return Sk.misceval.chain(Sk.importModule(\"sys\",!1,!0),function(a){return Sk.inputfunTakesPrompt?Sk.builtin.file.$readline(a.$d.stdin,null,b):Sk.misceval.chain(void 0,function(){return Sk.misceval.callsimOrSuspendArray(a.$d.stdout.write,[a.$d.stdout,new Sk.builtin.str(b)])},function(){return Sk.misceval.callsimOrSuspendArray(a.$d.stdin.readline,[a.$d.stdin])})})};Sk.builtin.input=\r\nSk.builtin.raw_input;Sk.builtin.jseval=function(a){a=Sk.global.eval(Sk.ffi.remapToJs(a));return Sk.ffi.remapToPy(a)};Sk.builtin.jsmillis=function(){console.warn(\"jsmillis is deprecated\");return(new Date).valueOf()};Sk.builtin.eval_=function(){throw new Sk.builtin.NotImplementedError(\"eval is not yet implemented\");};Sk.builtin.map=function(a,c){var b=[],e,h;Sk.builtin.pyCheckArgsLen(\"map\",arguments.length,2);if(2{a=new Sk.builtin.list(a);a.list$sort(c,f,l);return a})};Sk.builtin.filter=function(a,c){var b;Sk.builtin.pyCheckArgsLen(\"filter\",arguments.length,2,2);if(!Sk.builtin.checkIterable(c))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(c)+\"' object is not iterable\");var e=function(){return[]};\r\nvar h=function(a,b){a.push(b);return a};var d=function(a){return new Sk.builtin.list(a)};c.ob$type===Sk.builtin.str?(e=function(){return new Sk.builtin.str(\"\")},h=function(a,b){return a.sq$concat(b)},d=function(a){return a}):c.ob$type===Sk.builtin.tuple&&(d=function(a){return new Sk.builtin.tuple(a)});var g=e();var n=Sk.abstr.iter(c);for(b=n.tp$iternext();void 0!==b;b=n.tp$iternext())e=a===Sk.builtin.none.none$?new Sk.builtin.bool(b):Sk.misceval.callsimArray(a,[b]),Sk.misceval.isTrue(e)&&(g=h(g,b));\r\nreturn d(g)};Sk.builtin.hasattr=function(a,c){if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError(\"hasattr(): attribute name must be string\");const b=Sk.misceval.tryCatch(()=>a.tp$getattr(c,!0),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;});return Sk.misceval.chain(b,a=>void 0===a?Sk.builtin.bool.false$:Sk.builtin.bool.true$)};Sk.builtin.pow=function(a,c,f){if(void 0===f||Sk.builtin.checkNone(f))return Sk.abstr.numberBinOp(a,c,\"Pow\");if(!(Sk.builtin.checkInt(a)&&Sk.builtin.checkInt(c)&&\r\nSk.builtin.checkInt(f))){if(Sk.builtin.checkFloat(a)||Sk.builtin.checkComplex(a))return a.nb$power(c,f);throw new Sk.builtin.TypeError(\"unsupported operand type(s) for ** or pow(): '\"+Sk.abstr.typeName(a)+\"', '\"+Sk.abstr.typeName(c)+\"', '\"+Sk.abstr.typeName(f)+\"'\");}return a.nb$power(c,f)};Sk.builtin.quit=function(a){a=(new Sk.builtin.str(a)).v;throw new Sk.builtin.SystemExit(a);};Sk.builtin.issubclass=function(a,c){if(!Sk.builtin.checkClass(a))throw new Sk.builtin.TypeError(\"issubclass() arg 1 must be a class\");\r\nvar b=Sk.builtin.checkClass(c);if(!(b||c instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError(\"issubclass() arg 2 must be a class or tuple of classes\");if(b)return a.$isSubType(c)?Sk.builtin.bool.true$:Sk.builtin.bool.false$;for(b=0;b\"})},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:\"Common base class for all exceptions\",tp$new(a,c){this.hp$type?(c=new this.constructor,Sk.builtin.BaseException.call(c)):\r\nc=new this.constructor;c.args=new Sk.builtin.tuple(a.slice());return c},tp$init(a,c){Sk.abstr.checkNoKwargs(Sk.abstr.typeName(this),c)},$r(){let a=this.tp$name;a+=\"(\"+this.args.v.map(a=>Sk.misceval.objectRepr(a)).join(\", \")+\")\";return new Sk.builtin.str(a)},tp$str(){return 1>=this.args.v.length?new Sk.builtin.str(this.args.v[0]):this.args.$r()}},getsets:{args:{$get(){return this.args}},__dict__:Sk.generic.getSetDict},proto:{toString(){let a=this.tp$name;a+=\": \"+this.tp$str().v;return a=0!==this.traceback.length?\r\na+(\" on line \"+this.traceback[0].lineno):a+\" at \"}}});Sk.exportSymbol(\"Sk.builtin.BaseException\",Sk.builtin.BaseException);Sk.builtin.Exception=Sk.abstr.buildNativeClass(\"Exception\",{constructor:function(...a){Sk.builtin.BaseException.apply(this,a)},base:Sk.builtin.BaseException});Sk.exportSymbol(\"Sk.builtin.Exception\",Sk.builtin.Exception);Sk.builtin.AssertionError=Sk.abstr.buildNativeClass(\"AssertionError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});\r\nSk.exportSymbol(\"Sk.builtin.AssertionError\",Sk.builtin.AssertionError);Sk.builtin.AttributeError=Sk.abstr.buildNativeClass(\"AttributeError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.ImportError=Sk.abstr.buildNativeClass(\"ImportError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.IndentationError=Sk.abstr.buildNativeClass(\"IndentationError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,\r\na)},base:Sk.builtin.Exception});Sk.builtin.IndexError=Sk.abstr.buildNativeClass(\"IndexError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.LookupError=Sk.abstr.buildNativeClass(\"LookupError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.KeyError=Sk.abstr.buildNativeClass(\"KeyError\",{constructor:function(...a){Sk.builtin.LookupError.apply(this,a)},base:Sk.builtin.LookupError});Sk.builtin.NameError=\r\nSk.abstr.buildNativeClass(\"NameError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.UnboundLocalError=Sk.abstr.buildNativeClass(\"UnboundLocalError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.OverflowError=Sk.abstr.buildNativeClass(\"OverflowError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.SyntaxError=Sk.abstr.buildNativeClass(\"SyntaxError\",\r\n{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.RuntimeError=Sk.abstr.buildNativeClass(\"RuntimeError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.RuntimeError\",Sk.builtin.RuntimeError);Sk.builtin.SuspensionError=Sk.abstr.buildNativeClass(\"SuspensionError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.SuspensionError\",\r\nSk.builtin.SuspensionError);Sk.builtin.SystemExit=Sk.abstr.buildNativeClass(\"SystemExit\",{constructor:function(...a){Sk.builtin.BaseException.apply(this,a)},base:Sk.builtin.BaseException});Sk.exportSymbol(\"Sk.builtin.SystemExit\",Sk.builtin.SystemExit);Sk.builtin.TypeError=Sk.abstr.buildNativeClass(\"TypeError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.TypeError\",Sk.builtin.TypeError);Sk.builtin.ValueError=Sk.abstr.buildNativeClass(\"ValueError\",\r\n{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.ValueError\",Sk.builtin.ValueError);Sk.builtin.ZeroDivisionError=Sk.abstr.buildNativeClass(\"ZeroDivisionError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.builtin.TimeLimitError=Sk.abstr.buildNativeClass(\"TimeLimitError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.TimeLimitError\",\r\nSk.builtin.TimeLimitError);Sk.builtin.IOError=Sk.abstr.buildNativeClass(\"IOError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.IOError\",Sk.builtin.IOError);Sk.builtin.NotImplementedError=Sk.abstr.buildNativeClass(\"NotImplementedError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.NotImplementedError\",Sk.builtin.NotImplementedError);Sk.builtin.NegativePowerError=\r\nSk.abstr.buildNativeClass(\"NegativePowerError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.NegativePowerError\",Sk.builtin.NegativePowerError);Sk.builtin.ExternalError=Sk.abstr.buildNativeClass(\"ExternalError\",{constructor:function(...a){this.nativeError=a[0];if(!Sk.builtin.checkString(this.nativeError)&&(a[0]=this.nativeError.toString(),a[0].startsWith(\"RangeError: Maximum call\")))return a[0]=\"Maximum call stack size exceeded\",\r\nnew Sk.builtin.RecursionError(...a);Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.ExternalError\",Sk.builtin.ExternalError);Sk.builtin.RecursionError=Sk.abstr.buildNativeClass(\"RecursionError\",{constructor:function(...a){Sk.builtin.RuntimeError.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.RecursionError\",Sk.builtin.RecursionError);Sk.builtin.OperationError=Sk.abstr.buildNativeClass(\"OperationError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,\r\na)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.OperationError\",Sk.builtin.OperationError);Sk.builtin.SystemError=Sk.abstr.buildNativeClass(\"SystemError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.SystemError\",Sk.builtin.SystemError);Sk.builtin.UnicodeDecodeError=Sk.abstr.buildNativeClass(\"UnicodeDecodeError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.UnicodeDecodeError\",\r\nSk.builtin.UnicodeDecodeError);Sk.builtin.UnicodeEncodeError=Sk.abstr.buildNativeClass(\"UnicodeEncodeError\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.UnicodeEncodeError\",Sk.builtin.UnicodeEncodeError);Sk.builtin.StopIteration=Sk.abstr.buildNativeClass(\"StopIteration\",{constructor:function(...a){Sk.builtin.Exception.apply(this,a)},base:Sk.builtin.Exception});Sk.exportSymbol(\"Sk.builtin.StopIteration\",Sk.builtin.StopIteration);\r\nSk.builtin.getExcInfo=function(a){return new Sk.builtin.tuple([a.ob$type||Sk.builtin.none.none$,a,Sk.builtin.none.none$])}},function(m,q){Sk.builtin.method=Sk.abstr.buildNativeClass(\"method\",{constructor:function(a,c){Sk.asserts.assert(this instanceof Sk.builtin.method,\"bad call to method constructor, use 'new'\");this.im_func=a;this.im_self=c;this.im_call=a.tp$call},slots:{$r(){let a=this.im_func.tp$getattr(Sk.builtin.str.$qualname)||this.im_func.tp$getattr(Sk.builtin.str.$name);a=a&&a.v||\"?\";return new Sk.builtin.str(\"\")},tp$hash(){const a=Sk.abstr.objectHash(this.im_self),c=Sk.abstr.objectHash(this.im_func);return a+c},tp$call(a,c){var b=this.im_call;if(void 0===b)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(this.im_func)+\"' object is not callable\");a=[this.im_self,...a];return b.call(this.im_func,a,c)},tp$new(a,c){Sk.abstr.checkNoKwargs(\"method\",c);Sk.abstr.checkArgsLen(\"method\",a,2,2);c=a[0];a=a[1];if(!Sk.builtin.checkCallable(c))throw new Sk.builtin.TypeError(\"first argument must be callable\");\r\nif(Sk.builtin.checkNone(a))throw new Sk.builtin.TypeError(\"self must not be None\");return new Sk.builtin.method(c,a)},tp$richcompare(a,c){if(\"Eq\"!=c&&\"NotEq\"!=c||!(a instanceof Sk.builtin.method))return Sk.builtin.NotImplemented.NotImplemented$;let b;try{b=Sk.misceval.richCompareBool(this.im_self,a.im_self,\"Eq\",!1)&&this.im_func==a.im_func}catch(e){b=!1}return\"Eq\"==c?b:!b},tp$descr_get(a,c){return this},tp$getattr(a,c){const b=Sk.abstr.lookupSpecial(this,a);return void 0!==b?b:this.im_func.tp$getattr(a,\r\nc)}},getsets:{__func__:{$get(){return this.im_func}},__self__:{$get(){return this.im_self}},__doc__:{$get(){return this.im_func.tp$getattr(Sk.builtin.str.$doc)}}},flags:{sk$suitable_as_base_class:!1}})},function(m,q){function a(a){if(null!==a&&void 0!==a){if(a.nb$index)return a.nb$index();if(\"number\"===typeof a&&Number.isInteger(a))return a}}function c(b,c){const e=a(b);if(void 0!==e)return e;c=(c||\"'{tp$name}' object cannot be interpreted as an integer\").replace(\"{tp$name}\",Sk.abstr.typeName(b));\r\nthrow new Sk.builtin.TypeError(c);}Sk.misceval={};Sk.misceval.Suspension=function(a,c,f){this.$isSuspension=!0;void 0!==a&&void 0!==c&&(this.resume=function(){return a(c.resume())});this.child=c;this.optional=void 0!==c&&c.optional;this.data=void 0===f&&void 0!==c?c.data:f};Sk.exportSymbol(\"Sk.misceval.Suspension\",Sk.misceval.Suspension);Sk.misceval.retryOptionalSuspensionOrThrow=function(a,c){for(;a instanceof Sk.misceval.Suspension;){if(!a.optional)throw new Sk.builtin.SuspensionError(c||\"Cannot call a function that blocks or suspends here\");\r\na=a.resume()}return a};Sk.exportSymbol(\"Sk.misceval.retryOptionalSuspensionOrThrow\",Sk.misceval.retryOptionalSuspensionOrThrow);Sk.misceval.isIndex=function(a){return null!==a&&void 0!==a&&(void 0!==a.nb$index||\"number\"===typeof a&&Number.isInteger(a))};Sk.exportSymbol(\"Sk.misceval.isIndex\",Sk.misceval.isIndex);Sk.misceval.asIndex=a;Sk.misceval.asIndexSized=function(a,e,f){f=c(a,f);if(\"number\"===typeof f)return f;if(null==e)return JSBI.lessThan(f,JSBI.__ZERO)?-Number.MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER;\r\nthrow new e(\"cannot fit '\"+Sk.abstr.typeName(a)+\"' into an index-sized integer\");};Sk.misceval.asIndexOrThrow=c;Sk.misceval.applySlice=function(a,c,f,l){return Sk.abstr.objectGetItem(a,new Sk.builtin.slice(c,f,null),l)};Sk.exportSymbol(\"Sk.misceval.applySlice\",Sk.misceval.applySlice);Sk.misceval.assignSlice=function(a,c,f,l,h){c=new Sk.builtin.slice(c,f);return null===l?Sk.abstr.objectDelItem(a,c):Sk.abstr.objectSetItem(a,c,l,h)};Sk.exportSymbol(\"Sk.misceval.assignSlice\",Sk.misceval.assignSlice);\r\nSk.misceval.arrayFromArguments=function(a){var b;if(1!=a.length)return a;var c=a[0];c instanceof Sk.builtin.set?c=c.tp$iter().$obj:c instanceof Sk.builtin.dict&&(c=Sk.builtin.dict.prototype.keys.func_code(c));if(c instanceof Sk.builtin.list||c instanceof Sk.builtin.tuple)return c.v;if(Sk.builtin.checkIterable(c)){a=[];c=Sk.abstr.iter(c);for(b=c.tp$iternext();void 0!==b;b=c.tp$iternext())a.push(b);return a}throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(c)+\"' object is not iterable\");};Sk.exportSymbol(\"Sk.misceval.arrayFromArguments\",\r\nSk.misceval.arrayFromArguments);Sk.misceval.iterator=Sk.abstr.buildIteratorClass(\"iterator\",{constructor:function(a,c){this.tp$iternext=c?a:function(b){let c=a();return b||!c.$isSuspension?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)}},iternext:function(a){return this.tp$iternext(a)},flags:{sk$acceptable_as_base_class:!1}});Sk.misceval.swappedOp_={Eq:\"Eq\",NotEq:\"NotEq\",Lt:\"Gt\",LtE:\"GtE\",Gt:\"Lt\",GtE:\"LtE\"};Sk.misceval.opSymbols={Eq:\"==\",NotEq:\"!=\",Lt:\"<\",LtE:\"<=\",Gt:\">\",GtE:\">=\",Is:\"is\",IsNot:\"is not\",\r\nIn_:\"in\",NotIn:\"not in\"};Sk.misceval.richCompareBool=function(a,c,f,l){Sk.asserts.assert(a.sk$object&&c.sk$object,\"JS object passed to richCompareBool\");var b;var d=a.ob$type;var e=c.ob$type,n=e!==d&&void 0===e.sk$baseClass&&e.$isSubType(d);if(!Sk.__future__.python3&&d!==e&&(\"GtE\"===f||\"Gt\"===f||\"LtE\"===f||\"Lt\"===f)){var k=[Sk.builtin.float_,Sk.builtin.int_,Sk.builtin.lng,Sk.builtin.bool],p=[Sk.builtin.dict,Sk.builtin.enumerate,Sk.builtin.filter_,Sk.builtin.list,Sk.builtin.map_,Sk.builtin.str,Sk.builtin.tuple,\r\nSk.builtin.zip_];const b=k.indexOf(d),g=p.indexOf(d);k=k.indexOf(e);p=p.indexOf(e);if(a===Sk.builtin.none.none$)switch(f){case \"Lt\":return!0;case \"LtE\":return!0;case \"Gt\":return!1;case \"GtE\":return!1}if(c===Sk.builtin.none.none$)switch(f){case \"Lt\":return!1;case \"LtE\":return!1;case \"Gt\":return!0;case \"GtE\":return!0}if(-1!==b&&-1!==p)switch(f){case \"Lt\":return!0;case \"LtE\":return!0;case \"Gt\":return!1;case \"GtE\":return!1}if(-1!==g&&-1!==k)switch(f){case \"Lt\":return!1;case \"LtE\":return!1;case \"Gt\":return!0;\r\ncase \"GtE\":return!0}if(-1!==g&&-1!==p)switch(f){case \"Lt\":return gp;case \"GtE\":return g>=p}}if(\"Is\"===f){if(d===e){if(a===c)return!0;if(d===Sk.builtin.float_)return a.v===c.v;if(d===Sk.builtin.int_)return\"number\"===typeof a.v&&\"number\"===typeof a.v?a.v===c.v:JSBI.equal(JSBI.BigInt(a.v),JSBI.BigInt(c.v))}return!1}if(\"IsNot\"===f)return d!==e?!0:d===Sk.builtin.float_?a.v!==c.v:d===Sk.builtin.int_?\"number\"===typeof a.v&&\"number\"===typeof a.v?a.v!==c.v:JSBI.notEqual(JSBI.BigInt(a.v),\r\nJSBI.BigInt(c.v)):a!==c;if(\"In\"===f)return Sk.misceval.chain(Sk.abstr.sequenceContains(c,a,l),Sk.misceval.isTrue);if(\"NotIn\"===f)return Sk.misceval.chain(Sk.abstr.sequenceContains(c,a,l),function(a){return!Sk.misceval.isTrue(a)});e={Eq:\"ob$eq\",NotEq:\"ob$ne\",Gt:\"ob$gt\",GtE:\"ob$ge\",Lt:\"ob$lt\",LtE:\"ob$le\"};d=e[f];if(n&&(l=e[Sk.misceval.swappedOp_[f]],c[l]!==a[l]&&(b=c[l](a))!==Sk.builtin.NotImplemented.NotImplemented$)||(b=a[d](c))!==Sk.builtin.NotImplemented.NotImplemented$||!n&&(l=e[Sk.misceval.swappedOp_[f]],\r\n(b=c[l](a))!==Sk.builtin.NotImplemented.NotImplemented$))return Sk.misceval.isTrue(b);if(!Sk.__future__.python3){if(n=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$cmp))try{b=Sk.misceval.callsimArray(n,[c]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if(\"Eq\"===f)return 0===b;if(\"NotEq\"===f)return 0!==b;if(\"Lt\"===f)return 0>b;if(\"Gt\"===f)return 0=b;if(\"GtE\"===f)return 0<=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError(\"comparison did not return an int\");\r\n}catch(w){throw new Sk.builtin.TypeError(\"comparison did not return an int\");}if(n=Sk.abstr.lookupSpecial(c,Sk.builtin.str.$cmp))try{b=Sk.misceval.callsimArray(n,[a]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if(\"Eq\"===f)return 0===b;if(\"NotEq\"===f)return 0!==b;if(\"Lt\"===f)return 0b;if(\"LtE\"===f)return 0<=b;if(\"GtE\"===f)return 0>=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError(\"comparison did not return an int\");}catch(w){throw new Sk.builtin.TypeError(\"comparison did not return an int\");\r\n}if(a===Sk.builtin.none.none$&&c===Sk.builtin.none.none$){if(\"Eq\"===f)return a.v===c.v;if(\"NotEq\"===f)return a.v!==c.v;if(\"Gt\"===f)return a.v>c.v;if(\"GtE\"===f)return a.v>=c.v;if(\"Lt\"===f)return a.v\";throw e;}};Sk.exportSymbol(\"Sk.misceval.objectRepr\",Sk.misceval.objectRepr);Sk.misceval.opAllowsEquality=function(a){switch(a){case \"LtE\":case \"Eq\":case \"GtE\":return!0}return!1};Sk.exportSymbol(\"Sk.misceval.opAllowsEquality\",Sk.misceval.opAllowsEquality);Sk.misceval.isTrue=function(a){return!0===\r\na||a===Sk.builtin.bool.true$?!0:!1===a||a===Sk.builtin.bool.false$||null===a||void 0===a?!1:a.nb$bool?a.nb$bool():a.sq$length?0!==a.sq$length():!!a};Sk.exportSymbol(\"Sk.misceval.isTrue\",Sk.misceval.isTrue);Sk.misceval.softspace_=!1;Sk.misceval.print_=function(a){Sk.misceval.softspace_&&(\"\\n\"!==a&&Sk.output(\" \"),Sk.misceval.softspace_=!1);var b=new Sk.builtin.str(a);return Sk.misceval.chain(Sk.importModule(\"sys\",!1,!0),function(a){return Sk.misceval.apply(a.$d.stdout.write,void 0,void 0,void 0,[a.$d.stdout,\r\nb])},function(){var a;(a=0===b.v.length)||(a=b.v[b.v.length-1],a=!(\"\\n\"===a||\"\\t\"===a||\"\\r\"===a));if(a||\" \"===b.v[b.v.length-1])Sk.misceval.softspace_=!0})};Sk.exportSymbol(\"Sk.misceval.print_\",Sk.misceval.print_);Sk.misceval.loadname=function(a,c){c=c[a];if(void 0!==c)return c;c=Sk.builtins[a];if(void 0!==c)return c;throw new Sk.builtin.NameError(\"name '\"+Sk.unfixReserved(a)+\"' is not defined\");};Sk.exportSymbol(\"Sk.misceval.loadname\",Sk.misceval.loadname);Sk.misceval.call=function(a,c,f,l,h){h=\r\nArray.prototype.slice.call(arguments,4);return Sk.misceval.apply(a,c,f,l,h)};Sk.exportSymbol(\"Sk.misceval.call\",Sk.misceval.call);Sk.misceval.callAsync=function(a,c,f,l,h,d){d=Array.prototype.slice.call(arguments,5);return Sk.misceval.applyAsync(a,c,f,l,h,d)};Sk.exportSymbol(\"Sk.misceval.callAsync\",Sk.misceval.callAsync);Sk.misceval.callOrSuspend=function(a,c,f,l,h){h=Array.prototype.slice.call(arguments,4);return Sk.misceval.applyOrSuspend(a,c,f,l,h)};Sk.exportSymbol(\"Sk.misceval.callOrSuspend\",\r\nSk.misceval.callOrSuspend);Sk.misceval.callsim=function(a,c){c=Array.prototype.slice.call(arguments,1);return Sk.misceval.apply(a,void 0,void 0,void 0,c)};Sk.exportSymbol(\"Sk.misceval.callsim\",Sk.misceval.callsim);Sk.misceval.callsimArray=function(a,c,f){c=c||[];return Sk.misceval.retryOptionalSuspensionOrThrow(Sk.misceval.callsimOrSuspendArray(a,c,f))};Sk.exportSymbol(\"Sk.misceval.callsimArray\",Sk.misceval.callsimArray);Sk.misceval.callsimAsync=function(a,c,f){f=Array.prototype.slice.call(arguments,\r\n2);return Sk.misceval.applyAsync(a,c,void 0,void 0,void 0,f)};Sk.exportSymbol(\"Sk.misceval.callsimAsync\",Sk.misceval.callsimAsync);Sk.misceval.callsimOrSuspend=function(a,c){c=Array.prototype.slice.call(arguments,1);return Sk.misceval.applyOrSuspend(a,void 0,void 0,void 0,c)};Sk.exportSymbol(\"Sk.misceval.callsimOrSuspend\",Sk.misceval.callsimOrSuspend);Sk.misceval.callsimOrSuspendArray=function(a,c,f){c=c||[];return void 0!==a&&a.tp$call?a.tp$call(c,f):Sk.misceval.applyOrSuspend(a,void 0,void 0,f,\r\nc)};Sk.exportSymbol(\"Sk.misceval.callsimOrSuspendArray\",Sk.misceval.callsimOrSuspendArray);Sk.misceval.apply=function(a,c,f,l,h){a=Sk.misceval.applyOrSuspend(a,c,f,l,h);return a instanceof Sk.misceval.Suspension?Sk.misceval.retryOptionalSuspensionOrThrow(a):a};Sk.exportSymbol(\"Sk.misceval.apply\",Sk.misceval.apply);Sk.misceval.asyncToPromise=function(a,c){return new Promise(function(b,e){try{(function g(a){try{for(var d=function(){try{g(a.resume())}catch(t){e(t)}},f=function(b){try{a.data.result=b,\r\nd()}catch(y){e(y)}},p=function(b){try{a.data.error=b,d()}catch(y){e(y)}};a instanceof Sk.misceval.Suspension;){var l=c&&(c[a.data.type]||c[\"*\"]);if(l){var A=l(a);if(A){A.then(g,e);return}}if(\"Sk.promise\"==a.data.type){a.data.promise.then(f,p);return}if(\"Sk.yield\"==a.data.type){Sk.global.setImmediate(d);return}if(\"Sk.delay\"==a.data.type){Sk.global.setImmediate(d);return}if(a.optional)a=a.resume();else throw new Sk.builtin.SuspensionError(\"Unhandled non-optional suspension of type '\"+a.data.type+\"'\");\r\n}b(a)}catch(t){e(t)}})(a())}catch(h){e(h)}})};Sk.exportSymbol(\"Sk.misceval.asyncToPromise\",Sk.misceval.asyncToPromise);Sk.misceval.applyAsync=function(a,c,f,l,h,d){return Sk.misceval.asyncToPromise(function(){return Sk.misceval.applyOrSuspend(c,f,l,h,d)},a)};Sk.exportSymbol(\"Sk.misceval.applyAsync\",Sk.misceval.applyAsync);Sk.misceval.chain=function(a,c){for(var b=1,e=a,h,d;;){if(b==arguments.length)return e;if(e&&e.$isSuspension)break;e=arguments[b](e);b++}d=Array(arguments.length-b);for(h=0;ha[b++]},c,f)};Sk.misceval.arrayFromIterable=function(a,c){if(void 0===a)return[];if(void 0===a.hp$type&&void 0!==a.sk$asarray)return a.sk$asarray();const b=[];a=Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{b.push(a)}),()=>b);return c?a:Sk.misceval.retryOptionalSuspensionOrThrow(a)};Sk.misceval.Break=function(a){if(!(this instanceof Sk.misceval.Break))return new Sk.misceval.Break(a);this.brValue=a};Sk.exportSymbol(\"Sk.misceval.Break\",\r\nSk.misceval.Break);Sk.misceval.applyOrSuspend=function(a,c,f,l,h){var b;if(null==a||a===Sk.builtin.none.none$)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object is not callable\");\"function\"===typeof a&&void 0===a.tp$call&&(a=new Sk.builtin.func(a));var e=a.tp$call;if(void 0!==e){if(f)for(f=f.tp$iter(),b=f.tp$iternext();void 0!==b;b=f.tp$iternext())h.push(b);if(c)for(f=Sk.abstr.iter(c),b=f.tp$iternext();void 0!==b;b=f.tp$iternext()){if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError(\"Function keywords must be strings\");\r\nl.push(b.v);l.push(Sk.abstr.objectGetItem(c,b,!1))}return e.call(a,h,l,c)}e=a.__call__;if(void 0!==e)return h.unshift(a),Sk.misceval.apply(e,c,f,l,h);throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object is not callable\");};Sk.exportSymbol(\"Sk.misceval.applyOrSuspend\",Sk.misceval.applyOrSuspend);Sk.misceval.promiseToSuspension=function(a){var b=new Sk.misceval.Suspension;b.resume=function(){if(b.data.error)throw b.data.error;return b.data.result};b.data={type:\"Sk.promise\",promise:a};return b};\r\nSk.exportSymbol(\"Sk.misceval.promiseToSuspension\",Sk.misceval.promiseToSuspension);Sk.misceval.buildClass=function(a,c,f,l,h){var b=Sk.builtin.type,e={};c(a,e,void 0===h?{}:h);a.__name__&&(e.__module__=a.__name__);a=new Sk.builtin.str(f);l=new Sk.builtin.tuple(l);c=[];for(var n in e)e.hasOwnProperty(n)&&(c.push(new Sk.builtin.str(n)),c.push(e[n]));c=new Sk.builtin.dict(c);return Sk.misceval.callsimArray(b,[a,l,c])};Sk.exportSymbol(\"Sk.misceval.buildClass\",Sk.misceval.buildClass)},function(m,q){Sk.builtin.callable_iter_=\r\nSk.abstr.buildIteratorClass(\"callable_iterator\",{constructor:function(a,c){if(!Sk.builtin.checkCallable(a))throw new Sk.builtin.TypeError(\"iter(v, w): v must be callable\");this.$callable=a;this.$sentinel=c;this.$flag=!1},iternext(a){if(!0!==this.$flag){if(a)return a=Sk.misceval.callsimOrSuspendArray(this.$callable,[]),Sk.misceval.chain(a,a=>{if(Sk.misceval.richCompareBool(a,this.$sentinel,\"Eq\",!0))this.$flag=!0;else return a});a=Sk.misceval.callsimArray(this.$callable,[]);if(Sk.misceval.richCompareBool(a,\r\nthis.$sentinel,\"Eq\",!1))this.$flag=!0;else return a}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.seq_iter_=Sk.abstr.buildIteratorClass(\"iterator\",{constructor:function(a){this.$index=0;this.$seq=a},iternext(a){let c;c=Sk.misceval.tryCatch(()=>this.$seq.mp$subscript(new Sk.builtin.int_(this.$index++),a),a=>{if(!(a instanceof Sk.builtin.IndexError||a instanceof Sk.builtin.StopIteration))throw a;});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},methods:{__length_hint__:{$flags:{NoArgs:!0},\r\n$meth(){if(this.$seq.sq$length)return this.$seq.sq$length()-this.$index;throw new Sk.builtin.NotImplementedError(\"len is not implemented for \"+Sk.abstr.typeName(this.$seq));}}},flags:{sk$acceptable_as_base_class:!1}});Sk.exportSymbol(\"Sk.builtin.callable_iter_\",Sk.builtin.callable_iter_)},function(m,q){Sk.builtin.list=Sk.abstr.buildNativeClass(\"list\",{constructor:function(a){void 0===a?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.list,\"bad call to list, use 'new' with an Array of python objects\");\r\nthis.v=a;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$doc:\"Built-in mutable sequence.\\n\\nIf no argument is given, the constructor creates a new empty list.\\nThe argument must be an iterable if specified.\",tp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs(\"list\",c);Sk.abstr.checkArgsLen(\"list\",a,0,1);return Sk.misceval.chain(Sk.misceval.arrayFromIterable(a[0],!0),a=>{this.v=a})},$r(){if(this.in$repr)return new Sk.builtin.str(\"[...]\");\r\nthis.in$repr=!0;const a=this.v.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return new Sk.builtin.str(\"[\"+a.join(\", \")+\"]\")},tp$richcompare:Sk.generic.seqCompare,tp$iter(){return new a(this)},sq$length(){return this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.list))throw new Sk.builtin.TypeError(\"can only concatenate list to list\");return new Sk.builtin.list(this.v.concat(a.v))},sq$contains(a){for(let b=this.tp$iter(),c=b.tp$iternext();void 0!==c;c=b.tp$iternext())if(c===a||Sk.misceval.richCompareBool(c,\r\na,\"Eq\"))return!0;return!1},sq$repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(a)+\"'\");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(a*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;const b=[];for(let c=0;c{b.push(this.v[a])});return new Sk.builtin.list(b)}throw new Sk.builtin.TypeError(\"list indices must be integers or slices, not \"+Sk.abstr.typeName(a));},mp$ass_subscript(a,c){void 0===c?this.del$subscript(a):this.ass$subscript(a,c)},sq$inplace_concat(a){return a===this?(this.v.push(...this.v),this):Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.v.push(a)}),\r\n()=>this)},sq$inplace_repeat(a){if(!Sk.misceval.isIndex(a))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(a)+\"'\");a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);const b=this.v.length;if(0>=a)this.v.length=0;else if(a*b>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;for(let c=1;c{this.v.push(a)}),()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:\"($self, iterable, /)\",$doc:\"Extend list by appending elements from the iterable.\"},\r\npop:{$meth(a){a=void 0===a?this.v.length-1:Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);a=this.list$inRange(a,\"pop index out of range\");const b=this.v[a];this.v.splice(a,1);return b},$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, index=-1, /)\",$doc:\"Remove and return item at index (default last).\\n\\nRaises IndexError if list is empty or index is out of range.\"},remove:{$meth(a){a=this.list$indexOf(a);if(-1===a)throw new Sk.builtin.ValueError(\"list.remove(x): x not in list\");this.v.splice(a,\r\n1);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:\"($self, value, /)\",$doc:\"Remove first occurrence of value.\\n\\nRaises ValueError if the value is not present.\"},sort:{$meth(a,c){if(a.length)throw new Sk.builtin.TypeError(\"sort() takes no positional arguments\");const [b,e]=Sk.abstr.copyKeywordsToNamedArgs(\"sort\",[\"key\",\"reverse\"],a,c,[Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(void 0,b,e)},$flags:{FastCall:!0},$textsig:\"($self, /, *, key=None, reverse=False)\",\r\n$doc:\"Stable sort *IN PLACE*.\"},index:{$meth(a,c,f){if(void 0!==c&&!Sk.misceval.isIndex(c)||void 0!==f&&!Sk.misceval.isIndex(f))throw new Sk.builtin.TypeError(\"slice indices must be integers or have an __index__ method\");c=this.list$indexOf(a,c,f);if(-1===c)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+\" is not in list\");return new Sk.builtin.int_(c)},$flags:{MinArgs:1,MaxArgs:3},$textsig:\"($self, value, start=0, stop=sys.maxsize, /)\",$doc:\"Return first index of value.\\n\\nRaises ValueError if the value is not present.\"},\r\ncount:{$meth(a){let b=0;const c=this.v.length;for(let e=0;ea&&(a+=this.v.length);if(0<=a&&a{b.push(a)});if(!Sk.builtin.checkIterable(c))throw new Sk.builtin.TypeError(\"must assign iterable to extended slice\");\r\na=Sk.misceval.arrayFromIterable(c);if(b.length!==a.length)throw new Sk.builtin.ValueError(\"attempt to assign sequence of size \"+a.length+\" to extended slice of size \"+b.length);for(c=0;c{this.v.splice(a-b,1);b+=c})}}});Sk.exportSymbol(\"Sk.builtin.list\",Sk.builtin.list);Sk.builtin.list.py2$methods={sort:{$name:\"sort\",$meth(a,c){const [b,e,h]=Sk.abstr.copyKeywordsToNamedArgs(\"sort\",[\"cmp\",\"key\",\"reverse\"],a,c,[Sk.builtin.none.none$,\r\nSk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(b,e,h)},$flags:{FastCall:!0},$textsig:\"($self, cmp=None, key=None, reverse=False)\",$doc:\"Stable sort *IN PLACE*.\"}};var a=Sk.abstr.buildIteratorClass(\"list_iterator\",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext:Sk.generic.iterNextWithArray,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),c=Sk.abstr.buildIteratorClass(\"list_reverseiterator\",{constructor:function(a){this.$index=\r\na.v.length-1;this.$seq=a.v},iternext(){const a=this.$seq[this.$index--];if(void 0===a)this.tp$iternext=()=>{};else return a},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(m,q,a){function c(a){var b=a.replace(K,\"\").replace(G,\"_\").toLowerCase();b=F[b];return void 0===b?a:b}function b(a,b,c){if(void 0===b)b=\"utf-8\";else if(Sk.builtin.checkString(b))b=b.$jsstr();else throw new Sk.builtin.TypeError(a+\"() argument \"+(\"bytesstr\".includes(a)?\r\n2:1)+\" must be str not \"+Sk.abstr.typeName(b));if(void 0===c)c=\"strict\";else if(Sk.builtin.checkString(c))c=c.$jsstr();else throw new Sk.builtin.TypeError(a+\"() argument \"+(\"bytesstr\".includes(a)?3:2)+\" must be str not \"+Sk.abstr.typeName(c));return{encoding:b,errors:c}}function e(a,b,d){a=a.$jsstr();b=c(b);if(\"strict\"!==d&&\"ignore\"!==d&&\"replace\"!==d)throw new Sk.builtin.NotImplementedError(\"'\"+d+\"' error handling not implemented in Skulpt\");if(\"ascii\"===b){b=[];for(e in a){const c=a.charCodeAt(e);\r\nif(127=a?\"\\\\x\":\"\\\\u\";a=a.toString(16);3===a.length&&(a=a.slice(1,3));return a=1===a.length?b+\"0\"+a:b+a}function l(a,d){({encoding:a,\r\nerrors:d}=b(\"decode\",a,d));a=c(a);if(\"strict\"!==d&&\"ignore\"!==d&&\"replace\"!==d)throw new Sk.builtin.NotImplementedError(\"'\"+d+\"' error handling not implemented in Skulpt\");if(\"ascii\"===a){a=this.v;var e=\"\";for(let b=0;b=c&&bc)return new Sk.builtin.tuple([new Sk.builtin.bytes,new Sk.builtin.bytes,this])}else if(c=this.find$subleft(b,0,this.v.length),0>c)return new Sk.builtin.tuple([this,new Sk.builtin.bytes,\r\nnew Sk.builtin.bytes]);return new Sk.builtin.tuple([new Sk.builtin.bytes(this.v.subarray(0,c)),new Sk.builtin.bytes(b),new Sk.builtin.bytes(this.v.subarray(c+b.length))])}}function n(a,b){return function(c){var d=void 0===c||c===Sk.builtin.none.none$?new Uint8Array([9,10,11,12,13,32,133]):this.get$raw(c);c=0;var e=this.v.length;if(a)for(;cc&&d.includes(this.v[e-1]);)e--;d=new Uint8Array(e-c);for(e=0;e=a||32===a}function w(a){return 97<=a&&122>=a}function A(a){return 65<=a&&90>=a}function t(a){return 48<=a&&57>=a}function y(a,b){return function(){return 0===this.v.length?b?Sk.builtin.bool.true$:Sk.builtin.bool.false$:this.v.every(b=>a(b))?Sk.builtin.bool.true$:Sk.builtin.bool.false$}}function B(a,b){return function(){let c=!1;for(let d=0;d0<=a&&255>=a),\"bad internal call to bytes with array\"),this.v=new Uint8Array(a);else if(\"string\"===typeof a){let b;const c=new Uint8Array(a.length),d=a.length;for(let e=0;e bytes\\nbytes(string, encoding[, errors]) -> bytes\\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\\nbytes() -> empty bytes object\\n\\nConstruct an immutable array of bytes from:\\n - an iterable yielding integers in range(256)\\n - a text string encoded using the specified encoding\\n - any object implementing the buffer API.\\n - an integer\",\r\ntp$new(a,c){if(this!==Sk.builtin.bytes.prototype)return this.$subtype_new(a,c);c=c||[];if(1>=a.length&&0===+c.length)a=a[0];else{[a,d,c]=Sk.abstr.copyKeywordsToNamedArgs(\"bytes\",[null,\"pySource\",\"errors\"],a,c);({encoding:d,errors:c}=b(\"bytes\",d,c));if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"encoding or errors without a string argument\");return e(a,d,c)}if(void 0===a)return new Sk.builtin.bytes;if(void 0!==(c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$bytes))){var d=Sk.misceval.callsimOrSuspendArray(c,\r\n[]);return Sk.misceval.chain(d,a=>{if(!Sk.builtin.checkBytes(a))throw new Sk.builtin.TypeError(\"__bytes__ returned non-bytes (type \"+Sk.abstr.typeName(a)+\")\");return a})}if(Sk.misceval.isIndex(a)){d=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(0>d)throw new Sk.builtin.ValueError(\"negative count\");return new Sk.builtin.bytes(d)}if(Sk.builtin.checkBytes(a))return new Sk.builtin.bytes(a.v);if(Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"string argument without an encoding\");if(Sk.builtin.checkIterable(a)){let b=\r\n[];d=Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{a=Sk.misceval.asIndexSized(a);if(0>a||255new Sk.builtin.bytes(b))}throw new Sk.builtin.TypeError(\"cannot convert '\"+Sk.abstr.typeName(d)+\"' object into bytes\");},$r(){let a,b=\"'\";const c=-1!==this.v.indexOf(34);let d=\"\";for(let e=0;ea||10a||13a||126a.length||c[d]>a[d];case \"GtE\":return d===e&&c.length>=a.length||c[d]>=a[d]}},tp$hash(){return(new Sk.builtin.str(this.$jsstr())).tp$hash()},tp$as_sequence_or_mapping:!0,mp$subscript(a){if(Sk.misceval.isIndex(a)){let b=Sk.misceval.asIndexSized(a,\r\nSk.builtin.IndexError);if(void 0!==b){0>b&&(b=this.v.length+b);if(0>b||b>=this.v.length)throw new Sk.builtin.IndexError(\"index out of range\");return new Sk.builtin.int_(this.v[b])}}else if(a instanceof Sk.builtin.slice){const b=[];a.sssiter$(this.v.length,a=>{b.push(this.v[a])});return new Sk.builtin.bytes(new Uint8Array(b))}throw new Sk.builtin.TypeError(\"byte indices must be integers or slices, not \"+Sk.abstr.typeName(a));},sq$length(){return this.v.length},sq$concat(a){if(!(a instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError(\"can't concat \"+\r\nSk.abstr.typeName(a)+\" to bytes\");const b=new Uint8Array(this.v.length+a.v.length);let c;for(c=0;cNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;if(0>=\r\na)return new Sk.builtin.bytes;a=new Uint8Array(b);let c=0;for(;ca||255b?Infinity:b;a=Sk.builtin.checkNone(a)?null:this.get$raw(a);if(null!==a&&!a.length)throw new Sk.builtin.ValueError(\"empty separator\");return{sep:a,maxsplit:b}},find$left:d(!1),\r\nfind$right:d(!0),find$subleft:function(a,b,c){c=c-a.length+1;let d=b;for(;da===this.v[d+b]))return d;d++}return-1},find$subright(a,b,c){let d=c-a.length;for(;d>=b;){if(a.every((a,b)=>a===this.v[d+b]))return d;d--}return-1},$subtype_new(a,b){const c=new this.constructor;a=Sk.builtin.bytes.prototype.tp$new(a,b);c.v=a.v;return c},sk$asarray(){const a=[];this.v.forEach(b=>{a.push(new Sk.builtin.int_(b))});return a}},flags:{str$encode:e,$decode:l,check$encodeArgs:b},methods:{__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.bytes(this.v))},\r\n$flags:{NoArgs:!0},$textsig:null,$doc:null},capitalize:{$meth(){const a=this.v.length;if(0===a)return new Sk.builtin.bytes(this.v);const b=new Uint8Array(a);let c=this.v[0];b[0]=w(c)?c-32:c;for(let d=1;d copy of B\\n\\nReturn a copy of B with only its first character capitalized (ASCII)\\nand the rest lower-cased.\"},center:{$meth:k(\"center\",!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,\r\n$doc:\"B.center(width[, fillchar]) -> copy of B\\n\\nReturn B centered in a string of length width. Padding is\\ndone using the specified fill character (default is a space).\"},count:{$meth(a,b,c){a=this.get$tgt(a);({start:b,end:c}=Sk.builtin.slice.startEnd$wrt(this,b,c));let d=0;if(\"number\"===typeof a)for(;ba===this.v[e+b])&&(d++,e+=a.length-1)}return new Sk.builtin.int_(d)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.count(sub[, start[, end]]) -> int\\n\\nReturn the number of non-overlapping occurrences of subsection sub in\\nbytes B[start:end]. Optional arguments start and end are interpreted\\nas in slice notation.\"},\r\ndecode:{$meth:l,$flags:{NamedArgs:[\"encoding\",\"errors\"]},$textsig:\"($self, /, encoding='utf-8', errors='strict')\",$doc:\"Decode the bytes using the codec registered for encoding.\\n\\n encoding\\n The encoding with which to decode the bytes.\\n errors\\n The error handling scheme to use for the handling of decoding errors.\\n The default is 'strict' meaning that decoding errors raise a\\n UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\\n as well as any other name registered with codecs.register_error that\\n can handle UnicodeDecodeErrors.\"},\r\nendswith:{$meth:h(\"endswith\",(a,b)=>{const c=a.length-b.length;return 0<=c&&b.every((b,d)=>b===a[c+d])}),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.endswith(suffix[, start[, end]]) -> bool\\n\\nReturn True if B ends with the specified suffix, False otherwise.\\nWith optional start, test B beginning at that position.\\nWith optional end, stop comparing B at that position.\\nsuffix can also be a tuple of bytes to try.\"},expandtabs:{$meth(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError,\"an integer is required (got type {tp$nam})\");\r\nconst b=[];let c=0;for(let e=0;e copy of B\\n\\nReturn a copy of B where all tab characters are expanded using spaces.\\nIf tabsize is not given, a tab size of 8 characters is assumed.\"},find:{$meth:function(a,b,c){return new Sk.builtin.int_(this.find$left(a,\r\nb,c))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.find(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},hex:{$meth(){let a=\"\";for(let b=0;b string\\n\\nCreate a string of hexadecimal numbers from a bytes object.\\nExample: b'\\\\xb9\\\\x01\\\\xef'.hex() -> 'b901ef'.\"},\r\nindex:{$meth:function(a,b,c){a=this.find$left(a,b,c);if(-1===a)throw new Sk.builtin.ValueError(\"subsection not found\");return new Sk.builtin.int_(a)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.index(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the subsection is not found.\"},isalnum:{$meth:y(a=>t(a)||\r\nw(a)||A(a)),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isalnum() -> bool\\n\\nReturn True if all characters in B are alphanumeric\\nand there is at least one character in B, False otherwise.\"},isalpha:{$meth:y(a=>65<=a&&90>=a||97<=a&&122>=a),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isalpha() -> bool\\n\\nReturn True if all characters in B are alphabetic\\nand there is at least one character in B, False otherwise.\"},isascii:{$meth:y(a=>0<=a&&127>=a,!0),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isascii() -> bool\\n\\nReturn True if B is empty or all characters in B are ASCII,\\nFalse otherwise.\"},\r\nisdigit:{$meth:y(t),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isdigit() -> bool\\n\\nReturn True if all characters in B are digits\\nand there is at least one character in B, False otherwise.\"},islower:{$meth:B(w,A),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.islower() -> bool\\n\\nReturn True if all cased characters in B are lowercase and there is\\nat least one cased character in B, False otherwise.\"},isspace:{$meth:y(p),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isspace() -> bool\\n\\nReturn True if all characters in B are whitespace\\nand there is at least one character in B, False otherwise.\"},\r\nistitle:{$meth:function(){let a=!1,b=!1;for(let c=0;c bool\\n\\nReturn True if B is a titlecased string and there is at least one\\ncharacter in B, i.e. uppercase characters may only follow uncased\\ncharacters and lowercase characters only cased ones. Return False\\notherwise.\"},\r\nisupper:{$meth:B(A,w),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isupper() -> bool\\n\\nReturn True if all cased characters in B are uppercase and there is\\nat least one cased character in B, False otherwise.\"},join:{$meth(a){const b=[];let c=0;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(!(a instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError(\"sequence item \"+c+\": expected a bytes-like object, \"+Sk.abstr.typeName(a)+\" found\");c++;b.length&&b.push(...this.v);b.push(...a.v)}),\r\n()=>new Sk.builtin.bytes(new Uint8Array(b)))},$flags:{OneArg:!0},$textsig:\"($self, iterable_of_bytes, /)\",$doc:\"Concatenate any number of bytes objects.\\n\\nThe bytes whose method is called is inserted in between each pair.\\n\\nThe result is returned as a new bytes object.\\n\\nExample: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.\"},ljust:{$meth:k(\"ljust\",!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"B.ljust(width[, fillchar]) -> copy of B\\n\\nReturn B left justified in a string of length width. Padding is\\ndone using the specified fill character (default is a space).\"},\r\nlower:{$meth:E(a=>A(a)?a+32:a),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.lower() -> copy of B\\n\\nReturn a copy of B with all ASCII characters converted to lowercase.\"},lstrip:{$meth:n(!0,!1),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip leading bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip leading ASCII whitespace.\"},partition:{$meth:g(!1),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the bytes into three parts using the given separator.\\n\\nThis will search for the separator sep in the bytes. If the separator is found,\\nreturns a 3-tuple containing the part before the separator, the separator\\nitself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing the original bytes\\nobject and two empty bytes objects.\"},\r\nreplace:{$meth(a,b,c){a=this.get$raw(a);b=this.get$raw(b);c=void 0===c?-1:Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);c=0>c?Infinity:c;const d=[];let e=0;for(var f=0;f int\\n\\nReturn the highest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},rindex:{$meth:function(a,b,c){a=this.find$right(a,b,c);if(-1===a)throw new Sk.builtin.ValueError(\"subsection not found\");return new Sk.builtin.int_(a)},\r\n$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.rindex(sub[, start[, end]]) -> int\\n\\nReturn the highest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaise ValueError when the subsection is not found.\"},rjust:{$meth:k(\"rjust\",!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"B.rjust(width[, fillchar]) -> copy of B\\n\\nReturn B right justified in a string of length width. Padding is\\ndone using the specified fill character (default is a space)\"},\r\nrpartition:{$meth:g(!0),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the bytes into three parts using the given separator.\\n\\nThis will search for the separator sep in the bytes, starting at the end. If\\nthe separator is found, returns a 3-tuple containing the part before the\\nseparator, the separator itself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing two empty bytes\\nobjects and the original bytes object.\"},rsplit:{$meth:function(a,b){({sep:a,\r\nmaxsplit:b}=this.get$splitArgs(a,b));const c=[];let d=0,e=this.v.length;if(null!==a){for(;0<=e&&de)break;a=e+1;for(e--;0<=e&&!p(this.v[e]);)e--;c.push(new Sk.builtin.bytes(this.v.subarray(e+1,a)));d++}if(0<=e){for(;p(this.v[e]);)e--;0<=e&&c.push(new Sk.builtin.bytes(this.v.subarray(0,\r\ne+1)))}}return new Sk.builtin.list(c.reverse())},$flags:{NamedArgs:[\"sep\",\"maxsplit\"],Defaults:[Sk.builtin.none.none$,-1]},$textsig:\"($self, /, sep=None, maxsplit=-1)\",$doc:\"Return a list of the sections in the bytes, using sep as the delimiter.\\n\\n sep\\n The delimiter according which to split the bytes.\\n None (the default value) means split on ASCII whitespace characters\\n (space, tab, return, newline, formfeed, vertical tab).\\n maxsplit\\n Maximum number of splits to do.\\n -1 (the default value) means no limit.\\n\\nSplitting is done starting at the end of the bytes and working to the front.\"},\r\nrstrip:{$meth:n(!1,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip trailing bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip trailing ASCII whitespace.\"},split:{$meth:function(a,b){({sep:a,maxsplit:b}=this.get$splitArgs(a,b));const c=[],d=this.v.length;let e=0,f=0;if(null!==a){for(;fb.length<=a.length&&b.every((b,c)=>b===a[c])),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.startswith(prefix[, start[, end]]) -> bool\\n\\nReturn True if B starts with the specified prefix, False otherwise.\\nWith optional start, test B beginning at that position.\\nWith optional end, stop comparing B at that position.\\nprefix can also be a tuple of bytes to try.\"},strip:{$meth:n(!0,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip leading and trailing bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip leading and trailing ASCII whitespace.\"},\r\nswapcase:{$meth:E(a=>A(a)?a+32:w(a)?a-32:a),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.swapcase() -> copy of B\\n\\nReturn a copy of B with uppercase ASCII characters converted\\nto lowercase ASCII and vice versa.\"},title:{$meth(){const a=this.v.length,b=new Uint8Array(a);let c=!1;for(let d=0;d copy of B\\n\\nReturn a titlecased version of B, i.e. ASCII words start with uppercase\\ncharacters, all remaining cased characters have lowercase.\"},\r\nupper:{$meth:E(a=>w(a)?a-32:a),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.upper() -> copy of B\\n\\nReturn a copy of B with all ASCII characters converted to uppercase.\"},zfill:{$meth(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.IndexError);const b=a-this.v.length;if(0>=b)return new Sk.builtin.bytes(this.v);const c=new Uint8Array(a);let d=0,e;if(43===this.v[0]||45===this.v[0])c[0]=this.v[0],d++;c.fill(48,d,d+b);e=d;for(d+=b;d copy of B\\n\\nPad a numeric string B with zeros on the left, to fill a field\\nof the specified width. B is never truncated.\"}},classmethods:{fromhex:{$meth:function(a){function b(b){for(let c=f;c b'\\\\\\\\xb9\\\\\\\\x01\\\\\\\\xef'.\"}}});var N=Sk.abstr.buildIteratorClass(\"bytes_iterator\",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext(){const a=\r\nthis.$seq[this.$index++];if(void 0!==a)return new Sk.builtin.int_(a)},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.exportSymbol(\"Sk.builtin.bytes\",Sk.builtin.bytes)},function(m,q,a){(function(a){(function(a){function b(){}function c(){}var l=String.fromCharCode,h={}.toString,d=h.call(a.SharedArrayBuffer),g=h(),n=a.Uint8Array,k=n||Array,p=n?ArrayBuffer:k,w=p.isView||function(a){return a&&\"length\"in a},A=h.call(p.prototype);p=c.prototype;\r\nvar t=a.TextEncoder,m=new (n?Uint16Array:k)(32);b.prototype.decode=function(a){if(!w(a)){var b=h.call(a);if(b!==A&&b!==d&&b!==g)throw TypeError(\"Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");a=n?new k(a):a||[]}for(var c=b=\"\",e=0,f=a.length|0,p=f-32|0,B,t,y=0,q=0,O,S=0,V=-1;e>4){case 15:O=a[e=e+1|0]&255;if(2!==O>>6||247>6?q+4|0:24,t=t+256&768;case 13:case 12:O=a[e=e+1|0]&255,y<<=6,y|=(t&31)<<6|O&63,q=q+7|0,e>6&&y>>q&&1114112>y?(t=y,y=y-65536|0,0<=y&&(V=(y>>10)+55296|0,t=(y&1023)+56320|0,31>S?(m[S]=V,S=S+1|0,V=-1):(O=V,V=t,t=O))):(t>>=8,e=e-t-1|0,t=65533),y=q=0,B=e<=p?32:f-e|0;default:m[S]=t;continue;case 11:case 10:case 9:case 8:}m[S]=65533}c+=l(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15],m[16],m[17],m[18],m[19],m[20],\r\nm[21],m[22],m[23],m[24],m[25],m[26],m[27],m[28],m[29],m[30],m[31]);32>S&&(c=c.slice(0,S-32|0));if(e>>31,V=-1,c.length=g)c[e]=g;else{if(2047>=g)c[e]=192|g>>6;else{a:{if(55296<=g)if(56319>=g){var h=a.charCodeAt(d=d+1|0)|0;if(56320<=h&&57343>=h){g=(g<<10)+h-56613888|0;if(65535<\r\ng){c[e]=240|g>>18;c[e=e+1|0]=128|g>>12&63;c[e=e+1|0]=128|g>>6&63;c[e=e+1|0]=128|g&63;continue}break a}g=65533}else 57343>=g&&(g=65533);!f&&d<<1>12;c[e=e+1|0]=128|g>>6&63}c[e=e+1|0]=128|g&63}}return n?c.subarray(0,e):c.slice(0,e)};t||(a.TextDecoder=b,a.TextEncoder=c)})(\"undefined\"==typeof a?\"undefined\"==typeof self?this:self:a)}).call(this,a(0))},function(m,q){Sk.builtin.tuple=Sk.abstr.buildNativeClass(\"tuple\",{constructor:function(a){void 0===\r\na?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.tuple,\"bad call to tuple, use 'new' with an Array of python objects\");this.v=a;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:\"Built-in immutable sequence.\\n\\nIf no argument is given, the constructor returns an empty tuple.\\nIf iterable is specified the tuple is initialized from iterable's items.\\n\\nIf the argument is a tuple, the return value is the same object.\",\r\n$r(){if(this.in$repr)return new Sk.builtin.str(\"(...)\");this.in$repr=!0;let a=this.v.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;a=a.join(\", \");1===this.v.length&&(a+=\",\");return new Sk.builtin.str(\"(\"+a+\")\")},tp$new(a,b){if(this!==Sk.builtin.tuple.prototype)return this.$subtype_new(a,b);Sk.abstr.checkNoKwargs(\"tuple\",b);Sk.abstr.checkArgsLen(\"tuple\",a,0,1);a=a[0];return void 0===a?new Sk.builtin.tuple([]):a.constructor===Sk.builtin.tuple?a:Sk.misceval.chain(Sk.misceval.arrayFromIterable(a,\r\n!0),a=>new Sk.builtin.tuple(a))},tp$hash(){let a,b=3430008,e=1000003;const f=this.v.length;for(let c=0;ca&&(a=this.v.length+a);if(0>a||a>=this.v.length)throw new Sk.builtin.IndexError(\"tuple index out of range\");return this.v[a]}if(a instanceof\r\nSk.builtin.slice){const b=[];a.sssiter$(this.v.length,a=>{b.push(this.v[a])});return new Sk.builtin.tuple(b)}throw new Sk.builtin.TypeError(\"tuple indices must be integers or slices, not \"+Sk.abstr.typeName(a));},sq$length(){return this.v.length},sq$repeat(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(1===a&&this.constructor===Sk.builtin.tuple)return this;const b=[];for(let c=0;c{this.$seq=a.$items();this.$version=a.$version;c&&(this.$seq=this.$seq.reverse());this.tp$iternext=this.constructor.prototype.tp$iternext;return this.tp$iternext()}},iternext:b,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},\r\nflags:{sk$acceptable_as_base_class:!1},proto:{next$item:l}})}function l(){if(this.$version!==this.$orig.$version){if(this.$len!==this.$orig.get$size())throw new Sk.builtin.RuntimeError(\"dict changed size during iteration\");throw new Sk.builtin.RuntimeError(\"dictionary keys changed during iteration\");}return this.$seq[this.$index++]}Sk.builtin.dict=Sk.abstr.buildNativeClass(\"dict\",{constructor:function(a){void 0===a&&(a=[]);Sk.asserts.assert(Array.isArray(a)&&0===a.length%2&&this instanceof Sk.builtin.dict,\r\n\"bad call to dict constructor\");this.size=0;this.entries=Object.create(null);this.buckets={};for(let b=0;b new empty dictionary\\ndict(mapping) -> new dictionary initialized from a mapping object's\\n (key, value) pairs\\ndict(iterable) -> new dictionary initialized as if via:\\n d = {}\\n for k, v in iterable:\\n d[k] = v\\ndict(**kwargs) -> new dictionary initialized with the name=value pairs\\n in the keyword argument list. For example: dict(one=1, two=2)\",\r\n$r(){if(this.in$repr)return new Sk.builtin.str(\"{...}\");this.in$repr=!0;const a=this.$items().map(([a,b])=>Sk.misceval.objectRepr(a)+\": \"+Sk.misceval.objectRepr(b));this.in$repr=!1;return new Sk.builtin.str(\"{\"+a.join(\", \")+\"}\")},tp$new:Sk.generic.new,tp$init(a,b){return this.update$common(a,b,\"dict\")},tp$iter(){return new k(this)},tp$richcompare(a,b){let c;if(!(a instanceof Sk.builtin.dict)||\"Eq\"!==b&&\"NotEq\"!==b)return Sk.builtin.NotImplemented.NotImplemented$;if(a===this)c=!0;else if(this.size!==\r\na.size)c=!1;else{let b;c=this.$items().every(([c,d])=>{b=a.mp$lookup(c);return void 0!==b&&(b===d||Sk.misceval.richCompareBool(d,b,\"Eq\"))})}return\"Eq\"===b?c:!c},nb$or(a){if(!(a instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;const b=this.dict$copy();b.dict$merge(a);return b},nb$reflected_or(a){if(!(a instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;a=a.dict$copy();a.dict$merge(this);return a},nb$inplace_or(a){return Sk.misceval.chain(this.update$onearg(a),\r\n()=>this)},sq$length(){return this.get$size()},sq$contains(a){return void 0!==this.mp$lookup(a)},mp$subscript(a,b){var c=this.mp$lookup(a);if(void 0!==c)return c;c=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$missing);if(void 0!==c)return a=Sk.misceval.callsimOrSuspendArray(c,[a]),b?a:Sk.misceval.retryOptionalSuspensionOrThrow(a);throw new Sk.builtin.KeyError(a);},mp$ass_subscript(a,b){if(void 0===b){if(void 0===this.pop$item(a))throw new Sk.builtin.KeyError(a);}else this.set$item(a,b)}},methods:{__reversed__:{$meth(){return new A(this)},\r\n$flags:{NoArgs:!0},$textsig:null,$doc:\"Return a reverse iterator over the dict keys.\"},get:{$meth(a,b){return this.mp$lookup(a)||b||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, key, default=None, /)\",$doc:\"Return the value for key if key is in the dictionary, else default.\"},setdefault:{$meth(b,c){let d;const e=a(b);d=\"string\"===typeof e?this.entries[e]:this.get$bucket_item(b,e);if(void 0!==d)return d[1];c=c||Sk.builtin.none.none$;\"string\"===typeof e?this.entries[e]=[b,c]:\r\nthis.set$bucket_item(b,c,e);this.size++;this.$version++;return c},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, key, default=None, /)\",$doc:\"Insert key with a value of default if key is not in the dictionary.\\n\\nReturn the value for key if key is in the dictionary, else default.\"},pop:{$meth(a,b){const c=this.pop$item(a);if(void 0!==c)return c[1];if(void 0!==b)return b;throw new Sk.builtin.KeyError(a);},$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\\nIf key is not found, d is returned if given, otherwise KeyError is raised\"},\r\npopitem:{$meth(){const a=this.get$size();if(0===a)throw new Sk.builtin.KeyError(\"popitem(): dictionary is empty\");const [b,c]=this.$items()[a-1];this.pop$item(b);return new Sk.builtin.tuple([b,c])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.popitem() -> (k, v), remove and return some (key, value) pair as a\\n2-tuple; but raise KeyError if D is empty.\"},keys:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$meth(){return new n(this)},\r\n$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$meth(){return new g(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.values() -> an object providing a view on D's values\"},update:{$meth(a,b){return Sk.misceval.chain(this.update$common(a,b,\"update\"),()=>Sk.builtin.none.none$)},$flags:{FastCall:!0},$textsig:null,$doc:\"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\\nIf E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\\nIf E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\\nIn either case, this is followed by: for k in F: D[k] = F[k]\"},\r\nclear:{$meth(){this.size=0;this.$version++;this.entries=Object.create(null);this.buckets={}},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.clear() -> None. Remove all items from D.\"},copy:{$meth(){return this.dict$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.copy() -> a shallow copy of D\"}},classmethods:{fromkeys:{$meth:function(a,b){b=b||Sk.builtin.none.none$;let c=this===Sk.builtin.dict?new this:this.tp$call([],[]);return Sk.misceval.chain(c,d=>{c=d;return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>\r\nc.mp$ass_subscript(a,b,!0))},()=>c)},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($type, iterable, value=None, /)\",$doc:\"Create a new dictionary with keys from iterable and values set to value.\"}},proto:{quick$lookup:function(a){a=this.entries[a.$savedKeyHash];if(void 0!==a)return a[1]},mp$lookup:function(b){const c=a(b);b=\"string\"===typeof c?this.entries[c]:this.get$bucket_item(b,c);if(void 0!==b)return b[1]},get$size(){return this.size},sk$asarray(){return Object.values(this.entries).map(a=>a[0])},update$common:function(a,\r\nb,c){Sk.abstr.checkArgsLen(c,a,0,1);a=a[0];let d;void 0!==a&&(d=this.update$onearg(a));return Sk.misceval.chain(d,()=>{if(b)for(let a=0;avoid 0===a)&&delete this.buckets[b],d},set$bucket_item:function(a,b,c){let d=this.buckets[c];a=[a,b];void 0===d?(this.buckets[c]=[a],c=\"#\"+c+\"_0\"):(b=d.indexOf(void 0),\r\n-1!==b?(c=\"#\"+c+\"_\"+b,d[b]=a):(c=\"#\"+c+\"_\"+d.length,d.push(a)));this.entries[c]=a},pop$item:function(b){const c=a(b);\"string\"===typeof c?(b=this.entries[c],delete this.entries[c]):b=this.pop$bucket_item(b,c);if(void 0!==b)return this.size--,this.$version++,b},dict$merge:function(a){if(a.tp$iter===Sk.builtin.dict.prototype.tp$iter){var b=a.tp$iter();for(let c=b.tp$iternext();void 0!==c;c=b.tp$iternext()){const b=a.mp$subscript(c);this.set$item(c,b)}}else return b=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$keys),\r\nSk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,[]),b=>Sk.misceval.iterFor(Sk.abstr.iter(b),b=>Sk.misceval.chain(a.mp$subscript(b,!0),a=>{this.set$item(b,a)})))},dict$merge_seq:function(a){let b=0;return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError(\"cannot convert dictionary update sequence element #\"+b+\" to a sequence\");a=Sk.misceval.arrayFromIterable(a);if(2!==a.length)throw new Sk.builtin.ValueError(\"dictionary update sequence element #\"+\r\nb+\" has length \"+a.length+\"; 2 is required\");this.set$item(a[0],a[1]);b++})}}});const h={tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,$r(){if(this.in$repr)return new Sk.builtin.str(\"...\");this.in$repr=!0;let a=Sk.misceval.arrayFromIterable(this);a=a.map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return new Sk.builtin.str(Sk.abstr.typeName(this)+\"([\"+a.join(\", \")+\"])\")},tp$richcompare(a,c){if(!(Sk.builtin.checkAnySet(a)||a instanceof d||\r\na instanceof n))return Sk.builtin.NotImplemented.NotImplemented$;const e=this.sq$length(),f=a.sq$length();switch(c){case \"NotEq\":case \"Eq\":let d;this===a?d=!0:e===f&&(d=b(this,a));return\"NotEq\"===c?!d:d;case \"Lt\":return ef&&b(a,this);case \"GtE\":return e>=f&&b(a,this)}},nb$subtract(a){const b=c(this);return b.difference.$meth.call(b,a)},nb$and(a){const b=c(this);return b.intersection.$meth.call(b,a)},nb$or(a){const b=c(this);return b.union.$meth.call(b,\r\na)},nb$xor(a){const b=c(this);return b.symmetric_difference.$meth.call(b,a)},sq$length(){return this.dict.get$size()}};var d=e(\"dict_keys\",{sq$contains(a){return void 0!==this.dict.mp$lookup(a)},tp$iter(){return new k(this.dict)}},function(){return new A(this.dict)}),g=e(\"dict_values\",{tp$iter(){return new w(this.dict)}},function(){return new y(this.dict)}),n=e(\"dict_items\",{sq$contains(a){if(!(a instanceof Sk.builtin.tuple&&2===a.sq$length()))return!1;var b=a.mp$subscript(new Sk.builtin.int_(0));\r\na=a.mp$subscript(new Sk.builtin.int_(1));b=this.dict.mp$lookup(b);return void 0===b?!1:b===a||Sk.misceval.richCompareBool(b,a,\"Eq\")},tp$iter(){return new p(this.dict)}},function(){return new t(this.dict)}),k=f(\"dict_keyiterator\",function(){const a=this.next$item();return a&&a[0]}),p=f(\"dict_itemiterator\",function(){const a=this.next$item();return a&&new Sk.builtin.tuple([a[0],a[1]])}),w=f(\"dict_valueiterator\",function(){const a=this.next$item();return a&&a[1]}),A=f(\"dict_reversekeyiterator\",k.prototype.tp$iternext,\r\n!0),t=f(\"dict_reverseitemiterator\",p.prototype.tp$iternext,!0),y=f(\"dict_reversevalueiterator\",w.prototype.tp$iternext,!0);Sk.builtin.dict.py2$methods={has_key:{$name:\"has_key\",$flags:{OneArg:!0},$meth(a){return new Sk.builtin.bool(this.sq$contains(a))},$doc:\"D.has_key(k) -> True if D has a key k, else False\"},keys:{$name:\"keys\",$meth(){return new Sk.builtin.list(this.sk$asarray())},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$name:\"items\",\r\n$meth(){return new Sk.builtin.list(this.$items().map(([a,b])=>new Sk.builtin.tuple([a,b])))},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$name:\"values\",$meth(){return new Sk.builtin.list(this.$items().map(([,a])=>a))},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.values() -> an object providing a view on D's values\"}}},function(m,q){function a(a,b){Object.defineProperties(a,{entries:{get:()=>{const a=Object.create(null);Object.entries(b).forEach(([b,\r\nc])=>{b=Sk.unfixReserved(b);b.includes(\"$\")||(b=new Sk.builtin.str(b),a[b.$savedKeyHash]=[b,c])});return a},configurable:!0},size:{get:()=>Object.keys(b).map(a=>Sk.unfixReserved(a)).filter(a=>!a.includes(\"$\")).length,configurable:!0}})}Sk.builtin.mappingproxy=Sk.abstr.buildNativeClass(\"mappingproxy\",{constructor:function(c){Sk.asserts.assert(this instanceof Sk.builtin.mappingproxy,\"bad call to mapping proxy, use 'new'\");this.mapping=new Sk.builtin.dict([]);void 0!==c&&a(this.mapping,c)},slots:{tp$getattr:Sk.generic.getAttr,\r\ntp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$new(a,b){Sk.abstr.checkNoKwargs(\"mappingproxy\",b);Sk.abstr.checkOneArg(\"mappingproxy\",a,b);a=a[0];if(!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError(\"mappingproxy() argument must be a mapping, not \"+Sk.abstr.typeName(a));b=new Sk.builtin.mappingproxy;b.mapping=a;return b},tp$richcompare(a,b){return Sk.misceval.richCompareBool(this.mapping,a,b)},tp$str(){return this.mapping.tp$str()},$r(){return new Sk.builtin.str(\"mappingproxy(\"+\r\nSk.misceval.objectRepr(this.mapping)+\")\")},mp$subscript(a,b){return this.mapping.mp$subscript(a,b)},sq$contains(a){return this.mapping.sq$contains(a)},sq$length(){return this.mapping.sq$length()},tp$iter(){return this.mapping.tp$iter()},tp$as_number:!0,nb$or(a){a instanceof Sk.builtin.mappingproxy&&(a=a.mapping);return Sk.abstr.numberBinOp(this.mapping,a,\"BitOr\")},nb$reflected_or(a){a instanceof Sk.builtin.mappingproxy&&(a=a.mapping);return Sk.abstr.numberBinOp(a,this.mapping,\"BitOr\")},nb$inplace_or(a){throw new Sk.builtin.TypeError(\"'|=' is not supported by \"+\r\nSk.abstr.typeName(this)+\"; use '|' instead\");}},methods:{get:{$meth(a,b){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$get),a,b)},$flags:{FastCall:!0},$textsig:null,$doc:\"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.\"},keys:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$keys),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$items),\r\n[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$values),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.values() -> a set-like object providing a view on D's values\"},copy:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$copy),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.copy() -> a shallow copy of D\"}},proto:{str$get:new Sk.builtin.str(\"get\"),\r\nstr$copy:new Sk.builtin.str(\"copy\"),str$keys:new Sk.builtin.str(\"keys\"),str$items:new Sk.builtin.str(\"items\"),str$values:new Sk.builtin.str(\"values\"),mp$lookup(a){return this.mapping.mp$lookup(a)}},flags:{sk$acceptable_as_base_class:!1}})},function(m,q){Sk.builtin.property=Sk.abstr.buildNativeClass(\"property\",{constructor:function(a,c,b,e){this.prop$get=a||Sk.builtin.none.none$;this.prop$set=c||Sk.builtin.none.none$;this.prop$del=b||Sk.builtin.none.none$;this.prop$doc=e||a&&a.$doc||Sk.builtin.none.none$},\r\nslots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(a,c){a=Sk.abstr.copyKeywordsToNamedArgs(\"property\",[\"fget\",\"fset\",\"fdel\",\"doc\"],a,c,Array(4).fill(Sk.builtin.none.none$));this.prop$get=a[0];this.prop$set=a[1];this.prop$del=a[2];Sk.builtin.checkNone(a[3])?Sk.builtin.checkNone(a[0])||(this.prop$doc=a[0].$doc||a[3]):this.prop$doc=a[3]},tp$doc:\"Property attribute.\\n\\n fget\\n function to be used for getting an attribute value\\n fset\\n function to be used for setting an attribute value\\n fdel\\n function to be used for del'ing an attribute\\n doc\\n docstring\\n\\nTypical use is to define a managed attribute x:\\n\\nclass C(object):\\n def getx(self): return self._x\\n def setx(self, value): self._x = value\\n def delx(self): del self._x\\n x = property(getx, setx, delx, 'I'm the 'x' property.')\\n\\nDecorators make defining new properties or modifying existing ones easy:\\n\\nclass C(object):\\n @property\\n def x(self):\\n 'I am the 'x' property.'\\n return self._x\\n @x.setter\\n def x(self, value):\\n self._x = value\\n @x.deleter\\n def x(self):\\n del self._x\",\r\ntp$descr_get(a,c){if(null===a)return this;if(void 0===this.prop$get)throw new Sk.builtin.AttributeError(\"unreadable attribute\");return Sk.misceval.callsimOrSuspendArray(this.prop$get,[a])},tp$descr_set(a,c){let b;b=null==c?this.prop$del:this.prop$set;if(Sk.builtin.checkNone(b))throw new Sk.builtin.AttributeError(\"can't \"+(null==c?\"delete\":\"set\")+\" attribute\");if(!b.tp$call)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(b)+\"' is not callable\");return null==c?b.tp$call([a]):b.tp$call([a,c])}},\r\nmethods:{getter:{$meth(a){return new Sk.builtin.property(a,this.prop$set,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},setter:{$meth(a){return new Sk.builtin.property(this.prop$get,a,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},deleter:{$meth(a){return new Sk.builtin.property(this.prop$get,this.prop$set,a,this.prop$doc)},$flags:{OneArg:!0}}},getsets:{fget:{$get(){return this.prop$get}},fset:{$get(){return this.prop$set}},fdel:{$get(){return this.prop$del}},__doc__:{$get(){return this.prop$doc},\r\n$set(a){this.prop$doc=a=a||Sk.builtin.none.none$}}}});Sk.builtin.classmethod=Sk.abstr.buildNativeClass(\"classmethod\",{constructor:function(a){this.cm$callable=a;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs(\"classmethod\",c);Sk.abstr.checkArgsLen(\"classmethod\",a,1,1);this.cm$callable=a[0]},tp$doc:\"classmethod(function) -> method\\n\\nConvert a function to be a class method.\\n\\nA class method receives the class as implicit first argument,\\njust like an instance method receives the instance.\\nTo declare a class method, use this idiom:\\n\\n class C:\\n @classmethod\\n def f(cls, arg1, arg2, ...):\\n ...\\n\\nIt can be called either on the class (e.g. C.f()) or on an instance\\n(e.g. C().f()). The instance is ignored except for its class.\\nIf a class method is called for a derived class, the derived class\\nobject is passed as the implied first argument.\\n\\nClass methods are different than C++ or Java static methods.\\nIf you want those, see the staticmethod builtin.\",\r\ntp$descr_get(a,c){const b=this.cm$callable;if(void 0===b)throw new Sk.builtin.RuntimeError(\"uninitialized classmethod object\");void 0===c&&(c=a.ob$type);return(a=b.tp$descr_get)?a.call(b,c):new Sk.builtin.method(b,c)}},getsets:{__func__:{$get(){return this.cm$callable}},__dict__:Sk.generic.getSetDict}});Sk.builtin.staticmethod=Sk.abstr.buildNativeClass(\"staticmethod\",{constructor:function(a){this.sm$callable=a;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,\r\ntp$init(a,c){Sk.abstr.checkNoKwargs(\"staticmethod\",c);Sk.abstr.checkArgsLen(\"staticmethod\",a,1,1);this.sm$callable=a[0]},tp$doc:\"staticmethod(function) -> method\\n\\nConvert a function to be a static method.\\n\\nA static method does not receive an implicit first argument.\\nTo declare a static method, use this idiom:\\n\\n class C:\\n @staticmethod\\n def f(arg1, arg2, ...):\\n ...\\n\\nIt can be called either on the class (e.g. C.f()) or on an instance\\n(e.g. C().f()). The instance is ignored except for its class.\\n\\nStatic methods in Python are similar to those found in Java or C++.\\nFor a more advanced concept, see the classmethod builtin.\",\r\ntp$descr_get(a,c){if(void 0===this.sm$callable)throw new Sk.builtin.RuntimeError(\"uninitialized staticmethod object\");return this.sm$callable}},getsets:{__func__:{$get(){return this.sm$callable}},__dict__:Sk.generic.getSetDict}})},function(m,q){function a(a,b){return function(c){if(c instanceof Sk.builtin.int_){let e=this.v;c=c.v;if(\"number\"===typeof e&&\"number\"===typeof c){const b=a(e,c);if(d(b))return new Sk.builtin.int_(b)}e=n(e);c=n(c);return new Sk.builtin.int_(b(e,c))}return Sk.builtin.NotImplemented.NotImplemented$}}\r\nfunction c(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if(\"number\"===typeof d&&\"number\"===typeof c)return a(d,c);d=n(d);c=n(c);return b(d,c)}return Sk.builtin.NotImplemented.NotImplemented$}}function b(a,b){return function(){const c=this.v;return\"number\"===typeof c?new Sk.builtin.int_(a(c)):new Sk.builtin.int_(b(c))}}function e(){return new Sk.builtin.int_(this.v)}function f(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if(0===c)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");\r\nif(\"number\"===typeof d&&\"number\"===typeof c)return new Sk.builtin.int_(a(d,c));d=n(d);c=n(c);return new Sk.builtin.int_(JSBI.numberIfSafe(b(d,c)))}return Sk.builtin.NotImplemented.NotImplemented$}}function l(a,b){return function(c){if(c instanceof Sk.builtin.int_){let d=this.v;c=c.v;if(0===d)return new Sk.builtin.int_(this.v);if(\"number\"===typeof c){if(0>c)throw new Sk.builtin.ValueError(\"negative shift count\");if(\"number\"===typeof d){const b=a(d,c);if(void 0!==b)return new Sk.builtin.int_(b)}c=JSBI.BigInt(c)}else if(JSBI.lessThan(JSBI.BigInt(0)))throw new Sk.builtin.ValueError(\"negative shift count\");\r\nd=n(d);return new Sk.builtin.int_(b(d,c))}return Sk.builtin.NotImplemented.NotImplemented$}}function h(a,b){return function(c){if(c instanceof Sk.builtin.int_){var d=this.v;c=c.v;if(\"number\"===typeof d&&\"number\"===typeof c)return d=a(d,c),0>d&&(d+=4294967296),new Sk.builtin.int_(d);d=n(d);c=n(c);return new Sk.builtin.int_(JSBI.numberIfSafe(b(d,c)))}return Sk.builtin.NotImplemented.NotImplemented$}}function d(a){return a<=Number.MAX_SAFE_INTEGER&&a>=-Number.MAX_SAFE_INTEGER}function g(a){return a<=\r\nNumber.MAX_SAFE_INTEGER&&a>=-Number.MAX_SAFE_INTEGER?+a:JSBI.BigInt(a)}function n(a){return\"number\"===typeof a?JSBI.BigInt(a):a}Sk.builtin.int_=Sk.abstr.buildNativeClass(\"int\",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.int_,\"bad call to int use 'new'\");let b;if(\"number\"===typeof a||JSBI.__isBigInt(a))b=a;else if(void 0===a)b=0;else if(\"string\"===typeof a)b=g(a);else{if(a.nb$int)return a.nb$int();Sk.asserts.fail(\"bad argument to int constructor\")}this.v=b},slots:{tp$as_number:!0,\r\ntp$doc:\"int(x=0) -> integer\\nint(x, base=10) -> integer\\n\\nConvert a number or string to an integer, or return 0 if no arguments\\nare given. If x is a number, return x.__int__(). For floating point\\nnumbers, this truncates towards zero.\\n\\nIf x is not a number or if base is given, then x must be a string,\\nbytes, or bytearray instance representing an integer literal in the\\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\\nBase 0 means to interpret the base from the string as an integer literal.\\n>>> int('0b100', base=0)\\n4\",\r\n$r(){return new Sk.builtin.str(this.v.toString())},tp$hash(){const a=this.v;return\"number\"===typeof a?a:JSBI.toNumber(JSBI.remainder(a,JSBI.__MAX_SAFE))},tp$new(a,b){1===a.length+(b?b.length:0)?(b=a[0],a=Sk.builtin.none.none$):(a=Sk.abstr.copyKeywordsToNamedArgs(\"int\",[null,\"base\"],a,b,[new Sk.builtin.int_(0),Sk.builtin.none.none$]),b=a[0],a=a[1]);a=a!==Sk.builtin.none.none$?Sk.misceval.asIndexOrThrow(a):null;if(b instanceof Sk.builtin.str)null===a&&(a=10),b=new Sk.builtin.int_(Sk.str2number(b.v,\r\na));else{if(null!==a)throw new Sk.builtin.TypeError(\"int() can't convert non-string with explicit base\");if(b.nb$int)b=b.nb$int();else if(a=Sk.abstr.lookupSpecial(b,Sk.builtin.str.$trunc)){a=Sk.misceval.callsimArray(a,[]);if(!Sk.builtin.checkInt(a))throw new Sk.builtin.TypeError(Sk.builtin.str.$trunc.$jsstr()+\" returned non-Integral (type \"+Sk.abstr.typeName(b)+\")\");b=new Sk.builtin.int_(a.v)}else throw new Sk.builtin.TypeError(\"int() argument must be a string, a bytes-like object or a number, not '\"+\r\nSk.abstr.typeName(b)+\"'\");}if(this===Sk.builtin.int_.prototype)return b;a=new this.constructor;a.v=b.v;return a},tp$getattr:Sk.generic.getAttr,ob$eq:c((a,b)=>a==b,JSBI.equal),ob$ne:c((a,b)=>a!=b,JSBI.notEqual),ob$gt:c((a,b)=>a>b,JSBI.greaterThan),ob$ge:c((a,b)=>a>=b,JSBI.greaterThanOrEqual),ob$lt:c((a,b)=>aa<=b,JSBI.lessThanOrEqual),nb$int:e,nb$index(){return this.v},nb$float(){var a=this.v;if(\"number\"===typeof a)return new Sk.builtin.float_(a);a=parseFloat(JSBI.toNumber(a));\r\nif(Infinity===a||-Infinity===a)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");return new Sk.builtin.float_(a)},nb$isnegative(){const a=this.v;return\"number\"===typeof a?0>a:JSBI.lessThan(a,JSBI.__ZERO)},nb$ispositive(){const a=this.v;return\"number\"===typeof a?0>a:JSBI.greaterThanOrEqual(a,JSBI.__ZERO)},nb$bool(){return 0!==this.v},nb$positive:e,nb$negative:b(a=>-a,JSBI.unaryMinus),nb$add:a((a,b)=>a+b,(a,b)=>JSBI.numberIfSafe(JSBI.add(a,b))),nb$subtract:a((a,b)=>a-b,(a,b)=>\r\nJSBI.numberIfSafe(JSBI.subtract(a,b))),nb$multiply:a((a,b)=>a*b,JSBI.multiply),nb$divide(a){return Sk.__future__.division?this.nb$float().nb$divide(a):this.nb$floor_divide(a)},nb$floor_divide:f((a,b)=>Math.floor(a/b),JSBI.divide),nb$remainder:f((a,b)=>a-Math.floor(a/b)*b,JSBI.remainder),nb$divmod(a){const b=this.nb$floor_divide(a);a=this.nb$remainder(a);return b===Sk.builtin.NotImplemented.NotImplemented$||a===Sk.builtin.NotImplemented.NotImplemented$?Sk.builtin.NotImplemented.NotImplemented$:new Sk.builtin.tuple([b,\r\na])},nb$and:h((a,b)=>a&b,JSBI.bitwiseAnd),nb$or:h((a,b)=>a|b,JSBI.bitwiseOr),nb$xor:h((a,b)=>a^b,JSBI.bitwiseXor),nb$abs:b(Math.abs,a=>JSBI.lessThan(a,JSBI.__ZERO)?JSBI.unaryMinus(a):a),nb$lshift:l((a,b)=>{if(53>b&&(a=2*a*p[b],d(a)))return a},JSBI.leftShift),nb$rshift:l((a,b)=>{const c=a>>b;return 0c?c&Math.pow(2,32-b)-1:c},(a,b)=>JSBI.numberIfSafe(JSBI.signedRightShift(a,b))),nb$invert:b(a=>~a,JSBI.bitwiseNot),nb$power(a,b){let c;void 0!==b&&Sk.builtin.checkNone(b)&&(b=void 0);if(a instanceof\r\nSk.builtin.int_&&(void 0===b||b instanceof Sk.builtin.int_)){let e=this.v,f=a.v;if(\"number\"===typeof e&&\"number\"===typeof f){const a=Math.pow(e,f);if(d(a)&&(c=0>f?new Sk.builtin.float_(a):new Sk.builtin.int_(a),void 0===b))return c}if(void 0!==b){if(a.nb$isnegative())throw new Sk.builtin.ValueError(\"pow() 2nd argument cannot be negative when 3rd argument specified\");if(0===b.v)throw new Sk.builtin.ValueError(\"pow() 3rd argument cannot be 0\");return void 0!==c?c.nb$remainder(b):new Sk.builtin.int_(JSBI.powermod(n(e),\r\nn(f),n(b.v)))}return new Sk.builtin.int_(JSBI.exponentiate(n(e),n(f)))}return Sk.builtin.NotImplemented.NotImplemented$},nb$long(){return new Sk.builtin.lng(this.v)}},getsets:{real:{$get:e,$doc:\"the real part of a complex number\"},imag:{$get(){return new Sk.builtin.int_(0)},$doc:\"the imaginary part of a complex number\"}},methods:{conjugate:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:\"Returns self, the complex conjugate of any int.\"},bit_length:{$meth(){return new Sk.builtin.int_(Sk.builtin.bin(this).sq$length()-\r\n2)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Number of bits necessary to represent self in binary.\\n\\n>>> bin(37)\\n'0b100101'\\n>>> (37).bit_length()\\n6\"},to_bytes:{$meth(){throw new Sk.builtin.NotImplementedError(\"Not yet implemented in Skulpt\");},$flags:{FastCall:!0},$textsig:\"($self, /, length, byteorder, *, signed=False)\",$doc:\"Return an array of bytes representing an integer.\\n\\n length\\n Length of bytes object to use. An OverflowError is raised if the\\n integer is not representable with the given number of bytes.\\n byteorder\\n The byte order used to represent the integer. If byteorder is 'big',\\n the most significant byte is at the beginning of the byte array. If\\n byteorder is 'little', the most significant byte is at the end of the\\n byte array. To request the native byte order of the host system, use\\n `sys.byteorder' as the byte order value.\\n signed\\n Determines whether two's complement is used to represent the integer.\\n If signed is False and a negative integer is given, an OverflowError\\n is raised.\"},\r\n__trunc__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:\"Truncating an Integral returns itself.\"},__floor__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:\"Flooring an Integral returns itself.\"},__ceil__:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:\"Ceiling of an Integral returns itself.\"},__round__:{$meth(a){return this.round$(a)},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"Rounding an Integral returns itself.\\nRounding with an ndigits argument also returns an integer.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.int_(this.v)])},\r\n$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!1),$flags:{OneArg:!0},$textsig:\"($self, format_spec, /)\",$doc:Sk.builtin.none.none$}},proto:{str$(a,b){a=void 0===a||10===a?this.v.toString():this.v.toString(a);b||void 0===b||\"-\"===a[0]&&(a=a.substring(1));return a},round$(a){a=void 0===a?0:Sk.misceval.asIndexSized(a);var b=this.v,c=Math.pow(10,-a);if(0JSBI.toNumber(e)?b=JSBI.multiply(JSBI.multiply(d,a),c):JSBI.multiply(JSBI.multiply(JSBI.add(d,JSBI.BigInt(1),a),c));return new Sk.builtin.int_(b)}}}});Sk.exportSymbol(\"Sk.builtin.int_\",Sk.builtin.int_);const k=/_(?=[^_])/g;Sk.str2number=\r\nfunction(a,b){var c=a,e=!1,f;a=a.replace(/^\\s+|\\s+$/g,\"\");\"-\"===a.charAt(0)&&(e=!0,a=a.substring(1));\"+\"===a.charAt(0)&&(a=a.substring(1));if(null===b||void 0===b)b=10;if((2>b||36= 2 and <= 36\");\"string\"===typeof b&&(b=Number(b));if(\"0x\"===a.substring(0,2).toLowerCase())if(16===b||0===b)a=a.substring(2),b=16;else{if(34>b)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+b+\": '\"+c+\"'\");}else if(\"0b\"===a.substring(0,\r\n2).toLowerCase())if(2===b||0===b)a=a.substring(2),b=2;else{if(12>b)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+b+\": '\"+c+\"'\");}else if(\"0o\"===a.substring(0,2).toLowerCase())if(8===b||0===b)a=a.substring(2),b=8;else{if(25>b)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+b+\": '\"+c+\"'\");}else if(\"0\"===a.charAt(0)){if(\"0\"===a)return 0;if(8===b||0===b)b=8}0===b&&(b=10);if(-1!==a.indexOf(\"_\")){if(-1!==a.indexOf(\"__\"))throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+\r\nb+\": '\"+c+\"'\");a=10!==b?a.replace(k,\"\"):a.charAt(0)+a.substring(1).replace(k,\"\")}if(0===a.length)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+b+\": '\"+c+\"'\");for(f=0;f=g?h=g-48:65<=g&&90>=g?h=g-65+10:97<=g&&122>=g&&(h=g-97+10);if(h>=b)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+b+\": '\"+c+\"'\");}e&&(a=\"-\"+a);h=parseInt(a,b);if(d(h))return h;c=!1;\"-\"===a[0]&&(c=!0,a=a.substring(1));b=JSBI.BigInt(b);\r\ne=JSBI.BigInt(1);f=JSBI.BigInt(0);for(g=a.length-1;0<=g;g--)h=a.charCodeAt(g),48<=h&&57>=h?h-=48:65<=h&&90>=h?h=h-65+10:97<=h&&122>=h&&(h=h-97+10),h=JSBI.multiply(JSBI.BigInt(h),e),f=JSBI.add(f,h),e=JSBI.multiply(e,b);c&&(f=JSBI.multiply(f,JSBI.BigInt(-1)));return a=f};Sk.builtin.int_.py2$methods={};Sk.longFromStr=function(a,b){if(Sk.__future__.python3)return new Sk.builtin.int_(g(a));a=Sk.str2number(a,b);return new Sk.builtin.lng(a)};Sk.exportSymbol(\"Sk.longFromStr\",Sk.longFromStr);Sk.builtin.int_.withinThreshold=\r\nd;Sk.builtin.int_.stringToNumberOrBig=g;const p=[.5,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,0x800000000000,281474976710656,562949953421312,0x4000000000000,\r\n0x8000000000000,4503599627370496,9007199254740992];Sk.builtin.lng=Sk.abstr.buildNativeClass(\"long\",{base:Sk.builtin.int_,constructor:function(a){Sk.builtin.int_.call(this,a)},slots:{$r(){return new Sk.builtin.str(this.v.toString()+\"L\")},tp$as_number:!0,nb$negative(){return new Sk.builtin.lng(w.nb$negative.call(this).v)},nb$positive(){return new Sk.builtin.lng(w.nb$positive.call(this).v)}}});const w=Sk.builtin.int_.prototype},function(m,q){const a=Sk.builtin.int_.prototype;Sk.builtin.bool=Sk.abstr.buildNativeClass(\"bool\",\r\n{constructor:function(a){return Sk.misceval.isTrue(a)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},base:Sk.builtin.int_,slots:{tp$doc:\"bool(x) -> bool\\n\\nReturns True when the argument x is true, False otherwise.\\nThe builtins True and False are the only two instances of the class bool.\\nThe class bool is a subclass of the class int, and cannot be subclassed.\",tp$new(a,b){Sk.abstr.checkNoKwargs(\"bool\",b);Sk.abstr.checkArgsLen(\"bool\",a,0,1);return new Sk.builtin.bool(a[0])},$r(){return this.v?this.str$True:\r\nthis.str$False},tp$as_number:!0,nb$and(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v&c.v):a.nb$and.call(this,c)},nb$or(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v|c.v):a.nb$or.call(this,c)},nb$xor(c){return c.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v^c.v):a.nb$xor.call(this,c)}},flags:{sk$acceptable_as_base_class:!1},methods:{__format__:{$meth(){return this.$r()},$flags:{OneArg:!0}}},proto:{str$False:new Sk.builtin.str(\"False\"),str$True:new Sk.builtin.str(\"True\")}});\r\nSk.exportSymbol(\"Sk.builtin.bool\",Sk.builtin.bool);Sk.builtin.bool.true$=Object.create(Sk.builtin.bool.prototype,{v:{value:1,enumerable:!0}});Sk.builtin.bool.false$=Object.create(Sk.builtin.bool.prototype,{v:{value:0,enumerable:!0}})},function(m,q){function a(){return new Sk.builtin.float_(this.v)}function c(a){return function(b){const c=this.v;b=b.v;if(\"number\"!==typeof b)if(JSBI.__isBigInt(b)){if(b=parseFloat(JSBI.toNumber(b)),Infinity==b||-Infinity==b)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");\r\n}else return Sk.builtin.NotImplemented.NotImplemented$;return a(c,b)}}function b(a){const b=c(a);return function(a,c){if(void 0!==c&&!Sk.builtin.checkNone(c))throw new Sk.builtin.TypeError(\"pow() 3rd argument not allowed unless all arguments are integers\");return b.call(this,a)}}function e(a,b){if(0===b)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");return Infinity===a?Infinity===b||-Infinity===a?new Sk.builtin.float_(NaN):0>b?new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(Infinity):\r\n-Infinity===a?Infinity===b||-Infinity===a?new Sk.builtin.float_(NaN):0>b?new Sk.builtin.float_(Infinity):new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(a/b)}function f(a,b){if(Infinity===a||-Infinity===a)return new Sk.builtin.float_(NaN);if(0===b)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");return Infinity===b?0>a?new Sk.builtin.float_(-1):new Sk.builtin.float_(0):-Infinity===b?0>a||0!==a?new Sk.builtin.float_(0):new Sk.builtin.float_(-1):new Sk.builtin.float_(Math.floor(a/\r\nb))}function l(a,b){if(0===b)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");if(0===a)return new Sk.builtin.float_(0);if(Infinity===b)return Infinity===a||-Infinity===this.v?new Sk.builtin.float_(NaN):0a?0c&&(c+=b):0>b&&0!==c&&(c+=b);0===c&&(0>b?c=-0:-Infinity===Infinity/c&&(c=0));return new Sk.builtin.float_(c)}function h(a,b){if(0>a&&0!==b%1)throw new Sk.builtin.ValueError(\"negative number cannot be raised to a fractional power\");\r\nif(0===a&&0>b)throw new Sk.builtin.ZeroDivisionError(\"0.0 cannot be raised to a negative power\");const c=Math.pow(a,b);if(Infinity===Math.abs(c)&&Infinity!==Math.abs(a)&&Infinity!==Math.abs(b))throw new Sk.builtin.OverflowError(\"Numerical result out of range\");return new Sk.builtin.float_(c)}const d=Object.create(null,{Infinity:{value:314159},\"-Infinity\":{value:-314159},NaN:{value:0}});Sk.builtin.float_=Sk.abstr.buildNativeClass(\"float\",{constructor:function(a){Sk.asserts.assert(this instanceof Sk.builtin.float_,\r\n\"bad call to float use 'new'\");if(\"number\"===typeof a)this.v=a;else if(void 0===a)this.v=0;else if(\"string\"===typeof a)this.v=parseFloat(a);else{if(a.nb$float)return a.nb$float();Sk.asserts.fail(\"bad argument to float constructor\")}},slots:{tp$gettattr:Sk.generic.getAttr,tp$as_number:!0,tp$doc:\"Convert a string or number to a floating point number, if possible.\",tp$hash(){const a=this.v;let b=d[a];if(void 0!==b)return b;b=Number.isInteger(a)?this.nb$int().tp$hash():Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-\r\nNumber.MAX_SAFE_INTEGER/2);return d[this.v]=b},$r(){return new Sk.builtin.str(this.str$(10,!0))},tp$new(a,b){if(b&&b.length)throw new Sk.builtin.TypeError(\"float() takes no keyword arguments\");if(a&&1a?Math.ceil(a):Math.floor(a);if(!Number.isInteger(a))throw new Sk.builtin.ValueError(\"cannot convert float \"+Sk.misceval.objectRepr(this)+\" to integer\");return Sk.builtin.int_.withinThreshold(a)?new Sk.builtin.int_(a):new Sk.builtin.int_(JSBI.BigInt(a))},nb$float:a,nb$long(){return new Sk.builtin.lng(this.nb$int().v)},nb$add:c((a,b)=>new Sk.builtin.float_(a+b)),nb$subtract:c((a,b)=>new Sk.builtin.float_(a-b)),nb$reflected_subtract:c((a,\r\nb)=>new Sk.builtin.float_(b-a)),nb$multiply:c((a,b)=>new Sk.builtin.float_(a*b)),nb$divide:c(e),nb$reflected_divide:c((a,b)=>e(b,a)),nb$floor_divide:c(f),nb$reflected_floor_divide:c((a,b)=>f(b,a)),nb$remainder:c(l),nb$reflected_remainder:c((a,b)=>l(b,a)),nb$divmod:c((a,b)=>new Sk.builtin.tuple([f(a,b),l(a,b)])),nb$reflected_divmod:c((a,b)=>new Sk.builtin.tuple([f(b,a),l(b,a)])),nb$power:b(h),nb$reflected_power:b((a,b)=>h(b,a)),nb$abs(){return new Sk.builtin.float_(Math.abs(this.v))},nb$negative(){return new Sk.builtin.float_(-this.v)},\r\nnb$positive(){return new Sk.builtin.float_(this.v)},nb$bool(){return 0!==this.v},nb$isnegative(){return 0>this.v},nb$ispositive(){return 0<=this.v},ob$eq:c((a,b)=>a==b),ob$ne:c((a,b)=>a!=b),ob$gt:c((a,b)=>a>b),ob$ge:c((a,b)=>a>=b),ob$lt:c((a,b)=>aa<=b)},getsets:{real:{$get:a,$doc:\"the real part of a complex number\"},imag:{$get(){return new Sk.builtin.float_(0)},$doc:\"the imaginary part of a complex number\"}},methods:{conjugate:{$meth:a,$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return self, the complex conjugate of any float.\"},\r\n__trunc__:{$meth(){return this.nb$int()},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return the Integral closest to x between 0 and x.\"},__round__:{$meth(a){return this.round$(a)},$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, ndigits=None, /)\",$doc:\"Return the Integral closest to x, rounding half toward even.\\n\\nWhen an argument is passed, work like built-in round(x, ndigits).\"},is_integer:{$meth(){return new Sk.builtin.bool(Number.isInteger(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",\r\n$doc:\"Return True if the float is an integer.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple([this])},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!0),$flags:{OneArg:!0},$textsig:\"($self, format_spec, /)\",$doc:Sk.builtin.none.none$}}});const g=/_[eE]|[eE]_|\\._|_\\.|[+-]_|__/,n=/_(?=[^_])/g;Sk.builtin.float_.PyFloat_Check=function(a){return void 0===a?!1:Sk.builtin.checkNumber(a)||Sk.builtin.checkFloat(a)||a.ob$type.$isSubType(Sk.builtin.float_)?\r\n!0:!1};Sk.builtin.float_.prototype.toFixed=function(a){a=Sk.builtin.asnum$(a);return this.v.toFixed(a)};Sk.builtin.float_.prototype.round$=function(a){var b=Sk.builtin.asnum$(this);var c=void 0===a?0:Sk.misceval.asIndexSized(a);if(Sk.__future__.bankers_rounding){b*=Math.pow(10,c);var d=Math.round(b);c=(.5===(0c.length?b.toExponential():b.toExponential(11));if(0>c.indexOf(\"e\")&&0<=c.indexOf(\".\")){for(;\"0\"==\r\nc.charAt(c.length-1);)c=c.substring(0,c.length-1);\".\"==c.charAt(c.length-1)&&(c+=\"0\")}c=c.replace(/\\.0+e/,\"e\",\"i\");c=c.replace(/(e[-+])([1-9])$/,\"$10$2\");c=c.replace(/0+(e.*)/,\"$1\")}else c=b.toString(a);0===this.v&&-Infinity===1/this.v&&(c=\"-\"+c);0>c.indexOf(\".\")&&0>c.indexOf(\"E\")&&0>c.indexOf(\"e\")&&(c+=\".0\");return c};Sk.builtin.float_.py2$methods={}},function(m,q){function a(a){let b=a.v;if(\"number\"===typeof b)return b;a.nb$float&&(b=a.nb$float());if(void 0===b)throw new Sk.builtin.TypeError(\"a float is required\");\r\nreturn b.v}function c(a,b,c){if(c===Sk.builtin.complex.prototype)return new Sk.builtin.complex(a,b);c=new c.constructor;Sk.builtin.complex.call(c,a,b);return c}function b(a,b){return function(c){const d=this.real,e=this.imag;var f=c.real;const g=c.v;if(\"number\"===typeof f)c=c.imag;else if(\"number\"===typeof g)f=g,c=0;else if(JSBI.__isBigInt(g)){if(void 0===b){if(f=parseFloat(JSBI.toNumber(g)),Infinity==f||-Infinity==f)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");}else f=\r\ng.toString();c=0}else return Sk.builtin.NotImplemented.NotImplemented$;return a(d,e,f,c)}}function e(a,b,c,d){var e=Math.abs(c);const f=Math.abs(d);if(e>=f){if(0===e)throw new Sk.builtin.ZeroDivisionError(\"complex division by zero\");e=d/c;c+=d*e;d=(a+b*e)/c;a=(b-a*e)/c}else f>=e?(e=c/d,c=c*e+d,Sk.asserts.assert(0!==d),d=(a*e+b)/c,a=(b*e-a)/c):a=d=NaN;return new Sk.builtin.complex(d,a)}function f(a,b,c,d){if(0===c&&0===d){d=1;var e=0}else if(0===a&&0===b){if(0!==d||0>c)throw new Sk.builtin.ZeroDivisionError(\"complex division by zero\");\r\ne=d=0}else{const f=Math.hypot(a,b);e=Math.pow(f,c);a=Math.atan2(b,a);c*=a;0!==d&&(e/=Math.exp(a*d),c+=d*Math.log(f));d=e*Math.cos(c);e*=Math.sin(c)}return new Sk.builtin.complex(d,e)}function l(a,b,c){let d=1;var e=new Sk.builtin.complex(1,0);for(a=new Sk.builtin.complex(a,b);0=d;)c&d&&(e=new Sk.builtin.complex(e.real*a.real-e.imag*a.imag,e.real*a.imag+a.real*e.imag)),d<<=1,a=new Sk.builtin.complex(a.real*a.real-a.imag*a.imag,2*a.real*a.imag);return e}function h(a,b,c,d,e){e=!1;switch(b){case \"e\":case \"f\":case \"g\":break;\r\ncase \"E\":e=!0;b=\"e\";break;case \"F\":e=!0;b=\"f\";break;case \"r\":if(0!==c)throw Error(\"Bad internall call\");c=17;b=\"g\";break;default:throw Error(\"Bad internall call\");}if(isNaN(a))a=\"nan\";else if(Infinity===a)a=\"inf\";else if(-Infinity===a)a=\"-inf\";else{d&h.Py_DTSF_ADD_DOT_0&&(b=\"g\");var f=\"%\"+(d&h.Py_DTSF_ALT?\"#\":\"\");null!=c&&(f=f+\".\"+c);f=new Sk.builtin.str(f+b);a=f.nb$remainder(new Sk.builtin.float_(a));a=a.v}d&h.Py_DTSF_SIGN&&\"-\"!==a[0]&&(a=\"+\"+a);e&&(a=a.toUpperCase());return a}Sk.builtin.complex=\r\nSk.abstr.buildNativeClass(\"complex\",{constructor:function(a,b){Sk.asserts.assert(this instanceof Sk.builtin.complex,\"bad call to complex constructor, use 'new'\");this.real=a;this.imag=b},slots:{tp$as_number:!0,tp$doc:\"Create a complex number from a real part and an optional imaginary part.\\n\\nThis is equivalent to (real + imag*1j) where imag defaults to 0.\",tp$hash(){var a=(new Sk.builtin.float_(this.real)).tp$hash();a=1003*(new Sk.builtin.float_(this.imag)).tp$hash()+a;return Sk.builtin.int_.withinThreshold(a)?\r\na:(new Sk.builtin.int_(JSBI.BigInt(a))).tp$hash()},tp$getattr:Sk.generic.getAttr,tp$new(b,e){b=Sk.abstr.copyKeywordsToNamedArgs(\"complex\",[\"real\",\"imag\"],b,e,[null,null]);{var f=b[1],g;let k=e=!1;var h=b[0];if(null!=h&&h.constructor===Sk.builtin.complex&&null==f)e=h;else if(Sk.builtin.checkString(h)){if(null!=f)throw new Sk.builtin.TypeError(\"complex() can't take second arg if first is a string\");e=Sk.builtin.complex.complex_subtype_from_string(h,this)}else{if(null!=f&&Sk.builtin.checkString(f))throw new Sk.builtin.TypeError(\"complex() second arg can't be a string\");\r\nnull==h?b=null:(b=Sk.abstr.lookupSpecial(h,Sk.builtin.str.$complex),b=void 0!==b?Sk.misceval.callsimArray(b,[]):null);if(null!=b&&b!==Sk.builtin.NotImplemented.NotImplemented$){if(!d(b))throw new Sk.builtin.TypeError(\"__complex__ should return a complex object\");h=b}if(null!=h&&void 0===h.nb$float)throw new Sk.builtin.TypeError(\"complex() first argument must be a string or a number, not '\"+Sk.abstr.typeName(h)+\"'\");if(null!=f&&void 0===f.nb$float)throw new Sk.builtin.TypeError(\"complex() second argument must be a number, not '\"+\r\nSk.abstr.typeName(h)+\"'\");null==h?h=b=0:d(h)?(b=h.real,h=h.imag,e=!0):(b=a(h),h=0);null==f?f=g=0:d(f)?(g=f.real,f=f.imag,k=!0):(g=a(f),f=0);!0===k&&(b-=f);!0===e&&(g+=h);e=c(b,g,this)}}return e},tp$richcompare(a,c){if(\"Eq\"!==c&&\"NotEq\"!==c){if(Sk.builtin.checkNumber(a)||d(a))throw new Sk.builtin.TypeError(\"no ordering relation is defined for complex numbers\");return Sk.builtin.NotImplemented.NotImplemented$}return b(function(a,b,d,e){a=a==d&&b==e;return\"Eq\"===c?a:!a},!0).call(this,a)},$r(){{var a,\r\nb;let e=a=\"\";var c=this.real;var d=this.imag;if(b=0===c)b=1==(c?0>c?-1:1:0>1/c?-1:1);b?(c=\"\",b=h(d,\"g\",null,0,null)):(c=a=h(c,\"g\",null,0,null),b=h(d,\"g\",null,h.Py_DTSF_SIGN,null),0===d&&-Infinity===1/d&&b&&\"-\"!==b[0]&&(b=\"-\"+b),a=\"(\",e=\")\");d=new Sk.builtin.str(\"\"+a+c+b+\"j\"+e)}return d},nb$int(){throw new Sk.builtin.TypeError(\"can't convert complex to int\");},nb$long(){throw new Sk.builtin.TypeError(\"can't convert complex to long\");},nb$float(){throw new Sk.builtin.TypeError(\"can't convert complex to float\");\r\n},nb$positive(){return new Sk.builtin.complex(this.real,this.imag)},nb$negative(){return new Sk.builtin.complex(-this.real,-this.imag)},nb$bool(){return this.real||this.imag},nb$add:b((a,b,c,d)=>new Sk.builtin.complex(a+c,b+d)),nb$subtract:b((a,b,c,d)=>new Sk.builtin.complex(a-c,b-d)),nb$reflected_subtract:b((a,b,c,d)=>new Sk.builtin.complex(c-a,d-b)),nb$multiply:b((a,b,c,d)=>new Sk.builtin.complex(c*a-d*b,a*d+b*c)),nb$divide:b(e),nb$reflected_divide:b((a,b,c,d)=>e(c,d,a,b)),nb$floor_divide(a){throw new Sk.builtin.TypeError(\"can't take floor of complex number.\");\r\n},nb$reflected_floor_divide(a){throw new Sk.builtin.TypeError(\"can't take floor of complex number.\");},nb$remainder(a){throw new Sk.builtin.TypeError(\"can't mod complex numbers.\");},nb$reflected_remainder(a){throw new Sk.builtin.TypeError(\"can't mod complex numbers.\");},nb$divmod(a){throw new Sk.builtin.TypeError(\"can't take floor or mod of complex number.\");},nb$power(a,b){if(null!=b&&!Sk.builtin.checkNone(b))throw new Sk.builtin.ValueError(\"complex modulo\");return k.call(this,a)},nb$abs(){var a=\r\nthis.real;const b=this.imag;if(!Number.isFinite(a)||!Number.isFinite(b))return Infinity===a||-Infinity===a?new Sk.builtin.float_(Math.abs(a)):Infinity===b||-Infinity===b?new Sk.builtin.float_(Math.abs(b)):new Sk.builtin.float_(NaN);a=Math.hypot(a,b);if(!Number.isFinite(a))throw new Sk.builtin.OverflowError(\"absolute value too large\");return new Sk.builtin.float_(a)}},getsets:{real:{$get(){return new Sk.builtin.float_(this.real)},$doc:\"the real part of a complex number\"},imag:{$get(){return new Sk.builtin.float_(this.imag)},\r\n$doc:\"the imaginary part of a complex number\"}},methods:{conjugate:{$meth(){return new Sk.builtin.complex(this.real,-this.imag)},$flags:{NoArgs:!0},$textsig:null,$doc:\"complex.conjugate() -> complex\\n\\nReturn the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.float_(this.real),new Sk.builtin.float_(this.imag)])},$flags:{NoArgs:!0},$textsig:null,$doc:Sk.builtin.none.none$},__format__:{$meth(a){if(Sk.builtin.checkString(a))throw new Sk.builtin.NotImplementedError(\"__format__ is not implemented for complex type.\");\r\nthrow new Sk.builtin.TypeError(\"__format__ requires str\");},$flags:{OneArg:!0},$textsig:null,$doc:\"complex.__format__() -> str\\n\\nConvert to a string according to format_spec.\"}}});Sk.exportSymbol(\"Sk.builtin.complex\",Sk.builtin.complex);const d=Sk.builtin.checkComplex,g=/_[eE]|[eE]_|\\._|_\\.|[+-]_|_j|j_/,n=/_(?=[^_])/g;Sk.builtin.complex.complex_subtype_from_string=function(a,b){b=b||Sk.builtin.complex.prototype;var d=0,e=0,f=!1;if(Sk.builtin.checkString(a))a=Sk.ffi.remapToJs(a);else if(\"string\"!==\r\ntypeof a)throw new TypeError(\"provided unsupported string-alike argument\");if(-1!==a.indexOf(\"\\x00\")||0===a.length||\"\"===a)throw new Sk.builtin.ValueError(\"complex() arg is a malformed string\");var h=0;a=a.replace(/inf|infinity/gi,\"Infinity\");for(a=a.replace(/nan/gi,\"NaN\");\" \"===a[h];)h++;if(\"(\"===a[h])for(f=!0,h++;\" \"===a[h];)h++;if(-1!==a.indexOf(\"_\")){if(g.test(a))throw new Sk.builtin.ValueError(\"could not convert string to complex: '\"+a+\"'\");a=a.charAt(0)+a.substring(1).replace(n,\"\")}var k=/^(?:[+-]?(?:(?:(?:\\d*\\.\\d+)|(?:\\d+\\.?))(?:[eE][+-]?\\d+)?|NaN|Infinity))/;\r\nvar l=a.substr(h);var p=l.match(k);if(null!==p)if(h+=p[0].length,\"j\"===a[h]||\"J\"===a[h])e=parseFloat(p[0]),h++;else if(\"+\"===a[h]||\"-\"===a[h]){d=parseFloat(p[0]);p=a.substr(h).match(k);null!==p?(e=parseFloat(p[0]),h+=p[0].length):(e=\"+\"===a[h]?1:-1,h++);if(\"j\"!==a[h]&&\"J\"!==a[h])throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");h++}else d=parseFloat(p[0]);else p=p=l.match(/^([+-]?[jJ])/),null!==p&&(e=1===p[0].length?1:\"+\"===p[0][0]?1:-1,h+=p[0].length);for(;\" \"===a[h];)h++;if(f){if(\")\"!==\r\na[h])throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");for(h++;\" \"===a[h];)h++}if(a.length!==h)throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");return c(d,e,b)};const k=b((a,b,c,d)=>{const g=c|0;return 0===d&&c===g?(100g?a=f(a,b,g,0):0a)throw new Sk.builtin.TypeError(\"length should not be negative\");const {start:c,stop:b,step:e}=this.slice$indices(a);return new Sk.builtin.tuple([new Sk.builtin.int_(c),new Sk.builtin.int_(b),new Sk.builtin.int_(e)])},$doc:\"S.indices(len) -> (start, stop, stride)\\n\\nAssuming a sequence of length len, calculate the start and stop\\nindices, and the stride length of the extended slice described by\\nS. Out of bounds indices are clipped in a manner consistent with the\\nhandling of normal slices.\",\r\n$textsig:null,$flags:{OneArg:!0}}},proto:{slice$as_indices(a){let c;var b=a?a=>Sk.misceval.asIndexSized(a,null,\"slice indices must be integers or None or have an __index__ method\"):a=>Sk.misceval.asIndexOrThrow(a,\"slice indices must be integers or None or have an __index__ method\");if(Sk.builtin.checkNone(this.step))c=1;else if(c=b(this.step),0===c)throw new Sk.builtin.ValueError(\"slice step cannot be zero\");a=Sk.builtin.checkNone(this.start)?null:b(this.start);b=Sk.builtin.checkNone(this.stop)?null:\r\nb(this.stop);return{start:a,stop:b,step:c}},$wrt(a,c,b,e,f){f=f?b=>JSBI.__isBigInt(b)?JSBI.add(b,JSBI.BigInt(a)):b+a:b=>b+a;0c&&(c=f(c),0>c&&(c=0)),null===b?b=a:b>a?b=a:0>b&&(b=f(b))):(null===c?c=a-1:c>=a?c=a-1:0>c&&(c=f(c)),null===b?b=-1:0>b&&(b=f(b),0>b&&(b=-1)));return{start:c,stop:b,step:e}},slice$indices(a,c){let {start:b,stop:e,step:f}=this.slice$as_indices(!0,c);return this.$wrt(a,b,e,f,c)},sssiter$(a,c){let {start:b,stop:e,step:f}=this.slice$indices(a,!0);if(0e;a+=f)c(a)}},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.slice.startEnd$wrt=function(a,c,b){a=a.sq$length();void 0===c||Sk.builtin.checkNone(c)?c=0:(c=Sk.misceval.asIndexSized(c,null,\"slice indices must be integers or have an __index__ method\"),0>c&&(c+=a,0>c&&(c=0)));void 0===b||Sk.builtin.checkNone(b)?b=a:(b=Sk.misceval.asIndexSized(b,null,\"slice indices must be integers or have an __index__ method\"),0>b?(b+=a,0>b&&(b=0)):b>a&&(b=a));return{start:c,end:b}}},function(m,\r\nq){function a(a){return function(b){return Sk.builtin.checkAnySet(b)?a.call(this,b):Sk.builtin.NotImplemented.NotImplemented$}}function c(a){a instanceof Sk.builtin.set&&a.tp$hash===Sk.builtin.none.none$&&(a=new Sk.builtin.frozenset(Sk.misceval.arrayFromIterable(a)));return a}m={};Sk.builtin.set=Sk.abstr.buildNativeClass(\"set\",{constructor:function(a){void 0===a?a=[]:Array.isArray(a)||(a=Sk.misceval.arrayFromIterable(a));Sk.asserts.assert(this instanceof Sk.builtin.set,\"Bad call to set - must be called with an Array and 'new'\");\r\nconst b=[];for(let c=0;c new empty set object\\nset(iterable) -> new set object\\n\\nBuild an unordered collection of unique elements.\",tp$init(a,b){Sk.abstr.checkNoKwargs(\"set\",b);Sk.abstr.checkArgsLen(\"set\",a,0,1);this.set$clear();return(a=a[0])&&this.set$update(a)},tp$new:Sk.generic.new,\r\n$r(){if(this.in$repr)return new Sk.builtin.str(Sk.abstr.typeName(this)+\"(...)\");this.in$repr=!0;const a=this.sk$asarray().map(a=>Sk.misceval.objectRepr(a));this.in$repr=!1;return Sk.__future__.python3?0===a.length?new Sk.builtin.str(Sk.abstr.typeName(this)+\"()\"):this.ob$type!==Sk.builtin.set?new Sk.builtin.str(Sk.abstr.typeName(this)+\"({\"+a.join(\", \")+\"})\"):new Sk.builtin.str(\"{\"+a.join(\", \")+\"}\"):new Sk.builtin.str(Sk.abstr.typeName(this)+\"([\"+a.join(\", \")+\"])\")},tp$iter(){return new b(this)},tp$richcompare(a,\r\nb){if(!Sk.builtin.checkAnySet(a))return Sk.builtin.NotImplemented.NotImplemented$;switch(b){case \"NotEq\":case \"Eq\":return a=this===a?!0:this.get$size()!==a.get$size()?!1:Sk.misceval.isTrue(this.set$issubset(a)),\"Eq\"===b?a:!a;case \"LtE\":return this===a||Sk.misceval.isTrue(this.set$issubset(a));case \"GtE\":return this===a||Sk.misceval.isTrue(a.set$issubset(this));case \"Lt\":return this.get$size()a.get$size()&&Sk.misceval.isTrue(a.set$issubset(this))}},\r\nnb$subtract:a(function(a){return this.difference.$meth.call(this,a)}),nb$and:a(function(a){return this.intersection.$meth.call(this,a)}),nb$or:a(function(a){return this.union.$meth.call(this,a)}),nb$xor:a(function(a){return this.symmetric_difference.$meth.call(this,a)}),nb$inplace_subtract:a(function(a){a===this&&(a=a.set$copy());return Sk.misceval.chain(this.difference_update.$meth.call(this,a),()=>this)}),nb$inplace_and:a(function(a){return Sk.misceval.chain(this.intersection_update.$meth.call(this,\r\na),()=>this)}),nb$inplace_or:a(function(a){return Sk.misceval.chain(this.update.$meth.call(this,a),()=>this)}),nb$inplace_xor:a(function(a){a===this&&(a=a.set$copy());return Sk.misceval.chain(this.symmetric_difference_update.$meth.call(this,a),()=>this)}),sq$length(){return this.get$size()},sq$contains(a){a=c(a);return this.v.sq$contains(a)}},methods:{add:{$meth(a){this.set$add(a);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Add an element to a set.\\n\\nThis has no effect if the element is already present.\"},\r\nclear:{$meth(){this.set$clear();return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove all elements from this set.\"},copy:{$meth(){return this.set$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:\"Return a shallow copy of a set.\"},discard:{$meth(a){a=c(a);this.set$discard(a);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Remove an element from a set if it is a member.\\n\\nIf the element is not a member, do nothing.\"},difference:{$meth(...a){const b=this.set$copy();\r\nreturn Sk.misceval.chain(Sk.misceval.iterArray(a,a=>b.set$difference_update(a)),()=>b)},$flags:{MinArgs:0},$textsig:null,$doc:\"Return the difference of two or more sets as a new set.\\n\\n(i.e. all elements that are in this set but not the others.)\"},difference_update:{$meth(...a){return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>this.set$difference_update(a)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:\"Remove all elements of another set from this set.\"},intersection:{$meth(...a){return this.set$intersection_multi(...a)},\r\n$flags:{MinArgs:0},$textsig:null,$doc:\"Return the intersection of two sets as a new set.\\n\\n(i.e. all elements that are in both sets.)\"},intersection_update:{$meth(...a){return Sk.misceval.chain(this.set$intersection_multi(...a),a=>{this.swap$bodies(a);return Sk.builtin.none.none$})},$flags:{MinArgs:0},$textsig:null,$doc:\"Update a set with the intersection of itself and another.\"},isdisjoint:{$meth(a){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{if(this.sq$contains(a))return new Sk.misceval.Break(Sk.builtin.bool.false$)}),\r\na=>a||Sk.builtin.bool.true$)},$flags:{OneArg:!0},$textsig:null,$doc:\"Return True if two sets have a null intersection.\"},issubset:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a));return Sk.misceval.chain(a,a=>this.set$issubset(a))},$flags:{OneArg:!0},$textsig:null,$doc:\"Report whether another set contains this set.\"},issuperset:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a));return Sk.misceval.chain(a,a=>a.set$issubset(this))},$flags:{OneArg:!0},$textsig:null,\r\n$doc:\"Report whether this set contains another set.\"},pop:{$meth(){if(0===this.get$size())throw new Sk.builtin.KeyError(\"pop from an empty set\");return Sk.misceval.callsimArray(this.v.popitem,[this.v]).v[0]},$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove and return an arbitrary set element.\\nRaises KeyError if the set is empty.\"},remove:{$meth(a){const b=c(a);if(this.v.mp$lookup(b))return this.v.mp$ass_subscript(b),Sk.builtin.none.none$;throw new Sk.builtin.KeyError(a);},$flags:{OneArg:!0},$textsig:null,\r\n$doc:\"Remove an element from a set; it must be a member.\\n\\nIf the element is not a member, raise a KeyError.\"},symmetric_difference:{$meth(a){let b;return Sk.misceval.chain(this.set$make_basetype(a),a=>{b=a;return b.set$symmetric_diff_update(this)},()=>b)},$flags:{OneArg:!0},$textsig:null,$doc:\"Return the symmetric difference of two sets as a new set.\\n\\n(i.e. all elements that are in exactly one of the sets.)\"},symmetric_difference_update:{$meth(a){Sk.builtin.checkAnySet(a)||(a=this.set$make_basetype(a));\r\nreturn Sk.misceval.chain(a,a=>this.set$symmetric_diff_update(a),()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:null,$doc:\"Update a set with the symmetric difference of itself and another.\"},union:{$meth(...a){const b=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>b.set$update(a)),()=>b)},$flags:{MinArgs:0},$textsig:null,$doc:\"Return the union of sets as a new set.\\n\\n(i.e. all elements that are in either set.)\"},update:{$meth(...a){return Sk.misceval.chain(Sk.misceval.iterArray(a,\r\na=>this.set$update(a)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:\"Update a set with the union of itself and others.\"}},proto:Object.assign(m,{sk$asarray(){return this.v.sk$asarray()},get$size(){return this.v.sq$length()},set$add(a){this.v.mp$ass_subscript(a,!0)},set$make_basetype(a){return Sk.misceval.chain(Sk.misceval.arrayFromIterable(a,!0),a=>new this.sk$builtinBase(a))},set$discard(a){return this.v.pop$item(a)},set$clear(){this.v=new Sk.builtin.dict([])},set$copy(){const a=\r\nnew this.sk$builtinBase;a.v=this.v.dict$copy();return a},set$difference_update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.set$discard(a)})},set$intersection(a){const b=new this.sk$builtinBase;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.sq$contains(a)&&b.set$add(a)}),()=>b)},set$intersection_multi(...a){if(!a.length)return this.set$copy();let b=this;return Sk.misceval.chain(Sk.misceval.iterArray(a,a=>Sk.misceval.chain(b.set$intersection(a),a=>{b=a})),()=>b)},\r\nset$issubset(a){const b=this.get$size(),c=a.get$size();if(b>c)return Sk.builtin.bool.false$;for(let b=this.tp$iter(),c=b.tp$iternext();void 0!==c;c=b.tp$iternext())if(!a.sq$contains(c))return Sk.builtin.bool.false$;return Sk.builtin.bool.true$},set$symmetric_diff_update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{void 0===this.set$discard(a)&&this.set$add(a)})},set$update(a){return Sk.misceval.iterFor(Sk.abstr.iter(a),a=>{this.set$add(a)})},swap$bodies(a){this.v=a.v}})});Sk.exportSymbol(\"Sk.builtin.set\",\r\nSk.builtin.set);q=Sk.builtin.set.prototype;Sk.builtin.frozenset=Sk.abstr.buildNativeClass(\"frozenset\",{constructor:function(a){void 0===a&&(a=[]);Sk.asserts.assert(Array.isArray(a)&&this instanceof Sk.builtin.frozenset,\"bad call to frozen set - must be called with an Array and 'new'\");const b=[];for(let c=0;c empty frozenset object\\nfrozenset(iterable) -> frozenset object\\n\\nBuild an immutable unordered collection of unique elements.\",\r\ntp$hash(){let a=1927868237;const b=this.sk$asarray();a*=b.length+1;for(let c=0;ca.length?new Sk.builtin.frozenset(a):\r\nSk.builtin.frozenset.$emptyset)},$r:q.$r,tp$iter:q.tp$iter,tp$richcompare:q.tp$richcompare,nb$subtract:q.nb$subtract,nb$and:q.nb$and,nb$or:q.nb$or,nb$xor:q.nb$xor,sq$length:q.sq$length,sq$contains:q.sq$contains},methods:{copy:Object.assign({},q.copy.d$def,{$meth(){return this.constructor===this.sk$builtinBase?this:new Sk.builtin.frozenset(this.sk$asarray())}}),difference:q.difference.d$def,intersection:q.intersection.d$def,isdisjoint:q.isdisjoint.d$def,issubset:q.issubset.d$def,issuperset:q.issuperset.d$def,\r\nsymmetric_difference:q.symmetric_difference.d$def,union:q.union.d$def},proto:Object.assign({$subtype_new(a,b){const c=new this.constructor;return Sk.misceval.chain(Sk.builtin.frozenset.prototype.tp$new(a),a=>{c.v=a.v;return c})}},m)});Sk.builtin.frozenset.$emptyset=Object.create(Sk.builtin.frozenset.prototype,{v:{value:new Sk.builtin.dict([]),enumerable:!0},in$repr:{value:!1,enumerable:!0}});Sk.exportSymbol(\"Sk.builtin.frozenset\",Sk.builtin.frozenset);var b=Sk.abstr.buildIteratorClass(\"set_iterator\",\r\n{constructor:function(a){this.$index=0;this.$seq=a.sk$asarray();this.$orig=a},iternext:Sk.generic.iterNextWithArrayCheckSize,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(m,q){Sk.builtin.print=function(a,c){let [b,e,f]=Sk.abstr.copyKeywordsToNamedArgs(\"print\",[\"sep\",\"end\",\"file\",\"flush\"],[],c);if(void 0===b||Sk.builtin.checkNone(b))b=\" \";else if(Sk.builtin.checkString(b))b=b.$jsstr();else throw new Sk.builtin.TypeError(\"sep must be None or a string, not \"+\r\nSk.abstr.typeName(b));if(void 0===e||Sk.builtin.checkNone(e))e=\"\\n\";else if(Sk.builtin.checkString(e))e=e.$jsstr();else throw new Sk.builtin.TypeError(\"end must be None or a string, not \"+Sk.abstr.typeName(e));let l;if(void 0!==f&&!Sk.builtin.checkNone(f)&&(l=Sk.abstr.lookupSpecial(f,Sk.builtin.str.$write),void 0===l))throw new Sk.builtin.AttributeError(\"'\"+Sk.abstr.typeName(f)+\"' object has no attribute 'write'\");const h=new Sk.builtin.str(a.map(a=>(new Sk.builtin.str(a)).toString()).join(b)+e);\r\nif(void 0!==l)Sk.misceval.callsimArray(l,[h]);else return Sk.misceval.chain(Sk.importModule(\"sys\",!1,!0),a=>(l=Sk.abstr.lookupSpecial(a.$d.stdout,Sk.builtin.str.$write))&&Sk.misceval.callsimOrSuspendArray(l,[h]))};Sk.builtin.print.co_fastcall=1},function(m,q){Sk.builtin.module=Sk.abstr.buildNativeClass(\"module\",{constructor:function(){this.$d={}},slots:{tp$doc:\"Create a module object.\\n\\nThe name must be a string; the optional doc argument can have any type.\",tp$getattr(a,c){var b=this.$d[a.$mangled];\r\nif(void 0!==b)return b;b=this.ob$type.$typeLookup(a);if(void 0!==b){const a=b.tp$descr_get;return a?a.call(b,this,this.ob$type,c):b}const e=this.$d.__getattr__;if(void 0!==e)return b=Sk.misceval.tryCatch(()=>Sk.misceval.callsimOrSuspendArray(e,[a]),a=>{if(!(a instanceof Sk.builtin.AttributeError))throw a;}),c?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},tp$setattr:Sk.generic.setAttr,tp$new:Sk.generic.new,tp$init(a,c){const [b,e]=Sk.abstr.copyKeywordsToNamedArgs(\"module\",[\"name\",\"doc\"],a,c,[Sk.builtin.none.none$]);\r\nSk.builtin.pyCheckType(\"module\",\"string\",b);this.init$dict(b,e)},$r(){let a=this.get$name();if(void 0!==a){var c=this.get$mod_reprf();if(void 0!==c)return Sk.misceval.callsimOrSuspendArray(c,[this])}a=void 0===a?\"'?'\":a;c=this.from$file();c=void 0===c?this.empty_or$loader():c;return new Sk.builtin.str(\"\")}},getsets:{__dict__:{$get(){return new Sk.builtin.mappingproxy(this.$d)}}},methods:{__dir__:{$meth(){const a=this.tp$getattr(Sk.builtin.str.$dict);if(!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError(\"__dict__ is not a dictionary\");\r\nconst c=a.mp$lookup(Sk.builtin.str.$dir);return void 0!==c?Sk.misceval.callsimOrSuspendArray(c,[]):new Sk.builtin.list(Sk.misceval.arrayFromIterable(a))},$flags:{NoArgs:!0},$doc:\"__dir__() -> list\\nspecialized dir() implementation\"}},proto:{init$dict(a,c){this.$d.__name__=a;this.$d.__doc__=c;this.$d.__package__=Sk.builtin.none.none$;this.$d.__spec__=Sk.builtin.none.none$;this.$d.__loader__=Sk.builtin.none.none$},sk$attrError(){const a=this.get$name();return void 0===a?\"module\":\"module \"+a},get$name(){const a=\r\nthis.tp$getattr(Sk.builtin.str.$name);return a&&Sk.misceval.objectRepr(a)},from$file(){const a=this.tp$getattr(Sk.builtin.str.$file);return a&&\" from \"+Sk.misceval.objectRepr(a)},empty_or$loader(){if(this.$js&&this.$js.includes(\"$builtinmodule\"))return\" (built-in)\";const a=this.tp$getattr(Sk.builtin.str.$loader);return void 0===a||Sk.builtin.checkNone(a)?\"\":\" (\"+Sk.misceval.objectRepr(a)+\")\"},get$mod_reprf(){const a=this.tp$getattr(Sk.builtin.str.$loader);return a&&a.tp$getattr(this.str$mod_repr)},\r\nstr$mod_repr:new Sk.builtin.str(\"module_repr\")}});Sk.exportSymbol(\"Sk.builtin.module\",Sk.builtin.module)},function(m,q){Sk.builtin.structseq_types={};Sk.builtin.make_structseq=function(a,c,b,e){const f=a+\".\"+c,l=[];a=[];for(let c in b)l.push(c),a.push(b[c]);b={};for(let c=0;c\")}},iternext(a,c){var b=this;this.gi$running=!0;void 0===c&&(c=Sk.builtin.none.none$);this.gi$sentvalue=c;c=[this];this.func_closure&&\r\nc.push(this.func_closure);return function l(c){if(c instanceof Sk.misceval.Suspension){if(a)return new Sk.misceval.Suspension(l,c);c=Sk.misceval.retryOptionalSuspensionOrThrow(c)}b.gi$running=!1;Sk.asserts.assert(void 0!==c);if(c!==Sk.builtin.none.none$)return b.gi$resumeat=c[0],c=c[1]}(this.func_code.apply(this.func_globals,c))},methods:{send:{$meth(a){return this.tp$iternext(!0,a)},$flags:{OneArg:!0},$doc:\"send(arg) -> send 'arg' into generator,\\nreturn next yielded value or raise StopIteration.\"}}});\r\nSk.exportSymbol(\"Sk.builtin.generator\",Sk.builtin.generator);Sk.builtin.makeGenerator=function(a,c){var b,e=new Sk.builtin.generator(null,null,null);e.tp$iternext=a;for(b in c)c.hasOwnProperty(b)&&(e[b]=c[b]);return e};Sk.exportSymbol(\"Sk.builtin.makeGenerator\",Sk.builtin.makeGenerator)},function(m,q){Sk.builtin.file=function(a,c,b){var e;if(!(this instanceof Sk.builtin.file))return new Sk.builtin.file(a,c,b);this.mode=c;this.name=Sk.ffi.remapToJs(a);this.closed=!1;if(\"/dev/stdout\"===this.name)this.data$=\r\nSk.builtin.none.none$,this.fileno=1;else if(\"/dev/stdin\"===this.name)this.fileno=0;else if(\"/dev/stderr\"===this.name)this.fileno=2;else{if(Sk.inBrowser)if(this.fileno=10,b=document.getElementById(a.v),null==b)if(\"w\"==c.v||\"a\"==c.v)this.data$=\"\";else throw new Sk.builtin.IOError(\"[Errno 2] No such file or directory: '\"+a.v+\"'\");else\"textarea\"==b.nodeName.toLowerCase()?this.data$=b.value:this.data$=b.textContent;else this.fileno=11,this.data$=Sk.read(a.v);this.lineList=this.data$.split(\"\\n\");this.lineList=\r\nthis.lineList.slice(0,-1);for(e in this.lineList)this.lineList[e]+=\"\\n\";this.currentLine=0}this.pos$=0;Sk.fileopen&&10<=this.fileno&&Sk.fileopen(this);return this};Sk.abstr.setUpInheritance(\"file\",Sk.builtin.file,Sk.builtin.object);Sk.abstr.setUpBuiltinMro(Sk.builtin.file);Sk.builtin.file.prototype.$r=function(){return new Sk.builtin.str(\"<\"+(this.closed?\"closed\":\"open\")+\"file '\"+this.name+\"', mode '\"+Sk.ffi.remapToJs(this.mode)+\"'>\")};Sk.builtin.file.prototype.tp$iter=function(){var a={tp$iter:function(){return a},\r\n$obj:this,$index:this.currentLine,$lines:this.lineList,tp$iternext:function(){if(!(a.$index>=a.$lines.length))return new Sk.builtin.str(a.$lines[a.$index++])}};return a};Sk.abstr.setUpSlots(Sk.builtin.file);Sk.builtin.file.prototype.__enter__=new Sk.builtin.func(function(a){return a});Sk.builtin.file.prototype.__exit__=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.file.prototype.close,[a])});Sk.builtin.file.prototype.close=new Sk.builtin.func(function(a){a.closed=!0;return Sk.builtin.none.none$});\r\nSk.builtin.file.prototype.flush=new Sk.builtin.func(function(a){});Sk.builtin.file.prototype.fileno=new Sk.builtin.func(function(a){return this.fileno});Sk.builtin.file.prototype.isatty=new Sk.builtin.func(function(a){return!1});Sk.builtin.file.prototype.read=new Sk.builtin.func(function(a,c){var b=a.data$.length;if(a.closed)throw new Sk.builtin.ValueError(\"I/O operation on closed file\");var e=void 0===c?b:Sk.ffi.remapToJs(c);e=new Sk.builtin.str(a.data$.substr(a.pos$,e));a.pos$=void 0===c?b:a.pos$+\r\nSk.ffi.remapToJs(c);a.pos$>=b&&(a.pos$=b);return e});Sk.builtin.file.$readline=function(a,c,b){if(0===a.fileno){a=Sk.ffi.remapToJs(b);a=Sk.inputfun(a?a:\"\");if(a instanceof Promise||a&&\"function\"===typeof a.then){var e=new Sk.misceval.Suspension;e.resume=function(){if(e.data.error)throw e.data.error;return new Sk.builtin.str(e.data.result)};e.data={type:\"Sk.promise\",promise:a};return e}return new Sk.builtin.str(a)}c=\"\";a.currentLine{b=Sk.ffi.remapToJs(a);e[b]=Sk.ffi.remapToJs(c)});return e}if(a instanceof Sk.builtin.list||a instanceof Sk.builtin.tuple){e=[];for(c=0;cb;f+=e)d.push(new Sk.builtin.int_(f));else{a=f=JSBI.BigInt(a);e=JSBI.BigInt(e);b=JSBI.BigInt(b);if(JSBI.greaterThan(e,JSBI.__ZERO))for(;JSBI.lessThan(f,b);)d.push(new Sk.builtin.int_(c(f))),f=JSBI.add(f,e);else for(;JSBI.greaterThan(f,b);)d.push(new Sk.builtin.int_(c(f))),f=JSBI.add(f,e);a=c(a);e=c(e);b=c(b)}return new Sk.builtin.range_(a,b,e,d)}function c(a){return JSBI.lessThan(a,JSBI.__MAX_SAFE)&&\r\nJSBI.greaterThan(a,JSBI.__MIN_SAFE)?JSBI.toNumber(a):a}Sk.builtin.range_=Sk.abstr.buildNativeClass(\"range\",{constructor:function(a,b,c,d){this.start=a;this.stop=b;this.step=c;this.v=d},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:\"range(stop) -> range object\\nrange(start, stop[, step]) -> range object\\n\\nReturn an object that produces a sequence of integers from start (inclusive)\\nto stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\\nstart defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\\nThese are exactly the valid indices for a list of 4 elements.\\nWhen step is given, it specifies the increment (or decrement).\",\r\ntp$new(b,c){Sk.abstr.checkNoKwargs(\"range\",c);Sk.abstr.checkArgsLen(\"range\",b,1,3);return a(b[0],b[1],b[2])},$r(){let a=\"range(\"+this.start+\", \"+this.stop;1!=this.step&&(a+=\", \"+this.step);return new Sk.builtin.str(a+\")\")},tp$richcompare(a,b){if(\"Eq\"!==b&&\"NotEq\"!==b||a.ob$type!==Sk.builtin.range_)return Sk.builtin.NotImplemented.NotImplemented$;a=new Sk.builtin.list(a.v);return(new Sk.builtin.list(this.v)).tp$richcompare(a,b)},tp$iter(){return new b(this)},nb$bool(){return 0!==this.v.length},sq$contains(a){const b=\r\nthis.v;for(let c=0;ca&&(a=this.v.length+a);if(0>a||a>=this.v.length)throw new Sk.builtin.IndexError(\"range object index out of range\");return this.v[a]}if(a.constructor===Sk.builtin.slice){const b=[],c=this.v;a.sssiter$(c.length,a=>{b.push(c[a])});let {start:d,stop:e,step:f}=a.slice$indices(c.length);d=Sk.misceval.asIndex(c[d])||\r\nthis.start;e=Sk.misceval.asIndex(c[e])||this.stop;f=\"number\"===typeof this.step?f*this.step:JSBI.multiply(this.step,JSBI.BigInt(f));return new Sk.builtin.range_(d,e,f,b)}throw new Sk.builtin.TypeError(\"range indices must be integers or slices, not \"+Sk.abstr.typeName(a));}},getsets:{start:{$get(){return new Sk.builtin.int_(this.start)}},step:{$get(){return new Sk.builtin.int_(this.step)}},stop:{$get(){return new Sk.builtin.int_(this.stop)}}},methods:{__reversed__:{$meth(){return new e(this)},$flags:{NoArgs:!0},\r\n$textsig:null,$doc:\"Return a reverse iterator.\"},count:{$meth(a){let b=0;for(let c=0;c integer -- return number of occurrences of value\"},index:{$meth(a){for(let b=0;b integer -- return index of value.\\nRaise ValueError if the value is not present.\"}},proto:{sk$asarray(){return this.v.slice(0)}},flags:{sk$acceptable_as_base_class:!1}});var b=Sk.abstr.buildIteratorClass(\"range_iterator\",{constructor:function(a){this.$index=0;this.$seq=a.v},iternext(){return this.$seq[this.$index++]},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),\r\ne=Sk.abstr.buildIteratorClass(\"range_reverseiterator\",{constructor:function(a){this.$seq=a.v;this.$index=this.$seq.length-1},iternext(){return this.$seq[this.$index--]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.range=Sk.builtin.xrange=function(b,c,e){b=a(b,c,e);return new Sk.builtin.list(b.v)}},function(m,q){Sk.builtin.enumerate=Sk.abstr.buildIteratorClass(\"enumerate\",{constructor:function(a,c){if(!(this instanceof Sk.builtin.enumerate))throw TypeError(\"Failed to construct 'enumerate': Please use the 'new' operator\");\r\nthis.$iterable=a;this.$index=c;return this},iternext(a){const c=Sk.misceval.chain(this.$iterable.tp$iternext(a),a=>{if(void 0!==a)return new Sk.builtin.tuple([new Sk.builtin.int_(this.$index++),a])});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:\"Return an enumerate object.\\n\\n iterable\\n an object supporting iteration\\n\\nThe enumerate object yields pairs containing a count (from start, which\\ndefaults to zero) and a value yielded by the iterable argument.\\n\\nenumerate is useful for obtaining an indexed list:\\n (0, seq[0]), (1, seq[1]), (2, seq[2]), ...\",\r\ntp$new(a,c){let [b,e]=Sk.abstr.copyKeywordsToNamedArgs(\"enumerate\",[\"iterable\",\"start\"],a,c,[new Sk.builtin.int_(0)]);b=Sk.abstr.iter(b);e=Sk.misceval.asIndexOrThrow(e);if(this===Sk.builtin.enumerate.prototype)return new Sk.builtin.enumerate(b,e);a=new this.constructor;Sk.builtin.enumerate.call(a,b,e);return a}}});Sk.exportSymbol(\"Sk.builtin.enumerate\",Sk.builtin.enumerate)},function(m,q){Sk.builtin.filter_=Sk.abstr.buildIteratorClass(\"filter\",{constructor:function(a,c){this.$func=a;this.$iterable=\r\nc},iternext(a){const c=Sk.misceval.iterFor(this.$iterable,a=>Sk.misceval.chain(this.check$filter(a),a=>a?new Sk.misceval.Break(a):void 0));return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:\"Return an iterator yielding those items of iterable for which function(item)\\nis true. If function is None, return the items that are true.\",tp$new(a,c){let [b,e]=Sk.abstr.copyKeywordsToNamedArgs(\"filter\",[\"predicate\",\"iterable\"],a,c,[]);b=Sk.builtin.checkNone(b)?null:b;e=Sk.abstr.iter(e);\r\nif(this===Sk.builtin.filter_.prototype)return new Sk.builtin.filter_(b,e);a=new this.constructor;Sk.builtin.filter_.call(a,b,e);return a}},proto:{check$filter(a){let c;c=null===this.$func?a:Sk.misceval.callsimOrSuspendArray(this.$func,[a]);return Sk.misceval.chain(c,b=>Sk.misceval.isTrue(b)?a:void 0)}}});Sk.exportSymbol(\"Sk.builtin.filter_\",Sk.builtin.filter_)},function(m,q){Sk.builtin.map_=Sk.abstr.buildIteratorClass(\"map\",{constructor:function(a,c){this.$func=a;this.$iters=c},iternext(a){const c=\r\n[],b=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,b=>Sk.misceval.chain(b.tp$iternext(a),a=>{if(void 0===a)return new Sk.misceval.Break(!0);c.push(a)})),a=>a?void 0:Sk.misceval.callsimOrSuspendArray(this.$func,c));return a?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},slots:{tp$doc:\"map(func, *iterables) --\\x3e map object\\n\\nMake an iterator that computes the function using arguments from\\neach of the iterables. Stops when the shortest iterable is exhausted.\",tp$new(a,c){this===Sk.builtin.map_.prototype&&\r\nSk.abstr.checkNoKwargs(\"map\",c);Sk.abstr.checkArgsLen(\"map\",a,2);c=a[0];const b=[];for(let c=1;cthis.$idx)){var c=\r\nSk.misceval.tryCatch(()=>Sk.abstr.objectGetItem(this.$seq,new Sk.builtin.int_(this.$idx--),a),a=>{if(a instanceof Sk.builtin.IndexError)this.$idx=-1;else throw a;});return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)}},slots:{tp$doc:\"Return a reverse iterator over the values of the given sequence.\",tp$new(a,c){this===Sk.builtin.reversed.prototype&&Sk.abstr.checkNoKwargs(\"reversed\",c);Sk.abstr.checkArgsLen(\"reversed\",a,1,1);a=a[0];c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$reversed);if(void 0!==\r\nc)return Sk.misceval.callsimArray(c,[]);if(!Sk.builtin.checkSequence(a)||void 0===Sk.abstr.lookupSpecial(a,Sk.builtin.str.$len))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object is not a sequence\");if(this===Sk.builtin.reversed.prototype)return new Sk.builtin.reversed(a);c=new this.constructor;Sk.builtin.reversed.call(c,a);return c}},methods:{__length_hint__:{$meth:function(){return 0<=this.$idx?new Sk.builtin.int_(this.$idx):new Sk.builtin.int_(0)},$flags:{NoArgs:!0}}}})},function(m,\r\nq){Sk.builtin.zip_=Sk.abstr.buildIteratorClass(\"zip\",{constructor:function(a){this.$iters=a;0===a.length&&(this.tp$iternext=()=>{})},iternext(a){const c=[],b=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,b=>Sk.misceval.chain(b.tp$iternext(a),a=>{if(void 0===a)return new Sk.misceval.Break(!0);c.push(a)})),a=>a?void 0:new Sk.builtin.tuple(c));return a?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},slots:{tp$doc:\"zip(iter1 [,iter2 [...]]) --\\x3e zip object\\n\\nReturn a zip object whose .__next__() method returns a tuple where\\nthe i-th element comes from the i-th iterable argument. The .__next__()\\nmethod continues until the shortest iterable in the argument sequence\\nis exhausted and then it raises StopIteration.\",\r\ntp$new(a,c){this===Sk.builtin.zip_.prototype&&Sk.abstr.checkNoKwargs(\"zip\",c);c=[];for(let b=0;b\":a.T_RARROW,\".\":a.T_DOT,\"...\":a.T_ELLIPSIS,\"/\":a.T_SLASH,\"//\":a.T_DOUBLESLASH,\"//=\":a.T_DOUBLESLASHEQUAL,\"/=\":a.T_SLASHEQUAL,\":\":a.T_COLON,\";\":a.T_SEMI,\"<\":a.T_LESS,\"<<\":a.T_LEFTSHIFT,\"<<=\":a.T_LEFTSHIFTEQUAL,\"<=\":a.T_LESSEQUAL,\"=\":a.T_EQUAL,\"==\":a.T_EQEQUAL,\">\":a.T_GREATER,\">=\":a.T_GREATEREQUAL,\">>\":a.T_RIGHTSHIFT,\">>=\":a.T_RIGHTSHIFTEQUAL,\"@\":a.T_AT,\"@=\":a.T_ATEQUAL,\"[\":a.T_LSQB,\"]\":a.T_RSQB,\"^\":a.T_CIRCUMFLEX,\"^=\":a.T_CIRCUMFLEXEQUAL,\"{\":a.T_LBRACE,\r\n\"|\":a.T_VBAR,\"|=\":a.T_VBAREQUAL,\"}\":a.T_RBRACE,\"~\":a.T_TILDE};var c={};(function(){for(var b in a)c[a[b]]=b})();[\"tok_name\",\"ISTERMINAL\",\"ISNONTERMINAL\",\"ISEOF\"].concat(Object.keys(c).map(function(a){return c[a]}));Sk.token={};Sk.token.tokens=a;Sk.token.tok_name=c;Sk.token.EXACT_TOKEN_TYPES=m;Sk.token.ISTERMINAL=function(b){return b=a.T_NT_OFFSET};Sk.token.ISEOF=function(b){return b==a.T_ENDMARKER};Sk.exportSymbol(\"Sk.token\",Sk.token);Sk.exportSymbol(\"Sk.token.tokens\",\r\nSk.token.tokens);Sk.exportSymbol(\"Sk.token.tok_name\",Sk.token.tok_name);Sk.exportSymbol(\"Sk.token.EXACT_TOKEN_TYPES\");Sk.exportSymbol(\"Sk.token.ISTERMINAL\",Sk.token.ISTERMINAL);Sk.exportSymbol(\"Sk.token.ISNONTERMINAL\",Sk.token.ISNONTERMINAL);Sk.exportSymbol(\"Sk.token.ISEOF\",Sk.token.ISEOF)},function(m,q){function a(a,b,c,d,e){this.type=a;this.string=b;this.start=c;this.end=d;this.line=e}function c(a){return\"(\"+Array.prototype.slice.call(arguments).join(\"|\")+\")\"}function b(a){return c.apply(null,arguments)+\r\n\"?\"}function e(a,b){for(var c=a.length;c--;)if(a[c]===b)return!0;return!1}function f(){return\" FR RF Br BR Fr r B R b bR f rb rB F Rf U rF u RB br fR fr rf Rb\".split(\" \")}function l(a){a?delete Sk.token.EXACT_TOKEN_TYPES[\"<>\"]:Sk.token.EXACT_TOKEN_TYPES[\"<>\"]=Sk.token.tokens.T_NOTEQUAL;t=Object.keys(Sk.token.EXACT_TOKEN_TYPES).sort();y=c.apply(this,t.reverse().map(function(a){return a&&k.test(a)?a.replace(n,\"\\\\$&\"):a}));B=c(\"\\\\r?\\\\n\",y)}var h=Sk.token.tokens;const d=Sk.builtin.SyntaxError,g=Sk.builtin.SyntaxError;\r\na.prototype.exact_type=function(){return this.type==h.T_OP&&this.string in Sk.token.EXACT_TOKEN_TYPES?Sk.token.EXACT_TOKEN_TYPES[this.string]:this.type};var n=/[\\\\^$.*+?()[\\]{}|]/g,k=RegExp(n.source);const p=function(){var a=c(\"[A-Z]\",\"[a-z]\",\"[\\\\u{10B99}-\\\\u{10B9C}\\\\u{112A9}\\\\u{115DC}-\\\\u{115DD}\\\\u034F\\\\u115F-\\\\u1160\\\\u17B4-\\\\u17B5\\\\u2065\\\\u3164\\\\uFFA0\\\\uFFF0-\\\\uFFF8\\\\u{E0000}\\\\u{E0002}-\\\\u{E001F}\\\\u{E0080}-\\\\u{E00FF}\\\\u{E01F0}-\\\\u{E0FFF}\\\\u{112A9}\\\\u00D7]\",\"[\\\\u02B0-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0374\\\\u037A\\\\u0559\\\\u06E5-\\\\u06E6\\\\u07F4-\\\\u07F5\\\\u0971\\\\u1C78-\\\\u1C7D\\\\u1D2C-\\\\u1D6A\\\\u1DFD-\\\\u1DFF\\\\u2E2F\\\\u30FC\\\\uA67F\\\\uA69C-\\\\uA69D\\\\uA717-\\\\uA71F\\\\uA788\\\\uA7F8-\\\\uA7F9\\\\uAB5C-\\\\uAB5F\\\\uFF70\\\\uFF9E-\\\\uFF9F\\\\u{16F93}-\\\\u{16F9F}\\\\u02D0-\\\\u02D1\\\\u0640\\\\u07FA\\\\u0E46\\\\u0EC6\\\\u1843\\\\u1AA7\\\\u1C7B\\\\u3005\\\\u3031-\\\\u3035\\\\u309D-\\\\u309E\\\\u30FC-\\\\u30FE\\\\uA015\\\\uA60C\\\\uA9CF\\\\uA9E6\\\\uAA70\\\\uAADD\\\\uAAF3-\\\\uAAF4\\\\uFF70\\\\u{16B42}-\\\\u{16B43}\\\\u{16FE0}-\\\\u{16FE1}\\\\u02B0-\\\\u02B8\\\\u02C0-\\\\u02C1\\\\u02E0-\\\\u02E4\\\\u037A\\\\u1D2C-\\\\u1D6A\\\\u1D78\\\\u1D9B-\\\\u1DBF\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2C7C-\\\\u2C7D\\\\uA69C-\\\\uA69D\\\\uA770\\\\uA7F8-\\\\uA7F9\\\\uAB5C-\\\\uAB5F\\\\uFF9E-\\\\uFF9F\\\\u02B2\\\\u1D62\\\\u1DA4\\\\u1DA8\\\\u2071\\\\u2C7C\\\\u2E18-\\\\u2E19\\\\u2E2F]\",\r\n\"[\\\\u2135-\\\\u2138\\\\u{1EE00}-\\\\u{1EE03}\\\\u{1EE05}-\\\\u{1EE1F}\\\\u{1EE21}-\\\\u{1EE22}\\\\u{1EE24}\\\\u{1EE27}\\\\u{1EE29}-\\\\u{1EE32}\\\\u{1EE34}-\\\\u{1EE37}\\\\u{1EE39}\\\\u{1EE3B}\\\\u{1EE42}\\\\u{1EE47}\\\\u{1EE49}\\\\u{1EE4B}\\\\u{1EE4D}-\\\\u{1EE4F}\\\\u{1EE51}-\\\\u{1EE52}\\\\u{1EE54}\\\\u{1EE57}\\\\u{1EE59}\\\\u{1EE5B}\\\\u{1EE5D}\\\\u{1EE5F}\\\\u{1EE61}-\\\\u{1EE62}\\\\u{1EE64}\\\\u{1EE67}-\\\\u{1EE6A}\\\\u{1EE6C}-\\\\u{1EE72}\\\\u{1EE74}-\\\\u{1EE77}\\\\u{1EE79}-\\\\u{1EE7C}\\\\u{1EE7E}\\\\u{1EE80}-\\\\u{1EE89}\\\\u{1EE8B}-\\\\u{1EE9B}\\\\u{1EEA1}-\\\\u{1EEA3}\\\\u{1EEA5}-\\\\u{1EEA9}\\\\u{1EEAB}-\\\\u{1EEBB}\\\\u3006\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FEF\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\u{17000}-\\\\u{187F1}\\\\u{18800}-\\\\u{18AF2}\\\\u{1B170}-\\\\u{1B2FB}\\\\u{20000}-\\\\u{2A6D6}\\\\u{2A700}-\\\\u{2B734}\\\\u{2B740}-\\\\u{2B81D}\\\\u{2B820}-\\\\u{2CEA1}\\\\u{2CEB0}-\\\\u{2EBE0}\\\\u{2F800}-\\\\u{2FA1D}\\\\uAAC0\\\\uAAC2\\\\uFE20-\\\\uFE2F\\\\u{10D22}-\\\\u{10D23}\\\\u{1135D}\\\\u00AA\\\\u00BA\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FEF\\\\uFA0E-\\\\uFA0F\\\\uFA11\\\\uFA13-\\\\uFA14\\\\uFA1F\\\\uFA21\\\\uFA23-\\\\uFA24\\\\uFA27-\\\\uFA29\\\\u{20000}-\\\\u{2A6D6}\\\\u{2A700}-\\\\u{2B734}\\\\u{2B740}-\\\\u{2B81D}\\\\u{2B820}-\\\\u{2CEA1}\\\\u{2CEB0}-\\\\u{2EBE0}\\\\u115F-\\\\u1160\\\\u3164\\\\uFFA0\\\\u0673\\\\u17A3-\\\\u17A4\\\\u0E40-\\\\u0E44\\\\u0EC0-\\\\u0EC4\\\\u19B5-\\\\u19B7\\\\u19BA\\\\uAAB5-\\\\uAAB6\\\\uAAB9\\\\uAABB-\\\\uAABC]\",\r\n\"[\\\\u3007\\\\u3021-\\\\u3029\\\\u3038-\\\\u303A\\\\u2170-\\\\u217F\\\\u2160-\\\\u216F]\",\"_\",\"[\\\\u1885-\\\\u1886\\\\u2118\\\\u212E\\\\u309B-\\\\u309C]\"),b=c(a,\"[\\\\u104A-\\\\u104B\\\\u102B-\\\\u102C\\\\u102D-\\\\u1030\\\\u1031\\\\u1032-\\\\u1036\\\\u1038\\\\u103B-\\\\u103C\\\\u103D-\\\\u103E\\\\u1056-\\\\u1057\\\\u1058-\\\\u1059\\\\u105E-\\\\u1060\\\\u1062\\\\u1067-\\\\u1068\\\\u1071-\\\\u1074\\\\u1082\\\\u1083-\\\\u1084\\\\u1085-\\\\u1086\\\\u109C\\\\u109D\\\\u1037\\\\u1039-\\\\u103A\\\\u1087-\\\\u108C\\\\u108D\\\\u108F\\\\u109A-\\\\u109B\\\\uA9E5\\\\uAA7B\\\\uAA7C\\\\uAA7D\\\\uA9E6\\\\uAA70\\\\u104A-\\\\u104B]\",\"[\\\\u0903\\\\u093B\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E-\\\\u094F\\\\u0982-\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7-\\\\u09C8\\\\u09CB-\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB-\\\\u0ACC\\\\u0B02-\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47-\\\\u0B48\\\\u0B4B-\\\\u0B4C\\\\u0B57\\\\u0BBE-\\\\u0BBF\\\\u0BC1-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82-\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7-\\\\u0CC8\\\\u0CCA-\\\\u0CCB\\\\u0CD5-\\\\u0CD6\\\\u0D02-\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82-\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2-\\\\u0DF3\\\\u0F7F\\\\u102B-\\\\u102C\\\\u1031\\\\u1038\\\\u103B-\\\\u103C\\\\u1056-\\\\u1057\\\\u1062\\\\u1067-\\\\u1068\\\\u1083-\\\\u1084\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7-\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930-\\\\u1931\\\\u1933-\\\\u1938\\\\u1A19-\\\\u1A1A\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63-\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B82\\\\u1BA1\\\\u1BA6-\\\\u1BA7\\\\u1BE7\\\\u1BEA-\\\\u1BEC\\\\u1BEE\\\\u1C24-\\\\u1C2B\\\\u1C34-\\\\u1C35\\\\u1CF2-\\\\u1CF3\\\\uA823-\\\\uA824\\\\uA827\\\\uA880-\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA983\\\\uA9B4-\\\\uA9B5\\\\uA9BA-\\\\uA9BB\\\\uA9BD-\\\\uA9BF\\\\uAA2F-\\\\uAA30\\\\uAA33-\\\\uAA34\\\\uAA4D\\\\uAAEB\\\\uAAEE-\\\\uAAEF\\\\uAAF5\\\\uABE3-\\\\uABE4\\\\uABE6-\\\\uABE7\\\\uABE9-\\\\uABEA\\\\u{11000}\\\\u{11002}\\\\u{11082}\\\\u{110B0}-\\\\u{110B2}\\\\u{110B7}-\\\\u{110B8}\\\\u{1112C}\\\\u{11145}-\\\\u{11146}\\\\u{11182}\\\\u{111B3}-\\\\u{111B5}\\\\u{111BF}\\\\u{1122C}-\\\\u{1122E}\\\\u{11232}-\\\\u{11233}\\\\u{112E0}-\\\\u{112E2}\\\\u{11302}-\\\\u{11303}\\\\u{1133E}-\\\\u{1133F}\\\\u{11341}-\\\\u{11344}\\\\u{11347}-\\\\u{11348}\\\\u{1134B}-\\\\u{1134C}\\\\u{11357}\\\\u{11362}-\\\\u{11363}\\\\u{11435}-\\\\u{11437}\\\\u{11440}-\\\\u{11441}\\\\u{11445}\\\\u{114B0}-\\\\u{114B2}\\\\u{114B9}\\\\u{114BB}-\\\\u{114BE}\\\\u{114C1}\\\\u{115AF}-\\\\u{115B1}\\\\u{115B8}-\\\\u{115BB}\\\\u{115BE}\\\\u{11630}-\\\\u{11632}\\\\u{1163B}-\\\\u{1163C}\\\\u{1163E}\\\\u{116AC}\\\\u{116AE}-\\\\u{116AF}\\\\u{11720}-\\\\u{11721}\\\\u{11726}\\\\u{1182C}-\\\\u{1182E}\\\\u{11838}\\\\u{11A39}\\\\u{11A57}-\\\\u{11A58}\\\\u{11A97}\\\\u{11C2F}\\\\u{11C3E}\\\\u{11CA9}\\\\u{11CB1}\\\\u{11CB4}\\\\u{11D8A}-\\\\u{11D8E}\\\\u{11D93}-\\\\u{11D94}\\\\u{11D96}\\\\u{11EF5}-\\\\u{11EF6}\\\\u{16F51}-\\\\u{16F7E}\\\\u0F3E-\\\\u0F3F\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109B\\\\u1B44\\\\u1BAA\\\\u1CE1\\\\u1CF7\\\\u302E-\\\\u302F\\\\uA953\\\\uA9C0\\\\uAA7B\\\\uAA7D\\\\uABEC\\\\u{111C0}\\\\u{11235}\\\\u{1134D}\\\\u{116B6}\\\\u{1D16D}-\\\\u{1D172}\\\\u09BE\\\\u09D7\\\\u0B3E\\\\u0B57\\\\u0BBE\\\\u0BD7\\\\u0CC2\\\\u0CD5-\\\\u0CD6\\\\u0D3E\\\\u0D57\\\\u0DCF\\\\u0DDF\\\\u302E-\\\\u302F\\\\u{1133E}\\\\u{11357}\\\\u{114B0}\\\\u{114BD}\\\\u{115AF}\\\\u{1D165}\\\\u{1D16E}-\\\\u{1D172}]\",\r\n\"[\\\\u{1D7CE}-\\\\u{1D7FF}\\\\uFF10-\\\\uFF19]\",\"\\\\u2040\",\"[\\\\u00B7\\\\u0387\\\\u1369-\\\\u1371\\\\u19DA]\");if(!1===RegExp().unicode)return new RegExp(\"^\"+a+\"+\"+b+\"*$\",\"u\");a=c(\"[A-Z]\",\"[a-z]\",\"_\");b=c(a,\"[0-9]\");return new RegExp(\"^\"+a+\"+\"+b+\"*$\")}();(function(a){return c.apply(null,arguments)+\"*\"})(\"\\\\\\\\\\\\r?\\\\n[ \\\\f\\\\t]*\");b(\"#[^\\\\r\\\\n]*\");m=c(\"[0-9](?:_?[0-9])*\\\\.(?:[0-9](?:_?[0-9])*)?\",\"\\\\.[0-9](?:_?[0-9])*\")+b(\"[eE][-+]?[0-9](?:_?[0-9])*\");var w=c(m,\"[0-9](?:_?[0-9])*[eE][-+]?[0-9](?:_?[0-9])*\"),A=c(\"[0-9](?:_?[0-9])*[jJ]\",\r\nw+\"[jJ]\");m=c.apply(null,f());q=c(m+\"'''\",m+'\"\"\"');c(m+\"'[^\\\\n'\\\\\\\\]*(?:\\\\\\\\.[^\\\\n'\\\\\\\\]*)*'\",m+'\"[^\\\\n\"\\\\\\\\]*(?:\\\\\\\\.[^\\\\n\"\\\\\\\\]*)*\"');var t,y,B;l(!0);Sk.token.setupTokens=l;var E=c(m+\"'[^\\\\n'\\\\\\\\]*(?:\\\\\\\\.[^\\\\n'\\\\\\\\]*)*\"+c(\"'\",\"\\\\\\\\\\\\r?\\\\n\"),m+'\"[^\\\\n\"\\\\\\\\]*(?:\\\\\\\\.[^\\\\n\"\\\\\\\\]*)*'+c('\"',\"\\\\\\\\\\\\r?\\\\n\")),F=c(\"\\\\\\\\\\\\r?\\\\n|$\",\"#[^\\\\r\\\\n]*\",q),K={};m=f();for(let a of m)K[a+\"'\"]=\"^[^'\\\\\\\\]*(?:\\\\\\\\.[^'\\\\\\\\]*)*'\",K[a+'\"']='^[^\"\\\\\\\\]*(?:\\\\\\\\.[^\"\\\\\\\\]*)*\"',K[a+\"'''\"]=\"^[^'\\\\\\\\]*(?:(?:\\\\\\\\.|'(?!''))[^'\\\\\\\\]*)*'''\",\r\nK[a+'\"\"\"']='^[^\"\\\\\\\\]*(?:(?:\\\\\\\\.|\"(?!\"\"))[^\"\\\\\\\\]*)*\"\"\"';let G=[],U=[];for(let a of m)G.push(a+'\"'),G.push(a+\"'\"),U.push(a+'\"\"\"'),U.push(a+\"'''\");Sk._tokenize=function(b,f,k,n){var l=Sk.__future__.python3?\"\":\"(?:L?)\";l=c(\"0[xX](?:_?[0-9a-fA-F])+\"+l,\"0[bB](?:_?[01])+\"+l,Sk.__future__.silent_octal_literal?\"0([oO]?)(?:_?[0-7])+\"+l:\"0([oO])(?:_?[0-7])+\"+l,\"(?:0(?:_?0)*|[1-9](?:_?[0-9])*)\"+l);l=c(A,w,l);l=\"[ \\\\f\\\\t]*\"+c(F,l,B,E,\"\\\\w+\");l=new RegExp(l);var m=0,t=0,q=0,y=\"\",u=0,C=null,N=[0],H,R=void 0,\r\nX=void 0,J,T;void 0!==k&&(\"utf-8-sig\"==k&&(k=\"utf-8\"),n(new a(h.T_ENCODING,k,[0,0],[0,0],\"\")));for(var D=k=\"\";;){try{k=D,D=f()}catch(Q){D=\"\"}m+=1;var x=0,P=D.length;if(y){if(!D)throw new d(\"EOF in multi-line string\",b,X[0],X[1]);R.lastIndex=0;var r=R.exec(D);if(r)x=J=r[0].length,n(new a(h.T_STRING,y+D.substring(0,J),X,[m,J],C+D)),y=\"\",u=0,C=null;else{u&&\"\\\\\\n\"!==D.substring(D.length-2)&&\"\\\\\\r\\n\"!==D.substring(D.length-3)?(n(new a(h.T_ERRORTOKEN,y+D,X,[m,D.length],C)),y=\"\",C=null):(y+=D,C+=D);continue}}else if(0!=\r\nt||q){if(!D)throw new d(\"EOF in multi-line statement\",b,m,0);q=0}else{if(!D)break;for(H=0;xN[N.length-1]&&(N.push(H),n(new a(h.T_INDENT,\r\nD.substring(x),[m,0],[m,x],D)));for(;H\":Sk.token.tokens.T_GREATER,\"=\":Sk.token.tokens.T_EQUAL,\".\":Sk.token.tokens.T_DOT,\"%\":Sk.token.tokens.T_PERCENT,\"`\":Sk.token.tokens.T_BACKQUOTE,\"{\":Sk.token.tokens.T_LBRACE,\"}\":Sk.token.tokens.T_RBRACE,\"@\":Sk.token.tokens.T_AT,\"@=\":Sk.token.tokens.T_ATEQUAL,\r\n\"==\":Sk.token.tokens.T_EQEQUAL,\"!=\":Sk.token.tokens.T_NOTEQUAL,\"<>\":Sk.token.tokens.T_NOTEQUAL,\"<=\":Sk.token.tokens.T_LESSEQUAL,\">=\":Sk.token.tokens.T_GREATEREQUAL,\"~\":Sk.token.tokens.T_TILDE,\"^\":Sk.token.tokens.T_CIRCUMFLEX,\"<<\":Sk.token.tokens.T_LEFTSHIFT,\">>\":Sk.token.tokens.T_RIGHTSHIFT,\"**\":Sk.token.tokens.T_DOUBLESTAR,\"+=\":Sk.token.tokens.T_PLUSEQUAL,\"-=\":Sk.token.tokens.T_MINEQUAL,\"*=\":Sk.token.tokens.T_STAREQUAL,\"/=\":Sk.token.tokens.T_SLASHEQUAL,\"%=\":Sk.token.tokens.T_PERCENTEQUAL,\"&=\":Sk.token.tokens.T_AMPEREQUAL,\r\n\"|=\":Sk.token.tokens.T_VBAREQUAL,\"^=\":Sk.token.tokens.T_CIRCUMFLEXEQUAL,\"<<=\":Sk.token.tokens.T_LEFTSHIFTEQUAL,\">>=\":Sk.token.tokens.T_RIGHTSHIFTEQUAL,\"**=\":Sk.token.tokens.T_DOUBLESTAREQUAL,\"//\":Sk.token.tokens.T_DOUBLESLASH,\"//=\":Sk.token.tokens.T_DOUBLESLASHEQUAL,\"->\":Sk.token.tokens.T_RARROW,\"...\":Sk.token.tokens.T_ELLIPSIS};Sk.ParseTables={sym:{and_expr:257,and_test:258,annassign:259,arglist:260,argument:261,arith_expr:262,assert_stmt:263,async_funcdef:264,async_stmt:265,atom:266,atom_expr:267,\r\naugassign:268,break_stmt:269,classdef:270,comp_for:271,comp_if:272,comp_iter:273,comp_op:274,comparison:275,compound_stmt:276,continue_stmt:277,debugger_stmt:278,decorated:279,decorator:280,decorators:281,del_stmt:282,dictorsetmaker:283,dotted_as_name:284,dotted_as_names:285,dotted_name:286,encoding_decl:287,eval_input:288,except_clause:289,expr:290,expr_stmt:291,exprlist:292,factor:293,file_input:294,flow_stmt:295,for_stmt:296,funcdef:297,global_stmt:298,if_stmt:299,import_as_name:300,import_as_names:301,\r\nimport_from:302,import_name:303,import_stmt:304,lambdef:305,lambdef_nocond:306,nonlocal_stmt:307,not_test:308,or_test:309,parameters:310,pass_stmt:311,power:312,print_stmt:313,raise_stmt:314,return_stmt:315,shift_expr:316,simple_stmt:317,single_input:256,sliceop:318,small_stmt:319,star_expr:320,stmt:321,subscript:322,subscriptlist:323,suite:324,term:325,test:326,test_nocond:327,testlist:328,testlist_comp:329,testlist_star_expr:330,tfpdef:331,trailer:332,try_stmt:333,typedargslist:334,varargslist:335,\r\nvfpdef:336,while_stmt:337,with_item:338,with_stmt:339,xor_expr:340,yield_arg:341,yield_expr:342,yield_stmt:343},number2symbol:{256:\"single_input\",257:\"and_expr\",258:\"and_test\",259:\"annassign\",260:\"arglist\",261:\"argument\",262:\"arith_expr\",263:\"assert_stmt\",264:\"async_funcdef\",265:\"async_stmt\",266:\"atom\",267:\"atom_expr\",268:\"augassign\",269:\"break_stmt\",270:\"classdef\",271:\"comp_for\",272:\"comp_if\",273:\"comp_iter\",274:\"comp_op\",275:\"comparison\",276:\"compound_stmt\",277:\"continue_stmt\",278:\"debugger_stmt\",\r\n279:\"decorated\",280:\"decorator\",281:\"decorators\",282:\"del_stmt\",283:\"dictorsetmaker\",284:\"dotted_as_name\",285:\"dotted_as_names\",286:\"dotted_name\",287:\"encoding_decl\",288:\"eval_input\",289:\"except_clause\",290:\"expr\",291:\"expr_stmt\",292:\"exprlist\",293:\"factor\",294:\"file_input\",295:\"flow_stmt\",296:\"for_stmt\",297:\"funcdef\",298:\"global_stmt\",299:\"if_stmt\",300:\"import_as_name\",301:\"import_as_names\",302:\"import_from\",303:\"import_name\",304:\"import_stmt\",305:\"lambdef\",306:\"lambdef_nocond\",307:\"nonlocal_stmt\",\r\n308:\"not_test\",309:\"or_test\",310:\"parameters\",311:\"pass_stmt\",312:\"power\",313:\"print_stmt\",314:\"raise_stmt\",315:\"return_stmt\",316:\"shift_expr\",317:\"simple_stmt\",318:\"sliceop\",319:\"small_stmt\",320:\"star_expr\",321:\"stmt\",322:\"subscript\",323:\"subscriptlist\",324:\"suite\",325:\"term\",326:\"test\",327:\"test_nocond\",328:\"testlist\",329:\"testlist_comp\",330:\"testlist_star_expr\",331:\"tfpdef\",332:\"trailer\",333:\"try_stmt\",334:\"typedargslist\",335:\"varargslist\",336:\"vfpdef\",337:\"while_stmt\",338:\"with_item\",339:\"with_stmt\",\r\n340:\"xor_expr\",341:\"yield_arg\",342:\"yield_expr\",343:\"yield_stmt\"},dfas:{256:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],257:[[[[44,1]],[[45,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],258:[[[[46,1]],[[47,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,\r\n35:1,38:1,43:1}],259:[[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],{48:1}],260:[[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],261:[[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],262:[[[[55,1]],[[30,0],[43,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],263:[[[[24,1]],[[49,\r\n2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],{24:1}],264:[[[[10,1]],[[56,2]],[[0,2]]],{10:1}],265:[[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],{10:1}],266:[[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,33:1,35:1,38:1}],267:[[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],268:[[[[67,1],[68,1],[69,1],\r\n[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],{67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:1,75:1,76:1,77:1,78:1,79:1}],269:[[[[39,1]],[[0,1]]],{39:1}],270:[[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],{13:1}],271:[[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],{10:1,34:1}],272:[[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],{37:1}],273:[[[[87,1],[54,1]],[[0,1]]],{10:1,34:1,37:1}],274:[[[[88,1],[89,1],\r\n[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],{8:1,83:1,88:1,89:1,90:1,91:1,92:1,93:1,94:1}],275:[[[[95,1]],[[96,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],276:[[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],{4:1,10:1,13:1,20:1,21:1,34:1,37:1,41:1,42:1}],277:[[[[40,1]],[[0,1]]],{40:1}],278:[[[[17,1]],[[0,1]]],{17:1}],279:[[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],{41:1}],280:[[[[41,1]],\r\n[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],{41:1}],281:[[[[106,1]],[[106,1],[0,1]]],{41:1}],282:[[[[27,1]],[[82,2]],[[0,2]]],{27:1}],283:[[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],284:[[[[105,1]],[[108,\r\n2],[0,1]],[[25,3]],[[0,3]]],{25:1}],285:[[[[109,1]],[[52,0],[0,1]]],{25:1}],286:[[[[25,1]],[[110,0],[0,1]]],{25:1}],287:[[[[25,1]],[[0,1]]],{25:1}],288:[[[[111,1]],[[2,1],[112,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],289:[[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],{113:1}],290:[[[[114,1]],[[115,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],291:[[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,\r\n4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],292:[[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],{6:1,7:1,9:1,11:1,12:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],293:[[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],294:[[[[2,0],[112,1],[121,0]],[[0,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,\r\n17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1,112:1}],295:[[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],{5:1,23:1,31:1,39:1,40:1}],296:[[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],{34:1}],297:[[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],{4:1}],298:[[[[26,1]],[[25,2]],[[52,1],[0,2]]],{26:1}],299:[[[[37,1]],[[49,2]],\r\n[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{37:1}],300:[[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],301:[[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],{25:1}],302:[[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],{36:1}],303:[[[[32,1]],[[133,2]],[[0,2]]],{32:1}],304:[[[[134,1],[135,1]],[[0,1]]],{32:1,36:1}],305:[[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],{14:1}],306:[[[[14,1]],\r\n[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],{14:1}],307:[[[[18,1]],[[25,2]],[[52,1],[0,2]]],{18:1}],308:[[[[8,1],[137,2]],[[46,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],309:[[[[138,1]],[[139,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],310:[[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],{35:1}],311:[[[[28,1]],[[0,1]]],{28:1}],312:[[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,\r\n35:1,38:1}],313:[[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],{16:1}],314:[[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],{5:1}],315:[[[[23,1]],[[111,2],[0,1]],[[0,2]]],{23:1}],316:[[[[143,1]],[[144,0],[142,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],317:[[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,\r\n15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],318:[[[[48,1]],[[49,2],[0,1]],[[0,2]]],{48:1}],319:[[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],320:[[[[15,1]],[[95,2]],[[0,2]]],{15:1}],321:[[[[1,1],[3,1]],[[0,1]]],{4:1,5:1,6:1,7:1,\r\n8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],322:[[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],323:[[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],324:[[[[1,1],[2,2]],\r\n[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],{2:1,5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],325:[[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],326:[[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],327:[[[[165,\r\n1],[84,1]],[[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],328:[[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],329:[[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],330:[[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,\r\n22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],331:[[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],{25:1}],332:[[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],{35:1,38:1,110:1}],333:[[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],{20:1}],334:[[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,\r\n5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],335:[[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],\r\n[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],336:[[[[25,1]],[[0,1]]],{25:1}],337:[[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{21:1}],338:[[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],339:[[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],{42:1}],340:[[[[172,1]],[[173,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,\r\n35:1,38:1,43:1}],341:[[[[111,2],[36,1]],[[49,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,36:1,38:1,43:1}],342:[[[[31,1]],[[174,2],[0,1]],[[0,2]]],{31:1}],343:[[[[62,1]],[[0,1]]],{31:1}]},states:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],[[[44,1]],[[45,0],[0,1]]],[[[46,1]],[[47,0],[0,1]]],[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],[[[55,1]],[[30,0],[43,0],\r\n[0,1]]],[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],[[[10,1]],[[56,2]],[[0,2]]],[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],[[[39,1]],[[0,1]]],[[[13,1]],[[25,2]],[[48,3],[35,4]],\r\n[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],[[[87,1],[54,1]],[[0,1]]],[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],[[[95,1]],[[96,0],[0,1]]],[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],[[[40,1]],[[0,1]]],[[[17,1]],[[0,1]]],[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],[[[41,1]],[[105,\r\n2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],[[[106,1]],[[106,1],[0,1]]],[[[27,1]],[[82,2]],[[0,2]]],[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[109,1]],[[52,0],[0,1]]],[[[25,1]],[[110,0],[0,1]]],[[[25,1]],[[0,1]]],[[[111,1]],[[2,1],[112,2]],[[0,2]]],\r\n[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],[[[114,1]],[[115,0],[0,1]]],[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],[[[2,0],[112,1],[121,0]],[[0,1]]],[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],[[[4,1]],[[25,\r\n2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],[[[26,1]],[[25,2]],[[52,1],[0,2]]],[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],[[[32,1]],[[133,2]],[[0,2]]],[[[134,1],[135,1]],[[0,1]]],[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,\r\n2]],[[0,4]]],[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],[[[18,1]],[[25,2]],[[52,1],[0,2]]],[[[8,1],[137,2]],[[46,2]],[[0,2]]],[[[138,1]],[[139,0],[0,1]]],[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],[[[28,1]],[[0,1]]],[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],[[[23,1]],[[111,\r\n2],[0,1]],[[0,2]]],[[[143,1]],[[144,0],[142,0],[0,1]]],[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],[[[48,1]],[[49,2],[0,1]],[[0,2]]],[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],[[[15,1]],[[95,2]],[[0,2]]],[[[1,1],[3,1]],[[0,1]]],[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],[[[120,1]],[[161,0],[15,0],[162,\r\n0],[41,0],[163,0],[0,1]]],[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],[[[165,1],[84,1]],[[0,1]]],[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],\r\n[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,\r\n8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[25,1]],[[0,1]]],[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],[[[172,1]],[[173,0],[0,1]]],[[[111,2],\r\n[36,1]],[[49,2]],[[0,2]]],[[[31,1]],[[174,2],[0,1]],[[0,2]]],[[[62,1]],[[0,1]]]],labels:[[0,\"EMPTY\"],[317,null],[4,null],[276,null],[1,\"def\"],[1,\"raise\"],[1,\"True\"],[3,null],[1,\"not\"],[1,\"null\"],[55,null],[2,null],[25,null],[1,\"class\"],[1,\"lambda\"],[16,null],[1,\"print\"],[1,\"debugger\"],[1,\"nonlocal\"],[52,null],[1,\"try\"],[1,\"while\"],[31,null],[1,\"return\"],[1,\"assert\"],[1,null],[1,\"global\"],[1,\"del\"],[1,\"pass\"],[54,null],[15,null],[1,\"yield\"],[1,\"import\"],[1,\"False\"],[1,\"for\"],[7,null],[1,\"from\"],[1,\r\n\"if\"],[9,null],[1,\"break\"],[1,\"continue\"],[49,null],[1,\"with\"],[14,null],[316,null],[19,null],[308,null],[1,\"and\"],[11,null],[326,null],[22,null],[261,null],[12,null],[35,null],[271,null],[325,null],[297,null],[339,null],[296,null],[26,null],[283,null],[8,null],[342,null],[329,null],[10,null],[266,null],[332,null],[45,null],[38,null],[40,null],[50,null],[46,null],[41,null],[42,null],[36,null],[43,null],[48,null],[44,null],[37,null],[39,null],[324,null],[260,null],[292,null],[1,\"in\"],[309,null],[273,\r\nnull],[327,null],[272,null],[28,null],[21,null],[27,null],[29,null],[1,\"is\"],[30,null],[20,null],[290,null],[274,null],[333,null],[299,null],[270,null],[337,null],[279,null],[265,null],[281,null],[264,null],[286,null],[280,null],[320,null],[1,\"as\"],[284,null],[23,null],[328,null],[0,null],[1,\"except\"],[340,null],[18,null],[330,null],[268,null],[259,null],[312,null],[293,null],[321,null],[269,null],[277,null],[314,null],[315,null],[343,null],[1,\"else\"],[310,null],[51,null],[1,\"elif\"],[300,null],[301,\r\nnull],[285,null],[303,null],[302,null],[335,null],[275,null],[258,null],[1,\"or\"],[334,null],[267,null],[34,null],[262,null],[33,null],[319,null],[13,null],[295,null],[263,null],[291,null],[311,null],[307,null],[313,null],[282,null],[298,null],[304,null],[278,null],[318,null],[322,null],[5,null],[6,null],[47,null],[17,null],[24,null],[305,null],[306,null],[323,null],[289,null],[1,\"finally\"],[331,null],[336,null],[338,null],[257,null],[32,null],[341,null]],keywords:{False:33,\"null\":9,True:6,and:47,\r\nas:108,assert:24,\"break\":39,\"class\":13,\"continue\":40,\"debugger\":17,def:4,del:27,elif:130,\"else\":127,except:113,\"finally\":168,\"for\":34,from:36,global:26,\"if\":37,\"import\":32,\"in\":83,is:92,lambda:14,nonlocal:18,not:8,or:139,pass:28,print:16,raise:5,\"return\":23,\"try\":20,\"while\":21,\"with\":42,yield:31},tokens:{0:112,1:25,2:11,3:7,4:2,5:159,6:160,7:35,8:61,9:38,10:64,11:48,12:52,13:146,14:43,15:30,16:15,17:162,18:115,19:45,20:94,21:89,22:50,23:110,24:163,25:12,26:59,27:90,28:88,29:91,30:93,31:22,32:173,\r\n33:144,34:142,35:53,36:74,37:78,38:68,39:79,40:69,41:72,42:73,43:75,44:77,45:67,46:71,47:161,48:76,49:41,50:70,51:129,52:19,54:29,55:10},start:256}},function(m,q){function a(a,c){this.filename=a;this.grammar=c;this.p_flags=0;return this}function c(b,c){void 0===c&&(c=\"file_input\");b=new a(b,Sk.ParseTables);\"file_input\"===c?b.setup(Sk.ParseTables.sym.file_input):Sk.asserts.fail(\"todo;\");return b}a.FUTURE_PRINT_FUNCTION=\"print_function\";a.FUTURE_UNICODE_LITERALS=\"unicode_literals\";a.FUTURE_DIVISION=\r\n\"division\";a.FUTURE_ABSOLUTE_IMPORT=\"absolute_import\";a.FUTURE_WITH_STATEMENT=\"with_statement\";a.FUTURE_NESTED_SCOPES=\"nested_scopes\";a.FUTURE_GENERATORS=\"generators\";a.CO_FUTURE_PRINT_FUNCTION=65536;a.CO_FUTURE_UNICODE_LITERALS=131072;a.CO_FUTURE_DIVISON=8192;a.CO_FUTURE_ABSOLUTE_IMPORT=16384;a.CO_FUTURE_WITH_STATEMENT=32768;a.prototype.setup=function(a){a=a||this.grammar.start;this.stack=[{dfa:this.grammar.dfas[a],state:0,node:{type:a,value:null,context:null,children:[]}}];this.used_names={}};a.prototype.addtoken=\r\nfunction(a,c,f){var b,e=this.classify(a,c,f);a:for(;;){var d=this.stack[this.stack.length-1];var g=d.dfa[0];var n=g[d.state];for(b=0;bm);this.shift(a,c,p,f);for(f=p;1===g[f].length&&0===g[f][0][0]&&g[f][0][1]===f;){this.pop();if(0===this.stack.length)return!0;d=this.stack[this.stack.length-1];f=d.state;g=d.dfa[0]}return!1}if(256<=m&&(k=this.grammar.dfas[m],k=k[1],k.hasOwnProperty(e))){this.push(m,\r\nthis.grammar.dfas[m],p,f);continue a}}b:{g=[0,d.state];for(d=n.length;d--;)if(n[d][0]===g[0]&&n[d][1]===g[1]){n=!0;break b}n=!1}if(n){if(this.pop(),0===this.stack.length)throw new Sk.builtin.SyntaxError(\"too much input\",this.filename);}else throw a=f[0][0],new Sk.builtin.SyntaxError(\"bad input\",this.filename,a,f);}};a.prototype.classify=function(b,c,f){if(b===Sk.token.tokens.T_NAME){this.used_names[c]=!0;var e=this.grammar.keywords.hasOwnProperty(c)&&this.grammar.keywords[c];\"print\"===c&&(this.p_flags&\r\na.CO_FUTURE_PRINT_FUNCTION||!0===Sk.__future__.print_function)&&(e=!1);if(e)return e}e=this.grammar.tokens.hasOwnProperty(b)&&this.grammar.tokens[b];if(!e){c=\"#\"+b;for(let a in Sk.token.tokens)if(Sk.token.tokens[a]==b){c=a;break}throw new Sk.builtin.SyntaxError(\"bad token \"+c,this.filename,f[0][0],f);}return e};a.prototype.shift=function(a,c,f,l){var b=this.stack[this.stack.length-1].dfa,d=this.stack[this.stack.length-1].node;d.children.push({type:a,value:c,lineno:l[0][0],col_offset:l[0][1],children:null});\r\nthis.stack[this.stack.length-1]={dfa:b,state:f,node:d}};a.prototype.push=function(a,c,f,l){a={type:a,value:null,lineno:l[0][0],col_offset:l[0][1],children:[]};this.stack[this.stack.length-1]={dfa:this.stack[this.stack.length-1].dfa,state:f,node:this.stack[this.stack.length-1].node};this.stack.push({dfa:c,state:0,node:a})};a.prototype.pop=function(){var a=this.stack.pop().node;if(a)if(0!==this.stack.length){var c=this.stack[this.stack.length-1].node;c.children.push(a)}else this.rootnode=a,this.rootnode.used_names=\r\nthis.used_names};Sk.parse=function(a,e){var b=Sk.token.tokens.T_COMMENT,l=Sk.token.tokens.T_NL,h=Sk.token.tokens.T_OP,d=Sk.token.tokens.T_ENDMARKER,g=Sk.token.tokens.T_ENCODING,n=!1,k=c(a);Sk._tokenize(a,function(a){var b=a.split(\"\\n\").reverse().map(function(a){return a+\"\\n\"});return function(){if(0===b.length)throw new Sk.builtin.Exception(\"EOF\");return b.pop()}}(e),\"utf-8\",function(a){var c=null;a.type!==b&&a.type!==l&&a.type!==g&&(a.type===h&&(c=Sk.OpMap[a.string]),k.addtoken(c||a.type,a.string,\r\n[a.start,a.end,a.line]),a.type===d&&(n=!0))});if(!n)throw new Sk.builtin.SyntaxError(\"incomplete input\",this.filename);return{cst:k.rootnode,flags:k.p_flags}};Sk.parseTreeDump=function(a,c){var b;c=c||\"\";var e=\"\"+c;if(256<=a.type)for(e+=Sk.ParseTables.number2symbol[a.type]+\"\\n\",b=0;b=c(d)||g+2==\r\nc(d)&&b(d,g+1).type==z.T_COMMA)throw new Sk.builtin.SyntaxError(\"named arguments must follow bare *\",a.c_filename,d.lineno);m=b(d,g+1);m.type==z.T_COMMA?(g+=2,g=N(a,d,g,n,v)):(l=C(a,m),g+=3,ga.c_feature_version)return f(a,v,\"Async functions are only supported in Python 3.5 and greater\"),null;e(v,r.funcdef);var I=k(b(v,p));if(d(a,I,b(v,p),0))return null;var L=u(a,b(v,p+1));if(!L)return null;if(b(v,p+2).type==z.T_RARROW){l=x(a,b(v,p+3));if(!l)return null;p+=2}if(b(v,p+3).type==z.T_TYPE_COMMENT){m=z.T_NEW_TYPE_COMMENT(b(v,p+3));if(!m)return null;p+=1}var M=t(a,b(v,p+3));if(!M)return null;if(1\":return Sk.astnodes.RShift;\r\ncase \"&\":return Sk.astnodes.BitAnd;case \"^\":return Sk.astnodes.BitXor;case \"|\":return Sk.astnodes.BitOr;case \"*\":return\"*\"===c.value.charAt(1)?Sk.astnodes.Pow:Sk.astnodes.Mult;case \"@\":if(Sk.__future__.python3)return Sk.astnodes.MatMult;default:Sk.asserts.fail(\"invalid augassign\")}}function W(a,d){Sk.asserts.assert(0=b);Sk.asserts.assert(\"{\"==a.charAt(b-1));Sk.asserts.assert(\"}\"==a.charAt(c)||\"!\"==a.charAt(c)||\":\"==a.charAt(c));a=a.substring(b,c);/^\\s*$/.test(a)&&f(d,e,\"f-string: empty expression not allowed\");\r\ntry{let b=Sk.parse(\"\",\"(\"+a+\")\");var g=Sk.astFromParse(b.cst,\"\",b.flags)}catch(Y){throw Y.traceback&&Y.traceback[0]&&(g=Y.traceback[0],g.lineno=(g.lineno||1)-1+e.lineno,g.filename=d.c_filename),Y;}Sk.asserts.assert(1==g.body.length&&g.body[0].constructor===Sk.astnodes.Expr);return g.body[0].value}function H(a,b,c,d,e,g,h){Sk.asserts.assert(\"{\"==a.charAt(b));b++;var k=b;let n=null,l=0,p=0,m,v,I=()=>f(g,h,\"f-string: expecting '}'\");for(Sk.asserts.assert(b<=c);b=c&&I(),v=a.charAt(b),b++,\"s\"!=v&&\"r\"!=v&&\"a\"!=v&&f(g,h,\"f-string: invalid conversion character: expected 's', 'r', or 'a'\"));b>=c&&I();\":\"==a.charAt(b)&&(b++,b>=c&&I(),[m,b]=ba(a,b,c,d,e+1,g,h));(b>=c||\"}\"!=a.charAt(b))&&I();b++;return[new Sk.astnodes.FormattedValue(k,v,m,h.lineno,h.col_offset),b]}function ba(a,b,c,d,e,f,g){let h=[],k=a=>{if(-1!==a.indexOf(\"}\")){if(/(^|[^}])}(}})*($|[^}])/.test(a))throw new SyntaxError(\"f-string: single '}' is not allowed\",\r\ng.lineno,g.col_offset);a=a.replace(/}}/g,\"}\")}h.push(new Sk.astnodes.Str(new Sk.builtin.str(a),g.lineno,g.col_offset,f.end_lineno,g.end_col_offset))};for(;bd&&(n=-1,c=d))}if(-1===n){k(a.substring(b,c));b=c;break}else if(n+1Number.MAX_SAFE_INTEGER&&Math.floor(c)===c&&-1===b.indexOf(\"e\")&&\r\n-1===b.indexOf(\"E\")?Sk.longFromStr(b,0):a?new Sk.builtin.int_(-c):new Sk.builtin.int_(c)}function J(a,d){var f,g;e(d,r.subscript);var h=b(d,0);var k=f=g=null;if(h.type===z.T_DOT)return new Sk.astnodes.Ellipsis;if(1===c(d)&&h.type===r.test)return new Sk.astnodes.Index(x(a,h));h.type===r.test&&(g=x(a,h));h.type===z.T_COLON?1=h.length){if(\"None\"===h)return new Sk.astnodes.NameConstant(Sk.builtin.none.none$,d.lineno,d.col_offset);if(\"True\"===h)return new Sk.astnodes.NameConstant(Sk.builtin.bool.true$,d.lineno,d.col_offset);if(\"False\"===h)return new Sk.astnodes.NameConstant(Sk.builtin.bool.false$,d.lineno,d.col_offset)}a=\r\nk(h,a);return new Sk.astnodes.Name(a,Sk.astnodes.Load,d.lineno,d.col_offset,d.end_lineno,d.end_col_offset);case z.T_STRING:g=[];for(var n=0;n=B&&f(m,v,\"Truncated \\\\xNN escape\"),u+=String.fromCharCode(parseInt(L.substr(t+1,2),16)),t+=2):y||\"u\"!==q?y||\"U\"!==q?u+=\"\\\\\"+q:(t+8>=B&&f(m,v,\"Truncated \\\\UXXXXXXXX escape\"),u+=String.fromCodePoint(parseInt(L.substr(t+1,8),16)),t+=8):(t+4>=B&&f(m,v,\"Truncated \\\\uXXXX escape\"),u+=String.fromCharCode(parseInt(L.substr(t+1,4),16)),t+=4))):y&&1273-h&&b(g,3-h).type==r.comp_for){if(h)return f(a,d,\"dict unpacking cannot be used in dict comprehension\"),\r\nnull;h=g;Sk.asserts.assert(3>11&7;this.__namespaces=c||[]}function c(a,b,c,e,f){this.symFlags={};this.name=b;this.varnames=[];this.children=[];this.blockType=c;this.returnsValue=this.varkeywords=this.varargs=this.generator=this.childHasFree=this.hasFree=this.isNested=!1;this.lineno=f;this.table=a;a.cur&&\r\n(a.cur.nested||\"function\"===a.cur.blockType)&&(this.isNested=!0);e.scopeId=l++;a.stss[e.scopeId]=this;this.symbols={}}function b(a){this.filename=a;this.top=this.cur=null;this.stack=[];this.curClass=this.global=null;this.tmpname=0;this.stss={}}function e(a,b){var c;for(c=0;c>11&7;return 3==a||2==a}));return this._funcGlobals};\r\nc.prototype.get_frees=function(){Sk.asserts.assert(\"function\"==this.get_type(),\"get_frees only valid for function scopes\");this._funcFrees||(this._funcFrees=this._identsMatching(function(a){return 4==(a>>11&7)}));return this._funcFrees};c.prototype.get_methods=function(){var a;Sk.asserts.assert(\"class\"==this.get_type(),\"get_methods only valid for class scopes\");if(!this._classMethods){var b=[];for(a=0;a>11&7};b.prototype.getStsForAst=function(a){Sk.asserts.assert(void 0!==a.scopeId,\"ast wasn't added to st?\");a=this.stss[a.scopeId];Sk.asserts.assert(void 0!==a,\"unknown sym tab entry\");return a};b.prototype.SEQStmt=function(a){var b,c;if(null!==a){Sk.asserts.assert(Sk.isArrayLike(a),\"SEQ: nodes isn't array? got \"+a.toString());var e=a.length;for(c=0;cd||127<=d&&256>d?b+(\"\\\\x\"+(\"0\"+d.toString(16)).substr(-2)):256<=d?b+(\"\\\\u\"+(\"000\"+d.toString(16)).substr(-4)):b+a.charAt(c)}return b+'\"'}var l;Sk.gensymcount=0;c.prototype.activateScope=function(){var a=this;l=function(){var b,c=a.blocks[a.curblock];if(null===c._next)for(b=0;b\",\"\").replace(\" \",\"_\"))};\r\nvar h=Sk.builtin.str.reservedWords_;a.prototype.makeConstant=function(a){var b,c=\"\";for(b=0;b Sk.execLimit) {throw new Sk.builtin.TimeLimitError(Sk.timeoutMsg())}\"),null!==Sk.yieldLimit&&this.u.canSuspend&&(a=a+\"if ($dateNow - Sk.lastYield > Sk.yieldLimit) {\"+(\"var $susp = $saveSuspension({data: {type: 'Sk.yield'}, resume: function() {}}, '\"+this.filename+\"',$currLineNo,$currColNo);\"),a+=\"$susp.$blk = $blk;$susp.optional = true;return $susp;}\",\r\nthis.u.doesSuspend=!0);return a};a.prototype._jumpfalse=function(a,b){a=this._gr(\"jfalse\",\"(\",a,\"===false||!Sk.misceval.isTrue(\",a,\"))\");l(\"if(\",a,\"){/*test failed */$blk=\",b,\";continue;}\")};a.prototype._jumpundef=function(a,b){l(\"if(\",a,\"===undefined){$blk=\",b,\";continue;}\")};a.prototype._jumpnotundef=function(a,b){l(\"if(\",a,\"!==undefined){$blk=\",b,\";continue;}\")};a.prototype._jumptrue=function(a,b){a=this._gr(\"jtrue\",\"(\",a,\"===true||Sk.misceval.isTrue(\",a,\"))\");l(\"if(\",a,\"){/*test passed */$blk=\",\r\nb,\";continue;}\")};a.prototype._jump=function(a){null===this.u.blocks[this.u.curblock]._next&&(l(\"$blk=\",a,\";\"),this.u.blocks[this.u.curblock]._next=a)};a.prototype._checkSuspension=function(a){if(this.u.canSuspend){var b=this.newBlock(\"function return or resume suspension\");this._jump(b);this.setBlock(b);a=a||{lineno:\"$currLineNo\",col_offset:\"$currColNo\"};l(\"if ($ret && $ret.$isSuspension) { return $saveSuspension($ret,'\"+this.filename+\"',\"+a.lineno+\",\"+a.col_offset+\"); }\");this.u.doesSuspend=!0;\r\nthis.u.tempsToSave=this.u.tempsToSave.concat(this.u.localtemps)}else l(\"if ($ret && $ret.$isSuspension) { $ret = Sk.misceval.retryOptionalSuspensionOrThrow($ret); }\")};a.prototype.cunpackstarstoarray=function(a,b){if(!a||0==a.length)return\"[]\";let c=!1;for(let d of a){if(b&&c)throw new Sk.builtin.SyntaxError(\"Extended argument unpacking is not permitted in Python 2\");d.constructor===Sk.astnodes.Starred&&(c=!0)}if(c){b=this._gr(\"unpack\",\"[]\");for(let c of a)c.constructor!==Sk.astnodes.Starred?l(b,\r\n\".push(\",this.vexpr(c),\");\"):(l(\"$ret = Sk.misceval.iterFor(Sk.abstr.iter(\",this.vexpr(c.value),\"), function(e) { \",b,\".push(e); });\"),this._checkSuspension());return b}return\"[\"+a.map(a=>this.vexpr(a)).join(\",\")+\"]\"};a.prototype.ctuplelistorset=function(a,b,c){var d;Sk.asserts.assert(\"tuple\"===c||\"list\"===c||\"set\"===c);var e=!1;for(d=0;d=c.length&&(c=this.vexpr(f),\"dict\"===a?(a=this.vexpr(h),l(b,\".mp$ass_subscript(\",a,\",\",c,\");\")):\"list\"===a?l(b,\".v.push(\",c,\");\"):\"set\"===a&&l(b,\".v.mp$ass_subscript(\",c,\", true);\"),this._jump(g),this.setBlock(g));this._jump(d);this.setBlock(k);return b};a.prototype.cyield=function(a){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError(\"'yield' outside function\",this.filename,a.lineno);var b=\"Sk.builtin.none.none$\";a.value&&(b=this.vexpr(a.value));\r\na=this.newBlock(\"after yield\");l(\"return [/*resume*/\",a,\",/*ret*/\",b,\"];\");this.setBlock(a);return\"$gen.gi$sentvalue\"};a.prototype.ccompare=function(a){var b;Sk.asserts.assert(a.ops.length===a.comparators.length);var c=this.vexpr(a.left);var d=a.ops.length;var e=this.newBlock(\"done\");var f=this._gr(\"compareres\",\"null\");for(b=0;b 0) { throw new Sk.builtin.RuntimeError(\"super(): no arguments\") };'),c=\"[$gbl.__class__,self]\");l(\"$ret = (\",b,\".tp$call)?\",b,\".tp$call(\",c,\",\",d,\") : Sk.misceval.applyOrSuspend(\",\r\nb,\",undefined,undefined,\",d,\",\",c,\");\");this._checkSuspension(a);return this._gr(\"call\",\"$ret\")};a.prototype.cslice=function(a){Sk.asserts.assert(a instanceof Sk.astnodes.Slice);if(Sk.__future__.python3){var b=a.lower?this.vexpr(a.lower):\"Sk.builtin.none.none$\";var c=a.upper?this.vexpr(a.upper):\"Sk.builtin.none.none$\"}else b=a.lower?this.vexpr(a.lower):a.step?\"Sk.builtin.none.none$\":\"new Sk.builtin.int_(0)\",c=a.upper?this.vexpr(a.upper):a.step?\"Sk.builtin.none.none$\":\"new Sk.builtin.int_(2147483647)\";\r\na=a.step?this.vexpr(a.step):\"Sk.builtin.none.none$\";return this._gr(\"slice\",\"new Sk.builtins['slice'](\",b,\",\",c,\",\",a,\")\")};a.prototype.eslice=function(a){var b;Sk.asserts.assert(a instanceof Array);var c=[];for(b=0;bthis.u.lineno&&(this.u.lineno=a.lineno,this.u.linenoSet=!1);switch(a.constructor){case Sk.astnodes.BoolOp:return this.cboolop(a);case Sk.astnodes.BinOp:return this._gr(\"binop\",\"Sk.abstr.numberBinOp(\",this.vexpr(a.left),\",\",this.vexpr(a.right),\",'\",a.op.prototype._astname,\"')\");case Sk.astnodes.UnaryOp:return this._gr(\"unaryop\",\r\n\"Sk.abstr.numberUnaryOp(\",this.vexpr(a.operand),\",'\",a.op.prototype._astname,\"')\");case Sk.astnodes.Lambda:return this.clambda(a);case Sk.astnodes.IfExp:return this.cifexp(a);case Sk.astnodes.Dict:return this.cdict(a);case Sk.astnodes.ListComp:return this.clistcomp(a);case Sk.astnodes.DictComp:return this.cdictcomp(a);case Sk.astnodes.SetComp:return this.csetcomp(a);case Sk.astnodes.GeneratorExp:return this.cgenexp(a);case Sk.astnodes.Yield:return this.cyield(a);case Sk.astnodes.Compare:return this.ccompare(a);\r\ncase Sk.astnodes.Call:return b=this.ccall(a),this.annotateSource(a),b;case Sk.astnodes.Num:if(\"number\"===typeof a.n)return a.n;if(a.n instanceof Sk.builtin.lng)return this.makeConstant(\"new Sk.builtin.lng('\"+a.n.v.toString()+\"')\");if(a.n instanceof Sk.builtin.int_)return\"number\"===typeof a.n.v?this.makeConstant(\"new Sk.builtin.int_(\"+a.n.v+\")\"):this.makeConstant(\"new Sk.builtin.int_('\"+a.n.v.toString()+\"')\");if(a.n instanceof Sk.builtin.float_)return a=0===a.n.v&&-Infinity===1/a.n.v?\"-0\":a.n.v,this.makeConstant(\"new Sk.builtin.float_(\"+\r\na+\")\");if(a.n instanceof Sk.builtin.complex)return this.makeConstant(\"new Sk.builtin.complex(\"+(0===a.n.real&&-Infinity===1/a.n.real?\"-0\":a.n.real)+\", \"+(0===a.n.imag&&-Infinity===1/a.n.imag?\"-0\":a.n.imag)+\")\");Sk.asserts.fail(\"unhandled Num type\");case Sk.astnodes.Bytes:if(Sk.__future__.python3){b=[];a=a.s.$jsstr();for(c=0;c\";this.u.blocks[b]._next=null;return b};a.prototype.setBlock=function(a){Sk.asserts.assert(0<=a&&a0) { $err=err; $blk=$exc.pop(); } else { throw err; } }};\";h+=\"var $saveSuspension = function($child, $filename, $lineno, $colno) {var susp = new Sk.misceval.Suspension(); susp.child=$child;susp.resume=function(){\"+a.scopename+\".$wakingSuspension=susp; return \"+a.scopename+\"(\"+(a.ste.generator?\"$gen\":\"\")+\"); };susp.data=susp.child.data;susp.$blk=$blk;susp.$loc=$loc;susp.$gbl=$gbl;susp.$exc=$exc;susp.$err=$err;susp.$postfinally=$postfinally;susp.$filename=$filename;susp.$lineno=$lineno;susp.$colno=$colno;susp.optional=susp.child.optional;\"+\r\n(f?\"susp.$cell=$cell;\":\"\");e={};for(b=0;ba?this.vexpr(a):\"undefined\"));k&&k.vararg&&(w=k.vararg);k&&k.kwarg&&(K=k.kwarg);if(!Sk.__future__.python3&&k&&k.kwonlyargs&&0!=k.kwonlyargs.length)throw new Sk.builtin.SyntaxError(\"Keyword-only arguments are not supported in Python 2\");\r\nvar G=this.enterScope(c,a,a.lineno,this.canSuspend);f=this.u.ste.generator;var U=this.u.ste.hasFree;var C=this.u.ste.childHasFree;var N=this.newBlock(\"codeobj entry\");this.u.prefixCode=\"var \"+G+\"=(function \"+this.niceName(c.v)+\"$(\";var u=[];if(f){if(K)throw new Sk.builtin.SyntaxError(c.v+\"(): keyword arguments in generators not supported\",this.filename,a.lineno);if(w)throw new Sk.builtin.SyntaxError(c.v+\"(): variable number of arguments in generators not supported\",this.filename,a.lineno);u.push(\"$gen\")}else{K&&\r\n(u.push(\"$kwa\"),this.u.tempsToSave.push(\"$kwa\"));for(g=0;k&&g0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} }});\";h.call(this,G);if(k){for(let a of k.args)d.push(a.arg.v);\r\nfor(let a of k.kwonlyargs||[])d.push(a.arg.v);this.u.argnames=d}this.exitScope();0\"),null,a.args,function(b){b=this.vexpr(a.body);l(\"return \",b,\";\")})};a.prototype.cifexp=function(a){var b=this.newBlock(\"next of ifexp\"),c=this.newBlock(\"end of ifexp\"),d=this._gr(\"res\",\"null\"),e=this.vexpr(a.test);this._jumpfalse(e,b);l(d,\"=\",this.vexpr(a.body),\";\");this._jump(c);\r\nthis.setBlock(b);l(d,\"=\",this.vexpr(a.orelse),\";\");this._jump(c);this.setBlock(c);return d};a.prototype.cgenexpgen=function(a,b,c){var d=this.newBlock(\"start for \"+b),e=this.newBlock(\"skip for \"+b);this.newBlock(\"if cleanup for \"+b);var f=this.newBlock(\"end for \"+b),g=a[b];if(0===b)var h=\"$loc.$iter0\";else{var m=this.vexpr(g.iter);h=\"$loc.\"+this.gensym(\"iter\");l(h,\"=\",\"Sk.abstr.iter(\",m,\");\")}this._jump(d);this.setBlock(d);this.annotateSource(c);l(\"$ret = Sk.abstr.iternext(\",h,this.u.canSuspend?\", true\":\r\n\", false\",\");\");this._checkSuspension(c);m=this._gr(\"next\",\"$ret\");this._jumpundef(m,f);this.vexpr(g.target,m);var n=g.ifs?g.ifs.length:0;for(h=0;h=a.length&&(this.annotateSource(c),a=this.vexpr(c),l(\"return [\",e,\"/*resume*/,\",a,\"/*ret*/];\"),this.setBlock(e));this._jump(d);this.setBlock(f);1===b&&l(\"return Sk.builtin.none.none$;\")};a.prototype.cgenexp=function(a){var b=this.buildcodeobj(a,\r\nnew Sk.builtin.str(\"\"),null,null,function(b){this.cgenexpgen(a.generators,0,a.elt)});b=this._gr(\"gener\",\"Sk.misceval.callsimArray(\",b,\");\");l(b,\".gi$locals.$iter0=Sk.abstr.iter(\",this.vexpr(a.generators[0].iter),\");\");return b};a.prototype.cclass=function(a){Sk.asserts.assert(a instanceof Sk.astnodes.ClassDef);var b=this.vseqexpr(a.decorator_list);var c=this.vseqexpr(a.bases);var d=this.enterScope(a.name,a,a.lineno);var e=this.newBlock(\"class entry\");this.u.prefixCode=\"var \"+d+\"=(function $\"+\r\na.name.v+\"$class_outer($globals,$locals,$cell){var $gbl=$globals,$loc=$locals;$free=$globals;\";this.u.switchCode+=\"(function $\"+a.name.v+\"$_closure($cell){\";this.u.switchCode+=\"var $blk=\"+e+\",$exc=[],$ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;\";null!==Sk.execLimit&&(this.u.switchCode+=\"if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}\");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.switchCode+=\"if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}\");\r\nthis.u.switchCode+=\"while(true){try{\";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+=\"switch($blk){\";this.u.suffixCode=\"}}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '\"+this.filename+\"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }}}\";this.u.suffixCode+=\"}).call(null, $cell);});\";this.u.private_=a.name;this.cbody(a.body,\r\na.name);l(\"return;\");this.exitScope();l(\"$ret = Sk.misceval.buildClass($gbl,\",d,\",\",a.name.$r().v,\",[\",c,\"], $cell);\");for(let a of b)l(\"$ret = Sk.misceval.callsimOrSuspendArray(\",a,\", [$ret]);\"),this._checkSuspension();this.nameop(a.name,Sk.astnodes.Store,\"$ret\")};a.prototype.ccontinue=function(a){var b=this.peekFinallyBlock();if(0==this.u.continueBlocks.length)throw new Sk.builtin.SyntaxError(\"'continue' outside loop\",this.filename,a.lineno);a=this.u.continueBlocks[this.u.continueBlocks.length-\r\n1];Sk.asserts.assert(this.u.breakBlocks.length===this.u.continueBlocks.length);b&&b.breakDepth==this.u.continueBlocks.length?l(\"$postfinally={isBreak:true,gotoBlock:\",a,\"};\"):this._jump(a)};a.prototype.cbreak=function(a){var b=this.peekFinallyBlock();if(0===this.u.breakBlocks.length)throw new Sk.builtin.SyntaxError(\"'break' outside loop\",this.filename,a.lineno);a=this.u.breakBlocks[this.u.breakBlocks.length-1];b&&b.breakDepth==this.u.breakBlocks.length?l(\"$postfinally={isBreak:true,gotoBlock:\",a,\r\n\"};\"):this._jump(a)};a.prototype.vstmt=function(a,b){this.u.lineno=a.lineno;this.u.linenoSet=!1;this.u.localtemps=[];if(Sk.debugging&&this.u.canSuspend){var c=this.newBlock(\"debug breakpoint for line \"+a.lineno);l(\"if (Sk.breakpoints('\"+this.filename+\"',\"+a.lineno+\",\"+a.col_offset+\")) {\",\"var $susp = $saveSuspension({data: {type: 'Sk.debug'}, resume: function() {}}, '\"+this.filename+\"',\"+a.lineno+\",\"+a.col_offset+\");\",\"$susp.$blk = \"+c+\";\",\"$susp.optional = true;\",\"return $susp;\",\"}\");this._jump(c);\r\nthis.setBlock(c);this.u.doesSuspend=!0}this.annotateSource(a);switch(a.constructor){case Sk.astnodes.FunctionDef:this.cfunction(a,b);break;case Sk.astnodes.ClassDef:this.cclass(a);break;case Sk.astnodes.Return:if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError(\"'return' outside function\",this.filename,a.lineno);c=a.value?this.vexpr(a.value):\"Sk.builtin.none.none$\";0==this.u.finallyBlocks.length?l(\"return \",c,\";\"):(l(\"$postfinally={returning:\",c,\"};\"),this._jump(this.peekFinallyBlock().blk));\r\nbreak;case Sk.astnodes.Delete:this.vseqexpr(a.targets);break;case Sk.astnodes.Assign:var d=a.targets.length;c=this.vexpr(a.value);for(b=0;b\"!==a.name.v){var b=a.name.$r().v;b=b.substring(1,b.length-1);l(a.scopename,\".co_name=new Sk.builtins['str']('\",b,\"');\");this.stack.length&&\"class\"==this.u.ste.blockType&&l(a.scopename,\".co_qualname=new Sk.builtins['str']('\"+this.u.name.v+\".\"+b+\"');\")}for(var c in a.consts)a.consts.hasOwnProperty(c)&&\r\n(a.suffixCode+=c+\" = \"+a.consts[c]+\";\")};a.prototype.cbody=function(a,b){var c=0;const d=this.maybeCDocstringOfBody(a);null!==d&&(l(\"$loc.__doc__ = \",d,\";\"),c=1);for(;c\"),a,0,this.canSuspend),c=this.newBlock(\"module entry\");this.u.prefixCode=\"var \"+b+\"=(function($forcegbl){\";this.u.varDeclsCode=\"var $gbl = $forcegbl || {}, $blk=\"+c+\",$exc=[],$loc=$gbl,$cell={},$err=undefined;$loc.__file__=new Sk.builtins.str('\"+this.filename+\"');var $ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;\";null!==Sk.execLimit&&(this.u.varDeclsCode+=\r\n\"if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}\");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.varDeclsCode+=\"if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}\");this.u.varDeclsCode+=\"if (\"+b+\".$wakingSuspension!==undefined) { $wakeFromSuspension(); }if (Sk.retainGlobals) { if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; } if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; $loc.__file__=new Sk.builtins.str('\"+\r\nthis.filename+\"');} else { Sk.globals = $gbl; }} else { Sk.globals = $gbl; }\";this.u.switchCode=\"while(true){try{\";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+=\"switch($blk){\";this.u.suffixCode=\"}\";this.u.suffixCode+=\"}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '\"+this.filename+\"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} } });\";\r\nswitch(a.constructor){case Sk.astnodes.Module:this.cbody(a.body);l(\"return $loc;\");break;default:Sk.asserts.fail(\"todo; unhandled case in compilerMod\")}this.exitScope();this.result.push(this.outputAllUnits());return b};Sk.compile=function(b,c,e,f){e=Sk.__future__;Sk.__future__=Object.create(Sk.__future__);var d=Sk.parse(c,b),g=Sk.astFromParse(d.cst,c,d.flags);d=d.flags;var h=Sk.symboltable(g,c);b=new a(c,h,d,f,b);c=b.cmod(g);Sk.__future__=e;return{funcname:\"$compiledmod\",code:\"$compiledmod = function() {\"+\r\nb.result.join(\"\")+\"\\nreturn \"+c+\";}();\"}};Sk.exportSymbol(\"Sk.compile\",Sk.compile);Sk.resetCompiler=function(){Sk.gensymcount=0};Sk.exportSymbol(\"Sk.resetCompiler\",Sk.resetCompiler);Sk.fixReserved=b;Sk.exportSymbol(\"Sk.fixReserved\",Sk.fixReserved);Sk.unfixReserved=function(a){return a.replace(/_\\$rw\\$$/,\"\")};Sk.exportSymbol(\"Sk.unfixReserved\",Sk.unfixReserved);Sk.mangleName=e;Sk.exportSymbol(\"Sk.mangleName\",Sk.mangleName);Sk.reservedWords_=h;Sk.exportSymbol(\"Sk.reservedWords_\",Sk.reservedWords_)},\r\nfunction(m,q){Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.importSearchPathForName=function(a,c,b){var e=a.replace(/\\./g,\"/\"),f=function(a,b){return Sk.misceval.chain(Sk.misceval.tryCatch(function(){return Sk.read(a)},function(a){}),function(c){if(void 0!==c)return new Sk.misceval.Break({filename:a,code:c,packagePath:b})})};void 0===b&&(b=Sk.realsyspath);return Sk.misceval.iterFor(b.tp$iter(),function(a){return Sk.misceval.chain(f(a.v+\"/\"+e+c,!1),function(b){return b?b:f(a.v+\"/\"+\r\ne+\"/__init__\"+c,a.v+\"/\"+e)})})};Sk.importSetUpPath=function(a){if(!Sk.realsyspath){var c=[new Sk.builtin.str(\"src/builtin\"),new Sk.builtin.str(\"src/lib\"),new Sk.builtin.str(\".\")];for(a=0;ad;++d)a+=\" \";c[b-1]=\"/* \"+a+b+\" */ \"+c[b-1]}return c.join(\"\\n\")};e=f(e);Sk.debugout(e)}e+=\"\\n\"+a.funcname+\";\";e=Sk.global.eval(e);k.$d={__name__:new Sk.builtin.str(b),__doc__:Sk.builtin.none.none$,__package__:a.packagePath?new Sk.builtin.str(b):B?new Sk.builtin.str(A+B):q?q:Sk.builtin.none.none$};a.packagePath&&(k.$d.__path__=new Sk.builtin.tuple([new Sk.builtin.str(a.packagePath)]));return e(k.$d)}},function(b){var c;if(void 0===b){if(l&&!p)return;\r\nthrow new Sk.builtin.ImportError(\"No module named \"+a);}if(b!==k.$d){for(c in k.$d)b[c]||(b[c]=k.$d[c]);k.$d=b}if(Sk.onAfterImport&&\"function\"===typeof Sk.onAfterImport)try{Sk.onAfterImport(a)}catch(U){}if(p)return m.tp$setattr(new Sk.builtin.str(y[y.length-1]),k),p;f&&f.tp$setattr(new Sk.builtin.str(a),k);return k})});return h?E:Sk.misceval.retryOptionalSuspensionOrThrow(E)};Sk.importModule=function(a,c,b){return Sk.importModuleInternal_(a,c,void 0,void 0,void 0,!1,b)};Sk.importMain=function(a,c,\r\nb){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,c,\"__main__\",void 0,void 0,!1,b)};Sk.importMainWithBody=function(a,c,b,e){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,c,\"__main__\",b,void 0,!1,e)};Sk.importBuiltinWithBody=function(a,c,b,e){return Sk.importModuleInternal_(a,c,\"__builtin__.\"+a,b,void 0,\r\n!1,e)};Sk.builtin.__import__=function(a,c,b,e,f){var l=Sk.globals,h;void 0===f&&(f=Sk.__future__.absolute_import?0:-1);if(0!==f&&c.__package__&&c.__package__!==Sk.builtin.none.none$){if((h=c.__package__.v)&&0=c.length)throw new Sk.builtin.ValueError(\"Attempted relative import beyond toplevel package\");c.length-=f-1;h=c.join(\".\")}var d=Sk.sysmodules.quick$lookup(new Sk.builtin.str(h))}if(0>1);this.lt(c,a.getitem(l))?f=l:e=l+1}Sk.asserts.assert(e===f);for(l=b;l>e;l--)a.setitem(l,a.getitem(l-1));a.setitem(e,c)}};Sk.builtin.timSort.prototype.count_run=function(a){var c;if(1>=a.len){var b=a.len;var e=!1}else if(b=2,this.lt(a.getitem(a.base+1),a.getitem(a.base)))for(e=!0,c=a.base+2;cc.len)){this.merge_init();for(a=this.merge_compute_minrun(c.len);0f&&(g=f);d+=b;g+=b}else{for(f=b+1;gf&&(g=f);h=b-d;d=b-g;g=h}Sk.asserts.assert(-1<=d>1),e(c.getitem(c.base+b),a)?d=b+1:g=b;Sk.asserts.assert(d==g);return g};Sk.builtin.timSort.prototype.merge_init=function(){this.min_gallop=this.MIN_GALLOP;this.pending=[]};Sk.builtin.timSort.prototype.merge_lo=function(a,c){var b,\r\ne,f;Sk.asserts.assert(0=l)break}else{this.setitem(h,a.popleft());h++;if(1==a.len)return;b++;e=0;if(b>=l)break}for(l+=1;;){this.min_gallop=l-=1=a.len)return;this.setitem(h,c.popleft());h++;if(0===c.len)return;e=this.gallop(a.getitem(a.base),c,0,!1);for(f=c.base;f=l)break}else{h--;this.setitem(h,g);c.len--;if(1==c.len)return;e++;b=0;if(e>=l)break}}for(l+=\r\n1;;){this.min_gallop=l-=1a.base+m-1;f--)h--,this.setitem(h,a.getitem(f));a.len-=b;if(0===a.len)return;h--;this.setitem(h,c.popright());if(1==c.len)return;d=a.getitem(a.base+a.len-1);m=this.gallop(d,c,c.len-1,!1);e=c.len-m;for(f=c.base+c.len-1;f>c.base+m-1;f--)h--,this.setitem(h,c.getitem(f));c.len-=e;if(1>=c.len)return;h--;this.setitem(h,a.popright());if(0===a.len)return;if(ba.base-1;f--)h--,this.setitem(h,a.getitem(f));for(f=c.base+c.len-1;f>c.base-1;f--)h--,this.setitem(h,c.getitem(f))}};Sk.builtin.timSort.prototype.merge_at=function(a){0>a&&(a=this.pending.length+a);var c=this.pending[a];var b=this.pending[a+1];Sk.asserts.assert(0>=1;return a+c};Sk.builtin.listSlice=function(a,c,b){this.list=a;this.base=c;this.len=b};Sk.builtin.listSlice.prototype.copyitems=function(){var a=this.base,c=this.base+this.len;Sk.asserts.assert(0<=a<=c);return new Sk.builtin.listSlice(new Sk.builtin.list(this.list.v.slice(a,\r\nc)),0,this.len)};Sk.builtin.listSlice.prototype.advance=function(a){this.base+=a;this.len-=a;Sk.asserts.assert(this.base<=this.list.sq$length())};Sk.builtin.listSlice.prototype.getitem=function(a){return this.list.v[a]};Sk.builtin.listSlice.prototype.setitem=function(a,c){this.list.v[a]=c};Sk.builtin.listSlice.prototype.popleft=function(){var a=this.list.v[this.base];this.base++;this.len--;return a};Sk.builtin.listSlice.prototype.popright=function(){this.len--;return this.list.v[this.base+this.len]};\r\nSk.builtin.listSlice.prototype.reverse=function(){for(var a,c,b=this.list,e=this.base,f=e+this.len-1;e same as super(__class__, )\\nsuper(type) -> unbound super object\\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\\nTypical use to call a cooperative superclass method:\\nclass C(B):\\n def meth(self, arg):\\n super().meth(arg)\\nThis works for class methods too:\\nclass C(B):\\n @classmethod\\n def cmeth(cls, arg):\\n super().cmeth(arg)\\n\",\r\ntp$new:Sk.generic.new,tp$init(a,c){Sk.abstr.checkNoKwargs(\"super\",c);Sk.abstr.checkArgsLen(\"super\",a,1,2);c=a[0];a=a[1];if(!Sk.builtin.checkClass(c))throw new Sk.builtin.TypeError(\"must be type, not \"+Sk.abstr.typeName(c));this.obj=a;this.type=c;null!=this.obj&&(this.obj_type=this.$supercheck(c,this.obj))},$r(){return this.obj?new Sk.builtin.str(\", <\"+Sk.abstr.typeName(this.obj)+\" object>>\"):new Sk.builtin.str(\", NULL>\")},tp$getattr(a,c){let b=this.obj_type;if(null==b)return Sk.generic.getAttr.call(this,a,c);var e=b.prototype.tp$mro;const f=e.length;if(a===Sk.builtin.str.$class)return Sk.generic.getAttr.call(this,a,c);let l;for(l=0;l+1=f)return Sk.generic.getAttr.call(this,a,c);a=a.$mangled;let h;for(;l module\\n\\nImport a module. Because this function is meant for use by the Python\\ninterpreter and not for general use, it is better to use\\nimportlib.import_module() to programmatically import a module.\\n\\nThe globals argument is only used to determine the context;\\nthey are not modified. The locals argument is unused. The fromlist\\nshould be a list of names to emulate ``from name import ...'', or an\\nempty list to emulate ``import name''.\\nWhen importing a module from a package, note that __import__('A.B', ...)\\nreturns package A when fromlist is empty, but its submodule B when\\nfromlist is not empty. The level argument is used to determine whether to\\nperform absolute or relative imports: 0 is absolute, while a positive number\\nis the number of parent directories to search relative to the current module.\"},\r\nabs:{$meth:Sk.builtin.abs,$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the absolute value of the argument.\"},all:{$meth:Sk.builtin.all,$flags:{OneArg:!0},$textsig:\"($module, iterable, /)\",$doc:\"Return True if bool(x) is True for all values x in the iterable.\\n\\nIf the iterable is empty, return True.\"},any:{$meth:Sk.builtin.any,$flags:{OneArg:!0},$textsig:\"($module, iterable, /)\",$doc:\"Return True if bool(x) is True for any x in the iterable.\\n\\nIf the iterable is empty, return False.\"},\r\nascii:{$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return an ASCII-only representation of an object.\\n\\nAs repr(), return a string containing a printable representation of an\\nobject, but escape the non-ASCII characters in the string returned by\\nrepr() using \\\\\\\\x, \\\\\\\\u or \\\\\\\\U escapes. This generates a string similar\\nto that returned by repr() in Python 2.\"},bin:{$meth:Sk.builtin.bin,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the binary representation of an integer.\\n\\n >>> bin(2796202)\\n '0b1010101010101010101010'\"},\r\ncallable:{$meth:Sk.builtin.callable,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return whether the object is callable (i.e., some kind of function).\\n\\nNote that classes are callable, as are instances of classes with a\\n__call__() method.\"},chr:{$meth:Sk.builtin.chr,$flags:{OneArg:!0},$textsig:\"($module, i, /)\",$doc:\"Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.\"},delattr:{$meth:Sk.builtin.delattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, name, /)\",\r\n$doc:\"Deletes the named attribute from the given object.\\n\\ndelattr(x, 'y') is equivalent to ``del x.y''\"},dir:{$meth:Sk.builtin.dir,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"dir([object]) -> list of strings\\n\\nIf called without an argument, return the names in the current scope.\\nElse, return an alphabetized list of names comprising (some of) the attributes\\nof the given object, and of attributes reachable from it.\\nIf the object supplies a method named __dir__, it will be used; otherwise\\nthe default dir() logic is used and returns:\\n for a module object: the module's attributes.\\n for a class object: its attributes, and recursively the attributes\\n of its bases.\\n for any other object: its attributes, its class's attributes, and\\n recursively the attributes of its class's base classes.\"},\r\ndivmod:{$meth:Sk.builtin.divmod,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return the tuple (x//y, x%y). Invariant: div*y + mod == x.\"},eval_$rw$:{$name:\"eval\",$meth:Sk.builtin.eval_,$flags:{MinArgs:1,MaxArgs:3},$textsig:\"($module, source, globals=None, locals=None, /)\",$doc:\"Evaluate the given source in the context of globals and locals.\\n\\nThe source may be a string representing a Python expression\\nor a code object as returned by compile().\\nThe globals must be a dictionary and locals can be any mapping,\\ndefaulting to the current globals and locals.\\nIf only globals is given, locals defaults to it.\"},\r\nformat:{$meth:Sk.builtin.format,$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($module, value, format_spec='', /)\",$doc:\"Return value.__format__(format_spec)\\n\\nformat_spec defaults to the empty string.\\nSee the Format Specification Mini-Language section of help('FORMATTING') for\\ndetails.\"},getattr:{$meth:Sk.builtin.getattr,$flags:{MinArgs:2,MaxArgs:3},$textsig:null,$doc:\"getattr(object, name[, default]) -> value\\n\\nGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\\nWhen a default argument is given, it is returned when the attribute doesn't\\nexist; without it, an exception is raised in that case.\"},\r\nglobals:{$meth:Sk.builtin.globals,$flags:{NoArgs:!0},$textsig:\"($module, /)\",$doc:\"Return the dictionary containing the current scope's global variables.\\n\\nNOTE: Updates to this dictionary *will* affect name lookups in the current\\nglobal scope and vice-versa.\"},hasattr:{$meth:Sk.builtin.hasattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, name, /)\",$doc:\"Return whether the object has an attribute with the given name.\\n\\nThis is done by calling getattr(obj, name) and catching AttributeError.\"},\r\nhash:{$meth:Sk.builtin.hash,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the hash value for the given object.\\n\\nTwo objects that compare equal must also have the same hash value, but the\\nreverse is not necessarily true.\"},hex:{$meth:Sk.builtin.hex,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the hexadecimal representation of an integer.\\n\\n >>> hex(12648430)\\n '0xc0ffee'\"},id:{$meth:Sk.builtin.id,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the identity of an object.\\n\\nThis is guaranteed to be unique among simultaneously existing objects.\\n(CPython uses the object's memory address.)\"},\r\ninput:{$meth:Sk.builtin.input,$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($module, prompt=None, /)\",$doc:\"Read a string from standard input. The trailing newline is stripped.\\n\\nThe prompt string, if given, is printed to standard output without a\\ntrailing newline before reading input.\\n\\nIf the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.\\nOn *nix systems, readline is used if available.\"},isinstance:{$meth:Sk.builtin.isinstance,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, class_or_tuple, /)\",\r\n$doc:\"Return whether an object is an instance of a class or of a subclass thereof.\\n\\nA tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to\\ncheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)\\nor ...`` etc.\"},issubclass:{$meth:Sk.builtin.issubclass,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, cls, class_or_tuple, /)\",$doc:\"Return whether 'cls' is a derived from another class or is the same class.\\n\\nA tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to\\ncheck against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)\\nor ...`` etc.\"},\r\niter:{$meth:Sk.builtin.iter,$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($module, iterable /)\",$doc:\"iter(iterable) -> iterator\\niter(callable, sentinel) -> iterator\\n\\nGet an iterator from an object. In the first form, the argument must\\nsupply its own iterator, or be a sequence.\\nIn the second form, the callable is called until it returns the sentinel.\"},len:{$meth:Sk.builtin.len,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the number of items in a container.\"},locals:{$meth:Sk.builtin.locals,\r\n$flags:{NoArgs:!0},$textsig:\"($module, /)\",$doc:\"Return a dictionary containing the current scope's local variables.\\n\\nNOTE: Whether or not updates to this dictionary will affect name lookups in\\nthe local scope and vice-versa is *implementation dependent* and not\\ncovered by any backwards compatibility guarantees.\"},max:{$meth:Sk.builtin.max,$flags:{FastCall:!0},$textsig:null,$doc:\"max(iterable, *[, default=obj, key=func]) -> value\\nmax(arg1, arg2, *args, *[, key=func]) -> value\\n\\nWith a single iterable argument, return its biggest item. The\\ndefault keyword-only argument specifies an object to return if\\nthe provided iterable is empty.\\nWith two or more arguments, return the largest argument.\"},\r\nmin:{$meth:Sk.builtin.min,$flags:{FastCall:!0},$textsig:null,$doc:\"min(iterable, *[, default=obj, key=func]) -> value\\nmin(arg1, arg2, *args, *[, key=func]) -> value\\n\\nWith a single iterable argument, return its smallest item. The\\ndefault keyword-only argument specifies an object to return if\\nthe provided iterable is empty.\\nWith two or more arguments, return the smallest argument.\"},next:{$name:\"next\",$meth:Sk.builtin.next_,$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"next(iterator[, default])\\n\\nReturn the next item from the iterator. If default is given and the iterator\\nis exhausted, it is returned instead of raising StopIteration.\"},\r\noct:{$meth:Sk.builtin.oct,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the octal representation of an integer.\\n\\n >>> oct(342391)\\n '0o1234567'\"},open:{$meth:Sk.builtin.open,$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"open(name[, mode[, buffering]]) -> file object\\n\\nOpen a file using the file() type, returns a file object. This is the\\npreferred way to open a file. See file.__doc__ for further information.\"},ord:{$meth:Sk.builtin.ord,$flags:{OneArg:!0},$textsig:\"($module, c, /)\",\r\n$doc:\"Return the Unicode code point for a one-character string.\"},pow:{$meth:Sk.builtin.pow,$flags:{MinArgs:2,MaxArgs:3},$textsig:\"($module, x, y, z=None, /)\",$doc:\"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\\n\\nSome types, such as ints, are able to use a more efficient algorithm when\\ninvoked using the three argument form.\"},print:{$meth:Sk.builtin.print,$flags:{FastCall:!0},$textsig:null,$doc:\"print(value, ..., sep=' ', end='\\\\n', file=sys.stdout, flush=False)\\n\\nPrints the values to a stream, or to sys.stdout by default.\\nOptional keyword arguments:\\nfile: a file-like object (stream); defaults to the current sys.stdout.\\nsep: string inserted between values, default a space.\\nend: string appended after the last value, default a newline.\\nflush: whether to forcibly flush the stream.\"},\r\nrepr:{$meth:Sk.builtin.repr,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the canonical string representation of the object.\\n\\nFor many object types, including most builtins, eval(repr(obj)) == obj.\"},round:{$meth:Sk.builtin.round,$flags:{NamedArgs:[\"number\",\"ndigits\"]},$textsig:\"($module, /, number, ndigits=None)\",$doc:\"Round a number to a given precision in decimal digits.\\n\\nThe return value is an integer if ndigits is omitted or None. Otherwise\\nthe return value has the same type as the number. ndigits may be negative.\"},\r\nsetattr:{$meth:Sk.builtin.setattr,$flags:{MinArgs:3,MaxArgs:3},$textsig:\"($module, obj, name, value, /)\",$doc:\"Sets the named attribute on the given object to the specified value.\\n\\nsetattr(x, 'y', v) is equivalent to ``x.y = v''\"},sorted:{$meth:Sk.builtin.sorted,$flags:{NamedArgs:[null,\"cmp\",\"key\",\"reverse\"],Defaults:[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]},$textsig:\"($module, iterable, /, *, key=None, reverse=False)\",$doc:\"Return a new list containing all items from the iterable in ascending order.\\n\\nA custom key function can be supplied to customize the sort order, and the\\nreverse flag can be set to request the result in descending order.\"},\r\nsum:{$meth:Sk.builtin.sum,$flags:{NamedArgs:[null,\"start\"],Defaults:[new Sk.builtin.int_(0)]},$textsig:\"($module, iterable, /, start=0)\",$doc:\"Return the sum of a 'start' value (default: 0) plus an iterable of numbers\\n\\nWhen the iterable is empty, return the start value.\\nThis function is intended specifically for use with numeric values and may\\nreject non-numeric types.\"},vars:{$meth:Sk.builtin.vars,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"vars([object]) -> dictionary\\n\\nWithout arguments, equivalent to locals().\\nWith an argument, equivalent to object.__dict__.\"}});\r\nSk.setupObjects=function(a){a?(Sk.builtins.filter=Sk.builtin.filter_,Sk.builtins.map=Sk.builtin.map_,Sk.builtins.zip=Sk.builtin.zip_,Sk.builtins.range=Sk.builtin.range_,delete Sk.builtins.xrange,delete Sk.builtins.StandardError,delete Sk.builtins.unicode,delete Sk.builtins.basestring,delete Sk.builtins.long_$rw$,Sk.builtin.int_.prototype.$r=function(){return new Sk.builtin.str(this.v.toString())},delete Sk.builtin.int_.prototype.tp$str,delete Sk.builtin.bool.prototype.tp$str,delete Sk.builtins.raw_input,\r\ndelete Sk.builtin.str.prototype.decode,Sk.builtins.bytes=Sk.builtin.bytes,Sk.builtins.ascii=new Sk.builtin.sk_method({$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return an ASCII-only representation of an object.\\n\\nAs repr(), return a string containing a printable representation of an\\nobject, but escape the non-ASCII characters in the string returned by\\nrepr() using \\\\\\\\x, \\\\\\\\u or \\\\\\\\U escapes. This generates a string similar\\nto that returned by repr() in Python 2.\"},\r\nnull,\"builtins\")):(Sk.builtins.range=new Sk.builtin.sk_method({$meth:Sk.builtin.range,$name:\"range\",$flags:{MinArgs:1,MaxArgs:3}},void 0,\"builtins\"),Sk.builtins.xrange=new Sk.builtin.sk_method({$meth:Sk.builtin.xrange,$name:\"xrange\",$flags:{MinArgs:1,MaxArgs:3}},null,\"builtins\"),Sk.builtins.filter=new Sk.builtin.func(Sk.builtin.filter),Sk.builtins.map=new Sk.builtin.func(Sk.builtin.map),Sk.builtins.zip=new Sk.builtin.func(Sk.builtin.zip),Sk.builtins.StandardError=Sk.builtin.Exception,Sk.builtins.unicode=\r\nSk.builtin.str,Sk.builtins.basestring=Sk.builtin.str,Sk.builtins.long_$rw$=Sk.builtin.lng,Sk.builtin.int_.prototype.$r=function(){const a=this.v;return\"number\"===typeof a?new Sk.builtin.str(a.toString()):new Sk.builtin.str(a.toString()+\"L\")},Sk.builtin.int_.prototype.tp$str=function(){return new Sk.builtin.str(this.v.toString())},Sk.builtin.bool.prototype.tp$str=function(){return this.$r()},Sk.builtins.raw_input=new Sk.builtin.func(Sk.builtin.raw_input),Sk.builtin.str.prototype.decode=Sk.builtin.str.$py2decode,\r\ndelete Sk.builtins.bytes,delete Sk.builtins.ascii)};Sk.exportSymbol(\"Sk.setupObjects\",Sk.setupObjects);Sk.exportSymbol(\"Sk.builtins\",Sk.builtins)},function(m,q){Sk.builtin.str.$empty=new Sk.builtin.str(\"\");Sk.builtin.str.$emptystr=Sk.builtin.str.$empty;Sk.builtin.str.$utf8=new Sk.builtin.str(\"utf-8\");Sk.builtin.str.$ascii=new Sk.builtin.str(\"ascii\");Sk.builtin.str.$default_factory=new Sk.builtin.str(\"default_factory\");Sk.builtin.str.$imag=new Sk.builtin.str(\"imag\");Sk.builtin.str.$real=new Sk.builtin.str(\"real\");\r\nSk.builtin.str.$abs=new Sk.builtin.str(\"__abs__\");Sk.builtin.str.$bytes=new Sk.builtin.str(\"__bytes__\");Sk.builtin.str.$call=new Sk.builtin.str(\"__call__\");Sk.builtin.str.$class=new Sk.builtin.str(\"__class__\");Sk.builtin.str.$cmp=new Sk.builtin.str(\"__cmp__\");Sk.builtin.str.$complex=new Sk.builtin.str(\"__complex__\");Sk.builtin.str.$contains=new Sk.builtin.str(\"__contains__\");Sk.builtin.str.$copy=new Sk.builtin.str(\"__copy__\");Sk.builtin.str.$dict=new Sk.builtin.str(\"__dict__\");Sk.builtin.str.$dir=\r\nnew Sk.builtin.str(\"__dir__\");Sk.builtin.str.$doc=new Sk.builtin.str(\"__doc__\");Sk.builtin.str.$enter=new Sk.builtin.str(\"__enter__\");Sk.builtin.str.$eq=new Sk.builtin.str(\"__eq__\");Sk.builtin.str.$exit=new Sk.builtin.str(\"__exit__\");Sk.builtin.str.$index=new Sk.builtin.str(\"__index__\");Sk.builtin.str.$init=new Sk.builtin.str(\"__init__\");Sk.builtin.str.$int_=new Sk.builtin.str(\"__int__\");Sk.builtin.str.$iter=new Sk.builtin.str(\"__iter__\");Sk.builtin.str.$file=new Sk.builtin.str(\"__file__\");Sk.builtin.str.$float_=\r\nnew Sk.builtin.str(\"__float__\");Sk.builtin.str.$format=new Sk.builtin.str(\"__format__\");Sk.builtin.str.$ge=new Sk.builtin.str(\"__ge__\");Sk.builtin.str.$getattr=new Sk.builtin.str(\"__getattr__\");Sk.builtin.str.$getattribute=new Sk.builtin.str(\"__getattribute__\");Sk.builtin.str.$getitem=new Sk.builtin.str(\"__getitem__\");Sk.builtin.str.$gt=new Sk.builtin.str(\"__gt__\");Sk.builtin.str.$keys=new Sk.builtin.str(\"keys\");Sk.builtin.str.$le=new Sk.builtin.str(\"__le__\");Sk.builtin.str.$len=new Sk.builtin.str(\"__len__\");\r\nSk.builtin.str.$length_hint=new Sk.builtin.str(\"__length_hint__\");Sk.builtin.str.$loader=new Sk.builtin.str(\"__loader__\");Sk.builtin.str.$lt=new Sk.builtin.str(\"__lt__\");Sk.builtin.str.$module=new Sk.builtin.str(\"__module__\");Sk.builtin.str.$missing=new Sk.builtin.str(\"__missing__\");Sk.builtin.str.$name=new Sk.builtin.str(\"__name__\");Sk.builtin.str.$ne=new Sk.builtin.str(\"__ne__\");Sk.builtin.str.$new=new Sk.builtin.str(\"__new__\");Sk.builtin.str.$next=new Sk.builtin.str(\"__next__\");Sk.builtin.str.$path=\r\nnew Sk.builtin.str(\"__path__\");Sk.builtin.str.$qualname=new Sk.builtin.str(\"__qualname__\");Sk.builtin.str.$repr=new Sk.builtin.str(\"__repr__\");Sk.builtin.str.$reversed=new Sk.builtin.str(\"__reversed__\");Sk.builtin.str.$round=new Sk.builtin.str(\"__round__\");Sk.builtin.str.$setattr=new Sk.builtin.str(\"__setattr__\");Sk.builtin.str.$setitem=new Sk.builtin.str(\"__setitem__\");Sk.builtin.str.$str=new Sk.builtin.str(\"__str__\");Sk.builtin.str.$trunc=new Sk.builtin.str(\"__trunc__\");Sk.builtin.str.$write=new Sk.builtin.str(\"write\");\r\nSk.misceval.op2method_={Eq:Sk.builtin.str.$eq,NotEq:Sk.builtin.str.$ne,Gt:Sk.builtin.str.$gt,GtE:Sk.builtin.str.$ge,Lt:Sk.builtin.str.$lt,LtE:Sk.builtin.str.$le}}]);}).call(this || window)","import $ from 'jquery';\r\nimport { Msg } from 'blockly/core';\r\nimport {\r\n PageBase,\r\n HTMLTemplate,\r\n StatusBarsManager,\r\n Workspace\r\n} from 'mixly';\r\nimport STATUS_BAR_IMAGE_TEMPLATE from '../templates/html/statusbar-image.html';\r\n\r\n\r\nclass StatusBarImage extends PageBase {\r\n static {\r\n HTMLTemplate.add(\r\n 'html/statusbar/statusbar-image.html',\r\n new HTMLTemplate(STATUS_BAR_IMAGE_TEMPLATE)\r\n );\r\n\r\n this.init = function () {\r\n StatusBarsManager.typesRegistry.register(['images'], StatusBarImage);\r\n const mainWorkspace = Workspace.getMain();\r\n const statusBarsManager = mainWorkspace.getStatusBarsManager();\r\n statusBarsManager.add({\r\n type: 'images',\r\n id: 'images',\r\n name: Msg.MIXLY_MICROBIT_IMAGE,\r\n title: Msg.MIXLY_MICROBIT_IMAGE\r\n });\r\n statusBarsManager.changeTo('output');\r\n }\r\n }\r\n\r\n constructor() {\r\n super();\r\n const $content = $(HTMLTemplate.get('html/statusbar/statusbar-image.html').render());\r\n this.setContent($content);\r\n }\r\n\r\n init() {\r\n super.init();\r\n this.hideCloseBtn();\r\n }\r\n\r\n clean() {\r\n this.getContent().empty();\r\n }\r\n\r\n display(data) {\r\n const $content = this.getContent();\r\n const autoFit = function (node) {\r\n node.style.width = 'auto';\r\n node.style.height = 'auto';\r\n node.style.maxWidth = '100%';\r\n node.style.maxHeight = '100%';\r\n };\r\n this.clean();\r\n let root = data.content;\r\n let canvas = null;\r\n let iframe = null;\r\n switch (data.display_type) {\r\n case 'p5':\r\n root.style.width = '100%';\r\n root.style.height = '100%';\r\n root.style.display = 'flex';\r\n root.style.justifyContent = 'center';\r\n root.style.alignItems = 'center';\r\n\r\n // some canvas nodes can be added later so we observe...\r\n new MutationObserver(function (mutationsList) {\r\n mutationsList.forEach((mutation) =>\r\n mutation.addedNodes.forEach((node) => {\r\n const elem = node;\r\n if (\r\n elem.tagName != null &&\r\n ['canvas', 'video'].includes(elem.tagName.toLowerCase())\r\n )\r\n autoFit(elem);\r\n })\r\n );\r\n }).observe(root, { childList: true });\r\n\r\n root.querySelectorAll('canvas,video').forEach(autoFit);\r\n $content.append(root);\r\n break;\r\n case 'matplotlib':\r\n canvas = root.querySelector('canvas');\r\n if (canvas) root = canvas;\r\n root.style.width = '';\r\n root.style.height = '';\r\n root.style.maxWidth = '100%';\r\n root.style.maxHeight = '100%';\r\n $content.append(root);\r\n break;\r\n case 'ocaml-canvas':\r\n root.style.width = '';\r\n root.style.height = '';\r\n root.style.maxWidth = '100%';\r\n root.style.maxHeight = '100%';\r\n $content.append(root);\r\n break;\r\n case 'turtle':\r\n // Turtle result\r\n root.setAttribute('width', '100%');\r\n root.setAttribute('height', '100%');\r\n $content.append(root.outerHTML);\r\n break;\r\n case 'sympy':\r\n $content.append(data.content);\r\n if (typeof window.MathJax === 'undefined') {\r\n // dynamically loading MathJax\r\n console.log('Loading MathJax (Sympy expression needs it).');\r\n (function () {\r\n let script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src =\r\n 'https://cdn.jsdelivr.net/npm/mathjax@3.0.5/es5/tex-mml-chtml.js';\r\n document.getElementsByTagName('head')[0].appendChild(script);\r\n })();\r\n } else {\r\n // otherwise, render it\r\n window.MathJax.typeset();\r\n }\r\n break;\r\n case 'multiple':\r\n /* typically dispached by display() */\r\n for (let mime of [\r\n 'image/svg+xml',\r\n 'image/png',\r\n 'text/html',\r\n 'text/plain',\r\n ]) {\r\n if (mime in data.content) {\r\n let content = data.content[mime];\r\n if (mime === 'image/png') {\r\n content =\r\n '';\r\n }\r\n $content.append(content);\r\n break;\r\n }\r\n }\r\n break;\r\n case 'tutor':\r\n // hacky but iframe.document.body.style require to wait for\r\n // iframe loading\r\n $content.append($(data.content.replace('overflow-y%3A%20hidden%3B', '')));\r\n iframe = this.getContent()[0].getElementsByTagName('iframe')[0];\r\n if (iframe == null) return;\r\n // trick to avoid taking height update into account\r\n iframe.style.maxHeight = iframe.style.minHeight = '100%';\r\n\r\n // force rendering when visible,\r\n // otherwise, strange things happends\r\n // since PythonTutor check for visibility at some point\r\n new IntersectionObserver((entries, observer) => {\r\n const entry = entries[0];\r\n if (entry && !entry.isIntersecting) return;\r\n iframe.contentWindow?.postMessage({ type: 'redraw' }, '*');\r\n observer.disconnect();\r\n }).observe(iframe);\r\n\r\n break;\r\n default:\r\n console.error(\r\n `Not supported node type '${data.display_type}' in eval.display result processing.`\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default StatusBarImage;","// extracted by mini-css-extract-plugin\nexport {};","module.exports = $;","module.exports = Blockly;","module.exports = Mixly;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","import * as Blockly from 'blockly/core';\r\nimport { Profile } from 'mixly';\r\n\r\nimport Variables from '@mixly/python/others/variables';\r\nimport Procedures from '@mixly/python/others/procedures';\r\nimport { Python } from '@mixly/python/python_generator';\r\n\r\nimport * as PythonVariablesBlocks from '@mixly/python/blocks/variables';\r\nimport * as PythonControlBlocks from '@mixly/python/blocks/control';\r\nimport * as PythonMathBlocks from '@mixly/python/blocks/math';\r\nimport * as PythonTextBlocks from '@mixly/python/blocks/text';\r\nimport * as PythonListsBlocks from '@mixly/python/blocks/lists';\r\nimport * as PythonDictsBlocks from '@mixly/python/blocks/dicts';\r\nimport * as PythonLogicBlocks from '@mixly/python/blocks/logic';\r\nimport * as PythonStorageBlocks from '@mixly/python/blocks/storage';\r\nimport * as PythonProceduresBlocks from '@mixly/python/blocks/procedures';\r\nimport * as PythonTupleBlocks from '@mixly/python/blocks/tuple';\r\nimport * as PythonSetBlocks from '@mixly/python/blocks/set';\r\nimport * as PythonHtmlBlocks from '@mixly/python/blocks/html';\r\nimport * as PythonUtilityBlocks from '@mixly/python/blocks/utility';\r\n\r\nimport * as SkulptPyDataBlocks from '@mixly/python-skulpt/blocks/data';\r\nimport * as SkulptPyInoutBlocks from '@mixly/python-skulpt/blocks/inout';\r\nimport * as SkulptPySystemBlocks from '@mixly/python-skulpt/blocks/system';\r\nimport * as SkulptPyTurtleBlocks from '@mixly/python-skulpt/blocks/turtle';\r\n\r\nimport * as GameBlocks from './blocks/game';\r\n\r\nimport * as PythonVariablesGenerators from '@mixly/python/generators/variables';\r\nimport * as PythonControlGenerators from '@mixly/python/generators/control';\r\nimport * as PythonMathGenerators from '@mixly/python/generators/math';\r\nimport * as PythonTextGenerators from '@mixly/python/generators/text';\r\nimport * as PythonListsGenerators from '@mixly/python/generators/lists';\r\nimport * as PythonDictsGenerators from '@mixly/python/generators/dicts';\r\nimport * as PythonLogicGenerators from '@mixly/python/generators/logic';\r\nimport * as PythonStorageGenerators from '@mixly/python/generators/storage';\r\nimport * as PythonProceduresGenerators from '@mixly/python/generators/procedures';\r\nimport * as PythonTupleGenerators from '@mixly/python/generators/tuple';\r\nimport * as PythonSetGenerators from '@mixly/python/generators/set';\r\nimport * as PythonHtmlGenerators from '@mixly/python/generators/html';\r\nimport * as PythonUtilityGenerators from '@mixly/python/generators/utility';\r\n\r\nimport * as SkulptPyDataGenerators from '@mixly/python-skulpt/generators/data';\r\nimport * as SkulptPyInoutGenerators from '@mixly/python-skulpt/generators/inout';\r\nimport * as SkulptPySystemGenerators from '@mixly/python-skulpt/generators/system';\r\nimport * as SkulptPyTurtleGenerators from '@mixly/python-skulpt/generators/turtle';\r\n\r\nimport * as GameGenerators from './generators/game';\r\n\r\nimport './others/loader';\r\n\r\nimport './css/color_mixpy_python_skulpt.css';\r\n\r\nObject.assign(Blockly.Variables, Variables);\r\nObject.assign(Blockly.Procedures, Procedures);\r\nBlockly.Python = Python;\r\nBlockly.generator = Python;\r\n\r\nProfile.default = {};\r\n\r\nObject.assign(\r\n Blockly.Blocks,\r\n PythonVariablesBlocks,\r\n PythonControlBlocks,\r\n PythonMathBlocks,\r\n PythonTextBlocks,\r\n PythonListsBlocks,\r\n PythonDictsBlocks,\r\n PythonLogicBlocks,\r\n PythonStorageBlocks,\r\n PythonProceduresBlocks,\r\n PythonTupleBlocks,\r\n PythonSetBlocks,\r\n PythonHtmlBlocks,\r\n PythonUtilityBlocks,\r\n SkulptPyDataBlocks,\r\n SkulptPyInoutBlocks,\r\n SkulptPySystemBlocks,\r\n SkulptPyTurtleBlocks,\r\n GameBlocks,\r\n);\r\n\r\nObject.assign(\r\n Blockly.Python.forBlock,\r\n PythonVariablesGenerators,\r\n PythonControlGenerators,\r\n PythonMathGenerators,\r\n PythonTextGenerators,\r\n PythonListsGenerators,\r\n PythonDictsGenerators,\r\n PythonLogicGenerators,\r\n PythonStorageGenerators,\r\n PythonProceduresGenerators,\r\n PythonTupleGenerators,\r\n PythonSetGenerators,\r\n PythonHtmlGenerators,\r\n PythonUtilityGenerators,\r\n SkulptPyDataGenerators,\r\n SkulptPyInoutGenerators,\r\n SkulptPySystemGenerators,\r\n SkulptPyTurtleGenerators,\r\n GameGenerators\r\n);"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/boards/default/python_skulpt_car/main.bundle.64d85e8e.js b/boards/default/python_skulpt_car/main.bundle.64d85e8e.js deleted file mode 100644 index e478876c..00000000 --- a/boards/default/python_skulpt_car/main.bundle.64d85e8e.js +++ /dev/null @@ -1,21 +0,0 @@ -(()=>{var e={301:e=>{!function(){function t(e){return e&&e.__esModule?{d:e.default}:{d:e}}function n(e){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}var i,r=this,s={},o={},a={};!function(e,t){"object"==typeof a?a=t(function(){try{return n("poly-decomp")}catch(e){}}()):"object"==typeof a?(i=t(function(){try{return n("poly-decomp")}catch(e){}}()),a.Matter=i):e.Matter=t(e.decomp)}(a,(function(e){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=24)}([function(e,t){var n={};e.exports=n,function(){n._nextId=0,n._seed=0,n._nowStartTime=+new Date,n.extend=function(e,t){var i,r;"boolean"==typeof t?(i=2,r=t):(i=1,r=!0);for(var s=i;s0;t--){var i=Math.floor(n.random()*(t+1)),r=e[t];e[t]=e[i],e[i]=r}return e},n.choose=function(e){return e[Math.floor(n.random()*e.length)]},n.isElement=function(e){return"undefined"!=typeof HTMLElement?e instanceof HTMLElement:!!(e&&e.nodeType&&e.nodeName)},n.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)},n.isFunction=function(e){return"function"==typeof e},n.isPlainObject=function(e){return"object"==typeof e&&e.constructor===Object},n.isString=function(e){return"[object String]"===toString.call(e)},n.clamp=function(e,t,n){return en?n:e},n.sign=function(e){return e<0?-1:1},n.now=function(){if("undefined"!=typeof window&&window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return new Date-n._nowStartTime},n.random=function(t,n){return n=void 0!==n?n:1,(t=void 0!==t?t:0)+e()*(n-t)};var e=function(){return n._seed=(9301*n._seed+49297)%233280,n._seed/233280};n.colorToNumber=function(e){return 3==(e=e.replace("#","")).length&&(e=e.charAt(0)+e.charAt(0)+e.charAt(1)+e.charAt(1)+e.charAt(2)+e.charAt(2)),parseInt(e,16)},n.logLevel=1,n.log=function(){console&&n.logLevel>0&&n.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.info=function(){console&&n.logLevel>0&&n.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.warn=function(){console&&n.logLevel>0&&n.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.nextId=function(){return n._nextId++},n.indexOf=function(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0;ne.max.x&&(e.max.x=r.x),r.xe.max.y&&(e.max.y=r.y),r.y0?e.max.x+=n.x:e.min.x+=n.x,n.y>0?e.max.y+=n.y:e.min.y+=n.y)},n.contains=function(e,t){return t.x>=e.min.x&&t.x<=e.max.x&&t.y>=e.min.y&&t.y<=e.max.y},n.overlaps=function(e,t){return e.min.x<=t.max.x&&e.max.x>=t.min.x&&e.max.y>=t.min.y&&e.min.y<=t.max.y},n.translate=function(e,t){e.min.x+=t.x,e.max.x+=t.x,e.min.y+=t.y,e.max.y+=t.y},n.shift=function(e,t){var n=e.max.x-e.min.x,i=e.max.y-e.min.y;e.min.x=t.x,e.max.x=t.x+n,e.min.y=t.y,e.max.y=t.y+i}},function(e,t){var n={};e.exports=n,n.create=function(e,t){return{x:e||0,y:t||0}},n.clone=function(e){return{x:e.x,y:e.y}},n.magnitude=function(e){return Math.sqrt(e.x*e.x+e.y*e.y)},n.magnitudeSquared=function(e){return e.x*e.x+e.y*e.y},n.rotate=function(e,t,n){var i=Math.cos(t),r=Math.sin(t);n||(n={});var s=e.x*i-e.y*r;return n.y=e.x*r+e.y*i,n.x=s,n},n.rotateAbout=function(e,t,n,i){var r=Math.cos(t),s=Math.sin(t);i||(i={});var o=n.x+((e.x-n.x)*r-(e.y-n.y)*s);return i.y=n.y+((e.x-n.x)*s+(e.y-n.y)*r),i.x=o,i},n.normalise=function(e){var t=n.magnitude(e);return 0===t?{x:0,y:0}:{x:e.x/t,y:e.y/t}},n.dot=function(e,t){return e.x*t.x+e.y*t.y},n.cross=function(e,t){return e.x*t.y-e.y*t.x},n.cross3=function(e,t,n){return(t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x)},n.add=function(e,t,n){return n||(n={}),n.x=e.x+t.x,n.y=e.y+t.y,n},n.sub=function(e,t,n){return n||(n={}),n.x=e.x-t.x,n.y=e.y-t.y,n},n.mult=function(e,t){return{x:e.x*t,y:e.y*t}},n.div=function(e,t){return{x:e.x/t,y:e.y/t}},n.perp=function(e,t){return{x:(t=!0===t?-1:1)*-e.y,y:t*e.x}},n.neg=function(e){return{x:-e.x,y:-e.y}},n.angle=function(e,t){return Math.atan2(t.y-e.y,t.x-e.x)},n._temp=[n.create(),n.create(),n.create(),n.create(),n.create(),n.create()]},function(e,t,n){var i={};e.exports=i;var r=n(2),s=n(0);i.create=function(e,t){for(var n=[],i=0;i0)return!1}return!0},i.scale=function(e,t,n,s){if(1===t&&1===n)return e;var o,a;s=s||i.centre(e);for(var l=0;l=0?l-1:e.length-1],c=e[l],p=e[(l+1)%e.length],h=t[l0&&(s|=2),3===s)return!1;return 0!==s||null},i.hull=function(e){var t,n,i=[],s=[];for((e=e.slice(0)).sort((function(e,t){var n=e.x-t.x;return 0!==n?n:e.y-t.y})),n=0;n=2&&r.cross3(s[s.length-2],s[s.length-1],t)<=0;)s.pop();s.push(t)}for(n=e.length-1;n>=0;n-=1){for(t=e[n];i.length>=2&&r.cross3(i[i.length-2],i[i.length-1],t)<=0;)i.pop();i.push(t)}return i.pop(),s.pop(),i.concat(s)}},function(e,t,n){var i={};e.exports=i;var r=n(0);i.on=function(e,t,n){for(var i,r=t.split(" "),s=0;s0){n||(n={}),i=t.split(" ");for(var u=0;u0&&s.rotateAbout(o.position,n,e.position,o.position)}},i.setVelocity=function(e,t){e.positionPrev.x=e.position.x-t.x,e.positionPrev.y=e.position.y-t.y,e.velocity.x=t.x,e.velocity.y=t.y,e.speed=s.magnitude(e.velocity)},i.setAngularVelocity=function(e,t){e.anglePrev=e.angle-t,e.angularVelocity=t,e.angularSpeed=Math.abs(e.angularVelocity)},i.translate=function(e,t){i.setPosition(e,s.add(e.position,t))},i.rotate=function(e,t,n){if(n){var r=Math.cos(t),s=Math.sin(t),o=e.position.x-n.x,a=e.position.y-n.y;i.setPosition(e,{x:n.x+(o*r-a*s),y:n.y+(o*s+a*r)}),i.setAngle(e,e.angle+t)}else i.setAngle(e,e.angle+t)},i.scale=function(e,t,n,s){var o=0,a=0;s=s||e.position;for(var c=0;c0&&(o+=p.area,a+=p.inertia),p.position.x=s.x+(p.position.x-s.x)*t,p.position.y=s.y+(p.position.y-s.y)*n,l.update(p.bounds,p.vertices,e.velocity)}e.parts.length>1&&(e.area=o,e.isStatic||(i.setMass(e,e.density*o),i.setInertia(e,a))),e.circleRadius&&(t===n?e.circleRadius*=t:e.circleRadius=null)},i.update=function(e,t,n,i){var o=Math.pow(t*n*e.timeScale,2),a=1-e.frictionAir*n*e.timeScale,c=e.position.x-e.positionPrev.x,p=e.position.y-e.positionPrev.y;e.velocity.x=c*a*i+e.force.x/e.mass*o,e.velocity.y=p*a*i+e.force.y/e.mass*o,e.positionPrev.x=e.position.x,e.positionPrev.y=e.position.y,e.position.x+=e.velocity.x,e.position.y+=e.velocity.y,e.angularVelocity=(e.angle-e.anglePrev)*a*i+e.torque/e.inertia*o,e.anglePrev=e.angle,e.angle+=e.angularVelocity,e.speed=s.magnitude(e.velocity),e.angularSpeed=Math.abs(e.angularVelocity);for(var h=0;h0&&(d.position.x+=e.velocity.x,d.position.y+=e.velocity.y),0!==e.angularVelocity&&(r.rotate(d.vertices,e.angularVelocity,e.position),u.rotate(d.axes,e.angularVelocity),h>0&&s.rotateAbout(d.position,e.angularVelocity,e.position,d.position)),l.update(d.bounds,d.vertices,e.velocity)}},i.applyForce=function(e,t,n){e.force.x+=n.x,e.force.y+=n.y;var i=t.x-e.position.x,r=t.y-e.position.y;e.torque+=i*n.y-r*n.x},i._totalProperties=function(e){for(var t={mass:0,area:0,inertia:0,centre:{x:0,y:0}},n=1===e.parts.length?0:1;n0&&s.motion=s.sleepThreshold&&i.set(s,!0)):s.sleepCounter>0&&(s.sleepCounter-=1)}else i.set(s,!1)}},i.afterCollisions=function(e,t){for(var n=t*t*t,r=0;ri._motionWakeThreshold*n&&i.set(u,!1)}}}},i.set=function(e,t){var n=e.isSleeping;t?(e.isSleeping=!0,e.sleepCounter=e.sleepThreshold,e.positionImpulse.x=0,e.positionImpulse.y=0,e.positionPrev.x=e.position.x,e.positionPrev.y=e.position.y,e.anglePrev=e.angle,e.speed=0,e.angularSpeed=0,e.motion=0,n||r.trigger(e,"sleepStart")):(e.isSleeping=!1,e.sleepCounter=0,n&&r.trigger(e,"sleepEnd"))}},function(e,t,n){var i={};e.exports=i;var r=n(3),s=n(2),o=n(7),a=n(1),l=n(15),u=n(0);i._warming=.4,i._torqueDampen=1,i._minLength=1e-6,i.create=function(e){var t=e;t.bodyA&&!t.pointA&&(t.pointA={x:0,y:0}),t.bodyB&&!t.pointB&&(t.pointB={x:0,y:0});var n=t.bodyA?s.add(t.bodyA.position,t.pointA):t.pointA,i=t.bodyB?s.add(t.bodyB.position,t.pointB):t.pointB,r=s.magnitude(s.sub(n,i));t.length=void 0!==t.length?t.length:r,t.id=t.id||u.nextId(),t.label=t.label||"Constraint",t.type="constraint",t.stiffness=t.stiffness||(t.length>0?1:.7),t.damping=t.damping||0,t.angularStiffness=t.angularStiffness||0,t.angleA=t.bodyA?t.bodyA.angle:t.angleA,t.angleB=t.bodyB?t.bodyB.angle:t.angleB,t.plugin={};var o={visible:!0,lineWidth:2,strokeStyle:"#ffffff",type:"line",anchors:!0};return 0===t.length&&t.stiffness>.1?(o.type="pin",o.anchors=!1):t.stiffness<.9&&(o.type="spring"),t.render=u.extend(o,t.render),t},i.preSolveAll=function(e){for(var t=0;t0&&(p.position.x+=u.x,p.position.y+=u.y),0!==u.angle&&(r.rotate(p.vertices,u.angle,n.position),l.rotate(p.axes,u.angle),c>0&&s.rotateAbout(p.position,u.angle,n.position,p.position)),a.update(p.bounds,p.vertices,n.velocity)}u.angle*=i._warming,u.x*=i._warming,u.y*=i._warming}}},i.pointAWorld=function(e){return{x:(e.bodyA?e.bodyA.position.x:0)+e.pointA.x,y:(e.bodyA?e.bodyA.position.y:0)+e.pointA.y}},i.pointBWorld=function(e){return{x:(e.bodyB?e.bodyB.position.x:0)+e.pointB.x,y:(e.bodyB?e.bodyB.position.y:0)+e.pointB.y}}},function(e,t,n){var i={};e.exports=i;var r=n(18);i.create=function(e,t){var n=e.bodyA,r=e.bodyB,s=e.parentA,o=e.parentB,a={id:i.id(n,r),bodyA:n,bodyB:r,contacts:{},activeContacts:[],separation:0,isActive:!0,confirmedActive:!0,isSensor:n.isSensor||r.isSensor,timeCreated:t,timeUpdated:t,inverseMass:s.inverseMass+o.inverseMass,friction:Math.min(s.friction,o.friction),frictionStatic:Math.max(s.frictionStatic,o.frictionStatic),restitution:Math.max(s.restitution,o.restitution),slop:Math.max(s.slop,o.slop)};return i.update(a,e,t),a},i.update=function(e,t,n){var s=e.contacts,o=t.supports,a=e.activeContacts,l=t.parentA,u=t.parentB;if(e.collision=t,e.inverseMass=l.inverseMass+u.inverseMass,e.friction=Math.min(l.friction,u.friction),e.frictionStatic=Math.max(l.frictionStatic,u.frictionStatic),e.restitution=Math.max(l.restitution,u.restitution),e.slop=Math.max(l.slop,u.slop),a.length=0,t.collided){for(var c=0;cs.max.x&&(s.max.x=u.x),l.ys.max.y&&(s.max.y=u.y))}var p=s.max.x-s.min.x+2*n.x,h=s.max.y-s.min.y+2*n.y,d=e.canvas.height,f=e.canvas.width/d,_=p/h,m=1,b=1;_>f?b=_/f:m=f/_,e.options.hasBounds=!0,e.bounds.min.x=s.min.x,e.bounds.max.x=s.min.x+p*m,e.bounds.min.y=s.min.y,e.bounds.max.y=s.min.y+h*b,i&&(e.bounds.min.x+=.5*p-p*m*.5,e.bounds.max.x+=.5*p-p*m*.5,e.bounds.min.y+=.5*h-h*b*.5,e.bounds.max.y+=.5*h-h*b*.5),e.bounds.min.x-=n.x,e.bounds.max.x-=n.x,e.bounds.min.y-=n.y,e.bounds.max.y-=n.y,e.mouse&&(c.setScale(e.mouse,{x:(e.bounds.max.x-e.bounds.min.x)/e.canvas.width,y:(e.bounds.max.y-e.bounds.min.y)/e.canvas.height}),c.setOffset(e.mouse,e.bounds.min))},i.startViewTransform=function(e){var t=e.bounds.max.x-e.bounds.min.x,n=e.bounds.max.y-e.bounds.min.y,i=t/e.options.width,r=n/e.options.height;e.context.setTransform(e.options.pixelRatio/i,0,0,e.options.pixelRatio/r,0,0),e.context.translate(-e.bounds.min.x,-e.bounds.min.y)},i.endViewTransform=function(e){e.context.setTransform(e.options.pixelRatio,0,0,e.options.pixelRatio,0,0)},i.world=function(e){var t,n=e.engine,r=n.world,p=e.canvas,h=e.context,f=e.options,_=s.allBodies(r),m=s.allConstraints(r),b=f.wireframes?f.wireframeBackground:f.background,g=[],S=[],k={timestamp:n.timing.timestamp};if(a.trigger(e,"beforeRender",k),e.currentBackground!==b&&d(e,b),h.globalCompositeOperation="source-in",h.fillStyle="transparent",h.fillRect(0,0,p.width,p.height),h.globalCompositeOperation="source-over",f.hasBounds){for(t=0;t<_.length;t++){var y=_[t];o.overlaps(y.bounds,e.bounds)&&g.push(y)}for(t=0;t=500){var c="";o.timing&&(c+="fps: "+Math.round(o.timing.fps)+" "),o.extended&&(o.timing&&(c+="delta: "+o.timing.delta.toFixed(3)+" ",c+="correction: "+o.timing.correction.toFixed(3)+" "),c+="bodies: "+u.length+" ",i.broadphase.controller===l&&(c+="buckets: "+o.buckets+" "),c+="\n",c+="collisions: "+o.collisions+" ",c+="pairs: "+i.pairs.list.length+" ",c+="broad: "+o.broadEff+" ",c+="mid: "+o.midEff+" ",c+="narrow: "+o.narrowEff+" "),e.debugString=c,e.debugTimestamp=i.timing.timestamp}if(e.debugString){n.font="12px Arial",a.wireframes?n.fillStyle="rgba(255,255,255,0.5)":n.fillStyle="rgba(0,0,0,0.5)";for(var p=e.debugString.split("\n"),h=0;h1?1:0;o1?1:0;a1?1:0;s1?1:0;a1?1:0;s1?1:0;s1?1:0;r0)){var c=i.activeContacts[0].vertex.x,p=i.activeContacts[0].vertex.y;2===i.activeContacts.length&&(c=(i.activeContacts[0].vertex.x+i.activeContacts[1].vertex.x)/2,p=(i.activeContacts[0].vertex.y+i.activeContacts[1].vertex.y)/2),r.bodyB===r.supports[0].body||!0===r.bodyA.isStatic?a.moveTo(c-8*r.normal.x,p-8*r.normal.y):a.moveTo(c+8*r.normal.x,p+8*r.normal.y),a.lineTo(c,p)}l.wireframes?a.strokeStyle="rgba(255,165,0,0.7)":a.strokeStyle="orange",a.lineWidth=1,a.stroke()},i.separations=function(e,t,n){var i,r,s,o,a,l=n,u=e.options;for(l.beginPath(),a=0;ac.bounds.max.x||f.bounds.max.yc.bounds.max.y)){var _=i._getRegion(e,f);if(!f.region||_.id!==f.region.id||r){d.broadphaseTests+=1,f.region&&!r||(f.region=_);var m=i._regionUnion(_,f.region);for(o=m.startCol;o<=m.endCol;o++)for(a=m.startRow;a<=m.endRow;a++){l=p[u=i._getBucketId(o,a)];var b=o>=_.startCol&&o<=_.endCol&&a>=_.startRow&&a<=_.endRow,g=o>=f.region.startCol&&o<=f.region.endCol&&a>=f.region.startRow&&a<=f.region.endRow;!b&&g&&g&&l&&i._bucketRemoveBody(e,l,f),(f.region===_||b&&!g||r)&&(l||(l=i._createBucket(p,u)),i._bucketAddBody(e,l,f))}f.region=_,h=!0}}}h&&(e.pairsList=i._createActivePairsList(e))},i.clear=function(e){e.buckets={},e.pairs={},e.pairsList=[]},i._regionUnion=function(e,t){var n=Math.min(e.startCol,t.startCol),r=Math.max(e.endCol,t.endCol),s=Math.min(e.startRow,t.startRow),o=Math.max(e.endRow,t.endRow);return i._createRegion(n,r,s,o)},i._getRegion=function(e,t){var n=t.bounds,r=Math.floor(n.min.x/e.bucketWidth),s=Math.floor(n.max.x/e.bucketWidth),o=Math.floor(n.min.y/e.bucketHeight),a=Math.floor(n.max.y/e.bucketHeight);return i._createRegion(r,s,o,a)},i._createRegion=function(e,t,n,i){return{id:e+","+t+","+n+","+i,startCol:e,endCol:t,startRow:n,endRow:i}},i._getBucketId=function(e,t){return"C"+e+"R"+t},i._createBucket=function(e,t){return e[t]=[]},i._bucketAddBody=function(e,t,n){for(var i=0;i0?i.push(n):delete e.pairs[t[r]];return i}},function(e,t,n){var i={};e.exports=i;var r=n(13),s=n(9),o=n(1);i.collisions=function(e,t){for(var n=[],a=t.pairs.table,l=t.metrics,u=0;u1?1:0;h1?1:0;f0:!!(e.mask&t.category)&&!!(t.mask&e.category)}},function(e,t,n){var i={};e.exports=i;var r=n(3),s=n(2);i.collides=function(e,t,n){var o,a,l,u,c=!1;if(n){var p=e.parent,h=t.parent,d=p.speed*p.speed+p.angularSpeed*p.angularSpeed+h.speed*h.speed+h.angularSpeed*h.angularSpeed;c=n&&n.collided&&d<.2,u=n}else u={collided:!1,bodyA:e,bodyB:t};if(n&&c){var f=u.axisBody,_=f===e?t:e,m=[f.axes[n.axisNumber]];if(l=i._overlapAxes(f.vertices,_.vertices,m),u.reused=!0,l.overlap<=0)return u.collided=!1,u}else{if((o=i._overlapAxes(e.vertices,t.vertices,e.axes)).overlap<=0)return u.collided=!1,u;if((a=i._overlapAxes(t.vertices,e.vertices,t.axes)).overlap<=0)return u.collided=!1,u;o.overlapr?r=a:a=0?o.index-1:c.length-1],u.x=r.x-p.x,u.y=r.y-p.y,l=-s.dot(n,u),a=r,r=c[(o.index+1)%c.length],u.x=r.x-p.x,u.y=r.y-p.y,(i=-s.dot(n,u))0&&r.area(A)1?(b=o.create(s.extend({parts:g.slice(0)},c)),o.setPosition(b,{x:e,y:t}),b):g[0]}},function(e,t,n){var i={};e.exports=i;var r=n(0);i._registry={},i.register=function(e){if(i.isPlugin(e)||r.warn("Plugin.register:",i.toString(e),"does not implement all required fields."),e.name in i._registry){var t=i._registry[e.name],n=i.versionParse(e.version).number,s=i.versionParse(t.version).number;n>s?(r.warn("Plugin.register:",i.toString(t),"was upgraded to",i.toString(e)),i._registry[e.name]=e):n-1},i.isFor=function(e,t){var n=e.for&&i.dependencyParse(e.for);return!e.for||t.name===n.name&&i.versionSatisfies(t.version,n.range)},i.use=function(e,t){if(e.uses=(e.uses||[]).concat(t||[]),0!==e.uses.length){for(var n=i.dependencies(e),s=r.topologicalSort(n),o=[],a=0;a0&&r.info(o.join(" "))}else r.warn("Plugin.use:",i.toString(e),"does not specify any dependencies to install.")},i.dependencies=function(e,t){var n=i.dependencyParse(e),s=n.name;if(!(s in(t=t||{}))){e=i.resolve(e)||e,t[s]=r.map(e.uses||[],(function(t){i.isPlugin(t)&&i.register(t);var s=i.dependencyParse(t),o=i.resolve(t);return o&&!i.versionSatisfies(o.version,s.range)?(r.warn("Plugin.dependencies:",i.toString(o),"does not satisfy",i.toString(s),"used by",i.toString(n)+"."),o._warned=!0,e._warned=!0):o||(r.warn("Plugin.dependencies:",i.toString(t),"used by",i.toString(n),"could not be resolved."),e._warned=!0),s.name}));for(var o=0;o=|>)?\s*((\d+)\.(\d+)\.(\d+))(-[0-9A-Za-z-]+)?$/;t.test(e)||r.warn("Plugin.versionParse:",e,"is not a valid version or range.");var n=t.exec(e),i=Number(n[4]),s=Number(n[5]),o=Number(n[6]);return{isRange:Boolean(n[1]||n[2]),version:n[3],range:e,operator:n[1]||n[2]||"",major:i,minor:s,patch:o,parts:[i,s,o],prerelease:n[7],number:1e8*i+1e4*s+o}},i.versionSatisfies=function(e,t){t=t||"*";var n=i.versionParse(t),r=i.versionParse(e);if(n.isRange){if("*"===n.operator||"*"===e)return!0;if(">"===n.operator)return r.number>n.number;if(">="===n.operator)return r.number>=n.number;if("~"===n.operator)return r.major===n.major&&r.minor===n.minor&&r.patch>=n.patch;if("^"===n.operator)return n.major>0?r.major===n.major&&r.number>=n.number:n.minor>0?r.minor===n.minor&&r.patch>=n.patch:r.patch===n.patch}return e===t||"*"===e}},function(e,t){var n={};e.exports=n,n.create=function(e){return{id:n.id(e),vertex:e,normalImpulse:0,tangentImpulse:0}},n.id=function(e){return e.body.id+"_"+e.index}},function(e,t,n){var i={};e.exports=i;var r=n(5),s=(n(8),n(0));i.create=function(e){var t=r.create();return s.extend(t,{label:"World",gravity:{x:0,y:1,scale:.001},bounds:{min:{x:-1/0,y:-1/0},max:{x:1/0,y:1/0}}},e)}},function(e,t,n){var i={};e.exports=i;var r=n(9),s=n(0);i._pairMaxIdleLife=1e3,i.create=function(e){return s.extend({table:{},list:[],collisionStart:[],collisionActive:[],collisionEnd:[]},e)},i.update=function(e,t,n){var i,s,o,a,l=e.list,u=e.table,c=e.collisionStart,p=e.collisionEnd,h=e.collisionActive;for(c.length=0,p.length=0,h.length=0,a=0;ai._pairMaxIdleLife&&u.push(o);for(o=0;od.friction*d.frictionStatic*N*n&&(D=M,L=o.clamp(d.friction*C*n,-D,D));var P=s.cross(E,b),F=s.cross(I,b),B=k/(_.inverseMass+m.inverseMass+_.inverseInertia*P*P+m.inverseInertia*F*F);if(R*=B,L*=B,$<0&&$*$>i._restingThresh*n)v.normalImpulse=0;else{var j=v.normalImpulse;v.normalImpulse=Math.min(v.normalImpulse+R,0),R=v.normalImpulse-j}if(O*O>i._restingThreshTangent*n)v.tangentImpulse=0;else{var V=v.tangentImpulse;v.tangentImpulse=o.clamp(v.tangentImpulse+L,-D,D),L=v.tangentImpulse-V}r.x=b.x*R+g.x*L,r.y=b.y*R+g.y*L,_.isStatic||_.isSleeping||(_.positionPrev.x+=r.x*_.inverseMass,_.positionPrev.y+=r.y*_.inverseMass,_.anglePrev+=s.cross(E,r)*_.inverseInertia),m.isStatic||m.isSleeping||(m.positionPrev.x-=r.x*m.inverseMass,m.positionPrev.y-=r.y*m.inverseMass,m.anglePrev-=s.cross(I,r)*m.inverseInertia)}}}}},function(e,t,n){var i={};e.exports=i;var r=n(19),s=n(7),o=n(21),a=n(10),l=n(20),u=n(23),c=n(11),p=n(4),h=n(5),d=n(8),f=n(0),_=n(6);i.create=function(e,t){t=(t=f.isElement(e)?t:e)||{},((e=f.isElement(e)?e:null)||t.render)&&f.warn("Engine.create: engine.render is deprecated (see docs)");var n={positionIterations:6,velocityIterations:4,constraintIterations:2,enableSleeping:!1,events:[],plugin:{},timing:{timestamp:0,timeScale:1},broadphase:{controller:c}},i=f.extend(n,t);if(e||i.render){var s={element:e,controller:a};i.render=f.extend(s,i.render)}return i.render&&i.render.controller&&(i.render=i.render.controller.create(i.render)),i.render&&(i.render.engine=i),i.world=t.world||r.create(i.world),i.pairs=l.create(),i.broadphase=i.broadphase.controller.create(i.broadphase),i.metrics=i.metrics||{extended:!1},i.metrics=u.create(i.metrics),i},i.update=function(e,t,n){t=t||1e3/60,n=n||1;var r,a=e.world,c=e.timing,f=e.broadphase,_=[];c.timestamp+=t*c.timeScale;var m={timestamp:c.timestamp};p.trigger(e,"beforeUpdate",m);var b=h.allBodies(a),g=h.allConstraints(a);for(u.reset(e.metrics),e.enableSleeping&&s.update(b,c.timeScale),i._bodiesApplyGravity(b,a.gravity),i._bodiesUpdate(b,t,c.timeScale,n,a.bounds),d.preSolveAll(b),r=0;r0&&p.trigger(e,"collisionStart",{pairs:k.collisionStart}),o.preSolvePosition(k.list),r=0;r0&&p.trigger(e,"collisionActive",{pairs:k.collisionActive}),k.collisionEnd.length>0&&p.trigger(e,"collisionEnd",{pairs:k.collisionEnd}),u.update(e.metrics,e),i._bodiesClearForces(b),p.trigger(e,"afterUpdate",m),e},i.merge=function(e,t){if(f.extend(e,t),t.world){e.world=t.world,i.clear(e);for(var n=h.allBodies(e.world),r=0;r1?1:0;ce.deltaMax?e.deltaMax:i)/e.delta,e.delta=i),0!==e.timeScalePrev&&(a*=o.timeScale/e.timeScalePrev),0===o.timeScale&&(a=0),e.timeScalePrev=o.timeScale,e.correction=a,e.frameCounter+=1,n-e.counterTimestamp>=1e3&&(e.fps=e.frameCounter*((n-e.counterTimestamp)/1e3),e.counterTimestamp=n,e.frameCounter=0),r.trigger(e,"tick",l),r.trigger(t,"tick",l),t.world.isModified&&t.render&&t.render.controller&&t.render.controller.clear&&t.render.controller.clear(t.render),r.trigger(e,"beforeUpdate",l),s.update(t,i,a),r.trigger(e,"afterUpdate",l),t.render&&t.render.controller&&(r.trigger(e,"beforeRender",l),r.trigger(t,"beforeRender",l),t.render.controller.world(t.render),r.trigger(e,"afterRender",l),r.trigger(t,"afterRender",l)),r.trigger(e,"afterTick",l),r.trigger(t,"afterTick",l)},i.stop=function(e){t(e.frameRequestId)},i.start=function(e,t){i.run(e,t)}}()},function(e,t,n){var i={};e.exports=i;var r=n(5),s=n(8),o=n(0),a=n(6),l=n(16);i.stack=function(e,t,n,i,s,o,l){for(var u,c=r.create({label:"Stack"}),p=e,h=t,d=0,f=0;f_&&(_=g),a.translate(b,{x:.5*S,y:.5*g}),p=b.bounds.max.x+s,r.addBody(c,b),u=b,d+=1}else p+=s}h+=_+o,p=e}return c},i.chain=function(e,t,n,i,a,l){for(var u=e.bodies,c=1;c0)for(u=0;u0&&(h=d[u-1+(l-1)*t],r.addConstraint(e,s.create(o.extend({bodyA:h,bodyB:p},a)))),i&&uh||o<(u=h-u)||o>n-1-u))return 1===p&&a.translate(c,{x:(o+(n%2==1?1:-1))*d,y:0}),l(e+(c?o*d:0)+o*s,i,o,u,c,p)}))},i.newtonsCradle=function(e,t,n,i,o){for(var a=r.create({label:"Newtons Cradle"}),u=0;u1;if(!h||e!=h.x||t!=h.y){h&&i?(d=h.x,f=h.y):(d=0,f=0);var r={x:d+e,y:f+t};!i&&h||(h=r),_.push(r),b=d+e,g=f+t}},k=function(e){var t=e.pathSegTypeAsLetter.toUpperCase();if("Z"!==t){switch(t){case"M":case"L":case"T":case"C":case"S":case"Q":b=e.x,g=e.y;break;case"H":b=e.x;break;case"V":g=e.y}S(b,g,e.pathSegType)}};for(i._svgPathToAbsolute(e),o=e.getTotalLength(),u=[],n=0;n1?1:0;h1&&"undefined"==typeof MSStream};var x=function(e){var t={userAgent:"",platform:"",maxTouchPoints:0};e||"undefined"==typeof navigator?"string"==typeof e?t.userAgent=e:e&&e.userAgent&&(t={userAgent:e.userAgent,platform:e.platform,maxTouchPoints:e.maxTouchPoints||0}):t={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0};var n=t.userAgent,i=n.split("[FBAN");void 0!==i[1]&&(n=i[0]),void 0!==(i=n.split("Twitter"))[1]&&(n=i[0]);var r=function(e){return function(t){return t.test(e)}}(n),s={apple:{phone:r(p)&&!r(S),ipod:r(h),tablet:!r(p)&&(r(d)||w(t))&&!r(S),universal:r(f),device:(r(p)||r(h)||r(d)||r(f)||w(t))&&!r(S)},amazon:{phone:r(b),tablet:!r(b)&&r(g),device:r(b)||r(g)},android:{phone:!r(S)&&r(b)||!r(S)&&r(_),tablet:!r(S)&&!r(b)&&!r(_)&&(r(g)||r(m)),device:!r(S)&&(r(b)||r(g)||r(_)||r(m))||r(/\bokhttp\b/i)},windows:{phone:r(S),tablet:r(k),device:r(S)||r(k)},other:{blackberry:r(y),blackberry10:r(v),opera:r(T),firefox:r(I),chrome:r(E),device:r(y)||r(v)||r(T)||r(I)||r(E)},any:!1,phone:!1,tablet:!1};return s.any=s.apple.device||s.android.device||s.windows.device||s.other.device,s.phone=s.apple.phone||s.android.phone||s.windows.phone,s.tablet=s.apple.tablet||s.android.tablet||s.windows.tablet,s}(self.navigator);var A,$,O,M,C,R,N,L,D,P,F,B,j,V,U,Y,G,X,H={MIPMAP_TEXTURES:1,ANISOTROPIC_LEVEL:0,RESOLUTION:1,FILTER_RESOLUTION:1,SPRITE_MAX_TEXTURES:function(e){var t,n=!0;return(x.tablet||x.phone)&&(x.apple.device&&(t=navigator.userAgent.match(/OS (\d+)_(\d+)?/))&&parseInt(t[1],10)<11&&(n=!1),x.android.device&&(t=navigator.userAgent.match(/Android\s([0-9.]*)/))&&parseInt(t[1],10)<7&&(n=!1)),n?e:4}(32),SPRITE_BATCH_SIZE:4096,RENDER_OPTIONS:{view:null,antialias:!1,autoDensity:!1,backgroundColor:0,backgroundAlpha:1,useContextAlpha:!0,clearBeforeRender:!0,preserveDrawingBuffer:!1,width:800,height:600,legacy:!1},GC_MODE:0,GC_MAX_IDLE:3600,GC_MAX_CHECK_COUNT:600,WRAP_MODE:33071,SCALE_MODE:1,PRECISION_VERTEX:"highp",PRECISION_FRAGMENT:x.apple.device?"highp":"mediump",CAN_UPLOAD_SAME_BUFFER:!x.apple.device,CREATE_IMAGE_BITMAP:!1,ROUND_PIXELS:!1};(X=A||(A={}))[X.WEBGL_LEGACY=0]="WEBGL_LEGACY",X[X.WEBGL=1]="WEBGL",X[X.WEBGL2=2]="WEBGL2",function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.WEBGL=1]="WEBGL",e[e.CANVAS=2]="CANVAS"}($||($={})),function(e){e[e.COLOR=16384]="COLOR",e[e.DEPTH=256]="DEPTH",e[e.STENCIL=1024]="STENCIL"}(O||(O={})),function(e){e[e.NORMAL=0]="NORMAL",e[e.ADD=1]="ADD",e[e.MULTIPLY=2]="MULTIPLY",e[e.SCREEN=3]="SCREEN",e[e.OVERLAY=4]="OVERLAY",e[e.DARKEN=5]="DARKEN",e[e.LIGHTEN=6]="LIGHTEN",e[e.COLOR_DODGE=7]="COLOR_DODGE",e[e.COLOR_BURN=8]="COLOR_BURN",e[e.HARD_LIGHT=9]="HARD_LIGHT",e[e.SOFT_LIGHT=10]="SOFT_LIGHT",e[e.DIFFERENCE=11]="DIFFERENCE",e[e.EXCLUSION=12]="EXCLUSION",e[e.HUE=13]="HUE",e[e.SATURATION=14]="SATURATION",e[e.COLOR=15]="COLOR",e[e.LUMINOSITY=16]="LUMINOSITY",e[e.NORMAL_NPM=17]="NORMAL_NPM",e[e.ADD_NPM=18]="ADD_NPM",e[e.SCREEN_NPM=19]="SCREEN_NPM",e[e.NONE=20]="NONE",e[e.SRC_OVER=0]="SRC_OVER",e[e.SRC_IN=21]="SRC_IN",e[e.SRC_OUT=22]="SRC_OUT",e[e.SRC_ATOP=23]="SRC_ATOP",e[e.DST_OVER=24]="DST_OVER",e[e.DST_IN=25]="DST_IN",e[e.DST_OUT=26]="DST_OUT",e[e.DST_ATOP=27]="DST_ATOP",e[e.ERASE=26]="ERASE",e[e.SUBTRACT=28]="SUBTRACT",e[e.XOR=29]="XOR"}(M||(M={})),function(e){e[e.POINTS=0]="POINTS",e[e.LINES=1]="LINES",e[e.LINE_LOOP=2]="LINE_LOOP",e[e.LINE_STRIP=3]="LINE_STRIP",e[e.TRIANGLES=4]="TRIANGLES",e[e.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",e[e.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(C||(C={})),function(e){e[e.RGBA=6408]="RGBA",e[e.RGB=6407]="RGB",e[e.ALPHA=6406]="ALPHA",e[e.LUMINANCE=6409]="LUMINANCE",e[e.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",e[e.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",e[e.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(R||(R={})),function(e){e[e.TEXTURE_2D=3553]="TEXTURE_2D",e[e.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",e[e.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",e[e.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",e[e.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",e[e.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",e[e.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",e[e.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",e[e.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(N||(N={})),function(e){e[e.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",e[e.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",e[e.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",e[e.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",e[e.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",e[e.FLOAT=5126]="FLOAT",e[e.HALF_FLOAT=36193]="HALF_FLOAT"}(L||(L={})),function(e){e[e.NEAREST=0]="NEAREST",e[e.LINEAR=1]="LINEAR"}(D||(D={})),function(e){e[e.CLAMP=33071]="CLAMP",e[e.REPEAT=10497]="REPEAT",e[e.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(P||(P={})),function(e){e[e.OFF=0]="OFF",e[e.POW2=1]="POW2",e[e.ON=2]="ON",e[e.ON_MANUAL=3]="ON_MANUAL"}(F||(F={})),function(e){e[e.NPM=0]="NPM",e[e.UNPACK=1]="UNPACK",e[e.PMA=2]="PMA",e[e.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",e[e.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",e[e.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA"}(B||(B={})),function(e){e[e.NO=0]="NO",e[e.YES=1]="YES",e[e.AUTO=2]="AUTO",e[e.BLEND=0]="BLEND",e[e.CLEAR=1]="CLEAR",e[e.BLIT=2]="BLIT"}(j||(j={})),function(e){e[e.AUTO=0]="AUTO",e[e.MANUAL=1]="MANUAL"}(V||(V={})),function(e){e.LOW="lowp",e.MEDIUM="mediump",e.HIGH="highp"}(U||(U={})),function(e){e[e.NONE=0]="NONE",e[e.SCISSOR=1]="SCISSOR",e[e.STENCIL=2]="STENCIL",e[e.SPRITE=3]="SPRITE"}(Y||(Y={})),function(e){e[e.NONE=0]="NONE",e[e.LOW=2]="LOW",e[e.MEDIUM=4]="MEDIUM",e[e.HIGH=8]="HIGH"}(G||(G={}));var z,q=Object.prototype.hasOwnProperty,W="~";function K(){}function J(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function Q(e,t,n,i,r){if("function"!=typeof n)throw new TypeError("The listener must be a function");var s=new J(n,i||e,r),o=W?W+t:t;return e._events[o]?e._events[o].fn?e._events[o]=[e._events[o],s]:e._events[o].push(s):(e._events[o]=s,e._eventsCount++),e}function Z(e,t){0==--e._eventsCount?e._events=new K:delete e._events[t]}function ee(){this._events=new K,this._eventsCount=0}Object.create&&(K.prototype=Object.create(null),(new K).__proto__||(W=!1)),ee.prototype.eventNames=function(){var e,t,n=[];if(0===this._eventsCount)return n;for(t in e=this._events)q.call(e,t)&&n.push(W?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},ee.prototype.listeners=function(e){var t=W?W+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var i=0,r=n.length,s=new Array(r);i80*n){i=s=e[0],r=o=e[1];for(var f=n;fs&&(s=a),l>o&&(o=l);u=0!==(u=Math.max(s-i,o-r))?1/u:0}return se(h,d,n,i,r,u),d}function ie(e,t,n,i,r){var s,o;if(r===xe(e,t,n,i)>0)for(s=t;s=t;s-=i)o=Ee(s,e[s],e[s+1],o);return o&&ge(o,o.next)&&(Ie(o),o=o.next),o}function re(e,t){if(!e)return e;t||(t=e);var n,i=e;do{if(n=!1,i.steiner||!ge(i,i.next)&&0!==be(i.prev,i,i.next))i=i.next;else{if(Ie(i),(i=t=i.prev)===i.next)break;n=!0}}while(n||i!==t);return t}function se(e,t,n,i,r,s,o){if(e){!o&&s&&function(e,t,n,i){var r=e;do{null===r.z&&(r.z=de(r.x,r.y,t,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){var t,n,i,r,s,o,a,l,u=1;do{for(n=e,e=null,s=null,o=0;n;){for(o++,i=n,a=0,t=0;t0||l>0&&i;)0!==a&&(0===l||!i||n.z<=i.z)?(r=n,n=n.nextZ,a--):(r=i,i=i.nextZ,l--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;n=i}s.nextZ=null,u*=2}while(o>1)}(r)}(e,i,r,s);for(var a,l,u=e;e.prev!==e.next;)if(a=e.prev,l=e.next,s?ae(e,i,r,s):oe(e))t.push(a.i/n),t.push(e.i/n),t.push(l.i/n),Ie(e),e=l.next,u=l.next;else if((e=l)===u){o?1===o?se(e=le(re(e),t,n),t,n,i,r,s,2):2===o&&ue(e,t,n,i,r,s):se(re(e),t,n,i,r,s,1);break}}}function oe(e){var t=e.prev,n=e,i=e.next;if(be(t,n,i)>=0)return!1;for(var r=e.next.next;r!==e.prev;){if(_e(t.x,t.y,n.x,n.y,i.x,i.y,r.x,r.y)&&be(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function ae(e,t,n,i){var r=e.prev,s=e,o=e.next;if(be(r,s,o)>=0)return!1;for(var a=r.xs.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,c=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,p=de(a,l,t,n,i),h=de(u,c,t,n,i),d=e.prevZ,f=e.nextZ;d&&d.z>=p&&f&&f.z<=h;){if(d!==e.prev&&d!==e.next&&_e(r.x,r.y,s.x,s.y,o.x,o.y,d.x,d.y)&&be(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,f!==e.prev&&f!==e.next&&_e(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&be(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;d&&d.z>=p;){if(d!==e.prev&&d!==e.next&&_e(r.x,r.y,s.x,s.y,o.x,o.y,d.x,d.y)&&be(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;f&&f.z<=h;){if(f!==e.prev&&f!==e.next&&_e(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&be(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function le(e,t,n){var i=e;do{var r=i.prev,s=i.next.next;!ge(r,s)&&Se(r,i,i.next,s)&&ve(r,s)&&ve(s,r)&&(t.push(r.i/n),t.push(i.i/n),t.push(s.i/n),Ie(i),Ie(i.next),i=e=s),i=i.next}while(i!==e);return re(i)}function ue(e,t,n,i,r,s){var o=e;do{for(var a=o.next.next;a!==o.prev;){if(o.i!==a.i&&me(o,a)){var l=Te(o,a);return o=re(o,o.next),l=re(l,l.next),se(o,t,n,i,r,s),void se(l,t,n,i,r,s)}a=a.next}o=o.next}while(o!==e)}function ce(e,t){return e.x-t.x}function pe(e,t){if(t=function(e,t){var n,i=t,r=e.x,s=e.y,o=-1/0;do{if(s<=i.y&&s>=i.next.y&&i.next.y!==i.y){var a=i.x+(s-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(a<=r&&a>o){if(o=a,a===r){if(s===i.y)return i;if(s===i.next.y)return i.next}n=i.x=i.x&&i.x>=c&&r!==i.x&&_e(sn.x||i.x===n.x&&he(n,i)))&&(n=i,h=l)),i=i.next}while(i!==u);return n}(e,t)){var n=Te(t,e);re(t,t.next),re(n,n.next)}}function he(e,t){return be(e.prev,e,t.prev)<0&&be(t.next,e,e.next)<0}function de(e,t,n,i,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function fe(e){var t=e,n=e;do{(t.x=0&&(e-o)*(i-a)-(n-o)*(t-a)>=0&&(n-o)*(s-a)-(r-o)*(i-a)>=0}function me(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&Se(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&(ve(e,t)&&ve(t,e)&&function(e,t){var n=e,i=!1,r=(e.x+t.x)/2,s=(e.y+t.y)/2;do{n.y>s!=n.next.y>s&&n.next.y!==n.y&&r<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==e);return i}(e,t)&&(be(e.prev,e,t.prev)||be(e,t.prev,t))||ge(e,t)&&be(e.prev,e,e.next)>0&&be(t.prev,t,t.next)>0)}function be(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function ge(e,t){return e.x===t.x&&e.y===t.y}function Se(e,t,n,i){var r=ye(be(e,t,n)),s=ye(be(e,t,i)),o=ye(be(n,i,e)),a=ye(be(n,i,t));return r!==s&&o!==a||!(0!==r||!ke(e,n,t))||!(0!==s||!ke(e,i,t))||!(0!==o||!ke(n,e,i))||!(0!==a||!ke(n,t,i))}function ke(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function ye(e){return e>0?1:e<0?-1:0}function ve(e,t){return be(e.prev,e,e.next)<0?be(e,t,e.next)>=0&&be(e,e.prev,t)>=0:be(e,t,e.prev)<0||be(e,e.next,t)<0}function Te(e,t){var n=new we(e.i,e.x,e.y),i=new we(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,n.next=r,r.prev=n,i.next=n,n.prev=i,s.next=i,i.prev=s,i}function Ee(e,t,n,i){var r=new we(e,t,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function Ie(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function we(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function xe(e,t,n,i){for(var r=0,s=t,o=n-i;s0&&(i+=e[r-1].length,n.holes.push(i))}return n};var Ae=function(){var e=this,t={exports:this};return function(n){var i="object"==typeof e&&e&&!e.nodeType&&e,s="object"==typeof t&&t&&!t.nodeType&&t,o="object"==typeof r&&r;o.global!==o&&o.window!==o&&o.self!==o||(n=o);var a,l,u=2147483647,c=36,p=26,h=38,d=700,f=/^xn--/,_=/[^\x20-\x7E]/,m=/[\x2E\u3002\uFF0E\uFF61]/g,b={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},g=c-1,S=Math.floor,k=String.fromCharCode;function y(e){throw new RangeError(b[e])}function v(e,t){for(var n=e.length,i=[];n--;)i[n]=t(e[n]);return i}function T(e,t){var n=e.split("@"),i="";return n.length>1&&(i=n[0]+"@",e=n[1]),i+v((e=e.replace(m,".")).split("."),t).join(".")}function E(e){for(var t,n,i=[],r=0,s=e.length;r=55296&&t<=56319&&r65535&&(t+=k((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+k(e)})).join("")}function w(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function x(e,t,n){var i=0;for(e=n?S(e/d):e>>1,e+=S(e/t);e>g*p>>1;i+=c)e=S(e/g);return S(i+(g+1)*e/(e+h))}function A(e){var t,n,i,r,s,o,a,l,h,d,f,_=[],m=e.length,b=0,g=128,k=72;for((n=e.lastIndexOf("-"))<0&&(n=0),i=0;i=128&&y("not-basic"),_.push(e.charCodeAt(i));for(r=n>0?n+1:0;r=m&&y("invalid-input"),((l=(f=e.charCodeAt(r++))-48<10?f-22:f-65<26?f-65:f-97<26?f-97:c)>=c||l>S((u-b)/o))&&y("overflow"),b+=l*o,!(l<(h=a<=k?1:a>=k+p?p:a-k));a+=c)o>S(u/(d=c-h))&&y("overflow"),o*=d;k=x(b-s,t=_.length+1,0==s),S(b/t)>u-g&&y("overflow"),g+=S(b/t),b%=t,_.splice(b++,0,g)}return I(_)}function $(e){var t,n,i,r,s,o,a,l,h,d,f,_,m,b,g,v=[];for(_=(e=E(e)).length,t=128,n=0,s=72,o=0;o<_;++o)(f=e[o])<128&&v.push(k(f));for(i=r=v.length,r&&v.push("-");i<_;){for(a=u,o=0;o<_;++o)(f=e[o])>=t&&fS((u-n)/(m=i+1))&&y("overflow"),n+=(a-t)*m,t=a,o=0;o<_;++o)if((f=e[o])u&&y("overflow"),f==t){for(l=n,h=c;!(l<(d=h<=s?1:h>=s+p?p:h-s));h+=c)g=l-d,b=c-d,v.push(k(w(d+g%b,0))),l=S(g/b);v.push(k(w(l,0))),s=x(n,m,i==r),n=0,++i}++n,++t}return v.join("")}if(a={version:"1.4.1",ucs2:{decode:E,encode:I},decode:A,encode:$,toASCII:function(e){return T(e,(function(e){return _.test(e)?"xn--"+$(e):e}))},toUnicode:function(e){return T(e,(function(e){return f.test(e)?A(e.slice(4).toLowerCase()):e}))}},i&&s)if(t.exports==i)s.exports=a;else for(l in a)a.hasOwnProperty(l)&&(i[l]=a[l]);else n.punycode=a}(this),t.exports}.call({}),$e={};$e={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}};var Oe,Me,Ce=!1;function Re(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var Ne,Le,De,Pe,Fe=!1;function Be(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i0&&a>o&&(a=o);for(var l=0;l=0?(u=d.substr(0,f),c=d.substr(f+1)):(u=d,c=""),p=decodeURIComponent(u),h=decodeURIComponent(c),Re(r,p)?Me(r[p])?r[p].push(h):r[p]=[r[p],h]:r[p]=h}return r},Me=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}),je=Oe,Fe||(Fe=!0,Ne={},Le=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}},Ne=function(e,t,n,i){return t=t||"&",n=n||"=",null===e&&(e=void 0),"object"==typeof e?Be(Pe(e),(function(i){var r=encodeURIComponent(Le(i))+n;return De(e[i])?Be(e[i],(function(e){return r+encodeURIComponent(Le(e))})).join(t):r+encodeURIComponent(Le(e[i]))})).join(t):i?encodeURIComponent(Le(i))+n+encodeURIComponent(Le(e)):""},De=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},Pe=Object.keys||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}),Ve=Ne;var je,Ve,Ue=rt,Ye=function(e,t){return rt(e,!1,!0).resolve(t)},Ge=function(e){return $e.isString(e)&&(e=rt(e)),e instanceof Xe?e.format():Xe.prototype.format.call(e)};function Xe(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var He=/^([a-z0-9.+-]+:)/i,ze=/:[0-9]*$/,qe=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,We=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),Ke=["'"].concat(We),Je=["%","/","?",";","#"].concat(Ke),Qe=["/","?","#"],Ze=/^[+a-z0-9A-Z_-]{0,63}$/,et=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,tt={javascript:!0,"javascript:":!0},nt={javascript:!0,"javascript:":!0},it={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function rt(e,t,n){if(e&&$e.isObject(e)&&e instanceof Xe)return e;var i=new Xe;return i.parse(e,t,n),i}Xe.prototype.parse=function(e,t,n){if(!$e.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var i=e.indexOf("?"),r=-1!==i&&i127?k+="x":k+=S[y];if(!k.match(Ze)){var T=b.slice(0,f),E=b.slice(f+1),I=S.match(et);I&&(T.push(I[1]),E.unshift(I[2])),E.length&&(o="/"+E.join(".")+o),this.hostname=T.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),m||(this.hostname=Ae.toASCII(this.hostname));var w=this.port?":"+this.port:"",x=this.hostname||"";this.host=x+w,this.href+=this.host,m&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==o[0]&&(o="/"+o))}if(!tt[u])for(f=0,g=Ke.length;f0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift())),n.search=e.search,n.query=e.query,$e.isNull(n.pathname)&&$e.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n;if(!S.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var y=S.slice(-1)[0],v=(n.host||e.host||S.length>1)&&("."===y||".."===y)||""===y,T=0,E=S.length;E>=0;E--)"."===(y=S[E])?S.splice(E,1):".."===y?(S.splice(E,1),T++):T&&(S.splice(E,1),T--);if(!b&&!g)for(;T--;T)S.unshift("..");!b||""===S[0]||S[0]&&"/"===S[0].charAt(0)||S.unshift(""),v&&"/"!==S.join("/").substr(-1)&&S.push("");var I,w=""===S[0]||S[0]&&"/"===S[0].charAt(0);return k&&(n.hostname=n.host=w?"":S.length?S.shift():"",(I=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=I.shift(),n.host=n.hostname=I.shift())),(b=b||n.host&&S.length)&&!w&&S.unshift(""),S.length?n.pathname=S.join("/"):(n.pathname=null,n.path=null),$e.isNull(n.pathname)&&$e.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},Xe.prototype.parseHost=function(){var e=this.host,t=ze.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};var st=t(z),ot=t(te),at={parse:Ue,format:Ge,resolve:Ye};H.RETINA_PREFIX=/@([0-9\.]+)x/,H.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT=!1;var lt,ut=!1;function ct(e,t){return void 0===t&&(t=[]),t[0]=(e>>16&255)/255,t[1]=(e>>8&255)/255,t[2]=(255&e)/255,t}var pt=function(){for(var e=[],t=[],n=0;n<32;n++)e[n]=n,t[n]=n;e[M.NORMAL_NPM]=M.NORMAL,e[M.ADD_NPM]=M.ADD,e[M.SCREEN_NPM]=M.SCREEN,t[M.NORMAL]=M.NORMAL_NPM,t[M.ADD]=M.ADD_NPM,t[M.SCREEN]=M.SCREEN_NPM;var i=[];return i.push(t),i.push(e),i}();function ht(e,t){if(1===t)return(255*t<<24)+e;if(0===t)return 0;var n=e>>16&255,i=e>>8&255,r=255&e;return(255*t<<24)+((n=n*t+.5|0)<<16)+((i=i*t+.5|0)<<8)+(r*t+.5|0)}Float32Array,Uint32Array,Int32Array,Uint8Array;function dt(e){return e+=0===e?1:0,--e,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,1+(e|=e>>>16)}function ft(e){return!(e&e-1||!e)}function _t(e){var t=(e>65535?1:0)<<4,n=((e>>>=t)>255?1:0)<<3;return t|=n,t|=n=((e>>>=n)>15?1:0)<<2,(t|=n=((e>>>=n)>3?1:0)<<1)|(e>>>=n)>>1}function mt(e,t,n){var i,r=e.length;if(!(t>=r||0===n)){var s=r-(n=t+n>r?r-t:n);for(i=t;i8)throw new Error("max arguments reached");var l=this.name,u=this.items;this._aliasCount++;for(var c=0,p=u.length;c0&&this.items.length>1&&(this._aliasCount=0,this.items=this.items.slice(0))},e.prototype.add=function(e){return e[this._name]&&(this.ensureNonAliasedItems(),this.remove(e),this.items.push(e)),this},e.prototype.remove=function(e){var t=this.items.indexOf(e);return-1!==t&&(this.ensureNonAliasedItems(),this.items.splice(t,1)),this},e.prototype.contains=function(e){return-1!==this.items.indexOf(e)},e.prototype.removeAll=function(){return this.ensureNonAliasedItems(),this.items.length=0,this},e.prototype.destroy=function(){this.removeAll(),this.items=null,this._name=null},Object.defineProperty(e.prototype,"empty",{get:function(){return 0===this.items.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),e}();Object.defineProperties(At.prototype,{dispatch:{value:At.prototype.emit},run:{value:At.prototype.emit}}),H.TARGET_FPMS=.06,(xt=wt||(wt={}))[xt.INTERACTION=50]="INTERACTION",xt[xt.HIGH=25]="HIGH",xt[xt.NORMAL=0]="NORMAL",xt[xt.LOW=-25]="LOW",xt[xt.UTILITY=-50]="UTILITY";var $t,Ot,Mt=function(){function e(e,t,n,i){void 0===t&&(t=null),void 0===n&&(n=0),void 0===i&&(i=!1),this.next=null,this.previous=null,this._destroyed=!1,this.fn=e,this.context=t,this.priority=n,this.once=i}return e.prototype.match=function(e,t){return void 0===t&&(t=null),this.fn===e&&this.context===t},e.prototype.emit=function(e){this.fn&&(this.context?this.fn.call(this.context,e):this.fn(e));var t=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),t},e.prototype.connect=function(e){this.previous=e,e.next&&(e.next.previous=this),this.next=e.next,e.next=this},e.prototype.destroy=function(e){void 0===e&&(e=!1),this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var t=this.next;return this.next=e?null:t,this.previous=null,t},e}(),Ct=function(){function e(){var e=this;this.autoStart=!1,this.deltaTime=1,this.lastTime=-1,this.speed=1,this.started=!1,this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this._protected=!1,this._lastFrame=-1,this._head=new Mt(null,null,1/0),this.deltaMS=1/H.TARGET_FPMS,this.elapsedMS=1/H.TARGET_FPMS,this._tick=function(t){e._requestId=null,e.started&&(e.update(t),e.started&&null===e._requestId&&e._head.next&&(e._requestId=requestAnimationFrame(e._tick)))}}return e.prototype._requestIfNeeded=function(){null===this._requestId&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))},e.prototype._cancelIfNeeded=function(){null!==this._requestId&&(cancelAnimationFrame(this._requestId),this._requestId=null)},e.prototype._startIfPossible=function(){this.started?this._requestIfNeeded():this.autoStart&&this.start()},e.prototype.add=function(e,t,n){return void 0===n&&(n=wt.NORMAL),this._addListener(new Mt(e,t,n))},e.prototype.addOnce=function(e,t,n){return void 0===n&&(n=wt.NORMAL),this._addListener(new Mt(e,t,n,!0))},e.prototype._addListener=function(e){var t=this._head.next,n=this._head;if(t){for(;t;){if(e.priority>t.priority){e.connect(n);break}n=t,t=t.next}e.previous||e.connect(n)}else e.connect(n);return this._startIfPossible(),this},e.prototype.remove=function(e,t){for(var n=this._head.next;n;)n=n.match(e,t)?n.destroy():n.next;return this._head.next||this._cancelIfNeeded(),this},Object.defineProperty(e.prototype,"count",{get:function(){if(!this._head)return 0;for(var e=0,t=this._head;t=t.next;)e++;return e},enumerable:!1,configurable:!0}),e.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},e.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},e.prototype.destroy=function(){if(!this._protected){this.stop();for(var e=this._head.next;e;)e=e.destroy(!0);this._head.destroy(),this._head=null}},e.prototype.update=function(e){var t;if(void 0===e&&(e=performance.now()),e>this.lastTime){if((t=this.elapsedMS=e-this.lastTime)>this._maxElapsedMS&&(t=this._maxElapsedMS),t*=this.speed,this._minElapsedMS){var n=e-this._lastFrame|0;if(n=this.x&&e=this.y&&tt!=u>t&&e<(t-a)/(u-a)*(l-o)+o&&(n=!n)}return n},e.prototype.toString=function(){return"[@pixi/math:PolygoncloseStroke="+this.closeStroke+"points="+this.points.reduce((function(e,t){return e+", "+t}),"")+"]"},e}(),jt=function(){function e(e,t,n,i,r){void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=0),void 0===i&&(i=0),void 0===r&&(r=20),this.x=e,this.y=t,this.width=n,this.height=i,this.radius=r,this.type=Ot.RREC}return e.prototype.clone=function(){return new e(this.x,this.y,this.width,this.height,this.radius)},e.prototype.contains=function(e,t){if(this.width<=0||this.height<=0)return!1;if(e>=this.x&&e<=this.x+this.width&&t>=this.y&&t<=this.y+this.height){if(t>=this.y+this.radius&&t<=this.y+this.height-this.radius||e>=this.x+this.radius&&e<=this.x+this.width-this.radius)return!0;var n=e-(this.x+this.radius),i=t-(this.y+this.radius),r=this.radius*this.radius;if(n*n+i*i<=r)return!0;if((n=e-(this.x+this.width-this.radius))*n+i*i<=r)return!0;if(n*n+(i=t-(this.y+this.height-this.radius))*i<=r)return!0;if((n=e-(this.x+this.radius))*n+i*i<=r)return!0}return!1},e.prototype.toString=function(){return"[@pixi/math:RoundedRectangle x="+this.x+" y="+this.y+"width="+this.width+" height="+this.height+" radius="+this.radius+"]"},e}(),Vt=function(){function e(e,t){void 0===e&&(e=0),void 0===t&&(t=0),this.x=e,this.y=t}return e.prototype.clone=function(){return new e(this.x,this.y)},e.prototype.copyFrom=function(e){return this.set(e.x,e.y),this},e.prototype.copyTo=function(e){return e.set(this.x,this.y),e},e.prototype.equals=function(e){return e.x===this.x&&e.y===this.y},e.prototype.set=function(e,t){return void 0===e&&(e=0),void 0===t&&(t=e),this.x=e,this.y=t,this},e.prototype.toString=function(){return"[@pixi/math:Point x="+this.x+" y="+this.y+"]"},e}(),Ut=function(){function e(e,t,n,i){void 0===n&&(n=0),void 0===i&&(i=0),this._x=n,this._y=i,this.cb=e,this.scope=t}return e.prototype.clone=function(t,n){return void 0===t&&(t=this.cb),void 0===n&&(n=this.scope),new e(t,n,this._x,this._y)},e.prototype.set=function(e,t){return void 0===e&&(e=0),void 0===t&&(t=e),this._x===e&&this._y===t||(this._x=e,this._y=t,this.cb.call(this.scope)),this},e.prototype.copyFrom=function(e){return this._x===e.x&&this._y===e.y||(this._x=e.x,this._y=e.y,this.cb.call(this.scope)),this},e.prototype.copyTo=function(e){return e.set(this._x,this._y),e},e.prototype.equals=function(e){return e.x===this._x&&e.y===this._y},e.prototype.toString=function(){return"[@pixi/math:ObservablePoint x=0 y=0 scope="+this.scope+"]"},Object.defineProperty(e.prototype,"x",{get:function(){return this._x},set:function(e){this._x!==e&&(this._x=e,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},set:function(e){this._y!==e&&(this._y=e,this.cb.call(this.scope))},enumerable:!1,configurable:!0}),e}(),Yt=function(){function e(e,t,n,i,r,s){void 0===e&&(e=1),void 0===t&&(t=0),void 0===n&&(n=0),void 0===i&&(i=1),void 0===r&&(r=0),void 0===s&&(s=0),this.array=null,this.a=e,this.b=t,this.c=n,this.d=i,this.tx=r,this.ty=s}return e.prototype.fromArray=function(e){this.a=e[0],this.b=e[1],this.c=e[3],this.d=e[4],this.tx=e[2],this.ty=e[5]},e.prototype.set=function(e,t,n,i,r,s){return this.a=e,this.b=t,this.c=n,this.d=i,this.tx=r,this.ty=s,this},e.prototype.toArray=function(e,t){this.array||(this.array=new Float32Array(9));var n=t||this.array;return e?(n[0]=this.a,n[1]=this.b,n[2]=0,n[3]=this.c,n[4]=this.d,n[5]=0,n[6]=this.tx,n[7]=this.ty,n[8]=1):(n[0]=this.a,n[1]=this.c,n[2]=this.tx,n[3]=this.b,n[4]=this.d,n[5]=this.ty,n[6]=0,n[7]=0,n[8]=1),n},e.prototype.apply=function(e,t){t=t||new Vt;var n=e.x,i=e.y;return t.x=this.a*n+this.c*i+this.tx,t.y=this.b*n+this.d*i+this.ty,t},e.prototype.applyInverse=function(e,t){t=t||new Vt;var n=1/(this.a*this.d+this.c*-this.b),i=e.x,r=e.y;return t.x=this.d*n*i+-this.c*n*r+(this.ty*this.c-this.tx*this.d)*n,t.y=this.a*n*r+-this.b*n*i+(-this.ty*this.a+this.tx*this.b)*n,t},e.prototype.translate=function(e,t){return this.tx+=e,this.ty+=t,this},e.prototype.scale=function(e,t){return this.a*=e,this.d*=t,this.c*=e,this.b*=t,this.tx*=e,this.ty*=t,this},e.prototype.rotate=function(e){var t=Math.cos(e),n=Math.sin(e),i=this.a,r=this.c,s=this.tx;return this.a=i*t-this.b*n,this.b=i*n+this.b*t,this.c=r*t-this.d*n,this.d=r*n+this.d*t,this.tx=s*t-this.ty*n,this.ty=s*n+this.ty*t,this},e.prototype.append=function(e){var t=this.a,n=this.b,i=this.c,r=this.d;return this.a=e.a*t+e.b*i,this.b=e.a*n+e.b*r,this.c=e.c*t+e.d*i,this.d=e.c*n+e.d*r,this.tx=e.tx*t+e.ty*i+this.tx,this.ty=e.tx*n+e.ty*r+this.ty,this},e.prototype.setTransform=function(e,t,n,i,r,s,o,a,l){return this.a=Math.cos(o+l)*r,this.b=Math.sin(o+l)*r,this.c=-Math.sin(o-a)*s,this.d=Math.cos(o-a)*s,this.tx=e-(n*this.a+i*this.c),this.ty=t-(n*this.b+i*this.d),this},e.prototype.prepend=function(e){var t=this.tx;if(1!==e.a||0!==e.b||0!==e.c||1!==e.d){var n=this.a,i=this.c;this.a=n*e.a+this.b*e.c,this.b=n*e.b+this.b*e.d,this.c=i*e.a+this.d*e.c,this.d=i*e.b+this.d*e.d}return this.tx=t*e.a+this.ty*e.c+e.tx,this.ty=t*e.b+this.ty*e.d+e.ty,this},e.prototype.decompose=function(e){var t=this.a,n=this.b,i=this.c,r=this.d,s=e.pivot,o=-Math.atan2(-i,r),a=Math.atan2(n,t),l=Math.abs(o+a);return l<1e-5||Math.abs(Rt-l)<1e-5?(e.rotation=a,e.skew.x=e.skew.y=0):(e.rotation=0,e.skew.x=o,e.skew.y=a),e.scale.x=Math.sqrt(t*t+n*n),e.scale.y=Math.sqrt(i*i+r*r),e.position.x=this.tx+(s.x*t+s.y*i),e.position.y=this.ty+(s.x*n+s.y*r),e},e.prototype.invert=function(){var e=this.a,t=this.b,n=this.c,i=this.d,r=this.tx,s=e*i-t*n;return this.a=i/s,this.b=-t/s,this.c=-n/s,this.d=e/s,this.tx=(n*this.ty-i*r)/s,this.ty=-(e*this.ty-t*r)/s,this},e.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},e.prototype.clone=function(){var t=new e;return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},e.prototype.copyTo=function(e){return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},e.prototype.copyFrom=function(e){return this.a=e.a,this.b=e.b,this.c=e.c,this.d=e.d,this.tx=e.tx,this.ty=e.ty,this},e.prototype.toString=function(){return"[@pixi/math:Matrix a="+this.a+" b="+this.b+" c="+this.c+" d="+this.d+" tx="+this.tx+" ty="+this.ty+"]"},Object.defineProperty(e,"IDENTITY",{get:function(){return new e},enumerable:!1,configurable:!0}),Object.defineProperty(e,"TEMP_MATRIX",{get:function(){return new e},enumerable:!1,configurable:!0}),e}(),Gt=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],Xt=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],Ht=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],zt=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],qt=[],Wt=[],Kt=Math.sign;!function(){for(var e=0;e<16;e++){var t=[];qt.push(t);for(var n=0;n<16;n++)for(var i=Kt(Gt[e]*Gt[n]+Ht[e]*Xt[n]),r=Kt(Xt[e]*Gt[n]+zt[e]*Xt[n]),s=Kt(Gt[e]*Ht[n]+Ht[e]*zt[n]),o=Kt(Xt[e]*Ht[n]+zt[e]*zt[n]),a=0;a<16;a++)if(Gt[a]===i&&Xt[a]===r&&Ht[a]===s&&zt[a]===o){t.push(a);break}}for(e=0;e<16;e++){var l=new Yt;l.set(Gt[e],Xt[e],Ht[e],zt[e],0,0),Wt.push(l)}}();var Jt={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MAIN_DIAGONAL:10,MIRROR_HORIZONTAL:12,REVERSE_DIAGONAL:14,uX:function(e){return Gt[e]},uY:function(e){return Xt[e]},vX:function(e){return Ht[e]},vY:function(e){return zt[e]},inv:function(e){return 8&e?15&e:7&-e},add:function(e,t){return qt[e][t]},sub:function(e,t){return qt[e][Jt.inv(t)]},rotate180:function(e){return 4^e},isVertical:function(e){return 2==(3&e)},byDirection:function(e,t){return 2*Math.abs(e)<=Math.abs(t)?t>=0?Jt.S:Jt.N:2*Math.abs(t)<=Math.abs(e)?e>0?Jt.E:Jt.W:t>0?e>0?Jt.SE:Jt.SW:e>0?Jt.NE:Jt.NW},matrixAppendRotationInv:function(e,t,n,i){void 0===n&&(n=0),void 0===i&&(i=0);var r=Wt[Jt.inv(t)];r.tx=n,r.ty=i,e.append(r)}},Qt=function(){function e(){this.worldTransform=new Yt,this.localTransform=new Yt,this.position=new Ut(this.onChange,this,0,0),this.scale=new Ut(this.onChange,this,1,1),this.pivot=new Ut(this.onChange,this,0,0),this.skew=new Ut(this.updateSkew,this,0,0),this._rotation=0,this._cx=1,this._sx=0,this._cy=0,this._sy=1,this._localID=0,this._currentLocalID=0,this._worldID=0,this._parentID=0}return e.prototype.onChange=function(){this._localID++},e.prototype.updateSkew=function(){this._cx=Math.cos(this._rotation+this.skew.y),this._sx=Math.sin(this._rotation+this.skew.y),this._cy=-Math.sin(this._rotation-this.skew.x),this._sy=Math.cos(this._rotation-this.skew.x),this._localID++},e.prototype.toString=function(){return"[@pixi/math:Transform position=("+this.position.x+", "+this.position.y+") rotation="+this.rotation+" scale=("+this.scale.x+", "+this.scale.y+") skew=("+this.skew.x+", "+this.skew.y+") ]"},e.prototype.updateLocalTransform=function(){var e=this.localTransform;this._localID!==this._currentLocalID&&(e.a=this._cx*this.scale.x,e.b=this._sx*this.scale.x,e.c=this._cy*this.scale.y,e.d=this._sy*this.scale.y,e.tx=this.position.x-(this.pivot.x*e.a+this.pivot.y*e.c),e.ty=this.position.y-(this.pivot.x*e.b+this.pivot.y*e.d),this._currentLocalID=this._localID,this._parentID=-1)},e.prototype.updateTransform=function(e){var t=this.localTransform;if(this._localID!==this._currentLocalID&&(t.a=this._cx*this.scale.x,t.b=this._sx*this.scale.x,t.c=this._cy*this.scale.y,t.d=this._sy*this.scale.y,t.tx=this.position.x-(this.pivot.x*t.a+this.pivot.y*t.c),t.ty=this.position.y-(this.pivot.x*t.b+this.pivot.y*t.d),this._currentLocalID=this._localID,this._parentID=-1),this._parentID!==e._worldID){var n=e.worldTransform,i=this.worldTransform;i.a=t.a*n.a+t.b*n.c,i.b=t.a*n.b+t.b*n.d,i.c=t.c*n.a+t.d*n.c,i.d=t.c*n.b+t.d*n.d,i.tx=t.tx*n.a+t.ty*n.c+n.tx,i.ty=t.tx*n.b+t.ty*n.d+n.ty,this._parentID=e._worldID,this._worldID++}},e.prototype.setFromMatrix=function(e){e.decompose(this),this._localID++},Object.defineProperty(e.prototype,"rotation",{get:function(){return this._rotation},set:function(e){this._rotation!==e&&(this._rotation=e,this.updateSkew())},enumerable:!1,configurable:!0}),e.IDENTITY=new e,e}();H.PREFER_ENV=x.any?A.WEBGL:A.WEBGL2,H.STRICT_TEXTURE_CACHE=!1;var Zt=[];function en(e,t){if(!e)return null;var n="";if("string"==typeof e){var i=/\.(\w{3,4})(?:$|\?|#)/i.exec(e);i&&(n=i[1].toLowerCase())}for(var r=Zt.length-1;r>=0;--r){var s=Zt[r];if(s.test&&s.test(e,n))return new s(e,t)}throw new Error("Unrecognized source type to auto-detect Resource")}var tn=function(e,t){return(tn=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function nn(e,t){function n(){this.constructor=e}tn(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var rn=function(){function e(e,t){void 0===e&&(e=0),void 0===t&&(t=0),this._width=e,this._height=t,this.destroyed=!1,this.internal=!1,this.onResize=new At("setRealSize"),this.onUpdate=new At("update"),this.onError=new At("onError")}return e.prototype.bind=function(e){this.onResize.add(e),this.onUpdate.add(e),this.onError.add(e),(this._width||this._height)&&this.onResize.emit(this._width,this._height)},e.prototype.unbind=function(e){this.onResize.remove(e),this.onUpdate.remove(e),this.onError.remove(e)},e.prototype.resize=function(e,t){e===this._width&&t===this._height||(this._width=e,this._height=t,this.onResize.emit(e,t))},Object.defineProperty(e.prototype,"valid",{get:function(){return!!this._width&&!!this._height},enumerable:!1,configurable:!0}),e.prototype.update=function(){this.destroyed||this.onUpdate.emit()},e.prototype.load=function(){return Promise.resolve(this)},Object.defineProperty(e.prototype,"width",{get:function(){return this._width},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this._height},enumerable:!1,configurable:!0}),e.prototype.style=function(e,t,n){return!1},e.prototype.dispose=function(){},e.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.dispose(),this.onError.removeAll(),this.onError=null,this.onResize.removeAll(),this.onResize=null,this.onUpdate.removeAll(),this.onUpdate=null)},e.test=function(e,t){return!1},e}(),sn=function(e){function t(t,n){var i=this,r=n||{},s=r.width,o=r.height;if(!s||!o)throw new Error("BufferResource width or height invalid");return(i=e.call(this,s,o)||this).data=t,i}return nn(t,e),t.prototype.upload=function(e,t,n){var i=e.gl;return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.alphaMode===B.UNPACK),n.width===t.width&&n.height===t.height?i.texSubImage2D(t.target,0,0,0,t.width,t.height,t.format,t.type,this.data):(n.width=t.width,n.height=t.height,i.texImage2D(t.target,0,n.internalFormat,t.width,t.height,0,t.format,n.type,this.data)),!0},t.prototype.dispose=function(){this.data=null},t.test=function(e){return e instanceof Float32Array||e instanceof Uint8Array||e instanceof Uint32Array},t}(rn),on={scaleMode:D.NEAREST,format:R.RGBA,alphaMode:B.NPM},an=function(e){function t(t,n){void 0===t&&(t=null),void 0===n&&(n=null);var i=e.call(this)||this,r=(n=n||{}).alphaMode,s=n.mipmap,o=n.anisotropicLevel,a=n.scaleMode,l=n.width,u=n.height,c=n.wrapMode,p=n.format,h=n.type,d=n.target,f=n.resolution,_=n.resourceOptions;return!t||t instanceof rn||((t=en(t,_)).internal=!0),i.width=l||0,i.height=u||0,i.resolution=f||H.RESOLUTION,i.mipmap=void 0!==s?s:H.MIPMAP_TEXTURES,i.anisotropicLevel=void 0!==o?o:H.ANISOTROPIC_LEVEL,i.wrapMode=c||H.WRAP_MODE,i.scaleMode=void 0!==a?a:H.SCALE_MODE,i.format=p||R.RGBA,i.type=h||L.UNSIGNED_BYTE,i.target=d||N.TEXTURE_2D,i.alphaMode=void 0!==r?r:B.UNPACK,i.uid=gt(),i.touched=0,i.isPowerOfTwo=!1,i._refreshPOT(),i._glTextures={},i.dirtyId=0,i.dirtyStyleId=0,i.cacheId=null,i.valid=l>0&&u>0,i.textureCacheIds=[],i.destroyed=!1,i.resource=null,i._batchEnabled=0,i._batchLocation=0,i.parentTextureArray=null,i.setResource(t),i}return nn(t,e),Object.defineProperty(t.prototype,"realWidth",{get:function(){return Math.ceil(this.width*this.resolution-1e-4)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"realHeight",{get:function(){return Math.ceil(this.height*this.resolution-1e-4)},enumerable:!1,configurable:!0}),t.prototype.setStyle=function(e,t){var n;return void 0!==e&&e!==this.scaleMode&&(this.scaleMode=e,n=!0),void 0!==t&&t!==this.mipmap&&(this.mipmap=t,n=!0),n&&this.dirtyStyleId++,this},t.prototype.setSize=function(e,t,n){return this.resolution=n||this.resolution,this.width=e,this.height=t,this._refreshPOT(),this.update(),this},t.prototype.setRealSize=function(e,t,n){return this.resolution=n||this.resolution,this.width=e/this.resolution,this.height=t/this.resolution,this._refreshPOT(),this.update(),this},t.prototype._refreshPOT=function(){this.isPowerOfTwo=ft(this.realWidth)&&ft(this.realHeight)},t.prototype.setResolution=function(e){var t=this.resolution;return t===e||(this.resolution=e,this.valid&&(this.width=this.width*t/e,this.height=this.height*t/e,this.emit("update",this)),this._refreshPOT()),this},t.prototype.setResource=function(e){if(this.resource===e)return this;if(this.resource)throw new Error("Resource can be set only once");return e.bind(this),this.resource=e,this},t.prototype.update=function(){this.valid?(this.dirtyId++,this.dirtyStyleId++,this.emit("update",this)):this.width>0&&this.height>0&&(this.valid=!0,this.emit("loaded",this),this.emit("update",this))},t.prototype.onError=function(e){this.emit("error",this,e)},t.prototype.destroy=function(){this.resource&&(this.resource.unbind(this),this.resource.internal&&this.resource.destroy(),this.resource=null),this.cacheId&&(delete Et[this.cacheId],delete Tt[this.cacheId],this.cacheId=null),this.dispose(),t.removeFromCache(this),this.textureCacheIds=null,this.destroyed=!0},t.prototype.dispose=function(){this.emit("dispose",this)},t.prototype.castToBaseTexture=function(){return this},t.from=function(e,n,i){void 0===i&&(i=H.STRICT_TEXTURE_CACHE);var r="string"==typeof e,s=null;if(r)s=e;else{if(!e._pixiId){var o=n&&n.pixiIdPrefix||"pixiid";e._pixiId=o+"_"+gt()}s=e._pixiId}var a=Et[s];if(r&&i&&!a)throw new Error('The cacheId "'+s+'" does not exist in BaseTextureCache.');return a||((a=new t(e,n)).cacheId=s,t.addToCache(a,s)),a},t.fromBuffer=function(e,n,i,r){e=e||new Float32Array(n*i*4);var s=new sn(e,{width:n,height:i}),o=e instanceof Float32Array?L.FLOAT:L.UNSIGNED_BYTE;return new t(s,Object.assign(on,r||{width:n,height:i,type:o}))},t.addToCache=function(e,t){t&&(-1===e.textureCacheIds.indexOf(t)&&e.textureCacheIds.push(t),Et[t]&&console.warn("BaseTexture added to the cache with an id ["+t+"] that already had an entry"),Et[t]=e)},t.removeFromCache=function(e){if("string"==typeof e){var t=Et[e];if(t){var n=t.textureCacheIds.indexOf(e);return n>-1&&t.textureCacheIds.splice(n,1),delete Et[e],t}}else if(e&&e.textureCacheIds){for(var i=0;i0){if(!e.resource)throw new Error("CubeResource does not support copying of renderTexture.");this.addResourceAt(e.resource,t)}else e.target=N.TEXTURE_CUBE_MAP_POSITIVE_X+t,e.parentTextureArray=this.baseTexture,this.items[t]=e;return e.valid&&!this.valid&&this.resize(e.realWidth,e.realHeight),this.items[t]=e,this},t.prototype.upload=function(e,n,i){for(var r=this.itemDirtyIds,s=0;s]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i,t}(cn),_n=function(e){function t(n,i){var r=this;if(i=i||{},!(n instanceof HTMLVideoElement)){var s=document.createElement("video");s.setAttribute("preload","auto"),s.setAttribute("webkit-playsinline",""),s.setAttribute("playsinline",""),"string"==typeof n&&(n=[n]);var o=n[0].src||n[0];cn.crossOrigin(s,o,i.crossorigin);for(var a=0;a0&&!1===e.paused&&!1===e.ended&&e.readyState>2},t.prototype._isSourceReady=function(){var e=this.source;return 3===e.readyState||4===e.readyState},t.prototype._onPlayStart=function(){this.valid||this._onCanPlay(),this.autoUpdate&&!this._isConnectedToTicker&&(Ct.shared.add(this.update,this),this._isConnectedToTicker=!0)},t.prototype._onPlayStop=function(){this._isConnectedToTicker&&(Ct.shared.remove(this.update,this),this._isConnectedToTicker=!1)},t.prototype._onCanPlay=function(){var e=this.source;e.removeEventListener("canplay",this._onCanPlay),e.removeEventListener("canplaythrough",this._onCanPlay);var t=this.valid;this.resize(e.videoWidth,e.videoHeight),!t&&this._resolve&&(this._resolve(this),this._resolve=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&e.play()},t.prototype.dispose=function(){this._isConnectedToTicker&&Ct.shared.remove(this.update,this);var t=this.source;t&&(t.removeEventListener("error",this._onError,!0),t.pause(),t.src="",t.load()),e.prototype.dispose.call(this)},Object.defineProperty(t.prototype,"autoUpdate",{get:function(){return this._autoUpdate},set:function(e){e!==this._autoUpdate&&(this._autoUpdate=e,!this._autoUpdate&&this._isConnectedToTicker?(Ct.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._isSourcePlaying()&&(Ct.shared.add(this.update,this),this._isConnectedToTicker=!0))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"updateFPS",{get:function(){return this._updateFPS},set:function(e){e!==this._updateFPS&&(this._updateFPS=e)},enumerable:!1,configurable:!0}),t.test=function(e,n){return self.HTMLVideoElement&&e instanceof HTMLVideoElement||t.TYPES.indexOf(n)>-1},t.TYPES=["mp4","m4v","webm","ogg","ogv","h264","avi","mov"],t.MIME_TYPES={ogv:"video/ogg",mov:"video/quicktime",m4v:"video/mp4"},t}(cn),mn=function(e){function t(t){return e.call(this,t)||this}return nn(t,e),t.test=function(e){return!!self.createImageBitmap&&e instanceof ImageBitmap},t}(cn);Zt.push(dn,mn,pn,_n,fn,sn,hn,un);var bn={__proto__:null,Resource:rn,BaseImageResource:cn,INSTALLED:Zt,autoDetectResource:en,AbstractMultiResource:ln,ArrayResource:un,BufferResource:sn,CanvasResource:pn,CubeResource:hn,ImageResource:dn,SVGResource:fn,VideoResource:_n,ImageBitmapResource:mn},gn=function(){function e(e){this.renderer=e}return e.prototype.destroy=function(){this.renderer=null},e}(),Sn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return nn(t,e),t.prototype.upload=function(e,t,n){var i=e.gl;return i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.alphaMode===B.UNPACK),n.width===t.width&&n.height===t.height?i.texSubImage2D(t.target,0,0,0,t.width,t.height,t.format,t.type,this.data):(n.width=t.width,n.height=t.height,i.texImage2D(t.target,0,1===e.context.webGLVersion?i.DEPTH_COMPONENT:i.DEPTH_COMPONENT16,t.width,t.height,0,t.format,t.type,this.data)),!0},t}(sn),kn=function(){function e(e,t){this.width=Math.ceil(e||100),this.height=Math.ceil(t||100),this.stencil=!1,this.depth=!1,this.dirtyId=0,this.dirtyFormat=0,this.dirtySize=0,this.depthTexture=null,this.colorTextures=[],this.glFramebuffers={},this.disposeRunner=new At("disposeFramebuffer"),this.multisample=G.NONE}return Object.defineProperty(e.prototype,"colorTexture",{get:function(){return this.colorTextures[0]},enumerable:!1,configurable:!0}),e.prototype.addColorTexture=function(e,t){return void 0===e&&(e=0),this.colorTextures[e]=t||new an(null,{scaleMode:D.NEAREST,resolution:1,mipmap:F.OFF,width:this.width,height:this.height}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.addDepthTexture=function(e){return this.depthTexture=e||new an(new Sn(null,{width:this.width,height:this.height}),{scaleMode:D.NEAREST,resolution:1,width:this.width,height:this.height,mipmap:F.OFF,format:R.DEPTH_COMPONENT,type:L.UNSIGNED_SHORT}),this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableDepth=function(){return this.depth=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.enableStencil=function(){return this.stencil=!0,this.dirtyId++,this.dirtyFormat++,this},e.prototype.resize=function(e,t){if(e=Math.ceil(e),t=Math.ceil(t),e!==this.width||t!==this.height){this.width=e,this.height=t,this.dirtyId++,this.dirtySize++;for(var n=0;n-1&&t.textureCacheIds.splice(n,1),delete Tt[e],t}}else if(e&&e.textureCacheIds){for(var i=0;ithis.baseTexture.width,o=n+r>this.baseTexture.height;if(s||o){var a=s&&o?"and":"or",l="X: "+t+" + "+i+" = "+(t+i)+" > "+this.baseTexture.width,u="Y: "+n+" + "+r+" = "+(n+r)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+l+" "+a+" "+u)}this.valid=i&&r&&this.baseTexture.valid,this.trim||this.rotate||(this.orig=e),this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"rotate",{get:function(){return this._rotate},set:function(e){this._rotate=e,this.valid&&this.updateUvs()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this.orig.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.orig.height},enumerable:!1,configurable:!0}),t.prototype.castToBaseTexture=function(){return this.baseTexture},t}(st.d);function In(e){e.destroy=function(){},e.on=function(){},e.once=function(){},e.emit=function(){}}En.EMPTY=new En(new an),In(En.EMPTY),In(En.EMPTY.baseTexture),En.WHITE=function(){var e=document.createElement("canvas");e.width=16,e.height=16;var t=e.getContext("2d");return t.fillStyle="white",t.fillRect(0,0,16,16),new En(new an(new pn(e)))}(),In(En.WHITE),In(En.WHITE.baseTexture);var wn=function(e){function t(t,n){var i=e.call(this,t,n)||this;return i.valid=!0,i.filterFrame=null,i.filterPoolKey=null,i.updateUvs(),i}return nn(t,e),Object.defineProperty(t.prototype,"framebuffer",{get:function(){return this.baseTexture.framebuffer},enumerable:!1,configurable:!0}),t.prototype.resize=function(e,t,n){void 0===n&&(n=!0),e=Math.ceil(e),t=Math.ceil(t),this.valid=e>0&&t>0,this._frame.width=this.orig.width=e,this._frame.height=this.orig.height=t,n&&this.baseTexture.resize(e,t),this.updateUvs()},t.prototype.setResolution=function(e){var t=this.baseTexture;t.resolution!==e&&(t.setResolution(e),this.resize(t.width,t.height,!1))},t.create=function(e){for(var n=arguments,i=[],r=1;r0&&t.height>0,i)for(var r=0;r1){for(var u=0;u1&&this.renderer.framebuffer.blit(),1===n.length)n[0].apply(this,t.renderTexture,l.renderTexture,j.BLEND,t),this.returnFilterTexture(t.renderTexture);else{var u=t.renderTexture,c=this.getOptimalFilterTexture(u.width,u.height,t.resolution);c.filterFrame=u.filterFrame;var p=0;for(p=0;p=0;--i)e[i]=n[i]||null,e[i]&&(e[i]._batchLocation=i)},t.prototype.boundArray=function(e,t,n,i){for(var r=e.elements,s=e.ids,o=e.count,a=0,l=0;l=0&&c=A.WEBGL2&&(n=e.getContext("webgl2",t)),n)this.webGLVersion=2;else if(this.webGLVersion=1,!(n=e.getContext("webgl",t)||e.getContext("experimental-webgl",t)))throw new Error("This browser does not support WebGL. Try using the canvas renderer");return this.gl=n,this.getExtensions(),this.gl},t.prototype.getExtensions=function(){var e=this.gl,t={anisotropicFiltering:e.getExtension("EXT_texture_filter_anisotropic"),floatTextureLinear:e.getExtension("OES_texture_float_linear"),s3tc:e.getExtension("WEBGL_compressed_texture_s3tc"),s3tc_sRGB:e.getExtension("WEBGL_compressed_texture_s3tc_srgb"),etc:e.getExtension("WEBGL_compressed_texture_etc"),etc1:e.getExtension("WEBGL_compressed_texture_etc1"),pvrtc:e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"),atc:e.getExtension("WEBGL_compressed_texture_atc"),astc:e.getExtension("WEBGL_compressed_texture_astc")};1===this.webGLVersion?Object.assign(this.extensions,t,{drawBuffers:e.getExtension("WEBGL_draw_buffers"),depthTexture:e.getExtension("WEBGL_depth_texture"),loseContext:e.getExtension("WEBGL_lose_context"),vertexArrayObject:e.getExtension("OES_vertex_array_object")||e.getExtension("MOZ_OES_vertex_array_object")||e.getExtension("WEBKIT_OES_vertex_array_object"),uint32ElementIndex:e.getExtension("OES_element_index_uint"),floatTexture:e.getExtension("OES_texture_float"),floatTextureLinear:e.getExtension("OES_texture_float_linear"),textureHalfFloat:e.getExtension("OES_texture_half_float"),textureHalfFloatLinear:e.getExtension("OES_texture_half_float_linear")}):2===this.webGLVersion&&Object.assign(this.extensions,t,{colorBufferFloat:e.getExtension("EXT_color_buffer_float")})},t.prototype.handleContextLost=function(e){e.preventDefault()},t.prototype.handleContextRestored=function(){this.renderer.runners.contextChange.emit(this.gl)},t.prototype.destroy=function(){var e=this.renderer.view;e.removeEventListener("webglcontextlost",this.handleContextLost),e.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),this.extensions.loseContext&&this.extensions.loseContext.loseContext()},t.prototype.postrender=function(){this.renderer.renderingToScreen&&this.gl.flush()},t.prototype.validateContext=function(e){var t=e.getContextAttributes(),n="WebGL2RenderingContext"in self&&e instanceof self.WebGL2RenderingContext;n&&(this.webGLVersion=2),t.stencil||console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly");var i=n||!!e.getExtension("OES_element_index_uint");this.supports.uint32Indices=i,i||console.warn("Provided WebGL context does not support 32 index buffer, complex graphics may not render correctly")},t}(gn),Wn=function(e){this.framebuffer=e,this.stencil=null,this.dirtyId=0,this.dirtyFormat=0,this.dirtySize=0,this.multisample=G.NONE,this.msaaBuffer=null,this.blitFramebuffer=null},Kn=new Dt,Jn=function(e){function t(t){var n=e.call(this,t)||this;return n.managedFramebuffers=[],n.unknownFramebuffer=new kn(10,10),n.msaaSamples=null,n}return nn(t,e),t.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;if(this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.current=this.unknownFramebuffer,this.viewport=new Dt,this.hasMRT=!0,this.writeDepthTexture=!0,this.disposeAll(!0),1===this.renderer.context.webGLVersion){var t=this.renderer.context.extensions.drawBuffers,n=this.renderer.context.extensions.depthTexture;H.PREFER_ENV===A.WEBGL_LEGACY&&(t=null,n=null),t?e.drawBuffers=function(e){return t.drawBuffersWEBGL(e)}:(this.hasMRT=!1,e.drawBuffers=function(){}),n||(this.writeDepthTexture=!1)}else this.msaaSamples=e.getInternalformatParameter(e.RENDERBUFFER,e.RGBA8,e.SAMPLES)},t.prototype.bind=function(e,t){var n=this.gl;if(e){var i=e.glFramebuffers[this.CONTEXT_UID]||this.initFramebuffer(e);this.current!==e&&(this.current=e,n.bindFramebuffer(n.FRAMEBUFFER,i.framebuffer)),i.dirtyId!==e.dirtyId&&(i.dirtyId=e.dirtyId,i.dirtyFormat!==e.dirtyFormat?(i.dirtyFormat=e.dirtyFormat,this.updateFramebuffer(e)):i.dirtySize!==e.dirtySize&&(i.dirtySize=e.dirtySize,this.resizeFramebuffer(e)));for(var r=0;r1&&(n.msaaBuffer=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,n.msaaBuffer),t.renderbufferStorageMultisample(t.RENDERBUFFER,n.multisample,t.RGBA8,e.width,e.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.RENDERBUFFER,n.msaaBuffer));for(var r=[],s=0;s1)){var o=e.colorTextures[s],a=o.parentTextureArray||o;this.renderer.texture.bind(a,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0+s,o.target,a._glTextures[this.CONTEXT_UID].texture,0),r.push(t.COLOR_ATTACHMENT0+s)}if(r.length>1&&t.drawBuffers(r),e.depthTexture&&this.writeDepthTexture){var l=e.depthTexture;this.renderer.texture.bind(l,0),t.framebufferTexture2D(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.TEXTURE_2D,l._glTextures[this.CONTEXT_UID].texture,0)}n.stencil||!e.stencil&&!e.depth||(n.stencil=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,n.stencil),t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,e.width,e.height),e.depthTexture||t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,n.stencil))},t.prototype.detectSamples=function(e){var t=this.msaaSamples,n=G.NONE;if(e<=1||null===t)return n;for(var i=0;i=0&&this.managedFramebuffers.splice(r,1),e.disposeRunner.remove(this),t||(i.deleteFramebuffer(n.framebuffer),n.stencil&&i.deleteRenderbuffer(n.stencil))}},t.prototype.disposeAll=function(e){var t=this.managedFramebuffers;this.managedFramebuffers=[];for(var n=0;n=i.data.byteLength)t.bufferSubData(s,0,i.data);else{var o=i.static?t.STATIC_DRAW:t.DYNAMIC_DRAW;r.byteLength=i.data.byteLength,t.bufferData(s,i.data,o)}}}},t.prototype.checkCompatibility=function(e,t){var n=e.attributes,i=t.attributeData;for(var r in i)if(!n[r])throw new Error('shader and geometry incompatible, geometry missing the "'+r+'" attribute')},t.prototype.getSignature=function(e,t){var n=e.attributes,i=t.attributeData,r=["g",e.id];for(var s in n)i[s]&&r.push(s);return r.join("-")},t.prototype.initGeometryVao=function(e,t,n){void 0===n&&(n=!0),this.checkCompatibility(e,t);var i=this.gl,r=this.CONTEXT_UID,s=this.getSignature(e,t),o=e.glVertexArrayObjects[this.CONTEXT_UID],a=o[s];if(a)return o[t.id]=a,a;var l=e.buffers,u=e.attributes,c={},p={};for(var h in l)c[h]=0,p[h]=0;for(var h in u)!u[h].size&&t.attributeData[h]?u[h].size=t.attributeData[h].size:u[h].size||console.warn("PIXI Geometry attribute '"+h+"' size cannot be determined (likely the bound shader does not have the attribute)"),c[u[h].buffer]+=u[h].size*Zn[u[h].type];for(var h in u){var d=u[h],f=d.size;void 0===d.stride&&(c[d.buffer]===f*Zn[d.type]?d.stride=0:d.stride=c[d.buffer]),void 0===d.start&&(d.start=p[d.buffer],p[d.buffer]+=f*Zn[d.type])}a=i.createVertexArray(),i.bindVertexArray(a);for(var _=0;_=A.WEBGL2&&(t=e.getContext("webgl2",{})),t||((t=e.getContext("webgl",{})||e.getContext("experimental-webgl",{}))?t.getExtension("WEBGL_draw_buffers"):t=null),li=t}return li}function ci(e,t,n){if("precision"!==e.substring(0,9)){var i=t;return t===U.HIGH&&n!==U.HIGH&&(i=U.MEDIUM),"precision "+i+" float;\n"+e}return n!==U.HIGH&&"precision highp"===e.substring(0,15)?e.replace("precision highp","precision mediump"):e}var pi={float:1,vec2:2,vec3:3,vec4:4,int:1,ivec2:2,ivec3:3,ivec4:4,uint:1,uvec2:2,uvec3:3,uvec4:4,bool:1,bvec2:2,bvec3:3,bvec4:4,mat2:4,mat3:9,mat4:16,sampler2D:1};function hi(e){return pi[e]}var di=null,fi={FLOAT:"float",FLOAT_VEC2:"vec2",FLOAT_VEC3:"vec3",FLOAT_VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",UNSIGNED_INT:"uint",UNSIGNED_INT_VEC2:"uvec2",UNSIGNED_INT_VEC3:"uvec3",UNSIGNED_INT_VEC4:"uvec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",FLOAT_MAT2:"mat2",FLOAT_MAT3:"mat3",FLOAT_MAT4:"mat4",SAMPLER_2D:"sampler2D",INT_SAMPLER_2D:"sampler2D",UNSIGNED_INT_SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube",INT_SAMPLER_CUBE:"samplerCube",UNSIGNED_INT_SAMPLER_CUBE:"samplerCube",SAMPLER_2D_ARRAY:"sampler2DArray",INT_SAMPLER_2D_ARRAY:"sampler2DArray",UNSIGNED_INT_SAMPLER_2D_ARRAY:"sampler2DArray"};function _i(e,t){if(!di){var n=Object.keys(fi);di={};for(var i=0;i0&&(t+="\nelse "),nt.name?1:-1})),s=0;s0?this._useCurrent():e.disable(e.SCISSOR_TEST)},t.prototype._useCurrent=function(){var e=this.maskStack[this.maskStack.length-1]._scissorRect,t=this.renderer.renderTexture.current,n=this.renderer.projection,i=n.transform,r=n.sourceFrame,s=n.destinationFrame,o=t?t.resolution:this.renderer.resolution,a=s.width/r.width,l=s.height/r.height,u=((e.x-r.x)*a+s.x)*o,c=((e.y-r.y)*l+s.y)*o,p=e.width*a*o,h=e.height*l*o;i&&(u+=i.tx*o,c+=i.ty*o),t||(c=this.renderer.height-h-c),this.renderer.gl.scissor(u,c,p,h)},t}(Ci),Ni=function(e){function t(t){var n=e.call(this,t)||this;return n.glConst=WebGLRenderingContext.STENCIL_TEST,n}return nn(t,e),t.prototype.getStackLength=function(){var e=this.maskStack[this.maskStack.length-1];return e?e._stencilCounter:0},t.prototype.push=function(e){var t=e.maskObject,n=this.renderer.gl,i=e._stencilCounter;0===i&&(this.renderer.framebuffer.forceStencil(),n.enable(n.STENCIL_TEST)),e._stencilCounter++,n.colorMask(!1,!1,!1,!1),n.stencilFunc(n.EQUAL,i,this._getBitwiseMask()),n.stencilOp(n.KEEP,n.KEEP,n.INCR),t.renderable=!0,t.render(this.renderer),this.renderer.batch.flush(),this.renderer.framebuffer.blit(),t.renderable=!1,this._useCurrent()},t.prototype.pop=function(e){var t=this.renderer.gl;0===this.getStackLength()?(t.disable(t.STENCIL_TEST),t.clear(t.STENCIL_BUFFER_BIT),t.clearStencil(0)):(t.colorMask(!1,!1,!1,!1),t.stencilOp(t.KEEP,t.KEEP,t.DECR),e.renderable=!0,e.render(this.renderer),this.renderer.batch.flush(),e.renderable=!1,this._useCurrent())},t.prototype._useCurrent=function(){var e=this.renderer.gl;e.colorMask(!0,!0,!0,!0),e.stencilFunc(e.EQUAL,this.getStackLength(),this._getBitwiseMask()),e.stencilOp(e.KEEP,e.KEEP,e.KEEP)},t.prototype._getBitwiseMask=function(){return(1<>=1,n++;this.stateId=e.data}for(n=0;nthis.checkCountMax&&(this.checkCount=0,this.run())))},t.prototype.run=function(){for(var e=this.renderer.texture,t=e.managedTextures,n=!1,i=0;ithis.maxIdle&&(e.destroyTexture(r,!0),t[i]=null,n=!0)}if(n){var s=0;for(i=0;i=0;i--)this.unload(e.children[i])},t}(gn),Xi=function(e){this.texture=e,this.width=-1,this.height=-1,this.dirtyId=-1,this.dirtyStyleId=-1,this.mipmap=!1,this.wrapMode=33071,this.type=6408,this.internalFormat=5121},Hi=function(e){function t(t){var n=e.call(this,t)||this;return n.boundTextures=[],n.currentLocation=-1,n.managedTextures=[],n._unknownBoundTextures=!1,n.unknownTexture=new an,n}return nn(t,e),t.prototype.contextChange=function(){var e=this.gl=this.renderer.gl;this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.webGLVersion=this.renderer.context.webGLVersion;var t=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS);this.boundTextures.length=t;for(var n=0;n=1:t.mipmap=!1,2===this.webGLVersion||e.isPowerOfTwo?t.wrapMode=e.wrapMode:t.wrapMode=P.CLAMP,e.resource&&e.resource.style(this.renderer,e,t)||this.setStyle(e,t),t.dirtyStyleId=e.dirtyStyleId)},t.prototype.setStyle=function(e,t){var n=this.gl;if(t.mipmap&&e.mipmap!==F.ON_MANUAL&&n.generateMipmap(e.target),n.texParameteri(e.target,n.TEXTURE_WRAP_S,t.wrapMode),n.texParameteri(e.target,n.TEXTURE_WRAP_T,t.wrapMode),t.mipmap){n.texParameteri(e.target,n.TEXTURE_MIN_FILTER,e.scaleMode===D.LINEAR?n.LINEAR_MIPMAP_LINEAR:n.NEAREST_MIPMAP_NEAREST);var i=this.renderer.context.extensions.anisotropicFiltering;if(i&&e.anisotropicLevel>0&&e.scaleMode===D.LINEAR){var r=Math.min(e.anisotropicLevel,n.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT));n.texParameterf(e.target,i.TEXTURE_MAX_ANISOTROPY_EXT,r)}}else n.texParameteri(e.target,n.TEXTURE_MIN_FILTER,e.scaleMode===D.LINEAR?n.LINEAR:n.NEAREST);n.texParameteri(e.target,n.TEXTURE_MAG_FILTER,e.scaleMode===D.LINEAR?n.LINEAR:n.NEAREST)},t}(gn),zi={__proto__:null,FilterSystem:Gn,BatchSystem:Hn,ContextSystem:qn,FramebufferSystem:Jn,GeometrySystem:ei,MaskSystem:Mi,ScissorSystem:Ri,StencilSystem:Ni,ProjectionSystem:Li,RenderTextureSystem:Fi,ShaderSystem:Ui,StateSystem:Yi,TextureGCSystem:Gi,TextureSystem:Hi},qi=new Yt,Wi=function(e){function t(t,n){void 0===t&&(t=$.UNKNOWN);var i=e.call(this)||this;return n=Object.assign({},H.RENDER_OPTIONS,n),i.options=n,i.type=t,i.screen=new Dt(0,0,n.width,n.height),i.view=n.view||document.createElement("canvas"),i.resolution=n.resolution||H.RESOLUTION,i.useContextAlpha=n.useContextAlpha,i.autoDensity=!!n.autoDensity,i.preserveDrawingBuffer=n.preserveDrawingBuffer,i.clearBeforeRender=n.clearBeforeRender,i._backgroundColor=0,i._backgroundColorRgba=[0,0,0,1],i._backgroundColorString="#000000",i.backgroundColor=n.backgroundColor||i._backgroundColor,i.backgroundAlpha=n.backgroundAlpha,void 0!==n.transparent&&(kt("6.0.0","Option transparent is deprecated, please use backgroundAlpha instead."),i.useContextAlpha=n.transparent,i.backgroundAlpha=n.transparent?0:1),i._lastObjectRendered=null,i.plugins={},i}return nn(t,e),t.prototype.initPlugins=function(e){for(var t in e)this.plugins[t]=new e[t](this)},Object.defineProperty(t.prototype,"width",{get:function(){return this.view.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.view.height},enumerable:!1,configurable:!0}),t.prototype.resize=function(e,t){this.screen.width=e,this.screen.height=t,this.view.width=e*this.resolution,this.view.height=t*this.resolution,this.autoDensity&&(this.view.style.width=e+"px",this.view.style.height=t+"px"),this.emit("resize",e,t)},t.prototype.generateTexture=function(e,t,n,i){0===(i=i||e.getLocalBounds(null,!0)).width&&(i.width=1),0===i.height&&(i.height=1);var r=wn.create({width:0|i.width,height:0|i.height,scaleMode:t,resolution:n});return qi.tx=-i.x,qi.ty=-i.y,this.render(e,{renderTexture:r,clear:!1,transform:qi,skipUpdateTransform:!!e.parent}),r},t.prototype.destroy=function(e){for(var t in this.plugins)this.plugins[t].destroy(),this.plugins[t]=null;e&&this.view.parentNode&&this.view.parentNode.removeChild(this.view),this.plugins=null,this.type=$.UNKNOWN,this.view=null,this.screen=null,this._tempDisplayObjectParent=null,this.options=null,this._backgroundColorRgba=null,this._backgroundColorString=null,this._lastObjectRendered=null},Object.defineProperty(t.prototype,"backgroundColor",{get:function(){return this._backgroundColor},set:function(e){this._backgroundColor=e,this._backgroundColorString=function(e){var t=e.toString(16);return"#"+("000000".substr(0,6-t.length)+t)}(e),ct(e,this._backgroundColorRgba)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"backgroundAlpha",{get:function(){return this._backgroundColorRgba[3]},set:function(e){this._backgroundColorRgba[3]=e},enumerable:!1,configurable:!0}),t}(st.d),Ki=(function(e){function t(n){var i=e.call(this,$.WEBGL,n)||this;return n=i.options,i.gl=null,i.CONTEXT_UID=0,i.runners={destroy:new At("destroy"),contextChange:new At("contextChange"),reset:new At("reset"),update:new At("update"),postrender:new At("postrender"),prerender:new At("prerender"),resize:new At("resize")},i.globalUniforms=new jn({projectionMatrix:new Yt},!0),i.addSystem(Mi,"mask").addSystem(qn,"context").addSystem(Yi,"state").addSystem(Ui,"shader").addSystem(Hi,"texture").addSystem(ei,"geometry").addSystem(Jn,"framebuffer").addSystem(Ri,"scissor").addSystem(Ni,"stencil").addSystem(Li,"projection").addSystem(Gi,"textureGC").addSystem(Gn,"filter").addSystem(Fi,"renderTexture").addSystem(Hn,"batch"),i.initPlugins(t.__plugins),n.context?i.context.initFromContext(n.context):i.context.initFromOptions({alpha:!!i.useContextAlpha,antialias:n.antialias,premultipliedAlpha:i.useContextAlpha&&"notMultiplied"!==i.useContextAlpha,stencil:!0,preserveDrawingBuffer:n.preserveDrawingBuffer,powerPreference:i.options.powerPreference}),i.renderingToScreen=!0,function(e){var t;if(!ut){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var n=["\n %c %c %c PixiJS 6.0.1 - ✰ "+e+" ✰ %c %c http://www.pixijs.com/ %c %c ♥%c♥%c♥ \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];(t=self.console).log.apply(t,n)}else self.console&&self.console.log("PixiJS 6.0.1 - "+e+" - http://www.pixijs.com/");ut=!0}}(2===i.context.webGLVersion?"WebGL 2":"WebGL 1"),i.resize(i.options.width,i.options.height),i}nn(t,e),t.create=function(e){if(void 0===lt&&(lt=function(){var e={stencil:!0,failIfMajorPerformanceCaveat:H.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT};try{if(!self.WebGLRenderingContext)return!1;var t=document.createElement("canvas"),n=t.getContext("webgl",e)||t.getContext("experimental-webgl",e),i=!(!n||!n.getContextAttributes().stencil);if(n){var r=n.getExtension("WEBGL_lose_context");r&&r.loseContext()}return n=null,i}catch(e){return!1}}()),lt)return new t(e);throw new Error('WebGL unsupported in this browser, use "pixi.js-legacy" for fallback canvas2d support.')},t.prototype.addSystem=function(e,t){t||(t=e.name);var n=new e(this);if(this[t])throw new Error('Whoops! The name "'+t+'" is already in use');for(var i in this[t]=n,this.runners)this.runners[i].add(n);return this},t.prototype.render=function(e,t){var n,i,r,s;if(t&&(t instanceof wn?(kt("6.0.0","Renderer#render arguments changed, use options instead."),n=t,i=arguments[2],r=arguments[3],s=arguments[4]):(n=t.renderTexture,i=t.clear,r=t.transform,s=t.skipUpdateTransform)),this.renderingToScreen=!n,this.runners.prerender.emit(),this.emit("prerender"),this.projection.transform=r,!this.context.isLost){if(n||(this._lastObjectRendered=e),!s){var o=e.enableTempParent();e.updateTransform(),e.disableTempParent(o)}this.renderTexture.bind(n),this.batch.currentRenderer.start(),(void 0!==i?i:this.clearBeforeRender)&&this.renderTexture.clear(),e.render(this),this.batch.currentRenderer.flush(),n&&n.baseTexture.update(),this.runners.postrender.emit(),this.projection.transform=null,this.emit("postrender")}},t.prototype.resize=function(t,n){e.prototype.resize.call(this,t,n),this.runners.resize.emit(t,n)},t.prototype.reset=function(){return this.runners.reset.emit(),this},t.prototype.clear=function(){this.renderTexture.bind(),this.renderTexture.clear()},t.prototype.destroy=function(t){for(var n in this.runners.destroy.emit(),this.runners)this.runners[n].destroy();e.prototype.destroy.call(this,t),this.gl=null},Object.defineProperty(t.prototype,"extract",{get:function(){return kt("6.0.0","Renderer#extract has been deprecated, please use Renderer#plugins.extract instead."),this.plugins.extract},enumerable:!1,configurable:!0}),t.registerPlugin=function(e,n){t.__plugins=t.__plugins||{},t.__plugins[e]=n}}(Wi),function(){this.texArray=null,this.blend=0,this.type=C.TRIANGLES,this.start=0,this.size=0,this.data=null}),Ji=function(){function e(){this.elements=[],this.ids=[],this.count=0}return e.prototype.clear=function(){for(var e=0;ethis.size&&this.flush(),this._vertexCount+=e.vertexData.length/2,this._indexCount+=e.indices.length,this._bufferedTextures[this._bufferSize]=e._texture.baseTexture,this._bufferedElements[this._bufferSize++]=e)},t.prototype.buildTexturesAndDrawCalls=function(){var e=this._bufferedTextures,n=this.MAX_TEXTURES,i=t._textureArrayPool,r=this.renderer.batch,s=this._tempBoundTextures,o=this.renderer.textureGC.count,a=++an._globalBatch,l=0,u=i[0],c=0;r.copyBoundTextures(s,n);for(var p=0;p=n&&(r.boundArray(u,s,a,n),this.buildDrawCalls(u,c,p),c=p,u=i[++l],++a),h._batchEnabled=a,h.touched=o,u.elements[u.count++]=h)}for(u.count>0&&(r.boundArray(u,s,a,n),this.buildDrawCalls(u,c,this._bufferSize),++l,++a),p=0;p0&&(t+="\nelse "),nthis.maxX||this.minY>this.maxY},e.prototype.clear=function(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},e.prototype.getRectangle=function(e){return this.minX>this.maxX||this.minY>this.maxY?Dt.EMPTY:((e=e||new Dt(0,0,1,1)).x=this.minX,e.y=this.minY,e.width=this.maxX-this.minX,e.height=this.maxY-this.minY,e)},e.prototype.addPoint=function(e){this.minX=Math.min(this.minX,e.x),this.maxX=Math.max(this.maxX,e.x),this.minY=Math.min(this.minY,e.y),this.maxY=Math.max(this.maxY,e.y)},e.prototype.addPointMatrix=function(e,t){var n=e.a,i=e.b,r=e.c,s=e.d,o=e.tx,a=e.ty,l=n*t.x+r*t.y+o,u=i*t.x+s*t.y+a;this.minX=Math.min(this.minX,l),this.maxX=Math.max(this.maxX,l),this.minY=Math.min(this.minY,u),this.maxY=Math.max(this.maxY,u)},e.prototype.addQuad=function(e){var t=this.minX,n=this.minY,i=this.maxX,r=this.maxY,s=e[0],o=e[1];t=si?s:i,r=o>r?o:r,t=(s=e[2])i?s:i,r=o>r?o:r,t=(s=e[4])i?s:i,r=o>r?o:r,t=(s=e[6])i?s:i,r=o>r?o:r,this.minX=t,this.minY=n,this.maxX=i,this.maxY=r},e.prototype.addFrame=function(e,t,n,i,r){this.addFrameMatrix(e.worldTransform,t,n,i,r)},e.prototype.addFrameMatrix=function(e,t,n,i,r){var s=e.a,o=e.b,a=e.c,l=e.d,u=e.tx,c=e.ty,p=this.minX,h=this.minY,d=this.maxX,f=this.maxY,_=s*t+a*n+u,m=o*t+l*n+c;p=_d?_:d,f=m>f?m:f,p=(_=s*i+a*n+u)d?_:d,f=m>f?m:f,p=(_=s*t+a*r+u)d?_:d,f=m>f?m:f,p=(_=s*i+a*r+u)d?_:d,f=m>f?m:f,this.minX=p,this.minY=h,this.maxX=d,this.maxY=f},e.prototype.addVertexData=function(e,t,n){for(var i=this.minX,r=this.minY,s=this.maxX,o=this.maxY,a=t;as?l:s,o=u>o?u:o}this.minX=i,this.minY=r,this.maxX=s,this.maxY=o},e.prototype.addVertices=function(e,t,n,i){this.addVerticesMatrix(e.worldTransform,t,n,i)},e.prototype.addVerticesMatrix=function(e,t,n,i,r,s){void 0===r&&(r=0),void 0===s&&(s=r);for(var o=e.a,a=e.b,l=e.c,u=e.d,c=e.tx,p=e.ty,h=this.minX,d=this.minY,f=this.maxX,_=this.maxY,m=n;mi?e.maxX:i,this.maxY=e.maxY>r?e.maxY:r},e.prototype.addBoundsMask=function(e,t){var n=e.minX>t.minX?e.minX:t.minX,i=e.minY>t.minY?e.minY:t.minY,r=e.maxXl?r:l,this.maxY=s>u?s:u}},e.prototype.addBoundsMatrix=function(e,t){this.addFrameMatrix(t,e.minX,e.minY,e.maxX,e.maxY)},e.prototype.addBoundsArea=function(e,t){var n=e.minX>t.x?e.minX:t.x,i=e.minY>t.y?e.minY:t.y,r=e.maxXl?r:l,this.maxY=s>u?s:u}},e.prototype.pad=function(e,t){void 0===e&&(e=0),void 0===t&&(t=e),this.isEmpty()||(this.minX-=e,this.maxX+=e,this.minY-=t,this.maxY+=t)},e.prototype.addFramePad=function(e,t,n,i,r,s){e-=r,t-=s,n+=r,i+=s,this.minX=this.minXn?this.maxX:n,this.minY=this.minYi?this.maxY:i},e}(),pr=function(e,t){return(pr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function hr(e,t){function n(){this.constructor=e}pr(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var dr=function(e){function t(){var t=e.call(this)||this;return t.tempDisplayObjectParent=null,t.transform=new Qt,t.alpha=1,t.visible=!0,t.renderable=!0,t.parent=null,t.worldAlpha=1,t._lastSortedIndex=0,t._zIndex=0,t.filterArea=null,t.filters=null,t._enabledFilters=null,t._bounds=new cr,t._localBounds=null,t._boundsID=0,t._boundsRect=null,t._localBoundsRect=null,t._mask=null,t._destroyed=!1,t.isSprite=!1,t.isMask=!1,t}return hr(t,e),t.mixin=function(e){for(var n=Object.keys(e),i=0;i1)for(var i=0;ithis.children.length)throw new Error(e+"addChildAt: The index "+t+" supplied is out of bounds "+this.children.length);return e.parent&&e.parent.removeChild(e),e.parent=this,this.sortDirty=!0,e.transform._parentID=-1,this.children.splice(t,0,e),this._boundsID++,this.onChildrenChange(t),e.emit("added",this),this.emit("childAdded",e,this,t),e},t.prototype.swapChildren=function(e,t){if(e!==t){var n=this.getChildIndex(e),i=this.getChildIndex(t);this.children[n]=t,this.children[i]=e,this.onChildrenChange(n=this.children.length)throw new Error("The index "+t+" supplied is out of bounds "+this.children.length);var n=this.getChildIndex(e);mt(this.children,n,1),this.children.splice(t,0,e),this.onChildrenChange(t)},t.prototype.getChildAt=function(e){if(e<0||e>=this.children.length)throw new Error("getChildAt: Index ("+e+") does not exist.");return this.children[e]},t.prototype.removeChild=function(){for(var e=arguments,t=[],n=0;n1)for(var i=0;i0&&r<=t){n=this.children.splice(i,r);for(var s=0;s1&&this.children.sort(_r),this.sortDirty=!1},t.prototype.updateTransform=function(){this.sortableChildren&&this.sortDirty&&this.sortChildren(),this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha;for(var e=0,t=this.children.length;ethis.maxSegments&&(n=this.maxSegments),n}},gr=function(){function e(){this.color=16777215,this.alpha=1,this.texture=En.WHITE,this.matrix=null,this.visible=!1,this.reset()}return e.prototype.clone=function(){var t=new e;return t.color=this.color,t.alpha=this.alpha,t.texture=this.texture,t.matrix=this.matrix,t.visible=this.visible,t},e.prototype.reset=function(){this.color=16777215,this.alpha=1,this.texture=En.WHITE,this.matrix=null,this.visible=!1},e.prototype.destroy=function(){this.texture=null,this.matrix=null},e}(),Sr=function(e,t){return(Sr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function kr(e,t){function n(){this.constructor=e}Sr(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var yr={build:function(e){e.points=e.shape.points.slice()},triangulate:function(e,t){var n=e.points,i=e.holes,r=t.points,s=t.indices;if(n.length>=6){for(var o=[],a=0;ap&&(p+=2*Math.PI);var h=c,d=p-c,f=Math.abs(d),_=Math.sqrt(l*l+u*u),m=1+(15*f*Math.sqrt(_)/Math.PI|0),b=d/m;if(h+=b,a){o.push(e,t),o.push(n,i);for(var g=1,S=h;gk?(V?(f.push(z,q),f.push(T+x*N,E+A*N),f.push(z,q),f.push(T+$*N,E+O*N)):(f.push(T-x*R,E-A*R),f.push(W,K),f.push(T-$*R,E-O*R),f.push(W,K)),m+=2):s.join===l.ROUND?V?(f.push(z,q),f.push(T+x*N,E+A*N),m+=xr(T,E,T+x*N,E+A*N,T+$*N,E+O*N,f,!0)+4,f.push(z,q),f.push(T+$*N,E+O*N)):(f.push(T-x*R,E-A*R),f.push(W,K),m+=xr(T,E,T-x*R,E-A*R,T-$*R,E-O*R,f,!1)+4,f.push(T-$*R,E-O*R),f.push(W,K)):(f.push(z,q),f.push(W,K)):(f.push(T-x*R,E-A*R),f.push(T+x*N,E+A*N),s.join===l.BEVEL||H/S>k||(s.join===l.ROUND?m+=V?xr(T,E,T+x*N,E+A*N,T+$*N,E+O*N,f,!0)+2:xr(T,E,T-x*R,E-A*R,T-$*R,E-O*R,f,!1)+2:(V?(f.push(W,K),f.push(W,K)):(f.push(z,q),f.push(z,q)),m+=2)),f.push(T-$*R,E-O*R),f.push(T+$*N,E+O*N),m+=2)}}y=i[2*(_-2)],v=i[2*(_-2)+1],T=i[2*(_-1)],x=-(v-(E=i[2*(_-1)+1])),A=y-T,x/=M=Math.sqrt(x*x+A*A),A/=M,x*=g,A*=g,f.push(T-x*R,E-A*R),f.push(T+x*N,E+A*N),c||(s.cap===u.ROUND?m+=xr(T-x*(R-N)*.5,E-A*(R-N)*.5,T-x*R,E-A*R,T+x*N,E+A*N,f,!1)+2:s.cap===u.SQUARE&&(m+=wr(T,E,x,A,R,N,!1,f)));var Q=t.indices,Z=br.epsilon*br.epsilon;for(L=b;Lc*a}},e.arc=function(e,t,n,i,r,s,o,a,l){for(var u=o-s,c=br._segmentsCount(Math.abs(u)*r,40*Math.ceil(Math.abs(u)/Rt)),p=u/(2*c),h=2*p,d=Math.cos(p),f=Math.sin(p),_=c-1,m=_%1/_,b=0;b<=_;++b){var g=p+s+h*(b+m*b),S=Math.cos(g),k=-Math.sin(g);l.push((d*S+f*k)*r+n,(d*-k+f*S)*r+i)}},e}(),Mr=function(){function e(){}return e.curveLength=function(e,t,n,i,r,s,o,a){for(var l=0,u=0,c=0,p=0,h=0,d=0,f=0,_=0,m=0,b=0,g=0,S=e,k=t,y=1;y<=10;++y)b=S-(_=(f=(d=(h=1-(u=y/10))*h)*h)*e+3*d*u*n+3*h*(c=u*u)*r+(p=c*u)*o),g=k-(m=f*t+3*d*u*i+3*h*c*s+p*a),S=_,k=m,l+=Math.sqrt(b*b+g*g);return l},e.curveTo=function(t,n,i,r,s,o,a){var l=a[a.length-2],u=a[a.length-1];a.length-=2;var c=br._segmentsCount(e.curveLength(l,u,t,n,i,r,s,o)),p=0,h=0,d=0,f=0,_=0;a.push(l,u);for(var m=1,b=0;m<=c;++m)d=(h=(p=1-(b=m/c))*p)*p,_=(f=b*b)*b,a.push(d*l+3*h*b*t+3*p*f*i+_*s,d*u+3*h*b*n+3*p*f*r+_*o)},e}(),Cr=function(){function e(){}return e.curveLength=function(e,t,n,i,r,s){var o=e-2*n+r,a=t-2*i+s,l=2*n-2*e,u=2*i-2*t,c=4*(o*o+a*a),p=4*(o*l+a*u),h=l*l+u*u,d=2*Math.sqrt(c+p+h),f=Math.sqrt(c),_=2*c*f,m=2*Math.sqrt(h),b=p/f;return(_*d+f*p*(d-m)+(4*h*c-p*p)*Math.log((2*f+b+d)/(b+m)))/(4*_)},e.curveTo=function(t,n,i,r,s){for(var o=s[s.length-2],a=s[s.length-1],l=br._segmentsCount(e.curveLength(o,a,t,n,i,r)),u=0,c=0,p=1;p<=l;++p){var h=p/l;u=o+(t-o)*h,c=a+(n-a)*h,s.push(u+(t+(i-t)*h-u)*h,c+(n+(r-n)*h-c)*h)}},e}(),Rr=function(){function e(){this.reset()}return e.prototype.begin=function(e,t,n){this.reset(),this.style=e,this.start=t,this.attribStart=n},e.prototype.end=function(e,t){this.attribSize=t-this.attribStart,this.size=e-this.start},e.prototype.reset=function(){this.style=null,this.size=0,this.start=0,this.attribStart=0,this.attribSize=0},e}(),Nr=(($r={})[Ot.POLY]=yr,$r[Ot.CIRC]=vr,$r[Ot.ELIP]=vr,$r[Ot.RECT]={build:function(e){var t=e.shape,n=t.x,i=t.y,r=t.width,s=t.height,o=e.points;o.length=0,o.push(n,i,n+r,i,n+r,i+s,n,i+s)},triangulate:function(e,t){var n=e.points,i=t.points,r=i.length/2;i.push(n[0],n[1],n[2],n[3],n[6],n[7],n[4],n[5]),t.indices.push(r,r+1,r+2,r+1,r+2,r+3)}},$r[Ot.RREC]=Ir,$r),Lr=[],Dr=[],Pr=function(){function e(e,t,n,i){void 0===t&&(t=null),void 0===n&&(n=null),void 0===i&&(i=null),this.shape=e,this.lineStyle=n,this.fillStyle=t,this.matrix=i,this.type=e.type,this.points=[],this.holes=[]}return e.prototype.clone=function(){return new e(this.shape,this.fillStyle,this.lineStyle,this.matrix)},e.prototype.destroy=function(){this.shape=null,this.holes.length=0,this.holes=null,this.points.length=0,this.points=null,this.lineStyle=null,this.fillStyle=null},e}(),Fr=new Vt,Br=new cr,jr=function(e){function t(){var t=e.call(this)||this;return t.uvsFloat32=null,t.indicesUint16=null,t.points=[],t.colors=[],t.uvs=[],t.indices=[],t.textureIds=[],t.graphicsData=[],t.dirty=0,t.batchDirty=-1,t.cacheDirty=-1,t.clearDirty=0,t.drawCalls=[],t.batches=[],t.shapeIndex=0,t._bounds=new cr,t.boundsDirty=-1,t.boundsPadding=0,t.batchable=!1,t.indicesUint16=null,t.uvsFloat32=null,t.closePointEps=1e-4,t}return kr(t,e),Object.defineProperty(t.prototype,"bounds",{get:function(){return this.boundsDirty!==this.dirty&&(this.boundsDirty=this.dirty,this.calculateBounds()),this._bounds},enumerable:!1,configurable:!0}),t.prototype.invalidate=function(){this.boundsDirty=-1,this.dirty++,this.batchDirty++,this.shapeIndex=0,this.points.length=0,this.colors.length=0,this.uvs.length=0,this.indices.length=0,this.textureIds.length=0;for(var e=0;e0&&(this.invalidate(),this.clearDirty++,this.graphicsData.length=0),this},t.prototype.drawShape=function(e,t,n,i){void 0===t&&(t=null),void 0===n&&(n=null),void 0===i&&(i=null);var r=new Pr(e,t,n,i);return this.graphicsData.push(r),this.dirty++,this},t.prototype.drawHole=function(e,t){if(void 0===t&&(t=null),!this.graphicsData.length)return null;var n=new Pr(e,null,null,t),i=this.graphicsData[this.graphicsData.length-1];return n.lineStyle=i.lineStyle,i.holes.push(n),this.dirty++,this},t.prototype.destroy=function(){e.prototype.destroy.call(this);for(var t=0;t0&&(r=(i=this.batches[this.batches.length-1]).style);for(var s=this.shapeIndex;s65535&&e;this.indicesUint16=b?new Uint32Array(this.indices):new Uint16Array(this.indices)}this.batchable=this.isBatchable(),this.batchable?this.packBatches():this.buildDrawCalls()}else this.batchable=!0}}else this.batchable=!0},t.prototype._compareStyles=function(e,t){return!(!e||!t)&&e.texture.baseTexture===t.texture.baseTexture&&e.color+e.alpha===t.color+t.alpha&&!!e.native==!!t.native},t.prototype.validateBatching=function(){if(this.dirty===this.cacheDirty||!this.graphicsData.length)return!1;for(var e=0,t=this.graphicsData.length;e131070)return!1;for(var e=this.batches,n=0;n0&&((r=Dr.pop())||((r=new Ki).texArray=new Ji),this.drawCalls.push(r)),r.start=c,r.size=0,r.texArray.count=0,r.type=u),d.touched=1,d._batchEnabled=e,d._batchLocation=s,d.wrapMode=10497,r.texArray.elements[r.texArray.count++]=d,s++)),r.size+=p.size,c+=p.size,a=d._batchLocation,this.addColors(n,h.color,h.alpha,p.attribSize),this.addTextureIds(i,a,p.attribSize)}an._globalBatch=e,this.packAttributes()},t.prototype.packAttributes=function(){for(var e=this.points,t=this.uvs,n=this.colors,i=this.textureIds,r=new ArrayBuffer(3*e.length*4),s=new Float32Array(r),o=new Uint32Array(r),a=0,l=0;l>16)+(65280&t)+((255&t)<<16),n);i-- >0;)e.push(r)},t.prototype.addTextureIds=function(e,t,n){for(;n-- >0;)e.push(t)},t.prototype.addUvs=function(e,t,n,i,r,s){void 0===s&&(s=null);for(var o=0,a=t.length,l=n.frame;o0&&e.alpha>0;return t?(e.matrix&&(e.matrix=e.matrix.clone(),e.matrix.invert()),Object.assign(this._lineStyle,{visible:t},e)):this._lineStyle.reset(),this},t.prototype.startPoly=function(){if(this.currentPath){var e=this.currentPath.points,t=this.currentPath.points.length;t>2&&(this.drawShape(this.currentPath),this.currentPath=new Bt,this.currentPath.closeStroke=!1,this.currentPath.points.push(e[t-2],e[t-1]))}else this.currentPath=new Bt,this.currentPath.closeStroke=!1},t.prototype.finishPoly=function(){this.currentPath&&(this.currentPath.points.length>2?(this.drawShape(this.currentPath),this.currentPath=null):this.currentPath.points.length=0)},t.prototype.moveTo=function(e,t){return this.startPoly(),this.currentPath.points[0]=e,this.currentPath.points[1]=t,this},t.prototype.lineTo=function(e,t){this.currentPath||this.moveTo(0,0);var n=this.currentPath.points,i=n[n.length-2],r=n[n.length-1];return i===e&&r===t||n.push(e,t),this},t.prototype._initCurve=function(e,t){void 0===e&&(e=0),void 0===t&&(t=0),this.currentPath?0===this.currentPath.points.length&&(this.currentPath.points=[e,t]):this.moveTo(e,t)},t.prototype.quadraticCurveTo=function(e,t,n,i){this._initCurve();var r=this.currentPath.points;return 0===r.length&&this.moveTo(0,0),Cr.curveTo(e,t,n,i,r),this},t.prototype.bezierCurveTo=function(e,t,n,i,r,s){return this._initCurve(),Mr.curveTo(e,t,n,i,r,s,this.currentPath.points),this},t.prototype.arcTo=function(e,t,n,i,r){this._initCurve(e,t);var s=this.currentPath.points,o=Or.curveTo(e,t,n,i,r,s);if(o){var a=o.cx,l=o.cy,u=o.radius,c=o.startAngle,p=o.endAngle,h=o.anticlockwise;this.arc(a,l,u,c,p,h)}return this},t.prototype.arc=function(e,t,n,i,r,s){if(void 0===s&&(s=!1),i===r)return this;if(!s&&r<=i?r+=Rt:s&&i<=r&&(i+=Rt),0==r-i)return this;var o=e+Math.cos(i)*n,a=t+Math.sin(i)*n,l=this._geometry.closePointEps,u=this.currentPath?this.currentPath.points:null;if(u){var c=Math.abs(u[u.length-2]-o),p=Math.abs(u[u.length-1]-a);c0;return t?(e.matrix&&(e.matrix=e.matrix.clone(),e.matrix.invert()),Object.assign(this._fillStyle,{visible:t},e)):this._fillStyle.reset(),this},t.prototype.endFill=function(){return this.finishPoly(),this._fillStyle.reset(),this},t.prototype.drawRect=function(e,t,n,i){return this.drawShape(new Dt(e,t,n,i))},t.prototype.drawRoundedRect=function(e,t,n,i,r){return this.drawShape(new jt(e,t,n,i,r))},t.prototype.drawCircle=function(e,t,n){return this.drawShape(new Pt(e,t,n))},t.prototype.drawEllipse=function(e,t,n,i){return this.drawShape(new Ft(e,t,n,i))},t.prototype.drawPolygon=function(){for(var e,t=arguments,n=[],i=0;i>16&255)/255*r,s.tint[1]=(i>>8&255)/255*r,s.tint[2]=(255&i)/255*r,s.tint[3]=r,e.shader.bind(t),e.geometry.bind(n,t),e.state.set(this.state);for(var a=0,l=o.length;a>16)+(65280&r)+((255&r)<<16)}}},t.prototype.calculateVertices=function(){var e=this.transform._worldID;if(this._transformID!==e){this._transformID=e;for(var t=this.transform.worldTransform,n=t.a,i=t.b,r=t.c,s=t.d,o=t.tx,a=t.ty,l=this._geometry.points,u=this.vertexData,c=0,p=0;p{Sk.builtinFiles={files:{"src/builtin/sys.js":'var $builtinmodule=function(){var b,a=Math.pow,c={},d=[],e=Sk.getSysArgv();for(b=0;b= 0:\n if self.pos + length < newpos:\n newpos = self.pos + length\n r = self.buf[self.pos:newpos]\n self.pos = newpos\n return r\n\n def readlines(self, sizehint = 0):\n """Read until EOF using readline() and return a list containing the\n lines thus read.\n\n If the optional sizehint argument is present, instead of reading up\n to EOF, whole lines totalling approximately sizehint bytes (or more\n to accommodate a final whole line).\n """\n total = 0\n lines = []\n line = self.readline()\n while line:\n lines.append(line)\n total += len(line)\n if 0 < sizehint <= total:\n break\n line = self.readline()\n return lines\n\n def truncate(self, size=None):\n """Truncate the file\'s size.\n\n If the optional size argument is present, the file is truncated to\n (at most) that size. The size defaults to the current position.\n The current file position is not changed unless the position\n is beyond the new file size.\n\n If the specified size exceeds the file\'s current size, the\n file remains unchanged.\n """\n _complain_ifclosed(self.closed)\n if size is None:\n size = self.pos\n elif size < 0:\n raise IOError(22, "Negative size not allowed")\n elif size < self.pos:\n self.pos = size\n self.buf = self.getvalue()[:size]\n self.len = size\n\n def write(self, s):\n """Write a string to the file.\n\n There is no return value.\n """\n _complain_ifclosed(self.closed)\n if not s: return\n # Force s to be a string or unicode\n if not isinstance(s, str):\n s = str(s)\n spos = self.pos\n slen = self.len\n if spos == slen:\n self.buflist.append(s)\n self.len = self.pos = spos + len(s)\n return\n if spos > slen:\n self.buflist.append(\'\\0\'*(spos - slen))\n slen = spos\n newpos = spos + len(s)\n if spos < slen:\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = [self.buf[:spos], s, self.buf[newpos:]]\n self.buf = \'\'\n if newpos > slen:\n slen = newpos\n else:\n self.buflist.append(s)\n slen = newpos\n self.len = slen\n self.pos = newpos\n\n def writelines(self, iterable):\n """Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings. There\n is no return value.\n\n (The name is intended to match readlines(); writelines() does not add\n line separators.)\n """\n write = self.write\n for line in iterable:\n write(line)\n\n def flush(self):\n """Flush the internal buffer\n """\n _complain_ifclosed(self.closed)\n\n def getvalue(self):\n """\n Retrieve the entire contents of the "file" at any time before\n the StringIO object\'s close() method is called.\n\n The StringIO object can accept either Unicode or 8-bit strings,\n but mixing the two may take some care. If both are used, 8-bit\n strings that cannot be interpreted as 7-bit ASCII (that use the\n 8th bit) will cause a UnicodeError to be raised when getvalue()\n is called.\n """\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = []\n return self.buf\n',"src/lib/UserDict.py":'raise NotImplementedError("UserDict is not yet implemented in Skulpt")\n',"src/lib/UserList.py":'raise NotImplementedError("UserList is not yet implemented in Skulpt")\n',"src/lib/UserString.py":'raise NotImplementedError("UserString is not yet implemented in Skulpt")\n',"src/lib/_LWPCookieJar.py":'raise NotImplementedError("_LWPCookieJar is not yet implemented in Skulpt")\n',"src/lib/_MozillaCookieJar.py":'raise NotImplementedError("_MozillaCookieJar is not yet implemented in Skulpt")\n',"src/lib/__future__.py":'raise NotImplementedError("__future__ is not yet implemented in Skulpt")\n',"src/lib/__phello__.foo.py":'raise NotImplementedError("__phello__.foo is not yet implemented in Skulpt")\n',"src/lib/_abcoll.py":'raise NotImplementedError("_abcoll is not yet implemented in Skulpt")\n',"src/lib/_strptime.py":'raise NotImplementedError("_strptime is not yet implemented in Skulpt")\n',"src/lib/_threading_local.py":'raise NotImplementedError("_threading_local is not yet implemented in Skulpt")\n',"src/lib/abc.py":'raise NotImplementedError("abc is not yet implemented in Skulpt")\n',"src/lib/aifc.py":'raise NotImplementedError("aifc is not yet implemented in Skulpt")\n',"src/lib/antigravity.py":'import webbrowser\n\nwebbrowser.open("https://xkcd.com/353/")\n',"src/lib/anydbm.py":'raise NotImplementedError("anydbm is not yet implemented in Skulpt")\n',"src/lib/array.js":'$builtinmodule=function(){var a={},b=["c","b","B","u","h","H","i","I","l","L","f","d"];return a.__name__=new Sk.builtin.str("array"),a.array=Sk.misceval.buildClass(a,function(a,c){c.__init__=new Sk.builtin.func(function(a,c,d){if(Sk.builtin.pyCheckArgsLen("__init__",arguments.length,2,3),-1==b.indexOf(Sk.ffi.remapToJs(c)))throw new Sk.builtin.ValueError("bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");if(d&&!Sk.builtin.checkIterable(d))throw new Sk.builtin.TypeError("iteration over non-sequence");if(a.$d.mp$ass_subscript(new Sk.builtin.str("typecode"),c),a.$d.mp$ass_subscript(new Sk.builtin.str("__module__"),new Sk.builtin.str("array")),a.typecode=c,void 0===d)a.internalIterable=new Sk.builtin.list;else if(d instanceof Sk.builtin.list)a.internalIterable=d;else for(a.internalIterable=new Sk.builtin.list,iter=Sk.abstr.iter(d),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])}),c.__repr__=new Sk.builtin.func(function(a){var b=Sk.ffi.remapToJs(a.typecode),c="";return Sk.ffi.remapToJs(a.internalIterable).length&&("c"==Sk.ffi.remapToJs(a.typecode)?c=", \'"+Sk.ffi.remapToJs(a.internalIterable).join("")+"\'":c=", "+Sk.ffi.remapToJs(Sk.misceval.callsimArray(a.internalIterable.__repr__,[a.internalIterable]))),new Sk.builtin.str("array(\'"+b+"\'"+c+")")}),c.__str__=c.__repr__,c.__getattribute__=new Sk.builtin.func(function(a,b){return a.tp$getattr(b)}),c.append=new Sk.builtin.func(function(a,b){return Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,b]),Sk.builtin.none.none$}),c.extend=new Sk.builtin.func(function(a,b){if(Sk.builtin.pyCheckArgsLen("__init__",arguments.length,2,2),!Sk.builtin.checkIterable(b))throw new Sk.builtin.TypeError("iteration over non-sequence");for(iter=Sk.abstr.iter(b),item=iter.tp$iternext();void 0!==item;item=iter.tp$iternext())Sk.misceval.callsimArray(a.internalIterable.append,[a.internalIterable,item])})},"array",[]),a};',"src/lib/ast.py":'raise NotImplementedError("ast is not yet implemented in Skulpt")\n',"src/lib/asynchat.py":'raise NotImplementedError("asynchat is not yet implemented in Skulpt")\n',"src/lib/asyncore.py":'raise NotImplementedError("asyncore is not yet implemented in Skulpt")\n',"src/lib/atexit.py":'raise NotImplementedError("atexit is not yet implemented in Skulpt")\n',"src/lib/audiodev.py":'raise NotImplementedError("audiodev is not yet implemented in Skulpt")\n',"src/lib/base64.py":'raise NotImplementedError("base64 is not yet implemented in Skulpt")\n',"src/lib/bdb.py":'raise NotImplementedError("bdb is not yet implemented in Skulpt")\n',"src/lib/binhex.py":'raise NotImplementedError("binhex is not yet implemented in Skulpt")\n',"src/lib/bisect.py":'"""Bisection algorithms."""\n\ndef insort_right(a, x, lo=0, hi=None):\n """Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the right of the rightmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n a.insert(lo, x)\n\ndef bisect_right(a, x, lo=0, hi=None):\n """Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e <= x, and all e in\n a[i:] have e > x. So if x already appears in the list, a.insert(x) will\n insert just after the rightmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n return lo\n\ndef insort_left(a, x, lo=0, hi=None):\n """Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the left of the leftmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n a.insert(lo, x)\n\n\ndef bisect_left(a, x, lo=0, hi=None):\n """Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e < x, and all e in\n a[i:] have e >= x. So if x already appears in the list, a.insert(x) will\n insert just before the leftmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n return lo\n\n# Overwrite above definitions with a fast C implementation\ntry:\n from _bisect import *\nexcept ImportError:\n pass\n\n# Create aliases\nbisect = bisect_right\ninsort = insort_right\n',"src/lib/bsddb/__init__.py":'raise NotImplementedError("bsddb is not yet implemented in Skulpt")\n',"src/lib/cProfile.py":'raise NotImplementedError("cProfile is not yet implemented in Skulpt")\n',"src/lib/calendar.py":'raise NotImplementedError("calendar is not yet implemented in Skulpt")\n',"src/lib/cgi.py":'raise NotImplementedError("cgi is not yet implemented in Skulpt")\n',"src/lib/cgitb.py":'raise NotImplementedError("cgitb is not yet implemented in Skulpt")\n',"src/lib/chunk.py":'raise NotImplementedError("chunk is not yet implemented in Skulpt")\n',"src/lib/cmd.py":'raise NotImplementedError("cmd is not yet implemented in Skulpt")\n',"src/lib/code.py":'raise NotImplementedError("code is not yet implemented in Skulpt")\n',"src/lib/codecs.py":'raise NotImplementedError("codecs is not yet implemented in Skulpt")\n',"src/lib/codeop.py":'raise NotImplementedError("codeop is not yet implemented in Skulpt")\n',"src/lib/collections.js":'function $builtinmodule(){const a={};return Sk.misceval.chain(Sk.importModule("keyword",!1,!0),b=>(a._iskeyword=b.$d.iskeyword,Sk.importModule("itertools",!1,!0)),b=>(a._chain=b.$d.chain,a._starmap=b.$d.starmap,a._repeat=b.$d.repeat,Sk.importModule("operator",!1,!0)),b=>{a._itemgetter=b.$d.itemgetter},()=>collections_mod(a))}function collections_mod(a){function counterNumberSlot(b){return function(c){if(void 0!==c&&!(c instanceof a.Counter))return Sk.builtin.NotImplemented.NotImplemented$;const d=new a.Counter;return b.call(this,d,c),d}}function counterInplaceSlot(a,b){return function(c){if(!(c instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError("Counter "+a+"= "+Sk.abstr.typeName(c)+" is not supported");return b.call(this,c),this.keep$positive()}}function namedtuple(b,c,d,l,m){function _make(a,b){return a.prototype.tp$new(Sk.misceval.arrayFromIterable(b))}function _asdict(a){const b=[];for(let c=0;c"\'"+a.$jsstr()+"\'")+"]")}return f}if(b=b.tp$str(),Sk.misceval.isTrue(Sk.misceval.callsimArray(a._iskeyword,[b])))throw new Sk.builtin.ValueError("Type names and field names cannot be a keyword: \'"+Sk.misceval.objectRepr(b)+"\'");const n=b.$jsstr();if(e.test(n)||!g.test(n)||!n)throw new Sk.builtin.ValueError("Type names and field names must be valid identifiers: \'"+n+"\'");let o,p;if(Sk.builtin.checkString(c))o=c.$jsstr().replace(h," ").split(j),1==o.length&&""===o[0]&&(o=[]),p=o.map(a=>new Sk.builtin.str(a));else{o=[],p=[];for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext())b=b.tp$str(),p.push(b),o.push(b.$jsstr())}let q=new Set;if(Sk.misceval.isTrue(d))for(i=0;io.length)throw new Sk.builtin.TypeError("Got more default values than field names");for(let a=0,b=p.length-t.length;bo[b]+"="+Sk.misceval.objectRepr(a));return new Sk.builtin.str(Sk.abstr.typeName(this)+"("+a.join(", ")+")")}},proto:Object.assign({__module__:Sk.builtin.checkNone(m)?Sk.globals.__name__:m,__slots__:new Sk.builtin.tuple,_fields:r,_field_defaults:u,_make:new Sk.builtin.classmethod(new Sk.builtin.func(_make)),_asdict:new Sk.builtin.func(_asdict),_replace:new Sk.builtin.func(_replace)},v)})}a.__all__=new Sk.builtin.list(["deque","defaultdict","namedtuple","Counter","OrderedDict"].map(a=>new Sk.builtin.str(a))),a.defaultdict=Sk.abstr.buildNativeClass("collections.defaultdict",{constructor:function defaultdict(a,b){this.default_factory=a,Sk.builtin.dict.call(this,b)},base:Sk.builtin.dict,methods:{copy:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__copy__:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__missing__:{$meth(a){if(Sk.builtin.checkNone(this.default_factory))throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(a));else{const b=Sk.misceval.callsimArray(this.default_factory,[]);return this.mp$ass_subscript(a,b),b}},$flags:{OneArg:!0}}},getsets:{default_factory:{$get(){return this.default_factory},$set(a){a=a||Sk.builtin.none.none$,this.default_factory=a}}},slots:{tp$doc:"defaultdict(default_factory[, ...]) --\x3e dict with default factory\\n\\nThe default factory is called without arguments to produce\\na new value when a key is not present, in __getitem__ only.\\nA defaultdict compares equal to a dict with the same items.\\nAll remaining arguments are treated the same as if they were\\npassed to the dict constructor, including keyword arguments.\\n",tp$init(a,b){const c=a.shift();if(void 0===c)this.default_factory=Sk.builtin.none.none$;else if(!Sk.builtin.checkCallable(c)&&!Sk.builtin.checkNone(c))throw new Sk.builtin.TypeError("first argument must be callable");else this.default_factory=c;return Sk.builtin.dict.prototype.tp$init.call(this,a,b)},$r(){const a=Sk.misceval.objectRepr(this.default_factory),b=Sk.builtin.dict.prototype.$r.call(this).v;return new Sk.builtin.str("defaultdict("+a+", "+b+")")}},proto:{$copy(){const b=[];return Sk.misceval.iterFor(Sk.abstr.iter(this),a=>{b.push(a),b.push(this.mp$subscript(a))}),new a.defaultdict(this.default_factory,b)}}}),a.Counter=Sk.abstr.buildNativeClass("Counter",{constructor:function Counter(){this.$d=new Sk.builtin.dict,Sk.builtin.dict.apply(this)},base:Sk.builtin.dict,methods:{elements:{$flags:{NoArgs:!0},$meth(){const b=a._chain.tp$getattr(new Sk.builtin.str("from_iterable")),c=a._starmap,d=a._repeat,e=Sk.misceval.callsimArray;return e(b,[e(c,[d,e(this.tp$getattr(this.str$items))])])}},most_common:{$flags:{NamedArgs:["n"],Defaults:[Sk.builtin.none.none$]},$meth(a){length=this.sq$length(),Sk.builtin.checkNone(a)?a=length:(a=Sk.misceval.asIndexOrThrow(a),a=a>length?length:0>a?0:a);const b=this.$items().sort((c,a)=>Sk.misceval.richCompareBool(c[1],a[1],"Lt")?1:Sk.misceval.richCompareBool(c[1],a[1],"Gt")?-1:0);return new Sk.builtin.list(b.slice(0,a).map(a=>new Sk.builtin.tuple(a)))}},update:{$flags:{FastCall:!0},$meth(a,b){return Sk.abstr.checkArgsLen("update",a,0,1),this.counter$update(a,b)}},subtract:{$flags:{FastCall:!0},$meth(a,b){Sk.abstr.checkArgsLen("subtract",a,0,1);const c=a[0];if(void 0!==c)if(c instanceof Sk.builtin.dict)for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),"Sub"))}else for(iter=Sk.abstr.iter(c),k=iter.tp$iternext();void 0!==k;k=iter.tp$iternext()){const a=this.mp$subscript(k);this.mp$ass_subscript(k,Sk.abstr.numberBinOp(a,this.$one,"Sub"))}b=b||[];for(let c=0;c>> c = Counter(\'abcdeabcdabcaba\') # count elements from a string\\n\\n >>> c.most_common(3) # three most common elements\\n [(\'a\', 5), (\'b\', 4), (\'c\', 3)]\\n >>> sorted(c) # list all unique elements\\n [\'a\', \'b\', \'c\', \'d\', \'e\']\\n >>> \'\'.join(sorted(c.elements())) # list elements with repetitions\\n \'aaaaabbbbcccdde\'\\n >>> sum(c.values()) # total of all counts\\n 15\\n\\n >>> c[\'a\'] # count of letter \'a\'\\n 5\\n >>> for elem in \'shazam\': # update counts from an iterable\\n ... c[elem] += 1 # by adding 1 to each element\'s count\\n >>> c[\'a\'] # now there are seven \'a\'\\n 7\\n >>> del c[\'b\'] # remove all \'b\'\\n >>> c[\'b\'] # now there are zero \'b\'\\n 0\\n\\n >>> d = Counter(\'simsalabim\') # make another counter\\n >>> c.update(d) # add in the second counter\\n >>> c[\'a\'] # now there are nine \'a\'\\n 9\\n\\n >>> c.clear() # empty the counter\\n >>> c\\n Counter()\\n\\n Note: If a count is set to zero or reduced to zero, it will remain\\n in the counter until the entry is deleted or the counter is cleared:\\n\\n >>> c = Counter(\'aaabbc\')\\n >>> c[\'b\'] -= 2 # reduce the count of \'b\' by two\\n >>> c.most_common() # \'b\' is still in, but its count is zero\\n [(\'a\', 3), (\'c\', 1), (\'b\', 0)]\\n\\n",tp$init(a,b){return Sk.abstr.checkArgsLen(this.tpjs_name,a,0,1),this.counter$update(a,b)},$r(){const a=0{Sk.misceval.richCompareBool(c,this.$zero,"Gt")&&a.mp$ass_subscript(b,c)})}),nb$negative:counterNumberSlot(function(a){this.$items().forEach(([b,c])=>{Sk.misceval.richCompareBool(c,this.$zero,"Lt")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,"Sub"))})}),nb$subtract:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),"Sub");Sk.misceval.richCompareBool(e,this.$zero,"Gt")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,"Lt")&&a.mp$ass_subscript(b,Sk.abstr.numberBinOp(this.$zero,c,"Sub"))})}),nb$add:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=Sk.abstr.numberBinOp(d,b.mp$subscript(c),"Add");Sk.misceval.richCompareBool(e,this.$zero,"Gt")&&a.mp$ass_subscript(c,e)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,"Gt")&&a.mp$ass_subscript(b,c)})}),nb$inplace_add:counterInplaceSlot("+",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,"Add");this.mp$ass_subscript(a,c)})}),nb$inplace_subtract:counterInplaceSlot("-",function(a){a.$items().forEach(([a,b])=>{const c=Sk.abstr.numberInplaceBinOp(this.mp$subscript(a),b,"Sub");this.mp$ass_subscript(a,c)})}),nb$or:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,"Lt")?e:d;Sk.misceval.richCompareBool(f,this.$zero,"Gt")&&a.mp$ass_subscript(c,f)}),b.$items().forEach(([b,c])=>{void 0===this.mp$lookup(b)&&Sk.misceval.richCompareBool(c,this.$zero,"Gt")&&a.mp$ass_subscript(b,c)})}),nb$and:counterNumberSlot(function(a,b){this.$items().forEach(([c,d])=>{const e=b.mp$subscript(c),f=Sk.misceval.richCompareBool(d,e,"Lt")?d:e;Sk.misceval.richCompareBool(f,this.$zero,"Gt")&&a.mp$ass_subscript(c,f)})}),nb$inplace_and:counterInplaceSlot("&",function(a){this.$items().forEach(([b,c])=>{const d=a.mp$subscript(b);Sk.misceval.richCompareBool(d,c,"Lt")&&this.mp$ass_subscript(b,d)})}),nb$inplace_or:counterInplaceSlot("|",function(a){a.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.mp$subscript(a),"Gt")&&this.mp$ass_subscript(a,b)})}),nb$reflected_and:null,nb$reflected_or:null,nb$reflected_add:null,nb$reflected_subtract:null},proto:{keep$positive(){return this.$items().forEach(([a,b])=>{Sk.misceval.richCompareBool(b,this.$zero,"LtE")&&this.mp$ass_subscript(a)}),this},$zero:new Sk.builtin.int_(0),$one:new Sk.builtin.int_(1),str$items:new Sk.builtin.str("items"),counter$update(a,b){const c=a[0];if(void 0!==c)if(!Sk.builtin.checkMapping(c))for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,this.$one,"Add"))}else if(!this.sq$length())this.update$common(a,void 0,"update");else for(let a=Sk.abstr.iter(c),b=a.tp$iternext();void 0!==b;b=a.tp$iternext()){const a=this.mp$subscript(b);this.mp$ass_subscript(b,Sk.abstr.numberBinOp(a,c.mp$subscript(b),"Add"))}if(b&&b.length)if(!this.sq$length())this.update$common([],b,"update");else for(let a=0;amaxlen)throw new Sk.builtin.ValueError("maxlen must be non-negative");else this.maxlen=maxlen;this.$clear(),void 0!==iterable&&this.$extend(iterable)},tp$getattr:Sk.generic.getAttr,tp$richcompare(b,c){var d=Math.max;if(this===b&&Sk.misceval.opAllowsEquality(c))return!0;if(!(b instanceof a.deque))return Sk.builtin.NotImplemented.NotImplemented$;const e=b,f=this.v;b=b.v;const g=this.tail-this.head&this.mask,h=e.tail-e.head&e.mask;let j,l=d(g,h);if(g===h)for(l=0;l=g||l>=h)switch(c){case"Lt":return gh;case"GtE":return g>=h;}return"Eq"!==c&&("NotEq"===c||Sk.misceval.richCompareBool(f[this.head+l&this.mask],b[e.head+l&e.mask],c))},tp$iter(){return new c(this)},$r(){const a=[],b=this.tail-this.head&this.mask;if(this.$entered_repr)return new Sk.builtin.str("[...]");this.$entered_repr=!0;for(let c=0;c=a&&c.$clear();for(let e=1;e=b||a<-b)throw new Sk.builtin.IndexError("deque index out of range");const c=(0<=a?this.head:this.tail)+a&this.mask;return this.v[c]},mp$ass_subscript(a,b){a=Sk.misceval.asIndexOrThrow(a);const c=this.tail-this.head&this.mask;if(a>=c||a<-c)throw new Sk.builtin.IndexError("deque index out of range");void 0===b?this.del$item(a):this.set$item(a,b)},nb$inplace_add(a){for(this.maxlen=void 0,it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i);return this},nb$inplace_multiply(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError,"can\'t multiply sequence by non-int of type \'{tp$name}\'"),0>=a&&this.$clear();const b=this.$copy(),c=this.tail-this.head&this.mask;for(let d=1;d integer -- return number of occurrences of value"},extend:{$meth(a){return this.$extend(a),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Extend the right side of the deque with elements from the iterable"},extendleft:{$meth(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$pushLeft(i);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Extend the left side of the deque with elements from the iterable"},index:{$meth(a,b,c){const d=this.$index(a,b,c);if(void 0!==d)return new Sk.builtin.int_(d);throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+" is not in deque")},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"D.index(value, [start, [stop]]) -> integer -- return first index of value.\\nRaises ValueError if the value is not present."},insert:{$meth(a,b){a=Sk.misceval.asIndexOrThrow(a,"integer argument expected, got {tp$name}");const c=this.tail-this.head&this.mask;if(void 0!==this.maxlen&&c>=this.maxlen)throw new Sk.builtin.IndexError("deque already at its maximum size");a>c&&(a=c),a<=-c&&(a=0);const d=(0<=a?this.head:this.tail)+a&this.mask;let e=this.tail;for(this.tail=this.tail+1&this.mask;e!==d;){const a=e-1&this.mask;this.v[e]=this.v[a],e=a}return this.v[d]=b,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1),Sk.builtin.none.none$},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:"D.insert(index, object) -- insert object before index"},pop:{$meth(){return this.$pop()},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return the rightmost element."},popleft:{$meth(){return this.$popLeft()},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return the leftmost element."},remove:{$meth(a){const b=this.$index(a);if(void 0===b)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(a)+" is not in deque");const c=this.head+b&this.mask;for(let b=c;b!==this.tail;){const a=b+1&this.mask;this.v[b]=this.v[a],b=a}this.tail=this.tail-1&this.mask;var d=this.tail-this.head&this.mask;d>>1&&this.$resize(d,this.v.length>>>1)},$flags:{OneArg:!0},$textsig:null,$doc:"D.remove(value) -- remove first occurrence of value."},__reversed__:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.__reversed__() -- return a reverse iterator over the deque"},reverse:{$meth(){const c=this.head,d=this.tail,e=this.mask,f=this.tail-this.head&this.mask;for(let g=0;g<~~(f/2);g++){const f=d-g-1&e,a=c+g&e,b=this.v[f];this.v[f]=this.v[a],this.v[a]=b}return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"D.reverse() -- reverse *IN PLACE*"},rotate:{$meth(a){a=void 0===a?1:Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);const c=this.head,d=this.tail;if(0===a||c===d)return this;if(this.head=c-a&this.mask,this.tail=d-a&this.mask,0a;e--){const f=d-e&this.mask,a=c-e&this.mask;this.v[f]=this.v[a],this.v[a]=void 0}return Sk.builtin.none.none$},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left."}},getsets:{maxlen:{$get(){return void 0===this.maxlen?Sk.builtin.none.none$:new Sk.builtin.int_(this.maxlen)},$doc:"maximum size of a deque or None if unbounded"}},proto:{$clear(){this.head=0,this.tail=0,this.mask=1,this.v=[,,]},$copy(){return new a.deque(this.v.slice(0),this.maxlen,this.head,this.tail,this.mask)},$extend(a){for(it=Sk.abstr.iter(a),i=it.tp$iternext();void 0!==i;i=it.tp$iternext())this.$push(i)},set$item(a,b){const c=(0<=a?this.head:this.tail)+a&this.mask;this.v[c]=b},del$item(a){const b=(0<=a?this.head:this.tail)+a&this.mask;for(let c=b;c!==this.tail;){const a=c+1&this.mask;this.v[c]=this.v[a],c=a}const c=this.tail-this.head&this.mask;this.tail=this.tail-1&this.mask,c>>1&&this.$resize(c,this.v.length>>>1)},$push(a){this.v[this.tail]=a,this.tail=this.tail+1&this.mask,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$popLeft(),this},$pushLeft(a){this.head=this.head-1&this.mask,this.v[this.head]=a,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const b=this.tail-this.head&this.mask;return void 0!==this.maxlen&&b>this.maxlen&&this.$pop(),this},$pop(){if(this.head===this.tail)throw new Sk.builtin.IndexError("pop from an empty deque");this.tail=this.tail-1&this.mask;const a=this.v[this.tail];this.v[this.tail]=void 0;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$popLeft(){if(this.head===this.tail)throw new Sk.builtin.IndexError("pop from an empty deque");const a=this.v[this.head];this.v[this.head]=void 0,this.head=this.head+1&this.mask;const b=this.tail-this.head&this.mask;return b>>1&&this.$resize(b,this.v.length>>>1),a},$resize(a,b){const c=this.head,d=this.mask;if(this.head=0,this.tail=a,this.mask=b-1,0===c)return void(this.v.length=b);const e=Array(b);for(let f=0;f=this.$length)){const a=(0<=this.$index?this.$head:this.$tail)+this.$index&this.$mask;return this.$index++,this.dq[a]}},methods:{__length_hint__:{$meth:function __length_hint__(){return new Sk.builtin.int_(this.$length-this.$index)},$flags:{NoArgs:!0}}}}),d=Sk.abstr.buildIteratorClass("_collections._deque_reverse_iterator",{constructor:function _deque_reverse_iterator(a){this.$index=(a.tail-a.head&a.mask)-1,this.dq=a.v,this.$head=a.head,this.$mask=a.mask},iternext(){if(!(0>this.$index)){const a=this.$head+this.$index&this.$mask;return this.$index--,this.dq[a]}},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef}}),e=new RegExp(/^[0-9].*/),f=new RegExp(/^[0-9_].*/),g=new RegExp(/^\\w*$/),h=/,/g,j=/\\s+/;return namedtuple.co_argcount=2,namedtuple.co_kwonlyargcount=3,namedtuple.$kwdefs=[Sk.builtin.bool.false$,Sk.builtin.none.none$,Sk.builtin.none.none$],namedtuple.co_varnames=["typename","field_names","rename","defaults","module"],a.namedtuple=new Sk.builtin.func(namedtuple),a}',"src/lib/colorsys.py":'raise NotImplementedError("colorsys is not yet implemented in Skulpt")\n',"src/lib/commands.py":'raise NotImplementedError("commands is not yet implemented in Skulpt")\n',"src/lib/compileall.py":'raise NotImplementedError("compileall is not yet implemented in Skulpt")\n',"src/lib/compiler/__init__.py":'raise NotImplementedError("compiler is not yet implemented in Skulpt")\n',"src/lib/config/__init__.py":'raise NotImplementedError("config is not yet implemented in Skulpt")\n',"src/lib/contextlib.py":'raise NotImplementedError("contextlib is not yet implemented in Skulpt")\n',"src/lib/cookielib.py":'raise NotImplementedError("cookielib is not yet implemented in Skulpt")\n',"src/lib/copy.py":'"""\nThis file was modified from CPython.\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\n"""\nimport types\nclass Error(Exception):\n pass\nerror = Error \nclass _EmptyClass:\n pass\ntry:\n long\nexcept NameError:\n long = int\n\ndef copy(x):\n cls = type(x)\n if callable(x):\n return x\n copier = getattr(cls, "__copy__", None)\n if copier:\n return copier(x)\n if cls in (type(None), int, float, bool, str, tuple, type, frozenset, long):\n return x\n if (cls == list) or (cls == dict) or (cls == set) or (cls == slice):\n return cls(x)\n try:\n getstate = getattr(x, "__getstate__", None)\n setstate = getattr(x, "__setstate__", None)\n initargs = getattr(x, "__getinitargs__", None)\n except:\n reductor = False\n if getstate or setstate or initargs:\n raise NotImplementedError("Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()")\n reductor = getattr(x, "__reduce_ex__", None)\n if reductor:\n rv = reductor(4)\n else:\n reductor = getattr(x, "__reduce__", None)\n if reductor:\n rv = reductor()\n elif str(cls)[1:6] == "class":\n copier = _copy_inst\n return copier(x)\n else:\n raise Error("un(shallow)copyable object of type %s" % cls)\n if isinstance(rv, str):\n return x\n return _reconstruct(x, rv, 0)\n\ndef _copy_inst(x):\n if hasattr(x, \'__copy__\'):\n return x.__copy__()\n if hasattr(x, \'__getinitargs__\'):\n args = x.__getinitargs__()\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n if hasattr(x, \'__getstate__\'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\n\nd = _deepcopy_dispatch = {}\n\ndef deepcopy(x, memo=None, _nil=[]):\n """Deep copy operation on arbitrary Python objects.\n See the module\'s __doc__ string for more info.\n """\n if memo is None:\n memo = {}\n idx = id(x)\n y = memo.get(idx, _nil)\n if y is not _nil:\n return y\n cls = type(x)\n try:\n getstate = getattr(x, "__getstate__", None)\n setstate = getattr(x, "__setstate__", None)\n initargs = getattr(x, "__getinitargs__", None)\n except:\n reductor = False\n if getstate or setstate or initargs:\n raise NotImplementedError("Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()")\n copier = _deepcopy_dispatch.get(cls)\n if copier:\n y = copier(x, memo)\n elif str(cls)[1:6] == "class":\n copier = _deepcopy_dispatch["InstanceType"]\n y = copier(x, memo)\n else:\n try:\n issc = issubclass(cls, type)\n except TypeError: # cls is not a class (old Boost; see SF #502085)\n issc = 0\n if issc:\n y = _deepcopy_atomic(x, memo)\n else:\n copier = getattr(x, "__deepcopy__", None)\n if copier:\n y = copier(memo)\n else:\n reductor = getattr(x, "__reduce_ex__", None)\n if reductor:\n rv = reductor(2)\n else:\n reductor = getattr(x, "__reduce__", None)\n if reductor:\n rv = reductor()\n else:\n raise Error(\n "un(deep)copyable object of type %s" % cls)\n y = _reconstruct(x, rv, 1, memo)\n memo[idx] = y\n _keep_alive(x, memo) # Make sure x lives at least as long as d\n return y\n\ndef _deepcopy_atomic(x, memo):\n return x\nd[type(None)] = _deepcopy_atomic\n# d[type(Ellipsis)] = _deepcopy_atomic\nd[type(NotImplemented)] = _deepcopy_atomic\nd[int] = _deepcopy_atomic\nd[float] = _deepcopy_atomic\nd[bool] = _deepcopy_atomic\nd[complex] = _deepcopy_atomic\n# d[bytes] = _deepcopy_atomic\nd[str] = _deepcopy_atomic\n# try:\n# d[types.CodeType] = _deepcopy_atomic\n# except AttributeError:\n# pass\nd[type] = _deepcopy_atomic\n# d[types.BuiltinFunctionType] = _deepcopy_atomic\nd[types.FunctionType] = _deepcopy_atomic\n# d[weakref.ref] = _deepcopy_atomic\n\ndef _deepcopy_list(x, memo):\n y = []\n memo[id(x)] = y\n for a in x:\n y.append(deepcopy(a, memo))\n return y\nd[list] = _deepcopy_list\n\ndef _deepcopy_set(x, memo):\n result = set([]) # make empty set\n memo[id(x)] = result # register this set in the memo for loop checking\n for a in x: # go through elements of set\n result.add(deepcopy(a, memo)) # add the copied elements into the new set\n return result # return the new set\nd[set] = _deepcopy_set\n\ndef _deepcopy_frozenset(x, memo):\n result = frozenset(_deepcopy_set(x,memo)) \n memo[id(x)] = result \n return result\nd[frozenset] = _deepcopy_frozenset\n\ndef _deepcopy_tuple(x, memo):\n y = [deepcopy(a, memo) for a in x]\n # We\'re not going to put the tuple in the memo, but it\'s still important we\n # check for it, in case the tuple contains recursive mutable structures.\n try:\n return memo[id(x)]\n except KeyError:\n pass\n for k, j in zip(x, y):\n if k is not j:\n y = tuple(y)\n break\n else:\n y = x\n return y\nd[tuple] = _deepcopy_tuple\n\ndef _deepcopy_dict(x, memo):\n y = {}\n memo[id(x)] = y\n for key, value in x.items():\n y[deepcopy(key, memo)] = deepcopy(value, memo)\n return y\nd[dict] = _deepcopy_dict\n\n# def _deepcopy_method(x, memo): # Copy instance methods\n# y = type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class);\n# return y\nd[types.MethodType] = _deepcopy_atomic\n\ndef _deepcopy_inst(x, memo):\n if hasattr(x, \'__deepcopy__\'):\n return x.__deepcopy__(memo)\n if hasattr(x, \'__getinitargs__\'):\n args = x.__getinitargs__()\n args = deepcopy(args, memo)\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n memo[id(x)] = y\n if hasattr(x, \'__getstate__\'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n state = deepcopy(state, memo)\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\nd["InstanceType"] = _deepcopy_inst\n\ndef _keep_alive(x, memo):\n """Keeps a reference to the object x in the memo.\n Because we remember objects by their id, we have\n to assure that possibly temporary objects are kept\n alive by referencing them.\n We store a reference at the id of the memo, which should\n normally not be used unless someone tries to deepcopy\n the memo itself...\n """\n try:\n memo[id(memo)].append(x)\n except KeyError:\n # aha, this is the first one :-)\n memo[id(memo)]=[x]\n\ndef _reconstruct(x, info, deep, memo=None):\n if isinstance(info, str):\n return x\n assert isinstance(info, tuple)\n if memo is None:\n memo = {}\n n = len(info)\n assert n in (2, 3, 4, 5)\n callable, args = info[:2]\n if n > 2:\n state = info[2]\n else:\n state = None\n if n > 3:\n listiter = info[3]\n else:\n listiter = None\n if n > 4:\n dictiter = info[4]\n else:\n dictiter = None\n if deep:\n args = deepcopy(args, memo)\n y = callable(*args)\n memo[id(x)] = y\n\n if state is not None:\n if deep:\n state = deepcopy(state, memo)\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n if isinstance(state, tuple) and len(state) == 2:\n state, slotstate = state\n else:\n slotstate = None\n if state is not None:\n y.__dict__.update(state)\n if slotstate is not None:\n for key, value in slotstate.items():\n setattr(y, key, value)\n\n if listiter is not None:\n for item in listiter:\n if deep:\n item = deepcopy(item, memo)\n y.append(item)\n if dictiter is not None:\n for key, value in dictiter:\n if deep:\n key = deepcopy(key, memo)\n value = deepcopy(value, memo)\n y[key] = value\n return y\n\ndel d\n\ndel types\n\n# Helper for instance creation without calling __init__\nclass _EmptyClass:\n pass',"src/lib/copy_reg.py":'raise NotImplementedError("copy_reg is not yet implemented in Skulpt")\n',"src/lib/csv.py":'raise NotImplementedError("csv is not yet implemented in Skulpt")\n',"src/lib/ctypes/__init__.py":'raise NotImplementedError("ctypes is not yet implemented in Skulpt")\n',"src/lib/ctypes/macholib/__init__.py":'raise NotImplementedError("macholib is not yet implemented in Skulpt")\n',"src/lib/curses/__init__.py":'raise NotImplementedError("curses is not yet implemented in Skulpt")\n',"src/lib/datetime.py":'"""Concrete date/time and related types -- prototype implemented in Python.\n\nSee http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage\n\nSee also http://dir.yahoo.com/Reference/calendars/\n\nFor a primer on DST, including many current DST rules, see\nhttp://webexhibits.org/daylightsaving/\n\nFor more about DST than you ever wanted to know, see\nftp://elsie.nci.nih.gov/pub/\n\nSources for time zone and DST data: http://www.twinsun.com/tz/tz-link.htm\n\nThis was originally copied from the sandbox of the CPython CVS repository.\nThanks to Tim Peters for suggesting using it.\n\nThis was then copied from PyPy v5.1.0 into Skulpt by Meredydd Luff, removing\n\'from __future__ import division\' (and replacing division operators accordingly)\nand pickle support (which requires \'struct\', which Skulpt does not currently\n[as of 31/8/2016] have)\n"""\n\nimport time as _time\nimport math as _math\n\n# Python 2-vs-3 compat hack\nimport sys\nunicode = unicode if sys.version_info < (3,) else str\n\n_SENTINEL = object()\n\ndef _cmp(x, y):\n return 0 if x == y else 1 if x > y else -1\n\ndef _round(x):\n return int(_math.floor(x + 0.5) if x >= 0.0 else _math.ceil(x - 0.5))\n\nMINYEAR = 1\nMAXYEAR = 9999\n_MINYEARFMT = 1900\n\n_MAX_DELTA_DAYS = 999999999\n\n# Utility functions, adapted from Python\'s Demo/classes/Dates.py, which\n# also assumes the current Gregorian calendar indefinitely extended in\n# both directions. Difference: Dates.py calls January 1 of year 0 day\n# number 1. The code here calls January 1 of year 1 day number 1. This is\n# to match the definition of the "proleptic Gregorian" calendar in Dershowitz\n# and Reingold\'s "Calendrical Calculations", where it\'s the base calendar\n# for all computations. See the book for algorithms for converting between\n# proleptic Gregorian ordinals and many other calendar systems.\n\n_DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\n_DAYS_BEFORE_MONTH = [-1]\ndbm = 0\nfor dim in _DAYS_IN_MONTH[1:]:\n _DAYS_BEFORE_MONTH.append(dbm)\n dbm += dim\ndel dbm, dim\n\ndef _is_leap(year):\n "year -> 1 if leap year, else 0."\n return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)\n\ndef _days_before_year(year):\n "year -> number of days before January 1st of year."\n y = year - 1\n return y*365 + y//4 - y//100 + y//400\n\ndef _days_in_month(year, month):\n "year, month -> number of days in that month in that year."\n assert 1 <= month <= 12, month\n if month == 2 and _is_leap(year):\n return 29\n return _DAYS_IN_MONTH[month]\n\ndef _days_before_month(year, month):\n "year, month -> number of days in year preceding first day of month."\n assert 1 <= month <= 12, \'month must be in 1..12\'\n return _DAYS_BEFORE_MONTH[month] + (month > 2 and _is_leap(year))\n\ndef _ymd2ord(year, month, day):\n "year, month, day -> ordinal, considering 01-Jan-0001 as day 1."\n assert 1 <= month <= 12, \'month must be in 1..12\'\n dim = _days_in_month(year, month)\n assert 1 <= day <= dim, (\'day must be in 1..%d\' % dim)\n return (_days_before_year(year) +\n _days_before_month(year, month) +\n day)\n\n_DI400Y = _days_before_year(401) # number of days in 400 years\n_DI100Y = _days_before_year(101) # " " " " 100 "\n_DI4Y = _days_before_year(5) # " " " " 4 "\n\n# A 4-year cycle has an extra leap day over what we\'d get from pasting\n# together 4 single years.\nassert _DI4Y == 4 * 365 + 1\n\n# Similarly, a 400-year cycle has an extra leap day over what we\'d get from\n# pasting together 4 100-year cycles.\nassert _DI400Y == 4 * _DI100Y + 1\n\n# OTOH, a 100-year cycle has one fewer leap day than we\'d get from\n# pasting together 25 4-year cycles.\nassert _DI100Y == 25 * _DI4Y - 1\n\n_US_PER_US = 1\n_US_PER_MS = 1000\n_US_PER_SECOND = 1000000\n_US_PER_MINUTE = 60000000\n_SECONDS_PER_DAY = 24 * 3600\n_US_PER_HOUR = 3600000000\n_US_PER_DAY = 86400000000\n_US_PER_WEEK = 604800000000\n\ndef _ord2ymd(n):\n "ordinal -> (year, month, day), considering 01-Jan-0001 as day 1."\n\n # n is a 1-based index, starting at 1-Jan-1. The pattern of leap years\n # repeats exactly every 400 years. The basic strategy is to find the\n # closest 400-year boundary at or before n, then work with the offset\n # from that boundary to n. Life is much clearer if we subtract 1 from\n # n first -- then the values of n at 400-year boundaries are exactly\n # those divisible by _DI400Y:\n #\n # D M Y n n-1\n # -- --- ---- ---------- ----------------\n # 31 Dec -400 -_DI400Y -_DI400Y -1\n # 1 Jan -399 -_DI400Y +1 -_DI400Y 400-year boundary\n # ...\n # 30 Dec 000 -1 -2\n # 31 Dec 000 0 -1\n # 1 Jan 001 1 0 400-year boundary\n # 2 Jan 001 2 1\n # 3 Jan 001 3 2\n # ...\n # 31 Dec 400 _DI400Y _DI400Y -1\n # 1 Jan 401 _DI400Y +1 _DI400Y 400-year boundary\n n -= 1\n n400, n = divmod(n, _DI400Y)\n year = n400 * 400 + 1 # ..., -399, 1, 401, ...\n\n # Now n is the (non-negative) offset, in days, from January 1 of year, to\n # the desired date. Now compute how many 100-year cycles precede n.\n # Note that it\'s possible for n100 to equal 4! In that case 4 full\n # 100-year cycles precede the desired day, which implies the desired\n # day is December 31 at the end of a 400-year cycle.\n n100, n = divmod(n, _DI100Y)\n\n # Now compute how many 4-year cycles precede it.\n n4, n = divmod(n, _DI4Y)\n\n # And now how many single years. Again n1 can be 4, and again meaning\n # that the desired day is December 31 at the end of the 4-year cycle.\n n1, n = divmod(n, 365)\n\n year += n100 * 100 + n4 * 4 + n1\n if n1 == 4 or n100 == 4:\n assert n == 0\n return year-1, 12, 31\n\n # Now the year is correct, and n is the offset from January 1. We find\n # the month via an estimate that\'s either exact or one too large.\n leapyear = n1 == 3 and (n4 != 24 or n100 == 3)\n assert leapyear == _is_leap(year)\n month = (n + 50) >> 5\n preceding = _DAYS_BEFORE_MONTH[month] + (month > 2 and leapyear)\n if preceding > n: # estimate is too large\n month -= 1\n preceding -= _DAYS_IN_MONTH[month] + (month == 2 and leapyear)\n n -= preceding\n assert 0 <= n < _days_in_month(year, month)\n\n # Now the year and month are correct, and n is the offset from the\n # start of that month: we\'re done!\n return year, month, n+1\n\n# Month and day names. For localized versions, see the calendar module.\n_MONTHNAMES = [None, "Jan", "Feb", "Mar", "Apr", "May", "Jun",\n "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]\n_DAYNAMES = [None, "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]\n\n\ndef _build_struct_time(y, m, d, hh, mm, ss, dstflag):\n wday = (_ymd2ord(y, m, d) + 6) % 7\n dnum = _days_before_month(y, m) + d\n return _time.struct_time((y, m, d, hh, mm, ss, wday, dnum, dstflag))\n\ndef _format_time(hh, mm, ss, us):\n # Skip trailing microseconds when us==0.\n result = "%02d:%02d:%02d" % (hh, mm, ss)\n if us:\n result += ".%06d" % us\n return result\n\n# Correctly substitute for %z and %Z escapes in strftime formats.\ndef _wrap_strftime(object, format, timetuple):\n year = timetuple[0]\n if year < _MINYEARFMT:\n raise ValueError("year=%d is before %d; the datetime strftime() "\n "methods require year >= %d" %\n (year, _MINYEARFMT, _MINYEARFMT))\n # Don\'t call utcoffset() or tzname() unless actually needed.\n freplace = None # the string to use for %f\n zreplace = None # the string to use for %z\n Zreplace = None # the string to use for %Z\n\n # Scan format for %z and %Z escapes, replacing as needed.\n newformat = []\n push = newformat.append\n i, n = 0, len(format)\n while i < n:\n ch = format[i]\n i += 1\n if ch == \'%\':\n if i < n:\n ch = format[i]\n i += 1\n if ch == \'f\':\n if freplace is None:\n freplace = \'%06d\' % getattr(object,\n \'microsecond\', 0)\n newformat.append(freplace)\n elif ch == \'z\':\n if zreplace is None:\n zreplace = ""\n if hasattr(object, "_utcoffset"):\n offset = object._utcoffset()\n if offset is not None:\n sign = \'+\'\n if offset < 0:\n offset = -offset\n sign = \'-\'\n h, m = divmod(offset, 60)\n zreplace = \'%c%02d%02d\' % (sign, h, m)\n assert \'%\' not in zreplace\n newformat.append(zreplace)\n elif ch == \'Z\':\n if Zreplace is None:\n Zreplace = ""\n if hasattr(object, "tzname"):\n s = object.tzname()\n if s is not None:\n # strftime is going to have at this: escape %\n Zreplace = s.replace(\'%\', \'%%\')\n newformat.append(Zreplace)\n else:\n push(\'%\')\n push(ch)\n else:\n push(\'%\')\n else:\n push(ch)\n newformat = "".join(newformat)\n return _time.strftime(newformat, timetuple)\n\n# Just raise TypeError if the arg isn\'t None or a string.\ndef _check_tzname(name):\n if name is not None and not isinstance(name, str):\n raise TypeError("tzinfo.tzname() must return None or string, "\n "not \'%s\'" % type(name))\n\n# name is the offset-producing method, "utcoffset" or "dst".\n# offset is what it returned.\n# If offset isn\'t None or timedelta, raises TypeError.\n# If offset is None, returns None.\n# Else offset is checked for being in range, and a whole # of minutes.\n# If it is, its integer value is returned. Else ValueError is raised.\ndef _check_utc_offset(name, offset):\n assert name in ("utcoffset", "dst")\n if offset is None:\n return\n if not isinstance(offset, timedelta):\n raise TypeError("tzinfo.%s() must return None "\n "or timedelta, not \'%s\'" % (name, type(offset)))\n days = offset.days\n if days < -1 or days > 0:\n offset = 1440 # trigger out-of-range\n else:\n seconds = days * 86400 + offset.seconds\n minutes, seconds = divmod(seconds, 60)\n if seconds or offset.microseconds:\n raise ValueError("tzinfo.%s() must return a whole number "\n "of minutes" % name)\n offset = minutes\n if not -1440 < offset < 1440:\n raise ValueError("%s()=%d, must be in -1439..1439" % (name, offset))\n return offset\n\ndef _check_int_field(value):\n if isinstance(value, int):\n return int(value)\n if not isinstance(value, float):\n try:\n value = value.__int__()\n except AttributeError:\n pass\n else:\n if isinstance(value, int):\n return int(value)\n raise TypeError(\'__int__ method should return an integer\')\n raise TypeError(\'an integer is required\')\n raise TypeError(\'integer argument expected, got float\')\n\ndef _check_date_fields(year, month, day):\n year = _check_int_field(year)\n month = _check_int_field(month)\n day = _check_int_field(day)\n if not MINYEAR <= year <= MAXYEAR:\n raise ValueError(\'year must be in %d..%d\' % (MINYEAR, MAXYEAR), year)\n if not 1 <= month <= 12:\n raise ValueError(\'month must be in 1..12\', month)\n dim = _days_in_month(year, month)\n if not 1 <= day <= dim:\n raise ValueError(\'day must be in 1..%d\' % dim, day)\n return year, month, day\n\ndef _check_time_fields(hour, minute, second, microsecond):\n hour = _check_int_field(hour)\n minute = _check_int_field(minute)\n second = _check_int_field(second)\n microsecond = _check_int_field(microsecond)\n if not 0 <= hour <= 23:\n raise ValueError(\'hour must be in 0..23\', hour)\n if not 0 <= minute <= 59:\n raise ValueError(\'minute must be in 0..59\', minute)\n if not 0 <= second <= 59:\n raise ValueError(\'second must be in 0..59\', second)\n if not 0 <= microsecond <= 999999:\n raise ValueError(\'microsecond must be in 0..999999\', microsecond)\n return hour, minute, second, microsecond\n\ndef _check_tzinfo_arg(tz):\n if tz is not None and not isinstance(tz, tzinfo):\n raise TypeError("tzinfo argument must be None or of a tzinfo subclass")\n\n\n# Notes on comparison: In general, datetime module comparison operators raise\n# TypeError when they don\'t know how to do a comparison themself. If they\n# returned NotImplemented instead, comparison could (silently) fall back to\n# the default compare-objects-by-comparing-their-memory-addresses strategy,\n# and that\'s not helpful. There are two exceptions:\n#\n# 1. For date and datetime, if the other object has a "timetuple" attr,\n# NotImplemented is returned. This is a hook to allow other kinds of\n# datetime-like objects a chance to intercept the comparison.\n#\n# 2. Else __eq__ and __ne__ return False and True, respectively. This is\n# so opertaions like\n#\n# x == y\n# x != y\n# x in sequence\n# x not in sequence\n# dict[x] = y\n#\n# don\'t raise annoying TypeErrors just because a datetime object\n# is part of a heterogeneous collection. If there\'s no known way to\n# compare X to a datetime, saying they\'re not equal is reasonable.\n\ndef _cmperror(x, y):\n raise TypeError("can\'t compare \'%s\' to \'%s\'" % (\n type(x).__name__, type(y).__name__))\n\ndef _normalize_pair(hi, lo, factor):\n if not 0 <= lo <= factor-1:\n inc, lo = divmod(lo, factor)\n hi += inc\n return hi, lo\n\ndef _normalize_datetime(y, m, d, hh, mm, ss, us, ignore_overflow=False):\n # Normalize all the inputs, and store the normalized values.\n ss, us = _normalize_pair(ss, us, 1000000)\n mm, ss = _normalize_pair(mm, ss, 60)\n hh, mm = _normalize_pair(hh, mm, 60)\n d, hh = _normalize_pair(d, hh, 24)\n y, m, d = _normalize_date(y, m, d, ignore_overflow)\n return y, m, d, hh, mm, ss, us\n\ndef _normalize_date(year, month, day, ignore_overflow=False):\n # That was easy. Now it gets muddy: the proper range for day\n # can\'t be determined without knowing the correct month and year,\n # but if day is, e.g., plus or minus a million, the current month\n # and year values make no sense (and may also be out of bounds\n # themselves).\n # Saying 12 months == 1 year should be non-controversial.\n if not 1 <= month <= 12:\n year, month = _normalize_pair(year, month-1, 12)\n month += 1\n assert 1 <= month <= 12\n\n # Now only day can be out of bounds (year may also be out of bounds\n # for a datetime object, but we don\'t care about that here).\n # If day is out of bounds, what to do is arguable, but at least the\n # method here is principled and explainable.\n dim = _days_in_month(year, month)\n if not 1 <= day <= dim:\n # Move day-1 days from the first of the month. First try to\n # get off cheap if we\'re only one day out of range (adjustments\n # for timezone alone can\'t be worse than that).\n if day == 0: # move back a day\n month -= 1\n if month > 0:\n day = _days_in_month(year, month)\n else:\n year, month, day = year-1, 12, 31\n elif day == dim + 1: # move forward a day\n month += 1\n day = 1\n if month > 12:\n month = 1\n year += 1\n else:\n ordinal = _ymd2ord(year, month, 1) + (day - 1)\n year, month, day = _ord2ymd(ordinal)\n\n if not ignore_overflow and not MINYEAR <= year <= MAXYEAR:\n raise OverflowError("date value out of range")\n return year, month, day\n\ndef _accum(tag, sofar, num, factor, leftover):\n if isinstance(num, int):\n prod = num * factor\n rsum = sofar + prod\n return rsum, leftover\n if isinstance(num, float):\n fracpart, intpart = _math.modf(num)\n prod = int(intpart) * factor\n rsum = sofar + prod\n if fracpart == 0.0:\n return rsum, leftover\n assert isinstance(factor, int)\n fracpart, intpart = _math.modf(factor * fracpart)\n rsum += int(intpart)\n return rsum, leftover + fracpart\n raise TypeError("unsupported type for timedelta %s component: %s" %\n (tag, type(num)))\n\nclass timedelta(object):\n """Represent the difference between two datetime objects.\n\n Supported operators:\n\n - add, subtract timedelta\n - unary plus, minus, abs\n - compare to timedelta\n - multiply, divide by int/long\n\n In addition, datetime supports subtraction of two datetime objects\n returning a timedelta, and addition or subtraction of a datetime\n and a timedelta giving a datetime.\n\n Representation: (days, seconds, microseconds). Why? Because I\n felt like it.\n """\n __slots__ = \'_days\', \'_seconds\', \'_microseconds\', \'_hashcode\'\n\n def __new__(cls, days=_SENTINEL, seconds=_SENTINEL, microseconds=_SENTINEL,\n milliseconds=_SENTINEL, minutes=_SENTINEL, hours=_SENTINEL, weeks=_SENTINEL):\n x = 0\n leftover = 0.0\n if microseconds is not _SENTINEL:\n x, leftover = _accum("microseconds", x, microseconds, _US_PER_US, leftover)\n if milliseconds is not _SENTINEL:\n x, leftover = _accum("milliseconds", x, milliseconds, _US_PER_MS, leftover)\n if seconds is not _SENTINEL:\n x, leftover = _accum("seconds", x, seconds, _US_PER_SECOND, leftover)\n if minutes is not _SENTINEL:\n x, leftover = _accum("minutes", x, minutes, _US_PER_MINUTE, leftover)\n if hours is not _SENTINEL:\n x, leftover = _accum("hours", x, hours, _US_PER_HOUR, leftover)\n if days is not _SENTINEL:\n x, leftover = _accum("days", x, days, _US_PER_DAY, leftover)\n if weeks is not _SENTINEL:\n x, leftover = _accum("weeks", x, weeks, _US_PER_WEEK, leftover)\n if leftover != 0.0:\n x += _round(leftover)\n return cls._from_microseconds(x)\n\n @classmethod\n def _from_microseconds(cls, us):\n s, us = divmod(us, _US_PER_SECOND)\n d, s = divmod(s, _SECONDS_PER_DAY)\n return cls._create(d, s, us, False)\n\n @classmethod\n def _create(cls, d, s, us, normalize):\n if normalize:\n s, us = _normalize_pair(s, us, 1000000)\n d, s = _normalize_pair(d, s, 24*3600)\n\n if not -_MAX_DELTA_DAYS <= d <= _MAX_DELTA_DAYS:\n raise OverflowError("days=%d; must have magnitude <= %d" % (d, _MAX_DELTA_DAYS))\n\n self = object.__new__(cls)\n self._days = d\n self._seconds = s\n self._microseconds = us\n self._hashcode = -1\n return self\n\n def _to_microseconds(self):\n return ((self._days * _SECONDS_PER_DAY + self._seconds) * _US_PER_SECOND +\n self._microseconds)\n\n def __repr__(self):\n module = "datetime." if self.__class__ is timedelta else ""\n if self._microseconds:\n return "%s(%d, %d, %d)" % (module + self.__class__.__name__,\n self._days,\n self._seconds,\n self._microseconds)\n if self._seconds:\n return "%s(%d, %d)" % (module + self.__class__.__name__,\n self._days,\n self._seconds)\n return "%s(%d)" % (module + self.__class__.__name__, self._days)\n\n def __str__(self):\n mm, ss = divmod(self._seconds, 60)\n hh, mm = divmod(mm, 60)\n s = "%d:%02d:%02d" % (hh, mm, ss)\n if self._days:\n def plural(n):\n return n, abs(n) != 1 and "s" or ""\n s = ("%d day%s, " % plural(self._days)) + s\n if self._microseconds:\n s = s + ".%06d" % self._microseconds\n return s\n\n def total_seconds(self):\n """Total seconds in the duration."""\n return self._to_microseconds() / 10.0**6\n\n # Read-only field accessors\n @property\n def days(self):\n """days"""\n return self._days\n\n @property\n def seconds(self):\n """seconds"""\n return self._seconds\n\n @property\n def microseconds(self):\n """microseconds"""\n return self._microseconds\n\n def __add__(self, other):\n if isinstance(other, timedelta):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days + other._days,\n self._seconds + other._seconds,\n self._microseconds + other._microseconds,\n True)\n return NotImplemented\n\n def __sub__(self, other):\n if isinstance(other, timedelta):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days - other._days,\n self._seconds - other._seconds,\n self._microseconds - other._microseconds,\n True)\n return NotImplemented\n\n def __neg__(self):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(-self._days,\n -self._seconds,\n -self._microseconds,\n True)\n\n def __pos__(self):\n # for CPython compatibility, we cannot use\n # our __class__ here, but need a real timedelta\n return timedelta._create(self._days,\n self._seconds,\n self._microseconds,\n False)\n\n def __abs__(self):\n if self._days < 0:\n return -self\n else:\n return self\n\n def __mul__(self, other):\n if not isinstance(other, int):\n return NotImplemented\n usec = self._to_microseconds()\n return timedelta._from_microseconds(usec * other)\n\n __rmul__ = __mul__\n\n def __div__(self, other):\n if not isinstance(other, int):\n return NotImplemented\n usec = self._to_microseconds()\n return timedelta._from_microseconds(usec // other)\n\n __floordiv__ = __div__\n\n # Comparisons of timedelta objects with other.\n\n def __eq__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) == 0\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) != 0\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) <= 0\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) < 0\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) >= 0\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, timedelta):\n return self._cmp(other) > 0\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, timedelta)\n return _cmp(self._getstate(), other._getstate())\n\n def __hash__(self):\n if self._hashcode == -1:\n self._hashcode = hash(self._getstate())\n return self._hashcode\n\n def __nonzero__(self):\n return (self._days != 0 or\n self._seconds != 0 or\n self._microseconds != 0)\n\ntimedelta.min = timedelta(-_MAX_DELTA_DAYS)\ntimedelta.max = timedelta(_MAX_DELTA_DAYS, 24*3600-1, 1000000-1)\ntimedelta.resolution = timedelta(microseconds=1)\n\nclass date(object):\n """Concrete date type.\n\n Constructors:\n\n __new__()\n fromtimestamp()\n today()\n fromordinal()\n\n Operators:\n\n __repr__, __str__\n __cmp__, __hash__\n __add__, __radd__, __sub__ (add/radd only with timedelta arg)\n\n Methods:\n\n timetuple()\n toordinal()\n weekday()\n isoweekday(), isocalendar(), isoformat()\n ctime()\n strftime()\n\n Properties (readonly):\n year, month, day\n """\n __slots__ = \'_year\', \'_month\', \'_day\', \'_hashcode\'\n\n def __new__(cls, year, month=None, day=None):\n """Constructor.\n\n Arguments:\n\n year, month, day (required, base 1)\n """\n year, month, day = _check_date_fields(year, month, day)\n self = object.__new__(cls)\n self._year = year\n self._month = month\n self._day = day\n self._hashcode = -1\n return self\n\n # Additional constructors\n\n @classmethod\n def fromtimestamp(cls, t):\n "Construct a date from a POSIX timestamp (like time.time())."\n y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t)\n return cls(y, m, d)\n\n @classmethod\n def today(cls):\n "Construct a date from time.time()."\n t = _time.time()\n return cls.fromtimestamp(t)\n\n @classmethod\n def fromordinal(cls, n):\n """Contruct a date from a proleptic Gregorian ordinal.\n\n January 1 of year 1 is day 1. Only the year, month and day are\n non-zero in the result.\n """\n y, m, d = _ord2ymd(n)\n return cls(y, m, d)\n\n # Conversions to string\n\n def __repr__(self):\n """Convert to formal string, for repr().\n\n >>> dt = datetime(2010, 1, 1)\n >>> repr(dt)\n \'datetime.datetime(2010, 1, 1, 0, 0)\'\n\n >>> dt = datetime(2010, 1, 1, tzinfo=timezone.utc)\n >>> repr(dt)\n \'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)\'\n """\n module = "datetime." if self.__class__ is date else ""\n return "%s(%d, %d, %d)" % (module + self.__class__.__name__,\n self._year,\n self._month,\n self._day)\n\n # XXX These shouldn\'t depend on time.localtime(), because that\n # clips the usable dates to [1970 .. 2038). At least ctime() is\n # easily done without using strftime() -- that\'s better too because\n # strftime("%c", ...) is locale specific.\n\n def ctime(self):\n "Return ctime() style string."\n weekday = self.toordinal() % 7 or 7\n return "%s %s %2d 00:00:00 %04d" % (\n _DAYNAMES[weekday],\n _MONTHNAMES[self._month],\n self._day, self._year)\n\n def strftime(self, format):\n "Format using strftime()."\n return _wrap_strftime(self, format, self.timetuple())\n\n def __format__(self, fmt):\n if not isinstance(fmt, (str, unicode)):\n raise ValueError("__format__ expects str or unicode, not %s" %\n fmt.__class__.__name__)\n if len(fmt) != 0:\n return self.strftime(fmt)\n return str(self)\n\n def isoformat(self):\n """Return the date formatted according to ISO.\n\n This is \'YYYY-MM-DD\'.\n\n References:\n - http://www.w3.org/TR/NOTE-datetime\n - http://www.cl.cam.ac.uk/~mgk25/iso-time.html\n """\n return "%04d-%02d-%02d" % (self._year, self._month, self._day)\n\n __str__ = isoformat\n\n # Read-only field accessors\n @property\n def year(self):\n """year (1-9999)"""\n return self._year\n\n @property\n def month(self):\n """month (1-12)"""\n return self._month\n\n @property\n def day(self):\n """day (1-31)"""\n return self._day\n\n # Standard conversions, __cmp__, __hash__ (and helpers)\n\n def timetuple(self):\n "Return local time tuple compatible with time.localtime()."\n return _build_struct_time(self._year, self._month, self._day,\n 0, 0, 0, -1)\n\n def toordinal(self):\n """Return proleptic Gregorian ordinal for the year, month and day.\n\n January 1 of year 1 is day 1. Only the year, month and day values\n contribute to the result.\n """\n return _ymd2ord(self._year, self._month, self._day)\n\n def replace(self, year=None, month=None, day=None):\n """Return a new date with new values for the specified fields."""\n if year is None:\n year = self._year\n if month is None:\n month = self._month\n if day is None:\n day = self._day\n return date(year, month, day)\n\n # Comparisons of date objects with other.\n\n def __eq__(self, other):\n if isinstance(other, date):\n return self._cmp(other) == 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, date):\n return self._cmp(other) != 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, date):\n return self._cmp(other) <= 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, date):\n return self._cmp(other) < 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, date):\n return self._cmp(other) >= 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, date):\n return self._cmp(other) > 0\n elif hasattr(other, "timetuple"):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, date)\n y, m, d = self._year, self._month, self._day\n y2, m2, d2 = other._year, other._month, other._day\n return _cmp((y, m, d), (y2, m2, d2))\n\n def __hash__(self):\n "Hash."\n if self._hashcode == -1:\n self._hashcode = hash(self._getstate())\n return self._hashcode\n\n # Computations\n\n def _add_timedelta(self, other, factor):\n y, m, d = _normalize_date(\n self._year,\n self._month,\n self._day + other.days * factor)\n return date(y, m, d)\n\n def __add__(self, other):\n "Add a date to a timedelta."\n if isinstance(other, timedelta):\n return self._add_timedelta(other, 1)\n return NotImplemented\n\n __radd__ = __add__\n\n def __sub__(self, other):\n """Subtract two dates, or a date and a timedelta."""\n if isinstance(other, date):\n days1 = self.toordinal()\n days2 = other.toordinal()\n return timedelta._create(days1 - days2, 0, 0, False)\n if isinstance(other, timedelta):\n return self._add_timedelta(other, -1)\n return NotImplemented\n\n def weekday(self):\n "Return day of the week, where Monday == 0 ... Sunday == 6."\n return (self.toordinal() + 6) % 7\n\n # Day-of-the-week and week-of-the-year, according to ISO\n\n def isoweekday(self):\n "Return day of the week, where Monday == 1 ... Sunday == 7."\n # 1-Jan-0001 is a Monday\n return self.toordinal() % 7 or 7\n\n def isocalendar(self):\n """Return a 3-tuple containing ISO year, week number, and weekday.\n\n The first ISO week of the year is the (Mon-Sun) week\n containing the year\'s first Thursday; everything else derives\n from that.\n\n The first week is 1; Monday is 1 ... Sunday is 7.\n\n ISO calendar algorithm taken from\n http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm\n """\n year = self._year\n week1monday = _isoweek1monday(year)\n today = _ymd2ord(self._year, self._month, self._day)\n # Internally, week and day have origin 0\n week, day = divmod(today - week1monday, 7)\n if week < 0:\n year -= 1\n week1monday = _isoweek1monday(year)\n week, day = divmod(today - week1monday, 7)\n elif week >= 52:\n if today >= _isoweek1monday(year+1):\n year += 1\n week = 0\n return year, week+1, day+1\n\n_date_class = date # so functions w/ args named "date" can get at the class\n\ndate.min = date(1, 1, 1)\ndate.max = date(9999, 12, 31)\ndate.resolution = timedelta(days=1)\n\nclass tzinfo(object):\n """Abstract base class for time zone info classes.\n\n Subclasses must override the name(), utcoffset() and dst() methods.\n """\n __slots__ = ()\n\n def tzname(self, dt):\n "datetime -> string name of time zone."\n raise NotImplementedError("tzinfo subclass must override tzname()")\n\n def utcoffset(self, dt):\n "datetime -> minutes east of UTC (negative for west of UTC)"\n raise NotImplementedError("tzinfo subclass must override utcoffset()")\n\n def dst(self, dt):\n """datetime -> DST offset in minutes east of UTC.\n\n Return 0 if DST not in effect. utcoffset() must include the DST\n offset.\n """\n raise NotImplementedError("tzinfo subclass must override dst()")\n\n def fromutc(self, dt):\n "datetime in UTC -> datetime in local time."\n\n if not isinstance(dt, datetime):\n raise TypeError("fromutc() requires a datetime argument")\n if dt.tzinfo is not self:\n raise ValueError("dt.tzinfo is not self")\n\n dtoff = dt.utcoffset()\n if dtoff is None:\n raise ValueError("fromutc() requires a non-None utcoffset() "\n "result")\n\n # See the long comment block at the end of this file for an\n # explanation of this algorithm.\n dtdst = dt.dst()\n if dtdst is None:\n raise ValueError("fromutc() requires a non-None dst() result")\n delta = dtoff - dtdst\n if delta:\n dt = dt + delta\n dtdst = dt.dst()\n if dtdst is None:\n raise ValueError("fromutc(): dt.dst gave inconsistent "\n "results; cannot convert")\n if dtdst:\n return dt + dtdst\n else:\n return dt\n\n_tzinfo_class = tzinfo\n\nclass time(object):\n """Time with time zone.\n\n Constructors:\n\n __new__()\n\n Operators:\n\n __repr__, __str__\n __cmp__, __hash__\n\n Methods:\n\n strftime()\n isoformat()\n utcoffset()\n tzname()\n dst()\n\n Properties (readonly):\n hour, minute, second, microsecond, tzinfo\n """\n __slots__ = \'_hour\', \'_minute\', \'_second\', \'_microsecond\', \'_tzinfo\', \'_hashcode\'\n\n def __new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None):\n """Constructor.\n\n Arguments:\n\n hour, minute (required)\n second, microsecond (default to zero)\n tzinfo (default to None)\n """\n hour, minute, second, microsecond = _check_time_fields(\n hour, minute, second, microsecond)\n _check_tzinfo_arg(tzinfo)\n self = object.__new__(cls)\n self._hour = hour\n self._minute = minute\n self._second = second\n self._microsecond = microsecond\n self._tzinfo = tzinfo\n self._hashcode = -1\n return self\n\n # Read-only field accessors\n @property\n def hour(self):\n """hour (0-23)"""\n return self._hour\n\n @property\n def minute(self):\n """minute (0-59)"""\n return self._minute\n\n @property\n def second(self):\n """second (0-59)"""\n return self._second\n\n @property\n def microsecond(self):\n """microsecond (0-999999)"""\n return self._microsecond\n\n @property\n def tzinfo(self):\n """timezone info object"""\n return self._tzinfo\n\n # Standard conversions, __hash__ (and helpers)\n\n # Comparisons of time objects with other.\n\n def __eq__(self, other):\n if isinstance(other, time):\n return self._cmp(other) == 0\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, time):\n return self._cmp(other) != 0\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, time):\n return self._cmp(other) <= 0\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, time):\n return self._cmp(other) < 0\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, time):\n return self._cmp(other) >= 0\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, time):\n return self._cmp(other) > 0\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, time)\n mytz = self._tzinfo\n ottz = other._tzinfo\n myoff = otoff = None\n\n if mytz is ottz:\n base_compare = True\n else:\n myoff = self._utcoffset()\n otoff = other._utcoffset()\n base_compare = myoff == otoff\n\n if base_compare:\n return _cmp((self._hour, self._minute, self._second,\n self._microsecond),\n (other._hour, other._minute, other._second,\n other._microsecond))\n if myoff is None or otoff is None:\n raise TypeError("can\'t compare offset-naive and offset-aware times")\n myhhmm = self._hour * 60 + self._minute - myoff\n othhmm = other._hour * 60 + other._minute - otoff\n return _cmp((myhhmm, self._second, self._microsecond),\n (othhmm, other._second, other._microsecond))\n\n def __hash__(self):\n """Hash."""\n if self._hashcode == -1:\n tzoff = self._utcoffset()\n if not tzoff: # zero or None\n self._hashcode = hash(self._getstate()[0])\n else:\n h, m = divmod(self.hour * 60 + self.minute - tzoff, 60)\n if 0 <= h < 24:\n self._hashcode = hash(time(h, m, self.second, self.microsecond))\n else:\n self._hashcode = hash((h, m, self.second, self.microsecond))\n return self._hashcode\n\n # Conversion to string\n\n def _tzstr(self, sep=":"):\n """Return formatted timezone offset (+xx:xx) or None."""\n off = self._utcoffset()\n if off is not None:\n if off < 0:\n sign = "-"\n off = -off\n else:\n sign = "+"\n hh, mm = divmod(off, 60)\n assert 0 <= hh < 24\n off = "%s%02d%s%02d" % (sign, hh, sep, mm)\n return off\n\n def __repr__(self):\n """Convert to formal string, for repr()."""\n if self._microsecond != 0:\n s = ", %d, %d" % (self._second, self._microsecond)\n elif self._second != 0:\n s = ", %d" % self._second\n else:\n s = ""\n module = "datetime." if self.__class__ is time else ""\n s= "%s(%d, %d%s)" % (module + self.__class__.__name__,\n self._hour, self._minute, s)\n if self._tzinfo is not None:\n assert s[-1:] == ")"\n s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"\n return s\n\n def isoformat(self):\n """Return the time formatted according to ISO.\n\n This is \'HH:MM:SS.mmmmmm+zz:zz\', or \'HH:MM:SS+zz:zz\' if\n self.microsecond == 0.\n """\n s = _format_time(self._hour, self._minute, self._second,\n self._microsecond)\n tz = self._tzstr()\n if tz:\n s += tz\n return s\n\n __str__ = isoformat\n\n def strftime(self, format):\n """Format using strftime(). The date part of the timestamp passed\n to underlying strftime should not be used.\n """\n # The year must be >= _MINYEARFMT else Python\'s strftime implementation\n # can raise a bogus exception.\n timetuple = (1900, 1, 1,\n self._hour, self._minute, self._second,\n 0, 1, -1)\n return _wrap_strftime(self, format, timetuple)\n\n def __format__(self, fmt):\n if not isinstance(fmt, (str, unicode)):\n raise ValueError("__format__ expects str or unicode, not %s" %\n fmt.__class__.__name__)\n if len(fmt) != 0:\n return self.strftime(fmt)\n return str(self)\n\n # Timezone functions\n\n def utcoffset(self):\n """Return the timezone offset in minutes east of UTC (negative west of\n UTC)."""\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(None)\n offset = _check_utc_offset("utcoffset", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _utcoffset(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(None)\n offset = _check_utc_offset("utcoffset", offset)\n return offset\n\n def tzname(self):\n """Return the timezone name.\n\n Note that the name is 100% informational -- there\'s no requirement that\n it mean anything in particular. For example, "GMT", "UTC", "-500",\n "-5:00", "EDT", "US/Eastern", "America/New York" are all valid replies.\n """\n if self._tzinfo is None:\n return None\n name = self._tzinfo.tzname(None)\n _check_tzname(name)\n return name\n\n def dst(self):\n """Return 0 if DST is not in effect, or the DST offset (in minutes\n eastward) if DST is in effect.\n\n This is purely informational; the DST offset has already been added to\n the UTC offset returned by utcoffset() if applicable, so there\'s no\n need to consult dst() unless you\'re interested in displaying the DST\n info.\n """\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(None)\n offset = _check_utc_offset("dst", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _dst(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(None)\n offset = _check_utc_offset("dst", offset)\n return offset\n\n def replace(self, hour=None, minute=None, second=None, microsecond=None,\n tzinfo=True):\n """Return a new time with new values for the specified fields."""\n if hour is None:\n hour = self.hour\n if minute is None:\n minute = self.minute\n if second is None:\n second = self.second\n if microsecond is None:\n microsecond = self.microsecond\n if tzinfo is True:\n tzinfo = self.tzinfo\n return time(hour, minute, second, microsecond, tzinfo)\n\n def __nonzero__(self):\n if self.second or self.microsecond:\n return True\n offset = self._utcoffset() or 0\n return self.hour * 60 + self.minute != offset\n\n_time_class = time # so functions w/ args named "time" can get at the class\n\ntime.min = time(0, 0, 0)\ntime.max = time(23, 59, 59, 999999)\ntime.resolution = timedelta(microseconds=1)\n\nclass datetime(date):\n """datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\n The year, month and day arguments are required. tzinfo may be None, or an\n instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n """\n __slots__ = date.__slots__ + time.__slots__\n\n def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0,\n microsecond=0, tzinfo=None):\n year, month, day = _check_date_fields(year, month, day)\n hour, minute, second, microsecond = _check_time_fields(\n hour, minute, second, microsecond)\n _check_tzinfo_arg(tzinfo)\n self = object.__new__(cls)\n self._year = year\n self._month = month\n self._day = day\n self._hour = hour\n self._minute = minute\n self._second = second\n self._microsecond = microsecond\n self._tzinfo = tzinfo\n self._hashcode = -1\n return self\n\n # Read-only field accessors\n @property\n def hour(self):\n """hour (0-23)"""\n return self._hour\n\n @property\n def minute(self):\n """minute (0-59)"""\n return self._minute\n\n @property\n def second(self):\n """second (0-59)"""\n return self._second\n\n @property\n def microsecond(self):\n """microsecond (0-999999)"""\n return self._microsecond\n\n @property\n def tzinfo(self):\n """timezone info object"""\n return self._tzinfo\n\n @classmethod\n def fromtimestamp(cls, timestamp, tz=None):\n """Construct a datetime from a POSIX timestamp (like time.time()).\n\n A timezone info object may be passed in as well.\n """\n _check_tzinfo_arg(tz)\n converter = _time.localtime if tz is None else _time.gmtime\n self = cls._from_timestamp(converter, timestamp, tz)\n if tz is not None:\n self = tz.fromutc(self)\n return self\n\n @classmethod\n def utcfromtimestamp(cls, t):\n "Construct a UTC datetime from a POSIX timestamp (like time.time())."\n return cls._from_timestamp(_time.gmtime, t, None)\n\n @classmethod\n def _from_timestamp(cls, converter, timestamp, tzinfo):\n t_full = timestamp\n timestamp = int(_math.floor(timestamp))\n frac = t_full - timestamp\n us = _round(frac * 1e6)\n\n # If timestamp is less than one microsecond smaller than a\n # full second, us can be rounded up to 1000000. In this case,\n # roll over to seconds, otherwise, ValueError is raised\n # by the constructor.\n if us == 1000000:\n timestamp += 1\n us = 0\n y, m, d, hh, mm, ss, weekday, jday, dst = converter(timestamp)\n ss = min(ss, 59) # clamp out leap seconds if the platform has them\n return cls(y, m, d, hh, mm, ss, us, tzinfo)\n\n @classmethod\n def now(cls, tz=None):\n "Construct a datetime from time.time() and optional time zone info."\n t = _time.time()\n return cls.fromtimestamp(t, tz)\n\n @classmethod\n def utcnow(cls):\n "Construct a UTC datetime from time.time()."\n t = _time.time()\n return cls.utcfromtimestamp(t)\n\n @classmethod\n def combine(cls, date, time):\n "Construct a datetime from a given date and a given time."\n if not isinstance(date, _date_class):\n raise TypeError("date argument must be a date instance")\n if not isinstance(time, _time_class):\n raise TypeError("time argument must be a time instance")\n return cls(date.year, date.month, date.day,\n time.hour, time.minute, time.second, time.microsecond,\n time.tzinfo)\n\n def timetuple(self):\n "Return local time tuple compatible with time.localtime()."\n dst = self._dst()\n if dst is None:\n dst = -1\n elif dst:\n dst = 1\n return _build_struct_time(self.year, self.month, self.day,\n self.hour, self.minute, self.second,\n dst)\n\n def utctimetuple(self):\n "Return UTC time tuple compatible with time.gmtime()."\n y, m, d = self.year, self.month, self.day\n hh, mm, ss = self.hour, self.minute, self.second\n offset = self._utcoffset()\n if offset: # neither None nor 0\n mm -= offset\n y, m, d, hh, mm, ss, _ = _normalize_datetime(\n y, m, d, hh, mm, ss, 0, ignore_overflow=True)\n return _build_struct_time(y, m, d, hh, mm, ss, 0)\n\n def date(self):\n "Return the date part."\n return date(self._year, self._month, self._day)\n\n def time(self):\n "Return the time part, with tzinfo None."\n return time(self.hour, self.minute, self.second, self.microsecond)\n\n def timetz(self):\n "Return the time part, with same tzinfo."\n return time(self.hour, self.minute, self.second, self.microsecond,\n self._tzinfo)\n\n def replace(self, year=None, month=None, day=None, hour=None,\n minute=None, second=None, microsecond=None, tzinfo=True):\n """Return a new datetime with new values for the specified fields."""\n if year is None:\n year = self.year\n if month is None:\n month = self.month\n if day is None:\n day = self.day\n if hour is None:\n hour = self.hour\n if minute is None:\n minute = self.minute\n if second is None:\n second = self.second\n if microsecond is None:\n microsecond = self.microsecond\n if tzinfo is True:\n tzinfo = self.tzinfo\n return datetime(year, month, day, hour, minute, second, microsecond,\n tzinfo)\n\n def astimezone(self, tz):\n if not isinstance(tz, tzinfo):\n raise TypeError("tz argument must be an instance of tzinfo")\n\n mytz = self.tzinfo\n if mytz is None:\n raise ValueError("astimezone() requires an aware datetime")\n\n if tz is mytz:\n return self\n\n # Convert self to UTC, and attach the new time zone object.\n myoffset = self.utcoffset()\n if myoffset is None:\n raise ValueError("astimezone() requires an aware datetime")\n utc = (self - myoffset).replace(tzinfo=tz)\n\n # Convert from UTC to tz\'s local time.\n return tz.fromutc(utc)\n\n # Ways to produce a string.\n\n def ctime(self):\n "Return ctime() style string."\n weekday = self.toordinal() % 7 or 7\n return "%s %s %2d %02d:%02d:%02d %04d" % (\n _DAYNAMES[weekday],\n _MONTHNAMES[self._month],\n self._day,\n self._hour, self._minute, self._second,\n self._year)\n\n def isoformat(self, sep=\'T\'):\n """Return the time formatted according to ISO.\n\n This is \'YYYY-MM-DD HH:MM:SS.mmmmmm\', or \'YYYY-MM-DD HH:MM:SS\' if\n self.microsecond == 0.\n\n If self.tzinfo is not None, the UTC offset is also attached, giving\n \'YYYY-MM-DD HH:MM:SS.mmmmmm+HH:MM\' or \'YYYY-MM-DD HH:MM:SS+HH:MM\'.\n\n Optional argument sep specifies the separator between date and\n time, default \'T\'.\n """\n s = ("%04d-%02d-%02d%c" % (self._year, self._month, self._day, sep) +\n _format_time(self._hour, self._minute, self._second,\n self._microsecond))\n off = self._utcoffset()\n if off is not None:\n if off < 0:\n sign = "-"\n off = -off\n else:\n sign = "+"\n hh, mm = divmod(off, 60)\n s += "%s%02d:%02d" % (sign, hh, mm)\n return s\n\n def __repr__(self):\n """Convert to formal string, for repr()."""\n L = [self._year, self._month, self._day, # These are never zero\n self._hour, self._minute, self._second, self._microsecond]\n if L[-1] == 0:\n del L[-1]\n if L[-1] == 0:\n del L[-1]\n s = ", ".join(map(str, L))\n module = "datetime." if self.__class__ is datetime else ""\n s = "%s(%s)" % (module + self.__class__.__name__, s)\n if self._tzinfo is not None:\n assert s[-1:] == ")"\n s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"\n return s\n\n def __str__(self):\n "Convert to string, for str()."\n return self.isoformat(sep=\' \')\n\n @classmethod\n def strptime(cls, date_string, format):\n \'string, format -> new datetime parsed from a string (like time.strptime()).\'\n from _strptime import _strptime\n # _strptime._strptime returns a two-element tuple. The first\n # element is a time.struct_time object. The second is the\n # microseconds (which are not defined for time.struct_time).\n struct, micros = _strptime(date_string, format)\n return cls(*(struct[0:6] + (micros,)))\n\n def utcoffset(self):\n """Return the timezone offset in minutes east of UTC (negative west of\n UTC)."""\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(self)\n offset = _check_utc_offset("utcoffset", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _utcoffset(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.utcoffset(self)\n offset = _check_utc_offset("utcoffset", offset)\n return offset\n\n def tzname(self):\n """Return the timezone name.\n\n Note that the name is 100% informational -- there\'s no requirement that\n it mean anything in particular. For example, "GMT", "UTC", "-500",\n "-5:00", "EDT", "US/Eastern", "America/New York" are all valid replies.\n """\n if self._tzinfo is None:\n return None\n name = self._tzinfo.tzname(self)\n _check_tzname(name)\n return name\n\n def dst(self):\n """Return 0 if DST is not in effect, or the DST offset (in minutes\n eastward) if DST is in effect.\n\n This is purely informational; the DST offset has already been added to\n the UTC offset returned by utcoffset() if applicable, so there\'s no\n need to consult dst() unless you\'re interested in displaying the DST\n info.\n """\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(self)\n offset = _check_utc_offset("dst", offset)\n if offset is not None:\n offset = timedelta._create(0, offset * 60, 0, True)\n return offset\n\n # Return an integer (or None) instead of a timedelta (or None).\n def _dst(self):\n if self._tzinfo is None:\n return None\n offset = self._tzinfo.dst(self)\n offset = _check_utc_offset("dst", offset)\n return offset\n\n # Comparisons of datetime objects with other.\n\n def __eq__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) == 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n return False\n\n def __ne__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) != 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n return True\n\n def __le__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) <= 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __lt__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) < 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __ge__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) >= 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def __gt__(self, other):\n if isinstance(other, datetime):\n return self._cmp(other) > 0\n elif hasattr(other, "timetuple") and not isinstance(other, date):\n return NotImplemented\n else:\n _cmperror(self, other)\n\n def _cmp(self, other):\n assert isinstance(other, datetime)\n mytz = self._tzinfo\n ottz = other._tzinfo\n myoff = otoff = None\n\n if mytz is ottz:\n base_compare = True\n else:\n if mytz is not None:\n myoff = self._utcoffset()\n if ottz is not None:\n otoff = other._utcoffset()\n base_compare = myoff == otoff\n\n if base_compare:\n return _cmp((self._year, self._month, self._day,\n self._hour, self._minute, self._second,\n self._microsecond),\n (other._year, other._month, other._day,\n other._hour, other._minute, other._second,\n other._microsecond))\n if myoff is None or otoff is None:\n raise TypeError("can\'t compare offset-naive and offset-aware datetimes")\n # XXX What follows could be done more efficiently...\n diff = self - other # this will take offsets into account\n if diff.days < 0:\n return -1\n return diff and 1 or 0\n\n def _add_timedelta(self, other, factor):\n y, m, d, hh, mm, ss, us = _normalize_datetime(\n self._year,\n self._month,\n self._day + other.days * factor,\n self._hour,\n self._minute,\n self._second + other.seconds * factor,\n self._microsecond + other.microseconds * factor)\n return datetime(y, m, d, hh, mm, ss, us, tzinfo=self._tzinfo)\n\n def __add__(self, other):\n "Add a datetime and a timedelta."\n if not isinstance(other, timedelta):\n return NotImplemented\n return self._add_timedelta(other, 1)\n\n __radd__ = __add__\n\n def __sub__(self, other):\n "Subtract two datetimes, or a datetime and a timedelta."\n if not isinstance(other, datetime):\n if isinstance(other, timedelta):\n return self._add_timedelta(other, -1)\n return NotImplemented\n\n delta_d = self.toordinal() - other.toordinal()\n delta_s = (self._hour - other._hour) * 3600 + \\\n (self._minute - other._minute) * 60 + \\\n (self._second - other._second)\n delta_us = self._microsecond - other._microsecond\n base = timedelta._create(delta_d, delta_s, delta_us, True)\n if self._tzinfo is other._tzinfo:\n return base\n myoff = self._utcoffset()\n otoff = other._utcoffset()\n if myoff == otoff:\n return base\n if myoff is None or otoff is None:\n raise TypeError("can\'t subtract offset-naive and offset-aware datetimes")\n return base + timedelta(minutes = otoff-myoff)\n\n def __hash__(self):\n if self._hashcode == -1:\n tzoff = self._utcoffset()\n if tzoff is None:\n self._hashcode = hash(self._getstate()[0])\n else:\n days = _ymd2ord(self.year, self.month, self.day)\n seconds = self.hour * 3600 + (self.minute - tzoff) * 60 + self.second\n self._hashcode = hash(timedelta(days, seconds, self.microsecond))\n return self._hashcode\n\n\n\ndatetime.min = datetime(1, 1, 1)\ndatetime.max = datetime(9999, 12, 31, 23, 59, 59, 999999)\ndatetime.resolution = timedelta(microseconds=1)\n\n\ndef _isoweek1monday(year):\n # Helper to calculate the day number of the Monday starting week 1\n # XXX This could be done more efficiently\n THURSDAY = 3\n firstday = _ymd2ord(year, 1, 1)\n firstweekday = (firstday + 6) % 7 # See weekday() above\n week1monday = firstday - firstweekday\n if firstweekday > THURSDAY:\n week1monday += 7\n return week1monday\n\n"""\nSome time zone algebra. For a datetime x, let\n x.n = x stripped of its timezone -- its naive time.\n x.o = x.utcoffset(), and assuming that doesn\'t raise an exception or\n return None\n x.d = x.dst(), and assuming that doesn\'t raise an exception or\n return None\n x.s = x\'s standard offset, x.o - x.d\n\nNow some derived rules, where k is a duration (timedelta).\n\n1. x.o = x.s + x.d\n This follows from the definition of x.s.\n\n2. If x and y have the same tzinfo member, x.s = y.s.\n This is actually a requirement, an assumption we need to make about\n sane tzinfo classes.\n\n3. The naive UTC time corresponding to x is x.n - x.o.\n This is again a requirement for a sane tzinfo class.\n\n4. (x+k).s = x.s\n This follows from #2, and that datimetimetz+timedelta preserves tzinfo.\n\n5. (x+k).n = x.n + k\n Again follows from how arithmetic is defined.\n\nNow we can explain tz.fromutc(x). Let\'s assume it\'s an interesting case\n(meaning that the various tzinfo methods exist, and don\'t blow up or return\nNone when called).\n\nThe function wants to return a datetime y with timezone tz, equivalent to x.\nx is already in UTC.\n\nBy #3, we want\n\n y.n - y.o = x.n [1]\n\nThe algorithm starts by attaching tz to x.n, and calling that y. So\nx.n = y.n at the start. Then it wants to add a duration k to y, so that [1]\nbecomes true; in effect, we want to solve [2] for k:\n\n (y+k).n - (y+k).o = x.n [2]\n\nBy #1, this is the same as\n\n (y+k).n - ((y+k).s + (y+k).d) = x.n [3]\n\nBy #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.\nSubstituting that into [3],\n\n x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving\n k - (y+k).s - (y+k).d = 0; rearranging,\n k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so\n k = y.s - (y+k).d\n\nOn the RHS, (y+k).d can\'t be computed directly, but y.s can be, and we\napproximate k by ignoring the (y+k).d term at first. Note that k can\'t be\nvery large, since all offset-returning methods return a duration of magnitude\nless than 24 hours. For that reason, if y is firmly in std time, (y+k).d must\nbe 0, so ignoring it has no consequence then.\n\nIn any case, the new value is\n\n z = y + y.s [4]\n\nIt\'s helpful to step back at look at [4] from a higher level: it\'s simply\nmapping from UTC to tz\'s standard time.\n\nAt this point, if\n\n z.n - z.o = x.n [5]\n\nwe have an equivalent time, and are almost done. The insecurity here is\nat the start of daylight time. Picture US Eastern for concreteness. The wall\ntime jumps from 1:59 to 3:00, and wall hours of the form 2:MM don\'t make good\nsense then. The docs ask that an Eastern tzinfo class consider such a time to\nbe EDT (because it\'s "after 2"), which is a redundant spelling of 1:MM EST\non the day DST starts. We want to return the 1:MM EST spelling because that\'s\nthe only spelling that makes sense on the local wall clock.\n\nIn fact, if [5] holds at this point, we do have the standard-time spelling,\nbut that takes a bit of proof. We first prove a stronger result. What\'s the\ndifference between the LHS and RHS of [5]? Let\n\n diff = x.n - (z.n - z.o) [6]\n\nNow\n z.n = by [4]\n (y + y.s).n = by #5\n y.n + y.s = since y.n = x.n\n x.n + y.s = since z and y are have the same tzinfo member,\n y.s = z.s by #2\n x.n + z.s\n\nPlugging that back into [6] gives\n\n diff =\n x.n - ((x.n + z.s) - z.o) = expanding\n x.n - x.n - z.s + z.o = cancelling\n - z.s + z.o = by #2\n z.d\n\nSo diff = z.d.\n\nIf [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time\nspelling we wanted in the endcase described above. We\'re done. Contrarily,\nif z.d = 0, then we have a UTC equivalent, and are also done.\n\nIf [5] is not true now, diff = z.d != 0, and z.d is the offset we need to\nadd to z (in effect, z is in tz\'s standard time, and we need to shift the\nlocal clock into tz\'s daylight time).\n\nLet\n\n z\' = z + z.d = z + diff [7]\n\nand we can again ask whether\n\n z\'.n - z\'.o = x.n [8]\n\nIf so, we\'re done. If not, the tzinfo class is insane, according to the\nassumptions we\'ve made. This also requires a bit of proof. As before, let\'s\ncompute the difference between the LHS and RHS of [8] (and skipping some of\nthe justifications for the kinds of substitutions we\'ve done several times\nalready):\n\n diff\' = x.n - (z\'.n - z\'.o) = replacing z\'.n via [7]\n x.n - (z.n + diff - z\'.o) = replacing diff via [6]\n x.n - (z.n + x.n - (z.n - z.o) - z\'.o) =\n x.n - z.n - x.n + z.n - z.o + z\'.o = cancel x.n\n - z.n + z.n - z.o + z\'.o = cancel z.n\n - z.o + z\'.o = #1 twice\n -z.s - z.d + z\'.s + z\'.d = z and z\' have same tzinfo\n z\'.d - z.d\n\nSo z\' is UTC-equivalent to x iff z\'.d = z.d at this point. If they are equal,\nwe\'ve found the UTC-equivalent so are done. In fact, we stop with [7] and\nreturn z\', not bothering to compute z\'.d.\n\nHow could z.d and z\'d differ? z\' = z + z.d [7], so merely moving z\' by\na dst() offset, and starting *from* a time already in DST (we know z.d != 0),\nwould have to change the result dst() returns: we start in DST, and moving\na little further into it takes us out of DST.\n\nThere isn\'t a sane case where this can happen. The closest it gets is at\nthe end of DST, where there\'s an hour in UTC with no spelling in a hybrid\ntzinfo class. In US Eastern, that\'s 5:MM UTC = 0:MM EST = 1:MM EDT. During\nthat hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM\nUTC) because the docs insist on that, but 0:MM is taken as being in daylight\ntime (4:MM UTC). There is no local time mapping to 5:MM UTC. The local\nclock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in\nstandard time. Since that\'s what the local clock *does*, we want to map both\nUTC hours 5:MM and 6:MM to 1:MM Eastern. The result is ambiguous\nin local time, but so it goes -- it\'s the way the local clock works.\n\nWhen x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,\nso z=0:MM. z.d=60 (minutes) then, so [5] doesn\'t hold and we keep going.\nz\' = z + z.d = 1:MM then, and z\'.d=0, and z\'.d - z.d = -60 != 0 so [8]\n(correctly) concludes that z\' is not UTC-equivalent to x.\n\nBecause we know z.d said z was in daylight time (else [5] would have held and\nwe would have stopped then), and we know z.d != z\'.d (else [8] would have held\nand we have stopped then), and there are only 2 possible values dst() can\nreturn in Eastern, it follows that z\'.d must be 0 (which it is in the example,\nbut the reasoning doesn\'t depend on the example -- it depends on there being\ntwo possible dst() outcomes, one zero and the other non-zero). Therefore\nz\' must be in standard time, and is the spelling we want in this case.\n\nNote again that z\' is not UTC-equivalent as far as the hybrid tzinfo class is\nconcerned (because it takes z\' as being in standard time rather than the\ndaylight time we intend here), but returning it gives the real-life "local\nclock repeats an hour" behavior when mapping the "unspellable" UTC hour into\ntz.\n\nWhen the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with\nthe 1:MM standard time spelling we want.\n\nSo how can this break? One of the assumptions must be violated. Two\npossibilities:\n\n1) [2] effectively says that y.s is invariant across all y belong to a given\n time zone. This isn\'t true if, for political reasons or continental drift,\n a region decides to change its base offset from UTC.\n\n2) There may be versions of "double daylight" time where the tail end of\n the analysis gives up a step too early. I haven\'t thought about that\n enough to say.\n\nIn any case, it\'s clear that the default fromutc() is strong enough to handle\n"almost all" time zones: so long as the standard offset is invariant, it\ndoesn\'t matter if daylight time transition points change from year to year, or\nif daylight time is skipped in some years; it doesn\'t matter how large or\nsmall dst() may get within its bounds; and it doesn\'t even matter if some\nperverse time zone returns a negative dst()). So a breaking case must be\npretty bizarre, and a tzinfo subclass can override fromutc() if it is.\n"""\n',"src/lib/dbhash.py":'raise NotImplementedError("dbhash is not yet implemented in Skulpt")\n',"src/lib/decimal.py":'raise NotImplementedError("decimal is not yet implemented in Skulpt")\n',"src/lib/difflib.py":'raise NotImplementedError("difflib is not yet implemented in Skulpt")\n',"src/lib/dircache.py":'raise NotImplementedError("dircache is not yet implemented in Skulpt")\n',"src/lib/dis.py":'raise NotImplementedError("dis is not yet implemented in Skulpt")\n',"src/lib/distutils/__init__.py":'raise NotImplementedError("distutils is not yet implemented in Skulpt")\n',"src/lib/distutils/command/__init__.py":'raise NotImplementedError("command is not yet implemented in Skulpt")\n',"src/lib/distutils/tests/__init__.py":'raise NotImplementedError("tests is not yet implemented in Skulpt")\n',"src/lib/doctest.py":'raise NotImplementedError("doctest is not yet implemented in Skulpt")\n',"src/lib/document.js":'var $builtinmodule=function(){var a,b={__name__:new Sk.builtin.str("document")};return b.getElementById=new Sk.builtin.func(function(a){var c=document.getElementById(a.v);return c?Sk.misceval.callsimArray(b.Element,[c]):Sk.builtin.none.none$}),b.createElement=new Sk.builtin.func(function(a){var c=document.createElement(a.v);if(c)return Sk.misceval.callsimArray(b.Element,[c])}),b.getElementsByTagName=new Sk.builtin.func(function(a){for(var c=document.getElementsByTagName(a.v),d=[],e=c.length-1;0<=e;e--)d.push(Sk.misceval.callsimArray(b.Element,[c[e]]));return new Sk.builtin.list(d)}),b.getElementsByClassName=new Sk.builtin.func(function(a){for(var c=document.getElementsByClassName(a.v),d=[],e=0;eb||0>c||b>=a.width||c>=a.height)throw new Sk.builtin.ValueError("Pixel index out of range.")};var i=function(a,b,c){var d;Sk.builtin.pyCheckArgsLen("setdelay",arguments.length,2,3),a.delay=Sk.ffi.remapToJs(b),d=Sk.builtin.asnum$(c),a.updateInterval=d?d:1};b.set_delay=new Sk.builtin.func(i),b.setDelay=new Sk.builtin.func(i);var j=function(a){var b,d=[];for(Sk.builtin.pyCheckArgsLen("getpixels",arguments.length,1,1),b=0;b=a.width?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,0,a.lasty,a.width,2):a.lasty+a.updateInterval>=a.height?a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,a.lastx,0,2,a.height):a.lastCtx.putImageData(a.imagedata,a.lastUlx,a.lastUly,g(b,a.lastx),g(c,a.lasty),e(f(b-a.lastx),1),e(f(c-a.lasty),1)),a.lastx=b,a.lasty=c,0e)throw new Sk.builtin.ValueError("r must be non-negative");if(this===a)return new a.constructor(f,e);else{const b=new this.constructor;return a.constructor.call(b,f,e),b}}var a={};return a.accumulate=Sk.abstr.buildIteratorClass("itertools.accumulate",{constructor:function accumulate(a,b,c){this.iter=a,this.func=b,this.total=c,this.tp$iternext=()=>(this.total=Sk.builtin.checkNone(this.total)?this.iter.tp$iternext():this.total,this.tp$iternext=this.constructor.prototype.tp$iternext,this.total)},iternext(){let a=this.iter.tp$iternext();if(void 0!==a)return this.total=Sk.misceval.callsimArray(this.func,[this.total,a]),this.total},slots:{tp$doc:"accumulate(iterable[, func, initial]) --\x3e accumulate object\\n\\nReturn series of accumulated sums (or other binary function results).",tp$new(b,c){Sk.abstr.checkArgsLen("accumulate",b,0,2);let[d,e,f]=Sk.abstr.copyKeywordsToNamedArgs("accumulate",["iterable","func","initial"],b,c,[Sk.builtin.none.none$,Sk.builtin.none.none$]);if(d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func((c,a)=>Sk.abstr.numberBinOp(c,a,"Add")):e,this===a.accumulate.prototype)return new a.accumulate(d,e,f);else{const b=new this.constructor;return a.accumulate.call(b,d,e,f),b}}}}),a.chain=Sk.abstr.buildIteratorClass("itertools.chain",{constructor:function chain(a){this.iterables=a,this.current_it=null,this.tp$iternext=()=>(this.tp$iternext=this.constructor.prototype.tp$iternext,this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)?void(this.tp$iternext=()=>void 0):(this.current_it=Sk.abstr.iter(this.current_it),this.tp$iternext())},iternext(){for(let a;void 0===a;)if(a=this.current_it.tp$iternext(),void 0===a){if(this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)return void(this.tp$iternext=()=>void 0);this.current_it=Sk.abstr.iter(this.current_it)}else return a},slots:{tp$doc:"chain(*iterables) --\x3e chain object\\n\\nReturn a chain object whose .__next__() method returns elements from the\\nfirst iterable until it is exhausted, then elements from the next\\niterable, until all of the iterables are exhausted.",tp$new(b,c){if(Sk.abstr.checkNoKwargs("chain",c),b=new Sk.builtin.tuple(b.slice(0)).tp$iter(),this===a.chain.prototype)return new a.chain(b);else{const c=new this.constructor;return a.chain.call(c,b),c}}},classmethods:{from_iterable:{$meth(b){const c=Sk.abstr.iter(b);return new a.chain(c)},$flags:{OneArg:!0},$doc:"chain.from_iterable(iterable) --\x3e chain object\\n\\nAlternate chain() constructor taking a single iterable argument\\nthat evaluates lazily.",$textsig:null}}}),a.combinations=Sk.abstr.buildIteratorClass("itertools.combinations",{constructor:function combinations(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill().map((a,b)=>b),this.n=a.length,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=a+this.n-this.r){b=!0;break}if(!b)return void(this.r=0);this.indices[a]++;for(let b=a+1;bthis.pool[a]);return new Sk.builtin.tuple(c)},slots:{tp$doc:"combinations(iterable, r) --\x3e combinations object\\n\\nReturn successive r-length combinations of elements in the iterable.\\n\\ncombinations(range(4), 3) --\x3e (0,1,2), (0,1,3), (0,2,3), (1,2,3)",tp$new(b,c){return combinationsNew.call(this,a.combinations.prototype,b,c)}}}),a.combinations_with_replacement=Sk.abstr.buildIteratorClass("itertools.combinations_with_replacement",{constructor:function combinations_with_replacement(a,b){this.pool=a,this.r=b,this.indices=Array(b).fill(0),this.n=a.length,this.tp$iternext=()=>{if(!this.r||this.n){this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map(a=>this.pool[a]);return new Sk.builtin.tuple(a)}}},iternext(){let a,b=!1;for(a=this.r-1;0<=a;a--)if(this.indices[a]!=this.n-1){b=!0;break}if(!b)return void(this.r=0);const c=this.indices[a]+1;for(let b=a;bthis.pool[a]);return new Sk.builtin.tuple(d)},slots:{tp$doc:"combinations_with_replacement(iterable, r) --\x3e combinations_with_replacement object\\n\\nReturn successive r-length combinations of elements in the iterable\\nallowing individual elements to have successive repeats.\\ncombinations_with_replacement(\'ABC\', 2) --\x3e AA AB AC BB BC CC",tp$new(b,c){return combinationsNew.call(this,a.combinations_with_replacement.prototype,b,c)}}}),a.compress=Sk.abstr.buildIteratorClass("itertools.compress",{constructor:function compress(a,b){this.data=a,this.selectors=b},iternext(){let a=this.data.tp$iternext(),b=this.selectors.tp$iternext();for(;void 0!==a&&void 0!==b;){if(Sk.misceval.isTrue(b))return a;a=this.data.tp$iternext(),b=this.selectors.tp$iternext()}},slots:{tp$doc:"compress(data, selectors) --\x3e iterator over selected data\\n\\nReturn data elements corresponding to true selector elements.\\nForms a shorter iterator from selected data elements using the\\nselectors to choose the data elements.",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs("compress",["data","selectors"],b,c,[]),d=Sk.abstr.iter(d),e=Sk.abstr.iter(e),this===a.count.prototype)return new a.compress(d,e);else{const b=new this.constructor;return a.compress.call(b,d,e),b}}}}),a.count=Sk.abstr.buildIteratorClass("itertools.count",{constructor:function count(a,b){this.start=a,this.step=b},iternext(){const a=this.start;return this.start=Sk.abstr.numberBinOp(this.start,this.step,"Add"),a},slots:{tp$doc:"count(start=0, step=1) --\x3e count object\\n\\nReturn a count object whose .__next__() method returns consecutive values.\\nEquivalent to:\\n\\n def count(firstval=0, step=1):\\n x = firstval\\n while 1:\\n yield x\\n x += step\\n",tp$new(b,c){const[d,e]=Sk.abstr.copyKeywordsToNamedArgs("count",["start","step"],b,c,[new Sk.builtin.int_(0),new Sk.builtin.int_(1)]);if(!Sk.builtin.checkNumber(d)&&!Sk.builtin.checkComplex(d))throw new Sk.builtin.TypeError("a number is required");if(!Sk.builtin.checkNumber(e)&&!Sk.builtin.checkComplex(e))throw new Sk.builtin.TypeError("a number is required");if(this===a.count.prototype)return new a.count(d,e);else{const b=new this.constructor;return a.count.call(b,d,e),b}},$r(){const a=Sk.misceval.objectRepr(this.start);let b=Sk.misceval.objectRepr(this.step);return b="1"===b?"":", "+b,new Sk.builtin.str(Sk.abstr.typeName(this)+"("+a+b+")")}}}),a.cycle=Sk.abstr.buildIteratorClass("itertools.cycle",{constructor:function cycle(a){this.iter=a,this.saved=[],this.consumed=!1,this.i=0,this.length},iternext(){let a;if(!this.consumed){if(a=this.iter.tp$iternext(),void 0!==a)return this.saved.push(a),a;if(this.consumed=!0,this.length=this.saved.length,!this.length)return}return a=this.saved[this.i],this.i=(this.i+1)%this.length,a},slots:{tp$doc:"cycle(iterable) --\x3e cycle object\\n\\nReturn elements from the iterable until it is exhausted.\\nThen repeat the sequence indefinitely.",tp$new(b,c){Sk.abstr.checkOneArg("cycle",b,c);const d=Sk.abstr.iter(b[0]);if(this===a.cycle.prototype)return new a.cycle(d);else{const b=new this.constructor;return a.cycle.call(b,d),b}}}}),a.dropwhile=Sk.abstr.buildIteratorClass("itertools.dropwhile",{constructor:function dropwhile(a,b){this.predicate=a,this.iter=b,this.passed},iternext(){let a=this.iter.tp$iternext();for(;void 0===this.passed&&void 0!==a;){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(!Sk.misceval.isTrue(b))return this.passed=!0,a;a=this.iter.tp$iternext()}return a},slots:{tp$doc:"dropwhile(predicate, iterable) --\x3e dropwhile object\\n\\nDrop items from the iterable while predicate(item) is true.\\nAfterwards, return every element until the iterable is exhausted.",tp$new(b,c){Sk.abstr.checkNoKwargs("dropwhile",c),Sk.abstr.checkArgsLen("dropwhile",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.dropwhile.prototype)return new a.dropwhile(d,e);else{const b=new this.constructor;return a.dropwhile.call(b,d,e),b}}}}),a.filterfalse=Sk.abstr.buildIteratorClass("itertools.filterfalse",{constructor:function filterfalse(a,b){this.predicate=a,this.iter=b},iternext(){let a=this.iter.tp$iternext();if(void 0!==a){for(let b=Sk.misceval.callsimArray(this.predicate,[a]);Sk.misceval.isTrue(b);){if(a=this.iter.tp$iternext(),void 0===a)return;b=Sk.misceval.callsimArray(this.predicate,[a])}return a}},slots:{tp$doc:"filterfalse(function or None, sequence) --\x3e filterfalse object\\n\\nReturn those items of sequence for which function(item) is false.\\nIf function is None, return the items that are false.",tp$new(b,c){Sk.abstr.checkNoKwargs("filterfalse",c),Sk.abstr.checkArgsLen("filterfalse",b,2,2);const d=Sk.builtin.checkNone(b[0])?Sk.builtin.bool:b[0],e=Sk.abstr.iter(b[1]);if(this===a.filterfalse.prototype)return new a.filterfalse(d,e);else{const b=new this.constructor;return a.filterfalse.call(b,d,e),b}}}}),a._grouper=Sk.abstr.buildIteratorClass("itertools._grouper",{constructor:function _grouper(a){this.groupby=a,this.tgtkey=a.tgtkey,this.id=a.id},iternext(){const a=Sk.misceval.richCompareBool(this.groupby.currkey,this.tgtkey,"Eq");if(this.groupby.id===this.id&&a){let a=this.groupby.currval;return this.groupby.currval=this.groupby.iter.tp$iternext(),void 0!==this.groupby.currval&&(this.groupby.currkey=Sk.misceval.callsimArray(this.groupby.keyf,[this.groupby.currval])),a}}}),a.groupby=Sk.abstr.buildIteratorClass("itertools.groupby",{constructor:function groupby(a,b){this.iter=a,this.keyf=b,this.currval,this.currkey=this.tgtkey=new Sk.builtin.object,this.id},iternext(){this.id={};for(let a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,"Eq");a;){if(this.currval=this.iter.tp$iternext(),void 0===this.currval)return;this.currkey=Sk.misceval.callsimArray(this.keyf,[this.currval]),a=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,"Eq")}this.tgtkey=this.currkey;const b=new a._grouper(this);return new Sk.builtin.tuple([this.currkey,b])},slots:{tp$doc:"groupby(iterable, key=None) -> make an iterator that returns consecutive\\nkeys and groups from the iterable. If the key function is not specified or\\nis None, the element itself is used for grouping.\\n",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs("groupby",["iterable","key"],b,c,[Sk.builtin.none.none$]),d=Sk.abstr.iter(d),e=Sk.builtin.checkNone(e)?new Sk.builtin.func(a=>a):e,this===a.groupby.prototype)return new a.groupby(d,e);else{const b=new this.constructor;return a.groupby.call(b,d,e),b}}}}),a.islice=Sk.abstr.buildIteratorClass("itertools.islice",{constructor:function islice(a,b,c,d){this.iter=a,this.previt=b,this.stop=c,this.step=d,this.tp$iternext=()=>{if(this.tp$iternext=this.constructor.prototype.tp$iternext,this.previt>=this.stop){for(let a=0;a=this.stop){for(let a=this.previt+1;ag||g>d)throw new Sk.builtin.ValueError("Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.");if(!(Sk.builtin.checkNone(f)||Sk.misceval.isIndex(f)))throw new Sk.builtin.ValueError("Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.");else if(f=Sk.builtin.checkNone(f)?0:Sk.misceval.asIndexSized(f),0>f||f>d)throw new Sk.builtin.ValueError("Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.");if(!(Sk.builtin.checkNone(h)||Sk.misceval.isIndex(h)))throw new Sk.builtin.ValueError("Step for islice() must be a positive integer or None");else if(h=Sk.builtin.checkNone(h)?1:Sk.misceval.asIndexSized(h),0>=h||h>d)throw new Sk.builtin.ValueError("Step for islice() must be a positive integer or None.");if(this===a.islice.prototype)return new a.islice(e,f,g,h);else{const b=new this.constructor;return a.islice.call(b,e,f,g,h),b}}}}),a.permutations=Sk.abstr.buildIteratorClass("itertools.permutations",{constructor:function permutations(a,b){this.pool=a,this.r=b;const c=a.length;this.indices=Array(c).fill().map((a,b)=>b),this.cycles=Array(b).fill().map((a,b)=>c-b),this.n=c,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(){for(let a=this.r-1;0<=a;a--)if(this.cycles[a]--,0==this.cycles[a])this.indices.push(this.indices.splice(a,1)[0]),this.cycles[a]=this.n-a;else{j=this.cycles[a],[this.indices[a],this.indices[this.n-j]]=[this.indices[this.n-j],this.indices[a]];const b=this.indices.map(a=>this.pool[a]).slice(0,this.r);return new Sk.builtin.tuple(b)}this.r=0},slots:{tp$doc:"permutations(iterable[, r]) --\x3e permutations object\\n\\nReturn successive r-length permutations of elements in the iterable.\\n\\npermutations(range(3), 2) --\x3e (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)",tp$new(b,c){let d,e;[d,e]=Sk.abstr.copyKeywordsToNamedArgs("permutations",["iterable","r"],b,c,[Sk.builtin.none.none$]);const f=Sk.misceval.arrayFromIterable(d);if(e=Sk.builtin.checkNone(e)?f.length:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),0>e)throw new Sk.builtin.ValueError("r must be non-negative");if(this===a.permutations.prototype)return new a.permutations(f,e);else{const b=new this.constructor;return a.permutations.call(b,f,e),b}}}}),a.product=Sk.abstr.buildIteratorClass("itertools.product",{constructor:function product(a){this.pools=a,this.n=a.length,this.indices=Array(a.length).fill(0),this.pool_sizes=a.map(a=>a.length),this.tp$iternext=()=>{this.tp$iternext=this.constructor.prototype.tp$iternext;const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return a.some(a=>void 0===a)?void(this.n=0):new Sk.builtin.tuple(a)}},iternext(){for(let a=this.n-1;0<=a&&a=this.pool_sizes[a]?(this.indices[a]=-1,a--):a++;if(!this.n||this.indices.every(a=>-1===a))return void(this.n=0);else{const a=this.indices.map((a,b)=>this.pools[b][this.indices[b]]);return new Sk.builtin.tuple(a)}},slots:{tp$doc:"product(*iterables, repeat=1) --\x3e product object\\n\\nCartesian product of input iterables. Equivalent to nested for-loops.\\n\\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\\nThe leftmost iterators are in the outermost for-loop, so the output tuples\\ncycle in a manner similar to an odometer (with the rightmost element changing\\non every iteration).\\n\\nTo compute the product of an iterable with itself, specify the number\\nof repetitions with the optional repeat keyword argument. For example,\\nproduct(A, repeat=4) means the same as product(A, A, A, A).\\n\\nproduct(\'ab\', range(3)) --\x3e (\'a\',0) (\'a\',1) (\'a\',2) (\'b\',0) (\'b\',1) (\'b\',2)\\nproduct((0,1), (0,1), (0,1)) --\x3e (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...",tp$new(b,c){let[d]=Sk.abstr.copyKeywordsToNamedArgs("product",["repeat"],[],c,[new Sk.builtin.int_(1)]);if(d=Sk.misceval.asIndexSized(d,Sk.builtin.OverFlowError),0>d)throw new Sk.builtin.ValueError("repeat argument cannot be negative");const e=[];for(let a=0;athis.object)},iternext(){return 0 create an iterator which returns the object\\nfor the specified number of times. If not specified, returns the object\\nendlessly.",tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs("repeat",["object","times"],b,c,[null]),e=null===e?void 0:Sk.misceval.asIndexSized(e,Sk.builtin.OverFlowError),this===a.repeat.prototype)return new a.repeat(d,e);else{const b=new this.constructor;return a.repeat.call(b,d,e),b}},$r(){return object_repr=Sk.misceval.objectRepr(this.object),times_repr=void 0===this.times?"":", "+(0<=this.times?this.times:0),new Sk.builtin.str(Sk.abstr.typeName(this)+"("+object_repr+times_repr+")")}},methods:{__lenght_hint__:{$meth(){if(void 0===this.times)throw new Sk.builtin.TypeError("len() of unsized object");return new Sk.builtin.int_(this.times)},$flags:{NoArgs:!0},$textsig:null}}}),a.starmap=Sk.abstr.buildIteratorClass("itertools.starmap",{constructor:function starmap(a,b){this.func=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0===a)return;const b=Sk.misceval.arrayFromIterable(a),c=Sk.misceval.callsimArray(this.func,b);return c},slots:{tp$new(b,c){let d,e;if([d,e]=Sk.abstr.copyKeywordsToNamedArgs("starmap",["func","iterable"],b,c,[]),e=Sk.abstr.iter(e),d=Sk.builtin.checkNone(d)?Sk.builtin.bool:d,this===a.starmap.prototype)return new a.starmap(d,e);else{const b=new this.constructor;return a.starmap.call(b,d,e),b}}}}),a.takewhile=Sk.abstr.buildIteratorClass("itertools.takewhile",{constructor:function takewhile(a,b){this.predicate=a,this.iter=b},iternext(){const a=this.iter.tp$iternext();if(void 0!==a){const b=Sk.misceval.callsimArray(this.predicate,[a]);if(Sk.misceval.isTrue(b))return a;this.tp$iternext=()=>void 0}},slots:{tp$doc:"takewhile(predicate, iterable) --\x3e takewhile object\\n\\nReturn successive entries from an iterable as long as the \\npredicate evaluates to true for each entry.",tp$new(b,c){Sk.abstr.checkNoKwargs("takewhile",c),Sk.abstr.checkArgsLen("takewhile",b,2,2);const d=b[0],e=Sk.abstr.iter(b[1]);if(this===a.takewhile.prototype)return new a.takewhile(d,e);else{const b=new this.constructor;return a.takewhile.call(b,d,e),b}}}}),a.tee=new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError("tee is not yet implemented in Skulpt")}),a.zip_longest=Sk.abstr.buildIteratorClass("itertools.zip_longest",{constructor:function zip_longest(a,b){this.iters=a,this.fillvalue=b,this.active=this.iters.length},iternext(){if(!this.active)return;let b;const c=[];for(let d=0;da?-1:1:0>1/a?-1:1,a},o=18;return Sk.abstr.setUpModuleMethods("math",l,{acos:{$meth:function acos(a){var b=Math.acos;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc cosine (measured in radians) of x."},acosh:{$meth:function acosh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a-1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic cosine of x."},asin:{$meth:function asin(a){var b=Math.asin;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc sine (measured in radians) of x."},asinh:{$meth:function asinh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const c=a+b(a*a+1);return new Sk.builtin.float_(e(c))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic sine of x."},atan:{$meth:function atan(a){var b=Math.atan;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc tangent (measured in radians) of x."},atan2:{$meth:function atan2(a,b){var c=Math.atan2;return Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(b)),new Sk.builtin.float_(c(Sk.builtin.asnum$(a),Sk.builtin.asnum$(b)))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, y, x, /)",$doc:"Return the arc tangent (measured in radians) of y/x.\\n\\nUnlike atan(y/x), the signs of both x and y are considered."},atanh:{$meth:function atanh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=(1+a)/(1-a);return new Sk.builtin.float_(e(b)/2)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic tangent of x."},ceil:{$meth:function ceil(a){var b=Math.ceil;Sk.builtin.pyCheckType("","real number",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);return Sk.__future__.ceil_floor_int?new Sk.builtin.int_(b(c)):new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the ceiling of x as an Integral.\\n\\nThis is the smallest integer >= x."},copysign:{$meth:function copysign(a,b){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(b));const c=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(a),e=n(d),f=n(c);return new Sk.builtin.float_(d*(e*f))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return a float with the magnitude (absolute value) of x but the sign of y.\\n\\nOn platforms that support signed zeros, copysign(1.0, -0.0)\\nreturns -1.0.\\n"},cos:{$meth:function cos(a){var b=Math.cos;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the cosine of x (measured in radians)."},cosh:{$meth:function cosh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b+1/b)/2)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic cosine of x."},degrees:{$meth:function degrees(b){Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(b));const c=180/a*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Convert angle x from radians to degrees."},erf:{$meth:function erf(){throw new Sk.builtin.NotImplementedError("math.erf() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Error function at x."},erfc:{$meth:function erfc(){throw new Sk.builtin.NotImplementedError("math.erfc() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Complementary error function at x."},exp:{$meth:function exp(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));let b=a.v;if("number"!=typeof b&&(b=a.nb$float().v),b==1/0||b==-Infinity||isNaN(b))return new Sk.builtin.float_(f(b));const c=f(b);if(!isFinite(c))throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return e raised to the power of x."},expm1:{$meth:function expm1(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(.7>k(b)){const a=f(b);if(1==a)return new Sk.builtin.float_(b);else{const c=(a-1)*b/e(a);return new Sk.builtin.float_(c)}}else{const a=f(b)-1;return new Sk.builtin.float_(a)}},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return exp(x)-1.\\n\\nThis function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x."},fabs:{$meth:function fabs(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));let b=a.v;return JSBI.__isBigInt(b)&&(b=a.nb$float().v),b=k(b),new Sk.builtin.float_(b)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the absolute value of the float x."},factorial:{$meth:function factorial(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));let b=Sk.builtin.asnum$(a);if(a=j(b),a!=b)throw new Sk.builtin.ValueError("factorial() only accepts integral values");if(0>a)throw new Sk.builtin.ValueError("factorial() not defined for negative numbers");let c=1;for(let b=2;b<=a&&b<=o;b++)c*=b;if(a<=o)return new Sk.builtin.int_(c);c=JSBI.BigInt(c);for(let b=19;b<=a;b++)c=JSBI.multiply(c,JSBI.BigInt(b));return new Sk.builtin.int_(c)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Find x!.\\n\\nRaise a ValueError if x is negative or non-integral."},floor:{$meth:function floor(a){return Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.__future__.ceil_floor_int?new Sk.builtin.int_(j(Sk.builtin.asnum$(a))):new Sk.builtin.float_(j(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the floor of x as an Integral.\\n\\nThis is the largest integer <= x."},fmod:{$meth:function fmod(a,b){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(b));let c=a.v,d=b.v;if("number"!=typeof c&&(c=a.nb$float().v),"number"!=typeof d&&(d=b.nb$float().v),(d==1/0||d==-Infinity)&&isFinite(c))return new Sk.builtin.float_(c);const e=c%d;if(isNaN(e)&&!isNaN(c)&&!isNaN(d))throw new Sk.builtin.ValueError("math domain error");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return fmod(x, y), according to platform C.\\n\\nx % y may differ."},frexp:{$meth:function frexp(a){var b=Math.max;Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a),d=[c,0];if(0!==c&&i(c)){const a=k(c);let e=b(-1023,j(h(a))+1),f=a*g(2,-e);for(;.5>f;)f*=2,e--;for(;1<=f;)f*=.5,e++;0>c&&(f=-f),d[0]=f,d[1]=e}return d[0]=new Sk.builtin.float_(d[0]),d[1]=new Sk.builtin.int_(d[1]),new Sk.builtin.tuple(d)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the mantissa and exponent of x, as pair (m, e).\\n\\nm is a float and e is an int, such that x = m * 2.**e.\\nIf x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0."},fsum:{$meth:function fsum(a){if(!Sk.builtin.checkIterable(a))throw new Sk.builtin.TypeError("\'"+Sk.abstr.typeName(a)+"\' object is not iterable");let b=[];a=Sk.abstr.iter(a);let c,d,e;for(let f=a.tp$iternext();void 0!==f;f=a.tp$iternext()){Sk.builtin.pyCheckType("","real number",Sk.builtin.checkNumber(f)),c=0;let a=f.v;"number"!=typeof a&&(a=f.nb$float().v),f=a;for(let a,g=0,h=b.length;gb?-b:b,new Sk.builtin.int_(b)):(d=JSBI.BigInt(d),e=JSBI.BigInt(e),b=_biggcd(d,e),JSBI.lessThan(b,JSBI.__ZERO)&&(b=JSBI.multiply(b,JSBI.BigInt(-1))),new Sk.builtin.int_(b.toString()))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"greatest common divisor of x and y"},hypot:{$meth:function hypot(a,c){return Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(c)),a=Sk.builtin.asnum$(a),c=Sk.builtin.asnum$(c),new Sk.builtin.float_(b(a*a+c*c))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return the Euclidean distance, sqrt(x*x + y*y)."},isclose:{$meth:function isclose(c,d){Sk.abstr.checkArgsLen("isclose",c,2,2),rel_abs_vals=Sk.abstr.copyKeywordsToNamedArgs("isclose",["rel_tol","abs_tol"],[],d,[new Sk.builtin.float_(1e-9),new Sk.builtin.float_(0)]);const e=c[0],a=c[1],b=rel_abs_vals[0],f=rel_abs_vals[1];Sk.builtin.pyCheckType("a","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("b","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("rel_tol","number",Sk.builtin.checkNumber(b)),Sk.builtin.pyCheckType("abs_tol","number",Sk.builtin.checkNumber(f));const g=Sk.builtin.asnum$(e),h=Sk.builtin.asnum$(a),i=Sk.builtin.asnum$(b),j=Sk.builtin.asnum$(f);if(0>i||0>j)throw new Sk.builtin.ValueError("tolerances must be non-negative");if(g==h)return Sk.builtin.bool.true$;if(g==1/0||g==-Infinity||h==1/0||h==-Infinity)return Sk.builtin.bool.false$;const l=k(h-g),m=l<=k(i*h)||l<=k(i*g)||l<=j;return new Sk.builtin.bool(m)},$flags:{FastCall:!0},$textsig:"($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)",$doc:"Determine whether two floating point numbers are close in value.\\n\\n rel_tol\\n maximum difference for being considered \\"close\\", relative to the\\n magnitude of the input values\\n abs_tol\\n maximum difference for being considered \\"close\\", regardless of the\\n magnitude of the input values\\n\\nReturn True if a is close in value to b, and False otherwise.\\n\\nFor the values to be considered close, the difference between them\\nmust be smaller than at least one of the tolerances.\\n\\n-inf, inf and NaN behave similarly to the IEEE 754 Standard. That\\nis, NaN is not close to anything, even itself. inf and -inf are\\nonly close to themselves."},isfinite:{$meth:function isfinite(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.true$:isFinite(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return True if x is neither an infinity nor a NaN, and False otherwise."},isinf:{$meth:function isinf(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return Sk.builtin.checkInt(a)?Sk.builtin.bool.false$:isFinite(b)||isNaN(b)?Sk.builtin.bool.false$:Sk.builtin.bool.true$},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return True if x is a positive or negative infinity, and False otherwise."},isnan:{$meth:function isnan(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);return isNaN(b)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return True if x is a NaN (not a number), and False otherwise."},ldexp:{$meth:function ldexp(a,b){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("i","integer",Sk.builtin.checkInt(b));let c=a.v;"number"!=typeof c&&(c=a.nb$float().v);const d=Sk.builtin.asnum$(b);if(c==1/0||c==-Infinity||0==c||isNaN(c))return a;const e=c*g(2,d);if(!isFinite(e))throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(e)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, i, /)",$doc:"Return x * (2**i).\\n\\nThis is essentially the inverse of frexp()."},lgamma:{$meth:function lgamma(){throw new Sk.builtin.NotImplementedError("math.lgamma() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Natural logarithm of absolute value of Gamma function at x."},log:{$meth:function log(a,b){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));let f,g,h=Sk.builtin.asnum$(a);if(0>=h)throw new Sk.builtin.ValueError("math domain error");if(void 0===b?f=d:(Sk.builtin.pyCheckType("base","number",Sk.builtin.checkNumber(b)),f=Sk.builtin.asnum$(b)),0>=f)throw new Sk.builtin.ValueError("math domain error");else if(Sk.builtin.checkFloat(a)||he)throw new Sk.builtin.ValueError("math domain error");else if(Sk.builtin.checkFloat(a)||e=c)throw new Sk.builtin.ValueError("math domain error");else{if(0==c)return new Sk.builtin.float_(c);if(k(c)=c){const a=1+c,b=e(a)-(a-1-c)/a;return new Sk.builtin.float_(b)}else{const a=e(1+c);return new Sk.builtin.float_(a)}}},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the natural logarithm of 1+x (base e).\\n\\nThe result is computed in a way which is accurate for x near zero."},log2:{$meth:function log2(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));let b,d=Sk.builtin.asnum$(a);if(0>d)throw new Sk.builtin.ValueError("math domain error");else if(Sk.builtin.checkFloat(a)||de)throw new Sk.builtin.ValueError("math domain error");else{if(1==d)return new Sk.builtin.float_(1);if(i(d)&&i(e)&&0>d&&!c(e))throw new Sk.builtin.ValueError("math domain error");else if(-1==d&&(e==-Infinity||e==1/0))return new Sk.builtin.float_(1)}const f=g(d,e);if(!i(d)||!i(e))return new Sk.builtin.float_(f);if(f==1/0||f==-Infinity)throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(f)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return x**y (x to the power of y)."},radians:{$meth:function radians(b){Sk.builtin.pyCheckType("deg","number",Sk.builtin.checkNumber(b));const c=a/180*Sk.builtin.asnum$(b);return new Sk.builtin.float_(c)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Convert angle x from degrees to radians."},remainder:{$meth:function remainder(a,b){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(b));let d=a.v,e=b.v;if("number"!=typeof d&&(d=a.nb$float().v),"number"!=typeof e&&(e=b.nb$float().v),isFinite(d)&&isFinite(e)){let a,b,f,c,g;if(0==e)throw new Sk.builtin.ValueError("math domain error");if(a=k(d),b=k(e),c=a%b,f=b-c,cf)g=-f;else{if(c!=f)throw new Sk.builtin.AssertionError;g=c-2*(.5*(a-c)%b)}return new Sk.builtin.float_(n(d)*g)}if(isNaN(d))return a;if(isNaN(e))return b;if(d==1/0||d==-Infinity)throw new Sk.builtin.ValueError("math domain error");if(e!=1/0&&e!=-Infinity)throw new Sk.builtin.AssertionError;return new Sk.builtin.float_(d)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Difference between x and the closest integer multiple of y.\\n\\nReturn x - n*y where n*y is the closest integer multiple of y.\\nIn the case where x is exactly halfway between two multiples of\\ny, the nearest even value of n is used. The result is always exact."},sin:{$meth:function sin(a){var b=Math.sin;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the sine of x (measured in radians)."},sinh:{$meth:function sinh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),a=Sk.builtin.asnum$(a);const b=g(d,a);return new Sk.builtin.float_((b-1/b)/2)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic sine of x."},sqrt:{$meth:function sqrt(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const c=Sk.builtin.asnum$(a);if(0>c)throw new Sk.builtin.ValueError("math domain error");return new Sk.builtin.float_(b(c))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the square root of x."},tan:{$meth:function tan(a){var b=Math.tan;return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(a)),new Sk.builtin.float_(b(Sk.builtin.asnum$(a)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the tangent of x (measured in radians)."},tanh:{$meth:function tanh(a){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a));const b=Sk.builtin.asnum$(a);if(0===b)return new Sk.builtin.float_(b);const c=g(d,b),e=1/c;return new Sk.builtin.float_((c-e)/2/((c+e)/2))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic tangent of x."},trunc:{$meth:function trunc(a){return Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(a)),Sk.builtin.checkInt(a)?a:new Sk.builtin.int_(0|Sk.builtin.asnum$(a))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Truncates the Real x to the nearest Integral toward 0.\\n\\nUses the __trunc__ magic method."}}),l};',"src/lib/md5.py":'raise NotImplementedError("md5 is not yet implemented in Skulpt")\n',"src/lib/mhlib.py":'raise NotImplementedError("mhlib is not yet implemented in Skulpt")\n',"src/lib/mimetools.py":'raise NotImplementedError("mimetools is not yet implemented in Skulpt")\n',"src/lib/mimetypes.py":'raise NotImplementedError("mimetypes is not yet implemented in Skulpt")\n',"src/lib/mimify.py":'raise NotImplementedError("mimify is not yet implemented in Skulpt")\n',"src/lib/modulefinder.py":'raise NotImplementedError("modulefinder is not yet implemented in Skulpt")\n',"src/lib/multifile.py":'raise NotImplementedError("multifile is not yet implemented in Skulpt")\n',"src/lib/multiprocessing/__init__.py":'raise NotImplementedError("multiprocessing is not yet implemented in Skulpt")\n',"src/lib/multiprocessing/dummy/__init__.py":'raise NotImplementedError("dummy is not yet implemented in Skulpt")\n',"src/lib/mutex.py":'raise NotImplementedError("mutex is not yet implemented in Skulpt")\n',"src/lib/netrc.py":'raise NotImplementedError("netrc is not yet implemented in Skulpt")\n',"src/lib/new.py":'raise NotImplementedError("new is not yet implemented in Skulpt")\n',"src/lib/nntplib.py":'raise NotImplementedError("nntplib is not yet implemented in Skulpt")\n',"src/lib/ntpath.py":'raise NotImplementedError("ntpath is not yet implemented in Skulpt")\n',"src/lib/nturl2path.py":'raise NotImplementedError("nturl2path is not yet implemented in Skulpt")\n',"src/lib/numbers.py":"Number = (int, float, complex)\nIntegral = int\nComplex = complex\n","src/lib/opcode.py":'raise NotImplementedError("opcode is not yet implemented in Skulpt")\n',"src/lib/operator.js":'function $builtinmodule(){return operator={__name__:new Sk.builtin.str("operator"),__doc__:new Sk.builtin.str("Operator interface.\\n\\nThis module exports a set of functions implemented in javascript corresponding\\nto the intrinsic operators of Python. For example, operator.add(x, y)\\nis equivalent to the expression x+y. The function names are those\\nused for special methods; variants without leading and trailing\\n\'__\' are also provided for convenience."),__all__:new Sk.builtin.list(["abs","add","and_","attrgetter","concat","contains","countOf","delitem","eq","floordiv","ge","getitem","gt","iadd","iand","iconcat","ifloordiv","ilshift","imatmul","imod","imul","index","indexOf","inv","invert","ior","ipow","irshift","is_","is_not","isub","itemgetter","itruediv","ixor","le","length_hint","lshift","lt","matmul","methodcaller","mod","mul","ne","neg","not_","or_","pos","pow","rshift","setitem","sub","truediv","truth","xor"].map(a=>new Sk.builtin.str(a)))},operator.itemgetter=Sk.abstr.buildNativeClass("operator.itemgetter",{constructor:function itemgetter(a){this.items=a,this.oneitem=1===a.length,this.item=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){return Sk.abstr.checkNoKwargs("itemgetter",b),Sk.abstr.checkArgsLen("itemgetter",a,1),new operator.itemgetter(a)},tp$call(a,b){Sk.abstr.checkNoKwargs("itemgetter",b),Sk.abstr.checkArgsLen("itemgetter",a,1,1);const c=a[0];return this.oneitem?Sk.abstr.objectGetItem(c,this.item,!0):new Sk.builtin.tuple(this.items.map(a=>Sk.abstr.objectGetItem(c,a)))},tp$doc:"Return a callable object that fetches the given item(s) from its operand.\\n After f = itemgetter(2), the call f(r) returns r[2].\\n After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+"(...)");this.in$repr=!0;const a=this.tp$name+"("+this.items.map(a=>Sk.misceval.objectRepr(a)).join(", ")+")";return this.in$repr=!1,a}}}),operator.attrgetter=Sk.abstr.buildNativeClass("operator.attrgetter",{constructor:function attrgetter(a){this.attrs=a,this.oneattr=1===a.length,this.attr=a[0],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkNoKwargs("attrgetter",b),Sk.abstr.checkArgsLen("attrgetter",a,1);const c=[];for(let d=0;dnew Sk.builtin.str(a))):c.push([b])}return new operator.attrgetter(c)},tp$call(a,b){Sk.abstr.checkNoKwargs("attrgetter",b),Sk.abstr.checkArgsLen("attrgetter",a,1,1);const c=a[0];if(this.oneattr)return this.attr.reduce((a,b)=>Sk.abstr.gattr(a,b),c);const d=this.attrs.map(a=>a.reduce((a,b)=>Sk.abstr.gattr(a,b),c));return new Sk.builtin.tuple(d)},tp$doc:"attrgetter(attr, ...) --\x3e attrgetter object\\n\\nReturn a callable object that fetches the given attribute(s) from its operand.\\nAfter f = attrgetter(\'name\'), the call f(r) returns r.name.\\nAfter g = attrgetter(\'name\', \'date\'), the call g(r) returns (r.name, r.date).\\nAfter h = attrgetter(\'name.first\', \'name.last\'), the call h(r) returns\\n(r.name.first, r.name.last).",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+"(...)");this.in$repr=!0;const a=this.tp$name+"("+this.items.map(a=>Sk.misceval.objectRepr(a)).join(", ")+")";return this.in$repr=!1,a}}}),operator.methodcaller=Sk.abstr.buildNativeClass("operator.methodcaller",{constructor:function methodcaller(a,b,c){this.$name=a,this.args=b,this.kwargs=c||[],this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$new(a,b){Sk.abstr.checkArgsLen("methodcaller",a,1);const c=a[0];if(!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("method name must be a string");return new operator.methodcaller(c,a.slice(1),b)},tp$call(a,b){Sk.abstr.checkNoKwargs("methodcaller",b),Sk.abstr.checkArgsLen("methodcaller",a,1,1);const c=a[0];return Sk.misceval.chain(Sk.abstr.gattr(c,this.$name,!0),a=>Sk.misceval.callsimOrSuspendArray(a,this.args,this.kwargs))},tp$doc:"methodcaller(name, ...) --\x3e methodcaller object\\n\\nReturn a callable object that calls the given method on its operand.\\nAfter f = methodcaller(\'name\'), the call f(r) returns r.name().\\nAfter g = methodcaller(\'name\', \'date\', foo=1), the call g(r) returns\\nr.name(\'date\', foo=1).",$r(){if(this.in$repr)return new Sk.builtin.str(this.tp$name+"(...)");this.in$repr=!0;let a=[Sk.misceval.objectRepr(this.$name),...this.args.map(a=>Sk.misceval.objectRepr(a))];for(let b=0;b= b."},gt:{$meth:function gt(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,"Gt"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a > b."},not_:{$meth:function not_(a){return Sk.abstr.numberUnaryOp(a,"Not")},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as not a."},truth:{$meth:function truth(a){return Sk.builtin.bool(a)},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Return True if a is true, False otherwise."},is_:{$meth:function is_(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,"Is"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a is b."},is_not:{$meth:function is_not(c,a){return Sk.builtin.bool(Sk.misceval.richCompareBool(c,a,"IsNot"))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a is not b."},abs:{$meth:function abs(a){return Sk.builtin.abs(a)},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as abs(a)."},add:{$meth:function add(c,a){return Sk.abstr.numberBinOp(c,a,"Add")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a + b."},and_:{$meth:function and_(c,a){return Sk.abstr.numberBinOp(c,a,"BitAnd")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a & b."},floordiv:{$meth:function floordiv(c,a){return Sk.abstr.numberBinOp(c,a,"FloorDiv")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a // b."},index:{$meth:function index(b){return new Sk.builtin.int_(Sk.misceval.asIndexOrThrow(b))},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as a.__index__()"},inv:{$meth:function inv(a){return Sk.abstr.numberUnaryOp(a,"Invert")},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as ~a."},invert:{$meth:function invert(a){return Sk.abstr.numberUnaryOp(a,"Invert")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, /)",$doc:"Same as ~a."},lshift:{$meth:function lshift(c,a){return Sk.abstr.numberBinOp(c,a,"LShift")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a << b."},mod:{$meth:function mod(c,a){return Sk.abstr.numberBinOp(c,a,"Mod")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a % b."},mul:{$meth:function mul(c,a){return Sk.abstr.numberBinOp(c,a,"Mult")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a * b."},matmul:{$meth:function matmul(c,a){return Sk.abstr.numberBinOp(c,a,"MatMult")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a @ b."},neg:{$meth:function neg(a){return Sk.abstr.numberUnaryOp(a,"USub")},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as -a."},or_:{$meth:function or_(c,a){return Sk.abstr.numberBinOp(c,a,"BitOr")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a | b."},pos:{$meth:function pos(a){return Sk.abstr.numberUnaryOp(a,"UAdd")},$flags:{OneArg:!0},$textsig:"($module, a, /)",$doc:"Same as +a."},pow:{$meth:function pow(c,a){return Sk.abstr.numberBinOp(c,a,"Pow")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a ** b."},rshift:{$meth:function rshift(c,a){return Sk.abstr.numberBinOp(c,a,"RShift")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a >> b."},sub:{$meth:function sub(c,a){return Sk.abstr.numberBinOp(c,a,"Sub")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a - b."},truediv:{$meth:function div(c,a){return Sk.abstr.numberBinOp(c,a,"Div")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a / b."},xor:{$meth:function xor(c,a){return Sk.abstr.numberBinOp(c,a,"BitXor")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a ^ b."},concat:{$meth:function concat(c,a){return Sk.abstr.sequenceConcat(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a + b, for a and b sequences."},contains:{$meth:function contains(c,a){return Sk.builtin.bool(Sk.abstr.sequenceContains(c,a))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as b in a (note reversed operands)."},countOf:{$meth:function countOf(c,a){return Sk.abstr.sequenceGetCountOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Return the number of times b occurs in a."},delitem:{$meth:function delitem(c,a){return Sk.misceval.chain(Sk.abstr.objectDelItem(c,a,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as del a[b]."},getitem:{$meth:function getitem(c,a){return Sk.abstr.objectGetItem(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a[b]."},indexOf:{$meth:function indexOf(c,a){return Sk.abstr.sequenceGetIndexOf(c,a)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Return the first index of b in a."},setitem:{$meth:function setitem(d,a,b){return Sk.misceval.chain(Sk.abstr.objectSetItem(d,a,b,!0),()=>Sk.builtin.none.none$)},$flags:{MinArgs:3,MaxArgs:3},$textsig:"($module, a, b, c, /)",$doc:"Same as a[b] = c."},length_hint:{$meth:function length_hint(a,b){if(void 0===b)b=new Sk.builtin.int_(0);else if(!Sk.builtin.checkInt(b))throw new Sk.builtin.TypeError("\'"+Sk.abstr.typeName(b)+"\' object cannot be interpreted as an integer");try{return Sk.builtin.len(a)}catch(a){if(!(a instanceof Sk.builtin.TypeError))throw a}const c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$length_hint);if(void 0!==c){const a=Sk.misceval.callsimArray(c,[]);if(a===Sk.builtin.NotImplemented.NotImplemented$)return b;if(!Sk.builtin.checkInteger(a))throw new Sk.builtin.TypeError("__length_hint__ must be an integer, not "+Sk.abstr.typeName(a));else if(a.nb$isnegative())throw new Sk.builtin.TypeError("__length_hint__() should return >= 0");return a}return b},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, obj, default=0, /)",$doc:"Return an estimate of the number of items in obj.\\n\\nThis is useful for presizing containers when building from an iterable.\\n\\nIf the object supports len(), the result will be exact.\\nOtherwise, it may over- or under-estimate by an arbitrary amount.\\nThe result will be an integer >= 0."},iadd:{$meth:function iadd(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Add")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a += b."},iand:{$meth:function iand(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"BitAnd")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a &= b."},iconcat:{$meth:function iconcat(c,a){if(void 0!==c.sq$inplace_concat)return c.sq$inplace_concat(a);if(void 0!==c.sq$concat)return c.sq$concat(a);if(!Sk.builtin.checkSequence(c)||!Sk.builtin.checkSequence(a))throw new Sk.builtin.TypeError(Sk.abstr.typeName(c)+" object can\'t be concatenated");return Sk.abstr.numberInplaceBinOp(c,a,"Add")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a += b, for a and b sequences."},ifloordiv:{$meth:function ifloordiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"FloorDiv")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a //= b."},ilshift:{$meth:function ilshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"LShift")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a <<= b."},imod:{$meth:function imod(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Mod")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a %= b."},imul:{$meth:function imul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Mult")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a *= b."},imatmul:{$meth:function imatmul(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"MatMult")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a @= b."},ior:{$meth:function ior(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"BitOr")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a |= b."},ipow:{$meth:function ipow(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Pow")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a **= b."},irshift:{$meth:function irshift(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"LRhift")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a >>= b."},isub:{$meth:function isub(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Sub")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a -= b."},itruediv:{$meth:function idiv(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"Div")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a /= b."},ixor:{$meth:function ixor(c,a){return Sk.abstr.numberInplaceBinOp(c,a,"BitXor")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, a, b, /)",$doc:"Same as a ^= b."}}),Object.assign(operator,{__abs__:operator.abs,__add__:operator.add,__and__:operator.and,__concat__:operator.concat,__contains__:operator.contains,__delitem__:operator.delitem,__eq__:operator.eq,__floordiv__:operator.floordiv,__ge__:operator.ge,__getitem__:operator.getitem,__gt__:operator.gt,__iadd__:operator.iadd,__iand__:operator.iand,__iconcat__:operator.iconcat,__ifloordiv__:operator.ifloordiv,__ilshift__:operator.ilshift,__imatmul__:operator.imatmul,__imod__:operator.imod,__imul__:operator.imul,__index__:operator.index,__inv__:operator.inv,__invert__:operator.invert,__ior__:operator.ior,__ipow__:operator.ipow,__irshift__:operator.irshift,__isub__:operator.isub,__itruediv__:operator.itruediv,__ixor__:operator.ixor,__le__:operator.le,__lshift__:operator.lshift,__lt__:operator.lt,__matmul__:operator.matmul,__mod__:operator.mod,__mul__:operator.mul,__ne__:operator.ne,__neg__:operator.neg,__not__:operator.not,__or__:operator.or,__pos__:operator.pos,__pow__:operator.pow,__rshift__:operator.rshift,__setitem__:operator.setitem,__sub__:operator.sub,__truediv__:operator.truediv,__xor__:operator.xor,_abs:Sk.builtins.abs,div:operator.truediv,__div__:operator.truediv}),operator}',"src/lib/optparse.py":'raise NotImplementedError("optparse is not yet implemented in Skulpt")\n',"src/lib/os.py":'raise NotImplementedError("os is not yet implemented in Skulpt")\n',"src/lib/os2emxpath.py":'raise NotImplementedError("os2emxpath is not yet implemented in Skulpt")\n',"src/lib/pdb.py":'raise NotImplementedError("pdb is not yet implemented in Skulpt")\n',"src/lib/pickle.py":'raise NotImplementedError("pickle is not yet implemented in Skulpt")\n',"src/lib/pickletools.py":'raise NotImplementedError("pickletools is not yet implemented in Skulpt")\n',"src/lib/pipes.py":'raise NotImplementedError("pipes is not yet implemented in Skulpt")\n',"src/lib/pkgutil.py":'raise NotImplementedError("pkgutil is not yet implemented in Skulpt")\n',"src/lib/platform.js":'var $builtinmodule=function(){var a={},b="undefined"!=typeof window&&"undefined"!=typeof window.navigator;return a.python_implementation=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen("python_implementation",arguments.length,0,0),new Sk.builtin.str("Skulpt")}),a.node=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen("node",arguments.length,0,0),new Sk.builtin.str("")}),a.version=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen("version",arguments.length,0,0),new Sk.builtin.str("")}),a.python_version=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen("python_version",arguments.length,0,0),a=Sk.__future__.python_version?"3.2.0":"2.7.0",new Sk.builtin.str(a)}),a.system=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen("system",arguments.length,0,0),a=b?window.navigator.appCodeName:"",new Sk.builtin.str(a)}),a.machine=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen("machine",arguments.length,0,0),a=b?window.navigator.platform:"",new Sk.builtin.str(a)}),a.release=new Sk.builtin.func(function(){var a;return Sk.builtin.pyCheckArgsLen("release",arguments.length,0,0),a=b?window.navigator.appVersion:"",new Sk.builtin.str(a)}),a.architecture=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen("architecture",arguments.length,0,0),new Sk.builtin.tuple([new Sk.builtin.str("64bit"),new Sk.builtin.str("")])}),a.processor=new Sk.builtin.func(function(){return Sk.builtin.pyCheckArgsLen("processor",arguments.length,0,0),new Sk.builtin.str("")}),a};',"src/lib/platform.py":'raise NotImplementedError("platform is not yet implemented in Skulpt")\n',"src/lib/plistlib.py":'raise NotImplementedError("plistlib is not yet implemented in Skulpt")\n',"src/lib/popen2.py":'raise NotImplementedError("popen2 is not yet implemented in Skulpt")\n',"src/lib/poplib.py":'raise NotImplementedError("poplib is not yet implemented in Skulpt")\n',"src/lib/posixfile.py":'raise NotImplementedError("posixfile is not yet implemented in Skulpt")\n',"src/lib/posixpath.py":'raise NotImplementedError("posixpath is not yet implemented in Skulpt")\n',"src/lib/pprint.py":'raise NotImplementedError("pprint is not yet implemented in Skulpt")\n',"src/lib/processing.js":'var $builtinmodule=function(){var b,c,d,e,f,g,h,a=Math.PI,j={__name__:new Sk.builtin.str("processing")},k=[],l=!0,m=null;return j.processing=null,j.p=null,j.X=new Sk.builtin.int_(0),j.Y=new Sk.builtin.int_(1),j.Z=new Sk.builtin.int_(2),j.R=new Sk.builtin.int_(3),j.G=new Sk.builtin.int_(4),j.B=new Sk.builtin.int_(5),j.A=new Sk.builtin.int_(6),j.U=new Sk.builtin.int_(7),j.V=new Sk.builtin.int_(8),j.NX=new Sk.builtin.int_(9),j.NY=new Sk.builtin.int_(10),j.NZ=new Sk.builtin.int_(11),j.EDGE=new Sk.builtin.int_(12),j.SR=new Sk.builtin.int_(13),j.SG=new Sk.builtin.int_(14),j.SB=new Sk.builtin.int_(15),j.SA=new Sk.builtin.int_(16),j.SW=new Sk.builtin.int_(17),j.TX=new Sk.builtin.int_(18),j.TY=new Sk.builtin.int_(19),j.TZ=new Sk.builtin.int_(20),j.VX=new Sk.builtin.int_(21),j.VY=new Sk.builtin.int_(22),j.VZ=new Sk.builtin.int_(23),j.VW=new Sk.builtin.int_(24),j.AR=new Sk.builtin.int_(25),j.AG=new Sk.builtin.int_(26),j.AB=new Sk.builtin.int_(27),j.DR=new Sk.builtin.int_(3),j.DG=new Sk.builtin.int_(4),j.DB=new Sk.builtin.int_(5),j.DA=new Sk.builtin.int_(6),j.SPR=new Sk.builtin.int_(28),j.SPG=new Sk.builtin.int_(29),j.SPB=new Sk.builtin.int_(30),j.SHINE=new Sk.builtin.int_(31),j.ER=new Sk.builtin.int_(32),j.EG=new Sk.builtin.int_(33),j.EB=new Sk.builtin.int_(34),j.BEEN_LIT=new Sk.builtin.int_(35),j.VERTEX_FIELD_COUNT=new Sk.builtin.int_(36),j.CENTER=new Sk.builtin.int_(3),j.RADIUS=new Sk.builtin.int_(2),j.CORNERS=new Sk.builtin.int_(1),j.CORNER=new Sk.builtin.int_(0),j.DIAMETER=new Sk.builtin.int_(3),j.BASELINE=new Sk.builtin.int_(0),j.TOP=new Sk.builtin.int_(101),j.BOTTOM=new Sk.builtin.int_(102),j.NORMAL=new Sk.builtin.int_(1),j.NORMALIZED=new Sk.builtin.int_(1),j.IMAGE=new Sk.builtin.int_(2),j.MODEL=new Sk.builtin.int_(4),j.SHAPE=new Sk.builtin.int_(5),j.AMBIENT=new Sk.builtin.int_(0),j.DIRECTIONAL=new Sk.builtin.int_(1),j.SPOT=new Sk.builtin.int_(3),j.RGB=new Sk.builtin.int_(1),j.ARGB=new Sk.builtin.int_(2),j.HSB=new Sk.builtin.int_(3),j.ALPHA=new Sk.builtin.int_(4),j.CMYK=new Sk.builtin.int_(5),j.TIFF=new Sk.builtin.int_(0),j.TARGA=new Sk.builtin.int_(1),j.JPEG=new Sk.builtin.int_(2),j.GIF=new Sk.builtin.int_(3),j.MITER=new Sk.builtin.str("miter"),j.BEVEL=new Sk.builtin.str("bevel"),j.ROUND=new Sk.builtin.str("round"),j.SQUARE=new Sk.builtin.str("butt"),j.PROJECT=new Sk.builtin.str("square"),j.P2D=new Sk.builtin.int_(1),j.JAVA2D=new Sk.builtin.int_(1),j.WEBGL=new Sk.builtin.int_(2),j.P3D=new Sk.builtin.int_(2),j.OPENGL=new Sk.builtin.int_(2),j.PDF=new Sk.builtin.int_(0),j.DXF=new Sk.builtin.int_(0),j.OTHER=new Sk.builtin.int_(0),j.WINDOWS=new Sk.builtin.int_(1),j.MAXOSX=new Sk.builtin.int_(2),j.LINUX=new Sk.builtin.int_(3),j.EPSILON=new Sk.builtin.float_(1e-4),j.MAX_FLOAT=new Sk.builtin.float_(34028235e31),j.MIN_FLOAT=new Sk.builtin.float_(-34028235e31),j.MAX_INT=new Sk.builtin.int_(2147483647),j.MIN_INT=new Sk.builtin.int_(-2147483648),j.HALF_PI=new Sk.builtin.float_(a/2),j.THIRD_PI=new Sk.builtin.float_(a/3),j.PI=new Sk.builtin.float_(a),j.TWO_PI=new Sk.builtin.float_(2*a),j.TAU=new Sk.builtin.float_(2*a),j.QUARTER_PI=new Sk.builtin.float_(a/4),j.DEG_TO_RAD=new Sk.builtin.float_(a/180),j.RAD_TO_DEG=new Sk.builtin.float_(180/a),j.WHITESPACE=new Sk.builtin.str(" \\t\\n\\r\\f\\xA0"),j.POINT=new Sk.builtin.int_(2),j.POINTS=new Sk.builtin.int_(2),j.LINE=new Sk.builtin.int_(4),j.LINES=new Sk.builtin.int_(4),j.TRIANGLE=new Sk.builtin.int_(8),j.TRIANGLES=new Sk.builtin.int_(9),j.TRIANGLE_FAN=new Sk.builtin.int_(11),j.TRIANGLE_STRIP=new Sk.builtin.int_(10),j.QUAD=new Sk.builtin.int_(16),j.QUADS=new Sk.builtin.int_(16),j.QUAD_STRIP=new Sk.builtin.int_(17),j.POLYGON=new Sk.builtin.int_(20),j.PATH=new Sk.builtin.int_(21),j.RECT=new Sk.builtin.int_(30),j.ELLIPSE=new Sk.builtin.int_(31),j.ARC=new Sk.builtin.int_(32),j.SPHERE=new Sk.builtin.int_(40),j.BOX=new Sk.builtin.int_(41),j.GROUP=new Sk.builtin.int_(0),j.PRIMITIVE=new Sk.builtin.int_(1),j.GEOMETRY=new Sk.builtin.int_(3),j.VERTEX=new Sk.builtin.int_(0),j.BEZIER_VERTEX=new Sk.builtin.int_(1),j.CURVE_VERTEX=new Sk.builtin.int_(2),j.BREAK=new Sk.builtin.int_(3),j.CLOSESHAPE=new Sk.builtin.int_(4),j.REPLACE=new Sk.builtin.int_(0),j.BLEND=new Sk.builtin.int_(1),j.ADD=new Sk.builtin.int_(2),j.SUBTRACT=new Sk.builtin.int_(4),j.LIGHTEST=new Sk.builtin.int_(8),j.DARKEST=new Sk.builtin.int_(16),j.DIFFERENCE=new Sk.builtin.int_(32),j.EXCLUSION=new Sk.builtin.int_(64),j.MULTIPLY=new Sk.builtin.int_(128),j.SCREEN=new Sk.builtin.int_(256),j.OVERLAY=new Sk.builtin.int_(512),j.HARD_LIGHT=new Sk.builtin.int_(1024),j.SOFT_LIGHT=new Sk.builtin.int_(2048),j.DODGE=new Sk.builtin.int_(4096),j.BURN=new Sk.builtin.int_(8192),j.ALPHA_MASK=new Sk.builtin.int_(4278190080),j.RED_MASK=new Sk.builtin.int_(16711680),j.GREEN_MASK=new Sk.builtin.int_(65280),j.BLUE_MASK=new Sk.builtin.int_(255),j.CUSTOM=new Sk.builtin.int_(0),j.ORTHOGRAPHIC=new Sk.builtin.int_(2),j.PERSPECTIVE=new Sk.builtin.int_(3),j.ARROW=new Sk.builtin.str("default"),j.CROSS=new Sk.builtin.str("crosshair"),j.HAND=new Sk.builtin.str("pointer"),j.MOVE=new Sk.builtin.str("move"),j.TEXT=new Sk.builtin.str("text"),j.WAIT=new Sk.builtin.str("wait"),j.NOCURSOR=Sk.builtin.assk$("url(\'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\'), auto"),j.DISABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(1),j.ENABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(-1),j.ENABLE_OPENGL_4X_SMOOTH=new Sk.builtin.int_(2),j.ENABLE_NATIVE_FONTS=new Sk.builtin.int_(3),j.DISABLE_DEPTH_TEST=new Sk.builtin.int_(4),j.ENABLE_DEPTH_TEST=new Sk.builtin.int_(-4),j.ENABLE_DEPTH_SORT=new Sk.builtin.int_(5),j.DISABLE_DEPTH_SORT=new Sk.builtin.int_(-5),j.DISABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(6),j.ENABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(-6),j.ENABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(7),j.DISABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(-7),j.HINT_COUNT=new Sk.builtin.int_(10),j.OPEN=new Sk.builtin.int_(1),j.CLOSE=new Sk.builtin.int_(2),j.BLUR=new Sk.builtin.int_(11),j.GRAY=new Sk.builtin.int_(12),j.INVERT=new Sk.builtin.int_(13),j.OPAQUE=new Sk.builtin.int_(14),j.POSTERIZE=new Sk.builtin.int_(15),j.THRESHOLD=new Sk.builtin.int_(16),j.ERODE=new Sk.builtin.int_(17),j.DILATE=new Sk.builtin.int_(18),j.BACKSPACE=new Sk.builtin.int_(8),j.TAB=new Sk.builtin.int_(9),j.ENTER=new Sk.builtin.int_(10),j.RETURN=new Sk.builtin.int_(13),j.ESC=new Sk.builtin.int_(27),j.DELETE=new Sk.builtin.int_(127),j.CODED=new Sk.builtin.int_(65535),j.SHIFT=new Sk.builtin.int_(16),j.CONTROL=new Sk.builtin.int_(17),j.ALT=new Sk.builtin.int_(18),j.CAPSLK=new Sk.builtin.int_(20),j.PGUP=new Sk.builtin.int_(33),j.PGDN=new Sk.builtin.int_(34),j.END=new Sk.builtin.int_(35),j.HOME=new Sk.builtin.int_(36),j.LEFT=new Sk.builtin.int_(37),j.UP=new Sk.builtin.int_(38),j.RIGHT=new Sk.builtin.int_(39),j.DOWN=new Sk.builtin.int_(40),j.F1=new Sk.builtin.int_(112),j.F2=new Sk.builtin.int_(113),j.F3=new Sk.builtin.int_(114),j.F4=new Sk.builtin.int_(115),j.F5=new Sk.builtin.int_(116),j.F6=new Sk.builtin.int_(117),j.F7=new Sk.builtin.int_(118),j.F8=new Sk.builtin.int_(119),j.F9=new Sk.builtin.int_(120),j.F10=new Sk.builtin.int_(121),j.F11=new Sk.builtin.int_(122),j.F12=new Sk.builtin.int_(123),j.NUMLK=new Sk.builtin.int_(144),j.META=new Sk.builtin.int_(157),j.INSERT=new Sk.builtin.int_(155),j.SINCOS_LENGTH=new Sk.builtin.int_(720),j.PRECISIONB=new Sk.builtin.int_(15),j.PRECISIONF=new Sk.builtin.int_(32768),j.PREC_MAXVAL=new Sk.builtin.int_(32767),j.PREC_ALPHA_SHIFT=new Sk.builtin.int_(9),j.PREC_RED_SHIFT=new Sk.builtin.int_(1),j.NORMAL_MODE_AUTO=new Sk.builtin.int_(0),j.NORMAL_MODE_SHAPE=new Sk.builtin.int_(1),j.NORMAL_MODE_VERTEX=new Sk.builtin.int_(2),j.MAX_LIGHTS=new Sk.builtin.int_(8),j.line=new Sk.builtin.func(function(a,b,c,d){j.processing.line(a.v,b.v,c.v,d.v)}),j.ellipse=new Sk.builtin.func(function(a,b,c,d){j.processing.ellipse(a.v,b.v,c.v,d.v)}),j.text=new Sk.builtin.func(function(a,b,c){j.processing.text(a.v,b.v,c.v)}),j.point=new Sk.builtin.func(function(a,b){j.processing.point(a.v,b.v)}),j.arc=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.arc(a.v,b.v,c.v,d.v,e.v,f.v)}),j.quad=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.quad(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.rect=new Sk.builtin.func(function(a,b,c,d,e){"undefined"==typeof e?j.processing.rect(a.v,b.v,c.v,d.v):j.processing.rect(a.v,b.v,c.v,d.v,e.v)}),j.triangle=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.triangle(a.v,b.v,c.v,d.v,e.v,f.v)}),j.bezier=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){"undefined"==typeof i?j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezier(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.alpha=new Sk.builtin.func(function(a,c,d){return"undefined"==typeof c?new Sk.builtin.float_(j.processing.alpha(a.v)):"undefined"==typeof d?new Sk.builtin.float_(j.processing.alpha(a.v,c.v)):new Sk.builtin.float_(j.processing.alpha(a.v,c.v,d.v))}),j.ambient=new Sk.builtin.func(function(a,c,d){"undefined"==typeof c?j.processing.ambient(a.v):"undefined"==typeof d?j.processing.ambient(a.v,c.v):j.processing.ambient(a.v,c.v,d.v)}),j.ambientLight=new Sk.builtin.func(function(a,b,c,d,e,f){"undefined"==typeof d?j.processing.ambientLight(a.v,b.v,c.v):"undefined"==typeof e?j.processing.ambientLight(a.v,b.v,c.v,d.v):"undefined"==typeof f?j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v):j.processing.ambientLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.beginCamera=new Sk.builtin.func(function(){j.processing.beginCamera()}),j.beginShape=new Sk.builtin.func(function(a){"undefined"==typeof a&&(a=j.POLYGON),j.processing.beginShape(a.v)}),j.bezierDetail=new Sk.builtin.func(function(a){a="undefined"==typeof a?20:a.v,j.processing.bezierDetail(a)}),j.bezierPoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierPoint(e.v,a.v,b.v,c.v,d.v)}),j.bezierTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.bezierTangent(e.v,a.v,b.v,c.v,d.v)}),j.bezierVertex=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){"undefined"==typeof g?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v):"undefined"==typeof h?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v):"undefined"==typeof i?j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.bezierVertex(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.blend=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):j.processing.blend(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v)}),j.blendColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.blendColor(a.v,b.v,d.v),e}),j.brightness=new Sk.builtin.func(function(a,c,d){return"undefined"==typeof c?new Sk.builtin.float_(j.processing.brightness(a.v)):"undefined"==typeof d?new Sk.builtin.float_(j.processing.brightness(a.v,c.v)):new Sk.builtin.float_(j.processing.brightness(a.v,c.v,d.v))}),j.camera=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){"undefined"==typeof a?j.processing.camera():j.processing.camera(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.constrain=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.constrain(a.v,b.v,c.v))}),j.copy=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i){other instanceof Sk.builtin.int_||other instanceof Sk.builtin.float_?j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):j.processing.copy(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v)}),j.createFont=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PFont);return e.v="undefined"==typeof c?j.processing.createFont(a.v,b.v):"undefined"==typeof d?j.processing.createFont(a.v,b.v,c.v):j.processing.createFont(a.v,b.v,c.v,d.v),e}),j.createGraphics=new Sk.builtin.func(function(a,b,c,d){var e=Sk.misceval.callsimArray(j.PGraphics);return e.v="undefined"==typeof d?j.processing.createGraphics(a.v,b.v,c.v):j.processing.createGraphics(a.v,b.v,c.v,d.v),e}),j.createImage=new Sk.builtin.func(function(a,b,c){var d=Sk.misceval.callsimArray(j.PImage);return d.v=j.processing.createImage(a.v,b.v,c.v),d}),j.cursor=new Sk.builtin.func(function(a,b,c){"undefined"==typeof a?j.processing.cursor():"undefined"==typeof b?j.processing.cursor(a.v):"undefined"==typeof c?j.processing.cursor(a.v,b.v):j.processing.cursor(a.v,b.v,c.v)}),j.curve=new Sk.builtin.func(function(a,b,c,d,e,f,g,h,i,k,l,m){"undefined"==typeof i?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v):"undefined"==typeof k?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v):"undefined"==typeof l?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v):"undefined"==typeof m?j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v):j.processing.curve(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v,i.v,k.v,l.v,m.v)}),j.curveDetail=new Sk.builtin.func(function(a){j.processing.curveDetail(a.v)}),j.curvePoint=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curvePoint(e.v,a.v,b.v,c.v,d.v)}),j.curveTangent=new Sk.builtin.func(function(e,a,b,c,d){j.processing.curveTangent(e.v,a.v,b.v,c.v,d.v)}),j.curveTightness=new Sk.builtin.func(function(a){j.processing.curveTightness(a.v)}),j.curveVertex=new Sk.builtin.func(function(a,b,c){"undefined"==typeof c?j.processing.curveVertex(a.v,b.v):j.processing.curveVertex(a.v,b.v,c.v)}),j.day=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.day())}),j.degrees=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.degrees(a.v))}),j.directionalLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.directionalLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.dist=new Sk.builtin.func(function(a,b,c,d,e,f){return"undefined"==typeof e?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v)):"undefined"==typeof f?new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v)):new Sk.builtin.float_(j.processing.dist(a.v,b.v,c.v,d.v,e.v,f.v))}),j.emissive=new Sk.builtin.func(function(a,b,c){"undefined"==typeof b?j.processing.emissive(a.v):"undefined"==typeof c?j.processing.emissive(a.v,b.v):j.processing.emissive(a.v,b.v,c.v)}),j.endCamera=new Sk.builtin.func(function(){j.processing.endCamera()}),j.endShape=new Sk.builtin.func(function(a){"undefined"==typeof a?j.processing.endShape():j.processing.endShape(a.v)}),j.filter=new Sk.builtin.func(function(a,b){"undefined"==typeof b?j.processing.filter(a.v):j.processing.filter(a.v,b.v)}),j.frustum=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.frustum(a,b,c,d,e,f)}),j.hint=new Sk.builtin.func(function(a){j.processing.hint(a)}),j.hour=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.hour())}),j.hue=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.hue(a.v))}),j.imageMode=new Sk.builtin.func(function(a){j.processing.imageMode(a.v)}),j.lerp=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.lerp(a.v,b.v,c.v))}),j.lerpColor=new Sk.builtin.func(function(a,b,d){var e=Sk.misceval.callsimArray(j.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return e.v=j.processing.lerpColor(a.v,b.v,d.v),e}),j.lightFalloff=new Sk.builtin.func(function(a,b,c){j.processing.lightFalloff(a.v,b.v,c.v)}),j.lights=new Sk.builtin.func(function(){j.processing.lights()}),j.lightSpecular=new Sk.builtin.func(function(a,b,c){j.processing.lightSpecular(a.v,b.v,c.v)}),j.loadBytes=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadBytes(a.v))}),j.loadFont=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PFont);return b.v=j.processing.loadFont(a.v),b}),j.loadShape=new Sk.builtin.func(function(a){var b=Sk.misceval.callsimArray(j.PShapeSVG,[new Sk.builtin.str("string"),a]);return b}),j.loadStrings=new Sk.builtin.func(function(a){return new Sk.builtin.list(j.processing.loadStrings(a.v))}),j.mag=new Sk.builtin.func(function(d,a,b){return"undefined"==typeof b?new Sk.builtin.float_(j.processing.mag(d.v,a.v)):new Sk.builtin.float_(j.processing.mag(d.v,a.v,b.v))}),j.map=new Sk.builtin.func(function(a,b,c,d,e){return new Sk.builtin.float_(j.processing.map(a.v,b.v,c.v,d.v,e.v))}),j.millis=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.millis())}),j.minute=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.minute())}),j.modelX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelX(a.v,b.v,c.v))}),j.modelY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelY(a.v,b.v,c.v))}),j.modelZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.modelZ(a.v,b.v,c.v))}),j.month=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.month())}),j.noCursor=new Sk.builtin.func(function(){j.processing.noCursor()}),j.noise=new Sk.builtin.func(function(a,b,c){return"undefined"==typeof b?new Sk.builtin.float_(j.processing.noise(a.v)):"undefined"==typeof c?new Sk.builtin.float_(j.processing.noise(a.v,b.v)):new Sk.builtin.float_(j.processing.noise(a.v,b.v,c.v))}),j.noiseDetail=new Sk.builtin.func(function(a,b){j.processing.noiseDetail(a.v,b.v)}),j.noiseSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.noiseSeed(a.v))}),j.noLights=new Sk.builtin.func(function(){j.processing.noLights()}),j.norm=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.norm(a.v,b.v,c.v))}),j.normal=new Sk.builtin.func(function(a,b,c){j.processing.normal(a.v,b.v,c.v)}),j.noTint=new Sk.builtin.func(function(){j.processing.noTint()}),j.ortho=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.ortho(a.v,b.v,c.v,d.v,e.v,f.v)}),j.perspective=new Sk.builtin.func(function(a,b,c,d){"undefined"==typeof a?j.processing.perspective():"undefined"==typeof b?j.processing.perspective(a.v):"undefined"==typeof c?j.processing.perspective(a.v,b.v):"undefined"==typeof d?j.processing.perspective(a.v,b.v,c.v):j.processing.perspective(a.v,b.v,c.v,d.v)}),j.pointLight=new Sk.builtin.func(function(a,b,c,d,e,f){j.processing.pointLight(a.v,b.v,c.v,d.v,e.v,f.v)}),j.printCamera=new Sk.builtin.func(function(){j.processing.printCamera()}),j.println=new Sk.builtin.func(function(a){j.processing.println(a.v)}),j.printProjection=new Sk.builtin.func(function(){j.processing.printProjection()}),j.radians=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.radians(a.v))}),j.randomSeed=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.randomSeed(a.v))}),j.random=new Sk.builtin.func(function(a,b){return"undefined"==typeof a?new Sk.builtin.float_(j.processing.random()):"undefined"==typeof b?new Sk.builtin.float_(j.processing.random(a.v)):new Sk.builtin.float_(j.processing.random(a.v,b.v))}),j.requestImage=new Sk.builtin.func(function(a,b){var c=Sk.misceval.callsimArray(j.PImage);return c.v="undefined"==typeof b?j.processing.requestImage(a.v):j.processing.requestImage(a.v,b.v),c}),j.saturation=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.saturation(a.v))}),j.save=new Sk.builtin.func(function(a){j.processing.save(a.v)}),j.saveFrame=new Sk.builtin.func(function(a){"undefined"==typeof a?j.processing.saveFrame():j.processing.saveFrame(a.v)}),j.saveStrings=new Sk.builtin.func(function(a,b){j.processing.saveStrings(a.v,b.v)}),j.screenX=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenX(a.v,b.v,c.v))}),j.screenY=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenY(a.v,b.v,c.v))}),j.screenZ=new Sk.builtin.func(function(a,b,c){return new Sk.builtin.float_(j.processing.screenZ(a.v,b.v,c.v))}),j.second=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.second())}),j.shape=new Sk.builtin.func(function(a,b,c,d,e){"undefined"==typeof b?j.processing.shape(a.v):"undefined"==typeof c?j.processing.shape(a.v,b.v):"undefined"==typeof d?j.processing.shape(a.v,b.v,c.v):"undefined"==typeof e?j.processing.shape(a.v,b.v,c.v,d.v):j.processing.shape(a.v,b.v,c.v,d.v,e.v)}),j.shapeMode=new Sk.builtin.func(function(a){j.processing.shapeMode(a.v)}),j.shininess=new Sk.builtin.func(function(a){j.processing.shininess(a.v)}),j.specular=new Sk.builtin.func(function(a,b,c){"undefined"==typeof b?j.processing.specular(a.v):"undefined"==typeof c?j.processing.specular(a.v,b.v):j.processing.specular(a.v,b.v,c.v)}),j.spotLight=new Sk.builtin.func(function(a,b,c,d,e,f,g,h){j.processing.spotLight(a.v,b.v,c.v,d.v,e.v,f.v,g.v,h.v)}),j.sq=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.sq(a))}),j.status=new Sk.builtin.func(function(a){j.processing.status(a.v)}),j.textAlign=new Sk.builtin.func(function(a,b){"undefined"==typeof b?j.processing.textAlign(a.v):j.processing.textAlign(a.v,b.v)}),j.textAscent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textAscent())}),j.textDescent=new Sk.builtin.func(function(){return new Sk.builtin.float_(j.processing.textDescent())}),j.textFont=new Sk.builtin.func(function(a,b){"undefined"==typeof b?j.processing.textFont(a.v):j.processing.textFont(a.v,b.v)}),j.textLeading=new Sk.builtin.func(function(a){j.processing.textLeading(a.v)}),j.textMode=new Sk.builtin.func(function(a){j.processing.textMode(a.v)}),j.textSize=new Sk.builtin.func(function(a){j.processing.textSize(a.v)}),j.texture=new Sk.builtin.func(function(a){j.processing.texture(a.v)}),j.textureMode=new Sk.builtin.func(function(a){j.processing.textureMode(a.v)}),j.textWidth=new Sk.builtin.func(function(a){return new Sk.builtin.float_(j.processing.textWidth(a.v))}),j.tint=new Sk.builtin.func(function(a,b,c,d){"undefined"==typeof b?j.processing.tint(a.v):"undefined"==typeof c?j.processing.tint(a.v,b.v):"undefined"==typeof d?j.processing.tint(a.v,b.v,c.v):j.processing.tint(a.v,b.v,c.v,d.v)}),j.updatePixels=new Sk.builtin.func(function(){j.processing.updatePixels()}),j.vertex=new Sk.builtin.func(function(a,b,c,d,e){"undefined"==typeof c?j.processing.vertex(a.v,b.v):"undefined"==typeof d?j.processing.vertex(a.v,b.v,c.v):"undefined"==typeof e?j.processing.vertex(a.v,b.v,c.v,d.v):j.processing.vertex(a.v,b.v,c.v,d.v,e.v)}),j.year=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.year())}),j.box=new Sk.builtin.func(function(a){j.processing.box(a.v)}),j.sphere=new Sk.builtin.func(function(a){j.processing.sphere(a.v)}),j.sphereDetail=new Sk.builtin.func(function(a,b){"undefined"==typeof b?j.processing.sphereDetail(a.v):j.processing.sphereDetail(a.v,b.v)}),j.background=new Sk.builtin.func(function(a,c,d){"undefined"!=typeof c&&(c=c.v),"undefined"!=typeof d&&(d=d.v),j.processing.background(a.v,c,d)}),j.fill=new Sk.builtin.func(function(a,c,d,e){"undefined"!=typeof c&&(c=c.v),"undefined"!=typeof d&&(d=d.v),"undefined"!=typeof e&&(e=e.v),j.processing.fill(a.v,c,d,e)}),j.stroke=new Sk.builtin.func(function(a,c,d,e){"undefined"!=typeof c&&(c=c.v),"undefined"!=typeof d&&(d=d.v),"undefined"!=typeof e&&(e=e.v),j.processing.stroke(a.v,c,d,e)}),j.noStroke=new Sk.builtin.func(function(){j.processing.noStroke()}),j.colorMode=new Sk.builtin.func(function(a,b,c,d,e){b="undefined"==typeof b?255:b.v,"undefined"!=typeof c&&(c=c.v),"undefined"!=typeof d&&(d=d.v),"undefined"!=typeof e&&(e=e.v),j.processing.colorMode(a.v,b,c,d,e)}),j.noFill=new Sk.builtin.func(function(){j.processing.noFill()}),j.loop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception("loop() should be called after run()");l=!0,j.processing.loop()}),j.noLoop=new Sk.builtin.func(function(){if(null===j.processing)throw new Sk.builtin.Exception("noLoop() should be called after run()");l=!1,j.processing.noLoop()}),j.frameRate=new Sk.builtin.func(function(a){j.processing.frameRate(a.v)}),j.width=new Sk.builtin.int_(0),j.height=new Sk.builtin.int_(0),j.renderMode=j.P2D,j.size=new Sk.builtin.func(function(a,b,c){"undefined"==typeof c&&(c=j.P2D),j.processing.size(a.v,b.v,c.v),j.width=new Sk.builtin.int_(j.processing.width),j.height=new Sk.builtin.int_(j.processing.height),j.renderMode=c}),j.exitp=new Sk.builtin.func(function(){j.processing.exit()}),j.mouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseX)}),j.mouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.mouseY)}),j.pmouseX=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseX)}),j.pmouseY=new Sk.builtin.func(function(){return new Sk.builtin.int_(j.processing.pmouseY)}),j.rectMode=new Sk.builtin.func(function(a){j.processing.rectMode(a.v)}),j.strokeWeight=new Sk.builtin.func(function(a){j.processing.strokeWeight(a.v)}),j.smooth=new Sk.builtin.func(function(){j.processing.smooth()}),j.noSmooth=new Sk.builtin.func(function(){j.processing.noSmooth()}),j.ellipseMode=new Sk.builtin.func(function(a){j.processing.ellipseMode(a.v)}),j.strokeCap=new Sk.builtin.func(function(a){j.processing.strokeCap(a.v)}),j.strokeJoin=new Sk.builtin.func(function(a){j.processing.strokeJoin(a.v)}),j.rotate=new Sk.builtin.func(function(a){j.processing.rotate(a.v)}),j.rotateX=new Sk.builtin.func(function(a){j.processing.rotateX(a.v)}),j.rotateY=new Sk.builtin.func(function(a){j.processing.rotateY(a.v)}),j.rotateZ=new Sk.builtin.func(function(a){j.processing.rotateZ(a.v)}),j.scale=new Sk.builtin.func(function(a,b,c){b="undefined"==typeof b?1:b.v,c="undefined"==typeof c?1:c.v,j.processing.scale(a.v,b,c)}),j.translate=new Sk.builtin.func(function(a,b,c){b="undefined"==typeof b?1:b.v,c="undefined"==typeof c?1:c.v,j.processing.translate(a.v,b,c)}),j.popMatrix=new Sk.builtin.func(function(){j.processing.popMatrix()}),j.pushMatrix=new Sk.builtin.func(function(){j.processing.pushMatrix()}),j.applyMatrix=new Sk.builtin.func(function(){var a,b=Array.prototype.slice.call(arguments,0,16);for(a=0;a 0):\n self.percDown(i)\n i = i - 1\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapArray[i][0] > self.heapArray[mc][0]:\n tmp = self.heapArray[i]\n self.heapArray[i] = self.heapArray[mc]\n self.heapArray[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i*2 > self.currentSize:\n return -1\n else:\n if i*2 + 1 > self.currentSize:\n return i*2\n else:\n if self.heapArray[i*2][0] < self.heapArray[i*2+1][0]:\n return i*2\n else:\n return i*2+1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapArray[i][0] < self.heapArray[i//2][0]:\n tmp = self.heapArray[i//2]\n self.heapArray[i//2] = self.heapArray[i]\n self.heapArray[i] = tmp\n i = i//2\n \n def add(self,k):\n self.heapArray.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapArray[1][1]\n self.heapArray[1] = self.heapArray[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapArray.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if self.currentSize == 0:\n return True\n else:\n return False\n\n def decreaseKey(self,val,amt):\n # this is a little wierd, but we need to find the heap thing to decrease by\n # looking at its value\n done = False\n i = 1\n myKey = 0\n while not done and i <= self.currentSize:\n if self.heapArray[i][1] == val:\n done = True\n myKey = i\n else:\n i = i + 1\n if myKey > 0:\n self.heapArray[myKey] = (amt,self.heapArray[myKey][1])\n self.percUp(myKey)\n \n def __contains__(self,vtx):\n for pair in self.heapArray:\n if pair[1] == vtx:\n return True\n return False\n \nclass TestBinHeap(unittest.TestCase):\n def setUp(self):\n self.theHeap = PriorityQueue()\n self.theHeap.add((2,'x'))\n self.theHeap.add((3,'y'))\n self.theHeap.add((5,'z'))\n self.theHeap.add((6,'a'))\n self.theHeap.add((4,'d'))\n\n\n def testInsert(self):\n assert self.theHeap.currentSize == 5\n\n def testDelmin(self):\n assert self.theHeap.delMin() == 'x'\n assert self.theHeap.delMin() == 'y'\n \n def testDecKey(self):\n self.theHeap.decreaseKey('d',1)\n assert self.theHeap.delMin() == 'd'\n \nif __name__ == '__main__':\n unittest.main()\n","src/lib/pythonds/trees/__init__.py":"\n# from .binaryTree import BinaryTree\n# from .balance import AVLTree\n# from .bst import BinarySearchTree\n# from .binheap import BinHeap\n\n\n","src/lib/pythonds/trees/balance.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nfrom .bst import BinarySearchTree, TreeNode\n\nclass AVLTree(BinarySearchTree):\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n has_key(k)\n items() \n keys() \n values()\n put(k,v)\n '''\n\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.leftChild)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.rightChild) \n\n def updateBalance(self,node):\n if node.balanceFactor > 1 or node.balanceFactor < -1:\n self.rebalance(node)\n return\n if node.parent != None:\n if node.isLeftChild():\n node.parent.balanceFactor += 1\n elif node.isRightChild():\n node.parent.balanceFactor -= 1\n\n if node.parent.balanceFactor != 0:\n self.updateBalance(node.parent)\n\n def rebalance(self,node):\n if node.balanceFactor < 0:\n if node.rightChild.balanceFactor > 0:\n # Do an LR Rotation\n self.rotateRight(node.rightChild)\n self.rotateLeft(node)\n else:\n # single left\n self.rotateLeft(node)\n elif node.balanceFactor > 0:\n if node.leftChild.balanceFactor < 0:\n # Do an RL Rotation\n self.rotateLeft(node.leftChild)\n self.rotateRight(node)\n else:\n # single right\n self.rotateRight(node)\n\n def rotateLeft(self,rotRoot):\n newRoot = rotRoot.rightChild\n rotRoot.rightChild = newRoot.leftChild\n if newRoot.leftChild != None:\n newRoot.leftChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isLeftChild():\n rotRoot.parent.leftChild = newRoot\n else:\n rotRoot.parent.rightChild = newRoot\n newRoot.leftChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor + 1 - min(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor + 1 + max(rotRoot.balanceFactor, 0)\n\n\n def rotateRight(self,rotRoot):\n newRoot = rotRoot.leftChild\n rotRoot.leftChild = newRoot.rightChild\n if newRoot.rightChild != None:\n newRoot.rightChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isRightChild():\n rotRoot.parent.rightChild = newRoot\n else:\n rotRoot.parent.leftChild = newRoot\n newRoot.rightChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor - 1 - max(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor - 1 + min(rotRoot.balanceFactor, 0)\n \n","src/lib/pythonds/trees/binaryTree.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\nclass BinaryTree:\n \"\"\"\n A recursive implementation of Binary Tree\n Using links and Nodes approach.\n \"\"\" \n def __init__(self,rootObj):\n self.key = rootObj\n self.leftChild = None\n self.rightChild = None\n\n def insertLeft(self,newNode):\n if self.leftChild == None:\n self.leftChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.left = self.leftChild\n self.leftChild = t\n \n def insertRight(self,newNode):\n if self.rightChild == None:\n self.rightChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.right = self.rightChild\n self.rightChild = t\n\n def isLeaf(self):\n return ((not self.leftChild) and (not self.rightChild))\n\n def getRightChild(self):\n return self.rightChild\n\n def getLeftChild(self):\n return self.leftChild\n\n def setRootVal(self,obj):\n self.key = obj\n\n def getRootVal(self,):\n return self.key\n\n def inorder(self):\n if self.leftChild:\n self.leftChild.inorder()\n print(self.key)\n if self.rightChild:\n self.rightChild.inorder()\n\n def postorder(self):\n if self.leftChild:\n self.leftChild.postorder()\n if self.rightChild:\n self.rightChild.postorder()\n print(self.key)\n\n\n def preorder(self):\n print(self.key)\n if self.leftChild:\n self.leftChild.preorder()\n if self.rightChild:\n self.rightChild.preorder()\n\n def printexp(self):\n if self.leftChild:\n print('(')\n self.leftChild.printexp()\n print(self.key)\n if self.rightChild:\n self.rightChild.printexp()\n print(')')\n\n def postordereval(self):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if self.leftChild:\n res1 = self.leftChild.postordereval() #// \\label{peleft}\n if self.rightChild:\n res2 = self.rightChild.postordereval() #// \\label{peright}\n if res1 and res2:\n return opers[self.key](res1,res2) #// \\label{peeval}\n else:\n return self.key\n\ndef inorder(tree):\n if tree != None:\n inorder(tree.getLeftChild())\n print(tree.getRootVal())\n inorder(tree.getRightChild())\n\ndef printexp(tree):\n if tree.leftChild:\n print('(')\n printexp(tree.getLeftChild())\n print(tree.getRootVal())\n if tree.rightChild:\n printexp(tree.getRightChild())\n print(')') \n\ndef printexp(tree):\n sVal = \"\"\n if tree:\n sVal = '(' + printexp(tree.getLeftChild())\n sVal = sVal + str(tree.getRootVal())\n sVal = sVal + printexp(tree.getRightChild()) + ')'\n return sVal\n\ndef postordereval(tree):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if tree:\n res1 = postordereval(tree.getLeftChild()) #// \\label{peleft}\n res2 = postordereval(tree.getRightChild()) #// \\label{peright}\n if res1 and res2:\n return opers[tree.getRootVal()](res1,res2) #// \\label{peeval}\n else:\n return tree.getRootVal()\n\ndef height(tree):\n if tree == None:\n return -1\n else:\n return 1 + max(height(tree.leftChild),height(tree.rightChild))\n\n# t = BinaryTree(7)\n# t.insertLeft(3)\n# t.insertRight(9)\n# inorder(t)\n# import operator\n# x = BinaryTree('*')\n# x.insertLeft('+')\n# l = x.getLeftChild()\n# l.insertLeft(4)\n# l.insertRight(5)\n# x.insertRight(7)\n# print(printexp(x))\n# print(postordereval(x))\n# print(height(x))\n","src/lib/pythonds/trees/binheap.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\n# this heap takes key value pairs, we will assume that the keys are integers\nclass BinHeap:\n def __init__(self):\n self.heapList = [0]\n self.currentSize = 0\n\n\n def buildHeap(self,alist):\n i = len(alist) // 2\n self.currentSize = len(alist)\n self.heapList = [0] + alist[:]\n print(len(self.heapList), i)\n while (i > 0):\n print(self.heapList, i)\n self.percDown(i)\n i = i - 1\n print(self.heapList,i)\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapList[i] > self.heapList[mc]:\n tmp = self.heapList[i]\n self.heapList[i] = self.heapList[mc]\n self.heapList[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i * 2 + 1 > self.currentSize:\n return i * 2\n else:\n if self.heapList[i * 2] < self.heapList[i * 2 + 1]:\n return i * 2\n else:\n return i * 2 + 1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapList[i] < self.heapList[i//2]:\n tmp = self.heapList[i // 2]\n self.heapList[i // 2] = self.heapList[i]\n self.heapList[i] = tmp\n i = i // 2\n \n def insert(self,k):\n self.heapList.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapList[1]\n self.heapList[1] = self.heapList[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapList.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if currentSize == 0:\n return True\n else:\n return False\n","src/lib/pythonds/trees/bst.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nclass BinarySearchTree:\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n items() \n keys() \n values()\n put(k,v)\n in\n del <==> \n '''\n\n def __init__(self):\n self.root = None\n self.size = 0\n \n def put(self,key,val):\n if self.root:\n self._put(key,val,self.root)\n else:\n self.root = TreeNode(key,val)\n self.size = self.size + 1\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n \n def __setitem__(self,k,v):\n self.put(k,v)\n\n def get(self,key):\n if self.root:\n res = self._get(key,self.root)\n if res:\n return res.payload\n else:\n return None\n else:\n return None\n \n def _get(self,key,currentNode):\n if not currentNode:\n return None\n elif currentNode.key == key:\n return currentNode\n elif key < currentNode.key:\n return self._get(key,currentNode.leftChild)\n else:\n return self._get(key,currentNode.rightChild)\n \n \n def __getitem__(self,key):\n res = self.get(key)\n if res:\n return res\n else:\n raise KeyError('Error, key not in tree')\n \n\n def __contains__(self,key):\n if self._get(key,self.root):\n return True\n else:\n return False\n \n def length(self):\n return self.size\n\n def __len__(self):\n return self.size\n\n def __iter__(self):\n return self.root.__iter__()\n \n def delete(self,key):\n if self.size > 1:\n nodeToRemove = self._get(key,self.root)\n if nodeToRemove:\n self.remove(nodeToRemove)\n self.size = self.size-1\n else:\n raise KeyError('Error, key not in tree')\n elif self.size == 1 and self.root.key == key:\n self.root = None\n self.size = self.size - 1\n else:\n raise KeyError('Error, key not in tree')\n\n def __delitem__(self,key):\n self.delete(key)\n \n def remove(self,currentNode):\n if currentNode.isLeaf(): #leaf\n if currentNode == currentNode.parent.leftChild:\n currentNode.parent.leftChild = None\n else:\n currentNode.parent.rightChild = None\n elif currentNode.hasBothChildren(): #interior\n succ = currentNode.findSuccessor()\n succ.spliceOut()\n currentNode.key = succ.key\n currentNode.payload = succ.payload\n else: # this node has one child\n if currentNode.hasLeftChild():\n if currentNode.isLeftChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.leftChild\n elif currentNode.isRightChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.leftChild\n else:\n currentNode.replaceNodeData(currentNode.leftChild.key,\n currentNode.leftChild.payload,\n currentNode.leftChild.leftChild,\n currentNode.leftChild.rightChild)\n else:\n if currentNode.isLeftChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.rightChild\n elif currentNode.isRightChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.rightChild\n else:\n currentNode.replaceNodeData(currentNode.rightChild.key,\n currentNode.rightChild.payload,\n currentNode.rightChild.leftChild,\n currentNode.rightChild.rightChild)\n\n def inorder(self):\n self._inorder(self.root)\n\n def _inorder(self,tree):\n if tree != None:\n self._inorder(tree.leftChild)\n print(tree.key)\n self._inorder(tree.rightChild)\n\n def postorder(self):\n self._postorder(self.root)\n\n def _postorder(self, tree):\n if tree:\n self._postorder(tree.rightChild)\n self._postorder(tree.leftChild)\n print(tree.key) \n\n def preorder(self):\n self._preorder(self,self.root)\n\n def _preorder(self,tree):\n if tree:\n print(tree.key) \n self._preorder(tree.leftChild)\n self._preorder(tree.rightChild)\n\n \nclass TreeNode:\n def __init__(self,key,val,left=None,right=None,parent=None):\n self.key = key\n self.payload = val\n self.leftChild = left\n self.rightChild = right\n self.parent = parent\n self.balanceFactor = 0\n \n def hasLeftChild(self):\n return self.leftChild\n\n def hasRightChild(self):\n return self.rightChild\n \n def isLeftChild(self):\n return self.parent and self.parent.leftChild == self\n\n def isRightChild(self):\n return self.parent and self.parent.rightChild == self\n\n def isRoot(self):\n return not self.parent\n\n def isLeaf(self):\n return not (self.rightChild or self.leftChild)\n\n def hasAnyChildren(self):\n return self.rightChild or self.leftChild\n\n def hasBothChildren(self):\n return self.rightChild and self.leftChild\n \n def replaceNodeData(self,key,value,lc,rc):\n self.key = key\n self.payload = value\n self.leftChild = lc\n self.rightChild = rc\n if self.hasLeftChild():\n self.leftChild.parent = self\n if self.hasRightChild():\n self.rightChild.parent = self\n \n def findSuccessor(self):\n succ = None\n if self.hasRightChild():\n succ = self.rightChild.findMin()\n else:\n if self.parent:\n if self.isLeftChild():\n succ = self.parent\n else:\n self.parent.rightChild = None\n succ = self.parent.findSuccessor()\n self.parent.rightChild = self\n return succ\n\n\n def spliceOut(self):\n if self.isLeaf():\n if self.isLeftChild():\n self.parent.leftChild = None\n else:\n self.parent.rightChild = None\n elif self.hasAnyChildren():\n if self.hasLeftChild():\n if self.isLeftChild():\n self.parent.leftChild = self.leftChild\n else:\n self.parent.rightChild = self.leftChild\n self.leftChild.parent = self.parent\n else:\n if self.isLeftChild():\n self.parent.leftChild = self.rightChild\n else:\n self.parent.rightChild = self.rightChild\n self.rightChild.parent = self.parent\n\n def findMin(self):\n current = self\n while current.hasLeftChild():\n current = current.leftChild\n return current\n\n def __iter__(self):\n \"\"\"The standard inorder traversal of a binary tree.\"\"\"\n if self:\n if self.hasLeftChild():\n for elem in self.leftChild:\n yield elem\n yield self.key\n if self.hasRightChild():\n for elem in self.rightChild:\n yield elem\n\n \n","src/lib/quopri.py":'raise NotImplementedError("quopri is not yet implemented in Skulpt")\n',"src/lib/random.js":'var MersenneTwister=function(a){a==null&&(a=new Date().getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=Array(this.N),this.mti=this.N+1,this.init_genrand(a)};MersenneTwister.prototype.init_genrand=function(a){for(this.mt[0]=a>>>0,this.mti=1;this.mti>>30;this.mt[this.mti]=(1812433253*((4294901760&a)>>>16)<<16)+1812433253*(65535&a)+this.mti,this.mt[this.mti]>>>=0}},MersenneTwister.prototype.init_by_array=function(a,b){var d,e,f;for(this.init_genrand(19650218),d=1,e=0,f=this.N>b?this.N:b;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1664525*((4294901760&g)>>>16)<<16)+1664525*(65535&g))+a[e]+e,this.mt[d]>>>=0,d++,e++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1),e>=b&&(e=0)}for(f=this.N-1;f;f--){var g=this.mt[d-1]^this.mt[d-1]>>>30;this.mt[d]=(this.mt[d]^(1566083941*((4294901760&g)>>>16)<<16)+1566083941*(65535&g))-d,this.mt[d]>>>=0,d++,d>=this.N&&(this.mt[0]=this.mt[this.N-1],d=1)}this.mt[0]=2147483648},MersenneTwister.prototype.genrand_int32=function(){var a,b=[0,this.MATRIX_A];if(this.mti>=this.N){var d;for(this.mti==this.N+1&&this.init_genrand(5489),d=0;d>>1^b[1&a];for(;d>>1^b[1&a];a=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^a>>>1^b[1&a],this.mti=0}return a=this.mt[this.mti++],a^=a>>>11,a^=2636928640&a<<7,a^=4022730752&a<<15,a^=a>>>18,a>>>0},MersenneTwister.prototype.genrand_int31=function(){return this.genrand_int32()>>>1},MersenneTwister.prototype.genrand_real1=function(){return this.genrand_int32()*(1/4294967295)},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)},MersenneTwister.prototype.genrand_real3=function(){return(this.genrand_int32()+.5)*(1/4294967296)},MersenneTwister.prototype.genrand_res53=function(){var d=this.genrand_int32()>>>5,a=this.genrand_int32()>>>6;return(67108864*d+a)*(1/9007199254740992)};var $builtinmodule=function(){var a=Math.log,b=Math.sqrt,d={},e=new MersenneTwister,f=void 0;d.seed=new Sk.builtin.func(function(a){return Sk.builtin.pyCheckArgsLen("seed",arguments.length,0,1),a=Sk.builtin.asnum$(a),e=0d)h=g((f+d+1)/d);else throw new Sk.builtin.ValueError("zero step for randrange()");if(0>=h)throw new Sk.builtin.ValueError("empty range for randrange()");return i=a+d*g(e.genrand_res53()*h),new Sk.builtin.int_(i)};d.randint=new Sk.builtin.func(function(d,e){return Sk.builtin.pyCheckArgsLen("randint",arguments.length,2,2),d=Sk.builtin.asnum$(d),e=Sk.builtin.asnum$(e),h(d,e+1)}),d.randrange=new Sk.builtin.func(function(a,b,d){return Sk.builtin.pyCheckArgsLen("randrange",arguments.length,1,3),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),d=Sk.builtin.asnum$(d),h(a,b,d)}),d.uniform=new Sk.builtin.func(function(d,f){Sk.builtin.pyCheckArgsLen("uniform",arguments.length,2,2),d=Sk.builtin.asnum$(d),f=Sk.builtin.asnum$(f);var g=e.genrand_res53();return c=d+g*(f-d),new Sk.builtin.float_(c)}),d.triangular=new Sk.builtin.func(function(a,d,f){Sk.builtin.pyCheckArgsLen("triangular",arguments.length,2,3),Sk.builtin.pyCheckType("low","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("high","number",Sk.builtin.checkNumber(d));var g,h,i;return a=Sk.builtin.asnum$(a),d=Sk.builtin.asnum$(d),a>d&&(i=a,a=d,d=i),void 0===f||f===Sk.builtin.none.none$?f=(d-a)/2:(Sk.builtin.pyCheckType("mode","number",Sk.builtin.checkNumber(f)),f=Sk.builtin.asnum$(f)),g=e.genrand_res53(),h=g<(f-a)/(d-a)?a+b(g*(d-a)*(f-a)):d-b((1-g)*(d-a)*(d-f)),new Sk.builtin.float_(h)});var i=function(d,g){var k,l,m,n,o,h=Math.sin,i=Math.cos,j=Math.PI;return void 0===f?(k=e.genrand_res53(),l=e.genrand_res53(),m=b(-2*a(k)),n=2*j*l,o=m*i(n),f=m*h(n)):(o=f,f=void 0),d+g*o};return d.gauss=new Sk.builtin.func(function(a,b){return Sk.builtin.pyCheckArgsLen("gauss",arguments.length,2,2),Sk.builtin.pyCheckType("mu","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("sigma","number",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(i(a,b))}),d.normalvariate=d.gauss,d.lognormvariate=new Sk.builtin.func(function(a,b){var d=Math.exp;return Sk.builtin.pyCheckArgsLen("lognormvariate",arguments.length,2,2),Sk.builtin.pyCheckType("mu","number",Sk.builtin.checkNumber(a)),Sk.builtin.pyCheckType("sigma","number",Sk.builtin.checkNumber(b)),a=Sk.builtin.asnum$(a),b=Sk.builtin.asnum$(b),new Sk.builtin.float_(d(i(a,b)))}),d.expovariate=new Sk.builtin.func(function(b){Sk.builtin.pyCheckArgsLen("expovariate",arguments.length,1,1),Sk.builtin.pyCheckType("lambd","number",Sk.builtin.checkNumber(b)),b=Sk.builtin.asnum$(b);var d=e.genrand_res53();return new Sk.builtin.float_(-a(d)/b)}),d.choice=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen("choice",arguments.length,1,1),Sk.builtin.pyCheckType("seq","sequence",Sk.builtin.checkSequence(a)),void 0!==a.sq$length){var b=new Sk.builtin.int_(g(e.genrand_res53()*a.sq$length()));return a.mp$subscript(b)}throw new Sk.builtin.TypeError("object has no length")}),d.shuffle=new Sk.builtin.func(function(a){if(Sk.builtin.pyCheckArgsLen("shuffle",arguments.length,1,1),Sk.builtin.pyCheckType("x","sequence",Sk.builtin.checkSequence(a)),a.constructor===Sk.builtin.list){const h=a.v;for(var b=h.length-1;0=c)););return j.push(new Sk.builtin.str(f.substring(l))),new Sk.builtin.list(j)},_split.co_varnames=["pattern","string","maxsplit","flags"],_split.$defaults=[new Sk.builtin.int_(0),new Sk.builtin.int_(0)],mod.split=new Sk.builtin.func(_split),_findall=function(a,b,c){var d,e,f,g,h,j;if(Sk.builtin.pyCheckArgsLen("findall",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("pattern must be a string");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("string must be a string");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError("flags must be a number");if(d=Sk.ffi.unwrapo(a),e=Sk.ffi.unwrapo(b),d=convert(d),f=getFlags(c),g=new RegExp(d,f),d.match(/\\$/)){var k=new RegExp(/\\n$/);e.match(k)&&(e=e.slice(0,-1))}for(h=[],j;null!=(j=g.exec(e));){if(2>j.length)h.push(new Sk.builtin.str(j[0]));else if(2==j.length)h.push(new Sk.builtin.str(j[1]));else{for(var l=[],m=1;m=a.thematch.v.length)throw new Sk.builtin.IndexError("Index out of range: "+b);return a.thematch.v[b]})},mod.MatchObject=Sk.misceval.buildClass(mod,matchobj,"MatchObject",[]),mod._findre=function(res,string){res=res.replace(/([^\\\\]){,(?![^\\[]*\\])/g,"$1{0,");var matches,sitem,retval,re=eval(res),patt=/\\n$/,str=Sk.ffi.remapToJs(string);if(matches=str.match(patt)?str.slice(0,-1).match(re):str.match(re),retval=new Sk.builtin.list,null==matches)return retval;for(var i=0;ilst.v.length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_search.co_varnames=["pattern","string","flags"],_search.$defaults=[new Sk.builtin.int_(0)],mod.search=new Sk.builtin.func(_search),_match=function(a,b,c){var d,e;if(Sk.builtin.pyCheckArgsLen("match",arguments.length,2,3),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("pattern must be a string");if(!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("string must be a string");if(void 0===c&&(c=0),!Sk.builtin.checkNumber(c))throw new Sk.builtin.TypeError("flags must be a number");return(pat=Sk.ffi.remapToJs(a),e="/^"+pat.replace(/\\//g,"\\\\/")+"/",lst=mod._findre(e,b),1>Sk.ffi.remapToJs(lst).length)?Sk.builtin.none.none$:(d=Sk.misceval.callsimArray(mod.MatchObject,[lst,a,b]),d)},_match.co_varnames=["pattern","string","flags"],_match.$defaults=[new Sk.builtin.int_(0)],mod.match=new Sk.builtin.func(_match),regexobj=function(a,b){var c,d,e,f,g,h;b.__init__=new Sk.builtin.func(function(a,b,c){return a.re=b,a.flags=void 0===c?0:c,Sk.builtin.none.none$}),h=new Sk.builtin.func(function(a){var b="re.compile(\'"+Sk.ffi.remapToJs(a.re)+"\')";return Sk.ffi.remapToPy(b.substring(0,212))}),b.__str__=h,b.__repr__=h,c=function(a,b,c){var d=Sk.ffi.remapToJs(a),e=null==b?0:Sk.ffi.remapToJs(b),f=null==c?d.length:Sk.ffi.remapToJs(c);return"^"==e&&(e=d.indexOf("\\n")+1),null===f&&(f=d.length),Sk.ffi.remapToPy(d.substring(e,f))},d=function(a,b,d,e){Sk.builtin.pyCheckArgsLen("search",arguments.length,2,4);var f=c(b,d,e);return _search(a.re,f,a.flags)},d.co_varnames=["self","string","pos","endpos"],d.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.search=new Sk.builtin.func(d),e=function(a,b,d,e){Sk.builtin.pyCheckArgsLen("match",arguments.length,2,4);var f=c(b,d,e);return _match(a.re,f,a.flags)},e.co_varnames=["self","string","pos","endpos"],e.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.match=new Sk.builtin.func(e),f=function(a,b,c){if(Sk.builtin.pyCheckArgsLen("split",arguments.length,2,3),void 0===c&&(c=0),!Sk.builtin.checkInt(c))throw new Sk.builtin.TypeError("maxsplit must be an integer");return _split(a.re,b,c,a.flags)},f.co_varnames=["self","string","maxsplit"],f.$defaults=[new Sk.builtin.int_(0)],b.split=new Sk.builtin.func(f),g=function(a,b,d,e){Sk.builtin.pyCheckArgsLen("findall",arguments.length,2,4);var f=c(b,d,e);return _findall(a.re,f,a.flags)},g.co_varnames=["self","string","pos","endpos"],g.$defaults=[new Sk.builtin.int_(0),Sk.builtin.none.none$],b.findall=new Sk.builtin.func(g)},mod.RegexObject=Sk.misceval.buildClass(mod,regexobj,"RegexObject",[]),mod.compile=new Sk.builtin.func(function(a,b){var c;if(Sk.builtin.pyCheckArgsLen("compile",arguments.length,1,2),!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError("pattern must be a string");if(void 0===b&&(b=0),!Sk.builtin.checkNumber(b))throw new Sk.builtin.TypeError("flags must be a number");return c=Sk.misceval.callsimArray(mod.RegexObject,[a,b]),c}),mod.purge=new Sk.builtin.func(function(){}),mod};',"src/lib/repr.py":'raise NotImplementedError("repr is not yet implemented in Skulpt")\n',"src/lib/rexec.py":'raise NotImplementedError("rexec is not yet implemented in Skulpt")\n',"src/lib/rfc822.py":'raise NotImplementedError("rfc822 is not yet implemented in Skulpt")\n',"src/lib/rlcompleter.py":'raise NotImplementedError("rlcompleter is not yet implemented in Skulpt")\n',"src/lib/robotparser.py":'raise NotImplementedError("robotparser is not yet implemented in Skulpt")\n',"src/lib/runpy.py":'raise NotImplementedError("runpy is not yet implemented in Skulpt")\n',"src/lib/sched.py":'raise NotImplementedError("sched is not yet implemented in Skulpt")\n',"src/lib/sets.py":'raise NotImplementedError("sets is not yet implemented in Skulpt")\n',"src/lib/sgmllib.py":'raise NotImplementedError("sgmllib is not yet implemented in Skulpt")\n',"src/lib/sha.py":'raise NotImplementedError("sha is not yet implemented in Skulpt")\n',"src/lib/shelve.py":'raise NotImplementedError("shelve is not yet implemented in Skulpt")\n',"src/lib/shlex.py":'raise NotImplementedError("shlex is not yet implemented in Skulpt")\n',"src/lib/shutil.py":'raise NotImplementedError("shutil is not yet implemented in Skulpt")\n',"src/lib/signal.js":'var $builtinmodule=function(){var a={SIG_DFL:new Sk.builtin.int_(0),SIG_IGN:new Sk.builtin.int_(1),CTRL_C_EVENT:new Sk.builtin.int_(0),CTRL_BREAK_EVENT:new Sk.builtin.int_(0),NSIG:new Sk.builtin.int_(23),SIGHUP:new Sk.builtin.int_(1),SIGNINT:new Sk.builtin.int_(2),SIGILL:new Sk.builtin.int_(4),SIGFPE:new Sk.builtin.int_(8),SIGKILL:new Sk.builtin.int_(9),SIGSEGV:new Sk.builtin.int_(11),SIGTERM:new Sk.builtin.int_(15),SIGBREAK:new Sk.builtin.int_(21),SIGABRT:new Sk.builtin.int_(22),pause:new Sk.builtin.func(function(){Sk.builtin.pyCheckArgsLen("pause",arguments.length,0,0);var a=new Sk.misceval.Suspension;return a.resume=function(){return Sk.builtin.none.none$},a.data={type:"Sk.promise",promise:new Promise(function(a){if(null!=Sk.signals&&Sk.signals.addEventListener){function handleSignal(){Sk.signals.removeEventListener(handleSignal),a()}Sk.signals.addEventListener(handleSignal)}else console.warn("signal.pause() not supported"),Sk.misceval.print_("signal.pause() not supported"),a()})},a}),signal:new Sk.builtin.func(function(){throw new Sk.builtin.NotImplementedError("signal.signal is not supported.")})};return a};',"src/lib/site.py":'raise NotImplementedError("site is not yet implemented in Skulpt")\n',"src/lib/smtpd.py":'raise NotImplementedError("smtpd is not yet implemented in Skulpt")\n',"src/lib/smtplib.py":'raise NotImplementedError("smtplib is not yet implemented in Skulpt")\n',"src/lib/sndhdr.py":'raise NotImplementedError("sndhdr is not yet implemented in Skulpt")\n',"src/lib/socket.py":'raise NotImplementedError("socket is not yet implemented in Skulpt")\n',"src/lib/sqlite3/__init__.py":'raise NotImplementedError("sqlite3 is not yet implemented in Skulpt")\n',"src/lib/sre.py":'raise NotImplementedError("sre is not yet implemented in Skulpt")\n',"src/lib/sre_compile.py":'raise NotImplementedError("sre_compile is not yet implemented in Skulpt")\n',"src/lib/sre_constants.py":'raise NotImplementedError("sre_constants is not yet implemented in Skulpt")\n',"src/lib/sre_parse.py":'raise NotImplementedError("sre_parse is not yet implemented in Skulpt")\n',"src/lib/ssl.py":'raise NotImplementedError("ssl is not yet implemented in Skulpt")\n',"src/lib/stat.py":'raise NotImplementedError("stat is not yet implemented in Skulpt")\n',"src/lib/statvfs.py":'raise NotImplementedError("statvfs is not yet implemented in Skulpt")\n',"src/lib/string.js":'var $builtinmodule=function(){var a={};return a.ascii_lowercase=new Sk.builtin.str("abcdefghijklmnopqrstuvwxyz"),a.ascii_uppercase=new Sk.builtin.str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),a.ascii_letters=new Sk.builtin.str(a.ascii_lowercase.v+a.ascii_uppercase.v),a.lowercase=new Sk.builtin.str("abcdefghijklmnopqrstuvwxyz"),a.uppercase=new Sk.builtin.str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),a.letters=new Sk.builtin.str(a.lowercase.v+a.uppercase.v),a.digits=new Sk.builtin.str("0123456789"),a.hexdigits=new Sk.builtin.str("0123456789abcdefABCDEF"),a.octdigits=new Sk.builtin.str("01234567"),a.punctuation=new Sk.builtin.str("!\\"#$%&\'()*+,-./:;<=>?@[\\\\]^_`{|}~"),a.whitespace=new Sk.builtin.str("\\t\\n\\x0B\\f\\r "),a.printable=new Sk.builtin.str(a.digits.v+a.letters.v+a.punctuation.v+" \\t\\n\\r\\x0B\\f"),a.split=new Sk.builtin.func(function(...a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.split,a)}),a.capitalize=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.capitalize,[a])}),a.join=new Sk.builtin.func(function(a,b){return void 0===b&&(b=new Sk.builtin.str(" ")),Sk.misceval.callsimArray(Sk.builtin.str.prototype.join,[b,a])}),a.capwords=new Sk.builtin.func(function(b,c){if(Sk.builtin.pyCheckArgsLen("capwords",arguments.length,1,2),!Sk.builtin.checkString(b))throw new Sk.builtin.TypeError("s must be a string");if(void 0===c&&(c=new Sk.builtin.str(" ")),!Sk.builtin.checkString(c))throw new Sk.builtin.TypeError("sep must be a string");for(var d=Sk.misceval.callsimArray(a.split,[b,c]).v,e=[],f=0;f\n\nimport re, string\n\n__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten']\n\n# Hardcode the recognized whitespace characters to the US-ASCII\n# whitespace characters. The main reason for doing this is that\n# some Unicode spaces (like \\u00a0) are non-breaking whitespaces.\n_whitespace = '\\t\\n\\x0b\\x0c\\r '\n\nclass TextWrapper:\n \"\"\"\n Object for wrapping/filling text. The public interface consists of\n the wrap() and fill() methods; the other methods are just there for\n subclasses to override in order to tweak the default behaviour.\n If you want to completely replace the main wrapping algorithm,\n you'll probably have to override _wrap_chunks().\n Several instance attributes control various aspects of wrapping:\n width (default: 70)\n the maximum width of wrapped lines (unless break_long_words\n is false)\n initial_indent (default: \"\")\n string that will be prepended to the first line of wrapped\n output. Counts towards the line's width.\n subsequent_indent (default: \"\")\n string that will be prepended to all lines save the first\n of wrapped output; also counts towards each line's width.\n expand_tabs (default: true)\n Expand tabs in input text to spaces before further processing.\n Each tab will become 0 .. 'tabsize' spaces, depending on its position\n in its line. If false, each tab is treated as a single character.\n tabsize (default: 8)\n Expand tabs in input text to 0 .. 'tabsize' spaces, unless\n 'expand_tabs' is false.\n replace_whitespace (default: true)\n Replace all whitespace characters in the input text by spaces\n after tab expansion. Note that if expand_tabs is false and\n replace_whitespace is true, every tab will be converted to a\n single space!\n fix_sentence_endings (default: false)\n Ensure that sentence-ending punctuation is always followed\n by two spaces. Off by default because the algorithm is\n (unavoidably) imperfect.\n break_long_words (default: true)\n Break words longer than 'width'. If false, those words will not\n be broken, and some lines might be longer than 'width'.\n break_on_hyphens (default: true)\n Allow breaking hyphenated words. If true, wrapping will occur\n preferably on whitespaces and right after hyphens part of\n compound words.\n drop_whitespace (default: true)\n Drop leading and trailing whitespace from lines.\n max_lines (default: None)\n Truncate wrapped lines.\n placeholder (default: ' [...]')\n Append to the last line of truncated text.\n \"\"\"\n\n unicode_whitespace_trans = {}\n # uspace = ord(' ')\n uspace = ' '\n for x in _whitespace:\n # unicode_whitespace_trans[ord(x)] = uspace\n unicode_whitespace_trans[x] = uspace\n\n # This funky little regex is just the trick for splitting\n # text up into word-wrappable chunks. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!\n # (after stripping out empty strings).\n wordsep_re = re.compile(\n r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W]))') # hyphenated words\n em_dash = re.compile(r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W])|' # hyphenated words\n r'(?!^)-{2,}(?=\\w))') # em-dash\n\n \n # This less funky little regex just split on recognized spaces. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/\n wordsep_simple_re = re.compile(r'(\\s+)')\n\n\n # XXX this is not locale- or charset-aware -- string.lowercase\n # is US-ASCII only (and therefore English-only)\n sentence_end_re = re.compile(r'[a-z]' # lowercase letter\n r'[\\.\\!\\?]' # sentence-ending punct.\n r'[\\\"\\']?' # optional end-of-quote\n r'\\Z') # end of chunk\n sentence_end_re = r'[a-z][\\.\\!\\?][\\\"\\']?'\n\n def __init__(self,\n width=70,\n initial_indent=\"\",\n subsequent_indent=\"\",\n expand_tabs=True,\n replace_whitespace=True,\n fix_sentence_endings=False,\n break_long_words=True,\n drop_whitespace=True,\n break_on_hyphens=True,\n tabsize=8,\n max_lines=None,\n placeholder=' [...]'):\n self.width = width\n self.initial_indent = initial_indent\n self.subsequent_indent = subsequent_indent\n self.expand_tabs = expand_tabs\n self.replace_whitespace = replace_whitespace\n self.fix_sentence_endings = fix_sentence_endings\n self.break_long_words = break_long_words\n self.drop_whitespace = drop_whitespace\n self.break_on_hyphens = break_on_hyphens\n self.tabsize = tabsize\n self.max_lines = max_lines\n self.placeholder = placeholder\n\n\n # -- Private methods -----------------------------------------------\n # (possibly useful for subclasses to override)\n\n def _munge_whitespace(self, text):\n \"\"\"_munge_whitespace(text : string) -> string\n Munge whitespace in text: expand tabs and convert all other\n whitespace characters to spaces. Eg. \" foo\\\\tbar\\\\n\\\\nbaz\"\n becomes \" foo bar baz\".\n \"\"\"\n if self.expand_tabs:\n text = text.expandtabs(self.tabsize)\n if self.replace_whitespace:\n for key, val in self.unicode_whitespace_trans.items():\n text = text.replace(key, val)\n return text\n\n\n def _split(self, text):\n \"\"\"_split(text : string) -> [string]\n Split the text to wrap into indivisible chunks. Chunks are\n not quite the same as words; see _wrap_chunks() for full\n details. As an example, the text\n Look, goof-ball -- use the -b option!\n breaks into the following chunks:\n 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', 'option!'\n if break_on_hyphens is True, or in:\n 'Look,', ' ', 'goof-ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', option!'\n otherwise.\n \"\"\"\n if self.break_on_hyphens is True:\n chunks = self.wordsep_re.split(text)\n if \"--\" in text:\n chunks = [item \n for sublist in [self.em_dash.split(chunk) for chunk in chunks] \n for item in sublist]\n else:\n chunks = self.wordsep_simple_re.split(text)\n chunks = [c for c in chunks if c]\n return chunks\n\n def _fix_sentence_endings(self, chunks):\n \"\"\"_fix_sentence_endings(chunks : [string])\n Correct for sentence endings buried in 'chunks'. Eg. when the\n original text contains \"... foo.\\\\nBar ...\", munge_whitespace()\n and split() will convert that to [..., \"foo.\", \" \", \"Bar\", ...]\n which has one too few spaces; this method simply changes the one\n space to two.\n \"\"\"\n i = 0\n # patsearch = self.sentence_end_re.search\n while i < len(chunks)-1:\n if chunks[i+1] == \" \" and re.search(self.sentence_end_re, chunks[i]) and chunks[i][-1] in \".!?\\\"\\'\":\n chunks[i+1] = \" \"\n i += 2\n else:\n i += 1\n\n def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):\n \"\"\"_handle_long_word(chunks : [string],\n cur_line : [string],\n cur_len : int, width : int)\n Handle a chunk of text (most likely a word, not whitespace) that\n is too long to fit in any line.\n \"\"\"\n # Figure out when indent is larger than the specified width, and make\n # sure at least one character is stripped off on every pass\n if width < 1:\n space_left = 1\n else:\n space_left = width - cur_len\n\n # If we're allowed to break long words, then do so: put as much\n # of the next chunk onto the current line as will fit.\n if self.break_long_words:\n cur_line.append(reversed_chunks[-1][:space_left])\n reversed_chunks[-1] = reversed_chunks[-1][space_left:]\n\n # Otherwise, we have to preserve the long word intact. Only add\n # it to the current line if there's nothing already there --\n # that minimizes how much we violate the width constraint.\n elif not cur_line:\n cur_line.append(reversed_chunks.pop())\n\n # If we're not allowed to break long words, and there's already\n # text on the current line, do nothing. Next time through the\n # main loop of _wrap_chunks(), we'll wind up here again, but\n # cur_len will be zero, so the next line will be entirely\n # devoted to the long word that we can't handle right now.\n\n def _wrap_chunks(self, chunks):\n \"\"\"_wrap_chunks(chunks : [string]) -> [string]\n Wrap a sequence of text chunks and return a list of lines of\n length 'self.width' or less. (If 'break_long_words' is false,\n some lines may be longer than this.) Chunks correspond roughly\n to words and the whitespace between them: each chunk is\n indivisible (modulo 'break_long_words'), but a line break can\n come between any two chunks. Chunks should not have internal\n whitespace; ie. a chunk is either all whitespace or a \"word\".\n Whitespace chunks will be removed from the beginning and end of\n lines, but apart from that whitespace is preserved.\n \"\"\"\n lines = []\n if self.width <= 0:\n raise ValueError(\"invalid width %r (must be > 0)\" % self.width)\n if self.max_lines is not None:\n if self.max_lines > 1:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n if len(indent) + len(self.placeholder.lstrip()) > self.width:\n raise ValueError(\"placeholder too large for max width\")\n\n # Arrange in reverse order so items can be efficiently popped\n # from a stack of chucks.\n chunks.reverse()\n\n while chunks:\n\n # Start the list of chunks that will make up the current line.\n # cur_len is just the length of all the chunks in cur_line.\n cur_line = []\n cur_len = 0\n\n # Figure out which static string will prefix this line.\n if lines:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n\n # Maximum width for this line.\n width = self.width - len(indent)\n\n # First chunk on line is whitespace -- drop it, unless this\n # is the very beginning of the text (ie. no lines started yet).\n if self.drop_whitespace and chunks[-1].strip() == '' and lines:\n del chunks[-1]\n\n while chunks:\n l = len(chunks[-1])\n\n # Can at least squeeze this chunk onto the current line.\n if cur_len + l <= width:\n cur_line.append(chunks.pop())\n cur_len += l\n\n # Nope, this line is full.\n else:\n break\n\n # The current line is full, and the next chunk is too big to\n # fit on *any* line (not just this one).\n if chunks and len(chunks[-1]) > width:\n self._handle_long_word(chunks, cur_line, cur_len, width)\n cur_len = sum(map(len, cur_line))\n\n # If the last chunk on this line is all whitespace, drop it.\n if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n\n if cur_line:\n if (self.max_lines is None or\n len(lines) + 1 < self.max_lines or\n (not chunks or\n self.drop_whitespace and\n len(chunks) == 1 and\n not chunks[0].strip()) and cur_len <= width):\n # Convert current line back to a string and store it in\n # list of all lines (return value).\n lines.append(indent + ''.join(cur_line))\n else:\n while cur_line:\n if (cur_line[-1].strip() and\n cur_len + len(self.placeholder) <= width):\n cur_line.append(self.placeholder)\n lines.append(indent + ''.join(cur_line))\n break\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n else:\n if lines:\n prev_line = lines[-1].rstrip()\n if (len(prev_line) + len(self.placeholder) <=\n self.width):\n lines[-1] = prev_line + self.placeholder\n break\n lines.append(indent + self.placeholder.lstrip())\n break\n\n return lines\n\n def _split_chunks(self, text):\n text = self._munge_whitespace(text)\n return self._split(text)\n\n # -- Public interface ----------------------------------------------\n\n def wrap(self, text):\n \"\"\"wrap(text : string) -> [string]\n Reformat the single paragraph in 'text' so it fits in lines of\n no more than 'self.width' columns, and return a list of wrapped\n lines. Tabs in 'text' are expanded with string.expandtabs(),\n and all other whitespace characters (including newline) are\n converted to space.\n \"\"\"\n chunks = self._split_chunks(text)\n if self.fix_sentence_endings:\n self._fix_sentence_endings(chunks)\n return self._wrap_chunks(chunks)\n\n def fill(self, text):\n \"\"\"fill(text : string) -> string\n Reformat the single paragraph in 'text' to fit in lines of no\n more than 'self.width' columns, and return a new string\n containing the entire wrapped paragraph.\n \"\"\"\n return \"\\n\".join(self.wrap(text))\n\n\n# -- Convenience interface ---------------------------------------------\n\ndef wrap(text, width=70, **kwargs):\n \"\"\"Wrap a single paragraph of text, returning a list of wrapped lines.\n Reformat the single paragraph in 'text' so it fits in lines of no\n more than 'width' columns, and return a list of wrapped lines. By\n default, tabs in 'text' are expanded with string.expandtabs(), and\n all other whitespace characters (including newline) are converted to\n space. See TextWrapper class for available keyword args to customize\n wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.wrap(text)\n\ndef fill(text, width=70, **kwargs):\n \"\"\"Fill a single paragraph of text, returning a new string.\n Reformat the single paragraph in 'text' to fit in lines of no more\n than 'width' columns, and return a new string containing the entire\n wrapped paragraph. As with wrap(), tabs are expanded and other\n whitespace characters converted to space. See TextWrapper class for\n available keyword args to customize wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.fill(text)\n\ndef shorten(text, width, **kwargs):\n \"\"\"Collapse and truncate the given text to fit in the given width.\n The text first has its whitespace collapsed. If it then fits in\n the *width*, it is returned as is. Otherwise, as many words\n as possible are joined and then the placeholder is appended::\n >>> textwrap.shorten(\"Hello world!\", width=12)\n 'Hello world!'\n >>> textwrap.shorten(\"Hello world!\", width=11)\n 'Hello [...]'\n \"\"\"\n w = TextWrapper(width=width, max_lines=1, **kwargs)\n return w.fill(' '.join(text.strip().split()))\n\n\n# -- Loosely related functionality -------------------------------------\n\n# _whitespace_only_re = re.compile('^[ \\t]+$', re.MULTILINE)\n# _leading_whitespace_re = re.compile('(^[ \\t]*)(?:[^ \\t\\n])', re.MULTILINE)\n\ndef dedent(text):\n \"\"\"Remove any common leading whitespace from every line in `text`.\n This can be used to make triple-quoted strings line up with the left\n edge of the display, while still presenting them in the source code\n in indented form.\n Note that tabs and spaces are both treated as whitespace, but they\n are not equal: the lines \" hello\" and \"\\\\thello\" are\n considered to have no common leading whitespace.\n Entirely blank lines are normalized to a newline character.\n \"\"\"\n # Look for the longest leading string of spaces and tabs common to\n # all lines.\n margin = None\n\n indents = re.findall(r'(^[ \\t]*)(?:[^ \\t\\n])',text, re.MULTILINE)\n for indent in indents:\n if margin is None:\n margin = indent\n\n # Current line more deeply indented than previous winner:\n # no change (previous winner is still on top).\n elif indent.startswith(margin):\n pass\n\n # Current line consistent with and no deeper than previous winner:\n # it's the new winner.\n elif margin.startswith(indent):\n margin = indent\n\n # Find the largest common whitespace between current line and previous\n # winner.\n else:\n for i, (x, y) in enumerate(zip(margin, indent)):\n if x != y:\n margin = margin[:i]\n break\n # sanity check (testing/debugging only)\n if 0 and margin:\n for line in text.split(\"\\n\"):\n assert not line or line.startswith(margin), \\\n \"line = %r, margin = %r\" % (line, margin)\n\n if margin:\n lines = [line[len(margin):] \n if line.strip()\n else line.strip() \n for line in text.split(\"\\n\")]\n text = \"\\n\".join(lines)\n return text\n\n\ndef indent(text, prefix, predicate=None):\n \"\"\"Adds 'prefix' to the beginning of selected lines in 'text'.\n If 'predicate' is provided, 'prefix' will only be added to the lines\n where 'predicate(line)' is True. If 'predicate' is not provided,\n it will default to adding 'prefix' to all non-empty lines that do not\n consist solely of whitespace characters.\n \"\"\"\n if predicate is None:\n def predicate(line):\n return line.strip()\n\n def prefixed_lines():\n for line in text.splitlines(True):\n yield (prefix + line if predicate(line) else line)\n return ''.join(prefixed_lines())\n\n\nif __name__ == \"__main__\":\n #print dedent(\"\\tfoo\\n\\tbar\")\n #print dedent(\" \\thello there\\n \\t how are you?\")\n print(dedent(\"Hello there.\\n This is indented.\"))","src/lib/this.py":'raise NotImplementedError("this is not yet implemented in Skulpt")\n',"src/lib/threading.py":'raise NotImplementedError("threading is not yet implemented in Skulpt")\n',"src/lib/time.js":'var $builtinmodule=function(){function check_struct_time(a){if(!(a instanceof b))throw new Sk.builtin.TypeError("Required argument \'struct_time\' must be of type: \'struct_time\'");var c,d=a.v.length,e=a.v;for(c=0;c",function jsReadline(){const b=Sk.misceval.callsimArray(a);return Sk.ffi.remapToJs(b)},"UTF-8",function receiveToken(a){b.push(new Sk.builtin.tuple([Sk.ffi.remapToPy(a.type),Sk.ffi.remapToPy(a.string),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.start[0]),Sk.ffi.remapToPy(a.start[1])]),new Sk.builtin.tuple([Sk.ffi.remapToPy(a.end[0]),Sk.ffi.remapToPy(a.end[1])]),Sk.ffi.remapToPy(a.line)]))}),new Sk.builtin.list(b)})};return a};',"src/lib/trace.py":'raise NotImplementedError("trace is not yet implemented in Skulpt")\n',"src/lib/traceback.py":'raise NotImplementedError("traceback is not yet implemented in Skulpt")\n',"src/lib/tty.py":'raise NotImplementedError("tty is not yet implemented in Skulpt")\n',"src/lib/turtle.js":'var $builtinmodule=function(){"use strict";var e=function getConfiguredTarget(){var e,t;for(e=Sk.TurtleGraphics&&Sk.TurtleGraphics.target||"turtle",t="string"==typeof e?document.getElementById(e):e;t.firstChild;)t.removeChild(t.firstChild);return t}();return e.turtleInstance?e.turtleInstance.reset():e.turtleInstance=function generateTurtleModule(e){var t=Math.round,r=Math.max,n=Math.sqrt,a=Math.min,s=Math.abs,o=Math.PI,d=Math.atan2,_=Math.sin,c=Math.cos;function getAsset(e){var t=g.assets,r="function"==typeof t?t(e):t[e];return"string"==typeof r?new Promise(function(t,n){var a=new Image;a.onload=function(){g.assets[e]=this,t(a)},a.onerror=function(){n(new Error("Missing asset: "+r))},a.src=r}):new InstantPromise(void 0,r)}function InstantPromise(e,t){this.lastResult=t,this.lastError=e}function FrameManager(){this.reset()}function getFrameManager(){return A||(A=new FrameManager),A}function MouseHandler(){var t=this;for(var r in this._target=getTarget(),this._managers={},this._handlers={mousedown:function(r){t.onEvent("mousedown",r)},mouseup:function(r){t.onEvent("mouseup",r)},mousemove:function(r){t.onEvent("mousemove",r)}},this._handlers)this._target.addEventListener(r,this._handlers[r])}function EventManager(e,t){this._type=e,this._target=t,this._handlers=void 0,getMouseHandler().addManager(e,this)}function Turtle(e){if(getFrameManager().addTurtle(this),this._screen=getScreen(),this._managers={},this._shape=e.v,!v.hasOwnProperty(this._shape))throw new Sk.builtin.ValueError("Shape:\'"+this._shape+"\' not in default shape, please check shape again!");this.reset()}function Screen(){var e,t;this._frames=1,this._delay=void 0,this._bgcolor="none",this._mode="standard",this._managers={},this._keyLogger={},e=(g.worldWidth||g.width||getWidth())/2,t=(g.worldHeight||g.height||getHeight())/2,this.setUpWorld(-e,-t,e,t)}function ensureAnonymous(){return f||(f=Sk.misceval.callsimArray(y.Turtle)),f.instance}function getTarget(){return e}function getScreen(){return p||(p=new Screen),p}function getMouseHandler(){return h||(h=new MouseHandler),h}function getWidth(){return 0|(p&&p._width||g.width||getTarget().clientWidth||T.width)}function getHeight(){return 0|(p&&p._height||g.height||getTarget().clientHeight||T.height)}function createLayer(e,t){var r,n=document.createElement("canvas"),a=getWidth(),s=getHeight(),l=getTarget().firstChild?-s+"px":"0";return n.width=a,n.height=s,n.style.position="relative",n.style.display="block",n.style.setProperty("margin-top",l),n.style.setProperty("z-index",e),t&&(n.style.display="none"),getTarget().appendChild(n),r=n.getContext("2d"),r.lineCap="round",r.lineJoin="round",applyWorld(getScreen(),r),r}function cancelAnimationFrame(){u&&((window.cancelAnimationFrame||window.mozCancelAnimationFrame)(u),u=void 0),m&&(window.clearTimeout(m),m=void 0)}function applyWorld(e,t){var r=e.llx,n=e.lly,a=e.urx,s=e.ury,l=e.xScale,i=e.yScale;t&&(clearLayer(t),t.restore(),t.save(),t.scale(1/l,1/i),t.translate(-r,-s))}function pushUndo(e){var t,r,n;if(g.allowUndo&&e._bufferSize){for(e._undoBuffer||(e._undoBuffer=[]);e._undoBuffer.length>e._bufferSize;)e._undoBuffer.shift();for(r={},t=["x","y","angle","radians","color","fill","down","filling","shown","shape","size"],n=0;no;o++)if("number"==typeof t[o])t[o]=r(0,a(255,parseInt(t[o])));else throw new Sk.builtin.ValueError("bad color sequence");}else for(o=0;3>o;o++)if("number"!=typeof t[o])throw new Sk.builtin.ValueError("bad color sequence");else if(1>=t[o])t[o]=r(0,a(255,parseInt(255*t[o])));else throw new Sk.builtin.ValueError("bad color sequence");"number"==typeof t[o]?(t[3]=r(0,a(1,t[o])),t="rgba("+t.join(",")+")"):t="rgb("+t.slice(0,3).join(",")+")"}else if("string"==typeof t&&!t.match(/\\s*url\\s*\\(/i))t=t.replace(/\\s+/g,"");else return"black";return t}function calculateHeading(e,t,r){var n=e._angle||0,a=e._radians||0;return r||(r={}),"number"==typeof t&&(e._isRadians?n=a=t%Turtle.RADIANS:e._fullCircle?(n=t%e._fullCircle,a=n/e._fullCircle*Turtle.RADIANS):n=a=0,0>n&&(n+=e._fullCircle,a+=Turtle.RADIANS)),r.angle=n,r.radians=a,r}function pythonToJavascriptFunction(e,t){return function(){var r=Array.prototype.slice.call(arguments),n=r.map(function(e){return Sk.ffi.remapToPy(e)});return"undefined"!=typeof t&&n.unshift(t),Sk.misceval.applyAsync(void 0,e,void 0,void 0,void 0,n).catch(Sk.uncaughtException)}}function addModuleMethod(e,t,r,n){var a,s=r.replace(/^\\$/,""),l=s.replace(/_\\$[a-z]+\\$$/i,""),o=e.prototype[r].length,d=e.prototype[r].minArgs,_=e.prototype[r].co_varnames||[],c=e.prototype[r].returnType,u=e.prototype[r].isSk;void 0===d&&(d=o),a=function(){var e,t,a,s,_,m=Array.prototype.slice.call(arguments,0),p=n?n():m.shift().instance;if(m.lengtho)throw _=d===o?"exactly "+o:"between "+d+" and "+o,new Sk.builtin.TypeError(l+"() takes "+_+" positional argument(s) ("+m.length+" given)");for(e=m.length;0<=--e;)void 0!==m[e]&&(m[e]=m[e]instanceof Sk.builtin.func?pythonToJavascriptFunction(m[e]):m[e]instanceof Sk.builtin.method?pythonToJavascriptFunction(m[e].im_func,m[e].im_self):m[e]&&m[e].$d instanceof Sk.builtin.dict&&m[e].instance?m[e].instance:Sk.ffi.remapToJs(m[e]));var g=m.slice(0);for(m=[],e=g.length;0<=e;--e)null!==g[e]&&(m[e]=g[e]);try{t=p[r].apply(p,m)}catch(t){throw window&&window.console&&(window.console.log("wrapped method failed"),window.console.log(t.stack)),t}return t instanceof InstantPromise&&(t=t.lastResult),t instanceof Promise?(t=t.catch(function(t){throw window&&window.console&&(window.console.log("promise failed"),window.console.log(t.stack)),t}),a=new Sk.misceval.Suspension,a.resume=function(){return void 0===s?Sk.builtin.none.none$:Sk.ffi.remapToPy(s)},a.data={type:"Sk.promise",promise:t.then(function(e){return s=e,e})},a):void 0===t?Sk.builtin.none.none$:u?t:"function"==typeof c?c(t):Sk.ffi.remapToPy(t)},a.co_name=new Sk.builtin.str(l),a.co_varnames=_.slice(),a.$defaults=[];for(var m=d;m<_.length;m++)a.$defaults.push(Sk.builtin.none.none$);n||a.co_varnames.unshift("self"),t[s]=new Sk.builtin.func(a)}function initTurtle(e,t){Sk.builtin.pyCheckArgs("__init__",arguments,2,3,!1,!1),e.instance=new Turtle(t),e.instance.skInstance=e}function focusTurtle(e){return void 0!==e&&(w=!!e,w?getTarget().focus():getTarget().blur()),w}function resetTurtle(){for(cancelAnimationFrame(),getScreen().reset(),getFrameManager().reset();e.firstChild;)e.removeChild(e.firstChild);h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}function stopTurtle(){cancelAnimationFrame(),h&&h.reset(),$=0,p=void 0,f=void 0,h=void 0,k=0}var u,m,p,g,f,h,y={__name__:new Sk.builtin.str("turtle")},$=0,w=!0,b=1e3/30,v={},k=0,x={},T={target:"turtle",width:400,height:400,worldWidth:0,worldHeight:0,animate:!0,bufferSize:0,allowUndo:!0,assets:{}};e.hasAttribute("tabindex")||e.setAttribute("tabindex",0),x.FLOAT=function(e){return new Sk.builtin.float_(e)},x.COLOR=function(e){if("string"==typeof e)return new Sk.builtin.str(e);for(var t=0;3>t;t++)e[t]=Sk.builtin.assk$(e[t]);return 4===e.length&&(e[3]=new Sk.builtin.float_(e[3])),new Sk.builtin.tuple(e)},x.TURTLE_LIST=function(e){for(var t=[],r=0;rt&&(t+=this._fullCircle),this.rotate(e,t-e)},e.getManager=function(e){return this._managers[e]||(this._managers[e]=new EventManager(e,this)),this._managers[e]},e.getPaper=function(){return this._paper||(this._paper=createLayer(2))},e.reset=function(){for(var e in this._x=0,this._y=0,this._radians=0,this._angle=0,this._shown=!0,this._down=!0,this._color="black",this._fill="black",this._size=1,this._filling=!1,this._undoBuffer=[],this._speed=3,this._computed_speed=5,this._colorMode=1,this._state=void 0,this._managers)this._managers[e].reset();this._isRadians=!1,this._fullCircle=360,this._bufferSize="number"==typeof g.bufferSize?g.bufferSize:0,removeLayer(this._paper),this._paper=void 0},e.$degrees=function(e){return e="number"==typeof e?s(e):360,this._isRadians=!1,this._angle=e&&this._fullCircle?this._angle/this._fullCircle*e:this._radians=0,this._fullCircle=e,this.addUpdate(void 0,!1,{angle:this._angle,radians:this._radians})},e.$degrees.minArgs=0,e.$degrees.co_varnames=["fullcircle"],e.$degrees.returnType=x.FLOAT,e.$radians=function(){return this._isRadians||(this._isRadians=!0,this._angle=this._radians,this._fullCircle=Turtle.RADIANS),this._angle},e.$radians.returnType=x.FLOAT,e.$position=e.$pos=function(){return[this.$xcor(),this.$ycor()]},e.$position.returnType=function(e){return new Sk.builtin.tuple([new Sk.builtin.float_(e[0]),new Sk.builtin.float_(e[1])])},e.$towards=function(e,t){var r=getCoordinates(e,t),n=o+d(this._y-r.y,this._x-r.x),a=n*(this._fullCircle/Turtle.RADIANS);return a},e.$towards.co_varnames=["x","y"],e.$towards.minArgs=1,e.$towards.returnType=x.FLOAT,e.$distance=function(e,t){var r=getCoordinates(e,t),a=r.x-this._x,s=r.y-this._y;return n(a*a+s*s)},e.$distance.co_varnames=["x","y"],e.$distance.minArgs=1,e.$distance.returnType=x.FLOAT,e.$heading=function(){return 1e-13>s(this._angle)?0:this._angle},e.$heading.returnType=x.FLOAT,e.$xcor=function(){return 1e-13>s(this._x)?0:this._x},e.$xcor.returnType=x.FLOAT,e.$ycor=function(){return 1e-13>s(this._y)?0:this._y},e.$ycor.returnType=x.FLOAT,e.$forward=e.$fd=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,e)},e.$forward.co_varnames=e.$fd.co_varnames=["distance"],e.$undo=function(){popUndo(this)},e.$undobufferentries=function(){return this._undoBuffer.length},e.$setundobuffer=function(e){this._bufferSize="number"==typeof e?a(s(e),1e3):0},e.$setundobuffer.co_varnames=["size"],e.$backward=e.$back=e.$bk=function(e){return pushUndo(this),this.queueMoveBy(this._x,this._y,this._radians,-e)},e.$backward.co_varnames=e.$back.co_varnames=e.$bk.co_varnames=["distance"],e.$goto_$rw$=e.$setpos=e.$setposition=function(e,t){var r=getCoordinates(e,t);return pushUndo(this),this.translate(this._x,this._y,r.x-this._x,r.y-this._y,!0)},e.$goto_$rw$.co_varnames=e.$setpos.co_varnames=e.$setposition.co_varnames=["x","y"],e.$goto_$rw$.minArgs=e.$setpos.minArgs=e.$setposition.minArgs=1,e.$setx=function(e){return this.translate(this._x,this._y,e-this._x,0,!0)},e.$setx.co_varnames=["x"],e.$sety=function(e){return this.translate(this._x,this._y,0,e-this._y,!0)},e.$sety.co_varnames=["y"],e.$home=function(){var e=this,t=this._angle;return pushUndo(this),e.translate(this._x,this._y,-this._x,-this._y,!0).then(function(){return e.queueTurnTo(t,0)}).then(function(){})},e.$right=e.$rt=function(e){return pushUndo(this),this.rotate(this._angle,-e)},e.$right.co_varnames=e.$rt.co_varnames=["angle"],e.$left=e.$lt=function(e){return pushUndo(this),this.rotate(this._angle,e)},e.$left.co_varnames=e.$lt.co_varnames=["angle"],e.$setheading=e.$seth=function(e){return pushUndo(this),this.queueTurnTo(this._angle,e)},e.$setheading.co_varnames=e.$seth.co_varnames=["angle"],e.$circle=function(e,t,r){var n,d,u,m,p,g,f,h,$,b=this,v=this._x,k=this._y,T=this._angle,A={},L=1/getScreen().lineScale,S=!0;for(pushUndo(this),void 0===t&&(t=b._fullCircle),void 0===r&&(d=s(t)/b._fullCircle,r=1+(0|a(11+s(e*L)/6,59)*d)),u=t/r,m=.5*u,p=2*e*_(u*o/b._fullCircle),0>e?(p=-p,u=-u,m=-m,n=T-t):n=T+t,$=getFrameManager().willRenderNext()?Promise.resolve():new InstantPromise,T+=m,g=0;g=e&&(e=getWidth()*e),1>=t&&(t=getHeight()*t),this._width=e,this._height=t,this._xOffset=void 0===r||isNaN(parseInt(r))?0:parseInt(r),this._yOffset=void 0===n||isNaN(parseInt(n))?0:parseInt(n),"world"===this._mode?this._setworldcoordinates(this.llx,this.lly,this.urx,this.ury):this._setworldcoordinates(-e/2,-t/2,e/2,t/2)},e.$setup.minArgs=0,e.$setup.co_varnames=["width","height","startx","starty"],e.$register_shape=e.$addshape=function(e,t){return t?void(v[e]=t):getAsset(e).then(function(t){v[e]=t})},e.$register_shape.minArgs=1,e.$getshapes=function(){return Object.keys(v)},e.$tracer=function(e,t){return void 0!==e||void 0!==t?("number"==typeof t&&(this._delay=t,getFrameManager().refreshInterval(t)),"number"==typeof e?(this._frames=e,getFrameManager().frameBuffer(e)):void 0):this._frames},e.$tracer.co_varnames=["frames","delay"],e.$tracer.minArgs=0,e.$delay=function(e){return void 0===e?void 0===this._delay?b:this._delay:this.$tracer(void 0,e)},e.$delay.co_varnames=["delay"],e._setworldcoordinates=function(e,t,r,n){var a=this,s=getFrameManager().turtles();return this.setUpWorld(e,t,r,n),this._sprites&&applyWorld(this,this._sprites),this._background&&applyWorld(this,this._background),this.$clear()},e.$setworldcoordinates=function(e,t,r,n){return this._mode="world",this._setworldcoordinates(e,t,r,n)},e.$setworldcoordinates.co_varnames=["llx","lly","urx","ury"],e.minArgs=4,e.$clear=e.$clearscreen=function(){return this.reset(),this.$reset()},e.$update=function(){return getFrameManager().update()},e.$reset=e.$resetscreen=function(){var e=this,t=getFrameManager().turtles();return getFrameManager().addFrame(function(){applyWorld(e,e._sprites),applyWorld(e,e._background);for(var r=0;r 1:\n print(\'Running %s\' % self.cleanName(func))\n try:\n self.setUp()\n self.assertPassed = 0\n self.assertFailed = 0\n func()\n self.tearDown()\n if self.assertFailed == 0:\n self.numPassed += 1\n else:\n self.numFailed += 1\n print(\'Tests failed in %s \' % self.cleanName(func))\n except Exception as e:\n self.assertFailed += 1\n self.numFailed += 1\n print(\'Test threw exception in %s (%s)\' % (self.cleanName(func), e))\n self.showSummary()\n\n def assertEqual(self, actual, expected, feedback=""):\n res = actual==expected\n if not res and feedback == "":\n feedback = "Expected %s to equal %s" % (str(actual),str(expected))\n self.appendResult(res, actual ,expected, feedback)\n\n def assertNotEqual(self, actual, expected, feedback=""):\n res = actual != expected\n if not res and feedback == "":\n feedback = "Expected %s to not equal %s" % (str(actual),str(expected))\n self.appendResult(res, actual, expected, feedback)\n\n def assertTrue(self,x, feedback=""):\n res = bool(x) is True\n if not res and feedback == "":\n feedback = "Expected %s to be True" % (str(x))\n self.appendResult(res, x, True, feedback)\n\n def assertFalse(self,x, feedback=""):\n res = not bool(x)\n if not res and feedback == "":\n feedback = "Expected %s to be False" % (str(x))\n self.appendResult(res, x, False, feedback)\n\n def assertIs(self,a,b, feedback=""):\n res = a is b\n if not res and feedback == "":\n feedback = "Expected %s to be the same object as %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNot(self,a,b, feedback=""):\n res = a is not b\n if not res and feedback == "":\n feedback = "Expected %s to not be the same object as %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNone(self,x, feedback=""):\n res = x is None\n if not res and feedback == "":\n feedback = "Expected %s to be None" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIsNotNone(self,x, feedback=""):\n res = x is not None\n if not res and feedback == "":\n feedback = "Expected %s to not be None" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIn(self, a, b, feedback=""):\n res = a in b\n if not res and feedback == "":\n feedback = "Expected %s to be in %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIn(self, a, b, feedback=""):\n res = a not in b\n if not res and feedback == "":\n feedback = "Expected %s to not be in %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsInstance(self,a,b, feedback=""):\n res = isinstance(a,b)\n if not res and feedback == "":\n feedback = "Expected %s to be an instance of %s" % (str(a), str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIsInstance(self,a,b, feedback=""):\n res = not isinstance(a,b)\n if not res and feedback == "":\n feedback = "Expected %s to not be an instance of %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertRegex(self, text, expected_regex, feedback=""):\n """Fail the test unless the text matches the regular expression."""\n if isinstance(expected_regex, (str, )): #bytes\n assert expected_regex, "expected_regex must not be empty."\n expected_regex = re.compile(expected_regex)\n if not expected_regex.search(text):\n res = False\n feedback = "Regex didn\'t match: %r not found in %r" % (\n repr(expected_regex), text)\n else:\n res = True\n self.appendResult(res, text, expected_regex, feedback)\n\n def assertNotRegex(self, text, unexpected_regex, feedback=""):\n """Fail the test if the text matches the regular expression."""\n if isinstance(unexpected_regex, (str, )): # bytes\n unexpected_regex = re.compile(unexpected_regex)\n match = unexpected_regex.search(text)\n if match:\n feedback = \'Regex matched: %r matches %r in %r\' % (\n text[match.start() : match.end()],\n repr(unexpected_regex),\n text)\n # _formatMessage ensures the longMessage option is respected\n self.appendResult(not bool(match), text, unexpected_regex, feedback)\n\n def assertAlmostEqual(self, a, b, places=7, feedback="", delta=None):\n\n if delta is not None:\n res = abs(a-b) <= delta\n else:\n if places is None:\n places = 7\n res = round(a-b, places) == 0\n \n if not res and feedback == "":\n feedback = "Expected %s to equal %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotAlmostEqual(self, a, b, places=7, feedback="", delta=None):\n\n if delta is not None:\n res = not (a == b) and abs(a - b) > delta\n else:\n if places is None:\n places = 7\n\n res = round(a-b, places) != 0\n\n if not res and feedback == "":\n feedback = "Expected %s to not equal %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreater(self,a,b, feedback=""):\n res = a > b\n if not res and feedback == "":\n feedback = "Expected %s to be greater than %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreaterEqual(self,a,b, feedback=""):\n res = a >= b\n if not res and feedback == "":\n feedback = "Expected %s to be >= %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLess(self, a, b, feedback=""):\n res = a < b\n if not res and feedback == "":\n feedback = "Expected %s to be less than %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLessEqual(self,a,b, feedback=""):\n res = a <= b\n if not res and feedback == "":\n feedback = "Expected %s to be <= %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def appendResult(self,res,actual,expected,feedback):\n if res:\n msg = \'Pass\'\n self.assertPassed += 1\n else:\n msg = \'Fail: \' + feedback\n print(msg)\n self.assertFailed += 1\n\n def assertRaises(self, expected_exception, *args, **kwargs):\n context = _AssertRaisesContext(expected_exception, self)\n try:\n return context.handle(args, kwargs)\n finally:\n # bpo-23890: manually break a reference cycle\n context = None\n\n def fail(self, msg=None):\n if msg is None:\n msg = \'Fail\'\n else:\n msg = \'Fail: \' + msg\n print(msg)\n self.assertFailed += 1\n\n def showSummary(self):\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\n print("Ran %d tests, passed: %d failed: %d\\n" % (self.numPassed+self.numFailed,\n self.numPassed, self.numFailed))\n\n\n\ndef main(verbosity=1):\n glob = globals() # globals() still needs work\n for name in glob:\n if type(glob[name]) == type and issubclass(glob[name], TestCase):\n try:\n tc = glob[name]()\n tc.verbosity = verbosity\n tc.main()\n except:\n print("Uncaught Error in: ", name)\n',"src/lib/unittest/gui.py":"import document\nfrom unittest import TestCase\n\nclass TestCaseGui(TestCase):\n def __init__(self):\n TestCase.__init__(self)\n self.divid = document.currentDiv()\n self.mydiv = document.getElementById(self.divid)\n res = document.getElementById(self.divid+'_unit_results')\n if res:\n self.resdiv = res\n res.innerHTML = ''\n else:\n self.resdiv = document.createElement('div')\n self.resdiv.setAttribute('id',self.divid+'_unit_results')\n self.resdiv.setAttribute('class','unittest-results')\n self.mydiv.appendChild(self.resdiv)\n\n\n def main(self):\n t = document.createElement('table')\n self.resTable = t\n self.resdiv.appendChild(self.resTable)\n\n headers = ['Result','Actual Value','Expected Value','Notes']\n row = document.createElement('tr')\n for item in headers:\n head = document.createElement('th')\n head.setAttribute('class','ac-feedback')\n head.innerHTML = item\n head.setCSS('text-align','center')\n row.appendChild(head)\n self.resTable.appendChild(row)\n\n for func in self.tlist:\n try:\n self.setUp()\n func()\n self.tearDown()\n except Exception as e:\n self.appendResult('Error', None, None, e)\n self.numFailed += 1\n self.showSummary()\n\n def appendResult(self,res,actual,expected,param):\n trimActual = False\n if len(str(actual)) > 15:\n trimActual = True\n actualType = type(actual)\n trimExpected = False\n if len(str(expected)) > 15:\n trimExpected = True\n expectedType = type(expected)\n row = document.createElement('tr')\n err = False\n if res == 'Error':\n err = True\n msg = 'Error: %s' % param\n errorData = document.createElement('td')\n errorData.setAttribute('class','ac-feedback')\n errorData.innerHTML = 'ERROR'\n errorData.setCSS('background-color','#de8e96')\n errorData.setCSS('text-align','center')\n row.appendChild(errorData)\n elif res:\n passed = document.createElement('td')\n passed.setAttribute('class','ac-feedback')\n passed.innerHTML = 'Pass'\n passed.setCSS('background-color','#83d382')\n passed.setCSS('text-align','center')\n row.appendChild(passed)\n self.numPassed += 1\n else:\n fail = document.createElement('td')\n fail.setAttribute('class','ac-feedback')\n fail.innerHTML = 'Fail'\n fail.setCSS('background-color','#de8e96')\n fail.setCSS('text-align','center')\n row.appendChild(fail)\n self.numFailed += 1\n\n\n act = document.createElement('td')\n act.setAttribute('class','ac-feedback')\n if trimActual:\n actHTML = str(actual)[:5] + \"...\" + str(actual)[-5:]\n if actualType == str:\n actHTML = repr(actHTML)\n act.innerHTML = actHTML\n else:\n act.innerHTML = repr(actual)\n act.setCSS('text-align','center')\n row.appendChild(act)\n\n expect = document.createElement('td')\n expect.setAttribute('class','ac-feedback')\n\n if trimExpected:\n expectedHTML = str(expected)[:5] + \"...\" + str(expected)[-5:]\n if expectedType == str:\n expectedHTML = repr(expectedHTML)\n expect.innerHTML = expectedHTML\n else:\n expect.innerHTML = repr(expected)\n expect.setCSS('text-align','center')\n row.appendChild(expect)\n inp = document.createElement('td')\n inp.setAttribute('class','ac-feedback')\n\n if err:\n inp.innerHTML = msg\n else:\n inp.innerHTML = param\n inp.setCSS('text-align','center')\n row.appendChild(inp)\n self.resTable.appendChild(row)\n\n\n def showSummary(self):\n pct = self.numPassed / (self.numPassed+self.numFailed) * 100\n pTag = document.createElement('p')\n pTag.innerHTML = \"You passed: \" + str(pct) + \"% of the tests\"\n self.resdiv.appendChild(pTag)\n","src/lib/urllib/__init__.js":"var $builtinmodule=function(){return{}};","src/lib/urllib/request/__init__.js":'var $builtinmodule=function(){var a={};return a.Response=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.data$=b.responseText,a.lineList=a.data$.split("\\n"),a.lineList=a.lineList.slice(0,-1);for(var c=0;c")}),b.__iter__=new Sk.builtin.func(function(a){var b=a.lineList;return Sk.builtin.makeGenerator(function(){return this.$index>=this.$lines.length?void 0:new Sk.builtin.str(this.$lines[this.$index++])},{$obj:a,$index:0,$lines:b})}),b.read=new Sk.builtin.func(function(a,b){if(a.closed)throw new Sk.builtin.ValueError("I/O operation on closed file");var c=a.data$.length;void 0===b&&(b=c);var d=new Sk.builtin.str(a.data$.substr(a.pos$,b));return a.pos$+=b,a.pos$>=c&&(a.pos$=c),d}),b.readline=new Sk.builtin.func(function(a){var b="";return a.currentLine
"+a+"
"},d="This page requires a browser that supports WebGL.
Click here to upgrade your browser.",e=function(a){for(var b=["webgl","experimental-webgl","webkit-3d","moz-webgl"],c=null,d=0;dClick here for more information."):c(d)}return h};return a.Context=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){var c=document.getElementById(b.v),d=f(b.v,c);if(!d)throw new Error("Your browser does not appear to support WebGL.");for(var e in a.gl=d,d.__proto__)if("number"==typeof d.__proto__[e])Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),d.__proto__[e]);else if("function"==typeof d.__proto__[e])switch(e){case"bufferData":break;case"clearColor":break;case"drawArrays":break;case"getAttribLocation":break;case"getUniformLocation":break;case"shaderSource":break;case"uniformMatrix4fv":break;case"vertexAttribPointer":break;case"viewport":break;default:(function(b){Sk.abstr.objectSetItem(a.$d,new Sk.builtin.str(e),new Sk.builtin.func(function(){var a=d.__proto__[b];return a.apply(d,arguments)}))})(e);}d.clearColor(100/255,149/255,237/255,1),d.clear(d.COLOR_BUFFER_BIT)}),b.tp$getattr=Sk.generic.getAttr,b.bufferData=new Sk.builtin.func(function(a,b,c,d){a.gl.bufferData(b,c.v,d)}),b.clearColor=new Sk.builtin.func(function(a,b,c,d,e){a.gl.clearColor(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.getAttribLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getAttribLocation(b,c.v)}),b.getUniformLocation=new Sk.builtin.func(function(a,b,c){return a.gl.getUniformLocation(b,c.v)}),b.shaderSource=new Sk.builtin.func(function(a,b,c){a.gl.shaderSource(b,c.v)}),b.drawArrays=new Sk.builtin.func(function(a,b,c,d){a.gl.drawArrays(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d))}),b.vertexAttribPointer=new Sk.builtin.func(function(a,b,c,d,e,f,g){a.gl.vertexAttribPointer(b,Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),e,Sk.builtin.asnum$(f),Sk.builtin.asnum$(g))}),b.viewport=new Sk.builtin.func(function(a,b,c,d,e){a.gl.viewport(Sk.builtin.asnum$(b),Sk.builtin.asnum$(c),Sk.builtin.asnum$(d),Sk.builtin.asnum$(e))}),b.uniformMatrix4fv=new Sk.builtin.func(function(a,b,c,d){a.gl.uniformMatrix4fv(Sk.builtin.asnum$(b),c,d.v)}),b.setDrawFunc=new Sk.builtin.func(function(a,b){var c=new Date().getTime(),d=setInterval(function(){Sk.misceval.callsimArray(b,[a,new Date().getTime()-c])},1e3/60)})},"Context",[]),a.Float32Array=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a,b){a.v="number"==typeof b?new Float32Array(b):new Float32Array(Sk.ffi.remapToJs(b))}),b.__repr__=new Sk.builtin.func(function(a){for(var b=[],c=0;ce;e++)d.elements[4*e+0]=b.elements[4*e+0]*c.elements[0]+b.elements[4*e+1]*c.elements[4]+b.elements[4*e+2]*c.elements[8]+b.elements[4*e+3]*c.elements[12],d.elements[4*e+1]=b.elements[4*e+0]*c.elements[1]+b.elements[4*e+1]*c.elements[5]+b.elements[4*e+2]*c.elements[9]+b.elements[4*e+3]*c.elements[13],d.elements[4*e+2]=b.elements[4*e+0]*c.elements[2]+b.elements[4*e+1]*c.elements[6]+b.elements[4*e+2]*c.elements[10]+b.elements[4*e+3]*c.elements[14],d.elements[4*e+3]=b.elements[4*e+0]*c.elements[3]+b.elements[4*e+1]*c.elements[7]+b.elements[4*e+2]*c.elements[11]+b.elements[4*e+3]*c.elements[15];return b.elements=d.elements,b}),c.lookAt=new Sk.builtin.func(function(b,c,e,f,g,h,i,j,k,l){var m=[c-g,e-h,f-i],n=d(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);n&&(m[0]/=n,m[1]/=n,m[2]/=n);var o=[j,k,l],p=[];p[0]=o[1]*m[2]-o[2]*m[1],p[1]=-o[0]*m[2]+o[2]*m[0],p[2]=o[0]*m[1]-o[1]*m[0],o[0]=m[1]*p[2]-m[2]*p[1],o[1]=-m[0]*p[2]+m[2]*p[0],o[2]=m[0]*p[1]-m[1]*p[0],n=d(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]),n&&(p[0]/=n,p[1]/=n,p[2]/=n),n=d(o[0]*o[0]+o[1]*o[1]+o[2]*o[2]),n&&(o[0]/=n,o[1]/=n,o[2]/=n);var q=Sk.misceval.callsimArray(a.Mat44);return q.elements[0]=p[0],q.elements[4]=p[1],q.elements[8]=p[2],q.elements[12]=0,q.elements[1]=o[0],q.elements[5]=o[1],q.elements[9]=o[2],q.elements[13]=0,q.elements[2]=m[0],q.elements[6]=m[1],q.elements[10]=m[2],q.elements[14]=0,q.elements[3]=0,q.elements[7]=0,q.elements[11]=0,q.elements[15]=1,q=q.multiply(b),b.elements=q.elements,b.translate(-c,-e,-f),b})},"Mat44",[]),a.Mat33=Sk.misceval.buildClass(a,function(a,b){b.__init__=new Sk.builtin.func(function(a){Sk.misceval.callsimArray(b.loadIdentity,[a])}),b.loadIdentity=new Sk.builtin.func(function(a){a.elements=[1,0,0,0,1,0,0,0,1]})},"Mat33",[]),a.Vec3=Sk.misceval.buildClass(a,function(b,c){c.__init__=new Sk.builtin.func(function(a,b,c,d){a.x=b,a.y=c,a.z=d}),c.__sub__=new Sk.builtin.func(function(b,c){return Sk.misceval.callsimArray(a.Vec3,[b.x-c.x,b.y-c.y,b.z-c.z])})},"Vec3",[]),a.cross=new Sk.builtin.func(function(b,c){return Sk.asserts.assert(b instanceof a.Vec3&&c instanceof a.Vec3),Sk.misceval.callsimArray(a.Vec3,[b.y*c.z-b.z*c.y,b.z*c.x-b.x*c.z,b.x*c.y-b.y*c.x])}),a};',"src/lib/webgl/matrix4.js":"var $builtinmodule=function(){var a=Math.PI,b={},c=new Float32Array(3),d=new Float32Array(3),e=new Float32Array(3),f=new Float32Array(4),g=new Float32Array(4),h=new Float32Array(4),i=new Float32Array(16),j=new Float32Array(16),k=new Float32Array(16),l=function(b,c){for(var a=Math.sqrt,d=0,e=c.length,f=0;fe;++e)for(var f=0;4>f;++f)c[4*e+f]=d[4*f+e];return c}),b};","src/lib/webgl/models.js":'var $builtinmodule=function(a){var c={},d=function(a,c){var d=c||gl.ARRAY_BUFFER,e=gl.createBuffer();if(this.target=d,this.buf=e,this.set(a),this.numComponents_=a.numComponents,this.numElements_=a.numElements,this.totalComponents_=this.numComponents_*this.numElements_,a.buffer instanceof Float32Array)this.type_=gl.FLOAT;else if(a.buffer instanceof Uint8Array)this.type_=gl.UNSIGNED_BYTE;else if(a.buffer instanceof Int8Array)this.type_=gl._BYTE;else if(a.buffer instanceof Uint16Array)this.type_=gl.UNSIGNED_SHORT;else if(a.buffer instanceof Int16Array)this.type_=gl.SHORT;else throw"unhandled type:"+typeof a.buffer};return d.prototype.set=function(a){gl.bindBuffer(this.target,this.buf),gl.bufferData(this.target,a.buffer,gl.STATIC_DRAW)},d.prototype.type=function(){return this.type_},d.prototype.numComponents=function(){return this.numComponents_},d.prototype.numElements=function(){return this.numElements_},d.prototype.totalComponents=function(){return this.totalComponents_},d.prototype.buffer=function(){return this.buf},d.prototype.stride=function(){return 0},d.prototype.offset=function(){return 0},c.Model=Sk.misceval.buildClass(c,function(c,e){e.__init__=new Sk.builtin.func(function(c,e,f,g){c.buffers={};var h=function(a,e){var f="indices"==a?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;b=c.buffers[a],b?b.set(e):b=new d(e,f),c.buffers[a]=b};for(a in f)h(a,f[a]);var i={},j=0;for(var k in g)i[k]=j++;c.mode=gl.TRIANGLES,c.textures=g.v,c.textureUnits=i,c.shader=e}),e.drawPrep=new Sk.builtin.func(function(a,c){var d=a.shader,e=a.buffers,f=a.textures;for(var g in c=Sk.ffi.remapToJs(c),Sk.misceval.callsimArray(d.use,[d]),e){var h=e[g];if("indices"==g)gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,h.buffer());else{var i=d.attrib[g];i&&i(h)}}for(var j in f){var k=a.textureUnits[j];d.setUniform$impl(d,textuer,k),f[j].bindToUnit(k)}for(var l in c)d.setUniform$impl(d,l,c[l])}),e.draw=new Sk.builtin.func(function(a,c,d){var e=a.shader;for(uniform in c=Sk.ffi.remapToJs(c),c)e.setUniform$impl(e,uniform,c[uniform]);if(d)for(var f in d){var g=a.textureUnits[f];e.setUniform$impl(e,f,g),d[f].bindToUnit(g)}var h=a.buffers;gl.drawElements(a.mode,h.indices.totalComponents(),gl.UNSIGNED_SHORT,0)})},"Model",[]),c};',"src/lib/webgl/primitives.js":'var $builtinmodule=function(){var a={},b=function(a,b,c){c=c||"Float32Array";var d=window[c];b.length?(this.buffer=new d(b),b=this.buffer.length/a,this.cursor=b):(this.buffer=new d(a*b),this.cursor=0),this.numComponents=a,this.numElements=b,this.type=c};return b.prototype.stride=function(){return 0},b.prototype.offset=function(){return 0},b.prototype.getElement=function(a){for(var b=a*this.numComponents,c=[],d=0;do;++o){c=d[o];for(var p=0;4>p;++p){var q=g[c[p]],r=h[o],s=i[p];k.push(q),l.push(r),m.push(s)}var t=4*o;n.push([t+0,t+1,t+2]),n.push([t+0,t+2,t+3])}return{position:k,normal:l,texCoord:m,indices:n}}),a};',"src/lib/whichdb.py":'raise NotImplementedError("whichdb is not yet implemented in Skulpt")\n',"src/lib/wsgiref/__init__.py":'raise NotImplementedError("wsgiref is not yet implemented in Skulpt")\n',"src/lib/xdrlib.py":'raise NotImplementedError("xdrlib is not yet implemented in Skulpt")\n',"src/lib/xml/__init__.py":'raise NotImplementedError("xml is not yet implemented in Skulpt")\n',"src/lib/xml/dom/__init__.py":'raise NotImplementedError("dom is not yet implemented in Skulpt")\n',"src/lib/xml/etree/__init__.py":'raise NotImplementedError("etree is not yet implemented in Skulpt")\n',"src/lib/xml/parsers/__init__.py":'raise NotImplementedError("parsers is not yet implemented in Skulpt")\n',"src/lib/xml/sax/__init__.py":'raise NotImplementedError("sax is not yet implemented in Skulpt")\n',"src/lib/xmllib.py":'raise NotImplementedError("xmllib is not yet implemented in Skulpt")\n',"src/lib/xmlrpclib.py":'raise NotImplementedError("xmlrpclib is not yet implemented in Skulpt")\n',"src/lib/zipfile.py":'raise NotImplementedError("zipfile is not yet implemented in Skulpt")\n'}}},312:function(e,t,n){(function(){"use strict";var e,t=t||{};t.scope={},t.ASSUME_ES5=!1,t.ASSUME_NO_NATIVE_MAP=!1,t.ASSUME_NO_NATIVE_SET=!1,t.SIMPLE_FROUND_POLYFILL=!1,t.defineProperty=t.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(e,t,n){e!=Array.prototype&&e!=Object.prototype&&(e[t]=n.value)},t.getGlobal=function(e){return"undefined"!=typeof window&&window===e?e:void 0!==n.g&&null!=n.g?n.g:e},t.global=t.getGlobal(this),t.polyfill=function(e,n,i,r){if(n){for(i=t.global,e=e.split("."),r=0;r(t=t||0)&&(t=Math.max(t+i,0));t{Sk.abstr.setUpSlots(e),Sk.abstr.setUpMethods(e),Sk.abstr.setUpGetSets(e)})),n(19),n(20),n(21),[Sk.builtin.str,Sk.builtin.none,Sk.builtin.NotImplemented,Sk.builtin.object].forEach((e=>{(e=e.prototype).__doc__=e.hasOwnProperty("tp$doc")?new Sk.builtin.str(e.tp$doc):Sk.builtin.none.none$})),n(22),n(23),n(24),n(25),n(26),n(27),n(28),n(29),n(31),n(32),n(33),n(34),n(35),n(36),n(37),n(38),n(39),n(40),n(41),n(42),n(43),n(44),n(45),n(46),n(47),n(48),n(49),n(50),n(51),n(52),n(53),n(54),n(55),n(56),n(57),n(58),n(59),n(60),n(61),n(62),n(63),n(64),n(65)},function(e,t,n){(function(e){var t={build:{githash:"6c99c2196851bb29f0e503afccb01804f089cb60",date:"2021-02-23T18:59:26.986Z"}};t.global=void 0!==e?e:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t.exportSymbol=function(e,n){e=e.split(".");var i,r=t.global;for(i=0;i=e||0===t||4<=t)return"th";switch(t){case 1:return"st";case 2:return"nd";case 3:return"rd"}}function o(e){"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}var a={de_DE:{days:"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),shortDays:"So Mo Di Mi Do Fr Sa".split(" "),months:"Januar Februar März April Mai Juni Juli August September Oktober November Dezember".split(" "),shortMonths:"Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d.%m.%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},en_CA:{days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},en_US:{days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%m/%d/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},es_MX:{days:"domingo lunes martes miércoles jueves viernes sábado".split(" "),shortDays:"dom lun mar mié jue vie sáb".split(" "),months:"enero;febrero;marzo;abril;mayo;junio;julio;agosto;septiembre;octubre;noviembre; diciembre".split(";"),shortMonths:"ene feb mar abr may jun jul ago sep oct nov dic".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},fr_FR:{days:"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),shortDays:"dim. lun. mar. mer. jeu. ven. sam.".split(" "),months:"janvier février mars avril mai juin juillet août septembre octobre novembre décembre".split(" "),shortMonths:"janv. févr. mars avril mai juin juil. août sept. oct. nov. déc.".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},it_IT:{days:"domenica lunedì martedì mercoledì giovedì venerdì sabato".split(" "),shortDays:"dom lun mar mer gio ven sab".split(" "),months:"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),shortMonths:"pr mag giu lug ago set ott nov dic".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},nl_NL:{days:"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),shortDays:"zo ma di wo do vr za".split(" "),months:"januari februari maart april mei juni juli augustus september oktober november december".split(" "),shortMonths:"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},pt_BR:{days:"domingo segunda terça quarta quinta sexta sábado".split(" "),shortDays:"Dom Seg Ter Qua Qui Sex Sáb".split(" "),months:"janeiro fevereiro março abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),shortMonths:"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},ru_RU:{days:"Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" "),shortDays:"Вс Пн Вт Ср Чт Пт Сб".split(" "),months:"Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь".split(" "),shortMonths:"янв фев мар апр май июн июл авг сен окт ноя дек".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X",D:"%d.%m.%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},tr_TR:{days:"Pazar Pazartesi Salı Çarşamba Perşembe Cuma Cumartesi".split(" "),shortDays:"Paz Pzt Sal Çrş Prş Cum Cts".split(" "),months:"Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım Aralık".split(" "),shortMonths:"Oca Şub Mar Nis May Haz Tem Ağu Eyl Eki Kas Ara".split(" "),AM:"ÖÖ",PM:"ÖS",am:"ÖÖ",pm:"ÖS",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},zh_CN:{days:"星期日 星期一 星期二 星期三 星期四 星期五 星期六".split(" "),shortDays:"日一二三四五六".split(""),months:"一月份 二月份 三月份 四月份 五月份 六月份 七月份 八月份 九月份 十月份 十一月份 十二月份".split(" "),shortMonths:"一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月".split(" "),AM:"上午",PM:"下午",am:"上午",pm:"下午",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}}},l=a.en_US,u=new function e(u,c,p){function h(e,a,l,u){for(var c="",p=null,d=!1,f=e.length,b=!1,g=0;ga.getHours()?l.am:l.pm;break;case 82:c+=h(l.formats.R,a,l,u);break;case 83:c+=t(a.getSeconds(),p);break;case 84:c+=h(l.formats.T,a,l,u);break;case 85:c+=t(r(a,"sunday"),p);break;case 87:c+=t(r(a,"monday"),p);break;case 88:c+=h(l.formats.X,a,l,u);break;case 89:c+=a.getFullYear();break;case 90:m&&0===_?c+="GMT":c+=(p=a.toString().match(/\(([\w\s]+)\)/))&&p[1]||"";break;case 97:c+=l.shortDays[a.getDay()];break;case 98:case 104:c+=l.shortMonths[a.getMonth()];break;case 99:c+=h(l.formats.c,a,l,u);break;case 100:c+=t(a.getDate(),p);break;case 101:c+=t(a.getDate(),null==p?" ":p);break;case 106:p=new Date(a.getFullYear(),0,1),c+=n(p=Math.ceil((a.getTime()-p.getTime())/864e5));break;case 107:c+=t(a.getHours(),null==p?" ":p);break;case 108:c+=t(i(a.getHours()),null==p?" ":p);break;case 109:c+=t(a.getMonth()+1,p);break;case 110:c+="\n";break;case 111:p=a.getDate(),c=l.ordinalSuffixes?c+(String(p)+(l.ordinalSuffixes[p-1]||s(p))):c+(String(p)+s(p));break;case 112:c+=12>a.getHours()?l.AM:l.PM;break;case 114:c+=h(l.formats.r,a,l,u);break;case 115:c+=Math.floor(u/1e3);break;case 116:c+="\t";break;case 117:c+=0===(p=a.getDay())?7:p;break;case 118:c+=h(l.formats.v,a,l,u);break;case 119:c+=a.getDay();break;case 120:c+=h(l.formats.x,a,l,u);break;case 121:c+=(""+a.getFullYear()).slice(2);break;case 122:m&&0===_?c+=b?"+00:00":"+0000":(p=0!==_?_/6e4:-a.getTimezoneOffset(),d=b?":":"",S=Math.abs(p%60),c+=(0>p?"-":"+")+t(Math.floor(Math.abs(p/60)))+d+t(S));break;default:d&&(c+="%"),c+=e[g]}p=null,d=!1}else 37===S?d=!0:c+=e[g]}return c}var d,f=u||l,_=c||0,m=p||!1,b=0,g=function(e,t){if(t){var n=t.getTime();if(m){var i=6e4*(t.getTimezoneOffset()||0);6e4*((t=new Date(n+i+_)).getTimezoneOffset()||0)!==i&&(t=6e4*(t.getTimezoneOffset()||0),t=new Date(n+t+_))}}else(n=Date.now())>b?(b=n,d=new Date(b),n=b,m&&(d=new Date(b+6e4*(d.getTimezoneOffset()||0)+_))):n=b,t=d;return h(e,t,f,n)};return g.localize=function(t){return new e(t||f,_,m)},g.localizeByIdentifier=function(e){var t=a[e];return t?g.localize(t):(o('[WARNING] No locale found with identifier "'+e+'".'),g)},g.timezone=function(t){var n=_,i=m,r=typeof t;return"number"!==r&&"string"!==r||(i=!0,"string"===r?n=(n="-"===t[0]?-1:1)*(60*(r=parseInt(t.slice(1,3),10))+(t=parseInt(t.slice(3,5),10)))*6e4:"number"===r&&(n=6e4*t)),new e(f,n,i)},g.utc=function(){return new e(f,_,!0)},g}(l,0,!1);if(void 0!==e)e.exports=u;else(function(){return this||(0,eval)("this")}()).strftime=u;"function"!=typeof Date.now&&(Date.now=function(){return+new Date})}()},function(e,t,n){!function(){var t=function(e,n,i){return t.parse(e,n,i)};t.version="0.0.1",(e.exports=t).strptime=t,t.locale={a:"Sun Mon Tue Wed Thu Fri Sat".split(" "),A:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),b:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),B:"January February March April May June July August September October November December".split(" "),f:"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.".split(" "),c:"%Y-%m-%d %H:%M:%S",P:["am","pm"],r:"%I:%M:%S %p",x:"%m/%d/%y",X:"%H:%M:%S",day:["Yesterday","Today","Tomorrow"],bg:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),Bg:"January February March April May June July August September October November December".split(" "),fg:"Jan. Feb. Mar. Apr. May Jun. Jul. Aug. Sep. Oct. Nov. Dec.".split(" "),Date_dBY_year_in_HM:"%#B %-d, %Y at %-H:%M",Date_dBY_year:"%#B %-d, %Y",Date_dBY:"%#B %-d, %Y",Date_AdBY:"%A, %#B %-d, %Y",Date_dBA:"%#B %-d, %A",Date_df_in_HM:"%#f, %-d at %-H:%M",Date_dfY:"%-d %#f %Y",Date_dB_in_HM:"%#B %-d at %-H:%M",Date_df:"%-d %#f"},function(e){function t(e,n,i,r,o,a){if(n=String(n),i=String(i),n=n.replace(/^[#_0\^\-!~]+/,""),!(r=s[n]))return e;var l=!1;if(-1===i.indexOf("!")&&1===n.length&&(-1(t=parseInt(t,10))||99(t=parseInt(t,10))||31(t=parseInt(t,10))||31(t=parseInt(t,10))||23(t=parseInt(t,10))||12(t=parseInt(t,10))||12(t=parseInt(t,10))||59(t=parseInt(t,10))||60(t=parseInt(t,10))||99(t=parseInt(t,10))||12null!==t&&e(t):e=>e instanceof i,i.powermod=(e,t,n)=>{const r=i.BigInt(1);let s=r;for(t=i.greaterThan(t,i.__ZERO)?t:i.unaryMinus(t);i.greaterThan(t,i.__ZERO);)i.bitwiseAnd(t,r)&&(s=i.remainder(i.multiply(s,e),n)),t=i.signedRightShift(t,r),e=i.remainder(i.multiply(e,e),n);return s}}else Object.assign(i,{BigInt:Sk.global.BigInt,toNumber:e=>Number(e),toString:e=>e.toString(),__isBigInt:e=>"bigint"==typeof e,unaryMinus:e=>-e,bitwiseNot:e=>~e,bitwiseAnd:(e,t)=>e&t,bitwiseOr:(e,t)=>e|t,bitwiseXor:(e,t)=>e^t,exponentiate:(e,t)=>{const n=i.BigInt(1);let r=n;for(t=t>i.__ZERO?t:-t;t>i.__ZERO;)t&n&&(r*=e),t>>=n,e*=e;return r},powermod:(e,t,n)=>{const r=i.BigInt(1);let s=r;for(t=t>i.__ZERO?t:-t;t>i.__ZERO;)t&r&&(s=s*e%n),t>>=r,e=e*e%n;return s},multiply:(e,t)=>e*t,divide:(e,t)=>e/t,remainder:(e,t)=>e%t,add:(e,t)=>e+t,subtract:(e,t)=>e-t,leftShift:(e,t)=>e<e>>t,unsignedRightShift:(e,t)=>e>>>t,lessThan:(e,t)=>ee<=t,greaterThan:(e,t)=>e>t,greaterThanOrEqual:(e,t)=>e>=t,equal:(e,t)=>e===t,notEqual:(e,t)=>e!==t});i.__ZERO=i.BigInt(0),i.__MAX_SAFE=i.BigInt(Number.MAX_SAFE_INTEGER),i.__MIN_SAFE=i.BigInt(-Number.MAX_SAFE_INTEGER),i.numberIfSafe=e=>i.lessThan(e,i.__MAX_SAFE)&&i.greaterThan(e,i.__MIN_SAFE)?i.toNumber(e):e},function(e,t,n){e.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){for(var n,i=0;ie.length)&&(t=e.length);for(var n=0,i=Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:t}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,s=!0,o=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return s=e.done,e},e:function(e){o=!0,r=e},f:function(){try{s||null==n.return||n.return()}finally{if(o)throw r}}}}var d=Math.imul,f=Math.clz32,_=function(t){function r(e,t){var n;if(!(this instanceof r))throw new TypeError("Cannot call a class as a function");if(e>r.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded");return(n=a.call(this,e)).sign=t,n}var s=Math.abs,o=Math.max;i(r,t);var a=u(r);return n(r,[{key:"toDebugString",value:function(){var e,t=["BigInt["],n=h(this);try{for(n.s();!(e=n.n()).done;){var i=e.value;t.push((i?(i>>>0).toString(16):i)+", ")}}catch(e){n.e(e)}finally{n.f()}return t.push("]"),t.join("")}},{key:"toString",value:function(){var e=0e||36this.length&&(n=this.length);var i=65535&e;e>>>=16;var s=0,o=65535&t;t>>>=16;for(var a=0;a>>16;l=r.__imul(u,i),u=r.__imul(u,e);var p=r.__imul(c,i),h=o+(65535&l);s=(o=(u>>>16)+(p>>>16)+(65535&(c=r.__imul(c,e)))+((l=t+s+(h>>>16)+(l>>>16)+(65535&u)+(65535&p))>>>16))>>>16,o&=65535,t=c>>>16,this.__setDigit(a,65535&h|l<<16)}if(0!==s||0!==o||0!==t)throw Error("implementation bug")}},{key:"__inplaceAdd",value:function(e,t,n){for(var i,r=0,s=0;s>>16,this.__setHalfDigit(t+s,i);return r}},{key:"__inplaceSub",value:function(e,t,n){var i=0;if(1&t){t>>=1;for(var r=this.__digit(t),s=65535&r,o=0;o>>1;o++){var a=e.__digit(o);i=1&(r=(r>>>16)-(65535&a)-i)>>>16,this.__setDigit(t+o,r<<16|65535&s),i=1&(s=(65535&(r=this.__digit(t+o+1)))-(a>>>16)-i)>>>16}var l=(r>>>16)-(65535&(a=e.__digit(o)))-i;if(i=1&l>>>16,this.__setDigit(t+o,l<<16|65535&s),t+o+1>=this.length)throw new RangeError("out of bounds");!(1&n)&&(i=1&(s=(65535&(r=this.__digit(t+o+1)))-(a>>>16)-i)>>>16,this.__setDigit(t+e.length,4294901760&r|65535&s))}else{for(t>>=1,s=0;s>>16)-((a=e.__digit(s))>>>16)-(i=1&(o=(65535&r)-(65535&a)-i)>>>16))>>>16,this.__setDigit(t+s,r<<16|65535&o);i=1&(r=(65535&(o=this.__digit(t+s)))-(65535&(e=e.__digit(s)))-i)>>>16,a=0,!(1&n)&&(i=1&(a=(o>>>16)-(e>>>16)-i)>>>16),this.__setDigit(t+s,a<<16|65535&r)}return i}},{key:"__inplaceRightShift",value:function(e){if(0!==e){for(var t,n=this.__digit(0)>>>e,i=this.length-1,r=0;r>>e;this.__setDigit(i,n)}}},{key:"__digit",value:function(e){return this[e]}},{key:"__unsignedDigit",value:function(e){return this[e]>>>0}},{key:"__setDigit",value:function(e,t){this[e]=0|t}},{key:"__setDigitGrow",value:function(e,t){this[e]=0|t}},{key:"__halfDigitLength",value:function(){var e=this.length;return 65535>=this.__unsignedDigit(e-1)?2*e-1:2*e}},{key:"__halfDigit",value:function(e){return 65535&this[e>>>1]>>>((1&e)<<4)}},{key:"__setHalfDigit",value:function(e,t){var n=e>>>1,i=this.__digit(n);this.__setDigit(n,1&e?65535&i|t<<16:4294901760&i|65535&t)}}],[{key:"BigInt",value:function(t){var n=Math.floor,i=Number.isFinite;if("number"==typeof t){if(0===t)return r.__zero();if((0|t)===t)return 0>t?r.__oneDigit(-t,!0):r.__oneDigit(t,!1);if(!i(t)||n(t)!==t)throw new RangeError("The number "+t+" cannot be converted to BigInt because it is not an integer");return r.__fromDouble(t)}if("string"==typeof t){if(null===(n=r.__fromString(t)))throw new SyntaxError("Cannot convert "+t+" to a BigInt");return n}if("boolean"==typeof t)return!0===t?r.__oneDigit(1,!1):r.__zero();if("object"===e(t))return t.constructor===r?t:(t=r.__toPrimitive(t),r.BigInt(t));throw new TypeError("Cannot convert "+t+" to a BigInt")}},{key:"toNumber",value:function(e){var t=e.length;if(0===t)return 0;if(1===t){var n=e.__unsignedDigit(0);return e.sign?-n:n}var i=e.__digit(t-1),s=r.__clz32(i);if(1024<(n=32*t-s))return e.sign?-1/0:1/0;--n;var o=t-1,a=s+1;s=(32===a?0:i<>>12;var l=a-12;return t=12<=a?0:i<<20+a,a=20+a,0>>32-l,t=i<>>32-a,a-=32),1!==(i=r.__decideRounding(e,a,o,i))&&(0!==i||1&~t)||0!=(t=t+1>>>0)||!(0!=++s>>>20&&(s=0,1023<++n))?(e=e.sign?-2147483648:0,n=n+1023<<20,r.__kBitConversionInts[1]=e|n|s,r.__kBitConversionInts[0]=t,r.__kBitConversionDouble[0]):e.sign?-1/0:1/0}},{key:"unaryMinus",value:function(e){if(0===e.length)return e;var t=e.__copy();return t.sign=!e.sign,t}},{key:"bitwiseNot",value:function(e){return e.sign?r.__absoluteSubOne(e).__trim():r.__absoluteAddOne(e,!0)}},{key:"exponentiate",value:function(e,t){if(t.sign)throw new RangeError("Exponent must be positive");if(0===t.length)return r.__oneDigit(1,!1);if(0===e.length)return e;if(1===e.length&&1===e.__digit(0))return!e.sign||1&t.__digit(0)?e:r.unaryMinus(e);if(1=r.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===e.length&&2===e.__digit(0)){var n=1+(t>>>5);return(e=new r(n,e.sign&&!!(1&t))).__initializeDigits(),e.__setDigit(n-1,1<<(31&t)),e}n=null;var i=e;for(1&t&&(n=e),t>>=1;0!==t;t>>=1)i=r.multiply(i,i),1&t&&(n=null===n?i:r.multiply(n,i));return n}},{key:"multiply",value:function(e,t){if(0===e.length)return e;if(0===t.length)return t;var n=e.length+t.length;32<=e.__clzmsd()+t.__clzmsd()&&n--,(n=new r(n,e.sign!==t.sign)).__initializeDigits();for(var i=0;ir.__absoluteCompare(e,t))return r.__zero();var n=e.sign!==t.sign,i=t.__unsignedDigit(0);if(1===t.length&&65535>=i){if(1===i)return n===e.sign?e:r.unaryMinus(e);e=r.__absoluteDivSmall(e,i,null)}else e=r.__absoluteDivLarge(e,t,!0,!1);return e.sign=n,e.__trim()}},{key:"remainder",value:function(e,t){if(0===t.length)throw new RangeError("Division by zero");if(0>r.__absoluteCompare(e,t))return e;var n=t.__unsignedDigit(0);return 1===t.length&&65535>=n?1===n||0===(t=r.__absoluteModSmall(e,n))?r.__zero():r.__oneDigit(t,e.sign):((t=r.__absoluteDivLarge(e,t,!1,!0)).sign=e.sign,t.__trim())}},{key:"add",value:function(e,t){var n=e.sign;return n===t.sign?r.__absoluteAdd(e,t,n):0<=r.__absoluteCompare(e,t)?r.__absoluteSub(e,t,n):r.__absoluteSub(t,e,!n)}},{key:"subtract",value:function(e,t){var n=e.sign;return n===t.sign?0<=r.__absoluteCompare(e,t)?r.__absoluteSub(e,t,n):r.__absoluteSub(t,e,!n):r.__absoluteAdd(e,t,n)}},{key:"leftShift",value:function(e,t){return 0===t.length||0===e.length?e:t.sign?r.__rightShiftByAbsolute(e,t):r.__leftShiftByAbsolute(e,t)}},{key:"signedRightShift",value:function(e,t){return 0===t.length||0===e.length?e:t.sign?r.__leftShiftByAbsolute(e,t):r.__rightShiftByAbsolute(e,t)}},{key:"unsignedRightShift",value:function(){throw new TypeError("BigInts have no unsigned right shift; use >> instead")}},{key:"lessThan",value:function(e,t){return 0>r.__compareToBigInt(e,t)}},{key:"lessThanOrEqual",value:function(e,t){return 0>=r.__compareToBigInt(e,t)}},{key:"greaterThan",value:function(e,t){return 0=r.__kMaxLengthBits)return t;var n=e+31>>>5;if(t.lengthr.__kMaxLengthBits)throw new RangeError("BigInt too big");return r.__truncateAndSubFromPowerOfTwo(e,t,!1)}if(e>=r.__kMaxLengthBits)return t;var n=e+31>>>5;if(t.length>>i?r.__truncateToNBits(e,t):t}},{key:"ADD",value:function(e,t){if(e=r.__toPrimitive(e),t=r.__toPrimitive(t),"string"==typeof e)return"string"!=typeof t&&(t=t.toString()),e+t;if("string"==typeof t)return e.toString()+t;if(e=r.__toNumeric(e),t=r.__toNumeric(t),r.__isBigInt(e)&&r.__isBigInt(t))return r.add(e,t);if("number"==typeof e&&"number"==typeof t)return e+t;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions")}},{key:"LT",value:function(e,t){return r.__compare(e,t,0)}},{key:"LE",value:function(e,t){return r.__compare(e,t,1)}},{key:"GT",value:function(e,t){return r.__compare(e,t,2)}},{key:"GE",value:function(e,t){return r.__compare(e,t,3)}},{key:"EQ",value:function(t,n){for(;;){if(r.__isBigInt(t))return r.__isBigInt(n)?r.equal(t,n):r.EQ(n,t);if("number"==typeof t){if(r.__isBigInt(n))return r.__equalToNumber(n,t);if("object"!==e(n))return t==n;n=r.__toPrimitive(n)}else if("string"==typeof t){if(r.__isBigInt(n))return null!==(t=r.__fromString(t))&&r.equal(t,n);if("object"!==e(n))return t==n;n=r.__toPrimitive(n)}else if("boolean"==typeof t){if(r.__isBigInt(n))return r.__equalToNumber(n,+t);if("object"!==e(n))return t==n;n=r.__toPrimitive(n)}else if("symbol"===e(t)){if(r.__isBigInt(n))return!1;if("object"!==e(n))return t==n;n=r.__toPrimitive(n)}else{if("object"!==e(t))return t==n;if("object"===e(n)&&n.constructor!==r)return t==n;t=r.__toPrimitive(t)}}}},{key:"NE",value:function(e,t){return!r.EQ(e,t)}},{key:"__zero",value:function(){return new r(0,!1)}},{key:"__oneDigit",value:function(e,t){return(t=new r(1,t)).__setDigit(0,e),t}},{key:"__decideRounding",value:function(e,t,n,i){if(0t)t=-t-1;else{if(0===n)return-1;n--,i=e.__digit(n),t=31}if(!(i&(t=1<>>20)-1023,n=1+(t>>>5);e=new r(n,0>e);var i=1048575&r.__kBitConversionInts[1]|1048576,s=r.__kBitConversionInts[0];if(20>(t&=31)){var o=20-t,a=o+32;t=i>>>o,i=i<<32-o|s>>>o,s<<=32-o}else 20===t?(a=32,t=i,i=s):(a=32-(o=t-20),t=i<>>32-o,i=s<=e&&9<=e)||(159>=e?32==e:131071>=e?160==e||5760==e:196607>=e?10>=(e&=131071)||40==e||41==e||47==e||95==e||4096==e:65279==e)}},{key:"__fromString",value:function(e){var t=11073741824/l)return null;a=new r(31+(l*a+u>>>r.__kBitsPerCharTableShift)>>>5,!1);var c=10>t?t:10,p=10>>0>>0>>r.__kBitsPerCharTableShift+5)}while(!h)}else{l>>=r.__kBitsPerCharTableShift;var h=[],d=[],f=!1;do{for(var _,m=u=0;;){if(o-48>>>0>>0>>l-(s-=32))}if(0!==r){if(i>=e.length)throw Error("implementation bug");e.__setDigit(i++,r)}for(;i>>1)+(85&i))>>>2)+(51&i))>>>4)+(15&i),--t;var s=e.__digit(n-1),o=r.__clz32(s),a=0|(32*n-o+i-1)/i;if(e.sign&&a++,268435456>>(u=i-u),u=32-u;u>=i;)o[a--]=r.__kConversionChars[l&t],l>>>=i,u-=i}for(o[a--]=r.__kConversionChars[(l|s<>>i-u;0!==l;)o[a--]=r.__kConversionChars[l&t],l>>>=i;if(e.sign&&(o[a--]="-"),-1!==a)throw Error("implementation bug");return o.join("")}},{key:"__toStringGeneric",value:function(e,t,n){var i=e.length;if(0===i)return"";if(1===i)return t=e.__unsignedDigit(0).toString(t),!1===n&&e.sign&&(t="-"+t),t;var s=32*i-r.__clz32(e.__digit(i-1));i=r.__kMaxBitsPerChar[t]-1,i=1+(0|((s*=r.__kBitsPerCharTableMultiplier)+(i-1))/i)>>1;var o=(s=r.exponentiate(r.__oneDigit(t,!1),r.__oneDigit(i,!1))).__unsignedDigit(0);if(1===s.length&&65535>=o){(s=new r(e.length,!1)).__initializeDigits();for(var a=0,l=2*e.length-1;0<=l;l--)a=a<<16|e.__halfDigit(l),s.__setHalfDigit(l,0|a/o),a=0|a%o;o=a.toString(t)}else s=(o=r.__absoluteDivLarge(e,s,!0,!0)).quotient,o=o.remainder.__trim(),o=r.__toStringGeneric(o,t,!0);for(s.__trim(),t=r.__toStringGeneric(s,t,!0);o.lengthe?r.__absoluteLess(n):0}},{key:"__compareToNumber",value:function(e,t){if(1|t){var n=e.sign,i=0>t;if(n!==i)return r.__unequalSign(n);if(0===e.length){if(i)throw Error("implementation bug");return 0===t?0:-1}return 1t?r.__absoluteGreater(n):et)return r.__unequalSign(n);if(0===t)throw Error("implementation bug: should be handled elsewhere");if(0===e.length)return-1;if(r.__kBitConversionDouble[0]=t,2047==(t=2047&r.__kBitConversionInts[1]>>>20))throw Error("implementation bug: handled elsewhere");var i=t-1023;if(0>i)return r.__absoluteGreater(n);t=e.length;var s=e.__digit(t-1),o=r.__clz32(s),a=32*t-o;if(a<(i+=1))return r.__absoluteLess(n);if(a>i)return r.__absoluteGreater(n);i=1048576|1048575&r.__kBitConversionInts[1];var l=r.__kBitConversionInts[0];if((o=31-o)!=(a-1)%31)throw Error("implementation bug");if(20>o){var u=20-o;o=u+32,a=i>>>u,i=i<<32-u|l>>>u,l<<=32-u}else 20===o?(o=32,a=i,i=l):(o=32-(u=o-20),a=i<>>32-u,i=l<>>=0)>(a>>>=0))return r.__absoluteGreater(n);if(s>>0,i=l,l=0):a=0,(s=e.__unsignedDigit(t))>a)return r.__absoluteGreater(n);if(st&&e.__unsignedDigit(0)===s(t):0===r.__compareToDouble(e,t)}},{key:"__comparisonResultToBool",value:function(e,t){switch(t){case 0:return 0>e;case 1:return 0>=e;case 2:return 0t;case 3:return e>=t}if(r.__isBigInt(e)&&"string"==typeof t)return null!==(t=r.__fromString(t))&&r.__comparisonResultToBool(r.__compareToBigInt(e,t),n);if("string"==typeof e&&r.__isBigInt(t))return null!==(e=r.__fromString(e))&&r.__comparisonResultToBool(r.__compareToBigInt(e,t),n);if(e=r.__toNumeric(e),t=r.__toNumeric(t),r.__isBigInt(e)){if(r.__isBigInt(t))return r.__comparisonResultToBool(r.__compareToBigInt(e,t),n);if("number"!=typeof t)throw Error("implementation bug");return r.__comparisonResultToBool(r.__compareToNumber(e,t),n)}if("number"!=typeof e)throw Error("implementation bug");if(r.__isBigInt(t))return r.__comparisonResultToBool(r.__compareToNumber(t,e),2^n);if("number"!=typeof t)throw Error("implementation bug");return 0===n?et:3===n?e>=t:void 0}},{key:"__absoluteAdd",value:function(e,t,n){if(e.length>>16)+(o>>>16)+(l>>>16))>>>16,n.__setDigit(s,65535&l|o<<16)}for(;s>>16)+((t=(65535&l)+i)>>>16))>>>16,n.__setDigit(s,65535&t|l<<16);return s>>16)-(a>>>16)-(i=1&l>>>16))>>>16,n.__setDigit(s,65535&l|o<<16)}for(;s>>16)-(i=1&(t=(65535&l)-i)>>>16))>>>16,n.__setDigit(s,65535&t|l<<16);return n.__trim()}},{key:"__absoluteAddOne",value:function(e,t){var n=2n?0:e.__unsignedDigit(n)>t.__unsignedDigit(n)?1:-1}},{key:"__multiplyAccumulate",value:function(e,t,n,i){if(0!==t){for(var s=65535&t,o=t>>>16,a=t=0,l=0,u=0;u>>=16;var h=e.__digit(u),d=65535&h,f=h>>>16;h=r.__imul(d,s),d=r.__imul(d,o);var _=r.__imul(f,s);t=(a=(d>>>16)+(_>>>16)+(65535&(f=r.__imul(f,o)))+(t=(c+=l+t+((p+=a+(65535&h))>>>16)+(h>>>16)+(65535&d)+(65535&_))>>>16))>>>16,a&=65535,l=f>>>16,c=65535&p|c<<16,n.__setDigit(i,c)}for(;0!==t||0!==a||0!==l;i++)s=((s=n.__digit(i))>>>16)+((e=(65535&s)+a)>>>16)+l+t,l=a=0,t=s>>>16,s=65535&e|s<<16,n.__setDigit(i,s)}}},{key:"__internalMultiplyAdd",value:function(e,t,n,i,s){for(var o=0,a=0;a>>16,n=(u=(65535&(o=r.__imul(l>>>16,t)))+(u>>>16)+n)>>>16,o>>>=16,s.__setDigit(a,u<<16|65535&c)}if(s.length>i)for(s.__setDigit(i++,n+o);i>>0)/t,a=0|(i=((i=0|i%t)<<16|e.__halfDigit(s-1))>>>0)/t;i=0|i%t,n.__setDigit(s>>>1,o<<16|a)}return n}},{key:"__absoluteModSmall",value:function(e,t){for(var n=0,i=2*e.length-1;0<=i;i--)n=0|(n=(n<<16|e.__halfDigit(i))>>>0)%t;return n}},{key:"__absoluteDivLarge",value:function(e,t,n,i){var s=t.__halfDigitLength(),o=t.length,a=e.__halfDigitLength()-s,l=null;n&&(l=new r(a+2>>>1,!1)).__initializeDigits();var u=new r(s+2>>>1,!1);u.__initializeDigits();var c=r.__clz16(t.__halfDigit(s-1));0>>0)/p,f=0|f%p;for(var _=t.__halfDigit(s-2),m=e.__halfDigit(a+s-2);r.__imul(d,_)>>>0>(f<<16|m)>>>0&&(d--,!(65535<(f+=p))););}r.__internalMultiplyAdd(t,d,0,o,u),0!==(f=e.__inplaceSub(u,a,s+1))&&(f=e.__inplaceAdd(t,a,s),e.__setHalfDigit(a+s,e.__halfDigit(a+s)+f),d--),n&&(1&a?h=d<<16:l.__setDigit(a>>>1,h|d))}return i?(e.__inplaceRightShift(c),n?{quotient:l,remainder:e}:e):n?l:void 0}},{key:"__clz16",value:function(e){return r.__clz32(e)-16}},{key:"__specialLeftShift",value:function(e,t,n){var i=e.length,s=new r(i+n,!1);if(0===t){for(t=0;t>>32-t;return 0n)throw new RangeError("BigInt too big");t=n>>>5;var i=31&n,s=e.length,o=0!==i&&0!=e.__digit(s-1)>>>32-i,a=s+t+(o?1:0);if(n=new r(a,e.sign),0===i){for(i=0;i>>32-i;if(o)n.__setDigit(s+t,a);else if(0!==a)throw Error("implementation bug")}return n.__trim()}},{key:"__rightShiftByAbsolute",value:function(e,t){var n=e.length,i=e.sign,s=r.__toShiftAmount(t);if(0>s)return r.__rightShiftByMaximum(i);var o=31&s,a=n-(t=s>>>5);if(0>=a)return r.__rightShiftByMaximum(i);if(s=!1,i)if(e.__digit(t)&(1<>>o,l=n-t-1;for(var u=0;u>>o;i.__setDigit(l,a)}return s&&(i=r.__absoluteAddOne(i,!0,i)),i.__trim()}},{key:"__rightShiftByMaximum",value:function(e){return e?r.__oneDigit(1,!0):r.__zero()}},{key:"__toShiftAmount",value:function(e){return 1r.__kMaxLengthBits?-1:e}},{key:"__toPrimitive",value:function(t){var n=1>>5,i=new r(n,t.sign);--n;for(var s=0;s>>e),i.__setDigit(n,t),i.__trim()}},{key:"__truncateAndSubFromPowerOfTwo",value:function(e,t,n){var i=Math.min,s=e+31>>>5;n=new r(s,n);var o=0,a=0;for(i=i(--s,t.length);o>>16)-(a=1&u>>>16))>>>16,n.__setDigit(o,65535&u|l<<16)}for(;o>>16)-(1&a>>>16)<<16:(t=t<<(e=32-e)>>>e,a=(65535&(a=(65535&(e=1<<32-e))-(65535&t)-a)|(e>>>16)-(t>>>16)-(1&a>>>16)<<16)&e-1),n.__setDigit(s,a),n.__trim()}},{key:"__digitPow",value:function(e,t){for(var n=1;0>>=1,e*=e;return n}}]),r}(l(Array));return _.__kMaxLength=33554432,_.__kMaxLengthBits=_.__kMaxLength<<5,_.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],_.__kBitsPerCharTableShift=5,_.__kBitsPerCharTableMultiplier=1<<_.__kBitsPerCharTableShift,_.__kConversionChars="0123456789abcdefghijklmnopqrstuvwxyz".split(""),_.__kBitConversionBuffer=new ArrayBuffer(8),_.__kBitConversionDouble=new Float64Array(_.__kBitConversionBuffer),_.__kBitConversionInts=new Int32Array(_.__kBitConversionBuffer),_.__clz32=f||function(e){var t=Math.LN2,n=Math.log;return 0===e?32:0|31-(0|n(e>>>0)/t)},_.__imul=d||function(e,t){return 0|e*t},_}()},function(e,t,n){(function(e,t){!function(e,n){function i(e){delete a[e]}function r(e){if(l)setTimeout(r,0,e);else{var t=a[e];if(t){l=!0;try{var s=t.callback,o=t.args;switch(o.length){case 0:s();break;case 1:s(o[0]);break;case 2:s(o[0],o[1]);break;case 3:s(o[0],o[1],o[2]);break;default:s.apply(n,o)}}finally{i(e),l=!1}}}}if(!e.setImmediate){var s,o=1,a={},l=!1,u=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,"[object process]"==={}.toString.call(e.process)?s=function(e){t.nextTick((function(){r(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?function(){var t="setImmediate$"+Math.random()+"$",n=function(n){n.source===e&&"string"==typeof n.data&&0===n.data.indexOf(t)&&r(+n.data.slice(t.length))};e.addEventListener?e.addEventListener("message",n,!1):e.attachEvent("onmessage",n),s=function(n){e.postMessage(t+n,"*")}}():e.MessageChannel?function(){var e=new MessageChannel;e.port1.onmessage=function(e){r(e.data)},s=function(t){e.port2.postMessage(t)}}():u&&"onreadystatechange"in u.createElement("script")?function(){var e=u.documentElement;s=function(t){var n=u.createElement("script");n.onreadystatechange=function(){r(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}():s=function(e){setTimeout(r,0,e)},c.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=Array(arguments.length-1),n=0;n the object's type\ntype(name, bases, dict) -> a new type",tp$call:function(e,t){if(this===Sk.builtin.type){if(1===e.length&&(void 0===t||!t.length))return e[0].ob$type;if(3!==e.length)throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments")}let n=this.prototype.tp$new(e,t);if(n.$isSuspension)return Sk.misceval.chain(n,(i=>{if(n=i,n.ob$type.$isSubType(this))return n.tp$init(e,t)}),(()=>n));if(n.ob$type.$isSubType(this)){const i=n.tp$init(e,t);return void 0!==i&&i.$isSuspension?Sk.misceval.chain(i,(()=>n)):n}return n},tp$new:function(e,t){if(3!==e.length){if(1===e.length&&(void 0===t||!t.length))return e[0].ob$type;throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments")}let n;if(t=e[0],n=e[1],"dict"!==(e=e[2]).tp$name)throw new Sk.builtin.TypeError("type() argument 3 must be dict, not "+Sk.abstr.typeName(e));if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("type() argument 1 must be str, not "+Sk.abstr.typeName(t));if(t=t.$jsstr(),"tuple"!==n.tp$name)throw new Sk.builtin.TypeError("type() argument 2 must be tuple, not "+Sk.abstr.typeName(n));n=n.sk$asarray();const i=function(){this.$d=new Sk.builtin.dict};return r(t,i,n,this.constructor),Sk.globals&&(i.prototype.__module__=Sk.globals.__name__),i.prototype.__doc__=Sk.builtin.none.none$,void 0===i.$typeLookup(Sk.builtin.str.$dict)&&(i.prototype.__dict__=new Sk.builtin.getset_descriptor(i,a)),e.$items().forEach((([e,t])=>{i.prototype[e.$mangled]=t})),i.prototype.hasOwnProperty("__new__")&&((e=i.prototype.__new__)instanceof Sk.builtin.func&&(i.prototype.__new__=new Sk.builtin.staticmethod(e))),i.$allocateSlots(),i},tp$getattr:function(e,t){var n=this.ob$type;const i=n.$typeLookup(e);let r;return void 0!==i&&(r=i.tp$descr_get,void 0!==r&&void 0!==i.tp$descr_set)?r.call(i,this,n,t):void 0!==(e=this.$typeLookup(e))?void 0!==(n=e.tp$descr_get)?t=n.call(e,null,this,t):e:void 0!==r?r.call(i,this,n,t):void 0!==i?i:void 0},tp$setattr:function(e,t,n){if(!this.sk$klass){if(void 0!==t)throw new Sk.builtin.TypeError("can't set attributes of built-in/extension type '"+this.prototype.tp$name+"'");throw new Sk.builtin.TypeError("can't delete attributes on type object '"+this.prototype.tp$name+"'")}const i=this.ob$type.$typeLookup(e);if(void 0!==i){const e=i.tp$descr_set;if(e)return e.call(i,this,t,n)}if(n=e.$mangled,void 0===t){if(!(t=this.prototype).hasOwnProperty(n))throw new Sk.builtin.AttributeError("type object '"+this.prototype.tp$name+"' has no attribute '"+e.$jsstr()+"'");delete t[n],void 0!==(e=Sk.dunderToSkulpt[n])&&(delete this.prototype[e],t.sk$prototypical||this.$allocateGetterSlot(n))}else this.prototype[n]=t,n in Sk.dunderToSkulpt&&this.$allocateSlot(n,t)},$r:function(){let e=this.prototype.__module__,t="",n="class";return e&&Sk.builtin.checkString(e)?t=e.v+".":e=null,e||this.sk$klass||Sk.__future__.class_repr||(n="type"),new Sk.builtin.str("<"+n+" '"+t+this.prototype.tp$name+"'>")}},writable:!0},tp$methods:{value:null,writable:!0},tp$getsets:{value:null,writable:!0},sk$type:{value:!0},$isSubType:{value:function(e){return this===e||this.prototype instanceof e||!this.prototype.sk$prototypical&&this.prototype.tp$mro.includes(e)}},$allocateSlot:{value:function(e,t){const n=(e=Sk.slots[e]).$slot_name,i=this.prototype;i.hasOwnProperty(n)&&delete i[n],i[n]=e.$slot_func(t)}},$allocateSlots:{value:function(){const e=this.prototype;this.prototype.sk$prototypical?Object.keys(e).forEach((t=>{t in Sk.slots&&this.$allocateSlot(t,e[t])})):Object.keys(Sk.slots).forEach((t=>{e.hasOwnProperty(t)?this.$allocateSlot(t,e[t]):this.$allocateGetterSlot(t)}))}},$allocateGetterSlot:{value:function(e){const t=Sk.slots[e].$slot_name,n=this.prototype;n.hasOwnProperty(t)||Object.defineProperty(n,t,{configurable:!0,get(){const e=n.tp$mro;for(let n=1;ne.length)throw e=n.tp$name,new Sk.builtin.TypeError(e+".__new__(): not enough arguments");var i=e.shift();if(void 0===i.sk$type)throw e=n.tp$name,new Sk.builtin.TypeError(e+"__new__(X): X is not a type object ("+Sk.abstr.typeName(i)+")");if(!i.$isSubType(this))throw e=n.tp$name,i=i.prototype.tp$name,new Sk.builtin.TypeError(e+".__new__("+i+"): "+i+" is not a subtype of "+e);const r=i.prototype.sk$staticNew.prototype;if(r.tp$new!==n.tp$new)throw e=n.tp$name,i=i.prototype.tp$name,new Sk.builtin.TypeError(e+".__new__("+i+") is not safe, use "+r.tp$name+".__new__()");return n.tp$new.call(i.prototype,e,t)},$flags:{FastCall:!0},$textsig:"($type, *args, **kwargs)",$name:"__new__"},Sk.generic.selfIter=function(){return this},Sk.generic.iterNextWithArrayCheckSize=function(){if(this.$seq.length!==this.$orig.get$size()){const e=this.tp$name.split("_")[0];throw new Sk.builtin.RuntimeError(e+" changed size during iteration")}if(!(this.$index>=this.$seq.length))return this.$seq[this.$index++]},Sk.generic.iterNextWithArray=function(){const e=this.$seq[this.$index++];return void 0===e&&(this.tp$iternext=()=>{}),e},Sk.generic.iterLengthHintWithArrayMethodDef={$meth:function(){return new Sk.builtin.int_(this.$seq.length-this.$index)},$flags:{NoArgs:!0}},Sk.generic.iterReverseLengthHintMethodDef={$meth:function(){return new Sk.builtin.int_(this.$index)},$flags:{NoArgs:!0}},Sk.generic.getSetDict={$get(){return this.$d},$set(e){if(void 0===e)this.$d=new Sk.builtin.dict;else{if(!(e instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError("__dict__ must be set to a dictionary, not a '"+Sk.abstr.typeName(e)+"'");this.$d=e}},$doc:"dictionary for instance variables (if defined)",$name:"__dict__"},Sk.generic.seqCompare=function(e,t){if(this===e&&Sk.misceval.opAllowsEquality(t))return!0;if(!(e instanceof this.sk$builtinBase))return Sk.builtin.NotImplemented.NotImplemented$;const n=this.v;let i;if(e=e.v,n.length!==e.length&&("Eq"===t||"NotEq"===t))return"Eq"!==t;for(i=0;i=r||i>=s)switch(t){case"Lt":return rs;case"GtE":return r>=s;default:Sk.asserts.fail()}return"Eq"!==t&&("NotEq"===t||Sk.misceval.richCompareBool(n[i],e[i],t))}},function(e,t){Sk.builtin.pyCheckArgs=function(e,t,n,i,r,s){if(t=t.length,void 0===i&&(i=1/0),r&&--t,s&&--t,ti)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":ti)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":t"};const r={Add:"+",Sub:"-",Mult:"*",MatMult:"@",Div:"/",FloorDiv:"//",Mod:"%",DivMod:"divmod()",Pow:"** or pow()",LShift:"<<",RShift:">>",BitAnd:"&",BitXor:"^",BitOr:"|"},s={UAdd:"+",USub:"-",Invert:"~"};Sk.abstr.numberBinOp=function(e,t,n){var s;if(!(s=i(e,t,n)))throw e=Sk.abstr.typeName(e),t=Sk.abstr.typeName(t),new Sk.builtin.TypeError("unsupported operand type(s) for "+r[n]+": '"+e+"' and '"+t+"'");return s},Sk.exportSymbol("Sk.abstr.numberBinOp",Sk.abstr.numberBinOp),Sk.abstr.numberInplaceBinOp=function(e,t,n){var s=function(e,t){switch(t){case"Add":return e.nb$inplace_add;case"Sub":return e.nb$inplace_subtract;case"Mult":return e.nb$inplace_multiply;case"MatMult":if(Sk.__future__.python3)return e.nb$inplace_matrix_multiply;case"Div":return e.nb$inplace_divide;case"FloorDiv":return e.nb$inplace_floor_divide;case"Mod":return e.nb$inplace_remainder;case"Pow":return e.nb$inplace_power;case"LShift":return e.nb$inplace_lshift;case"RShift":return e.nb$inplace_rshift;case"BitAnd":return e.nb$inplace_and;case"BitOr":return e.nb$inplace_or;case"BitXor":return e.nb$inplace_xor}}(e,n);if(void 0!==s&&(s=s.call(e,t))!==Sk.builtin.NotImplemented.NotImplemented$||(s=i(e,t,n)),!s)throw e=Sk.abstr.typeName(e),t=Sk.abstr.typeName(t),new Sk.builtin.TypeError("unsupported operand type(s) for "+r[n]+"=: '"+e+"' and '"+t+"'");return s},Sk.exportSymbol("Sk.abstr.numberInplaceBinOp",Sk.abstr.numberInplaceBinOp),Sk.abstr.numberUnaryOp=function(e,t){if("Not"===t)return Sk.misceval.isTrue(e)?Sk.builtin.bool.false$:Sk.builtin.bool.true$;e:{switch(t){case"USub":var n=e.nb$negative;break e;case"UAdd":n=e.nb$positive;break e;case"Invert":n=e.nb$invert;break e}n=void 0}if(!(n=void 0!==n?n.call(e):void 0))throw e=Sk.abstr.typeName(e),new Sk.builtin.TypeError("bad operand type for unary "+s[t]+": '"+e+"'");return n},Sk.exportSymbol("Sk.abstr.numberUnaryOp",Sk.abstr.numberUnaryOp),Sk.abstr.fixSeqIndex_=function(e,t){return 0>(t=Sk.builtin.asnum$(t))&&e.sq$length&&(t+=e.sq$length()),t},Sk.abstr.sequenceContains=function(e,t,n){return e.sq$contains?e.sq$contains(t,n):(e=Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){return!(e!==t&&!Sk.misceval.richCompareBool(e,t,"Eq"))&&new Sk.misceval.Break(!0)}),!1),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e))},Sk.abstr.sequenceConcat=function(e,t){if(e.sq$concat)return e.sq$concat(t);throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object can't be concatenated")},Sk.abstr.sequenceGetIndexOf=function(e,t){if(e.index)return Sk.misceval.callsimArray(e.index,[e,t]);let n=0;for(let i=Sk.abstr.iter(e),r=i.tp$iternext();void 0!==r;r=i.tp$iternext()){if(Sk.misceval.richCompareBool(t,r,"Eq"))return new Sk.builtin.int_(n);n+=1}throw new Sk.builtin.ValueError("sequence.index(x): x not in sequence")},Sk.abstr.sequenceGetCountOf=function(e,t){if(e.count)return Sk.misceval.callsimArray(e.count,[e,t]);let n=0;for(let i=Sk.abstr.iter(e),r=i.tp$iternext();void 0!==r;r=i.tp$iternext())Sk.misceval.richCompareBool(t,r,"Eq")&&(n+=1);return new Sk.builtin.int_(n)},Sk.abstr.sequenceGetItem=function(e,t,n){return"number"==typeof t&&(t=new Sk.builtin.int_(t)),Sk.abstr.objectGetItem(e,t,n)},Sk.abstr.sequenceSetItem=function(e,t,n,i){return"number"==typeof t&&(t=new Sk.builtin.int_(t)),Sk.abstr.objectSetItem(e,t,n,i)},Sk.abstr.sequenceDelItem=function(e,t,n){return Sk.abstr.objectDelItem(e,t,n)},Sk.abstr.sequenceGetSlice=function(e,t,n){return Sk.abstr.objectGetItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceDelSlice=function(e,t,n){return Sk.abstr.objectDelItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceSetSlice=function(e,t,n,i){return Sk.abstr.objectSetItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceUnpack=function(e,t,n,i){if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError("cannot unpack non-iterable "+Sk.abstr.typeName(e)+" object");const r=Sk.abstr.iter(e),s=[];let o,a=0;return 0{if(s.push(e),++a===t)return new Sk.misceval.Break}))),Sk.misceval.chain(o,(()=>{if(s.length{if(void 0!==e)throw new Sk.builtin.ValueError("too many values to unpack (expected "+t+")");return s}));const e=[];return Sk.misceval.chain(Sk.misceval.iterFor(r,(t=>{e.push(t)})),(()=>{const i=e.length+t-n;if(0>i)throw new Sk.builtin.ValueError("not enough values to unpack (expected at least "+n+", got "+(n+i)+")");return s.push(new Sk.builtin.list(e.slice(0,i))),s.push(...e.slice(i)),s}))}))},Sk.abstr.mappingUnpackIntoKeywordArray=function(e,t,n){if(!(t instanceof Sk.builtin.dict)){var i=Sk.abstr.lookupSpecial(t,Sk.builtin.str.$keys);if(void 0===i)throw new Sk.builtin.TypeError("Object is not a mapping");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(i),(i=>Sk.misceval.iterFor(Sk.abstr.iter(i),(i=>{if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError((n.$qualname?n.$qualname+"() ":"")+"keywords must be strings");return Sk.misceval.chain(t.mp$subscript(i,!0),(t=>{e.push(i.v),e.push(t)}))}))))}t.$items().forEach((([t,i])=>{if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError((n.$qualname?n.$qualname+"() ":"")+"keywords must be strings");e.push(t.v),e.push(i)}))},Sk.abstr.copyKeywordsToNamedArgs=function(e,t,n,i,r){i=i||[];var s=n.length+i.length/2;if(s>t.length)throw new Sk.builtin.TypeError(e+"() expected at most "+t.length+" arguments ("+s+" given)");if(!i.length&&void 0===r)return n;if(s===t.length&&!i.length)return n;if(0===s&&t.length===(r&&r.length))return r;for(n=n.slice(0),s=0;svoid 0===n[t]))).length)throw new Sk.builtin.TypeError(e+"() missing "+t.length+" required positional arguments: "+t.join(", "))}return n},Sk.exportSymbol("Sk.abstr.copyKeywordsToNamedArgs",Sk.abstr.copyKeywordsToNamedArgs),Sk.abstr.checkNoKwargs=function(e,t){if(t&&t.length)throw new Sk.builtin.TypeError(e+"() takes no keyword arguments")},Sk.exportSymbol("Sk.abstr.checkNoKwargs",Sk.abstr.checkNoKwargs),Sk.abstr.checkNoArgs=function(e,t,n){if(t=t.length+(n?n.length:0))throw new Sk.builtin.TypeError(e+"() takes no arguments ("+t+" given)")},Sk.exportSymbol("Sk.abstr.checkNoArgs",Sk.abstr.checkNoArgs),Sk.abstr.checkOneArg=function(e,t,n){if(Sk.abstr.checkNoKwargs(e,n),1!==t.length)throw new Sk.builtin.TypeError(e+"() takes exactly one argument ("+t.length+" given)")},Sk.exportSymbol("Sk.abstr.checkOneArg",Sk.abstr.checkOneArg),Sk.abstr.checkArgsLen=function(e,t,n,i){if(void 0===i&&(i=1/0),(t=t.length)i)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":t{i.$name=t,n[t]=new Sk.builtin.getset_descriptor(e,i)})),Object.defineProperty(n,"tp$getsets",{value:null,writable:!0})}},Sk.abstr.setUpMethods=function(e,t){if(void 0!==Sk.builtin.method_descriptor){var n=e.prototype;t=t||n.tp$methods||{},Object.entries(t).forEach((([t,i])=>{i.$name=t,n[t]=new Sk.builtin.method_descriptor(e,i)})),Object.defineProperty(n,"tp$methods",{value:null,writable:!0})}},Sk.abstr.setUpClassMethods=function(e,t){if(void 0!==Sk.builtin.classmethod_descriptor){var n=e.prototype;t=t||n.tp$classmethods||{},Object.entries(t).forEach((([t,i])=>{i.$name=t,n[t]=new Sk.builtin.classmethod_descriptor(e,i)})),Object.defineProperty(n,"tp$classmethods",{value:null,writable:!0})}};const o=Object.entries({Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"});Sk.abstr.setUpSlots=function(e,t){function n(t,n){r[t]=new Sk.builtin.wrapper_descriptor(e,Sk.slots[t],n)}function i(e,t){"string"==typeof e?n(e,t):e.forEach((e=>{n(e,t)}))}if(void 0!==Sk.builtin.wrapper_descriptor){var r=e.prototype;(t=t||r.tp$slots||{}).tp$new===Sk.generic.new&&(t.tp$new=Sk.generic.new(e)),t.tp$richcompare&&function(e){o.forEach((([t,n])=>{e[n]=function(e){return this.tp$richcompare(e,t)}}))}(t),t.tp$as_number&&function(e){const t=Sk.reflectedNumberSlots;Object.keys(t).forEach((n=>{if(void 0!==e[n]){const i=t[n],r=i.reflected,s=e[r];void 0!==s?null===s&&delete e[r]:e[r]=i.slot||e[n]}}))}(t),t.tp$as_sequence_or_mapping&&function(e){const t=Sk.sequenceAndMappingSlots;Object.keys(t).forEach((n=>{void 0!==e[n]&&t[n].forEach((t=>{e[t]=e[n]}))}))}(t),Object.entries(t).forEach((([e,t])=>{Object.defineProperty(r,e,{value:t,writable:!0})})),t.tp$new&&(r.__new__=new Sk.builtin.sk_method(Sk.generic.newMethodDef,e),Object.defineProperty(r,"sk$staticNew",{value:e,writable:!0})),Sk.subSlots.main_slots.forEach((([e,n])=>{void 0!==(e=t[e])&&i(n,e)}));var s=t.tp$hash;void 0!==s&&("function"==typeof s?n("__hash__",s):s===Sk.builtin.none.none$?r.__hash__=s:Sk.asserts.fail("invalid tp$hash")),t.tp$as_number&&Sk.subSlots.number_slots.forEach((([e,n])=>{void 0!==(e=t[e])&&i(n,e)})),t.tp$as_sequence_or_mapping&&Sk.subSlots.sequence_and_mapping_slots.forEach((([e,n])=>{void 0!==(e=t[e])&&i(n,e)})),Object.defineProperty(r,"tp$slots",{value:null,writable:!0})}},Sk.abstr.buildNativeClass=function(e,t){t=t||{},Sk.asserts.assert(t.hasOwnProperty("constructor"),"A constructor is required to build a native class");let n=t.constructor;if(e.includes(".")){var i=e.split(".");e=i.pop(),i=i.join(".")}Sk.abstr.setUpInheritance(e,n,t.base,t.meta),Sk.abstr.setUpBuiltinMro(n);const r=n.prototype;return Object.defineProperties(r,{tp$slots:{value:t.slots,writable:!0},tp$getsets:{value:t.getsets,writable:!0},tp$methods:{value:t.methods,writable:!0},tp$classmethods:{value:t.classmethods,writable:!0}}),Sk.abstr.setUpSlots(n,t.slots||{}),Sk.abstr.setUpMethods(n,t.methods),Sk.abstr.setUpGetSets(n,t.getsets),Sk.abstr.setUpClassMethods(n,t.classmethods),void 0!==i&&(r.__module__=new Sk.builtin.str(i)),Object.entries(t.proto||{}).forEach((([e,t])=>{Object.defineProperty(r,e,{value:t,writable:!0,enumerable:!(e.includes("$")||e in Object.prototype)})})),Object.entries(t.flags||{}).forEach((([e,t])=>{Object.defineProperty(n,e,{value:t,writable:!0})})),void 0!==Sk.builtin.str&&r.hasOwnProperty("tp$doc")&&!r.hasOwnProperty("__doc__")&&(e=r.tp$doc||null,r.__doc__="string"==typeof e?new Sk.builtin.str(e):Sk.builtin.none.none$),n},Sk.abstr.buildIteratorClass=function(e,t){return Sk.asserts.assert(t.hasOwnProperty("constructor"),"must provide a constructor"),t.slots=t.slots||{},t.slots.tp$iter=Sk.generic.selfIter,t.slots.tp$iternext=t.slots.tp$iternext||t.iternext,t.slots.tp$getattr=t.slots.tp$getattr||Sk.generic.getAttr,e=Sk.abstr.buildNativeClass(e,t),Sk.abstr.built$iterators.push(e),e},Sk.abstr.built$iterators=[],Sk.abstr.setUpModuleMethods=function(e,t,n){Object.entries(n).forEach((([n,i])=>{i.$name=i.$name||n,t[n]=new Sk.builtin.sk_method(i,null,e)}))},Sk.abstr.superConstructor=function(e,t,n){var i=Array.prototype.slice.call(arguments,2);e.prototype.tp$base.apply(t,i)}},function(e,t){const n=new Map;Sk.builtin.object=Sk.abstr.buildNativeClass("object",{constructor:function(){Sk.asserts.assert(this instanceof Sk.builtin.object,"bad call to object, use 'new'")},base:null,slots:{tp$new(e,t){if(e.length||t&&t.length){if(this.tp$new!==Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError("object.__new__() takes exactly one argument (the type to instantiate)");if(this.tp$init===Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+"() takes no arguments")}return new this.constructor},tp$init(e,t){if(e.length||t&&t.length){if(this.tp$init!==Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError("object.__init__() takes exactly one argument (the instance to initialize)");if(this.tp$new===Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+".__init__() takes exactly one argument (the instance to initialize)")}},tp$getattr:Sk.generic.getAttr,tp$setattr:Sk.generic.setAttr,$r(){const e=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$module);let t="";return e&&Sk.builtin.checkString(e)&&(t=e.v+"."),new Sk.builtin.str("<"+t+Sk.abstr.typeName(this)+" object>")},tp$str(){return this.$r()},tp$hash(){let e=n.get(this);return void 0!==e||(e=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2),n.set(this,e)),e},tp$richcompare(e,t){switch(t){case"Eq":e=this===e||Sk.builtin.NotImplemented.NotImplemented$;break;case"NotEq":(e=this.tp$richcompare(e,"Eq"))!==Sk.builtin.NotImplemented.NotImplemented$&&(e=!Sk.misceval.isTrue(e));break;default:e=Sk.builtin.NotImplemented.NotImplemented$}return e},tp$doc:"The most base type"},getsets:{__class__:{$get(){return this.ob$type},$set(e){if(void 0===e)throw new Sk.builtin.TypeError("can't delete __class__ attribute");if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError("__class__ must be set to a class, not '"+Sk.abstr.typeName(e)+"' object");const t=this.ob$type;if(!(t.$isSubType(Sk.builtin.module)&&e.$isSubType(Sk.builtin.module)||void 0!==t.sk$klass&&void 0!==e.sk$klass))throw new Sk.builtin.TypeError(" __class__ assignment only supported for heap types or ModuleType subclasses");if(e.prototype.sk$builtinBase!==this.sk$builtinBase)throw new Sk.builtin.TypeError("__class__ assignment: '"+Sk.abstr.typeName(this)+"' object layout differs from '"+e.prototype.tp$name+"'");Object.setPrototypeOf(this,e.prototype)},$doc:"the object's class"}},methods:{__dir__:{$meth:function(){let e=[];if(this.$d)if(this.$d instanceof Sk.builtin.dict)e=this.$d.sk$asarray();else for(var t in this.$d)e.push(new Sk.builtin.str(t));return t=Sk.misceval.callsimArray(Sk.builtin.type.prototype.__dir__,[this.ob$type]),e.push(...t.v),t.v=e,t},$flags:{NoArgs:!0},$doc:"Default dir() implementation."},__format__:{$meth(e){if(!Sk.builtin.checkString(e)){if(Sk.__future__.exceptions)throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+Sk.abstr.typeName(e));throw new Sk.builtin.TypeError("format expects arg 2 to be string or unicode, not "+Sk.abstr.typeName(e))}if(""!==(e=Sk.ffi.remapToJs(e)))throw new Sk.builtin.NotImplementedError("format spec is not yet implemented");return this.tp$str()},$flags:{OneArg:!0},$doc:"Default object formatter."}},proto:{valueOf:Object.prototype.valueOf,toString:function(){return this.tp$str().v},hasOwnProperty:Object.prototype.hasOwnProperty,hp$type:void 0,sk$attrError(){return"'"+this.tp$name+"' object"}}}),Sk.abstr.setUpInheritance("type",Sk.builtin.type,Sk.builtin.object),Sk.abstr.setUpBuiltinMro(Sk.builtin.type)},function(e,t){function n(e,t,n){return Sk.abstr.checkNoArgs(this.$name,t,n),void 0===(e=this.call(e))?Sk.builtin.none.none$:e}function i(e,t,n){return Sk.abstr.checkOneArg(this.$name,t,n),void 0===(e=this.call(e,t[0]))?Sk.builtin.none.none$:e}function r(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,1,2),void 0===(e=this.call(e,...t))?Sk.builtin.none.none$:e}function s(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,2,2),this.call(e,t[0],t[1]),Sk.builtin.none.none$}function o(e,t,n){return(e=i.call(this,e,t,n))===Sk.builtin.NotImplemented.NotImplemented$?e:new Sk.builtin.bool(e)}function a(e,t){return function(n,i,r){return n=e.call(this,n,i,r),t(n)}}function l(e){return function(){const t=e.tp$descr_get?e.tp$descr_get(this):e;return Sk.misceval.callsimArray(t,[])}}function u(e,t,n,i){return function(r){return function(){var s=r.tp$descr_get?r.tp$descr_get(this):r;if(s=Sk.misceval.callsimArray(s,[]),!t(s))throw new Sk.builtin.TypeError(e+" should return "+n+" (returned "+Sk.abstr.typeName(s)+")");return void 0!==i?i(s):s}}}function c(e){return function(t){const n=e.tp$descr_get?e.tp$descr_get(this):e;return Sk.misceval.callsimArray(n,[t])}}function p(e,t){let n=this.ob$type.$typeLookup(Sk.builtin.str.$getattribute);if(n instanceof Sk.builtin.wrapper_descriptor)return n.d$wrapped.call(this,e,t);n.tp$descr_get&&(n=n.tp$descr_get(this));const i=Sk.misceval.tryCatch((()=>Sk.misceval.callsimOrSuspendArray(n,[e])),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}function h(e,t,n){return function(i){return function(i,r,s){let o;void 0===r?(o=t,n=null):o=e;let a=this.ob$type.$typeLookup(new Sk.builtin.str(o));if(a instanceof Sk.builtin.wrapper_descriptor)return a.d$wrapped.call(this,i,r);if(a.tp$descr_get&&(a=a.tp$descr_get(this)),void 0===a){if(n)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this)+"' object "+n);throw new Sk.builtin.AttributeError(o)}return i=Sk.misceval.callsimOrSuspendArray(a,void 0===r?[i]:[i,r]),s?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}}}function d(e,t){let n=e.ob$type;for(;n&&void 0!==n.sk$klass;)n=n.prototype.tp$base;if(n&&n.prototype.tp$setattr!==t)throw new Sk.builtin.TypeError("can't apply this "+t.$name+" to "+Sk.abstr.typeName(e)+" object")}Sk.slots=Object.create(null),e=Sk.slots,Sk.slots.__init__={$name:"__init__",$slot_name:"tp$init",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this):e;return t=Sk.misceval.callsimOrSuspendArray(i,t,n),Sk.misceval.chain(t,(e=>{if(!Sk.builtin.checkNone(e)&&void 0!==e)throw new Sk.builtin.TypeError("__init__() should return None, not "+Sk.abstr.typeName(e))}))}},$wrapper:function(e,t,n){return this.call(e,t,n),Sk.builtin.none.none$},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Initialize self. See help(type(self)) for accurate signature."},e.__new__={$name:"__new__",$slot_name:"tp$new",$slot_func:function(e){const t=function(t,n){let i=e;return e.tp$descr_get&&(i=e.tp$descr_get(null,this.constructor)),Sk.misceval.callsimOrSuspendArray(i,[this.constructor,...t],n)};return t.sk$static_new=!1,t},$wrapper:null,$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Create and return a new object."},e.__call__={$name:"__call__",$slot_name:"tp$call",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this):e;return Sk.misceval.callsimOrSuspendArray(i,t,n)}},$wrapper:function(e,t,n){return void 0===(e=e.tp$call(t,n))?Sk.builtin.none.none$:e},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Call self as a function."},e.__repr__={$name:"__repr__",$slot_name:"$r",$slot_func:u("__repr__",Sk.builtin.checkString,"str"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return repr(self)."},e.__str__={$name:"__str__",$slot_name:"tp$str",$slot_func:u("__str__",Sk.builtin.checkString,"str"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return str(self)."};var f=u("__hash__",Sk.builtin.checkInt,"int",(e=>"number"==typeof e.v?e.v:e.tp$hash()));e.__hash__={$name:"__hash__",$slot_name:"tp$hash",$slot_func:function(e){return e===Sk.builtin.none.none$?Sk.builtin.none.none$:f(e)},$wrapper:a(n,(e=>new Sk.builtin.int_(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return hash(self)."},e.__getattribute__={$name:"__getattribute__",$slot_name:"tp$getattr",$slot_func:function(e){return function(e,t){let n=this.ob$type.$typeLookup(Sk.builtin.str.$getattr);if(void 0===n)return p.call(this,e,t);const i=Sk.misceval.chain(p.call(this,e,t),(t=>Sk.misceval.tryCatch((()=>void 0!==t?t:(n.tp$descr_get&&(n=n.tp$descr_get(this)),Sk.misceval.callsimOrSuspendArray(n,[e]))),(function(e){if(!(e instanceof Sk.builtin.AttributeError))throw e}))));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}},$wrapper:function(e,t,n){if(Sk.abstr.checkOneArg(this.$name,t,n),t=t[0],!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("attribute name must be string, not '"+Sk.abstr.typeName(t)+"'");if(void 0===(n=this.call(e,t)))throw new Sk.builtin.AttributeError(Sk.abstr.typeName(e)+" has no attribute "+t.$jsstr());return n},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."},e.__getattr__={$name:"__getattr__",$slot_name:"tp$getattr",$slot_func:e.__getattribute__.$slot_func,$wrapper:null,$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."},e.__setattr__={$name:"__setattr__",$slot_name:"tp$setattr",$slot_func:h("__setattr__","__delattr__"),$wrapper:function(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,2,2),d(e,this),this.call(e,t[0],t[1]),Sk.builtin.none.none$},$textsig:"($self, name, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Implement setattr(self, name, value)."},e.__delattr__={$name:"__delattr__",$slot_name:"tp$setattr",$slot_func:e.__setattr__.$slot_func,$wrapper:function(e,t,n){return Sk.abstr.checkOneArg(this.$name,t,n),d(e,this),this.call(e,t[0]),Sk.builtin.none.none$},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Implement delattr(self, name)."},e.__get__={$name:"__get__",$slot_name:"tp$descr_get",$slot_func:function(e){return function(t,n,i){null===t&&(t=Sk.builtin.none.none$),null==n&&(n=Sk.builtin.none.none$);const r=e.tp$descr_get?e.tp$descr_get(this):e;return t=Sk.misceval.callsimOrSuspendArray(r,[t,n]),i?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},$wrapper:function(e,t,n){if(Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,1,2),n=t[0],t=t[1],n===Sk.builtin.none.none$&&(n=null),t===Sk.builtin.none.none$&&(t=null),null===t&&null===n)throw new Sk.builtin.TypeError("__get__(None, None) is invalid");return this.call(e,n,t)},$textsig:"($self, instance, owner, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Return an attribute of instance, which is of type owner."},e.__set__={$name:"__set__",$slot_name:"tp$descr_set",$slot_func:h("__set__","__delete__"),$wrapper:s,$textsig:"($self, instance, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Set an attribute of instance to value."},e.__delete__={$name:"__delete__",$slot_name:"tp$descr_set",$slot_func:e.__set__.$slot_func,$wrapper:i,$textsig:"($self, instance, /)",$flags:{OneArg:!0},$doc:"Delete an attribute of instance."},e.__eq__={$name:"__eq__",$slot_name:"ob$eq",$slot_func:c,$wrapper:o,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self==value."},e.__ge__={$name:"__ge__",$slot_name:"ob$ge",$slot_func:c,$wrapper:o,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self>=value."},e.__gt__={$name:"__gt__",$slot_name:"ob$gt",$slot_func:c,$wrapper:o,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self>value."},e.__le__={$name:"__le__",$slot_name:"ob$le",$slot_func:c,$wrapper:o,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<=value."},e.__lt__={$name:"__lt__",$slot_name:"ob$lt",$slot_func:c,$wrapper:o,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return selfSk.misceval.callsimOrSuspendArray(n,[])),(e=>{if(!(e instanceof Sk.builtin.StopIteration))throw e}));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}},$wrapper:function(e,t,n){return Sk.abstr.checkNoArgs(this.$name,t,n),Sk.misceval.chain(e.tp$iternext(!0),(e=>{if(void 0===e)throw new Sk.builtin.StopIteration;return e}))},$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Implement next(self)."},e.__len__={$name:"__len__",$slot_name:"sq$length",$slot_func:function(e){return function(t){const n=e.tp$descr_get?e.tp$descr_get(this):e;return t?(t=Sk.misceval.callsimOrSuspendArray(n,[]),Sk.misceval.chain(t,(e=>Sk.misceval.asIndexOrThrow(e)))):(t=Sk.misceval.callsimArray(n,[]),Sk.misceval.asIndexOrThrow(t))}},$wrapper:a(n,(e=>new Sk.builtin.int_(e))),$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return len(self)."},e.__contains__={$name:"__contains__",$slot_name:"sq$contains",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this):e;return t=Sk.misceval.callsimOrSuspendArray(i,[t]),t=Sk.misceval.chain(t,(e=>Sk.misceval.isTrue(e))),t.$isSuspension?n?t:Sk.misceval.retryOptionalSuspensionOrThrow(t):t}},$wrapper:a(i,(e=>new Sk.builtin.bool(e))),$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return key in self."},e.__getitem__={$name:"__getitem__",$slot_name:"mp$subscript",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this):e;return t=Sk.misceval.callsimOrSuspendArray(i,[t]),n?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},$wrapper:i,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return self[key]."},e.__setitem__={$name:"__setitem__",$slot_name:"mp$ass_subscript",$slot_func:h("__setitem__","__delitem__","does not support item assignment"),$wrapper:s,$textsig:"($self, key, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Set self[key] to value."},e.__delitem__={$name:"__delitem__",$slot_name:"mp$ass_subscript",$slot_func:e.__setitem__.$slot_func,$wrapper:i,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Delete self[key]."},e.__add__={$name:"__add__",$slot_name:"nb$add",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self+value."},e.__radd__={$name:"__radd__",$slot_name:"nb$reflected_add",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value+self."},e.__iadd__={$name:"__iadd__",$slot_name:"nb$inplace_add",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self+=value."},e.__sub__={$name:"__sub__",$slot_name:"nb$subtract",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self-value."},e.__rsub__={$name:"__rsub__",$slot_name:"nb$reflected_subtract",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value-self."},e.__imul__={$name:"__imul__",$slot_name:"nb$inplace_multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self*=value."},e.__mul__={$name:"__mul__",$slot_name:"nb$multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self*value."},e.__rmul__={$name:"__rmul__",$slot_name:"nb$reflected_multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value*self."},e.__isub__={$name:"__isub__",$slot_name:"nb$inplace_subtract",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self-=value."},e.__mod__={$name:"__mod__",$slot_name:"nb$remainder",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self%value."},e.__rmod__={$name:"__rmod__",$slot_name:"nb$reflected_remainder",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value%self."},e.__imod__={$name:"__imod__",$slot_name:"nb$inplace_remainder",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement value%=self."},e.__divmod__={$name:"__divmod__",$slot_name:"nb$divmod",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(self, value)."},e.__rdivmod__={$name:"__rdivmod__",$slot_name:"nb$reflected_divmod",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(value, self)"},e.__pos__={$name:"__pos__",$slot_name:"nb$positive",$slot_func:l,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"+self"},e.__neg__={$name:"__neg__",$slot_name:"nb$negative",$slot_func:l,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"-self"},e.__abs__={$name:"__abs__",$slot_name:"nb$abs",$slot_func:l,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"abs(self)"},e.__bool__={$name:"__bool__",$slot_name:"nb$bool",$slot_func:u("__bool__",Sk.builtin.checkBool,"bool",(e=>0!==e.v)),$wrapper:a(n,(e=>new Sk.builtin.bool(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"self != 0"},e.__invert__={$name:"__invert__",$slot_name:"nb$invert",$slot_func:l,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"~self"},e.__lshift__={$name:"__lshift__",$slot_name:"nb$lshift",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<>value."},e.__rrshift__={$name:"__rrshift__",$slot_name:"nb$reflected_rshift",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value>>self."},e.__ilshift__={$name:"__ilshift__",$slot_name:"nb$inplace_lshift",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self<<=value."},e.__irshift__={$name:"__irshift__",$slot_name:"nb$inplace_rshift",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self=>>value."},e.__and__={$name:"__and__",$slot_name:"nb$and",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self&value."},e.__rand__={$name:"__rand__",$slot_name:"nb$refelcted_and",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value&self."},e.__iand__={$name:"__iand__",$slot_name:"nb$and",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self&=value."},e.__xor__={$name:"__xor__",$slot_name:"nb$xor",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self^value."},e.__rxor__={$name:"__rxor__",$slot_name:"nb$reflected_xor",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value^self."},e.__ixor__={$name:"__ixor__",$slot_name:"nb$inplace_xor",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self^=value."},e.__or__={$name:"__or__",$slot_name:"nb$or",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self|value."},e.__ror__={$name:"__ror__",$slot_name:"nb$reflected_or",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value|self."},e.__ior__={$name:"__ior__",$slot_name:"nb$inplace_or",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self|=value."},e.__int__={$name:"__int__",$slot_name:"nb$int",$slot_func:u("__int__",Sk.builtin.checkInt,"int"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"int(self)"},e.__float__={$name:"__float__",$slot_name:"nb$float",$slot_func:u("__float__",Sk.builtin.checkFloat,"float"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"float(self)"},e.__floordiv__={$name:"__floordiv__",$slot_name:"nb$floor_divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self//value."},e.__rfloordiv__={$name:"__rfloordiv__",$slot_name:"nb$reflected_floor_divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value//self."},e.__ifloordiv__={$name:"__ifloordiv__",$slot_name:"nb$inplace_floor_divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self//=value."},e.__truediv__={$name:"__truediv__",$slot_name:"nb$divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self/value."},e.__rtruediv__={$name:"__rtruediv__",$slot_name:"nb$reflected_divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value/self."},e.__itruediv__={$name:"__itruediv__",$slot_name:"nb$inplace_divide",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self/=value."},e.__index__={$name:"__index__",$slot_name:"nb$index",$slot_func:u("__index__",Sk.builtin.checkInt,"int",(e=>e.v)),$wrapper:a(n,(e=>new Sk.builtin.int_(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return self converted to an integer, if self is suitable for use as an index into a list."},e.__pow__={$name:"__pow__",$slot_name:"nb$power",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this):e;return null==n?Sk.misceval.callsimArray(i,[t]):Sk.misceval.callsimArray(i,[t,n])}},$wrapper:r,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(self, value, mod)."},e.__rpow__={$name:"__rpow__",$slot_name:"nb$reflected_power",$slot_func:e.__pow__.$slot_func,$wrapper:r,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(value, self, mod)."},e.__ipow__={$name:"__ipow__",$slot_name:"nb$inplace_power",$slot_func:e.__pow__.$slot_func,$wrapper:r,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Implement **="},e.__matmul__={$name:"__matmul__",$slot_name:"nb$matrix_multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self@value."},e.__rmatmul__={$name:"__rmatmul__",$slot_name:"nb$reflected_matrix_multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value@self."},e.__imatmul__={$name:"__imatmul__",$slot_name:"nb$inplace_matrix_multiply",$slot_func:c,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self@=value."},e.__long__={$name:"__long__",$slot_name:"nb$long",$slot_func:u("__long__",Sk.builtin.checkInt,"int"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"int(self)"};var _,m={next:{$name:"next",$slot_name:"tp$iternext",$slot_func:e.__next__.$slot_func,$wrapper:e.__next__.$wrapper,$textsig:e.__next__.$textsig,$flags:e.__next__.$flags},__nonzero__:{$name:"__nonzero__",$slot_name:"nb$bool",$slot_func:u("__nonzero__",Sk.builtin.checkInt,"int",(e=>0!==e.v)),$wrapper:a(n,(e=>new Sk.builtin.bool(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"x.__nonzero__() <==> x != 0"},__div__:{$name:"__div__",$slot_name:"nb$divide",$slot_func:c,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"x.__div__(y) <==> x/y"},__rdiv__:{$name:"__rdiv__",$slot_name:"nb$reflected_divide",$slot_func:c,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"x.__rdiv__(y) <==> x/y"},__idiv__:{$name:"__idiv__",$slot_name:"nb$inplace_divide",$slot_func:c,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"implement self /= other"}};Sk.subSlots={main_slots:Object.entries({tp$init:"__init__",tp$call:"__call__",$r:"__repr__",tp$str:"__str__",tp$getattr:"__getattribute__",tp$setattr:["__setattr__","__delattr__"],ob$eq:"__eq__",ob$ne:"__ne__",ob$lt:"__lt__",ob$le:"__le__",ob$gt:"__gt__",ob$ge:"__ge__",tp$descr_get:"__get__",tp$descr_set:["__set__","__delete__"],tp$iter:"__iter__",tp$iternext:"__next__"}),number_slots:Object.entries({nb$abs:"__abs__",nb$negative:"__neg__",nb$positive:"__pos__",nb$int:"__int__",nb$long:"__long__",nb$float:"__float__",nb$add:"__add__",nb$reflected_add:"__radd__",nb$inplace_add:"__iadd__",nb$subtract:"__sub__",nb$reflected_subtract:"__rsub__",nb$inplace_subtract:"__isub__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_multiply:"__imul__",nb$floor_divide:"__floordiv__",nb$reflected_floor_divide:"__rfloordiv__",nb$inplace_floor_divide:"__ifloordiv__",nb$invert:"__invert__",nb$remainder:"__mod__",nb$reflected_remainder:"__rmod__",nb$inplace_remainder:"__imod__",nb$divmod:"__divmod__",nb$reflected_divmod:"__rdivmod__",nb$power:"__pow__",nb$reflected_power:"__rpow__",nb$inplace_power:"__ipow__",nb$divide:"__truediv__",nb$reflected_divide:"__rtruediv__",nb$inplace_divide:"__itruediv__",nb$bool:"__bool__",nb$and:"__and__",nb$reflected_and:"__rand__",nb$inplace_and:"__iand__",nb$or:"__or__",nb$reflected_or:"__ror__",nb$inplace_or:"__ior__",nb$xor:"__xor__",nb$reflected_xor:"__rxor__",nb$inplace_xor:"__ixor__",nb$lshift:"__lshift__",nb$reflected_lshift:"__rlshift__",nb$rshift:"__rshift__",nb$reflected_rshift:"__rrshift__",nb$inplace_lshift:"__ilshift__",nb$inplace_rshift:"__irshift__",nb$matrix_multiply:"__matmul__",nb$reflected_matrix_multiply:"__rmatmul__",nb$inplace_matrix_multiply:"__imatmul__"}),sequence_and_mapping_slots:Object.entries({sq$length:"__len__",sq$contains:"__contains__",mp$subscript:"__getitem__",mp$ass_subscript:["__setitem__","__delitem__"],nb$add:"__add__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_add:"__iadd__",nb$inplace_multiply:"__imul__"})},Sk.reflectedNumberSlots={nb$add:{reflected:"nb$reflected_add"},nb$subtract:{reflected:"nb$reflected_subtract",slot:function(e){return e instanceof this.constructor?e.nb$subtract(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$multiply:{reflected:"nb$reflected_multiply"},nb$divide:{reflected:"nb$reflected_divide",slot:function(e){return e instanceof this.constructor?e.nb$divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$floor_divide:{reflected:"nb$reflected_floor_divide",slot:function(e){return e instanceof this.constructor?e.nb$floor_divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$remainder:{reflected:"nb$reflected_remainder",slot:function(e){return e instanceof this.constructor?e.nb$remainder(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$divmod:{reflected:"nb$reflected_divmod",slot:function(e){return e instanceof this.constructor?e.nb$divmod(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$power:{reflected:"nb$reflected_power",slot:function(e,t){return e instanceof this.constructor?e.nb$power(this,t):Sk.builtin.NotImplemented.NotImplemented$}},nb$and:{reflected:"nb$reflected_and"},nb$or:{reflected:"nb$reflected_or"},nb$xor:{reflected:"nb$reflected_xor"},nb$lshift:{reflected:"nb$reflected_lshift",slot:function(e){return e instanceof this.constructor?e.nb$lshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$rshift:{reflected:"nb$reflected_rshift",slot:function(e){return e instanceof this.constructor?e.nb$rshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$matrix_multiply:{reflected:"nb$reflexted_matrix_multiply",slot:function(e){return e instanceof this.constructor?e.nb$matrix_multiply(this):Sk.builtin.NotImplemented.NotImplemented$}}},Sk.sequenceAndMappingSlots={sq$concat:["nb$add"],sq$repeat:["nb$multiply","nb$reflected_multiply"],mp$length:["sq$length"],sq$inplace_repeat:["nb$inplace_multiply"],sq$inplace_concat:["nb$inplace_add"]},Sk.dunderToSkulpt={__repr__:"$r",__str__:"tp$str",__init__:"tp$init",__new__:"tp$new",__hash__:"tp$hash",__call__:"tp$call",__iter__:"tp$iter",__next__:"tp$iternext",__eq__:"ob$eq",__ne__:"ob$ne",__lt__:"ob$lt",__le__:"ob$le",__gt__:"ob$gt",__ge__:"ob$ge",__abs__:"nb$abs",__neg__:"nb$negative",__pos__:"nb$positive",__int__:"nb$int",__float__:"nb$float",__add__:"nb$add",__radd__:"nb$reflected_add",__iadd__:"nb$inplace_add",__sub__:"nb$subtract",__rsub__:"nb$reflected_subtract",__isub__:"nb$inplace_subtract",__mul__:"nb$multiply",__rmul__:"nb$reflected_multiply",__imul__:"nb$inplace_multiply",__truediv__:"nb$divide",__rtruediv__:"nb$reflected_divide",__itruediv__:"nb$inplace_divide",__floordiv__:"nb$floor_divide",__rfloordiv__:"nb$reflected_floor_divide",__ifloordiv__:"nb$inplace_floor_divide",__invert__:"nb$invert",__mod__:"nb$remainder",__rmod__:"nb$reflected_remainder",__imod__:"nb$inplace_remainder",__divmod__:"nb$divmod",__rdivmod__:"nb$reflected_divmod",__pow__:"nb$power",__rpow__:"nb$reflected_power",__ipow__:"nb$inplace_power",__bool__:"nb$bool",__long__:"nb$long",__lshift__:"nb$lshift",__rlshift__:"nb$reflected_lshift",__ilshift__:"nb$inplace_lshift",__rshift__:"nb$rshift",__rrshift__:"nb$reflected_rshift",__irshift__:"nb$inplace_rshift",__and__:"nb$and",__rand__:"nb$reflected_and",__iand__:"nb$inplace_and",__or__:"nb$or",__ror__:"nb$reflected_or",__ior__:"nb$inplace_or",__xor__:"nb$xor",__rxor__:"nb$reflected_xor",__ixor__:"nb$inplace_xor",__matmul__:"nb$matrix_multiply",__rmatmul__:"nb$reflected_matrix_multiply",__imatmul__:"nb$inplace_matrix_multiply",__get__:"tp$descr_get",__set__:"tp$descr_set",__delete__:"tp$descr_set",__getattribute__:"tp$getattr",__getattr__:"tp$getattr",__setattr__:"tp$setattr",__delattr__:"tp$setattr",__len__:"sq$length",__contains__:"sq$contains",__getitem__:"mp$subscript",__setitem__:"mp$ass_subscript",__delitem__:"mp$ass_subscript"},Sk.exportSymbol("Sk.setupDunderMethods",Sk.setupDunderMethods),Sk.setupDunderMethods=function(e){function t(e,t,n){for(let i=0;i"tp$iternext"===e[0])),l=s.findIndex((e=>"nb$bool"===e[0])),u=Sk.dunderToSkulpt;if(e){u.__bool__="nb$bool",u.__next__="tp$iternext",delete u.__nonzero__,delete u.__div__,delete u.__rdiv__,delete u.__idiv__,delete u.next;for(let e in _)n[e]=_[e];for(let e in m)delete n[e];for(e=0;e")}const o={__doc__:{$get(){return this.d$def.$doc?new Sk.builtin.str(this.d$def.$doc):Sk.builtin.none.none$}},__objclass__:{$get(){return this.d$type}},__name__:{$get(){return new Sk.builtin.str(this.d$name)}}};e={__text_signature__:{$get(){return this.d$def.$textsig?new Sk.builtin.str(this.d$def.$textsig):Sk.builtin.none.none$}}},Sk.builtin.getset_descriptor=n("getset_descriptor",void 0,{constructor:function(e,t){this.d$def=t,this.$get=t.$get,this.$set=t.$set,this.d$type=e,this.d$name=t.$name},slots:{tp$descr_get(e,t){if(t=this.d$check(e))return t;if(void 0!==this.$get)return this.$get.call(e);throw new Sk.builtin.AttributeError("getset_descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is not readable")},tp$descr_set(e,t){if(this.d$set_check(e),void 0!==this.$set)return this.$set.call(e,t);throw new Sk.builtin.AttributeError("attribute '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is readonly")}}}),Sk.builtin.method_descriptor=n("method_descriptor","method",{constructor:function(e,t){this.d$def=t,this.$meth=t.$meth,this.d$type=e,this.d$name=t.$name||"",this.$flags=e=t.$flags||{},e.FastCall&&e.NoKwargs?this.tp$call=this.$methodFastCallNoKwargs:e.FastCall?this.tp$call=this.$methodFastCall:e.NoArgs?this.tp$call=this.$methodCallNoArgs:e.OneArg?this.tp$call=this.$methodCallOneArg:e.NamedArgs?this.tp$call=this.$methodCallNamedArgs:void 0!==e.MinArgs?this.tp$call=this.$methodCallMinArgs:(this.func_code=t.$meth,this.tp$call=this.$defaultCall,this.$memoiseFlags=Sk.builtin.func.prototype.$memoiseFlags,this.$resolveArgs=Sk.builtin.func.prototype.$resolveArgs)},slots:{tp$call(e,t){return this.tp$call(e,t)},tp$descr_get(e,t){let n;return(n=this.d$check(e))?n:new Sk.builtin.sk_method(this.d$def,e)}},getsets:e,proto:{$methodFastCall(e,t){const n=e.shift();return this.m$checkself(n),this.$meth.call(n,e,t)},$methodFastCallNoKwargs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoKwargs(this.d$name,t),this.$meth.call(n,e)},$methodCallNoArgs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoArgs(this.d$name,e,t),this.$meth.call(n)},$methodCallOneArg(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkOneArg(this.d$name,e,t),this.$meth.call(n,e[0])},$methodCallNamedArgs(e,t){const n=e.shift();return this.m$checkself(n),e=Sk.abstr.copyKeywordsToNamedArgs(this.d$name,this.$flags.NamedArgs,e,t,this.$flags.Defaults),this.$meth.call(n,...e)},$methodCallMinArgs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoKwargs(this.d$name,t),Sk.abstr.checkArgsLen(this.d$name,e,this.$flags.MinArgs,this.$flags.MaxArgs),this.$meth.call(n,...e)},$defaultCall(e,t){return this.m$checkself(e[0]),Sk.builtin.func.prototype.tp$call.call(this,e,t)},m$checkself(e){if(void 0===e)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");this.d$check(e)}}}),Sk.builtin.wrapper_descriptor=n("wrapper_descriptor","slot wrapper",{constructor:function(e,t,n){this.d$def=t,this.d$type=e,this.d$name=n.$name=t.$name,this.d$wrapped=n},slots:{tp$descr_get(e,t){let n;return(n=this.d$check(e))?n:new Sk.builtin.method_wrapper(this,e)},tp$call(e,t){if(1>e.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const n=e.shift();if(!n.ob$type.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(n)+"'");return this.raw$call(n,e,t)}},proto:{raw$call(e,t,n){return this.d$wrapped.$name=this.d$name,this.d$def.$wrapper.call(this.d$wrapped,e,t,n)}}}),Sk.builtin.method_wrapper=n("method_wrapper",void 0,{constructor:function(e,t){this.m$descr=e,this.m$self=t,this.d$def=e.d$def,this.d$name=e.d$name,this.d$type=e.d$type},slots:{tp$call(e,t){return this.m$descr.raw$call(this.m$self,e,t)},tp$richcompare(e,t){return("Eq"===t||"NotEq"===t)&&e instanceof Sk.builtin.method_wrapper?(e=this.m$self===e.m$self&&this.m$descr===e.m$descr,"Eq"===t?e:!e):Sk.builtin.NotImplemented.NotImplemented$},$r(){return new Sk.builtin.str("")}},getsets:{__self__:{$get(){return this.m$self}}}}),Sk.builtin.classmethod_descriptor=n("classmethod_descriptor","method",{constructor:function(e,t){this.d$def=t,this.$meth=t.$meth,this.d$type=e,this.d$name=t.$name||""},slots:{tp$call(e,t){if(1>e.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const n=e.shift();return this.tp$descr_get(null,n).tp$call(e,t)},tp$descr_get(e,t,n){if(void 0===t){if(null===e)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs an object or a type");t=t||e.ob$type}if(t.ob$type!==Sk.builtin.type)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs a type not a '"+Sk.abstr.typeName(t)+"' as arg 2");if(!t.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(t)+"' object");return new Sk.builtin.sk_method(this.d$def,t)}},getsets:e}),[Sk.builtin.method_descriptor,Sk.builtin.getset_descriptor,Sk.builtin.wrapper_descriptor,Sk.builtin.method_wrapper,Sk.builtin.classmethod_descriptor].forEach((e=>{Sk.abstr.setUpSlots(e),Sk.abstr.setUpMethods(e),Sk.abstr.setUpGetSets(e)}))},function(e,t){Sk.builtin.sk_method=Sk.abstr.buildNativeClass("builtin_function_or_method",{constructor:function(e,t,n){this.$meth=e.$meth.bind(t),this.$doc=e.$doc,this.$self=t||null,this.$module=n?new Sk.builtin.str(n):null,this.$name=e.$name||e.$meth.name||"",this.m$def=e,this.$textsig=e.$textsig,this.$flags=e=e.$flags||{},e.FastCall&&e.NoKwargs?this.tp$call=this.$fastCallNoKwargs:e.FastCall?this.tp$call=this.$meth:e.NoArgs?this.tp$call=this.$callNoArgs:e.OneArg?this.tp$call=this.$callOneArg:e.NamedArgs?this.tp$call=this.$callNamedArgs:void 0!==e.MinArgs?this.tp$call=this.$callMinArgs:(this.func_code=this.$meth,this.tp$call=this.$defaultCallMethod)},proto:{$fastCallNoKwargs(e,t){return Sk.abstr.checkNoKwargs(this.$name,t),this.$meth(e)},$callNoArgs(e,t){return Sk.abstr.checkNoArgs(this.$name,e,t),this.$meth()},$callOneArg(e,t){return Sk.abstr.checkOneArg(this.$name,e,t),this.$meth(e[0])},$callNamedArgs(e,t){return e=Sk.abstr.copyKeywordsToNamedArgs(this.$name,this.$flags.NamedArgs,e,t,this.$flags.Defaults),this.$meth(...e)},$callMinArgs(e,t){return Sk.abstr.checkNoKwargs(this.$name,t),Sk.abstr.checkArgsLen(this.$name,e,this.$flags.MinArgs,this.$flags.MaxArgs),this.$meth(...e)},$defaultCallMethod(e,t){return null!==this.$self?Sk.builtin.func.prototype.tp$call.call(this,[this.$self,...e],t):Sk.builtin.func.prototype.tp$call.call(this,e,t)},$memoiseFlags(){return Sk.builtin.func.prototype.$memoiseFlags.call(this)},$resolveArgs(){return Sk.builtin.func.prototype.$resolveArgs.call(this)}},flags:{sk$acceptable_as_base_class:!1},slots:{tp$getattr:Sk.generic.getAttr,$r(){return null===this.$self?new Sk.builtin.str(""):new Sk.builtin.str("")},tp$call(e,t){return this.tp$call(e,t)},tp$richcompare(e,t){return("Eq"===t||"NotEq"===t)&&e instanceof Sk.builtin.sk_method?(e=this.$self===e.$self&&this.m$def.$meth===e.m$def.$meth,"Eq"===t?e:!e):Sk.builtin.NotImplemented.NotImplemented$}},getsets:{__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(e){this.$module=e=e||Sk.builtin.none.none$}},__doc__:{$get(){return this.$doc?new Sk.builtin.str(this.$doc):Sk.builtin.none.none$}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__text_signature__:{$get(){return new Sk.builtin.str(this.$textsig)}},__self__:{$get(){return this.$self||Sk.sysModules.mp$lookup(this.$module)||Sk.builtin.none.none$}}}})},function(e,t){Sk.builtin.none=Sk.abstr.buildNativeClass("NoneType",{constructor:function(){return Sk.builtin.none.none$},slots:{tp$new:(e,t)=>(Sk.abstr.checkNoArgs("NoneType",e,t),Sk.builtin.none.none$),$r:()=>new Sk.builtin.str("None"),tp$as_number:!0,nb$bool:()=>!1},flags:{sk$acceptable_as_base_class:!1}}),Sk.builtin.none.none$=Object.create(Sk.builtin.none.prototype,{v:{value:null,enumerable:!0}}),Sk.builtin.NotImplemented=Sk.abstr.buildNativeClass("NotImplementedType",{constructor:function(){return Sk.builtin.NotImplemented.NotImplemented$},slots:{$r:()=>new Sk.builtin.str("NotImplemented"),tp$new:(e,t)=>(Sk.abstr.checkNoArgs("NotImplementedType",e,t),Sk.builtin.NotImplemented.NotImplemented$)},flags:{sk$acceptable_as_base_class:!1}}),Sk.builtin.NotImplemented.NotImplemented$=Object.create(Sk.builtin.NotImplemented.prototype,{v:{value:null,enumerable:!0}})},function(e,t){const n=/^(?:(.)?([<>=\^]))?([\+\-\s])?(#)?(0)?(\d+)?(,)?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/;Sk.formatting={};let i=function(e,t,n,i){if(Sk.asserts.assert("string"==typeof t),e[6]){var r=parseInt(e[6],10);i=e[2]||(e[5]?"=":i?">":"<");let s=r-(t.length+(n?n.length:0));if(0>=s)return t;switch(r=(e[1]||(e[5]?"0":" ")).repeat(s),i){case"=":if("s"===e[9])throw new Sk.builtin.ValueError("'=' alignment not allowed in string format specifier");return n+r+t;case">":return r+n+t;case"<":return n+t+r;case"^":return e=Math.floor(s/2),r.substring(0,e)+n+t+r.substring(e)}}return n+t},r=function(e,t){return t?"-":"+"===e[3]?"+":" "===e[3]?" ":""},s=function(e,t,n){if(Sk.asserts.assert(t instanceof Sk.builtin.int_||t instanceof Sk.builtin.lng),e[8])throw new Sk.builtin.ValueError("Precision not allowed in integer format");let s=t.str$(n,!1);return t=t.nb$isnegative(),t=r(e,t),e[4]&&(16===n?t+="0x":8===n?t+="0o":2===n&&(t+="0b")),"X"===e[9]&&(s=s.toUpperCase()),"n"===e[9]?s=(+s).toLocaleString():e[7]&&((n=s.toString().split("."))[0]=n[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),s=n.join(".")),i(e,s,t,!0)},o=function(e,t,o){if(!t)return e.str$(10,!0);if(!(t=t.match(n)))throw new Sk.builtin.ValueError("Invalid format specifier");var a=t[9];if(a||(a=o?"g":"d"),-1==(o?"fFeEgG%":"bcdoxXnfFeEgG%").indexOf(a))throw new Sk.builtin.ValueError("Unknown format code '"+t[9]+"' for object of type '"+Sk.abstr.typeName(e)+"'");switch(a){case"d":case"n":return s(t,e,10);case"x":case"X":return s(t,e,16);case"o":return s(t,e,8);case"b":return s(t,e,2);case"c":if(t[3])throw new Sk.builtin.ValueError("Sign not allowed with integer format specifier 'c'");if(t[4])throw new Sk.builtin.ValueError("Alternate form not allowed with integer format specifier 'c'");if(t[7])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");if(t[8])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");return i(t,String.fromCodePoint(Sk.builtin.asnum$(e)),"",!0);case"f":case"F":case"e":case"E":case"g":case"G":{if(t[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed in float format specifier");if("string"==typeof(o=Sk.builtin.asnum$(e))&&(o=Number(o)),1/0===o)return i(t,"inf","",!0);if(-1/0===o)return i(t,"inf","-",!0);if(isNaN(o))return i(t,"nan","",!0);e=!1,0>o&&(o=-o,e=!0);var l=["toExponential","toFixed","toPrecision"]["efg".indexOf(a.toLowerCase())];let n=t[8]?parseInt(t[8],10):6;if(o=o[l](n),-1!=="EFG".indexOf(a)&&(o=o.toUpperCase()),"g"===a.toLowerCase()||!t[9]){if(l=o.match(/\.(\d*[1-9])?(0+)$/)){let[,e,t]=l;o=o.slice(0,e?-t.length:-(t.length+1))}-1!=o.indexOf(".")||t[9]||(o+=".0")}return"e"===a.toLowerCase()&&(o=o.replace(/^([-+]?[0-9]*\.?[0-9]+[eE][-+]?)([0-9])?$/,"$10$2")),t[7]&&((a=o.toString().split("."))[0]=a[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o=a.join(".")),i(t,o,r(t,e),!0)}case"%":if(t[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed with format specifier '%'");return"string"==typeof(e=Sk.builtin.asnum$(e))&&(e=Number(e)),1/0===e?i(t,"inf%","",!0):-1/0===e?i(t,"inf%","-",!0):isNaN(e)?i(t,"nan%","",!0):(a=!1,0>e&&(e=-e,a=!0),o=t[8]?parseInt(t[8],10):6,e=(100*e).toFixed(o)+"%",i(t,e,r(t,a),!0));default:throw new Sk.builtin.ValueError("Unknown format code '"+t[9]+"'")}};Sk.formatting.mkNumber__format__=e=>function(t){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+Sk.abstr.typeName(t));return new Sk.builtin.str(o(this,t.$jsstr(),e))},Sk.formatting.format=function(e,t){t=t||[];const n={};for(let e=0;en?1/0:n;null!=(o=r.exec(e))&&li)return new Sk.builtin.tuple([new Sk.builtin.str(""),new Sk.builtin.str(""),new Sk.builtin.str(n)])}else if(i=n.indexOf(t),0>i)return new Sk.builtin.tuple([new Sk.builtin.str(n),new Sk.builtin.str(""),new Sk.builtin.str("")]);return new Sk.builtin.tuple([new Sk.builtin.str(n.substring(0,i)),new Sk.builtin.str(t),new Sk.builtin.str(n.substring(i+t.length))])}}function o(e,t){return function(n,i){if(n=Sk.misceval.asIndexSized(n,Sk.builtin.OverflowError),void 0===i)i=" ";else{if(!(i instanceof Sk.builtin.str&&1===i.sq$length()))throw new Sk.builtin.TypeError("the fill character must be a str of length 1");i=i.v}const r=this.sq$length();let s;return r>=n?new Sk.builtin.str(this.v):t?(s=i.repeat(Math.floor((n-r)/2)),s=s+this.v+s,(n-r)%2&&(s+=i),new Sk.builtin.str(s)):(s=i.repeat(n-r),new Sk.builtin.str(e?s+this.v:this.v+s))}}function a(e,t,n){if(({start:t,end:n}=Sk.builtin.slice.startEnd$wrt(e,t,n)),e.$hasAstralCodePoints()){const i=e.codepoints[t];t=void 0===i?t+e.v.length-e.codepoints.length:i,n=void 0===(n=e.codepoints[n])?e.v.length:n}return{start:t,end:n}}function l(e){return function(t,n,i){if(t=this.get$tgt(t),({start:n,end:i}=a(this,n,i)),i=n&&t<=i?t:-1,this.codepoints){i=this.sq$length(),n=-1;for(let e=0;er)return Sk.builtin.bool.false$;if(i=this.v.slice(i,r),n instanceof Sk.builtin.tuple){for(let r=Sk.abstr.iter(n),s=r.tp$iternext();void 0!==s;s=r.tp$iternext()){if(!(s instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("tuple for "+e+" must only contain str, not "+Sk.abstr.typeName(s));if(t(i,s.v))return Sk.builtin.bool.true$}return Sk.builtin.bool.false$}return new Sk.builtin.bool(t(i,n.v))}}var c=/^[0-9!#_]/,p=Object.create(null);Sk.builtin.str=Sk.abstr.buildNativeClass("str",{constructor:function(e){if(Sk.asserts.assert(this instanceof Sk.builtin.str,"bad call to str - use 'new'"),"string"!=typeof e)if(void 0===e)e="";else if(null===e)e="None";else{if(void 0!==e.tp$str)return e.tp$str();if("number"!=typeof e)throw new Sk.builtin.TypeError("could not convert object of type '"+Sk.abstr.typeName(e)+"' to str");e=Number.isFinite(e)?String(e):String(e).replace("Infinity","inf").replace("NaN","nan")}var t=p[e];if(void 0!==t)return t;p[e]=this,t=void 0===m[e]?e:e+"_$rw$",this.$mangled=t,this.$savedKeyHash=e.replace(c,"!$&"),this.v=e},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.",tp$new(e,t){if(t=t||[],this!==Sk.builtin.str.prototype)return this.$subtype_new(e,t);if(1>=e.length&&!t.length)return new Sk.builtin.str(e[0]);if(Sk.__future__.python3){const[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("str",["object","encoding","errors"],e,t);if(void 0===n||void 0===i&&void 0===r)return new Sk.builtin.str(n);if(Sk.builtin.bytes.check$encodeArgs("str",i,r),!Sk.builtin.checkBytes(n))throw new Sk.builtin.TypeError("decoding to str: need a bytes-like object, "+Sk.abstr.typeName(n)+" found");return Sk.builtin.bytes.$decode.call(n,i,r)}throw new Sk.builtin.TypeError("str takes at most one argument ("+(e.length+t.length)+" given)")},$r(){let e="'";-1!==this.v.indexOf("'")&&-1===this.v.indexOf('"')&&(e='"');const t=this.v.length;let n=e;for(let s=0;sr||57344<=r)&&!Sk.__future__.python3?n+="\\u"+("000"+r.toString(16)).slice(-4):55296<=r&&!Sk.__future__.python3?(i=this.v.codePointAt(s),s++,r="0000000"+(i=i.toString(16)).toString(16),n=4i||127<=r&&!Sk.__future__.python3?(2>(i=i.charCodeAt(0).toString(16)).length&&(i="0"+i),n+="\\x"+i):n+=i}return new Sk.builtin.str(n+e)},tp$str(){return this.constructor===Sk.builtin.str?this:new Sk.builtin.str(this.v)},tp$iter(){return new _(this)},tp$richcompare(e,t){if(!(e instanceof Sk.builtin.str))return Sk.builtin.NotImplemented.NotImplemented$;switch(t){case"Lt":return this.ve.v;case"GtE":return this.v>=e.v}},mp$subscript(e){let t;if(Sk.misceval.isIndex(e)){if(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError),t=this.sq$length(),0>e&&(e+=t),0>e||e>=t)throw new Sk.builtin.IndexError("string index out of range");return this.codepoints?new Sk.builtin.str(this.v.substring(this.codepoints[e],this.codepoints[e+1])):new Sk.builtin.str(this.v.charAt(e))}if(e instanceof Sk.builtin.slice){let n="";return t=this.sq$length(),this.codepoints?e.sssiter$(t,(e=>{n+=this.v.substring(this.codepoints[e],this.codepoints[e+1])})):e.sssiter$(t,(e=>{n+=this.v.charAt(e)})),new Sk.builtin.str(n)}throw new Sk.builtin.TypeError("string indices must be integers, not "+Sk.abstr.typeName(e))},sq$length(){return this.$hasAstralCodePoints()?this.codepoints.length:this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("cannot concatenate 'str' and '"+Sk.abstr.typeName(e)+"' objects");return new Sk.builtin.str(this.v+e.v)},sq$repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");if((e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;let t="";for(let n=0;n' requires string as left operand not "+Sk.abstr.typeName(e));return-1!==this.v.indexOf(e.v)},tp$as_number:!0,nb$remainder:function(e){const t=this.sk$builtinBase;e.constructor===Sk.builtin.tuple||e instanceof Sk.builtin.dict||e instanceof Sk.builtin.mappingproxy||(e=new Sk.builtin.tuple([e]));var n=0,i=this.$jsstr().replace(/%(\([a-zA-Z0-9]+\))?([#0 +\-]+)?(\*|[0-9]+)?(\.(\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrsb%])/g,(function(i,r,s,o,a,l,u){var c,p,h,d,f;o=Sk.builtin.asnum$(o),a=Sk.builtin.asnum$(a),void 0!==r&&""!==r||"%"==u||(c=n++),""===a&&(a=void 0);var _=p=h=d=f=!1;if(s&&(-1!==s.indexOf("-")?d=!0:-1!==s.indexOf("0")&&(f=!0),-1!==s.indexOf("+")?p=!0:-1!==s.indexOf(" ")&&(h=!0),_=-1!==s.indexOf("#")),a&&(a=parseInt(a.substr(1),10)),s=function(e,t){var n;t=Sk.builtin.asnum$(t);var i=!1;if("number"==typeof e){0>e&&(e=-e,i=!0);var r=e.toString(t)}else e instanceof Sk.builtin.float_?(2<(r=e.str$(t,!1)).length&&".0"===r.substr(-2)&&(r=r.substr(0,r.length-2)),i=e.nb$isnegative()):(e instanceof Sk.builtin.int_||e instanceof Sk.builtin.lng)&&(r=e.str$(t,!1),i=e.nb$isnegative());if(Sk.asserts.assert(void 0!==r,"unhandled number format"),e=!1,a)for(n=r.length;nt){for(this.codepoints=[],e=0;et&&e++;return!0}}return this.codepoints=null,!1},sk$asarray(){const e=[];if(this.$hasAstralCodePoints()){var t=this.codepoints;for(let n=0;ni)return new Sk.builtin.str(this.v.replace(e,t));let r=0;return e=this.v.replace(e,(e=>r++t?0:2*(e.length/2-t);for(t=[],0>=n?n=0:t.push(new Sk.builtin.str(this.v.slice(0,e[n-1])));n{if(!(e instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("sequence item "+t.length+": expected str, "+Sk.abstr.typeName(e)+" found");t.push(e.v)})),(()=>new Sk.builtin.str(t.join(this.v))))},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Concatenate any number of strings.\n\nThe string whose method is called is inserted in between each given string.\nThe result is returned as a new string.\n\nExample: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'"},capitalize:{$meth:function(){return new Sk.builtin.str(this.v.charAt(0).toUpperCase()+this.v.slice(1).toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a capitalized version of the string.\n\nMore specifically, make the first character have upper case and the rest lower\ncase."},title:{$meth:function(){const e=this.v.replace(/[a-z][a-z]*/gi,(e=>e[0].toUpperCase()+e.substr(1).toLowerCase()));return new Sk.builtin.str(e)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a version of the string where each word is titlecased.\n\nMore specifically, words start with uppercased characters and all remaining\ncased characters have lower case."},center:{$meth:o(!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a centered string of length width.\n\nPadding is done using the specified fill character (default is a space)."},count:{$meth:function(e,t,n){return e=this.get$tgt(e),({start:t,end:n}=a(this,t,n)),n int\n\nReturn the number of non-overlapping occurrences of substring sub in\nstring S[start:end]. Optional arguments start and end are\ninterpreted as in slice notation."},expandtabs:{$meth:function(e){if(!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError("an integer is required, got type"+Sk.abstr.typeName(e));e=Sk.builtin.asnum$(e);const t=Array(e+1).join(" "),n=this.v.replace(/([^\r\n\t]*)\t/g,((n,i)=>i+t.slice(i.length%e)));return new Sk.builtin.str(n)},$flags:{NamedArgs:["tabsize"],Defaults:[8]},$textsig:"($self, /, tabsize=8)",$doc:"Return a copy where all tab characters are expanded using spaces.\n\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(e,t,n){return new Sk.builtin.int_(this.find$left(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},partition:{$meth:s(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original string\nand two empty strings."},index:{$meth:function(e,t,n){if(-1===(e=this.find$left(e,t,n)))throw new Sk.builtin.ValueError("substring not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found, \nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."},ljust:{$meth:o(!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a left-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."},lower:{$meth(){return new Sk.builtin.str(this.v.toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to lowercase."},lstrip:{$meth:r(/^\s+/g,(e=>"^["+e+"]+")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},rfind:{$meth(e,t,n){return new Sk.builtin.int_(this.find$right(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.rfind(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(e,t,n){if(-1===(e=this.find$right(e,t,n)))throw new Sk.builtin.ValueError("substring not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."},rjust:{$meth:o(!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a right-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."},rstrip:{$meth:r(/\s+$/g,(e=>"["+e+"]+$")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with trailing whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},rpartition:{$meth:s(!0),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty strings\nand the original string."},splitlines:{$meth:function(e){e=Sk.misceval.isTrue(e);const t=this.v,n=[],i=t.length;var r=0;for(let o=0;o"^["+e+"]+|["+e+"]+$")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading and trailing whitespace remove.\n\nIf chars is given and not None, remove characters in chars instead."},swapcase:{$meth(){const e=this.v.replace(/[a-z]/gi,(e=>{const t=e.toLowerCase();return t===e?e.toUpperCase():t}));return new Sk.builtin.str(e)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Convert uppercase characters to lowercase and lowercase characters to uppercase."},upper:{$meth(){return new Sk.builtin.str(this.v.toUpperCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to uppercase."},startswith:{$meth:u("startswith",((e,t)=>0===e.indexOf(t))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if S starts with the specified prefix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nprefix can also be a tuple of strings to try."},endswith:{$meth:u("endswith",((e,t)=>-1!==e.indexOf(t,e.length-t.length))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if S ends with the specified suffix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nsuffix can also be a tuple of strings to try."},isascii:{$meth(){return new Sk.builtin.bool(/^[\x00-\x7F]*$/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if all characters in the string are ASCII, False otherwise.\n\nASCII characters have code points in the range U+0000-U+007F.\nEmpty string is ASCII too."},islower:{$meth:function(){return new Sk.builtin.bool(this.v.length&&/[a-z]/.test(this.v)&&!/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is a lowercase string, False otherwise.\n\nA string is lowercase if all cased characters in the string are lowercase and\nthere is at least one cased character in the string."},isupper:{$meth:function(){return new Sk.builtin.bool(this.v.length&&!/[a-z]/.test(this.v)&&/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is an uppercase string, False otherwise.\n\nA string is uppercase if all cased characters in the string are uppercase and\nthere is at least one cased character in the string."},istitle:{$meth:function(){const e=this.v;let t,n=!1,i=!1;for(let r=0;r str\n\nReturn a formatted version of S, using substitutions from args and kwargs.\nThe substitutions are identified by braces ('{' and '}')."},__format__:{$meth:Sk.formatting.formatString,$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:"Return a formatted version of the string as described by format_spec."},__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.str(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null}}}),Sk.exportSymbol("Sk.builtin.str",Sk.builtin.str);var h=/^[A-Za-z0-9]+$/,d=/([.*+?=|\\\/()\[\]\{\}^$])/g,f=/^[\s\xa0]+/;Sk.builtin.str.$py2decode=new Sk.builtin.method_descriptor(Sk.builtin.str,{$name:"decode",$meth(e,t){const n=new Sk.builtin.bytes(this.v);return Sk.builtin.bytes.$decode.call(n,e,t)},$flags:{NamedArgs:["encoding","errors"]}});var _=Sk.abstr.buildIteratorClass("str_iterator",{constructor:function(e){this.$index=0,e.$hasAstralCodePoints()?(this.$seq=e.codepoints,this.tp$iternext=()=>{const t=this.$seq[this.$index];if(void 0!==t)return new Sk.builtin.str(e.v.substring(t,this.$seq[++this.$index]))}):(this.$seq=e.v,this.tp$iternext=()=>{const e=this.$seq[this.$index++];if(void 0!==e)return new Sk.builtin.str(e)})},iternext(){return this.tp$iternext()},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),m={abstract:!0,as:!0,boolean:!0,break:!0,byte:!0,case:!0,catch:!0,char:!0,class:!0,continue:!0,const:!0,debugger:!0,default:!0,delete:!0,do:!0,double:!0,else:!0,enum:!0,export:!0,extends:!0,false:!0,final:!0,finally:!0,float:!0,for:!0,function:!0,goto:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,int:!0,interface:!0,is:!0,long:!0,namespace:!0,native:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,short:!0,static:!0,super:!0,switch:!0,synchronized:!0,this:!0,throw:!0,throws:!0,transient:!0,true:!0,try:!0,typeof:!0,use:!0,var:!0,void:!0,volatile:!0,while:!0,with:!0,constructor:!0,__defineGetter__:!0,__defineSetter__:!0,apply:!0,arguments:!0,call:!0,caller:!0,eval:!0,hasOwnProperty:!0,isPrototypeOf:!0,__lookupGetter__:!0,__lookupSetter__:!0,__noSuchMethod__:!0,propertyIsEnumerable:!0,prototype:!0,toSource:!0,toLocaleString:!0,toString:!0,unwatch:!0,valueOf:!0,watch:!0,length:!0,name:!0};Sk.builtin.str.reservedWords_=m},function(e,t){Sk.builtin.func=Sk.abstr.buildNativeClass("function",{constructor:function(e,t,n,i){if(Sk.asserts.assert(this instanceof Sk.builtin.func,"builtin func should be called as a class with `new`"),this.func_code=e,this.func_globals=t||null,this.$name=e.co_name&&e.co_name.v||e.name||"",this.$d=Sk.builtin.dict?new Sk.builtin.dict:void 0,this.$doc=e.co_docstring||Sk.builtin.none.none$,this.$module=Sk.globals&&Sk.globals.__name__||Sk.builtin.none.none$,this.$qualname=e.co_qualname&&e.co_qualname.v||this.$name,void 0!==i)for(let e in i)n[e]=i[e];this.func_closure=n,this.$memoiseFlags(),this.memoised=e.co_fastcall||null,this.tp$call=e.co_fastcall?e.bind(this):Sk.builtin.func.prototype.tp$call.bind(this)},slots:{tp$getattr:Sk.generic.getAttr,tp$descr_get(e,t){return null===e?this:new Sk.builtin.method(this,e)},$r(){return new Sk.builtin.str("")},tp$call(e,t){if(this.memoised||(this.$memoiseFlags(),this.memoised=!0),void 0===this.co_argcount&&void 0===this.co_varnames&&!this.co_kwargs&&!this.func_closure){if(t&&0!==t.length)throw new Sk.builtin.TypeError(this.$name+"() takes no keyword arguments");return this.func_code.apply(this.func_globals,e)}return e=this.$resolveArgs(e,t),this.func_closure&&e.push(this.func_closure),this.func_code.apply(this.func_globals,e)}},getsets:{__name__:{$get(){return new Sk.builtin.str(this.$name)},$set(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__name__ must be set to a string object");this.$name=e.$jsstr()}},__qualname__:{$get(){return new Sk.builtin.str(this.$qualname)},$set(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__qualname__ must be set to a string object");this.$qualname=e.$jsstr()}},__dict__:Sk.generic.getSetDict,__defaults__:{$get(){return new Sk.builtin.tuple(this.$defaults)}},__doc__:{$get(){return this.$doc},$set(e){this.$doc=e||Sk.builtin.none.none$}}},proto:{$memoiseFlags(){this.co_varnames=this.func_code.co_varnames,this.co_argcount=this.func_code.co_argcount,void 0===this.co_argcount&&this.co_varnames&&(this.co_argcount=this.co_argcount=this.co_varnames.length),this.co_kwonlyargcount=this.func_code.co_kwonlyargcount||0,this.co_varargs=this.func_code.co_varargs,this.co_kwargs=this.func_code.co_kwargs,this.$defaults=this.func_code.$defaults||[],this.$kwdefs=this.func_code.$kwdefs||[]},$resolveArgs:function(e,t){var n=this.co_argcount;void 0===n&&(n=this.co_varnames?this.co_varnames.length:e.length);var i=this.co_varnames||[],r=this.co_kwonlyargcount||0;let s,o=n+r;if(!(0!==r||this.co_kwargs||t&&0!==t.length||this.co_varargs)){if(e.length==n)return e;if(0===e.length&&this.$defaults&&this.$defaults.length===n){for(i=0;i!=this.$defaults.length;i++)e[i]=this.$defaults[i];return e}}this.co_kwargs&&(s=[]);var a=e.length;let l=e.length<=n?e:e.slice(0,n);if(this.co_varargs)e=e.length>l.length?e.slice(l.length):[],l[o]=new Sk.builtin.tuple(e);else if(a>n)throw new Sk.builtin.TypeError(this.$name+"() takes "+n+" positional argument"+(1==n?"":"s")+" but "+a+(1==a?" was ":" were ")+" given");if(t){if(this.func_code.no_kw)throw new Sk.builtin.TypeError(this.$name+"() takes no keyword arguments");for(e=0;ee.indexOf(".")&&0>e.indexOf("e")&&0>e.indexOf("E"))return e;var t=0;if(0<=e.indexOf("e")){var n=e.substr(0,e.indexOf("e"));t=e.substr(e.indexOf("e")+1)}else 0<=e.indexOf("E")?(n=e.substr(0,e.indexOf("e")),t=e.substr(e.indexOf("E")+1)):n=e;if(t=parseInt(t,10),0>(e=n.indexOf("."))){if(0<=t){for(;0-t?n.substr(0,n.length+t):0}for(n=0===e?n.substr(1):en.length;)n+="0";return 0>=e?0:n.substr(0,e)},Sk.exportSymbol("Sk.builtin.asnum$nofloat",Sk.builtin.asnum$nofloat),Sk.builtin.round=function(e,t){if(void 0===e)throw new Sk.builtin.TypeError("a float is required");if(!Sk.__future__.dunder_round){if(!Sk.builtin.checkNumber(e))throw new Sk.builtin.TypeError("a float is required");if(e.round$)return e.round$(t);throw new Sk.builtin.AttributeError(Sk.abstr.typeName(e)+" instance has no attribute '__float__'")}if(void 0!==t&&!Sk.builtin.checkNone(t)&&!Sk.misceval.isIndex(t))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(t)+"' object cannot be interpreted as an index");if(void 0!==(e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$round)))return void 0!==t?Sk.misceval.callsimArray(e,[t]):Sk.misceval.callsimArray(e,[]);throw new Sk.builtin.TypeError("a float is required")},Sk.builtin.len=function(e){if(!e.sq$length)throw new Sk.builtin.TypeError("object of type '"+Sk.abstr.typeName(e)+"' has no len()");return e=e.sq$length(!0),Sk.misceval.chain(e,(e=>new Sk.builtin.int_(e)))},Sk.builtin.min=function(e,t){let n;const i=e.length;if(!i)throw new Sk.builtin.TypeError("min expected 1 argument, got 0");const[r,s]=Sk.abstr.copyKeywordsToNamedArgs("min",["default","key"],[],t,[null,Sk.builtin.none.none$]);if(1{if(o=e,void 0!==o)return Sk.builtin.checkNone(s)?Sk.misceval.iterFor(n,(e=>{Sk.misceval.richCompareBool(e,o,"Lt")&&(o=e)})):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[o]),(e=>Sk.misceval.iterFor(n,(t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[t]),(n=>{Sk.misceval.richCompareBool(n,e,"Lt")&&(o=t,e=n)}))))))}),(()=>{if(void 0===o){if(null===r)throw new Sk.builtin.ValueError("min() arg is an empty sequence");o=r}return o}))},Sk.builtin.max=function(e,t){let n;const i=e.length;if(!i)throw new Sk.builtin.TypeError("max expected 1 argument, got 0");const[r,s]=Sk.abstr.copyKeywordsToNamedArgs("min",["default","key"],[],t,[null,Sk.builtin.none.none$]);if(1{if(o=e,void 0!==o)return Sk.builtin.checkNone(s)?Sk.misceval.iterFor(n,(e=>{Sk.misceval.richCompareBool(e,o,"Gt")&&(o=e)})):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[o]),(e=>Sk.misceval.iterFor(n,(t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[t]),(n=>{Sk.misceval.richCompareBool(n,e,"Gt")&&(o=t,e=n)}))))))}),(()=>{if(void 0===o){if(null===r)throw new Sk.builtin.ValueError("min() arg is an empty sequence");o=r}return o}))},Sk.builtin.min.co_fastcall=Sk.builtin.max.co_fastcall=1,Sk.builtin.any=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){if(Sk.misceval.isTrue(e))return new Sk.misceval.Break(Sk.builtin.bool.true$)})),(e=>e||Sk.builtin.bool.false$))},Sk.builtin.all=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){if(!Sk.misceval.isTrue(e))return new Sk.misceval.Break(Sk.builtin.bool.false$)})),(e=>e||Sk.builtin.bool.true$))},Sk.builtin.sum=function(e,t){const n=Sk.abstr.iter(e);if(void 0===t)var i=new Sk.builtin.int_(0);else{if(Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("sum() can't sum strings [use ''.join(seq) instead]");i=t}return e=void 0===t||t.constructor===Sk.builtin.int_?Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.int_)return e.constructor===Sk.builtin.float_?(i=i.nb$float().nb$add(e),new Sk.misceval.Break("float")):(i=Sk.abstr.numberBinOp(i,e,"Add"),new Sk.misceval.Break("slow"));i=i.nb$add(e)})):t.constructor===Sk.builtin.float_?"float":"slow",Sk.misceval.chain(e,(e=>"float"===e?Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.float_&&e.constructor!==Sk.builtin.int_)return i=Sk.abstr.numberBinOp(i,e,"Add"),new Sk.misceval.Break("slow");i=i.nb$add(e)})):e),(e=>{if("slow"===e)return Sk.misceval.iterFor(n,(e=>{i=Sk.abstr.numberBinOp(i,e,"Add")}))}),(()=>i))},Sk.builtin.zip=function(){var e,t;if(0===arguments.length)return new Sk.builtin.list([]);var n=[];for(t=0;te||1114112<=e)throw new Sk.builtin.ValueError("chr() arg not in range(0x110000)")}else if(0>e||256<=e)throw new Sk.builtin.ValueError("chr() arg not in range(256)");return new Sk.builtin.str(String.fromCodePoint(e))},Sk.builtin.unichr=function(e){if(!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError("an integer is required");e=Sk.builtin.asnum$(e);try{return new Sk.builtin.str(String.fromCodePoint(e))}catch(e){if(e instanceof RangeError)throw new Sk.builtin.ValueError(e.message);throw e}},Sk.builtin.int2str_=function(e,t,n){let i;e.constructor===Sk.builtin.int_||e instanceof Sk.builtin.int_||(e=e.nb$index()),i=e.v;let r=i.toString(t);return r=e.nb$isnegative()?"-"+n+r.slice(1):n+r,2!==t&&!Sk.__future__.python3&&(e instanceof Sk.builtin.lng||JSBI.__isBigInt(i))&&(r+="L"),new Sk.builtin.str(r)},Sk.builtin.hex=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("hex() argument can't be converted to hex");return Sk.builtin.int2str_(e,16,"0x")},Sk.builtin.oct=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("oct() argument can't be converted to hex");return Sk.__future__.octal_number_literal?Sk.builtin.int2str_(e,8,"0o"):Sk.builtin.int2str_(e,8,"0")},Sk.builtin.bin=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object can't be interpreted as an index");return Sk.builtin.int2str_(e,2,"0b")},Sk.builtin.dir=function(e){if(void 0!==e)return e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$dir),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(e,[]),(e=>Sk.builtin.sorted(e)));throw new Sk.builtin.NotImplementedError("skulpt does not yet support dir with no args")},Sk.builtin.repr=function(e){return e.$r()},Sk.builtin.ascii=function(e){return Sk.misceval.chain(e.$r(),(e=>{let t,n;for(n=0;n=r?(2>(i=r.toString(16)).length&&(i="0"+i),t+="\\x"+i):127r||57344<=r?t+="\\u"+("000"+r.toString(16)).slice(-4):55296<=r?(i=e.v.codePointAt(n),n++,r="0000000"+(i=i.toString(16)).toString(16),t=4e.tp$getattr(t,!0)),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return Sk.misceval.chain(i,(i=>{if(void 0===i){if(void 0!==n)return n;throw new Sk.builtin.AttributeError(e.sk$attrError()+" has no attribute "+Sk.misceval.objectRepr(t))}return i}))},Sk.builtin.setattr=function(e,t,n){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("attribute name must be string");return Sk.misceval.chain(e.tp$setattr(t,n,!0),(()=>Sk.builtin.none.none$))},Sk.builtin.raw_input=function(e){var t=e||"";return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(function(e){return Sk.inputfunTakesPrompt?Sk.builtin.file.$readline(e.$d.stdin,null,t):Sk.misceval.chain(void 0,(function(){return Sk.misceval.callsimOrSuspendArray(e.$d.stdout.write,[e.$d.stdout,new Sk.builtin.str(t)])}),(function(){return Sk.misceval.callsimOrSuspendArray(e.$d.stdin.readline,[e.$d.stdin])}))}))},Sk.builtin.input=Sk.builtin.raw_input,Sk.builtin.jseval=function(e){return e=Sk.global.eval(Sk.ffi.remapToJs(e)),Sk.ffi.remapToPy(e)},Sk.builtin.jsmillis=function(){return console.warn("jsmillis is deprecated"),(new Date).valueOf()},Sk.builtin.eval_=function(){throw new Sk.builtin.NotImplementedError("eval is not yet implemented")},Sk.builtin.map=function(e,t){var n,i,r=[];if(Sk.builtin.pyCheckArgsLen("map",arguments.length,2),2((e=new Sk.builtin.list(e)).list$sort(t,n,i),e)))},Sk.builtin.filter=function(e,t){var n;if(Sk.builtin.pyCheckArgsLen("filter",arguments.length,2,2),!Sk.builtin.checkIterable(t))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(t)+"' object is not iterable");var i=function(){return[]},r=function(e,t){return e.push(t),e},s=function(e){return new Sk.builtin.list(e)};t.ob$type===Sk.builtin.str?(i=function(){return new Sk.builtin.str("")},r=function(e,t){return e.sq$concat(t)},s=function(e){return e}):t.ob$type===Sk.builtin.tuple&&(s=function(e){return new Sk.builtin.tuple(e)});var o=i(),a=Sk.abstr.iter(t);for(n=a.tp$iternext();void 0!==n;n=a.tp$iternext())i=e===Sk.builtin.none.none$?new Sk.builtin.bool(n):Sk.misceval.callsimArray(e,[n]),Sk.misceval.isTrue(i)&&(o=r(o,n));return s(o)},Sk.builtin.hasattr=function(e,t){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("hasattr(): attribute name must be string");const n=Sk.misceval.tryCatch((()=>e.tp$getattr(t,!0)),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return Sk.misceval.chain(n,(e=>void 0===e?Sk.builtin.bool.false$:Sk.builtin.bool.true$))},Sk.builtin.pow=function(e,t,n){if(void 0===n||Sk.builtin.checkNone(n))return Sk.abstr.numberBinOp(e,t,"Pow");if(!(Sk.builtin.checkInt(e)&&Sk.builtin.checkInt(t)&&Sk.builtin.checkInt(n))){if(Sk.builtin.checkFloat(e)||Sk.builtin.checkComplex(e))return e.nb$power(t,n);throw new Sk.builtin.TypeError("unsupported operand type(s) for ** or pow(): '"+Sk.abstr.typeName(e)+"', '"+Sk.abstr.typeName(t)+"', '"+Sk.abstr.typeName(n)+"'")}return e.nb$power(t,n)},Sk.builtin.quit=function(e){throw e=new Sk.builtin.str(e).v,new Sk.builtin.SystemExit(e)},Sk.builtin.issubclass=function(e,t){if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError("issubclass() arg 1 must be a class");var n=Sk.builtin.checkClass(t);if(!(n||t instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError("issubclass() arg 2 must be a class or tuple of classes");if(n)return e.$isSubType(t)?Sk.builtin.bool.true$:Sk.builtin.bool.false$;for(n=0;n"})},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:"Common base class for all exceptions",tp$new(e,t){return this.hp$type?(t=new this.constructor,Sk.builtin.BaseException.call(t)):t=new this.constructor,t.args=new Sk.builtin.tuple(e.slice()),t},tp$init(e,t){Sk.abstr.checkNoKwargs(Sk.abstr.typeName(this),t)},$r(){let e=this.tp$name;return e+="("+this.args.v.map((e=>Sk.misceval.objectRepr(e))).join(", ")+")",new Sk.builtin.str(e)},tp$str(){return 1>=this.args.v.length?new Sk.builtin.str(this.args.v[0]):this.args.$r()}},getsets:{args:{$get(){return this.args}},__dict__:Sk.generic.getSetDict},proto:{toString(){let e=this.tp$name;return e+=": "+this.tp$str().v,0!==this.traceback.length?e+" on line "+this.traceback[0].lineno:e+" at "}}}),Sk.exportSymbol("Sk.builtin.BaseException",Sk.builtin.BaseException),Sk.builtin.Exception=Sk.abstr.buildNativeClass("Exception",{constructor:function(...e){Sk.builtin.BaseException.apply(this,e)},base:Sk.builtin.BaseException}),Sk.exportSymbol("Sk.builtin.Exception",Sk.builtin.Exception),Sk.builtin.AssertionError=Sk.abstr.buildNativeClass("AssertionError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.AssertionError",Sk.builtin.AssertionError),Sk.builtin.AttributeError=Sk.abstr.buildNativeClass("AttributeError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.ImportError=Sk.abstr.buildNativeClass("ImportError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.IndentationError=Sk.abstr.buildNativeClass("IndentationError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.IndexError=Sk.abstr.buildNativeClass("IndexError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.LookupError=Sk.abstr.buildNativeClass("LookupError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.KeyError=Sk.abstr.buildNativeClass("KeyError",{constructor:function(...e){Sk.builtin.LookupError.apply(this,e)},base:Sk.builtin.LookupError}),Sk.builtin.NameError=Sk.abstr.buildNativeClass("NameError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.UnboundLocalError=Sk.abstr.buildNativeClass("UnboundLocalError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.OverflowError=Sk.abstr.buildNativeClass("OverflowError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.SyntaxError=Sk.abstr.buildNativeClass("SyntaxError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.RuntimeError=Sk.abstr.buildNativeClass("RuntimeError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.RuntimeError",Sk.builtin.RuntimeError),Sk.builtin.SuspensionError=Sk.abstr.buildNativeClass("SuspensionError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.SuspensionError",Sk.builtin.SuspensionError),Sk.builtin.SystemExit=Sk.abstr.buildNativeClass("SystemExit",{constructor:function(...e){Sk.builtin.BaseException.apply(this,e)},base:Sk.builtin.BaseException}),Sk.exportSymbol("Sk.builtin.SystemExit",Sk.builtin.SystemExit),Sk.builtin.TypeError=Sk.abstr.buildNativeClass("TypeError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.TypeError",Sk.builtin.TypeError),Sk.builtin.ValueError=Sk.abstr.buildNativeClass("ValueError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.ValueError",Sk.builtin.ValueError),Sk.builtin.ZeroDivisionError=Sk.abstr.buildNativeClass("ZeroDivisionError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.builtin.TimeLimitError=Sk.abstr.buildNativeClass("TimeLimitError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.TimeLimitError",Sk.builtin.TimeLimitError),Sk.builtin.IOError=Sk.abstr.buildNativeClass("IOError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.IOError",Sk.builtin.IOError),Sk.builtin.NotImplementedError=Sk.abstr.buildNativeClass("NotImplementedError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.NotImplementedError",Sk.builtin.NotImplementedError),Sk.builtin.NegativePowerError=Sk.abstr.buildNativeClass("NegativePowerError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.NegativePowerError",Sk.builtin.NegativePowerError),Sk.builtin.ExternalError=Sk.abstr.buildNativeClass("ExternalError",{constructor:function(...e){if(this.nativeError=e[0],!Sk.builtin.checkString(this.nativeError)&&(e[0]=this.nativeError.toString(),e[0].startsWith("RangeError: Maximum call")))return e[0]="Maximum call stack size exceeded",new Sk.builtin.RecursionError(...e);Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.ExternalError",Sk.builtin.ExternalError),Sk.builtin.RecursionError=Sk.abstr.buildNativeClass("RecursionError",{constructor:function(...e){Sk.builtin.RuntimeError.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.RecursionError",Sk.builtin.RecursionError),Sk.builtin.OperationError=Sk.abstr.buildNativeClass("OperationError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.OperationError",Sk.builtin.OperationError),Sk.builtin.SystemError=Sk.abstr.buildNativeClass("SystemError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.SystemError",Sk.builtin.SystemError),Sk.builtin.UnicodeDecodeError=Sk.abstr.buildNativeClass("UnicodeDecodeError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.UnicodeDecodeError",Sk.builtin.UnicodeDecodeError),Sk.builtin.UnicodeEncodeError=Sk.abstr.buildNativeClass("UnicodeEncodeError",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.UnicodeEncodeError",Sk.builtin.UnicodeEncodeError),Sk.builtin.StopIteration=Sk.abstr.buildNativeClass("StopIteration",{constructor:function(...e){Sk.builtin.Exception.apply(this,e)},base:Sk.builtin.Exception}),Sk.exportSymbol("Sk.builtin.StopIteration",Sk.builtin.StopIteration),Sk.builtin.getExcInfo=function(e){return new Sk.builtin.tuple([e.ob$type||Sk.builtin.none.none$,e,Sk.builtin.none.none$])}},function(e,t){Sk.builtin.method=Sk.abstr.buildNativeClass("method",{constructor:function(e,t){Sk.asserts.assert(this instanceof Sk.builtin.method,"bad call to method constructor, use 'new'"),this.im_func=e,this.im_self=t,this.im_call=e.tp$call},slots:{$r(){let e=this.im_func.tp$getattr(Sk.builtin.str.$qualname)||this.im_func.tp$getattr(Sk.builtin.str.$name);return e=e&&e.v||"?",new Sk.builtin.str("")},tp$hash(){return Sk.abstr.objectHash(this.im_self)+Sk.abstr.objectHash(this.im_func)},tp$call(e,t){var n=this.im_call;if(void 0===n)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this.im_func)+"' object is not callable");return e=[this.im_self,...e],n.call(this.im_func,e,t)},tp$new(e,t){if(Sk.abstr.checkNoKwargs("method",t),Sk.abstr.checkArgsLen("method",e,2,2),t=e[0],e=e[1],!Sk.builtin.checkCallable(t))throw new Sk.builtin.TypeError("first argument must be callable");if(Sk.builtin.checkNone(e))throw new Sk.builtin.TypeError("self must not be None");return new Sk.builtin.method(t,e)},tp$richcompare(e,t){if("Eq"!=t&&"NotEq"!=t||!(e instanceof Sk.builtin.method))return Sk.builtin.NotImplemented.NotImplemented$;let n;try{n=Sk.misceval.richCompareBool(this.im_self,e.im_self,"Eq",!1)&&this.im_func==e.im_func}catch(e){n=!1}return"Eq"==t?n:!n},tp$descr_get(e,t){return this},tp$getattr(e,t){const n=Sk.abstr.lookupSpecial(this,e);return void 0!==n?n:this.im_func.tp$getattr(e,t)}},getsets:{__func__:{$get(){return this.im_func}},__self__:{$get(){return this.im_self}},__doc__:{$get(){return this.im_func.tp$getattr(Sk.builtin.str.$doc)}}},flags:{sk$suitable_as_base_class:!1}})},function(e,t){function n(e){if(null!=e){if(e.nb$index)return e.nb$index();if("number"==typeof e&&Number.isInteger(e))return e}}function i(e,t){const i=n(e);if(void 0!==i)return i;throw t=(t||"'{tp$name}' object cannot be interpreted as an integer").replace("{tp$name}",Sk.abstr.typeName(e)),new Sk.builtin.TypeError(t)}Sk.misceval={},Sk.misceval.Suspension=function(e,t,n){this.$isSuspension=!0,void 0!==e&&void 0!==t&&(this.resume=function(){return e(t.resume())}),this.child=t,this.optional=void 0!==t&&t.optional,this.data=void 0===n&&void 0!==t?t.data:n},Sk.exportSymbol("Sk.misceval.Suspension",Sk.misceval.Suspension),Sk.misceval.retryOptionalSuspensionOrThrow=function(e,t){for(;e instanceof Sk.misceval.Suspension;){if(!e.optional)throw new Sk.builtin.SuspensionError(t||"Cannot call a function that blocks or suspends here");e=e.resume()}return e},Sk.exportSymbol("Sk.misceval.retryOptionalSuspensionOrThrow",Sk.misceval.retryOptionalSuspensionOrThrow),Sk.misceval.isIndex=function(e){return null!=e&&(void 0!==e.nb$index||"number"==typeof e&&Number.isInteger(e))},Sk.exportSymbol("Sk.misceval.isIndex",Sk.misceval.isIndex),Sk.misceval.asIndex=n,Sk.misceval.asIndexSized=function(e,t,n){if("number"==typeof(n=i(e,n)))return n;if(null==t)return JSBI.lessThan(n,JSBI.__ZERO)?-Number.MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER;throw new t("cannot fit '"+Sk.abstr.typeName(e)+"' into an index-sized integer")},Sk.misceval.asIndexOrThrow=i,Sk.misceval.applySlice=function(e,t,n,i){return Sk.abstr.objectGetItem(e,new Sk.builtin.slice(t,n,null),i)},Sk.exportSymbol("Sk.misceval.applySlice",Sk.misceval.applySlice),Sk.misceval.assignSlice=function(e,t,n,i,r){return t=new Sk.builtin.slice(t,n),null===i?Sk.abstr.objectDelItem(e,t):Sk.abstr.objectSetItem(e,t,i,r)},Sk.exportSymbol("Sk.misceval.assignSlice",Sk.misceval.assignSlice),Sk.misceval.arrayFromArguments=function(e){var t;if(1!=e.length)return e;var n=e[0];if(n instanceof Sk.builtin.set?n=n.tp$iter().$obj:n instanceof Sk.builtin.dict&&(n=Sk.builtin.dict.prototype.keys.func_code(n)),n instanceof Sk.builtin.list||n instanceof Sk.builtin.tuple)return n.v;if(Sk.builtin.checkIterable(n)){for(e=[],t=(n=Sk.abstr.iter(n)).tp$iternext();void 0!==t;t=n.tp$iternext())e.push(t);return e}throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(n)+"' object is not iterable")},Sk.exportSymbol("Sk.misceval.arrayFromArguments",Sk.misceval.arrayFromArguments),Sk.misceval.iterator=Sk.abstr.buildIteratorClass("iterator",{constructor:function(e,t){this.tp$iternext=t?e:function(t){let n=e();return t||!n.$isSuspension?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)}},iternext:function(e){return this.tp$iternext(e)},flags:{sk$acceptable_as_base_class:!1}}),Sk.misceval.swappedOp_={Eq:"Eq",NotEq:"NotEq",Lt:"Gt",LtE:"GtE",Gt:"Lt",GtE:"LtE"},Sk.misceval.opSymbols={Eq:"==",NotEq:"!=",Lt:"<",LtE:"<=",Gt:">",GtE:">=",Is:"is",IsNot:"is not",In_:"in",NotIn:"not in"},Sk.misceval.richCompareBool=function(e,t,n,i){var r;Sk.asserts.assert(e.sk$object&&t.sk$object,"JS object passed to richCompareBool");var s=e.ob$type,o=t.ob$type,a=o!==s&&void 0===o.sk$baseClass&&o.$isSubType(s);if(!Sk.__future__.python3&&s!==o&&("GtE"===n||"Gt"===n||"LtE"===n||"Lt"===n)){var l=[Sk.builtin.float_,Sk.builtin.int_,Sk.builtin.lng,Sk.builtin.bool],u=[Sk.builtin.dict,Sk.builtin.enumerate,Sk.builtin.filter_,Sk.builtin.list,Sk.builtin.map_,Sk.builtin.str,Sk.builtin.tuple,Sk.builtin.zip_];const i=l.indexOf(s),r=u.indexOf(s);if(l=l.indexOf(o),u=u.indexOf(o),e===Sk.builtin.none.none$)switch(n){case"Lt":case"LtE":return!0;case"Gt":case"GtE":return!1}if(t===Sk.builtin.none.none$)switch(n){case"Lt":case"LtE":return!1;case"Gt":case"GtE":return!0}if(-1!==i&&-1!==u)switch(n){case"Lt":case"LtE":return!0;case"Gt":case"GtE":return!1}if(-1!==r&&-1!==l)switch(n){case"Lt":case"LtE":return!1;case"Gt":case"GtE":return!0}if(-1!==r&&-1!==u)switch(n){case"Lt":return ru;case"GtE":return r>=u}}if("Is"===n){if(s===o){if(e===t)return!0;if(s===Sk.builtin.float_)return e.v===t.v;if(s===Sk.builtin.int_)return"number"==typeof e.v&&"number"==typeof e.v?e.v===t.v:JSBI.equal(JSBI.BigInt(e.v),JSBI.BigInt(t.v))}return!1}if("IsNot"===n)return s!==o||(s===Sk.builtin.float_?e.v!==t.v:s===Sk.builtin.int_?"number"==typeof e.v&&"number"==typeof e.v?e.v!==t.v:JSBI.notEqual(JSBI.BigInt(e.v),JSBI.BigInt(t.v)):e!==t);if("In"===n)return Sk.misceval.chain(Sk.abstr.sequenceContains(t,e,i),Sk.misceval.isTrue);if("NotIn"===n)return Sk.misceval.chain(Sk.abstr.sequenceContains(t,e,i),(function(e){return!Sk.misceval.isTrue(e)}));if(s=(o={Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"})[n],a&&(t[i=o[Sk.misceval.swappedOp_[n]]]!==e[i]&&(r=t[i](e))!==Sk.builtin.NotImplemented.NotImplemented$)||(r=e[s](t))!==Sk.builtin.NotImplemented.NotImplemented$||!a&&(r=t[i=o[Sk.misceval.swappedOp_[n]]](e))!==Sk.builtin.NotImplemented.NotImplemented$)return Sk.misceval.isTrue(r);if(!Sk.__future__.python3){if(a=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$cmp))try{if(r=Sk.misceval.callsimArray(a,[t]),Sk.builtin.checkNumber(r)){if(r=Sk.builtin.asnum$(r),"Eq"===n)return 0===r;if("NotEq"===n)return 0!==r;if("Lt"===n)return 0>r;if("Gt"===n)return 0=r;if("GtE"===n)return 0<=r}if(r!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int")}catch(e){throw new Sk.builtin.TypeError("comparison did not return an int")}if(a=Sk.abstr.lookupSpecial(t,Sk.builtin.str.$cmp))try{if(r=Sk.misceval.callsimArray(a,[e]),Sk.builtin.checkNumber(r)){if(r=Sk.builtin.asnum$(r),"Eq"===n)return 0===r;if("NotEq"===n)return 0!==r;if("Lt"===n)return 0r;if("LtE"===n)return 0<=r;if("GtE"===n)return 0>=r}if(r!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int")}catch(e){throw new Sk.builtin.TypeError("comparison did not return an int")}if(e===Sk.builtin.none.none$&&t===Sk.builtin.none.none$){if("Eq"===n)return e.v===t.v;if("NotEq"===n)return e.v!==t.v;if("Gt"===n)return e.v>t.v;if("GtE"===n)return e.v>=t.v;if("Lt"===n)return e.v";throw e}},Sk.exportSymbol("Sk.misceval.objectRepr",Sk.misceval.objectRepr),Sk.misceval.opAllowsEquality=function(e){switch(e){case"LtE":case"Eq":case"GtE":return!0}return!1},Sk.exportSymbol("Sk.misceval.opAllowsEquality",Sk.misceval.opAllowsEquality),Sk.misceval.isTrue=function(e){return!0===e||e===Sk.builtin.bool.true$||!1!==e&&e!==Sk.builtin.bool.false$&&null!=e&&(e.nb$bool?e.nb$bool():e.sq$length?0!==e.sq$length():!!e)},Sk.exportSymbol("Sk.misceval.isTrue",Sk.misceval.isTrue),Sk.misceval.softspace_=!1,Sk.misceval.print_=function(e){Sk.misceval.softspace_&&("\n"!==e&&Sk.output(" "),Sk.misceval.softspace_=!1);var t=new Sk.builtin.str(e);return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(function(e){return Sk.misceval.apply(e.$d.stdout.write,void 0,void 0,void 0,[e.$d.stdout,t])}),(function(){var e;(e=0===t.v.length)||(e=!("\n"===(e=t.v[t.v.length-1])||"\t"===e||"\r"===e)),(e||" "===t.v[t.v.length-1])&&(Sk.misceval.softspace_=!0)}))},Sk.exportSymbol("Sk.misceval.print_",Sk.misceval.print_),Sk.misceval.loadname=function(e,t){if(void 0!==(t=t[e]))return t;if(void 0!==(t=Sk.builtins[e]))return t;throw new Sk.builtin.NameError("name '"+Sk.unfixReserved(e)+"' is not defined")},Sk.exportSymbol("Sk.misceval.loadname",Sk.misceval.loadname),Sk.misceval.call=function(e,t,n,i,r){return r=Array.prototype.slice.call(arguments,4),Sk.misceval.apply(e,t,n,i,r)},Sk.exportSymbol("Sk.misceval.call",Sk.misceval.call),Sk.misceval.callAsync=function(e,t,n,i,r,s){return s=Array.prototype.slice.call(arguments,5),Sk.misceval.applyAsync(e,t,n,i,r,s)},Sk.exportSymbol("Sk.misceval.callAsync",Sk.misceval.callAsync),Sk.misceval.callOrSuspend=function(e,t,n,i,r){return r=Array.prototype.slice.call(arguments,4),Sk.misceval.applyOrSuspend(e,t,n,i,r)},Sk.exportSymbol("Sk.misceval.callOrSuspend",Sk.misceval.callOrSuspend),Sk.misceval.callsim=function(e,t){return t=Array.prototype.slice.call(arguments,1),Sk.misceval.apply(e,void 0,void 0,void 0,t)},Sk.exportSymbol("Sk.misceval.callsim",Sk.misceval.callsim),Sk.misceval.callsimArray=function(e,t,n){return t=t||[],Sk.misceval.retryOptionalSuspensionOrThrow(Sk.misceval.callsimOrSuspendArray(e,t,n))},Sk.exportSymbol("Sk.misceval.callsimArray",Sk.misceval.callsimArray),Sk.misceval.callsimAsync=function(e,t,n){return n=Array.prototype.slice.call(arguments,2),Sk.misceval.applyAsync(e,t,void 0,void 0,void 0,n)},Sk.exportSymbol("Sk.misceval.callsimAsync",Sk.misceval.callsimAsync),Sk.misceval.callsimOrSuspend=function(e,t){return t=Array.prototype.slice.call(arguments,1),Sk.misceval.applyOrSuspend(e,void 0,void 0,void 0,t)},Sk.exportSymbol("Sk.misceval.callsimOrSuspend",Sk.misceval.callsimOrSuspend),Sk.misceval.callsimOrSuspendArray=function(e,t,n){return t=t||[],void 0!==e&&e.tp$call?e.tp$call(t,n):Sk.misceval.applyOrSuspend(e,void 0,void 0,n,t)},Sk.exportSymbol("Sk.misceval.callsimOrSuspendArray",Sk.misceval.callsimOrSuspendArray),Sk.misceval.apply=function(e,t,n,i,r){return(e=Sk.misceval.applyOrSuspend(e,t,n,i,r))instanceof Sk.misceval.Suspension?Sk.misceval.retryOptionalSuspensionOrThrow(e):e},Sk.exportSymbol("Sk.misceval.apply",Sk.misceval.apply),Sk.misceval.asyncToPromise=function(e,t){return new Promise((function(n,i){try{!function e(r){try{for(var s=function(){try{e(r.resume())}catch(e){i(e)}},o=function(e){try{r.data.result=e,s()}catch(e){i(e)}},a=function(e){try{r.data.error=e,s()}catch(e){i(e)}};r instanceof Sk.misceval.Suspension;){var l=t&&(t[r.data.type]||t["*"]);if(l){var u=l(r);if(u)return void u.then(e,i)}if("Sk.promise"==r.data.type)return void r.data.promise.then(o,a);if("Sk.yield"==r.data.type)return void Sk.global.setImmediate(s);if("Sk.delay"==r.data.type)return void Sk.global.setImmediate(s);if(!r.optional)throw new Sk.builtin.SuspensionError("Unhandled non-optional suspension of type '"+r.data.type+"'");r=r.resume()}n(r)}catch(e){i(e)}}(e())}catch(e){i(e)}}))},Sk.exportSymbol("Sk.misceval.asyncToPromise",Sk.misceval.asyncToPromise),Sk.misceval.applyAsync=function(e,t,n,i,r,s){return Sk.misceval.asyncToPromise((function(){return Sk.misceval.applyOrSuspend(t,n,i,r,s)}),e)},Sk.exportSymbol("Sk.misceval.applyAsync",Sk.misceval.applyAsync),Sk.misceval.chain=function(e,t){for(var n,i,r=1,s=e;;){if(r==arguments.length)return s;if(s&&s.$isSuspension)break;s=arguments[r](s),r++}for(i=Array(arguments.length-r),n=0;ne[i++]},t,n)},Sk.misceval.arrayFromIterable=function(e,t){if(void 0===e)return[];if(void 0===e.hp$type&&void 0!==e.sk$asarray)return e.sk$asarray();const n=[];return e=Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{n.push(e)})),(()=>n)),t?e:Sk.misceval.retryOptionalSuspensionOrThrow(e)},Sk.misceval.Break=function(e){if(!(this instanceof Sk.misceval.Break))return new Sk.misceval.Break(e);this.brValue=e},Sk.exportSymbol("Sk.misceval.Break",Sk.misceval.Break),Sk.misceval.applyOrSuspend=function(e,t,n,i,r){var s;if(null==e||e===Sk.builtin.none.none$)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not callable");"function"==typeof e&&void 0===e.tp$call&&(e=new Sk.builtin.func(e));var o=e.tp$call;if(void 0!==o){if(n)for(s=(n=n.tp$iter()).tp$iternext();void 0!==s;s=n.tp$iternext())r.push(s);if(t)for(s=(n=Sk.abstr.iter(t)).tp$iternext();void 0!==s;s=n.tp$iternext()){if(!Sk.builtin.checkString(s))throw new Sk.builtin.TypeError("Function keywords must be strings");i.push(s.v),i.push(Sk.abstr.objectGetItem(t,s,!1))}return o.call(e,r,i,t)}if(void 0!==(o=e.__call__))return r.unshift(e),Sk.misceval.apply(o,t,n,i,r);throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not callable")},Sk.exportSymbol("Sk.misceval.applyOrSuspend",Sk.misceval.applyOrSuspend),Sk.misceval.promiseToSuspension=function(e){var t=new Sk.misceval.Suspension;return t.resume=function(){if(t.data.error)throw t.data.error;return t.data.result},t.data={type:"Sk.promise",promise:e},t},Sk.exportSymbol("Sk.misceval.promiseToSuspension",Sk.misceval.promiseToSuspension),Sk.misceval.buildClass=function(e,t,n,i,r){var s=Sk.builtin.type,o={};for(var a in t(e,o,void 0===r?{}:r),e.__name__&&(o.__module__=e.__name__),e=new Sk.builtin.str(n),i=new Sk.builtin.tuple(i),t=[],o)o.hasOwnProperty(a)&&(t.push(new Sk.builtin.str(a)),t.push(o[a]));return t=new Sk.builtin.dict(t),Sk.misceval.callsimArray(s,[e,i,t])},Sk.exportSymbol("Sk.misceval.buildClass",Sk.misceval.buildClass)},function(e,t){Sk.builtin.callable_iter_=Sk.abstr.buildIteratorClass("callable_iterator",{constructor:function(e,t){if(!Sk.builtin.checkCallable(e))throw new Sk.builtin.TypeError("iter(v, w): v must be callable");this.$callable=e,this.$sentinel=t,this.$flag=!1},iternext(e){if(!0!==this.$flag){if(e)return e=Sk.misceval.callsimOrSuspendArray(this.$callable,[]),Sk.misceval.chain(e,(e=>{if(!Sk.misceval.richCompareBool(e,this.$sentinel,"Eq",!0))return e;this.$flag=!0}));if(e=Sk.misceval.callsimArray(this.$callable,[]),!Sk.misceval.richCompareBool(e,this.$sentinel,"Eq",!1))return e;this.$flag=!0}},flags:{sk$acceptable_as_base_class:!1}}),Sk.builtin.seq_iter_=Sk.abstr.buildIteratorClass("iterator",{constructor:function(e){this.$index=0,this.$seq=e},iternext(e){let t;return t=Sk.misceval.tryCatch((()=>this.$seq.mp$subscript(new Sk.builtin.int_(this.$index++),e)),(e=>{if(!(e instanceof Sk.builtin.IndexError||e instanceof Sk.builtin.StopIteration))throw e})),e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},methods:{__length_hint__:{$flags:{NoArgs:!0},$meth(){if(this.$seq.sq$length)return this.$seq.sq$length()-this.$index;throw new Sk.builtin.NotImplementedError("len is not implemented for "+Sk.abstr.typeName(this.$seq))}}},flags:{sk$acceptable_as_base_class:!1}}),Sk.exportSymbol("Sk.builtin.callable_iter_",Sk.builtin.callable_iter_)},function(e,t){Sk.builtin.list=Sk.abstr.buildNativeClass("list",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.list,"bad call to list, use 'new' with an Array of python objects"),this.v=e,this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$doc:"Built-in mutable sequence.\n\nIf no argument is given, the constructor creates a new empty list.\nThe argument must be an iterable if specified.",tp$new:Sk.generic.new,tp$init(e,t){return Sk.abstr.checkNoKwargs("list",t),Sk.abstr.checkArgsLen("list",e,0,1),Sk.misceval.chain(Sk.misceval.arrayFromIterable(e[0],!0),(e=>{this.v=e}))},$r(){if(this.in$repr)return new Sk.builtin.str("[...]");this.in$repr=!0;const e=this.v.map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,new Sk.builtin.str("["+e.join(", ")+"]")},tp$richcompare:Sk.generic.seqCompare,tp$iter(){return new n(this)},sq$length(){return this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.list))throw new Sk.builtin.TypeError("can only concatenate list to list");return new Sk.builtin.list(this.v.concat(e.v))},sq$contains(e){for(let t=this.tp$iter(),n=t.tp$iternext();void 0!==n;n=t.tp$iternext())if(n===e||Sk.misceval.richCompareBool(n,e,"Eq"))return!0;return!1},sq$repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");if((e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;const t=[];for(let n=0;n{t.push(this.v[e])})),new Sk.builtin.list(t)}throw new Sk.builtin.TypeError("list indices must be integers or slices, not "+Sk.abstr.typeName(e))},mp$ass_subscript(e,t){void 0===t?this.del$subscript(e):this.ass$subscript(e,t)},sq$inplace_concat(e){return e===this?(this.v.push(...this.v),this):Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.v.push(e)})),(()=>this))},sq$inplace_repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError);const t=this.v.length;if(0>=e)this.v.length=0;else if(e*t>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;for(let n=1;n{this.v.push(e)})),(()=>Sk.builtin.none.none$))},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Extend list by appending elements from the iterable."},pop:{$meth(e){e=void 0===e?this.v.length-1:Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError),e=this.list$inRange(e,"pop index out of range");const t=this.v[e];return this.v.splice(e,1),t},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, index=-1, /)",$doc:"Remove and return item at index (default last).\n\nRaises IndexError if list is empty or index is out of range."},remove:{$meth(e){if(-1===(e=this.list$indexOf(e)))throw new Sk.builtin.ValueError("list.remove(x): x not in list");return this.v.splice(e,1),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:"($self, value, /)",$doc:"Remove first occurrence of value.\n\nRaises ValueError if the value is not present."},sort:{$meth(e,t){if(e.length)throw new Sk.builtin.TypeError("sort() takes no positional arguments");const[n,i]=Sk.abstr.copyKeywordsToNamedArgs("sort",["key","reverse"],e,t,[Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(void 0,n,i)},$flags:{FastCall:!0},$textsig:"($self, /, *, key=None, reverse=False)",$doc:"Stable sort *IN PLACE*."},index:{$meth(e,t,n){if(void 0!==t&&!Sk.misceval.isIndex(t)||void 0!==n&&!Sk.misceval.isIndex(n))throw new Sk.builtin.TypeError("slice indices must be integers or have an __index__ method");if(-1===(t=this.list$indexOf(e,t,n)))throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(e)+" is not in list");return new Sk.builtin.int_(t)},$flags:{MinArgs:1,MaxArgs:3},$textsig:"($self, value, start=0, stop=sys.maxsize, /)",$doc:"Return first index of value.\n\nRaises ValueError if the value is not present."},count:{$meth(e){let t=0;const n=this.v.length;for(let i=0;ie&&(e+=this.v.length),0<=e&&e{n.push(e)})),!Sk.builtin.checkIterable(t))throw new Sk.builtin.TypeError("must assign iterable to extended slice");if(e=Sk.misceval.arrayFromIterable(t),n.length!==e.length)throw new Sk.builtin.ValueError("attempt to assign sequence of size "+e.length+" to extended slice of size "+n.length);for(t=0;t{this.v.splice(e-n,1),n+=t}))}}}),Sk.exportSymbol("Sk.builtin.list",Sk.builtin.list),Sk.builtin.list.py2$methods={sort:{$name:"sort",$meth(e,t){const[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("sort",["cmp","key","reverse"],e,t,[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(n,i,r)},$flags:{FastCall:!0},$textsig:"($self, cmp=None, key=None, reverse=False)",$doc:"Stable sort *IN PLACE*."}};var n=Sk.abstr.buildIteratorClass("list_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext:Sk.generic.iterNextWithArray,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),i=Sk.abstr.buildIteratorClass("list_reverseiterator",{constructor:function(e){this.$index=e.v.length-1,this.$seq=e.v},iternext(){const e=this.$seq[this.$index--];if(void 0!==e)return e;this.tp$iternext=()=>{}},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(e,t,n){function i(e){var t=e.replace(y,"").replace(v,"_").toLowerCase();return void 0===(t=k[t])?e:t}function r(e,t,n){if(void 0===t)t="utf-8";else{if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError(e+"() argument "+("bytesstr".includes(e)?2:1)+" must be str not "+Sk.abstr.typeName(t));t=t.$jsstr()}if(void 0===n)n="strict";else{if(!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError(e+"() argument "+("bytesstr".includes(e)?3:2)+" must be str not "+Sk.abstr.typeName(n));n=n.$jsstr()}return{encoding:t,errors:n}}function s(e,t,n){if(e=e.$jsstr(),t=i(t),"strict"!==n&&"ignore"!==n&&"replace"!==n)throw new Sk.builtin.NotImplementedError("'"+n+"' error handling not implemented in Skulpt");if("ascii"===t){for(r in t=[],e){const i=e.charCodeAt(r);if(127=e?"\\x":"\\u";return 3===(e=e.toString(16)).length&&(e=e.slice(1,3)),1===e.length?t+"0"+e:t+e}function a(e,t){if(({encoding:e,errors:t}=r("decode",e,t)),e=i(e),"strict"!==t&&"ignore"!==t&&"replace"!==t)throw new Sk.builtin.NotImplementedError("'"+t+"' error handling not implemented in Skulpt");if("ascii"===e){e=this.v;var n="";for(let i=0;i=n&&tn)return new Sk.builtin.tuple([new Sk.builtin.bytes,new Sk.builtin.bytes,this])}else if(n=this.find$subleft(t,0,this.v.length),0>n)return new Sk.builtin.tuple([this,new Sk.builtin.bytes,new Sk.builtin.bytes]);return new Sk.builtin.tuple([new Sk.builtin.bytes(this.v.subarray(0,n)),new Sk.builtin.bytes(t),new Sk.builtin.bytes(this.v.subarray(n+t.length))])}}function p(e,t){return function(n){var i=void 0===n||n===Sk.builtin.none.none$?new Uint8Array([9,10,11,12,13,32,133]):this.get$raw(n);n=0;var r=this.v.length;if(e)for(;nn&&i.includes(this.v[r-1]);)r--;for(i=new Uint8Array(r-n),r=0;r=e||32===e}function f(e){return 97<=e&&122>=e}function _(e){return 65<=e&&90>=e}function m(e){return 48<=e&&57>=e}function b(e,t){return function(){return 0===this.v.length?t?Sk.builtin.bool.true$:Sk.builtin.bool.false$:this.v.every((t=>e(t)))?Sk.builtin.bool.true$:Sk.builtin.bool.false$}}function g(e,t){return function(){let n=!1;for(let i=0;i0<=e&&255>=e)),"bad internal call to bytes with array"),this.v=new Uint8Array(e);else if("string"==typeof e){let t;const n=new Uint8Array(e.length),i=e.length;for(let r=0;r bytes\nbytes(string, encoding[, errors]) -> bytes\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\nbytes() -> empty bytes object\n\nConstruct an immutable array of bytes from:\n - an iterable yielding integers in range(256)\n - a text string encoded using the specified encoding\n - any object implementing the buffer API.\n - an integer",tp$new(e,t){if(this!==Sk.builtin.bytes.prototype)return this.$subtype_new(e,t);if(t=t||[],!(1>=e.length&&0==+t.length)){if([e,n,t]=Sk.abstr.copyKeywordsToNamedArgs("bytes",[null,"pySource","errors"],e,t),({encoding:n,errors:t}=r("bytes",n,t)),!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("encoding or errors without a string argument");return s(e,n,t)}if(void 0===(e=e[0]))return new Sk.builtin.bytes;if(void 0!==(t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$bytes))){var n=Sk.misceval.callsimOrSuspendArray(t,[]);return Sk.misceval.chain(n,(e=>{if(!Sk.builtin.checkBytes(e))throw new Sk.builtin.TypeError("__bytes__ returned non-bytes (type "+Sk.abstr.typeName(e)+")");return e}))}if(Sk.misceval.isIndex(e)){if(0>(n=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError)))throw new Sk.builtin.ValueError("negative count");return new Sk.builtin.bytes(n)}if(Sk.builtin.checkBytes(e))return new Sk.builtin.bytes(e.v);if(Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("string argument without an encoding");if(Sk.builtin.checkIterable(e)){let t=[];return n=Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(0>(e=Sk.misceval.asIndexSized(e))||255new Sk.builtin.bytes(t)))}throw new Sk.builtin.TypeError("cannot convert '"+Sk.abstr.typeName(n)+"' object into bytes")},$r(){let e,t="'";const n=-1!==this.v.indexOf(34);let i="";for(let r=0;re||10e||13e||126e.length||n[i]>e[i];case"GtE":return i===r&&n.length>=e.length||n[i]>=e[i]}},tp$hash(){return new Sk.builtin.str(this.$jsstr()).tp$hash()},tp$as_sequence_or_mapping:!0,mp$subscript(e){if(Sk.misceval.isIndex(e)){let t=Sk.misceval.asIndexSized(e,Sk.builtin.IndexError);if(void 0!==t){if(0>t&&(t=this.v.length+t),0>t||t>=this.v.length)throw new Sk.builtin.IndexError("index out of range");return new Sk.builtin.int_(this.v[t])}}else if(e instanceof Sk.builtin.slice){const t=[];return e.sssiter$(this.v.length,(e=>{t.push(this.v[e])})),new Sk.builtin.bytes(new Uint8Array(t))}throw new Sk.builtin.TypeError("byte indices must be integers or slices, not "+Sk.abstr.typeName(e))},sq$length(){return this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("can't concat "+Sk.abstr.typeName(e)+" to bytes");const t=new Uint8Array(this.v.length+e.v.length);let n;for(n=0;nNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;if(0>=e)return new Sk.builtin.bytes;e=new Uint8Array(t);let n=0;for(;n(e=Sk.misceval.asIndexOrThrow(e,"argument should be integer or bytes-like object, not {tp$name}"))||255(t=Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError))?1/0:t,null!==(e=Sk.builtin.checkNone(e)?null:this.get$raw(e))&&!e.length)throw new Sk.builtin.ValueError("empty separator");return{sep:e,maxsplit:t}},find$left:u(!1),find$right:u(!0),find$subleft:function(e,t,n){n=n-e.length+1;let i=t;for(;ie===this.v[i+t])))return i;i++}return-1},find$subright(e,t,n){let i=n-e.length;for(;i>=t;){if(e.every(((e,t)=>e===this.v[i+t])))return i;i--}return-1},$subtype_new(e,t){const n=new this.constructor;return e=Sk.builtin.bytes.prototype.tp$new(e,t),n.v=e.v,n},sk$asarray(){const e=[];return this.v.forEach((t=>{e.push(new Sk.builtin.int_(t))})),e}},flags:{str$encode:s,$decode:a,check$encodeArgs:r},methods:{__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.bytes(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null},capitalize:{$meth(){const e=this.v.length;if(0===e)return new Sk.builtin.bytes(this.v);const t=new Uint8Array(e);let n=this.v[0];t[0]=f(n)?n-32:n;for(let i=1;i copy of B\n\nReturn a copy of B with only its first character capitalized (ASCII)\nand the rest lower-cased."},center:{$meth:h("center",!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.center(width[, fillchar]) -> copy of B\n\nReturn B centered in a string of length width. Padding is\ndone using the specified fill character (default is a space)."},count:{$meth(e,t,n){e=this.get$tgt(e),({start:t,end:n}=Sk.builtin.slice.startEnd$wrt(this,t,n));let i=0;if("number"==typeof e)for(;te===this.v[r+t]))&&(i++,r+=e.length-1)}return new Sk.builtin.int_(i)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.count(sub[, start[, end]]) -> int\n\nReturn the number of non-overlapping occurrences of subsection sub in\nbytes B[start:end]. Optional arguments start and end are interpreted\nas in slice notation."},decode:{$meth:a,$flags:{NamedArgs:["encoding","errors"]},$textsig:"($self, /, encoding='utf-8', errors='strict')",$doc:"Decode the bytes using the codec registered for encoding.\n\n encoding\n The encoding with which to decode the bytes.\n errors\n The error handling scheme to use for the handling of decoding errors.\n The default is 'strict' meaning that decoding errors raise a\n UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n as well as any other name registered with codecs.register_error that\n can handle UnicodeDecodeErrors."},endswith:{$meth:l("endswith",((e,t)=>{const n=e.length-t.length;return 0<=n&&t.every(((t,i)=>t===e[n+i]))})),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if B ends with the specified suffix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nsuffix can also be a tuple of bytes to try."},expandtabs:{$meth(e){e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError,"an integer is required (got type {tp$nam})");const t=[];let n=0;for(let r=0;r copy of B\n\nReturn a copy of B where all tab characters are expanded using spaces.\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(e,t,n){return new Sk.builtin.int_(this.find$left(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},hex:{$meth(){let e="";for(let t=0;t string\n\nCreate a string of hexadecimal numbers from a bytes object.\nExample: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."},index:{$meth:function(e,t,n){if(-1===(e=this.find$left(e,t,n)))throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the subsection is not found."},isalnum:{$meth:b((e=>m(e)||f(e)||_(e))),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalnum() -> bool\n\nReturn True if all characters in B are alphanumeric\nand there is at least one character in B, False otherwise."},isalpha:{$meth:b((e=>65<=e&&90>=e||97<=e&&122>=e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalpha() -> bool\n\nReturn True if all characters in B are alphabetic\nand there is at least one character in B, False otherwise."},isascii:{$meth:b((e=>0<=e&&127>=e),!0),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isascii() -> bool\n\nReturn True if B is empty or all characters in B are ASCII,\nFalse otherwise."},isdigit:{$meth:b(m),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isdigit() -> bool\n\nReturn True if all characters in B are digits\nand there is at least one character in B, False otherwise."},islower:{$meth:g(f,_),$flags:{NoArgs:!0},$textsig:null,$doc:"B.islower() -> bool\n\nReturn True if all cased characters in B are lowercase and there is\nat least one cased character in B, False otherwise."},isspace:{$meth:b(d),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isspace() -> bool\n\nReturn True if all characters in B are whitespace\nand there is at least one character in B, False otherwise."},istitle:{$meth:function(){let e=!1,t=!1;for(let n=0;n bool\n\nReturn True if B is a titlecased string and there is at least one\ncharacter in B, i.e. uppercase characters may only follow uncased\ncharacters and lowercase characters only cased ones. Return False\notherwise."},isupper:{$meth:g(_,f),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isupper() -> bool\n\nReturn True if all cased characters in B are uppercase and there is\nat least one cased character in B, False otherwise."},join:{$meth(e){const t=[];let n=0;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(!(e instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("sequence item "+n+": expected a bytes-like object, "+Sk.abstr.typeName(e)+" found");n++,t.length&&t.push(...this.v),t.push(...e.v)})),(()=>new Sk.builtin.bytes(new Uint8Array(t))))},$flags:{OneArg:!0},$textsig:"($self, iterable_of_bytes, /)",$doc:"Concatenate any number of bytes objects.\n\nThe bytes whose method is called is inserted in between each pair.\n\nThe result is returned as a new bytes object.\n\nExample: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'."},ljust:{$meth:h("ljust",!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.ljust(width[, fillchar]) -> copy of B\n\nReturn B left justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)."},lower:{$meth:S((e=>_(e)?e+32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.lower() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to lowercase."},lstrip:{$meth:p(!0,!1),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading ASCII whitespace."},partition:{$meth:c(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original bytes\nobject and two empty bytes objects."},replace:{$meth(e,t,n){e=this.get$raw(e),t=this.get$raw(t),n=0>(n=void 0===n?-1:Sk.misceval.asIndexSized(n,Sk.builtin.OverflowError))?1/0:n;const i=[];let r=0;for(var s=0;s int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(e,t,n){if(-1===(e=this.find$right(e,t,n)))throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaise ValueError when the subsection is not found."},rjust:{$meth:h("rjust",!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.rjust(width[, fillchar]) -> copy of B\n\nReturn B right justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)"},rpartition:{$meth:c(!0),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty bytes\nobjects and the original bytes object."},rsplit:{$meth:function(e,t){({sep:e,maxsplit:t}=this.get$splitArgs(e,t));const n=[];let i=0,r=this.v.length;if(null!==e){for(;0<=r&&ir)break;for(e=r+1,r--;0<=r&&!d(this.v[r]);)r--;n.push(new Sk.builtin.bytes(this.v.subarray(r+1,e))),i++}if(0<=r){for(;d(this.v[r]);)r--;0<=r&&n.push(new Sk.builtin.bytes(this.v.subarray(0,r+1)))}}return new Sk.builtin.list(n.reverse())},$flags:{NamedArgs:["sep","maxsplit"],Defaults:[Sk.builtin.none.none$,-1]},$textsig:"($self, /, sep=None, maxsplit=-1)",$doc:"Return a list of the sections in the bytes, using sep as the delimiter.\n\n sep\n The delimiter according which to split the bytes.\n None (the default value) means split on ASCII whitespace characters\n (space, tab, return, newline, formfeed, vertical tab).\n maxsplit\n Maximum number of splits to do.\n -1 (the default value) means no limit.\n\nSplitting is done starting at the end of the bytes and working to the front."},rstrip:{$meth:p(!1,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip trailing ASCII whitespace."},split:{$meth:function(e,t){({sep:e,maxsplit:t}=this.get$splitArgs(e,t));const n=[],i=this.v.length;let r=0,s=0;if(null!==e){for(;st.length<=e.length&&t.every(((t,n)=>t===e[n])))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if B starts with the specified prefix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nprefix can also be a tuple of bytes to try."},strip:{$meth:p(!0,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading and trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading and trailing ASCII whitespace."},swapcase:{$meth:S((e=>_(e)?e+32:f(e)?e-32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.swapcase() -> copy of B\n\nReturn a copy of B with uppercase ASCII characters converted\nto lowercase ASCII and vice versa."},title:{$meth(){const e=this.v.length,t=new Uint8Array(e);let n=!1;for(let i=0;i copy of B\n\nReturn a titlecased version of B, i.e. ASCII words start with uppercase\ncharacters, all remaining cased characters have lowercase."},upper:{$meth:S((e=>f(e)?e-32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.upper() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to uppercase."},zfill:{$meth(e){const t=(e=Sk.misceval.asIndexSized(e,Sk.builtin.IndexError))-this.v.length;if(0>=t)return new Sk.builtin.bytes(this.v);const n=new Uint8Array(e);let i,r=0;for(43!==this.v[0]&&45!==this.v[0]||(n[0]=this.v[0],r++),n.fill(48,r,r+t),i=r,r+=t;r copy of B\n\nPad a numeric string B with zeros on the left, to fill a field\nof the specified width. B is never truncated."}},classmethods:{fromhex:{$meth:function(e){function t(t){for(let n=o;n b'\\\\xb9\\\\x01\\\\xef'."}}});var I=Sk.abstr.buildIteratorClass("bytes_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext(){const e=this.$seq[this.$index++];if(void 0!==e)return new Sk.builtin.int_(e)},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.exportSymbol("Sk.builtin.bytes",Sk.builtin.bytes)},function(e,t,n){(function(e){!function(e){function t(){}function n(){}var i=String.fromCharCode,r={}.toString,s=r.call(e.SharedArrayBuffer),o=r(),a=e.Uint8Array,l=a||Array,u=a?ArrayBuffer:l,c=u.isView||function(e){return e&&"length"in e},p=r.call(u.prototype);u=n.prototype;var h=e.TextEncoder,d=new(a?Uint16Array:l)(32);t.prototype.decode=function(e){if(!c(e)){var t=r.call(e);if(t!==p&&t!==s&&t!==o)throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");e=a?new l(e):e||[]}for(var n,u,h,f=t="",_=0,m=0|e.length,b=m-32|0,g=0,S=0,k=0,y=-1;_>4){case 15:if(2!=(h=255&e[_=_+1|0])>>6||247>6?S+4|0:24,u=u+256&768;case 13:case 12:g<<=6,g|=(31&u)<<6|63&(h=255&e[_=_+1|0]),S=S+7|0,_>6&&g>>S&&1114112>g?(u=g,0<=(g=g-65536|0)&&(y=55296+(g>>10)|0,u=56320+(1023&g)|0,31>k?(d[k]=y,k=k+1|0,y=-1):(h=y,y=u,u=h))):(_=_-(u>>=8)-1|0,u=65533),g=S=0,n=_<=b?32:m-_|0;default:d[k]=u;continue;case 11:case 10:case 9:case 8:}d[k]=65533}if(f+=i(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15],d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23],d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31]),32>k&&(f=f.slice(0,k-32|0)),_>>31,y=-1,f.length=o)i[r]=o;else{if(2047>=o)i[r]=192|o>>6;else{e:{if(55296<=o)if(56319>=o){var u=0|e.charCodeAt(t=t+1|0);if(56320<=u&&57343>=u){if(65535<(o=(o<<10)+u-56613888|0)){i[r]=240|o>>18,i[r=r+1|0]=128|o>>12&63,i[r=r+1|0]=128|o>>6&63,i[r=r+1|0]=128|63&o;continue}break e}o=65533}else 57343>=o&&(o=65533);!s&&t<<1>12,i[r=r+1|0]=128|o>>6&63}i[r=r+1|0]=128|63&o}}return a?i.subarray(0,r):i.slice(0,r)},h||(e.TextDecoder=t,e.TextEncoder=n)}(void 0===e?"undefined"==typeof self?this:self:e)}).call(this,n(0))},function(e,t){Sk.builtin.tuple=Sk.abstr.buildNativeClass("tuple",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.tuple,"bad call to tuple, use 'new' with an Array of python objects"),this.v=e,this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"Built-in immutable sequence.\n\nIf no argument is given, the constructor returns an empty tuple.\nIf iterable is specified the tuple is initialized from iterable's items.\n\nIf the argument is a tuple, the return value is the same object.",$r(){if(this.in$repr)return new Sk.builtin.str("(...)");this.in$repr=!0;let e=this.v.map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,e=e.join(", "),1===this.v.length&&(e+=","),new Sk.builtin.str("("+e+")")},tp$new(e,t){return this!==Sk.builtin.tuple.prototype?this.$subtype_new(e,t):(Sk.abstr.checkNoKwargs("tuple",t),Sk.abstr.checkArgsLen("tuple",e,0,1),void 0===(e=e[0])?new Sk.builtin.tuple([]):e.constructor===Sk.builtin.tuple?e:Sk.misceval.chain(Sk.misceval.arrayFromIterable(e,!0),(e=>new Sk.builtin.tuple(e))))},tp$hash(){let e,t=3430008,n=1000003;const i=this.v.length;for(let r=0;r(e=Sk.misceval.asIndexSized(e))&&(e=this.v.length+e),0>e||e>=this.v.length)throw new Sk.builtin.IndexError("tuple index out of range");return this.v[e]}if(e instanceof Sk.builtin.slice){const t=[];return e.sssiter$(this.v.length,(e=>{t.push(this.v[e])})),new Sk.builtin.tuple(t)}throw new Sk.builtin.TypeError("tuple indices must be integers or slices, not "+Sk.abstr.typeName(e))},sq$length(){return this.v.length},sq$repeat(e){if(1===(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))&&this.constructor===Sk.builtin.tuple)return this;const t=[];for(let n=0;n(this.$seq=e.$items(),this.$version=e.$version,n&&(this.$seq=this.$seq.reverse()),this.tp$iternext=this.constructor.prototype.tp$iternext,this.tp$iternext())},iternext:t,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1},proto:{next$item:a}})}function a(){if(this.$version!==this.$orig.$version){if(this.$len!==this.$orig.get$size())throw new Sk.builtin.RuntimeError("dict changed size during iteration");throw new Sk.builtin.RuntimeError("dictionary keys changed during iteration")}return this.$seq[this.$index++]}Sk.builtin.dict=Sk.abstr.buildNativeClass("dict",{constructor:function(e){void 0===e&&(e=[]),Sk.asserts.assert(Array.isArray(e)&&0==e.length%2&&this instanceof Sk.builtin.dict,"bad call to dict constructor"),this.size=0,this.entries=Object.create(null),this.buckets={};for(let t=0;t new empty dictionary\ndict(mapping) -> new dictionary initialized from a mapping object's\n (key, value) pairs\ndict(iterable) -> new dictionary initialized as if via:\n d = {}\n for k, v in iterable:\n d[k] = v\ndict(**kwargs) -> new dictionary initialized with the name=value pairs\n in the keyword argument list. For example: dict(one=1, two=2)",$r(){if(this.in$repr)return new Sk.builtin.str("{...}");this.in$repr=!0;const e=this.$items().map((([e,t])=>Sk.misceval.objectRepr(e)+": "+Sk.misceval.objectRepr(t)));return this.in$repr=!1,new Sk.builtin.str("{"+e.join(", ")+"}")},tp$new:Sk.generic.new,tp$init(e,t){return this.update$common(e,t,"dict")},tp$iter(){return new h(this)},tp$richcompare(e,t){let n;if(!(e instanceof Sk.builtin.dict)||"Eq"!==t&&"NotEq"!==t)return Sk.builtin.NotImplemented.NotImplemented$;if(e===this)n=!0;else if(this.size!==e.size)n=!1;else{let t;n=this.$items().every((([n,i])=>(t=e.mp$lookup(n),void 0!==t&&(t===i||Sk.misceval.richCompareBool(i,t,"Eq")))))}return"Eq"===t?n:!n},nb$or(e){if(!(e instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;const t=this.dict$copy();return t.dict$merge(e),t},nb$reflected_or(e){return e instanceof Sk.builtin.dict?((e=e.dict$copy()).dict$merge(this),e):Sk.builtin.NotImplemented.NotImplemented$},nb$inplace_or(e){return Sk.misceval.chain(this.update$onearg(e),(()=>this))},sq$length(){return this.get$size()},sq$contains(e){return void 0!==this.mp$lookup(e)},mp$subscript(e,t){var n=this.mp$lookup(e);if(void 0!==n)return n;if(void 0!==(n=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$missing)))return e=Sk.misceval.callsimOrSuspendArray(n,[e]),t?e:Sk.misceval.retryOptionalSuspensionOrThrow(e);throw new Sk.builtin.KeyError(e)},mp$ass_subscript(e,t){if(void 0===t){if(void 0===this.pop$item(e))throw new Sk.builtin.KeyError(e)}else this.set$item(e,t)}},methods:{__reversed__:{$meth(){return new _(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a reverse iterator over the dict keys."},get:{$meth(e,t){return this.mp$lookup(e)||t||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Return the value for key if key is in the dictionary, else default."},setdefault:{$meth(e,t){let i;const r=n(e);return i="string"==typeof r?this.entries[r]:this.get$bucket_item(e,r),void 0!==i?i[1]:(t=t||Sk.builtin.none.none$,"string"==typeof r?this.entries[r]=[e,t]:this.set$bucket_item(e,t,r),this.size++,this.$version++,t)},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Insert key with a value of default if key is not in the dictionary.\n\nReturn the value for key if key is in the dictionary, else default."},pop:{$meth(e,t){const n=this.pop$item(e);if(void 0!==n)return n[1];if(void 0!==t)return t;throw new Sk.builtin.KeyError(e)},$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\nIf key is not found, d is returned if given, otherwise KeyError is raised"},popitem:{$meth(){const e=this.get$size();if(0===e)throw new Sk.builtin.KeyError("popitem(): dictionary is empty");const[t,n]=this.$items()[e-1];return this.pop$item(t),new Sk.builtin.tuple([t,n])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n2-tuple; but raise KeyError if D is empty."},keys:{$meth(){return new u(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return new p(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return new c(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"},update:{$meth(e,t){return Sk.misceval.chain(this.update$common(e,t,"update"),(()=>Sk.builtin.none.none$))},$flags:{FastCall:!0},$textsig:null,$doc:"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\nIf E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\nIf E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\nIn either case, this is followed by: for k in F: D[k] = F[k]"},clear:{$meth(){this.size=0,this.$version++,this.entries=Object.create(null),this.buckets={}},$flags:{NoArgs:!0},$textsig:null,$doc:"D.clear() -> None. Remove all items from D."},copy:{$meth(){return this.dict$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},classmethods:{fromkeys:{$meth:function(e,t){t=t||Sk.builtin.none.none$;let n=this===Sk.builtin.dict?new this:this.tp$call([],[]);return Sk.misceval.chain(n,(i=>(n=i,Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>n.mp$ass_subscript(e,t,!0))))),(()=>n))},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($type, iterable, value=None, /)",$doc:"Create a new dictionary with keys from iterable and values set to value."}},proto:{quick$lookup:function(e){if(void 0!==(e=this.entries[e.$savedKeyHash]))return e[1]},mp$lookup:function(e){const t=n(e);if(void 0!==(e="string"==typeof t?this.entries[t]:this.get$bucket_item(e,t)))return e[1]},get$size(){return this.size},sk$asarray(){return Object.values(this.entries).map((e=>e[0]))},update$common:function(e,t,n){let i;return Sk.abstr.checkArgsLen(n,e,0,1),void 0!==(e=e[0])&&(i=this.update$onearg(e)),Sk.misceval.chain(i,(()=>{if(t)for(let e=0;evoid 0===e))&&delete this.buckets[t],i},set$bucket_item:function(e,t,n){let i=this.buckets[n];e=[e,t],void 0===i?(this.buckets[n]=[e],n="#"+n+"_0"):-1!==(t=i.indexOf(void 0))?(n="#"+n+"_"+t,i[t]=e):(n="#"+n+"_"+i.length,i.push(e)),this.entries[n]=e},pop$item:function(e){const t=n(e);if("string"==typeof t?(e=this.entries[t],delete this.entries[t]):e=this.pop$bucket_item(e,t),void 0!==e)return this.size--,this.$version++,e},dict$merge:function(e){if(e.tp$iter!==Sk.builtin.dict.prototype.tp$iter)return t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$keys),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(t,[]),(t=>Sk.misceval.iterFor(Sk.abstr.iter(t),(t=>Sk.misceval.chain(e.mp$subscript(t,!0),(e=>{this.set$item(t,e)}))))));var t=e.tp$iter();for(let n=t.tp$iternext();void 0!==n;n=t.tp$iternext()){const t=e.mp$subscript(n);this.set$item(n,t)}},dict$merge_seq:function(e){let t=0;return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError("cannot convert dictionary update sequence element #"+t+" to a sequence");if(2!==(e=Sk.misceval.arrayFromIterable(e)).length)throw new Sk.builtin.ValueError("dictionary update sequence element #"+t+" has length "+e.length+"; 2 is required");this.set$item(e[0],e[1]),t++}))}}});const l={tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,$r(){if(this.in$repr)return new Sk.builtin.str("...");this.in$repr=!0;let e=Sk.misceval.arrayFromIterable(this);return e=e.map((e=>Sk.misceval.objectRepr(e))),this.in$repr=!1,new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+e.join(", ")+"])")},tp$richcompare(e,t){if(!(Sk.builtin.checkAnySet(e)||e instanceof u||e instanceof p))return Sk.builtin.NotImplemented.NotImplemented$;const n=this.sq$length(),i=e.sq$length();switch(t){case"NotEq":case"Eq":let s;return this===e?s=!0:n===i&&(s=r(this,e)),"NotEq"===t?!s:s;case"Lt":return ni&&r(e,this);case"GtE":return n>=i&&r(e,this)}},nb$subtract(e){const t=i(this);return t.difference.$meth.call(t,e)},nb$and(e){const t=i(this);return t.intersection.$meth.call(t,e)},nb$or(e){const t=i(this);return t.union.$meth.call(t,e)},nb$xor(e){const t=i(this);return t.symmetric_difference.$meth.call(t,e)},sq$length(){return this.dict.get$size()}};var u=s("dict_keys",{sq$contains(e){return void 0!==this.dict.mp$lookup(e)},tp$iter(){return new h(this.dict)}},(function(){return new _(this.dict)})),c=s("dict_values",{tp$iter(){return new f(this.dict)}},(function(){return new b(this.dict)})),p=s("dict_items",{sq$contains(e){if(!(e instanceof Sk.builtin.tuple&&2===e.sq$length()))return!1;var t=e.mp$subscript(new Sk.builtin.int_(0));return e=e.mp$subscript(new Sk.builtin.int_(1)),void 0!==(t=this.dict.mp$lookup(t))&&(t===e||Sk.misceval.richCompareBool(t,e,"Eq"))},tp$iter(){return new d(this.dict)}},(function(){return new m(this.dict)})),h=o("dict_keyiterator",(function(){const e=this.next$item();return e&&e[0]})),d=o("dict_itemiterator",(function(){const e=this.next$item();return e&&new Sk.builtin.tuple([e[0],e[1]])})),f=o("dict_valueiterator",(function(){const e=this.next$item();return e&&e[1]})),_=o("dict_reversekeyiterator",h.prototype.tp$iternext,!0),m=o("dict_reverseitemiterator",d.prototype.tp$iternext,!0),b=o("dict_reversevalueiterator",f.prototype.tp$iternext,!0);Sk.builtin.dict.py2$methods={has_key:{$name:"has_key",$flags:{OneArg:!0},$meth(e){return new Sk.builtin.bool(this.sq$contains(e))},$doc:"D.has_key(k) -> True if D has a key k, else False"},keys:{$name:"keys",$meth(){return new Sk.builtin.list(this.sk$asarray())},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$name:"items",$meth(){return new Sk.builtin.list(this.$items().map((([e,t])=>new Sk.builtin.tuple([e,t]))))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$name:"values",$meth(){return new Sk.builtin.list(this.$items().map((([,e])=>e)))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"}}},function(e,t){Sk.builtin.mappingproxy=Sk.abstr.buildNativeClass("mappingproxy",{constructor:function(e){Sk.asserts.assert(this instanceof Sk.builtin.mappingproxy,"bad call to mapping proxy, use 'new'"),this.mapping=new Sk.builtin.dict([]),void 0!==e&&function(e,t){Object.defineProperties(e,{entries:{get:()=>{const e=Object.create(null);return Object.entries(t).forEach((([t,n])=>{(t=Sk.unfixReserved(t)).includes("$")||(t=new Sk.builtin.str(t),e[t.$savedKeyHash]=[t,n])})),e},configurable:!0},size:{get:()=>Object.keys(t).map((e=>Sk.unfixReserved(e))).filter((e=>!e.includes("$"))).length,configurable:!0}})}(this.mapping,e)},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$new(e,t){if(Sk.abstr.checkNoKwargs("mappingproxy",t),Sk.abstr.checkOneArg("mappingproxy",e,t),e=e[0],!Sk.builtin.checkMapping(e))throw new Sk.builtin.TypeError("mappingproxy() argument must be a mapping, not "+Sk.abstr.typeName(e));return(t=new Sk.builtin.mappingproxy).mapping=e,t},tp$richcompare(e,t){return Sk.misceval.richCompareBool(this.mapping,e,t)},tp$str(){return this.mapping.tp$str()},$r(){return new Sk.builtin.str("mappingproxy("+Sk.misceval.objectRepr(this.mapping)+")")},mp$subscript(e,t){return this.mapping.mp$subscript(e,t)},sq$contains(e){return this.mapping.sq$contains(e)},sq$length(){return this.mapping.sq$length()},tp$iter(){return this.mapping.tp$iter()},tp$as_number:!0,nb$or(e){return e instanceof Sk.builtin.mappingproxy&&(e=e.mapping),Sk.abstr.numberBinOp(this.mapping,e,"BitOr")},nb$reflected_or(e){return e instanceof Sk.builtin.mappingproxy&&(e=e.mapping),Sk.abstr.numberBinOp(e,this.mapping,"BitOr")},nb$inplace_or(e){throw new Sk.builtin.TypeError("'|=' is not supported by "+Sk.abstr.typeName(this)+"; use '|' instead")}},methods:{get:{$meth(e,t){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$get),e,t)},$flags:{FastCall:!0},$textsig:null,$doc:"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."},keys:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$keys),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$items),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$values),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> a set-like object providing a view on D's values"},copy:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$copy),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},proto:{str$get:new Sk.builtin.str("get"),str$copy:new Sk.builtin.str("copy"),str$keys:new Sk.builtin.str("keys"),str$items:new Sk.builtin.str("items"),str$values:new Sk.builtin.str("values"),mp$lookup(e){return this.mapping.mp$lookup(e)}},flags:{sk$acceptable_as_base_class:!1}})},function(e,t){Sk.builtin.property=Sk.abstr.buildNativeClass("property",{constructor:function(e,t,n,i){this.prop$get=e||Sk.builtin.none.none$,this.prop$set=t||Sk.builtin.none.none$,this.prop$del=n||Sk.builtin.none.none$,this.prop$doc=i||e&&e.$doc||Sk.builtin.none.none$},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){e=Sk.abstr.copyKeywordsToNamedArgs("property",["fget","fset","fdel","doc"],e,t,Array(4).fill(Sk.builtin.none.none$)),this.prop$get=e[0],this.prop$set=e[1],this.prop$del=e[2],Sk.builtin.checkNone(e[3])?Sk.builtin.checkNone(e[0])||(this.prop$doc=e[0].$doc||e[3]):this.prop$doc=e[3]},tp$doc:"Property attribute.\n\n fget\n function to be used for getting an attribute value\n fset\n function to be used for setting an attribute value\n fdel\n function to be used for del'ing an attribute\n doc\n docstring\n\nTypical use is to define a managed attribute x:\n\nclass C(object):\n def getx(self): return self._x\n def setx(self, value): self._x = value\n def delx(self): del self._x\n x = property(getx, setx, delx, 'I'm the 'x' property.')\n\nDecorators make defining new properties or modifying existing ones easy:\n\nclass C(object):\n @property\n def x(self):\n 'I am the 'x' property.'\n return self._x\n @x.setter\n def x(self, value):\n self._x = value\n @x.deleter\n def x(self):\n del self._x",tp$descr_get(e,t){if(null===e)return this;if(void 0===this.prop$get)throw new Sk.builtin.AttributeError("unreadable attribute");return Sk.misceval.callsimOrSuspendArray(this.prop$get,[e])},tp$descr_set(e,t){let n;if(n=null==t?this.prop$del:this.prop$set,Sk.builtin.checkNone(n))throw new Sk.builtin.AttributeError("can't "+(null==t?"delete":"set")+" attribute");if(!n.tp$call)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(n)+"' is not callable");return null==t?n.tp$call([e]):n.tp$call([e,t])}},methods:{getter:{$meth(e){return new Sk.builtin.property(e,this.prop$set,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},setter:{$meth(e){return new Sk.builtin.property(this.prop$get,e,this.prop$del,this.prop$doc)},$flags:{OneArg:!0}},deleter:{$meth(e){return new Sk.builtin.property(this.prop$get,this.prop$set,e,this.prop$doc)},$flags:{OneArg:!0}}},getsets:{fget:{$get(){return this.prop$get}},fset:{$get(){return this.prop$set}},fdel:{$get(){return this.prop$del}},__doc__:{$get(){return this.prop$doc},$set(e){this.prop$doc=e=e||Sk.builtin.none.none$}}}}),Sk.builtin.classmethod=Sk.abstr.buildNativeClass("classmethod",{constructor:function(e){this.cm$callable=e,this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){Sk.abstr.checkNoKwargs("classmethod",t),Sk.abstr.checkArgsLen("classmethod",e,1,1),this.cm$callable=e[0]},tp$doc:"classmethod(function) -> method\n\nConvert a function to be a class method.\n\nA class method receives the class as implicit first argument,\njust like an instance method receives the instance.\nTo declare a class method, use this idiom:\n\n class C:\n @classmethod\n def f(cls, arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\nIf a class method is called for a derived class, the derived class\nobject is passed as the implied first argument.\n\nClass methods are different than C++ or Java static methods.\nIf you want those, see the staticmethod builtin.",tp$descr_get(e,t){const n=this.cm$callable;if(void 0===n)throw new Sk.builtin.RuntimeError("uninitialized classmethod object");return void 0===t&&(t=e.ob$type),(e=n.tp$descr_get)?e.call(n,t):new Sk.builtin.method(n,t)}},getsets:{__func__:{$get(){return this.cm$callable}},__dict__:Sk.generic.getSetDict}}),Sk.builtin.staticmethod=Sk.abstr.buildNativeClass("staticmethod",{constructor:function(e){this.sm$callable=e,this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){Sk.abstr.checkNoKwargs("staticmethod",t),Sk.abstr.checkArgsLen("staticmethod",e,1,1),this.sm$callable=e[0]},tp$doc:"staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n class C:\n @staticmethod\n def f(arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.",tp$descr_get(e,t){if(void 0===this.sm$callable)throw new Sk.builtin.RuntimeError("uninitialized staticmethod object");return this.sm$callable}},getsets:{__func__:{$get(){return this.sm$callable}},__dict__:Sk.generic.getSetDict}})},function(e,t){function n(e,t){return function(n){if(n instanceof Sk.builtin.int_){let i=this.v;if(n=n.v,"number"==typeof i&&"number"==typeof n){const t=e(i,n);if(u(t))return new Sk.builtin.int_(t)}return i=p(i),n=p(n),new Sk.builtin.int_(t(i,n))}return Sk.builtin.NotImplemented.NotImplemented$}}function i(e,t){return function(n){if(n instanceof Sk.builtin.int_){let i=this.v;return n=n.v,"number"==typeof i&&"number"==typeof n?e(i,n):(i=p(i),n=p(n),t(i,n))}return Sk.builtin.NotImplemented.NotImplemented$}}function r(e,t){return function(){const n=this.v;return"number"==typeof n?new Sk.builtin.int_(e(n)):new Sk.builtin.int_(t(n))}}function s(){return new Sk.builtin.int_(this.v)}function o(e,t){return function(n){if(n instanceof Sk.builtin.int_){let i=this.v;if(0===(n=n.v))throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return"number"==typeof i&&"number"==typeof n?new Sk.builtin.int_(e(i,n)):(i=p(i),n=p(n),new Sk.builtin.int_(JSBI.numberIfSafe(t(i,n))))}return Sk.builtin.NotImplemented.NotImplemented$}}function a(e,t){return function(n){if(n instanceof Sk.builtin.int_){let i=this.v;if(n=n.v,0===i)return new Sk.builtin.int_(this.v);if("number"==typeof n){if(0>n)throw new Sk.builtin.ValueError("negative shift count");if("number"==typeof i){const t=e(i,n);if(void 0!==t)return new Sk.builtin.int_(t)}n=JSBI.BigInt(n)}else if(JSBI.lessThan(JSBI.BigInt(0)))throw new Sk.builtin.ValueError("negative shift count");return i=p(i),new Sk.builtin.int_(t(i,n))}return Sk.builtin.NotImplemented.NotImplemented$}}function l(e,t){return function(n){if(n instanceof Sk.builtin.int_){var i=this.v;return n=n.v,"number"==typeof i&&"number"==typeof n?(0>(i=e(i,n))&&(i+=4294967296),new Sk.builtin.int_(i)):(i=p(i),n=p(n),new Sk.builtin.int_(JSBI.numberIfSafe(t(i,n))))}return Sk.builtin.NotImplemented.NotImplemented$}}function u(e){return e<=Number.MAX_SAFE_INTEGER&&e>=-Number.MAX_SAFE_INTEGER}function c(e){return e<=Number.MAX_SAFE_INTEGER&&e>=-Number.MAX_SAFE_INTEGER?+e:JSBI.BigInt(e)}function p(e){return"number"==typeof e?JSBI.BigInt(e):e}Sk.builtin.int_=Sk.abstr.buildNativeClass("int",{constructor:function(e){let t;if(Sk.asserts.assert(this instanceof Sk.builtin.int_,"bad call to int use 'new'"),"number"==typeof e||JSBI.__isBigInt(e))t=e;else if(void 0===e)t=0;else if("string"==typeof e)t=c(e);else{if(e.nb$int)return e.nb$int();Sk.asserts.fail("bad argument to int constructor")}this.v=t},slots:{tp$as_number:!0,tp$doc:"int(x=0) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4",$r(){return new Sk.builtin.str(this.v.toString())},tp$hash(){const e=this.v;return"number"==typeof e?e:JSBI.toNumber(JSBI.remainder(e,JSBI.__MAX_SAFE))},tp$new(e,t){if(1===e.length+(t?t.length:0)?(t=e[0],e=Sk.builtin.none.none$):(t=(e=Sk.abstr.copyKeywordsToNamedArgs("int",[null,"base"],e,t,[new Sk.builtin.int_(0),Sk.builtin.none.none$]))[0],e=e[1]),e=e!==Sk.builtin.none.none$?Sk.misceval.asIndexOrThrow(e):null,t instanceof Sk.builtin.str)null===e&&(e=10),t=new Sk.builtin.int_(Sk.str2number(t.v,e));else{if(null!==e)throw new Sk.builtin.TypeError("int() can't convert non-string with explicit base");if(t.nb$int)t=t.nb$int();else{if(!(e=Sk.abstr.lookupSpecial(t,Sk.builtin.str.$trunc)))throw new Sk.builtin.TypeError("int() argument must be a string, a bytes-like object or a number, not '"+Sk.abstr.typeName(t)+"'");if(e=Sk.misceval.callsimArray(e,[]),!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError(Sk.builtin.str.$trunc.$jsstr()+" returned non-Integral (type "+Sk.abstr.typeName(t)+")");t=new Sk.builtin.int_(e.v)}}return this===Sk.builtin.int_.prototype?t:((e=new this.constructor).v=t.v,e)},tp$getattr:Sk.generic.getAttr,ob$eq:i(((e,t)=>e==t),JSBI.equal),ob$ne:i(((e,t)=>e!=t),JSBI.notEqual),ob$gt:i(((e,t)=>e>t),JSBI.greaterThan),ob$ge:i(((e,t)=>e>=t),JSBI.greaterThanOrEqual),ob$lt:i(((e,t)=>ee<=t),JSBI.lessThanOrEqual),nb$int:s,nb$index(){return this.v},nb$float(){var e=this.v;if("number"==typeof e)return new Sk.builtin.float_(e);if(1/0===(e=parseFloat(JSBI.toNumber(e)))||-1/0===e)throw new Sk.builtin.OverflowError("int too large to convert to float");return new Sk.builtin.float_(e)},nb$isnegative(){const e=this.v;return"number"==typeof e?0>e:JSBI.lessThan(e,JSBI.__ZERO)},nb$ispositive(){const e=this.v;return"number"==typeof e?0>e:JSBI.greaterThanOrEqual(e,JSBI.__ZERO)},nb$bool(){return 0!==this.v},nb$positive:s,nb$negative:r((e=>-e),JSBI.unaryMinus),nb$add:n(((e,t)=>e+t),((e,t)=>JSBI.numberIfSafe(JSBI.add(e,t)))),nb$subtract:n(((e,t)=>e-t),((e,t)=>JSBI.numberIfSafe(JSBI.subtract(e,t)))),nb$multiply:n(((e,t)=>e*t),JSBI.multiply),nb$divide(e){return Sk.__future__.division?this.nb$float().nb$divide(e):this.nb$floor_divide(e)},nb$floor_divide:o(((e,t)=>Math.floor(e/t)),JSBI.divide),nb$remainder:o(((e,t)=>e-Math.floor(e/t)*t),JSBI.remainder),nb$divmod(e){const t=this.nb$floor_divide(e);return e=this.nb$remainder(e),t===Sk.builtin.NotImplemented.NotImplemented$||e===Sk.builtin.NotImplemented.NotImplemented$?Sk.builtin.NotImplemented.NotImplemented$:new Sk.builtin.tuple([t,e])},nb$and:l(((e,t)=>e&t),JSBI.bitwiseAnd),nb$or:l(((e,t)=>e|t),JSBI.bitwiseOr),nb$xor:l(((e,t)=>e^t),JSBI.bitwiseXor),nb$abs:r(Math.abs,(e=>JSBI.lessThan(e,JSBI.__ZERO)?JSBI.unaryMinus(e):e)),nb$lshift:a(((e,t)=>{if(53>t&&u(e=2*e*d[t]))return e}),JSBI.leftShift),nb$rshift:a(((e,t)=>{const n=e>>t;return 0n?n&Math.pow(2,32-t)-1:n}),((e,t)=>JSBI.numberIfSafe(JSBI.signedRightShift(e,t)))),nb$invert:r((e=>~e),JSBI.bitwiseNot),nb$power(e,t){let n;if(void 0!==t&&Sk.builtin.checkNone(t)&&(t=void 0),e instanceof Sk.builtin.int_&&(void 0===t||t instanceof Sk.builtin.int_)){let i=this.v,r=e.v;if("number"==typeof i&&"number"==typeof r){const e=Math.pow(i,r);if(u(e)&&(n=0>r?new Sk.builtin.float_(e):new Sk.builtin.int_(e),void 0===t))return n}if(void 0!==t){if(e.nb$isnegative())throw new Sk.builtin.ValueError("pow() 2nd argument cannot be negative when 3rd argument specified");if(0===t.v)throw new Sk.builtin.ValueError("pow() 3rd argument cannot be 0");return void 0!==n?n.nb$remainder(t):new Sk.builtin.int_(JSBI.powermod(p(i),p(r),p(t.v)))}return new Sk.builtin.int_(JSBI.exponentiate(p(i),p(r)))}return Sk.builtin.NotImplemented.NotImplemented$},nb$long(){return new Sk.builtin.lng(this.v)}},getsets:{real:{$get:s,$doc:"the real part of a complex number"},imag:{$get:()=>new Sk.builtin.int_(0),$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth:s,$flags:{NoArgs:!0},$textsig:null,$doc:"Returns self, the complex conjugate of any int."},bit_length:{$meth(){return new Sk.builtin.int_(Sk.builtin.bin(this).sq$length()-2)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Number of bits necessary to represent self in binary.\n\n>>> bin(37)\n'0b100101'\n>>> (37).bit_length()\n6"},to_bytes:{$meth(){throw new Sk.builtin.NotImplementedError("Not yet implemented in Skulpt")},$flags:{FastCall:!0},$textsig:"($self, /, length, byteorder, *, signed=False)",$doc:"Return an array of bytes representing an integer.\n\n length\n Length of bytes object to use. An OverflowError is raised if the\n integer is not representable with the given number of bytes.\n byteorder\n The byte order used to represent the integer. If byteorder is 'big',\n the most significant byte is at the beginning of the byte array. If\n byteorder is 'little', the most significant byte is at the end of the\n byte array. To request the native byte order of the host system, use\n `sys.byteorder' as the byte order value.\n signed\n Determines whether two's complement is used to represent the integer.\n If signed is False and a negative integer is given, an OverflowError\n is raised."},__trunc__:{$meth:s,$flags:{NoArgs:!0},$textsig:null,$doc:"Truncating an Integral returns itself."},__floor__:{$meth:s,$flags:{NoArgs:!0},$textsig:null,$doc:"Flooring an Integral returns itself."},__ceil__:{$meth:s,$flags:{NoArgs:!0},$textsig:null,$doc:"Ceiling of an Integral returns itself."},__round__:{$meth(e){return this.round$(e)},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"Rounding an Integral returns itself.\nRounding with an ndigits argument also returns an integer."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.int_(this.v)])},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!1),$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:Sk.builtin.none.none$}},proto:{str$(e,t){return e=void 0===e||10===e?this.v.toString():this.v.toString(e),t||void 0===t||"-"===e[0]&&(e=e.substring(1)),e},round$(e){e=void 0===e?0:Sk.misceval.asIndexSized(e);var t=this.v,n=Math.pow(10,-e);if(0JSBI.toNumber(r)?t=JSBI.multiply(JSBI.multiply(i,e),n):JSBI.multiply(JSBI.multiply(JSBI.add(i,JSBI.BigInt(1),e),n)),new Sk.builtin.int_(t)}}}}),Sk.exportSymbol("Sk.builtin.int_",Sk.builtin.int_);const h=/_(?=[^_])/g;Sk.str2number=function(e,t){var n,i=e,r=!1;if("-"===(e=e.replace(/^\s+|\s+$/g,"")).charAt(0)&&(r=!0,e=e.substring(1)),"+"===e.charAt(0)&&(e=e.substring(1)),null==t&&(t=10),(2>t||36= 2 and <= 36");if("string"==typeof t&&(t=Number(t)),"0x"===e.substring(0,2).toLowerCase()){if(16===t||0===t)e=e.substring(2),t=16;else if(34>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0b"===e.substring(0,2).toLowerCase()){if(2===t||0===t)e=e.substring(2),t=2;else if(12>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0o"===e.substring(0,2).toLowerCase()){if(8===t||0===t)e=e.substring(2),t=8;else if(25>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0"===e.charAt(0)){if("0"===e)return 0;8!==t&&0!==t||(t=8)}if(0===t&&(t=10),-1!==e.indexOf("_")){if(-1!==e.indexOf("__"))throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'");e=10!==t?e.replace(h,""):e.charAt(0)+e.substring(1).replace(h,"")}if(0===e.length)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'");for(n=0;n=s?o=s-48:65<=s&&90>=s?o=s-65+10:97<=s&&122>=s&&(o=s-97+10),o>=t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}if(r&&(e="-"+e),u(o=parseInt(e,t)))return o;for(i=!1,"-"===e[0]&&(i=!0,e=e.substring(1)),t=JSBI.BigInt(t),r=JSBI.BigInt(1),n=JSBI.BigInt(0),s=e.length-1;0<=s;s--)48<=(o=e.charCodeAt(s))&&57>=o?o-=48:65<=o&&90>=o?o=o-65+10:97<=o&&122>=o&&(o=o-97+10),o=JSBI.multiply(JSBI.BigInt(o),r),n=JSBI.add(n,o),r=JSBI.multiply(r,t);return i&&(n=JSBI.multiply(n,JSBI.BigInt(-1))),n},Sk.builtin.int_.py2$methods={},Sk.longFromStr=function(e,t){return Sk.__future__.python3?new Sk.builtin.int_(c(e)):(e=Sk.str2number(e,t),new Sk.builtin.lng(e))},Sk.exportSymbol("Sk.longFromStr",Sk.longFromStr),Sk.builtin.int_.withinThreshold=u,Sk.builtin.int_.stringToNumberOrBig=c;const d=[.5,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,0x800000000000,281474976710656,562949953421312,0x4000000000000,0x8000000000000,4503599627370496,9007199254740992];Sk.builtin.lng=Sk.abstr.buildNativeClass("long",{base:Sk.builtin.int_,constructor:function(e){Sk.builtin.int_.call(this,e)},slots:{$r(){return new Sk.builtin.str(this.v.toString()+"L")},tp$as_number:!0,nb$negative(){return new Sk.builtin.lng(f.nb$negative.call(this).v)},nb$positive(){return new Sk.builtin.lng(f.nb$positive.call(this).v)}}});const f=Sk.builtin.int_.prototype},function(e,t){const n=Sk.builtin.int_.prototype;Sk.builtin.bool=Sk.abstr.buildNativeClass("bool",{constructor:function(e){return Sk.misceval.isTrue(e)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},base:Sk.builtin.int_,slots:{tp$doc:"bool(x) -> bool\n\nReturns True when the argument x is true, False otherwise.\nThe builtins True and False are the only two instances of the class bool.\nThe class bool is a subclass of the class int, and cannot be subclassed.",tp$new:(e,t)=>(Sk.abstr.checkNoKwargs("bool",t),Sk.abstr.checkArgsLen("bool",e,0,1),new Sk.builtin.bool(e[0])),$r(){return this.v?this.str$True:this.str$False},tp$as_number:!0,nb$and(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v&e.v):n.nb$and.call(this,e)},nb$or(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v|e.v):n.nb$or.call(this,e)},nb$xor(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v^e.v):n.nb$xor.call(this,e)}},flags:{sk$acceptable_as_base_class:!1},methods:{__format__:{$meth(){return this.$r()},$flags:{OneArg:!0}}},proto:{str$False:new Sk.builtin.str("False"),str$True:new Sk.builtin.str("True")}}),Sk.exportSymbol("Sk.builtin.bool",Sk.builtin.bool),Sk.builtin.bool.true$=Object.create(Sk.builtin.bool.prototype,{v:{value:1,enumerable:!0}}),Sk.builtin.bool.false$=Object.create(Sk.builtin.bool.prototype,{v:{value:0,enumerable:!0}})},function(e,t){function n(){return new Sk.builtin.float_(this.v)}function i(e){return function(t){const n=this.v;if("number"!=typeof(t=t.v)){if(!JSBI.__isBigInt(t))return Sk.builtin.NotImplemented.NotImplemented$;if(1/0==(t=parseFloat(JSBI.toNumber(t)))||-1/0==t)throw new Sk.builtin.OverflowError("int too large to convert to float")}return e(n,t)}}function r(e){const t=i(e);return function(e,n){if(void 0!==n&&!Sk.builtin.checkNone(n))throw new Sk.builtin.TypeError("pow() 3rd argument not allowed unless all arguments are integers");return t.call(this,e)}}function s(e,t){if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return 1/0===e?1/0===t||-1/0===e?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(-1/0):new Sk.builtin.float_(1/0):-1/0===e?1/0===t||-1/0===e?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(1/0):new Sk.builtin.float_(-1/0):new Sk.builtin.float_(e/t)}function o(e,t){if(1/0===e||-1/0===e)return new Sk.builtin.float_(NaN);if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return 1/0===t?0>e?new Sk.builtin.float_(-1):new Sk.builtin.float_(0):-1/0===t?0>e||0!==e?new Sk.builtin.float_(0):new Sk.builtin.float_(-1):new Sk.builtin.float_(Math.floor(e/t))}function a(e,t){if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");if(0===e)return new Sk.builtin.float_(0);if(1/0===t)return 1/0===e||-1/0===this.v?new Sk.builtin.float_(NaN):0e?0n&&(n+=t):0>t&&0!==n&&(n+=t),0===n&&(0>t?n=-0:-1/0==1/0/n&&(n=0)),new Sk.builtin.float_(n)}function l(e,t){if(0>e&&0!=t%1)throw new Sk.builtin.ValueError("negative number cannot be raised to a fractional power");if(0===e&&0>t)throw new Sk.builtin.ZeroDivisionError("0.0 cannot be raised to a negative power");const n=Math.pow(e,t);if(1/0===Math.abs(n)&&1/0!==Math.abs(e)&&1/0!==Math.abs(t))throw new Sk.builtin.OverflowError("Numerical result out of range");return new Sk.builtin.float_(n)}const u=Object.create(null,{Infinity:{value:314159},"-Infinity":{value:-314159},NaN:{value:0}});Sk.builtin.float_=Sk.abstr.buildNativeClass("float",{constructor:function(e){if(Sk.asserts.assert(this instanceof Sk.builtin.float_,"bad call to float use 'new'"),"number"==typeof e)this.v=e;else if(void 0===e)this.v=0;else if("string"==typeof e)this.v=parseFloat(e);else{if(e.nb$float)return e.nb$float();Sk.asserts.fail("bad argument to float constructor")}},slots:{tp$gettattr:Sk.generic.getAttr,tp$as_number:!0,tp$doc:"Convert a string or number to a floating point number, if possible.",tp$hash(){const e=this.v;let t=u[e];return void 0!==t?t:(t=Number.isInteger(e)?this.nb$int().tp$hash():Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2),u[this.v]=t)},$r(){return new Sk.builtin.str(this.str$(10,!0))},tp$new(e,t){if(t&&t.length)throw new Sk.builtin.TypeError("float() takes no keyword arguments");if(e&&1e?Math.ceil(e):Math.floor(e),!Number.isInteger(e))throw new Sk.builtin.ValueError("cannot convert float "+Sk.misceval.objectRepr(this)+" to integer");return Sk.builtin.int_.withinThreshold(e)?new Sk.builtin.int_(e):new Sk.builtin.int_(JSBI.BigInt(e))},nb$float:n,nb$long(){return new Sk.builtin.lng(this.nb$int().v)},nb$add:i(((e,t)=>new Sk.builtin.float_(e+t))),nb$subtract:i(((e,t)=>new Sk.builtin.float_(e-t))),nb$reflected_subtract:i(((e,t)=>new Sk.builtin.float_(t-e))),nb$multiply:i(((e,t)=>new Sk.builtin.float_(e*t))),nb$divide:i(s),nb$reflected_divide:i(((e,t)=>s(t,e))),nb$floor_divide:i(o),nb$reflected_floor_divide:i(((e,t)=>o(t,e))),nb$remainder:i(a),nb$reflected_remainder:i(((e,t)=>a(t,e))),nb$divmod:i(((e,t)=>new Sk.builtin.tuple([o(e,t),a(e,t)]))),nb$reflected_divmod:i(((e,t)=>new Sk.builtin.tuple([o(t,e),a(t,e)]))),nb$power:r(l),nb$reflected_power:r(((e,t)=>l(t,e))),nb$abs(){return new Sk.builtin.float_(Math.abs(this.v))},nb$negative(){return new Sk.builtin.float_(-this.v)},nb$positive(){return new Sk.builtin.float_(this.v)},nb$bool(){return 0!==this.v},nb$isnegative(){return 0>this.v},nb$ispositive(){return 0<=this.v},ob$eq:i(((e,t)=>e==t)),ob$ne:i(((e,t)=>e!=t)),ob$gt:i(((e,t)=>e>t)),ob$ge:i(((e,t)=>e>=t)),ob$lt:i(((e,t)=>ee<=t))},getsets:{real:{$get:n,$doc:"the real part of a complex number"},imag:{$get:()=>new Sk.builtin.float_(0),$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth:n,$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return self, the complex conjugate of any float."},__trunc__:{$meth(){return this.nb$int()},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return the Integral closest to x between 0 and x."},__round__:{$meth(e){return this.round$(e)},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, ndigits=None, /)",$doc:"Return the Integral closest to x, rounding half toward even.\n\nWhen an argument is passed, work like built-in round(x, ndigits)."},is_integer:{$meth(){return new Sk.builtin.bool(Number.isInteger(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the float is an integer."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([this])},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!0),$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:Sk.builtin.none.none$}}});const c=/_[eE]|[eE]_|\._|_\.|[+-]_|__/,p=/_(?=[^_])/g;Sk.builtin.float_.PyFloat_Check=function(e){return void 0!==e&&!!(Sk.builtin.checkNumber(e)||Sk.builtin.checkFloat(e)||e.ob$type.$isSubType(Sk.builtin.float_))},Sk.builtin.float_.prototype.toFixed=function(e){return e=Sk.builtin.asnum$(e),this.v.toFixed(e)},Sk.builtin.float_.prototype.round$=function(e){var t=Sk.builtin.asnum$(this),n=void 0===e?0:Sk.misceval.asIndexSized(e);if(Sk.__future__.bankers_rounding){t*=Math.pow(10,n);var i=Math.round(t);return n=(.5==(0n.length?t.toExponential():t.toExponential(11)),0>n.indexOf("e")&&0<=n.indexOf(".")){for(;"0"==n.charAt(n.length-1);)n=n.substring(0,n.length-1);"."==n.charAt(n.length-1)&&(n+="0")}n=(n=(n=n.replace(/\.0+e/,"e","i")).replace(/(e[-+])([1-9])$/,"$10$2")).replace(/0+(e.*)/,"$1")}else n=t.toString(e);return 0===this.v&&-1/0==1/this.v&&(n="-"+n),0>n.indexOf(".")&&0>n.indexOf("E")&&0>n.indexOf("e")&&(n+=".0"),n},Sk.builtin.float_.py2$methods={}},function(e,t){function n(e){let t=e.v;if("number"==typeof t)return t;if(e.nb$float&&(t=e.nb$float()),void 0===t)throw new Sk.builtin.TypeError("a float is required");return t.v}function i(e,t,n){return n===Sk.builtin.complex.prototype?new Sk.builtin.complex(e,t):(n=new n.constructor,Sk.builtin.complex.call(n,e,t),n)}function r(e,t){return function(n){const i=this.real,r=this.imag;var s=n.real;const o=n.v;if("number"==typeof s)n=n.imag;else if("number"==typeof o)s=o,n=0;else{if(!JSBI.__isBigInt(o))return Sk.builtin.NotImplemented.NotImplemented$;if(void 0===t){if(1/0==(s=parseFloat(JSBI.toNumber(o)))||-1/0==s)throw new Sk.builtin.OverflowError("int too large to convert to float")}else s=o.toString();n=0}return e(i,r,s,n)}}function s(e,t,n,i){var r=Math.abs(n);const s=Math.abs(i);if(r>=s){if(0===r)throw new Sk.builtin.ZeroDivisionError("complex division by zero");i=(e+t*(r=i/n))/(n+=i*r),e=(t-e*r)/n}else s>=r?(n=n*(r=n/i)+i,Sk.asserts.assert(0!==i),i=(e*r+t)/n,e=(t*r-e)/n):e=i=NaN;return new Sk.builtin.complex(i,e)}function o(e,t,n,i){if(0===n&&0===i){i=1;var r=0}else if(0===e&&0===t){if(0!==i||0>n)throw new Sk.builtin.ZeroDivisionError("complex division by zero");r=i=0}else{const s=Math.hypot(e,t);r=Math.pow(s,n),n*=e=Math.atan2(t,e),0!==i&&(r/=Math.exp(e*i),n+=i*Math.log(s)),i=r*Math.cos(n),r*=Math.sin(n)}return new Sk.builtin.complex(i,r)}function a(e,t,n){let i=1;var r=new Sk.builtin.complex(1,0);for(e=new Sk.builtin.complex(e,t);0=i;)n&i&&(r=new Sk.builtin.complex(r.real*e.real-r.imag*e.imag,r.real*e.imag+e.real*r.imag)),i<<=1,e=new Sk.builtin.complex(e.real*e.real-e.imag*e.imag,2*e.real*e.imag);return r}function l(e,t,n,i,r){switch(r=!1,t){case"e":case"f":case"g":break;case"E":r=!0,t="e";break;case"F":r=!0,t="f";break;case"r":if(0!==n)throw Error("Bad internall call");n=17,t="g";break;default:throw Error("Bad internall call")}if(isNaN(e))e="nan";else if(1/0===e)e="inf";else if(-1/0===e)e="-inf";else{i&l.Py_DTSF_ADD_DOT_0&&(t="g");var s="%"+(i&l.Py_DTSF_ALT?"#":"");null!=n&&(s=s+"."+n),e=(e=(s=new Sk.builtin.str(s+t)).nb$remainder(new Sk.builtin.float_(e))).v}return i&l.Py_DTSF_SIGN&&"-"!==e[0]&&(e="+"+e),r&&(e=e.toUpperCase()),e}Sk.builtin.complex=Sk.abstr.buildNativeClass("complex",{constructor:function(e,t){Sk.asserts.assert(this instanceof Sk.builtin.complex,"bad call to complex constructor, use 'new'"),this.real=e,this.imag=t},slots:{tp$as_number:!0,tp$doc:"Create a complex number from a real part and an optional imaginary part.\n\nThis is equivalent to (real + imag*1j) where imag defaults to 0.",tp$hash(){var e=new Sk.builtin.float_(this.real).tp$hash();return e=1003*new Sk.builtin.float_(this.imag).tp$hash()+e,Sk.builtin.int_.withinThreshold(e)?e:new Sk.builtin.int_(JSBI.BigInt(e)).tp$hash()},tp$getattr:Sk.generic.getAttr,tp$new(e,t){{var r,s=(e=Sk.abstr.copyKeywordsToNamedArgs("complex",["real","imag"],e,t,[null,null]))[1];let a=t=!1;var o=e[0];if(null!=o&&o.constructor===Sk.builtin.complex&&null==s)t=o;else if(Sk.builtin.checkString(o)){if(null!=s)throw new Sk.builtin.TypeError("complex() can't take second arg if first is a string");t=Sk.builtin.complex.complex_subtype_from_string(o,this)}else{if(null!=s&&Sk.builtin.checkString(s))throw new Sk.builtin.TypeError("complex() second arg can't be a string");if(null==o?e=null:e=void 0!==(e=Sk.abstr.lookupSpecial(o,Sk.builtin.str.$complex))?Sk.misceval.callsimArray(e,[]):null,null!=e&&e!==Sk.builtin.NotImplemented.NotImplemented$){if(!u(e))throw new Sk.builtin.TypeError("__complex__ should return a complex object");o=e}if(null!=o&&void 0===o.nb$float)throw new Sk.builtin.TypeError("complex() first argument must be a string or a number, not '"+Sk.abstr.typeName(o)+"'");if(null!=s&&void 0===s.nb$float)throw new Sk.builtin.TypeError("complex() second argument must be a number, not '"+Sk.abstr.typeName(o)+"'");null==o?o=e=0:u(o)?(e=o.real,o=o.imag,t=!0):(e=n(o),o=0),null==s?s=r=0:u(s)?(r=s.real,s=s.imag,a=!0):(r=n(s),s=0),!0===a&&(e-=s),!0===t&&(r+=o),t=i(e,r,this)}}return t},tp$richcompare(e,t){if("Eq"!==t&&"NotEq"!==t){if(Sk.builtin.checkNumber(e)||u(e))throw new Sk.builtin.TypeError("no ordering relation is defined for complex numbers");return Sk.builtin.NotImplemented.NotImplemented$}return r((function(e,n,i,r){return e=e==i&&n==r,"Eq"===t?e:!e}),!0).call(this,e)},$r(){{var e,t;let r=e="";var n=this.real,i=this.imag;(t=0===n)&&(t=1==(n?0>n?-1:1:0>1/n?-1:1)),t?(n="",t=l(i,"g",null,0,null)):(n=e=l(n,"g",null,0,null),t=l(i,"g",null,l.Py_DTSF_SIGN,null),0===i&&-1/0==1/i&&t&&"-"!==t[0]&&(t="-"+t),e="(",r=")"),i=new Sk.builtin.str(""+e+n+t+"j"+r)}return i},nb$int(){throw new Sk.builtin.TypeError("can't convert complex to int")},nb$long(){throw new Sk.builtin.TypeError("can't convert complex to long")},nb$float(){throw new Sk.builtin.TypeError("can't convert complex to float")},nb$positive(){return new Sk.builtin.complex(this.real,this.imag)},nb$negative(){return new Sk.builtin.complex(-this.real,-this.imag)},nb$bool(){return this.real||this.imag},nb$add:r(((e,t,n,i)=>new Sk.builtin.complex(e+n,t+i))),nb$subtract:r(((e,t,n,i)=>new Sk.builtin.complex(e-n,t-i))),nb$reflected_subtract:r(((e,t,n,i)=>new Sk.builtin.complex(n-e,i-t))),nb$multiply:r(((e,t,n,i)=>new Sk.builtin.complex(n*e-i*t,e*i+t*n))),nb$divide:r(s),nb$reflected_divide:r(((e,t,n,i)=>s(n,i,e,t))),nb$floor_divide(e){throw new Sk.builtin.TypeError("can't take floor of complex number.")},nb$reflected_floor_divide(e){throw new Sk.builtin.TypeError("can't take floor of complex number.")},nb$remainder(e){throw new Sk.builtin.TypeError("can't mod complex numbers.")},nb$reflected_remainder(e){throw new Sk.builtin.TypeError("can't mod complex numbers.")},nb$divmod(e){throw new Sk.builtin.TypeError("can't take floor or mod of complex number.")},nb$power(e,t){if(null!=t&&!Sk.builtin.checkNone(t))throw new Sk.builtin.ValueError("complex modulo");return h.call(this,e)},nb$abs(){var e=this.real;const t=this.imag;if(!Number.isFinite(e)||!Number.isFinite(t))return 1/0===e||-1/0===e?new Sk.builtin.float_(Math.abs(e)):1/0===t||-1/0===t?new Sk.builtin.float_(Math.abs(t)):new Sk.builtin.float_(NaN);if(e=Math.hypot(e,t),!Number.isFinite(e))throw new Sk.builtin.OverflowError("absolute value too large");return new Sk.builtin.float_(e)}},getsets:{real:{$get(){return new Sk.builtin.float_(this.real)},$doc:"the real part of a complex number"},imag:{$get(){return new Sk.builtin.float_(this.imag)},$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth(){return new Sk.builtin.complex(this.real,-this.imag)},$flags:{NoArgs:!0},$textsig:null,$doc:"complex.conjugate() -> complex\n\nReturn the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.float_(this.real),new Sk.builtin.float_(this.imag)])},$flags:{NoArgs:!0},$textsig:null,$doc:Sk.builtin.none.none$},__format__:{$meth(e){if(Sk.builtin.checkString(e))throw new Sk.builtin.NotImplementedError("__format__ is not implemented for complex type.");throw new Sk.builtin.TypeError("__format__ requires str")},$flags:{OneArg:!0},$textsig:null,$doc:"complex.__format__() -> str\n\nConvert to a string according to format_spec."}}}),Sk.exportSymbol("Sk.builtin.complex",Sk.builtin.complex);const u=Sk.builtin.checkComplex,c=/_[eE]|[eE]_|\._|_\.|[+-]_|_j|j_/,p=/_(?=[^_])/g;Sk.builtin.complex.complex_subtype_from_string=function(e,t){t=t||Sk.builtin.complex.prototype;var n=0,r=0,s=!1;if(Sk.builtin.checkString(e))e=Sk.ffi.remapToJs(e);else if("string"!=typeof e)throw new TypeError("provided unsupported string-alike argument");if(-1!==e.indexOf("\0")||0===e.length||""===e)throw new Sk.builtin.ValueError("complex() arg is a malformed string");var o=0;for(e=(e=e.replace(/inf|infinity/gi,"Infinity")).replace(/nan/gi,"NaN");" "===e[o];)o++;if("("===e[o])for(s=!0,o++;" "===e[o];)o++;if(-1!==e.indexOf("_")){if(c.test(e))throw new Sk.builtin.ValueError("could not convert string to complex: '"+e+"'");e=e.charAt(0)+e.substring(1).replace(p,"")}var a=/^(?:[+-]?(?:(?:(?:\d*\.\d+)|(?:\d+\.?))(?:[eE][+-]?\d+)?|NaN|Infinity))/,l=e.substr(o),u=l.match(a);if(null!==u)if("j"===e[o+=u[0].length]||"J"===e[o])r=parseFloat(u[0]),o++;else if("+"===e[o]||"-"===e[o]){if(n=parseFloat(u[0]),null!==(u=e.substr(o).match(a))?(r=parseFloat(u[0]),o+=u[0].length):(r="+"===e[o]?1:-1,o++),"j"!==e[o]&&"J"!==e[o])throw new Sk.builtin.ValueError("complex() arg is malformed string");o++}else n=parseFloat(u[0]);else null!==(u=u=l.match(/^([+-]?[jJ])/))&&(r=1===u[0].length||"+"===u[0][0]?1:-1,o+=u[0].length);for(;" "===e[o];)o++;if(s){if(")"!==e[o])throw new Sk.builtin.ValueError("complex() arg is malformed string");for(o++;" "===e[o];)o++}if(e.length!==o)throw new Sk.builtin.ValueError("complex() arg is malformed string");return i(n,r,t)};const h=r(((e,t,n,i)=>{const r=0|n;return 0===i&&n===r?(100r?e=o(e,t,r,0):0(Sk.abstr.checkNoKwargs("slice",t),Sk.abstr.checkArgsLen("slice",e,1,3),new Sk.builtin.slice(...e)),$r(){const e=Sk.misceval.objectRepr(this.start),t=Sk.misceval.objectRepr(this.stop),n=Sk.misceval.objectRepr(this.step);return new Sk.builtin.str("slice("+e+", "+t+", "+n+")")},tp$richcompare(e,t){if(e.ob$type!==Sk.builtin.slice)return Sk.builtin.NotImplemented.NotImplemented$;const n=new Sk.builtin.tuple([this.start,this.stop,this.step]);return e=new Sk.builtin.tuple([e.start,e.stop,e.step]),n.tp$richcompare(e,t)}},getsets:{start:{$get(){return this.start}},step:{$get(){return this.step}},stop:{$get(){return this.stop}}},methods:{indices:{$meth:function(e){if(0>(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError)))throw new Sk.builtin.TypeError("length should not be negative");const{start:t,stop:n,step:i}=this.slice$indices(e);return new Sk.builtin.tuple([new Sk.builtin.int_(t),new Sk.builtin.int_(n),new Sk.builtin.int_(i)])},$doc:"S.indices(len) -> (start, stop, stride)\n\nAssuming a sequence of length len, calculate the start and stop\nindices, and the stride length of the extended slice described by\nS. Out of bounds indices are clipped in a manner consistent with the\nhandling of normal slices.",$textsig:null,$flags:{OneArg:!0}}},proto:{slice$as_indices(e){let t;var n=e?e=>Sk.misceval.asIndexSized(e,null,"slice indices must be integers or None or have an __index__ method"):e=>Sk.misceval.asIndexOrThrow(e,"slice indices must be integers or None or have an __index__ method");if(Sk.builtin.checkNone(this.step))t=1;else if(t=n(this.step),0===t)throw new Sk.builtin.ValueError("slice step cannot be zero");return{start:e=Sk.builtin.checkNone(this.start)?null:n(this.start),stop:n=Sk.builtin.checkNone(this.stop)?null:n(this.stop),step:t}},$wrt:(e,t,n,i,r)=>(r=r?t=>JSBI.__isBigInt(t)?JSBI.add(t,JSBI.BigInt(e)):t+e:t=>t+e,0t&&(0>(t=r(t))&&(t=0)),null===n||n>e?n=e:0>n&&(n=r(n))):(null===t||t>=e?t=e-1:0>t&&(t=r(t)),null===n?n=-1:0>n&&(0>(n=r(n))&&(n=-1))),{start:t,stop:n,step:i}),slice$indices(e,t){let{start:n,stop:i,step:r}=this.slice$as_indices(!0,t);return this.$wrt(e,n,i,r,t)},sssiter$(e,t){let{start:n,stop:i,step:r}=this.slice$indices(e,!0);if(0i;e+=r)t(e)}},flags:{sk$acceptable_as_base_class:!1}}),Sk.builtin.slice.startEnd$wrt=function(e,t,n){return e=e.sq$length(),void 0===t||Sk.builtin.checkNone(t)?t=0:0>(t=Sk.misceval.asIndexSized(t,null,"slice indices must be integers or have an __index__ method"))&&(0>(t+=e)&&(t=0)),void 0===n||Sk.builtin.checkNone(n)?n=e:0>(n=Sk.misceval.asIndexSized(n,null,"slice indices must be integers or have an __index__ method"))?0>(n+=e)&&(n=0):n>e&&(n=e),{start:t,end:n}}},function(e,t){function n(e){return function(t){return Sk.builtin.checkAnySet(t)?e.call(this,t):Sk.builtin.NotImplemented.NotImplemented$}}function i(e){return e instanceof Sk.builtin.set&&e.tp$hash===Sk.builtin.none.none$&&(e=new Sk.builtin.frozenset(Sk.misceval.arrayFromIterable(e))),e}e={},Sk.builtin.set=Sk.abstr.buildNativeClass("set",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.set,"Bad call to set - must be called with an Array and 'new'");const t=[];for(let n=0;n new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.",tp$init(e,t){return Sk.abstr.checkNoKwargs("set",t),Sk.abstr.checkArgsLen("set",e,0,1),this.set$clear(),(e=e[0])&&this.set$update(e)},tp$new:Sk.generic.new,$r(){if(this.in$repr)return new Sk.builtin.str(Sk.abstr.typeName(this)+"(...)");this.in$repr=!0;const e=this.sk$asarray().map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,Sk.__future__.python3?0===e.length?new Sk.builtin.str(Sk.abstr.typeName(this)+"()"):this.ob$type!==Sk.builtin.set?new Sk.builtin.str(Sk.abstr.typeName(this)+"({"+e.join(", ")+"})"):new Sk.builtin.str("{"+e.join(", ")+"}"):new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+e.join(", ")+"])")},tp$iter(){return new r(this)},tp$richcompare(e,t){if(!Sk.builtin.checkAnySet(e))return Sk.builtin.NotImplemented.NotImplemented$;switch(t){case"NotEq":case"Eq":return e=this===e||this.get$size()===e.get$size()&&Sk.misceval.isTrue(this.set$issubset(e)),"Eq"===t?e:!e;case"LtE":return this===e||Sk.misceval.isTrue(this.set$issubset(e));case"GtE":return this===e||Sk.misceval.isTrue(e.set$issubset(this));case"Lt":return this.get$size()e.get$size()&&Sk.misceval.isTrue(e.set$issubset(this))}},nb$subtract:n((function(e){return this.difference.$meth.call(this,e)})),nb$and:n((function(e){return this.intersection.$meth.call(this,e)})),nb$or:n((function(e){return this.union.$meth.call(this,e)})),nb$xor:n((function(e){return this.symmetric_difference.$meth.call(this,e)})),nb$inplace_subtract:n((function(e){return e===this&&(e=e.set$copy()),Sk.misceval.chain(this.difference_update.$meth.call(this,e),(()=>this))})),nb$inplace_and:n((function(e){return Sk.misceval.chain(this.intersection_update.$meth.call(this,e),(()=>this))})),nb$inplace_or:n((function(e){return Sk.misceval.chain(this.update.$meth.call(this,e),(()=>this))})),nb$inplace_xor:n((function(e){return e===this&&(e=e.set$copy()),Sk.misceval.chain(this.symmetric_difference_update.$meth.call(this,e),(()=>this))})),sq$length(){return this.get$size()},sq$contains(e){return e=i(e),this.v.sq$contains(e)}},methods:{add:{$meth(e){return this.set$add(e),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Add an element to a set.\n\nThis has no effect if the element is already present."},clear:{$meth(){return this.set$clear(),Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove all elements from this set."},copy:{$meth(){return this.set$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a shallow copy of a set."},discard:{$meth(e){return e=i(e),this.set$discard(e),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Remove an element from a set if it is a member.\n\nIf the element is not a member, do nothing."},difference:{$meth(...e){const t=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>t.set$difference_update(e))),(()=>t))},$flags:{MinArgs:0},$textsig:null,$doc:"Return the difference of two or more sets as a new set.\n\n(i.e. all elements that are in this set but not the others.)"},difference_update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>this.set$difference_update(e))),(()=>Sk.builtin.none.none$))},$flags:{MinArgs:0},$textsig:null,$doc:"Remove all elements of another set from this set."},intersection:{$meth(...e){return this.set$intersection_multi(...e)},$flags:{MinArgs:0},$textsig:null,$doc:"Return the intersection of two sets as a new set.\n\n(i.e. all elements that are in both sets.)"},intersection_update:{$meth(...e){return Sk.misceval.chain(this.set$intersection_multi(...e),(e=>(this.swap$bodies(e),Sk.builtin.none.none$)))},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the intersection of itself and another."},isdisjoint:{$meth(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(this.sq$contains(e))return new Sk.misceval.Break(Sk.builtin.bool.false$)})),(e=>e||Sk.builtin.bool.true$))},$flags:{OneArg:!0},$textsig:null,$doc:"Return True if two sets have a null intersection."},issubset:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>this.set$issubset(e)))},$flags:{OneArg:!0},$textsig:null,$doc:"Report whether another set contains this set."},issuperset:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>e.set$issubset(this)))},$flags:{OneArg:!0},$textsig:null,$doc:"Report whether this set contains another set."},pop:{$meth(){if(0===this.get$size())throw new Sk.builtin.KeyError("pop from an empty set");return Sk.misceval.callsimArray(this.v.popitem,[this.v]).v[0]},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return an arbitrary set element.\nRaises KeyError if the set is empty."},remove:{$meth(e){const t=i(e);if(this.v.mp$lookup(t))return this.v.mp$ass_subscript(t),Sk.builtin.none.none$;throw new Sk.builtin.KeyError(e)},$flags:{OneArg:!0},$textsig:null,$doc:"Remove an element from a set; it must be a member.\n\nIf the element is not a member, raise a KeyError."},symmetric_difference:{$meth(e){let t;return Sk.misceval.chain(this.set$make_basetype(e),(e=>(t=e,t.set$symmetric_diff_update(this))),(()=>t))},$flags:{OneArg:!0},$textsig:null,$doc:"Return the symmetric difference of two sets as a new set.\n\n(i.e. all elements that are in exactly one of the sets.)"},symmetric_difference_update:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>this.set$symmetric_diff_update(e)),(()=>Sk.builtin.none.none$))},$flags:{OneArg:!0},$textsig:null,$doc:"Update a set with the symmetric difference of itself and another."},union:{$meth(...e){const t=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>t.set$update(e))),(()=>t))},$flags:{MinArgs:0},$textsig:null,$doc:"Return the union of sets as a new set.\n\n(i.e. all elements that are in either set.)"},update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>this.set$update(e))),(()=>Sk.builtin.none.none$))},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the union of itself and others."}},proto:Object.assign(e,{sk$asarray(){return this.v.sk$asarray()},get$size(){return this.v.sq$length()},set$add(e){this.v.mp$ass_subscript(e,!0)},set$make_basetype(e){return Sk.misceval.chain(Sk.misceval.arrayFromIterable(e,!0),(e=>new this.sk$builtinBase(e)))},set$discard(e){return this.v.pop$item(e)},set$clear(){this.v=new Sk.builtin.dict([])},set$copy(){const e=new this.sk$builtinBase;return e.v=this.v.dict$copy(),e},set$difference_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.set$discard(e)}))},set$intersection(e){const t=new this.sk$builtinBase;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.sq$contains(e)&&t.set$add(e)})),(()=>t))},set$intersection_multi(...e){if(!e.length)return this.set$copy();let t=this;return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>Sk.misceval.chain(t.set$intersection(e),(e=>{t=e})))),(()=>t))},set$issubset(e){if(this.get$size()>e.get$size())return Sk.builtin.bool.false$;for(let t=this.tp$iter(),n=t.tp$iternext();void 0!==n;n=t.tp$iternext())if(!e.sq$contains(n))return Sk.builtin.bool.false$;return Sk.builtin.bool.true$},set$symmetric_diff_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{void 0===this.set$discard(e)&&this.set$add(e)}))},set$update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.set$add(e)}))},swap$bodies(e){this.v=e.v}})}),Sk.exportSymbol("Sk.builtin.set",Sk.builtin.set),t=Sk.builtin.set.prototype,Sk.builtin.frozenset=Sk.abstr.buildNativeClass("frozenset",{constructor:function(e){void 0===e&&(e=[]),Sk.asserts.assert(Array.isArray(e)&&this instanceof Sk.builtin.frozenset,"bad call to frozen set - must be called with an Array and 'new'");const t=[];for(let n=0;n empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.",tp$hash(){let e=1927868237;const t=this.sk$asarray();e*=t.length+1;for(let n=0;ne.length?new Sk.builtin.frozenset(e):Sk.builtin.frozenset.$emptyset)))},$r:t.$r,tp$iter:t.tp$iter,tp$richcompare:t.tp$richcompare,nb$subtract:t.nb$subtract,nb$and:t.nb$and,nb$or:t.nb$or,nb$xor:t.nb$xor,sq$length:t.sq$length,sq$contains:t.sq$contains},methods:{copy:Object.assign({},t.copy.d$def,{$meth(){return this.constructor===this.sk$builtinBase?this:new Sk.builtin.frozenset(this.sk$asarray())}}),difference:t.difference.d$def,intersection:t.intersection.d$def,isdisjoint:t.isdisjoint.d$def,issubset:t.issubset.d$def,issuperset:t.issuperset.d$def,symmetric_difference:t.symmetric_difference.d$def,union:t.union.d$def},proto:Object.assign({$subtype_new(e,t){const n=new this.constructor;return Sk.misceval.chain(Sk.builtin.frozenset.prototype.tp$new(e),(e=>(n.v=e.v,n)))}},e)}),Sk.builtin.frozenset.$emptyset=Object.create(Sk.builtin.frozenset.prototype,{v:{value:new Sk.builtin.dict([]),enumerable:!0},in$repr:{value:!1,enumerable:!0}}),Sk.exportSymbol("Sk.builtin.frozenset",Sk.builtin.frozenset);var r=Sk.abstr.buildIteratorClass("set_iterator",{constructor:function(e){this.$index=0,this.$seq=e.sk$asarray(),this.$orig=e},iternext:Sk.generic.iterNextWithArrayCheckSize,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}})},function(e,t){Sk.builtin.print=function(e,t){let n,[i,r,s]=Sk.abstr.copyKeywordsToNamedArgs("print",["sep","end","file","flush"],[],t);if(void 0===i||Sk.builtin.checkNone(i))i=" ";else{if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError("sep must be None or a string, not "+Sk.abstr.typeName(i));i=i.$jsstr()}if(void 0===r||Sk.builtin.checkNone(r))r="\n";else{if(!Sk.builtin.checkString(r))throw new Sk.builtin.TypeError("end must be None or a string, not "+Sk.abstr.typeName(r));r=r.$jsstr()}if(void 0!==s&&!Sk.builtin.checkNone(s)&&(n=Sk.abstr.lookupSpecial(s,Sk.builtin.str.$write),void 0===n))throw new Sk.builtin.AttributeError("'"+Sk.abstr.typeName(s)+"' object has no attribute 'write'");const o=new Sk.builtin.str(e.map((e=>new Sk.builtin.str(e).toString())).join(i)+r);if(void 0===n)return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(e=>(n=Sk.abstr.lookupSpecial(e.$d.stdout,Sk.builtin.str.$write))&&Sk.misceval.callsimOrSuspendArray(n,[o])));Sk.misceval.callsimArray(n,[o])},Sk.builtin.print.co_fastcall=1},function(e,t){Sk.builtin.module=Sk.abstr.buildNativeClass("module",{constructor:function(){this.$d={}},slots:{tp$doc:"Create a module object.\n\nThe name must be a string; the optional doc argument can have any type.",tp$getattr(e,t){var n=this.$d[e.$mangled];if(void 0!==n)return n;if(void 0!==(n=this.ob$type.$typeLookup(e))){const e=n.tp$descr_get;return e?e.call(n,this,this.ob$type,t):n}const i=this.$d.__getattr__;return void 0!==i?(n=Sk.misceval.tryCatch((()=>Sk.misceval.callsimOrSuspendArray(i,[e])),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e})),t?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)):void 0},tp$setattr:Sk.generic.setAttr,tp$new:Sk.generic.new,tp$init(e,t){const[n,i]=Sk.abstr.copyKeywordsToNamedArgs("module",["name","doc"],e,t,[Sk.builtin.none.none$]);Sk.builtin.pyCheckType("module","string",n),this.init$dict(n,i)},$r(){let e=this.get$name();if(void 0!==e){var t=this.get$mod_reprf();if(void 0!==t)return Sk.misceval.callsimOrSuspendArray(t,[this])}return e=void 0===e?"'?'":e,t=void 0===(t=this.from$file())?this.empty_or$loader():t,new Sk.builtin.str("")}},getsets:{__dict__:{$get(){return new Sk.builtin.mappingproxy(this.$d)}}},methods:{__dir__:{$meth(){const e=this.tp$getattr(Sk.builtin.str.$dict);if(!Sk.builtin.checkMapping(e))throw new Sk.builtin.TypeError("__dict__ is not a dictionary");const t=e.mp$lookup(Sk.builtin.str.$dir);return void 0!==t?Sk.misceval.callsimOrSuspendArray(t,[]):new Sk.builtin.list(Sk.misceval.arrayFromIterable(e))},$flags:{NoArgs:!0},$doc:"__dir__() -> list\nspecialized dir() implementation"}},proto:{init$dict(e,t){this.$d.__name__=e,this.$d.__doc__=t,this.$d.__package__=Sk.builtin.none.none$,this.$d.__spec__=Sk.builtin.none.none$,this.$d.__loader__=Sk.builtin.none.none$},sk$attrError(){const e=this.get$name();return void 0===e?"module":"module "+e},get$name(){const e=this.tp$getattr(Sk.builtin.str.$name);return e&&Sk.misceval.objectRepr(e)},from$file(){const e=this.tp$getattr(Sk.builtin.str.$file);return e&&" from "+Sk.misceval.objectRepr(e)},empty_or$loader(){if(this.$js&&this.$js.includes("$builtinmodule"))return" (built-in)";const e=this.tp$getattr(Sk.builtin.str.$loader);return void 0===e||Sk.builtin.checkNone(e)?"":" ("+Sk.misceval.objectRepr(e)+")"},get$mod_reprf(){const e=this.tp$getattr(Sk.builtin.str.$loader);return e&&e.tp$getattr(this.str$mod_repr)},str$mod_repr:new Sk.builtin.str("module_repr")}}),Sk.exportSymbol("Sk.builtin.module",Sk.builtin.module)},function(e,t){Sk.builtin.structseq_types={},Sk.builtin.make_structseq=function(e,t,n,i){const r=e+"."+t,s=[];e=[];for(let t in n)s.push(t),e.push(n[t]);n={};for(let t=0;t")}},iternext(e,t){var n=this;return this.gi$running=!0,void 0===t&&(t=Sk.builtin.none.none$),this.gi$sentvalue=t,t=[this],this.func_closure&&t.push(this.func_closure),function t(i){if(i instanceof Sk.misceval.Suspension){if(e)return new Sk.misceval.Suspension(t,i);i=Sk.misceval.retryOptionalSuspensionOrThrow(i)}if(n.gi$running=!1,Sk.asserts.assert(void 0!==i),i!==Sk.builtin.none.none$)return n.gi$resumeat=i[0],i[1]}(this.func_code.apply(this.func_globals,t))},methods:{send:{$meth(e){return this.tp$iternext(!0,e)},$flags:{OneArg:!0},$doc:"send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration."}}}),Sk.exportSymbol("Sk.builtin.generator",Sk.builtin.generator),Sk.builtin.makeGenerator=function(e,t){var n,i=new Sk.builtin.generator(null,null,null);for(n in i.tp$iternext=e,t)t.hasOwnProperty(n)&&(i[n]=t[n]);return i},Sk.exportSymbol("Sk.builtin.makeGenerator",Sk.builtin.makeGenerator)},function(e,t){Sk.builtin.file=function(e,t,n){var i;if(!(this instanceof Sk.builtin.file))return new Sk.builtin.file(e,t,n);if(this.mode=t,this.name=Sk.ffi.remapToJs(e),this.closed=!1,"/dev/stdout"===this.name)this.data$=Sk.builtin.none.none$,this.fileno=1;else if("/dev/stdin"===this.name)this.fileno=0;else if("/dev/stderr"===this.name)this.fileno=2;else{if(Sk.inBrowser)if(this.fileno=10,null==(n=document.getElementById(e.v))){if("w"!=t.v&&"a"!=t.v)throw new Sk.builtin.IOError("[Errno 2] No such file or directory: '"+e.v+"'");this.data$=""}else"textarea"==n.nodeName.toLowerCase()?this.data$=n.value:this.data$=n.textContent;else this.fileno=11,this.data$=Sk.read(e.v);for(i in this.lineList=this.data$.split("\n"),this.lineList=this.lineList.slice(0,-1),this.lineList)this.lineList[i]+="\n";this.currentLine=0}return this.pos$=0,Sk.fileopen&&10<=this.fileno&&Sk.fileopen(this),this},Sk.abstr.setUpInheritance("file",Sk.builtin.file,Sk.builtin.object),Sk.abstr.setUpBuiltinMro(Sk.builtin.file),Sk.builtin.file.prototype.$r=function(){return new Sk.builtin.str("<"+(this.closed?"closed":"open")+"file '"+this.name+"', mode '"+Sk.ffi.remapToJs(this.mode)+"'>")},Sk.builtin.file.prototype.tp$iter=function(){var e={tp$iter:function(){return e},$obj:this,$index:this.currentLine,$lines:this.lineList,tp$iternext:function(){if(!(e.$index>=e.$lines.length))return new Sk.builtin.str(e.$lines[e.$index++])}};return e},Sk.abstr.setUpSlots(Sk.builtin.file),Sk.builtin.file.prototype.__enter__=new Sk.builtin.func((function(e){return e})),Sk.builtin.file.prototype.__exit__=new Sk.builtin.func((function(e){return Sk.misceval.callsimArray(Sk.builtin.file.prototype.close,[e])})),Sk.builtin.file.prototype.close=new Sk.builtin.func((function(e){return e.closed=!0,Sk.builtin.none.none$})),Sk.builtin.file.prototype.flush=new Sk.builtin.func((function(e){})),Sk.builtin.file.prototype.fileno=new Sk.builtin.func((function(e){return this.fileno})),Sk.builtin.file.prototype.isatty=new Sk.builtin.func((function(e){return!1})),Sk.builtin.file.prototype.read=new Sk.builtin.func((function(e,t){var n=e.data$.length;if(e.closed)throw new Sk.builtin.ValueError("I/O operation on closed file");var i=void 0===t?n:Sk.ffi.remapToJs(t);return i=new Sk.builtin.str(e.data$.substr(e.pos$,i)),e.pos$=void 0===t?n:e.pos$+Sk.ffi.remapToJs(t),e.pos$>=n&&(e.pos$=n),i})),Sk.builtin.file.$readline=function(e,t,n){if(0===e.fileno){if(e=Sk.ffi.remapToJs(n),(e=Sk.inputfun(e||""))instanceof Promise||e&&"function"==typeof e.then){var i=new Sk.misceval.Suspension;return i.resume=function(){if(i.data.error)throw i.data.error;return new Sk.builtin.str(i.data.result)},i.data={type:"Sk.promise",promise:e},i}return new Sk.builtin.str(e)}return t="",e.currentLine{n=Sk.ffi.remapToJs(e),i[n]=Sk.ffi.remapToJs(t)})),i}if(e instanceof Sk.builtin.list||e instanceof Sk.builtin.tuple){for(i=[],t=0;tt;s+=n)r.push(new Sk.builtin.int_(s));else{if(e=s=JSBI.BigInt(e),n=JSBI.BigInt(n),t=JSBI.BigInt(t),JSBI.greaterThan(n,JSBI.__ZERO))for(;JSBI.lessThan(s,t);)r.push(new Sk.builtin.int_(i(s))),s=JSBI.add(s,n);else for(;JSBI.greaterThan(s,t);)r.push(new Sk.builtin.int_(i(s))),s=JSBI.add(s,n);e=i(e),n=i(n),t=i(t)}return new Sk.builtin.range_(e,t,n,r)}function i(e){return JSBI.lessThan(e,JSBI.__MAX_SAFE)&&JSBI.greaterThan(e,JSBI.__MIN_SAFE)?JSBI.toNumber(e):e}Sk.builtin.range_=Sk.abstr.buildNativeClass("range",{constructor:function(e,t,n,i){this.start=e,this.stop=t,this.step=n,this.v=i},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"range(stop) -> range object\nrange(start, stop[, step]) -> range object\n\nReturn an object that produces a sequence of integers from start (inclusive)\nto stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\nstart defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\nThese are exactly the valid indices for a list of 4 elements.\nWhen step is given, it specifies the increment (or decrement).",tp$new:(e,t)=>(Sk.abstr.checkNoKwargs("range",t),Sk.abstr.checkArgsLen("range",e,1,3),n(e[0],e[1],e[2])),$r(){let e="range("+this.start+", "+this.stop;return 1!=this.step&&(e+=", "+this.step),new Sk.builtin.str(e+")")},tp$richcompare(e,t){return"Eq"!==t&&"NotEq"!==t||e.ob$type!==Sk.builtin.range_?Sk.builtin.NotImplemented.NotImplemented$:(e=new Sk.builtin.list(e.v),new Sk.builtin.list(this.v).tp$richcompare(e,t))},tp$iter(){return new r(this)},nb$bool(){return 0!==this.v.length},sq$contains(e){const t=this.v;for(let n=0;n(e=Sk.misceval.asIndexSized(e))&&(e=this.v.length+e),0>e||e>=this.v.length)throw new Sk.builtin.IndexError("range object index out of range");return this.v[e]}if(e.constructor===Sk.builtin.slice){const t=[],n=this.v;e.sssiter$(n.length,(e=>{t.push(n[e])}));let{start:i,stop:r,step:s}=e.slice$indices(n.length);return i=Sk.misceval.asIndex(n[i])||this.start,r=Sk.misceval.asIndex(n[r])||this.stop,s="number"==typeof this.step?s*this.step:JSBI.multiply(this.step,JSBI.BigInt(s)),new Sk.builtin.range_(i,r,s,t)}throw new Sk.builtin.TypeError("range indices must be integers or slices, not "+Sk.abstr.typeName(e))}},getsets:{start:{$get(){return new Sk.builtin.int_(this.start)}},step:{$get(){return new Sk.builtin.int_(this.step)}},stop:{$get(){return new Sk.builtin.int_(this.stop)}}},methods:{__reversed__:{$meth(){return new s(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a reverse iterator."},count:{$meth(e){let t=0;for(let n=0;n integer -- return number of occurrences of value"},index:{$meth(e){for(let t=0;t integer -- return index of value.\nRaise ValueError if the value is not present."}},proto:{sk$asarray(){return this.v.slice(0)}},flags:{sk$acceptable_as_base_class:!1}});var r=Sk.abstr.buildIteratorClass("range_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext(){return this.$seq[this.$index++]},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$acceptable_as_base_class:!1}}),s=Sk.abstr.buildIteratorClass("range_reverseiterator",{constructor:function(e){this.$seq=e.v,this.$index=this.$seq.length-1},iternext(){return this.$seq[this.$index--]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$acceptable_as_base_class:!1}});Sk.builtin.range=Sk.builtin.xrange=function(e,t,i){return e=n(e,t,i),new Sk.builtin.list(e.v)}},function(e,t){Sk.builtin.enumerate=Sk.abstr.buildIteratorClass("enumerate",{constructor:function(e,t){if(!(this instanceof Sk.builtin.enumerate))throw TypeError("Failed to construct 'enumerate': Please use the 'new' operator");return this.$iterable=e,this.$index=t,this},iternext(e){const t=Sk.misceval.chain(this.$iterable.tp$iternext(e),(e=>{if(void 0!==e)return new Sk.builtin.tuple([new Sk.builtin.int_(this.$index++),e])}));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},slots:{tp$doc:"Return an enumerate object.\n\n iterable\n an object supporting iteration\n\nThe enumerate object yields pairs containing a count (from start, which\ndefaults to zero) and a value yielded by the iterable argument.\n\nenumerate is useful for obtaining an indexed list:\n (0, seq[0]), (1, seq[1]), (2, seq[2]), ...",tp$new(e,t){let[n,i]=Sk.abstr.copyKeywordsToNamedArgs("enumerate",["iterable","start"],e,t,[new Sk.builtin.int_(0)]);return n=Sk.abstr.iter(n),i=Sk.misceval.asIndexOrThrow(i),this===Sk.builtin.enumerate.prototype?new Sk.builtin.enumerate(n,i):(e=new this.constructor,Sk.builtin.enumerate.call(e,n,i),e)}}}),Sk.exportSymbol("Sk.builtin.enumerate",Sk.builtin.enumerate)},function(e,t){Sk.builtin.filter_=Sk.abstr.buildIteratorClass("filter",{constructor:function(e,t){this.$func=e,this.$iterable=t},iternext(e){const t=Sk.misceval.iterFor(this.$iterable,(e=>Sk.misceval.chain(this.check$filter(e),(e=>e?new Sk.misceval.Break(e):void 0))));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},slots:{tp$doc:"Return an iterator yielding those items of iterable for which function(item)\nis true. If function is None, return the items that are true.",tp$new(e,t){let[n,i]=Sk.abstr.copyKeywordsToNamedArgs("filter",["predicate","iterable"],e,t,[]);return n=Sk.builtin.checkNone(n)?null:n,i=Sk.abstr.iter(i),this===Sk.builtin.filter_.prototype?new Sk.builtin.filter_(n,i):(e=new this.constructor,Sk.builtin.filter_.call(e,n,i),e)}},proto:{check$filter(e){let t;return t=null===this.$func?e:Sk.misceval.callsimOrSuspendArray(this.$func,[e]),Sk.misceval.chain(t,(t=>Sk.misceval.isTrue(t)?e:void 0))}}}),Sk.exportSymbol("Sk.builtin.filter_",Sk.builtin.filter_)},function(e,t){Sk.builtin.map_=Sk.abstr.buildIteratorClass("map",{constructor:function(e,t){this.$func=e,this.$iters=t},iternext(e){const t=[],n=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,(n=>Sk.misceval.chain(n.tp$iternext(e),(e=>{if(void 0===e)return new Sk.misceval.Break(!0);t.push(e)})))),(e=>e?void 0:Sk.misceval.callsimOrSuspendArray(this.$func,t)));return e?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)},slots:{tp$doc:"map(func, *iterables) --\x3e map object\n\nMake an iterator that computes the function using arguments from\neach of the iterables. Stops when the shortest iterable is exhausted.",tp$new(e,t){this===Sk.builtin.map_.prototype&&Sk.abstr.checkNoKwargs("map",t),Sk.abstr.checkArgsLen("map",e,2),t=e[0];const n=[];for(let t=1;tthis.$idx)){var t=Sk.misceval.tryCatch((()=>Sk.abstr.objectGetItem(this.$seq,new Sk.builtin.int_(this.$idx--),e)),(e=>{if(!(e instanceof Sk.builtin.IndexError))throw e;this.$idx=-1}));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},slots:{tp$doc:"Return a reverse iterator over the values of the given sequence.",tp$new(e,t){if(this===Sk.builtin.reversed.prototype&&Sk.abstr.checkNoKwargs("reversed",t),Sk.abstr.checkArgsLen("reversed",e,1,1),e=e[0],void 0!==(t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$reversed)))return Sk.misceval.callsimArray(t,[]);if(!Sk.builtin.checkSequence(e)||void 0===Sk.abstr.lookupSpecial(e,Sk.builtin.str.$len))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not a sequence");return this===Sk.builtin.reversed.prototype?new Sk.builtin.reversed(e):(t=new this.constructor,Sk.builtin.reversed.call(t,e),t)}},methods:{__length_hint__:{$meth:function(){return 0<=this.$idx?new Sk.builtin.int_(this.$idx):new Sk.builtin.int_(0)},$flags:{NoArgs:!0}}}})},function(e,t){Sk.builtin.zip_=Sk.abstr.buildIteratorClass("zip",{constructor:function(e){this.$iters=e,0===e.length&&(this.tp$iternext=()=>{})},iternext(e){const t=[],n=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,(n=>Sk.misceval.chain(n.tp$iternext(e),(e=>{if(void 0===e)return new Sk.misceval.Break(!0);t.push(e)})))),(e=>e?void 0:new Sk.builtin.tuple(t)));return e?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)},slots:{tp$doc:"zip(iter1 [,iter2 [...]]) --\x3e zip object\n\nReturn a zip object whose .__next__() method returns a tuple where\nthe i-th element comes from the i-th iterable argument. The .__next__()\nmethod continues until the shortest iterable in the argument sequence\nis exhausted and then it raises StopIteration.",tp$new(e,t){this===Sk.builtin.zip_.prototype&&Sk.abstr.checkNoKwargs("zip",t),t=[];for(let n=0;n":n.T_RARROW,".":n.T_DOT,"...":n.T_ELLIPSIS,"/":n.T_SLASH,"//":n.T_DOUBLESLASH,"//=":n.T_DOUBLESLASHEQUAL,"/=":n.T_SLASHEQUAL,":":n.T_COLON,";":n.T_SEMI,"<":n.T_LESS,"<<":n.T_LEFTSHIFT,"<<=":n.T_LEFTSHIFTEQUAL,"<=":n.T_LESSEQUAL,"=":n.T_EQUAL,"==":n.T_EQEQUAL,">":n.T_GREATER,">=":n.T_GREATEREQUAL,">>":n.T_RIGHTSHIFT,">>=":n.T_RIGHTSHIFTEQUAL,"@":n.T_AT,"@=":n.T_ATEQUAL,"[":n.T_LSQB,"]":n.T_RSQB,"^":n.T_CIRCUMFLEX,"^=":n.T_CIRCUMFLEXEQUAL,"{":n.T_LBRACE,"|":n.T_VBAR,"|=":n.T_VBAREQUAL,"}":n.T_RBRACE,"~":n.T_TILDE};var i={};!function(){for(var e in n)i[n[e]]=e}(),["tok_name","ISTERMINAL","ISNONTERMINAL","ISEOF"].concat(Object.keys(i).map((function(e){return i[e]}))),Sk.token={},Sk.token.tokens=n,Sk.token.tok_name=i,Sk.token.EXACT_TOKEN_TYPES=e,Sk.token.ISTERMINAL=function(e){return e=n.T_NT_OFFSET},Sk.token.ISEOF=function(e){return e==n.T_ENDMARKER},Sk.exportSymbol("Sk.token",Sk.token),Sk.exportSymbol("Sk.token.tokens",Sk.token.tokens),Sk.exportSymbol("Sk.token.tok_name",Sk.token.tok_name),Sk.exportSymbol("Sk.token.EXACT_TOKEN_TYPES"),Sk.exportSymbol("Sk.token.ISTERMINAL",Sk.token.ISTERMINAL),Sk.exportSymbol("Sk.token.ISNONTERMINAL",Sk.token.ISNONTERMINAL),Sk.exportSymbol("Sk.token.ISEOF",Sk.token.ISEOF)},function(e,t){function n(e,t,n,i,r){this.type=e,this.string=t,this.start=n,this.end=i,this.line=r}function i(e){return"("+Array.prototype.slice.call(arguments).join("|")+")"}function r(e){return i.apply(null,arguments)+"?"}function s(e,t){for(var n=e.length;n--;)if(e[n]===t)return!0;return!1}function o(){return" FR RF Br BR Fr r B R b bR f rb rB F Rf U rF u RB br fR fr rf Rb".split(" ")}function a(e){e?delete Sk.token.EXACT_TOKEN_TYPES["<>"]:Sk.token.EXACT_TOKEN_TYPES["<>"]=Sk.token.tokens.T_NOTEQUAL,f=Object.keys(Sk.token.EXACT_TOKEN_TYPES).sort(),_=i.apply(this,f.reverse().map((function(e){return e&&h.test(e)?e.replace(p,"\\$&"):e}))),m=i("\\r?\\n",_)}var l=Sk.token.tokens;const u=Sk.builtin.SyntaxError,c=Sk.builtin.SyntaxError;n.prototype.exact_type=function(){return this.type==l.T_OP&&this.string in Sk.token.EXACT_TOKEN_TYPES?Sk.token.EXACT_TOKEN_TYPES[this.string]:this.type};var p=/[\\^$.*+?()[\]{}|]/g,h=RegExp(p.source);const d=function(){var e=i("[A-Z]","[a-z]","[\\u{10B99}-\\u{10B9C}\\u{112A9}\\u{115DC}-\\u{115DD}\\u034F\\u115F-\\u1160\\u17B4-\\u17B5\\u2065\\u3164\\uFFA0\\uFFF0-\\uFFF8\\u{E0000}\\u{E0002}-\\u{E001F}\\u{E0080}-\\u{E00FF}\\u{E01F0}-\\u{E0FFF}\\u{112A9}\\u00D7]","[\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u06E5-\\u06E6\\u07F4-\\u07F5\\u0971\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1DFD-\\u1DFF\\u2E2F\\u30FC\\uA67F\\uA69C-\\uA69D\\uA717-\\uA71F\\uA788\\uA7F8-\\uA7F9\\uAB5C-\\uAB5F\\uFF70\\uFF9E-\\uFF9F\\u{16F93}-\\u{16F9F}\\u02D0-\\u02D1\\u0640\\u07FA\\u0E46\\u0EC6\\u1843\\u1AA7\\u1C7B\\u3005\\u3031-\\u3035\\u309D-\\u309E\\u30FC-\\u30FE\\uA015\\uA60C\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3-\\uAAF4\\uFF70\\u{16B42}-\\u{16B43}\\u{16FE0}-\\u{16FE1}\\u02B0-\\u02B8\\u02C0-\\u02C1\\u02E0-\\u02E4\\u037A\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C-\\u2C7D\\uA69C-\\uA69D\\uA770\\uA7F8-\\uA7F9\\uAB5C-\\uAB5F\\uFF9E-\\uFF9F\\u02B2\\u1D62\\u1DA4\\u1DA8\\u2071\\u2C7C\\u2E18-\\u2E19\\u2E2F]","[\\u2135-\\u2138\\u{1EE00}-\\u{1EE03}\\u{1EE05}-\\u{1EE1F}\\u{1EE21}-\\u{1EE22}\\u{1EE24}\\u{1EE27}\\u{1EE29}-\\u{1EE32}\\u{1EE34}-\\u{1EE37}\\u{1EE39}\\u{1EE3B}\\u{1EE42}\\u{1EE47}\\u{1EE49}\\u{1EE4B}\\u{1EE4D}-\\u{1EE4F}\\u{1EE51}-\\u{1EE52}\\u{1EE54}\\u{1EE57}\\u{1EE59}\\u{1EE5B}\\u{1EE5D}\\u{1EE5F}\\u{1EE61}-\\u{1EE62}\\u{1EE64}\\u{1EE67}-\\u{1EE6A}\\u{1EE6C}-\\u{1EE72}\\u{1EE74}-\\u{1EE77}\\u{1EE79}-\\u{1EE7C}\\u{1EE7E}\\u{1EE80}-\\u{1EE89}\\u{1EE8B}-\\u{1EE9B}\\u{1EEA1}-\\u{1EEA3}\\u{1EEA5}-\\u{1EEA9}\\u{1EEAB}-\\u{1EEBB}\\u3006\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uF900-\\uFA6D\\uFA70-\\uFAD9\\u{17000}-\\u{187F1}\\u{18800}-\\u{18AF2}\\u{1B170}-\\u{1B2FB}\\u{20000}-\\u{2A6D6}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u{2F800}-\\u{2FA1D}\\uAAC0\\uAAC2\\uFE20-\\uFE2F\\u{10D22}-\\u{10D23}\\u{1135D}\\u00AA\\u00BA\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uFA0E-\\uFA0F\\uFA11\\uFA13-\\uFA14\\uFA1F\\uFA21\\uFA23-\\uFA24\\uFA27-\\uFA29\\u{20000}-\\u{2A6D6}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u115F-\\u1160\\u3164\\uFFA0\\u0673\\u17A3-\\u17A4\\u0E40-\\u0E44\\u0EC0-\\u0EC4\\u19B5-\\u19B7\\u19BA\\uAAB5-\\uAAB6\\uAAB9\\uAABB-\\uAABC]","[\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u2170-\\u217F\\u2160-\\u216F]","_","[\\u1885-\\u1886\\u2118\\u212E\\u309B-\\u309C]"),t=i(e,"[\\u104A-\\u104B\\u102B-\\u102C\\u102D-\\u1030\\u1031\\u1032-\\u1036\\u1038\\u103B-\\u103C\\u103D-\\u103E\\u1056-\\u1057\\u1058-\\u1059\\u105E-\\u1060\\u1062\\u1067-\\u1068\\u1071-\\u1074\\u1082\\u1083-\\u1084\\u1085-\\u1086\\u109C\\u109D\\u1037\\u1039-\\u103A\\u1087-\\u108C\\u108D\\u108F\\u109A-\\u109B\\uA9E5\\uAA7B\\uAA7C\\uAA7D\\uA9E6\\uAA70\\u104A-\\u104B]","[\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E-\\u094F\\u0982-\\u0983\\u09BE-\\u09C0\\u09C7-\\u09C8\\u09CB-\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB-\\u0ACC\\u0B02-\\u0B03\\u0B3E\\u0B40\\u0B47-\\u0B48\\u0B4B-\\u0B4C\\u0B57\\u0BBE-\\u0BBF\\u0BC1-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82-\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7-\\u0CC8\\u0CCA-\\u0CCB\\u0CD5-\\u0CD6\\u0D02-\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82-\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2-\\u0DF3\\u0F7F\\u102B-\\u102C\\u1031\\u1038\\u103B-\\u103C\\u1056-\\u1057\\u1062\\u1067-\\u1068\\u1083-\\u1084\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7-\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930-\\u1931\\u1933-\\u1938\\u1A19-\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63-\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B82\\u1BA1\\u1BA6-\\u1BA7\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1C24-\\u1C2B\\u1C34-\\u1C35\\u1CF2-\\u1CF3\\uA823-\\uA824\\uA827\\uA880-\\uA881\\uA8B4-\\uA8C3\\uA952\\uA983\\uA9B4-\\uA9B5\\uA9BA-\\uA9BB\\uA9BD-\\uA9BF\\uAA2F-\\uAA30\\uAA33-\\uAA34\\uAA4D\\uAAEB\\uAAEE-\\uAAEF\\uAAF5\\uABE3-\\uABE4\\uABE6-\\uABE7\\uABE9-\\uABEA\\u{11000}\\u{11002}\\u{11082}\\u{110B0}-\\u{110B2}\\u{110B7}-\\u{110B8}\\u{1112C}\\u{11145}-\\u{11146}\\u{11182}\\u{111B3}-\\u{111B5}\\u{111BF}\\u{1122C}-\\u{1122E}\\u{11232}-\\u{11233}\\u{112E0}-\\u{112E2}\\u{11302}-\\u{11303}\\u{1133E}-\\u{1133F}\\u{11341}-\\u{11344}\\u{11347}-\\u{11348}\\u{1134B}-\\u{1134C}\\u{11357}\\u{11362}-\\u{11363}\\u{11435}-\\u{11437}\\u{11440}-\\u{11441}\\u{11445}\\u{114B0}-\\u{114B2}\\u{114B9}\\u{114BB}-\\u{114BE}\\u{114C1}\\u{115AF}-\\u{115B1}\\u{115B8}-\\u{115BB}\\u{115BE}\\u{11630}-\\u{11632}\\u{1163B}-\\u{1163C}\\u{1163E}\\u{116AC}\\u{116AE}-\\u{116AF}\\u{11720}-\\u{11721}\\u{11726}\\u{1182C}-\\u{1182E}\\u{11838}\\u{11A39}\\u{11A57}-\\u{11A58}\\u{11A97}\\u{11C2F}\\u{11C3E}\\u{11CA9}\\u{11CB1}\\u{11CB4}\\u{11D8A}-\\u{11D8E}\\u{11D93}-\\u{11D94}\\u{11D96}\\u{11EF5}-\\u{11EF6}\\u{16F51}-\\u{16F7E}\\u0F3E-\\u0F3F\\u1087-\\u108C\\u108F\\u109A-\\u109B\\u1B44\\u1BAA\\u1CE1\\u1CF7\\u302E-\\u302F\\uA953\\uA9C0\\uAA7B\\uAA7D\\uABEC\\u{111C0}\\u{11235}\\u{1134D}\\u{116B6}\\u{1D16D}-\\u{1D172}\\u09BE\\u09D7\\u0B3E\\u0B57\\u0BBE\\u0BD7\\u0CC2\\u0CD5-\\u0CD6\\u0D3E\\u0D57\\u0DCF\\u0DDF\\u302E-\\u302F\\u{1133E}\\u{11357}\\u{114B0}\\u{114BD}\\u{115AF}\\u{1D165}\\u{1D16E}-\\u{1D172}]","[\\u{1D7CE}-\\u{1D7FF}\\uFF10-\\uFF19]","\\u2040","[\\u00B7\\u0387\\u1369-\\u1371\\u19DA]");return!1===RegExp().unicode?new RegExp("^"+e+"+"+t+"*$","u"):(e=i("[A-Z]","[a-z]","_"),t=i(e,"[0-9]"),new RegExp("^"+e+"+"+t+"*$"))}();!function(e){i.apply(null,arguments)}("\\\\\\r?\\n[ \\f\\t]*"),r("#[^\\r\\n]*"),e=i("[0-9](?:_?[0-9])*\\.(?:[0-9](?:_?[0-9])*)?","\\.[0-9](?:_?[0-9])*")+r("[eE][-+]?[0-9](?:_?[0-9])*");var f,_,m,b=i(e,"[0-9](?:_?[0-9])*[eE][-+]?[0-9](?:_?[0-9])*"),g=i("[0-9](?:_?[0-9])*[jJ]",b+"[jJ]");e=i.apply(null,o()),t=i(e+"'''",e+'"""'),i(e+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*'",e+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*"'),a(!0),Sk.token.setupTokens=a;var S=i(e+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*"+i("'","\\\\\\r?\\n"),e+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*'+i('"',"\\\\\\r?\\n")),k=i("\\\\\\r?\\n|$","#[^\\r\\n]*",t),y={};e=o();for(let t of e)y[t+"'"]="^[^'\\\\]*(?:\\\\.[^'\\\\]*)*'",y[t+'"']='^[^"\\\\]*(?:\\\\.[^"\\\\]*)*"',y[t+"'''"]="^[^'\\\\]*(?:(?:\\\\.|'(?!''))[^'\\\\]*)*'''",y[t+'"""']='^[^"\\\\]*(?:(?:\\\\.|"(?!""))[^"\\\\]*)*"""';let v=[],T=[];for(let t of e)v.push(t+'"'),v.push(t+"'"),T.push(t+'"""'),T.push(t+"'''");Sk._tokenize=function(e,t,r,o){var a=Sk.__future__.python3?"":"(?:L?)";a=i("0[xX](?:_?[0-9a-fA-F])+"+a,"0[bB](?:_?[01])+"+a,Sk.__future__.silent_octal_literal?"0([oO]?)(?:_?[0-7])+"+a:"0([oO])(?:_?[0-7])+"+a,"(?:0(?:_?0)*|[1-9](?:_?[0-9])*)"+a),a=i(g,b,a),a="[ \\f\\t]*"+i(k,a,m,S,"\\w+"),a=new RegExp(a);var p,h,f,_=0,E=0,I=0,w="",x=0,A=null,$=[0],O=void 0,M=void 0;void 0!==r&&("utf-8-sig"==r&&(r="utf-8"),o(new n(l.T_ENCODING,r,[0,0],[0,0],"")));for(var C=r="";;){try{r=C,C=t()}catch(e){C=""}_+=1;var R=0,N=C.length;if(w){if(!C)throw new u("EOF in multi-line string",e,M[0],M[1]);O.lastIndex=0;var L=O.exec(C);if(!L){x&&"\\\n"!==C.substring(C.length-2)&&"\\\r\n"!==C.substring(C.length-3)?(o(new n(l.T_ERRORTOKEN,w+C,M,[_,C.length],A)),w="",A=null):(w+=C,A+=C);continue}R=h=L[0].length,o(new n(l.T_STRING,w+C.substring(0,h),M,[_,h],A+C)),w="",x=0,A=null}else if(0!=E||I){if(!C)throw new u("EOF in multi-line statement",e,_,0);I=0}else{if(!C)break;for(p=0;R$[$.length-1]&&($.push(p),o(new n(l.T_INDENT,C.substring(R),[_,0],[_,R],C)));p<$[$.length-1];){if(!s($,p))throw new c("unindent does not match any outer indentation level",e,_,R);$=$.slice(0,-1),o(new n(l.T_DEDENT,"",[_,R],[_,R],C))}}for(;R":Sk.token.tokens.T_GREATER,"=":Sk.token.tokens.T_EQUAL,".":Sk.token.tokens.T_DOT,"%":Sk.token.tokens.T_PERCENT,"`":Sk.token.tokens.T_BACKQUOTE,"{":Sk.token.tokens.T_LBRACE,"}":Sk.token.tokens.T_RBRACE,"@":Sk.token.tokens.T_AT,"@=":Sk.token.tokens.T_ATEQUAL,"==":Sk.token.tokens.T_EQEQUAL,"!=":Sk.token.tokens.T_NOTEQUAL,"<>":Sk.token.tokens.T_NOTEQUAL,"<=":Sk.token.tokens.T_LESSEQUAL,">=":Sk.token.tokens.T_GREATEREQUAL,"~":Sk.token.tokens.T_TILDE,"^":Sk.token.tokens.T_CIRCUMFLEX,"<<":Sk.token.tokens.T_LEFTSHIFT,">>":Sk.token.tokens.T_RIGHTSHIFT,"**":Sk.token.tokens.T_DOUBLESTAR,"+=":Sk.token.tokens.T_PLUSEQUAL,"-=":Sk.token.tokens.T_MINEQUAL,"*=":Sk.token.tokens.T_STAREQUAL,"/=":Sk.token.tokens.T_SLASHEQUAL,"%=":Sk.token.tokens.T_PERCENTEQUAL,"&=":Sk.token.tokens.T_AMPEREQUAL,"|=":Sk.token.tokens.T_VBAREQUAL,"^=":Sk.token.tokens.T_CIRCUMFLEXEQUAL,"<<=":Sk.token.tokens.T_LEFTSHIFTEQUAL,">>=":Sk.token.tokens.T_RIGHTSHIFTEQUAL,"**=":Sk.token.tokens.T_DOUBLESTAREQUAL,"//":Sk.token.tokens.T_DOUBLESLASH,"//=":Sk.token.tokens.T_DOUBLESLASHEQUAL,"->":Sk.token.tokens.T_RARROW,"...":Sk.token.tokens.T_ELLIPSIS},Sk.ParseTables={sym:{and_expr:257,and_test:258,annassign:259,arglist:260,argument:261,arith_expr:262,assert_stmt:263,async_funcdef:264,async_stmt:265,atom:266,atom_expr:267,augassign:268,break_stmt:269,classdef:270,comp_for:271,comp_if:272,comp_iter:273,comp_op:274,comparison:275,compound_stmt:276,continue_stmt:277,debugger_stmt:278,decorated:279,decorator:280,decorators:281,del_stmt:282,dictorsetmaker:283,dotted_as_name:284,dotted_as_names:285,dotted_name:286,encoding_decl:287,eval_input:288,except_clause:289,expr:290,expr_stmt:291,exprlist:292,factor:293,file_input:294,flow_stmt:295,for_stmt:296,funcdef:297,global_stmt:298,if_stmt:299,import_as_name:300,import_as_names:301,import_from:302,import_name:303,import_stmt:304,lambdef:305,lambdef_nocond:306,nonlocal_stmt:307,not_test:308,or_test:309,parameters:310,pass_stmt:311,power:312,print_stmt:313,raise_stmt:314,return_stmt:315,shift_expr:316,simple_stmt:317,single_input:256,sliceop:318,small_stmt:319,star_expr:320,stmt:321,subscript:322,subscriptlist:323,suite:324,term:325,test:326,test_nocond:327,testlist:328,testlist_comp:329,testlist_star_expr:330,tfpdef:331,trailer:332,try_stmt:333,typedargslist:334,varargslist:335,vfpdef:336,while_stmt:337,with_item:338,with_stmt:339,xor_expr:340,yield_arg:341,yield_expr:342,yield_stmt:343},number2symbol:{256:"single_input",257:"and_expr",258:"and_test",259:"annassign",260:"arglist",261:"argument",262:"arith_expr",263:"assert_stmt",264:"async_funcdef",265:"async_stmt",266:"atom",267:"atom_expr",268:"augassign",269:"break_stmt",270:"classdef",271:"comp_for",272:"comp_if",273:"comp_iter",274:"comp_op",275:"comparison",276:"compound_stmt",277:"continue_stmt",278:"debugger_stmt",279:"decorated",280:"decorator",281:"decorators",282:"del_stmt",283:"dictorsetmaker",284:"dotted_as_name",285:"dotted_as_names",286:"dotted_name",287:"encoding_decl",288:"eval_input",289:"except_clause",290:"expr",291:"expr_stmt",292:"exprlist",293:"factor",294:"file_input",295:"flow_stmt",296:"for_stmt",297:"funcdef",298:"global_stmt",299:"if_stmt",300:"import_as_name",301:"import_as_names",302:"import_from",303:"import_name",304:"import_stmt",305:"lambdef",306:"lambdef_nocond",307:"nonlocal_stmt",308:"not_test",309:"or_test",310:"parameters",311:"pass_stmt",312:"power",313:"print_stmt",314:"raise_stmt",315:"return_stmt",316:"shift_expr",317:"simple_stmt",318:"sliceop",319:"small_stmt",320:"star_expr",321:"stmt",322:"subscript",323:"subscriptlist",324:"suite",325:"term",326:"test",327:"test_nocond",328:"testlist",329:"testlist_comp",330:"testlist_star_expr",331:"tfpdef",332:"trailer",333:"try_stmt",334:"typedargslist",335:"varargslist",336:"vfpdef",337:"while_stmt",338:"with_item",339:"with_stmt",340:"xor_expr",341:"yield_arg",342:"yield_expr",343:"yield_stmt"},dfas:{256:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],257:[[[[44,1]],[[45,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],258:[[[[46,1]],[[47,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],259:[[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],{48:1}],260:[[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],261:[[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],262:[[[[55,1]],[[30,0],[43,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],263:[[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],{24:1}],264:[[[[10,1]],[[56,2]],[[0,2]]],{10:1}],265:[[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],{10:1}],266:[[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,33:1,35:1,38:1}],267:[[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],268:[[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],{67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:1,75:1,76:1,77:1,78:1,79:1}],269:[[[[39,1]],[[0,1]]],{39:1}],270:[[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],{13:1}],271:[[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],{10:1,34:1}],272:[[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],{37:1}],273:[[[[87,1],[54,1]],[[0,1]]],{10:1,34:1,37:1}],274:[[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],{8:1,83:1,88:1,89:1,90:1,91:1,92:1,93:1,94:1}],275:[[[[95,1]],[[96,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],276:[[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],{4:1,10:1,13:1,20:1,21:1,34:1,37:1,41:1,42:1}],277:[[[[40,1]],[[0,1]]],{40:1}],278:[[[[17,1]],[[0,1]]],{17:1}],279:[[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],{41:1}],280:[[[[41,1]],[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],{41:1}],281:[[[[106,1]],[[106,1],[0,1]]],{41:1}],282:[[[[27,1]],[[82,2]],[[0,2]]],{27:1}],283:[[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],284:[[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],285:[[[[109,1]],[[52,0],[0,1]]],{25:1}],286:[[[[25,1]],[[110,0],[0,1]]],{25:1}],287:[[[[25,1]],[[0,1]]],{25:1}],288:[[[[111,1]],[[2,1],[112,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],289:[[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],{113:1}],290:[[[[114,1]],[[115,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],291:[[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],292:[[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],{6:1,7:1,9:1,11:1,12:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],293:[[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],294:[[[[2,0],[112,1],[121,0]],[[0,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1,112:1}],295:[[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],{5:1,23:1,31:1,39:1,40:1}],296:[[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],{34:1}],297:[[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],{4:1}],298:[[[[26,1]],[[25,2]],[[52,1],[0,2]]],{26:1}],299:[[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{37:1}],300:[[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],301:[[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],{25:1}],302:[[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],{36:1}],303:[[[[32,1]],[[133,2]],[[0,2]]],{32:1}],304:[[[[134,1],[135,1]],[[0,1]]],{32:1,36:1}],305:[[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],{14:1}],306:[[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],{14:1}],307:[[[[18,1]],[[25,2]],[[52,1],[0,2]]],{18:1}],308:[[[[8,1],[137,2]],[[46,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],309:[[[[138,1]],[[139,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],310:[[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],{35:1}],311:[[[[28,1]],[[0,1]]],{28:1}],312:[[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],313:[[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],{16:1}],314:[[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],{5:1}],315:[[[[23,1]],[[111,2],[0,1]],[[0,2]]],{23:1}],316:[[[[143,1]],[[144,0],[142,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],317:[[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],318:[[[[48,1]],[[49,2],[0,1]],[[0,2]]],{48:1}],319:[[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],320:[[[[15,1]],[[95,2]],[[0,2]]],{15:1}],321:[[[[1,1],[3,1]],[[0,1]]],{4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],322:[[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],323:[[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],324:[[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],{2:1,5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],325:[[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],326:[[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],327:[[[[165,1],[84,1]],[[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],328:[[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],329:[[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],330:[[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],331:[[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],{25:1}],332:[[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],{35:1,38:1,110:1}],333:[[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],{20:1}],334:[[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],335:[[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],336:[[[[25,1]],[[0,1]]],{25:1}],337:[[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{21:1}],338:[[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],339:[[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],{42:1}],340:[[[[172,1]],[[173,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],341:[[[[111,2],[36,1]],[[49,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,36:1,38:1,43:1}],342:[[[[31,1]],[[174,2],[0,1]],[[0,2]]],{31:1}],343:[[[[62,1]],[[0,1]]],{31:1}]},states:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],[[[44,1]],[[45,0],[0,1]]],[[[46,1]],[[47,0],[0,1]]],[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],[[[55,1]],[[30,0],[43,0],[0,1]]],[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],[[[10,1]],[[56,2]],[[0,2]]],[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],[[[39,1]],[[0,1]]],[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],[[[87,1],[54,1]],[[0,1]]],[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],[[[95,1]],[[96,0],[0,1]]],[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],[[[40,1]],[[0,1]]],[[[17,1]],[[0,1]]],[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],[[[41,1]],[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],[[[106,1]],[[106,1],[0,1]]],[[[27,1]],[[82,2]],[[0,2]]],[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[109,1]],[[52,0],[0,1]]],[[[25,1]],[[110,0],[0,1]]],[[[25,1]],[[0,1]]],[[[111,1]],[[2,1],[112,2]],[[0,2]]],[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],[[[114,1]],[[115,0],[0,1]]],[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],[[[2,0],[112,1],[121,0]],[[0,1]]],[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],[[[26,1]],[[25,2]],[[52,1],[0,2]]],[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],[[[32,1]],[[133,2]],[[0,2]]],[[[134,1],[135,1]],[[0,1]]],[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],[[[18,1]],[[25,2]],[[52,1],[0,2]]],[[[8,1],[137,2]],[[46,2]],[[0,2]]],[[[138,1]],[[139,0],[0,1]]],[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],[[[28,1]],[[0,1]]],[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],[[[23,1]],[[111,2],[0,1]],[[0,2]]],[[[143,1]],[[144,0],[142,0],[0,1]]],[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],[[[48,1]],[[49,2],[0,1]],[[0,2]]],[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],[[[15,1]],[[95,2]],[[0,2]]],[[[1,1],[3,1]],[[0,1]]],[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],[[[165,1],[84,1]],[[0,1]]],[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[25,1]],[[0,1]]],[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],[[[172,1]],[[173,0],[0,1]]],[[[111,2],[36,1]],[[49,2]],[[0,2]]],[[[31,1]],[[174,2],[0,1]],[[0,2]]],[[[62,1]],[[0,1]]]],labels:[[0,"EMPTY"],[317,null],[4,null],[276,null],[1,"def"],[1,"raise"],[1,"True"],[3,null],[1,"not"],[1,"null"],[55,null],[2,null],[25,null],[1,"class"],[1,"lambda"],[16,null],[1,"print"],[1,"debugger"],[1,"nonlocal"],[52,null],[1,"try"],[1,"while"],[31,null],[1,"return"],[1,"assert"],[1,null],[1,"global"],[1,"del"],[1,"pass"],[54,null],[15,null],[1,"yield"],[1,"import"],[1,"False"],[1,"for"],[7,null],[1,"from"],[1,"if"],[9,null],[1,"break"],[1,"continue"],[49,null],[1,"with"],[14,null],[316,null],[19,null],[308,null],[1,"and"],[11,null],[326,null],[22,null],[261,null],[12,null],[35,null],[271,null],[325,null],[297,null],[339,null],[296,null],[26,null],[283,null],[8,null],[342,null],[329,null],[10,null],[266,null],[332,null],[45,null],[38,null],[40,null],[50,null],[46,null],[41,null],[42,null],[36,null],[43,null],[48,null],[44,null],[37,null],[39,null],[324,null],[260,null],[292,null],[1,"in"],[309,null],[273,null],[327,null],[272,null],[28,null],[21,null],[27,null],[29,null],[1,"is"],[30,null],[20,null],[290,null],[274,null],[333,null],[299,null],[270,null],[337,null],[279,null],[265,null],[281,null],[264,null],[286,null],[280,null],[320,null],[1,"as"],[284,null],[23,null],[328,null],[0,null],[1,"except"],[340,null],[18,null],[330,null],[268,null],[259,null],[312,null],[293,null],[321,null],[269,null],[277,null],[314,null],[315,null],[343,null],[1,"else"],[310,null],[51,null],[1,"elif"],[300,null],[301,null],[285,null],[303,null],[302,null],[335,null],[275,null],[258,null],[1,"or"],[334,null],[267,null],[34,null],[262,null],[33,null],[319,null],[13,null],[295,null],[263,null],[291,null],[311,null],[307,null],[313,null],[282,null],[298,null],[304,null],[278,null],[318,null],[322,null],[5,null],[6,null],[47,null],[17,null],[24,null],[305,null],[306,null],[323,null],[289,null],[1,"finally"],[331,null],[336,null],[338,null],[257,null],[32,null],[341,null]],keywords:{False:33,null:9,True:6,and:47,as:108,assert:24,break:39,class:13,continue:40,debugger:17,def:4,del:27,elif:130,else:127,except:113,finally:168,for:34,from:36,global:26,if:37,import:32,in:83,is:92,lambda:14,nonlocal:18,not:8,or:139,pass:28,print:16,raise:5,return:23,try:20,while:21,with:42,yield:31},tokens:{0:112,1:25,2:11,3:7,4:2,5:159,6:160,7:35,8:61,9:38,10:64,11:48,12:52,13:146,14:43,15:30,16:15,17:162,18:115,19:45,20:94,21:89,22:50,23:110,24:163,25:12,26:59,27:90,28:88,29:91,30:93,31:22,32:173,33:144,34:142,35:53,36:74,37:78,38:68,39:79,40:69,41:72,42:73,43:75,44:77,45:67,46:71,47:161,48:76,49:41,50:70,51:129,52:19,54:29,55:10},start:256}},function(e,t){function n(e,t){return this.filename=e,this.grammar=t,this.p_flags=0,this}function i(e,t){return void 0===t&&(t="file_input"),e=new n(e,Sk.ParseTables),"file_input"===t?e.setup(Sk.ParseTables.sym.file_input):Sk.asserts.fail("todo;"),e}n.FUTURE_PRINT_FUNCTION="print_function",n.FUTURE_UNICODE_LITERALS="unicode_literals",n.FUTURE_DIVISION="division",n.FUTURE_ABSOLUTE_IMPORT="absolute_import",n.FUTURE_WITH_STATEMENT="with_statement",n.FUTURE_NESTED_SCOPES="nested_scopes",n.FUTURE_GENERATORS="generators",n.CO_FUTURE_PRINT_FUNCTION=65536,n.CO_FUTURE_UNICODE_LITERALS=131072,n.CO_FUTURE_DIVISON=8192,n.CO_FUTURE_ABSOLUTE_IMPORT=16384,n.CO_FUTURE_WITH_STATEMENT=32768,n.prototype.setup=function(e){e=e||this.grammar.start,this.stack=[{dfa:this.grammar.dfas[e],state:0,node:{type:e,value:null,context:null,children:[]}}],this.used_names={}},n.prototype.addtoken=function(e,t,n){var i,r=this.classify(e,t,n);e:for(;;){var s=this.stack[this.stack.length-1],o=s.dfa[0],a=o[s.state];for(i=0;ic),this.shift(e,t,u,n),n=u;1===o[n].length&&0===o[n][0][0]&&o[n][0][1]===n;){if(this.pop(),0===this.stack.length)return!0;n=(s=this.stack[this.stack.length-1]).state,o=s.dfa[0]}return!1}if(256<=c&&(l=(l=this.grammar.dfas[c])[1]).hasOwnProperty(r)){this.push(c,this.grammar.dfas[c],u,n);continue e}}t:{for(o=[0,s.state],s=a.length;s--;)if(a[s][0]===o[0]&&a[s][1]===o[1]){a=!0;break t}a=!1}if(!a)throw e=n[0][0],new Sk.builtin.SyntaxError("bad input",this.filename,e,n);if(this.pop(),0===this.stack.length)throw new Sk.builtin.SyntaxError("too much input",this.filename)}},n.prototype.classify=function(e,t,i){if(e===Sk.token.tokens.T_NAME){this.used_names[t]=!0;var r=this.grammar.keywords.hasOwnProperty(t)&&this.grammar.keywords[t];if("print"===t&&(this.p_flags&n.CO_FUTURE_PRINT_FUNCTION||!0===Sk.__future__.print_function)&&(r=!1),r)return r}if(!(r=this.grammar.tokens.hasOwnProperty(e)&&this.grammar.tokens[e])){t="#"+e;for(let n in Sk.token.tokens)if(Sk.token.tokens[n]==e){t=n;break}throw new Sk.builtin.SyntaxError("bad token "+t,this.filename,i[0][0],i)}return r},n.prototype.shift=function(e,t,n,i){var r=this.stack[this.stack.length-1].dfa,s=this.stack[this.stack.length-1].node;s.children.push({type:e,value:t,lineno:i[0][0],col_offset:i[0][1],children:null}),this.stack[this.stack.length-1]={dfa:r,state:n,node:s}},n.prototype.push=function(e,t,n,i){e={type:e,value:null,lineno:i[0][0],col_offset:i[0][1],children:[]},this.stack[this.stack.length-1]={dfa:this.stack[this.stack.length-1].dfa,state:n,node:this.stack[this.stack.length-1].node},this.stack.push({dfa:t,state:0,node:e})},n.prototype.pop=function(){var e=this.stack.pop().node;if(e)if(0!==this.stack.length){this.stack[this.stack.length-1].node.children.push(e)}else this.rootnode=e,this.rootnode.used_names=this.used_names},Sk.parse=function(e,t){var n=Sk.token.tokens.T_COMMENT,r=Sk.token.tokens.T_NL,s=Sk.token.tokens.T_OP,o=Sk.token.tokens.T_ENDMARKER,a=Sk.token.tokens.T_ENCODING,l=!1,u=i(e);if(Sk._tokenize(e,function(e){var t=e.split("\n").reverse().map((function(e){return e+"\n"}));return function(){if(0===t.length)throw new Sk.builtin.Exception("EOF");return t.pop()}}(t),"utf-8",(function(e){var t=null;e.type!==n&&e.type!==r&&e.type!==a&&(e.type===s&&(t=Sk.OpMap[e.string]),u.addtoken(t||e.type,e.string,[e.start,e.end,e.line]),e.type===o&&(l=!0))})),!l)throw new Sk.builtin.SyntaxError("incomplete input",this.filename);return{cst:u.rootnode,flags:u.p_flags}},Sk.parseTreeDump=function(e,t){var n,i=""+(t=t||"");if(256<=e.type)for(i+=Sk.ParseTables.number2symbol[e.type]+"\n",n=0;n=i(t)||o+2==i(t)&&r(t,o+1).type==V.T_COMMA)throw new Sk.builtin.SyntaxError("named arguments must follow bare *",e.c_filename,t.lineno);(d=r(t,o+1)).type==V.T_COMMA?o=E(e,t,o+=2,u,c):(p=T(e,d),(o+=3)e.c_feature_version)return o(e,l,"Async functions are only supported in Python 3.5 and greater"),null;s(l,j.funcdef);var f=h(r(l,p));if(u(e,0,r(l,p),0))return null;var _=I(e,r(l,p+1));if(!_)return null;if(r(l,p+2).type==V.T_RARROW){if(!(c=F(e,r(l,p+3))))return null;p+=2}if(r(l,p+3).type==V.T_TYPE_COMMENT){if(!(d=V.T_NEW_TYPE_COMMENT(r(l,p+3))))return null;p+=1}var b=m(e,r(l,p+3));if(!b)return null;if(1":return Sk.astnodes.RShift;case"&":return Sk.astnodes.BitAnd;case"^":return Sk.astnodes.BitXor;case"|":return Sk.astnodes.BitOr;case"*":return"*"===t.value.charAt(1)?Sk.astnodes.Pow:Sk.astnodes.Mult;case"@":if(Sk.__future__.python3)return Sk.astnodes.MatMult;default:Sk.asserts.fail("invalid augassign")}}(0,r(t,1)),a,t.lineno,t.col_offset)}if(r(t,1).type===j.annassign){if(!Sk.__future__.python3)throw new Sk.builtin.SyntaxError("Annotated assignment is not supported in Python 2",e.c_filename,t.lineno);n=r(t,0);var l=r(t,1),p=1;for(o=n;1==i(o);)o=r(o,0);switch(0o(s,a,"f-string: expecting '}'");for(Sk.asserts.assert(t<=n);t=t),Sk.asserts.assert("{"==e.charAt(t-1)),Sk.asserts.assert("}"==e.charAt(n)||"!"==e.charAt(n)||":"==e.charAt(n)),e=e.substring(t,n),/^\s*$/.test(e)&&o(i,r,"f-string: empty expression not allowed");try{let t=Sk.parse("","("+e+")");var s=Sk.astFromParse(t.cst,"",t.flags)}catch(e){throw e.traceback&&e.traceback[0]&&((s=e.traceback[0]).lineno=(s.lineno||1)-1+r.lineno,s.filename=i.c_filename),e}return Sk.asserts.assert(1==s.body.length&&s.body[0].constructor===Sk.astnodes.Expr),s.body[0].value}(e,l,t,s,a),"!"==e.charAt(t)&&(++t>=n&&f(),c=e.charAt(t),t++,"s"!=c&&"r"!=c&&"a"!=c&&o(s,a,"f-string: invalid conversion character: expected 's', 'r', or 'a'")),t>=n&&f(),":"==e.charAt(t)&&(++t>=n&&f(),[u,t]=N(e,t,n,i,r+1,s,a)),(t>=n||"}"!=e.charAt(t))&&f(),t++,[new Sk.astnodes.FormattedValue(l,c,u,a.lineno,a.col_offset),t]}function N(e,t,n,i,r,s,o){let a=[],l=e=>{if(-1!==e.indexOf("}")){if(/(^|[^}])}(}})*($|[^}])/.test(e))throw new SyntaxError("f-string: single '}' is not allowed",o.lineno,o.col_offset);e=e.replace(/}}/g,"}")}a.push(new Sk.astnodes.Str(new Sk.builtin.str(e),o.lineno,o.col_offset,s.end_lineno,o.end_col_offset))};for(;ti&&(u=-1,n=i))}if(-1===u){l(e.substring(t,n)),t=n;break}if(u+1=l.length){if("None"===l)return new Sk.astnodes.NameConstant(Sk.builtin.none.none$,t.lineno,t.col_offset);if("True"===l)return new Sk.astnodes.NameConstant(Sk.builtin.bool.true$,t.lineno,t.col_offset);if("False"===l)return new Sk.astnodes.NameConstant(Sk.builtin.bool.false$,t.lineno,t.col_offset)}return e=h(l),new Sk.astnodes.Name(e,Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);case V.T_STRING:n=[];for(var u=0;u=y&&o(p,d,"Truncated \\xNN escape"),v+=String.fromCharCode(parseInt(g.substr(m+1,2),16)),m+=2):k||"u"!==b?k||"U"!==b?v+="\\"+b:(m+8>=y&&o(p,d,"Truncated \\UXXXXXXXX escape"),v+=String.fromCodePoint(parseInt(g.substr(m+1,8),16)),m+=8):(m+4>=y&&o(p,d,"Truncated \\uXXXX escape"),v+=String.fromCharCode(parseInt(g.substr(m+1,4),16)),m+=4))):k&&127Number.MAX_SAFE_INTEGER&&Math.floor(n)===n&&-1===t.indexOf("e")&&-1===t.indexOf("E")?Sk.longFromStr(t,0):e?new Sk.builtin.int_(-n):new Sk.builtin.int_(n)}(e,n.value,t.lineno),t.lineno,t.col_offset);case V.T_ELLIPSIS:return new Sk.astnodes.Ellipsis(t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);case V.T_LPAR:return(n=r(t,1)).type==V.T_RPAR?new Sk.astnodes.Tuple([],Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):n.type==j.yield_expr?F(e,n):1==i(n)?M(e,n):r(n,1).type==j.comp_for?f(S(e,n),t):f(M(e,n),t);case V.T_LSQB:return(n=r(t,1)).type==V.T_RSQB?new Sk.astnodes.List([],Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):(s(n,j.testlist_comp),1==i(n)||r(n,1).type==V.T_COMMA?(e=_(e,n))?new Sk.astnodes.List(e,Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):null:(l=n,Sk.asserts.assert(l.type==j.testlist_comp),f(e=O(e,l,1),t)));case V.T_LBRACE:if((n=r(t,1)).type==V.T_RBRACE)return new Sk.astnodes.Dict(null,null,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);if(l=r(n,0).type==V.T_DOUBLESTAR,1==i(n)||13-l&&r(n,3-l).type==j.comp_for){if(l)return o(e,t,"dict unpacking cannot be used in dict comprehension"),null;l=n,Sk.asserts.assert(3>11&7,this.__namespaces=n||[]}function i(e,t,n,i,r){this.symFlags={},this.name=t,this.varnames=[],this.children=[],this.blockType=n,this.returnsValue=this.varkeywords=this.varargs=this.generator=this.childHasFree=this.hasFree=this.isNested=!1,this.lineno=r,this.table=e,e.cur&&(e.cur.nested||"function"===e.cur.blockType)&&(this.isNested=!0),i.scopeId=a++,e.stss[i.scopeId]=this,this.symbols={}}function r(e){this.filename=e,this.top=this.cur=null,this.stack=[],this.curClass=this.global=null,this.tmpname=0,this.stss={}}function s(e,t){var n;for(n=0;n>11&7)||2==e}))),this._funcGlobals},i.prototype.get_frees=function(){return Sk.asserts.assert("function"==this.get_type(),"get_frees only valid for function scopes"),this._funcFrees||(this._funcFrees=this._identsMatching((function(e){return 4==(e>>11&7)}))),this._funcFrees},i.prototype.get_methods=function(){var e;if(Sk.asserts.assert("class"==this.get_type(),"get_methods only valid for class scopes"),!this._classMethods){var t=[];for(e=0;e>11&7},r.prototype.getStsForAst=function(e){return Sk.asserts.assert(void 0!==e.scopeId,"ast wasn't added to st?"),e=this.stss[e.scopeId],Sk.asserts.assert(void 0!==e,"unknown sym tab entry"),e},r.prototype.SEQStmt=function(e){var t,n;if(null!==e){Sk.asserts.assert(Sk.isArrayLike(e),"SEQ: nodes isn't array? got "+e.toString());var i=e.length;for(n=0;n","").replace(" ","_"))};var a=Sk.builtin.str.reservedWords_;n.prototype.makeConstant=function(e){var t,n="";for(t=0;t Sk.execLimit) {throw new Sk.builtin.TimeLimitError(Sk.timeoutMsg())}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(e=e+"if ($dateNow - Sk.lastYield > Sk.yieldLimit) {var $susp = $saveSuspension({data: {type: 'Sk.yield'}, resume: function() {}}, '"+this.filename+"',$currLineNo,$currColNo);",e+="$susp.$blk = $blk;$susp.optional = true;return $susp;}",this.u.doesSuspend=!0)),e},n.prototype._jumpfalse=function(e,t){e=this._gr("jfalse","(",e,"===false||!Sk.misceval.isTrue(",e,"))"),o("if(",e,"){/*test failed */$blk=",t,";continue;}")},n.prototype._jumpundef=function(e,t){o("if(",e,"===undefined){$blk=",t,";continue;}")},n.prototype._jumpnotundef=function(e,t){o("if(",e,"!==undefined){$blk=",t,";continue;}")},n.prototype._jumptrue=function(e,t){e=this._gr("jtrue","(",e,"===true||Sk.misceval.isTrue(",e,"))"),o("if(",e,"){/*test passed */$blk=",t,";continue;}")},n.prototype._jump=function(e){null===this.u.blocks[this.u.curblock]._next&&(o("$blk=",e,";"),this.u.blocks[this.u.curblock]._next=e)},n.prototype._checkSuspension=function(e){if(this.u.canSuspend){var t=this.newBlock("function return or resume suspension");this._jump(t),this.setBlock(t),e=e||{lineno:"$currLineNo",col_offset:"$currColNo"},o("if ($ret && $ret.$isSuspension) { return $saveSuspension($ret,'"+this.filename+"',"+e.lineno+","+e.col_offset+"); }"),this.u.doesSuspend=!0,this.u.tempsToSave=this.u.tempsToSave.concat(this.u.localtemps)}else o("if ($ret && $ret.$isSuspension) { $ret = Sk.misceval.retryOptionalSuspensionOrThrow($ret); }")},n.prototype.cunpackstarstoarray=function(e,t){if(!e||0==e.length)return"[]";let n=!1;for(let i of e){if(t&&n)throw new Sk.builtin.SyntaxError("Extended argument unpacking is not permitted in Python 2");i.constructor===Sk.astnodes.Starred&&(n=!0)}if(n){t=this._gr("unpack","[]");for(let n of e)n.constructor!==Sk.astnodes.Starred?o(t,".push(",this.vexpr(n),");"):(o("$ret = Sk.misceval.iterFor(Sk.abstr.iter(",this.vexpr(n.value),"), function(e) { ",t,".push(e); });"),this._checkSuspension());return t}return"["+e.map((e=>this.vexpr(e))).join(",")+"]"},n.prototype.ctuplelistorset=function(e,t,n){var i;Sk.asserts.assert("tuple"===n||"list"===n||"set"===n);var r=!1;for(i=0;i=n.length&&(n=this.vexpr(r),"dict"===e?(e=this.vexpr(s),o(t,".mp$ass_subscript(",e,",",n,");")):"list"===e?o(t,".v.push(",n,");"):"set"===e&&o(t,".v.mp$ass_subscript(",n,", true);"),this._jump(c),this.setBlock(c)),this._jump(u),this.setBlock(p),t},n.prototype.cyield=function(e){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'yield' outside function",this.filename,e.lineno);var t="Sk.builtin.none.none$";return e.value&&(t=this.vexpr(e.value)),e=this.newBlock("after yield"),o("return [/*resume*/",e,",/*ret*/",t,"];"),this.setBlock(e),"$gen.gi$sentvalue"},n.prototype.ccompare=function(e){var t;Sk.asserts.assert(e.ops.length===e.comparators.length);var n=this.vexpr(e.left),i=e.ops.length,r=this.newBlock("done"),s=this._gr("compareres","null");for(t=0;t 0) { throw new Sk.builtin.RuntimeError("super(): no arguments") };'),n="[$gbl.__class__,self]"),o("$ret = (",t,".tp$call)?",t,".tp$call(",n,",",i,") : Sk.misceval.applyOrSuspend(",t,",undefined,undefined,",i,",",n,");"),this._checkSuspension(e),this._gr("call","$ret")},n.prototype.cslice=function(e){if(Sk.asserts.assert(e instanceof Sk.astnodes.Slice),Sk.__future__.python3)var t=e.lower?this.vexpr(e.lower):"Sk.builtin.none.none$",n=e.upper?this.vexpr(e.upper):"Sk.builtin.none.none$";else t=e.lower?this.vexpr(e.lower):e.step?"Sk.builtin.none.none$":"new Sk.builtin.int_(0)",n=e.upper?this.vexpr(e.upper):e.step?"Sk.builtin.none.none$":"new Sk.builtin.int_(2147483647)";return e=e.step?this.vexpr(e.step):"Sk.builtin.none.none$",this._gr("slice","new Sk.builtins['slice'](",t,",",n,",",e,")")},n.prototype.eslice=function(e){var t;Sk.asserts.assert(e instanceof Array);var n=[];for(t=0;tthis.u.lineno&&(this.u.lineno=e.lineno,this.u.linenoSet=!1),e.constructor){case Sk.astnodes.BoolOp:return this.cboolop(e);case Sk.astnodes.BinOp:return this._gr("binop","Sk.abstr.numberBinOp(",this.vexpr(e.left),",",this.vexpr(e.right),",'",e.op.prototype._astname,"')");case Sk.astnodes.UnaryOp:return this._gr("unaryop","Sk.abstr.numberUnaryOp(",this.vexpr(e.operand),",'",e.op.prototype._astname,"')");case Sk.astnodes.Lambda:return this.clambda(e);case Sk.astnodes.IfExp:return this.cifexp(e);case Sk.astnodes.Dict:return this.cdict(e);case Sk.astnodes.ListComp:return this.clistcomp(e);case Sk.astnodes.DictComp:return this.cdictcomp(e);case Sk.astnodes.SetComp:return this.csetcomp(e);case Sk.astnodes.GeneratorExp:return this.cgenexp(e);case Sk.astnodes.Yield:return this.cyield(e);case Sk.astnodes.Compare:return this.ccompare(e);case Sk.astnodes.Call:return t=this.ccall(e),this.annotateSource(e),t;case Sk.astnodes.Num:if("number"==typeof e.n)return e.n;if(e.n instanceof Sk.builtin.lng)return this.makeConstant("new Sk.builtin.lng('"+e.n.v.toString()+"')");if(e.n instanceof Sk.builtin.int_)return"number"==typeof e.n.v?this.makeConstant("new Sk.builtin.int_("+e.n.v+")"):this.makeConstant("new Sk.builtin.int_('"+e.n.v.toString()+"')");if(e.n instanceof Sk.builtin.float_)return e=0===e.n.v&&-1/0==1/e.n.v?"-0":e.n.v,this.makeConstant("new Sk.builtin.float_("+e+")");if(e.n instanceof Sk.builtin.complex)return this.makeConstant("new Sk.builtin.complex("+(0===e.n.real&&-1/0==1/e.n.real?"-0":e.n.real)+", "+(0===e.n.imag&&-1/0==1/e.n.imag?"-0":e.n.imag)+")");Sk.asserts.fail("unhandled Num type");case Sk.astnodes.Bytes:if(Sk.__future__.python3){for(t=[],e=e.s.$jsstr(),n=0;ni||127<=i&&256>i?t+"\\x"+("0"+i.toString(16)).substr(-2):256<=i?t+"\\u"+("000"+i.toString(16)).substr(-4):t+e.charAt(n)}return t+'"'}(e.s.$jsstr()),")");case Sk.astnodes.Attribute:switch(e.ctx!==Sk.astnodes.AugLoad&&e.ctx!==Sk.astnodes.AugStore&&(r=this.vexpr(e.value)),i=(i=e.attr.$r().v).substring(1,i.length-1),i=s(this.u.private_,new Sk.builtin.str(i)).v,i=this.makeConstant("new Sk.builtin.str('"+i+"')"),e.ctx){case Sk.astnodes.AugLoad:return o("$ret = ",n,".tp$getattr(",i,", true);"),this._checkSuspension(e),o("\nif ($ret === undefined) {"),o("\nthrow new Sk.builtin.AttributeError(",n,'.sk$attrError() + " has no attribute \'" + ',i,'.$jsstr() + "\'");'),o("\n};"),this._gr("lattr","$ret");case Sk.astnodes.Load:return o("$ret = ",r,".tp$getattr(",i,", true);"),this._checkSuspension(e),o("\nif ($ret === undefined) {"),o("\nthrow new Sk.builtin.AttributeError(",r,'.sk$attrError() + " has no attribute \'" + ',i,'.$jsstr() + "\'");'),o("\n};"),this._gr("lattr","$ret");case Sk.astnodes.AugStore:o("$ret = undefined;"),o("if(",t,"!==undefined){"),o("$ret = ",n,".tp$setattr(",i,",",t,", true);"),o("}"),this._checkSuspension(e);break;case Sk.astnodes.Store:o("$ret = ",r,".tp$setattr(",i,",",t,", true);"),this._checkSuspension(e);break;case Sk.astnodes.Del:o("$ret = ",r,".tp$setattr(",i,", undefined, true);"),this._checkSuspension(e);break;default:Sk.asserts.fail("invalid attribute expression")}break;case Sk.astnodes.Subscript:switch(e.ctx){case Sk.astnodes.AugLoad:return o("$ret = Sk.abstr.objectGetItem(",n,",",i,", true);"),this._checkSuspension(e),this._gr("gitem","$ret");case Sk.astnodes.Load:case Sk.astnodes.Store:case Sk.astnodes.Del:return this.vslice(e.slice,e.ctx,this.vexpr(e.value),t);case Sk.astnodes.AugStore:o("$ret=undefined;"),o("if(",t,"!==undefined){"),o("$ret=Sk.abstr.objectSetItem(",n,",",i,",",t,", true)"),o("}"),this._checkSuspension(e);break;default:Sk.asserts.fail("invalid subscript expression")}break;case Sk.astnodes.Name:return this.nameop(e.id,e.ctx,t);case Sk.astnodes.NameConstant:if(e.ctx===Sk.astnodes.Store||e.ctx===Sk.astnodes.AugStore||e.ctx===Sk.astnodes.Del)throw new Sk.builtin.SyntaxError("can not assign to a constant name");switch(e.value){case Sk.builtin.none.none$:return"Sk.builtin.none.none$";case Sk.builtin.bool.true$:return"Sk.builtin.bool.true$";case Sk.builtin.bool.false$:return"Sk.builtin.bool.false$";default:Sk.asserts.fail("invalid named constant")}break;case Sk.astnodes.List:return this.ctuplelistorset(e,t,"list");case Sk.astnodes.Tuple:return this.ctuplelistorset(e,t,"tuple");case Sk.astnodes.Set:return this.ctuplelistorset(e,t,"set");case Sk.astnodes.Starred:if(e.ctx===Sk.astnodes.Store)throw new Sk.builtin.SyntaxError("starred assignment target must be in a list or tuple",this.filename,e.lineno);throw new Sk.builtin.SyntaxError("can't use starred expression here",this.filename,e.lineno);case Sk.astnodes.JoinedStr:return this.cjoinedstr(e);case Sk.astnodes.FormattedValue:return this.cformattedvalue(e);default:Sk.asserts.fail("unhandled case "+e.constructor.name+" vexpr")}},n.prototype.vseqexpr=function(e,t){var n;Sk.asserts.assert(void 0===t||e.length===t.length);var i=[];for(n=0;n",this.u.blocks[t]._next=null,t},n.prototype.setBlock=function(e){Sk.asserts.assert(0<=e&&e0) { $err=err; $blk=$exc.pop(); } else { throw err; } }};",o+="var $saveSuspension = function($child, $filename, $lineno, $colno) {var susp = new Sk.misceval.Suspension(); susp.child=$child;susp.resume=function(){"+e.scopename+".$wakingSuspension=susp; return "+e.scopename+"("+(e.ste.generator?"$gen":"")+"); };susp.data=susp.child.data;susp.$blk=$blk;susp.$loc=$loc;susp.$gbl=$gbl;susp.$exc=$exc;susp.$err=$err;susp.$postfinally=$postfinally;susp.$filename=$filename;susp.$lineno=$lineno;susp.$colno=$colno;susp.optional=susp.child.optional;"+(s?"susp.$cell=$cell;":""),r={},t=0;te?this.vexpr(e):"undefined"))),i&&i.vararg&&(f=i.vararg),i&&i.kwarg&&(_=i.kwarg),!Sk.__future__.python3&&i&&i.kwonlyargs&&0!=i.kwonlyargs.length)throw new Sk.builtin.SyntaxError("Keyword-only arguments are not supported in Python 2");var m=this.enterScope(t,e,e.lineno,this.canSuspend);n=this.u.ste.generator;var b=this.u.ste.hasFree,g=this.u.ste.childHasFree,S=this.newBlock("codeobj entry");this.u.prefixCode="var "+m+"=(function "+this.niceName(t.v)+"$(";var k=[];if(n){if(_)throw new Sk.builtin.SyntaxError(t.v+"(): keyword arguments in generators not supported",this.filename,e.lineno);if(f)throw new Sk.builtin.SyntaxError(t.v+"(): variable number of arguments in generators not supported",this.filename,e.lineno);k.push("$gen")}else{for(_&&(k.push("$kwa"),this.u.tempsToSave.push("$kwa")),u=0;i&&u0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} }});",a.call(this,m),i){for(let e of i.args)c.push(e.arg.v);for(let e of i.kwonlyargs||[])c.push(e.arg.v);this.u.argnames=c}if(this.exitScope(),0"),null,e.args,(function(t){t=this.vexpr(e.body),o("return ",t,";")}))},n.prototype.cifexp=function(e){var t=this.newBlock("next of ifexp"),n=this.newBlock("end of ifexp"),i=this._gr("res","null"),r=this.vexpr(e.test);return this._jumpfalse(r,t),o(i,"=",this.vexpr(e.body),";"),this._jump(n),this.setBlock(t),o(i,"=",this.vexpr(e.orelse),";"),this._jump(n),this.setBlock(n),i},n.prototype.cgenexpgen=function(e,t,n){var i=this.newBlock("start for "+t),r=this.newBlock("skip for "+t);this.newBlock("if cleanup for "+t);var s=this.newBlock("end for "+t),a=e[t];if(0===t)var l="$loc.$iter0";else{var u=this.vexpr(a.iter);l="$loc."+this.gensym("iter"),o(l,"=","Sk.abstr.iter(",u,");")}this._jump(i),this.setBlock(i),this.annotateSource(n),o("$ret = Sk.abstr.iternext(",l,this.u.canSuspend?", true":", false",");"),this._checkSuspension(n),u=this._gr("next","$ret"),this._jumpundef(u,s),this.vexpr(a.target,u);var c=a.ifs?a.ifs.length:0;for(l=0;l=e.length&&(this.annotateSource(n),e=this.vexpr(n),o("return [",r,"/*resume*/,",e,"/*ret*/];"),this.setBlock(r)),this._jump(i),this.setBlock(s),1===t&&o("return Sk.builtin.none.none$;")},n.prototype.cgenexp=function(e){var t=this.buildcodeobj(e,new Sk.builtin.str(""),null,null,(function(t){this.cgenexpgen(e.generators,0,e.elt)}));return t=this._gr("gener","Sk.misceval.callsimArray(",t,");"),o(t,".gi$locals.$iter0=Sk.abstr.iter(",this.vexpr(e.generators[0].iter),");"),t},n.prototype.cclass=function(e){Sk.asserts.assert(e instanceof Sk.astnodes.ClassDef);var t=this.vseqexpr(e.decorator_list),n=this.vseqexpr(e.bases),i=this.enterScope(e.name,e,e.lineno),r=this.newBlock("class entry");this.u.prefixCode="var "+i+"=(function $"+e.name.v+"$class_outer($globals,$locals,$cell){var $gbl=$globals,$loc=$locals;$free=$globals;",this.u.switchCode+="(function $"+e.name.v+"$_closure($cell){",this.u.switchCode+="var $blk="+r+",$exc=[],$ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;",null!==Sk.execLimit&&(this.u.switchCode+="if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.switchCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}"),this.u.switchCode+="while(true){try{",this.u.switchCode+=this.outputInterruptTest(),this.u.switchCode+="switch($blk){",this.u.suffixCode="}}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }}}",this.u.suffixCode+="}).call(null, $cell);});",this.u.private_=e.name,this.cbody(e.body,e.name),o("return;"),this.exitScope(),o("$ret = Sk.misceval.buildClass($gbl,",i,",",e.name.$r().v,",[",n,"], $cell);");for(let e of t)o("$ret = Sk.misceval.callsimOrSuspendArray(",e,", [$ret]);"),this._checkSuspension();this.nameop(e.name,Sk.astnodes.Store,"$ret")},n.prototype.ccontinue=function(e){var t=this.peekFinallyBlock();if(0==this.u.continueBlocks.length)throw new Sk.builtin.SyntaxError("'continue' outside loop",this.filename,e.lineno);e=this.u.continueBlocks[this.u.continueBlocks.length-1],Sk.asserts.assert(this.u.breakBlocks.length===this.u.continueBlocks.length),t&&t.breakDepth==this.u.continueBlocks.length?o("$postfinally={isBreak:true,gotoBlock:",e,"};"):this._jump(e)},n.prototype.cbreak=function(e){var t=this.peekFinallyBlock();if(0===this.u.breakBlocks.length)throw new Sk.builtin.SyntaxError("'break' outside loop",this.filename,e.lineno);e=this.u.breakBlocks[this.u.breakBlocks.length-1],t&&t.breakDepth==this.u.breakBlocks.length?o("$postfinally={isBreak:true,gotoBlock:",e,"};"):this._jump(e)},n.prototype.vstmt=function(e,t){if(this.u.lineno=e.lineno,this.u.linenoSet=!1,this.u.localtemps=[],Sk.debugging&&this.u.canSuspend){var n=this.newBlock("debug breakpoint for line "+e.lineno);o("if (Sk.breakpoints('"+this.filename+"',"+e.lineno+","+e.col_offset+")) {","var $susp = $saveSuspension({data: {type: 'Sk.debug'}, resume: function() {}}, '"+this.filename+"',"+e.lineno+","+e.col_offset+");","$susp.$blk = "+n+";","$susp.optional = true;","return $susp;","}"),this._jump(n),this.setBlock(n),this.u.doesSuspend=!0}switch(this.annotateSource(e),e.constructor){case Sk.astnodes.FunctionDef:this.cfunction(e,t);break;case Sk.astnodes.ClassDef:this.cclass(e);break;case Sk.astnodes.Return:if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'return' outside function",this.filename,e.lineno);n=e.value?this.vexpr(e.value):"Sk.builtin.none.none$",0==this.u.finallyBlocks.length?o("return ",n,";"):(o("$postfinally={returning:",n,"};"),this._jump(this.peekFinallyBlock().blk));break;case Sk.astnodes.Delete:this.vseqexpr(e.targets);break;case Sk.astnodes.Assign:var i=e.targets.length;for(n=this.vexpr(e.value),t=0;t"!==e.name.v){var t=e.name.$r().v;t=t.substring(1,t.length-1),o(e.scopename,".co_name=new Sk.builtins['str']('",t,"');"),this.stack.length&&"class"==this.u.ste.blockType&&o(e.scopename,".co_qualname=new Sk.builtins['str']('"+this.u.name.v+"."+t+"');")}for(var n in e.consts)e.consts.hasOwnProperty(n)&&(e.suffixCode+=n+" = "+e.consts[n]+";")},n.prototype.cbody=function(e,t){var n=0;const i=this.maybeCDocstringOfBody(e);for(null!==i&&(o("$loc.__doc__ = ",i,";"),n=1);n"),e,0,this.canSuspend),n=this.newBlock("module entry");if(this.u.prefixCode="var "+t+"=(function($forcegbl){",this.u.varDeclsCode="var $gbl = $forcegbl || {}, $blk="+n+",$exc=[],$loc=$gbl,$cell={},$err=undefined;$loc.__file__=new Sk.builtins.str('"+this.filename+"');var $ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;",null!==Sk.execLimit&&(this.u.varDeclsCode+="if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.varDeclsCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}"),this.u.varDeclsCode+="if ("+t+".$wakingSuspension!==undefined) { $wakeFromSuspension(); }if (Sk.retainGlobals) { if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; } if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; $loc.__file__=new Sk.builtins.str('"+this.filename+"');} else { Sk.globals = $gbl; }} else { Sk.globals = $gbl; }",this.u.switchCode="while(true){try{",this.u.switchCode+=this.outputInterruptTest(),this.u.switchCode+="switch($blk){",this.u.suffixCode="}",this.u.suffixCode+="}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} } });",e.constructor===Sk.astnodes.Module)this.cbody(e.body),o("return $loc;");else Sk.asserts.fail("todo; unhandled case in compilerMod");return this.exitScope(),this.result.push(this.outputAllUnits()),t},Sk.compile=function(e,t,i,r){i=Sk.__future__,Sk.__future__=Object.create(Sk.__future__);var s=Sk.parse(t,e),o=Sk.astFromParse(s.cst,t,s.flags);return s=s.flags,t=(e=new n(t,Sk.symboltable(o,t),s,r,e)).cmod(o),Sk.__future__=i,{funcname:"$compiledmod",code:"$compiledmod = function() {"+e.result.join("")+"\nreturn "+t+";}();"}},Sk.exportSymbol("Sk.compile",Sk.compile),Sk.resetCompiler=function(){Sk.gensymcount=0},Sk.exportSymbol("Sk.resetCompiler",Sk.resetCompiler),Sk.fixReserved=r,Sk.exportSymbol("Sk.fixReserved",Sk.fixReserved),Sk.unfixReserved=function(e){return e.replace(/_\$rw\$$/,"")},Sk.exportSymbol("Sk.unfixReserved",Sk.unfixReserved),Sk.mangleName=s,Sk.exportSymbol("Sk.mangleName",Sk.mangleName),Sk.reservedWords_=a,Sk.exportSymbol("Sk.reservedWords_",Sk.reservedWords_)},function(e,t){Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.importSearchPathForName=function(e,t,n){var i=e.replace(/\./g,"/"),r=function(e,t){return Sk.misceval.chain(Sk.misceval.tryCatch((function(){return Sk.read(e)}),(function(e){})),(function(n){if(void 0!==n)return new Sk.misceval.Break({filename:e,code:n,packagePath:t})}))};return void 0===n&&(n=Sk.realsyspath),Sk.misceval.iterFor(n.tp$iter(),(function(e){return Sk.misceval.chain(r(e.v+"/"+i+t,!1),(function(n){return n||r(e.v+"/"+i+"/__init__"+t,e.v+"/"+i)}))}))},Sk.importSetUpPath=function(e){if(!Sk.realsyspath){var t=[new Sk.builtin.str("src/builtin"),new Sk.builtin.str("src/lib"),new Sk.builtin.str(".")];for(e=0;ei;++i)e+=" ";n[t-1]="/* "+e+t+" */ "+n[t-1]}return n.join("\n")}(i),Sk.debugout(i)}return i+="\n"+e.funcname+";",i=Sk.global.eval(i),c.$d={__name__:new Sk.builtin.str(n),__doc__:Sk.builtin.none.none$,__package__:e.packagePath?new Sk.builtin.str(n):m?new Sk.builtin.str(d+m):h||Sk.builtin.none.none$},e.packagePath&&(c.$d.__path__=new Sk.builtin.tuple([new Sk.builtin.str(e.packagePath)])),i(c.$d)}}),(function(t){var n;if(void 0===t){if(s&&!p)return;throw new Sk.builtin.ImportError("No module named "+e)}if(t!==c.$d){for(n in c.$d)t[n]||(t[n]=c.$d[n]);c.$d=t}if(Sk.onAfterImport&&"function"==typeof Sk.onAfterImport)try{Sk.onAfterImport(e)}catch(e){}return p?(u.tp$setattr(new Sk.builtin.str(_[_.length-1]),c),p):(r&&r.tp$setattr(new Sk.builtin.str(e),c),c)}))}));return o?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},Sk.importModule=function(e,t,n){return Sk.importModuleInternal_(e,t,void 0,void 0,void 0,!1,n)},Sk.importMain=function(e,t,n){return Sk.dateSet=!1,Sk.filesLoaded=!1,Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.resetCompiler(),Sk.importModuleInternal_(e,t,"__main__",void 0,void 0,!1,n)},Sk.importMainWithBody=function(e,t,n,i){return Sk.dateSet=!1,Sk.filesLoaded=!1,Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.resetCompiler(),Sk.importModuleInternal_(e,t,"__main__",n,void 0,!1,i)},Sk.importBuiltinWithBody=function(e,t,n,i){return Sk.importModuleInternal_(e,t,"__builtin__."+e,n,void 0,!1,i)},Sk.builtin.__import__=function(e,t,n,i,r){var s,o=Sk.globals;if(void 0===r&&(r=Sk.__future__.absolute_import?0:-1),0!==r&&t.__package__&&t.__package__!==Sk.builtin.none.none$){if((s=t.__package__.v)&&0=t.length)throw new Sk.builtin.ValueError("Attempted relative import beyond toplevel package");t.length-=r-1,s=t.join(".")}var a=Sk.sysmodules.quick$lookup(new Sk.builtin.str(s))}if(0>1);this.lt(t,e.getitem(s))?r=s:i=s+1}for(Sk.asserts.assert(i===r),s=n;s>i;s--)e.setitem(s,e.getitem(s-1));e.setitem(i,t)}},Sk.builtin.timSort.prototype.count_run=function(e){var t;if(1>=e.len)var n=e.len,i=!1;else if(n=2,this.lt(e.getitem(e.base+1),e.getitem(e.base)))for(i=!0,t=e.base+2;tt.len)){for(this.merge_init(),e=this.merge_compute_minrun(t.len);0r&&(l=r),a+=n,l+=n}else{for(r=n+1;lr&&(l=r),o=n-a,a=n-l,l=o}for(Sk.asserts.assert(-1<=a>1),i(t.getitem(t.base+n),e)?a=n+1:l=n;return Sk.asserts.assert(a==l),l},Sk.builtin.timSort.prototype.merge_init=function(){this.min_gallop=this.MIN_GALLOP,this.pending=[]},Sk.builtin.timSort.prototype.merge_lo=function(e,t){var n,i,r;Sk.asserts.assert(0=s)break}else{if(this.setitem(o,e.popleft()),o++,1==e.len)return;if(i=0,++n>=s)break}for(s+=1;;){for(this.min_gallop=s-=1=e.len)return;if(this.setitem(o,t.popleft()),o++,0===t.len)return;for(i=this.gallop(e.getitem(e.base),t,0,!1),r=t.base;r=s)break}else{if(o--,this.setitem(o,l),t.len--,1==t.len)return;if(n=0,++i>=s)break}}for(s+=1;;){this.min_gallop=s-=1e.base+u-1;r--)o--,this.setitem(o,e.getitem(r));if(e.len-=n,0===e.len)return;if(o--,this.setitem(o,t.popright()),1==t.len)return;for(a=e.getitem(e.base+e.len-1),u=this.gallop(a,t,t.len-1,!1),i=t.len-u,r=t.base+t.len-1;r>t.base+u-1;r--)o--,this.setitem(o,t.getitem(r));if(t.len-=i,1>=t.len)return;if(o--,this.setitem(o,e.popright()),0===e.len)return;if(ne.base-1;r--)o--,this.setitem(o,e.getitem(r));for(r=t.base+t.len-1;r>t.base-1;r--)o--,this.setitem(o,t.getitem(r))}},Sk.builtin.timSort.prototype.merge_at=function(e){0>e&&(e=this.pending.length+e);var t=this.pending[e],n=this.pending[e+1];Sk.asserts.assert(0>=1;return e+t},Sk.builtin.listSlice=function(e,t,n){this.list=e,this.base=t,this.len=n},Sk.builtin.listSlice.prototype.copyitems=function(){var e=this.base,t=this.base+this.len;return Sk.asserts.assert(0<=e<=t),new Sk.builtin.listSlice(new Sk.builtin.list(this.list.v.slice(e,t)),0,this.len)},Sk.builtin.listSlice.prototype.advance=function(e){this.base+=e,this.len-=e,Sk.asserts.assert(this.base<=this.list.sq$length())},Sk.builtin.listSlice.prototype.getitem=function(e){return this.list.v[e]},Sk.builtin.listSlice.prototype.setitem=function(e,t){this.list.v[e]=t},Sk.builtin.listSlice.prototype.popleft=function(){var e=this.list.v[this.base];return this.base++,this.len--,e},Sk.builtin.listSlice.prototype.popright=function(){return this.len--,this.list.v[this.base+this.len]},Sk.builtin.listSlice.prototype.reverse=function(){for(var e,t,n=this.list,i=this.base,r=i+this.len-1;i same as super(__class__, )\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n def meth(self, arg):\n super().meth(arg)\nThis works for class methods too:\nclass C(B):\n @classmethod\n def cmeth(cls, arg):\n super().cmeth(arg)\n",tp$new:Sk.generic.new,tp$init(e,t){if(Sk.abstr.checkNoKwargs("super",t),Sk.abstr.checkArgsLen("super",e,1,2),t=e[0],e=e[1],!Sk.builtin.checkClass(t))throw new Sk.builtin.TypeError("must be type, not "+Sk.abstr.typeName(t));this.obj=e,this.type=t,null!=this.obj&&(this.obj_type=this.$supercheck(t,this.obj))},$r(){return this.obj?new Sk.builtin.str(", <"+Sk.abstr.typeName(this.obj)+" object>>"):new Sk.builtin.str(", NULL>")},tp$getattr(e,t){let n=this.obj_type;if(null==n)return Sk.generic.getAttr.call(this,e,t);var i=n.prototype.tp$mro;const r=i.length;if(e===Sk.builtin.str.$class)return Sk.generic.getAttr.call(this,e,t);let s,o;for(s=0;s+1=r)return Sk.generic.getAttr.call(this,e,t);for(e=e.$mangled;s module\n\nImport a module. Because this function is meant for use by the Python\ninterpreter and not for general use, it is better to use\nimportlib.import_module() to programmatically import a module.\n\nThe globals argument is only used to determine the context;\nthey are not modified. The locals argument is unused. The fromlist\nshould be a list of names to emulate ``from name import ...'', or an\nempty list to emulate ``import name''.\nWhen importing a module from a package, note that __import__('A.B', ...)\nreturns package A when fromlist is empty, but its submodule B when\nfromlist is not empty. The level argument is used to determine whether to\nperform absolute or relative imports: 0 is absolute, while a positive number\nis the number of parent directories to search relative to the current module."},abs:{$meth:Sk.builtin.abs,$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the absolute value of the argument."},all:{$meth:Sk.builtin.all,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for all values x in the iterable.\n\nIf the iterable is empty, return True."},any:{$meth:Sk.builtin.any,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for any x in the iterable.\n\nIf the iterable is empty, return False."},ascii:{$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."},bin:{$meth:Sk.builtin.bin,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the binary representation of an integer.\n\n >>> bin(2796202)\n '0b1010101010101010101010'"},callable:{$meth:Sk.builtin.callable,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return whether the object is callable (i.e., some kind of function).\n\nNote that classes are callable, as are instances of classes with a\n__call__() method."},chr:{$meth:Sk.builtin.chr,$flags:{OneArg:!0},$textsig:"($module, i, /)",$doc:"Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."},delattr:{$meth:Sk.builtin.delattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)",$doc:"Deletes the named attribute from the given object.\n\ndelattr(x, 'y') is equivalent to ``del x.y''"},dir:{$meth:Sk.builtin.dir,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"dir([object]) -> list of strings\n\nIf called without an argument, return the names in the current scope.\nElse, return an alphabetized list of names comprising (some of) the attributes\nof the given object, and of attributes reachable from it.\nIf the object supplies a method named __dir__, it will be used; otherwise\nthe default dir() logic is used and returns:\n for a module object: the module's attributes.\n for a class object: its attributes, and recursively the attributes\n of its bases.\n for any other object: its attributes, its class's attributes, and\n recursively the attributes of its class's base classes."},divmod:{$meth:Sk.builtin.divmod,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return the tuple (x//y, x%y). Invariant: div*y + mod == x."},eval_$rw$:{$name:"eval",$meth:Sk.builtin.eval_,$flags:{MinArgs:1,MaxArgs:3},$textsig:"($module, source, globals=None, locals=None, /)",$doc:"Evaluate the given source in the context of globals and locals.\n\nThe source may be a string representing a Python expression\nor a code object as returned by compile().\nThe globals must be a dictionary and locals can be any mapping,\ndefaulting to the current globals and locals.\nIf only globals is given, locals defaults to it."},format:{$meth:Sk.builtin.format,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, value, format_spec='', /)",$doc:"Return value.__format__(format_spec)\n\nformat_spec defaults to the empty string.\nSee the Format Specification Mini-Language section of help('FORMATTING') for\ndetails."},getattr:{$meth:Sk.builtin.getattr,$flags:{MinArgs:2,MaxArgs:3},$textsig:null,$doc:"getattr(object, name[, default]) -> value\n\nGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\nWhen a default argument is given, it is returned when the attribute doesn't\nexist; without it, an exception is raised in that case."},globals:{$meth:Sk.builtin.globals,$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return the dictionary containing the current scope's global variables.\n\nNOTE: Updates to this dictionary *will* affect name lookups in the current\nglobal scope and vice-versa."},hasattr:{$meth:Sk.builtin.hasattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)",$doc:"Return whether the object has an attribute with the given name.\n\nThis is done by calling getattr(obj, name) and catching AttributeError."},hash:{$meth:Sk.builtin.hash,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the hash value for the given object.\n\nTwo objects that compare equal must also have the same hash value, but the\nreverse is not necessarily true."},hex:{$meth:Sk.builtin.hex,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the hexadecimal representation of an integer.\n\n >>> hex(12648430)\n '0xc0ffee'"},id:{$meth:Sk.builtin.id,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the identity of an object.\n\nThis is guaranteed to be unique among simultaneously existing objects.\n(CPython uses the object's memory address.)"},input:{$meth:Sk.builtin.input,$flags:{MinArgs:0,MaxArgs:1},$textsig:"($module, prompt=None, /)",$doc:"Read a string from standard input. The trailing newline is stripped.\n\nThe prompt string, if given, is printed to standard output without a\ntrailing newline before reading input.\n\nIf the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.\nOn *nix systems, readline is used if available."},isinstance:{$meth:Sk.builtin.isinstance,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, class_or_tuple, /)",$doc:"Return whether an object is an instance of a class or of a subclass thereof.\n\nA tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)\nor ...`` etc."},issubclass:{$meth:Sk.builtin.issubclass,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, cls, class_or_tuple, /)",$doc:"Return whether 'cls' is a derived from another class or is the same class.\n\nA tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)\nor ...`` etc."},iter:{$meth:Sk.builtin.iter,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, iterable /)",$doc:"iter(iterable) -> iterator\niter(callable, sentinel) -> iterator\n\nGet an iterator from an object. In the first form, the argument must\nsupply its own iterator, or be a sequence.\nIn the second form, the callable is called until it returns the sentinel."},len:{$meth:Sk.builtin.len,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the number of items in a container."},locals:{$meth:Sk.builtin.locals,$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return a dictionary containing the current scope's local variables.\n\nNOTE: Whether or not updates to this dictionary will affect name lookups in\nthe local scope and vice-versa is *implementation dependent* and not\ncovered by any backwards compatibility guarantees."},max:{$meth:Sk.builtin.max,$flags:{FastCall:!0},$textsig:null,$doc:"max(iterable, *[, default=obj, key=func]) -> value\nmax(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its biggest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the largest argument."},min:{$meth:Sk.builtin.min,$flags:{FastCall:!0},$textsig:null,$doc:"min(iterable, *[, default=obj, key=func]) -> value\nmin(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its smallest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the smallest argument."},next:{$name:"next",$meth:Sk.builtin.next_,$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"next(iterator[, default])\n\nReturn the next item from the iterator. If default is given and the iterator\nis exhausted, it is returned instead of raising StopIteration."},oct:{$meth:Sk.builtin.oct,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the octal representation of an integer.\n\n >>> oct(342391)\n '0o1234567'"},open:{$meth:Sk.builtin.open,$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"open(name[, mode[, buffering]]) -> file object\n\nOpen a file using the file() type, returns a file object. This is the\npreferred way to open a file. See file.__doc__ for further information."},ord:{$meth:Sk.builtin.ord,$flags:{OneArg:!0},$textsig:"($module, c, /)",$doc:"Return the Unicode code point for a one-character string."},pow:{$meth:Sk.builtin.pow,$flags:{MinArgs:2,MaxArgs:3},$textsig:"($module, x, y, z=None, /)",$doc:"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\n\nSome types, such as ints, are able to use a more efficient algorithm when\ninvoked using the three argument form."},print:{$meth:Sk.builtin.print,$flags:{FastCall:!0},$textsig:null,$doc:"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, or to sys.stdout by default.\nOptional keyword arguments:\nfile: a file-like object (stream); defaults to the current sys.stdout.\nsep: string inserted between values, default a space.\nend: string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream."},repr:{$meth:Sk.builtin.repr,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the canonical string representation of the object.\n\nFor many object types, including most builtins, eval(repr(obj)) == obj."},round:{$meth:Sk.builtin.round,$flags:{NamedArgs:["number","ndigits"]},$textsig:"($module, /, number, ndigits=None)",$doc:"Round a number to a given precision in decimal digits.\n\nThe return value is an integer if ndigits is omitted or None. Otherwise\nthe return value has the same type as the number. ndigits may be negative."},setattr:{$meth:Sk.builtin.setattr,$flags:{MinArgs:3,MaxArgs:3},$textsig:"($module, obj, name, value, /)",$doc:"Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''"},sorted:{$meth:Sk.builtin.sorted,$flags:{NamedArgs:[null,"cmp","key","reverse"],Defaults:[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]},$textsig:"($module, iterable, /, *, key=None, reverse=False)",$doc:"Return a new list containing all items from the iterable in ascending order.\n\nA custom key function can be supplied to customize the sort order, and the\nreverse flag can be set to request the result in descending order."},sum:{$meth:Sk.builtin.sum,$flags:{NamedArgs:[null,"start"],Defaults:[new Sk.builtin.int_(0)]},$textsig:"($module, iterable, /, start=0)",$doc:"Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types."},vars:{$meth:Sk.builtin.vars,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"vars([object]) -> dictionary\n\nWithout arguments, equivalent to locals().\nWith an argument, equivalent to object.__dict__."}}),Sk.setupObjects=function(e){e?(Sk.builtins.filter=Sk.builtin.filter_,Sk.builtins.map=Sk.builtin.map_,Sk.builtins.zip=Sk.builtin.zip_,Sk.builtins.range=Sk.builtin.range_,delete Sk.builtins.xrange,delete Sk.builtins.StandardError,delete Sk.builtins.unicode,delete Sk.builtins.basestring,delete Sk.builtins.long_$rw$,Sk.builtin.int_.prototype.$r=function(){return new Sk.builtin.str(this.v.toString())},delete Sk.builtin.int_.prototype.tp$str,delete Sk.builtin.bool.prototype.tp$str,delete Sk.builtins.raw_input,delete Sk.builtin.str.prototype.decode,Sk.builtins.bytes=Sk.builtin.bytes,Sk.builtins.ascii=new Sk.builtin.sk_method({$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."},null,"builtins")):(Sk.builtins.range=new Sk.builtin.sk_method({$meth:Sk.builtin.range,$name:"range",$flags:{MinArgs:1,MaxArgs:3}},void 0,"builtins"),Sk.builtins.xrange=new Sk.builtin.sk_method({$meth:Sk.builtin.xrange,$name:"xrange",$flags:{MinArgs:1,MaxArgs:3}},null,"builtins"),Sk.builtins.filter=new Sk.builtin.func(Sk.builtin.filter),Sk.builtins.map=new Sk.builtin.func(Sk.builtin.map),Sk.builtins.zip=new Sk.builtin.func(Sk.builtin.zip),Sk.builtins.StandardError=Sk.builtin.Exception,Sk.builtins.unicode=Sk.builtin.str,Sk.builtins.basestring=Sk.builtin.str,Sk.builtins.long_$rw$=Sk.builtin.lng,Sk.builtin.int_.prototype.$r=function(){const e=this.v;return"number"==typeof e?new Sk.builtin.str(e.toString()):new Sk.builtin.str(e.toString()+"L")},Sk.builtin.int_.prototype.tp$str=function(){return new Sk.builtin.str(this.v.toString())},Sk.builtin.bool.prototype.tp$str=function(){return this.$r()},Sk.builtins.raw_input=new Sk.builtin.func(Sk.builtin.raw_input),Sk.builtin.str.prototype.decode=Sk.builtin.str.$py2decode,delete Sk.builtins.bytes,delete Sk.builtins.ascii)},Sk.exportSymbol("Sk.setupObjects",Sk.setupObjects),Sk.exportSymbol("Sk.builtins",Sk.builtins)},function(e,t){Sk.builtin.str.$empty=new Sk.builtin.str(""),Sk.builtin.str.$emptystr=Sk.builtin.str.$empty,Sk.builtin.str.$utf8=new Sk.builtin.str("utf-8"),Sk.builtin.str.$ascii=new Sk.builtin.str("ascii"),Sk.builtin.str.$default_factory=new Sk.builtin.str("default_factory"),Sk.builtin.str.$imag=new Sk.builtin.str("imag"),Sk.builtin.str.$real=new Sk.builtin.str("real"),Sk.builtin.str.$abs=new Sk.builtin.str("__abs__"),Sk.builtin.str.$bytes=new Sk.builtin.str("__bytes__"),Sk.builtin.str.$call=new Sk.builtin.str("__call__"),Sk.builtin.str.$class=new Sk.builtin.str("__class__"),Sk.builtin.str.$cmp=new Sk.builtin.str("__cmp__"),Sk.builtin.str.$complex=new Sk.builtin.str("__complex__"),Sk.builtin.str.$contains=new Sk.builtin.str("__contains__"),Sk.builtin.str.$copy=new Sk.builtin.str("__copy__"),Sk.builtin.str.$dict=new Sk.builtin.str("__dict__"),Sk.builtin.str.$dir=new Sk.builtin.str("__dir__"),Sk.builtin.str.$doc=new Sk.builtin.str("__doc__"),Sk.builtin.str.$enter=new Sk.builtin.str("__enter__"),Sk.builtin.str.$eq=new Sk.builtin.str("__eq__"),Sk.builtin.str.$exit=new Sk.builtin.str("__exit__"),Sk.builtin.str.$index=new Sk.builtin.str("__index__"),Sk.builtin.str.$init=new Sk.builtin.str("__init__"),Sk.builtin.str.$int_=new Sk.builtin.str("__int__"),Sk.builtin.str.$iter=new Sk.builtin.str("__iter__"),Sk.builtin.str.$file=new Sk.builtin.str("__file__"),Sk.builtin.str.$float_=new Sk.builtin.str("__float__"),Sk.builtin.str.$format=new Sk.builtin.str("__format__"),Sk.builtin.str.$ge=new Sk.builtin.str("__ge__"),Sk.builtin.str.$getattr=new Sk.builtin.str("__getattr__"),Sk.builtin.str.$getattribute=new Sk.builtin.str("__getattribute__"),Sk.builtin.str.$getitem=new Sk.builtin.str("__getitem__"),Sk.builtin.str.$gt=new Sk.builtin.str("__gt__"),Sk.builtin.str.$keys=new Sk.builtin.str("keys"),Sk.builtin.str.$le=new Sk.builtin.str("__le__"),Sk.builtin.str.$len=new Sk.builtin.str("__len__"),Sk.builtin.str.$length_hint=new Sk.builtin.str("__length_hint__"),Sk.builtin.str.$loader=new Sk.builtin.str("__loader__"),Sk.builtin.str.$lt=new Sk.builtin.str("__lt__"),Sk.builtin.str.$module=new Sk.builtin.str("__module__"),Sk.builtin.str.$missing=new Sk.builtin.str("__missing__"),Sk.builtin.str.$name=new Sk.builtin.str("__name__"),Sk.builtin.str.$ne=new Sk.builtin.str("__ne__"),Sk.builtin.str.$new=new Sk.builtin.str("__new__"),Sk.builtin.str.$next=new Sk.builtin.str("__next__"),Sk.builtin.str.$path=new Sk.builtin.str("__path__"),Sk.builtin.str.$qualname=new Sk.builtin.str("__qualname__"),Sk.builtin.str.$repr=new Sk.builtin.str("__repr__"),Sk.builtin.str.$reversed=new Sk.builtin.str("__reversed__"),Sk.builtin.str.$round=new Sk.builtin.str("__round__"),Sk.builtin.str.$setattr=new Sk.builtin.str("__setattr__"),Sk.builtin.str.$setitem=new Sk.builtin.str("__setitem__"),Sk.builtin.str.$str=new Sk.builtin.str("__str__"),Sk.builtin.str.$trunc=new Sk.builtin.str("__trunc__"),Sk.builtin.str.$write=new Sk.builtin.str("write"),Sk.misceval.op2method_={Eq:Sk.builtin.str.$eq,NotEq:Sk.builtin.str.$ne,Gt:Sk.builtin.str.$gt,GtE:Sk.builtin.str.$ge,Lt:Sk.builtin.str.$lt,LtE:Sk.builtin.str.$le}}])}).call(this||window)}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var s=t[i]={exports:{}};return e[i].call(s.exports,s,s.exports,n),s.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var i=t.getElementsByTagName("script");if(i.length)for(var r=i.length-1;r>-1&&(!e||!/^http(s?):/.test(e));)e=i[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{"use strict";var e={};n.r(e),n.d(e,{controls_type:()=>Q,controls_typeLists:()=>Z,lists_zip:()=>ee,lists_zip_container:()=>te,lists_zip_item:()=>ne,unpack_iterable_object:()=>ie,variables_change:()=>K,variables_get:()=>q,variables_global:()=>J,variables_set:()=>W});var t={};n.r(t),n.d(t,{base_setup:()=>oe,controls_delay:()=>ae,controls_end_program:()=>le,controls_except:()=>ye,controls_finally:()=>ve,controls_flow_statements:()=>fe,controls_for:()=>_e,controls_forEach:()=>pe,controls_for_range:()=>me,controls_if:()=>ue,controls_if_else:()=>Se,controls_if_elseif:()=>ge,controls_if_if:()=>be,controls_lambda:()=>Ee,controls_main:()=>se,controls_pass:()=>Ie,controls_range:()=>ce,controls_repeat_ext:()=>Te,controls_thread:()=>we,controls_try:()=>ke,controls_try_finally:()=>de,controls_whileUntil:()=>he,datetime_fromtimestamp:()=>Ce,do_while:()=>xe,garbage_collection:()=>Ae,gene_unique_identifier:()=>Re,get_mem_alloc:()=>$e,get_mem_free:()=>Oe,get_unique_identifier:()=>Me});var i={};n.r(i),n.d(i,{base_map:()=>et,generate_cartesian_product:()=>nt,math_arithmetic:()=>Fe,math_bit:()=>je,math_constant:()=>De,math_constant_mp:()=>Pe,math_constrain:()=>ze,math_dec:()=>Ue,math_degree_to_radian:()=>rt,math_indexer_number:()=>We,math_map:()=>qe,math_max_min:()=>Ge,math_number:()=>Le,math_number_base_conversion:()=>Xe,math_radian_to_degree:()=>it,math_random:()=>He,math_random_seed:()=>Ke,math_round:()=>Je,math_selfcalcu:()=>Be,math_to_int:()=>Ye,math_trig:()=>Ve,text_to_number:()=>Qe,text_to_number_skulpt:()=>Ze,turn_to_int:()=>tt});var r={};n.r(r),n.d(r,{ascii_to_char:()=>pt,char_to_ascii:()=>ht,number_to_text:()=>dt,os_system:()=>Ft,text:()=>ot,text_bytes:()=>lt,text_capital:()=>vt,text_center:()=>Tt,text_char:()=>ut,text_char_at:()=>mt,text_char_at2:()=>_t,text_char_at3:()=>Nt,text_compareTo:()=>Rt,text_compare_to:()=>yt,text_create_with_container:()=>Ot,text_create_with_item:()=>Mt,text_encode:()=>Dt,text_equals_starts_ends:()=>kt,text_eval:()=>Pt,text_find:()=>Et,text_format:()=>$t,text_format_noreturn:()=>Lt,text_join:()=>ct,text_join_seq:()=>It,text_length:()=>ft,text_random_char:()=>bt,text_replace:()=>wt,text_split:()=>xt,text_strip:()=>At,text_substring:()=>St,text_substring2:()=>gt,text_substring3:()=>Ct,text_textarea:()=>at});var s={};n.r(s),n.d(s,{ENUMERATE:()=>yn,content_in_lists:()=>Tn,enumerate:()=>vn,list_many_input:()=>ln,list_tolist:()=>hn,list_tolist2:()=>kn,list_trig:()=>sn,lists_2d_get_col_row_data:()=>Yt,lists_2d_get_data_with_col_row:()=>Ut,lists_append_extend:()=>Wt,lists_change_to:()=>an,lists_change_to_general:()=>cn,lists_clear:()=>en,lists_create_with:()=>Gt,lists_create_with2:()=>dn,lists_create_with_container:()=>Ht,lists_create_with_item:()=>zt,lists_create_with_noreturn:()=>un,lists_create_with_text:()=>Xt,lists_create_with_text2:()=>fn,lists_del_general:()=>pn,lists_find:()=>rn,lists_getIndex3:()=>_n,lists_getSublist3:()=>mn,lists_get_index:()=>jt,lists_get_random_item:()=>Kt,lists_get_random_sublist:()=>Jt,lists_get_sublist:()=>Vt,lists_insert_value:()=>Qt,lists_insert_value2:()=>gn,lists_pop:()=>nn,lists_remove_at:()=>tn,lists_remove_at2:()=>Sn,lists_reverse:()=>Zt,lists_setIndex3:()=>bn,lists_set_index:()=>qt,lists_sort:()=>on});var o={};n.r(o),n.d(o,{dicts_add_change_del:()=>Bn,dicts_add_or_change:()=>Mn,dicts_clear:()=>Nn,dicts_create_with:()=>In,dicts_create_with_container:()=>wn,dicts_create_with_item:()=>xn,dicts_create_with_noreturn:()=>Un,dicts_deldict:()=>Fn,dicts_delete:()=>Cn,dicts_get:()=>$n,dicts_get_default:()=>On,dicts_items:()=>Ln,dicts_keys:()=>An,dicts_length:()=>Pn,dicts_pop:()=>jn,dicts_setdefault:()=>Vn,dicts_to_json:()=>Gn,dicts_to_json2:()=>zn,dicts_to_to:()=>Hn,dicts_todict:()=>Yn,dicts_update:()=>Rn,dicts_values:()=>Dn,json_to_dicts:()=>Xn});var a={};n.r(a),n.d(a,{logic_boolean:()=>Zn,logic_compare:()=>Wn,logic_compare_continous:()=>Kn,logic_is:()=>ii,logic_is_in:()=>ni,logic_negate:()=>Qn,logic_null:()=>ei,logic_operation:()=>Jn,logic_tobool:()=>ri,logic_true_or_false:()=>ti});var l={};n.r(l),n.d(l,{sdcard_mount:()=>xi,sdcard_use_spi_init:()=>wi,storage_can_write_ornot:()=>di,storage_change_dir:()=>Ei,storage_close_file:()=>_i,storage_delete_file:()=>bi,storage_file_seek:()=>ki,storage_file_tell:()=>Si,storage_file_write:()=>ui,storage_fileopen:()=>oi,storage_fileopen_new:()=>ai,storage_fileopen_new_encoding:()=>li,storage_get_a_line:()=>hi,storage_get_contents:()=>pi,storage_get_contents_without_para:()=>ci,storage_get_current_dir:()=>yi,storage_get_file_size:()=>gi,storage_get_filename:()=>fi,storage_is_file:()=>Ii,storage_list_all_files:()=>mi,storage_make_dir:()=>vi,storage_open_file_with_os:()=>si,storage_rename:()=>Ti});var u={};n.r(u),n.d(u,{procedures_callnoreturn:()=>Ci,procedures_callreturn:()=>Ri,procedures_defnoreturn:()=>Ai,procedures_defreturn:()=>$i,procedures_ifreturn:()=>Ni,procedures_mutatorarg:()=>Mi,procedures_mutatorcontainer:()=>Oi,procedures_return:()=>Li});var c={};n.r(c),n.d(c,{tuple_change_to:()=>zi,tuple_create_llm_params:()=>nr,tuple_create_with:()=>Pi,tuple_create_with_container:()=>Fi,tuple_create_with_item:()=>Bi,tuple_create_with_noreturn:()=>Ji,tuple_create_with_text2:()=>ji,tuple_create_with_text_return:()=>Vi,tuple_del:()=>Gi,tuple_find:()=>qi,tuple_getIndex:()=>Ui,tuple_getSublist:()=>Ki,tuple_get_random_item:()=>Zi,tuple_get_sublist:()=>Qi,tuple_input:()=>tr,tuple_join:()=>Xi,tuple_length:()=>Yi,tuple_max:()=>Hi,tuple_totuple:()=>er,tuple_trig:()=>Wi});var p={};n.r(p),n.d(p,{set_add_discard:()=>hr,set_clear:()=>ur,set_create_with:()=>rr,set_create_with_container:()=>sr,set_create_with_item:()=>or,set_create_with_text_return:()=>_r,set_length:()=>ar,set_operate:()=>cr,set_operate_update:()=>pr,set_pop:()=>lr,set_sub:()=>dr,set_toset:()=>mr,set_update:()=>fr});var h={};n.r(h),n.d(h,{html_content:()=>yr,html_content_more:()=>vr,html_document:()=>gr,html_form:()=>Er,html_head_body:()=>kr,html_style:()=>Tr,html_style_color:()=>wr,html_style_content:()=>Ir,html_text:()=>xr,html_title:()=>Sr});var d={};n.r(d),n.d(d,{attribute_access:()=>Vr,function_call:()=>Fr,function_call_container:()=>Br,function_call_item:()=>jr,raw_block:()=>Or,raw_empty:()=>Cr,raw_expression:()=>Mr,raw_table:()=>$r,text_comment:()=>Rr,text_print_multiple:()=>Lr,text_print_multiple_container:()=>Dr,text_print_multiple_item:()=>Pr,type_check:()=>Nr});var f={};n.r(f),n.d(f,{array_create:()=>rs,array_toarray:()=>gs,dataframe_create:()=>Xr,dataframe_create_from_index:()=>zr,dataframe_create_from_one_index:()=>Hr,dataframe_get:()=>_s,numpy_trig:()=>hs,pandas_readcsv:()=>fs,pl_axes:()=>es,pl_bar:()=>ls,pl_hist:()=>cs,pl_label:()=>is,pl_legend:()=>ts,pl_pie:()=>us,pl_plot:()=>Qr,pl_plot_bar:()=>ss,pl_plot_easy:()=>Jr,pl_plot_scatter:()=>os,pl_plot_xy:()=>as,pl_savefig:()=>ms,pl_show:()=>Zr,pl_subplot:()=>ds,pl_text:()=>bs,pl_ticks:()=>ps,pl_title:()=>ns,plot_axes:()=>vs,plot_bar:()=>$s,plot_hist:()=>Ms,plot_label:()=>Is,plot_legend:()=>Ts,plot_pie:()=>Os,plot_plot:()=>ks,plot_plot_bar:()=>ws,plot_plot_easy:()=>Ss,plot_plot_scatter:()=>xs,plot_plot_xy:()=>As,plot_savefig:()=>Ns,plot_show:()=>ys,plot_subplot:()=>Rs,plot_text:()=>Ls,plot_ticks:()=>Cs,plot_title:()=>Es,series_create:()=>Yr,series_create_from_index:()=>Gr,series_create_from_text:()=>qr,series_get_num:()=>Kr,series_index_value:()=>Wr});var _={};n.r(_),n.d(_,{inout_input:()=>Ps,inout_print:()=>Fs,inout_print_container:()=>Ys,inout_print_end:()=>js,inout_print_inline:()=>Bs,inout_print_item:()=>Gs,inout_print_many:()=>Us,inout_type_input:()=>Vs});var m={};n.r(m),n.d(m,{Panic_with_status_code:()=>Ws,base_delay:()=>Hs,controls_millis:()=>zs,controls_mstimer2:()=>Js,controls_mstimer2_start:()=>Qs,controls_mstimer2_stop:()=>Zs,reset:()=>Ks,time_localtime:()=>qs,time_sleep:()=>eo});var b={};n.r(b),n.d(b,{turtle_bgcolor:()=>vo,turtle_bgcolor_hex:()=>Mo,turtle_bgcolor_hex_new:()=>wo,turtle_circle:()=>So,turtle_circle_advanced:()=>ko,turtle_clear:()=>ho,turtle_clone:()=>Io,turtle_color:()=>$o,turtle_color_hex:()=>Oo,turtle_color_seclet:()=>Vo,turtle_create:()=>no,turtle_done:()=>io,turtle_exitonclick:()=>ro,turtle_fill:()=>_o,turtle_fillcolor:()=>Eo,turtle_fillcolor_hex:()=>Ro,turtle_fillcolor_hex_new:()=>Ao,turtle_getscreen:()=>Uo,turtle_goto:()=>uo,turtle_listen:()=>Ho,turtle_move:()=>so,turtle_numinput:()=>Do,turtle_onclick:()=>Go,turtle_onkey:()=>Yo,turtle_ontimer:()=>Xo,turtle_pencolor:()=>To,turtle_pencolor_hex:()=>Co,turtle_pencolor_hex_new:()=>xo,turtle_penup:()=>fo,turtle_pos_shape:()=>po,turtle_rotate:()=>oo,turtle_screen_delay:()=>lo,turtle_screen_savefig:()=>zo,turtle_setheading:()=>ao,turtle_setxy:()=>co,turtle_shape:()=>No,turtle_shapesize:()=>Lo,turtle_size:()=>bo,turtle_size_speed:()=>mo,turtle_speed:()=>go,turtle_stamp:()=>qo,turtle_textinput:()=>Po,turtle_visible:()=>yo,turtle_write:()=>Fo,turtle_write_format:()=>Bo,turtle_write_format_skulpt:()=>jo});var g={};n.r(g),n.d(g,{Turn:()=>ra,addOil:()=>ka,game_get_character_img:()=>ha,game_get_local_img:()=>la,game_get_path_img:()=>ca,game_init:()=>na,get_actor_point:()=>fa,initSettedMap_1:()=>Wo,initSettedMap_2:()=>Ko,initSettedMap_3:()=>Jo,initSettedMap_4:()=>Qo,initSettedMap_5:()=>Zo,initSettedMap_6:()=>ea,initSettedMap_7:()=>ta,initialize:()=>da,isBarrier:()=>_a,isCirculationRight:()=>ya,isDone:()=>sa,isLightGreen:()=>ga,isLightRed:()=>Sa,isOilFull:()=>ba,isPath:()=>oa,move_direction_steps:()=>ia,place_item:()=>pa,randomOil:()=>ma,set_map:()=>aa,set_pathtype:()=>ua});var S={};n.r(S),n.d(S,{controls_type:()=>wa,controls_typeLists:()=>xa,lists_zip:()=>Aa,unpack_iterable_object:()=>$a,variables_change:()=>Ea,variables_get:()=>va,variables_global:()=>Ia,variables_set:()=>Ta});var k={};n.r(k),n.d(k,{Panic_with_status_code:()=>Ba,base_setup:()=>Ma,controls_delay:()=>Fa,controls_flow_statements:()=>Pa,controls_for:()=>Na,controls_forEach:()=>Ga,controls_for_range:()=>La,controls_if:()=>Ca,controls_interrupts:()=>Ua,controls_lambda:()=>Ha,controls_main:()=>Oa,controls_millis:()=>ja,controls_nointerrupts:()=>Ya,controls_pass:()=>qa,controls_range:()=>Xa,controls_repeat:()=>nl,controls_repeat_ext:()=>Ja,controls_thread:()=>Wa,controls_try_finally:()=>Ra,controls_whileUntil:()=>Da,datetime_fromtimestamp:()=>il,do_while:()=>Ka,garbage_collection:()=>Qa,gene_unique_identifier:()=>rl,get_mem_alloc:()=>Za,get_mem_free:()=>el,get_unique_identifier:()=>tl,reset:()=>Va,time_sleep:()=>za});var y={};n.r(y),n.d(y,{base_map:()=>Il,generate_cartesian_product:()=>xl,math_arithmetic:()=>ul,math_bit:()=>ll,math_constant:()=>ol,math_constant_mp:()=>al,math_constrain:()=>gl,math_dec:()=>dl,math_degree_to_radian:()=>$l,math_indexer_number:()=>yl,math_map:()=>bl,math_max_min:()=>_l,math_number:()=>sl,math_number_base_conversion:()=>Sl,math_radian_to_degree:()=>Al,math_random:()=>ml,math_random_seed:()=>kl,math_round:()=>vl,math_selfcalcu:()=>cl,math_single:()=>pl,math_to_int:()=>fl,math_trig:()=>hl,text_to_number:()=>Tl,text_to_number_skulpt:()=>El,turn_to_int:()=>wl});var v={};n.r(v),n.d(v,{ascii_to_char:()=>Ll,char_to_ascii:()=>Dl,number_to_text:()=>Pl,os_system:()=>ou,text:()=>Ol,text_bytes:()=>Cl,text_capital:()=>Hl,text_center:()=>zl,text_char:()=>Rl,text_char_at:()=>jl,text_char_at2:()=>Bl,text_char_at3:()=>iu,text_compareTo:()=>nu,text_compare_to:()=>Yl,text_encode:()=>ru,text_equals_starts_ends:()=>Ul,text_eval:()=>su,text_find:()=>ql,text_format:()=>Zl,text_format_noreturn:()=>eu,text_join:()=>Nl,text_join_seq:()=>Wl,text_length:()=>Fl,text_random_char:()=>Vl,text_replace:()=>Kl,text_split:()=>Jl,text_strip:()=>Ql,text_substring:()=>Xl,text_substring2:()=>Gl,text_substring3:()=>tu,text_textarea:()=>Ml});var T={};n.r(T),n.d(T,{content_in_lists:()=>ju,enumerate:()=>Bu,list_many_input:()=>wu,list_tolist:()=>Pu,list_tolist2:()=>Fu,list_trig:()=>Tu,lists_2d_get_col_row_data:()=>uu,lists_2d_get_data_with_col_row:()=>lu,lists_append_extend:()=>fu,lists_change_to:()=>Iu,lists_change_to_general:()=>Au,lists_clear:()=>Su,lists_create_with:()=>cu,lists_create_with2:()=>Ou,lists_create_with_noreturn:()=>xu,lists_create_with_text:()=>pu,lists_create_with_text2:()=>Mu,lists_del_general:()=>$u,lists_find:()=>ku,lists_getIndex3:()=>Cu,lists_getSublist3:()=>Ru,lists_get_index:()=>hu,lists_get_random_item:()=>_u,lists_get_random_sublist:()=>mu,lists_get_sublist:()=>au,lists_insert_value:()=>bu,lists_insert_value2:()=>Lu,lists_pop:()=>vu,lists_remove_at:()=>yu,lists_remove_at2:()=>Du,lists_reverse:()=>gu,lists_setIndex3:()=>Nu,lists_set_index:()=>du,lists_sort:()=>Eu});var E={};n.r(E),n.d(E,{dicts_add_change_del:()=>Zu,dicts_add_or_change:()=>Xu,dicts_clear:()=>qu,dicts_create_with:()=>Vu,dicts_create_with_noreturn:()=>nc,dicts_deldict:()=>Qu,dicts_delete:()=>Hu,dicts_get:()=>Yu,dicts_get_default:()=>Gu,dicts_items:()=>Wu,dicts_keys:()=>Uu,dicts_length:()=>Ju,dicts_pop:()=>ec,dicts_setdefault:()=>tc,dicts_to_json:()=>rc,dicts_to_json2:()=>ac,dicts_to_to:()=>oc,dicts_todict:()=>ic,dicts_update:()=>zu,dicts_values:()=>Ku,json_to_dicts:()=>sc});var I={};n.r(I),n.d(I,{logic_boolean:()=>hc,logic_compare:()=>lc,logic_compare_continous:()=>uc,logic_is:()=>mc,logic_is_in:()=>_c,logic_negate:()=>pc,logic_null:()=>dc,logic_operation:()=>cc,logic_tobool:()=>bc,logic_true_or_false:()=>fc});var w={};n.r(w),n.d(w,{sdcard_mount:()=>jc,sdcard_use_spi_init:()=>Bc,storage_can_write_ornot:()=>wc,storage_change_dir:()=>Nc,storage_close_file:()=>Ac,storage_delete_file:()=>Oc,storage_file_seek:()=>Rc,storage_file_tell:()=>Cc,storage_file_write:()=>vc,storage_fileopen:()=>Sc,storage_fileopen_new:()=>kc,storage_fileopen_new_encoding:()=>yc,storage_get_a_line:()=>Ic,storage_get_contents:()=>Ec,storage_get_contents_without_para:()=>Tc,storage_get_current_dir:()=>Lc,storage_get_file_size:()=>Mc,storage_get_filename:()=>xc,storage_is_file:()=>Fc,storage_list_all_files:()=>$c,storage_make_dir:()=>Dc,storage_open_file_with_os:()=>gc,storage_rename:()=>Pc});var x={};n.r(x),n.d(x,{procedures_callnoreturn:()=>Gc,procedures_callreturn:()=>Yc,procedures_defnoreturn:()=>Uc,procedures_defreturn:()=>Vc,procedures_ifreturn:()=>Xc,procedures_return:()=>Hc});var A={};n.r(A),n.d(A,{tuple_change_to:()=>tp,tuple_create_llm_params:()=>cp,tuple_create_with:()=>zc,tuple_create_with_noreturn:()=>sp,tuple_create_with_text2:()=>qc,tuple_create_with_text_return:()=>Wc,tuple_del:()=>Qc,tuple_find:()=>np,tuple_getIndex:()=>Kc,tuple_getSublist:()=>rp,tuple_get_random_item:()=>ap,tuple_get_sublist:()=>op,tuple_input:()=>up,tuple_join:()=>Zc,tuple_length:()=>Jc,tuple_max:()=>ep,tuple_totuple:()=>lp,tuple_trig:()=>ip});var O={};n.r(O),n.d(O,{set_add_discard:()=>bp,set_clear:()=>fp,set_create_with:()=>pp,set_create_with_text_return:()=>kp,set_length:()=>hp,set_operate:()=>_p,set_operate_update:()=>mp,set_pop:()=>dp,set_sub:()=>gp,set_toset:()=>yp,set_update:()=>Sp});var M={};n.r(M),n.d(M,{html_content:()=>Ip,html_content_more:()=>wp,html_document:()=>vp,html_form:()=>Ap,html_head_body:()=>Ep,html_style:()=>xp,html_style_content:()=>$p,html_text:()=>Op,html_title:()=>Tp});var C={};n.r(C),n.d(C,{attribute_access:()=>Pp,function_call:()=>Dp,raw_block:()=>Mp,raw_empty:()=>Rp,raw_expression:()=>Cp,raw_table:()=>Np,type_check:()=>Lp});var R={};n.r(R),n.d(R,{array_create:()=>Zp,array_toarray:()=>dh,dataframe_create:()=>jp,dataframe_create_from_index:()=>Vp,dataframe_create_from_one_index:()=>Up,dataframe_get:()=>ch,numpy_trig:()=>ah,pandas_readcsv:()=>uh,pl_axes:()=>zp,pl_bar:()=>ih,pl_hist:()=>sh,pl_label:()=>Qp,pl_legend:()=>Kp,pl_pie:()=>rh,pl_plot:()=>Wp,pl_plot_bar:()=>eh,pl_plot_easy:()=>qp,pl_plot_scatter:()=>th,pl_plot_xy:()=>nh,pl_savefig:()=>ph,pl_show:()=>Hp,pl_subplot:()=>lh,pl_text:()=>hh,pl_ticks:()=>oh,pl_title:()=>Jp,plot_axes:()=>_h,plot_bar:()=>Eh,plot_hist:()=>wh,plot_label:()=>kh,plot_legend:()=>gh,plot_pie:()=>Ih,plot_plot:()=>bh,plot_plot_bar:()=>yh,plot_plot_easy:()=>mh,plot_plot_scatter:()=>vh,plot_plot_xy:()=>Th,plot_savefig:()=>$h,plot_show:()=>fh,plot_subplot:()=>Ah,plot_text:()=>Oh,plot_ticks:()=>xh,plot_title:()=>Sh,series_create:()=>Fp,series_create_from_index:()=>Bp,series_create_from_text:()=>Yp,series_get_num:()=>Xp,series_index_value:()=>Gp});var N={};n.r(N),n.d(N,{inout_input:()=>Mh,inout_print:()=>Ch,inout_print_end:()=>Nh,inout_print_inline:()=>Rh,inout_print_many:()=>Dh,inout_type_input:()=>Lh});var L={};n.r(L),n.d(L,{controls_end_program:()=>Fh,controls_millis:()=>Ph,time_localtime:()=>Bh});var D={};n.r(D),n.d(D,{turtle_bgcolor:()=>sd,turtle_bgcolor_hex:()=>ud,turtle_bgcolor_hex_new:()=>hd,turtle_circle:()=>td,turtle_circle_advanced:()=>id,turtle_clear:()=>Wh,turtle_clone:()=>ld,turtle_color:()=>md,turtle_color_hex:()=>_d,turtle_color_seclet:()=>Ed,turtle_create:()=>jh,turtle_done:()=>Vh,turtle_exitonclick:()=>Uh,turtle_fill:()=>Jh,turtle_fillcolor:()=>ad,turtle_fillcolor_hex:()=>pd,turtle_fillcolor_hex_new:()=>fd,turtle_getscreen:()=>Id,turtle_goto:()=>zh,turtle_listen:()=>$d,turtle_move:()=>Yh,turtle_numinput:()=>kd,turtle_onclick:()=>xd,turtle_onkey:()=>wd,turtle_ontimer:()=>Ad,turtle_pencolor:()=>od,turtle_pencolor_hex:()=>cd,turtle_pencolor_hex_new:()=>dd,turtle_penup:()=>Kh,turtle_pos_shape:()=>qh,turtle_rotate:()=>Gh,turtle_screen_delay:()=>Hh,turtle_screen_savefig:()=>Od,turtle_setheading:()=>Xh,turtle_setxy:()=>nd,turtle_shape:()=>bd,turtle_shapesize:()=>gd,turtle_size:()=>Zh,turtle_size_speed:()=>Qh,turtle_speed:()=>ed,turtle_stamp:()=>Md,turtle_textinput:()=>Sd,turtle_visible:()=>rd,turtle_write:()=>yd,turtle_write_format:()=>vd,turtle_write_format_skulpt:()=>Td});var P={};n.r(P),n.d(P,{Turn:()=>Vd,addOil:()=>rf,game_get_character_img:()=>zd,game_get_local_img:()=>Xd,game_get_path_img:()=>Kd,game_init:()=>Cd,get_actor_point:()=>Gd,initSettedMap_1:()=>Nd,initSettedMap_2:()=>Ld,initSettedMap_3:()=>Dd,initSettedMap_4:()=>Pd,initSettedMap_5:()=>Fd,initSettedMap_6:()=>Bd,initSettedMap_7:()=>jd,initialize:()=>qd,isBarrier:()=>Qd,isCirculationRight:()=>sf,isDone:()=>Ud,isLightGreen:()=>tf,isLightRed:()=>nf,isOilFull:()=>ef,isPath:()=>Yd,move_direction_steps:()=>Rd,place_item:()=>Wd,randomOil:()=>Zd,set_map:()=>Hd,set_pathtype:()=>Jd});const F=Blockly,B=Mixly,j={NAME_TYPE:"VARIABLE",allVariables:function(e){var t;if(e.getDescendants)t=e.getDescendants();else{if(!e.getAllBlocks)throw"Not Block or Workspace: "+e;t=e.getAllBlocks()}for(var n=Object.create(null),i=0;i1&&(o+=i)):n=o}else n="i";return n}},V=j,U={};U.NAME_TYPE=F.PROCEDURE_CATEGORY_NAME,U.allProcedures=function(e){for(var t=e.getAllBlocks(!1),n=[],i=[],r=0;r0?t.join("\n")+n.join("\n")+i.join("\n")+o.join("\n")+a.join("")+e+"while True:\n"+l.join("")+u.join("\n"):t.join("\n")+n.join("\n")+i.join("\n")+o.join("\n")+a.join("")+e+u.join("\n")},H.scrubNakedValue=function(e){return e+"\n"},H.quote_=function(e){var t="'";return-1!==e.indexOf("'")&&(-1===e.indexOf('"')?t='"':e=e.replace(/'/g,"\\'")),t+e+t},H.multiline_quote_=function(e){return"'''"+(e=e.replace(/'''/g,"\\'\\'\\'"))+"'''"},H.scrub_=function(e,t,n){var i="";if(!e.outputConnection||!e.outputConnection.targetConnection){(s=e.getCommentText())&&(s=F.utils.string.wrap(s,H.COMMENT_WRAP-3),i+=H.prefixLines(s+"\n","# "));for(var r=0;r0?"int("+a+" + "+r+")":r<0?"int("+a+" - "+-r+")":"int("+a+")",i&&(a="-"+a)),a};const z=330,q={init:function(){this.setColour(z),this.appendDummyInput().appendField(new F.FieldTextInput(""),"VAR"),this.setOutput(!0),this.setTooltip(F.Msg.VARIABLES_GET_TOOLTIP)},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){X.equals(e,this.getFieldValue("VAR"))&&this.setFieldValue(t,"VAR")}},W={init:function(){this.setColour(z),this.appendValueInput("VALUE").appendField(new F.FieldTextInput(""),"VAR").appendField(F.Msg.MIXLY_VALUE2),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.VARIABLES_SET_TOOLTIP)},getVars:function(){var e=this.getFieldValue("VAR");return null==e?[]:e.split(",")},renameVar:function(e,t){X.equals(e,this.getFieldValue("VAR"))&&this.setFieldValue(t,"VAR")}},K={init:function(){this.setColour(z);var e=[[F.Msg.LANG_MATH_INT,"int"],[F.Msg.LANG_MATH_FLOAT,"float"],[F.Msg.LANG_MATH_BOOLEAN,"bool"],[F.Msg.LANG_MATH_STRING,"str"],[F.Msg.MIXLY_MICROBIT_TYPE_LIST,"list"],[F.Msg.MIXLY_MICROBIT_TYPE_TUPLE,"tuple"],[F.Msg.MIXLY_MICROBIT_TYPE_DICT,"dict"],[F.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD,"set"],[F.Msg.LANG_MATH_BYTE,"bytes"]];this.appendValueInput("MYVALUE").appendField(new F.FieldDropdown(e),"OP"),this.setOutput(!0)}},J={init:function(){this.setColour(z),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_PYTHON_GLOBAL).setCheck("var"),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setTooltip(F.Msg.TEXT_PRINT_TOOLTIP)}},Q={init:function(){this.setColour(z),this.appendValueInput("DATA").appendField(F.Msg.MICROBIT_PYTHON_TYPE),this.setOutput(!0),this.setTooltip(F.Msg.MICROBIT_PYTHON_TYPE)}},Z={init:function(){this.setColour(z),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_CONTORL_GET_TYPE).appendField(new F.FieldDropdown([[F.Msg.LANG_MATH_INT,"int"],[F.Msg.MIXLY_MICROBIT_TYPE_FLOAT,"float"],[F.Msg.MIXLY_MICROBIT_TYPE_STRING,"str"],[F.Msg.MIXLY_MICROBIT_TYPE_LIST,"list"],[F.Msg.MIXLY_MICROBIT_TYPE_TUPLE,"tuple"],[F.Msg.MIXLY_MICROBIT_TYPE_DICT,"dict"],[F.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD,"set"],[F.Msg.LANG_MATH_BYTE,"bytes"],[F.Msg.LOGIC_NULL,"type(None)"]]),"type"),this.setInputsInline(!0),this.setOutput(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("type");return F.Msg.MICROBIT_controls_TypeLists+{int:F.Msg.LANG_MATH_INT,float:F.Msg.MIXLY_MICROBIT_TYPE_FLOAT,str:F.Msg.MIXLY_MICROBIT_TYPE_STRING,list:F.Msg.MIXLY_MICROBIT_TYPE_LIST,tuple:F.Msg.MIXLY_MICROBIT_TYPE_TUPLE,dict:F.Msg.MIXLY_MICROBIT_TYPE_DICT,set:F.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD,image:F.Msg.MIXLY_MICROBIT_IMAGE,bytes:F.Msg.LANG_MATH_BYTE,NoneType:F.Msg.LOGIC_NULL}[t]}))}},ee={init:function(){this.setColour(z),this.itemCount_=2,this.updateShape_(),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,"List"),this.setMutator(new F.icons.MutatorIcon(["lists_zip_item"],this)),this.setTooltip(F.Msg.MIXLY_PYTHON_LISTS_ZIP_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=e.newBlock("lists_zip_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;i0;r--)t.getInputTargetBlock("IF"+r)&&t.getInputTargetBlock("IF"+r).previousConnection?n[r]=t.getInputTargetBlock("IF"+r).previousConnection:n[r]=null,this.removeInput("IF"+r),t.getInputTargetBlock("DO"+r)&&t.getInputTargetBlock("DO"+r).previousConnection?i[r]=t.getInputTargetBlock("DO"+r).previousConnection:i[r]=null,this.removeInput("DO"+r);this.elseifCount_=parseInt(e.getAttribute("elseif"),10),this.elseCount_=parseInt(e.getAttribute("else"),10);for(r=1;r<=this.elseifCount_;r++)this.appendValueInput("IF"+r).setCheck([Boolean,Number]).appendField(F.Msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+r).appendField(F.Msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(F.Msg.CONTROLS_IF_MSG_ELSE);for(r=n.length-2;r>0;r--)n[r]&&n[r].reconnect(this,"IF"+r);for(r=i.length-2;r>0;r--)i[r]&&i[r].reconnect(this,"DO"+r)},decompose:function(e){var t=e.newBlock("controls_if_if");t.initSvg();for(var n=t.getInput("STACK").connection,i=1;i<=this.elseifCount_;i++){var r=e.newBlock("controls_if_elseif");r.initSvg(),n.connect(r.previousConnection),n=r.nextConnection}if(this.elseCount_){var s=e.newBlock("controls_if_else");s.initSvg(),n.connect(s.previousConnection)}return t},compose:function(e){this.elseCount_&&this.removeInput("ELSE"),this.elseCount_=0;for(var t=this.elseifCount_;t>0;t--)this.removeInput("IF"+t),this.removeInput("DO"+t);this.elseifCount_=0;for(var n=e.getInputTargetBlock("STACK"),i=[null],r=[null],s=null;n;){switch(n.type){case"controls_if_elseif":this.elseifCount_++,i.push(n.valueConnection_),r.push(n.statementConnection_);break;case"controls_if_else":this.elseCount_++,s=n.statementConnection_;break;default:throw Error("Unknown block type: "+n.type)}n=n.nextConnection&&n.nextConnection.targetBlock()}this.updateShape_(),this.reconnectChildBlocks_(i,r,s)},saveConnections:function(e){for(var t=e.getInputTargetBlock("STACK"),n=1;t;){switch(t.type){case"controls_if_elseif":var i=this.getInput("IF"+n),r=this.getInput("DO"+n);t.valueConnection_=i&&i.connection.targetConnection,t.statementConnection_=r&&r.connection.targetConnection,n++;break;case"controls_if_else":r=this.getInput("ELSE");t.statementConnection_=r&&r.connection.targetConnection;break;default:throw"Unknown block type."}t=t.nextConnection&&t.nextConnection.targetBlock()}},rebuildShape_:function(){var e=[null],t=[null],n=null;this.getInput("ELSE")&&(n=this.getInput("ELSE").connection.targetConnection);for(var i=1;this.getInput("IF"+i);){var r=this.getInput("IF"+i),s=this.getInput("DO"+i);console.log(r.connection.targetConnection),e.push(r.connection.targetConnection),t.push(s.connection.targetConnection),i++}this.updateShape_(),this.reconnectChildBlocks_(e,t,n)},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var e=1;this.getInput("IF"+e);)this.removeInput("IF"+e),this.removeInput("DO"+e),e++;for(e=1;e<=this.elseifCount_;e++)this.appendValueInput("IF"+e).setCheck([Number,Boolean]).appendField(F.Msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+e).appendField(F.Msg.CONTROLS_IF_MSG_THEN);this.elseCount_&&this.appendStatementInput("ELSE").appendField(F.Msg.CONTROLS_IF_MSG_ELSE)},reconnectChildBlocks_:function(e,t,n){for(var i=1;i<=this.elseifCount_;i++)e[i]&&e[i].reconnect(this,"IF"+i),t[i]&&t[i].reconnect(this,"DO"+i);n&&n.reconnect(this,"ELSE")}},ce={init:function(){this.setColour(re),this.appendValueInput("FROM").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.PYTHON_RANGE).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_FROM),this.appendValueInput("TO").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_TO),this.appendValueInput("STEP").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.PYTHON_RANGE_STEP),this.setInputsInline(!0),this.setOutput(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP)}},pe={init:function(){this.setColour(re),this.appendValueInput("LIST").setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.CONTROLS_FOREACH_INPUT),this.appendValueInput("VAR").appendField(F.Msg.CONTROLS_FOREACH_INPUT_ITEM),this.appendStatementInput("DO").appendField(F.Msg.MIXLY_DO),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0),this.setTooltip((function(){return F.Msg.CONTROLS_FOR_TOOLTIP.replace("“%1”","")}))},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},he={init:function(){this.setColour(re),this.appendValueInput("BOOL").setCheck([Boolean,Number]).appendField(F.Msg.MIXLY_MICROBIT_JS_CURRENT).appendField(new F.FieldDropdown(this.OPERATORS),"MODE"),this.appendStatementInput("DO").appendField(F.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT+F.Msg.MIXLY_DO),this.setPreviousStatement(!0),this.setNextStatement(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE");return{WHILE:F.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,UNTIL:F.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}[t]}))}},de={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_TRY),this.appendStatementInput("try"),this.appendValueInput("IF1").appendField(F.Msg.MIXLY_PYTHON_EXCEPT),this.appendStatementInput("DO1").appendField(""),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setMutator(new F.icons.MutatorIcon(["controls_except","controls_finally"],this)),this.setTooltip(F.Msg.MIXLY_MIXPY_CONTROL_TRY_TOOLTIP),this.elseifCount_=1,this.elseCount_=0},mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;var e=document.createElement("mutation");return this.elseifCount_&&e.setAttribute("elseif",this.elseifCount_),this.elseCount_&&e.setAttribute("else",1),e},domToMutation:function(e){var t=this,n=[],i=[];this.elseCount_&&this.removeInput("ELSE");for(var r=this.elseifCount_;r>0;r--)t.getInputTargetBlock("IF"+r)&&t.getInputTargetBlock("IF"+r).previousConnection?n[r]=t.getInputTargetBlock("IF"+r).previousConnection:n[r]=null,this.removeInput("IF"+r),t.getInputTargetBlock("DO"+r)&&t.getInputTargetBlock("DO"+r).previousConnection?i[r]=t.getInputTargetBlock("DO"+r).previousConnection:i[r]=null,this.removeInput("DO"+r);this.elseifCount_=parseInt(e.getAttribute("elseif"),10),this.elseCount_=parseInt(e.getAttribute("else"),10);for(r=1;r<=this.elseifCount_;r++)this.appendValueInput("IF"+r).setCheck([Boolean,Number]).appendField(F.Msg.MIXLY_PYTHON_EXCEPT),this.appendStatementInput("DO"+r).appendField("");this.elseCount_&&this.appendStatementInput("ELSE").appendField(F.Msg.MIXLY_PYTHON_FINALLY);for(r=n.length-2;r>0;r--)n[r]&&n[r].reconnect(this,"IF"+r);for(r=i.length-2;r>0;r--)i[r]&&i[r].reconnect(this,"DO"+r)},decompose:function(e){var t=e.newBlock("controls_try");t.initSvg();for(var n=t.getInput("STACK").connection,i=1;i<=this.elseifCount_;i++){var r=e.newBlock("controls_except");r.initSvg(),n.connect(r.previousConnection),n=r.nextConnection}if(this.elseCount_){var s=e.newBlock("controls_finally");s.initSvg(),n.connect(s.previousConnection)}return t},compose:function(e){this.elseCount_&&this.removeInput("ELSE"),this.elseCount_=0;for(var t=this.elseifCount_;t>0;t--)this.removeInput("IF"+t),this.removeInput("DO"+t);this.elseifCount_=0;for(var n=e.getInputTargetBlock("STACK"),i=[null],r=[null],s=null;n;){switch(n.type){case"controls_except":this.elseifCount_++,i.push(n.valueConnection_),r.push(n.statementConnection_);break;case"controls_finally":this.elseCount_++,s=n.statementConnection_;break;default:throw Error("Unknown block type: "+n.type)}n=n.nextConnection&&n.nextConnection.targetBlock()}this.updateShape_(),this.reconnectChildBlocks_(i,r,s)},saveConnections:function(e){for(var t=e.getInputTargetBlock("STACK"),n=1;t;){switch(t.type){case"controls_except":var i=this.getInput("IF"+n),r=this.getInput("DO"+n);t.valueConnection_=i&&i.connection.targetConnection,t.statementConnection_=r&&r.connection.targetConnection,n++;break;case"controls_finally":r=this.getInput("ELSE");t.statementConnection_=r&&r.connection.targetConnection;break;default:throw"Unknown block type."}t=t.nextConnection&&t.nextConnection.targetBlock()}},rebuildShape_:function(){var e=[null],t=[null],n=null;this.getInput("ELSE")&&(n=this.getInput("ELSE").connection.targetConnection);for(var i=1;this.getInput("IF"+i);){var r=this.getInput("IF"+i),s=this.getInput("DO"+i);console.log(r.connection.targetConnection),e.push(r.connection.targetConnection),t.push(s.connection.targetConnection),i++}this.updateShape_(),this.reconnectChildBlocks_(e,t,n)},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var e=1;this.getInput("IF"+e);)this.removeInput("IF"+e),this.removeInput("DO"+e),e++;for(e=1;e<=this.elseifCount_;e++)this.appendValueInput("IF"+e).setCheck([Number,Boolean]).appendField(F.Msg.MIXLY_PYTHON_EXCEPT),this.appendStatementInput("DO"+e).appendField("");this.elseCount_&&this.appendStatementInput("ELSE").appendField(F.Msg.MIXLY_PYTHON_FINALLY)},reconnectChildBlocks_:function(e,t,n){for(var i=1;i<=this.elseifCount_;i++)e[i]&&e[i].reconnect(this,"IF"+i),t[i]&&t[i].reconnect(this,"DO"+i);n&&n.reconnect(this,"ELSE")}},fe={init:function(){this.setColour(re);var e=new F.FieldDropdown(this.OPERATORS);this.appendDummyInput().appendField(e,"FLOW").appendField(F.Msg.LANG_CONTROLS_FLOW_STATEMENTS_INPUT_OFLOOP),this.setPreviousStatement(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_FLOW_STATEMENTS_TOOLTIP);var t=this;this.setTooltip((function(){var e=t.getFieldValue("FLOW");return{BREAK:F.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK,CONTINUE:F.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}[e]}))},onchange:function(){if(this.workspace){var e=!1,t=this;do{if("controls_repeat"==t.type||"controls_for"==t.type||"controls_forEach"==t.type||"controls_repeat_ext"==t.type||"controls_whileUntil"==t.type||"do_while"==t.type){e=!0;break}t=t.getSurroundParent()}while(t);e?this.setWarningText(null):this.setWarningText(F.Msg.LANG_CONTROLS_FLOW_STATEMENTS_WARNING)}}},_e={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_WITH).appendField(new F.FieldTextInput("i"),"VAR"),this.appendValueInput("FROM").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_FROM),this.appendValueInput("TO").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_TO),this.appendValueInput("STEP").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.MIXLY_STEP),this.appendStatementInput("DO").appendField(F.Msg.MIXLY_DO),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0);var e=this;this.setTooltip((function(){return F.Msg.CONTROLS_FOR_TOOLTIP.replace("%1",e.getFieldValue("VAR"))}))},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},me={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_WITH).appendField(new F.FieldTextInput("i"),"VAR"),this.appendValueInput("FROM").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_FROM),this.appendValueInput("TO").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_TO),this.appendValueInput("STEP").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.MIXLY_STEP),this.appendStatementInput("DO").appendField(F.Msg.MIXLY_DO),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0);var e=this;this.setTooltip((function(){return F.Msg.MIXLY_PYTHON_CONTROLS_FOR_RANGE_TOOLTIP.replace("%1",e.getFieldValue("VAR"))}))},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}};he.OPERATORS=[[F.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE,"WHILE"],[F.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL,"UNTIL"]],fe.OPERATORS=[[F.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK,"BREAK"],[F.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE,"CONTINUE"]];const be={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.CONTROLS_IF_IF_TITLE_IF),this.appendStatementInput("STACK"),this.setTooltip(F.Msg.CONTROLS_IF_IF_TOOLTIP),this.contextMenu=!1}},ge={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.CONTROLS_IF_ELSEIF_TOOLTIP),this.contextMenu=!1}},Se={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.CONTROLS_IF_ELSE_TITLE_ELSE),this.setPreviousStatement(!0),this.setTooltip(F.Msg.CONTROLS_IF_ELSE_TOOLTIP),this.contextMenu=!1}},ke={init:function(){this.setColour(re),this.appendDummyInput().appendField("try"),this.appendStatementInput("STACK"),this.setPreviousStatement(!1),this.setNextStatement(!1),this.contextMenu=!1}},ye={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_EXCEPT),this.setPreviousStatement(!0),this.setNextStatement(!0),this.contextMenu=!1,this.setTooltip(F.Msg.MIXLY_MIXPY_CONTROL_EXCEPT_TOOLTIP)}},ve={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_FINALLY),this.setPreviousStatement(!0),this.contextMenu=!1,this.setTooltip(F.Msg.MIXLY_MIXPY_CONTROL_FINALLY_TOOLTIP)}},Te={init:function(){this.jsonInit({message0:F.Msg.CONTROLS_REPEAT_TITLE,args0:[{type:"input_value",name:"TIMES"}],previousStatement:null,nextStatement:null,colour:re,tooltip:F.Msg.CONTROLS_REPEAT_TOOLTIP,helpUrl:F.Msg.CONTROLS_REPEAT_HELPURL}),this.appendStatementInput("DO")}},Ee={init:function(){this.setColour(re),this.appendValueInput("BOOL").appendField("lambda"),this.appendStatementInput("DO").appendField(F.Msg.MIXLY_STAT),this.setOutput(!0)}},Ie={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_PASS),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_PASS_TOOLTIP)}},we={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_CONTROLS_THREAD_START),this.appendValueInput("callback").appendField(F.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_PARAMS),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_THREAD_TOOLTIP)}},xe={init:function(){this.appendDummyInput().appendField(F.Msg.CONTROLS_REPEAT_TITLE_REPEAT+F.Msg.MIXLY_DO),this.appendStatementInput("input_data").setCheck(null),this.appendValueInput("select_data").setCheck(null).appendField(F.Msg.CONTROLS_OPERATOR_UNTIL).appendField(new F.FieldDropdown([[F.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE,"true"],[F.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL,"false"]]),"type"),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(re),this.setTooltip("do-while loop"),this.setHelpUrl("")}},Ae={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_OP_GARBAGE_COLLECT),this.setPreviousStatement(!0),this.setNextStatement(!0)}},$e={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_GET_MEM_ALLOC),this.setOutput(!0)}},Oe={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_GET_MEM_FREE),this.setOutput(!0)}},Me={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_GET+F.Msg.MIXLY_DEVICE+"ID"),this.setInputsInline(!0),this.setOutput(!0),this.setTooltip(F.Msg.PROCEDURES_DEFRETURN_RETURN+F.Msg.MIXLY_GET_UNIQUE_IDEN)}},Ce={init:function(){this.setColour(re),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_RTC_TIMESTAMP),this.appendDummyInput().appendField(F.Msg.MIXLY_TIMESTAMP_TO_DATA),this.setInputsInline(!0),this.setOutput(!0,Number)}},Re={init:function(){this.setColour(re),this.appendDummyInput().appendField(F.Msg.MIXLY_GET_UNIQUE_IDEN),this.setOutput(!0)}},Ne=230;F.FieldTextInput.math_number_validator=function(e){return String(e)},F.FieldTextInput.math_number_validator_include_blank=function(e){if(""===e)return"";return/^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\.[a-fA-F0-9]+)?$/.test(e)?String(e):null};const Le={init:function(){this.setColour(Ne),this.appendDummyInput().appendField(new F.FieldTextInput("0",F.FieldTextInput.math_number_validator),"NUM"),this.setOutput(!0,Number),this.setTooltip(F.Msg.MATH_NUMBER_TOOLTIP)}},De={init:function(){this.setColour(Ne);this.appendDummyInput("").appendField(F.Msg.MIXLY_PYTHON_MATH_CONSTANT).appendField(new F.FieldDropdown([["π","pi"],["e","e"]]),"CONSTANT"),this.setOutput(!0,Number);var e=this;this.setTooltip((function(){var t=e.getFieldValue("CONSTANT");return{pi:F.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_TOOLTIP,e:F.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_TOOLTIP}[t]}))}},Pe={init:function(){this.setColour(Ne);this.appendDummyInput("").appendField(F.Msg.MIXLY_PYTHON_MATH_CONSTANT).appendField(new F.FieldDropdown([["π","pi"],["e","e"]]),"CONSTANT"),this.setOutput(!0,Number);var e=this;this.setTooltip((function(){var t=e.getFieldValue("CONSTANT");return{pi:F.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_MP_TOOLTIP,e:F.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_MP_TOOLTIP}[t]}))}},Fe={init:function(){this.setColour(Ne),this.setOutput(!0),this.appendValueInput("A"),this.appendValueInput("B").appendField(new F.FieldDropdown([["+","ADD"],["-","MINUS"],["×","MULTIPLY"],["÷","DIVIDE"],["%","QUYU"],["//","ZHENGCHU"],["**","POWER"]]),"OP"),this.setInputsInline(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("OP");return{ADD:F.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,MINUS:F.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,MULTIPLY:F.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,DIVIDE:F.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,QUYU:F.Msg.MATH_MODULO_TOOLTIP,ZHENGCHU:F.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,POWER:F.Msg.MATH_ARITHMETIC_TOOLTIP_POWER}[t]}))}},Be={init:function(){this.setColour(Ne),this.setPreviousStatement(!0),this.setNextStatement(!0),this.appendValueInput("A"),this.appendValueInput("B").appendField(new F.FieldDropdown([["+=","ADD"],["-=","MINUS"],["×=","MULTIPLY"],["÷=","DIVIDE"],["%=","QUYU"],["//=","ZHENGCHU"],["**=","POWER"]]),"OP"),this.setInputsInline(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("OP");return{ADD:F.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,MINUS:F.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,MULTIPLY:F.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,DIVIDE:F.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,QUYU:F.Msg.MATH_MODULO_TOOLTIP,ZHENGCHU:F.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,POWER:F.Msg.MATH_ARITHMETIC_TOOLTIP_POWER}[t]}))}},je={init:function(){this.setColour(Ne),this.setOutput(!0,Number),this.appendValueInput("A").setCheck(Number),this.appendValueInput("B").setCheck(Number).appendField(new F.FieldDropdown([["&","&"],["|","|"],[">>",">>"],["<<","<<"]]),"OP"),this.setInputsInline(!0),this.setTooltip("位运算")}},Ve={init:function(){this.setColour(Ne),this.setOutput(!0,Number),this.appendValueInput("NUM").setCheck(Number).appendField(new F.FieldDropdown([["sin","SIN"],["cos","COS"],["tan","TAN"],["asin","ASIN"],["acos","ACOS"],["atan","ATAN"],["-","-"],["ln","LN"],["log10","LOG10"],["e^","EXP"],["10^","POW10"]]),"OP");var e=this;this.setTooltip((function(){var t=e.getFieldValue("OP");return{SIN:F.Msg.MATH_TRIG_TOOLTIP_SIN,COS:F.Msg.MATH_TRIG_TOOLTIP_COS,TAN:F.Msg.MATH_TRIG_TOOLTIP_TAN,ASIN:F.Msg.MATH_TRIG_TOOLTIP_ASIN,ACOS:F.Msg.MATH_TRIG_TOOLTIP_ACOS,ATAN:F.Msg.MATH_TRIG_TOOLTIP_ATAN,LN:F.Msg.MATH_SINGLE_TOOLTIP_LN}[t]}))}},Ue={init:function(){var e=[[F.Msg.MATH_BIN,"bin"],[F.Msg.MATH_OCT,"oct"],[F.Msg.MATH_HEX,"hex"]];this.setColour(Ne),this.setOutput(!0,String),this.appendValueInput("NUM").setCheck(Number).appendField(new F.FieldDropdown(e),"OP");var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP");return{bin:F.Msg.MATH_DEC_TOOLTIP_BIN,oct:F.Msg.MATH_DEC_TOOLTIP_OCT,hex:F.Msg.MATH_DEC_TOOLTIP_HEX}[e]}))}},Ye={init:function(){var e=[[F.Msg.LANG_MATH_TO_ROUND,"round"],[F.Msg.LANG_MATH_TO_CEIL,"ceil"],[F.Msg.LANG_MATH_TO_FLOOR,"floor"],[F.Msg.MATH_ABS,"fabs"],[F.Msg.MATH_SQRT,"sqrt"]];this.setColour(Ne),this.appendValueInput("A").setCheck(Number).appendField(new F.FieldDropdown(e),"OP"),this.setOutput(!0,Number);var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP");return{sqrt:F.Msg.MATH_SINGLE_TOOLTIP_ROOT,fabs:F.Msg.MATH_SINGLE_TOOLTIP_ABS,sq:F.Msg.MATH_SINGLE_TOOLTIP_SQ,round:F.Msg.MATH_SINGLE_TOOLTIP_ROUND,ceil:F.Msg.MATH_SINGLE_TOOLTIP_CEIL,floor:F.Msg.MATH_SINGLE_TOOLTIP_FLOOR}[e]}))}},Ge={init:function(){var e=[[F.Msg.MIXLY_MAX,"max"],[F.Msg.MIXLY_MIN,"min"]];this.setColour(Ne),this.appendValueInput("A").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(new F.FieldDropdown(e),"OP").appendField("("),this.appendValueInput("B").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(","),this.appendDummyInput("").setAlign(F.inputs.Align.RIGHT).appendField(")"),this.setInputsInline(!0),this.setOutput(!0,Number);var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP");return{max:F.Msg.MIXLY_TOOLTIP_MATH_MAX,min:F.Msg.MIXLY_TOOLTIP_MATH_MIN}[e]}))}},Xe={init:function(){var e=[[F.Msg.MATH_TWO,"two"],[F.Msg.MATH_EIGHT,"eight"],[F.Msg.MATH_TEN,"ten"],[F.Msg.MATH_SIXTEEN,"sixteen"]];this.setColour(Ne),this.appendDummyInput("").appendField(F.Msg.MATH_BA),this.appendValueInput("NUM").appendField(new F.FieldDropdown(e),"OP").appendField(F.Msg.MATH_JinZhi).setCheck(Number),this.appendDummyInput("").appendField(F.Msg.MATH_ZHW).appendField(new F.FieldDropdown(e),"OP2").appendField(F.Msg.MATH_JinZhi),this.setFieldValue("ten","OP2"),this.setOutput(!0),this.setInputsInline(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP"),n={two:F.Msg.MATH_Before_two,eight:F.Msg.MATH_Before_eight,ten:F.Msg.MATH_Before_ten,sixteen:F.Msg.MATH_Before_sixteen},i=t.getFieldValue("OP2"),r={two:F.Msg.MATH_Behind_two,eight:F.Msg.MATH_Behind_eight,ten:F.Msg.MATH_Behind_ten,sixteen:F.Msg.MATH_Behind_sixteen};return n[e]+r[i]}))}},He={init:function(){var e=[[F.Msg.LANG_MATH_INT,"int"],[F.Msg.LANG_MATH_FLOAT,"float"]];this.setColour(Ne),this.setOutput(!0,Number),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_RANDOM).appendField(new F.FieldDropdown(e),"TYPE"),this.appendValueInput("FROM").setCheck(Number).appendField(F.Msg.LANG_CONTROLS_FOR_INPUT_FROM),this.appendValueInput("TO").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.LANG_MATH_RANDOM_INT_INPUT_TO),this.setInputsInline(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("TYPE"),n={int:F.Msg.LANG_MATH_INT,float:F.Msg.LANG_MATH_FLOAT_RANDOM};return F.Msg.MATH_RANDOM_INT_TOOLTIP+n[e]}))}},ze={init:function(){this.setColour(Ne),this.setOutput(!0,Number),this.appendValueInput("VALUE").setCheck(Number).appendField(F.Msg.LANG_MATH_CONSTRAIN_INPUT_CONSTRAIN),this.appendValueInput("LOW").setCheck(Number).appendField(F.Msg.LANG_MATH_CONSTRAIN_INPUT_LOW),this.appendValueInput("HIGH").setCheck(Number).appendField(F.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH),this.setInputsInline(!0),this.setTooltip(F.Msg.MATH_CONSTRAIN_TOOLTIP)}},qe={init:function(){this.setColour(Ne),this.appendValueInput("NUM",Number).appendField(F.Msg.MIXLY_MAP).setCheck(Number),this.appendValueInput("fromLow",Number).appendField(F.Msg.MIXLY_MAP_FROM).setCheck(Number),this.appendValueInput("fromHigh",Number).appendField(",").setCheck(Number),this.appendValueInput("toLow",Number).appendField(F.Msg.MIXLY_MAP_TO).setCheck(Number),this.appendValueInput("toHigh",Number).appendField(",").setCheck(Number),this.appendDummyInput("").appendField("]"),this.setInputsInline(!0),this.setOutput(!0),this.setTooltip(F.Msg.MIXLY_TOOLTIP_MATH_MAP)}},We={init:function(){this.setColour(Ne),this.appendDummyInput().appendField(new F.FieldTextInput("0",F.FieldTextInput.math_number_validator_include_blank),"NUM"),this.setOutput(!0),this.setTooltip(F.Msg.MATH_NUMBER_TOOLTIP)}},Ke={init:function(){this.setColour(Ne),this.appendValueInput("NUM").setCheck(Number).appendField(F.Msg.LANG_MATH_RANDOM_SEED),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED)}},Je={init:function(){this.setColour(Ne),this.setOutput(!0,Number),this.appendValueInput("VALUE").setCheck(Number),this.appendValueInput("VAR").setCheck(Number).appendField(F.Msg.MATH_ROUND).appendField(F.Msg.TEXT_KEEP),this.appendDummyInput().appendField(F.Msg.TEXT_DECIMAL),this.setInputsInline(!0),this.setTooltip(F.Msg.MATH_ROUND_NEW_TOOLTIP)}},Qe={init:function(){var e=[[F.Msg.MIXLY_TO_INT,"int"],[F.Msg.MIXLY_TO_FLOAT,"float"],[F.Msg.MIXLY_TO_BITES,"b"],[F.Msg.LANG_MATH_BYTE+F.Msg.MIXLY_TO_INT,"bti"]];this.setColour(Ne),this.appendValueInput("VAR").appendField(new F.FieldDropdown(e),"TOWHAT"),this.setOutput(!0,Number);var t=this;this.setTooltip((function(){var e=t.getFieldValue("TOWHAT");return{int:F.Msg.MIXLY_PYTHON_TOOLTIP_TOINT,float:F.Msg.MIXLY_PYTHON_TOOLTIP_TOFLOAT,b:F.Msg.MIXLY_TOOLTIP_TEXT_TOBYTE}[e]}))}},Ze={init:function(){var e=[[F.Msg.MIXLY_TO_INT,"int"],[F.Msg.MIXLY_TO_FLOAT,"float"]];this.setColour(Ne),this.appendValueInput("VAR").appendField(new F.FieldDropdown(e),"TOWHAT"),this.setOutput(!0,Number);var t=this;this.setTooltip((function(){var e=t.getFieldValue("TOWHAT");return{int:F.Msg.MIXLY_TOOLTIP_TEXT_TOINT,float:F.Msg.MIXLY_TOOLTIP_TEXT_TOFLOAT}[e]}))}},et=qe,tt={init:function(){this.setColour(Ne),this.appendValueInput("VAR").appendField(F.Msg.LANG_MATH_BYTE+F.Msg.MIXLY_TO_HEX),this.setOutput(!0,Number),this.setTooltip(F.Msg.MIXLY_PYTHON_TOOLTIP_TOHEX)}},nt={init:function(){this.setColour(Ne),this.itemCount_=1,this.setMutator(new F.icons.MutatorIcon(["lists_create_with_item"],this)),this.appendDummyInput("DUMMY").appendField(F.Msg.MIXLY_PRODUCT+F.Msg.MIXLY_GENERATE_CARTESIAN_PRODUCT),this.appendValueInput("REPEAT").appendField(F.Msg.MIXLY_EVERY_PER_ELEPER_ELEMENT),this.appendDummyInput().appendField(F.Msg.CONTROLS_REPEAT_TITLE_TIMES),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0),this.setTooltip(F.Msg.LISTS_CREATE_WITH_PYTHON_TOOLTIP),this.updateShape_()},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=e.newBlock("lists_create_with_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;i1&&"\\"===e.charAt(0)){var t=e.charAt(1);if("0"===t||"b"===t||"f"===t||"n"===t||"r"===t||"t"===t||"\\"===t||"'"===t)return String(e).substring(0,2);if("x"===t&&"0"===e.charAt(2)&&"B"===e.charAt(3))return String(e).substring(0,4)}return String(e).substring(0,1)};const ut={init:function(){this.setColour(st),this.appendDummyInput().appendField(this.newQuote_(!0)).appendField(new F.FieldTextInput("",F.FieldTextInput.char_validator),"TEXT").appendField(this.newQuote_(!1)),this.setOutput(!0,Number),this.setTooltip(F.Msg.TEXT_CHAR_TOOLTIP)},newQuote_:function(e){if(1==e)var t="../../media/quote2.png";else t="../../media/quote3.png";return new F.FieldImage(t,7,12,'"')}},ct={init:function(){this.setColour(st),this.appendValueInput("A").setCheck([String,Number]),this.appendValueInput("B").setCheck([String,Number]).appendField(F.Msg.MIXLY_TEXT_JOIN),this.setInputsInline(!0),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_TOOLTIP_TEXT_JOIN)}},pt={init:function(){this.setColour(st),this.appendValueInput("VAR").setCheck(Number).appendField(F.Msg.MIXLY_TOCHAR),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_TOOLTIP_TEXT_TOCHAR)}},ht={init:function(){this.setColour(st),this.appendValueInput("VAR").setCheck(String).appendField(F.Msg.MIXLY_TOASCII),this.setOutput(!0,Number),this.setTooltip(F.Msg.MIXLY_TOOLTIP_TEXT_TOASCII)}},dt={init:function(){this.setColour(st),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_TOSTRING),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_PYTHON_TOOLTIP_TOTEXT)}},ft={init:function(){this.setColour(st),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_LENGTH),this.setOutput(!0,Number),this.setTooltip(F.Msg.MIXLY_TOOLTIP_TEXT_LENGTH)}},_t={init:function(){this.WHERE_OPTIONS=[[F.Msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[F.Msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[F.Msg.TEXT_GET_INDEX_RANDOM+1+F.Msg.TEXT_CHARAT2,"RANDOM"]],this.setHelpUrl(F.Msg.LISTS_GET_INDEX_HELPURL),this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendValueInput("AT").setCheck(Number),this.appendDummyInput().appendField(F.Msg.LISTS_GET_INDEX_GET,"MODE"),F.Msg.LISTS_GET_INDEX_TAIL&&this.appendDummyInput("TAIL").appendField(F.Msg.LISTS_GET_INDEX_TAIL),this.setInputsInline(!0),this.setOutput(!0),this.updateAt_(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=e.getFieldValue("WHERE"),i="";switch(t+" "+n){case"GET FROM_START":case"GET FROM_END":i=F.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM;break;case"GET RANDOM":i=F.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM;break;case"GET_REMOVE FROM_START":case"GET_REMOVE FROM_END":i=F.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM;break;case"GET_REMOVE RANDOM":i=F.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM}return"FROM_START"!=n&&"FROM_END"!=n||(i+=" "+F.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1",F.Msg.ONE_BASED_INDEXING?"#1":"#0")),i}));var t=this;this.setTooltip((function(){var e=t.getFieldValue("WHERE"),n={FROM_START:F.Msg.LISTS_GET_INDEX_FROM_START,FROM_END:F.Msg.LISTS_GET_INDEX_FROM_END,RANDOM:F.Msg.TEXT_GET_INDEX_RANDOM};return F.Msg.PROCEDURES_DEFRETURN_RETURN+F.Msg.MIXLY_MICROBIT_TYPE_STRING+n[e]+"n"+F.Msg.TEXT_CHARAT2}))},mutationToDom:function(){var e=document.createElement("mutation");e.setAttribute("statement",!this.outputConnection);var t=this.getInput("AT").type==F.INPUT_VALUE;return e.setAttribute("at",t),e},domToMutation:function(e){var t="true"==e.getAttribute("statement");this.updateStatement_(t),e="false"!=e.getAttribute("at"),this.updateAt_(e)},updateStatement_:function(e){e!=!this.outputConnection&&(this.unplug(!0,!0),e?(this.setOutput(!1),this.setPreviousStatement(!0),this.setNextStatement(!0)):(this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0)))},updateAt_:function(e){this.removeInput("AT"),this.removeInput("ORDINAL",!0),e?(this.appendValueInput("AT").setCheck(Number),F.Msg.TEXT_CHARAT2&&this.appendDummyInput("ORDINAL").appendField(F.Msg.TEXT_CHARAT2)):this.appendDummyInput("AT");var t=new F.FieldDropdown(this.WHERE_OPTIONS,(function(t){var n="FROM_START"==t||"FROM_END"==t;if(n!=e){var i=this.sourceBlock_;return i.updateAt_(n),i.setFieldValue(t,"WHERE"),null}}));this.getInput("AT").appendField(t,"WHERE"),F.Msg.LISTS_GET_INDEX_TAIL&&this.moveInputBefore("TAIL",null)}},mt={init:function(){this.setHelpUrl(F.Msg.LISTS_GET_INDEX_HELPURL),this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendValueInput("AT").setCheck(Number).appendField(F.Msg.LISTS_GET_INDEX_GET+" "+F.Msg.LISTS_GET_INDEX_FROM_START),this.appendDummyInput().appendField(F.Msg.TEXT_CHARAT2),this.setOutput(!0),this.setTooltip(F.Msg.PROCEDURES_DEFRETURN_RETURN+F.Msg.MIXLY_MICROBIT_TYPE_STRING+F.Msg.LISTS_GET_INDEX_FROM_START+"n"+F.Msg.TEXT_CHARAT2)}},bt={init:function(){this.setHelpUrl(F.Msg.LISTS_GET_INDEX_HELPURL),this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendDummyInput().appendField(F.Msg.TEXT_RANDOM_CHAR),this.setOutput(!0),this.setTooltip(F.Msg.TEXT_RANDOM_CHAR_TOOLTIP)}},gt={init:function(){this.WHERE_OPTIONS_1=[[F.Msg.LISTS_GET_INDEX_FROM_START,"FROM_START"],[F.Msg.LISTS_GET_INDEX_FROM_END,"FROM_END"],[F.Msg.LISTS_GET_SUBLIST_START_FIRST,"FIRST"]],this.WHERE_OPTIONS_2=[[F.Msg.LISTS_GET_SUBLIST_END_FROM_START,"FROM_START"],[F.Msg.LISTS_GET_SUBLIST_END_FROM_END,"FROM_END"],[F.Msg.LISTS_GET_SUBLIST_END_LAST,"LAST"]],this.setHelpUrl(F.Msg.LISTS_GET_SUBLIST_HELPURL),this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendDummyInput("").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET),this.appendDummyInput("AT1"),this.appendDummyInput("AT2"),this.setInputsInline(!0),this.setOutput(!0,"List"),this.updateAt_(1,!0),this.updateAt_(2,!0),this.setTooltip(F.Msg._GET_TEXT_SUBLIST_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation"),t=this.getInput("AT1").type==F.INPUT_VALUE;e.setAttribute("at1",t);var n=this.getInput("AT2").type==F.INPUT_VALUE;return e.setAttribute("at2",n),e},domToMutation:function(e){var t="true"==e.getAttribute("at1"),n="true"==e.getAttribute("at2");this.updateAt_(1,t),this.updateAt_(2,n)},updateAt_:function(e,t){this.removeInput("AT"+e),this.removeInput("ORDINAL"+e,!0),t?(this.appendValueInput("AT"+e).setCheck(Number),F.Msg.TEXT_CHARAT2&&this.appendDummyInput("ORDINAL"+e).appendField(F.Msg.TEXT_CHARAT2)):this.appendDummyInput("AT"+e);var n=new F.FieldDropdown(this["WHERE_OPTIONS_"+e],(function(n){var i="FROM_START"==n||"FROM_END"==n;if(i!=t){var r=this.sourceBlock_;return r.updateAt_(e,i),r.setFieldValue(n,"WHERE"+e),null}}));this.getInput("AT"+e).appendField(n,"WHERE"+e),1==e&&(this.moveInputBefore("AT1","AT2"),this.getInput("ORDINAL1")&&this.moveInputBefore("ORDINAL1","AT2"))}},St={init:function(){this.setHelpUrl(F.Msg.LISTS_GET_SUBLIST_HELPURL),this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendValueInput("AT1").appendField(F.Msg.LISTS_GET_INDEX_GET+" "+F.Msg.LISTS_GET_INDEX_FROM_START),this.appendValueInput("AT2").appendField(F.Msg.LISTS_GET_SUBLIST_END_FROM_START),this.appendDummyInput().appendField(F.Msg.TEXT_CHARAT2),this.setInputsInline(!0),this.setOutput(!0,["List",String]),this.setTooltip(F.Msg._GET_TEXT_SUBLIST_TOOLTIP)}},kt={init:function(){var e=[[F.Msg.MIXLY_EQUALS,"==="],[F.Msg.MIXLY_STARTSWITH,"startswith"],[F.Msg.MIXLY_ENDSWITH,"endswith"]];this.setColour(st),this.appendValueInput("STR1").setCheck(String),this.appendValueInput("STR2").appendField(new F.FieldDropdown(e),"DOWHAT").setCheck(String),this.setOutput(!0,[Boolean,Number]),this.setInputsInline(!0)}},yt={init:function(){this.setColour(st),this.appendValueInput("STR1").setCheck(String),this.appendValueInput("STR2").appendField(F.Msg.MIXLY_COMPARETO).setCheck(String),this.setOutput(!0,Number),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_COMPARETO_HELP)}},vt={init:function(){var e=[[F.Msg.TEXT_UPPER,"upper"],[F.Msg.TEXT_TITLE,"title"],[F.Msg.TEXT_CAPITALIZE,"capitalize"],[F.Msg.TEXT_SWAPCASE,"swapcase"],[F.Msg.TEXT_LOWER,"lower"]];this.setColour(st),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET).appendField(new F.FieldDropdown(e),"CAPITAL").setCheck(String),this.setOutput(!0,String);var t=this;this.setTooltip((function(){var e=t.getFieldValue("CAPITAL");return{upper:F.Msg.MIXLY_MIXPY_TEXT_UPPER_TOOLTIP,title:F.Msg.MIXLY_MIXPY_TEXT_TITLE_TOOLTIP,swapcase:F.Msg.MIXLY_MIXPY_TEXT_SWAPCASE_TOOLTIP,capitalize:F.Msg.MIXLY_MIXPY_TEXT_CAPITALIZE_TOOLTIP,lower:F.Msg.MIXLY_MIXPY_TEXT_LOWER_TOOLTIP}[e]}))}},Tt={init:function(){var e=[[F.Msg.TEXT_LJUST,"ljust"],[F.Msg.TEXT_CENTER,"center"],[F.Msg.TEXT_RJUST,"rjust"]];this.setColour(st),this.appendValueInput("VAR").appendField(new F.FieldDropdown(e),"CENTER").setCheck(String),this.appendValueInput("WID").appendField(F.Msg.MIXLY_WIDTH).setCheck(Number),this.appendValueInput("Symbol").appendField(F.Msg.MIXLY_RECT_Fill).setCheck(String),this.setInputsInline(!0),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_MIXPY_TEXT_CENTER_TOOLTIP)}},Et={init:function(){this.setColour(st),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET).setCheck(String),this.appendValueInput("STR").appendField(F.Msg.MIXLY_MID+F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER).setCheck(String),this.appendDummyInput().appendField(F.Msg.MIXLY_LIST_INDEX),this.setInputsInline(!0),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_MIXPY_TEXT_FIND_TOOLTIP)}},It={init:function(){this.setColour(st),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_USE_STR).setCheck(String),this.appendValueInput("LIST").appendField(F.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_SEQ).setCheck("List","Tuple","Set","Dict"),this.appendDummyInput().appendField(F.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_GET_STR),this.setInputsInline(!0),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_PYTHON_TEXT_JOIN_SEQ_TOOLTIP)}},wt={init:function(){this.setColour(st),this.appendValueInput("VAR").setCheck(String),this.appendValueInput("STR1").appendField(F.Msg.MIXLY_MIXPY_REPLACE).setCheck(String),this.appendValueInput("STR2").appendField(F.Msg.LISTS_SET_INDEX_INPUT_TO).setCheck(String),this.setInputsInline(!0),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_MIXPY_TEXT_REPLACE_TOOLTIP)}},xt={init:function(){this.setColour(st),this.appendValueInput("VAR"),this.appendValueInput("VAL").appendField(F.Msg.LIST_SPLIT_AS),this.appendDummyInput("").appendField(F.Msg.LIST_SPLIT),this.setOutput(!0,"List"),this.setTooltip(F.Msg.MIXLY_MIXPY_TEXT_SPLIT_TOOLTIP),this.setInputsInline(!0)}},At={init:function(){var e=[[F.Msg.TEXT_TRIM_BOTH,"strip"],[F.Msg.TEXT_TRIM_LEFT,"lstrip"],[F.Msg.TEXT_TRIM_RIGHT,"rstrip"]];this.setColour(st),this.appendValueInput("VAR"),this.appendDummyInput("").appendField(F.Msg.TEXT_STRIM),this.appendDummyInput("").appendField(new F.FieldDropdown(e),"TOWHAT"),this.appendDummyInput("").appendField(F.Msg.TEXT_BLANK),this.setOutput(!0,String),this.setInputsInline(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("TOWHAT");return{strip:F.Msg.TEXT_TRIM_BOTH_TOOLTIP,lstrip:F.Msg.TEXT_TRIM_LEFT_TOOLTIP,rstrip:F.Msg.TEXT_TRIM_RIGHT_TOOLTIP}[e]}))}},$t={init:function(){this.setColour(st),this.appendDummyInput("").appendField(F.Msg.MIXLY_MICROPYTHON_FORMAT),this.appendDummyInput("").appendField(new F.FieldTextInput("str"),"VAR"),this.itemCount_=1,this.updateShape_(),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setInputsInline(!0),this.setMutator(new F.icons.MutatorIcon(["text_create_with_item"],this)),this.setOutput(!0),this.setTooltip(F.Msg.MIXLY_MIXPY_TEXT_FORMAT_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=e.newBlock("text_create_with_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;it?e[t]:0==t?'"key"':'"key'+(t+1)+'"'),"KEY"+t).appendField(":")}},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},wn={init:function(){this.setColour(En),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_TYPE_DICT),this.appendStatementInput("STACK"),this.setTooltip(F.Msg.DICTS_CREATE_WITH_CONTAINER_TOOLTIP),this.contextMenu=!1}},xn={init:function(){this.setColour(En),this.appendDummyInput().appendField(F.Msg.DICTS_CREATE_WITH_ITEM_TITLE),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP),this.contextMenu=!1}},An={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.DICT_KEYS),this.setTooltip(F.Msg.DICTS_KEYS_TOOLTIP),this.setOutput(!0,"List")}},$n={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendValueInput("KEY").appendField(F.Msg.DICTS_GET_IN),this.appendDummyInput("").appendField(F.Msg.DICTS_ADD_VALUE),this.setOutput(!0),this.setTooltip(F.Msg.DICTS_GET_TOOLTIP)}},On={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendValueInput("KEY").appendField(F.Msg.DICTS_GET_IN),this.appendDummyInput("").appendField(F.Msg.DICTS_ADD_VALUE),this.appendValueInput("VAR").appendField(F.Msg.DICTS_DEFAULT_VALUE),this.setOutput(!0),this.setTooltip(F.Msg.DICTS_GET_DEFAULT_TOOLTIP)}},Mn={init:function(){this.setColour(En),this.appendValueInput("DICT"),this.appendValueInput("KEY").appendField(F.Msg.DICTS_ADD),this.appendDummyInput(),this.appendValueInput("VAR").appendField(F.Msg.DICTS_ADD_VALUE),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.DICTS_ADD_OR_CHANGE_TOOLTIP)}},Cn={init:function(){this.setColour(En),this.appendValueInput("DICT"),this.appendValueInput("KEY").appendField(F.Msg.DICTS_DELETE_IN),this.appendDummyInput("").appendField(F.Msg.DICTS_DELETE_VALUE),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.DICTS_DELETE_TOOLTIP)}},Rn={init:function(){this.setColour(En),this.appendValueInput("DICT2").setCheck("Dict").appendField(F.Msg.MAKE_DICT),this.appendValueInput("DICT").setCheck("Dict").appendField(F.Msg.DICT_UPDATE),this.appendDummyInput("").appendField(F.Msg.MIXLY_MID),this.setTooltip(F.Msg.DICTS_UPDATE_TOOLTIP),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Nn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.DICT_CLEAR),this.setTooltip(F.Msg.DICTS_CLEAR_TOOLTIP),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Ln={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.DICT_ITEMS),this.setTooltip(F.Msg.DICTS_ITEMS_TOOLTIP),this.setOutput(!0,"List")}},Dn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.DICT_VALUES),this.setTooltip(F.Msg.DICTS_VALUES_TOOLTIP),this.setOutput(!0,"List")}},Pn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.MIXLY_LENGTH),this.setTooltip(F.Msg.DICT_LENGTH_TOOLTIP),this.setOutput(!0,Number)}},Fn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.DICT_DELDICT),this.setTooltip(F.Msg.DICTS_DEL_TOOLTIP),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Bn={init:function(){this.MODE=[[F.Msg.DICTS_ADD_OR_CHANGE,"INSERT"],[F.Msg.MIXLY_MICROBIT_JS_DELETE_VAR,"DELETE"]],this.setHelpUrl(F.Msg.LISTS_GET_SUBLIST_HELPURL),this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("AT2"),this.appendValueInput("KEY"),this.appendDummyInput("").appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE).appendField(F.Msg.DICTS_ADD_VALUE),this.updateAt_(!0),this.setInputsInline(!0),this.setOutput(!1),this.setPreviousStatement(!0),this.setNextStatement(!0);var e=this;this.setTooltip((function(){var t="";switch(e.getFieldValue("WHERE")){case"INSERT":t=F.Msg.DICTS_ADD_TOOLTIP;break;case"DELETE":t=F.Msg.DICTS_DELETE_TOOLTIP}return t}))},mutationToDom:function(){var e=document.createElement("mutation"),t=this.getInput("AT2").type==F.INPUT_VALUE;return e.setAttribute("at2",t),e},domToMutation:function(e){var t="true"==e.getAttribute("at2");this.updateAt_(t)},updateAt_:function(e){this.removeInput("AT2"),this.removeInput("ORDINAL",!0),e?this.appendValueInput("AT2").setCheck(Number):this.appendDummyInput("AT2");var t=new F.FieldDropdown(this.MODE,(function(t){var n="INSERT"==t;if(n!=e){var i=this.sourceBlock_;return i.updateAt_(n),i.setFieldValue(t,"WHERE"),null}}));this.getInput("AT2").appendField(t,"WHERE")}},jn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.blockpy_DICT_POP),this.appendValueInput("KEY"),this.appendDummyInput("").appendField(F.Msg.DICTS_ADD_VALUE),this.setTooltip(F.Msg.DICT_POP_TOOLTIP),this.setInputsInline(!0),this.setOutput(!0)}},Vn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendValueInput("KEY").appendField(F.Msg.DICTS_SET_DEFAULT),this.appendDummyInput("").appendField(F.Msg.DICTS_DEFAULT_VALUE),this.appendValueInput("VAR"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.DICTS_SETDEFAULT_TOOLTIP)}},Un={init:function(){this.setColour(En),this.appendDummyInput("").appendField(new F.FieldLabel(F.Msg.MIXLY_MICROBIT_TYPE_DICT),"TIP").appendField(" "),this.itemCount_=3,this.updateShape_(),this.setOutput(!0,"Dict"),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setMutator(new F.icons.MutatorIcon(["dicts_create_with_item"],this)),this.setTooltip(F.Msg.DICTS_CREATE_WITH_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=e.newBlock("dicts_create_with_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;it?e[t]:0==t?'"key"':'"key'+(t+1)+'"'),"KEY"+t).appendField(":")}},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},Yn={init:function(){this.setColour(En),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_TODICT),this.setOutput(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_TOOLTIP_TODICT)}},Gn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendDummyInput("").appendField(F.Msg.MIXLY_TO_JSON),this.setTooltip(F.Msg.MIXLY_TO_JSON_TOOLTIP),this.setOutput(!0)}},Xn={init:function(){this.setColour(En),this.appendValueInput("VAR"),this.appendDummyInput("").appendField(F.Msg.MIXLY_CONVERT_TO_JSON),this.setTooltip(F.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP),this.setOutput(!0)}},Hn={init:function(){this.setColour(En),this.appendValueInput("DICT").setCheck("Dict"),this.appendValueInput("VAR1").appendField("key1"),this.appendValueInput("VAR2").appendField("index"),this.appendValueInput("VAR3").appendField("key2"),this.appendValueInput("VAR4").appendField("key3"),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_CONVERT_TO_JSON_TOOLTIP),this.setOutput(!0)}},zn={init:function(){this.setColour(En),this.appendValueInput("DICT"),this.appendDummyInput("").appendField(F.Msg.MIXLY_TO_JSON),this.setTooltip(F.Msg.MIXLY_TO_JSON_TOOLTIP),this.setOutput(!0)}},qn=210,Wn={init:function(){var e=F.RTL?[["=","EQ"],["≠","NEQ"],[">","LT"],["≥","LTE"],["<","GT"],["≤","GTE"]]:[["=","EQ"],["≠","NEQ"],["<","LT"],["≤","LTE"],[">","GT"],["≥","GTE"]];this.setColour(qn),this.setOutput(!0,Boolean),this.appendValueInput("A"),this.appendValueInput("B").appendField(new F.FieldDropdown(e),"OP"),this.setInputsInline(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP");return{EQ:F.Msg.LOGIC_COMPARE_TOOLTIP_EQ,NEQ:F.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,LT:F.Msg.LOGIC_COMPARE_TOOLTIP_LT,LTE:F.Msg.LOGIC_COMPARE_TOOLTIP_LTE,GT:F.Msg.LOGIC_COMPARE_TOOLTIP_GT,GTE:F.Msg.LOGIC_COMPARE_TOOLTIP_GTE}[e]})),this.prevBlocks_=[null,null]}},Kn={init:function(){var e=F.RTL?[[">","LT"],["≥","LTE"],["<","GT"],["≤","GTE"]]:[["<","LT"],["≤","LTE"],[">","GT"],["≥","GTE"]],t=F.RTL?[[">","LT"],["≥","LTE"],["<","GT"],["≤","GTE"]]:[["<","LT"],["≤","LTE"],[">","GT"],["≥","GTE"]];this.setColour(qn),this.setOutput(!0,Boolean),this.appendValueInput("A"),this.appendValueInput("B").appendField(new F.FieldDropdown(e),"OP1"),this.appendValueInput("C").appendField(new F.FieldDropdown(t),"OP2"),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_LOGIC_COMPARE_CONTINOUS_TOOLTIP)}},Jn={init:function(){var e=[[F.Msg.LOGIC_OPERATION_AND,"AND"],[F.Msg.LOGIC_OPERATION_OR,"OR"],[F.Msg.LOGIC_OPERATION_NOR,"NOR"],[F.Msg.LOGIC_OPERATION_XOR,"XOR"]];this.setColour(qn),this.setOutput(!0,Boolean),this.appendValueInput("A").setCheck([Boolean,Number]),this.appendValueInput("B").setCheck([Boolean,Number]).appendField(new F.FieldDropdown(e),"OP"),this.setInputsInline(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("OP");return{AND:F.Msg.LOGIC_OPERATION_TOOLTIP_AND,OR:F.Msg.LOGIC_OPERATION_TOOLTIP_OR,NOR:F.Msg.LOGIC_OPERATION_TOOLTIP_NOR,XOR:F.Msg.LOGIC_OPERATION_TOOLTIP_XOR}[e]}))}},Qn={init:function(){this.setColour(qn),this.setOutput(!0,Boolean),this.appendValueInput("BOOL").setCheck([Number,Boolean]).appendField(F.Msg.LOGIC_NEGATE_TITLE),this.setTooltip(F.Msg.LOGIC_NEGATE_TOOLTIP)}},Zn={init:function(){var e=[[F.Msg.LOGIC_BOOLEAN_TRUE,"TRUE"],[F.Msg.LOGIC_BOOLEAN_FALSE,"FALSE"]];this.setColour(qn),this.setOutput(!0,Boolean),this.appendDummyInput().appendField(new F.FieldDropdown(e),"BOOL"),this.setTooltip(F.Msg.LOGIC_BOOLEAN_TOOLTIP)}},ei={init:function(){this.setColour(qn),this.setOutput(!0),this.appendDummyInput().appendField(F.Msg.LOGIC_NULL),this.setTooltip(F.Msg.LOGIC_NULL_TOOLTIP)}},ti={init:function(){this.setColour(qn),this.appendValueInput("A"),this.appendValueInput("B").appendField(F.Msg.LOGIC_TERNARY_IF_TRUE),this.appendValueInput("C").appendField(F.Msg.LOGIC_TERNARY_IF_FALSE),this.setOutput(!0),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_TOOLTIP_LOGIT_TRUEORFALSE)}},ni={init:function(){var e=[[F.Msg.TEXT_APPEND_TO,"in"],[F.Msg.MIXLY_PYTHON_LOGIC_IS_NOT_IN,"not in"]];this.setColour(qn),this.appendValueInput("A"),this.appendValueInput("B").setCheck([String,"List"]).appendField(new F.FieldDropdown(e),"BOOL"),this.appendDummyInput("").appendField(F.Msg.MICROBIT_LOGIC_IS_IN),this.setOutput(!0,Boolean),this.setInputsInline(!0),this.setTooltip(F.Msg.IN)}},ii={init:function(){var e=[[F.Msg.MIXLY_PYTHON_LOGIC_IS,"is"],[F.Msg.MIXLY_PYTHON_LOGIC_IS_NOT,"is not"]];this.setColour(qn),this.appendValueInput("A"),this.appendValueInput("B").appendField(new F.FieldDropdown(e),"BOOL"),this.setOutput(!0,Boolean),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_LOGIC_IS_TOOLTIP)}},ri={init:function(){this.setColour(qn),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_TOBOOL),this.setOutput(!0,Boolean),this.setTooltip(F.Msg.MIXLY_PYTHON_TOOLTIP_TOBOOL)}},si={init:function(){this.setColour(0),this.appendValueInput("fn").setCheck(String).appendField(F.Msg.MIXLY_PYTHON_STORAGE_OPEN_FILE_WITH_OS+"(For Windows)"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0)}},oi={init:function(){this.setColour(0),this.appendValueInput("FILENAME").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE).appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,"r"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,"w"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,"rb"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE,"wb"],[F.Msg.MIXLY_ADD,"a"],[F.Msg.MATH_BIN+F.Msg.MIXLY_ADD,"ab"],[F.Msg.MIXLY_R_W,"r+"],[F.Msg.MATH_BIN+F.Msg.MIXLY_R_W,"rb+"],[F.Msg.MIXLY_W_R,"w+"],[F.Msg.MATH_BIN+F.Msg.MIXLY_W_R,"wb+"],[F.Msg.MIXLY_A_R,"a+"],[F.Msg.MATH_BIN+F.Msg.MIXLY_A_R,"ab+"]]),"MODE"),this.appendValueInput("FILE").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_AS),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=F.Msg.MIXLY_USE,i=F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE,r=F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE,s=F.Msg.MIXLY_BELONG;return n+{r:F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,w:F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,rb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,wb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE}[t]+s+i+r}))},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},ai={init:function(){this.setColour(0),this.appendValueInput("FILENAME").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE).appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,"r"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,"w"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,"rb"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE,"wb"]]),"MODE"),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setInputsInline(!0),this.setOutput(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=F.Msg.MIXLY_USE,i=F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE,r=F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE,s=F.Msg.MIXLY_BELONG,o=F.Msg.PY_STORAGE_FILE_OBJECT;return n+{r:F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,w:F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,rb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,wb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE}[t]+s+i+r+o}))}},li={init:function(){this.setColour(0),this.appendValueInput("FILENAME").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE);this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE).appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,"r"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,"w"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,"rb"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE,"wb"]]),"MODE"),this.appendDummyInput().appendField(F.Msg.MIXPY_TEXT_ENCODE).appendField(new F.FieldDropdown([["ANSI","ANSI"],["gbk","gbk"],["utf-8","utf-8"]]),"CODE"),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setInputsInline(!0),this.setOutput(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=F.Msg.MIXLY_USE,i=F.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE,r=F.Msg.MIXLY_MICROBIT_PY_STORAGE_OPEN_FILE,s=F.Msg.MIXLY_BELONG,o=F.Msg.PY_STORAGE_FILE_OBJECT;return n+{r:F.Msg.MIXLY_MICROBIT_PY_STORAGE_READ,w:F.Msg.MIXLY_MICROBIT_PY_STORAGE_WRITE,rb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_READ,wb:F.Msg.MIXLY_MICROBIT_PY_STORAGE_BIT_WRITE}[t]+s+i+r+o}))}},ui={init:function(){this.setColour(0),this.appendValueInput("data").setCheck(String).appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE),this.appendValueInput("FILE").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE+F.Msg.MIXLY_MICROBIT_TYPE_STRING+F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_WRITE)}},ci={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck("Variable").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL,"read"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE,"readline"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES,"readlines"]]),"MODE"),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,String)}},pi={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck("Variable").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE,"read"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE,"readline"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE,"readlines"]]),"MODE"),this.appendValueInput("SIZE").setCheck(Number),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,String);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=F.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE,i=F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER;return n+{read:F.Msg.MIXLY_MICROBIT_PY_STORAGE_NO_MORE_THAN_SIZE,readline:F.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE,readlines:F.Msg.MIXLY_MICROBIT_PY_STORAGE_ALL_LINES_NO_MORE_THAN_SIZE}[t]+"x"+i}))}},hi={init:function(){this.setColour(0),this.appendValueInput("FILE").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FROM_FILE),this.setNextStatement(!0),this.appendValueInput("SIZE").setCheck(Number).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_ONE_LINE_NO_MORE_THAN_SIZE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,String),this.setTooltip(F.Msg.MICROBIT_PYTHON_TYPE)}},di={init:function(){this.setColour(0),this.appendValueInput("FILE").appendField(F.Msg.HTML_FILE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,Boolean),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CAN_WRITE_ORNOT1)}},fi={init:function(){this.setColour(0),this.appendValueInput("FILE").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILENAME),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,String),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILENAME)}},_i={init:function(){this.setColour(0),this.appendValueInput("FILE").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CLOSE_FILE)}},mi={init:function(){this.setColour(0),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,"List"),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_LIST_ALL_FILES)}};F.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE;const bi={init:function(){this.setColour(0),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE,"remove"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_DIRS,"removedirs"]]),"MODE"),this.appendValueInput("FILE").setCheck(String),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_DELETE_FILE)}},gi={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,Number),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_FILE_SIZE+F.Msg.MIXLY_MICROBIT_PY_STORAGE_SIZE)}},Si={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_RETURN_FILE),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_PRESENT_LOCATION),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,Number),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_TELL)}},ki={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck("Variable").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START,"start"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT,"current"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END,"end"]]),"MODE"),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET),this.appendValueInput("SIZE").setCheck(Number),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE"),n=F.Msg.MIXLY_MICROBIT_PY_STORAGE_SET_FILE_POSITION+F.Msg.MIXLY_MICROBIT_PY_STORAGE_CURRENT_POSITION,i=F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHARACTER,r=F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET;return n+" "+{start:F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_START,current:F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_CURRENT,end:F.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_END}[t]+r+"x"+i}))}},yi={init:function(){this.setColour(0),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,"List"),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET_CURRENT_DIR)}},vi={init:function(){this.setColour(0),this.appendValueInput("PATH").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH),this.appendDummyInput().appendField(F.Msg.MIXLY_ESP32_SET),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR,"mkdir"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_MAKEDIRS,"makedirs"]]),"MODE"),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1);var e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE");return F.Msg.MIXLY_MICROBIT_PY_STORAGE_PATH+"x"+F.Msg.MIXLY_ESP32_SET+{mkdir:F.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR,makedirs:F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS}[t]}))}},Ti={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME),this.appendValueInput("NEWFILE").setCheck(String).appendField(F.Msg.MIXLY_AS),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_RENAME)}},Ei={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.MIXLY_MICROBIT_PY_STORAGE_CHANGE_DIR)}},Ii={init:function(){this.setColour(0),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH),this.appendDummyInput().appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.HTML_FILE,"isfile"],[F.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_DIR,"isdir"]]),"MODE"),this.setInputsInline(!0),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setOutput(!0,Boolean);let e=this;this.setTooltip((function(){var t=e.getFieldValue("MODE");return F.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH+"x"+F.Msg.MIXLY_MICROBIT_PY_STORAGE_IS_OR_NOT+{isfile:F.Msg.MIXLY_MICROBIT_PY_STORAGE_MKDIR,isdir:F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKEDIRS}[t]}))}},wi={init:function(){this.setColour(0),this.appendValueInput("SPISUB").appendField(F.Msg.CONTROLS_FOR_INPUT_WITH+"SPI").setCheck("var"),this.appendValueInput("PINSUB").appendField("CS"),this.appendValueInput("SUB").appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE).setCheck("var"),this.appendDummyInput("").appendField(F.Msg.MIXLY_SETUP+F.Msg.LISTS_SET_INDEX_INPUT_TO).appendField(F.Msg.MIXLY_SD_CARD),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null)}},xi={init:function(){this.setColour(0),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_SD_CARD),this.appendValueInput("DIR").setCheck(String).appendField(F.Msg.MIXLY_SDCARD_MOUNT),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setInputsInline(!0),this.setTooltip()}},Ai={init:function(){var e=F.Procedures.findLegalName("",this),t=new F.FieldTextInput(e,F.Procedures.rename);t.setSpellcheck(!1),this.appendDummyInput().appendField(t,"NAME").appendField("","PARAMS"),this.setMutator(new F.icons.MutatorIcon(["procedures_mutatorarg"],this)),(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&F.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(F.Msg.PROCEDURES_DEFNORETURN_COMMENT),this.setStyle("procedure_blocks"),this.setTooltip(F.Msg.PROCEDURES_DEFNORETURN_TOOLTIP),this.setHelpUrl(F.Msg.PROCEDURES_DEFNORETURN_HELPURL),this.arguments_=[],this.argumentVarModels_=[],this.setStatements_(!0),this.statementConnection_=null},setStatements_:function(e){this.hasStatements_!==e&&(e?(this.appendStatementInput("STACK").appendField(F.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_=e)},updateParams_:function(){var e="";this.arguments_.length&&(e=F.Msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", ")),F.Events.disable();try{this.setFieldValue(e,"PARAMS")}finally{F.Events.enable()}},mutationToDom:function(e){var t=F.utils.xml.createElement("mutation");e&&t.setAttribute("name",this.getFieldValue("NAME"));for(var n=0;n"),this.appendValueInput("style").appendField(F.Msg.MIXLY_AIP_ATTR).setAlign(F.inputs.Align.RIGHT),this.appendStatementInput("DO").appendField(""),this.setInputsInline(!1),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Tr={init:function(){this.setColour(br),this.appendDummyInput().appendField(F.Msg.HTML_STYLE),this.appendStatementInput("STYLE"),this.setOutput(!0)}},Er={init:function(){this.setColour(br),this.appendDummyInput().appendField(F.Msg.HTML_FORM_CONTENT).appendField(new F.FieldDropdown([[F.Msg.HTML_TEXT,"text"],[F.Msg.HTML_EMAIL,"email"],[F.Msg.HTML_NUMBER,"number"],[F.Msg.HTML_PASSWORD,"password"],[F.Msg.HTML_CHECKBOX,"checkbox"],[F.Msg.HTML_RADIOBUTTON,"radiobutton"],[F.Msg.HTML_BUTTON,"button"],[F.Msg.HTML_COLOUR,"colour"],[F.Msg.HTML_DATE,"date"],[F.Msg.HTML_LOCALTIME,"local time"],[F.Msg.HTML_FILE,"file"],[F.Msg.HTML_HIDDEN,"hidden"],[F.Msg.HTML_IMAGE,"image"],[F.Msg.HTML_MONTH,"month"],[F.Msg.HTML_RANGE,"range"],[F.Msg.HTML_RESET,"reset"],[F.Msg.HTML_SEARCH,"search"],[F.Msg.HTML_SUBMIT,"submit"],[F.Msg.HTML_TELEPHONENUMBER,"telephone number"],[F.Msg.HTML_TIME,"time"],[F.Msg.HTML_URL,"url"],[F.Msg.HTML_WEEK,"week"]]),"LEVEL"),this.appendDummyInput().appendField(F.Msg.HTML_NAME).appendField(new F.FieldTextInput("car"),"NAME"),this.appendDummyInput().appendField(F.Msg.HTML_VALUE).appendField(new F.FieldTextInput("go"),"VALUE"),this.appendValueInput("style").appendField(F.Msg.MIXLY_AIP_ATTR).setAlign(F.inputs.Align.RIGHT),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Ir={init:function(){this.setColour(br),this.appendDummyInput().appendField(new F.FieldTextInput("property"),"KEY").appendField(":").appendField(new F.FieldTextInput("value"),"VALUE"),this.setPreviousStatement(!0),this.setNextStatement(!0)}},wr={init:function(){this.setColour(br),this.appendDummyInput().appendField(new F.FieldTextInput("property"),"KEY").appendField(":").appendField(new F.FieldColour("#ff0000"),"RGB_LED_COLOR"),this.setPreviousStatement(!0),this.setNextStatement(!0)}},xr={init:function(){this.setColour(br),this.appendDummyInput().appendField(F.Msg.HTML_TEXT).appendField(new F.FieldTextInput("text"),"TEXT"),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Ar=160,$r={init:function(){this.setColour(Ar),this.setPreviousStatement(!0),this.setNextStatement(!0),this.appendDummyInput().appendField("Tabular Abstraction:"),this.appendDummyInput().appendField(new F.FieldTable(""),"TEXT")}},Or={init:function(){this.setColour(Ar),this.setPreviousStatement(!0),this.setNextStatement(!0),this.appendDummyInput().appendField("Code Block:"),this.appendDummyInput().appendField(new F.FieldMultilineInput(""),"TEXT")}},Mr={init:function(){this.setColour(Ar),this.appendDummyInput().appendField("Code Expression:"),this.appendDummyInput().appendField(new F.FieldMultilineInput(""),"TEXT"),this.setOutput(!0)}},Cr={init:function(){this.setColour(Ar),this.setPreviousStatement(!0),this.setNextStatement(!0),this.appendValueInput("VALUE").appendField(""),this.setInputsInline(!1)}},Rr={init:function(){this.setColour(Ar),this.appendDummyInput().appendTitle("Comment:").appendTitle(new F.FieldTextInput(""),"TEXT"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip("This comment will be ignored by Python")}},Nr={init:function(){this.setColour(Ar),this.appendValueInput("VALUE").appendField(F.Msg.TYPE_CHECK),this.setInputsInline(!1),this.setOutput(!0,"Type")}},Lr={init:function(){this.setColour(Ar),this.itemCount_=1,this.updateShape_(),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setMutator(new F.icons.MutatorIcon(["text_print_multiple_item"],this)),this.setTooltip(F.Msg.TEXT_PRINT_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=F.Block.obtain(e,"text_print_multiple_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;i"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP,"1"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN,"2"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT,"3"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT,"4"],[F.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE,"s"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON,"p"],[F.Msg.blockpy_PYLAB_PLOT_DOT_STAR,"*"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL,"h"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL,"H"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PLUS,"+"],[F.Msg.blockpy_PYLAB_PLOT_DOT_CROSS,"x"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND,"D"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL,"d"],[F.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL,"|"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL,"_"]];this.appendValueInput("SER").setCheck("Series").appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_PLOT),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(n),"DOT"),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_LINE).appendField(new F.FieldDropdown(e),"LINE"),this.appendDummyInput("").appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldDropdown(t),"COLOR"),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Zr={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_SHOW),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},es={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.mixpy_PL_AXES),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ts={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_LEGEND),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ns={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_TITLE),this.appendValueInput("TITLE").setCheck(String),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},is={init:function(){this.setColour(Ur);var e=[[F.Msg.PYLAB_LABEL_X,"x"],[F.Msg.PYLAB_LABEL_Y,"y"]];this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_SET_LABEL).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("LABEL").appendField(F.Msg.blockpy_PYLAB_LABEL).setCheck(String),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},rs={init:function(){this.setColour(Ur),this.appendValueInput("FROM").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.MIXLY_SPLITBYDOU).appendField(F.Msg.MIXPY_DATA_ARRAY_CREATE_FROM),this.appendValueInput("TO").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.MIXPY_DATA_ARRAY_CREATE_TO),this.appendValueInput("STEP").setCheck(Number).setAlign(F.inputs.Align.RIGHT).appendField(F.Msg.MIXLY_STEP),this.setInputsInline(!0),this.setOutput(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP)}},ss={init:function(){this.setColour(Ur);var e=[[F.Msg.mixpy_PYLAB_PLOT_BAR_PLOT,"plot"],[F.Msg.mixpy_PYLAB_PLOT_BAR_BAR,"bar"]];this.appendDummyInput().appendField(F.Msg.MIXLY_DISPLAY_DRAW).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("DIR");return{plot:F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP,bar:F.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP}[e]}))}},os={init:function(){this.setColour(Ur);var e=[[F.Msg.COLOUR_RGB_BLUE,"b"],[F.Msg.COLOUR_RGB_GREEN,"g"],[F.Msg.COLOUR_RGB_RED,"r"],[F.Msg.COLOUR_CYAN,"c"],[F.Msg.COLOUR_MAGENTA,"m"],[F.Msg.COLOUR_YELLOW,"y"],[F.Msg.COLOUR_BLACK,"k"],[F.Msg.COLOUR_WHITE,"w"]],t=[[F.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR,"."],[F.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL,","],[F.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT,"o"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN,"v"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP,"^"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT,"<"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT,">"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP,"1"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN,"2"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT,"3"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT,"4"],[F.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE,"s"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON,"p"],[F.Msg.blockpy_PYLAB_PLOT_DOT_STAR,"*"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL,"h"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL,"H"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PLUS,"+"],[F.Msg.blockpy_PYLAB_PLOT_DOT_CROSS,"x"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND,"D"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL,"d"],[F.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL,"|"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL,"_"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_SCATTER).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendValueInput("S").appendField(F.Msg.MIXLY_MICROBIT_JS_NUMBER),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(t),"DOT"),this.appendDummyInput("").appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldDropdown(e),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip("")}},as={init:function(){this.setColour(Ur);var e=[[F.Msg.blockpy_PYLAB_PLOT_LINE_SOLID,"-"],[F.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED,"--"],[F.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN,"-."],[F.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED,":"],[F.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE,""]],t=[[F.Msg.COLOUR_RGB_BLUE,"b"],[F.Msg.COLOUR_RGB_GREEN,"g"],[F.Msg.COLOUR_RGB_RED,"r"],[F.Msg.COLOUR_CYAN,"c"],[F.Msg.COLOUR_MAGENTA,"m"],[F.Msg.COLOUR_YELLOW,"y"],[F.Msg.COLOUR_BLACK,"k"],[F.Msg.COLOUR_WHITE,"w"]],n=[[F.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR,"."],[F.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL,","],[F.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT,"o"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_DOWN,"v"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_UP,"^"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_LEFT,"<"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIANGLE_RIGHT,">"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_UP,"1"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_DOWN,"2"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_LEFT,"3"],[F.Msg.blockpy_PYLAB_PLOT_DOT_TRIMARKER_RIGHT,"4"],[F.Msg.blockpy_PYLAB_PLOT_DOT_SQUARE,"s"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PENTAGON,"p"],[F.Msg.blockpy_PYLAB_PLOT_DOT_STAR,"*"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_VERTICAL,"h"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HEXAGON_HORIZONTAL,"H"],[F.Msg.blockpy_PYLAB_PLOT_DOT_PLUS,"+"],[F.Msg.blockpy_PYLAB_PLOT_DOT_CROSS,"x"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND,"D"],[F.Msg.blockpy_PYLAB_PLOT_DOT_DIAMOND_SMALL,"d"],[F.Msg.blockpy_PYLAB_PLOT_DOT_VERTICAL,"|"],[F.Msg.blockpy_PYLAB_PLOT_DOT_HORIZONTAL,"_"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PLOT_XY).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(n),"DOT"),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_LINE).appendField(new F.FieldDropdown(e),"LINE"),this.appendDummyInput("").appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldDropdown(t),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},ls={init:function(){this.setColour(Ur);var e=[[F.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER,"center"],[F.Msg.AILGN_EDGE,"edge"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_BAR).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendValueInput("WIDTH").setCheck(Number).appendField(F.Msg.MIXLY_WIDTH),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_BAR_ALIGN).appendField(new F.FieldDropdown(e),"ALIGN"),this.appendDummyInput().appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldColour("#0000ff"),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},us={init:function(){this.setColour(Ur);var e=[[F.Msg.mixpy_PL_PIE_SHADOW_N,"False"],[F.Msg.mixpy_PL_PIE_SHADOW_Y,"True"]],t=[[F.Msg.mixpy_PL_PIE_SHADOW_N,"None"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z,"%.0f%%"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_O,"%.1f%%"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_T,"%.2f%%"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PIE).appendField(F.Msg.COLOUR_BLEND_RATIO),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.appendValueInput("EXPLODE").appendField(F.Msg.mixpy_PYLAB_PIE_EXPLODE),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_PIE_AUTOPCT).appendField(new F.FieldDropdown(t),"autopct"),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_PIE_SHADOW).appendField(new F.FieldDropdown(e),"SHADOW"),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},cs={init:function(){this.setColour(Ur),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_HIST).appendField(F.Msg.MIXLY_SD_DATA),this.appendValueInput("B").appendField(F.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ps={init:function(){this.setColour(Ur);var e=[[F.Msg.PYLAB_LABEL_X,"x"],[F.Msg.PYLAB_LABEL_Y,"y"]];this.appendDummyInput().appendField(F.Msg.MIXLY_SETTING).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_TICKS).appendField(F.Msg.MIXLY_MICROBIT_JS_I2C_VALUE),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_TICKS_TOOLTIP)}},hs={init:function(){var e=[["sin","sin"],["cos","cos"],["tan","tan"],["arcsin","arcsin"],["arccos","arccos"],["arctan","arctan"],[F.Msg.LANG_MATH_TO_ROUND,"round"],[F.Msg.LANG_MATH_TO_CEIL,"ceil"],[F.Msg.LANG_MATH_TO_FLOOR,"floor"]];this.setColour(Ur),this.setOutput(!0),this.setInputsInline(!0),this.appendDummyInput().appendField(F.Msg.mixpy_NUMPY_TRIG),this.appendValueInput("NUM").setCheck(Number).appendField(new F.FieldDropdown(e),"OP"),this.setTooltip(F.Msg.mixpy_NUMPY_TRIG_TOOLTIP)}},ds={init:function(){this.setColour(Ur),this.appendValueInput("VET").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT).appendField(F.Msg.mixpy_SUBPLOT_VERTICLE),this.appendValueInput("HOR").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT_HORIZEN),this.appendValueInput("NUM").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT_NUM),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP)}},fs={init:function(){this.setColour(Ur),this.appendValueInput("FILENAME").appendField(F.Msg.MIXPY_PANDAS_READ_CSV),this.appendDummyInput().appendField(new F.FieldDropdown([[F.Msg.mixpy_PANDAS_READCSV_HEADER_Y,"0"],[F.Msg.mixpy_PANDAS_READCSV_HEADER_N,"None"]]),"MODE"),this.appendDummyInput().appendField(F.Msg.mixpy_PANDAS_READCSV_TITLE),this.setOutput(!0),this.setInputsInline(!0),this.setTooltip(F.Msg.mixpy_PANDAS_READCSV_TOOLTIP)},getVars:function(){return[this.getFieldValue("VAR")]},renameVar:function(e,t){F.Names.equals(e,this.getFieldValue("VAR"))&&this.setTitleValue(t,"VAR")}},_s={init:function(){this.setColour(Ur),this.appendValueInput("DICT").setCheck("Dict"),this.appendValueInput("KEY").appendField(F.Msg.mixpy_DATAFRAME_GET),this.appendDummyInput("").appendField(F.Msg.mixpy_DATAFRAME_GET_INDEX).appendField(new F.FieldDropdown([[F.Msg.DATAFRAME_COLUMN,"column"],[F.Msg.DATAFRAME_RAW,"raw"]]),"MODE"),this.setOutput(!0),this.setTooltip(F.Msg.mixpy_DATAFRAME_GET_TOOLTIP)}},ms={init:function(){this.setColour(Ur),this.appendValueInput("FILE").setCheck(String).appendField(F.Msg.mixpy_PL_SAVEFIG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.mixpy_PL_SAVEFIG_TOOLTIP)}},bs={init:function(){this.setColour(Ur);var e=[[F.Msg.TEXT_TRIM_LEFT,"right"],[F.Msg.mixpy_PL_TEXT_CENTER,"center"],[F.Msg.TEXT_TRIM_RIGHT,"left"]],t=[[F.Msg.mixpy_PL_TEXT_TOP,"bottom"],[F.Msg.mixpy_PL_TEXT_CENTER,"center"],[F.Msg.mixpy_PL_TEXT_BOTTOM,"top"]];this.appendValueInput("VET").setCheck(Number).appendField(F.Msg.MIXLY_SETTING).appendField(F.Msg.mixpy_PL_TEXT_X),this.appendValueInput("HOR").setCheck(Number).appendField(F.Msg.mixpy_PL_TEXT_Y),this.appendValueInput("NUM").setCheck(Number).appendField(F.Msg.mixpy_PL_TEXT_TAG),this.appendDummyInput("").appendField(F.Msg.mixpy_PL_TEXT_HOR).appendField(new F.FieldDropdown(e),"HALIGN"),this.appendDummyInput("").appendField(F.Msg.mixpy_PL_TEXT_VER).appendField(new F.FieldDropdown(t),"VALIGN"),this.appendValueInput("FONTNUM").setCheck(Number).appendField(F.Msg.MIXLY_TURTLE_WRITE_FONT_NUM),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PL_TEXT_TOOLTIP)}},gs={init:function(){this.setColour(Ur),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_TOARRAY),this.setOutput(!0,"List"),this.setTooltip(F.Msg.MIXLY_PYTHON_TOOLTIP_TOARRAY)}},Ss={init:function(){this.setColour(Ur),this.appendValueInput("SER").setCheck("Series").appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_PLOT),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ks={init:function(){this.setColour(Ur);var e=[[F.Msg.blockpy_PYLAB_PLOT_LINE_SOLID,"-"],[F.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED,"--"],[F.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN,"-."],[F.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED,":"],[F.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE,""]],t=[[F.Msg.COLOUR_RGB_BLUE,"b"],[F.Msg.COLOUR_RGB_GREEN,"g"],[F.Msg.COLOUR_RGB_RED,"r"],[F.Msg.COLOUR_CYAN,"c"],[F.Msg.COLOUR_MAGENTA,"m"],[F.Msg.COLOUR_YELLOW,"y"],[F.Msg.COLOUR_BLACK,"k"],[F.Msg.COLOUR_WHITE,"w"]],n=[[F.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR,"."],[F.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL,","],[F.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT,"o"]];this.appendValueInput("SER").setCheck("Series").appendField(F.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_PLOT),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(n),"DOT"),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_LINE).appendField(new F.FieldDropdown(e),"LINE"),this.appendDummyInput("").appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldDropdown(t),"COLOR"),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ys={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_SHOW),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},vs={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.mixpy_PL_AXES),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Ts={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_LEGEND),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Es={init:function(){this.setColour(Ur),this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_TITLE),this.appendValueInput("TITLE").setCheck(String),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Is={init:function(){this.setColour(Ur);var e=[[F.Msg.PYLAB_LABEL_X,"x"],[F.Msg.PYLAB_LABEL_Y,"y"]];this.appendDummyInput().appendField(F.Msg.blockpy_PYLAB_SET_LABEL).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("LABEL").appendField(F.Msg.blockpy_PYLAB_LABEL).setCheck(String),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},ws={init:function(){this.setColour(Ur);var e=[[F.Msg.mixpy_PYLAB_PLOT_BAR_PLOT,"plot"],[F.Msg.mixpy_PYLAB_PLOT_BAR_BAR,"bar"]];this.appendDummyInput().appendField(F.Msg.MIXLY_DISPLAY_DRAW).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("DIR");return{plot:F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP,bar:F.Msg.mixpy_PYLAB_PLOT_BAR_EASY_TOOLTIP}[e]}))}},xs={init:function(){this.setColour(Ur);var e=[[F.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR,"."],[F.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL,","],[F.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT,"o"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_SCATTER).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendValueInput("S").appendField(F.Msg.MIXLY_MICROBIT_JS_NUMBER),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(e),"DOT"),this.appendDummyInput().appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldColour("#0000ff"),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip("")}},As={init:function(){this.setColour(Ur);var e=[[F.Msg.blockpy_PYLAB_PLOT_LINE_SOLID,"-"],[F.Msg.blockpy_PYLAB_PLOT_LINE_DOTTED,"--"],[F.Msg.blockpy_PYLAB_PLOT_LINE_CHAIN,"-."],[F.Msg.blockpy_PYLAB_PLOT_LINE_POINT_DOTTED,":"],[F.Msg.MIXLY_MICROBIT_JS_INOUT_PULL_NONE,""]],t=[[F.Msg.COLOUR_RGB_BLUE,"b"],[F.Msg.COLOUR_RGB_GREEN,"g"],[F.Msg.COLOUR_RGB_RED,"r"],[F.Msg.COLOUR_CYAN,"c"],[F.Msg.COLOUR_MAGENTA,"m"],[F.Msg.COLOUR_YELLOW,"y"],[F.Msg.COLOUR_BLACK,"k"],[F.Msg.COLOUR_WHITE,"w"]],n=[[F.Msg.blockpy_PYLAB_PLOT_DOT_CIRCULAR,"."],[F.Msg.blockpy_PYLAB_PLOT_DOT_PIXEL,","],[F.Msg.blockpy_PYLAB_PLOT_DOT_LARGE_DOT,"o"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PLOT_XY).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_DOT).appendField(new F.FieldDropdown(n),"DOT"),this.appendDummyInput("").appendField(F.Msg.blockpy_PYLAB_PLOT_LINE).appendField(new F.FieldDropdown(e),"LINE"),this.appendDummyInput("").appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldDropdown(t),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},$s={init:function(){this.setColour(Ur);var e=[[F.Msg.MIXLY_TURTLE_WRITE_ALIGN_CENTER,"center"],[F.Msg.AILGN_EDGE,"edge"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_BAR).appendField(F.Msg.mixpy_PYLAB_PLOT_X),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_PLOT_Y),this.appendValueInput("WIDTH").setCheck(Number).appendField(F.Msg.MIXLY_WIDTH),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_BAR_ALIGN).appendField(new F.FieldDropdown(e),"ALIGN"),this.appendDummyInput().appendField(F.Msg.HTML_COLOUR).appendField(new F.FieldColour("#0000ff"),"COLOR"),this.appendValueInput("TAG").setCheck(String).appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},Os={init:function(){this.setColour(Ur);var e=[[F.Msg.mixpy_PL_PIE_SHADOW_N,"False"],[F.Msg.mixpy_PL_PIE_SHADOW_Y,"True"]],t=[[F.Msg.mixpy_PL_PIE_SHADOW_N,"None"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_Z,"%.0f%%"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_O,"%.1f%%"],[F.Msg.mixpy_PYLAB_PIE_AUTOPCT_T,"%.2f%%"]];this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_PIE).appendField(F.Msg.COLOUR_BLEND_RATIO),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.appendValueInput("EXPLODE").appendField(F.Msg.mixpy_PYLAB_PIE_EXPLODE),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_PIE_AUTOPCT).appendField(new F.FieldDropdown(t),"autopct"),this.appendDummyInput("").appendField(F.Msg.mixpy_PYLAB_PIE_SHADOW).appendField(new F.FieldDropdown(e),"SHADOW"),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_PLOT_XY_TOOLTIP)}},Ms={init:function(){this.setColour(Ur),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_HIST).appendField(F.Msg.MIXLY_SD_DATA),this.appendValueInput("B").appendField(F.Msg.MIXLY_MICROBIT_JS_MONITOR_SCROLL_INTERVAL),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0)}},Cs={init:function(){this.setColour(Ur);var e=[[F.Msg.PYLAB_LABEL_X,"x"],[F.Msg.PYLAB_LABEL_Y,"y"]];this.appendDummyInput().appendField(F.Msg.MIXLY_SETTING).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("A").appendField(F.Msg.mixpy_PYLAB_TICKS).appendField(F.Msg.MIXLY_MICROBIT_JS_I2C_VALUE),this.appendValueInput("B").appendField(F.Msg.mixpy_PYLAB_TICKS_TAG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PYLAB_TICKS_TOOLTIP)}},Rs={init:function(){this.setColour(Ur),this.appendValueInput("VET").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT).appendField(F.Msg.mixpy_SUBPLOT_VERTICLE),this.appendValueInput("HOR").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT_HORIZEN),this.appendValueInput("NUM").setCheck(Number).appendField(F.Msg.mixpy_SUBPLOT_NUM),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_CONTROLS_RANGE_TOOLTIP)}},Ns={init:function(){this.setColour(Ur),this.appendDummyInput("").appendField(F.Msg.mixpy_PL_SAVEFIG),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setOutput(!1),this.setTooltip(F.Msg.mixpy_PL_SAVEFIG_TOOLTIP)}},Ls={init:function(){this.setColour(Ur);var e=[[F.Msg.TEXT_TRIM_LEFT,"right"],[F.Msg.mixpy_PL_TEXT_CENTER,"center"],[F.Msg.TEXT_TRIM_RIGHT,"left"]],t=[[F.Msg.mixpy_PL_TEXT_TOP,"bottom"],[F.Msg.mixpy_PL_TEXT_CENTER,"center"],[F.Msg.mixpy_PL_TEXT_BOTTOM,"top"]];this.appendValueInput("VET").setCheck(Number).appendField(F.Msg.MIXLY_SETTING).appendField(F.Msg.mixpy_PL_TEXT_X),this.appendValueInput("HOR").setCheck(Number).appendField(F.Msg.mixpy_PL_TEXT_Y),this.appendValueInput("NUM").setCheck(Number).appendField(F.Msg.mixpy_PL_TEXT_TAG),this.appendDummyInput("").appendField(F.Msg.mixpy_PL_TEXT_HOR).appendField(new F.FieldDropdown(e),"HALIGN"),this.appendDummyInput("").appendField(F.Msg.mixpy_PL_TEXT_VER).appendField(new F.FieldDropdown(t),"VALIGN"),this.appendValueInput("FONTNUM").setCheck(Number).appendField(F.Msg.MIXLY_TURTLE_WRITE_FONT_NUM),this.setInputsInline(!0),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.mixpy_PL_TEXT_TOOLTIP)}},Ds=20,Ps={init:function(){this.setColour(Ds),this.appendValueInput("VAR").appendField(F.Msg.blockpy_inout_raw_input).setCheck(String),this.setOutput(!0),this.setTooltip(F.Msg.INOUT_input_TOOLTIP)}},Fs={init:function(){this.setColour(Ds),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_SERIAL_PRINTLN),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setTooltip(F.Msg.BLOCKPY_PRINT_TOOLTIP)}},Bs={init:function(){this.setColour(Ds),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_SERIAL_PRINT),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setTooltip(F.Msg.TEXT_PRINT_TOOLTIP)}},js={init:function(){this.setColour(Ds),this.appendValueInput("VAR").appendField(F.Msg.MIXLY_SERIAL_PRINT),this.appendValueInput("END").appendField(F.Msg.MIXLY_ENDSWITH),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setInputsInline(!0),this.setTooltip(F.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP)}},Vs={init:function(){var e=[[F.Msg.LANG_MATH_STRING,"str"],[F.Msg.LANG_MATH_INT,"int"],[F.Msg.LANG_MATH_FLOAT,"float"]];this.setColour(Ds),this.appendDummyInput("").appendField(F.Msg.MIXLY_MICROBIT_PY_STORAGE_GET).appendField(new F.FieldDropdown(e),"DIR"),this.appendValueInput("VAR").appendField(F.Msg.PROCEDURES_MUTATORCONTAINER_TITLE).setCheck(String),this.setInputsInline(!0),this.setOutput(!0);var t=this;this.setTooltip((function(){var e=t.getFieldValue("DIR");return{str:F.Msg.MIXLY_MIXPY_INOUT_STR_INPUT_TOOLTIP,int:F.Msg.MIXLY_MIXPY_INOUT_INT_INPUT_TOOLTIP,float:F.Msg.MIXLY_MIXPY_INOUT_FLOAT_INPUT_TOOLTIP}[e]}))}},Us={init:function(){this.setColour(Ds),this.itemCount_=2,this.updateShape_(),this.setPreviousStatement(!1),this.setNextStatement(!1),this.setInputsInline(!0),this.setMutator(new F.icons.MutatorIcon(["inout_print_item"],this)),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip(F.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP)},mutationToDom:function(){var e=document.createElement("mutation");return e.setAttribute("items",this.itemCount_),e},domToMutation:function(e){this.itemCount_=parseInt(e.getAttribute("items"),10),this.updateShape_()},decompose:function(e){var t=e.newBlock("inout_print_container");t.initSvg();for(var n=t.getInput("STACK").connection,i=0;i0?e:[["'无可用地图'","'无可用地图'"]]}},ua={init:function(){this.appendValueInput("pathtype").setCheck(null).appendField("设置路径样式为"),this.setInputsInline(!0),this.setPreviousStatement(!0,null),this.setNextStatement(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")}},ca={init:function(){this.imgArr=this.getLocalImg(),this.appendDummyInput().appendField(new F.FieldDropdown(this.getLocalImg()),"type"),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")},onchange:function(){let e=this.getFieldValue("type"),t=this.imgArr;this.haveNewSrc(this.imgArr,t)&&(this.imgArr=t,this.getField("type").menuGenerator_=this.imgArr,this.checkSrc(e,this.imgArr)?this.setFieldValue(e,"type"):this.setFieldValue(this.imgArr[0][1],"type"))},haveNewSrc:function(e,t){if(e.length!==t.length)return!0;for(var n=0;n0?e:[["'无可用路径'","'无可用路径'"]]}},pa={init:function(){this.setColour(290),this.setPreviousStatement(!0),this.setNextStatement(!0),this.appendValueInput("posx").setCheck(null).appendField("在("),this.appendDummyInput().appendField(","),this.appendValueInput("posy").setCheck(null).appendField(""),this.appendDummyInput().appendField(")放置").appendField(new F.FieldDropdown([["障碍","'wall'"],["金币","'coin'"]]),"item"),this.setTooltip("")}},ha={init:function(){this.imgArr=this.getLocalImg(),this.appendDummyInput().appendField(new F.FieldDropdown(this.getLocalImg()),"type"),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")},onchange:function(){let e=this.getFieldValue("type"),t=this.imgArr;this.haveNewSrc(this.imgArr,t)&&(this.imgArr=t,this.getField("type").menuGenerator_=this.imgArr,this.checkSrc(e,this.imgArr)?this.setFieldValue(e,"type"):this.setFieldValue(this.imgArr[0][1],"type"))},haveNewSrc:function(e,t){if(e.length!==t.length)return!0;for(var n=0;n0?e:[["'无可用角色'","'无可用角色'"]]}},da={init:function(){this.setColour(290),this.appendValueInput("character").setCheck(null).appendField("初始化角色为"),this.appendDummyInput().appendField("面朝").appendField(new F.FieldDropdown([["北","0"],["南","2"],["西","3"],["东","1"]]),"direction"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setTooltip("")}},fa={init:function(){this.setColour(290),this.appendDummyInput().appendField("获取⻆⾊所获分数"),this.setOutput(!0,Number),this.setTooltip("")}},_a={init:function(){this.appendDummyInput().appendField(new F.FieldDropdown([["北","0"],["南","2"],["西","3"],["东","1"]]),"direction"),this.appendDummyInput().appendField("侧有障碍"),this.setInputsInline(!0),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")}},ma={init:function(){this.appendDummyInput().appendField("随机生成小车油量"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setColour(290),this.setTooltip("")}},ba={init:function(){this.appendDummyInput().appendField("需要加油"),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")}},ga={init:function(){this.appendDummyInput().appendField("信号灯为绿灯"),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")}},Sa={init:function(){this.appendDummyInput().appendField("信号灯为红灯"),this.setOutput(!0,null),this.setColour(290),this.setTooltip(""),this.setHelpUrl("")}},ka={init:function(){this.appendDummyInput().appendField("进加油站加油"),this.setPreviousStatement(!0),this.setNextStatement(!0),this.setColour(290),this.setTooltip("")}},ya={init:function(){this.appendDummyInput().appendField("检查程序循环数目是否正确"),this.setPreviousStatement(!0),this.setColour(290),this.setTooltip("")}},va=function(e,t){return[t.variableDB_.getName(this.getFieldValue("VAR"),F.Variables.NAME_TYPE),t.ORDER_ATOMIC]},Ta=function(e,t){if(""==this.getFieldValue("VAR"))return" = None\n";var n=t.valueToCode(this,"VALUE",t.ORDER_ASSIGNMENT)||"None";return t.variableDB_.getName(this.getFieldValue("VAR"),F.Variables.NAME_TYPE)+" = "+n+"\n"},Ea=function(e,t){var n=this.getFieldValue("OP"),i=t.valueToCode(this,"MYVALUE",t.ORDER_ATOMIC)||"None";if("bytes"==n)var r=n+"("+i+',"UTF-8")';else r=n+"("+i+")";return[r,t.ORDER_ATOMIC]},Ia=function(e,t){return"global "+(t.valueToCode(this,"VAR",t.ORDER_ATOMIC)||"None")+"\n"},wa=function(e,t){return["type("+(t.valueToCode(this,"DATA",t.ORDER_ATOMIC)||"None")+")",t.ORDER_ATOMIC]},xa=function(e,t){return[this.getFieldValue("type"),t.ORDER_ATOMIC]},Aa=function(e,t){for(var n=new Array(this.itemCount_),i=0;i= stop:"," yield start"," start -= abs(step)"])};if(e=function(e,t,n){return"("+e+" <= "+t+") and "+l()+"("+e+", "+t+", "+n+") or "+u()+"("+e+", "+t+", "+n+")"},F.isNumber(i)&&F.isNumber(r)&&F.isNumber(s))i=parseFloat(i),r=parseFloat(r),s=Math.abs(parseFloat(s)),0==i%1&&0==r%1&&0==s%1?(i<=r?(r++,e=0==i&&1==s?r:i+", "+r,1!=s&&(e+=", "+s)):e=i+", "+--r+", -"+s,e="range("+e+")"):(e=i",GTE:">="};const cc=function(e,t){var n=this.getFieldValue("OP"),i="&&"==n?t.ORDER_LOGICAL_AND:t.ORDER_LOGICAL_OR,r=t.valueToCode(this,"A",i)||"False",s=t.valueToCode(this,"B",i)||"False";if("AND"==n)var o=r+" and "+s;else if("OR"==n)o=r+" or "+s;else if("NOR"==n)o="not("+r+"^"+s+")";else o=r+"^"+s;return[o,i]},pc=function(e,t){var n=t.ORDER_UNARY_PREFIX;return["not "+(t.valueToCode(this,"BOOL",n)||"False"),n]},hc=function(e,t){return["TRUE"==this.getFieldValue("BOOL")?"True":"False",t.ORDER_ATOMIC]},dc=function(e,t){return["None",t.ORDER_ATOMIC]},fc=function(e,t){var n=t.valueToCode(this,"A",t.ORDER_ATOMIC)||"False";return["("+(t.valueToCode(this,"B",t.ORDER_ATOMIC)||"False")+" if "+n+" else "+(t.valueToCode(this,"C",t.ORDER_ATOMIC)||"False")+")",t.ORDER_ATOMIC]},_c=function(e,t){var n=t.valueToCode(this,"A",t.ORDER_ATOMIC)||"''",i=t.valueToCode(this,"B",t.ORDER_ATOMIC)||"''";return[n+" "+this.getFieldValue("BOOL")+" "+i,t.ORDER_ATOMIC]},mc=function(e,t){var n=t.valueToCode(this,"A",t.ORDER_ATOMIC)||"''",i=t.valueToCode(this,"B",t.ORDER_ATOMIC)||"''";return[n+" "+this.getFieldValue("BOOL")+" "+i,t.ORDER_ATOMIC]},bc=function(e,t){return["bool("+(t.valueToCode(this,"VAR",t.ORDER_ATOMIC)||"0")+")",t.ORDER_ATOMIC]},gc=function(e,t){return t.definitions_.import_os="import os","os.startfile("+t.valueToCode(this,"fn",t.ORDER_ATOMIC)+")\n"},Sc=function(e,t){return t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+" = open("+t.valueToCode(this,"FILENAME",t.ORDER_ATOMIC)+", '"+this.getFieldValue("MODE")+"')\n"},kc=function(e,t){return["open("+t.valueToCode(this,"FILENAME",t.ORDER_ATOMIC)+", '"+this.getFieldValue("MODE")+"')",t.ORDER_ATOMIC]},yc=function(e,t){return["open("+t.valueToCode(this,"FILENAME",t.ORDER_ATOMIC)+", '"+this.getFieldValue("MODE")+"', encoding=\""+this.getFieldValue("CODE")+'")',t.ORDER_ATOMIC]},vc=function(e,t){var n=t.valueToCode(this,"data",t.ORDER_ATOMIC);return t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".write("+n+")\n"},Tc=function(e,t){var n=this.getFieldValue("MODE");return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+"."+n+"()",t.ORDER_ATOMIC]},Ec=function(e,t){var n=this.getFieldValue("MODE");return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+"."+n+"("+t.valueToCode(this,"SIZE",t.ORDER_ATOMIC)+")",t.ORDER_ATOMIC]},Ic=function(e,t){return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".readline("+t.valueToCode(this,"SIZE",t.ORDER_ATOMIC)+")",t.ORDER_ATOMIC]},wc=function(e,t){return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".writable()",t.ORDER_ATOMIC]},xc=function(e,t){return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".name()",t.ORDER_ATOMIC]},Ac=function(e,t){return t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".close()\n"},$c=function(e,t){t.definitions_.import_os="import os";return["os.listdir()",t.ORDER_ATOMIC]},Oc=function(e,t){return t.definitions_.import_os="import os","os."+this.getFieldValue("MODE")+"("+t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+")\n"},Mc=function(e,t){return t.definitions_.import_os="import os",["os.path.getsize("+t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+")",t.ORDER_ATOMIC]},Cc=function(e,t){return[t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".tell()",t.ORDER_ATOMIC]},Rc=function(e,t){var n=this.getFieldValue("MODE"),i=0;return i="start"==n?0:"current"==n?1:2,t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+".seek("+t.valueToCode(this,"SIZE",t.ORDER_ATOMIC)+","+i+")\n"},Nc=function(e,t){return t.definitions_.import_os="import os","os.chdir("+t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+")\n"},Lc=function(e,t){t.definitions_.import_os="import os";return["os.getcwd()",t.ORDER_ATOMIC]},Dc=function(e,t){return t.definitions_.import_os="import os","os."+this.getFieldValue("MODE")+"("+t.valueToCode(this,"PATH",t.ORDER_ATOMIC)+")\n"},Pc=function(e,t){return t.definitions_.import_os="import os","os.rename("+t.valueToCode(this,"FILE",t.ORDER_ATOMIC)+","+t.valueToCode(this,"NEWFILE",t.ORDER_ATOMIC)+")\n"},Fc=function(e,t){t.definitions_.import_os="import os";var n=t.valueToCode(this,"FILE",t.ORDER_ATOMIC);return["os."+this.getFieldValue("MODE")+"("+n+")",t.ORDER_ATOMIC]},Bc=function(e,t){return t.definitions_.import_os="import os",t.definitions_.import_sdcard="import sdcard",t.valueToCode(this,"SUB",t.ORDER_ATOMIC)+" = sdcard.SDCard("+t.valueToCode(this,"SPISUB",t.ORDER_ATOMIC)+","+t.valueToCode(this,"PINSUB",t.ORDER_ATOMIC)+")\n"},jc=function(e,t){return t.definitions_.import_os="import os",t.definitions_.import_sdcard="import sdcard","os.mount("+t.valueToCode(this,"VAR",t.ORDER_ATOMIC)+","+t.valueToCode(this,"DIR",t.ORDER_ATOMIC)+")\n"},Vc=function(e,t){var n=t.variableDB_.getName(this.getFieldValue("NAME"),F.Procedures.NAME_TYPE),i=(this.getInput("STACK")&&t.statementToCode(this,"STACK"))??" pass\n";t.INFINITE_LOOP_TRAP&&(i=t.INFINITE_LOOP_TRAP.replace(/%1/g,"'"+this.id+"'")+i);var r=t.valueToCode(this,"RETURN",t.ORDER_NONE)||"";r&&(r=" return "+r+"\n");for(var s=[],o=0;o\n\n\n\t\n"+t.statementToCode(this,"HEAD")+"\n\n"+t.statementToCode(this,"BODY")+"\n\n'''",t.ORDER_ATOMIC]},Tp=function(e,t){var n=t.statementToCode(this,"DO"),i=this.getFieldValue("LEVEL");return"\n"+n+"\n"},Ep=function(e,t){var n=t.statementToCode(this,"DO"),i=this.getFieldValue("LEVEL");if("head"==i)var r="<"+i+'>\n\t\n'+n+"\n";else r="<"+i+">\n"+n+"\n";return r},Ip=function(e,t){var n=t.statementToCode(this,"DO"),i=this.getFieldValue("LEVEL");return"<"+i+">\n"+n+"\n"},wp=function(e,t){var n=t.statementToCode(this,"DO"),i=t.valueToCode(this,"style"),r=this.getFieldValue("LEVEL");return"<"+r+" "+i+" >\n"+n+"\n"},xp=function(e,t){return['style="'+t.statementToCode(this,"STYLE")+'"',t.ORDER_ATOMIC]},Ap=function(e,t){return'"},$p=function(){return this.getFieldValue("KEY")+":"+this.getFieldValue("VALUE")+";"},Op=function(){return this.getFieldValue("TEXT")+"\n"},Mp=function(e){return e.getFieldValue("TEXT")+"\n"},Cp=function(e,t){return[e.getFieldValue("TEXT"),t.ORDER_ATOMIC]},Rp=function(e,t){return(t.valueToCode(e,"VALUE",t.ORDER_ATOMIC)||"")+"\n"},Np=function(){return""},Lp=function(e,t){return["type("+(t.valueToCode(e,"VALUE",t.ORDER_MEMBER)||"___")+")",t.ORDER_ATOMIC]},Dp=function(e,t){for(var n=e.getFieldValue("NAME"),i=e.hasReturn_,r=new Array(e.itemCount_),s=0;s=0&&(i[r]=i[r].replace(" ",""));n="";for(r=0;rthis.#e.on("display",e)[0],uf.configure({output:e=>{this.#e.run("output",{content:e})},read:this.readFile.bind(this),inputfun:this.skInput.bind(this),inputfunTakesPrompt:!0,execLimit:Number.POSITIVE_INFINITY,fileread:this.fileread.bind(this),filewrite:this.filewrite.bind(this),__future__:uf.python3}),uf.builtins.value=new uf.builtin.func((function(){return uf.ffi.remapToPy(void 0===hf?5:hf)})),uf.builtins.set_value=new uf.builtin.func((function(e){hf=e.v})),uf.builtinFiles.files["./mixpy.py"]='import math\r\n\r\ndef math_map(v, al, ah, bl, bh):\r\n return bl + (bh - bl) * (v - al) / (ah - al)\r\n\r\ndef math_mean(myList):\r\n localList = [e for e in myList if type(e) == int or type(e) == float]\r\n if not localList: return\r\n return float(sum(localList)) / len(localList)\r\n\r\ndef math_median(myList):\r\n localList = sorted([e for e in myList if type(e) == int or type(e) == float])\r\n if not localList: return\r\n if len(localList) % 2 == 0:\r\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\r\n else:\r\n return localList[(len(localList) - 1) // 2]\r\n\r\ndef math_modes(some_list):\r\n modes = []\r\n # Using a lists of [item, count] to keep count rather than dict\r\n # to avoid "unhashable" errors when the counted item is itself a list or dict.\r\n counts = []\r\n maxCount = 1\r\n for item in some_list:\r\n found = False\r\n for count in counts:\r\n if count[0] == item:\r\n count[1] += 1\r\n maxCount = max(maxCount, count[1])\r\n found = True\r\n if not found:\r\n counts.append([item, 1])\r\n for counted_item, item_count in counts:\r\n if item_count == maxCount:\r\n modes.append(counted_item)\r\n return modes\r\n\r\ndef math_standard_deviation(numbers):\r\n n = len(numbers)\r\n if n == 0: return\r\n mean = float(sum(numbers)) / n\r\n variance = sum((x - mean) ** 2 for x in numbers) / n\r\n return math.sqrt(variance)\r\n\r\ndef lists_sort(my_list, type, reverse):\r\n def try_float(s):\r\n try:\r\n return float(s)\r\n except:\r\n return 0\r\n key_funcs = {\r\n "NUMERIC": try_float,\r\n "TEXT": str,\r\n "IGNORE_CASE": lambda s: str(s).lower()\r\n }\r\n key_func = key_funcs[type]\r\n list_cpy = list(my_list)\r\n return sorted(list_cpy, key=key_func, reverse=reverse)'}readFile(e){if(cf.matchModelName(e))return cf.load(e);if(void 0!==pf[e])return uf.misceval.promiseToSuspension(fetch(pf[e]).then((e=>e.text())));if(void 0===uf.builtinFiles||void 0===uf.builtinFiles.files[e])throw"File not found: '"+e+"'";return uf.builtinFiles.files[e]}fileread(e,t){return this.mixpyProject.exist(e)?this.mixpyProject.getFileContent(e):-1!==t.indexOf("w")?(this.mixpyProject.add(e,"",1),""):null}filewrite(e,t){var n=e.name;this.mixpyProject.modify(n,t),this.mixpyProject.select(n)}skInput(e){return new Promise(((t,n)=>{this.#e.run("input",{content:{prompt:e},resolve:t,reject:n})}))}reset(){uf.execLimit=Number.POSITIVE_INFINITY,uf.TurtleGraphics.reset&&uf.TurtleGraphics.reset()}kill(){uf.execLimit=0,this.executionEnd_()}step(e,t,n,i){if(".py"==i){var r=this.executionBuffer.step,s=this.parseGlobals(e);this.executionBuffer.trace.push({step:r,filename:i,line:t,column:n,properties:s.properties,modules:s.modules}),this.executionBuffer.step=r+1,this.executionBuffer.last_step=r+1,this.executionBuffer.line_number=t}}analyzeVariables(){if(""==this.main.model.programs.__main__().trim())return{}}analyze(){return this.main.model.execution.status("analyzing"),""!=this.main.model.programs.__main__().trim()||(this.main.components.feedback.emptyProgram("You haven't written any code yet!"),!1)}steprun(e){this.reset(),-1===e.indexOf("import blocklygame")&&-1===e.indexOf("from blocklygame import")||(cf.reset(),af()(uf.TurtleGraphics.target).empty()),-1!=e.indexOf("settedMap(4")|-1!=e.indexOf("settedMap(6")&&-1!=e.indexOf("moveDirection")&&(e+="actor.isCirculationRight()\n"),-1==e.indexOf("settedMap(5)")&&-1!=e.indexOf("moveDirection")&&(e+="actor.isSuccess()\n"),this.programStatus.running=!0,uf.misceval.asyncToPromise((()=>uf.importMainWithBody("",!1,e,!0))).then((()=>{this.programStatus.running=!1,this.#e.run("finished")})).catch((e=>{B.Debug.error(e),this.programStatus.running=!1,this.#e.run("error",e);var t=df(e);this.#e.run("finished"),-1===t.indexOf("TimeLimitError")&&this.executionEnd_()}))}run(e){if(this.reset(),-1===e.indexOf("import blocklygame")&&-1===e.indexOf("from blocklygame import")||(cf.reset(),af()(uf.TurtleGraphics.target).empty()),-1!==e.indexOf("import blocktool")||-1!==e.indexOf("import blocklygame")||-1!==e.indexOf("from blocklygame import")){var t=[];t=e.split("\n");for(var n=0;n=0){var i="",r=/,?'block_id=[\s\S]*'/.exec(t[n]);null!=r&&(i=r[0],t[n]=t[n].replace(i,""))}(t[n].indexOf("import blocktool")>=0||t[n].indexOf("blocktool.highlight")>=0)&&(t[n]="delete"),t[n].indexOf("blocklygame")>=0&&(t[n]=t[n].replace("blocklygame","bg_nonehl"))}e="";for(n=0;nuf.importMainWithBody("",!1,e,!0))).then((()=>{this.programStatus.running=!1,this.#e.run("finished")})).catch((e=>{B.Debug.error(e),this.programStatus.running=!1,this.#e.run("error",e);var t=df(e);this.#e.run("finished"),-1===t.indexOf("TimeLimitError")&&this.executionEnd_()}))}setupEnvironment(e,t,n,i,r){var s=this.main.model;this._backup_execution=uf.afterSingleExecution,uf.afterSingleExecution=void 0,uf.builtins.get_output=new uf.builtin.func((function(){return uf.builtin.pyCheckArgs("get_output",arguments,0,0),uf.ffi.remapToPy(s.execution.output())})),uf.builtins.reset_output=new uf.builtin.func((function(){uf.builtin.pyCheckArgs("reset_output",arguments,0,0),s.execution.output.removeAll()})),uf.builtins.log=new uf.builtin.func((function(e){uf.builtin.pyCheckArgs("log",arguments,1,1),console.log(e)})),uf.builtins._trace=t,uf.builtins._final_values=r,uf.builtins.code=uf.ffi.remapToPy(e),uf.builtins.set_success=this.instructor_module.set_success,uf.builtins.set_feedback=this.instructor_module.set_feedback,uf.builtins.set_finished=this.instructor_module.set_finished,uf.builtins.count_components=this.instructor_module.count_components,uf.builtins.no_nonlist_nums=this.instructor_module.no_nonlist_nums,uf.builtins.only_printing_properties=this.instructor_module.only_printing_properties,uf.builtins.calls_function=this.instructor_module.calls_function,uf.builtins.get_property=this.instructor_module.get_property,uf.builtins.get_value_by_name=this.instructor_module.get_value_by_name,uf.builtins.get_value_by_type=this.instructor_module.get_value_by_type,uf.builtins.parse_json=this.instructor_module.parse_json,uf.skip_drawing=!0,s.settings.mute_printer(!0)}disposeEnvironment(){uf.afterSingleExecution=this._backup_execution,uf.builtins.get_output=void 0,uf.builtins.reset_output=void 0,uf.builtins.log=void 0,uf.builtins._trace=void 0,uf.builtins.trace=void 0,uf.builtins.code=void 0,uf.builtins.set_success=void 0,uf.builtins.set_feedback=void 0,uf.builtins.set_finished=void 0,uf.builtins.count_components=void 0,uf.builtins.calls_function=void 0,uf.builtins.get_property=void 0,uf.builtins.get_value_by_name=void 0,uf.builtins.get_value_by_type=void 0,uf.builtins.no_nonlist_nums=void 0,uf.builtins.only_printing_properties=void 0,uf.builtins.parse_json=void 0,uf.skip_drawing=!1,hf=void 0,this.main.model.settings.mute_printer(!1)}parseGlobals(e){var t=Array(),n=Array();for(var i in e){var r=e[i];if("__name__"!==i&&"__doc__"!==i){i=i.replace("_$rw$","").replace("_$rn$","");var s=this.parseValue(i,r);null!==s?t.push(s):r.constructor==uf.builtin.module&&n.push(r.$d.__name__.v)}}return{properties:t,modules:n}}parseValue(e,t){if(null==t)return{name:e,type:"Unknown",value:"Undefined"};switch(t.constructor){case uf.builtin.func:return{name:e,type:"Function",value:void 0!==t.func_code.co_varnames?" Arguments: "+t.func_code.co_varnames.join(", "):" No arguments"};case uf.builtin.module:return null;case uf.builtin.str:return{name:e,type:"String",value:t.$r().v};case uf.builtin.none:return{name:e,type:"None",value:"None"};case uf.builtin.bool:return{name:e,type:"Boolean",value:t.$r().v};case uf.builtin.nmber:return{name:e,type:"int"==t.skType?"Integer":"Float",value:t.$r().v};case uf.builtin.int_:return{name:e,type:"Integer",value:t.$r().v};case uf.builtin.float_:return{name:e,type:"Float",value:t.$r().v};case uf.builtin.tuple:return{name:e,type:"Tuple",value:t.$r().v};case uf.builtin.list:return t.v.length<=20?{name:e,type:"List",value:t.$r().v,exact_value:t}:{name:e,type:"List",value:"[... "+t.v.length+" elements ...]",exact_value:t};case uf.builtin.dict:return{name:e,type:"Dictionary",value:t.$r().v};case Number:return{name:e,type:t%1==0?"Integer":"Float",value:t};case String:return{name:e,type:"String",value:t};case Boolean:return{name:e,type:"Boolean",value:t?"True":"False"};default:return{name:e,type:null==t.tp$name?t:t.tp$name,value:null==t.$r?t:t.$r().v}}}}class _f extends B.PageBase{static{B.HTMLTemplate.add("html/statusbar/statusbar-image.html",new B.HTMLTemplate('\r\n
\r\n
\r\n
')),this.init=function(){B.StatusBarsManager.typesRegistry.register(["images"],_f);const e=B.Workspace.getMain().getStatusBarsManager();e.add({type:"images",id:"images",name:F.Msg.MIXLY_MICROBIT_IMAGE,title:F.Msg.MIXLY_MICROBIT_IMAGE}),e.changeTo("output")}}constructor(){super();const e=af()(B.HTMLTemplate.get("html/statusbar/statusbar-image.html").render());this.setContent(e)}init(){super.init(),this.hideCloseBtn()}clean(){this.getContent().empty()}display(e){const t=this.getContent(),n=function(e){e.style.width="auto",e.style.height="auto",e.style.maxWidth="100%",e.style.maxHeight="100%"};this.clean();let i=e.content,r=null,s=null;switch(e.display_type){case"p5":i.style.width="100%",i.style.height="100%",i.style.display="flex",i.style.justifyContent="center",i.style.alignItems="center",new MutationObserver((function(e){e.forEach((e=>e.addedNodes.forEach((e=>{const t=e;null!=t.tagName&&["canvas","video"].includes(t.tagName.toLowerCase())&&n(t)}))))})).observe(i,{childList:!0}),i.querySelectorAll("canvas,video").forEach(n),t.append(i);break;case"matplotlib":r=i.querySelector("canvas"),r&&(i=r),i.style.width="",i.style.height="",i.style.maxWidth="100%",i.style.maxHeight="100%",t.append(i);break;case"ocaml-canvas":i.style.width="",i.style.height="",i.style.maxWidth="100%",i.style.maxHeight="100%",t.append(i);break;case"turtle":i.setAttribute("width","100%"),i.setAttribute("height","100%"),t.append(i.outerHTML);break;case"sympy":t.append(e.content),void 0===window.MathJax?(console.log("Loading MathJax (Sympy expression needs it)."),function(){let e=document.createElement("script");e.type="text/javascript",e.src="https://cdn.jsdelivr.net/npm/mathjax@3.0.5/es5/tex-mml-chtml.js",document.getElementsByTagName("head")[0].appendChild(e)}()):window.MathJax.typeset();break;case"multiple":for(let n of["image/svg+xml","image/png","text/html","text/plain"])if(n in e.content){let i=e.content[n];"image/png"===n&&(i=''),t.append(i);break}break;case"tutor":if(t.append(af()(e.content.replace("overflow-y%3A%20hidden%3B",""))),s=this.getContent()[0].getElementsByTagName("iframe")[0],null==s)return;s.style.maxHeight=s.style.minHeight="100%",new IntersectionObserver(((e,t)=>{const n=e[0];n&&!n.isIntersecting||(s.contentWindow?.postMessage({type:"redraw"},"*"),t.disconnect())})).observe(s);break;default:console.error(`Not supported node type '${e.display_type}' in eval.display result processing.`)}}}const mf=_f;class bf{static{this.pythonShell=null,this.init=async function(){mf.init(),this.pythonShell=new bf},this.steprun=function(){const e=B.Workspace.getMain().getEditorsManager().getActive().getCode();return this.pythonShell.steprun(e)},this.run=function(){const e=B.Workspace.getMain().getEditorsManager().getActive().getCode();return this.pythonShell.run(e)},this.stop=function(){return this.pythonShell.stop()}}#t=null;#n=null;#i=null;#r={row:0,column:0};#s="";#o=null;#a=null;#l=!1;#u=!1;#c=null;#p=()=>this.#h();#d=[{name:"REPL-Enter",bindKey:"Enter",exec:e=>{if(e.getSession().selection.getCursor().row===this.#r.row){const e=this.#t.getEndPos();let t=this.#t.getValueRange(this.#r,e);return t=t.replace(this.#s,""),this.#o?.(t),this.#o=null,this.#a=null,this.#t.addValue("\n"),this.#f(),!0}return!1}},{name:"REPL-ChangeEditor",bindKey:"Delete|Ctrl-X|Backspace",exec:e=>{const t=e.getSession().selection.getCursor();return t.row{this.#u=!1,this.#t.addValue(`\n==${B.Msg.Lang["shell.finish"]}==`)})),e.bind("output",(e=>{this.#t.addValue(e.content)})),e.bind("error",(e=>{this.#u=!1,this.#t.addValue(`\n${e.toString()}\n`)})),e.bind("input",(e=>{const t=String(e?.content?.prompt);this.#t.addValue(`>>> ${t}`),this.#s=t,this.#o=e.resolve,this.#a=e.reject,this.#m()})),e.bind("display",(e=>{this.#i.changeTo("images"),this.#n.display(e)}))}#h(){const e=this.#t.getEditor(),t=e.getSession().selection.getCursor();e.setReadOnly(t.rowsetTimeout(t,e)))}}const gf=bf,Sf={},kf=['\n \n ','\n \n ','\n \n ','\n \n ','\n \n ','\n \n ','\n \n '];Sf.$shadow=af()('
'),Sf.count=0,Sf.init=function(){gf.init();const e=B.app.getNav();e.register({icon:"icon-play-circled",title:"",id:"python-steprun-btn",displayText:F.Msg.MSG.step_run,preconditionFn:()=>!0,callback:()=>{gf.steprun().catch(B.Debug.error)},scopeType:B.Nav.Scope.LEFT,weight:4}),e.register({icon:"icon-play-circled",title:"",id:"python-run-btn",displayText:F.Msg.MSG.run,preconditionFn:()=>!0,callback:()=>{gf.run().catch(B.Debug.error)},scopeType:B.Nav.Scope.LEFT,weight:5}),e.register({icon:"icon-cancel",title:"",id:"python-stop-btn",displayText:F.Msg.MSG.stop,preconditionFn:()=>!0,callback:()=>{gf.stop().catch(B.Debug.error)},scopeType:B.Nav.Scope.LEFT,weight:6});const t=new B.HTMLTemplate("\r\n"),n=af()(t.render());e.getBoardSelector().before(n),n.select2({width:"90px",minimumResultsForSearch:1/0,dropdownCssClass:`mixly-scrollbar mixly-${t.getId()}`,dropdownAutoWidth:!0,placeholder:"",language:B.Msg.nowLang});for(let e=0;e{const{data:t}=e.params;B.Workspace.getMain().getEditorsManager().getActive().setValue(kf[parseInt(t.id)],".mix")})),n.on("select2:opening",(()=>{Sf.count+=1,af()(document.body).append(Sf.$shadow)})),n.on("select2:closing",(()=>{Sf.count-=1,!Sf.count&&Sf.$shadow.detach()})),n.trigger("change"),B.Storage.board("mix",kf[0]),B.Storage.board("path","")};Sf.init(),Object.assign(F.Variables,V),Object.assign(F.Procedures,Y),F.Python=H,F.generator=H,B.Profile.default={},Object.assign(F.Blocks,e,t,i,r,s,o,a,l,u,c,p,h,d,f,_,m,b,g),Object.assign(F.Python.forBlock,S,k,y,v,T,E,I,w,x,A,O,M,C,R,N,L,D,P)})()})(); \ No newline at end of file diff --git a/boards/default/python_skulpt_car/others/pyengine.js b/boards/default/python_skulpt_car/others/pyengine.js index 3160efc1..95fec6c3 100644 --- a/boards/default/python_skulpt_car/others/pyengine.js +++ b/boards/default/python_skulpt_car/others/pyengine.js @@ -1 +1,3 @@ -var mixpyProject=new MixpyProject,pyengine=new PyEngine({},mixpyProject);Sk.__future__=Sk.python3; \ No newline at end of file +var mixpyProject = new MixpyProject(); +var pyengine = new PyEngine({}, mixpyProject); +Sk.__future__ = Sk.python3; \ No newline at end of file diff --git a/boards/default/python_skulpt_car/styles/main.058da4a1.css b/boards/default/python_skulpt_car/styles/main.dc0521d8.css similarity index 99% rename from boards/default/python_skulpt_car/styles/main.058da4a1.css rename to boards/default/python_skulpt_car/styles/main.dc0521d8.css index c45ddb36..cc33f3f5 100644 --- a/boards/default/python_skulpt_car/styles/main.058da4a1.css +++ b/boards/default/python_skulpt_car/styles/main.dc0521d8.css @@ -1,3 +1,6 @@ +/*!*********************************************************************************************************************************************!*\ + !*** css ../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./css/color_mixpy_python_skulpt.css ***! + \*********************************************************************************************************************************************/ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAuIwF4pT92AAA4JmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDctMjFUMjE6MTY6MjIrMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0xMC0yNlQxNjo1NTo0NiswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTktMTAtMjZUMTY6NTU6NDYrMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6ZGFjMDQyYmMtODZjZC02MzQwLWExYjItZjA5MTkyOGMzM2Q4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmRhYzA0MmJjLTg2Y2QtNjM0MC1hMWIyLWYwOTE5MjhjMzNkODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmRhYzA0MmJjLTg2Y2QtNjM0MC1hMWIyLWYwOTE5MjhjMzNkODwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpkYWMwNDJiYy04NmNkLTYzNDAtYTFiMi1mMDkxOTI4YzMzZDg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDctMjFUMjE6MTY6MjIrMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4zMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4zMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4zMjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zMjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+z0WRKgAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADjUlEQVR42sSXT6hVVRTGf9865x4H74U0c1RKEDgJamSTGjUoKgIR1ItOoyzE8ElBIUiFvuebqEnhIKzrn8iKSqiJk6igSQ0LIkdFICj+eUWee/f+Gpx773s+yXevXfFMDpy9z1q//a219tpbtrmbjwYAZ2Y2ra9dPWHpQeEMpAnYD8BAInNM+JfBwJb5kzcCnJ7ZOpOJA4DuwDqR8245zQ/Mb54/dSPAiZlth4VfAr4FfwCsmYDnq8D9oF3C89i7hwocXKbAyZn2UdALNq9LfmsCwQULzBoUf4p8VE47hgocPHUTwDugF232Avsk+uEb068MBrtxZLRO4jxwxOblwbz2wc6tAYbGxoq0yQ66qUUoUxU1ku9V5tK1YnrfX+XU3sJNbu94+8jKAONCdFOLlAuyg6qop6qiXoW4lHPcY6lGXB8qMNsZDQBA4ZGi0UslopkbRZ6P8CspxzOYsyI30Y9mUVtmT46hgEZLB8k4i14usGNDWfa+C4gMbzrrDQwqGnsjK6Doex4jHYxIqSCUicjHQdttvibzlENWeDQAhRuADLbWAVNAb8RqaNn6FfMP0mfAc5g/LB6X/NvW2RMjKLC4Jz4r+HxC2+IVw672XOf9FQF6qSQ5KCKvaxXd3aAe0L2NftAF/u4reMXiq/Zs58cVNiKTckHdqygiUbXqZmebTAtktBD0a1syraI7uT41DsBiFUyqSRoj2nOd0ZJwCJDvAkAoD1Rfa8dO4BqQ+8kUt9GtpoCLhi/bc50fVlYggWwIPUrB90xMA15rz3X2r1gFTXMpkRJV0X1M8jlQaXMI2Cl5NXDfGKVZGV0ELrTnOt1bA2AyQbfXVEEZXZBWh/wN8JDNAeBV4bGKw/3JI+XAQIWcg6qsm58NEX4XeB64rpwfBn4mmqT1CtUyHkA/Y3uppIi02BVlJLYLjueszcBHtpBMRL4h2MO3+oDjACw9kBg1q+sbU2O9rHtVyg5HZMroUUZvuQrTBueIv5Z+3Db74e0fyQahGOyUA+eSFyEHcyPOFyldqOp6gyXo+9t4+Mz/P5QaIbzoeFmtAaSiuL6qrn9fffXqAzliOPzksbOTOpb7v3uEIRfF5aquL08vLKxdCvD0e1/c8YtJDZCj2F/V9U/TCwuP3BLg9J6tM9mTv5pZokjp06quN1qLpjce+njZ5XTPpvV1nujlVP2CbQl/Ivvc0sGbrmZ36/l3AHnYit+0RI/wAAAAAElFTkSuQmCC) no-repeat; background-size: 100% auto; @@ -139,3 +142,5 @@ div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTr background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACC0lEQVRYR+2XwU3DQBBF/78hgQTcuBEk7kAF0AF0QFIBdADcuCV0ABUAHdABNICUAjjkwP2jH8aWSbxZ42BxyUiWZXl35u3f2RmbWMIkHQI4I3nd1g3bTvQ8SScArkn63sp+BSCpB+AYgFfuaw3ABoAPABMAbwCeSfreyBoBSDoDcAVgG8ALgKcI6KC+DGazEh67CeAewB1Jv0/aQoDY4yEAj7PUDp41SVsALuMakrxJTUoCSOoDGEWSNQo8GyS2zD4EYFCnRi2AJE+ayklynF1yZkDF38ksxBxArNzyzQ1eBkSSfZ6TPKr6+QEQe265e7nkaQMjyYkpkoNi/iyA5e43TbaWED6il0WMEiCkt+xOvs5stnhVAbx6AyyddDl6Sd7m6bGeAsTej5Ypqbmg1fdVtQsAH7sxSd87tyhUbyR7BUApSefRI4AkJ2O/APBD8twHsXuBa/4DSfeCOauMcyn2uGQFLfMgcsBnc1FZdr83gG1C0k2pDsBbeBEvvKV7KUWjJjwVCuQAXEDOK8726k6LJCtzWhaZ/KLAaLWPGQXcFwyxG9LW1orwZRW8BT5VyS+l6A8HBnCnwiKALhIzcuB4BWAF/Mm0+Z9b4I/L138AuAWw0+gYdpSE0xOyAlgpUCoQfzxd5FvK53dnjW6Y+rncB7D+B1TvAD5r/Ixzv2at/ohqAt2TdDObsy+R5Si4d0zHdAAAAABJRU5ErkJggg==) no-repeat; background-size: 100% auto; } + +/*# sourceMappingURL=main.dc0521d8.css.map*/ \ No newline at end of file diff --git a/boards/default/python_skulpt_car/styles/main.dc0521d8.css.map b/boards/default/python_skulpt_car/styles/main.dc0521d8.css.map new file mode 100644 index 00000000..b1f17c09 --- /dev/null +++ b/boards/default/python_skulpt_car/styles/main.dc0521d8.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/main.dc0521d8.css","mappings":";;;AAAA;IACI,6DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,6DAAqE;IACrE,0BAA0B;AAC9B;;AAEA;IACI,6DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,6DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,6DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,6DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,6DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,6DAAqE;IACrE,0BAA0B;AAC9B;;AAEA;IACI,6DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,6DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAqE;IACrE,0BAA0B;AAC9B;;AAEA;IACI,8DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;;AAGA;IACI,8DAAkE;IAClE,0BAA0B;AAC9B;;AAEA;IACI,8DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,8DAAkE;IAClE,0BAA0B;AAC9B;;AAEA;IACI,8DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,8DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;;AAGA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAAmE;IACnE,0BAA0B;AAC9B;;AAEA;IACI,8DAAoE;IACpE,0BAA0B;AAC9B;;AAEA;IACI,8DAA+E;IAC/E,0BAA0B;AAC9B;;AAEA;IACI,8DAAgF;IAChF,0BAA0B;AAC9B,C","sources":["webpack://@mixly/python-skulpt-car/./css/color_mixpy_python_skulpt.css"],"sourcesContent":["div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/inout.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/inout2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/ctrl.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/ctrl2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/math.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/math2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/logic.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/logic2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/text.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/text2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/list3.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/list4.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/tuple.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/tuple2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/dict.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/dict2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/set.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/set2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/var.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/var2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/func.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/func2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/game5.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/game6.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/data.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/data2.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/machine_learning.png') no-repeat;\r\n background-size: 100% auto;\r\n}\r\n\r\ndiv.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {\r\n background: url('../../../../common/media/mark/machine_learning2.png') no-repeat;\r\n background-size: 100% auto;\r\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/boards/default_src/python_pyodide/others/loader.js b/boards/default_src/python_pyodide/others/loader.js index 1700189d..296ea8ad 100644 --- a/boards/default_src/python_pyodide/others/loader.js +++ b/boards/default_src/python_pyodide/others/loader.js @@ -6,7 +6,7 @@ import * as Blockly from 'blockly/core'; NavExt.init(); window.tf = tf; -let featureExtractor; +// let featureExtractor; // featureExtractor = await tf.loadGraphModel("../common/media/tfmodel/model.json"); // window.featureExtractor = featureExtractor; @@ -321,7 +321,7 @@ async function prepare_qmyixtxi(imgTensor) { .sub(tf.scalar(1)) .expandDims(0); - const features = featureExtractor.predict(preprocessedImg); + const features = window.featureExtractor.predict(preprocessedImg); let activation = features; return activation; diff --git a/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_highlight.js b/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_highlight.js index 8c458557..43bb2bce 100644 --- a/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_highlight.js +++ b/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_highlight.js @@ -252,7 +252,7 @@ var $builtinmodule = function (name) { map:[ [0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 1, 0], - [0, 1, 1, 2, 21, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], @@ -260,7 +260,7 @@ var $builtinmodule = function (name) { [0, 0, 0, 0, 0, 0, 0, 0]], tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 - background: '../common/js/skulpt_mixcar/pic/bg4.jpg',//地图背景图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 wall:'', award:'', barrier:'', diff --git a/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_nonehl.js b/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_nonehl.js index 18296d3f..12ab6227 100644 --- a/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_nonehl.js +++ b/boards/default_src/python_skulpt_car/others/skulpt/libs/bg_nonehl.js @@ -252,7 +252,7 @@ var $builtinmodule = function (name) { map:[ [0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 1, 0], - [0, 1, 1, 2, 21, 0, 1, 0], + [0, 1, 1, 2, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1, 0], @@ -260,7 +260,7 @@ var $builtinmodule = function (name) { [0, 0, 0, 0, 0, 0, 0, 0]], tiles: '../common/js/skulpt_mixcar/pic/tiles_road.png',//地图路径图片 marker: '../common/js/skulpt_mixcar/pic/Start_final.png',//终点图标图片 - background: '../common/js/skulpt_mixcar/pic/bg4.jpg',//地图背景图片 + background: '../common/js/skulpt_mixcar/pic/bg1.jpg',//地图背景图片 wall:'', award:'', barrier:'',