public override void Execute(Editor arg)
    {
        Edge <WireNode> onEdge = Util.GetEdgeFromPos(arg.Simulator, this.endPos, out Wire wire);

        this.sourcePos = onEdge.Source.GetPosition();
        this.targetPos = onEdge.Target.GetPosition();

        WireNode newJunc = wire.CreateJunctionWireNode(this.endPos);

        wire.InsertNodeBetween(onEdge.Source, onEdge.Target, newJunc);

        IOWireNode ioNode = wire.CreateIOWireNode(this.startIO);

        if (IsCornerNeeded())
        {
            // INCLUDE CORNER
            JunctionWireNode cornerNode = wire.CreateJunctionWireNode(this.corner);
            wire.ConnectNodes(newJunc, wire, cornerNode);
            wire.ConnectNodes(cornerNode, wire, ioNode);
        }
        else
        {
            // NO CORNER
            wire.ConnectNodes(newJunc, wire, ioNode);
        }
    }
    public override void Undo(Editor arg)
    {
        WireNode junctionNode = Util.GetWireNodeFromPos(arg.Simulator, this.junctionPosition, out Wire wire);

        if (this.IsCornerNeeded())
        {
            // CORNER IS INCLUDED
            WireNode corner = Util.GetWireNodeFromPos(arg.Simulator, this.corner, out Wire cornerWire);
            cornerWire.RemoveNode(corner);
        }

        // REMOVE START NODE IOWIRENODE
        IOWireNode startNode = Util.GetIOWireNodeFromPos(arg.Simulator, this.startIO.GetPosition(), out Wire startWire);

        startWire.RemoveNode(startNode);
    }