{"id":"asteroids-collisions","slug":"collisions","title":"Bumping into jellyfish","text":"A jellyfish that drifts through the submarine should end the dive. So the game needs to know when two shapes **overlap**, and then the sea needs more than two jellyfish.\n\n### Shape.intersect\n\nThe class Shape has a static method for this: `Shape.intersect(a, b)` returns a new shape, the area that `a` and `b` share, with each one where its translate and rotate put it. Shapes that don't overlap share nothing, and then the box around that empty area, `getBoundsInLocal()`, has the width -1. So two shapes overlap when that width isn't -1:\n\n```java\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\nimport javafx.scene.shape.Rectangle;\nimport javafx.scene.shape.Shape;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Polygon sub = new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6);\n        sub.setFill(Color.GOLD);\n        sub.setTranslateX(180);\n        sub.setTranslateY(100);\n        Polygon near = new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10);\n        near.setFill(Color.ORCHID);\n        near.setTranslateX(192);\n        near.setTranslateY(108);\n        Polygon far = new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10);\n        far.setFill(Color.ORCHID);\n        far.setTranslateX(240);\n        far.setTranslateY(60);\n        Rectangle rock = new Rectangle(20, 200, 100, 40);\n        rock.setFill(Color.DIMGRAY);\n        Rectangle reef = new Rectangle(120, 180, 60, 60);\n        reef.setFill(Color.CORAL);\n        pane.getChildren().addAll(sub, near, far, rock, reef);\n\n        Shape shared = Shape.intersect(sub, near);\n        System.out.println(\"sub and near: \" + shared.getBoundsInLocal().getWidth());\n        System.out.println(\"sub and far: \" + Shape.intersect(sub, far).getBoundsInLocal().getWidth());\n        System.out.println(\"rock and reef: \" + Shape.intersect(rock, reef).getBoundsInLocal().getWidth());\n\n        stage.setScene(new Scene(pane));\n        stage.setTitle(\"Overlaps\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n```\n\n```window\n{\"events\":[],\"window\":{\"windows\":[{\"title\":\"Overlaps\",\"scene\":{\"width\":360,\"height\":240,\"root\":{\"n\":1,\"type\":\"Pane\",\"prefWidth\":360,\"prefHeight\":240,\"children\":[{\"n\":2,\"type\":\"Rectangle\",\"x\":0,\"y\":0,\"width\":360,\"height\":240,\"fill\":\"#191970\"},{\"n\":3,\"type\":\"Polygon\",\"translateX\":180,\"translateY\":100,\"points\":[-15,-6,9,-6,15,0,9,6,-15,6],\"fill\":\"#ffd700\"},{\"n\":4,\"type\":\"Polygon\",\"translateX\":192,\"translateY\":108,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":5,\"type\":\"Polygon\",\"translateX\":240,\"translateY\":60,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":6,\"type\":\"Rectangle\",\"x\":20,\"y\":200,\"width\":100,\"height\":40,\"fill\":\"#696969\"},{\"n\":7,\"type\":\"Rectangle\",\"x\":120,\"y\":180,\"width\":60,\"height\":60,\"fill\":\"#ff7f50\"}]}}}],\"problems\":[]},\"outline\":\"Window \\\"Overlaps\\\"\\n  Pane 360 x 240\\n    Rectangle 360 x 240 at (0, 0), fill #191970\\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (180, 100), fill #ffd700\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (192, 108), fill #da70d6\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (240, 60), fill #da70d6\\n    Rectangle 100 x 40 at (20, 200), fill #696969\\n    Rectangle 60 x 60 at (120, 180), fill #ff7f50\"}\n```\n\n```output\nsub and near: 12.0\nsub and far: -1.0\nrock and reef: -1.0\n```\n\n- The submarine and the near jellyfish overlap: their shared area is 12 pixels wide.\n- The far jellyfish shares nothing with the submarine: -1.\n- The rock and the reef **touch**: the rock ends at x 120, where the reef starts. Touching isn't overlapping, since they share a line but no area, so that's -1 too.\n\nThe shapes must be in the same pane, as they are in a game. `intersect` works for polygons, circles and rectangles, turned and moved: the jellyfish's tentacles and the gaps between them count exactly, not only the box around them.\n\nSo the class Mover gets one more method:\n\n```java\npublic boolean collides(Mover other) {\n    Shape overlap = Shape.intersect(shape, other.getShape());\n    return overlap.getBoundsInLocal().getWidth() != -1;\n}\n```\n\n### Circles, with a ruler\n\nFor two circles there's a simpler test, which needs no JavaFX: they overlap when the distance between their centers is less than the sum of their radii. If it's exactly equal, they only touch. The distance between (x1, y1) and (x2, y2) is, by Pythagoras, the square root of dx² + dy², where dx and dy are the differences of the x and y values: `Math.sqrt(dx * dx + dy * dy)`, as `Point2D`'s `distance` method computes it. The first challenge below uses this rule.\n\n### Many jellyfish, from a seeded Random\n\nA sea with a handful of jellyfish in random places is more fun than two placed by hand. Module 46 made random numbers with `Random`, and said why a **seed** matters: `new Random(8)` gives the same numbers on every run. Here that's not a choice. The page runs your program again **from the start** for every new key or `frames` line, so an unseeded Random would put the jellyfish somewhere else on every run, and the game would jump around under your eyes. (The check also compares your window with the model solution's, which needs the same jellyfish.) So every game in these lessons gives its Random a seed.\n\n### Stopping the game\n\nWhen the submarine bumps into a jellyfish, the game is over: the submarine turns red, and the timer **stops**. `stop()` is AnimationTimer's method, and inside `handle` it can be called as just `stop()`, since `handle` belongs to the timer. A stopped timer's `handle` isn't called again, so nothing moves in the frames after it, though they still run and count.\n\n```java\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\nimport javafx.animation.AnimationTimer;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.input.KeyCode;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Rectangle;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n    private Map<KeyCode, Boolean> held = new HashMap<>();\n    private Random random = new Random(8);\n    private int frame = 0;\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Sub sub = new Sub(180, 200);\n        pane.getChildren().add(sub.getShape());\n        List<Jellyfish> jellyfish = new ArrayList<>();\n        for (int i = 0; i < 5; i++) {\n            Jellyfish j = new Jellyfish(random.nextInt(360), random.nextInt(100), random.nextInt(360));\n            jellyfish.add(j);\n            pane.getChildren().add(j.getShape());\n        }\n\n        Scene scene = new Scene(pane);\n        scene.setOnKeyPressed(event -> held.put(event.getCode(), true));\n        scene.setOnKeyReleased(event -> held.put(event.getCode(), false));\n\n        new AnimationTimer() {\n            @Override\n            public void handle(long now) {\n                frame++;\n                if (held.getOrDefault(KeyCode.LEFT, false)) {\n                    sub.turn(-4);\n                }\n                if (held.getOrDefault(KeyCode.RIGHT, false)) {\n                    sub.turn(4);\n                }\n                if (held.getOrDefault(KeyCode.UP, false)) {\n                    sub.accelerate(0.125);\n                }\n                sub.move();\n                jellyfish.forEach(j -> j.move());\n                for (Jellyfish j : jellyfish) {\n                    if (sub.collides(j)) {\n                        sub.getShape().setFill(Color.RED);\n                        System.out.println(\"Bump after \" + frame + \" frames\");\n                        stop();\n                        break;\n                    }\n                }\n            }\n        }.start();\n\n        stage.setScene(scene);\n        stage.setTitle(\"Jellyfish\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n// ==== Mover.java ====\nimport javafx.geometry.Point2D;\nimport javafx.scene.shape.Shape;\n\npublic abstract class Mover {\n    private Shape shape;\n    private Point2D velocity;\n\n    public Mover(Shape shape, double x, double y) {\n        this.shape = shape;\n        this.shape.setTranslateX(x);\n        this.shape.setTranslateY(y);\n        this.velocity = new Point2D(0, 0);\n    }\n\n    public Shape getShape() {\n        return shape;\n    }\n\n    public void turn(double degrees) {\n        shape.setRotate(shape.getRotate() + degrees);\n    }\n\n    public void accelerate(double amount) {\n        double angle = Math.toRadians(shape.getRotate());\n        velocity = velocity.add(Math.cos(angle) * amount, Math.sin(angle) * amount);\n    }\n\n    public void move() {\n        shape.setTranslateX(shape.getTranslateX() + velocity.getX());\n        shape.setTranslateY(shape.getTranslateY() + velocity.getY());\n    }\n\n    public boolean collides(Mover other) {\n        Shape overlap = Shape.intersect(shape, other.getShape());\n        return overlap.getBoundsInLocal().getWidth() != -1;\n    }\n}\n\n// ==== Sub.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Sub extends Mover {\n\n    public Sub(double x, double y) {\n        super(new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6), x, y);\n        getShape().setFill(Color.GOLD);\n    }\n}\n\n// ==== Jellyfish.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Jellyfish extends Mover {\n\n    public Jellyfish(double x, double y, double heading) {\n        super(new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10), x, y);\n        getShape().setFill(Color.ORCHID);\n        turn(heading);\n        accelerate(0.5);\n    }\n\n    @Override\n    public void move() {\n        super.move();\n        turn(1);\n    }\n}\n```\n\n```window\n{\"events\":[\"press key LEFT\",\"frames 22\",\"release key LEFT\",\"press key UP\",\"frames 10\",\"release key UP\",\"frames 150\"],\"window\":{\"windows\":[{\"title\":\"Jellyfish\",\"scene\":{\"width\":360,\"height\":240,\"onKeyPressed\":true,\"onKeyReleased\":true,\"root\":{\"n\":1,\"type\":\"Pane\",\"f\":1,\"prefWidth\":360,\"prefHeight\":240,\"children\":[{\"n\":2,\"type\":\"Rectangle\",\"f\":2,\"x\":0,\"y\":0,\"width\":360,\"height\":240,\"fill\":\"#191970\"},{\"n\":3,\"type\":\"Polygon\",\"f\":3,\"translateX\":183.9043811935918,\"translateY\":88.19315122723808,\"rotate\":-88,\"points\":[-15,-6,9,-6,15,0,9,6,-15,6],\"fill\":\"#ff0000\"},{\"n\":4,\"type\":\"Polygon\",\"f\":4,\"translateX\":301.1188496747079,\"translateY\":66.07159430468215,\"rotate\":126,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":5,\"type\":\"Polygon\",\"f\":5,\"translateX\":7.223336435126232,\"translateY\":93.72718241812248,\"rotate\":274,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":6,\"type\":\"Polygon\",\"f\":6,\"translateX\":-6.5676767951966255,\"translateY\":38.06842191749874,\"rotate\":289,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":7,\"type\":\"Polygon\",\"f\":7,\"translateX\":182.88115032529208,\"translateY\":64.07159430468215,\"rotate\":286,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"n\":8,\"type\":\"Polygon\",\"f\":8,\"translateX\":12.813210422927078,\"translateY\":87.73531732552561,\"rotate\":264,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"}]}}}],\"problems\":[],\"frames\":{\"count\":182,\"list\":[[{\"roots\":[1]},{\"k\":1,\"type\":\"Pane\",\"children\":[2,3,4,5,6,7,8]},{\"k\":2,\"type\":\"Rectangle\",\"width\":360,\"height\":240,\"fill\":\"#191970\"},{\"k\":3,\"type\":\"Polygon\",\"tx\":180,\"ty\":200,\"r\":-4,\"points\":[-15,-6,9,-6,15,0,9,6,-15,6],\"fill\":\"#ffd700\"},{\"k\":4,\"type\":\"Polygon\",\"tx\":244.49,\"ty\":56.09,\"r\":11,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"k\":5,\"type\":\"Polygon\",\"tx\":60.54,\"ty\":72.19,\"r\":159,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"k\":6,\"type\":\"Polygon\",\"tx\":50.5,\"ty\":31.06,\"r\":174,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"k\":7,\"type\":\"Polygon\",\"tx\":239.51,\"ty\":54.09,\"r\":171,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"},{\"k\":8,\"type\":\"Polygon\",\"tx\":61.58,\"ty\":57.26,\"r\":149,\"points\":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],\"fill\":\"#da70d6\"}],[{\"k\":3,\"r\":-8},{\"k\":4,\"tx\":244.98,\"ty\":56.17,\"r\":12},{\"k\":5,\"tx\":60.07,\"ty\":72.37,\"r\":160},{\"k\":6,\"tx\":50.01,\"ty\":31.12,\"r\":175},{\"k\":7,\"tx\":239.02,\"ty\":54.17,\"r\":172},{\"k\":8,\"tx\":61.15,\"ty\":57.53,\"r\":150}],[{\"k\":3,\"r\":-12},{\"k\":4,\"tx\":245.48,\"ty\":56.26,\"r\":13},{\"k\":5,\"tx\":59.61,\"ty\":72.56,\"r\":161},{\"k\":6,\"tx\":49.51,\"ty\":31.18,\"r\":176},{\"k\":7,\"tx\":238.52,\"ty\":54.26,\"r\":173},{\"k\":8,\"tx\":60.73,\"ty\":57.79,\"r\":151}],[{\"k\":3,\"r\":-16},{\"k\":4,\"tx\":245.97,\"ty\":56.35,\"r\":14},{\"k\":5,\"tx\":59.15,\"ty\":72.75,\"r\":162},{\"k\":6,\"tx\":49.01,\"ty\":31.24,\"r\":177},{\"k\":7,\"tx\":238.03,\"ty\":54.35,\"r\":174},{\"k\":8,\"tx\":60.3,\"ty\":58.06,\"r\":152}],[{\"k\":3,\"r\":-20},{\"k\":4,\"tx\":246.46,\"ty\":56.43,\"r\":15},{\"k\":5,\"tx\":58.68,\"ty\":72.94,\"r\":163},{\"k\":6,\"tx\":48.52,\"ty\":31.3,\"r\":178},{\"k\":7,\"tx\":237.54,\"ty\":54.43,\"r\":175},{\"k\":8,\"tx\":59.88,\"ty\":58.32,\"r\":153}],[{\"k\":3,\"r\":-24},{\"k\":4,\"tx\":246.95,\"ty\":56.52,\"r\":16},{\"k\":5,\"tx\":58.22,\"ty\":73.12,\"r\":164},{\"k\":6,\"tx\":48.02,\"ty\":31.37,\"r\":179},{\"k\":7,\"tx\":237.05,\"ty\":54.52,\"r\":176},{\"k\":8,\"tx\":59.46,\"ty\":58.59,\"r\":154}],[{\"k\":3,\"r\":-28},{\"k\":4,\"tx\":247.45,\"ty\":56.61,\"r\":17},{\"k\":5,\"tx\":57.75,\"ty\":73.31,\"r\":165},{\"k\":6,\"tx\":47.53,\"ty\":31.43,\"r\":180},{\"k\":7,\"tx\":236.55,\"ty\":54.61,\"r\":177},{\"k\":8,\"tx\":59.03,\"ty\":58.85,\"r\":155}],[{\"k\":3,\"r\":-32},{\"k\":4,\"tx\":247.94,\"ty\":56.69,\"r\":18},{\"k\":5,\"tx\":57.29,\"ty\":73.5,\"r\":166},{\"k\":6,\"tx\":47.03,\"ty\":31.49,\"r\":181},{\"k\":7,\"tx\":236.06,\"ty\":54.69,\"r\":178},{\"k\":8,\"tx\":58.61,\"ty\":59.12,\"r\":156}],[{\"k\":3,\"r\":-36},{\"k\":4,\"tx\":248.43,\"ty\":56.78,\"r\":19},{\"k\":5,\"tx\":56.83,\"ty\":73.69,\"r\":167},{\"k\":6,\"tx\":46.53,\"ty\":31.55,\"r\":182},{\"k\":7,\"tx\":235.57,\"ty\":54.78,\"r\":179},{\"k\":8,\"tx\":58.18,\"ty\":59.38,\"r\":157}],[{\"k\":3,\"r\":-40},{\"k\":4,\"tx\":248.92,\"ty\":56.87,\"r\":20},{\"k\":5,\"tx\":56.36,\"ty\":73.87,\"r\":168},{\"k\":6,\"tx\":46.04,\"ty\":31.61,\"r\":183},{\"k\":7,\"tx\":235.08,\"ty\":54.87,\"r\":180},{\"k\":8,\"tx\":57.76,\"ty\":59.65,\"r\":158}],[{\"k\":3,\"r\":-44},{\"k\":4,\"tx\":249.42,\"ty\":56.96,\"r\":21},{\"k\":5,\"tx\":55.9,\"ty\":74.06,\"r\":169},{\"k\":6,\"tx\":45.54,\"ty\":31.67,\"r\":184},{\"k\":7,\"tx\":234.58,\"ty\":54.96,\"r\":181},{\"k\":8,\"tx\":57.34,\"ty\":59.91,\"r\":159}],[{\"k\":3,\"r\":-48},{\"k\":4,\"tx\":249.91,\"ty\":57.04,\"r\":22},{\"k\":5,\"tx\":55.44,\"ty\":74.25,\"r\":170},{\"k\":6,\"tx\":45.04,\"ty\":31.73,\"r\":185},{\"k\":7,\"tx\":234.09,\"ty\":55.04,\"r\":182},{\"k\":8,\"tx\":56.91,\"ty\":60.18,\"r\":160}],[{\"k\":3,\"r\":-52},{\"k\":4,\"tx\":250.4,\"ty\":57.13,\"r\":23},{\"k\":5,\"tx\":54.97,\"ty\":74.43,\"r\":171},{\"k\":6,\"tx\":44.55,\"ty\":31.79,\"r\":186},{\"k\":7,\"tx\":233.6,\"ty\":55.13,\"r\":183},{\"k\":8,\"tx\":56.49,\"ty\":60.44,\"r\":161}],[{\"k\":3,\"r\":-56},{\"k\":4,\"tx\":250.89,\"ty\":57.22,\"r\":24},{\"k\":5,\"tx\":54.51,\"ty\":74.62,\"r\":172},{\"k\":6,\"tx\":44.05,\"ty\":31.85,\"r\":187},{\"k\":7,\"tx\":233.11,\"ty\":55.22,\"r\":184},{\"k\":8,\"tx\":56.06,\"ty\":60.71,\"r\":162}],[{\"k\":3,\"r\":-60},{\"k\":4,\"tx\":251.39,\"ty\":57.3,\"r\":25},{\"k\":5,\"tx\":54.05,\"ty\":74.81,\"r\":173},{\"k\":6,\"tx\":43.56,\"ty\":31.91,\"r\":188},{\"k\":7,\"tx\":232.61,\"ty\":55.3,\"r\":185},{\"k\":8,\"tx\":55.64,\"ty\":60.97,\"r\":163}],[{\"k\":3,\"r\":-64},{\"k\":4,\"tx\":251.88,\"ty\":57.39,\"r\":26},{\"k\":5,\"tx\":53.58,\"ty\":75,\"r\":174},{\"k\":6,\"tx\":43.06,\"ty\":31.97,\"r\":189},{\"k\":7,\"tx\":232.12,\"ty\":55.39,\"r\":186},{\"k\":8,\"tx\":55.22,\"ty\":61.24,\"r\":164}],[{\"k\":3,\"r\":-68},{\"k\":4,\"tx\":252.37,\"ty\":57.48,\"r\":27},{\"k\":5,\"tx\":53.12,\"ty\":75.18,\"r\":175},{\"k\":6,\"tx\":42.56,\"ty\":32.04,\"r\":190},{\"k\":7,\"tx\":231.63,\"ty\":55.48,\"r\":187},{\"k\":8,\"tx\":54.79,\"ty\":61.5,\"r\":165}],[{\"k\":3,\"r\":-72},{\"k\":4,\"tx\":252.86,\"ty\":57.56,\"r\":28},{\"k\":5,\"tx\":52.66,\"ty\":75.37,\"r\":176},{\"k\":6,\"tx\":42.07,\"ty\":32.1,\"r\":191},{\"k\":7,\"tx\":231.14,\"ty\":55.56,\"r\":188},{\"k\":8,\"tx\":54.37,\"ty\":61.77,\"r\":166}],[{\"k\":3,\"r\":-76},{\"k\":4,\"tx\":253.36,\"ty\":57.65,\"r\":29},{\"k\":5,\"tx\":52.19,\"ty\":75.56,\"r\":177},{\"k\":6,\"tx\":41.57,\"ty\":32.16,\"r\":192},{\"k\":7,\"tx\":230.64,\"ty\":55.65,\"r\":189},{\"k\":8,\"tx\":53.94,\"ty\":62.03,\"r\":167}],[{\"k\":3,\"r\":-80},{\"k\":4,\"tx\":253.85,\"ty\":57.74,\"r\":30},{\"k\":5,\"tx\":51.73,\"ty\":75.75,\"r\":178},{\"k\":6,\"tx\":41.07,\"ty\":32.22,\"r\":193},{\"k\":7,\"tx\":230.15,\"ty\":55.74,\"r\":190},{\"k\":8,\"tx\":53.52,\"ty\":62.3,\"r\":168}],[{\"k\":3,\"r\":-84},{\"k\":4,\"tx\":254.34,\"ty\":57.82,\"r\":31},{\"k\":5,\"tx\":51.26,\"ty\":75.93,\"r\":179},{\"k\":6,\"tx\":40.58,\"ty\":32.28,\"r\":194},{\"k\":7,\"tx\":229.66,\"ty\":55.82,\"r\":191},{\"k\":8,\"tx\":53.1,\"ty\":62.56,\"r\":169}],[{\"k\":3,\"r\":-88},{\"k\":4,\"tx\":254.83,\"ty\":57.91,\"r\":32},{\"k\":5,\"tx\":50.8,\"ty\":76.12,\"r\":180},{\"k\":6,\"tx\":40.08,\"ty\":32.34,\"r\":195},{\"k\":7,\"tx\":229.17,\"ty\":55.91,\"r\":192},{\"k\":8,\"tx\":52.67,\"ty\":62.83,\"r\":170}],[{\"k\":3,\"ty\":199.88},{\"k\":4,\"tx\":255.33,\"ty\":58,\"r\":33},{\"k\":5,\"tx\":50.34,\"ty\":76.31,\"r\":181},{\"k\":6,\"tx\":39.59,\"ty\":32.4,\"r\":196},{\"k\":7,\"tx\":228.67,\"ty\":56,\"r\":193},{\"k\":8,\"tx\":52.25,\"ty\":63.09,\"r\":171}],[{\"k\":3,\"tx\":180.01,\"ty\":199.63},{\"k\":4,\"tx\":255.82,\"ty\":58.08,\"r\":34},{\"k\":5,\"tx\":49.87,\"ty\":76.5,\"r\":182},{\"k\":6,\"tx\":39.09,\"ty\":32.46,\"r\":197},{\"k\":7,\"tx\":228.18,\"ty\":56.08,\"r\":194},{\"k\":8,\"tx\":51.82,\"ty\":63.36,\"r\":172}],[{\"k\":3,\"tx\":180.03,\"ty\":199.25},{\"k\":4,\"tx\":256.31,\"ty\":58.17,\"r\":35},{\"k\":5,\"tx\":49.41,\"ty\":76.68,\"r\":183},{\"k\":6,\"tx\":38.59,\"ty\":32.52,\"r\":198},{\"k\":7,\"tx\":227.69,\"ty\":56.17,\"r\":195},{\"k\":8,\"tx\":51.4,\"ty\":63.62,\"r\":173}],[{\"k\":3,\"tx\":180.04,\"ty\":198.75},{\"k\":4,\"tx\":256.8,\"ty\":58.26,\"r\":36},{\"k\":5,\"tx\":48.95,\"ty\":76.87,\"r\":184},{\"k\":6,\"tx\":38.1,\"ty\":32.58,\"r\":199},{\"k\":7,\"tx\":227.2,\"ty\":56.26,\"r\":196},{\"k\":8,\"tx\":50.98,\"ty\":63.89,\"r\":174}],[{\"k\":3,\"tx\":180.07,\"ty\":198.13},{\"k\":4,\"tx\":257.29,\"ty\":58.34,\"r\":37},{\"k\":5,\"tx\":48.48,\"ty\":77.06,\"r\":185},{\"k\":6,\"tx\":37.6,\"ty\":32.65,\"r\":200},{\"k\":7,\"tx\":226.71,\"ty\":56.34,\"r\":197},{\"k\":8,\"tx\":50.55,\"ty\":64.15,\"r\":175}],[{\"k\":3,\"tx\":180.09,\"ty\":197.38},{\"k\":4,\"tx\":257.79,\"ty\":58.43,\"r\":38},{\"k\":5,\"tx\":48.02,\"ty\":77.24,\"r\":186},{\"k\":6,\"tx\":37.1,\"ty\":32.71,\"r\":201},{\"k\":7,\"tx\":226.21,\"ty\":56.43,\"r\":198},{\"k\":8,\"tx\":50.13,\"ty\":64.42,\"r\":176}],[{\"k\":3,\"tx\":180.12,\"ty\":196.5},{\"k\":4,\"tx\":258.28,\"ty\":58.52,\"r\":39},{\"k\":5,\"tx\":47.56,\"ty\":77.43,\"r\":187},{\"k\":6,\"tx\":36.61,\"ty\":32.77,\"r\":202},{\"k\":7,\"tx\":225.72,\"ty\":56.52,\"r\":199},{\"k\":8,\"tx\":49.7,\"ty\":64.68,\"r\":177}],[{\"k\":3,\"tx\":180.16,\"ty\":195.5},{\"k\":4,\"tx\":258.77,\"ty\":58.6,\"r\":40},{\"k\":5,\"tx\":47.09,\"ty\":77.62,\"r\":188},{\"k\":6,\"tx\":36.11,\"ty\":32.83,\"r\":203},{\"k\":7,\"tx\":225.23,\"ty\":56.6,\"r\":200},{\"k\":8,\"tx\":49.28,\"ty\":64.95,\"r\":178}],[{\"k\":3,\"tx\":180.2,\"ty\":194.38},{\"k\":4,\"tx\":259.26,\"ty\":58.69,\"r\":41},{\"k\":5,\"tx\":46.63,\"ty\":77.81,\"r\":189},{\"k\":6,\"tx\":35.62,\"ty\":32.89,\"r\":204},{\"k\":7,\"tx\":224.74,\"ty\":56.69,\"r\":201},{\"k\":8,\"tx\":48.86,\"ty\":65.21,\"r\":179}],[{\"k\":3,\"tx\":180.24,\"ty\":193.13},{\"k\":4,\"tx\":259.76,\"ty\":58.78,\"r\":42},{\"k\":5,\"tx\":46.17,\"ty\":77.99,\"r\":190},{\"k\":6,\"tx\":35.12,\"ty\":32.95,\"r\":205},{\"k\":7,\"tx\":224.24,\"ty\":56.78,\"r\":202},{\"k\":8,\"tx\":48.43,\"ty\":65.48,\"r\":180}],[{\"k\":3,\"tx\":180.28,\"ty\":191.88},{\"k\":4,\"tx\":260.25,\"ty\":58.87,\"r\":43},{\"k\":5,\"tx\":45.7,\"ty\":78.18,\"r\":191},{\"k\":6,\"tx\":34.62,\"ty\":33.01,\"r\":206},{\"k\":7,\"tx\":223.75,\"ty\":56.87,\"r\":203},{\"k\":8,\"tx\":48.01,\"ty\":65.74,\"r\":181}],[{\"k\":3,\"tx\":180.33,\"ty\":190.63},{\"k\":4,\"tx\":260.74,\"ty\":58.95,\"r\":44},{\"k\":5,\"tx\":45.24,\"ty\":78.37,\"r\":192},{\"k\":6,\"tx\":34.13,\"ty\":33.07,\"r\":207},{\"k\":7,\"tx\":223.26,\"ty\":56.95,\"r\":204},{\"k\":8,\"tx\":47.58,\"ty\":66.01,\"r\":182}],[{\"k\":3,\"tx\":180.37,\"ty\":189.38},{\"k\":4,\"tx\":261.23,\"ty\":59.04,\"r\":45},{\"k\":5,\"tx\":44.77,\"ty\":78.56,\"r\":193},{\"k\":6,\"tx\":33.63,\"ty\":33.13,\"r\":208},{\"k\":7,\"tx\":222.77,\"ty\":57.04,\"r\":205},{\"k\":8,\"tx\":47.16,\"ty\":66.27,\"r\":183}],[{\"k\":3,\"tx\":180.41,\"ty\":188.13},{\"k\":4,\"tx\":261.73,\"ty\":59.13,\"r\":46},{\"k\":5,\"tx\":44.31,\"ty\":78.74,\"r\":194},{\"k\":6,\"tx\":33.13,\"ty\":33.19,\"r\":209},{\"k\":7,\"tx\":222.27,\"ty\":57.13,\"r\":206},{\"k\":8,\"tx\":46.74,\"ty\":66.54,\"r\":184}],[{\"k\":3,\"tx\":180.46,\"ty\":186.88},{\"k\":4,\"tx\":262.22,\"ty\":59.21,\"r\":47},{\"k\":5,\"tx\":43.85,\"ty\":78.93,\"r\":195},{\"k\":6,\"tx\":32.64,\"ty\":33.25,\"r\":210},{\"k\":7,\"tx\":221.78,\"ty\":57.21,\"r\":207},{\"k\":8,\"tx\":46.31,\"ty\":66.8,\"r\":185}],[{\"k\":3,\"tx\":180.5,\"ty\":185.63},{\"k\":4,\"tx\":262.71,\"ty\":59.3,\"r\":48},{\"k\":5,\"tx\":43.38,\"ty\":79.12,\"r\":196},{\"k\":6,\"tx\":32.14,\"ty\":33.32,\"r\":211},{\"k\":7,\"tx\":221.29,\"ty\":57.3,\"r\":208},{\"k\":8,\"tx\":45.89,\"ty\":67.07,\"r\":186}],[{\"k\":3,\"tx\":180.55,\"ty\":184.38},{\"k\":4,\"tx\":263.2,\"ty\":59.39,\"r\":49},{\"k\":5,\"tx\":42.92,\"ty\":79.3,\"r\":197},{\"k\":6,\"tx\":31.65,\"ty\":33.38,\"r\":212},{\"k\":7,\"tx\":220.8,\"ty\":57.39,\"r\":209},{\"k\":8,\"tx\":45.46,\"ty\":67.33,\"r\":187}],[{\"k\":3,\"tx\":180.59,\"ty\":183.14},{\"k\":4,\"tx\":263.7,\"ty\":59.47,\"r\":50},{\"k\":5,\"tx\":42.46,\"ty\":79.49,\"r\":198},{\"k\":6,\"tx\":31.15,\"ty\":33.44,\"r\":213},{\"k\":7,\"tx\":220.3,\"ty\":57.47,\"r\":210},{\"k\":8,\"tx\":45.04,\"ty\":67.6,\"r\":188}],[{\"k\":3,\"tx\":180.63,\"ty\":181.89},{\"k\":4,\"tx\":264.19,\"ty\":59.56,\"r\":51},{\"k\":5,\"tx\":41.99,\"ty\":79.68,\"r\":199},{\"k\":6,\"tx\":30.65,\"ty\":33.5,\"r\":214},{\"k\":7,\"tx\":219.81,\"ty\":57.56,\"r\":211},{\"k\":8,\"tx\":44.62,\"ty\":67.86,\"r\":189}],[{\"k\":3,\"tx\":180.68,\"ty\":180.64},{\"k\":4,\"tx\":264.68,\"ty\":59.65,\"r\":52},{\"k\":5,\"tx\":41.53,\"ty\":79.87,\"r\":200},{\"k\":6,\"tx\":30.16,\"ty\":33.56,\"r\":215},{\"k\":7,\"tx\":219.32,\"ty\":57.65,\"r\":212},{\"k\":8,\"tx\":44.19,\"ty\":68.13,\"r\":190}],[{\"k\":3,\"tx\":180.72,\"ty\":179.39},{\"k\":4,\"tx\":265.17,\"ty\":59.73,\"r\":53},{\"k\":5,\"tx\":41.07,\"ty\":80.05,\"r\":201},{\"k\":6,\"tx\":29.66,\"ty\":33.62,\"r\":216},{\"k\":7,\"tx\":218.83,\"ty\":57.73,\"r\":213},{\"k\":8,\"tx\":43.77,\"ty\":68.39,\"r\":191}],[{\"k\":3,\"tx\":180.76,\"ty\":178.14},{\"k\":4,\"tx\":265.67,\"ty\":59.82,\"r\":54},{\"k\":5,\"tx\":40.6,\"ty\":80.24,\"r\":202},{\"k\":6,\"tx\":29.16,\"ty\":33.68,\"r\":217},{\"k\":7,\"tx\":218.33,\"ty\":57.82,\"r\":214},{\"k\":8,\"tx\":43.34,\"ty\":68.66,\"r\":192}],[{\"k\":3,\"tx\":180.81,\"ty\":176.89},{\"k\":4,\"tx\":266.16,\"ty\":59.91,\"r\":55},{\"k\":5,\"tx\":40.14,\"ty\":80.43,\"r\":203},{\"k\":6,\"tx\":28.67,\"ty\":33.74,\"r\":218},{\"k\":7,\"tx\":217.84,\"ty\":57.91,\"r\":215},{\"k\":8,\"tx\":42.92,\"ty\":68.92,\"r\":193}],[{\"k\":3,\"tx\":180.85,\"ty\":175.64},{\"k\":4,\"tx\":266.65,\"ty\":59.99,\"r\":56},{\"k\":5,\"tx\":39.67,\"ty\":80.62,\"r\":204},{\"k\":6,\"tx\":28.17,\"ty\":33.8,\"r\":219},{\"k\":7,\"tx\":217.35,\"ty\":57.99,\"r\":216},{\"k\":8,\"tx\":42.49,\"ty\":69.19,\"r\":194}],[{\"k\":3,\"tx\":180.89,\"ty\":174.39},{\"k\":4,\"tx\":267.14,\"ty\":60.08,\"r\":57},{\"k\":5,\"tx\":39.21,\"ty\":80.8,\"r\":205},{\"k\":6,\"tx\":27.68,\"ty\":33.86,\"r\":220},{\"k\":7,\"tx\":216.86,\"ty\":58.08,\"r\":217},{\"k\":8,\"tx\":42.07,\"ty\":69.45,\"r\":195}],[{\"k\":3,\"tx\":180.94,\"ty\":173.14},{\"k\":4,\"tx\":267.64,\"ty\":60.17,\"r\":58},{\"k\":5,\"tx\":38.75,\"ty\":80.99,\"r\":206},{\"k\":6,\"tx\":27.18,\"ty\":33.92,\"r\":221},{\"k\":7,\"tx\":216.36,\"ty\":58.17,\"r\":218},{\"k\":8,\"tx\":41.65,\"ty\":69.72,\"r\":196}],[{\"k\":3,\"tx\":180.98,\"ty\":171.89},{\"k\":4,\"tx\":268.13,\"ty\":60.25,\"r\":59},{\"k\":5,\"tx\":38.28,\"ty\":81.18,\"r\":207},{\"k\":6,\"tx\":26.68,\"ty\":33.99,\"r\":222},{\"k\":7,\"tx\":215.87,\"ty\":58.25,\"r\":219},{\"k\":8,\"tx\":41.22,\"ty\":69.98,\"r\":197}],[{\"k\":3,\"tx\":181.03,\"ty\":170.64},{\"k\":4,\"tx\":268.62,\"ty\":60.34,\"r\":60},{\"k\":5,\"tx\":37.82,\"ty\":81.37,\"r\":208},{\"k\":6,\"tx\":26.19,\"ty\":34.05,\"r\":223},{\"k\":7,\"tx\":215.38,\"ty\":58.34,\"r\":220},{\"k\":8,\"tx\":40.8,\"ty\":70.25,\"r\":198}],[{\"k\":3,\"tx\":181.07,\"ty\":169.39},{\"k\":4,\"tx\":269.11,\"ty\":60.43,\"r\":61},{\"k\":5,\"tx\":37.36,\"ty\":81.55,\"r\":209},{\"k\":6,\"tx\":25.69,\"ty\":34.11,\"r\":224},{\"k\":7,\"tx\":214.89,\"ty\":58.43,\"r\":221},{\"k\":8,\"tx\":40.37,\"ty\":70.51,\"r\":199}],[{\"k\":3,\"tx\":181.11,\"ty\":168.14},{\"k\":4,\"tx\":269.61,\"ty\":60.51,\"r\":62},{\"k\":5,\"tx\":36.89,\"ty\":81.74,\"r\":210},{\"k\":6,\"tx\":25.19,\"ty\":34.17,\"r\":225},{\"k\":7,\"tx\":214.39,\"ty\":58.51,\"r\":222},{\"k\":8,\"tx\":39.95,\"ty\":70.78,\"r\":200}],[{\"k\":3,\"tx\":181.16,\"ty\":166.9},{\"k\":4,\"tx\":270.1,\"ty\":60.6,\"r\":63},{\"k\":5,\"tx\":36.43,\"ty\":81.93,\"r\":211},{\"k\":6,\"tx\":24.7,\"ty\":34.23,\"r\":226},{\"k\":7,\"tx\":213.9,\"ty\":58.6,\"r\":223},{\"k\":8,\"tx\":39.53,\"ty\":71.04,\"r\":201}],[{\"k\":3,\"tx\":181.2,\"ty\":165.65},{\"k\":4,\"tx\":270.59,\"ty\":60.69,\"r\":64},{\"k\":5,\"tx\":35.97,\"ty\":82.11,\"r\":212},{\"k\":6,\"tx\":24.2,\"ty\":34.29,\"r\":227},{\"k\":7,\"tx\":213.41,\"ty\":58.69,\"r\":224},{\"k\":8,\"tx\":39.1,\"ty\":71.31,\"r\":202}],[{\"k\":3,\"tx\":181.24,\"ty\":164.4},{\"k\":4,\"tx\":271.08,\"ty\":60.78,\"r\":65},{\"k\":5,\"tx\":35.5,\"ty\":82.3,\"r\":213},{\"k\":6,\"tx\":23.7,\"ty\":34.35,\"r\":228},{\"k\":7,\"tx\":212.92,\"ty\":58.78,\"r\":225},{\"k\":8,\"tx\":38.68,\"ty\":71.57,\"r\":203}],[{\"k\":3,\"tx\":181.29,\"ty\":163.15},{\"k\":4,\"tx\":271.57,\"ty\":60.86,\"r\":66},{\"k\":5,\"tx\":35.04,\"ty\":82.49,\"r\":214},{\"k\":6,\"tx\":23.21,\"ty\":34.41,\"r\":229},{\"k\":7,\"tx\":212.43,\"ty\":58.86,\"r\":226},{\"k\":8,\"tx\":38.25,\"ty\":71.84,\"r\":204}],[{\"k\":3,\"tx\":181.33,\"ty\":161.9},{\"k\":4,\"tx\":272.07,\"ty\":60.95,\"r\":67},{\"k\":5,\"tx\":34.58,\"ty\":82.68,\"r\":215},{\"k\":6,\"tx\":22.71,\"ty\":34.47,\"r\":230},{\"k\":7,\"tx\":211.93,\"ty\":58.95,\"r\":227},{\"k\":8,\"tx\":37.83,\"ty\":72.1,\"r\":205}],[{\"k\":3,\"tx\":181.37,\"ty\":160.65},{\"k\":4,\"tx\":272.56,\"ty\":61.04,\"r\":68},{\"k\":5,\"tx\":34.11,\"ty\":82.86,\"r\":216},{\"k\":6,\"tx\":22.22,\"ty\":34.53,\"r\":231},{\"k\":7,\"tx\":211.44,\"ty\":59.04,\"r\":228},{\"k\":8,\"tx\":37.41,\"ty\":72.37,\"r\":206}],[{\"k\":3,\"tx\":181.42,\"ty\":159.4},{\"k\":4,\"tx\":273.05,\"ty\":61.12,\"r\":69},{\"k\":5,\"tx\":33.65,\"ty\":83.05,\"r\":217},{\"k\":6,\"tx\":21.72,\"ty\":34.6,\"r\":232},{\"k\":7,\"tx\":210.95,\"ty\":59.12,\"r\":229},{\"k\":8,\"tx\":36.98,\"ty\":72.63,\"r\":207}],[{\"k\":3,\"tx\":181.46,\"ty\":158.15},{\"k\":4,\"tx\":273.54,\"ty\":61.21,\"r\":70},{\"k\":5,\"tx\":33.18,\"ty\":83.24,\"r\":218},{\"k\":6,\"tx\":21.22,\"ty\":34.66,\"r\":233},{\"k\":7,\"tx\":210.46,\"ty\":59.21,\"r\":230},{\"k\":8,\"tx\":36.56,\"ty\":72.9,\"r\":208}],[{\"k\":3,\"tx\":181.51,\"ty\":156.9},{\"k\":4,\"tx\":274.04,\"ty\":61.3,\"r\":71},{\"k\":5,\"tx\":32.72,\"ty\":83.43,\"r\":219},{\"k\":6,\"tx\":20.73,\"ty\":34.72,\"r\":234},{\"k\":7,\"tx\":209.96,\"ty\":59.3,\"r\":231},{\"k\":8,\"tx\":36.13,\"ty\":73.16,\"r\":209}],[{\"k\":3,\"tx\":181.55,\"ty\":155.65},{\"k\":4,\"tx\":274.53,\"ty\":61.38,\"r\":72},{\"k\":5,\"tx\":32.26,\"ty\":83.61,\"r\":220},{\"k\":6,\"tx\":20.23,\"ty\":34.78,\"r\":235},{\"k\":7,\"tx\":209.47,\"ty\":59.38,\"r\":232},{\"k\":8,\"tx\":35.71,\"ty\":73.43,\"r\":210}],[{\"k\":3,\"tx\":181.59,\"ty\":154.4},{\"k\":4,\"tx\":275.02,\"ty\":61.47,\"r\":73},{\"k\":5,\"tx\":31.79,\"ty\":83.8,\"r\":221},{\"k\":6,\"tx\":19.73,\"ty\":34.84,\"r\":236},{\"k\":7,\"tx\":208.98,\"ty\":59.47,\"r\":233},{\"k\":8,\"tx\":35.29,\"ty\":73.69,\"r\":211}],[{\"k\":3,\"tx\":181.64,\"ty\":153.15},{\"k\":4,\"tx\":275.51,\"ty\":61.56,\"r\":74},{\"k\":5,\"tx\":31.33,\"ty\":83.99,\"r\":222},{\"k\":6,\"tx\":19.24,\"ty\":34.9,\"r\":237},{\"k\":7,\"tx\":208.49,\"ty\":59.56,\"r\":234},{\"k\":8,\"tx\":34.86,\"ty\":73.96,\"r\":212}],[{\"k\":3,\"tx\":181.68,\"ty\":151.9},{\"k\":4,\"tx\":276.01,\"ty\":61.64,\"r\":75},{\"k\":5,\"tx\":30.87,\"ty\":84.17,\"r\":223},{\"k\":6,\"tx\":18.74,\"ty\":34.96,\"r\":238},{\"k\":7,\"tx\":207.99,\"ty\":59.64,\"r\":235},{\"k\":8,\"tx\":34.44,\"ty\":74.22,\"r\":213}],[{\"k\":3,\"tx\":181.72,\"ty\":150.66},{\"k\":4,\"tx\":276.5,\"ty\":61.73,\"r\":76},{\"k\":5,\"tx\":30.4,\"ty\":84.36,\"r\":224},{\"k\":6,\"tx\":18.25,\"ty\":35.02,\"r\":239},{\"k\":7,\"tx\":207.5,\"ty\":59.73,\"r\":236},{\"k\":8,\"tx\":34.01,\"ty\":74.49,\"r\":214}],[{\"k\":3,\"tx\":181.77,\"ty\":149.41},{\"k\":4,\"tx\":276.99,\"ty\":61.82,\"r\":77},{\"k\":5,\"tx\":29.94,\"ty\":84.55,\"r\":225},{\"k\":6,\"tx\":17.75,\"ty\":35.08,\"r\":240},{\"k\":7,\"tx\":207.01,\"ty\":59.82,\"r\":237},{\"k\":8,\"tx\":33.59,\"ty\":74.75,\"r\":215}],[{\"k\":3,\"tx\":181.81,\"ty\":148.16},{\"k\":4,\"tx\":277.48,\"ty\":61.9,\"r\":78},{\"k\":5,\"tx\":29.48,\"ty\":84.74,\"r\":226},{\"k\":6,\"tx\":17.25,\"ty\":35.14,\"r\":241},{\"k\":7,\"tx\":206.52,\"ty\":59.9,\"r\":238},{\"k\":8,\"tx\":33.17,\"ty\":75.02,\"r\":216}],[{\"k\":3,\"tx\":181.85,\"ty\":146.91},{\"k\":4,\"tx\":277.98,\"ty\":61.99,\"r\":79},{\"k\":5,\"tx\":29.01,\"ty\":84.92,\"r\":227},{\"k\":6,\"tx\":16.76,\"ty\":35.2,\"r\":242},{\"k\":7,\"tx\":206.02,\"ty\":59.99,\"r\":239},{\"k\":8,\"tx\":32.74,\"ty\":75.28,\"r\":217}],[{\"k\":3,\"tx\":181.9,\"ty\":145.66},{\"k\":4,\"tx\":278.47,\"ty\":62.08,\"r\":80},{\"k\":5,\"tx\":28.55,\"ty\":85.11,\"r\":228},{\"k\":6,\"tx\":16.26,\"ty\":35.27,\"r\":243},{\"k\":7,\"tx\":205.53,\"ty\":60.08,\"r\":240},{\"k\":8,\"tx\":32.32,\"ty\":75.55,\"r\":218}],[{\"k\":3,\"tx\":181.94,\"ty\":144.41},{\"k\":4,\"tx\":278.96,\"ty\":62.16,\"r\":81},{\"k\":5,\"tx\":28.08,\"ty\":85.3,\"r\":229},{\"k\":6,\"tx\":15.76,\"ty\":35.33,\"r\":244},{\"k\":7,\"tx\":205.04,\"ty\":60.16,\"r\":241},{\"k\":8,\"tx\":31.89,\"ty\":75.81,\"r\":219}],[{\"k\":3,\"tx\":181.98,\"ty\":143.16},{\"k\":4,\"tx\":279.45,\"ty\":62.25,\"r\":82},{\"k\":5,\"tx\":27.62,\"ty\":85.49,\"r\":230},{\"k\":6,\"tx\":15.27,\"ty\":35.39,\"r\":245},{\"k\":7,\"tx\":204.55,\"ty\":60.25,\"r\":242},{\"k\":8,\"tx\":31.47,\"ty\":76.08,\"r\":220}],[{\"k\":3,\"tx\":182.03,\"ty\":141.91},{\"k\":4,\"tx\":279.95,\"ty\":62.34,\"r\":83},{\"k\":5,\"tx\":27.16,\"ty\":85.67,\"r\":231},{\"k\":6,\"tx\":14.77,\"ty\":35.45,\"r\":246},{\"k\":7,\"tx\":204.05,\"ty\":60.34,\"r\":243},{\"k\":8,\"tx\":31.05,\"ty\":76.34,\"r\":221}],[{\"k\":3,\"tx\":182.07,\"ty\":140.66},{\"k\":4,\"tx\":280.44,\"ty\":62.42,\"r\":84},{\"k\":5,\"tx\":26.69,\"ty\":85.86,\"r\":232},{\"k\":6,\"tx\":14.28,\"ty\":35.51,\"r\":247},{\"k\":7,\"tx\":203.56,\"ty\":60.42,\"r\":244},{\"k\":8,\"tx\":30.62,\"ty\":76.61,\"r\":222}],[{\"k\":3,\"tx\":182.12,\"ty\":139.41},{\"k\":4,\"tx\":280.93,\"ty\":62.51,\"r\":85},{\"k\":5,\"tx\":26.23,\"ty\":86.05,\"r\":233},{\"k\":6,\"tx\":13.78,\"ty\":35.57,\"r\":248},{\"k\":7,\"tx\":203.07,\"ty\":60.51,\"r\":245},{\"k\":8,\"tx\":30.2,\"ty\":76.87,\"r\":223}],[{\"k\":3,\"tx\":182.16,\"ty\":138.16},{\"k\":4,\"tx\":281.42,\"ty\":62.6,\"r\":86},{\"k\":5,\"tx\":25.77,\"ty\":86.24,\"r\":234},{\"k\":6,\"tx\":13.28,\"ty\":35.63,\"r\":249},{\"k\":7,\"tx\":202.58,\"ty\":60.6,\"r\":246},{\"k\":8,\"tx\":29.77,\"ty\":77.14,\"r\":224}],[{\"k\":3,\"tx\":182.2,\"ty\":136.91},{\"k\":4,\"tx\":281.92,\"ty\":62.69,\"r\":87},{\"k\":5,\"tx\":25.3,\"ty\":86.42,\"r\":235},{\"k\":6,\"tx\":12.79,\"ty\":35.69,\"r\":250},{\"k\":7,\"tx\":202.08,\"ty\":60.69,\"r\":247},{\"k\":8,\"tx\":29.35,\"ty\":77.4,\"r\":225}],[{\"k\":3,\"tx\":182.25,\"ty\":135.66},{\"k\":4,\"tx\":282.41,\"ty\":62.77,\"r\":88},{\"k\":5,\"tx\":24.84,\"ty\":86.61,\"r\":236},{\"k\":6,\"tx\":12.29,\"ty\":35.75,\"r\":251},{\"k\":7,\"tx\":201.59,\"ty\":60.77,\"r\":248},{\"k\":8,\"tx\":28.93,\"ty\":77.67,\"r\":226}],[{\"k\":3,\"tx\":182.29,\"ty\":134.41},{\"k\":4,\"tx\":282.9,\"ty\":62.86,\"r\":89},{\"k\":5,\"tx\":24.38,\"ty\":86.8,\"r\":237},{\"k\":6,\"tx\":11.79,\"ty\":35.81,\"r\":252},{\"k\":7,\"tx\":201.1,\"ty\":60.86,\"r\":249},{\"k\":8,\"tx\":28.5,\"ty\":77.93,\"r\":227}],[{\"k\":3,\"tx\":182.33,\"ty\":133.17},{\"k\":4,\"tx\":283.39,\"ty\":62.95,\"r\":90},{\"k\":5,\"tx\":23.91,\"ty\":86.98,\"r\":238},{\"k\":6,\"tx\":11.3,\"ty\":35.87,\"r\":253},{\"k\":7,\"tx\":200.61,\"ty\":60.95,\"r\":250},{\"k\":8,\"tx\":28.08,\"ty\":78.2,\"r\":228}],[{\"k\":3,\"tx\":182.38,\"ty\":131.92},{\"k\":4,\"tx\":283.88,\"ty\":63.03,\"r\":91},{\"k\":5,\"tx\":23.45,\"ty\":87.17,\"r\":239},{\"k\":6,\"tx\":10.8,\"ty\":35.94,\"r\":254},{\"k\":7,\"tx\":200.12,\"ty\":61.03,\"r\":251},{\"k\":8,\"tx\":27.65,\"ty\":78.46,\"r\":229}],[{\"k\":3,\"tx\":182.42,\"ty\":130.67},{\"k\":4,\"tx\":284.38,\"ty\":63.12,\"r\":92},{\"k\":5,\"tx\":22.99,\"ty\":87.36,\"r\":240},{\"k\":6,\"tx\":10.31,\"ty\":36,\"r\":255},{\"k\":7,\"tx\":199.62,\"ty\":61.12,\"r\":252},{\"k\":8,\"tx\":27.23,\"ty\":78.73,\"r\":230}],[{\"k\":3,\"tx\":182.46,\"ty\":129.42},{\"k\":4,\"tx\":284.87,\"ty\":63.21,\"r\":93},{\"k\":5,\"tx\":22.52,\"ty\":87.55,\"r\":241},{\"k\":6,\"tx\":9.81,\"ty\":36.06,\"r\":256},{\"k\":7,\"tx\":199.13,\"ty\":61.21,\"r\":253},{\"k\":8,\"tx\":26.81,\"ty\":78.99,\"r\":231}],[{\"k\":3,\"tx\":182.51,\"ty\":128.17},{\"k\":4,\"tx\":285.36,\"ty\":63.29,\"r\":94},{\"k\":5,\"tx\":22.06,\"ty\":87.73,\"r\":242},{\"k\":6,\"tx\":9.31,\"ty\":36.12,\"r\":257},{\"k\":7,\"tx\":198.64,\"ty\":61.29,\"r\":254},{\"k\":8,\"tx\":26.38,\"ty\":79.26,\"r\":232}],[{\"k\":3,\"tx\":182.55,\"ty\":126.92},{\"k\":4,\"tx\":285.85,\"ty\":63.38,\"r\":95},{\"k\":5,\"tx\":21.59,\"ty\":87.92,\"r\":243},{\"k\":6,\"tx\":8.82,\"ty\":36.18,\"r\":258},{\"k\":7,\"tx\":198.15,\"ty\":61.38,\"r\":255},{\"k\":8,\"tx\":25.96,\"ty\":79.52,\"r\":233}],[{\"k\":3,\"tx\":182.6,\"ty\":125.67},{\"k\":4,\"tx\":286.35,\"ty\":63.47,\"r\":96},{\"k\":5,\"tx\":21.13,\"ty\":88.11,\"r\":244},{\"k\":6,\"tx\":8.32,\"ty\":36.24,\"r\":259},{\"k\":7,\"tx\":197.65,\"ty\":61.47,\"r\":256},{\"k\":8,\"tx\":25.53,\"ty\":79.79,\"r\":234}],[{\"k\":3,\"tx\":182.64,\"ty\":124.42},{\"k\":4,\"tx\":286.84,\"ty\":63.55,\"r\":97},{\"k\":5,\"tx\":20.67,\"ty\":88.3,\"r\":245},{\"k\":6,\"tx\":7.82,\"ty\":36.3,\"r\":260},{\"k\":7,\"tx\":197.16,\"ty\":61.55,\"r\":257},{\"k\":8,\"tx\":25.11,\"ty\":80.05,\"r\":235}],[{\"k\":3,\"tx\":182.68,\"ty\":123.17},{\"k\":4,\"tx\":287.33,\"ty\":63.64,\"r\":98},{\"k\":5,\"tx\":20.2,\"ty\":88.48,\"r\":246},{\"k\":6,\"tx\":7.33,\"ty\":36.36,\"r\":261},{\"k\":7,\"tx\":196.67,\"ty\":61.64,\"r\":258},{\"k\":8,\"tx\":24.69,\"ty\":80.32,\"r\":236}],[{\"k\":3,\"tx\":182.73,\"ty\":121.92},{\"k\":4,\"tx\":287.82,\"ty\":63.73,\"r\":99},{\"k\":5,\"tx\":19.74,\"ty\":88.67,\"r\":247},{\"k\":6,\"tx\":6.83,\"ty\":36.42,\"r\":262},{\"k\":7,\"tx\":196.18,\"ty\":61.73,\"r\":259},{\"k\":8,\"tx\":24.26,\"ty\":80.58,\"r\":237}],[{\"k\":3,\"tx\":182.77,\"ty\":120.67},{\"k\":4,\"tx\":288.32,\"ty\":63.81,\"r\":100},{\"k\":5,\"tx\":19.28,\"ty\":88.86,\"r\":248},{\"k\":6,\"tx\":6.34,\"ty\":36.48,\"r\":263},{\"k\":7,\"tx\":195.68,\"ty\":61.81,\"r\":260},{\"k\":8,\"tx\":23.84,\"ty\":80.85,\"r\":238}],[{\"k\":3,\"tx\":182.81,\"ty\":119.42},{\"k\":4,\"tx\":288.81,\"ty\":63.9,\"r\":101},{\"k\":5,\"tx\":18.81,\"ty\":89.04,\"r\":249},{\"k\":6,\"tx\":5.84,\"ty\":36.55,\"r\":264},{\"k\":7,\"tx\":195.19,\"ty\":61.9,\"r\":261},{\"k\":8,\"tx\":23.41,\"ty\":81.11,\"r\":239}],[{\"k\":3,\"tx\":182.86,\"ty\":118.17},{\"k\":4,\"tx\":289.3,\"ty\":63.99,\"r\":102},{\"k\":5,\"tx\":18.35,\"ty\":89.23,\"r\":250},{\"k\":6,\"tx\":5.34,\"ty\":36.61,\"r\":265},{\"k\":7,\"tx\":194.7,\"ty\":61.99,\"r\":262},{\"k\":8,\"tx\":22.99,\"ty\":81.38,\"r\":240}],[{\"k\":3,\"tx\":182.9,\"ty\":116.93},{\"k\":4,\"tx\":289.79,\"ty\":64.07,\"r\":103},{\"k\":5,\"tx\":17.89,\"ty\":89.42,\"r\":251},{\"k\":6,\"tx\":4.85,\"ty\":36.67,\"r\":266},{\"k\":7,\"tx\":194.21,\"ty\":62.07,\"r\":263},{\"k\":8,\"tx\":22.57,\"ty\":81.64,\"r\":241}],[{\"k\":3,\"tx\":182.94,\"ty\":115.68},{\"k\":4,\"tx\":290.29,\"ty\":64.16,\"r\":104},{\"k\":5,\"tx\":17.42,\"ty\":89.61,\"r\":252},{\"k\":6,\"tx\":4.35,\"ty\":36.73,\"r\":267},{\"k\":7,\"tx\":193.71,\"ty\":62.16,\"r\":264},{\"k\":8,\"tx\":22.14,\"ty\":81.91,\"r\":242}],[{\"k\":3,\"tx\":182.99,\"ty\":114.43},{\"k\":4,\"tx\":290.78,\"ty\":64.25,\"r\":105},{\"k\":5,\"tx\":16.96,\"ty\":89.79,\"r\":253},{\"k\":6,\"tx\":3.85,\"ty\":36.79,\"r\":268},{\"k\":7,\"tx\":193.22,\"ty\":62.25,\"r\":265},{\"k\":8,\"tx\":21.72,\"ty\":82.17,\"r\":243}],[{\"k\":3,\"tx\":183.03,\"ty\":113.18},{\"k\":4,\"tx\":291.27,\"ty\":64.34,\"r\":106},{\"k\":5,\"tx\":16.5,\"ty\":89.98,\"r\":254},{\"k\":6,\"tx\":3.36,\"ty\":36.85,\"r\":269},{\"k\":7,\"tx\":192.73,\"ty\":62.34,\"r\":266},{\"k\":8,\"tx\":21.29,\"ty\":82.44,\"r\":244}],[{\"k\":3,\"tx\":183.08,\"ty\":111.93},{\"k\":4,\"tx\":291.76,\"ty\":64.42,\"r\":107},{\"k\":5,\"tx\":16.03,\"ty\":90.17,\"r\":255},{\"k\":6,\"tx\":2.86,\"ty\":36.91,\"r\":270},{\"k\":7,\"tx\":192.24,\"ty\":62.42,\"r\":267},{\"k\":8,\"tx\":20.87,\"ty\":82.7,\"r\":245}],[{\"k\":3,\"tx\":183.12,\"ty\":110.68},{\"k\":4,\"tx\":292.26,\"ty\":64.51,\"r\":108},{\"k\":5,\"tx\":15.57,\"ty\":90.36,\"r\":256},{\"k\":6,\"tx\":2.37,\"ty\":36.97,\"r\":271},{\"k\":7,\"tx\":191.74,\"ty\":62.51,\"r\":268},{\"k\":8,\"tx\":20.45,\"ty\":82.97,\"r\":246}],[{\"k\":3,\"tx\":183.16,\"ty\":109.43},{\"k\":4,\"tx\":292.75,\"ty\":64.6,\"r\":109},{\"k\":5,\"tx\":15.1,\"ty\":90.54,\"r\":257},{\"k\":6,\"tx\":1.87,\"ty\":37.03,\"r\":272},{\"k\":7,\"tx\":191.25,\"ty\":62.6,\"r\":269},{\"k\":8,\"tx\":20.02,\"ty\":83.23,\"r\":247}],[{\"k\":3,\"tx\":183.21,\"ty\":108.18},{\"k\":4,\"tx\":293.24,\"ty\":64.68,\"r\":110},{\"k\":5,\"tx\":14.64,\"ty\":90.73,\"r\":258},{\"k\":6,\"tx\":1.37,\"ty\":37.09,\"r\":273},{\"k\":7,\"tx\":190.76,\"ty\":62.68,\"r\":270},{\"k\":8,\"tx\":19.6,\"ty\":83.5,\"r\":248}],[{\"k\":3,\"tx\":183.25,\"ty\":106.93},{\"k\":4,\"tx\":293.73,\"ty\":64.77,\"r\":111},{\"k\":5,\"tx\":14.18,\"ty\":90.92,\"r\":259},{\"k\":6,\"tx\":0.88,\"ty\":37.15,\"r\":274},{\"k\":7,\"tx\":190.27,\"ty\":62.77,\"r\":271},{\"k\":8,\"tx\":19.17,\"ty\":83.76,\"r\":249}],[{\"k\":3,\"tx\":183.29,\"ty\":105.68},{\"k\":4,\"tx\":294.23,\"ty\":64.86,\"r\":112},{\"k\":5,\"tx\":13.71,\"ty\":91.1,\"r\":260},{\"k\":6,\"tx\":0.38,\"ty\":37.22,\"r\":275},{\"k\":7,\"tx\":189.77,\"ty\":62.86,\"r\":272},{\"k\":8,\"tx\":18.75,\"ty\":84.03,\"r\":250}],[{\"k\":3,\"tx\":183.34,\"ty\":104.43},{\"k\":4,\"tx\":294.72,\"ty\":64.94,\"r\":113},{\"k\":5,\"tx\":13.25,\"ty\":91.29,\"r\":261},{\"k\":6,\"tx\":-0.12,\"ty\":37.28,\"r\":276},{\"k\":7,\"tx\":189.28,\"ty\":62.94,\"r\":273},{\"k\":8,\"tx\":18.33,\"ty\":84.29,\"r\":251}],[{\"k\":3,\"tx\":183.38,\"ty\":103.18},{\"k\":4,\"tx\":295.21,\"ty\":65.03,\"r\":114},{\"k\":5,\"tx\":12.79,\"ty\":91.48,\"r\":262},{\"k\":6,\"tx\":-0.61,\"ty\":37.34,\"r\":277},{\"k\":7,\"tx\":188.79,\"ty\":63.03,\"r\":274},{\"k\":8,\"tx\":17.9,\"ty\":84.56,\"r\":252}],[{\"k\":3,\"tx\":183.42,\"ty\":101.93},{\"k\":4,\"tx\":295.7,\"ty\":65.12,\"r\":115},{\"k\":5,\"tx\":12.32,\"ty\":91.67,\"r\":263},{\"k\":6,\"tx\":-1.11,\"ty\":37.4,\"r\":278},{\"k\":7,\"tx\":188.3,\"ty\":63.12,\"r\":275},{\"k\":8,\"tx\":17.48,\"ty\":84.82,\"r\":253}],[{\"k\":3,\"tx\":183.47,\"ty\":100.69},{\"k\":4,\"tx\":296.19,\"ty\":65.2,\"r\":116},{\"k\":5,\"tx\":11.86,\"ty\":91.85,\"r\":264},{\"k\":6,\"tx\":-1.6,\"ty\":37.46,\"r\":279},{\"k\":7,\"tx\":187.81,\"ty\":63.2,\"r\":276},{\"k\":8,\"tx\":17.05,\"ty\":85.09,\"r\":254}],[{\"k\":3,\"tx\":183.51,\"ty\":99.44},{\"k\":4,\"tx\":296.69,\"ty\":65.29,\"r\":117},{\"k\":5,\"tx\":11.4,\"ty\":92.04,\"r\":265},{\"k\":6,\"tx\":-2.1,\"ty\":37.52,\"r\":280},{\"k\":7,\"tx\":187.31,\"ty\":63.29,\"r\":277},{\"k\":8,\"tx\":16.63,\"ty\":85.35,\"r\":255}],[{\"k\":3,\"tx\":183.56,\"ty\":98.19},{\"k\":4,\"tx\":297.18,\"ty\":65.38,\"r\":118},{\"k\":5,\"tx\":10.93,\"ty\":92.23,\"r\":266},{\"k\":6,\"tx\":-2.6,\"ty\":37.58,\"r\":281},{\"k\":7,\"tx\":186.82,\"ty\":63.38,\"r\":278},{\"k\":8,\"tx\":16.21,\"ty\":85.62,\"r\":256}],[{\"k\":3,\"tx\":183.6,\"ty\":96.94},{\"k\":4,\"tx\":297.67,\"ty\":65.46,\"r\":119},{\"k\":5,\"tx\":10.47,\"ty\":92.42,\"r\":267},{\"k\":6,\"tx\":-3.09,\"ty\":37.64,\"r\":282},{\"k\":7,\"tx\":186.33,\"ty\":63.46,\"r\":279},{\"k\":8,\"tx\":15.78,\"ty\":85.88,\"r\":257}],[{\"k\":3,\"tx\":183.64,\"ty\":95.69},{\"k\":4,\"tx\":298.16,\"ty\":65.55,\"r\":120},{\"k\":5,\"tx\":10,\"ty\":92.6,\"r\":268},{\"k\":6,\"tx\":-3.59,\"ty\":37.7,\"r\":283},{\"k\":7,\"tx\":185.84,\"ty\":63.55,\"r\":280},{\"k\":8,\"tx\":15.36,\"ty\":86.15,\"r\":258}],[{\"k\":3,\"tx\":183.69,\"ty\":94.44},{\"k\":4,\"tx\":298.66,\"ty\":65.64,\"r\":121},{\"k\":5,\"tx\":9.54,\"ty\":92.79,\"r\":269},{\"k\":6,\"tx\":-4.09,\"ty\":37.76,\"r\":284},{\"k\":7,\"tx\":185.34,\"ty\":63.64,\"r\":281},{\"k\":8,\"tx\":14.93,\"ty\":86.41,\"r\":259}],[{\"k\":3,\"tx\":183.73,\"ty\":93.19},{\"k\":4,\"tx\":299.15,\"ty\":65.72,\"r\":122},{\"k\":5,\"tx\":9.08,\"ty\":92.98,\"r\":270},{\"k\":6,\"tx\":-4.58,\"ty\":37.82,\"r\":285},{\"k\":7,\"tx\":184.85,\"ty\":63.72,\"r\":282},{\"k\":8,\"tx\":14.51,\"ty\":86.68,\"r\":260}],[{\"k\":3,\"tx\":183.77,\"ty\":91.94},{\"k\":4,\"tx\":299.64,\"ty\":65.81,\"r\":123},{\"k\":5,\"tx\":8.61,\"ty\":93.17,\"r\":271},{\"k\":6,\"tx\":-5.08,\"ty\":37.89,\"r\":286},{\"k\":7,\"tx\":184.36,\"ty\":63.81,\"r\":283},{\"k\":8,\"tx\":14.09,\"ty\":86.94,\"r\":261}],[{\"k\":3,\"tx\":183.82,\"ty\":90.69},{\"k\":4,\"tx\":300.13,\"ty\":65.9,\"r\":124},{\"k\":5,\"tx\":8.15,\"ty\":93.35,\"r\":272},{\"k\":6,\"tx\":-5.58,\"ty\":37.95,\"r\":287},{\"k\":7,\"tx\":183.87,\"ty\":63.9,\"r\":284},{\"k\":8,\"tx\":13.66,\"ty\":87.21,\"r\":262}],[{\"k\":3,\"tx\":183.86,\"ty\":89.44},{\"k\":4,\"tx\":300.63,\"ty\":65.98,\"r\":125},{\"k\":5,\"tx\":7.69,\"ty\":93.54,\"r\":273},{\"k\":6,\"tx\":-6.07,\"ty\":38.01,\"r\":288},{\"k\":7,\"tx\":183.37,\"ty\":63.98,\"r\":285},{\"k\":8,\"tx\":13.24,\"ty\":87.47,\"r\":263}],[{\"k\":3,\"tx\":183.9,\"ty\":88.19,\"fill\":\"#ff0000\"},{\"k\":4,\"tx\":301.12,\"ty\":66.07,\"r\":126},{\"k\":5,\"tx\":7.22,\"ty\":93.73,\"r\":274},{\"k\":6,\"tx\":-6.57,\"ty\":38.07,\"r\":289},{\"k\":7,\"tx\":182.88,\"ty\":64.07,\"r\":286},{\"k\":8,\"tx\":12.81,\"ty\":87.74,\"r\":264}],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]}},\"outline\":\"Window \\\"Jellyfish\\\"\\n  Pane 360 x 240\\n    Rectangle 360 x 240 at (0, 0), fill #191970\\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (183.9043811935918, 88.19315122723808), rotate -88, fill #ff0000\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (301.1188496747079, 66.07159430468215), rotate 126, fill #da70d6\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (7.223336435126232, 93.72718241812248), rotate 274, fill #da70d6\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (-6.5676767951966255, 38.06842191749874), rotate 289, fill #da70d6\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (182.88115032529208, 64.07159430468215), rotate 286, fill #da70d6\\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (12.813210422927078, 87.73531732552561), rotate 264, fill #da70d6\\nframes run: 182\"}\n```\n\n```output\nBump after 116 frames\n```\n\nThe field `frame` counts the frames, as step 2 said a game should. The submarine turns 88 degrees to the left, points almost straight up, speeds up for 10 frames, and after 116 frames in all it meets a jellyfish. `break` leaves the loop over the jellyfish, so the bump is printed once even if two jellyfish touch the submarine in the same frame. The jellyfish drift out of the window: step 6 brings them back.\n","task":"Write the method `overlaps(x1, y1, r1, x2, y2, r2)`: it returns `true` when the circle with its center at (x1, y1) and the radius r1 overlaps the circle at (x2, y2) with the radius r2, that is, when the distance between the centers is **less than** r1 + r2. Circles that only touch don't overlap. The first test runs `main`:\n\n```\ntrue\nfalse\n```\n","kind":"code","seed":"public class Main {\n    public static void main(String[] args) {\n        System.out.println(overlaps(0, 0, 5, 6, 0, 3));\n        System.out.println(overlaps(0, 0, 5, 8, 0, 3));\n    }\n\n    public static boolean overlaps(double x1, double y1, double r1, double x2, double y2, double r2) {\n        return false;\n    }\n}\n","solution":"public class Main {\n    public static void main(String[] args) {\n        System.out.println(overlaps(0, 0, 5, 6, 0, 3));\n        System.out.println(overlaps(0, 0, 5, 8, 0, 3));\n    }\n\n    public static boolean overlaps(double x1, double y1, double r1, double x2, double y2, double r2) {\n        double dx = x2 - x1;\n        double dy = y2 - y1;\n        return Math.sqrt(dx * dx + dy * dy) < r1 + r2;\n    }\n}\n","hints":["`double dx = x2 - x1;` and `double dy = y2 - y1;` are the differences. The distance is `Math.sqrt(dx * dx + dy * dy)`.","Return the comparison itself: `return Math.sqrt(dx * dx + dy * dy) < r1 + r2;`. With `<`, circles that only touch (a distance equal to the sum) give false."],"tests":[{"name":"Test 1","stdin":"","expect":"true\nfalse","hidden":false},{"name":"Test 2","stdin":"","call":"System.out.println(overlaps(10, 10, 4, 13, 14, 1));\nSystem.out.println(overlaps(10, 10, 4, 13, 14, 1.5));\nSystem.out.println(overlaps(100, 50, 3, 100, 50, 3));\n","expect":"false\ntrue\ntrue","hidden":true},{"name":"Test 3","stdin":"","call":"System.out.println(overlaps(-5, -5, 2, 5, 5, 2));\nSystem.out.println(overlaps(-5, -5, 8, 5, 5, 7));\nSystem.out.println(overlaps(0, 0, 1, 0, -2.5, 1.5));\n","expect":"false\ntrue\nfalse","hidden":true}],"require":[],"forbid":[],"more":[{"task":"Make the bump count. Two files need a change:\n\n1. In `Mover.java`, `collides` returns `false` for now. Make it return whether this Mover's shape and the other's overlap, with `Shape.intersect`.\n2. In `Main.java`, in `handle`, after everything has moved, go through the jellyfish in the list's order. For the first one that the submarine collides with: fill the submarine with `Color.RED`, print `Bump!`, stop the timer, and leave the loop.\n\nThe submarine starts at (60, 120), a jellyfish at (150, 120) drifts toward it, and another at (300, 40) drifts down. The test runs 150 frames.\n```\nBump!\n```\n","kind":"code","seed":"// ==== Main.java ====\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport javafx.animation.AnimationTimer;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.input.KeyCode;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Rectangle;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n    private Map<KeyCode, Boolean> held = new HashMap<>();\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Sub sub = new Sub(60, 120);\n        pane.getChildren().add(sub.getShape());\n        List<Jellyfish> jellyfish = new ArrayList<>();\n        jellyfish.add(new Jellyfish(150, 120, 180));\n        jellyfish.add(new Jellyfish(300, 40, 90));\n        jellyfish.forEach(j -> pane.getChildren().add(j.getShape()));\n\n        Scene scene = new Scene(pane);\n        scene.setOnKeyPressed(event -> held.put(event.getCode(), true));\n        scene.setOnKeyReleased(event -> held.put(event.getCode(), false));\n\n        new AnimationTimer() {\n            @Override\n            public void handle(long now) {\n                if (held.getOrDefault(KeyCode.LEFT, false)) {\n                    sub.turn(-4);\n                }\n                if (held.getOrDefault(KeyCode.RIGHT, false)) {\n                    sub.turn(4);\n                }\n                if (held.getOrDefault(KeyCode.UP, false)) {\n                    sub.accelerate(0.125);\n                }\n                sub.move();\n                jellyfish.forEach(j -> j.move());\n            }\n        }.start();\n\n        stage.setScene(scene);\n        stage.setTitle(\"Bump\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n\n// ==== Mover.java ====\nimport javafx.geometry.Point2D;\nimport javafx.scene.shape.Shape;\n\npublic abstract class Mover {\n    private Shape shape;\n    private Point2D velocity;\n\n    public Mover(Shape shape, double x, double y) {\n        this.shape = shape;\n        this.shape.setTranslateX(x);\n        this.shape.setTranslateY(y);\n        this.velocity = new Point2D(0, 0);\n    }\n\n    public Shape getShape() {\n        return shape;\n    }\n\n    public void turn(double degrees) {\n        shape.setRotate(shape.getRotate() + degrees);\n    }\n\n    public void accelerate(double amount) {\n        double angle = Math.toRadians(shape.getRotate());\n        velocity = velocity.add(Math.cos(angle) * amount, Math.sin(angle) * amount);\n    }\n\n    public void move() {\n        shape.setTranslateX(shape.getTranslateX() + velocity.getX());\n        shape.setTranslateY(shape.getTranslateY() + velocity.getY());\n    }\n\n    public boolean collides(Mover other) {\n        return false;\n    }\n}\n\n// ==== Sub.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Sub extends Mover {\n\n    public Sub(double x, double y) {\n        super(new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6), x, y);\n        getShape().setFill(Color.GOLD);\n    }\n}\n\n// ==== Jellyfish.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Jellyfish extends Mover {\n\n    public Jellyfish(double x, double y, double heading) {\n        super(new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10), x, y);\n        getShape().setFill(Color.ORCHID);\n        turn(heading);\n        accelerate(0.5);\n    }\n\n    @Override\n    public void move() {\n        super.move();\n        turn(1);\n    }\n}\n","solution":"// ==== Main.java ====\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport javafx.animation.AnimationTimer;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.input.KeyCode;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Rectangle;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n    private Map<KeyCode, Boolean> held = new HashMap<>();\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Sub sub = new Sub(60, 120);\n        pane.getChildren().add(sub.getShape());\n        List<Jellyfish> jellyfish = new ArrayList<>();\n        jellyfish.add(new Jellyfish(150, 120, 180));\n        jellyfish.add(new Jellyfish(300, 40, 90));\n        jellyfish.forEach(j -> pane.getChildren().add(j.getShape()));\n\n        Scene scene = new Scene(pane);\n        scene.setOnKeyPressed(event -> held.put(event.getCode(), true));\n        scene.setOnKeyReleased(event -> held.put(event.getCode(), false));\n\n        new AnimationTimer() {\n            @Override\n            public void handle(long now) {\n                if (held.getOrDefault(KeyCode.LEFT, false)) {\n                    sub.turn(-4);\n                }\n                if (held.getOrDefault(KeyCode.RIGHT, false)) {\n                    sub.turn(4);\n                }\n                if (held.getOrDefault(KeyCode.UP, false)) {\n                    sub.accelerate(0.125);\n                }\n                sub.move();\n                jellyfish.forEach(j -> j.move());\n                for (Jellyfish j : jellyfish) {\n                    if (sub.collides(j)) {\n                        sub.getShape().setFill(Color.RED);\n                        System.out.println(\"Bump!\");\n                        stop();\n                        break;\n                    }\n                }\n            }\n        }.start();\n\n        stage.setScene(scene);\n        stage.setTitle(\"Bump\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n\n// ==== Mover.java ====\nimport javafx.geometry.Point2D;\nimport javafx.scene.shape.Shape;\n\npublic abstract class Mover {\n    private Shape shape;\n    private Point2D velocity;\n\n    public Mover(Shape shape, double x, double y) {\n        this.shape = shape;\n        this.shape.setTranslateX(x);\n        this.shape.setTranslateY(y);\n        this.velocity = new Point2D(0, 0);\n    }\n\n    public Shape getShape() {\n        return shape;\n    }\n\n    public void turn(double degrees) {\n        shape.setRotate(shape.getRotate() + degrees);\n    }\n\n    public void accelerate(double amount) {\n        double angle = Math.toRadians(shape.getRotate());\n        velocity = velocity.add(Math.cos(angle) * amount, Math.sin(angle) * amount);\n    }\n\n    public void move() {\n        shape.setTranslateX(shape.getTranslateX() + velocity.getX());\n        shape.setTranslateY(shape.getTranslateY() + velocity.getY());\n    }\n\n    public boolean collides(Mover other) {\n        Shape overlap = Shape.intersect(shape, other.getShape());\n        return overlap.getBoundsInLocal().getWidth() != -1;\n    }\n}\n\n// ==== Sub.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Sub extends Mover {\n\n    public Sub(double x, double y) {\n        super(new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6), x, y);\n        getShape().setFill(Color.GOLD);\n    }\n}\n\n// ==== Jellyfish.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Jellyfish extends Mover {\n\n    public Jellyfish(double x, double y, double heading) {\n        super(new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10), x, y);\n        getShape().setFill(Color.ORCHID);\n        turn(heading);\n        accelerate(0.5);\n    }\n\n    @Override\n    public void move() {\n        super.move();\n        turn(1);\n    }\n}\n","hints":["`Shape.intersect` gives the overlap of the two shapes, and an empty overlap has bounds of width -1. In `handle`, after the moves, check the submarine against each jellyfish.","In Mover: `return Shape.intersect(shape, other.getShape()).getBoundsInLocal().getWidth() != -1;`. In `handle`, after `jellyfish.forEach(j -> j.move());`: `for (Jellyfish j : jellyfish) { if (sub.collides(j)) { ... } }`, where the braces hold `sub.getShape().setFill(Color.RED);`, the print, `stop();` and `break;`."],"tests":[{"name":"Test 1","stdin":"","expect":"Bump!","hidden":false,"events":["frames 150"],"window":{"windows":[{"title":"Bump","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":60,"translateY":120,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ff0000"},{"n":4,"type":"Polygon","f":4,"translateX":84.5,"translateY":120,"rotate":311,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":300,"translateY":105.5,"rotate":221,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":150,"list":[]}},"outline":"Window \"Bump\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (60, 120), fill #ff0000\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (84.5, 120), rotate 311, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (300, 105.5), rotate 221, fill #da70d6\nframes run: 150"},{"name":"Test 2","stdin":"","expect":"Bump!","hidden":true,"events":["press key UP","frames 10","release key UP","frames 60"],"window":{"windows":[{"title":"Bump","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":105.625,"translateY":120,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ff0000"},{"n":4,"type":"Polygon","f":4,"translateX":129.5,"translateY":120,"rotate":221,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":300,"translateY":60.5,"rotate":131,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":70,"list":[]}},"outline":"Window \"Bump\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (105.625, 120), fill #ff0000\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (129.5, 120), rotate 221, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (300, 60.5), rotate 131, fill #da70d6\nframes run: 70"},{"name":"Test 3","stdin":"","expect":"","hidden":true,"events":["press key LEFT","frames 22","release key LEFT","press key UP","frames 10","release key UP","frames 100"],"window":{"windows":[{"title":"Bump","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":64.60237112764237,"translateY":-11.794665313143518,"rotate":-88,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ffd700"},{"n":4,"type":"Polygon","f":4,"translateX":84,"translateY":120,"rotate":312,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":300,"translateY":106,"rotate":222,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":132,"list":[]}},"outline":"Window \"Bump\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (64.60237112764237, -11.794665313143518), rotate -88, fill #ffd700\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (84, 120), rotate 312, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (300, 106), rotate 222, fill #da70d6\nframes run: 132"},{"name":"Test 4","stdin":"","expect":"","hidden":true,"events":["frames 20"],"window":{"windows":[{"title":"Bump","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":60,"translateY":120,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ffd700"},{"n":4,"type":"Polygon","f":4,"translateX":140,"translateY":120,"rotate":200,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":300,"translateY":50,"rotate":110,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":20,"list":[]}},"outline":"Window \"Bump\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (60, 120), fill #ffd700\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (140, 120), rotate 200, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (300, 50), rotate 110, fill #da70d6\nframes run: 20"}],"require":[],"forbid":[]},{"task":"A swarm from a seeded Random. Add to `Main` a field `random`, a `new Random(14)`. The starter code has an empty list of jellyfish, which the game loop moves. Where the comment is, make five jellyfish with a loop. For each one, take three numbers from `random`, in this order: its x, `random.nextInt(360)`, its y, `random.nextInt(80)`, and its heading, `random.nextInt(360)`. Make the jellyfish with them, add it to the list and add its shape to the pane.\n\nThe first test shows the window before any frame runs.\n","kind":"code","seed":"// ==== Main.java ====\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\nimport javafx.animation.AnimationTimer;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.input.KeyCode;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Rectangle;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n    private Map<KeyCode, Boolean> held = new HashMap<>();\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Sub sub = new Sub(180, 120);\n        pane.getChildren().add(sub.getShape());\n        List<Jellyfish> jellyfish = new ArrayList<>();\n        // five jellyfish\n\n        Scene scene = new Scene(pane);\n        scene.setOnKeyPressed(event -> held.put(event.getCode(), true));\n        scene.setOnKeyReleased(event -> held.put(event.getCode(), false));\n\n        new AnimationTimer() {\n            @Override\n            public void handle(long now) {\n                if (held.getOrDefault(KeyCode.LEFT, false)) {\n                    sub.turn(-4);\n                }\n                if (held.getOrDefault(KeyCode.RIGHT, false)) {\n                    sub.turn(4);\n                }\n                if (held.getOrDefault(KeyCode.UP, false)) {\n                    sub.accelerate(0.125);\n                }\n                sub.move();\n                jellyfish.forEach(j -> j.move());\n            }\n        }.start();\n\n        stage.setScene(scene);\n        stage.setTitle(\"Swarm\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n\n// ==== Mover.java ====\nimport javafx.geometry.Point2D;\nimport javafx.scene.shape.Shape;\n\npublic abstract class Mover {\n    private Shape shape;\n    private Point2D velocity;\n\n    public Mover(Shape shape, double x, double y) {\n        this.shape = shape;\n        this.shape.setTranslateX(x);\n        this.shape.setTranslateY(y);\n        this.velocity = new Point2D(0, 0);\n    }\n\n    public Shape getShape() {\n        return shape;\n    }\n\n    public void turn(double degrees) {\n        shape.setRotate(shape.getRotate() + degrees);\n    }\n\n    public void accelerate(double amount) {\n        double angle = Math.toRadians(shape.getRotate());\n        velocity = velocity.add(Math.cos(angle) * amount, Math.sin(angle) * amount);\n    }\n\n    public void move() {\n        shape.setTranslateX(shape.getTranslateX() + velocity.getX());\n        shape.setTranslateY(shape.getTranslateY() + velocity.getY());\n    }\n\n    public boolean collides(Mover other) {\n        Shape overlap = Shape.intersect(shape, other.getShape());\n        return overlap.getBoundsInLocal().getWidth() != -1;\n    }\n}\n\n// ==== Sub.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Sub extends Mover {\n\n    public Sub(double x, double y) {\n        super(new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6), x, y);\n        getShape().setFill(Color.GOLD);\n    }\n}\n\n// ==== Jellyfish.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Jellyfish extends Mover {\n\n    public Jellyfish(double x, double y, double heading) {\n        super(new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10), x, y);\n        getShape().setFill(Color.ORCHID);\n        turn(heading);\n        accelerate(0.5);\n    }\n\n    @Override\n    public void move() {\n        super.move();\n        turn(1);\n    }\n}\n","solution":"// ==== Main.java ====\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Random;\nimport javafx.animation.AnimationTimer;\nimport javafx.application.Application;\nimport javafx.scene.Scene;\nimport javafx.scene.input.KeyCode;\nimport javafx.scene.layout.Pane;\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Rectangle;\nimport javafx.stage.Stage;\n\npublic class Main extends Application {\n    private Map<KeyCode, Boolean> held = new HashMap<>();\n    private Random random = new Random(14);\n\n    @Override\n    public void start(Stage stage) {\n        Pane pane = new Pane();\n        pane.setPrefSize(360, 240);\n        pane.getChildren().add(new Rectangle(360, 240, Color.MIDNIGHTBLUE));\n\n        Sub sub = new Sub(180, 120);\n        pane.getChildren().add(sub.getShape());\n        List<Jellyfish> jellyfish = new ArrayList<>();\n        for (int i = 0; i < 5; i++) {\n            int x = random.nextInt(360);\n            int y = random.nextInt(80);\n            int heading = random.nextInt(360);\n            Jellyfish j = new Jellyfish(x, y, heading);\n            jellyfish.add(j);\n            pane.getChildren().add(j.getShape());\n        }\n\n        Scene scene = new Scene(pane);\n        scene.setOnKeyPressed(event -> held.put(event.getCode(), true));\n        scene.setOnKeyReleased(event -> held.put(event.getCode(), false));\n\n        new AnimationTimer() {\n            @Override\n            public void handle(long now) {\n                if (held.getOrDefault(KeyCode.LEFT, false)) {\n                    sub.turn(-4);\n                }\n                if (held.getOrDefault(KeyCode.RIGHT, false)) {\n                    sub.turn(4);\n                }\n                if (held.getOrDefault(KeyCode.UP, false)) {\n                    sub.accelerate(0.125);\n                }\n                sub.move();\n                jellyfish.forEach(j -> j.move());\n            }\n        }.start();\n\n        stage.setScene(scene);\n        stage.setTitle(\"Swarm\");\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch(Main.class);\n    }\n}\n\n// ==== Mover.java ====\nimport javafx.geometry.Point2D;\nimport javafx.scene.shape.Shape;\n\npublic abstract class Mover {\n    private Shape shape;\n    private Point2D velocity;\n\n    public Mover(Shape shape, double x, double y) {\n        this.shape = shape;\n        this.shape.setTranslateX(x);\n        this.shape.setTranslateY(y);\n        this.velocity = new Point2D(0, 0);\n    }\n\n    public Shape getShape() {\n        return shape;\n    }\n\n    public void turn(double degrees) {\n        shape.setRotate(shape.getRotate() + degrees);\n    }\n\n    public void accelerate(double amount) {\n        double angle = Math.toRadians(shape.getRotate());\n        velocity = velocity.add(Math.cos(angle) * amount, Math.sin(angle) * amount);\n    }\n\n    public void move() {\n        shape.setTranslateX(shape.getTranslateX() + velocity.getX());\n        shape.setTranslateY(shape.getTranslateY() + velocity.getY());\n    }\n\n    public boolean collides(Mover other) {\n        Shape overlap = Shape.intersect(shape, other.getShape());\n        return overlap.getBoundsInLocal().getWidth() != -1;\n    }\n}\n\n// ==== Sub.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Sub extends Mover {\n\n    public Sub(double x, double y) {\n        super(new Polygon(-15, -6, 9, -6, 15, 0, 9, 6, -15, 6), x, y);\n        getShape().setFill(Color.GOLD);\n    }\n}\n\n// ==== Jellyfish.java ====\nimport javafx.scene.paint.Color;\nimport javafx.scene.shape.Polygon;\n\npublic class Jellyfish extends Mover {\n\n    public Jellyfish(double x, double y, double heading) {\n        super(new Polygon(-10, 0, -6, -8, 0, -10, 6, -8, 10, 0, 7, 10, 3, 2, 0, 10, -3, 2, -7, 10), x, y);\n        getShape().setFill(Color.ORCHID);\n        turn(heading);\n        accelerate(0.5);\n    }\n\n    @Override\n    public void move() {\n        super.move();\n        turn(1);\n    }\n}\n","hints":["The order of the calls matters: with a seed, `random` gives the same numbers every time, in order, so x, y and heading must be taken in exactly that order, in separate statements or in that order in the arguments.","`for (int i = 0; i < 5; i++) { Jellyfish j = new Jellyfish(random.nextInt(360), random.nextInt(80), random.nextInt(360)); jellyfish.add(j); pane.getChildren().add(j.getShape()); }`"],"tests":[{"name":"Test 1","stdin":"","expect":"","hidden":false,"events":[],"window":{"windows":[{"title":"Swarm","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","translateX":180,"translateY":120,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ffd700"},{"n":4,"type":"Polygon","translateX":335,"translateY":44,"rotate":167,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","translateX":161,"translateY":58,"rotate":308,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":6,"type":"Polygon","translateX":296,"translateY":53,"rotate":325,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":7,"type":"Polygon","translateX":147,"translateY":57,"rotate":41,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":8,"type":"Polygon","translateX":22,"translateY":58,"rotate":42,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[]},"outline":"Window \"Swarm\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (180, 120), fill #ffd700\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (335, 44), rotate 167, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (161, 58), rotate 308, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (296, 53), rotate 325, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (147, 57), rotate 41, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (22, 58), rotate 42, fill #da70d6"},{"name":"Test 2","stdin":"","expect":"","hidden":true,"events":["frames 90"],"window":{"windows":[{"title":"Swarm","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":180,"translateY":120,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ffd700"},{"n":4,"type":"Polygon","f":4,"translateX":291.1533470846632,"translateY":54.12279744547378,"rotate":257,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":188.70476638965562,"translateY":22.53951608769737,"rotate":398,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":6,"type":"Polygon","f":6,"translateX":332.86184199300556,"translateY":27.189060364202888,"rotate":415,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":7,"type":"Polygon","f":7,"translateX":180.96193111002447,"translateY":86.52265630457305,"rotate":131,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":8,"type":"Polygon","f":8,"translateX":55.44151714648296,"translateY":88.11087728614882,"rotate":132,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":90,"list":[]}},"outline":"Window \"Swarm\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (180, 120), fill #ffd700\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (291.1533470846632, 54.12279744547378), rotate 257, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (188.70476638965562, 22.53951608769737), rotate 398, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (332.86184199300556, 27.189060364202888), rotate 415, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (180.96193111002447, 86.52265630457305), rotate 131, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (55.44151714648296, 88.11087728614882), rotate 132, fill #da70d6\nframes run: 90"},{"name":"Test 3","stdin":"","expect":"","hidden":true,"events":["press key RIGHT","frames 5","release key RIGHT","press key UP","frames 12","release key UP","frames 60"],"window":{"windows":[{"title":"Swarm","scene":{"width":360,"height":240,"onKeyPressed":true,"onKeyReleased":true,"root":{"n":1,"type":"Pane","f":1,"prefWidth":360,"prefHeight":240,"children":[{"n":2,"type":"Rectangle","f":2,"x":0,"y":0,"width":360,"height":240,"fill":"#191970"},{"n":3,"type":"Polygon","f":3,"translateX":273.73433892339494,"translateY":154.11650929673547,"rotate":20,"points":[-15,-6,9,-6,15,0,9,6,-15,6],"fill":"#ffd700"},{"n":4,"type":"Polygon","f":4,"translateX":297.4867525057674,"translateY":52.66061559223868,"rotate":244,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":5,"type":"Polygon","f":5,"translateX":184.7029668000387,"translateY":27.66158598614105,"rotate":385,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":6,"type":"Polygon","f":6,"translateX":327.537353705127,"translateY":30.917307200484693,"rotate":402,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":7,"type":"Polygon","f":7,"translateX":176.0563188385765,"translateY":82.25827261613472,"rotate":118,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"},{"n":8,"type":"Polygon","f":8,"translateX":50.61107578087985,"translateY":83.76152834481621,"rotate":119,"points":[-10,0,-6,-8,0,-10,6,-8,10,0,7,10,3,2,0,10,-3,2,-7,10],"fill":"#da70d6"}]}}}],"problems":[],"frames":{"count":77,"list":[]}},"outline":"Window \"Swarm\"\n  Pane 360 x 240\n    Rectangle 360 x 240 at (0, 0), fill #191970\n    Polygon (-15, -6) (9, -6) (15, 0) (9, 6) (-15, 6), at (273.73433892339494, 154.11650929673547), rotate 20, fill #ffd700\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (297.4867525057674, 52.66061559223868), rotate 244, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (184.7029668000387, 27.66158598614105), rotate 385, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (327.537353705127, 30.917307200484693), rotate 402, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (176.0563188385765, 82.25827261613472), rotate 118, fill #da70d6\n    Polygon (-10, 0) (-6, -8) (0, -10) (6, -8) (10, 0) (7, 10) (3, 2) (0, 10) (-3, 2) (-7, 10), at (50.61107578087985, 83.76152834481621), rotate 119, fill #da70d6\nframes run: 77"}],"require":[{"pattern":"new\\s+Random\\s*\\(\\s*14\\s*\\)","message":"Keep the seeded `new Random(14)`: without the seed, the jellyfish would be somewhere else on every run."}],"forbid":[]}]}